语言

Prism. languages

来源

此命名空间包含当前加载的所有语言以及一些创建和修改语言的辅助函数。

方法

(静态) extend(id, redef) → {语法}

来源

创建给定 ID 的语言的深度副本,并附加给定的标记。

如果 redef 中的标记也出现在所复制的语言中,那么所复制的语言中的现有标记将在其原始位置被覆盖。

最佳实践

由于覆盖标记的位置(redef 中覆盖所复制语言中的标记的标记)并不重要,因此它们在技术上可以按任何顺序排列。但是,这可能会让试图理解语言定义的人感到困惑,因为通常情况下,标记的顺序在 Prism 语法中很重要。

因此,建议根据被覆盖标记的位置对覆盖标记进行排序。此外,所有非覆盖标记都应放在覆盖标记之后。

示例
Prism.languages['css-with-colors'] = Prism.languages.extend('css', {
    // Prism.languages.css already has a 'comment' token, so this token will overwrite CSS' 'comment' token
    // at its original position
    'comment': { ... },
    // CSS doesn't have a 'color' token, so this token will be appended
    'color': /\b(?:red|green|blue)\b/
});
参数
名称 类型 描述
id 字符串

要扩展的语言的 ID。它必须是 Prism.languages 中的键。

redef 语法

要附加的新标记。

返回值

创建的新语言。

类型
语法

(静态) insertBefore(inside, before, insert, rootopt) → {语法}

来源

在语言定义或任何其他语法中的另一个标记之前插入标记。

用法

此辅助方法可以轻松修改现有语言。例如,CSS 语言定义不仅定义了 CSS 文档的 CSS 高亮,还需要通过 <style> 元素定义嵌入在 HTML 中的 CSS 的高亮。为此,需要修改 Prism.languages.markup 并添加适当的标记。但是,Prism.languages.markup 是一个常规的 JavaScript 对象字面量,因此如果您这样做

Prism.languages.markup.style = {
    // token
};

然后,style 标记将被添加(并被处理),加入到末尾。insertBefore 允许你在现有标记之前插入标记。对于上面的 CSS 示例,你会像这样使用它

Prism.languages.insertBefore('markup', 'cdata', {
    'style': {
        // token
    }
});

特殊情况

如果 insideinsert 的语法中存在名称相同的标记,那么 inside 语法中的标记将被忽略。

这种行为可用于在 before 之后插入标记

Prism.languages.insertBefore('markup', 'comment', {
    'comment': Prism.languages.markup.comment,
    // tokens after 'comment'
});

限制

insertBefore 要解决的主要问题是迭代顺序。自 ES2015 以来,对象属性的迭代顺序已保证为插入顺序(整型键除外),但当键被删除并重新插入时,一些浏览器会表现出不同的行为。因此,insertBefore 无法通过临时删除属性来实现,而临时删除属性对于在任意位置插入是必要的。

为解决此问题,insertBefore 实际上没有将给定的标记插入到目标对象中。相反,它将创建一个新对象,并将对目标对象的所有引用替换为新对象。这可以在不临时删除属性的情况下完成,因此,迭代顺序定义良好。

但是,只有可以从 Prism.languagesinsert 访问到的引用才会被替换。也就是说,如果你把目标对象保存在变量中,那么变量的值不会改变。

var oldMarkup = Prism.languages.markup;
var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });

assert(oldMarkup !== Prism.languages.markup);
assert(newMarkup === Prism.languages.markup);
参数
名称 类型 属性 描述
inside 字符串

root 的属性(例如,在 Prism.languages 中的语言 ID),包含要修改的对象。

before 字符串

要插入之前的键。

insert 语法

一个包含要插入的键值对的对象。

root Object.<string, any> <optional>

包含 inside 的对象,即,包含要修改的对象的对象。

默认为 Prism.languages

返回值

新的语法对象。

类型
语法