此命名空間包含目前載入的所有語言和一些用於建立與變更語言的輔助函數。
方法
(static) extend(id, redef) → {Grammar}
針對具有特定 ID 的語言建立深度複製,並附加指定的 Token。
如果 redef
中的 Token 也出現在複製的語言中,複製語言中已存在的 Token 將被覆寫為其原始位置。
最佳實務
由於覆寫 Token 的位置(redef
中會覆寫複製語言中的 Token)並無關緊要,技術上它們可以按照任何順序出現。但這可能會讓其他嘗試了解語言定義的人感到困惑,因為通常在 Prism 語法中,Token 的順序很重要。
因此,建議根據被覆寫 Token 的位置來排序覆寫 Token。此外,所有非覆寫 Token 應置於覆寫 Token 之後。
範例
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。這是 |
redef |
Grammar | 要附加的新 Token。 |
傳回值
建立的新語言。
- 類型
- Grammar
(static) insertBefore(inside, before, insert, rootopt) → {Grammar}
在語言定義或其他語法中的另一 Token 之前插入 Token。
使用方式
此輔助方法可讓您輕易修改現有語言。例如,CSS 語言定義不僅定義 CSS 文件的 CSS 亮顯,也需要透過 <style>
元素為嵌入 HTML 中的 CSS 定義亮顯。為執行這項動作,它需要修改 Prism.languages.markup
並加入適當的 Token。不過,Prism.languages.markup
是正規的 JavaScript 物件文字,因此如果您執行下列操作
Prism.languages.markup.style = {
// token
};
那麼 style
Token 將會在最後加入(並處理)。insertBefore
可讓您在現有 Token 之前插入 Token。對於上面的 CSS 範例,您會像這樣使用它
Prism.languages.insertBefore('markup', 'cdata', {
'style': {
// token
}
});
特殊狀況
如果 inside
和 insert
的語法具有名稱相同的 Token,inside
語法中的 Token 將會被忽略。
此行為可用於在 before
之後插入 Token
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 |
字串 | 包含要修改物件的 |
|
before |
字串 | 要插入前的金鑰。 |
|
insert |
Grammar | 包含要插入的 key-value 成對的物件。 |
|
root |
Object.<string, any> | <optional> |
包含 預設為 |
傳回值
新的語法物件。
- 類型
- Grammar