diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index f5eee7b..dead545 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -5,6 +5,7 @@ import llmstxt from 'vitepress-plugin-llms'; import { HeadConfig } from 'vitepress'; // @ts-expect-error This file gets generated once docs:generate is run import apiRoutes from '../api/index.json'; +import m3u8Grammar from './m3u8-grammar.json' with { type: 'json' }; const DESCRIPTION = 'A JavaScript library for reading, writing, and converting media files. Directly in the browser,' + ' and faster than anybunny else.'; @@ -168,6 +169,9 @@ export default withMermaid({ markdown: { math: true, theme: { light: 'github-light', dark: 'github-dark-dimmed' }, + shikiSetup: (shiki) => { + shiki.loadLanguageSync(m3u8Grammar); + }, config(md) { md.use(footnote); }, diff --git a/docs/.vitepress/m3u8-grammar.json b/docs/.vitepress/m3u8-grammar.json new file mode 100644 index 0000000..4c39451 --- /dev/null +++ b/docs/.vitepress/m3u8-grammar.json @@ -0,0 +1,106 @@ +{ + "name": "m3u8", + "scopeName": "source.m3u8", + "fileTypes": ["m3u8"], + "patterns": [ + { + "match": "^#EXTM3U$", + "name": "keyword.control.m3u8" + }, + { + "begin": "^(#)(EXTINF)(:)", + "beginCaptures": { + "1": { "name": "punctuation.definition.comment.m3u8" }, + "2": { "name": "keyword.control.extinf.m3u8" }, + "3": { "name": "punctuation.separator.key-value.m3u8" } + }, + "end": "$", + "patterns": [ + { + "match": "\\b\\d+(?:\\.\\d+)?\\b", + "name": "string.unquoted.m3u8" + }, + { + "match": ",", + "name": "punctuation.separator.sequence.m3u8" + }, + { + "match": "[^,\\n]+", + "name": "string.unquoted.title.m3u8" + } + ] + }, + { + "begin": "^(#)(EXT-X-[A-Z0-9-]+|EXT-[A-Z0-9-]+)(:)", + "beginCaptures": { + "1": { "name": "punctuation.definition.comment.m3u8" }, + "2": { "name": "keyword.control.tag.m3u8" }, + "3": { "name": "punctuation.separator.key-value.m3u8" } + }, + "end": "$", + "patterns": [ + { + "include": "#attribute-list" + }, + { + "match": "\\b(?:YES|NO)\\b", + "name": "string.unquoted.m3u8" + }, + { + "match": "\\b\\d+(?:\\.\\d+)?\\b", + "name": "string.unquoted.m3u8" + }, + { + "match": "[^,\\n]+", + "name": "string.unquoted.m3u8" + } + ] + }, + { + "match": "^[^#\\s][^\\n]*$", + "name": "source.m3u8.uri" + }, + { + "match": "#.*$", + "name": "comment.line.number-sign.m3u8" + } + ], + "repository": { + "attribute-list": { + "patterns": [ + { + "match": "\\b[A-Z0-9-]+(?==)", + "name": "variable.parameter.m3u8" + }, + { + "match": "=", + "name": "keyword.operator.assignment.m3u8" + }, + { + "match": ",", + "name": "punctuation.separator.sequence.m3u8" + }, + { + "match": "\"[^\"]*\"", + "name": "string.quoted.double.m3u8" + }, + { + "match": "\\b\\d+x\\d+\\b", + "name": "string.unquoted.m3u8" + }, + { + "match": "\\b\\d+(?:\\.\\d+)?\\b", + "name": "string.unquoted.m3u8" + }, + { + "match": "\\b(?:YES|NO)\\b", + "name": "string.unquoted.m3u8" + }, + { + "match": "\\b[A-Z0-9_-]+\\b", + "name": "string.unquoted.m3u8" + } + ] + } + } +} \ No newline at end of file