@arborium/arborium 2.4.7 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/arborium.d.ts +3 -3
- package/dist/arborium.iife.js +2 -2
- package/dist/arborium.iife.js.map +1 -1
- package/dist/arborium.js +511 -168
- package/dist/arborium.js.map +1 -1
- package/dist/arborium_host.js +9 -9
- package/dist/arborium_host_bg.wasm +0 -0
- package/dist/loader.d.ts +6 -7
- package/dist/loader.test.d.ts +1 -0
- package/dist/plugins-manifest.d.ts +4 -1
- package/dist/types.d.ts +37 -2
- package/dist/utils.d.ts +5 -0
- package/package.json +5 -2
package/dist/arborium.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arborium.js","sources":["../src/plugins-manifest.ts","../src/loader.ts","../src/detect.ts"],"sourcesContent":["// AUTO-GENERATED by `cargo xtask gen-manifest` - DO NOT EDIT\n\n/** Version of plugin packages (all @arborium/* packages share this version) */\nexport const pluginVersion = \"2.4.7\";\n\n/** All available languages */\nexport const availableLanguages: string[] = [\n \"ada\",\n \"agda\",\n \"asciidoc\",\n \"asm\",\n \"awk\",\n \"bash\",\n \"batch\",\n \"c\",\n \"c-sharp\",\n \"caddy\",\n \"capnp\",\n \"clojure\",\n \"cmake\",\n \"commonlisp\",\n \"cpp\",\n \"css\",\n \"d\",\n \"dart\",\n \"devicetree\",\n \"diff\",\n \"dockerfile\",\n \"dot\",\n \"elisp\",\n \"elixir\",\n \"elm\",\n \"erlang\",\n \"fish\",\n \"fsharp\",\n \"gleam\",\n \"glsl\",\n \"go\",\n \"graphql\",\n \"groovy\",\n \"haskell\",\n \"hcl\",\n \"hlsl\",\n \"html\",\n \"idris\",\n \"ini\",\n \"java\",\n \"javascript\",\n \"jinja2\",\n \"jq\",\n \"json\",\n \"julia\",\n \"kdl\",\n \"kotlin\",\n \"lean\",\n \"lua\",\n \"markdown\",\n \"matlab\",\n \"meson\",\n \"nginx\",\n \"ninja\",\n \"nix\",\n \"objc\",\n \"ocaml\",\n \"perl\",\n \"php\",\n \"postscript\",\n \"powershell\",\n \"prolog\",\n \"python\",\n \"query\",\n \"r\",\n \"rescript\",\n \"ron\",\n \"ruby\",\n \"rust\",\n \"scala\",\n \"scheme\",\n \"scss\",\n \"sparql\",\n \"sql\",\n \"ssh-config\",\n \"starlark\",\n \"svelte\",\n \"swift\",\n \"textproto\",\n \"thrift\",\n \"tlaplus\",\n \"toml\",\n \"tsx\",\n \"typescript\",\n \"typst\",\n \"uiua\",\n \"vb\",\n \"verilog\",\n \"vhdl\",\n \"vim\",\n \"vue\",\n \"wit\",\n \"x86asm\",\n \"xml\",\n \"yaml\",\n \"yuri\",\n \"zig\",\n \"zsh\",\n];","/**\n * Arborium loader - loads grammar plugins and highlights code.\n *\n * Architecture:\n * 1. Grammar registry is bundled at build time (no network request needed in production)\n * - Can be overridden via pluginsUrl config for local development\n * 2. Load grammar wasm-bindgen modules on demand from @arborium/<lang> packages\n * 3. Parse and highlight using the grammar's tree-sitter parser\n */\n\nimport type { ParseResult, ArboriumConfig, Grammar, Session, Span, Injection } from \"./types.js\";\nimport { availableLanguages, pluginVersion } from \"./plugins-manifest.js\";\n\n// Default config\nexport const defaultConfig: Required<ArboriumConfig> = {\n manual: false,\n theme: \"one-dark\",\n selector: \"pre code\",\n cdn: \"jsdelivr\",\n version: pluginVersion, // Precise version from manifest\n pluginsUrl: \"\", // Empty means use bundled manifest\n hostUrl: \"\", // Empty means use CDN based on version\n};\n\n// Rust host module (loaded on demand)\ninterface HostModule {\n highlight: (language: string, source: string) => string;\n isLanguageAvailable: (language: string) => boolean;\n}\nlet hostModule: HostModule | null = null;\nlet hostLoadPromise: Promise<HostModule | null> | null = null;\n\n// Merged config\nlet config: Required<ArboriumConfig> = { ...defaultConfig };\n\n// Grammar plugins cache\nconst grammarCache = new Map<string, GrammarPlugin>();\n\n// Languages we know are available (bundled at build time)\nconst knownLanguages: Set<string> = new Set(availableLanguages);\n\n// For local development: can override with pluginsUrl to load from dev server\ninterface LocalManifest {\n entries: Array<{\n language: string;\n local_js: string;\n local_wasm: string;\n }>;\n}\nlet localManifest: LocalManifest | null = null;\nlet localManifestPromise: Promise<void> | null = null;\n\n/** Load local manifest if pluginsUrl is configured (for dev server) */\nasync function ensureLocalManifest(): Promise<void> {\n if (!config.pluginsUrl) {\n return;\n }\n\n if (localManifestPromise) {\n return localManifestPromise;\n }\n\n localManifestPromise = (async () => {\n console.debug(`[arborium] Loading local plugins manifest from: ${config.pluginsUrl}`);\n const response = await fetch(config.pluginsUrl);\n if (!response.ok) {\n throw new Error(`Failed to load plugins.json: ${response.status}`);\n }\n localManifest = await response.json();\n console.debug(`[arborium] Loaded local manifest with ${localManifest?.entries.length} entries`);\n })();\n\n return localManifestPromise;\n}\n\n/** Get the CDN base URL for a grammar */\nfunction getGrammarBaseUrl(language: string): string {\n // If we have a local manifest (dev mode), use the local path\n if (localManifest) {\n const entry = localManifest.entries.find((e) => e.language === language);\n if (entry) {\n // Extract base URL from local_js path (e.g., \"/langs/group-hazel/python/npm/grammar.js\" -> \"/langs/group-hazel/python/npm\")\n return entry.local_js.substring(0, entry.local_js.lastIndexOf(\"/\"));\n }\n }\n\n // Production: derive from language name using precise version\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n return `${baseUrl}/@arborium/${language}@${version}`;\n}\n\n/** wasm-bindgen plugin module interface */\ninterface WasmBindgenPlugin {\n default: (wasmUrl: string) => Promise<void>;\n language_id: () => string;\n injection_languages: () => string[];\n create_session: () => number;\n free_session: (session: number) => void;\n set_text: (session: number, text: string) => void;\n parse: (session: number) => ParseResult;\n cancel: (session: number) => void;\n}\n\n/** A loaded grammar plugin */\ninterface GrammarPlugin {\n languageId: string;\n injectionLanguages: string[];\n module: WasmBindgenPlugin;\n parse: (text: string) => ParseResult;\n}\n\n/** Load a grammar plugin */\nasync function loadGrammarPlugin(language: string): Promise<GrammarPlugin | null> {\n // Check cache\n const cached = grammarCache.get(language);\n if (cached) {\n console.debug(`[arborium] Grammar '${language}' found in cache`);\n return cached;\n }\n\n // Load local manifest if in dev mode\n await ensureLocalManifest();\n\n // Check if language is known\n if (\n !knownLanguages.has(language) &&\n !localManifest?.entries.some((e) => e.language === language)\n ) {\n console.debug(`[arborium] Grammar '${language}' not available`);\n return null;\n }\n\n try {\n const baseUrl = getGrammarBaseUrl(language);\n const jsUrl = `${baseUrl}/grammar.js`;\n const wasmUrl = `${baseUrl}/grammar_bg.wasm`;\n\n console.debug(`[arborium] Loading grammar '${language}' from ${jsUrl}`);\n\n // Dynamically import the wasm-bindgen generated JS module\n const module = (await import(/* @vite-ignore */ jsUrl)) as WasmBindgenPlugin;\n\n // Initialize the WASM module\n await module.default(wasmUrl);\n\n // Verify it loaded correctly\n const loadedId = module.language_id();\n if (loadedId !== language) {\n console.warn(`[arborium] Language ID mismatch: expected '${language}', got '${loadedId}'`);\n }\n\n // Get injection languages\n const injectionLanguages = module.injection_languages();\n\n // Wrap as GrammarPlugin with session-based parsing\n const plugin: GrammarPlugin = {\n languageId: language,\n injectionLanguages,\n module,\n parse: (text: string) => {\n const session = module.create_session();\n try {\n module.set_text(session, text);\n // wasm-bindgen returns ParseResult directly (or throws on error)\n const result = module.parse(session);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n console.error(`[arborium] Parse error:`, e);\n return { spans: [], injections: [] };\n } finally {\n module.free_session(session);\n }\n },\n };\n\n grammarCache.set(language, plugin);\n console.debug(`[arborium] Grammar '${language}' loaded successfully`);\n return plugin;\n } catch (e) {\n console.error(`[arborium] Failed to load grammar '${language}':`, e);\n return null;\n }\n}\n\n// Handle to plugin mapping for the host interface\nconst handleToPlugin = new Map<number, GrammarPlugin>();\nlet nextHandle = 1;\n\n/** Setup window.arboriumHost for the Rust host to call into */\nfunction setupHostInterface(): void {\n (window as any).arboriumHost = {\n /** Check if a language is available (sync) */\n isLanguageAvailable(language: string): boolean {\n return knownLanguages.has(language) || grammarCache.has(language);\n },\n\n /** Load a grammar and return a handle (async) */\n async loadGrammar(language: string): Promise<number> {\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) return 0; // 0 = not found\n\n // Check if we already have a handle\n for (const [handle, p] of handleToPlugin) {\n if (p === plugin) return handle;\n }\n\n // Create new handle\n const handle = nextHandle++;\n handleToPlugin.set(handle, plugin);\n return handle;\n },\n\n /** Parse text using a grammar handle (sync) */\n parse(handle: number, text: string): ParseResult {\n const plugin = handleToPlugin.get(handle);\n if (!plugin) return { spans: [], injections: [] };\n return plugin.parse(text);\n },\n };\n}\n\n/** Get the host URL based on config */\nfunction getHostUrl(): string {\n if (config.hostUrl) {\n return config.hostUrl;\n }\n // Use CDN\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n const versionSuffix = version === \"latest\" ? \"\" : `@${version}`;\n return `${baseUrl}/@arborium/arborium${versionSuffix}/dist`;\n}\n\n/** Load the Rust host module */\nasync function loadHost(): Promise<HostModule | null> {\n if (hostModule) return hostModule;\n if (hostLoadPromise) return hostLoadPromise;\n\n hostLoadPromise = (async () => {\n // Setup the interface the host imports\n setupHostInterface();\n\n const hostUrl = getHostUrl();\n const jsUrl = `${hostUrl}/arborium_host.js`;\n const wasmUrl = `${hostUrl}/arborium_host_bg.wasm`;\n\n console.debug(`[arborium] Loading host from ${jsUrl}`);\n try {\n const module = await import(/* @vite-ignore */ jsUrl);\n await module.default(wasmUrl);\n\n hostModule = {\n highlight: module.highlight,\n isLanguageAvailable: module.isLanguageAvailable,\n };\n console.debug(`[arborium] Host loaded successfully`);\n return hostModule;\n } catch (e) {\n console.error(\"[arborium] Failed to load host:\", e);\n return null;\n }\n })();\n\n return hostLoadPromise;\n}\n\n/** Highlight source code */\nexport async function highlight(\n language: string,\n source: string,\n _config?: ArboriumConfig,\n): Promise<string> {\n // Try to use the Rust host (handles injections properly)\n const host = await loadHost();\n if (host) {\n try {\n return host.highlight(language, source);\n } catch (e) {\n console.warn(\"Host highlight failed, falling back to JS:\", e);\n }\n }\n\n // Fallback to JS-only highlighting (no injection support)\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) {\n return escapeHtml(source);\n }\n\n const result = plugin.parse(source);\n return spansToHtml(source, result.spans);\n}\n\n/** Load a grammar for direct use */\nexport async function loadGrammar(\n language: string,\n _config?: ArboriumConfig,\n): Promise<Grammar | null> {\n const plugin = await loadGrammarPlugin(language);\n if (!plugin) return null;\n\n const { module } = plugin;\n\n return {\n languageId: () => plugin.languageId,\n injectionLanguages: () => plugin.injectionLanguages,\n highlight: async (source: string) => {\n const result = plugin.parse(source);\n return spansToHtml(source, result.spans);\n },\n parse: (source: string) => plugin.parse(source),\n createSession: (): Session => {\n const handle = module.create_session();\n return {\n setText: (text: string) => module.set_text(handle, text),\n parse: () => {\n try {\n const result = module.parse(handle);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n console.error(`[arborium] Session parse error:`, e);\n return { spans: [], injections: [] };\n }\n },\n cancel: () => module.cancel(handle),\n free: () => module.free_session(handle),\n };\n },\n dispose: () => {\n // No-op for now, plugins are cached\n },\n };\n}\n\n/** Convert spans to HTML */\nexport function spansToHtml(source: string, spans: Span[]): string {\n // Sort spans by start position\n const sorted = [...spans].sort((a, b) => a.start - b.start);\n\n let html = \"\";\n let pos = 0;\n\n for (const span of sorted) {\n // Skip overlapping spans\n if (span.start < pos) continue;\n\n // Add text before span\n if (span.start > pos) {\n html += escapeHtml(source.slice(pos, span.start));\n }\n\n // Get tag for capture\n const tag = getTagForCapture(span.capture);\n const text = escapeHtml(source.slice(span.start, span.end));\n\n if (tag) {\n html += `<a-${tag}>${text}</a-${tag}>`;\n } else {\n html += text;\n }\n\n pos = span.end;\n }\n\n // Add remaining text\n if (pos < source.length) {\n html += escapeHtml(source.slice(pos));\n }\n\n return html;\n}\n\n/** Get the short tag for a capture name */\nfunction getTagForCapture(capture: string): string | null {\n if (capture.startsWith(\"keyword\") || capture === \"include\" || capture === \"conditional\") {\n return \"k\";\n }\n if (capture.startsWith(\"function\") || capture.startsWith(\"method\")) {\n return \"f\";\n }\n if (capture.startsWith(\"string\") || capture === \"character\") {\n return \"s\";\n }\n if (capture.startsWith(\"comment\")) {\n return \"c\";\n }\n if (capture.startsWith(\"type\")) {\n return \"t\";\n }\n if (capture.startsWith(\"variable\")) {\n return \"v\";\n }\n if (capture.startsWith(\"number\") || capture === \"float\") {\n return \"n\";\n }\n if (capture.startsWith(\"operator\")) {\n return \"o\";\n }\n if (capture.startsWith(\"punctuation\")) {\n return \"p\";\n }\n if (capture.startsWith(\"tag\")) {\n return \"tg\";\n }\n if (capture.startsWith(\"attribute\")) {\n return \"at\";\n }\n return null;\n}\n\n/** Escape HTML special characters */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n\n/** Get current config, optionally merging with overrides */\nexport function getConfig(overrides?: Partial<ArboriumConfig>): Required<ArboriumConfig> {\n if (overrides) {\n return { ...config, ...overrides };\n }\n return { ...config };\n}\n\n/** Set/merge config */\nexport function setConfig(newConfig: Partial<ArboriumConfig>): void {\n config = { ...config, ...newConfig };\n}\n\n/** Check if a language is available */\nexport async function isLanguageAvailable(language: string): Promise<boolean> {\n await ensureLocalManifest();\n return (\n knownLanguages.has(language) ||\n (localManifest?.entries.some((e) => e.language === language) ?? false)\n );\n}\n\n/** Get list of available languages */\nexport async function getAvailableLanguages(): Promise<string[]> {\n await ensureLocalManifest();\n // In dev mode, use local manifest if available\n if (localManifest) {\n return localManifest.entries.map((e) => e.language);\n }\n return Array.from(knownLanguages);\n}\n","/**\n * Simple language detection heuristics.\n * Not meant to be comprehensive - just catches common cases.\n */\n\n/** Shebang patterns */\nconst SHEBANG_PATTERNS: Array<[RegExp, string]> = [\n [/^#!.*\\bpython[23]?\\b/, 'python'],\n [/^#!.*\\bnode\\b/, 'javascript'],\n [/^#!.*\\bdeno\\b/, 'typescript'],\n [/^#!.*\\bbun\\b/, 'typescript'],\n [/^#!.*\\bruby\\b/, 'ruby'],\n [/^#!.*\\bperl\\b/, 'perl'],\n [/^#!.*\\bphp\\b/, 'php'],\n [/^#!.*\\bbash\\b/, 'bash'],\n [/^#!.*\\bzsh\\b/, 'zsh'],\n [/^#!.*\\bsh\\b/, 'bash'],\n [/^#!.*\\blua\\b/, 'lua'],\n [/^#!.*\\bawk\\b/, 'awk'],\n];\n\n/** Keyword fingerprints - first few unique keywords that identify a language */\nconst KEYWORD_FINGERPRINTS: Array<[RegExp, string]> = [\n // Rust - distinctive keywords\n [/\\b(fn|impl|trait|pub\\s+fn|let\\s+mut|&mut|->)\\b/, 'rust'],\n\n // Go - distinctive keywords\n [/\\b(func|package\\s+\\w+|import\\s+\\(|go\\s+func|chan\\s+\\w+)\\b/, 'go'],\n\n // Python - distinctive patterns\n [/\\b(def\\s+\\w+\\s*\\(|import\\s+\\w+|from\\s+\\w+\\s+import|class\\s+\\w+:)\\b/, 'python'],\n\n // TypeScript - distinctive type annotations\n [/:\\s*(string|number|boolean|void)\\b|\\binterface\\s+\\w+\\s*\\{/, 'typescript'],\n\n // JavaScript - distinctive patterns (after TS check)\n [/\\b(const|let|var)\\s+\\w+\\s*=|function\\s+\\w+\\s*\\(|=>\\s*\\{/, 'javascript'],\n\n // Ruby - distinctive keywords\n [/\\b(def\\s+\\w+|end\\b|do\\s*\\|.*\\||puts\\s+|require\\s+['\"])\\b/, 'ruby'],\n\n // Java - distinctive patterns\n [/\\b(public\\s+class|private\\s+\\w+|System\\.out\\.println)\\b/, 'java'],\n\n // C++ - distinctive patterns\n [/\\b(#include\\s*<|std::|template\\s*<|nullptr|cout\\s*<<)\\b/, 'cpp'],\n\n // C - distinctive patterns (after C++ check)\n [/\\b(#include\\s*[<\"]|printf\\s*\\(|int\\s+main\\s*\\(|void\\s+\\w+\\s*\\()\\b/, 'c'],\n\n // C# - distinctive patterns\n [/\\b(namespace\\s+\\w+|using\\s+System|public\\s+static\\s+void)\\b/, 'c-sharp'],\n\n // PHP - distinctive patterns\n [/<\\?php|\\$\\w+\\s*=/, 'php'],\n\n // Swift - distinctive patterns\n [/\\b(func\\s+\\w+|var\\s+\\w+:\\s*\\w+|let\\s+\\w+:\\s*\\w+|@objc)\\b/, 'swift'],\n\n // Kotlin - distinctive patterns\n [/\\b(fun\\s+\\w+|val\\s+\\w+|var\\s+\\w+:|data\\s+class)\\b/, 'kotlin'],\n\n // Scala - distinctive patterns\n [/\\b(def\\s+\\w+|val\\s+\\w+|var\\s+\\w+|object\\s+\\w+|case\\s+class)\\b/, 'scala'],\n\n // Haskell - distinctive patterns\n [/\\b(module\\s+\\w+|import\\s+qualified|data\\s+\\w+\\s*=|::\\s*\\w+\\s*->)\\b/, 'haskell'],\n\n // Elixir - distinctive patterns\n [/\\b(defmodule\\s+\\w+|def\\s+\\w+|defp\\s+\\w+|\\|>)\\b/, 'elixir'],\n\n // Lua - distinctive patterns\n [/\\b(local\\s+\\w+\\s*=|function\\s+\\w+\\.\\w+|require\\s*\\()\\b/, 'lua'],\n\n // SQL - distinctive patterns\n [/\\b(SELECT\\s+.*\\s+FROM|INSERT\\s+INTO|CREATE\\s+TABLE|ALTER\\s+TABLE)\\b/i, 'sql'],\n\n // Shell/Bash - distinctive patterns\n [/\\b(if\\s+\\[\\s*|then\\b|fi\\b|echo\\s+[\"']|export\\s+\\w+=)\\b/, 'bash'],\n\n // YAML - distinctive patterns\n [/^\\s*[\\w-]+:\\s*[\\w\\-\"'[{]|^---\\s*$/, 'yaml'],\n\n // JSON - distinctive patterns\n [/^\\s*\\{[\\s\\S]*\"[\\w-]+\":\\s*/, 'json'],\n\n // TOML - distinctive patterns\n [/^\\s*\\[[\\w.-]+\\]\\s*$|^\\s*\\w+\\s*=\\s*[\"'\\d\\[]/, 'toml'],\n\n // HTML - distinctive patterns\n [/<(!DOCTYPE|html|head|body|div|span|p|a\\s)/i, 'html'],\n\n // CSS - distinctive patterns\n [/^\\s*[\\w.#@][\\w\\s,#.:>+~-]*\\{[^}]*\\}|@media\\s|@import\\s/, 'css'],\n\n // Markdown - distinctive patterns\n [/^#{1,6}\\s+\\w|^\\s*[-*+]\\s+\\w|^\\s*\\d+\\.\\s+\\w|```\\w*\\n/, 'markdown'],\n\n // XML - distinctive patterns\n [/<\\?xml|<[\\w:-]+\\s+xmlns/, 'xml'],\n\n // Dockerfile\n [/^FROM\\s+\\w+|^RUN\\s+|^COPY\\s+|^ENTRYPOINT\\s+/m, 'dockerfile'],\n\n // Nginx config\n [/\\b(server\\s*\\{|location\\s+[\\/~]|proxy_pass\\s+)\\b/, 'nginx'],\n\n // Zig\n [/\\b(pub\\s+fn|const\\s+\\w+\\s*=|@import\\(|comptime)\\b/, 'zig'],\n];\n\n/**\n * Detect the language of a code snippet.\n * Returns null if detection fails.\n */\nexport function detectLanguage(source: string): string | null {\n // Check shebang first (most reliable)\n const firstLine = source.split('\\n')[0];\n for (const [pattern, language] of SHEBANG_PATTERNS) {\n if (pattern.test(firstLine)) {\n return language;\n }\n }\n\n // Check keyword fingerprints\n for (const [pattern, language] of KEYWORD_FINGERPRINTS) {\n if (pattern.test(source)) {\n return language;\n }\n }\n\n return null;\n}\n\n/**\n * Extract language from class name.\n * Supports multiple patterns:\n * - \"language-rust\" -> \"rust\" (standard)\n * - \"lang-rust\" -> \"rust\" (common alternative)\n * - \"rust\" -> \"rust\" (docs.rs style, bare language name)\n */\nexport function extractLanguageFromClass(className: string): string | null {\n // Try \"language-*\" pattern first (most specific)\n const langMatch = className.match(/\\blanguage-(\\w+)\\b/);\n if (langMatch) return langMatch[1];\n\n // Try \"lang-*\" pattern\n const shortMatch = className.match(/\\blang-(\\w+)\\b/);\n if (shortMatch) return shortMatch[1];\n\n // Try bare language names (for docs.rs compatibility)\n // Only match known language names to avoid false positives\n const knownLanguages = new Set([\n 'rust', 'javascript', 'typescript', 'python', 'ruby', 'go', 'java',\n 'c', 'cpp', 'csharp', 'php', 'swift', 'kotlin', 'scala', 'haskell',\n 'elixir', 'lua', 'sql', 'bash', 'shell', 'yaml', 'json', 'toml',\n 'html', 'css', 'xml', 'markdown', 'dockerfile', 'nginx', 'zig',\n 'text', 'plaintext', 'console', 'sh',\n ]);\n\n for (const cls of className.split(/\\s+/)) {\n if (knownLanguages.has(cls.toLowerCase())) {\n return cls.toLowerCase();\n }\n }\n\n return null;\n}\n\n/**\n * Normalize language identifier (handle aliases)\n */\nexport function normalizeLanguage(lang: string): string {\n const aliases: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n cs: 'c-sharp',\n csharp: 'c-sharp',\n 'c++': 'cpp',\n 'c#': 'c-sharp',\n 'f#': 'fsharp',\n dockerfile: 'dockerfile',\n docker: 'dockerfile',\n makefile: 'make',\n plaintext: 'text',\n plain: 'text',\n txt: 'text',\n };\n\n const lower = lang.toLowerCase();\n return aliases[lower] || lower;\n}\n"],"names":["pluginVersion","availableLanguages","defaultConfig","hostModule","hostLoadPromise","config","grammarCache","knownLanguages","localManifest","localManifestPromise","ensureLocalManifest","response","getGrammarBaseUrl","language","entry","e","cdn","version","baseUrl","loadGrammarPlugin","cached","jsUrl","wasmUrl","module","loadedId","injectionLanguages","plugin","text","session","result","handleToPlugin","nextHandle","setupHostInterface","handle","p","getHostUrl","versionSuffix","loadHost","hostUrl","highlight","source","_config","host","escapeHtml","spansToHtml","loadGrammar","spans","sorted","a","b","html","pos","span","tag","getTagForCapture","capture","getConfig","overrides","SHEBANG_PATTERNS","KEYWORD_FINGERPRINTS","detectLanguage","firstLine","pattern","extractLanguageFromClass","className","langMatch","shortMatch","cls","normalizeLanguage","lang","aliases","lower"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"arborium.js","sources":["../src/plugins-manifest.ts","../src/utils.ts","../src/loader.ts","../src/detect.ts"],"sourcesContent":["// AUTO-GENERATED by `cargo xtask gen-manifest` - DO NOT EDIT\n\nimport type { Highlight } from \"./types.js\"; \n\n/** Version of plugin packages (all @arborium/* packages share this version) */\nexport const pluginVersion = \"2.6.0\";\n\n/** All available languages */\nexport const availableLanguages: string[] = [\n \"ada\",\n \"agda\",\n \"asciidoc\",\n \"asm\",\n \"awk\",\n \"bash\",\n \"batch\",\n \"c\",\n \"c-sharp\",\n \"caddy\",\n \"capnp\",\n \"clojure\",\n \"cmake\",\n \"commonlisp\",\n \"cpp\",\n \"css\",\n \"d\",\n \"dart\",\n \"devicetree\",\n \"diff\",\n \"dockerfile\",\n \"dot\",\n \"elisp\",\n \"elixir\",\n \"elm\",\n \"erlang\",\n \"fish\",\n \"fsharp\",\n \"gleam\",\n \"glsl\",\n \"go\",\n \"graphql\",\n \"groovy\",\n \"haskell\",\n \"hcl\",\n \"hlsl\",\n \"html\",\n \"idris\",\n \"ini\",\n \"java\",\n \"javascript\",\n \"jinja2\",\n \"jq\",\n \"json\",\n \"julia\",\n \"kdl\",\n \"kotlin\",\n \"lean\",\n \"lua\",\n \"markdown\",\n \"matlab\",\n \"meson\",\n \"nginx\",\n \"ninja\",\n \"nix\",\n \"objc\",\n \"ocaml\",\n \"perl\",\n \"php\",\n \"postscript\",\n \"powershell\",\n \"prolog\",\n \"python\",\n \"query\",\n \"r\",\n \"rescript\",\n \"ron\",\n \"ruby\",\n \"rust\",\n \"scala\",\n \"scheme\",\n \"scss\",\n \"solidity\",\n \"sparql\",\n \"sql\",\n \"ssh-config\",\n \"starlark\",\n \"svelte\",\n \"swift\",\n \"textproto\",\n \"thrift\",\n \"tlaplus\",\n \"toml\",\n \"tsx\",\n \"typescript\",\n \"typst\",\n \"uiua\",\n \"vb\",\n \"verilog\",\n \"vhdl\",\n \"vim\",\n \"vue\",\n \"wit\",\n \"x86asm\",\n \"xml\",\n \"yaml\",\n \"yuri\",\n \"zig\",\n \"zsh\",\n];\n\n/** All possible highlights and their short tags */\nexport const highlights: Highlight[] = [\n {\n name: \"attribute\",\n tag: \"at\",\n },\n {\n name: \"constant\",\n tag: \"co\",\n },\n {\n name: \"constant.builtin\",\n tag: \"co\",\n parentTag: \"co\",\n },\n {\n name: \"constructor\",\n tag: \"cr\",\n },\n {\n name: \"function.builtin\",\n tag: \"fb\",\n parentTag: \"f\",\n },\n {\n name: \"function\",\n tag: \"f\",\n },\n {\n name: \"function.method\",\n tag: \"f\",\n parentTag: \"f\",\n },\n {\n name: \"keyword\",\n tag: \"k\",\n },\n {\n name: \"keyword.conditional\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.coroutine\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.debug\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.exception\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.function\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.import\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.operator\",\n tag: \"o\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.repeat\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.return\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.type\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"operator\",\n tag: \"o\",\n },\n {\n name: \"property\",\n tag: \"pr\",\n },\n {\n name: \"punctuation\",\n tag: \"p\",\n },\n {\n name: \"punctuation.bracket\",\n tag: \"p\",\n parentTag: \"p\",\n },\n {\n name: \"punctuation.delimiter\",\n tag: \"p\",\n parentTag: \"p\",\n },\n {\n name: \"punctuation.special\",\n tag: \"p\",\n parentTag: \"p\",\n },\n {\n name: \"string\",\n tag: \"s\",\n },\n {\n name: \"string.special\",\n tag: \"s\",\n parentTag: \"s\",\n },\n {\n name: \"tag\",\n tag: \"tg\",\n },\n {\n name: \"tag.delimiter\",\n tag: \"tg\",\n parentTag: \"tg\",\n },\n {\n name: \"tag.error\",\n tag: \"err\",\n parentTag: \"tg\",\n },\n {\n name: \"type\",\n tag: \"t\",\n },\n {\n name: \"type.builtin\",\n tag: \"t\",\n parentTag: \"t\",\n },\n {\n name: \"type.qualifier\",\n tag: \"t\",\n parentTag: \"t\",\n },\n {\n name: \"variable\",\n tag: \"v\",\n },\n {\n name: \"variable.builtin\",\n tag: \"v\",\n parentTag: \"v\",\n },\n {\n name: \"variable.parameter\",\n tag: \"v\",\n parentTag: \"v\",\n },\n {\n name: \"comment\",\n tag: \"c\",\n },\n {\n name: \"comment.documentation\",\n tag: \"c\",\n parentTag: \"c\",\n },\n {\n name: \"macro\",\n tag: \"m\",\n },\n {\n name: \"label\",\n tag: \"l\",\n },\n {\n name: \"diff.addition\",\n tag: \"da\",\n },\n {\n name: \"diff.deletion\",\n tag: \"dd\",\n },\n {\n name: \"number\",\n tag: \"n\",\n },\n {\n name: \"text.literal\",\n tag: \"tl\",\n },\n {\n name: \"text.emphasis\",\n tag: \"em\",\n },\n {\n name: \"text.strong\",\n tag: \"st\",\n },\n {\n name: \"text.uri\",\n tag: \"tu\",\n },\n {\n name: \"text.reference\",\n tag: \"tr\",\n },\n {\n name: \"string.escape\",\n tag: \"se\",\n parentTag: \"s\",\n },\n {\n name: \"text.title\",\n tag: \"tt\",\n },\n {\n name: \"text.strikethrough\",\n tag: \"ts\",\n },\n {\n name: \"spell\",\n tag: \"\",\n },\n {\n name: \"embedded\",\n tag: \"eb\",\n },\n {\n name: \"error\",\n tag: \"err\",\n },\n {\n name: \"namespace\",\n tag: \"ns\",\n },\n {\n name: \"include\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"storageclass\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"repeat\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"conditional\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"exception\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"preproc\",\n tag: \"pp\",\n },\n {\n name: \"none\",\n tag: \"\",\n },\n {\n name: \"character\",\n tag: \"ch\",\n parentTag: \"s\",\n },\n {\n name: \"character.special\",\n tag: \"ch\",\n parentTag: \"ch\",\n },\n {\n name: \"variable.member\",\n tag: \"pr\",\n parentTag: \"v\",\n },\n {\n name: \"function.definition\",\n tag: \"f\",\n parentTag: \"f\",\n },\n {\n name: \"type.definition\",\n tag: \"t\",\n parentTag: \"t\",\n },\n {\n name: \"function.call\",\n tag: \"f\",\n parentTag: \"f\",\n },\n {\n name: \"keyword.modifier\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"keyword.directive\",\n tag: \"k\",\n parentTag: \"k\",\n },\n {\n name: \"string.regexp\",\n tag: \"sr\",\n parentTag: \"s\",\n },\n {\n name: \"nospell\",\n tag: \"\",\n },\n {\n name: \"float\",\n tag: \"n\",\n parentTag: \"n\",\n },\n {\n name: \"boolean\",\n tag: \"bo\",\n parentTag: \"co\",\n },\n];","import type { Span } from \"./types.js\";\n\n/** Convert spans to HTML */\nexport function spansToHtml(source: string, spans: Span[]): string {\n // Sort spans by start position\n const sorted = [...spans].sort((a, b) => a.start - b.start);\n\n let html = \"\";\n let pos = 0;\n\n for (const span of sorted) {\n // Skip overlapping spans\n if (span.start < pos) continue;\n\n // Add text before span\n if (span.start > pos) {\n html += escapeHtml(source.slice(pos, span.start));\n }\n\n // Get tag for capture\n const tag = getTagForCapture(span.capture);\n const text = escapeHtml(source.slice(span.start, span.end));\n\n if (tag) {\n html += `<a-${tag}>${text}</a-${tag}>`;\n } else {\n html += text;\n }\n\n pos = span.end;\n }\n\n // Add remaining text\n if (pos < source.length) {\n html += escapeHtml(source.slice(pos));\n }\n\n return html;\n}\n\n/** Get the short tag for a capture name */\nfunction getTagForCapture(capture: string): string | null {\n if (capture.startsWith(\"keyword\") || capture === \"include\" || capture === \"conditional\") {\n return \"k\";\n }\n if (capture.startsWith(\"function\") || capture.startsWith(\"method\")) {\n return \"f\";\n }\n if (capture.startsWith(\"string\") || capture === \"character\") {\n return \"s\";\n }\n if (capture.startsWith(\"comment\")) {\n return \"c\";\n }\n if (capture.startsWith(\"type\")) {\n return \"t\";\n }\n if (capture.startsWith(\"variable\")) {\n return \"v\";\n }\n if (capture.startsWith(\"number\") || capture === \"float\") {\n return \"n\";\n }\n if (capture.startsWith(\"operator\")) {\n return \"o\";\n }\n if (capture.startsWith(\"punctuation\")) {\n return \"p\";\n }\n if (capture.startsWith(\"tag\")) {\n return \"tg\";\n }\n if (capture.startsWith(\"attribute\")) {\n return \"at\";\n }\n return null;\n}\n\n/** Escape HTML special characters */\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n","/**\n * Arborium loader - loads grammar plugins and highlights code.\n *\n * Architecture:\n * 1. Grammar registry is bundled at build time (no network request needed in production)\n * - Can be overridden via pluginsUrl config for local development\n * 2. Load grammar wasm-bindgen modules on demand from @arborium/<lang> packages\n * 3. Parse and highlight using the grammar's tree-sitter parser\n */\n\nimport type { ParseResult, ArboriumConfig, Grammar, Session } from \"./types.js\";\nimport { availableLanguages, pluginVersion } from \"./plugins-manifest.js\";\nimport { spansToHtml, escapeHtml } from \"./utils.js\";\n\n// Re-export utilities\nexport { spansToHtml } from \"./utils.js\";\n\n// Default config\nexport const defaultConfig: Required<ArboriumConfig> = {\n manual: false,\n theme: \"one-dark\",\n selector: \"pre code\",\n cdn: \"jsdelivr\",\n version: pluginVersion, // Precise version from manifest\n pluginsUrl: \"\", // Empty means use bundled manifest\n hostUrl: \"\", // Empty means use CDN based on version\n resolveJs: ({ baseUrl, path }) => import(/* @vite-ignore */ `${baseUrl}/${path}`),\n resolveWasm: ({ baseUrl, path }) => fetch(`${baseUrl}/${path}`),\n};\n\n// Rust host module (loaded on demand)\ninterface HostModule {\n highlight: (language: string, source: string) => string;\n isLanguageAvailable: (language: string) => boolean;\n}\nlet hostModule: HostModule | null = null;\nlet hostLoadPromise: Promise<HostModule | null> | null = null;\n\n// Merged config\nlet globalConfig: Required<ArboriumConfig> = { ...defaultConfig };\n\n// Grammar plugins cache\nconst grammarCache = new Map<string, GrammarPlugin>();\n\n// Languages we know are available (bundled at build time)\nconst knownLanguages: Set<string> = new Set(availableLanguages);\n\n// For local development: can override with pluginsUrl to load from dev server\ninterface LocalManifest {\n entries: Array<{\n language: string;\n local_js: string;\n local_wasm: string;\n }>;\n}\nlet localManifest: LocalManifest | null = null;\nlet localManifestPromise: Promise<void> | null = null;\n\n/** Load local manifest if pluginsUrl is configured (for dev server) */\nasync function ensureLocalManifest(config: Required<ArboriumConfig>): Promise<void> {\n if (!config.pluginsUrl) {\n return;\n }\n\n if (localManifestPromise) {\n return localManifestPromise;\n }\n\n localManifestPromise = (async () => {\n console.debug(`[arborium] Loading local plugins manifest from: ${config.pluginsUrl}`);\n const response = await fetch(config.pluginsUrl);\n if (!response.ok) {\n throw new Error(`Failed to load plugins.json: ${response.status}`);\n }\n localManifest = await response.json();\n console.debug(`[arborium] Loaded local manifest with ${localManifest?.entries.length} entries`);\n })();\n\n return localManifestPromise;\n}\n\n/** Get the CDN base URL for a grammar */\nfunction getGrammarBaseUrl(language: string, config: Required<ArboriumConfig>): string {\n // If we have a local manifest (dev mode), use the local path\n if (localManifest) {\n const entry = localManifest.entries.find((e) => e.language === language);\n if (entry) {\n // Extract base URL from local_js path (e.g., \"/langs/group-hazel/python/npm/grammar.js\" -> \"/langs/group-hazel/python/npm\")\n return entry.local_js.substring(0, entry.local_js.lastIndexOf(\"/\"));\n }\n }\n\n // Production: derive from language name using precise version\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n return `${baseUrl}/@arborium/${language}@${version}`;\n}\n\ntype MaybePromise<T> = Promise<T> | T;\n\n// See https://github.com/wasm-bindgen/wasm-bindgen/blob/dda4821ee2fbcaa7adc58bc8c385ed8d3627a272/crates/cli-support/src/js/mod.rs#L860\n/** Source of the WASM module for wasm-bindgen */\ntype WbgInitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module;\n\n/** wasm-bindgen plugin module interface */\ninterface WasmBindgenPlugin {\n default: (\n module_or_path?: { module_or_path: MaybePromise<WbgInitInput> } | undefined\n // deprecated: | MaybePromise<WbgInitInput>,\n ) => Promise<void>;\n language_id: () => string;\n injection_languages: () => string[];\n create_session: () => number;\n free_session: (session: number) => void;\n set_text: (session: number, text: string) => void;\n parse: (session: number) => ParseResult;\n cancel: (session: number) => void;\n}\n\n/** A loaded grammar plugin */\ninterface GrammarPlugin {\n languageId: string;\n injectionLanguages: string[];\n module: WasmBindgenPlugin;\n parse: (text: string) => ParseResult;\n}\n\n/** Load a grammar plugin */\nasync function loadGrammarPlugin(language: string, config: Required<ArboriumConfig>): Promise<GrammarPlugin | null> {\n // Check cache\n const cached = grammarCache.get(language);\n if (cached) {\n console.debug(`[arborium] Grammar '${language}' found in cache`);\n return cached;\n }\n\n // Load local manifest if in dev mode\n await ensureLocalManifest(config);\n\n // Check if language is known\n if (\n !knownLanguages.has(language) &&\n !localManifest?.entries.some((e) => e.language === language)\n ) {\n console.debug(`[arborium] Grammar '${language}' not available`);\n return null;\n }\n\n try {\n const baseUrl = getGrammarBaseUrl(language, config);\n const detail = config.resolveJs === defaultConfig.resolveJs ? ` from ${baseUrl}/grammar.js` : \"\";\n console.debug(`[arborium] Loading grammar '${language}'${detail}`);\n\n const module = (await config.resolveJs({ language, baseUrl, path: \"grammar.js\" })) as WasmBindgenPlugin;\n const wasm = await config.resolveWasm({ language, baseUrl, path: \"grammar_bg.wasm\" });\n\n // Initialize the WASM module\n await module.default({ module_or_path: wasm });\n\n // Verify it loaded correctly\n const loadedId = module.language_id();\n if (loadedId !== language) {\n console.warn(`[arborium] Language ID mismatch: expected '${language}', got '${loadedId}'`);\n }\n\n // Get injection languages\n const injectionLanguages = module.injection_languages();\n\n // Wrap as GrammarPlugin with session-based parsing\n const plugin: GrammarPlugin = {\n languageId: language,\n injectionLanguages,\n module,\n parse: (text: string) => {\n const session = module.create_session();\n try {\n module.set_text(session, text);\n // wasm-bindgen returns ParseResult directly (or throws on error)\n const result = module.parse(session);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n console.error(`[arborium] Parse error:`, e);\n return { spans: [], injections: [] };\n } finally {\n module.free_session(session);\n }\n },\n };\n\n grammarCache.set(language, plugin);\n console.debug(`[arborium] Grammar '${language}' loaded successfully`);\n return plugin;\n } catch (e) {\n console.error(`[arborium] Failed to load grammar '${language}':`, e);\n return null;\n }\n}\n\n// Handle to plugin mapping for the host interface\nconst handleToPlugin = new Map<number, GrammarPlugin>();\nlet nextHandle = 1;\n\n/** Setup window.arboriumHost for the Rust host to call into */\nfunction setupHostInterface(config: Required<ArboriumConfig>): void {\n (window as any).arboriumHost = {\n /** Check if a language is available (sync) */\n isLanguageAvailable(language: string): boolean {\n return knownLanguages.has(language) || grammarCache.has(language);\n },\n\n /** Load a grammar and return a handle (async) */\n async loadGrammar(language: string): Promise<number> {\n const plugin = await loadGrammarPlugin(language, config);\n if (!plugin) return 0; // 0 = not found\n\n // Check if we already have a handle\n for (const [handle, p] of handleToPlugin) {\n if (p === plugin) return handle;\n }\n\n // Create new handle\n const handle = nextHandle++;\n handleToPlugin.set(handle, plugin);\n return handle;\n },\n\n /** Parse text using a grammar handle (sync) */\n parse(handle: number, text: string): ParseResult {\n const plugin = handleToPlugin.get(handle);\n if (!plugin) return { spans: [], injections: [] };\n return plugin.parse(text);\n },\n };\n}\n\n/** Get the host URL based on config */\nfunction getHostUrl(config: Required<ArboriumConfig>): string {\n if (config.hostUrl) {\n return config.hostUrl;\n }\n // Use CDN\n const cdn = config.cdn;\n const version = config.version;\n let baseUrl: string;\n if (cdn === \"jsdelivr\") {\n baseUrl = \"https://cdn.jsdelivr.net/npm\";\n } else if (cdn === \"unpkg\") {\n baseUrl = \"https://unpkg.com\";\n } else {\n baseUrl = cdn;\n }\n const versionSuffix = version === \"latest\" ? \"\" : `@${version}`;\n return `${baseUrl}/@arborium/arborium${versionSuffix}/dist`;\n}\n\n/** Load the Rust host module */\nasync function loadHost(config: Required<ArboriumConfig>): Promise<HostModule | null> {\n if (hostModule) return hostModule;\n if (hostLoadPromise) return hostLoadPromise;\n\n hostLoadPromise = (async () => {\n // Setup the interface the host imports\n setupHostInterface(config);\n\n const hostUrl = getHostUrl(config);\n const jsUrl = `${hostUrl}/arborium_host.js`;\n const wasmUrl = `${hostUrl}/arborium_host_bg.wasm`;\n\n console.debug(`[arborium] Loading host from ${jsUrl}`);\n try {\n const module = await import(/* @vite-ignore */ jsUrl);\n await module.default(wasmUrl);\n\n hostModule = {\n highlight: module.highlight,\n isLanguageAvailable: module.isLanguageAvailable,\n };\n console.debug(`[arborium] Host loaded successfully`);\n return hostModule;\n } catch (e) {\n console.error(\"[arborium] Failed to load host:\", e);\n return null;\n }\n })();\n\n return hostLoadPromise;\n}\n\n/** Highlight source code */\nexport async function highlight(\n language: string,\n source: string,\n configOverrides?: ArboriumConfig,\n): Promise<string> {\n const config = getConfig(configOverrides);\n // Try to use the Rust host (handles injections properly)\n const host = await loadHost(config);\n if (host) {\n try {\n return host.highlight(language, source);\n } catch (e) {\n console.warn(\"Host highlight failed, falling back to JS:\", e);\n }\n }\n\n // Fallback to JS-only highlighting (no injection support)\n const plugin = await loadGrammarPlugin(language, config);\n if (!plugin) {\n return escapeHtml(source);\n }\n\n const result = plugin.parse(source);\n return spansToHtml(source, result.spans);\n}\n\n/** Load a grammar for direct use */\nexport async function loadGrammar(\n language: string,\n configOverrides?: ArboriumConfig,\n): Promise<Grammar | null> {\n const config = getConfig(configOverrides);\n const plugin = await loadGrammarPlugin(language, config);\n if (!plugin) return null;\n\n const { module } = plugin;\n\n return {\n languageId: () => plugin.languageId,\n injectionLanguages: () => plugin.injectionLanguages,\n highlight: async (source: string) => {\n const result = plugin.parse(source);\n return spansToHtml(source, result.spans);\n },\n parse: (source: string) => plugin.parse(source),\n createSession: (): Session => {\n const handle = module.create_session();\n return {\n setText: (text: string) => module.set_text(handle, text),\n parse: () => {\n try {\n const result = module.parse(handle);\n return {\n spans: result.spans || [],\n injections: result.injections || [],\n };\n } catch (e) {\n console.error(`[arborium] Session parse error:`, e);\n return { spans: [], injections: [] };\n }\n },\n cancel: () => module.cancel(handle),\n free: () => module.free_session(handle),\n };\n },\n dispose: () => {\n // No-op for now, plugins are cached\n },\n };\n}\n\n/** Get current config, optionally merging with overrides */\nexport function getConfig(overrides?: Partial<ArboriumConfig>): Required<ArboriumConfig> {\n if (overrides) {\n return { ...globalConfig, ...overrides };\n }\n return { ...globalConfig };\n}\n\n/** Set/merge config */\nexport function setConfig(newConfig: Partial<ArboriumConfig>): void {\n globalConfig = { ...globalConfig, ...newConfig };\n}\n\n/** Check if a language is available */\nexport async function isLanguageAvailable(language: string, configOverrides?: ArboriumConfig): Promise<boolean> {\n const config = getConfig(configOverrides);\n await ensureLocalManifest(config);\n return (\n knownLanguages.has(language) ||\n (localManifest?.entries.some((e) => e.language === language) ?? false)\n );\n}\n\n/** Get list of available languages */\nexport async function getAvailableLanguages(configOverrides?: ArboriumConfig): Promise<string[]> {\n const config = getConfig(configOverrides);\n await ensureLocalManifest(config);\n // In dev mode, use local manifest if available\n if (localManifest) {\n return localManifest.entries.map((e) => e.language);\n }\n return Array.from(knownLanguages);\n}\n","/**\n * Simple language detection heuristics.\n * Not meant to be comprehensive - just catches common cases.\n */\n\n/** Shebang patterns */\nconst SHEBANG_PATTERNS: Array<[RegExp, string]> = [\n [/^#!.*\\bpython[23]?\\b/, 'python'],\n [/^#!.*\\bnode\\b/, 'javascript'],\n [/^#!.*\\bdeno\\b/, 'typescript'],\n [/^#!.*\\bbun\\b/, 'typescript'],\n [/^#!.*\\bruby\\b/, 'ruby'],\n [/^#!.*\\bperl\\b/, 'perl'],\n [/^#!.*\\bphp\\b/, 'php'],\n [/^#!.*\\bbash\\b/, 'bash'],\n [/^#!.*\\bzsh\\b/, 'zsh'],\n [/^#!.*\\bsh\\b/, 'bash'],\n [/^#!.*\\blua\\b/, 'lua'],\n [/^#!.*\\bawk\\b/, 'awk'],\n];\n\n/** Keyword fingerprints - first few unique keywords that identify a language */\nconst KEYWORD_FINGERPRINTS: Array<[RegExp, string]> = [\n // Rust - distinctive keywords\n [/\\b(fn|impl|trait|pub\\s+fn|let\\s+mut|&mut|->)\\b/, 'rust'],\n\n // Go - distinctive keywords\n [/\\b(func|package\\s+\\w+|import\\s+\\(|go\\s+func|chan\\s+\\w+)\\b/, 'go'],\n\n // Python - distinctive patterns\n [/\\b(def\\s+\\w+\\s*\\(|import\\s+\\w+|from\\s+\\w+\\s+import|class\\s+\\w+:)\\b/, 'python'],\n\n // TypeScript - distinctive type annotations\n [/:\\s*(string|number|boolean|void)\\b|\\binterface\\s+\\w+\\s*\\{/, 'typescript'],\n\n // JavaScript - distinctive patterns (after TS check)\n [/\\b(const|let|var)\\s+\\w+\\s*=|function\\s+\\w+\\s*\\(|=>\\s*\\{/, 'javascript'],\n\n // Ruby - distinctive keywords\n [/\\b(def\\s+\\w+|end\\b|do\\s*\\|.*\\||puts\\s+|require\\s+['\"])\\b/, 'ruby'],\n\n // Java - distinctive patterns\n [/\\b(public\\s+class|private\\s+\\w+|System\\.out\\.println)\\b/, 'java'],\n\n // C++ - distinctive patterns\n [/\\b(#include\\s*<|std::|template\\s*<|nullptr|cout\\s*<<)\\b/, 'cpp'],\n\n // C - distinctive patterns (after C++ check)\n [/\\b(#include\\s*[<\"]|printf\\s*\\(|int\\s+main\\s*\\(|void\\s+\\w+\\s*\\()\\b/, 'c'],\n\n // C# - distinctive patterns\n [/\\b(namespace\\s+\\w+|using\\s+System|public\\s+static\\s+void)\\b/, 'c-sharp'],\n\n // PHP - distinctive patterns\n [/<\\?php|\\$\\w+\\s*=/, 'php'],\n\n // Swift - distinctive patterns\n [/\\b(func\\s+\\w+|var\\s+\\w+:\\s*\\w+|let\\s+\\w+:\\s*\\w+|@objc)\\b/, 'swift'],\n\n // Kotlin - distinctive patterns\n [/\\b(fun\\s+\\w+|val\\s+\\w+|var\\s+\\w+:|data\\s+class)\\b/, 'kotlin'],\n\n // Scala - distinctive patterns\n [/\\b(def\\s+\\w+|val\\s+\\w+|var\\s+\\w+|object\\s+\\w+|case\\s+class)\\b/, 'scala'],\n\n // Haskell - distinctive patterns\n [/\\b(module\\s+\\w+|import\\s+qualified|data\\s+\\w+\\s*=|::\\s*\\w+\\s*->)\\b/, 'haskell'],\n\n // Elixir - distinctive patterns\n [/\\b(defmodule\\s+\\w+|def\\s+\\w+|defp\\s+\\w+|\\|>)\\b/, 'elixir'],\n\n // Lua - distinctive patterns\n [/\\b(local\\s+\\w+\\s*=|function\\s+\\w+\\.\\w+|require\\s*\\()\\b/, 'lua'],\n\n // SQL - distinctive patterns\n [/\\b(SELECT\\s+.*\\s+FROM|INSERT\\s+INTO|CREATE\\s+TABLE|ALTER\\s+TABLE)\\b/i, 'sql'],\n\n // Shell/Bash - distinctive patterns\n [/\\b(if\\s+\\[\\s*|then\\b|fi\\b|echo\\s+[\"']|export\\s+\\w+=)\\b/, 'bash'],\n\n // YAML - distinctive patterns\n [/^\\s*[\\w-]+:\\s*[\\w\\-\"'[{]|^---\\s*$/, 'yaml'],\n\n // JSON - distinctive patterns\n [/^\\s*\\{[\\s\\S]*\"[\\w-]+\":\\s*/, 'json'],\n\n // TOML - distinctive patterns\n [/^\\s*\\[[\\w.-]+\\]\\s*$|^\\s*\\w+\\s*=\\s*[\"'\\d\\[]/, 'toml'],\n\n // HTML - distinctive patterns\n [/<(!DOCTYPE|html|head|body|div|span|p|a\\s)/i, 'html'],\n\n // CSS - distinctive patterns\n [/^\\s*[\\w.#@][\\w\\s,#.:>+~-]*\\{[^}]*\\}|@media\\s|@import\\s/, 'css'],\n\n // Markdown - distinctive patterns\n [/^#{1,6}\\s+\\w|^\\s*[-*+]\\s+\\w|^\\s*\\d+\\.\\s+\\w|```\\w*\\n/, 'markdown'],\n\n // XML - distinctive patterns\n [/<\\?xml|<[\\w:-]+\\s+xmlns/, 'xml'],\n\n // Dockerfile\n [/^FROM\\s+\\w+|^RUN\\s+|^COPY\\s+|^ENTRYPOINT\\s+/m, 'dockerfile'],\n\n // Nginx config\n [/\\b(server\\s*\\{|location\\s+[\\/~]|proxy_pass\\s+)\\b/, 'nginx'],\n\n // Zig\n [/\\b(pub\\s+fn|const\\s+\\w+\\s*=|@import\\(|comptime)\\b/, 'zig'],\n];\n\n/**\n * Detect the language of a code snippet.\n * Returns null if detection fails.\n */\nexport function detectLanguage(source: string): string | null {\n // Check shebang first (most reliable)\n const firstLine = source.split('\\n')[0];\n for (const [pattern, language] of SHEBANG_PATTERNS) {\n if (pattern.test(firstLine)) {\n return language;\n }\n }\n\n // Check keyword fingerprints\n for (const [pattern, language] of KEYWORD_FINGERPRINTS) {\n if (pattern.test(source)) {\n return language;\n }\n }\n\n return null;\n}\n\n/**\n * Extract language from class name.\n * Supports multiple patterns:\n * - \"language-rust\" -> \"rust\" (standard)\n * - \"lang-rust\" -> \"rust\" (common alternative)\n * - \"rust\" -> \"rust\" (docs.rs style, bare language name)\n */\nexport function extractLanguageFromClass(className: string): string | null {\n // Try \"language-*\" pattern first (most specific)\n const langMatch = className.match(/\\blanguage-(\\w+)\\b/);\n if (langMatch) return langMatch[1];\n\n // Try \"lang-*\" pattern\n const shortMatch = className.match(/\\blang-(\\w+)\\b/);\n if (shortMatch) return shortMatch[1];\n\n // Try bare language names (for docs.rs compatibility)\n // Only match known language names to avoid false positives\n const knownLanguages = new Set([\n 'rust', 'javascript', 'typescript', 'python', 'ruby', 'go', 'java',\n 'c', 'cpp', 'csharp', 'php', 'swift', 'kotlin', 'scala', 'haskell',\n 'elixir', 'lua', 'sql', 'bash', 'shell', 'yaml', 'json', 'toml',\n 'html', 'css', 'xml', 'markdown', 'dockerfile', 'nginx', 'zig',\n 'text', 'plaintext', 'console', 'sh',\n ]);\n\n for (const cls of className.split(/\\s+/)) {\n if (knownLanguages.has(cls.toLowerCase())) {\n return cls.toLowerCase();\n }\n }\n\n return null;\n}\n\n/**\n * Normalize language identifier (handle aliases)\n */\nexport function normalizeLanguage(lang: string): string {\n const aliases: Record<string, string> = {\n js: 'javascript',\n ts: 'typescript',\n py: 'python',\n rb: 'ruby',\n rs: 'rust',\n sh: 'bash',\n shell: 'bash',\n yml: 'yaml',\n cs: 'c-sharp',\n csharp: 'c-sharp',\n 'c++': 'cpp',\n 'c#': 'c-sharp',\n 'f#': 'fsharp',\n dockerfile: 'dockerfile',\n docker: 'dockerfile',\n makefile: 'make',\n plaintext: 'text',\n plain: 'text',\n txt: 'text',\n };\n\n const lower = lang.toLowerCase();\n return aliases[lower] || lower;\n}\n"],"names":["pluginVersion","availableLanguages","highlights","spansToHtml","source","spans","sorted","a","b","html","pos","span","escapeHtml","tag","getTagForCapture","text","capture","defaultConfig","baseUrl","path","hostModule","hostLoadPromise","globalConfig","grammarCache","knownLanguages","localManifest","localManifestPromise","ensureLocalManifest","config","response","getGrammarBaseUrl","language","entry","e","cdn","version","loadGrammarPlugin","cached","detail","module","wasm","loadedId","injectionLanguages","plugin","session","result","handleToPlugin","nextHandle","setupHostInterface","handle","p","getHostUrl","versionSuffix","loadHost","hostUrl","jsUrl","wasmUrl","highlight","configOverrides","getConfig","host","loadGrammar","overrides","setConfig","newConfig","SHEBANG_PATTERNS","KEYWORD_FINGERPRINTS","detectLanguage","firstLine","pattern","extractLanguageFromClass","className","langMatch","shortMatch","cls","normalizeLanguage","lang","aliases","lower"],"mappings":"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"}
|
package/dist/arborium_host.js
CHANGED
|
@@ -144,12 +144,12 @@ if (!('encodeInto' in cachedTextEncoder)) {
|
|
|
144
144
|
|
|
145
145
|
let WASM_VECTOR_LEN = 0;
|
|
146
146
|
|
|
147
|
-
function
|
|
148
|
-
wasm.
|
|
147
|
+
function wasm_bindgen__convert__closures_____invoke__h17133a70d2650772(arg0, arg1, arg2) {
|
|
148
|
+
wasm.wasm_bindgen__convert__closures_____invoke__h17133a70d2650772(arg0, arg1, arg2);
|
|
149
149
|
}
|
|
150
150
|
|
|
151
|
-
function
|
|
152
|
-
wasm.
|
|
151
|
+
function wasm_bindgen__convert__closures_____invoke__h588df639fb927c33(arg0, arg1, arg2, arg3) {
|
|
152
|
+
wasm.wasm_bindgen__convert__closures_____invoke__h588df639fb927c33(arg0, arg1, arg2, arg3);
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
const HighlightConfigFinalization = (typeof FinalizationRegistry === 'undefined')
|
|
@@ -355,7 +355,7 @@ function __wbg_get_imports() {
|
|
|
355
355
|
const ret = Reflect.get(arg0, arg1);
|
|
356
356
|
return ret;
|
|
357
357
|
}, arguments) };
|
|
358
|
-
imports.wbg.
|
|
358
|
+
imports.wbg.__wbg_isLanguageAvailable_2bbe67ca6414a0b5 = function(arg0, arg1) {
|
|
359
359
|
const ret = arboriumHost.isLanguageAvailable(getStringFromWasm0(arg0, arg1));
|
|
360
360
|
return ret;
|
|
361
361
|
};
|
|
@@ -363,7 +363,7 @@ function __wbg_get_imports() {
|
|
|
363
363
|
const ret = arg0.length;
|
|
364
364
|
return ret;
|
|
365
365
|
};
|
|
366
|
-
imports.wbg.
|
|
366
|
+
imports.wbg.__wbg_loadGrammar_be3e1425a8fa7001 = function() { return handleError(function (arg0, arg1) {
|
|
367
367
|
const ret = arboriumHost.loadGrammar(getStringFromWasm0(arg0, arg1));
|
|
368
368
|
return ret;
|
|
369
369
|
}, arguments) };
|
|
@@ -374,7 +374,7 @@ function __wbg_get_imports() {
|
|
|
374
374
|
const a = state0.a;
|
|
375
375
|
state0.a = 0;
|
|
376
376
|
try {
|
|
377
|
-
return
|
|
377
|
+
return wasm_bindgen__convert__closures_____invoke__h588df639fb927c33(a, state0.b, arg0, arg1);
|
|
378
378
|
} finally {
|
|
379
379
|
state0.a = a;
|
|
380
380
|
}
|
|
@@ -389,7 +389,7 @@ function __wbg_get_imports() {
|
|
|
389
389
|
const ret = new Function(getStringFromWasm0(arg0, arg1));
|
|
390
390
|
return ret;
|
|
391
391
|
};
|
|
392
|
-
imports.wbg.
|
|
392
|
+
imports.wbg.__wbg_parse_b434d9d9603d69aa = function(arg0, arg1, arg2) {
|
|
393
393
|
const ret = arboriumHost.parse(arg0 >>> 0, getStringFromWasm0(arg1, arg2));
|
|
394
394
|
return ret;
|
|
395
395
|
};
|
|
@@ -435,7 +435,7 @@ function __wbg_get_imports() {
|
|
|
435
435
|
};
|
|
436
436
|
imports.wbg.__wbindgen_cast_3b1a32895b770b74 = function(arg0, arg1) {
|
|
437
437
|
// Cast intrinsic for `Closure(Closure { dtor_idx: 10, function: Function { arguments: [Externref], shim_idx: 11, ret: Unit, inner_ret: Some(Unit) }, mutable: true }) -> Externref`.
|
|
438
|
-
const ret = makeMutClosure(arg0, arg1, wasm.
|
|
438
|
+
const ret = makeMutClosure(arg0, arg1, wasm.wasm_bindgen__closure__destroy__h2d7e67c44b0e0938, wasm_bindgen__convert__closures_____invoke__h17133a70d2650772);
|
|
439
439
|
return ret;
|
|
440
440
|
};
|
|
441
441
|
imports.wbg.__wbindgen_init_externref_table = function() {
|
|
Binary file
|
package/dist/loader.d.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
import { ArboriumConfig, Grammar
|
|
1
|
+
import { ArboriumConfig, Grammar } from './types.js';
|
|
2
|
+
export { spansToHtml } from './utils.js';
|
|
2
3
|
export declare const defaultConfig: Required<ArboriumConfig>;
|
|
3
4
|
/** Highlight source code */
|
|
4
|
-
export declare function highlight(language: string, source: string,
|
|
5
|
+
export declare function highlight(language: string, source: string, configOverrides?: ArboriumConfig): Promise<string>;
|
|
5
6
|
/** Load a grammar for direct use */
|
|
6
|
-
export declare function loadGrammar(language: string,
|
|
7
|
-
/** Convert spans to HTML */
|
|
8
|
-
export declare function spansToHtml(source: string, spans: Span[]): string;
|
|
7
|
+
export declare function loadGrammar(language: string, configOverrides?: ArboriumConfig): Promise<Grammar | null>;
|
|
9
8
|
/** Get current config, optionally merging with overrides */
|
|
10
9
|
export declare function getConfig(overrides?: Partial<ArboriumConfig>): Required<ArboriumConfig>;
|
|
11
10
|
/** Set/merge config */
|
|
12
11
|
export declare function setConfig(newConfig: Partial<ArboriumConfig>): void;
|
|
13
12
|
/** Check if a language is available */
|
|
14
|
-
export declare function isLanguageAvailable(language: string): Promise<boolean>;
|
|
13
|
+
export declare function isLanguageAvailable(language: string, configOverrides?: ArboriumConfig): Promise<boolean>;
|
|
15
14
|
/** Get list of available languages */
|
|
16
|
-
export declare function getAvailableLanguages(): Promise<string[]>;
|
|
15
|
+
export declare function getAvailableLanguages(configOverrides?: ArboriumConfig): Promise<string[]>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
+
import { Highlight } from './types.js';
|
|
1
2
|
/** Version of plugin packages (all @arborium/* packages share this version) */
|
|
2
|
-
export declare const pluginVersion = "2.
|
|
3
|
+
export declare const pluginVersion = "2.6.0";
|
|
3
4
|
/** All available languages */
|
|
4
5
|
export declare const availableLanguages: string[];
|
|
6
|
+
/** All possible highlights and their short tags */
|
|
7
|
+
export declare const highlights: Highlight[];
|
package/dist/types.d.ts
CHANGED
|
@@ -1,13 +1,25 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* A span of highlighted text.
|
|
3
|
+
*
|
|
4
|
+
* The `start` and `end` fields are UTF-16 code unit indices, compatible with
|
|
5
|
+
* JavaScript string APIs like `String.prototype.slice()`, `substring()`, and
|
|
6
|
+
* DOM `Range`.
|
|
7
|
+
*/
|
|
2
8
|
export interface Span {
|
|
9
|
+
/** UTF-16 code unit index where the span starts (inclusive) */
|
|
3
10
|
start: number;
|
|
11
|
+
/** UTF-16 code unit index where the span ends (exclusive) */
|
|
4
12
|
end: number;
|
|
5
13
|
/** The capture name (e.g., "keyword", "string", "comment") */
|
|
6
14
|
capture: string;
|
|
7
15
|
}
|
|
8
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* A language injection (e.g., JS inside HTML).
|
|
18
|
+
*/
|
|
9
19
|
export interface Injection {
|
|
20
|
+
/** UTF-16 code unit index where the injection starts (inclusive) */
|
|
10
21
|
start: number;
|
|
22
|
+
/** UTF-16 code unit index where the injection ends (exclusive) */
|
|
11
23
|
end: number;
|
|
12
24
|
language: string;
|
|
13
25
|
includeChildren: boolean;
|
|
@@ -67,6 +79,24 @@ export interface Grammar {
|
|
|
67
79
|
/** Dispose of resources */
|
|
68
80
|
dispose(): void;
|
|
69
81
|
}
|
|
82
|
+
/** A highlighting tag */
|
|
83
|
+
export interface Highlight {
|
|
84
|
+
/** Long name, used in `Span` */
|
|
85
|
+
name: string;
|
|
86
|
+
/** Short name, used in HTML tags and CSS variables */
|
|
87
|
+
tag: string;
|
|
88
|
+
/** Parent tag for fallback */
|
|
89
|
+
parentTag?: string;
|
|
90
|
+
}
|
|
91
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
92
|
+
interface ResolveArgs {
|
|
93
|
+
/** Language to load the grammar plugin for */
|
|
94
|
+
language: string;
|
|
95
|
+
/** Base URL derived from language, CDN and version */
|
|
96
|
+
baseUrl: string;
|
|
97
|
+
/** Relative path in the module to load */
|
|
98
|
+
path: string;
|
|
99
|
+
}
|
|
70
100
|
/** Configuration for the arborium runtime */
|
|
71
101
|
export interface ArboriumConfig {
|
|
72
102
|
/** Disable auto-highlighting on page load */
|
|
@@ -83,6 +113,10 @@ export interface ArboriumConfig {
|
|
|
83
113
|
pluginsUrl?: string;
|
|
84
114
|
/** Base URL for the Rust host module (for local testing) */
|
|
85
115
|
hostUrl?: string;
|
|
116
|
+
/** Custom grammar resolution for JS */
|
|
117
|
+
resolveJs?(args: ResolveArgs): MaybePromise<unknown>;
|
|
118
|
+
/** Custom grammar resolution for WASM */
|
|
119
|
+
resolveWasm?(args: ResolveArgs): MaybePromise<Response | BufferSource | WebAssembly.Module>;
|
|
86
120
|
}
|
|
87
121
|
/** Global config set before script loads */
|
|
88
122
|
declare global {
|
|
@@ -90,3 +124,4 @@ declare global {
|
|
|
90
124
|
Arborium?: ArboriumConfig;
|
|
91
125
|
}
|
|
92
126
|
}
|
|
127
|
+
export {};
|
package/dist/utils.d.ts
ADDED
package/package.json
CHANGED
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
"devDependencies": {
|
|
8
8
|
"typescript": "^5.7.2",
|
|
9
9
|
"vite": "^7.2.6",
|
|
10
|
-
"vite-plugin-dts": "^4.5.0"
|
|
10
|
+
"vite-plugin-dts": "^4.5.0",
|
|
11
|
+
"vitest": "^4.0.16"
|
|
11
12
|
},
|
|
12
13
|
"exports": {
|
|
13
14
|
".": {
|
|
@@ -82,9 +83,11 @@
|
|
|
82
83
|
"gen:manifest": "cd ../.. && cargo xtask gen-manifest",
|
|
83
84
|
"prepublishOnly": "npm run gen:manifest && npm run build && test -f dist/arborium.iife.js || (echo 'ERROR: dist/arborium.iife.js missing!' && exit 1)",
|
|
84
85
|
"preview": "vite preview",
|
|
86
|
+
"test": "vitest run",
|
|
87
|
+
"test:watch": "vitest",
|
|
85
88
|
"typecheck": "tsc --noEmit"
|
|
86
89
|
},
|
|
87
90
|
"type": "module",
|
|
88
91
|
"types": "./dist/arborium.d.ts",
|
|
89
|
-
"version": "2.
|
|
92
|
+
"version": "2.6.0"
|
|
90
93
|
}
|