- ソース
この名前空間には、現在ロードされているすべての言語と、言語を作成および変更するためヘルパー関数が含まれています。
メソッド
(static) extend(id, redef) → {Grammar}
- ソース
指定された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 |
string | 拡張する言語のID。これは`Prism.languages`のキーである必要があります。 |
redef |
文法 | 追加する新しいトークン。 |
戻り値
新しく作成された言語。
- 型
- 文法
(static) insertBefore(inside, before, insert, rootopt) → {Grammar}
- ソース
言語定義またはその他の文法内の別のトークンの*前に*トークンを挿入します。
使用方法
このヘルパーメソッドを使用すると、既存の言語を簡単に変更できます。たとえば、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
}
});
特別な場合
`inside`と`insert`の文法に同じ名前のトークンがある場合、`inside`の文法のトークンは無視されます。
この動作は、`before`の後にトークンを挿入するために使用できます
Prism.languages.insertBefore('markup', 'comment', {
'comment': Prism.languages.markup.comment,
// tokens after 'comment'
});
制限事項
`insertBefore`が解決しなければならない主な問題は、反復順序です。ES2015以降、オブジェクトプロパティの反復順序は挿入順序であることが保証されています(整数キーを除く)が、キーが削除されて再挿入されると、一部のブラウザの動作が異なります。そのため、`insertBefore`は、任意の位置に挿入するために必要なプロパティを一時的に削除することによって実装することはできません。
この問題を解決するために、`insertBefore`は実際には指定されたトークンをターゲットオブジェクトに挿入しません。代わりに、新しいオブジェクトを作成し、ターゲットオブジェクトへのすべての参照を新しいオブジェクトに置き換えます。これは、プロパティを一時的に削除することなく実行できるため、反復順序が明確に定義されます。
ただし、`Prism.languages`または`insert`から到達できる参照のみが置き換えられます。つまり、ターゲットオブジェクトを変数に保持している場合、変数の値は変更されません。
var oldMarkup = Prism.languages.markup;
var newMarkup = Prism.languages.insertBefore('markup', 'comment', { ... });
assert(oldMarkup !== Prism.languages.markup);
assert(newMarkup === Prism.languages.markup);
パラメータ
名前 | 型 | 属性 | 説明 |
---|---|---|---|
inside |
string | 変更するオブジェクトを含む`root`のプロパティ(たとえば、`Prism.languages`の言語ID)。 |
|
before |
string | 挿入する前のキー。 |
|
insert |
文法 | 挿入するキーと値のペアを含むオブジェクト。 |
|
root |
Object.<string, any> | <オプション> |
`inside`を含むオブジェクト、つまり変更するオブジェクトを含むオブジェクト。 デフォルトは`Prism.languages`です。 |
戻り値
新しい文法オブジェクト。
- 型
- 文法