跳转到主要内容

HTML和XHTML编辑支持

项目描述

此软件包包含使用FCKeditor作为小部件在网页内编辑HTML和XHTML的支持。这是FCKeditor的一个相当简单的应用,为每个小部件实例化了一个预配置的编辑器。没有选项可以单独控制编辑器。

详细文档

HTML文件编辑支持

此软件包包含使用FCKeditor作为小部件在网页内编辑HTML和XHTML的支持。这是FCKeditor的一个相当简单的应用,为每个小部件实例化了一个预配置的编辑器。没有选项可以单独控制编辑器。

在创建此软件包时,我们遇到了一些编辑器的限制,值得注意。指出这些限制并不意味着其他编辑器表现更好;可用的编辑器似乎是一个混合体。

  • 编辑器只处理可以包含在<body>元素内的内容;任何超出这个范围的内容,包括<body>和</body>标签,都会丢失或损坏。如果可以配置FCKeditor来处理这些内容,则相关文档没有提及。

  • 没有真正的HTML源代码控制;空白符没有被保留,这与程序员的期望不符。在许多用例中这是可接受的,但并非所有。如果必须保留原始空白,应用程序应避免使用此小部件。

实现问题

这些问题是与用于集成FCKeditor的小部件有关,而不是FCKeditor本身的问题。这些问题应该得到解决。

  • 编辑器的宽度是硬编码的;它应该可配置,或者编辑器应该扩展以填充可用空间。FCKeditor的示例使用似乎没有这个问题,所以它可能比现在更好。

  • 编辑器的高度应该像基本文本区域小部件的配置一样可配置。

未来开发的想法

