class HtmlEditor(html5.Textarea): initSources = False def __init__(self, *args, **kwargs): super(HtmlEditor, self).__init__(*args, **kwargs) self.value = "" self.summernote = None self.enabled = True self.summernoteContainer = self self.boneName = "" self._attachSources() def _attachSources(self): if not HtmlEditor.initSources: print("initialize HTML Editor libraries") js = html5.Script() js["src"] = "htmleditor/htmleditor.min.js" html5.Head().appendChild(js) css = html5.Link() css["rel"] = "stylesheet" css["href"] = "htmleditor/htmleditor.min.css" html5.Head().appendChild(css) HtmlEditor.initSources = True def _attachSummernote(self, retry=0): elem = self.summernoteContainer.element lang = conf["currentlanguage"] try: self.summernote = JS("""window.top.summernoteEditor(@{{elem}}, @{{lang}})""") except: if retry >= 3: alert("Unable to connect summernote, please contact technical support...") return print("Summernote initialization failed, retry will start in 1sec") network.DeferredCall(self._attachSummernote, retry=retry + 1, _delay=1000) return imagebtn = TextInsertImageAction(summernote=self.summernote, boneName=self.boneName) self.parent().appendChild(imagebtn) self.summernote.on("summernote.change", self.onEditorChange) if not self.enabled: self.summernote.summernote("disable") if self.value: self["value"] = self.value def onAttach(self): super(HtmlEditor, self).onAttach() if self.summernote: return self._attachSummernote() self.element.setAttribute("data-bonename", self.boneName) def onDetach(self): super(HtmlEditor, self).onDetach() self.value = self["value"] if self.summernote: self.summernote.summernote("destroy") self.summernote = None def onEditorChange(self, e, *args, **kwargs): if self.parent(): e = JS("new Event('keyup')") self.parent().element.dispatchEvent(e) def _getValue(self): if not self.summernote: return self.value ret = self.summernote.summernote("code") return ret def _setValue(self, val): if not self.summernote: self.value = val return self.summernote.summernote("reset") # reset history and content self.summernote.summernote("code", val) def enable(self): super(HtmlEditor, self).enable() self.enabled = True self.removeClass("is-disabled") if self.summernote: self.summernote.summernote("enable") def disable(self): super(HtmlEditor, self).disable() self.enabled = False self.addClass("is-disabled") if self.summernote: self.summernote.summernote("disable")