In Plone html nach speichern modifizieren
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" />