languages

Prism. languages

來源

此命名空間包含目前載入的所有語言和一些用於建立與變更語言的輔助函數。

方法

(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。這是 Prism.languages 中的鍵值。

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
    }
});

特殊狀況

如果 insideinsert 的語法具有名稱相同的 Token,inside 語法中的 Token 將會被忽略。

此行為可用於在 before 之後插入 Token

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 Grammar

包含要插入的 key-value 成對的物件。

root Object.<string, any> <optional>

包含 inside 的物件,也就是包含要修改物件的物件。

預設為 Prism.languages

傳回值

新的語法物件。

類型
Grammar