- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经为链接创建了自己的插件。现在,我想向插件生成的a
标签添加其他一些属性,例如target
,rel
。
但是我无法完成它。这是转换器的我的插件代码。
我应该添加哪些转换器,以便a
标记可以支持其他属性?
/**
* @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
* For licensing, see LICENSE.md.
*/
/**
* @module link/linkediting
*/
import LinkEditing from '@ckeditor/ckeditor5-link/src/linkediting';
import {
downcastAttributeToElement
} from '@ckeditor/ckeditor5-engine/src/conversion/downcast-converters';
import { upcastElementToAttribute } from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';
import LinkCommand from './uclinkcommand';
import UnlinkCommand from './ucunlinkcommand';
import { createLinkElement } from '@ckeditor/ckeditor5-link/src/utils';
import { ensureSafeUrl } from './utils';
import bindTwoStepCaretToAttribute from '@ckeditor/ckeditor5-engine/src/utils/bindtwostepcarettoattribute';
/**
* The link engine feature.
*
* It introduces the `linkHref="url"` attribute in the model which renders to the view as a `<a href="url">` element.
*
* @extends module:core/plugin~Plugin
*/
export default class UcLinkEditing extends LinkEditing {
/**
* @inheritDoc
*/
init() {
const editor = this.editor;
// Allow link attribute on all inline nodes.
editor.model.schema.extend( '$text', { allowAttributes: 'linkHref' } );
editor.conversion.for( 'dataDowncast' )
.add( downcastAttributeToElement( { model: 'linkHref', view: createLinkElement } ) );
editor.conversion.for( 'editingDowncast' )
.add( downcastAttributeToElement( { model: 'linkHref', view: ( href, writer ) => {
return createLinkElement( ensureSafeUrl( href ), writer );
} } ) );
editor.conversion.for( 'upcast' )
.add( upcastElementToAttribute( {
view: {
name: 'a',
attribute: {
href: true
}
},
model: {
key: 'linkHref',
value: viewElement => viewElement.getAttribute( 'href' )
}
} ) );
// Create linking commands.
editor.commands.add( 'ucLink', new LinkCommand( editor ) );
editor.commands.add( 'ucUnlink', new UnlinkCommand( editor ) );
// Enable two-step caret movement for `linkHref` attribute.
bindTwoStepCaretToAttribute( editor.editing.view, editor.model, this, 'linkHref' );
// Setup highlight over selected link.
this._setupLinkHighlight();
}
}
最佳答案
介绍
在阅读代码之前,我想先介绍一下CKEditor 5对内联元素(例如<a>
)的处理方法,以便使解决方案更易于理解。有了这些知识,将来不会遇到类似的问题。以下内容旨在作为一个全面的教程,因此请耐心阅读。
即使您可能了解理论部分的大部分内容,我还是建议您阅读它以全面了解CKEditor 5中的工作原理。
另外,请注意,我将为原始CKEditor 5插件提供一个解决方案,因为它对于寻求该问题的教程的其他社区成员来说更有值(value)。不过,我希望借助本教程的见解,您可以将代码示例调整为自定义插件。
另外,请记住,本教程不讨论该插件的UI部分,而只是讨论应如何配置事物以进行转换。添加和删除属性是UI或代码其他部分的工作。在这里,我仅讨论引擎内容。
CKEditor 5中的内联元素
首先,让我们确定哪些元素是内联的。通过内联元素,我了解<strong>
,<a>
或<span>
之类的元素。与<p>
,<blockquote>
或<div>
不同,内联元素不构成数据。相反,它们以特定的(视觉和语义)方式标记某些文本。因此,从某种意义上说,这些元素是文本给定部分的特征。结果,我们说文本的给定部分为粗体,或者文本的给定部分为/具有链接。
同样,在模型中,我们不直接将<a>
或<strong>
表示为元素。相反,我们允许将属性添加到文本的一部分。这就是文本特征(粗体,斜体或链接)的表示方式。
例如,在模型中,我们可能有一个带有<paragraph>
文本的Foo bar
元素,其中bar
的bold
属性设置为true
。我们会这样记录:<paragraph>Foo <$text bold="true">bar</$text></paragraph>
。看到那里没有<strong>
或任何其他附加元素。只是一些带有属性的文本。稍后,bold
属性将转换为<strong>
元素。
顺便说一句:来自模型属性的 View 元素具有自己的类: view.AttributeElement
,而不是内联元素也可以称为属性元素。可悲的是,名称与作为 View 元素属性的“属性”冲突(更糟糕的是,允许属性元素具有属性)。
当然,文本可能具有多个属性,并且所有属性都将转换为它们各自的 View 内联元素。请记住,在模型中,属性没有任何设置顺序。这与 View 或HTML相反,在 View 或HTML中,内联元素彼此嵌套。嵌套发生在从模型到 View 的转换期间。这使模型的工作变得更简单,因为要素不需要照顾到破坏或重新布置模型中的元素的情况。
考虑以下模型字符串:
<paragraph>
<$text bold="true">Foo </$text>
<$text bold="true" linkHref="bar.html">bar</$text>
<$text bold="true"> baz</$text>
</paragraph>
Foo bar baz
链接的粗体
bar
文本。在转换过程中,它将转换为:
<p>
<strong>Foo </strong><a href="bar.html"><strong>bar</strong></a><strong> baz</strong>
</p>
<a>
元素的转换方式始终是最顶层的元素。这是有意的,因此任何元素都不会破坏
<a>
元素。看到以下错误的 View /HTML字符串:
<p>
<a href="bar.html">Foo </a><strong><a href="bar.html">bar</a></strong>
</p>
priority
的
view.AttributeElement
属性来定义哪个元素应位于其他元素之上。大多数元素,例如
<strong>
都不关心它,并保留默认优先级。但是,
<a>
元素更改了优先级,以保证 View /HTML中的正确顺序。
<strong>
,
<em>
。相反,
<a>
具有其他属性。
fontFamily
属性添加到文本中,然后使用适当的
<span>
属性将其转换为
style
元素。
<paragraph>
<$text fontFamily="Tahoma" fontSize="big">Foo</$text>
</paragraph>
fontFamily="value"
转换为<span style="font-family: value;">
,fontSize="value"
转换为<span class="text-value">
。 <p>
<span style="font-family: Tahoma;">
<span class="text-big">Foo</span>
</span>
</p>
<span>
元素?这样会更好吗?
<p>
<span style="font-family: Tahoma;" class="text-big">Foo</span>
</p>
<span>
。当第一个属性(例如,转换
fontFamily
时, View 中还没有
<span>
。因此
<span>
被添加了
style
属性。但是,当转换
fontSize
时, View 中已经存在
<span>
。
view.Writer
可以识别并检查这些元素是否可以合并。规则为三个:
view.Element#name
,view.AttributeElement#priority
,view.AttributeElement#id
。 id
属性,但是出于简单原因,我现在不再讨论它。可以说,对于某些属性元素而言,防止它们合并很重要。
<a>
元素添加另一个属性。
linkTarget
或
linkRel
),然后将其转换为具有所需属性(
<a>
或
target="..."
)的
rel="..."
元素。然后,它将与原始
<a href="...">
元素合并。
<a>
元素已指定了自定义
priority
。这意味着由新插件生成的元素需要具有指定的相同优先级才能正确合并。
<p>
,
<a>
,
<strong>
等),而属性是属性(
class=""
,
href=""
等)。
<p>
->
<paragraph>
)或属性(
<strong>
->
bold
,
<a>
->
linkHref
)。可以将属性上载到属性。
<a>
元素被转换为
linkHref
属性,并且
linkHref
属性值取自
href=""
元素的
<a>
属性。
linkTarget
或
linkRel
属性定义相同的转换。但是,这里有一个陷阱。 View 的每个部分只能转换一次(“消耗”)一次(向下转换时该模型也是如此)。
<div>
识别为可以由该功能转换的功能,则
<paragraph>
可以转换为
<div>
)。这也有助于发现有冲突的转换器。
<a>
)并期望它们同时工作。一个将覆盖另一个。
import Plugin from '@ckeditor/ckeditor5-core/src/plugin';
import { downcastAttributeToElement } from '@ckeditor/ckeditor5-engine/src/conversion/downcast-converters';
import { upcastAttributeToAttribute } from '@ckeditor/ckeditor5-engine/src/conversion/upcast-converters';
class LinkTarget extends Plugin {
init() {
const editor = this.editor;
editor.model.schema.extend( '$text', { allowAttributes: 'linkTarget' } );
editor.conversion.for( 'downcast' ).add( downcastAttributeToElement( {
model: 'linkTarget',
view: ( attributeValue, writer ) => {
return writer.createAttributeElement( 'a', { target: attributeValue }, { priority: 5 } );
},
converterPriority: 'low'
} ) );
editor.conversion.for( 'upcast' ).add( upcastAttributeToAttribute( {
view: {
name: 'a',
key: 'target'
},
model: 'linkTarget',
converterPriority: 'low'
} ) );
}
}
Schema
来扩展
linkTarget
。
downcastAttributeToElement
是因为我们要创建
<a target="...">
元素,该元素将与原始
<a>
元素合并。请记住,此处创建的
<a>
元素具有定义为
5
的优先级,就像在原始链接插件中一样。
upcastAttributeToAttribute
帮助程序。在
view
配置中,指定仅应转换
target
元素的
<a>
属性(
name: 'a'
)。这并不意味着
<a>
元素将被转换!这只是转换器的过滤配置,因此不会转换其他元素的
target
属性。
ckeditor5-engine
和
ckeditor5-link
的当前母版。
关于ckeditor5 - 如何在ckeditor5中的 “target”标签中添加 `a`属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51303892/
我正在构建一个使用 javascript 向页面动态添加元素的 Web 应用程序,然后可以使用 contentEditable="true" 对其进行编辑和 CKEditor . 目前,如果我使用 c
目前我遇到以下问题,我正在使用 CKEDITOR 4.x 中的 applyStyle 方法应用 span 标签。但是当一个跨度被部分选中并且我执行 applyStyle 方法时,一个新的跨度将被选择,
我在内联模式下使用CKEDITOR,每页有多个编辑器。为了创建它们,我使用 HTML 中的标签,然后运行执行 CKEDITOR.inline() 的脚本网页加载后立即针对它们中的每一个进行操作。 只
如何在加载编辑器上设置文本方向 [rtl]? 最佳答案 根据文档,应该这样做: CKEDITOR.config.contentsLangDirection in the CKSource manual
在 CKEditor 中,我添加了自定义图像按钮,它直接触发文件输入。但是,只有在使用 Image 插件时才能渲染图像。 我不想在工具栏上有 2 个图像按钮,有没有办法隐藏图像按钮,但仍然使用它(如显
我有一个使用 CKeditor 的 Rails 4 应用程序。在开发模式下它工作正常,但在生产中 ckeditor 不会出现,并且文本区域的位置有一个空格。 根据日志,缺少以下文件: ActionCo
如何在选择图像时启用或禁用 CKEditor 的段落按钮。我不想完全删除它。我目前使用 ckeditor 版本 4.4 最佳答案 使用editor.getCommand() + CKEDITOR.co
我在内联模式下使用CKEDITOR,每页有多个编辑器。为了创建它们,我使用 HTML 中的标签,然后运行执行 CKEDITOR.inline() 的脚本网页加载后立即针对它们中的每一个进行操作。 只
乍一看,我需要做一件简单的事情——在 CKEditor 中添加一个带有行号的栏。主要思想是作者在讨论文本时可以引用特定段落。 我试图找到一个插件,试图找到另一个带有行号的 WYSIWYG 编辑器,但没
在 CKEditor 中,我添加了自定义图像按钮,它直接触发文件输入。但是,只有在使用 Image 插件时才能渲染图像。 我不想在工具栏上有 2 个图像按钮,有没有办法隐藏图像按钮,但仍然使用它(如显
我试图修改this repo 来自定义我想在我的 Strapi 项目中使用的 CKEditor。我添加了更多插件,这就是我的 ckeditor.js 文件的样子: import ClassicEdit
当自定义 div 内部发生变化时是否会触发任何事件?我不想监听 editor.on('change'),而只是检测发生变化的 dom 元素, (删除或插入的字符)。例如: var template
我有一个像 ckeditor 一样的 textarea。 在编辑器中有一个按钮可以将内容查看为 source/html。 我在 textarea 上方有一个输入按钮,可以将 textarea 内容预览
我正在使用 2amigos ckeditor plugins在 yii2 中,我能够从 plugin_sdk_sample 创建一个示例插件,它在原始项目中工作正常,但是当我将其放入 yii2 项目时
我在我的应用程序中使用 CKEditor 5,供用户输入包含图像、媒体、表格和样式文本的文档。用户存储文档后,我会再次将其拉出进行显示。过去当我只有最通用的样式时,我会这样显示内容: 这是一个
有谁知道如何修改CKEditor右键单击上下文菜单? 我想弄清楚如何从右键单击菜单中删除“剪切、复制、粘贴、编辑 DIV”,并尝试向其中添加“插入图像、插入表格”。 最佳答案 3.6.1 版在其 AP
我一直在为此寻找解决方案有一段时间了,我发现的唯一修复只会影响文本在编辑器本身中的显示方式,而不影响生成的文本在发送/保存到其他地方时的外观。我说的是 CSS 修复之类的东西。 我正在使用 CKEdi
我需要动态更改 CKEditor 配置中的一个配置设置。 我正在编写一个插件,它将复选框添加到 CKEditor 工具栏并在选中/取消选中它时 - forcePasteAsPlainText 被更改为
如何动态更改 CKEditor 工具栏(不使用预定义的工具栏)? CKEditor Developer's Guide只告诉您如何在初始化期间设置工具栏。 我正在使用 CKEditor 3.6.4。
我使用 CKeditor 来编辑丰富的 HTML 页面,但是一些 javascript 功能依赖于 的特殊属性。触发它们的标签。 这些是极少数情况,只有 5000 多条记录的数据库中的几条记录需要触
我是一名优秀的程序员,十分优秀!