Skip to content

Commit

Permalink
Enable multiple wysiwyg editors
Browse files Browse the repository at this point in the history
Use default editor registry setting
  • Loading branch information
duchenean committed Oct 18, 2021
1 parent 2e52c15 commit aa2f04a
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 24 deletions.
1 change: 1 addition & 0 deletions news/multiple_editors.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Enable multiple wysiwyg editors (use default editor registry setting) [duchenean, gotcha]
6 changes: 6 additions & 0 deletions plone/app/z3cform/configure.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -234,4 +234,10 @@
factory=".factories.Zope2FileUploadStorable"
/>

<utility
component=".widget.tinymce_richtextwidget_render"
provides=".interfaces.IRichTextWidgetInputModeRenderer"
name="tinymce"
/>

</configure>
4 changes: 4 additions & 0 deletions plone/app/z3cform/interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,3 +68,7 @@ class ILinkWidget(ITextWidget):

class ISingleCheckBoxBoolWidget(ISingleCheckBoxWidget):
"""Marker interface for the SingleCheckboxBoolWidget."""


class IRichTextWidgetInputModeRenderer(Interface):
"""Marker interface to render multiple wysiwyg editors"""
4 changes: 4 additions & 0 deletions plone/app/z3cform/tests/example.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,3 +84,7 @@ def handleApply(self, action):

class MyMultiFormWrapper(FormWrapper):
form = MyMultiForm


def dummy_richtextwidget_render(widget):
return "<p>dummy</p>"
24 changes: 24 additions & 0 deletions plone/app/z3cform/tests/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -1671,6 +1671,30 @@ def test_dx_tinymcewidget_multiple_mimetypes_edit(self):
)
self.assertTrue('pat-tinymce' not in rendered)

def test_use_default_editor_value(self):
""" Use dummy utility registered in testing.zcml """
if IMarkupSchema:
# if not, don't run this test
self._set_mimetypes(allowed=('text/html',))
registry = getUtility(IRegistry)
from Products.CMFPlone.interfaces import IEditingSchema
proxy = registry.forInterface(IEditingSchema, check=False,
prefix='plone')
proxy.available_editors = [u'dummy', u'TinyMCE']
proxy.default_editor = u'dummy'
from plone.app.z3cform.widget import RichTextWidget
widget = FieldWidget(self.field, RichTextWidget(self.request))
widget.context = self.portal
rendered = widget.render()
self.assertTrue('<p>dummy</p>' in rendered)

proxy.default_editor = u'TinyMCE'
from plone.app.z3cform.widget import RichTextWidget
widget = FieldWidget(self.field, RichTextWidget(self.request))
widget.context = self.portal
rendered = widget.render()
self.assertTrue('pat-tinymce' in rendered)


class LinkWidgetIntegrationTests(unittest.TestCase):

Expand Down
6 changes: 6 additions & 0 deletions plone/app/z3cform/tests/testing.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -22,4 +22,10 @@
class=".example.MyMultiFormWrapper"
permission="zope.Public" />

<utility
component=".example.dummy_richtextwidget_render"
provides="..interfaces.IRichTextWidgetInputModeRenderer"
name="dummy"
/>

</configure>
49 changes: 25 additions & 24 deletions plone/app/z3cform/widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@
from plone.app.z3cform.interfaces import IQueryStringWidget
from plone.app.z3cform.interfaces import IRelatedItemsWidget
from plone.app.z3cform.interfaces import IRichTextWidget
from plone.app.z3cform.interfaces import IRichTextWidgetInputModeRenderer
from plone.app.z3cform.interfaces import ISelectWidget
from plone.app.z3cform.interfaces import ISingleCheckBoxBoolWidget
from plone.app.z3cform.utils import call_callables
from plone.app.z3cform.utils import closest_content
from plone.registry.interfaces import IRegistry
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.interfaces import IEditingSchema
from Products.CMFPlone.utils import safe_unicode
from six.moves import UserDict
from z3c.form import interfaces as form_ifaces
Expand Down Expand Up @@ -706,23 +706,7 @@ def pattern(self):
"""dynamically grab the actual pattern name so it will
work with custom visual editors"""
if self._pattern is None:
registry = getUtility(IRegistry)
try:
records = registry.forInterface(IEditingSchema, check=False,
prefix='plone')
default = records.default_editor.lower()
available = records.available_editors
except AttributeError:
default = 'tinymce'
available = ['TinyMCE']
tool = getToolByName(self.wrapped_context(), 'portal_membership')
member = tool.getAuthenticatedMember()
editor = member.getProperty('wysiwyg_editor')
if editor in available:
self._pattern = editor.lower()
elif editor in ('None', None):
self._pattern = 'plaintexteditor'
return default
self._pattern = self.getWysiwygEditor()
return self._pattern

def _base_args(self):
Expand Down Expand Up @@ -752,6 +736,22 @@ def render(self):
:rtype: string
"""
if self.mode != 'display':
renderer = queryUtility(
IRichTextWidgetInputModeRenderer,
name=self.getWysiwygEditor(),
default=tinymce_richtextwidget_render
)
return renderer(self)

if not self.value:
return ''

if isinstance(self.value, RichTextValue):
return self.value.output_relative_to(self.context)

return super(RichTextWidget, self).render()

def render_input_mode(self):
# MODE "INPUT"
rendered = ''
allowed_mime_types = self.allowedMimeTypes()
Expand Down Expand Up @@ -814,13 +814,14 @@ def render(self):
)
return rendered

if not self.value:
return ''

if isinstance(self.value, RichTextValue):
return self.value.output_relative_to(self.context)

return super(RichTextWidget, self).render()
<<<<<<< HEAD
def tinymce_richtextwidget_render(self):
return RichTextWidget.render_input_mode(self)
=======
def tinymce_richtextwidget_render(widget):
return RichTextWidget.render_input_mode(widget)
>>>>>>> 95ddbc6... Enable multiple wysiwyg editors


@implementer_only(ILinkWidget)
Expand Down

0 comments on commit aa2f04a

Please sign in to comment.