Direkt zum Inhalt | Direkt zur Navigation

Benutzerspezifische Werkzeuge

Sie sind hier: Startseite / Tech-Blog / In Plone html nach speichern modifizieren

In Plone html nach speichern modifizieren

Plone verwendet sogenannte Tranforms um Inhalte von einem format ins andere zu übertragen. Z.B. wird der eingegebene HTML-Inhalt von text/html nach text/x-plone-outputfilters-html transformiert, wobei alle verbotenen Konstrukte entfernt werden.

Dieses Konzept kann man auch für andere Transformationen verwenden. Nachfolgend werden Platzhalter durch HTML-Code ersetzt.

Citations Transform erzeugen

Alls erstes erstellen wir einen Ordner transforms in unserem Package und erstellen darin eine Datei __init__.py mit folgendem Inhalt.

from Products.PortalTransforms.libtransforms.utils import MissingBinary
modules = [
    'html_to_html_citations',
    ]

g = globals()
transforms = []
for m in modules:
    try:
        ns = __import__(m, g, g, None)
        transforms.append(ns.register())
    except ImportError, e:
        print "Problem importing module %s : %s" % (m, e)
    except MissingBinary, e:
        print e
    except:
        import traceback
        traceback.print_exc()


def initialize(engine):
    for transform in transforms:
        engine.registerTransform(transform)

Nun erstellen wir die Datei html_to_html_citations.py mit folgendem Inhalt.

class HtmlToHtmlCitations:
    """Transform which replaces literature citations with special markup"""

    implements(ITransform)
    __name__ = "html_to_html_citations"
    inputs = ('text/html', )
    output = "text/x-html-citations"

    def __init__(self, name=None):
        self.config_metadata = {
            'inputs': (
                'list',
                'Inputs',
                'Input(s) MIME type. Change with care.'
            ),
        }
        if name:
            self.__name__ = name

        self.citationRegexp = re.compile(
            r'\[\[(?P<refid>[\w\W]+?)\]\]'
        )
        self.citations_counter = 0
        self.portal = getSite()
        self.pcat = self.portal.portal_catalog

    def name(self):
        return self.__name__

    def convert(self, orig, data, **kwargs):
        text = orig
        self.citations_counter = 0
        text = self.citationRegexp.sub(self._repl, safe_unicode(text))
        data.setData(text.encode(kwargs['encoding']))
        return dataclass HtmlToHtmlCitations:

    def _repl(self, m, **kwargs):
        self.citations_counter += 1
        refid = m.group('refid')
        cit_out_list = []
        refids = refid.split(';')
        for refid in refids:
            query = {}
            query['refid'] = refid
            query['portal_type'] = 'LiteratureContent'
            cit_brains = self.pcat(query)
            if not cit_brains:
                continue
            cit_brain = cit_brains[0]
            cit_obj = cit_brain.getObject()
            cit_out_list.append(cit_obj.render_output())

        cit_out = ""
        for cit_str in cit_out_list:
            cit_out += "<p>" + cit_str + "</p>"
        repl_str = """<a href="#"
                    title="%(cit_out)s"
                    class="literature-citation visualNoPrint"
                        >[%(refid)s]</a><span
                        class="print-only">[%(counter)s]</span>""" % {
            'cit_out': cit_out,
            'refid': refid,
            'counter': self.citations_counter
        }
        return repl_str


def register():
    return HtmlToHtmlCitations()

Mimetype für Citations registrieren

<?xml version="1.0"?>
<object name="mimetypes_registry" meta_type="MimeTypes Registry">
  <mimetype name="HTML with literature citations" binary="False"
    extensions="html" globs="" icon_path="text.png"
    mimetypes="text/x-html-citations"/>
</object>

Damit diese Registrierung per GenereicSetup funktioniert wird das Package: collective.mtrsetup benötigt!

Eventhandler erzeugen

Hier legen die Datei events.py in unserem Package an.

from plone.app.textfield.interfaces import ITransformer
from plone.app.textfield.value import RichTextValue

def transform_citationsmarkers_into_citations(event):
    """ transform citation markers into citation links if edited
        and save them as RichTextValue
    """
    obj = event.object
    if not hasattr(obj, 'text'):
        return
    transformer = ITransformer(obj)
    transformedValue = transformer(obj.text, 'text/x-html-citations')
    obj.text = RichTextValue(
        transformedValue,
        'text/html',
        'text/x-plone-outputfilters-html',
    )

Wenn man mit dem Transformer arbeitet, ist die Quelle immer der gespeicherte raw-Wert, sollte man also nach den eigentlichen Wandlungen zusätzliche Änderungen vornehmen wollen, dann sollte man folgenden Aufruf zum trasnformieren verwenden.:

pt = getToolByName(self, 'portal_transforms')
data = pt.convertTo(
    'text/x-html-citations',
    obj.text.output,
    encoding=obj.text.encoding,
    mimetype='text/x-plone-outputfilters-html')
transformedValue = ''
if data:
    transformedValue = data.getData()
if not transformedValue:
    transformedValue = obj.text.output

Eventhandler für EditFinishedEvent registrieren

In der configure.zcml in unserem package registrieren wir nun den Eventhandler für das EditFinishedEvent.

<subscriber for="plone.dexterity.interfaces.IEditFinishedEvent"
    handler=".events.transform_citationsmarkers_into_citations"
    />
abgelegt unter: