- 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/
我创建了一个用户可以添加测试的字段。这一切运行顺利我只希望当用户点击(添加另一个测试)然后上一个(添加另一个测试)删除并且这个显示在新字段中。 所有运行良好的唯一问题是点击(添加另一个字段)之前添加另
String[] option = {"Adlawan", "Angeles", "Arreza", "Benenoso", "Bermas", "Brebant
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我正在努力将 jQuery 滚动功能添加到 nav-tab (Bootstrap 3)。我希望用户能够选择他们想要的选项卡,并在选项卡内容中有一个可以平滑滚动到 anchor 的链接。这是我的代码,可
我正在尝试在用户登录后再添加 2 个 ui 选项卡。首先,我尝试做一个之后。 $('#slideshow').tabs('remove', '4'); $("#slideshow ul li:last
我有一个包含选择元素的表单,我想通过选择添加和删除其中一些元素。这是html代码(这里也有jsfiddle http://jsfiddle.net/txhajy2w/):
正在写这个: view.backgroundColor = UIColor.white.withAlphaComponent(0.9) 等同于: view.backgroundColor = UICo
好的,如果其中有任何信息,我想将这些列添加到一起。所以说我有 账户 1 2 3 . 有 4 个帐户空间,但只有 3 个帐户。我如何创建 java 脚本来添加它。 最佳答案 Live Example H
我想知道是否有一种有效的预制算法来确定一组数字的和/差是否可以等于不同的数字。示例: 5、8、10、2,使用 + 或 - 等于 9。5 - 8 = -3 + 10 = 7 + 2 = 9 如果有一个预
我似乎有一个卡住的 git repo。它卡在所有基本的添加、提交命令上,git push 返回所有内容为最新的。 从其他帖子我已经完成了 git gc 和 git fsck/ 我认为基本的调试步骤是
我的 Oracle SQL 查询如下- Q1- select hca.account_number, hca.attribute3, SUM(rcl.extended_amou
我正在阅读 http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingG
我正在尝试添加一个“加载更多”按钮并限制下面的结果,这样投资组合页面中就不会同时加载 1000 个内容,如下所示:http://typesetdesign.com/portfolio/ 我对 PHP
我遇到这个问题,我添加了 8 个文本框,它工作正常,但是当我添加更多文本框(如 16 个文本框)时,它不会添加最后一个文本框。有人遇到过这个问题吗?提前致谢。 Live Link: JAVASCRIP
add/remove clone first row default not delete 添加/删除克隆第一行默认不删除&并获取正确的SrNo(例如:添加3行并在看到问题后删除SrNo.2)
我编码this ,但删除按钮不起作用。我在控制台中没有任何错误.. var counter = 0; var dataList = document.getElementById('materi
我有一个类似数组的对象: [1:数组[10]、2:数组[2]、3:数组[2]、4:数组[2]、5:数组[3]、6:数组[1]] 我正在尝试删除前两个元素,执行一些操作,然后将它们再次插入到同一位置。
使用的 Delphi 版本:2007 你好, 我有一个 Tecord 数组 TInfo = Record Name : String; Price : Integer; end; var Info
我使用了基本的 gridster 代码,然后我声明了通过按钮添加和删除小部件的函数它工作正常但是当我将调整大小功能添加到上面的代码中时,它都不起作用(我的意思是调整大小,添加和删除小部件) 我的js代
title 323 323 323 title 323 323 323 title 323 323 323 JS $(document).keydown(function(e){
我是一名优秀的程序员,十分优秀!