发布于 2015-08-29 14:57:51 | 1019 次阅读 | 评论: 0 | 来源: PHPERZ
注意:高级内容过滤器是在 CKEditor 4.1 中引入的。
ACF 是自 CKEditor 4.1 可用的高度可配置的 CKEditor 核心特色功能。它限制和适配输入的数据(在源代码模式中或由 editor.setData 方法添加的 HTML 代码,粘贴的 HTML 代码,等等) ,因此它可以以更可行的方式配置编辑器的配置。它也可以使生成配置不允许的 HTML代码的功能无效。
高级内容过滤器有两种工作模式:
在两种模式中,可以通过使用 CKEDITOR.config.extraAllowedContent 设置来扩展过滤器的配置。
如果想使高级内容过滤器不起作用,将 CKEDITOR.config.allowedContent 设置为"true"。
所有可用的编辑器功能将被激活,并且将不会过滤输入的数据。
当没有提供 CKEDITOR.config.allowedContent 设置时,高级内容过滤器工作于自动模式。
在编辑器初始化时,编辑功能将其规则添加到过滤器。因此,只允许使用当前加载的功能可以编辑的内容,其余所有内容都被过滤掉。
下面的例子或许可以较容易地理解 ACF 的自动模式。
你可以在源代码模式中看一下编辑器是如何清除粘贴的内容或 HTML 代码。
如果想将编辑器配置为工作于自动模式,但需要附加的 HTML 标记、属性、样式或类生效,可以使用 CKEDITOR.config.extraAllowedContent 配置选项。
当定义了 CKEDITOR.config.allowedContent 设置后,高级内容过滤器就工作于定制模式。
此配置选项告诉过滤器允许哪些 HTML 元素、属性、样式和类。基于默认的规则(称为允许内容规则--Allowed Content Rules) ,编辑器过滤输入的数据,决定哪些功能生效。
允许内容规则(Allowed Content Rules)可以被设置为两种不同的格式:紧凑的字符串格式(string format)和更强大的对象格式(object format) 。关于允许内容规则,请阅读允许内容规则。
下面的例子可以使较容易地理解 ACF 的定制模式。
高级内容过滤器不仅可以删除不允许的 HTML 元素、它们的类、样式和属性,而且可以试着通过将元素从一种形式转换为另一种更喜欢的形式,从而统一输入数据。
考 虑加粗(Bold)功能。在 HTML 代码中,它可以用<strong>、 <b>,或者甚至 <span style="font-weight:700|800|900|bold"> 元素来表示。假设 CKEDITOR.config.allowedContent设置仅含有对<b>的规则。这是否意味着当解析<string> 或<span>元素时,会删除它们?
不会。编辑器会将它们都转换为<b>元素。结果是编辑器将只含有<b> 元素,并且会保留粘贴内容的可视化形式。 如果保留默认的 CKEDITOR.config.allowedContent 值 (在自动模式中) ,也同样如此--所有加粗的功能形式将被统一成偏爱的<strong>形式。
假设将 'img[!src,alt,width,height]'设置(<img>标记带有必需的 src 和三个可选的属性)添加到允许内容规则中。图像大小应该用属性来设置,因此,作为例子,用样式设置大小的粘贴图像将被转换成具有属性的图像(注意,不是所 有情况都可能--只有基于像素的大小可以被转换) 。
内容转换功能完全是自动的,不需要配置它。需要做的唯一的事情是设置CKEDITOR.config.allowedContent 选项,或使用默认的值(自动模式)目前, 我们只是为几个编辑器功能定义了内容转换, 但是在将来发布的版本中数量会增
加。
注意:高级内容过滤器是在 CKEditor 4.1 中引入的。
允 许内容规则定义了允许哪些 HTML 元素、属性、样式和类。当配置 CKEditor 时,你将对设置 CKEDITOR.config.allowedContent 选项最感兴趣。插件开发人员也需要设置CKEDITOR.config.allowedContent 属性,告诉编辑器在自动模式中一项功能所允许哪些内容。
允许内容规则通常包括四个主要部分:
注意: 替代书写 “属性(attributes)、 样式(styles)和类(classes)” , 使用 “属性” (properties)作为简便的描述方法。
对于一个元素可以存在多项规则,一个元素可以被包含在多个元素列表中。例如,每一个规则可以允许另一元素属性集。
规则是一个一个地应用的。初始时,被过滤的元素是无效的,其所有属性都被拒绝。应用于该元素的第一条规则校验它(它不会被删除) ,并且该规则可能接受某些元素的属性。
另一条规则可能使编辑器接受更多的元素属性。因此:
字符串格式是允许内容规则的紧凑表示法,但它没有提供对象格式中可用的所有功能。
但是,在大多数情况下,应该够用了。
规则格式:elements [attributes]{styles}(classes)
正则表达式模板:
< elements >< styles, attributes, and classes >< separator > /^([a-z0-9*\s]+)((?:\s*\{[!\w\-,\s\*]+\}\s*|\s*\[[!\w\-,\s\*]+\]\s*|\s*\([!\w\-,\s\*]+\)\s*){0,3})(?:;\s*|$)/i,
其中:
特殊字符:
例子:
// 一条规则接受<p>和<h1>元素,但没有任何属性。
p h1
//一条规则接受具有可选的"left"和 "right"类的<p>和<h1>元素
//注意:两个元素都可能含有这些类,而不仅仅是<h1>
p h1(left,right)
//一条规则接受具有其所有属性的<p>和<h1>元素
p h1[*]
//一条规则接受<a>,只有当它含有"href"属性时。
a[!href]
//一条规则接受<img>,它具有必需的"src"属性和一个可选的"alt"属性,加上可选的"width"和"height"样式
img[alt,!src]{width,height}
//与上面相同,因为属性的顺序和其清单是不相关的,并且忽略空格
img { height, width } [ !src, alt ]
允许内容规则集可以含有由分号(;)分隔的多条规则。如:
// 这些规则允许:
// 具有可选的"text-align"样式的<p 和><h1>元素
//具有必需的"href"属性的<a>
// <strong> 和 <em> 元素,
//具有可选的"tip"类的<p>(故<p>元素可以同时具有"text-align"样式和"tip"类)
p h1{text-align}; a[!href]; strong em; p(tip)
//这些规则允许:
// 具有可选的"id"属性的<p>和<h1>元素
//具有必需的"href"属性和可选的"id"属性的<a>
p h1; a[!href]; *[id]
为了验证允许内容规则是否被正确解析了,可以检查 CKEDITOR.editor.filter 对象的CKEDITOR.filter.allowedContent 属性。
var editor = CKEDITOR.replace( 'textarea_id', {
allowedContent: 'a[!href]; ul; li{text-align}(someclass)'
} );
editor.on( 'instanceReady', function() {
console.log( editor.filter.allowedContent );
} );
// 这将对下列数组做日志:
// { elements: 'p br', ... } (默认编辑器规则)
// { elements: 'a', attributes: '!href' }
// { elements: 'ul' }
// { elements: 'li', styles: 'text-align', classes: 'someclass' }
为方便使用,允许内容规则可以定义成标准的对象字面量,故下面的:
allowedContent: 'p h1{text-align}; a[!href]; strong em; p(tip)'
与下面的相对应:
allowedContent: { 'p h1': { styles: 'text-align' }, a: { attributes: '!href' }, 'strong em': true, p: { classes: 'tip' } }
采用此方法,允许内容规则可以由 JavaScript 动态地生成,并因任意目的存储成 JSON数据格式。注意:对象字面量的键必须是唯一的,因此:
allowedContent: { p: { 14 styles: 'text-align' }, p: { classes: 'tip' } }
等价于:
allowedContent: 'p(tip)'
但永远不会是:
allowedContent: 'p{text-align}(tip)'