该模块包含一些辅助函数,用于将 HTML 或 DOM 树转换为富文本值并反向转换,以及使用类似于 String 方法的函数来修改该值,此外还包含一些用于格式化的附加函数。
安装
安装该模块
npm install @wordpress/rich-text
该包假定你的代码将运行在 ES2015+ 环境中。如果你使用的环境对此类语言特性和 API 的支持有限或完全不支持,则应在代码中包含 随 @wordpress/babel-preset-default 提供的 polyfill。
用法
Rich Text 包旨在辅助操作纯文本字符串,使其能够表示复杂格式。
通过使用 RichTextValue 值对象(下文简称 value),可以将文本与格式分离,从而便于搜索和操作富文本格式。
富文本格式的示例包括:
- 粗体、斜体、上标(等)
- 链接
- 无序/有序列表
RichTextValue 对象
该值对象由以下部分组成:
text– 要应用富文本格式的文本字符串。formats– 一个与text长度相同的稀疏数组,在文本被格式化的位置填充 格式(例如core/link、core/bold等)。start–text中的一个索引,表示当前活动选区的起始位置。end–text中的一个索引,表示当前活动选区的结束位置。
你不应该尝试自行创建 value 对象,而应依靠 @wordpress/rich-text 包的内置方法来为你构建这些对象。
理解值如何表示富文本格式非常重要。下面通过一个示例进行说明。
如果 text 的位置 2-5 被格式化为粗体(core/bold),位置 2-8 被设置为链接(core/link),那么你会发现:
- 在稀疏数组的位置 2-5 处,包含
core/bold格式的数组 - 在稀疏数组的位置 2-8 处,包含
core/link格式的数组
示例如下:
{
text: 'Hello world', // 长度 11
formats: [
[], // 0
[],
[ // 2
{
type: 'core/bold',
},
{
type: 'core/link',
}
],
[
{
type: 'core/bold',
},
{
type: 'core/link',
}
],
[
{
type: 'core/bold',
},
{
type: 'core/link',
}
],
[
{
type: 'core/bold',
},
{
type: 'core/link',
}
],
[ // 6
{
type: 'core/link',
}
]
[
{
type: 'core/link',
}
],
[
{
type: 'core/link',
}
],
[], // 9
[], // 10
[], // 11
]
}
选区
让我们继续考虑上面文本为 Hello world 的示例。
如果作为用户,我选择了单词 Hello,则会生成一个 start 和 end 分别为 0 和 5 的值对象。
通常,这有助于了解文本的哪一部分被选中。然而,我们需要考虑选区也可能是“折叠”的。
折叠选区
折叠选区是指 start 和 end 值相同的选区(例如 start: 4, end: 4)。这种情况发生在没有选择任何字符但存在插入符时。最常见的情形是用户将光标/插入符放置在文本字符串中但未进行选择。
由于选区没有“范围”(即 start 和 end 索引之间没有差异),因此从折叠值中查找当前选中的文本部分可能具有挑战性。
API
applyFormat
从给定的 startIndex 到给定的 endIndex,将格式对象应用到富文本值。如果未提供索引,则从选区中获取索引。
参数
- value
RichTextValue:要修改的值。 - format
RichTextFormat:要应用的格式。 - startIndex
[number]:起始索引。 - endIndex
[number]:结束索引。
返回值
RichTextValue:应用该格式后的新值。
concat
将所有富文本值合并为一个。这类似于 String.prototype.concat。
参数
- values
...RichTextValue:要合并的对象。
返回值
RichTextValue:合并所有给定记录后的新值。
create
从 Element 树(DOM)、HTML 字符串或纯文本字符串创建 RichText 值,并可选地通过 Range 对象设置选区。如果未提供任何输入就调用,将创建一个空值。可选函数可用于过滤内容。
值将具有以下结构,强烈建议不要在不使用辅助函数的情况下修改它:
{
text: string,
formats: Array,
replacements: Array,
?start: number,
?end: number,
}
如你所见,文本和格式是分离的。text 保存文本,包括对象和行的任何替换字符。formats、objects 和 lines 都是与 text 长度相同的稀疏数组。其中保存了相关文本索引处的格式信息。最后,start 和 end 表示选择了哪些文本索引。只有在提供了 Range 时才会提供它们。
参数
- $1
[Object]:可选命名参数。 - $1.element
[Element]:用于创建值的元素。 - $1.text
[string]:用于创建值的文本。 - $1.html
[string]:用于创建值的 HTML。 - $1.range
[Range]:用于创建值的范围。 - $1.__unstableIsEditableTree
[boolean]:
返回值
RichTextValue:富文本值。
EventListenersProps
回调集合(callback-Set)引用私有事件监听器辅助函数分发所来自的 refs。
getActiveFormat
根据类型获取选区起始位置处的格式对象。这可以用于获取例如当前选区处链接格式的 URL,也可以用于检查某个格式是否在选区处处于激活状态。如果选区处没有格式,则返回 undefined。
参数
- value
RichTextValue:要检查的值。 - formatType
string:要查找的格式类型。
返回值
RichTextFormat|undefined:指定类型的激活格式对象,或 undefined。
getActiveFormats
获取选区起始位置处的所有格式对象。
参数
- value
RichTextValue:要检查的值。 - EMPTY_ACTIVE_FORMATS
Array:如果没有激活格式,则返回该数组。
返回值
RichTextFormatList:激活的格式对象。
getActiveObject
获取激活的对象(如果有)。
参数
- value
RichTextValue:要检查的值。
返回值
RichTextFormat|void:激活的对象,或 undefined。
getTextContent
获取富文本值的文本内容。这类似于 Element.textContent。
参数
- value
RichTextValue:要使用的值。
返回值
string:文本内容。
insert
在给定 startIndex 处,将富文本值、HTML 字符串或纯文本字符串插入富文本值中。startIndex 和 endIndex 之间的任何内容都会被移除。如果未提供索引,则从选区中获取索引。
参数
- value
RichTextValue:要修改的值。 - valueToInsert
RichTextValue|string:要插入的值。 - startIndex
[number]:起始索引。 - endIndex
[number]:结束索引。
返回值
RichTextValue:插入该值后的新值。
insertObject
在给定 startIndex 处,将格式作为对象插入富文本值中。startIndex 和 endIndex 之间的任何内容都会被移除。如果未提供索引,则从选区中获取索引。
参数
- value
RichTextValue:要修改的值。 - formatToInsert
RichTextFormat:要作为对象插入的格式。 - startIndex
[number]:起始索引。 - endIndex
[number]:结束索引。
返回
RichTextValue:包含已插入对象的新值。
isCollapsed
检查富文本值的选区是否已折叠。已折叠表示没有选择任何字符,但存在光标。如果没有选区,将返回 undefined。这与 window.getSelection().isCollapsed() 类似。
参数
- props
RichTextValue:要检查的富文本值。 - props.start
RichTextValue[ 'start' ]: - props.end
RichTextValue[ 'end' ]:
返回
boolean | undefined:如果选区已折叠则为 true,否则为 false;如果没有选区则为 undefined。
isEmpty
检查富文本值是否为空,即不包含任何文本或任何对象(例如图片)。
参数
- value
RichTextValue:要使用的值。
返回
boolean:如果值为空则为 true,否则为 false。
join
将一组富文本值合并为一个值,可选择使用 separator 分隔,该分隔符可以是富文本值、HTML 字符串或纯文本字符串。这与 Array.prototype.join 类似。
参数
- values
Array<RichTextValue>:要合并的值数组。 - separator
[string|RichTextValue]:分隔符字符串或值。
返回
RichTextValue:新的合并值。
privateApis
私有的 @wordpress/rich-text API。
registerFormatType
注册一个新格式,需提供唯一名称以及定义其行为的对象。
参数
- name
string:格式名称。 - settings
Omit<WPFormat, 'name'>:格式设置。name会从第一个参数注入。
返回
WPFormat|undefined:如果已成功注册,则为该格式;否则为undefined。
remove
从富文本值中移除给定 startIndex 和 endIndex 之间的内容。如果未提供索引,则从选区获取索引。
参数
- value
RichTextValue:要修改的值。 - startIndex
[number]:起始索引。 - endIndex
[number]:结束索引。
返回
RichTextValue:移除内容后的新值。
removeFormat
按类型从富文本值中移除从给定 startIndex 到给定 endIndex 的任何格式对象。如果未提供索引,则从选区获取索引。
参数
- value
RichTextValue:要修改的值。 - formatType
string:要移除的格式类型。 - startIndex
[number]:起始索引。 - endIndex
[number]:结束索引。
返回
RichTextValue:移除格式后的新值。
replace
搜索富文本值,并将匹配项替换为 replacement。这与 String.prototype.replace 类似。
参数
- value
RichTextValue:要修改的值。 - pattern
RegExp|string:RegExp 对象或字面量。也可以是字符串。它会被视为原义字符串,不会被解释为正则表达式。只有第一个匹配项会被替换。 - replacement
Function|string|RichTextValue:匹配项将被指定值、指定函数返回的值或给定的富文本值替换。
返回
RichTextValue:应用替换后的新值。
RichTextData
RichTextData 类用于实例化富文本值的包装器,其方法可用于转换或操作数据。
- 创建一个空实例:
new RichTextData()。 - 从 HTML 字符串创建:
RichTextData.fromHTMLString(。
'<em>hello</em>' ) - 从包装器 HTMLElement 创建:
RichTextData.fromHTMLElement(。
document.querySelector( 'p' ) ) - 从纯文本创建:
RichTextData.fromPlainText( '1\n2' )。 - 从富文本值创建:
new RichTextData( { text: '...',。
formats: [ ... ] } )
RichTextFormat
应用于 RichTextValue 内某个字符范围的单个格式,例如 core/bold。更多信息请参见 @wordpress/rich-text 主文档。
RichTextValue
表示格式化字符串的对象。更多信息请参见 @wordpress/rich-text 主文档。
slice
从 startIndex 到 endIndex 截取富文本值。如果未提供索引,则从选区获取索引。这与 String.prototype.slice 类似。
参数
- value
RichTextValue:要修改的值。 - startIndex
[number]:起始索引。 - endIndex
[number]:结束索引。
返回
RichTextValue:提取出的新值。
split
在给定 startIndex 和 endIndex 处将富文本值拆分为两个值,或在给定分隔符处拆分。这与 String.prototype.split 类似。如果未提供索引,则从选区获取索引。
参数
- value
RichTextValue: - string
[number|string]:起始索引,或要拆分处的字符串。
返回
Array<RichTextValue>|undefined:新值数组。
store
rich-text 命名空间的 Store 定义。
相关
类型
Object
toggleFormat
在当前选区处切换应用到富文本值的格式对象。
参数
- value
RichTextValue:要修改的值。 - format
RichTextFormat:要应用或移除的格式。
返回
RichTextValue:应用或移除格式后的新值。
toHTMLString
从富文本值创建 HTML 字符串。
参数
- $1
Object:命名参数。 - $1.value
RichTextValue:富文本值。 - $1.preserveWhiteSpace
[boolean]:如果为 true,则保留换行符。
返回
string:HTML 字符串。
unregisterFormatType
注销一个格式。
参数
- name
string:格式名称。
返回
WPFormat|undefined:如果已成功注销,则为之前的格式值;否则为undefined。
useAnchor
此 hook 应在格式类型的 Edit 组件中使用,它返回被格式化的活动元素;如果没有活动格式,则返回表示选区范围的虚拟元素。返回的值可用于为 UI 定位,例如通过 anchor prop 将其传递给 Popover 组件。
参数
- obj
{ editableContentElement: HTMLElement | null; settings?: WPFormat; }:命名参数。 - obj.editableContentElement
HTMLElement | null:包含可编辑内容的元素。 - obj.settings
WPFormat:格式类型的设置。
返回
Element | VirtualAnchorElement | undefined | null:活动元素或选区范围。
useAnchorRef
此 hook 应在格式类型的 Edit 组件中使用,它返回被格式化的活动元素;如果没有活动格式,则返回选区范围。返回的值可用于为 UI 定位,例如将其传递给 Popover 组件。
参数
- $1
Object:命名参数。 - $1.ref
RefObject<HTMLElement>:包含可编辑内容的元素的 React ref。 - $1.value
RichTextValue:要检查选区的值。 - $1.settings
WPFormat:格式类型的设置。
返回
Element|Range:活动元素或选区范围。
参与该包的贡献
这是一个独立的软件包,它是 Gutenberg 项目的一部分。该项目被组织为一个 monorepo。它由多个自包含的软件包组成,每个软件包都有特定用途。此 monorepo 中的软件包会发布到 npm,并被 WordPress 以及其他软件项目使用。
如需了解更多关于为此软件包或整个 Gutenberg 项目做贡献的信息,请阅读项目的主贡献者指南。