示例#1
0
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")