Wagtail Hallo - Wagtail的遗留富文本编辑器。
项目描述
Wagtail Hallo - 富文本编辑器
这是Wagtail CMS的遗留富文本编辑器。基于Hallo.js。
有关Wagtail 2.0,hallo.js编辑器已弃用。
状态 此软件包应与Wagtail 2.17及更早版本兼容。但是,它将不再接收错误修复或积极维护。将接受拉取请求,如果维护者希望在核心Wagtail团队之外支持它,请提出问题以进行讨论。
使用此软件包的主要风险
- 请注意,如果您想继续使用它,请了解已知的hallo.js问题。
- hallo.js对HTML和编辑器输入的处理不恰当——它不可靠,具有浏览器特定的不一致行为,用户体验不佳,且不可访问。
- 此包是安全问题的来源(XSS注入,不兼容CSP)并允许注入不受欢迎的内容或格式(例如,标题中的图片或列表中的标题)。
- 无法保证此包将超出上述支持的版本与Wagtail兼容。
发布说明
- 请参阅变更日志。
支持版本
- Python 3.7, 3.8, 3.9
- Django 3.2, 4.0
- Wagtail 2.15, 2.16, 3.0
安装Hallo编辑器
pip install wagtail-hallo
- 将
'wagtail_hallo'
添加到您的settings.py
中的INSTALLED_APPS
。
要在Wagtail 2.x上使用wagtail-hallo,请将以下内容添加到您的设置中
WAGTAILADMIN_RICH_TEXT_EDITORS = {
'hallo': {
'WIDGET': 'wagtail_hallo.hallo.HalloRichTextArea'
}
}
在RichTextField
中使用Hallo编辑器
# models.py
from wagtail.admin.edit_handlers import FieldPanel
from wagtail.core.fields import RichTextField
from wagtail.core.models import Page
class MyHalloPage(Page):
body = RichTextField(editor='hallo')
content_panels = Page.content_panels + [
FieldPanel('body', classname='full'),
]
{% extends "base.html" %}
{% load wagtailcore_tags wagtailimages_tags %}
{% block content %}
{% include "base/include/header.html" %}
<div class="container">
<div class="row">
<div class="col-md-7">{{ page.body|richtext }}</div>
</div>
</div>
{% endblock content %}
通过RichTextBlock
在StreamField
中使用Hallo编辑器
# models.py
from wagtail.core.models import Page
from wagtail.core.blocks import CharBlock, RichTextBlock
from wagtail.admin.edit_handlers import StreamFieldPanel
from wagtail.core.fields import StreamField
class MyOtherHalloPage(Page):
body = StreamField([
('heading', CharBlock(form_classname="full title")),
('paragraph', RichTextBlock(editor='hallo')),
], blank=True)
content_panels = Page.content_panels + [
StreamFieldPanel('body'),
]
{% extends "base.html" %}
{% load wagtailcore_tags wagtailimages_tags %}
{% block content %}
{% include "base/include/header.html" %}
<div class="container">
<div class="row">
<div class="col-md-7">{{ page.body }}</div>
</div>
</div>
{% endblock content %}
扩展Hallo编辑器
可以通过插件扩展遗留的hallo.js编辑器的功能。有关开发自定义hallo.js
插件的详细信息,请参阅项目的页面:https://github.com/bergie/hallo。
创建插件后,应通过功能注册器的register_editor_plugin(editor, feature_name, plugin)
方法进行注册。对于hallo.js
插件,editor
参数应始终为'hallo'
。
一个名为halloblockquote
的插件,实现于myapp/js/hallo-blockquote.js
,它增加了对<blockquote>
标签的支持,将如下注册在功能名称block-quote
下
from wagtail.core import hooks
from wagtail_hallo.plugins import HalloPlugin
@hooks.register('register_rich_text_features')
def register_embed_feature(features):
features.register_editor_plugin(
'hallo', 'block-quote',
HalloPlugin(
name='halloblockquote',
js=['myapp/js/hallo-blockquote.js'],
)
)
HalloPlugin
的构造函数接受以下关键字参数
name
- JavaScript代码中定义的插件名称。hallo.js
插件名称以"IKS."
命名空间为前缀,但此处传递的名称应不带前缀。options
- 一个字典(或其他可序列化为JSON的对象),包含要在初始化时传递给JavaScript插件代码的选项js
- 一个JavaScript文件列表,用于导入此插件,其定义方式与Django表单媒体定义相同css
- 一个CSS文件字典,用于导入此插件,其定义方式与Django表单媒体定义相同order
- 一个索引数字(默认100),指定插件应列出的顺序,这进而确定工具栏中按钮的顺序
在编写插件的前端代码时,Wagtail的Hallo实现提供了两个扩展点
- 在JavaScript中,使用
[data-hallo-editor]
属性选择器来定位编辑器,例如var editor = document.querySelector('[data-hallo-editor]');
。 - 在CSS中,使用
.halloeditor
类选择器。
白名单富文本元素
在扩展编辑器以支持新的HTML元素后,您需要将其添加到允许元素的白名单中——Wagtail的标准行为是删除未识别的元素,以防止编辑器插入开发人员未考虑到的样式和脚本(无论是故意还是意外地通过复制粘贴)。
可以通过功能注册器的register_converter_rule(converter, feature_name, ruleset)
方法将元素添加到白名单中。当使用hallo.js
编辑器时,converter
参数应始终为'editorhtml'
。
以下代码将在block-quote
功能激活时将<blockquote>
元素添加到白名单
from wagtail.admin.rich_text.converters.editor_html import WhitelistRule
from wagtail.core.whitelist import allow_without_attributes
@hooks.register('register_rich_text_features')
def register_blockquote_feature(features):
features.register_converter_rule('editorhtml', 'block-quote', [
WhitelistRule('blockquote', allow_without_attributes),
])
WhitelistRule
传递元素名称,以及一个在遇到元素时执行某种类型操作的调用函数。此调用函数接收元素作为BeautifulSoup Tag对象。
《wagtail.core.whitelist》模块提供了一些辅助函数来帮助定义这些处理程序:`allow_without_attributes`,这是一个处理程序,它保留元素但删除其所有属性;以及`attribute_rule`,它接受一个字典,指定如何处理每个属性,并返回一个处理程序函数。这个字典将映射属性名称到True(表示应该保留该属性)、False(表示应该删除该属性)或一个可调用对象(它接受初始属性值并返回该属性的最终值,或返回None以删除该属性)。
贡献
欢迎所有贡献,因为Wagtail核心团队将不再积极维护此项目。
开发说明
- 要更改此项目,首先克隆此仓库:`git clone git@github.com:wagtail/wagtail-hallo.git`。
Python (Django / Wagtail)
- `pip3 install -e ../path/to/wagtail-hallo/` -> 将该软件包作为可编辑安装本地安装。
- 确保将`'wagtail_hallo'`添加到您的`settings.py`中的`INSTALLED_APPS`。
- 您需要有一个测试应用程序(例如Bakery Demo)和一个Page模型来工作,以及一个模板。
- 参考模型请见
test/testapp/models.py
- 参考模板请见
test/testapp/templates/hallo_test_page.html
- 参考模型请见
- 创建模型后,请记住运行
python manage.py makemigrations
和python manage.py migrate
。 - 运行测试:
python testmanage.py test
- 为测试模型运行迁移:
django-admin makemigrations --settings=wagtail_hallo.test.settings
- 运行代码风格检查:
flake8 wagtail_hallo
- 运行格式化:
black wagtail_hallo
JavaScript & CSS (前端)
目前前端工具基于Node & NPM,仅用于格式化和检查代码。此仓库有意不使用任何构建工具,因此JavaScript和CSS必须在不满足该要求的情况下编写。
nvm use
- 确保您处于正确的Node版本。npm install --no-save
- 安装NPM包。npm run fix
- 解析JS/CSS文件并修复任何可以修复的内容。npm run lint
- 运行代码风格检查。npm run format
- 在大多数文件上运行Prettier格式化(非Python文件)。npm test
- 运行测试(Jest)。npm run preflight
- 运行所有代码风格检查/格式化/Jest检查,必须在提交代码之前完成。
发布清单
- 在
wagtail_hallo/__init__.py
中更新VERSION
。 - 使用新的支持的Python、Django或Wagtail版本更新
tox.ini
、setup.py
、README.md
、package.json
和workflows/ci.yml
。 - 运行
npm install
以确保package-lock.json
已更新。 - 更新分类器(例如在
setup.py
中基于状态(#为数字)的"Development Status :: # - Alpha"
更新)。 - 在
setup.py
中使用新发布版本更新。 - 在
CHANGELOG.md
中更新发布日期。 - 推送到PyPI。
安装twine:
pip install twine
清理并打包:
python3 setup.py clean --all sdist bdist_wheel
- 上传到PyPI:
twine upload dist/*
<-- 推送到PyPI
- 创建稳定发布分支(例如
stable/1.0.x
)。 - 在GitHub上创建发布(例如
v1.0.0
)。
感谢
非常感谢所有支持者、贡献者和基于惊人的Hallo.js编辑器构建的Wagtail用户。我们感谢Wagtail核心团队和Torchbox的开发者赞助了大部分初始开发。感谢LB将Hallo.js集成从Wagtail转移到wagtail-hallo软件包。还要特别感谢Hallo.js编辑器的原始创建者。感谢。
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。
源代码分发
构建分发
wagtail-hallo-0.1.0.tar.gz的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | a56a29436be500927b13694965c3d2fac85fedc18896198a890cdca3cbdda6c9 |
|
MD5 | 482dc1a579ac2a83df1ee2aece9c0f85 |
|
BLAKE2b-256 | 736edb0abcd10ff57979aa96844f95381e1905901fb9be5da49f013fc458ad62 |
wagtail_hallo-0.1.0-py3-none-any.whl的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 0a213665424ac66b04542fc05b08add8876a37980f21d40fce0180e838d234d0 |
|
MD5 | dc5f54627800fb0cb3c956d6aa0def37 |
|
BLAKE2b-256 | 316066092959b3be4cf8a1562ef63fe2e210ed1bf7e99e90342e454dc1b8321c |