这些想法可能值得追求,但目前没有具体计划这么做。

  • 分类编辑器的应用并提供针对这些应用的备用工具栏配置。编辑器本身有许多可配置性,因此可以使其执行不同的任务。

  • 添加对其他一些花哨的客户端HTML编辑器的支持,并允许用户选择针对不同应用使用哪个编辑器,包括在需要详细控制HTML时禁用GUI编辑器(或对于不喜欢GUI编辑器的luddite用户)。

    XINHA (http://xinha.python-hosting.com/)似乎也是一个有趣的选择,并且可能对需要编辑小HTML片段之外的应用更有用,尤其是如果用户对HTML相当熟悉。

    HTMLArea (http://www.dynarch.com/projects/htmlarea/)可能在某个时刻变得有趣,但目前的粗略阅读表明XINHA可能是一条更合理的途径。

关于FCKeditor的更多信息

补充信息的管理

zope.html包提供了对包含HTML和XHTML数据的文件的额外视图,允许通过网页编辑这些文件。这些文件可以包含完整的文档或可以组合成更大文档的片段。也提供了预览视图。

编辑和预览视图依赖于使用文件的IEditableHtmlInformation适配器来获取正在编辑的文件的补充信息。该适配器使用内容对象的注解来存储需要持久化的信息。

IEditableHtmlInformation接口非常简单;定义了一个字段,它是一个简单的布尔值:文件是否应该被视为片段。让我们创建一个简单的内容对象,我们可以用它来测试

>>> import zope.file.file
>>> import zope.interface
>>> import zope.annotation

>>> class File(zope.file.file.File):
...     zope.interface.implements(
...         zope.annotation.IAttributeAnnotatable)
...
...     def __init__(self, text=None):
...         super(File, self).__init__("text/html", {"charset": "utf-8"})
...         f = self.open("w")
...         f.write(text)
...         f.close()

让我们创建一个文件和相应的IEditableHtmlInformation对象

>>> import zope.html.docinfo

>>> file = File("This is a <em>fragment</em>.")
>>> info = zope.html.docinfo.EditableHtmlInformation(file)

现在我们可以检查isFragment属性的初始值是否合理计算

>>> info.isFragment
True

用户可以导致从UI切换isFragment标志,所以它应该记住标志的当前状态

>>> info.isFragment = False
>>> info.isFragment
False

IEditableHtmlInformation的新实例也应该记住设置的最后一个值

>>> zope.html.docinfo.EditableHtmlInformation(file).isFragment
False

(X)HTML片段编辑器小部件

此包中包含的小部件是FCKeditor控制的一个简单应用。它仅预期适用于片段,而不是任意文档。让我们创建一个字段和一个小部件

>>> from zope.html import field
>>> from zope.html import widget
>>> from zope.publisher import browser

>>> class Context(object):
...     sample = u""

>>> myfield = field.XhtmlFragment(
...     __name__="sample",
...     title=u"Sample Field",
...     ).bind(Context())

>>> request = browser.TestRequest()
>>> mywidget = widget.FckeditorWidget(myfield, request)
>>> mywidget.setPrefix("form")

>>> mywidget.configurationPath = "/myconfig.js"
>>> mywidget.editorWidth = 360
>>> mywidget.editorHeight = 200
>>> mywidget.toolbarConfiguration = "mytoolbars"

>>> print mywidget()
<textarea...></textarea>
<script...
"form.sample", 360, 200, "mytoolbars");
...Config["CustomConfigurationsPath"] = "/myconfig.js";
...
</script>
<BLANKLINE>

我们还应该测试CkeditorWidget。

>>> ckwidget = widget.CkeditorWidget(myfield, request)
>>> ckwidget.configurationPath = "/myconfig.js"
>>> ckwidget.editorHeight = 200

"fckVersion"属性持有CKEditor库的版本。

>>> ckwidget.fckVersion
'3.6.2'
>>> print ckwidget()
<textarea...></textarea>
<script...
...height: 200...
...customConfig : "/myconfig.js"...
</script>
<BLANKLINE>

可编辑HTML的视图

让我们先上传一些HTML来创建一个文件对象

>>> import StringIO
>>> sio = StringIO.StringIO("This is a <em>fragment</em>."
...                         "  There's one 8-bit Latin-1 character: \xd8.")

>>> from zope.testbrowser.testing import Browser
>>> browser = Browser()
>>> browser.addHeader("Authorization", "Basic user:userpw")
>>> browser.addHeader("Accept-Language", "en-US")
>>> browser.open("https://127.0.0.1/@@+/zope.file.File")

>>> ctrl = browser.getControl(name="form.data")
>>> ctrl.mech_control.add_file(sio, "text/html", "sample.html")
>>> browser.getControl("Add").click()

我们可以看到MIME处理程序已经将其标记为HTML内容

>>> import zope.mimetype.types
>>> file = getRootFolder()["sample.html"]
>>> zope.mimetype.types.IContentTypeTextHtml.providedBy(file)
True

“编辑”视图可以用来检查和修改“是否为片段?”字段,该字段由视图存储在对象的注解中。我们上传的特定片段应默认视为片段

>>> browser.getLink("sample.html").click()
>>> browser.getLink("Edit").click()

>>> browser.open("https://127.0.0.1/sample.html/@@htmledit.html")
>>> ctrl = browser.getControl(name="form.isFragment")
>>> ctrl.value
True

可以通过取消选中复选框并点击“保存”来切换设置

>>> ctrl.value = False
>>> browser.getControl("Save").click()
>>> ctrl = browser.getControl(name="form.isFragment")
>>> ctrl.value
False

如果文档可以被解码,编辑视图还允许编辑HTML内容。如果不知道文档的编码,用户会被提示选择应该使用的编码。

我们的示例文档没有指定编码,因此我们期望表单指示需要编码,并允许用户选择编码。让我们重新加载表单,以消除“已更新...”消息,以便我们可以看到用户被告知的内容

>>> browser.getLink("Edit").click()

>>> print browser.contents
<...Can't decode text for editing; please specify the document encoding...

>>> ctrl = browser.getControl(name="form.encoding")
>>> ctrl.value
['']

用户可以选择一个编码

>>> ctrl.value = ["utf-8"]
>>> browser.getControl("Save").click()

由于我们选择了一个与上传的拉丁-1数据不兼容的编码,所以我们被告知该编码不可接受

>>> print browser.contents
<...Selected encoding cannot decode document...

我们需要选择一个与我们上传的数据真正相关的编码

>>> ctrl = browser.getControl(name="form.encoding")
>>> ctrl.value = ["iso-8859-1"]
>>> browser.getControl("Save").click()

编码保存后,文档可以进行编码和编辑,编码选择将不再在表单上可用

>>> browser.getControl(name="form.encoding")
Traceback (most recent call last):
  ...
LookupError: name 'form.encoding'...

由于我们选择的编码不支持所有Unicode字符,因此有一个选项允许在编辑后保存的内容无法使用文档的原始编码进行编码时重新编码文档。此选项的默认值为False,因为用户需要意识到文档编码可能会被修改

>>> browser.getControl(name="form.reencode").value
False

如果我们编辑文本,包括无法在当前编码中编码的字符,并尝试在不允许重新编码的情况下保存更改,我们会看到通知说文档无法用原始编码编码,需要重新编码

>>> ctrl = browser.getControl(name="form.text")
>>> ctrl.value = u"\u3060\u3051\u306e\u30b5\u30a4\u30c8".encode("utf-8")

>>> browser.getControl("Save").click()

>>> print browser.contents
<...Can't encode text in current encoding...

此时,我们可以选择“重新编码”选项,允许将文本保存为原始编码之外的编码;这将允许我们保存任何文本

>>> browser.getControl(name="form.reencode").value = True
>>> browser.getControl("Save").click()

>>> print browser.contents
<...Updated on ...

如果我们现在查看文件的“内容类型”视图,我们会看到编码已更新为UTF-8

>>> browser.getLink("Content Type").click()

>>> browser.getControl(name="form.encoding").value
['utf-8']

更改

2.4.2 (2014-04-17)

  • 删除不必要的zope.app.authentication/debugskin/server测试依赖。

  • zope.testbrowser 4.0.3中的测试输出支持已更改

2.4.1 (2012-01-26)

  • 修复CKEditor资源的路径。

2.4.0 (2012-01-26)

  • 使用CKEditor 3.6.2

  • 使用Python的doctest模块代替已废弃的zope.testing.doctest

2.3.0 (2011-02-22)

  • 使用CKEditor 3.5.2

2.2.0 (2010-11-19)

  • 明确使用未压缩的ckeditor源

2.1.0 (2010-05-25)

  • 使用CKEditor 3.2.1

  • 添加在开发模式下使用未压缩版CKEditor的配置

  • 修复导致测试失败的导入。

2.0.0 (2009-09-04)

  • 添加CKeditor 3.0小部件。

1.2.0 (2009-07-06)

  • 使用FCKeditor 2.6.4.1

  • 删除_samples目录并阻止其复活

1.1.0 (2008-06-18)

  • 使用FCKeditor 2.6

  • 使用版本化的目录来缓存清除javascript

1.0.1 (2007-11-02)

  • 包数据更新。

  • 更新代码以与Zope 3.4版本中的包兼容。

1.0.0 (2007-10-29)

  • 初始发布。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源分发

zope.html-2.4.2.zip (3.7 MB 查看哈希值)

上传时间:

支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页