// ==UserScript== // @name AI Chat Sidebar // @namespace http://tampermonkey.net/ // @version 3.0 // @author You // @description AI对话侧边栏,支持多AI提供商配置 // @license MIT // @match *://*/* // @require https://cdn.jsdelivr.net/npm/marked@11.1.1/marked.min.js // @require https://cdn.jsdelivr.net/npm/highlight.js@11.9.0/build/highlight.min.js // @connect https://cdn.jsdelivr.net // @connect https://api.openai.com // @connect https://api.anthropic.com // @connect https://api.gemini.google.com // @connect * // @grant GM_addStyle // @grant GM_getValue // @grant GM_setValue // @grant GM_xmlhttpRequest // @downloadURL https://update.greasyfork.icu/scripts/556463/AI%20Chat%20Sidebar.user.js // @updateURL https://update.greasyfork.icu/scripts/556463/AI%20Chat%20Sidebar.meta.js // ==/UserScript== (l=>{if(typeof GM_addStyle=="function"){GM_addStyle(l);return}const e=document.createElement("style");e.textContent=l,document.head.append(e)})(` pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! Theme: GitHub Dark Description: Dark theme as seen on github.com Author: github.com Maintainer: @Hirse Updated: 2021-05-15 Outdated base version: https://github.com/primer/github-syntax-dark Current colors taken from GitHub's CSS */.hljs{color:#c9d1d9;background:#0d1117}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#ff7b72}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#d2a8ff}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#79c0ff}.hljs-regexp,.hljs-string,.hljs-meta .hljs-string{color:#a5d6ff}.hljs-built_in,.hljs-symbol{color:#ffa657}.hljs-comment,.hljs-code,.hljs-formula{color:#8b949e}.hljs-name,.hljs-quote,.hljs-selector-tag,.hljs-selector-pseudo{color:#7ee787}.hljs-subst{color:#c9d1d9}.hljs-section{color:#1f6feb;font-weight:700}.hljs-bullet{color:#f2cc60}.hljs-emphasis{color:#c9d1d9;font-style:italic}.hljs-strong{color:#c9d1d9;font-weight:700}.hljs-addition{color:#aff5b4;background-color:#033a16}.hljs-deletion{color:#ffdcd7;background-color:#67060c} `); (function () { 'use strict'; var __defProp = Object.defineProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var _a; var _GM_getValue = /* @__PURE__ */ (() => typeof GM_getValue != "undefined" ? GM_getValue : void 0)(); var _GM_setValue = /* @__PURE__ */ (() => typeof GM_setValue != "undefined" ? GM_setValue : void 0)(); var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)(); const ConfigManager = { get: (key, defaultValue) => _GM_getValue(key, defaultValue), set: (key, value) => _GM_setValue(key, value), getProviders: () => _GM_getValue("ai_providers", []), saveProviders: (providers) => _GM_setValue("ai_providers", providers), getPrompts: () => { let prompts = _GM_getValue("prompts", []); let hasChanges = false; prompts = prompts.map((p) => { if (!p.type) { p.type = "chat"; hasChanges = true; } return p; }); const hasTranslate = prompts.some((p) => p.type === "translate"); if (!hasTranslate) { prompts.push({ title: "通用翻译", content: "Translate the following text. Be accurate and natural.", type: "translate" }); hasChanges = true; } if (hasChanges) { _GM_setValue("prompts", prompts); } return prompts; }, savePrompts: (prompts) => _GM_setValue("prompts", prompts), getModels: (providerIndex) => _GM_getValue(`models_${providerIndex}`, []), saveModels: (providerIndex, models) => _GM_setValue(`models_${providerIndex}`, models), getAvailableModels: (providerIndex) => _GM_getValue(`available_models_${providerIndex}`, []), saveAvailableModels: (providerIndex, models) => _GM_setValue(`available_models_${providerIndex}`, models), getConversations: () => _GM_getValue("conversations", []), saveConversations: (conversations) => _GM_setValue("conversations", conversations), getTheme: () => _GM_getValue("theme", "default"), saveTheme: (theme) => _GM_setValue("theme", theme), getSystemConfig: () => _GM_getValue("system_config", { defaultModel: null, defaultPrompt: null, defaultTranslatePrompt: null }), saveSystemConfig: (config) => _GM_setValue("system_config", config), getTriggerPosition: () => _GM_getValue("trigger_position", null), saveTriggerPosition: (pos) => _GM_setValue("trigger_position", pos), getSidebarOpen: () => _GM_getValue("sidebar_open", false), saveSidebarOpen: (isOpen) => _GM_setValue("sidebar_open", isOpen), getSidebarStyle: () => _GM_getValue("sidebar_style", null), saveSidebarStyle: (style) => _GM_setValue("sidebar_style", style) }; const THEMES = { default: { name: "默认极光", colors: { primary: "#667eea", primaryGradient: "linear-gradient(135deg, #667eea 0%, #764ba2 100%)", bg: "#ffffff", bgSecondary: "#f8f9fa", text: "#333333", textSecondary: "#666666", border: "#e1e4e8", hover: "#f1f3f5", userMsgBg: "#667eea", userMsgText: "#ffffff", aiMsgBg: "#f1f3f5", aiMsgText: "#333333", shadow: "rgba(0,0,0,0.1)" }, styles: { borderRadius: "4px", btnRadius: "4px", fontFamily: "inherit", borderWidth: "1px", shadowLg: "-2px 0 8px rgba(0,0,0,0.1)", spacing: "15px", fontSize: "14px", fontWeight: "400", headerHeight: "auto", transition: "all 0.2s ease" } }, notion: { name: "Notion风格", colors: { primary: "#333333", primaryGradient: "#ffffff", bg: "#ffffff", bgSecondary: "#f7f7f5", text: "#37352f", textSecondary: "rgba(55, 53, 47, 0.65)", border: "#e9e9e8", hover: "rgba(55, 53, 47, 0.08)", userMsgBg: "transparent", // Notion style: minimal background userMsgText: "#37352f", aiMsgBg: "transparent", aiMsgText: "#37352f", shadow: "rgba(15, 15, 15, 0.05)" }, styles: { borderRadius: "3px", btnRadius: "3px", fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, "Apple Color Emoji", Arial, sans-serif', borderWidth: "1px", shadowLg: "0 0 0 1px rgba(15,15,15,0.02), 0 3px 6px rgba(15,15,15,0.04)", spacing: "12px", fontSize: "14px", fontWeight: "400", headerHeight: "45px", transition: "background 0.1s ease" } }, youtube: { name: "YouTube风格", colors: { primary: "#ff0000", primaryGradient: "#ffffff", bg: "#ffffff", bgSecondary: "#f2f2f2", text: "#0f0f0f", textSecondary: "#606060", border: "transparent", // Flat design hover: "#e5e5e5", userMsgBg: "#f2f2f2", userMsgText: "#0f0f0f", aiMsgBg: "#ffffff", aiMsgText: "#0f0f0f", shadow: "rgba(0,0,0,0.1)" }, styles: { borderRadius: "12px", btnRadius: "18px", // Pill shape fontFamily: "Roboto, Arial, sans-serif", borderWidth: "0px", shadowLg: "0 4px 12px rgba(0,0,0,0.08)", spacing: "16px", fontSize: "14px", fontWeight: "400", headerHeight: "56px", transition: "background 0.2s cubic-bezier(0.2, 0, 0, 1)" } }, github: { name: "GitHub风格", colors: { primary: "#2da44e", primaryGradient: "#2da44e", bg: "#ffffff", bgSecondary: "#f6f8fa", text: "#24292f", textSecondary: "#57606a", border: "#d0d7de", hover: "#f3f4f6", userMsgBg: "#ddf4ff", userMsgText: "#24292f", aiMsgBg: "#f6f8fa", aiMsgText: "#24292f", shadow: "rgba(140,149,159,0.2)" }, styles: { borderRadius: "6px", btnRadius: "6px", fontFamily: '-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif', borderWidth: "1px", shadowLg: "0 8px 24px rgba(140,149,159,0.2)", spacing: "16px", fontSize: "14px", fontWeight: "400", headerHeight: "60px", transition: "all 0.2s cubic-bezier(0.3, 0, 0.5, 1)" } }, discord: { name: "Discord风格", colors: { primary: "#5865F2", primaryGradient: "#313338", bg: "#313338", bgSecondary: "#2b2d31", text: "#dbdee1", textSecondary: "#949ba4", border: "#1e1f22", hover: "#3f4147", userMsgBg: "#5865F2", userMsgText: "#ffffff", aiMsgBg: "#2b2d31", aiMsgText: "#dbdee1", shadow: "rgba(0,0,0,0.2)" }, styles: { borderRadius: "8px", btnRadius: "4px", fontFamily: '"gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif', borderWidth: "0px", shadowLg: "0 0 10px rgba(0,0,0,0.5)", spacing: "16px", fontSize: "15px", fontWeight: "500", headerHeight: "48px", transition: "background 0.15s ease-out" } }, apple: { name: "Apple风格", colors: { primary: "#0071e3", primaryGradient: "rgba(255, 255, 255, 0.72)", // Glassmorphism bg: "rgba(255, 255, 255, 0.72)", bgSecondary: "rgba(245, 245, 247, 0.5)", text: "#1d1d1f", textSecondary: "#86868b", border: "rgba(0,0,0,0.05)", hover: "rgba(0,0,0,0.03)", userMsgBg: "#0071e3", userMsgText: "#ffffff", aiMsgBg: "rgba(255,255,255,0.5)", aiMsgText: "#1d1d1f", shadow: "rgba(0,0,0,0.1)" }, styles: { borderRadius: "12px", btnRadius: "980px", // Fully rounded fontFamily: '-apple-system, BlinkMacSystemFont, "SF Pro Text", "Helvetica Neue", sans-serif', borderWidth: "1px", shadowLg: "0 20px 40px rgba(0,0,0,0.1)", backdropFilter: "saturate(180%) blur(20px)", spacing: "18px", fontSize: "15px", fontWeight: "400", headerHeight: "52px", transition: "all 0.3s cubic-bezier(0.25, 0.1, 0.25, 1)" } } }; let ttPolicy; if (window.trustedTypes && window.trustedTypes.createPolicy) { try { ttPolicy = window.trustedTypes.createPolicy("ai-chat-sidebar-policy", { createHTML: (string) => string }); } catch (e) { console.warn("Failed to create Trusted Types policy:", e); } } const safeInnerHTML = (element, html, fallbackText) => { if (!element) return; try { if (ttPolicy) { element.innerHTML = ttPolicy.createHTML(html); } else { element.innerHTML = html; } } catch (e) { console.warn("innerHTML assignment failed:", e); element.textContent = fallbackText !== void 0 ? fallbackText : html; } }; const applyTheme = (themeName) => { const theme = THEMES[themeName] || THEMES.default; const sidebar = document.getElementById("tm-ai-chat-sidebar"); if (!sidebar) return; const setVar = (name, value) => { sidebar.style.setProperty(`--ai-${name}`, value); }; Object.entries(theme.colors).forEach(([key, value]) => { setVar(key, value); }); const defaultStyles = THEMES.default.styles; const styles = { ...defaultStyles, ...theme.styles || {} }; Object.entries(styles).forEach(([key, value]) => { setVar(key, value); }); if (styles.backdropFilter) { sidebar.style.backdropFilter = styles.backdropFilter; sidebar.style.webkitBackdropFilter = styles.backdropFilter; } else { sidebar.style.backdropFilter = "none"; sidebar.style.webkitBackdropFilter = "none"; } const header = sidebar.querySelector(".tm-sidebar-header"); if (header) { if (themeName === "notion" || themeName === "youtube" || themeName === "apple") { header.style.color = "#333"; header.style.borderBottom = `1px solid ${theme.colors.border}`; header.querySelectorAll("button").forEach((btn) => { if (!btn.classList.contains("tm-close-btn")) { btn.style.color = "#333"; btn.style.background = "rgba(0,0,0,0.05)"; } }); const closeBtn = header.querySelector(".tm-close-btn"); if (closeBtn) closeBtn.style.color = "#333"; } else { header.style.color = "white"; header.style.borderBottom = "none"; header.querySelectorAll("button").forEach((btn) => { if (!btn.classList.contains("tm-close-btn")) { btn.style.color = "white"; btn.style.background = "rgba(255,255,255,0.2)"; } }); const closeBtn = header.querySelector(".tm-close-btn"); if (closeBtn) closeBtn.style.color = "white"; } } ConfigManager.saveTheme(themeName); }; const createSidebar = () => { const sidebar = document.createElement("div"); sidebar.id = "tm-ai-chat-sidebar"; ["left", "right", "top", "bottom"].forEach((pos) => { const handle = document.createElement("div"); handle.className = `tm-resize-handle-${pos}`; sidebar.appendChild(handle); }); ["tl", "tr", "bl", "br"].forEach((pos) => { const handle = document.createElement("div"); handle.className = `tm-resize-handle-corner-${pos}`; sidebar.appendChild(handle); }); const header = document.createElement("div"); header.className = "tm-sidebar-header"; const tabs = document.createElement("div"); tabs.className = "tm-tabs"; tabs.id = "tm-tabs-container"; ["chat", "translate", "providers", "prompts", "system"].forEach((tab, i) => { const btn = document.createElement("button"); btn.className = i === 0 ? "tm-tab tm-active" : "tm-tab"; btn.dataset.tab = tab; btn.textContent = tab === "chat" ? "对话" : tab === "translate" ? "翻译" : tab === "providers" ? "AI提供商" : tab === "prompts" ? "提示词库" : "系统配置"; tabs.appendChild(btn); }); const controls = document.createElement("div"); controls.className = "tm-header-controls"; const themeBtn = document.createElement("button"); themeBtn.className = "tm-theme-btn"; themeBtn.textContent = "🎨"; themeBtn.title = "切换主题"; const themeDropdown = document.createElement("div"); themeDropdown.className = "tm-theme-dropdown"; Object.entries(THEMES).forEach(([key, theme]) => { const item = document.createElement("div"); item.className = "tm-theme-item"; item.dataset.theme = key; item.innerHTML = ` ${theme.name} `; themeDropdown.appendChild(item); }); const closeBtn = document.createElement("button"); closeBtn.className = "tm-close-btn"; closeBtn.textContent = "×"; controls.appendChild(themeBtn); controls.appendChild(themeDropdown); controls.appendChild(closeBtn); header.appendChild(tabs); header.appendChild(controls); sidebar.appendChild(header); const content = document.createElement("div"); content.className = "tm-sidebar-content"; const chatTab = document.createElement("div"); chatTab.className = "tm-tab-content tm-active"; chatTab.id = "tm-chat-tab"; const chatContainer = document.createElement("div"); chatContainer.className = "tm-chat-container"; const conversationsSidebar = document.createElement("div"); conversationsSidebar.className = "tm-conversations-sidebar"; conversationsSidebar.id = "tm-conversations-sidebar"; const conversationsToolbar = document.createElement("div"); conversationsToolbar.className = "tm-conversations-toolbar"; const batchDeleteConversationBtn = document.createElement("button"); batchDeleteConversationBtn.id = "tm-batch-delete-conversation-btn"; batchDeleteConversationBtn.textContent = "批量删除"; const newConversationBtn = document.createElement("button"); newConversationBtn.id = "tm-new-conversation-btn-toolbar"; newConversationBtn.textContent = "新建对话"; conversationsToolbar.appendChild(batchDeleteConversationBtn); conversationsToolbar.appendChild(newConversationBtn); conversationsSidebar.appendChild(conversationsToolbar); const chatMain = document.createElement("div"); chatMain.className = "tm-chat-main"; const modelSelector = document.createElement("div"); modelSelector.className = "tm-model-selector"; const modelBtn = document.createElement("button"); modelBtn.id = "tm-model-display-btn"; const modelName = document.createElement("span"); modelName.id = "tm-model-name"; modelName.textContent = "选择模型"; const arrow = document.createElement("span"); arrow.className = "tm-arrow"; arrow.textContent = "▼"; modelBtn.appendChild(modelName); modelBtn.appendChild(arrow); const modelDropdown = document.createElement("div"); modelDropdown.id = "tm-model-dropdown"; modelDropdown.className = "tm-model-dropdown"; modelDropdown.style.display = "none"; modelSelector.appendChild(modelBtn); modelSelector.appendChild(modelDropdown); const messages = document.createElement("div"); messages.className = "tm-messages"; messages.id = "tm-messages"; const inputArea = document.createElement("div"); inputArea.className = "tm-input-area"; const inputWrapper = document.createElement("div"); inputWrapper.className = "tm-input-wrapper"; const btnContainer = document.createElement("div"); btnContainer.style.display = "flex"; btnContainer.style.gap = "5px"; const newChatBtn = document.createElement("button"); newChatBtn.id = "tm-new-chat-btn"; newChatBtn.className = "tm-prompt-icon-top"; newChatBtn.title = "新建对话"; newChatBtn.textContent = "➕"; const promptBtn = document.createElement("button"); promptBtn.id = "tm-prompt-selector-btn"; promptBtn.className = "tm-prompt-icon-top"; promptBtn.title = "选择提示词"; promptBtn.textContent = "💡"; const paramsBtn = document.createElement("button"); paramsBtn.id = "tm-params-selector-btn"; paramsBtn.className = "tm-prompt-icon-top"; paramsBtn.title = "模型参数"; paramsBtn.textContent = "⚙️"; const clearBtn = document.createElement("button"); clearBtn.id = "tm-clear-chat-btn"; clearBtn.className = "tm-prompt-icon-top"; clearBtn.title = "清除对话"; clearBtn.textContent = "🗑️"; const summarizeBtn = document.createElement("button"); summarizeBtn.id = "tm-summarize-page-btn"; summarizeBtn.className = "tm-prompt-icon-top"; summarizeBtn.title = "总结网页"; summarizeBtn.textContent = "📄"; const qaBtn = document.createElement("button"); qaBtn.id = "tm-qa-page-btn"; qaBtn.className = "tm-prompt-icon-top"; qaBtn.title = "问答网页"; qaBtn.textContent = "❓"; btnContainer.appendChild(newChatBtn); btnContainer.appendChild(promptBtn); btnContainer.appendChild(paramsBtn); btnContainer.appendChild(clearBtn); btnContainer.appendChild(summarizeBtn); btnContainer.appendChild(qaBtn); const textarea = document.createElement("textarea"); textarea.id = "tm-user-input"; textarea.placeholder = "输入消息..."; inputWrapper.appendChild(btnContainer); inputWrapper.appendChild(textarea); const sendBtn = document.createElement("button"); sendBtn.id = "tm-send-btn"; sendBtn.textContent = "发送"; const promptDropdown = document.createElement("div"); promptDropdown.id = "tm-prompt-dropdown"; promptDropdown.className = "tm-prompt-dropdown"; promptDropdown.style.display = "none"; const paramsPanel = document.createElement("div"); paramsPanel.id = "tm-params-panel"; paramsPanel.className = "tm-params-panel"; paramsPanel.style.display = "none"; const tempItem = document.createElement("div"); tempItem.className = "tm-params-item"; const tempLabel = document.createElement("label"); tempLabel.textContent = "温度 (Temperature):"; const tempInput = document.createElement("input"); tempInput.type = "number"; tempInput.id = "tm-param-temperature"; tempInput.min = "0"; tempInput.max = "2"; tempInput.step = "0.1"; tempInput.value = "0.7"; tempItem.appendChild(tempLabel); tempItem.appendChild(tempInput); const tokensItem = document.createElement("div"); tokensItem.className = "tm-params-item"; const tokensLabel = document.createElement("label"); tokensLabel.textContent = "最大上下文 (Max Tokens):"; const tokensInput = document.createElement("input"); tokensInput.type = "number"; tokensInput.id = "tm-param-max-tokens"; tokensInput.min = "1"; tokensInput.step = "1"; tokensInput.value = "2048"; tokensItem.appendChild(tokensLabel); tokensItem.appendChild(tokensInput); const memoryItem = document.createElement("div"); memoryItem.className = "tm-params-item"; const memoryLabel = document.createElement("label"); memoryLabel.textContent = "记忆轮数:"; const memoryInput = document.createElement("input"); memoryInput.type = "number"; memoryInput.id = "tm-param-memory-rounds"; memoryInput.min = "0"; memoryInput.step = "1"; memoryInput.value = "15"; memoryInput.title = "设置为0表示不限制"; memoryItem.appendChild(memoryLabel); memoryItem.appendChild(memoryInput); paramsPanel.appendChild(tempItem); paramsPanel.appendChild(tokensItem); paramsPanel.appendChild(memoryItem); inputArea.appendChild(inputWrapper); inputArea.appendChild(sendBtn); inputArea.appendChild(promptDropdown); inputArea.appendChild(paramsPanel); const modeIndicator = document.createElement("div"); modeIndicator.id = "tm-mode-indicator"; modeIndicator.className = "tm-mode-indicator"; modeIndicator.style.display = "none"; inputArea.appendChild(modeIndicator); chatMain.appendChild(modelSelector); chatMain.appendChild(messages); chatMain.appendChild(inputArea); chatContainer.appendChild(conversationsSidebar); chatContainer.appendChild(chatMain); chatTab.appendChild(chatContainer); const providersTab = document.createElement("div"); providersTab.className = "tm-tab-content"; providersTab.id = "tm-providers-tab"; const providersContainer = document.createElement("div"); providersContainer.className = "tm-providers-container"; const providersSidebar = document.createElement("div"); providersSidebar.className = "tm-providers-sidebar"; const addProviderBtn = document.createElement("button"); addProviderBtn.id = "tm-add-provider-btn"; addProviderBtn.textContent = "+ 添加供应商"; const providersList = document.createElement("div"); providersList.className = "tm-providers-list"; providersList.id = "tm-providers-sidebar-list"; providersSidebar.appendChild(addProviderBtn); providersSidebar.appendChild(providersList); const providerDetail = document.createElement("div"); providerDetail.className = "tm-provider-detail"; providerDetail.id = "tm-provider-detail"; const emptyState = document.createElement("div"); emptyState.className = "tm-empty-state"; emptyState.textContent = "请选择或添加一个供应商"; providerDetail.appendChild(emptyState); providersContainer.appendChild(providersSidebar); providersContainer.appendChild(providerDetail); providersTab.appendChild(providersContainer); const promptsTab = document.createElement("div"); promptsTab.className = "tm-tab-content"; promptsTab.id = "tm-prompts-tab"; const promptsToolbar = document.createElement("div"); promptsToolbar.className = "tm-prompts-toolbar"; const addPromptBtn = document.createElement("button"); addPromptBtn.id = "tm-add-prompt"; addPromptBtn.textContent = "+ 新增"; const batchDeleteBtn = document.createElement("button"); batchDeleteBtn.id = "tm-batch-delete-prompt"; batchDeleteBtn.textContent = "批量删除"; promptsToolbar.appendChild(addPromptBtn); promptsToolbar.appendChild(batchDeleteBtn); const promptsContainer = document.createElement("div"); promptsContainer.className = "tm-prompts-list"; promptsContainer.id = "tm-prompts-container"; const chatHeader = document.createElement("h4"); chatHeader.textContent = "对话提示词"; chatHeader.style.margin = "0 0 10px 0"; chatHeader.style.color = "var(--ai-text, #333)"; const chatList = document.createElement("div"); chatList.id = "tm-chat-prompts-list"; const translateHeader = document.createElement("h4"); translateHeader.innerHTML = ` 翻译提示词 ? `; translateHeader.style.margin = "20px 0 10px 0"; translateHeader.style.color = "var(--ai-text, #333)"; const translateList = document.createElement("div"); translateList.id = "tm-translate-prompts-list"; promptsContainer.appendChild(chatHeader); promptsContainer.appendChild(chatList); promptsContainer.appendChild(translateHeader); promptsContainer.appendChild(translateList); promptsTab.appendChild(promptsToolbar); promptsTab.appendChild(promptsContainer); const systemTab = document.createElement("div"); systemTab.className = "tm-tab-content"; systemTab.id = "tm-system-tab"; const systemContainer = document.createElement("div"); systemContainer.className = "tm-system-config-container"; systemContainer.innerHTML = `

系统配置

新建对话默认设置

`; systemTab.appendChild(systemContainer); const translateTab = document.createElement("div"); translateTab.className = "tm-tab-content"; translateTab.id = "tm-translate-tab"; const translateContainer = document.createElement("div"); translateContainer.className = "tm-translate-container"; translateContainer.innerHTML = `
⚙️ 翻译设置
🤖
🎨
未选择模型 | 默认风格
⌨️ 输入文本
🗑️
📋
0/5000
📄 翻译结果
📋
0 字符
`; translateTab.appendChild(translateContainer); content.appendChild(chatTab); content.appendChild(translateTab); content.appendChild(providersTab); content.appendChild(promptsTab); content.appendChild(systemTab); sidebar.appendChild(content); document.body.appendChild(sidebar); const helpModal = document.createElement("div"); helpModal.id = "tm-prompt-help-modal"; helpModal.className = "tm-prompt-help-modal"; helpModal.style.display = "none"; helpModal.innerHTML = `
×

翻译提示词可用变量

您可以在翻译提示词中使用以下变量,系统会在翻译时自动替换它们:

示例:

请将以下内容从 {{原语言}} 翻译成 {{目标语言}},请注意保持专业的语气:

{{输入内容}}
`; sidebar.appendChild(helpModal); return sidebar; }; const createTriggerButton = () => { const btn = document.createElement("button"); btn.id = "tm-ai-chat-trigger"; btn.textContent = "💬"; btn.title = "AI对话"; const pos = ConfigManager.getTriggerPosition(); if (pos) { btn.style.left = pos.left; btn.style.top = pos.top; btn.style.right = "auto"; btn.style.bottom = "auto"; } document.body.appendChild(btn); return btn; }; const addStyles = () => { const highlightStyle = document.createElement("link"); highlightStyle.rel = "stylesheet"; highlightStyle.href = "https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/styles/github-dark.min.css"; document.head.appendChild(highlightStyle); const style = document.createElement("style"); style.textContent = ` #tm-ai-chat-trigger { position: fixed; right: 20px; bottom: 20px; width: 60px; height: 60px; border-radius: 50%; background: var(--ai-primaryGradient, linear-gradient(135deg, #667eea 0%, #764ba2 100%)); border: none; color: white; font-size: 28px; cursor: pointer; box-shadow: 0 4px 12px rgba(0,0,0,0.15); z-index: 9998; transition: transform 0.2s; } #tm-ai-chat-trigger:hover { transform: scale(1.1); } #tm-ai-chat-sidebar { position: fixed; top: 0; right: 0; width: 400px; height: 100vh; background: var(--ai-bg, white); color: var(--ai-text, #333); box-shadow: var(--ai-shadowLg, -2px 0 8px rgba(0,0,0,0.1)); z-index: 9999; display: none; flex-direction: column; border-radius: 0; font-family: var(--ai-fontFamily, inherit); } #tm-ai-chat-sidebar.tm-open { display: flex; } #tm-ai-chat-sidebar.tm-resizing, #tm-ai-chat-sidebar.tm-dragging { transition: none; } .tm-resize-handle-left, .tm-resize-handle-right { position: absolute; top: 0; width: 5px; height: 100%; cursor: ew-resize; z-index: 10; } .tm-resize-handle-left { left: 0; } .tm-resize-handle-right { right: 0; } .tm-resize-handle-top, .tm-resize-handle-bottom { position: absolute; left: 0; width: 100%; height: 5px; cursor: ns-resize; z-index: 10; } .tm-resize-handle-top { top: 0; } .tm-resize-handle-bottom { bottom: 0; } .tm-resize-handle-corner-tl, .tm-resize-handle-corner-tr, .tm-resize-handle-corner-bl, .tm-resize-handle-corner-br { position: absolute; width: 10px; height: 10px; z-index: 11; } .tm-resize-handle-corner-tl { top: 0; left: 0; cursor: nwse-resize; } .tm-resize-handle-corner-tr { top: 0; right: 0; cursor: nesw-resize; } .tm-resize-handle-corner-bl { bottom: 0; left: 0; cursor: nesw-resize; } .tm-resize-handle-corner-br { bottom: 0; right: 0; cursor: nwse-resize; } .tm-sidebar-header { padding: 0 var(--ai-spacing, 15px); height: var(--ai-headerHeight, auto); min-height: 50px; background: var(--ai-primaryGradient, linear-gradient(135deg, #667eea 0%, #764ba2 100%)); color: white; display: flex; gap: 10px; align-items: center; cursor: move; user-select: none; flex-wrap: wrap; font-weight: 600; transition: var(--ai-transition, all 0.2s ease); } .tm-header-controls { display: flex; align-items: center; gap: 8px; margin-left: auto; position: relative; } .tm-theme-btn { background: rgba(255,255,255,0.2); border: none; color: white; width: 28px; height: 28px; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 14px; transition: background 0.2s; } .tm-theme-btn:hover { background: rgba(255,255,255,0.3); } .tm-theme-dropdown { position: absolute; top: 100%; right: 0; margin-top: 8px; background: var(--ai-bg, white); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); box-shadow: var(--ai-shadowLg, 0 2px 8px rgba(0,0,0,0.1)); padding: 5px; display: none; z-index: 1000; min-width: 150px; } .tm-theme-dropdown.tm-show { display: block; } .tm-theme-item { padding: 8px 12px; cursor: pointer; display: flex; align-items: center; gap: 8px; border-radius: var(--ai-borderRadius, 4px); color: var(--ai-text, #333); font-size: 13px; } .tm-theme-item:hover { background: var(--ai-hover, #f5f5f5); } .tm-theme-preview { width: 16px; height: 16px; border-radius: 50%; border: 1px solid rgba(0,0,0,0.1); } .tm-tabs { display: flex; gap: 10px; flex-wrap: wrap; flex: 1; } .tm-tab { background: transparent; border: none; color: inherit; padding: 8px 12px; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; transition: var(--ai-transition, all 0.2s ease); font-family: inherit; font-size: var(--ai-fontSize, 14px); font-weight: 500; opacity: 0.8; } .tm-tab:hover { opacity: 1; background: rgba(255,255,255,0.1); } .tm-tab.tm-active { opacity: 1; background: rgba(255,255,255,0.2); font-weight: 600; } .tm-close-btn { background: none; border: none; color: white; font-size: 28px; cursor: pointer; line-height: 1; padding: 0 5px; } .tm-sidebar-content { flex: 1; overflow: hidden; display: flex; flex-direction: column; background: var(--ai-bg, white); } .tm-tab-content { display: none; flex: 1; flex-direction: column; overflow: hidden; } .tm-tab-content.tm-active { display: flex; } .tm-messages { flex: 1; overflow-y: auto; padding: 15px; display: flex; flex-direction: column; background: var(--ai-bg, white); } .tm-message { margin-bottom: 25px; padding: 10px; border-radius: var(--ai-borderRadius, 8px); max-width: 80%; width: fit-content; text-align: left; position: relative; color: var(--ai-text, #333); border: var(--ai-borderWidth, 1px) solid transparent; } .tm-message.tm-user { background: var(--ai-userMsgBg, #667eea); color: var(--ai-userMsgText, white); align-self: flex-end; border-color: transparent; } .tm-message.tm-ai { background: var(--ai-aiMsgBg, #f0f0f0); color: var(--ai-aiMsgText, #333); align-self: flex-start; border-color: var(--ai-border, #ddd); } .tm-message:hover .tm-message-actions { opacity: 1; } .tm-message.tm-user { background: var(--ai-userMsgBg, #667eea); color: var(--ai-userMsgText, white); align-self: flex-end; } .tm-message.tm-ai { background: var(--ai-aiMsgBg, #f0f0f0); color: var(--ai-aiMsgText, #333); align-self: flex-start; } .tm-message-actions { opacity: 0; position: absolute; bottom: -20px; display: flex; gap: 5px; transition: opacity 0.2s; } .tm-message.tm-user .tm-message-actions { right: 0; } .tm-message.tm-ai .tm-message-actions { left: 0; } .tm-message-action-btn { background: var(--ai-bg, rgba(255,255,255,0.95)); border: 1px solid var(--ai-border, #ddd); cursor: pointer; font-size: 12px; padding: 4px 8px; border-radius: var(--ai-btnRadius, 3px); transition: var(--ai-transition, all 0.2s ease); color: var(--ai-textSecondary, #666); display: flex; align-items: center; justify-content: center; } .tm-message-action-btn:hover { background: var(--ai-hover, #f5f5f5); color: var(--ai-primary, #667eea); transform: scale(1.05); } #tm-ai-chat-sidebar .tm-message pre { background: #282c34; padding: 12px; border-radius: var(--ai-borderRadius, 6px); overflow-x: auto; margin: 8px 0; } #tm-ai-chat-sidebar .tm-message code { font-family: 'Consolas', 'Monaco', 'Courier New', monospace; font-size: 13px; } #tm-ai-chat-sidebar .tm-message pre code { background: none; padding: 0; } #tm-ai-chat-sidebar .tm-message:not(pre) > code { background: var(--ai-hover, rgba(0,0,0,0.1)); padding: 2px 6px; border-radius: var(--ai-btnRadius, 3px); } #tm-ai-chat-sidebar .tm-message p { margin: 8px 0; } #tm-ai-chat-sidebar .tm-message p:first-child { margin-top: 0; } #tm-ai-chat-sidebar .tm-message p:last-child { margin-bottom: 0; } #tm-ai-chat-sidebar .tm-message ul, #tm-ai-chat-sidebar .tm-message ol { margin: 8px 0; padding-left: 24px; } #tm-ai-chat-sidebar .tm-message blockquote { border-left: 3px solid var(--ai-primary, #667eea); padding-left: 12px; margin: 8px 0; color: var(--ai-textSecondary, #666); } #tm-ai-chat-sidebar .tm-message table { border-collapse: collapse; margin: 8px 0; width: 100%; } #tm-ai-chat-sidebar .tm-message th, #tm-ai-chat-sidebar .tm-message td { border: 1px solid var(--ai-border, #ddd); padding: 8px; text-align: left; } #tm-ai-chat-sidebar .tm-message th { background: var(--ai-bgSecondary, #f5f5f5); font-weight: bold; } .tm-thinking-section { margin: 8px 0; border: 1px solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); overflow: hidden; } .tm-thinking-header { background: var(--ai-bgSecondary, #f5f5f5); padding: 8px 12px; cursor: pointer; display: flex; align-items: center; gap: 8px; user-select: none; color: var(--ai-text, #333); } .tm-thinking-header:hover { background: var(--ai-hover, #e8e8e8); } .tm-thinking-toggle { font-size: 12px; transition: transform 0.2s; } .tm-thinking-toggle.tm-collapsed { transform: rotate(-90deg); } .tm-thinking-content { padding: 12px; background: var(--ai-bgSecondary, #fafafa); border-top: 1px solid var(--ai-border, #ddd); max-height: 300px; overflow-y: auto; color: var(--ai-text, #333); } .tm-thinking-content.tm-collapsed { display: none; } .tm-model-selector { padding: 10px var(--ai-spacing, 15px); border-bottom: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); position: relative; background: var(--ai-bg, white); transition: var(--ai-transition, all 0.2s ease); } #tm-model-display-btn { background: none !important; border: none !important; color: var(--ai-primary, #667eea) !important; font-size: var(--ai-fontSize, 14px) !important; cursor: pointer !important; display: flex !important; align-items: center !important; gap: 5px !important; padding: 5px 0 !important; font-weight: 600 !important; font-family: inherit !important; box-shadow: none !important; outline: none !important; } #tm-model-display-btn:hover { opacity: 0.8; } #tm-model-display-btn .tm-arrow { font-size: 10px; transition: transform 0.2s; } #tm-model-display-btn.tm-open .tm-arrow { transform: rotate(180deg); } .tm-model-dropdown { position: absolute; top: 100%; left: var(--ai-spacing, 15px); right: var(--ai-spacing, 15px); background: var(--ai-bg, white); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); box-shadow: var(--ai-shadowLg, 0 2px 8px rgba(0,0,0,0.1)); max-height: 200px; overflow-y: auto; z-index: 100; margin-top: 5px; } .tm-model-dropdown-item { padding: 10px var(--ai-spacing, 15px); cursor: pointer; border-bottom: var(--ai-borderWidth, 1px) solid var(--ai-border, #f0f0f0); color: var(--ai-text, #333); font-size: var(--ai-fontSize, 14px); transition: var(--ai-transition, all 0.2s ease); } .tm-model-dropdown-item:last-child { border-bottom: none; } .tm-model-dropdown-item:hover { background: var(--ai-hover, #f5f5f5); } .tm-model-dropdown-item.tm-selected { background: var(--ai-primary, #667eea); color: white; } .tm-input-area { padding: var(--ai-spacing, 15px); border-top: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); position: relative; background: var(--ai-bg, white); transition: var(--ai-transition, all 0.2s ease); } .tm-input-wrapper { position: relative; border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); background: var(--ai-bg, white); padding: 12px; display: flex; flex-direction: column; gap: 8px; resize: vertical; overflow: hidden; min-height: 80px; transition: border-color 0.2s ease, box-shadow 0.2s ease; box-shadow: 0 2px 6px rgba(0,0,0,0.02); } .tm-input-wrapper:focus-within { border-color: var(--ai-primary, #667eea); box-shadow: 0 0 0 2px var(--ai-shadow, rgba(102, 126, 234, 0.1)); } .tm-prompt-icon-top { background: none; border: none; font-size: 18px; cursor: pointer; padding: 4px; align-self: flex-start; line-height: 1; border-radius: 4px; transition: background 0.2s; flex-shrink: 0; } .tm-prompt-icon-top:hover { background: rgba(102, 126, 234, 0.1); } .tm-prompt-icon-top.tm-selected { background: rgba(102, 126, 234, 0.2); } #tm-user-input { flex: 1; width: 100%; border: none; outline: none; box-shadow: none; resize: none; font-family: inherit; min-height: 40px; padding: 0; overflow-y: auto; background: var(--ai-bg, white); color: var(--ai-text, #333); } #tm-send-btn { margin-top: 10px; } .tm-prompt-dropdown { position: absolute; bottom: 100%; left: 0; right: 0; background: var(--ai-bg, white); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); box-shadow: var(--ai-shadowLg, 0 -2px 8px rgba(0,0,0,0.1)); max-height: 300px; overflow-y: auto; z-index: 100; margin-bottom: 8px; } .tm-prompt-dropdown-item { padding: 10px var(--ai-spacing, 15px); cursor: pointer; border-bottom: var(--ai-borderWidth, 1px) solid var(--ai-border, #f0f0f0); color: var(--ai-text, #333); transition: var(--ai-transition, all 0.2s ease); } .tm-prompt-dropdown-item:last-child { border-bottom: none; } .tm-prompt-dropdown-item:hover { background: var(--ai-hover, #f5f5f5); } .tm-prompt-dropdown-item .tm-prompt-title { font-weight: 600; margin-bottom: 4px; font-size: var(--ai-fontSize, 14px); } .tm-prompt-dropdown-item .tm-prompt-preview { font-size: 12px; color: var(--ai-textSecondary, #999); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tm-params-panel { position: absolute; bottom: 100%; left: 0; right: 0; background: var(--ai-bg, white); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); box-shadow: var(--ai-shadowLg, 0 -2px 8px rgba(0,0,0,0.1)); padding: var(--ai-spacing, 15px); z-index: 100; margin-bottom: 8px; } .tm-params-item { margin-bottom: 10px; } .tm-params-item:last-child { margin-bottom: 0; } .tm-params-item label { display: block; margin-bottom: 5px; font-size: 12px; font-weight: 500; color: var(--ai-text, #333); } .tm-params-item input { width: 100%; padding: 6px; border: 1px solid var(--ai-border, #ddd); border-radius: 4px; font-size: 13px; background: var(--ai-bg, white); color: var(--ai-text, #333); } #tm-send-btn { padding: 10px 24px; background: var(--ai-primary, #667eea); color: white; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; font-weight: 600; font-size: 14px; transition: var(--ai-transition, all 0.2s ease); box-shadow: 0 2px 4px rgba(0,0,0,0.1); } #tm-send-btn:hover { opacity: 0.9; transform: translateY(-1px); box-shadow: 0 4px 8px rgba(0,0,0,0.15); } #tm-send-btn:active { transform: translateY(0); } .tm-chat-container { display: flex; height: 100%; } .tm-conversations-sidebar { width: 200px; border-right: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); display: flex; flex-direction: column; background: var(--ai-bgSecondary, #fafafa); transition: var(--ai-transition, all 0.2s ease); } .tm-conversations-toolbar { padding: 10px; border-bottom: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); display: flex; gap: 5px; } .tm-conversations-toolbar button { flex: 1; padding: 6px; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; font-size: 12px; color: white; font-family: inherit; transition: var(--ai-transition, all 0.2s ease); } .tm-new-conv-btn { background: #2da44e; } .tm-batch-delete-conv-btn { background: #e74c3c; } .tm-batch-delete-conv-btn:hover { opacity: 0.9; } .tm-conversations-list { flex: 1; overflow-y: auto; } .tm-conversation-item { padding: 10px 12px; cursor: pointer; border-bottom: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); transition: background 0.2s; font-size: 13px; display: flex; align-items: center; gap: 8px; position: relative; color: var(--ai-text, #333); } .tm-conversation-item input[type="checkbox"] { width: 16px; height: 16px; cursor: pointer; flex-shrink: 0; } .tm-conversation-item .tm-conv-title { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tm-conversation-item .tm-conv-actions { display: none; gap: 4px; flex-shrink: 0; } .tm-conversation-item:hover .tm-conv-actions { display: flex; } .tm-conversation-item .tm-conv-action-btn { padding: 2px 6px; background: rgba(0,0,0,0.1); border: none; border-radius: 3px; cursor: pointer; font-size: 12px; } .tm-conversation-item .tm-conv-action-btn:hover { background: rgba(0,0,0,0.2); } .tm-conversation-item:hover { background: var(--ai-hover, #f0f0f0); } .tm-conversation-item.tm-active { background: var(--ai-primary, #667eea); color: white; } .tm-conversation-item.tm-active .tm-conv-action-btn { background: rgba(255,255,255,0.2); } .tm-conversation-item.tm-active .tm-conv-action-btn:hover { background: rgba(255,255,255,0.3); } .tm-conversation-item.tm-editing .tm-conv-title { display: none; } .tm-conversation-item .tm-conv-rename-input { display: none; flex: 1; padding: 4px; border: 1px solid var(--ai-border, #ddd); border-radius: 3px; font-size: 12px; background: var(--ai-bg, white); color: var(--ai-text, #333); } .tm-conversation-item.tm-editing .tm-conv-rename-input { display: block; } .tm-chat-main { flex: 1; display: flex; flex-direction: column; overflow: hidden; background: var(--ai-bg, white); } .tm-providers-container { display: flex; height: 100%; background: var(--ai-bg, white); } .tm-providers-sidebar { width: 200px; border-right: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); display: flex; flex-direction: column; background: var(--ai-bgSecondary, #fafafa); } #tm-add-provider-btn { margin: 15px; padding: 10px; background: var(--ai-primary, #667eea); color: white; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; font-weight: 600; transition: var(--ai-transition, all 0.2s ease); } #tm-add-provider-btn:hover { opacity: 0.9; transform: translateY(-1px); } .tm-providers-list { flex: 1; overflow-y: auto; } .tm-provider-sidebar-item { padding: 12px 15px; cursor: pointer; border-bottom: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); transition: background 0.2s; display: flex; align-items: center; justify-content: space-between; color: var(--ai-text, #333); } .tm-provider-sidebar-item:hover { background: var(--ai-hover, #f5f5f5); } .tm-provider-sidebar-item.tm-active { background: var(--ai-primary, #667eea); color: white; } .tm-provider-sidebar-item .tm-delete-icon { opacity: 0; cursor: pointer; font-size: 16px; padding: 2px 6px; border-radius: 3px; transition: opacity 0.2s; } .tm-provider-sidebar-item:hover .tm-delete-icon { opacity: 1; } .tm-provider-sidebar-item .tm-delete-icon:hover { background: rgba(231, 76, 60, 0.2); } .tm-provider-sidebar-item.tm-active .tm-delete-icon:hover { background: rgba(255, 255, 255, 0.3); } .tm-provider-detail { flex: 1; overflow-y: auto; padding: 20px; color: var(--ai-text, #333); } .tm-empty-state { text-align: center; color: var(--ai-textSecondary, #999); padding: 50px 20px; } .tm-provider-form { max-width: 600px; } .tm-provider-form h3 { margin: 0 0 20px 0; } .tm-form-group { margin-bottom: 15px; display: flex; align-items: center; gap: 15px; } .tm-form-group label { min-width: 100px; font-weight: bold; } .tm-form-group input { flex: 1; padding: 8px; border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); background: var(--ai-bg, white); color: var(--ai-text, #333); } .tm-final-url-display { margin-left: 115px; padding: 8px; background: var(--ai-bgSecondary, #f0f0f0); border-radius: 4px; font-size: 12px; color: var(--ai-textSecondary, #666); word-break: break-all; } .tm-final-url-display strong { color: var(--ai-text, #333); } .tm-form-group.tm-password-group { position: relative; } .tm-form-group.tm-password-group input { padding-right: 40px; } .tm-form-group .tm-toggle-password { position: absolute; right: 10px; cursor: pointer; font-size: 18px; user-select: none; } .tm-form-actions { display: flex; gap: 10px; margin-top: 20px; margin-left: 115px; } .tm-form-actions button { padding: 10px 20px; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; color: white; } .tm-save-provider-btn { background: var(--ai-primary, #667eea); } .tm-models-section { margin-top: 30px; padding-top: 20px; border-top: calc(var(--ai-borderWidth, 1px) * 2) solid var(--ai-border, #eee); } .tm-models-section h3 { margin: 0 0 15px 0; display: flex; align-items: center; gap: 10px; color: var(--ai-text, #333); } .tm-fetch-models-btn, .tm-refresh-models-btn { padding: 6px 12px; background: #3498db; color: white; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; font-size: 12px; transition: var(--ai-transition, all 0.2s ease); } .tm-fetch-models-btn:hover, .tm-refresh-models-btn:hover { opacity: 0.9; } .tm-refresh-models-btn { background: #2ecc71; } .tm-available-models-section { margin-top: 20px; padding: 15px; background: var(--ai-bgSecondary, #f9f9f9); border-radius: var(--ai-borderRadius, 8px); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); } .tm-available-models-section h4 { margin: 0 0 10px 0; font-size: 14px; } .tm-model-search { width: 100%; padding: 8px; margin-bottom: 10px; border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); background: var(--ai-bg, white); color: var(--ai-text, #333); } .tm-available-models-list { max-height: 300px; overflow-y: auto; display: flex; flex-direction: column; gap: 5px; } .tm-available-model-item { display: flex; align-items: center; justify-content: space-between; padding: 8px; background: var(--ai-bg, white); border-radius: var(--ai-borderRadius, 4px); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); } .tm-available-model-item .tm-model-name { flex: 1; font-size: 13px; } .tm-available-model-item .tm-add-model-icon { cursor: pointer; color: var(--ai-primary, #667eea); font-size: 18px; padding: 2px 6px; border-radius: 3px; transition: background 0.2s; } .tm-available-model-item .tm-add-model-icon:hover { background: rgba(102, 126, 234, 0.1); } .tm-loading-models { text-align: center; padding: 20px; color: var(--ai-textSecondary, #999); } .tm-models-list { display: flex; flex-direction: column; gap: 10px; } .tm-model-item { background: var(--ai-bgSecondary, #f9f9f9); padding: 10px; border-radius: var(--ai-borderRadius, 4px); display: flex; align-items: center; gap: 10px; } .tm-model-item input { flex: 1; padding: 8px; border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); background: var(--ai-bg, white); color: var(--ai-text, #333); } .tm-model-item button { padding: 6px 12px; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; font-size: 12px; color: white; } .tm-save-model-btn { background: var(--ai-primary, #667eea); } .tm-delete-model-btn { background: #e74c3c; } .tm-add-model-btn { margin-top: 10px; padding: 8px 16px; background: var(--ai-primary, #667eea); color: white; border: none; border-radius: 4px; cursor: pointer; } .tm-prompts-toolbar { padding: var(--ai-spacing, 15px); display: flex; gap: 10px; border-bottom: var(--ai-borderWidth, 1px) solid var(--ai-border, #eee); background: var(--ai-bg, white); } .tm-prompts-toolbar button { padding: 8px 16px; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; color: white; font-weight: 600; transition: var(--ai-transition, all 0.2s ease); } .tm-prompts-toolbar button:hover { opacity: 0.9; transform: translateY(-1px); } #tm-add-prompt { background: var(--ai-primary, #667eea); } #tm-batch-delete-prompt { background: #e74c3c; } .tm-prompts-list { flex: 1; overflow-y: auto; padding: 15px; background: var(--ai-bg, white); } .tm-prompts-list h4 { display: flex; align-items: center; gap: 8px; } .tm-help-icon { display: inline-block; width: 16px; height: 16px; border-radius: 50%; background: var(--ai-textSecondary, #999); color: var(--ai-bg, white); text-align: center; font-size: 12px; line-height: 16px; cursor: pointer; font-weight: bold; transition: background 0.2s; } .tm-help-icon:hover { background: var(--ai-primary, #667eea); } .tm-prompt-item { background: var(--ai-bgSecondary, #f9f9f9); padding: 15px; margin-bottom: 10px; border-radius: var(--ai-borderRadius, 8px); position: relative; color: var(--ai-text, #333); } .tm-prompt-item.tm-editing { background: var(--ai-bg, #fff); border: 2px solid var(--ai-primary, #667eea); } .tm-prompt-item input[type="checkbox"] { position: absolute; top: 15px; left: 15px; width: 18px; height: 18px; cursor: pointer; } .tm-prompt-item .tm-prompt-header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; padding-left: 30px; } .tm-prompt-item .tm-prompt-title { flex: 1; font-weight: bold; font-size: 16px; } .tm-prompt-item .tm-prompt-actions { display: flex; gap: 5px; } .tm-prompt-item .tm-prompt-actions button { padding: 4px 10px; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; font-size: 12px; } .tm-prompt-item .tm-view-btn { background: #3498db; color: white; } .tm-prompt-item .tm-edit-btn { background: #f39c12; color: white; } .tm-prompt-item .tm-delete-btn { background: #e74c3c; color: white; } .tm-prompt-item .tm-prompt-content { padding-left: 30px; color: var(--ai-textSecondary, #666); white-space: pre-wrap; word-break: break-word; } .tm-prompt-item .tm-prompt-form { padding-left: 30px; } .tm-prompt-item .tm-prompt-form input, .tm-prompt-item .tm-prompt-form textarea { width: 100%; padding: 8px; margin: 5px 0; border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); font-family: inherit; background: var(--ai-bg, white); color: var(--ai-text, #333); } .tm-prompt-item .tm-prompt-form textarea { min-height: 100px; resize: vertical; } .tm-prompt-item .tm-prompt-form .tm-form-actions { margin-top: 10px; display: flex; gap: 10px; } .tm-prompt-item .tm-prompt-form .tm-form-actions button { padding: 6px 16px; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; color: white; } .tm-prompt-item .tm-save-prompt-btn { background: var(--ai-primary, #667eea); } .tm-prompt-item .tm-cancel-btn { background: #95a5a6; } .tm-system-config-container { padding: 20px; color: var(--ai-text, #333); } .tm-system-config-container h3 { margin: 0 0 20px 0; } .tm-config-section { background: var(--ai-bgSecondary, #f9f9f9); padding: 20px; border-radius: var(--ai-borderRadius, 8px); margin-bottom: 20px; } .tm-config-section h4 { margin: 0 0 15px 0; font-size: 16px; } .tm-config-select { width: 100%; padding: 8px; border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); background: var(--ai-bg, white); color: var(--ai-text, #333); font-size: 14px; } .tm-save-btn { margin-top: 15px; padding: 10px 20px; background: var(--ai-primary, #667eea); color: white; border: none; border-radius: var(--ai-btnRadius, 4px); cursor: pointer; font-weight: 600; } .tm-save-btn:hover { opacity: 0.9; } /* Scrollbar Styling */ #tm-ai-chat-sidebar ::-webkit-scrollbar { width: 6px; height: 6px; } #tm-ai-chat-sidebar ::-webkit-scrollbar-track { background: transparent; } #tm-ai-chat-sidebar ::-webkit-scrollbar-thumb { background: var(--ai-border, rgba(0, 0, 0, 0.1)); border-radius: 3px; } #tm-ai-chat-sidebar ::-webkit-scrollbar-thumb:hover { background: var(--ai-textSecondary, rgba(0, 0, 0, 0.2)); } /* 翻译页面样式 */ .tm-translate-container { display: flex; flex-direction: column; height: 100%; padding: 16px; background: var(--ai-bg, white); gap: 16px; overflow-y: auto; } .tm-translate-card { background: var(--ai-bgSecondary, #f9f9f9); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 6px); padding: 16px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); position: relative; } .tm-translate-card-title { font-size: 16px; font-weight: 600; margin-bottom: 12px; color: var(--ai-text, #333); display: flex; align-items: center; justify-content: space-between; gap: 8px; } .tm-translate-card-title i { color: var(--ai-primary, #667eea); } .tm-translate-current-settings { font-size: 12px; color: var(--ai-textSecondary, #666); margin-top: -8px; margin-bottom: 4px; display: flex; align-items: center; gap: 8px; } .tm-translate-current-settings .tm-separator { color: var(--ai-border, #ddd); } .tm-translate-dropdown { position: absolute; top: 45px; right: 16px; background: var(--ai-bg, white); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 4px); box-shadow: var(--ai-shadowLg, 0 2px 8px rgba(0,0,0,0.1)); max-height: 200px; overflow-y: auto; z-index: 100; min-width: 200px; } .tm-translate-dropdown-item { padding: 8px 12px; cursor: pointer; border-bottom: var(--ai-borderWidth, 1px) solid var(--ai-border, #f0f0f0); color: var(--ai-text, #333); font-size: 13px; transition: var(--ai-transition, all 0.2s ease); } .tm-translate-dropdown-item:last-child { border-bottom: none; } .tm-translate-dropdown-item:hover { background: var(--ai-hover, #f5f5f5); } .tm-translate-dropdown-item.tm-selected { background: var(--ai-primary, #667eea); color: white; } .tm-translate-text-area-container { position: relative; margin-top: 8px; } .tm-translate-text-area-container textarea { width: 100%; background: var(--ai-bg, white); color: var(--ai-text, #333); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: var(--ai-borderRadius, 6px); padding: 12px; font-size: 14px; resize: vertical; min-height: 120px; outline: none; transition: border-color 0.2s; font-family: inherit; box-sizing: border-box; } .tm-translate-text-area-container textarea:focus { border-color: var(--ai-primary, #667eea); } .tm-translate-text-area-actions { display: flex; gap: 8px; } .tm-translate-action-btn { background: var(--ai-bgSecondary, rgba(255,255,255,0.8)); border: var(--ai-borderWidth, 1px) solid var(--ai-border, #ddd); border-radius: 4px; color: var(--ai-textSecondary, #666); width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; cursor: pointer; transition: all 0.2s; } .tm-translate-action-btn:hover { background: var(--ai-hover, #f5f5f5); color: var(--ai-primary, #667eea); border-color: var(--ai-primary, #667eea); } .tm-translate-char-count { font-size: 12px; color: var(--ai-textSecondary, #999); text-align: right; margin-top: 4px; } .tm-translate-main-btn { background: var(--ai-primary, #667eea); color: white; border: none; border-radius: var(--ai-borderRadius, 6px); padding: 12px 24px; font-size: 16px; font-weight: 600; cursor: pointer; transition: opacity 0.2s; display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; box-sizing: border-box; } .tm-translate-main-btn:hover { opacity: 0.9; } .tm-translate-main-btn:active { opacity: 1; } .tm-translate-main-btn:disabled { opacity: 0.7; cursor: not-allowed; } /* Language Selector Styles */ .tm-translate-language-selector { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--ai-border, #eee); } .tm-language-btn-container { position: relative; flex: 1; } .tm-language-btn { width: 100%; padding: 8px 12px; background: var(--ai-bg, white); border: 1px solid var(--ai-border, #ddd); border-radius: 4px; cursor: pointer; text-align: left; font-size: 13px; color: var(--ai-text, #333); display: flex; align-items: center; justify-content: space-between; transition: all 0.2s; box-sizing: border-box; } .tm-language-btn:hover { border-color: var(--ai-primary, #667eea); background: var(--ai-hover, #f5f5f5); } .tm-language-btn::after { content: '▼'; font-size: 10px; opacity: 0.6; } .tm-swap-btn { background: none; border: none; cursor: pointer; font-size: 18px; color: var(--ai-textSecondary, #666); padding: 4px; border-radius: 4px; transition: all 0.2s; position: relative; z-index: 102; } .tm-swap-btn:hover { background: var(--ai-hover, #f5f5f5); color: var(--ai-primary, #667eea); transform: rotate(180deg); } .tm-language-dropdown { position: absolute; top: 100%; left: 0; width: 100%; max-height: 250px; background: var(--ai-bg, white); border: 1px solid var(--ai-border, #ddd); border-radius: 4px; box-shadow: 0 4px 12px rgba(0,0,0,0.1); z-index: 101; margin-top: 4px; display: flex; flex-direction: column; box-sizing: border-box; } .tm-language-search { padding: 8px; border: none; border-bottom: 1px solid var(--ai-border, #eee); width: 100%; font-size: 12px; outline: none; background: var(--ai-bg, white); color: var(--ai-text, #333); box-sizing: border-box; } .tm-language-list { overflow-y: auto; flex: 1; } .tm-language-item { padding: 8px 12px; cursor: pointer; font-size: 13px; color: var(--ai-text, #333); transition: background 0.2s; } .tm-language-item:hover { background: var(--ai-hover, #f5f5f5); } .tm-language-item.tm-selected { background: var(--ai-primary, #667eea); color: white; } /* 提示词帮助弹窗样式 */ .tm-prompt-help-modal { position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.5); display: flex; align-items: center; justify-content: center; z-index: 1001; /* 比侧边栏内容高 */ } .tm-prompt-help-modal .tm-modal-content { background: var(--ai-bg, white); padding: 25px; border-radius: var(--ai-borderRadius, 8px); width: 90%; max-width: 500px; position: relative; box-shadow: 0 5px 15px rgba(0,0,0,0.3); color: var(--ai-text, #333); } .tm-prompt-help-modal .tm-modal-close-btn { position: absolute; top: 10px; right: 15px; font-size: 24px; font-weight: bold; cursor: pointer; color: var(--ai-textSecondary, #999); } .tm-prompt-help-modal .tm-modal-close-btn:hover { color: var(--ai-text, #333); } .tm-prompt-help-modal h3 { margin: 0 0 15px 0; color: var(--ai-text, #333); } .tm-prompt-help-modal p { margin: 0 0 10px 0; line-height: 1.6; } .tm-prompt-help-modal ul { margin: 0 0 15px 0; padding-left: 20px; } .tm-prompt-help-modal li { margin-bottom: 8px; } .tm-prompt-help-modal code { background: var(--ai-hover, rgba(0,0,0,0.1)); padding: 2px 6px; border-radius: var(--ai-btnRadius, 3px); font-family: 'Consolas', 'Monaco', 'Courier New', monospace; } .tm-prompt-help-modal pre { background: var(--ai-bgSecondary, #f5f5f5); padding: 12px; border-radius: var(--ai-borderRadius, 6px); overflow-x: auto; margin-top: 10px; } .tm-prompt-help-modal pre code { background: none; padding: 0; } `; style.textContent += ` /* 模式指示器样式 */ .tm-mode-indicator { position: absolute; bottom: 100%; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.7); color: white; padding: 8px 12px; border-radius: 12px; font-size: 12px; margin-bottom: 5px; white-space: nowrap; z-index: 101; opacity: 0; transition: opacity 0.3s, transform 0.3s; pointer-events: none; /* 避免遮挡下方元素 */ } .tm-mode-indicator.tm-visible { opacity: 1; transform: translateX(-50%) translateY(-5px); } `; document.head.appendChild(style); }; const LANGUAGES = [ { code: "auto", zh: "自动检测", en: "Auto Detect", pinyin: "zidongjiance", isSourceOnly: true }, { code: "zh-CN", zh: "简体中文", en: "Chinese (Simplified)", pinyin: "jiantizhongwen" }, { code: "zh-TW", zh: "繁体中文", en: "Chinese (Traditional)", pinyin: "fantizhongwen" }, { code: "en", zh: "英语", en: "English", pinyin: "yingyu" }, { code: "ja", zh: "日语", en: "Japanese", pinyin: "riyu" }, { code: "ko", zh: "韩语", en: "Korean", pinyin: "hanyu" }, { code: "fr", zh: "法语", en: "French", pinyin: "fayu" }, { code: "de", zh: "德语", en: "German", pinyin: "deyu" }, { code: "es", zh: "西班牙语", en: "Spanish", pinyin: "xibanyayu" }, { code: "it", zh: "意大利语", en: "Italian", pinyin: "yidaliyu" }, { code: "ru", zh: "俄语", en: "Russian", pinyin: "eyu" }, { code: "pt", zh: "葡萄牙语", en: "Portuguese", pinyin: "putaoyayu" }, { code: "nl", zh: "荷兰语", en: "Dutch", pinyin: "helanyu" }, { code: "pl", zh: "波兰语", en: "Polish", pinyin: "bolanyu" }, { code: "ar", zh: "阿拉伯语", en: "Arabic", pinyin: "alaboyu" }, { code: "hi", zh: "印地语", en: "Hindi", pinyin: "yindiyu" }, { code: "tr", zh: "土耳其语", en: "Turkish", pinyin: "tuerqiyu" }, { code: "th", zh: "泰语", en: "Thai", pinyin: "taiyu" }, { code: "vi", zh: "越南语", en: "Vietnamese", pinyin: "yuenanyu" }, { code: "id", zh: "印尼语", en: "Indonesian", pinyin: "yinniyu" }, { code: "ms", zh: "马来语", en: "Malay", pinyin: "malaiyu" }, { code: "tl", zh: "菲律宾语", en: "Filipino", pinyin: "feilubinyu" }, { code: "bn", zh: "孟加拉语", en: "Bengali", pinyin: "mengjialayu" }, { code: "fa", zh: "波斯语", en: "Persian", pinyin: "bosiyu" }, { code: "he", zh: "希伯来语", en: "Hebrew", pinyin: "xibolaiyu" }, { code: "sv", zh: "瑞典语", en: "Swedish", pinyin: "ruidianyu" }, { code: "da", zh: "丹麦语", en: "Danish", pinyin: "danmaiyu" }, { code: "fi", zh: "芬兰语", en: "Finnish", pinyin: "fenlanyu" }, { code: "no", zh: "挪威语", en: "Norwegian", pinyin: "nuoweiyu" }, { code: "cs", zh: "捷克语", en: "Czech", pinyin: "jiekeyu" }, { code: "hu", zh: "匈牙利语", en: "Hungarian", pinyin: "xiongyaliyu" }, { code: "el", zh: "希腊语", en: "Greek", pinyin: "xilayu" }, { code: "ro", zh: "罗马尼亚语", en: "Romanian", pinyin: "luomaniyayu" }, { code: "uk", zh: "乌克兰语", en: "Ukrainian", pinyin: "wukelanyu" }, { code: "bg", zh: "保加利亚语", en: "Bulgarian", pinyin: "baojialiyayu" }, { code: "hr", zh: "克罗地亚语", en: "Croatian", pinyin: "keluodiyayu" }, { code: "sr", zh: "塞尔维亚语", en: "Serbian", pinyin: "saierweiyayu" }, { code: "sk", zh: "斯洛伐克语", en: "Slovak", pinyin: "siluofakeyu" }, { code: "sl", zh: "斯洛文尼亚语", en: "Slovenian", pinyin: "siluowenniyayu" }, { code: "et", zh: "爱沙尼亚语", en: "Estonian", pinyin: "aishaniyayu" }, { code: "lv", zh: "拉脱维亚语", en: "Latvian", pinyin: "latuoweiyayu" }, { code: "lt", zh: "立陶宛语", en: "Lithuanian", pinyin: "litaowanyu" }, { code: "ga", zh: "爱尔兰语", en: "Irish", pinyin: "aierlanyu" }, { code: "is", zh: "冰岛语", en: "Icelandic", pinyin: "bingdaoyu" }, { code: "sq", zh: "阿尔巴尼亚语", en: "Albanian", pinyin: "aerbaniyayu" }, { code: "mk", zh: "马其顿语", en: "Macedonian", pinyin: "maqidunyu" }, { code: "mt", zh: "马耳他语", en: "Maltese", pinyin: "maertayu" }, { code: "cy", zh: "威尔士语", en: "Welsh", pinyin: "weiershiyu" }, { code: "sw", zh: "斯瓦希里语", en: "Swahili", pinyin: "siwaxiliyu" }, { code: "af", zh: "南非荷兰语", en: "Afrikaans", pinyin: "nanfeihelanyu" } ]; function L() { return { async: false, breaks: false, extensions: null, gfm: true, hooks: null, pedantic: false, renderer: null, silent: false, tokenizer: null, walkTokens: null }; } var T = L(); function Z(u3) { T = u3; } var C = { exec: () => null }; function k(u3, e = "") { let t = typeof u3 == "string" ? u3 : u3.source, n = { replace: (r, i) => { let s = typeof i == "string" ? i : i.source; return s = s.replace(m.caret, "$1"), t = t.replace(r, s), n; }, getRegex: () => new RegExp(t, e) }; return n; } var me = (() => { try { return !!new RegExp("(?<=1)(?/, blockquoteSetextReplace: /\n {0,3}((?:=+|-+) *)(?=\n|$)/g, blockquoteSetextReplace2: /^ {0,3}>[ \t]?/gm, listReplaceTabs: /^\t+/, listReplaceNesting: /^ {1,4}(?=( {4})*[^ ])/g, listIsTask: /^\[[ xX]\] +\S/, listReplaceTask: /^\[[ xX]\] +/, listTaskCheckbox: /\[[ xX]\]/, anyLine: /\n.*\n/, hrefBrackets: /^<(.*)>$/, tableDelimiter: /[:|]/, tableAlignChars: /^\||\| *$/g, tableRowBlankLine: /\n[ \t]*$/, tableAlignRight: /^ *-+: *$/, tableAlignCenter: /^ *:-+: *$/, tableAlignLeft: /^ *:-+ *$/, startATag: /^/i, startPreScriptTag: /^<(pre|code|kbd|script)(\s|>)/i, endPreScriptTag: /^<\/(pre|code|kbd|script)(\s|>)/i, startAngleBracket: /^$/, pedanticHrefTitle: /^([^'"]*[^\s])\s+(['"])(.*)\2/, unicodeAlphaNumeric: /[\p{L}\p{N}]/u, escapeTest: /[&<>"']/, escapeReplace: /[&<>"']/g, escapeTestNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, escapeReplaceNoEncode: /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g, unescapeTest: /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, caret: /(^|[^\[])\^/g, percentDecode: /%25/g, findPipe: /\|/g, splitPipe: / \|/, slashPipe: /\\\|/g, carriageReturn: /\r\n|\r/g, spaceLine: /^ +$/gm, notSpaceStart: /^\S*/, endingNewline: /\n$/, listItemRegex: (u3) => new RegExp(`^( {0,3}${u3})((?:[ ][^\\n]*)?(?:\\n|$))`), nextBulletRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), hrRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), fencesBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}(?:\`\`\`|~~~)`), headingBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}#`), htmlBeginRegex: (u3) => new RegExp(`^ {0,${Math.min(3, u3 - 1)}}<(?:[a-z].*>|!--)`, "i") }, xe = /^(?:[ \t]*(?:\n|$))+/, be = /^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/, Re = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, I = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, Te = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, N = /(?:[*+-]|\d{1,9}[.)])/, re = /^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/, se = k(re).replace(/bull/g, N).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/\|table/g, "").getRegex(), Oe = k(re).replace(/bull/g, N).replace(/blockCode/g, /(?: {4}| {0,3}\t)/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).replace(/table/g, / {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(), Q = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, we = /^[^\n]+/, F = /(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/, ye = k(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label", F).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), Pe = k(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, N).getRegex(), v = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", j = /|$))/, Se = k("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))", "i").replace("comment", j).replace("tag", v).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), ie = k(Q).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(), $e = k(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", ie).getRegex(), U = { blockquote: $e, code: be, def: ye, fences: Re, heading: Te, hr: I, html: Se, lheading: se, list: Pe, newline: xe, paragraph: ie, table: C, text: we }, te = k("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", "(?: {4}| {0,3} )[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex(), _e = { ...U, lheading: Oe, table: te, paragraph: k(Q).replace("hr", I).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", te).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", v).getRegex() }, Le = { ...U, html: k(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", j).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, fences: C, lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, paragraph: k(Q).replace("hr", I).replace("heading", ` *#{1,6} *[^ ]`).replace("lheading", se).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() }, Me = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, ze = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, oe = /^( {2,}|\\)\n(?!\s*$)/, Ae = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-", me ? "(?`+)[^`]+\k(?!`)/).replace("html", /<(?! )[^<>]*?>/).getRegex(), ue = /^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/, qe = k(ue, "u").replace(/punct/g, D).getRegex(), ve = k(ue, "u").replace(/punct/g, le).getRegex(), pe = "^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)", De = k(pe, "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, K).replace(/punct/g, D).getRegex(), He = k(pe, "gu").replace(/notPunctSpace/g, Ee).replace(/punctSpace/g, Ie).replace(/punct/g, le).getRegex(), Ze = k("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)", "gu").replace(/notPunctSpace/g, ae).replace(/punctSpace/g, K).replace(/punct/g, D).getRegex(), Ge = k(/\\(punct)/, "gu").replace(/punct/g, D).getRegex(), Ne = k(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), Qe = k(j).replace("(?:-->|$)", "-->").getRegex(), Fe = k("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Qe).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), q = /(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/, je = k(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label", q).replace("href", /<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), ce = k(/^!?\[(label)\]\[(ref)\]/).replace("label", q).replace("ref", F).getRegex(), he = k(/^!?\[(ref)\](?:\[\])?/).replace("ref", F).getRegex(), Ue = k("reflink|nolink(?!\\()", "g").replace("reflink", ce).replace("nolink", he).getRegex(), ne = /[hH][tT][tT][pP][sS]?|[fF][tT][pP]/, W = { _backpedal: C, anyPunctuation: Ge, autolink: Ne, blockSkip: Be, br: oe, code: ze, del: C, emStrongLDelim: qe, emStrongRDelimAst: De, emStrongRDelimUnd: Ze, escape: Me, link: je, nolink: he, punctuation: Ce, reflink: ce, reflinkSearch: Ue, tag: Fe, text: Ae, url: C }, Ke = { ...W, link: k(/^!?\[(label)\]\((.*?)\)/).replace("label", q).getRegex(), reflink: k(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", q).getRegex() }, G = { ...W, emStrongRDelimAst: He, emStrongLDelim: ve, url: k(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol", ne).replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/, text: k(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\": ">", '"': """, "'": "'" }, ke = (u3) => Xe[u3]; function w(u3, e) { if (e) { if (m.escapeTest.test(u3)) return u3.replace(m.escapeReplace, ke); } else if (m.escapeTestNoEncode.test(u3)) return u3.replace(m.escapeReplaceNoEncode, ke); return u3; } function X(u3) { try { u3 = encodeURI(u3).replace(m.percentDecode, "%"); } catch { return null; } return u3; } function J(u3, e) { var _a2; let t = u3.replace(m.findPipe, (i, s, a) => { let o = false, l = s; for (; --l >= 0 && a[l] === "\\"; ) o = !o; return o ? "|" : " |"; }), n = t.split(m.splitPipe), r = 0; if (n[0].trim() || n.shift(), n.length > 0 && !((_a2 = n.at(-1)) == null ? void 0 : _a2.trim()) && n.pop(), e) if (n.length > e) n.splice(e); else for (; n.length < e; ) n.push(""); for (; r < n.length; r++) n[r] = n[r].trim().replace(m.slashPipe, "|"); return n; } function z(u3, e, t) { let n = u3.length; if (n === 0) return ""; let r = 0; for (; r < n; ) { let i = u3.charAt(n - r - 1); if (i === e && true) r++; else break; } return u3.slice(0, n - r); } function de(u3, e) { if (u3.indexOf(e[1]) === -1) return -1; let t = 0; for (let n = 0; n < u3.length; n++) if (u3[n] === "\\") n++; else if (u3[n] === e[0]) t++; else if (u3[n] === e[1] && (t--, t < 0)) return n; return t > 0 ? -2 : -1; } function ge(u3, e, t, n, r) { let i = e.href, s = e.title || null, a = u3[1].replace(r.other.outputLinkReplace, "$1"); n.state.inLink = true; let o = { type: u3[0].charAt(0) === "!" ? "image" : "link", raw: t, href: i, title: s, text: a, tokens: n.inlineTokens(a) }; return n.state.inLink = false, o; } function Je(u3, e, t) { let n = u3.match(t.other.indentCodeCompensation); if (n === null) return e; let r = n[1]; return e.split(` `).map((i) => { let s = i.match(t.other.beginningSpace); if (s === null) return i; let [a] = s; return a.length >= r.length ? i.slice(r.length) : i; }).join(` `); } var y = class { constructor(e) { __publicField(this, "options"); __publicField(this, "rules"); __publicField(this, "lexer"); this.options = e || T; } space(e) { let t = this.rules.block.newline.exec(e); if (t && t[0].length > 0) return { type: "space", raw: t[0] }; } code(e) { let t = this.rules.block.code.exec(e); if (t) { let n = t[0].replace(this.rules.other.codeRemoveIndent, ""); return { type: "code", raw: t[0], codeBlockStyle: "indented", text: this.options.pedantic ? n : z(n, ` `) }; } } fences(e) { let t = this.rules.block.fences.exec(e); if (t) { let n = t[0], r = Je(n, t[3] || "", this.rules); return { type: "code", raw: n, lang: t[2] ? t[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : t[2], text: r }; } } heading(e) { let t = this.rules.block.heading.exec(e); if (t) { let n = t[2].trim(); if (this.rules.other.endingHash.test(n)) { let r = z(n, "#"); (this.options.pedantic || !r || this.rules.other.endingSpaceChar.test(r)) && (n = r.trim()); } return { type: "heading", raw: t[0], depth: t[1].length, text: n, tokens: this.lexer.inline(n) }; } } hr(e) { let t = this.rules.block.hr.exec(e); if (t) return { type: "hr", raw: z(t[0], ` `) }; } blockquote(e) { let t = this.rules.block.blockquote.exec(e); if (t) { let n = z(t[0], ` `).split(` `), r = "", i = "", s = []; for (; n.length > 0; ) { let a = false, o = [], l; for (l = 0; l < n.length; l++) if (this.rules.other.blockquoteStart.test(n[l])) o.push(n[l]), a = true; else if (!a) o.push(n[l]); else break; n = n.slice(l); let p = o.join(` `), c = p.replace(this.rules.other.blockquoteSetextReplace, ` $1`).replace(this.rules.other.blockquoteSetextReplace2, ""); r = r ? `${r} ${p}` : p, i = i ? `${i} ${c}` : c; let g = this.lexer.state.top; if (this.lexer.state.top = true, this.lexer.blockTokens(c, s, true), this.lexer.state.top = g, n.length === 0) break; let h = s.at(-1); if ((h == null ? void 0 : h.type) === "code") break; if ((h == null ? void 0 : h.type) === "blockquote") { let R = h, f = R.raw + ` ` + n.join(` `), O = this.blockquote(f); s[s.length - 1] = O, r = r.substring(0, r.length - R.raw.length) + O.raw, i = i.substring(0, i.length - R.text.length) + O.text; break; } else if ((h == null ? void 0 : h.type) === "list") { let R = h, f = R.raw + ` ` + n.join(` `), O = this.list(f); s[s.length - 1] = O, r = r.substring(0, r.length - h.raw.length) + O.raw, i = i.substring(0, i.length - R.raw.length) + O.raw, n = f.substring(s.at(-1).raw.length).split(` `); continue; } } return { type: "blockquote", raw: r, tokens: s, text: i }; } } list(e) { var _a2, _b; let t = this.rules.block.list.exec(e); if (t) { let n = t[1].trim(), r = n.length > 1, i = { type: "list", raw: "", ordered: r, start: r ? +n.slice(0, -1) : "", loose: false, items: [] }; n = r ? `\\d{1,9}\\${n.slice(-1)}` : `\\${n}`, this.options.pedantic && (n = r ? n : "[*+-]"); let s = this.rules.other.listItemRegex(n), a = false; for (; e; ) { let l = false, p = "", c = ""; if (!(t = s.exec(e)) || this.rules.block.hr.test(e)) break; p = t[0], e = e.substring(p.length); let g = t[2].split(` `, 1)[0].replace(this.rules.other.listReplaceTabs, (O) => " ".repeat(3 * O.length)), h = e.split(` `, 1)[0], R = !g.trim(), f = 0; if (this.options.pedantic ? (f = 2, c = g.trimStart()) : R ? f = t[1].length + 1 : (f = t[2].search(this.rules.other.nonSpaceChar), f = f > 4 ? 1 : f, c = g.slice(f), f += t[1].length), R && this.rules.other.blankLine.test(h) && (p += h + ` `, e = e.substring(h.length + 1), l = true), !l) { let O = this.rules.other.nextBulletRegex(f), V = this.rules.other.hrRegex(f), Y = this.rules.other.fencesBeginRegex(f), ee = this.rules.other.headingBeginRegex(f), fe = this.rules.other.htmlBeginRegex(f); for (; e; ) { let H = e.split(` `, 1)[0], A; if (h = H, this.options.pedantic ? (h = h.replace(this.rules.other.listReplaceNesting, " "), A = h) : A = h.replace(this.rules.other.tabCharGlobal, " "), Y.test(h) || ee.test(h) || fe.test(h) || O.test(h) || V.test(h)) break; if (A.search(this.rules.other.nonSpaceChar) >= f || !h.trim()) c += ` ` + A.slice(f); else { if (R || g.replace(this.rules.other.tabCharGlobal, " ").search(this.rules.other.nonSpaceChar) >= 4 || Y.test(g) || ee.test(g) || V.test(g)) break; c += ` ` + h; } !R && !h.trim() && (R = true), p += H + ` `, e = e.substring(H.length + 1), g = A.slice(f); } } i.loose || (a ? i.loose = true : this.rules.other.doubleBlankLine.test(p) && (a = true)), i.items.push({ type: "list_item", raw: p, task: !!this.options.gfm && this.rules.other.listIsTask.test(c), loose: false, text: c, tokens: [] }), i.raw += p; } let o = i.items.at(-1); if (o) o.raw = o.raw.trimEnd(), o.text = o.text.trimEnd(); else return; i.raw = i.raw.trimEnd(); for (let l of i.items) { if (this.lexer.state.top = false, l.tokens = this.lexer.blockTokens(l.text, []), l.task) { if (l.text = l.text.replace(this.rules.other.listReplaceTask, ""), ((_a2 = l.tokens[0]) == null ? void 0 : _a2.type) === "text" || ((_b = l.tokens[0]) == null ? void 0 : _b.type) === "paragraph") { l.tokens[0].raw = l.tokens[0].raw.replace(this.rules.other.listReplaceTask, ""), l.tokens[0].text = l.tokens[0].text.replace(this.rules.other.listReplaceTask, ""); for (let c = this.lexer.inlineQueue.length - 1; c >= 0; c--) if (this.rules.other.listIsTask.test(this.lexer.inlineQueue[c].src)) { this.lexer.inlineQueue[c].src = this.lexer.inlineQueue[c].src.replace(this.rules.other.listReplaceTask, ""); break; } } let p = this.rules.other.listTaskCheckbox.exec(l.raw); if (p) { let c = { type: "checkbox", raw: p[0] + " ", checked: p[0] !== "[ ]" }; l.checked = c.checked, i.loose ? l.tokens[0] && ["paragraph", "text"].includes(l.tokens[0].type) && "tokens" in l.tokens[0] && l.tokens[0].tokens ? (l.tokens[0].raw = c.raw + l.tokens[0].raw, l.tokens[0].text = c.raw + l.tokens[0].text, l.tokens[0].tokens.unshift(c)) : l.tokens.unshift({ type: "paragraph", raw: c.raw, text: c.raw, tokens: [c] }) : l.tokens.unshift(c); } } if (!i.loose) { let p = l.tokens.filter((g) => g.type === "space"), c = p.length > 0 && p.some((g) => this.rules.other.anyLine.test(g.raw)); i.loose = c; } } if (i.loose) for (let l of i.items) { l.loose = true; for (let p of l.tokens) p.type === "text" && (p.type = "paragraph"); } return i; } } html(e) { let t = this.rules.block.html.exec(e); if (t) return { type: "html", block: true, raw: t[0], pre: t[1] === "pre" || t[1] === "script" || t[1] === "style", text: t[0] }; } def(e) { let t = this.rules.block.def.exec(e); if (t) { let n = t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal, " "), r = t[2] ? t[2].replace(this.rules.other.hrefBrackets, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", i = t[3] ? t[3].substring(1, t[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : t[3]; return { type: "def", tag: n, raw: t[0], href: r, title: i }; } } table(e) { var _a2; let t = this.rules.block.table.exec(e); if (!t || !this.rules.other.tableDelimiter.test(t[2])) return; let n = J(t[1]), r = t[2].replace(this.rules.other.tableAlignChars, "").split("|"), i = ((_a2 = t[3]) == null ? void 0 : _a2.trim()) ? t[3].replace(this.rules.other.tableRowBlankLine, "").split(` `) : [], s = { type: "table", raw: t[0], header: [], align: [], rows: [] }; if (n.length === r.length) { for (let a of r) this.rules.other.tableAlignRight.test(a) ? s.align.push("right") : this.rules.other.tableAlignCenter.test(a) ? s.align.push("center") : this.rules.other.tableAlignLeft.test(a) ? s.align.push("left") : s.align.push(null); for (let a = 0; a < n.length; a++) s.header.push({ text: n[a], tokens: this.lexer.inline(n[a]), header: true, align: s.align[a] }); for (let a of i) s.rows.push(J(a, s.header.length).map((o, l) => ({ text: o, tokens: this.lexer.inline(o), header: false, align: s.align[l] }))); return s; } } lheading(e) { let t = this.rules.block.lheading.exec(e); if (t) return { type: "heading", raw: t[0], depth: t[2].charAt(0) === "=" ? 1 : 2, text: t[1], tokens: this.lexer.inline(t[1]) }; } paragraph(e) { let t = this.rules.block.paragraph.exec(e); if (t) { let n = t[1].charAt(t[1].length - 1) === ` ` ? t[1].slice(0, -1) : t[1]; return { type: "paragraph", raw: t[0], text: n, tokens: this.lexer.inline(n) }; } } text(e) { let t = this.rules.block.text.exec(e); if (t) return { type: "text", raw: t[0], text: t[0], tokens: this.lexer.inline(t[0]) }; } escape(e) { let t = this.rules.inline.escape.exec(e); if (t) return { type: "escape", raw: t[0], text: t[1] }; } tag(e) { let t = this.rules.inline.tag.exec(e); if (t) return !this.lexer.state.inLink && this.rules.other.startATag.test(t[0]) ? this.lexer.state.inLink = true : this.lexer.state.inLink && this.rules.other.endATag.test(t[0]) && (this.lexer.state.inLink = false), !this.lexer.state.inRawBlock && this.rules.other.startPreScriptTag.test(t[0]) ? this.lexer.state.inRawBlock = true : this.lexer.state.inRawBlock && this.rules.other.endPreScriptTag.test(t[0]) && (this.lexer.state.inRawBlock = false), { type: "html", raw: t[0], inLink: this.lexer.state.inLink, inRawBlock: this.lexer.state.inRawBlock, block: false, text: t[0] }; } link(e) { let t = this.rules.inline.link.exec(e); if (t) { let n = t[2].trim(); if (!this.options.pedantic && this.rules.other.startAngleBracket.test(n)) { if (!this.rules.other.endAngleBracket.test(n)) return; let s = z(n.slice(0, -1), "\\"); if ((n.length - s.length) % 2 === 0) return; } else { let s = de(t[2], "()"); if (s === -2) return; if (s > -1) { let o = (t[0].indexOf("!") === 0 ? 5 : 4) + t[1].length + s; t[2] = t[2].substring(0, s), t[0] = t[0].substring(0, o).trim(), t[3] = ""; } } let r = t[2], i = ""; if (this.options.pedantic) { let s = this.rules.other.pedanticHrefTitle.exec(r); s && (r = s[1], i = s[3]); } else i = t[3] ? t[3].slice(1, -1) : ""; return r = r.trim(), this.rules.other.startAngleBracket.test(r) && (this.options.pedantic && !this.rules.other.endAngleBracket.test(n) ? r = r.slice(1) : r = r.slice(1, -1)), ge(t, { href: r && r.replace(this.rules.inline.anyPunctuation, "$1"), title: i && i.replace(this.rules.inline.anyPunctuation, "$1") }, t[0], this.lexer, this.rules); } } reflink(e, t) { let n; if ((n = this.rules.inline.reflink.exec(e)) || (n = this.rules.inline.nolink.exec(e))) { let r = (n[2] || n[1]).replace(this.rules.other.multipleSpaceGlobal, " "), i = t[r.toLowerCase()]; if (!i) { let s = n[0].charAt(0); return { type: "text", raw: s, text: s }; } return ge(n, i, n[0], this.lexer, this.rules); } } emStrong(e, t, n = "") { let r = this.rules.inline.emStrongLDelim.exec(e); if (!r || r[3] && n.match(this.rules.other.unicodeAlphaNumeric)) return; if (!(r[1] || r[2] || "") || !n || this.rules.inline.punctuation.exec(n)) { let s = [...r[0]].length - 1, a, o, l = s, p = 0, c = r[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; for (c.lastIndex = 0, t = t.slice(-1 * e.length + s); (r = c.exec(t)) != null; ) { if (a = r[1] || r[2] || r[3] || r[4] || r[5] || r[6], !a) continue; if (o = [...a].length, r[3] || r[4]) { l += o; continue; } else if ((r[5] || r[6]) && s % 3 && !((s + o) % 3)) { p += o; continue; } if (l -= o, l > 0) continue; o = Math.min(o, o + l + p); let g = [...r[0]][0].length, h = e.slice(0, s + r.index + g + o); if (Math.min(s, o) % 2) { let f = h.slice(1, -1); return { type: "em", raw: h, text: f, tokens: this.lexer.inlineTokens(f) }; } let R = h.slice(2, -2); return { type: "strong", raw: h, text: R, tokens: this.lexer.inlineTokens(R) }; } } } codespan(e) { let t = this.rules.inline.code.exec(e); if (t) { let n = t[2].replace(this.rules.other.newLineCharGlobal, " "), r = this.rules.other.nonSpaceChar.test(n), i = this.rules.other.startingSpaceChar.test(n) && this.rules.other.endingSpaceChar.test(n); return r && i && (n = n.substring(1, n.length - 1)), { type: "codespan", raw: t[0], text: n }; } } br(e) { let t = this.rules.inline.br.exec(e); if (t) return { type: "br", raw: t[0] }; } del(e) { let t = this.rules.inline.del.exec(e); if (t) return { type: "del", raw: t[0], text: t[2], tokens: this.lexer.inlineTokens(t[2]) }; } autolink(e) { let t = this.rules.inline.autolink.exec(e); if (t) { let n, r; return t[2] === "@" ? (n = t[1], r = "mailto:" + n) : (n = t[1], r = n), { type: "link", raw: t[0], text: n, href: r, tokens: [{ type: "text", raw: n, text: n }] }; } } url(e) { var _a2; let t; if (t = this.rules.inline.url.exec(e)) { let n, r; if (t[2] === "@") n = t[0], r = "mailto:" + n; else { let i; do i = t[0], t[0] = ((_a2 = this.rules.inline._backpedal.exec(t[0])) == null ? void 0 : _a2[0]) ?? ""; while (i !== t[0]); n = t[0], t[1] === "www." ? r = "http://" + t[0] : r = t[0]; } return { type: "link", raw: t[0], text: n, href: r, tokens: [{ type: "text", raw: n, text: n }] }; } } inlineText(e) { let t = this.rules.inline.text.exec(e); if (t) { let n = this.lexer.state.inRawBlock; return { type: "text", raw: t[0], text: t[0], escaped: n }; } } }; var x = class u { constructor(e) { __publicField(this, "tokens"); __publicField(this, "options"); __publicField(this, "state"); __publicField(this, "inlineQueue"); __publicField(this, "tokenizer"); this.tokens = [], this.tokens.links = /* @__PURE__ */ Object.create(null), this.options = e || T, this.options.tokenizer = this.options.tokenizer || new y(), this.tokenizer = this.options.tokenizer, this.tokenizer.options = this.options, this.tokenizer.lexer = this, this.inlineQueue = [], this.state = { inLink: false, inRawBlock: false, top: true }; let t = { other: m, block: E.normal, inline: M.normal }; this.options.pedantic ? (t.block = E.pedantic, t.inline = M.pedantic) : this.options.gfm && (t.block = E.gfm, this.options.breaks ? t.inline = M.breaks : t.inline = M.gfm), this.tokenizer.rules = t; } static get rules() { return { block: E, inline: M }; } static lex(e, t) { return new u(t).lex(e); } static lexInline(e, t) { return new u(t).inlineTokens(e); } lex(e) { e = e.replace(m.carriageReturn, ` `), this.blockTokens(e, this.tokens); for (let t = 0; t < this.inlineQueue.length; t++) { let n = this.inlineQueue[t]; this.inlineTokens(n.src, n.tokens); } return this.inlineQueue = [], this.tokens; } blockTokens(e, t = [], n = false) { var _a2, _b, _c; for (this.options.pedantic && (e = e.replace(m.tabCharGlobal, " ").replace(m.spaceLine, "")); e; ) { let r; if ((_b = (_a2 = this.options.extensions) == null ? void 0 : _a2.block) == null ? void 0 : _b.some((s) => (r = s.call({ lexer: this }, e, t)) ? (e = e.substring(r.raw.length), t.push(r), true) : false)) continue; if (r = this.tokenizer.space(e)) { e = e.substring(r.raw.length); let s = t.at(-1); r.raw.length === 1 && s !== void 0 ? s.raw += ` ` : t.push(r); continue; } if (r = this.tokenizer.code(e)) { e = e.substring(r.raw.length); let s = t.at(-1); (s == null ? void 0 : s.type) === "paragraph" || (s == null ? void 0 : s.type) === "text" ? (s.raw += (s.raw.endsWith(` `) ? "" : ` `) + r.raw, s.text += ` ` + r.text, this.inlineQueue.at(-1).src = s.text) : t.push(r); continue; } if (r = this.tokenizer.fences(e)) { e = e.substring(r.raw.length), t.push(r); continue; } if (r = this.tokenizer.heading(e)) { e = e.substring(r.raw.length), t.push(r); continue; } if (r = this.tokenizer.hr(e)) { e = e.substring(r.raw.length), t.push(r); continue; } if (r = this.tokenizer.blockquote(e)) { e = e.substring(r.raw.length), t.push(r); continue; } if (r = this.tokenizer.list(e)) { e = e.substring(r.raw.length), t.push(r); continue; } if (r = this.tokenizer.html(e)) { e = e.substring(r.raw.length), t.push(r); continue; } if (r = this.tokenizer.def(e)) { e = e.substring(r.raw.length); let s = t.at(-1); (s == null ? void 0 : s.type) === "paragraph" || (s == null ? void 0 : s.type) === "text" ? (s.raw += (s.raw.endsWith(` `) ? "" : ` `) + r.raw, s.text += ` ` + r.raw, this.inlineQueue.at(-1).src = s.text) : this.tokens.links[r.tag] || (this.tokens.links[r.tag] = { href: r.href, title: r.title }, t.push(r)); continue; } if (r = this.tokenizer.table(e)) { e = e.substring(r.raw.length), t.push(r); continue; } if (r = this.tokenizer.lheading(e)) { e = e.substring(r.raw.length), t.push(r); continue; } let i = e; if ((_c = this.options.extensions) == null ? void 0 : _c.startBlock) { let s = 1 / 0, a = e.slice(1), o; this.options.extensions.startBlock.forEach((l) => { o = l.call({ lexer: this }, a), typeof o == "number" && o >= 0 && (s = Math.min(s, o)); }), s < 1 / 0 && s >= 0 && (i = e.substring(0, s + 1)); } if (this.state.top && (r = this.tokenizer.paragraph(i))) { let s = t.at(-1); n && (s == null ? void 0 : s.type) === "paragraph" ? (s.raw += (s.raw.endsWith(` `) ? "" : ` `) + r.raw, s.text += ` ` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s.text) : t.push(r), n = i.length !== e.length, e = e.substring(r.raw.length); continue; } if (r = this.tokenizer.text(e)) { e = e.substring(r.raw.length); let s = t.at(-1); (s == null ? void 0 : s.type) === "text" ? (s.raw += (s.raw.endsWith(` `) ? "" : ` `) + r.raw, s.text += ` ` + r.text, this.inlineQueue.pop(), this.inlineQueue.at(-1).src = s.text) : t.push(r); continue; } if (e) { let s = "Infinite loop on byte: " + e.charCodeAt(0); if (this.options.silent) { console.error(s); break; } else throw new Error(s); } } return this.state.top = true, t; } inline(e, t = []) { return this.inlineQueue.push({ src: e, tokens: t }), t; } inlineTokens(e, t = []) { var _a2, _b, _c, _d, _e2; let n = e, r = null; if (this.tokens.links) { let o = Object.keys(this.tokens.links); if (o.length > 0) for (; (r = this.tokenizer.rules.inline.reflinkSearch.exec(n)) != null; ) o.includes(r[0].slice(r[0].lastIndexOf("[") + 1, -1)) && (n = n.slice(0, r.index) + "[" + "a".repeat(r[0].length - 2) + "]" + n.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); } for (; (r = this.tokenizer.rules.inline.anyPunctuation.exec(n)) != null; ) n = n.slice(0, r.index) + "++" + n.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); let i; for (; (r = this.tokenizer.rules.inline.blockSkip.exec(n)) != null; ) i = r[2] ? r[2].length : 0, n = n.slice(0, r.index + i) + "[" + "a".repeat(r[0].length - i - 2) + "]" + n.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); n = ((_b = (_a2 = this.options.hooks) == null ? void 0 : _a2.emStrongMask) == null ? void 0 : _b.call({ lexer: this }, n)) ?? n; let s = false, a = ""; for (; e; ) { s || (a = ""), s = false; let o; if ((_d = (_c = this.options.extensions) == null ? void 0 : _c.inline) == null ? void 0 : _d.some((p) => (o = p.call({ lexer: this }, e, t)) ? (e = e.substring(o.raw.length), t.push(o), true) : false)) continue; if (o = this.tokenizer.escape(e)) { e = e.substring(o.raw.length), t.push(o); continue; } if (o = this.tokenizer.tag(e)) { e = e.substring(o.raw.length), t.push(o); continue; } if (o = this.tokenizer.link(e)) { e = e.substring(o.raw.length), t.push(o); continue; } if (o = this.tokenizer.reflink(e, this.tokens.links)) { e = e.substring(o.raw.length); let p = t.at(-1); o.type === "text" && (p == null ? void 0 : p.type) === "text" ? (p.raw += o.raw, p.text += o.text) : t.push(o); continue; } if (o = this.tokenizer.emStrong(e, n, a)) { e = e.substring(o.raw.length), t.push(o); continue; } if (o = this.tokenizer.codespan(e)) { e = e.substring(o.raw.length), t.push(o); continue; } if (o = this.tokenizer.br(e)) { e = e.substring(o.raw.length), t.push(o); continue; } if (o = this.tokenizer.del(e)) { e = e.substring(o.raw.length), t.push(o); continue; } if (o = this.tokenizer.autolink(e)) { e = e.substring(o.raw.length), t.push(o); continue; } if (!this.state.inLink && (o = this.tokenizer.url(e))) { e = e.substring(o.raw.length), t.push(o); continue; } let l = e; if ((_e2 = this.options.extensions) == null ? void 0 : _e2.startInline) { let p = 1 / 0, c = e.slice(1), g; this.options.extensions.startInline.forEach((h) => { g = h.call({ lexer: this }, c), typeof g == "number" && g >= 0 && (p = Math.min(p, g)); }), p < 1 / 0 && p >= 0 && (l = e.substring(0, p + 1)); } if (o = this.tokenizer.inlineText(l)) { e = e.substring(o.raw.length), o.raw.slice(-1) !== "_" && (a = o.raw.slice(-1)), s = true; let p = t.at(-1); (p == null ? void 0 : p.type) === "text" ? (p.raw += o.raw, p.text += o.text) : t.push(o); continue; } if (e) { let p = "Infinite loop on byte: " + e.charCodeAt(0); if (this.options.silent) { console.error(p); break; } else throw new Error(p); } } return t; } }; var P = class { constructor(e) { __publicField(this, "options"); __publicField(this, "parser"); this.options = e || T; } space(e) { return ""; } code({ text: e, lang: t, escaped: n }) { var _a2; let r = (_a2 = (t || "").match(m.notSpaceStart)) == null ? void 0 : _a2[0], i = e.replace(m.endingNewline, "") + ` `; return r ? '
' + (n ? i : w(i, true)) + `
` : "
" + (n ? i : w(i, true)) + `
`; } blockquote({ tokens: e }) { return `
${this.parser.parse(e)}
`; } html({ text: e }) { return e; } def(e) { return ""; } heading({ tokens: e, depth: t }) { return `${this.parser.parseInline(e)} `; } hr(e) { return `
`; } list(e) { let t = e.ordered, n = e.start, r = ""; for (let a = 0; a < e.items.length; a++) { let o = e.items[a]; r += this.listitem(o); } let i = t ? "ol" : "ul", s = t && n !== 1 ? ' start="' + n + '"' : ""; return "<" + i + s + `> ` + r + " `; } listitem(e) { return `
  • ${this.parser.parse(e.tokens)}
  • `; } checkbox({ checked: e }) { return " '; } paragraph({ tokens: e }) { return `

    ${this.parser.parseInline(e)}

    `; } table(e) { let t = "", n = ""; for (let i = 0; i < e.header.length; i++) n += this.tablecell(e.header[i]); t += this.tablerow({ text: n }); let r = ""; for (let i = 0; i < e.rows.length; i++) { let s = e.rows[i]; n = ""; for (let a = 0; a < s.length; a++) n += this.tablecell(s[a]); r += this.tablerow({ text: n }); } return r && (r = `${r}`), ` ` + t + ` ` + r + `
    `; } tablerow({ text: e }) { return ` ${e} `; } tablecell(e) { let t = this.parser.parseInline(e.tokens), n = e.header ? "th" : "td"; return (e.align ? `<${n} align="${e.align}">` : `<${n}>`) + t + ` `; } strong({ tokens: e }) { return `${this.parser.parseInline(e)}`; } em({ tokens: e }) { return `${this.parser.parseInline(e)}`; } codespan({ text: e }) { return `${w(e, true)}`; } br(e) { return "
    "; } del({ tokens: e }) { return `${this.parser.parseInline(e)}`; } link({ href: e, title: t, tokens: n }) { let r = this.parser.parseInline(n), i = X(e); if (i === null) return r; e = i; let s = '
    ", s; } image({ href: e, title: t, text: n, tokens: r }) { r && (n = this.parser.parseInline(r, this.parser.textRenderer)); let i = X(e); if (i === null) return w(n); e = i; let s = `${n} { let a = i[s].flat(1 / 0); n = n.concat(this.walkTokens(a, t)); }) : i.tokens && (n = n.concat(this.walkTokens(i.tokens, t))); } } return n; } use(...e) { let t = this.defaults.extensions || { renderers: {}, childTokens: {} }; return e.forEach((n) => { let r = { ...n }; if (r.async = this.defaults.async || r.async || false, n.extensions && (n.extensions.forEach((i) => { if (!i.name) throw new Error("extension name required"); if ("renderer" in i) { let s = t.renderers[i.name]; s ? t.renderers[i.name] = function(...a) { let o = i.renderer.apply(this, a); return o === false && (o = s.apply(this, a)), o; } : t.renderers[i.name] = i.renderer; } if ("tokenizer" in i) { if (!i.level || i.level !== "block" && i.level !== "inline") throw new Error("extension level must be 'block' or 'inline'"); let s = t[i.level]; s ? s.unshift(i.tokenizer) : t[i.level] = [i.tokenizer], i.start && (i.level === "block" ? t.startBlock ? t.startBlock.push(i.start) : t.startBlock = [i.start] : i.level === "inline" && (t.startInline ? t.startInline.push(i.start) : t.startInline = [i.start])); } "childTokens" in i && i.childTokens && (t.childTokens[i.name] = i.childTokens); }), r.extensions = t), n.renderer) { let i = this.defaults.renderer || new P(this.defaults); for (let s in n.renderer) { if (!(s in i)) throw new Error(`renderer '${s}' does not exist`); if (["options", "parser"].includes(s)) continue; let a = s, o = n.renderer[a], l = i[a]; i[a] = (...p) => { let c = o.apply(i, p); return c === false && (c = l.apply(i, p)), c || ""; }; } r.renderer = i; } if (n.tokenizer) { let i = this.defaults.tokenizer || new y(this.defaults); for (let s in n.tokenizer) { if (!(s in i)) throw new Error(`tokenizer '${s}' does not exist`); if (["options", "rules", "lexer"].includes(s)) continue; let a = s, o = n.tokenizer[a], l = i[a]; i[a] = (...p) => { let c = o.apply(i, p); return c === false && (c = l.apply(i, p)), c; }; } r.tokenizer = i; } if (n.hooks) { let i = this.defaults.hooks || new S(); for (let s in n.hooks) { if (!(s in i)) throw new Error(`hook '${s}' does not exist`); if (["options", "block"].includes(s)) continue; let a = s, o = n.hooks[a], l = i[a]; S.passThroughHooks.has(s) ? i[a] = (p) => { if (this.defaults.async && S.passThroughHooksRespectAsync.has(s)) return (async () => { let g = await o.call(i, p); return l.call(i, g); })(); let c = o.call(i, p); return l.call(i, c); } : i[a] = (...p) => { if (this.defaults.async) return (async () => { let g = await o.apply(i, p); return g === false && (g = await l.apply(i, p)), g; })(); let c = o.apply(i, p); return c === false && (c = l.apply(i, p)), c; }; } r.hooks = i; } if (n.walkTokens) { let i = this.defaults.walkTokens, s = n.walkTokens; r.walkTokens = function(a) { let o = []; return o.push(s.call(this, a)), i && (o = o.concat(i.call(this, a))), o; }; } this.defaults = { ...this.defaults, ...r }; }), this; } setOptions(e) { return this.defaults = { ...this.defaults, ...e }, this; } lexer(e, t) { return x.lex(e, t ?? this.defaults); } parser(e, t) { return b.parse(e, t ?? this.defaults); } parseMarkdown(e) { return (n, r) => { let i = { ...r }, s = { ...this.defaults, ...i }, a = this.onError(!!s.silent, !!s.async); if (this.defaults.async === true && i.async === false) return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); if (typeof n > "u" || n === null) return a(new Error("marked(): input parameter is undefined or null")); if (typeof n != "string") return a(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(n) + ", string expected")); if (s.hooks && (s.hooks.options = s, s.hooks.block = e), s.async) return (async () => { let o = s.hooks ? await s.hooks.preprocess(n) : n, p = await (s.hooks ? await s.hooks.provideLexer() : e ? x.lex : x.lexInline)(o, s), c = s.hooks ? await s.hooks.processAllTokens(p) : p; s.walkTokens && await Promise.all(this.walkTokens(c, s.walkTokens)); let h = await (s.hooks ? await s.hooks.provideParser() : e ? b.parse : b.parseInline)(c, s); return s.hooks ? await s.hooks.postprocess(h) : h; })().catch(a); try { s.hooks && (n = s.hooks.preprocess(n)); let l = (s.hooks ? s.hooks.provideLexer() : e ? x.lex : x.lexInline)(n, s); s.hooks && (l = s.hooks.processAllTokens(l)), s.walkTokens && this.walkTokens(l, s.walkTokens); let c = (s.hooks ? s.hooks.provideParser() : e ? b.parse : b.parseInline)(l, s); return s.hooks && (c = s.hooks.postprocess(c)), c; } catch (o) { return a(o); } }; } onError(e, t) { return (n) => { if (n.message += ` Please report this to https://github.com/markedjs/marked.`, e) { let r = "

    An error occurred:

    " + w(n.message + "", true) + "
    "; return t ? Promise.resolve(r) : r; } if (t) return Promise.reject(n); throw n; }; } }; var _ = new B(); function d(u3, e) { return _.parse(u3, e); } d.options = d.setOptions = function(u3) { return _.setOptions(u3), d.defaults = _.defaults, Z(d.defaults), d; }; d.getDefaults = L; d.defaults = T; d.use = function(...u3) { return _.use(...u3), d.defaults = _.defaults, Z(d.defaults), d; }; d.walkTokens = function(u3, e) { return _.walkTokens(u3, e); }; d.parseInline = _.parseInline; d.Parser = b; d.parser = b.parse; d.Renderer = P; d.TextRenderer = $; d.Lexer = x; d.lexer = x.lex; d.Tokenizer = y; d.Hooks = S; d.parse = d; d.options; d.setOptions; d.use; d.walkTokens; d.parseInline; b.parse; x.lex; function getDefaultExportFromCjs(x2) { return x2 && x2.__esModule && Object.prototype.hasOwnProperty.call(x2, "default") ? x2["default"] : x2; } function deepFreeze(obj) { if (obj instanceof Map) { obj.clear = obj.delete = obj.set = function() { throw new Error("map is read-only"); }; } else if (obj instanceof Set) { obj.add = obj.clear = obj.delete = function() { throw new Error("set is read-only"); }; } Object.freeze(obj); Object.getOwnPropertyNames(obj).forEach((name) => { const prop = obj[name]; const type = typeof prop; if ((type === "object" || type === "function") && !Object.isFrozen(prop)) { deepFreeze(prop); } }); return obj; } class Response { /** * @param {CompiledMode} mode */ constructor(mode) { if (mode.data === void 0) mode.data = {}; this.data = mode.data; this.isMatchIgnored = false; } ignoreMatch() { this.isMatchIgnored = true; } } function escapeHTML(value) { return value.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); } function inherit$1(original, ...objects) { const result = /* @__PURE__ */ Object.create(null); for (const key in original) { result[key] = original[key]; } objects.forEach(function(obj) { for (const key in obj) { result[key] = obj[key]; } }); return ( /** @type {T} */ result ); } const SPAN_CLOSE = ""; const emitsWrappingTags = (node) => { return !!node.scope; }; const scopeToCSSClass = (name, { prefix }) => { if (name.startsWith("language:")) { return name.replace("language:", "language-"); } if (name.includes(".")) { const pieces = name.split("."); return [ `${prefix}${pieces.shift()}`, ...pieces.map((x2, i) => `${x2}${"_".repeat(i + 1)}`) ].join(" "); } return `${prefix}${name}`; }; class HTMLRenderer { /** * Creates a new HTMLRenderer * * @param {Tree} parseTree - the parse tree (must support `walk` API) * @param {{classPrefix: string}} options */ constructor(parseTree, options) { this.buffer = ""; this.classPrefix = options.classPrefix; parseTree.walk(this); } /** * Adds texts to the output stream * * @param {string} text */ addText(text) { this.buffer += escapeHTML(text); } /** * Adds a node open to the output stream (if needed) * * @param {Node} node */ openNode(node) { if (!emitsWrappingTags(node)) return; const className = scopeToCSSClass( node.scope, { prefix: this.classPrefix } ); this.span(className); } /** * Adds a node close to the output stream (if needed) * * @param {Node} node */ closeNode(node) { if (!emitsWrappingTags(node)) return; this.buffer += SPAN_CLOSE; } /** * returns the accumulated buffer */ value() { return this.buffer; } // helpers /** * Builds a span element * * @param {string} className */ span(className) { this.buffer += ``; } } const newNode = (opts = {}) => { const result = { children: [] }; Object.assign(result, opts); return result; }; class TokenTree { constructor() { this.rootNode = newNode(); this.stack = [this.rootNode]; } get top() { return this.stack[this.stack.length - 1]; } get root() { return this.rootNode; } /** @param {Node} node */ add(node) { this.top.children.push(node); } /** @param {string} scope */ openNode(scope) { const node = newNode({ scope }); this.add(node); this.stack.push(node); } closeNode() { if (this.stack.length > 1) { return this.stack.pop(); } return void 0; } closeAllNodes() { while (this.closeNode()) ; } toJSON() { return JSON.stringify(this.rootNode, null, 4); } /** * @typedef { import("./html_renderer").Renderer } Renderer * @param {Renderer} builder */ walk(builder) { return this.constructor._walk(builder, this.rootNode); } /** * @param {Renderer} builder * @param {Node} node */ static _walk(builder, node) { if (typeof node === "string") { builder.addText(node); } else if (node.children) { builder.openNode(node); node.children.forEach((child) => this._walk(builder, child)); builder.closeNode(node); } return builder; } /** * @param {Node} node */ static _collapse(node) { if (typeof node === "string") return; if (!node.children) return; if (node.children.every((el) => typeof el === "string")) { node.children = [node.children.join("")]; } else { node.children.forEach((child) => { TokenTree._collapse(child); }); } } } class TokenTreeEmitter extends TokenTree { /** * @param {*} options */ constructor(options) { super(); this.options = options; } /** * @param {string} text */ addText(text) { if (text === "") { return; } this.add(text); } /** @param {string} scope */ startScope(scope) { this.openNode(scope); } endScope() { this.closeNode(); } /** * @param {Emitter & {root: DataNode}} emitter * @param {string} name */ __addSublanguage(emitter, name) { const node = emitter.root; if (name) node.scope = `language:${name}`; this.add(node); } toHTML() { const renderer = new HTMLRenderer(this, this.options); return renderer.value(); } finalize() { this.closeAllNodes(); return true; } } function source(re2) { if (!re2) return null; if (typeof re2 === "string") return re2; return re2.source; } function lookahead(re2) { return concat("(?=", re2, ")"); } function anyNumberOfTimes(re2) { return concat("(?:", re2, ")*"); } function optional(re2) { return concat("(?:", re2, ")?"); } function concat(...args) { const joined = args.map((x2) => source(x2)).join(""); return joined; } function stripOptionsFromArgs(args) { const opts = args[args.length - 1]; if (typeof opts === "object" && opts.constructor === Object) { args.splice(args.length - 1, 1); return opts; } else { return {}; } } function either(...args) { const opts = stripOptionsFromArgs(args); const joined = "(" + (opts.capture ? "" : "?:") + args.map((x2) => source(x2)).join("|") + ")"; return joined; } function countMatchGroups(re2) { return new RegExp(re2.toString() + "|").exec("").length - 1; } function startsWith(re2, lexeme) { const match = re2 && re2.exec(lexeme); return match && match.index === 0; } const BACKREF_RE = /\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./; function _rewriteBackreferences(regexps, { joinWith }) { let numCaptures = 0; return regexps.map((regex) => { numCaptures += 1; const offset = numCaptures; let re2 = source(regex); let out = ""; while (re2.length > 0) { const match = BACKREF_RE.exec(re2); if (!match) { out += re2; break; } out += re2.substring(0, match.index); re2 = re2.substring(match.index + match[0].length); if (match[0][0] === "\\" && match[1]) { out += "\\" + String(Number(match[1]) + offset); } else { out += match[0]; if (match[0] === "(") { numCaptures++; } } } return out; }).map((re2) => `(${re2})`).join(joinWith); } const MATCH_NOTHING_RE = /\b\B/; const IDENT_RE = "[a-zA-Z]\\w*"; const UNDERSCORE_IDENT_RE = "[a-zA-Z_]\\w*"; const NUMBER_RE = "\\b\\d+(\\.\\d+)?"; const C_NUMBER_RE = "(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)"; const BINARY_NUMBER_RE = "\\b(0b[01]+)"; const RE_STARTERS_RE = "!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~"; const SHEBANG = (opts = {}) => { const beginShebang = /^#![ ]*\//; if (opts.binary) { opts.begin = concat( beginShebang, /.*\b/, opts.binary, /\b.*/ ); } return inherit$1({ scope: "meta", begin: beginShebang, end: /$/, relevance: 0, /** @type {ModeCallback} */ "on:begin": (m2, resp) => { if (m2.index !== 0) resp.ignoreMatch(); } }, opts); }; const BACKSLASH_ESCAPE = { begin: "\\\\[\\s\\S]", relevance: 0 }; const APOS_STRING_MODE = { scope: "string", begin: "'", end: "'", illegal: "\\n", contains: [BACKSLASH_ESCAPE] }; const QUOTE_STRING_MODE = { scope: "string", begin: '"', end: '"', illegal: "\\n", contains: [BACKSLASH_ESCAPE] }; const PHRASAL_WORDS_MODE = { begin: /\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ }; const COMMENT = function(begin, end, modeOptions = {}) { const mode = inherit$1( { scope: "comment", begin, end, contains: [] }, modeOptions ); mode.contains.push({ scope: "doctag", // hack to avoid the space from being included. the space is necessary to // match here to prevent the plain text rule below from gobbling up doctags begin: "[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", end: /(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/, excludeBegin: true, relevance: 0 }); const ENGLISH_WORD = either( // list of common 1 and 2 letter words in English "I", "a", "is", "so", "us", "to", "at", "if", "in", "it", "on", // note: this is not an exhaustive list of contractions, just popular ones /[A-Za-z]+['](d|ve|re|ll|t|s|n)/, // contractions - can't we'd they're let's, etc /[A-Za-z]+[-][a-z]+/, // `no-way`, etc. /[A-Za-z][a-z]{2,}/ // allow capitalized words at beginning of sentences ); mode.contains.push( { // TODO: how to include ", (, ) without breaking grammars that use these for // comment delimiters? // begin: /[ ]+([()"]?([A-Za-z'-]{3,}|is|a|I|so|us|[tT][oO]|at|if|in|it|on)[.]?[()":]?([.][ ]|[ ]|\))){3}/ // --- // this tries to find sequences of 3 english words in a row (without any // "programming" type syntax) this gives us a strong signal that we've // TRULY found a comment - vs perhaps scanning with the wrong language. // It's possible to find something that LOOKS like the start of the // comment - but then if there is no readable text - good chance it is a // false match and not a comment. // // for a visual example please see: // https://github.com/highlightjs/highlight.js/issues/2827 begin: concat( /[ ]+/, // necessary to prevent us gobbling up doctags like /* @author Bob Mcgill */ "(", ENGLISH_WORD, /[.]?[:]?([.][ ]|[ ])/, "){3}" ) // look for 3 words in a row } ); return mode; }; const C_LINE_COMMENT_MODE = COMMENT("//", "$"); const C_BLOCK_COMMENT_MODE = COMMENT("/\\*", "\\*/"); const HASH_COMMENT_MODE = COMMENT("#", "$"); const NUMBER_MODE = { scope: "number", begin: NUMBER_RE, relevance: 0 }; const C_NUMBER_MODE = { scope: "number", begin: C_NUMBER_RE, relevance: 0 }; const BINARY_NUMBER_MODE = { scope: "number", begin: BINARY_NUMBER_RE, relevance: 0 }; const REGEXP_MODE = { scope: "regexp", begin: /\/(?=[^/\n]*\/)/, end: /\/[gimuy]*/, contains: [ BACKSLASH_ESCAPE, { begin: /\[/, end: /\]/, relevance: 0, contains: [BACKSLASH_ESCAPE] } ] }; const TITLE_MODE = { scope: "title", begin: IDENT_RE, relevance: 0 }; const UNDERSCORE_TITLE_MODE = { scope: "title", begin: UNDERSCORE_IDENT_RE, relevance: 0 }; const METHOD_GUARD = { // excludes method names from keyword processing begin: "\\.\\s*" + UNDERSCORE_IDENT_RE, relevance: 0 }; const END_SAME_AS_BEGIN = function(mode) { return Object.assign( mode, { /** @type {ModeCallback} */ "on:begin": (m2, resp) => { resp.data._beginMatch = m2[1]; }, /** @type {ModeCallback} */ "on:end": (m2, resp) => { if (resp.data._beginMatch !== m2[1]) resp.ignoreMatch(); } } ); }; var MODES = /* @__PURE__ */ Object.freeze({ __proto__: null, APOS_STRING_MODE, BACKSLASH_ESCAPE, BINARY_NUMBER_MODE, BINARY_NUMBER_RE, COMMENT, C_BLOCK_COMMENT_MODE, C_LINE_COMMENT_MODE, C_NUMBER_MODE, C_NUMBER_RE, END_SAME_AS_BEGIN, HASH_COMMENT_MODE, IDENT_RE, MATCH_NOTHING_RE, METHOD_GUARD, NUMBER_MODE, NUMBER_RE, PHRASAL_WORDS_MODE, QUOTE_STRING_MODE, REGEXP_MODE, RE_STARTERS_RE, SHEBANG, TITLE_MODE, UNDERSCORE_IDENT_RE, UNDERSCORE_TITLE_MODE }); function skipIfHasPrecedingDot(match, response) { const before = match.input[match.index - 1]; if (before === ".") { response.ignoreMatch(); } } function scopeClassName(mode, _parent) { if (mode.className !== void 0) { mode.scope = mode.className; delete mode.className; } } function beginKeywords(mode, parent) { if (!parent) return; if (!mode.beginKeywords) return; mode.begin = "\\b(" + mode.beginKeywords.split(" ").join("|") + ")(?!\\.)(?=\\b|\\s)"; mode.__beforeBegin = skipIfHasPrecedingDot; mode.keywords = mode.keywords || mode.beginKeywords; delete mode.beginKeywords; if (mode.relevance === void 0) mode.relevance = 0; } function compileIllegal(mode, _parent) { if (!Array.isArray(mode.illegal)) return; mode.illegal = either(...mode.illegal); } function compileMatch(mode, _parent) { if (!mode.match) return; if (mode.begin || mode.end) throw new Error("begin & end are not supported with match"); mode.begin = mode.match; delete mode.match; } function compileRelevance(mode, _parent) { if (mode.relevance === void 0) mode.relevance = 1; } const beforeMatchExt = (mode, parent) => { if (!mode.beforeMatch) return; if (mode.starts) throw new Error("beforeMatch cannot be used with starts"); const originalMode = Object.assign({}, mode); Object.keys(mode).forEach((key) => { delete mode[key]; }); mode.keywords = originalMode.keywords; mode.begin = concat(originalMode.beforeMatch, lookahead(originalMode.begin)); mode.starts = { relevance: 0, contains: [ Object.assign(originalMode, { endsParent: true }) ] }; mode.relevance = 0; delete originalMode.beforeMatch; }; const COMMON_KEYWORDS = [ "of", "and", "for", "in", "not", "or", "if", "then", "parent", // common variable name "list", // common variable name "value" // common variable name ]; const DEFAULT_KEYWORD_SCOPE = "keyword"; function compileKeywords(rawKeywords, caseInsensitive, scopeName = DEFAULT_KEYWORD_SCOPE) { const compiledKeywords = /* @__PURE__ */ Object.create(null); if (typeof rawKeywords === "string") { compileList(scopeName, rawKeywords.split(" ")); } else if (Array.isArray(rawKeywords)) { compileList(scopeName, rawKeywords); } else { Object.keys(rawKeywords).forEach(function(scopeName2) { Object.assign( compiledKeywords, compileKeywords(rawKeywords[scopeName2], caseInsensitive, scopeName2) ); }); } return compiledKeywords; function compileList(scopeName2, keywordList) { if (caseInsensitive) { keywordList = keywordList.map((x2) => x2.toLowerCase()); } keywordList.forEach(function(keyword) { const pair = keyword.split("|"); compiledKeywords[pair[0]] = [scopeName2, scoreForKeyword(pair[0], pair[1])]; }); } } function scoreForKeyword(keyword, providedScore) { if (providedScore) { return Number(providedScore); } return commonKeyword(keyword) ? 0 : 1; } function commonKeyword(keyword) { return COMMON_KEYWORDS.includes(keyword.toLowerCase()); } const seenDeprecations = {}; const error = (message) => { console.error(message); }; const warn = (message, ...args) => { console.log(`WARN: ${message}`, ...args); }; const deprecated = (version2, message) => { if (seenDeprecations[`${version2}/${message}`]) return; console.log(`Deprecated as of ${version2}. ${message}`); seenDeprecations[`${version2}/${message}`] = true; }; const MultiClassError = new Error(); function remapScopeNames(mode, regexes, { key }) { let offset = 0; const scopeNames = mode[key]; const emit = {}; const positions = {}; for (let i = 1; i <= regexes.length; i++) { positions[i + offset] = scopeNames[i]; emit[i + offset] = true; offset += countMatchGroups(regexes[i - 1]); } mode[key] = positions; mode[key]._emit = emit; mode[key]._multi = true; } function beginMultiClass(mode) { if (!Array.isArray(mode.begin)) return; if (mode.skip || mode.excludeBegin || mode.returnBegin) { error("skip, excludeBegin, returnBegin not compatible with beginScope: {}"); throw MultiClassError; } if (typeof mode.beginScope !== "object" || mode.beginScope === null) { error("beginScope must be object"); throw MultiClassError; } remapScopeNames(mode, mode.begin, { key: "beginScope" }); mode.begin = _rewriteBackreferences(mode.begin, { joinWith: "" }); } function endMultiClass(mode) { if (!Array.isArray(mode.end)) return; if (mode.skip || mode.excludeEnd || mode.returnEnd) { error("skip, excludeEnd, returnEnd not compatible with endScope: {}"); throw MultiClassError; } if (typeof mode.endScope !== "object" || mode.endScope === null) { error("endScope must be object"); throw MultiClassError; } remapScopeNames(mode, mode.end, { key: "endScope" }); mode.end = _rewriteBackreferences(mode.end, { joinWith: "" }); } function scopeSugar(mode) { if (mode.scope && typeof mode.scope === "object" && mode.scope !== null) { mode.beginScope = mode.scope; delete mode.scope; } } function MultiClass(mode) { scopeSugar(mode); if (typeof mode.beginScope === "string") { mode.beginScope = { _wrap: mode.beginScope }; } if (typeof mode.endScope === "string") { mode.endScope = { _wrap: mode.endScope }; } beginMultiClass(mode); endMultiClass(mode); } function compileLanguage(language) { function langRe(value, global) { return new RegExp( source(value), "m" + (language.case_insensitive ? "i" : "") + (language.unicodeRegex ? "u" : "") + (global ? "g" : "") ); } class MultiRegex { constructor() { this.matchIndexes = {}; this.regexes = []; this.matchAt = 1; this.position = 0; } // @ts-ignore addRule(re2, opts) { opts.position = this.position++; this.matchIndexes[this.matchAt] = opts; this.regexes.push([opts, re2]); this.matchAt += countMatchGroups(re2) + 1; } compile() { if (this.regexes.length === 0) { this.exec = () => null; } const terminators = this.regexes.map((el) => el[1]); this.matcherRe = langRe(_rewriteBackreferences(terminators, { joinWith: "|" }), true); this.lastIndex = 0; } /** @param {string} s */ exec(s) { this.matcherRe.lastIndex = this.lastIndex; const match = this.matcherRe.exec(s); if (!match) { return null; } const i = match.findIndex((el, i2) => i2 > 0 && el !== void 0); const matchData = this.matchIndexes[i]; match.splice(0, i); return Object.assign(match, matchData); } } class ResumableMultiRegex { constructor() { this.rules = []; this.multiRegexes = []; this.count = 0; this.lastIndex = 0; this.regexIndex = 0; } // @ts-ignore getMatcher(index) { if (this.multiRegexes[index]) return this.multiRegexes[index]; const matcher = new MultiRegex(); this.rules.slice(index).forEach(([re2, opts]) => matcher.addRule(re2, opts)); matcher.compile(); this.multiRegexes[index] = matcher; return matcher; } resumingScanAtSamePosition() { return this.regexIndex !== 0; } considerAll() { this.regexIndex = 0; } // @ts-ignore addRule(re2, opts) { this.rules.push([re2, opts]); if (opts.type === "begin") this.count++; } /** @param {string} s */ exec(s) { const m2 = this.getMatcher(this.regexIndex); m2.lastIndex = this.lastIndex; let result = m2.exec(s); if (this.resumingScanAtSamePosition()) { if (result && result.index === this.lastIndex) ; else { const m22 = this.getMatcher(0); m22.lastIndex = this.lastIndex + 1; result = m22.exec(s); } } if (result) { this.regexIndex += result.position + 1; if (this.regexIndex === this.count) { this.considerAll(); } } return result; } } function buildModeRegex(mode) { const mm = new ResumableMultiRegex(); mode.contains.forEach((term) => mm.addRule(term.begin, { rule: term, type: "begin" })); if (mode.terminatorEnd) { mm.addRule(mode.terminatorEnd, { type: "end" }); } if (mode.illegal) { mm.addRule(mode.illegal, { type: "illegal" }); } return mm; } function compileMode(mode, parent) { const cmode = ( /** @type CompiledMode */ mode ); if (mode.isCompiled) return cmode; [ scopeClassName, // do this early so compiler extensions generally don't have to worry about // the distinction between match/begin compileMatch, MultiClass, beforeMatchExt ].forEach((ext) => ext(mode, parent)); language.compilerExtensions.forEach((ext) => ext(mode, parent)); mode.__beforeBegin = null; [ beginKeywords, // do this later so compiler extensions that come earlier have access to the // raw array if they wanted to perhaps manipulate it, etc. compileIllegal, // default to 1 relevance if not specified compileRelevance ].forEach((ext) => ext(mode, parent)); mode.isCompiled = true; let keywordPattern = null; if (typeof mode.keywords === "object" && mode.keywords.$pattern) { mode.keywords = Object.assign({}, mode.keywords); keywordPattern = mode.keywords.$pattern; delete mode.keywords.$pattern; } keywordPattern = keywordPattern || /\w+/; if (mode.keywords) { mode.keywords = compileKeywords(mode.keywords, language.case_insensitive); } cmode.keywordPatternRe = langRe(keywordPattern, true); if (parent) { if (!mode.begin) mode.begin = /\B|\b/; cmode.beginRe = langRe(cmode.begin); if (!mode.end && !mode.endsWithParent) mode.end = /\B|\b/; if (mode.end) cmode.endRe = langRe(cmode.end); cmode.terminatorEnd = source(cmode.end) || ""; if (mode.endsWithParent && parent.terminatorEnd) { cmode.terminatorEnd += (mode.end ? "|" : "") + parent.terminatorEnd; } } if (mode.illegal) cmode.illegalRe = langRe( /** @type {RegExp | string} */ mode.illegal ); if (!mode.contains) mode.contains = []; mode.contains = [].concat(...mode.contains.map(function(c) { return expandOrCloneMode(c === "self" ? mode : c); })); mode.contains.forEach(function(c) { compileMode( /** @type Mode */ c, cmode ); }); if (mode.starts) { compileMode(mode.starts, parent); } cmode.matcher = buildModeRegex(cmode); return cmode; } if (!language.compilerExtensions) language.compilerExtensions = []; if (language.contains && language.contains.includes("self")) { throw new Error("ERR: contains `self` is not supported at the top-level of a language. See documentation."); } language.classNameAliases = inherit$1(language.classNameAliases || {}); return compileMode( /** @type Mode */ language ); } function dependencyOnParent(mode) { if (!mode) return false; return mode.endsWithParent || dependencyOnParent(mode.starts); } function expandOrCloneMode(mode) { if (mode.variants && !mode.cachedVariants) { mode.cachedVariants = mode.variants.map(function(variant) { return inherit$1(mode, { variants: null }, variant); }); } if (mode.cachedVariants) { return mode.cachedVariants; } if (dependencyOnParent(mode)) { return inherit$1(mode, { starts: mode.starts ? inherit$1(mode.starts) : null }); } if (Object.isFrozen(mode)) { return inherit$1(mode); } return mode; } var version = "11.11.1"; class HTMLInjectionError extends Error { constructor(reason, html) { super(reason); this.name = "HTMLInjectionError"; this.html = html; } } const escape = escapeHTML; const inherit = inherit$1; const NO_MATCH = Symbol("nomatch"); const MAX_KEYWORD_HITS = 7; const HLJS = function(hljs2) { const languages = /* @__PURE__ */ Object.create(null); const aliases = /* @__PURE__ */ Object.create(null); const plugins = []; let SAFE_MODE = true; const LANGUAGE_NOT_FOUND = "Could not find the language '{}', did you forget to load/include a language module?"; const PLAINTEXT_LANGUAGE = { disableAutodetect: true, name: "Plain text", contains: [] }; let options = { ignoreUnescapedHTML: false, throwUnescapedHTML: false, noHighlightRe: /^(no-?highlight)$/i, languageDetectRe: /\blang(?:uage)?-([\w-]+)\b/i, classPrefix: "hljs-", cssSelector: "pre code", languages: null, // beta configuration options, subject to change, welcome to discuss // https://github.com/highlightjs/highlight.js/issues/1086 __emitter: TokenTreeEmitter }; function shouldNotHighlight(languageName) { return options.noHighlightRe.test(languageName); } function blockLanguage(block) { let classes = block.className + " "; classes += block.parentNode ? block.parentNode.className : ""; const match = options.languageDetectRe.exec(classes); if (match) { const language = getLanguage(match[1]); if (!language) { warn(LANGUAGE_NOT_FOUND.replace("{}", match[1])); warn("Falling back to no-highlight mode for this block.", block); } return language ? match[1] : "no-highlight"; } return classes.split(/\s+/).find((_class) => shouldNotHighlight(_class) || getLanguage(_class)); } function highlight2(codeOrLanguageName, optionsOrCode, ignoreIllegals) { let code = ""; let languageName = ""; if (typeof optionsOrCode === "object") { code = codeOrLanguageName; ignoreIllegals = optionsOrCode.ignoreIllegals; languageName = optionsOrCode.language; } else { deprecated("10.7.0", "highlight(lang, code, ...args) has been deprecated."); deprecated("10.7.0", "Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"); languageName = codeOrLanguageName; code = optionsOrCode; } if (ignoreIllegals === void 0) { ignoreIllegals = true; } const context = { code, language: languageName }; fire("before:highlight", context); const result = context.result ? context.result : _highlight(context.language, context.code, ignoreIllegals); result.code = context.code; fire("after:highlight", result); return result; } function _highlight(languageName, codeToHighlight, ignoreIllegals, continuation) { const keywordHits = /* @__PURE__ */ Object.create(null); function keywordData(mode, matchText) { return mode.keywords[matchText]; } function processKeywords() { if (!top.keywords) { emitter.addText(modeBuffer); return; } let lastIndex = 0; top.keywordPatternRe.lastIndex = 0; let match = top.keywordPatternRe.exec(modeBuffer); let buf = ""; while (match) { buf += modeBuffer.substring(lastIndex, match.index); const word = language.case_insensitive ? match[0].toLowerCase() : match[0]; const data = keywordData(top, word); if (data) { const [kind, keywordRelevance] = data; emitter.addText(buf); buf = ""; keywordHits[word] = (keywordHits[word] || 0) + 1; if (keywordHits[word] <= MAX_KEYWORD_HITS) relevance += keywordRelevance; if (kind.startsWith("_")) { buf += match[0]; } else { const cssClass = language.classNameAliases[kind] || kind; emitKeyword(match[0], cssClass); } } else { buf += match[0]; } lastIndex = top.keywordPatternRe.lastIndex; match = top.keywordPatternRe.exec(modeBuffer); } buf += modeBuffer.substring(lastIndex); emitter.addText(buf); } function processSubLanguage() { if (modeBuffer === "") return; let result2 = null; if (typeof top.subLanguage === "string") { if (!languages[top.subLanguage]) { emitter.addText(modeBuffer); return; } result2 = _highlight(top.subLanguage, modeBuffer, true, continuations[top.subLanguage]); continuations[top.subLanguage] = /** @type {CompiledMode} */ result2._top; } else { result2 = highlightAuto(modeBuffer, top.subLanguage.length ? top.subLanguage : null); } if (top.relevance > 0) { relevance += result2.relevance; } emitter.__addSublanguage(result2._emitter, result2.language); } function processBuffer() { if (top.subLanguage != null) { processSubLanguage(); } else { processKeywords(); } modeBuffer = ""; } function emitKeyword(keyword, scope) { if (keyword === "") return; emitter.startScope(scope); emitter.addText(keyword); emitter.endScope(); } function emitMultiClass(scope, match) { let i = 1; const max = match.length - 1; while (i <= max) { if (!scope._emit[i]) { i++; continue; } const klass = language.classNameAliases[scope[i]] || scope[i]; const text = match[i]; if (klass) { emitKeyword(text, klass); } else { modeBuffer = text; processKeywords(); modeBuffer = ""; } i++; } } function startNewMode(mode, match) { if (mode.scope && typeof mode.scope === "string") { emitter.openNode(language.classNameAliases[mode.scope] || mode.scope); } if (mode.beginScope) { if (mode.beginScope._wrap) { emitKeyword(modeBuffer, language.classNameAliases[mode.beginScope._wrap] || mode.beginScope._wrap); modeBuffer = ""; } else if (mode.beginScope._multi) { emitMultiClass(mode.beginScope, match); modeBuffer = ""; } } top = Object.create(mode, { parent: { value: top } }); return top; } function endOfMode(mode, match, matchPlusRemainder) { let matched = startsWith(mode.endRe, matchPlusRemainder); if (matched) { if (mode["on:end"]) { const resp = new Response(mode); mode["on:end"](match, resp); if (resp.isMatchIgnored) matched = false; } if (matched) { while (mode.endsParent && mode.parent) { mode = mode.parent; } return mode; } } if (mode.endsWithParent) { return endOfMode(mode.parent, match, matchPlusRemainder); } } function doIgnore(lexeme) { if (top.matcher.regexIndex === 0) { modeBuffer += lexeme[0]; return 1; } else { resumeScanAtSamePosition = true; return 0; } } function doBeginMatch(match) { const lexeme = match[0]; const newMode = match.rule; const resp = new Response(newMode); const beforeCallbacks = [newMode.__beforeBegin, newMode["on:begin"]]; for (const cb of beforeCallbacks) { if (!cb) continue; cb(match, resp); if (resp.isMatchIgnored) return doIgnore(lexeme); } if (newMode.skip) { modeBuffer += lexeme; } else { if (newMode.excludeBegin) { modeBuffer += lexeme; } processBuffer(); if (!newMode.returnBegin && !newMode.excludeBegin) { modeBuffer = lexeme; } } startNewMode(newMode, match); return newMode.returnBegin ? 0 : lexeme.length; } function doEndMatch(match) { const lexeme = match[0]; const matchPlusRemainder = codeToHighlight.substring(match.index); const endMode = endOfMode(top, match, matchPlusRemainder); if (!endMode) { return NO_MATCH; } const origin = top; if (top.endScope && top.endScope._wrap) { processBuffer(); emitKeyword(lexeme, top.endScope._wrap); } else if (top.endScope && top.endScope._multi) { processBuffer(); emitMultiClass(top.endScope, match); } else if (origin.skip) { modeBuffer += lexeme; } else { if (!(origin.returnEnd || origin.excludeEnd)) { modeBuffer += lexeme; } processBuffer(); if (origin.excludeEnd) { modeBuffer = lexeme; } } do { if (top.scope) { emitter.closeNode(); } if (!top.skip && !top.subLanguage) { relevance += top.relevance; } top = top.parent; } while (top !== endMode.parent); if (endMode.starts) { startNewMode(endMode.starts, match); } return origin.returnEnd ? 0 : lexeme.length; } function processContinuations() { const list = []; for (let current = top; current !== language; current = current.parent) { if (current.scope) { list.unshift(current.scope); } } list.forEach((item) => emitter.openNode(item)); } let lastMatch = {}; function processLexeme(textBeforeMatch, match) { const lexeme = match && match[0]; modeBuffer += textBeforeMatch; if (lexeme == null) { processBuffer(); return 0; } if (lastMatch.type === "begin" && match.type === "end" && lastMatch.index === match.index && lexeme === "") { modeBuffer += codeToHighlight.slice(match.index, match.index + 1); if (!SAFE_MODE) { const err = new Error(`0 width match regex (${languageName})`); err.languageName = languageName; err.badRule = lastMatch.rule; throw err; } return 1; } lastMatch = match; if (match.type === "begin") { return doBeginMatch(match); } else if (match.type === "illegal" && !ignoreIllegals) { const err = new Error('Illegal lexeme "' + lexeme + '" for mode "' + (top.scope || "") + '"'); err.mode = top; throw err; } else if (match.type === "end") { const processed = doEndMatch(match); if (processed !== NO_MATCH) { return processed; } } if (match.type === "illegal" && lexeme === "") { modeBuffer += "\n"; return 1; } if (iterations > 1e5 && iterations > match.index * 3) { const err = new Error("potential infinite loop, way more iterations than matches"); throw err; } modeBuffer += lexeme; return lexeme.length; } const language = getLanguage(languageName); if (!language) { error(LANGUAGE_NOT_FOUND.replace("{}", languageName)); throw new Error('Unknown language: "' + languageName + '"'); } const md = compileLanguage(language); let result = ""; let top = continuation || md; const continuations = {}; const emitter = new options.__emitter(options); processContinuations(); let modeBuffer = ""; let relevance = 0; let index = 0; let iterations = 0; let resumeScanAtSamePosition = false; try { if (!language.__emitTokens) { top.matcher.considerAll(); for (; ; ) { iterations++; if (resumeScanAtSamePosition) { resumeScanAtSamePosition = false; } else { top.matcher.considerAll(); } top.matcher.lastIndex = index; const match = top.matcher.exec(codeToHighlight); if (!match) break; const beforeMatch = codeToHighlight.substring(index, match.index); const processedCount = processLexeme(beforeMatch, match); index = match.index + processedCount; } processLexeme(codeToHighlight.substring(index)); } else { language.__emitTokens(codeToHighlight, emitter); } emitter.finalize(); result = emitter.toHTML(); return { language: languageName, value: result, relevance, illegal: false, _emitter: emitter, _top: top }; } catch (err) { if (err.message && err.message.includes("Illegal")) { return { language: languageName, value: escape(codeToHighlight), illegal: true, relevance: 0, _illegalBy: { message: err.message, index, context: codeToHighlight.slice(index - 100, index + 100), mode: err.mode, resultSoFar: result }, _emitter: emitter }; } else if (SAFE_MODE) { return { language: languageName, value: escape(codeToHighlight), illegal: false, relevance: 0, errorRaised: err, _emitter: emitter, _top: top }; } else { throw err; } } } function justTextHighlightResult(code) { const result = { value: escape(code), illegal: false, relevance: 0, _top: PLAINTEXT_LANGUAGE, _emitter: new options.__emitter(options) }; result._emitter.addText(code); return result; } function highlightAuto(code, languageSubset) { languageSubset = languageSubset || options.languages || Object.keys(languages); const plaintext = justTextHighlightResult(code); const results = languageSubset.filter(getLanguage).filter(autoDetection).map( (name) => _highlight(name, code, false) ); results.unshift(plaintext); const sorted = results.sort((a, b2) => { if (a.relevance !== b2.relevance) return b2.relevance - a.relevance; if (a.language && b2.language) { if (getLanguage(a.language).supersetOf === b2.language) { return 1; } else if (getLanguage(b2.language).supersetOf === a.language) { return -1; } } return 0; }); const [best, secondBest] = sorted; const result = best; result.secondBest = secondBest; return result; } function updateClassName(element, currentLang, resultLang) { const language = currentLang && aliases[currentLang] || resultLang; element.classList.add("hljs"); element.classList.add(`language-${language}`); } function highlightElement(element) { let node = null; const language = blockLanguage(element); if (shouldNotHighlight(language)) return; fire( "before:highlightElement", { el: element, language } ); if (element.dataset.highlighted) { console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.", element); return; } if (element.children.length > 0) { if (!options.ignoreUnescapedHTML) { console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."); console.warn("https://github.com/highlightjs/highlight.js/wiki/security"); console.warn("The element with unescaped HTML:"); console.warn(element); } if (options.throwUnescapedHTML) { const err = new HTMLInjectionError( "One of your code blocks includes unescaped HTML.", element.innerHTML ); throw err; } } node = element; const text = node.textContent; const result = language ? highlight2(text, { language, ignoreIllegals: true }) : highlightAuto(text); element.innerHTML = result.value; element.dataset.highlighted = "yes"; updateClassName(element, language, result.language); element.result = { language: result.language, // TODO: remove with version 11.0 re: result.relevance, relevance: result.relevance }; if (result.secondBest) { element.secondBest = { language: result.secondBest.language, relevance: result.secondBest.relevance }; } fire("after:highlightElement", { el: element, result, text }); } function configure(userOptions) { options = inherit(options, userOptions); } const initHighlighting = () => { highlightAll(); deprecated("10.6.0", "initHighlighting() deprecated. Use highlightAll() now."); }; function initHighlightingOnLoad() { highlightAll(); deprecated("10.6.0", "initHighlightingOnLoad() deprecated. Use highlightAll() now."); } let wantsHighlight = false; function highlightAll() { function boot() { highlightAll(); } if (document.readyState === "loading") { if (!wantsHighlight) { window.addEventListener("DOMContentLoaded", boot, false); } wantsHighlight = true; return; } const blocks = document.querySelectorAll(options.cssSelector); blocks.forEach(highlightElement); } function registerLanguage(languageName, languageDefinition) { let lang = null; try { lang = languageDefinition(hljs2); } catch (error$1) { error("Language definition for '{}' could not be registered.".replace("{}", languageName)); if (!SAFE_MODE) { throw error$1; } else { error(error$1); } lang = PLAINTEXT_LANGUAGE; } if (!lang.name) lang.name = languageName; languages[languageName] = lang; lang.rawDefinition = languageDefinition.bind(null, hljs2); if (lang.aliases) { registerAliases(lang.aliases, { languageName }); } } function unregisterLanguage(languageName) { delete languages[languageName]; for (const alias of Object.keys(aliases)) { if (aliases[alias] === languageName) { delete aliases[alias]; } } } function listLanguages() { return Object.keys(languages); } function getLanguage(name) { name = (name || "").toLowerCase(); return languages[name] || languages[aliases[name]]; } function registerAliases(aliasList, { languageName }) { if (typeof aliasList === "string") { aliasList = [aliasList]; } aliasList.forEach((alias) => { aliases[alias.toLowerCase()] = languageName; }); } function autoDetection(name) { const lang = getLanguage(name); return lang && !lang.disableAutodetect; } function upgradePluginAPI(plugin) { if (plugin["before:highlightBlock"] && !plugin["before:highlightElement"]) { plugin["before:highlightElement"] = (data) => { plugin["before:highlightBlock"]( Object.assign({ block: data.el }, data) ); }; } if (plugin["after:highlightBlock"] && !plugin["after:highlightElement"]) { plugin["after:highlightElement"] = (data) => { plugin["after:highlightBlock"]( Object.assign({ block: data.el }, data) ); }; } } function addPlugin(plugin) { upgradePluginAPI(plugin); plugins.push(plugin); } function removePlugin(plugin) { const index = plugins.indexOf(plugin); if (index !== -1) { plugins.splice(index, 1); } } function fire(event, args) { const cb = event; plugins.forEach(function(plugin) { if (plugin[cb]) { plugin[cb](args); } }); } function deprecateHighlightBlock(el) { deprecated("10.7.0", "highlightBlock will be removed entirely in v12.0"); deprecated("10.7.0", "Please use highlightElement now."); return highlightElement(el); } Object.assign(hljs2, { highlight: highlight2, highlightAuto, highlightAll, highlightElement, // TODO: Remove with v12 API highlightBlock: deprecateHighlightBlock, configure, initHighlighting, initHighlightingOnLoad, registerLanguage, unregisterLanguage, listLanguages, getLanguage, registerAliases, autoDetection, inherit, addPlugin, removePlugin }); hljs2.debugMode = function() { SAFE_MODE = false; }; hljs2.safeMode = function() { SAFE_MODE = true; }; hljs2.versionString = version; hljs2.regex = { concat, lookahead, either, optional, anyNumberOfTimes }; for (const key in MODES) { if (typeof MODES[key] === "object") { deepFreeze(MODES[key]); } } Object.assign(hljs2, MODES); return hljs2; }; const highlight = HLJS({}); highlight.newInstance = () => HLJS({}); var core = highlight; highlight.HighlightJS = highlight; highlight.default = highlight; var _1c_1; var hasRequired_1c; function require_1c() { if (hasRequired_1c) return _1c_1; hasRequired_1c = 1; function _1c(hljs2) { const UNDERSCORE_IDENT_RE2 = "[A-Za-zА-Яа-яёЁ_][A-Za-zА-Яа-яёЁ_0-9]+"; const v7_keywords = "далее "; const v8_keywords = "возврат вызватьисключение выполнить для если и из или иначе иначеесли исключение каждого конецесли конецпопытки конеццикла не новый перейти перем по пока попытка прервать продолжить тогда цикл экспорт "; const KEYWORD = v7_keywords + v8_keywords; const v7_meta_keywords = "загрузитьизфайла "; const v8_meta_keywords = "вебклиент вместо внешнеесоединение клиент конецобласти мобильноеприложениеклиент мобильноеприложениесервер наклиенте наклиентенасервере наклиентенасерверебезконтекста насервере насерверебезконтекста область перед после сервер толстыйклиентобычноеприложение толстыйклиентуправляемоеприложение тонкийклиент "; const METAKEYWORD = v7_meta_keywords + v8_meta_keywords; const v7_system_constants = "разделительстраниц разделительстрок символтабуляции "; const v7_global_context_methods = "ansitooem oemtoansi ввестивидсубконто ввестиперечисление ввестипериод ввестиплансчетов выбранныйплансчетов датагод датамесяц датачисло заголовоксистемы значениевстроку значениеизстроки каталогиб каталогпользователя кодсимв конгода конецпериодаби конецрассчитанногопериодаби конецстандартногоинтервала конквартала конмесяца коннедели лог лог10 максимальноеколичествосубконто названиеинтерфейса названиенабораправ назначитьвид назначитьсчет найтиссылки началопериодаби началостандартногоинтервала начгода начквартала начмесяца начнедели номерднягода номерднянедели номернеделигода обработкаожидания основнойжурналрасчетов основнойплансчетов основнойязык очиститьокносообщений периодстр получитьвремята получитьдатута получитьдокументта получитьзначенияотбора получитьпозициюта получитьпустоезначение получитьта префиксавтонумерации пропись пустоезначение разм разобратьпозициюдокумента рассчитатьрегистрына рассчитатьрегистрыпо симв создатьобъект статусвозврата стрколичествострок сформироватьпозициюдокумента счетпокоду текущеевремя типзначения типзначениястр установитьтана установитьтапо фиксшаблон шаблон "; const v8_global_context_methods = "acos asin atan base64значение base64строка cos exp log log10 pow sin sqrt tan xmlзначение xmlстрока xmlтип xmlтипзнч активноеокно безопасныйрежим безопасныйрежимразделенияданных булево ввестидату ввестизначение ввестистроку ввестичисло возможностьчтенияxml вопрос восстановитьзначение врег выгрузитьжурналрегистрации выполнитьобработкуоповещения выполнитьпроверкуправдоступа вычислить год данныеформывзначение дата день деньгода деньнедели добавитьмесяц заблокироватьданныедляредактирования заблокироватьработупользователя завершитьработусистемы загрузитьвнешнююкомпоненту закрытьсправку записатьjson записатьxml записатьдатуjson записьжурналарегистрации заполнитьзначениясвойств запроситьразрешениепользователя запуститьприложение запуститьсистему зафиксироватьтранзакцию значениевданныеформы значениевстрокувнутр значениевфайл значениезаполнено значениеизстрокивнутр значениеизфайла изxmlтипа импортмоделиxdto имякомпьютера имяпользователя инициализироватьпредопределенныеданные информацияобошибке каталогбиблиотекимобильногоустройства каталогвременныхфайлов каталогдокументов каталогпрограммы кодироватьстроку кодлокализацииинформационнойбазы кодсимвола командасистемы конецгода конецдня конецквартала конецмесяца конецминуты конецнедели конецчаса конфигурациябазыданныхизмененадинамически конфигурацияизменена копироватьданныеформы копироватьфайл краткоепредставлениеошибки лев макс местноевремя месяц мин минута монопольныйрежим найти найтинедопустимыесимволыxml найтиокнопонавигационнойссылке найтипомеченныенаудаление найтипоссылкам найтифайлы началогода началодня началоквартала началомесяца началоминуты началонедели началочаса начатьзапросразрешенияпользователя начатьзапускприложения начатькопированиефайла начатьперемещениефайла начатьподключениевнешнейкомпоненты начатьподключениерасширенияработыскриптографией начатьподключениерасширенияработысфайлами начатьпоискфайлов начатьполучениекаталогавременныхфайлов начатьполучениекаталогадокументов начатьполучениерабочегокаталогаданныхпользователя начатьполучениефайлов начатьпомещениефайла начатьпомещениефайлов начатьсозданиедвоичныхданныхизфайла начатьсозданиекаталога начатьтранзакцию начатьудалениефайлов начатьустановкувнешнейкомпоненты начатьустановкурасширенияработыскриптографией начатьустановкурасширенияработысфайлами неделягода необходимостьзавершениясоединения номерсеансаинформационнойбазы номерсоединенияинформационнойбазы нрег нстр обновитьинтерфейс обновитьнумерациюобъектов обновитьповторноиспользуемыезначения обработкапрерыванияпользователя объединитьфайлы окр описаниеошибки оповестить оповеститьобизменении отключитьобработчикзапросанастроекклиенталицензирования отключитьобработчикожидания отключитьобработчикоповещения открытьзначение открытьиндекссправки открытьсодержаниесправки открытьсправку открытьформу открытьформумодально отменитьтранзакцию очиститьжурналрегистрации очиститьнастройкипользователя очиститьсообщения параметрыдоступа перейтипонавигационнойссылке переместитьфайл подключитьвнешнююкомпоненту подключитьобработчикзапросанастроекклиенталицензирования подключитьобработчикожидания подключитьобработчикоповещения подключитьрасширениеработыскриптографией подключитьрасширениеработысфайлами подробноепредставлениеошибки показатьвводдаты показатьвводзначения показатьвводстроки показатьвводчисла показатьвопрос показатьзначение показатьинформациюобошибке показатьнакарте показатьоповещениепользователя показатьпредупреждение полноеимяпользователя получитьcomобъект получитьxmlтип получитьадреспоместоположению получитьблокировкусеансов получитьвремязавершенияспящегосеанса получитьвремязасыпанияпассивногосеанса получитьвремяожиданияблокировкиданных получитьданныевыбора получитьдополнительныйпараметрклиенталицензирования получитьдопустимыекодылокализации получитьдопустимыечасовыепояса получитьзаголовокклиентскогоприложения получитьзаголовоксистемы получитьзначенияотборажурналарегистрации получитьидентификаторконфигурации получитьизвременногохранилища получитьимявременногофайла получитьимяклиенталицензирования получитьинформациюэкрановклиента получитьиспользованиежурналарегистрации получитьиспользованиесобытияжурналарегистрации получитькраткийзаголовокприложения получитьмакетоформления получитьмаскувсефайлы получитьмаскувсефайлыклиента получитьмаскувсефайлысервера получитьместоположениепоадресу получитьминимальнуюдлинупаролейпользователей получитьнавигационнуюссылку получитьнавигационнуюссылкуинформационнойбазы получитьобновлениеконфигурациибазыданных получитьобновлениепредопределенныхданныхинформационнойбазы получитьобщиймакет получитьобщуюформу получитьокна получитьоперативнуюотметкувремени получитьотключениебезопасногорежима получитьпараметрыфункциональныхопцийинтерфейса получитьполноеимяпредопределенногозначения получитьпредставлениянавигационныхссылок получитьпроверкусложностипаролейпользователей получитьразделительпути получитьразделительпутиклиента получитьразделительпутисервера получитьсеансыинформационнойбазы получитьскоростьклиентскогосоединения получитьсоединенияинформационнойбазы получитьсообщенияпользователю получитьсоответствиеобъектаиформы получитьсоставстандартногоинтерфейсаodata получитьструктурухранениябазыданных получитьтекущийсеансинформационнойбазы получитьфайл получитьфайлы получитьформу получитьфункциональнуюопцию получитьфункциональнуюопциюинтерфейса получитьчасовойпоясинформационнойбазы пользователиос поместитьвовременноехранилище поместитьфайл поместитьфайлы прав праводоступа предопределенноезначение представлениекодалокализации представлениепериода представлениеправа представлениеприложения представлениесобытияжурналарегистрации представлениечасовогопояса предупреждение прекратитьработусистемы привилегированныйрежим продолжитьвызов прочитатьjson прочитатьxml прочитатьдатуjson пустаястрока рабочийкаталогданныхпользователя разблокироватьданныедляредактирования разделитьфайл разорватьсоединениесвнешнимисточникомданных раскодироватьстроку рольдоступна секунда сигнал символ скопироватьжурналрегистрации смещениелетнеговремени смещениестандартноговремени соединитьбуферыдвоичныхданных создатькаталог создатьфабрикуxdto сокрл сокрлп сокрп сообщить состояние сохранитьзначение сохранитьнастройкипользователя сред стрдлина стрзаканчиваетсяна стрзаменить стрнайти стрначинаетсяс строка строкасоединенияинформационнойбазы стрполучитьстроку стрразделить стрсоединить стрсравнить стрчисловхождений стрчислострок стршаблон текущаядата текущаядатасеанса текущаяуниверсальнаядата текущаяуниверсальнаядатавмиллисекундах текущийвариантинтерфейсаклиентскогоприложения текущийвариантосновногошрифтаклиентскогоприложения текущийкодлокализации текущийрежимзапуска текущийязык текущийязыксистемы тип типзнч транзакцияактивна трег удалитьданныеинформационнойбазы удалитьизвременногохранилища удалитьобъекты удалитьфайлы универсальноевремя установитьбезопасныйрежим установитьбезопасныйрежимразделенияданных установитьблокировкусеансов установитьвнешнююкомпоненту установитьвремязавершенияспящегосеанса установитьвремязасыпанияпассивногосеанса установитьвремяожиданияблокировкиданных установитьзаголовокклиентскогоприложения установитьзаголовоксистемы установитьиспользованиежурналарегистрации установитьиспользованиесобытияжурналарегистрации установитькраткийзаголовокприложения установитьминимальнуюдлинупаролейпользователей установитьмонопольныйрежим установитьнастройкиклиенталицензирования установитьобновлениепредопределенныхданныхинформационнойбазы установитьотключениебезопасногорежима установитьпараметрыфункциональныхопцийинтерфейса установитьпривилегированныйрежим установитьпроверкусложностипаролейпользователей установитьрасширениеработыскриптографией установитьрасширениеработысфайлами установитьсоединениесвнешнимисточникомданных установитьсоответствиеобъектаиформы установитьсоставстандартногоинтерфейсаodata установитьчасовойпоясинформационнойбазы установитьчасовойпояссеанса формат цел час часовойпояс часовойпояссеанса число числопрописью этоадресвременногохранилища "; const v8_global_context_property = "wsссылки библиотекакартинок библиотекамакетовоформлениякомпоновкиданных библиотекастилей бизнеспроцессы внешниеисточникиданных внешниеобработки внешниеотчеты встроенныепокупки главныйинтерфейс главныйстиль документы доставляемыеуведомления журналыдокументов задачи информацияобинтернетсоединении использованиерабочейдаты историяработыпользователя константы критерииотбора метаданные обработки отображениерекламы отправкадоставляемыхуведомлений отчеты панельзадачос параметрзапуска параметрысеанса перечисления планывидоврасчета планывидовхарактеристик планыобмена планысчетов полнотекстовыйпоиск пользователиинформационнойбазы последовательности проверкавстроенныхпокупок рабочаядата расширенияконфигурации регистрыбухгалтерии регистрынакопления регистрырасчета регистрысведений регламентныезадания сериализаторxdto справочники средствагеопозиционирования средствакриптографии средствамультимедиа средстваотображениярекламы средствапочты средствателефонии фабрикаxdto файловыепотоки фоновыезадания хранилищанастроек хранилищевариантовотчетов хранилищенастроекданныхформ хранилищеобщихнастроек хранилищепользовательскихнастроекдинамическихсписков хранилищепользовательскихнастроекотчетов хранилищесистемныхнастроек "; const BUILTIN = v7_system_constants + v7_global_context_methods + v8_global_context_methods + v8_global_context_property; const v8_system_sets_of_values = "webцвета windowsцвета windowsшрифты библиотекакартинок рамкистиля символы цветастиля шрифтыстиля "; const v8_system_enums_interface = "автоматическоесохранениеданныхформывнастройках автонумерациявформе автораздвижениесерий анимациядиаграммы вариантвыравниванияэлементовизаголовков вариантуправлениявысотойтаблицы вертикальнаяпрокруткаформы вертикальноеположение вертикальноеположениеэлемента видгруппыформы виддекорацииформы виддополненияэлементаформы видизмененияданных видкнопкиформы видпереключателя видподписейкдиаграмме видполяформы видфлажка влияниеразмеранапузырекдиаграммы горизонтальноеположение горизонтальноеположениеэлемента группировкаколонок группировкаподчиненныхэлементовформы группыиэлементы действиеперетаскивания дополнительныйрежимотображения допустимыедействияперетаскивания интервалмеждуэлементамиформы использованиевывода использованиеполосыпрокрутки используемоезначениеточкибиржевойдиаграммы историявыборапривводе источникзначенийоситочекдиаграммы источникзначенияразмерапузырькадиаграммы категориягруппыкоманд максимумсерий начальноеотображениедерева начальноеотображениесписка обновлениетекстаредактирования ориентациядендрограммы ориентациядиаграммы ориентацияметокдиаграммы ориентацияметоксводнойдиаграммы ориентацияэлементаформы отображениевдиаграмме отображениевлегендедиаграммы отображениегруппыкнопок отображениезаголовкашкалыдиаграммы отображениезначенийсводнойдиаграммы отображениезначенияизмерительнойдиаграммы отображениеинтерваладиаграммыганта отображениекнопки отображениекнопкивыбора отображениеобсужденийформы отображениеобычнойгруппы отображениеотрицательныхзначенийпузырьковойдиаграммы отображениепанелипоиска отображениеподсказки отображениепредупрежденияприредактировании отображениеразметкиполосырегулирования отображениестраницформы отображениетаблицы отображениетекстазначениядиаграммыганта отображениеуправленияобычнойгруппы отображениефигурыкнопки палитрацветовдиаграммы поведениеобычнойгруппы поддержкамасштабадендрограммы поддержкамасштабадиаграммыганта поддержкамасштабасводнойдиаграммы поисквтаблицепривводе положениезаголовкаэлементаформы положениекартинкикнопкиформы положениекартинкиэлементаграфическойсхемы положениекоманднойпанелиформы положениекоманднойпанелиэлементаформы положениеопорнойточкиотрисовки положениеподписейкдиаграмме положениеподписейшкалызначенийизмерительнойдиаграммы положениесостоянияпросмотра положениестрокипоиска положениетекстасоединительнойлинии положениеуправленияпоиском положениешкалывремени порядокотображенияточекгоризонтальнойгистограммы порядоксерийвлегендедиаграммы размеркартинки расположениезаголовкашкалыдиаграммы растягиваниеповертикалидиаграммыганта режимавтоотображениясостояния режимвводастроктаблицы режимвыборанезаполненного режимвыделениядаты режимвыделениястрокитаблицы режимвыделениятаблицы режимизмененияразмера режимизменениясвязанногозначения режимиспользованиядиалогапечати режимиспользованияпараметракоманды режиммасштабированияпросмотра режимосновногоокнаклиентскогоприложения режимоткрытияокнаформы режимотображениявыделения режимотображениягеографическойсхемы режимотображениязначенийсерии режимотрисовкисеткиграфическойсхемы режимполупрозрачностидиаграммы режимпробеловдиаграммы режимразмещениянастранице режимредактированияколонки режимсглаживаниядиаграммы режимсглаживанияиндикатора режимсписказадач сквозноевыравнивание сохранениеданныхформывнастройках способзаполнениятекстазаголовкашкалыдиаграммы способопределенияограничивающегозначениядиаграммы стандартнаягруппакоманд стандартноеоформление статусоповещенияпользователя стильстрелки типаппроксимациилиниитрендадиаграммы типдиаграммы типединицышкалывремени типимпортасерийслоягеографическойсхемы типлиниигеографическойсхемы типлиниидиаграммы типмаркерагеографическойсхемы типмаркерадиаграммы типобластиоформления типорганизацииисточникаданныхгеографическойсхемы типотображениясериислоягеографическойсхемы типотображенияточечногообъектагеографическойсхемы типотображенияшкалыэлементалегендыгеографическойсхемы типпоискаобъектовгеографическойсхемы типпроекциигеографическойсхемы типразмещенияизмерений типразмещенияреквизитовизмерений типрамкиэлементауправления типсводнойдиаграммы типсвязидиаграммыганта типсоединениязначенийпосериямдиаграммы типсоединенияточекдиаграммы типсоединительнойлинии типстороныэлементаграфическойсхемы типформыотчета типшкалырадарнойдиаграммы факторлиниитрендадиаграммы фигуракнопки фигурыграфическойсхемы фиксациявтаблице форматдняшкалывремени форматкартинки ширинаподчиненныхэлементовформы "; const v8_system_enums_objects_properties = "виддвижениябухгалтерии виддвижениянакопления видпериодарегистрарасчета видсчета видточкимаршрутабизнеспроцесса использованиеагрегатарегистранакопления использованиегруппиэлементов использованиережимапроведения использованиесреза периодичностьагрегатарегистранакопления режимавтовремя режимзаписидокумента режимпроведениядокумента "; const v8_system_enums_exchange_plans = "авторегистрацияизменений допустимыйномерсообщения отправкаэлементаданных получениеэлементаданных "; const v8_system_enums_tabular_document = "использованиерасшифровкитабличногодокумента ориентациястраницы положениеитоговколоноксводнойтаблицы положениеитоговстроксводнойтаблицы положениетекстаотносительнокартинки расположениезаголовкагруппировкитабличногодокумента способчтениязначенийтабличногодокумента типдвустороннейпечати типзаполненияобластитабличногодокумента типкурсоровтабличногодокумента типлиниирисункатабличногодокумента типлинииячейкитабличногодокумента типнаправленияпереходатабличногодокумента типотображениявыделениятабличногодокумента типотображениялинийсводнойтаблицы типразмещениятекстатабличногодокумента типрисункатабличногодокумента типсмещениятабличногодокумента типузоратабличногодокумента типфайлатабличногодокумента точностьпечати чередованиерасположениястраниц "; const v8_system_enums_sheduler = "отображениевремениэлементовпланировщика "; const v8_system_enums_formatted_document = "типфайлаформатированногодокумента "; const v8_system_enums_query = "обходрезультатазапроса типзаписизапроса "; const v8_system_enums_report_builder = "видзаполнениярасшифровкипостроителяотчета типдобавленияпредставлений типизмеренияпостроителяотчета типразмещенияитогов "; const v8_system_enums_files = "доступкфайлу режимдиалогавыборафайла режимоткрытияфайла "; const v8_system_enums_query_builder = "типизмеренияпостроителязапроса "; const v8_system_enums_data_analysis = "видданныханализа методкластеризации типединицыинтервалавременианализаданных типзаполнениятаблицырезультатаанализаданных типиспользованиячисловыхзначенийанализаданных типисточникаданныхпоискаассоциаций типколонкианализаданныхдереворешений типколонкианализаданныхкластеризация типколонкианализаданныхобщаястатистика типколонкианализаданныхпоискассоциаций типколонкианализаданныхпоискпоследовательностей типколонкимоделипрогноза типмерырасстоянияанализаданных типотсеченияправилассоциации типполяанализаданных типстандартизациианализаданных типупорядочиванияправилассоциациианализаданных типупорядочиванияшаблоновпоследовательностейанализаданных типупрощениядереварешений "; const v8_system_enums_xml_json_xs_dom_xdto_ws = "wsнаправлениепараметра вариантxpathxs вариантзаписидатыjson вариантпростоготипаxs видгруппымоделиxs видфасетаxdto действиепостроителяdom завершенностьпростоготипаxs завершенностьсоставноготипаxs завершенностьсхемыxs запрещенныеподстановкиxs исключениягруппподстановкиxs категорияиспользованияатрибутаxs категорияограниченияидентичностиxs категорияограниченияпространствименxs методнаследованияxs модельсодержимогоxs назначениетипаxml недопустимыеподстановкиxs обработкапробельныхсимволовxs обработкасодержимогоxs ограничениезначенияxs параметрыотбораузловdom переносстрокjson позициявдокументеdom пробельныесимволыxml типатрибутаxml типзначенияjson типканоническогоxml типкомпонентыxs типпроверкиxml типрезультатаdomxpath типузлаdom типузлаxml формаxml формапредставленияxs форматдатыjson экранированиесимволовjson "; const v8_system_enums_data_composition_system = "видсравнениякомпоновкиданных действиеобработкирасшифровкикомпоновкиданных направлениесортировкикомпоновкиданных расположениевложенныхэлементоврезультатакомпоновкиданных расположениеитоговкомпоновкиданных расположениегруппировкикомпоновкиданных расположениеполейгруппировкикомпоновкиданных расположениеполякомпоновкиданных расположениереквизитовкомпоновкиданных расположениересурсовкомпоновкиданных типбухгалтерскогоостаткакомпоновкиданных типвыводатекстакомпоновкиданных типгруппировкикомпоновкиданных типгруппыэлементовотборакомпоновкиданных типдополненияпериодакомпоновкиданных типзаголовкаполейкомпоновкиданных типмакетагруппировкикомпоновкиданных типмакетаобластикомпоновкиданных типостаткакомпоновкиданных типпериодакомпоновкиданных типразмещениятекстакомпоновкиданных типсвязинаборовданныхкомпоновкиданных типэлементарезультатакомпоновкиданных расположениелегендыдиаграммыкомпоновкиданных типпримененияотборакомпоновкиданных режимотображенияэлементанастройкикомпоновкиданных режимотображениянастроеккомпоновкиданных состояниеэлементанастройкикомпоновкиданных способвосстановлениянастроеккомпоновкиданных режимкомпоновкирезультата использованиепараметракомпоновкиданных автопозицияресурсовкомпоновкиданных вариантиспользованиягруппировкикомпоновкиданных расположениересурсоввдиаграммекомпоновкиданных фиксациякомпоновкиданных использованиеусловногооформлениякомпоновкиданных "; const v8_system_enums_email = "важностьинтернетпочтовогосообщения обработкатекстаинтернетпочтовогосообщения способкодированияинтернетпочтовоговложения способкодированиянеasciiсимволовинтернетпочтовогосообщения типтекстапочтовогосообщения протоколинтернетпочты статусразборапочтовогосообщения "; const v8_system_enums_logbook = "режимтранзакциизаписижурналарегистрации статустранзакциизаписижурналарегистрации уровеньжурналарегистрации "; const v8_system_enums_cryptography = "расположениехранилищасертификатовкриптографии режимвключениясертификатовкриптографии режимпроверкисертификатакриптографии типхранилищасертификатовкриптографии "; const v8_system_enums_zip = "кодировкаименфайловвzipфайле методсжатияzip методшифрованияzip режимвосстановленияпутейфайловzip режимобработкиподкаталоговzip режимсохраненияпутейzip уровеньсжатияzip "; const v8_system_enums_other = "звуковоеоповещение направлениепереходакстроке позициявпотоке порядокбайтов режимблокировкиданных режимуправленияблокировкойданных сервисвстроенныхпокупок состояниефоновогозадания типподписчикадоставляемыхуведомлений уровеньиспользованиязащищенногосоединенияftp "; const v8_system_enums_request_schema = "направлениепорядкасхемызапроса типдополненияпериодамисхемызапроса типконтрольнойточкисхемызапроса типобъединениясхемызапроса типпараметрадоступнойтаблицысхемызапроса типсоединениясхемызапроса "; const v8_system_enums_properties_of_metadata_objects = "httpметод автоиспользованиеобщегореквизита автопрефиксномеразадачи вариантвстроенногоязыка видиерархии видрегистранакопления видтаблицывнешнегоисточникаданных записьдвиженийприпроведении заполнениепоследовательностей индексирование использованиебазыпланавидоврасчета использованиебыстроговыбора использованиеобщегореквизита использованиеподчинения использованиеполнотекстовогопоиска использованиеразделяемыхданныхобщегореквизита использованиереквизита назначениеиспользованияприложения назначениерасширенияконфигурации направлениепередачи обновлениепредопределенныхданных оперативноепроведение основноепредставлениевидарасчета основноепредставлениевидахарактеристики основноепредставлениезадачи основноепредставлениепланаобмена основноепредставлениесправочника основноепредставлениесчета перемещениеграницыприпроведении периодичностьномерабизнеспроцесса периодичностьномерадокумента периодичностьрегистрарасчета периодичностьрегистрасведений повторноеиспользованиевозвращаемыхзначений полнотекстовыйпоискпривводепостроке принадлежностьобъекта проведение разделениеаутентификацииобщегореквизита разделениеданныхобщегореквизита разделениерасширенийконфигурацииобщегореквизита режимавтонумерацииобъектов режимзаписирегистра режимиспользованиямодальности режимиспользованиясинхронныхвызововрасширенийплатформыивнешнихкомпонент режимповторногоиспользованиясеансов режимполученияданныхвыборапривводепостроке режимсовместимости режимсовместимостиинтерфейса режимуправленияблокировкойданныхпоумолчанию сериикодовпланавидовхарактеристик сериикодовпланасчетов сериикодовсправочника созданиепривводе способвыбора способпоискастрокипривводепостроке способредактирования типданныхтаблицывнешнегоисточникаданных типкодапланавидоврасчета типкодасправочника типмакета типномерабизнеспроцесса типномерадокумента типномеразадачи типформы удалениедвижений "; const v8_system_enums_differents = "важностьпроблемыприменениярасширенияконфигурации вариантинтерфейсаклиентскогоприложения вариантмасштабаформклиентскогоприложения вариантосновногошрифтаклиентскогоприложения вариантстандартногопериода вариантстандартнойдатыначала видграницы видкартинки видотображенияполнотекстовогопоиска видрамки видсравнения видцвета видчисловогозначения видшрифта допустимаядлина допустимыйзнак использованиеbyteordermark использованиеметаданныхполнотекстовогопоиска источникрасширенийконфигурации клавиша кодвозвратадиалога кодировкаxbase кодировкатекста направлениепоиска направлениесортировки обновлениепредопределенныхданных обновлениеприизмененииданных отображениепанелиразделов проверказаполнения режимдиалогавопрос режимзапускаклиентскогоприложения режимокругления режимоткрытияформприложения режимполнотекстовогопоиска скоростьклиентскогосоединения состояниевнешнегоисточникаданных состояниеобновленияконфигурациибазыданных способвыборасертификатаwindows способкодированиястроки статуссообщения типвнешнейкомпоненты типплатформы типповеденияклавишиenter типэлементаинформацииовыполненииобновленияконфигурациибазыданных уровеньизоляциитранзакций хешфункция частидаты"; const CLASS = v8_system_sets_of_values + v8_system_enums_interface + v8_system_enums_objects_properties + v8_system_enums_exchange_plans + v8_system_enums_tabular_document + v8_system_enums_sheduler + v8_system_enums_formatted_document + v8_system_enums_query + v8_system_enums_report_builder + v8_system_enums_files + v8_system_enums_query_builder + v8_system_enums_data_analysis + v8_system_enums_xml_json_xs_dom_xdto_ws + v8_system_enums_data_composition_system + v8_system_enums_email + v8_system_enums_logbook + v8_system_enums_cryptography + v8_system_enums_zip + v8_system_enums_other + v8_system_enums_request_schema + v8_system_enums_properties_of_metadata_objects + v8_system_enums_differents; const v8_shared_object = "comобъект ftpсоединение httpзапрос httpсервисответ httpсоединение wsопределения wsпрокси xbase анализданных аннотацияxs блокировкаданных буфердвоичныхданных включениеxs выражениекомпоновкиданных генераторслучайныхчисел географическаясхема географическиекоординаты графическаясхема группамоделиxs данныерасшифровкикомпоновкиданных двоичныеданные дендрограмма диаграмма диаграммаганта диалогвыборафайла диалогвыборацвета диалогвыборашрифта диалограсписаниярегламентногозадания диалогредактированиястандартногопериода диапазон документdom документhtml документацияxs доставляемоеуведомление записьdom записьfastinfoset записьhtml записьjson записьxml записьzipфайла записьданных записьтекста записьузловdom запрос защищенноесоединениеopenssl значенияполейрасшифровкикомпоновкиданных извлечениетекста импортxs интернетпочта интернетпочтовоесообщение интернетпочтовыйпрофиль интернетпрокси интернетсоединение информациядляприложенияxs использованиеатрибутаxs использованиесобытияжурналарегистрации источникдоступныхнастроеккомпоновкиданных итераторузловdom картинка квалификаторыдаты квалификаторыдвоичныхданных квалификаторыстроки квалификаторычисла компоновщикмакетакомпоновкиданных компоновщикнастроеккомпоновкиданных конструктормакетаоформлениякомпоновкиданных конструкторнастроеккомпоновкиданных конструкторформатнойстроки линия макеткомпоновкиданных макетобластикомпоновкиданных макетоформлениякомпоновкиданных маскаxs менеджеркриптографии наборсхемxml настройкикомпоновкиданных настройкисериализацииjson обработкакартинок обработкарасшифровкикомпоновкиданных обходдереваdom объявлениеатрибутаxs объявлениенотацииxs объявлениеэлементаxs описаниеиспользованиясобытиядоступжурналарегистрации описаниеиспользованиясобытияотказвдоступежурналарегистрации описаниеобработкирасшифровкикомпоновкиданных описаниепередаваемогофайла описаниетипов определениегруппыатрибутовxs определениегруппымоделиxs определениеограниченияидентичностиxs определениепростоготипаxs определениесоставноготипаxs определениетипадокументаdom определенияxpathxs отборкомпоновкиданных пакетотображаемыхдокументов параметрвыбора параметркомпоновкиданных параметрызаписиjson параметрызаписиxml параметрычтенияxml переопределениеxs планировщик полеанализаданных полекомпоновкиданных построительdom построительзапроса построительотчета построительотчетаанализаданных построительсхемxml поток потоквпамяти почта почтовоесообщение преобразованиеxsl преобразованиекканоническомуxml процессорвыводарезультатакомпоновкиданныхвколлекциюзначений процессорвыводарезультатакомпоновкиданныхвтабличныйдокумент процессоркомпоновкиданных разыменовательпространствименdom рамка расписаниерегламентногозадания расширенноеимяxml результатчтенияданных своднаядиаграмма связьпараметравыбора связьпотипу связьпотипукомпоновкиданных сериализаторxdto сертификатклиентаwindows сертификатклиентафайл сертификаткриптографии сертификатыудостоверяющихцентровwindows сертификатыудостоверяющихцентровфайл сжатиеданных системнаяинформация сообщениепользователю сочетаниеклавиш сравнениезначений стандартнаядатаначала стандартныйпериод схемаxml схемакомпоновкиданных табличныйдокумент текстовыйдокумент тестируемоеприложение типданныхxml уникальныйидентификатор фабрикаxdto файл файловыйпоток фасетдлиныxs фасетколичестваразрядовдробнойчастиxs фасетмаксимальноговключающегозначенияxs фасетмаксимальногоисключающегозначенияxs фасетмаксимальнойдлиныxs фасетминимальноговключающегозначенияxs фасетминимальногоисключающегозначенияxs фасетминимальнойдлиныxs фасетобразцаxs фасетобщегоколичестваразрядовxs фасетперечисленияxs фасетпробельныхсимволовxs фильтрузловdom форматированнаястрока форматированныйдокумент фрагментxs хешированиеданных хранилищезначения цвет чтениеfastinfoset чтениеhtml чтениеjson чтениеxml чтениеzipфайла чтениеданных чтениетекста чтениеузловdom шрифт элементрезультатакомпоновкиданных "; const v8_universal_collection = "comsafearray деревозначений массив соответствие списокзначений структура таблицазначений фиксированнаяструктура фиксированноесоответствие фиксированныймассив "; const TYPE = v8_shared_object + v8_universal_collection; const LITERAL = "null истина ложь неопределено"; const NUMBERS = hljs2.inherit(hljs2.NUMBER_MODE); const STRINGS = { className: "string", begin: '"|\\|', end: '"|$', contains: [{ begin: '""' }] }; const DATE = { begin: "'", end: "'", excludeBegin: true, excludeEnd: true, contains: [ { className: "number", begin: "\\d{4}([\\.\\\\/:-]?\\d{2}){0,5}" } ] }; const PUNCTUATION = { match: /[;()+\-:=,]/, className: "punctuation", relevance: 0 }; const COMMENTS = hljs2.inherit(hljs2.C_LINE_COMMENT_MODE); const META = { className: "meta", begin: "#|&", end: "$", keywords: { $pattern: UNDERSCORE_IDENT_RE2, keyword: KEYWORD + METAKEYWORD }, contains: [COMMENTS] }; const SYMBOL = { className: "symbol", begin: "~", end: ";|:", excludeEnd: true }; const FUNCTION = { className: "function", variants: [ { begin: "процедура|функция", end: "\\)", keywords: "процедура функция" }, { begin: "конецпроцедуры|конецфункции", keywords: "конецпроцедуры конецфункции" } ], contains: [ { begin: "\\(", end: "\\)", endsParent: true, contains: [ { className: "params", begin: UNDERSCORE_IDENT_RE2, end: ",", excludeEnd: true, endsWithParent: true, keywords: { $pattern: UNDERSCORE_IDENT_RE2, keyword: "знач", literal: LITERAL }, contains: [ NUMBERS, STRINGS, DATE ] }, COMMENTS ] }, hljs2.inherit(hljs2.TITLE_MODE, { begin: UNDERSCORE_IDENT_RE2 }) ] }; return { name: "1C:Enterprise", case_insensitive: true, keywords: { $pattern: UNDERSCORE_IDENT_RE2, keyword: KEYWORD, built_in: BUILTIN, class: CLASS, type: TYPE, literal: LITERAL }, contains: [ META, FUNCTION, COMMENTS, SYMBOL, NUMBERS, STRINGS, DATE, PUNCTUATION ] }; } _1c_1 = _1c; return _1c_1; } var abnf_1; var hasRequiredAbnf; function requireAbnf() { if (hasRequiredAbnf) return abnf_1; hasRequiredAbnf = 1; function abnf(hljs2) { const regex = hljs2.regex; const IDENT = /^[a-zA-Z][a-zA-Z0-9-]*/; const KEYWORDS = [ "ALPHA", "BIT", "CHAR", "CR", "CRLF", "CTL", "DIGIT", "DQUOTE", "HEXDIG", "HTAB", "LF", "LWSP", "OCTET", "SP", "VCHAR", "WSP" ]; const COMMENT2 = hljs2.COMMENT(/;/, /$/); const TERMINAL_BINARY = { scope: "symbol", match: /%b[0-1]+(-[0-1]+|(\.[0-1]+)+)?/ }; const TERMINAL_DECIMAL = { scope: "symbol", match: /%d[0-9]+(-[0-9]+|(\.[0-9]+)+)?/ }; const TERMINAL_HEXADECIMAL = { scope: "symbol", match: /%x[0-9A-F]+(-[0-9A-F]+|(\.[0-9A-F]+)+)?/ }; const CASE_SENSITIVITY = { scope: "symbol", match: /%[si](?=".*")/ }; const RULE_DECLARATION = { scope: "attribute", match: regex.concat(IDENT, /(?=\s*=)/) }; const ASSIGNMENT = { scope: "operator", match: /=\/?/ }; return { name: "Augmented Backus-Naur Form", illegal: /[!@#$^&',?+~`|:]/, keywords: KEYWORDS, contains: [ ASSIGNMENT, RULE_DECLARATION, COMMENT2, TERMINAL_BINARY, TERMINAL_DECIMAL, TERMINAL_HEXADECIMAL, CASE_SENSITIVITY, hljs2.QUOTE_STRING_MODE, hljs2.NUMBER_MODE ] }; } abnf_1 = abnf; return abnf_1; } var accesslog_1; var hasRequiredAccesslog; function requireAccesslog() { if (hasRequiredAccesslog) return accesslog_1; hasRequiredAccesslog = 1; function accesslog(hljs2) { const regex = hljs2.regex; const HTTP_VERBS = [ "GET", "POST", "HEAD", "PUT", "DELETE", "CONNECT", "OPTIONS", "PATCH", "TRACE" ]; return { name: "Apache Access Log", contains: [ // IP { className: "number", begin: /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?\b/, relevance: 5 }, // Other numbers { className: "number", begin: /\b\d+\b/, relevance: 0 }, // Requests { className: "string", begin: regex.concat(/"/, regex.either(...HTTP_VERBS)), end: /"/, keywords: HTTP_VERBS, illegal: /\n/, relevance: 5, contains: [ { begin: /HTTP\/[12]\.\d'/, relevance: 5 } ] }, // Dates { className: "string", // dates must have a certain length, this prevents matching // simple array accesses a[123] and [] and other common patterns // found in other languages begin: /\[\d[^\]\n]{8,}\]/, illegal: /\n/, relevance: 1 }, { className: "string", begin: /\[/, end: /\]/, illegal: /\n/, relevance: 0 }, // User agent / relevance boost { className: "string", begin: /"Mozilla\/\d\.\d \(/, end: /"/, illegal: /\n/, relevance: 3 }, // Strings { className: "string", begin: /"/, end: /"/, illegal: /\n/, relevance: 0 } ] }; } accesslog_1 = accesslog; return accesslog_1; } var actionscript_1; var hasRequiredActionscript; function requireActionscript() { if (hasRequiredActionscript) return actionscript_1; hasRequiredActionscript = 1; function actionscript(hljs2) { const regex = hljs2.regex; const IDENT_RE2 = /[a-zA-Z_$][a-zA-Z0-9_$]*/; const PKG_NAME_RE = regex.concat( IDENT_RE2, regex.concat("(\\.", IDENT_RE2, ")*") ); const IDENT_FUNC_RETURN_TYPE_RE = /([*]|[a-zA-Z_$][a-zA-Z0-9_$]*)/; const AS3_REST_ARG_MODE = { className: "rest_arg", begin: /[.]{3}/, end: IDENT_RE2, relevance: 10 }; const KEYWORDS = [ "as", "break", "case", "catch", "class", "const", "continue", "default", "delete", "do", "dynamic", "each", "else", "extends", "final", "finally", "for", "function", "get", "if", "implements", "import", "in", "include", "instanceof", "interface", "internal", "is", "namespace", "native", "new", "override", "package", "private", "protected", "public", "return", "set", "static", "super", "switch", "this", "throw", "try", "typeof", "use", "var", "void", "while", "with" ]; const LITERALS = [ "true", "false", "null", "undefined" ]; return { name: "ActionScript", aliases: ["as"], keywords: { keyword: KEYWORDS, literal: LITERALS }, contains: [ hljs2.APOS_STRING_MODE, hljs2.QUOTE_STRING_MODE, hljs2.C_LINE_COMMENT_MODE, hljs2.C_BLOCK_COMMENT_MODE, hljs2.C_NUMBER_MODE, { match: [ /\bpackage/, /\s+/, PKG_NAME_RE ], className: { 1: "keyword", 3: "title.class" } }, { match: [ /\b(?:class|interface|extends|implements)/, /\s+/, IDENT_RE2 ], className: { 1: "keyword", 3: "title.class" } }, { className: "meta", beginKeywords: "import include", end: /;/, keywords: { keyword: "import include" } }, { beginKeywords: "function", end: /[{;]/, excludeEnd: true, illegal: /\S/, contains: [ hljs2.inherit(hljs2.TITLE_MODE, { className: "title.function" }), { className: "params", begin: /\(/, end: /\)/, contains: [ hljs2.APOS_STRING_MODE, hljs2.QUOTE_STRING_MODE, hljs2.C_LINE_COMMENT_MODE, hljs2.C_BLOCK_COMMENT_MODE, AS3_REST_ARG_MODE ] }, { begin: regex.concat(/:\s*/, IDENT_FUNC_RETURN_TYPE_RE) } ] }, hljs2.METHOD_GUARD ], illegal: /#/ }; } actionscript_1 = actionscript; return actionscript_1; } var ada_1; var hasRequiredAda; function requireAda() { if (hasRequiredAda) return ada_1; hasRequiredAda = 1; function ada(hljs2) { const INTEGER_RE = "\\d(_|\\d)*"; const EXPONENT_RE = "[eE][-+]?" + INTEGER_RE; const DECIMAL_LITERAL_RE = INTEGER_RE + "(\\." + INTEGER_RE + ")?(" + EXPONENT_RE + ")?"; const BASED_INTEGER_RE = "\\w+"; const BASED_LITERAL_RE = INTEGER_RE + "#" + BASED_INTEGER_RE + "(\\." + BASED_INTEGER_RE + ")?#(" + EXPONENT_RE + ")?"; const NUMBER_RE2 = "\\b(" + BASED_LITERAL_RE + "|" + DECIMAL_LITERAL_RE + ")"; const ID_REGEX = "[A-Za-z](_?[A-Za-z0-9.])*"; const BAD_CHARS = `[]\\{\\}%#'"`; const COMMENTS = hljs2.COMMENT("--", "$"); const VAR_DECLS = { // TODO: These spaces are not required by the Ada syntax // however, I have yet to see handwritten Ada code where // someone does not put spaces around : begin: "\\s+:\\s+", end: "\\s*(:=|;|\\)|=>|$)", // endsWithParent: true, // returnBegin: true, illegal: BAD_CHARS, contains: [ { // workaround to avoid highlighting // named loops and declare blocks beginKeywords: "loop for declare others", endsParent: true }, { // properly highlight all modifiers className: "keyword", beginKeywords: "not null constant access function procedure in out aliased exception" }, { className: "type", begin: ID_REGEX, endsParent: true, relevance: 0 } ] }; const KEYWORDS = [ "abort", "else", "new", "return", "abs", "elsif", "not", "reverse", "abstract", "end", "accept", "entry", "select", "access", "exception", "of", "separate", "aliased", "exit", "or", "some", "all", "others", "subtype", "and", "for", "out", "synchronized", "array", "function", "overriding", "at", "tagged", "generic", "package", "task", "begin", "goto", "pragma", "terminate", "body", "private", "then", "if", "procedure", "type", "case", "in", "protected", "constant", "interface", "is", "raise", "use", "declare", "range", "delay", "limited", "record", "when", "delta", "loop", "rem", "while", "digits", "renames", "with", "do", "mod", "requeue", "xor" ]; return { name: "Ada", case_insensitive: true, keywords: { keyword: KEYWORDS, literal: [ "True", "False" ] }, contains: [ COMMENTS, // strings "foobar" { className: "string", begin: /"/, end: /"/, contains: [ { begin: /""/, relevance: 0 } ] }, // characters '' { // character literals always contain one char className: "string", begin: /'.'/ }, { // number literals className: "number", begin: NUMBER_RE2, relevance: 0 }, { // Attributes className: "symbol", begin: "'" + ID_REGEX }, { // package definition, maybe inside generic className: "title", begin: "(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?", end: "(is|$)", keywords: "package body", excludeBegin: true, excludeEnd: true, illegal: BAD_CHARS }, { // function/procedure declaration/definition // maybe inside generic begin: "(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+", end: "(\\bis|\\bwith|\\brenames|\\)\\s*;)", keywords: "overriding function procedure with is renames return", // we need to re-match the 'function' keyword, so that // the title mode below matches only exactly once returnBegin: true, contains: [ COMMENTS, { // name of the function/procedure className: "title", begin: "(\\bwith\\s+)?\\b(function|procedure)\\s+", end: "(\\(|\\s+|$)", excludeBegin: true, excludeEnd: true, illegal: BAD_CHARS }, // 'self' // // parameter types VAR_DECLS, { // return type className: "type", begin: "\\breturn\\s+", end: "(\\s+|;|$)", keywords: "return", excludeBegin: true, excludeEnd: true, // we are done with functions endsParent: true, illegal: BAD_CHARS } ] }, { // new type declarations // maybe inside generic className: "type", begin: "\\b(sub)?type\\s+", end: "\\s+", keywords: "type", excludeBegin: true, illegal: BAD_CHARS }, // see comment above the definition VAR_DECLS // no markup // relevance boosters for small snippets // {begin: '\\s*=>\\s*'}, // {begin: '\\s*:=\\s*'}, // {begin: '\\s+:=\\s+'}, ] }; } ada_1 = ada; return ada_1; } var angelscript_1; var hasRequiredAngelscript; function requireAngelscript() { if (hasRequiredAngelscript) return angelscript_1; hasRequiredAngelscript = 1; function angelscript(hljs2) { const builtInTypeMode = { className: "built_in", begin: "\\b(void|bool|int8|int16|int32|int64|int|uint8|uint16|uint32|uint64|uint|string|ref|array|double|float|auto|dictionary)" }; const objectHandleMode = { className: "symbol", begin: "[a-zA-Z0-9_]+@" }; const genericMode = { className: "keyword", begin: "<", end: ">", contains: [ builtInTypeMode, objectHandleMode ] }; builtInTypeMode.contains = [genericMode]; objectHandleMode.contains = [genericMode]; const KEYWORDS = [ "for", "in|0", "break", "continue", "while", "do|0", "return", "if", "else", "case", "switch", "namespace", "is", "cast", "or", "and", "xor", "not", "get|0", "in", "inout|10", "out", "override", "set|0", "private", "public", "const", "default|0", "final", "shared", "external", "mixin|10", "enum", "typedef", "funcdef", "this", "super", "import", "from", "interface", "abstract|0", "try", "catch", "protected", "explicit", "property" ]; return { name: "AngelScript", aliases: ["asc"], keywords: KEYWORDS, // avoid close detection with C# and JS illegal: "(^using\\s+[A-Za-z0-9_\\.]+;$|\\bfunction\\s*[^\\(])", contains: [ { // 'strings' className: "string", begin: "'", end: "'", illegal: "\\n", contains: [hljs2.BACKSLASH_ESCAPE], relevance: 0 }, // """heredoc strings""" { className: "string", begin: '"""', end: '"""' }, { // "strings" className: "string", begin: '"', end: '"', illegal: "\\n", contains: [hljs2.BACKSLASH_ESCAPE], relevance: 0 }, hljs2.C_LINE_COMMENT_MODE, // single-line comments hljs2.C_BLOCK_COMMENT_MODE, // comment blocks { // metadata className: "string", begin: "^\\s*\\[", end: "\\]" }, { // interface or namespace declaration beginKeywords: "interface namespace", end: /\{/, illegal: "[;.\\-]", contains: [ { // interface or namespace name className: "symbol", begin: "[a-zA-Z0-9_]+" } ] }, { // class declaration beginKeywords: "class", end: /\{/, illegal: "[;.\\-]", contains: [ { // class name className: "symbol", begin: "[a-zA-Z0-9_]+", contains: [ { begin: "[:,]\\s*", contains: [ { className: "symbol", begin: "[a-zA-Z0-9_]+" } ] } ] } ] }, builtInTypeMode, // built-in types objectHandleMode, // object handles { // literals className: "literal", begin: "\\b(null|true|false)" }, { // numbers className: "number", relevance: 0, begin: "(-?)(\\b0[xXbBoOdD][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?f?|\\.\\d+f?)([eE][-+]?\\d+f?)?)" } ] }; } angelscript_1 = angelscript; return angelscript_1; } var apache_1; var hasRequiredApache; function requireApache() { if (hasRequiredApache) return apache_1; hasRequiredApache = 1; function apache(hljs2) { const NUMBER_REF = { className: "number", begin: /[$%]\d+/ }; const NUMBER = { className: "number", begin: /\b\d+/ }; const IP_ADDRESS = { className: "number", begin: /\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d{1,5})?/ }; const PORT_NUMBER = { className: "number", begin: /:\d{1,5}/ }; return { name: "Apache config", aliases: ["apacheconf"], case_insensitive: true, contains: [ hljs2.HASH_COMMENT_MODE, { className: "section", begin: /<\/?/, end: />/, contains: [ IP_ADDRESS, PORT_NUMBER, // low relevance prevents us from claming XML/HTML where this rule would // match strings inside of XML tags hljs2.inherit(hljs2.QUOTE_STRING_MODE, { relevance: 0 }) ] }, { className: "attribute", begin: /\w+/, relevance: 0, // keywords aren’t needed for highlighting per se, they only boost relevance // for a very generally defined mode (starts with a word, ends with line-end keywords: { _: [ "order", "deny", "allow", "setenv", "rewriterule", "rewriteengine", "rewritecond", "documentroot", "sethandler", "errordocument", "loadmodule", "options", "header", "listen", "serverroot", "servername" ] }, starts: { end: /$/, relevance: 0, keywords: { literal: "on off all deny allow" }, contains: [ { scope: "punctuation", match: /\\\n/ }, { className: "meta", begin: /\s\[/, end: /\]$/ }, { className: "variable", begin: /[\$%]\{/, end: /\}/, contains: [ "self", NUMBER_REF ] }, IP_ADDRESS, NUMBER, hljs2.QUOTE_STRING_MODE ] } } ], illegal: /\S/ }; } apache_1 = apache; return apache_1; } var applescript_1; var hasRequiredApplescript; function requireApplescript() { if (hasRequiredApplescript) return applescript_1; hasRequiredApplescript = 1; function applescript(hljs2) { const regex = hljs2.regex; const STRING = hljs2.inherit( hljs2.QUOTE_STRING_MODE, { illegal: null } ); const PARAMS = { className: "params", begin: /\(/, end: /\)/, contains: [ "self", hljs2.C_NUMBER_MODE, STRING ] }; const COMMENT_MODE_1 = hljs2.COMMENT(/--/, /$/); const COMMENT_MODE_2 = hljs2.COMMENT( /\(\*/, /\*\)/, { contains: [ "self", // allow nesting COMMENT_MODE_1 ] } ); const COMMENTS = [ COMMENT_MODE_1, COMMENT_MODE_2, hljs2.HASH_COMMENT_MODE ]; const KEYWORD_PATTERNS = [ /apart from/, /aside from/, /instead of/, /out of/, /greater than/, /isn't|(doesn't|does not) (equal|come before|come after|contain)/, /(greater|less) than( or equal)?/, /(starts?|ends|begins?) with/, /contained by/, /comes (before|after)/, /a (ref|reference)/, /POSIX (file|path)/, /(date|time) string/, /quoted form/ ]; const BUILT_IN_PATTERNS = [ /clipboard info/, /the clipboard/, /info for/, /list (disks|folder)/, /mount volume/, /path to/, /(close|open for) access/, /(get|set) eof/, /current date/, /do shell script/, /get volume settings/, /random number/, /set volume/, /system attribute/, /system info/, /time to GMT/, /(load|run|store) script/, /scripting components/, /ASCII (character|number)/, /localized string/, /choose (application|color|file|file name|folder|from list|remote application|URL)/, /display (alert|dialog)/ ]; return { name: "AppleScript", aliases: ["osascript"], keywords: { keyword: "about above after against and around as at back before beginning behind below beneath beside between but by considering contain contains continue copy div does eighth else end equal equals error every exit fifth first for fourth from front get given global if ignoring in into is it its last local me middle mod my ninth not of on onto or over prop property put ref reference repeat returning script second set seventh since sixth some tell tenth that the|0 then third through thru timeout times to transaction try until where while whose with without", literal: "AppleScript false linefeed return pi quote result space tab true", built_in: "alias application boolean class constant date file integer list number real record string text activate beep count delay launch log offset read round run say summarize write character characters contents day frontmost id item length month name|0 paragraph paragraphs rest reverse running time version weekday word words year" }, contains: [ STRING, hljs2.C_NUMBER_MODE, { className: "built_in", begin: regex.concat( /\b/, regex.either(...BUILT_IN_PATTERNS), /\b/ ) }, { className: "built_in", begin: /^\s*return\b/ }, { className: "literal", begin: /\b(text item delimiters|current application|missing value)\b/ }, { className: "keyword", begin: regex.concat( /\b/, regex.either(...KEYWORD_PATTERNS), /\b/ ) }, { beginKeywords: "on", illegal: /[${=;\n]/, contains: [ hljs2.UNDERSCORE_TITLE_MODE, PARAMS ] }, ...COMMENTS ], illegal: /\/\/|->|=>|\[\[/ }; } applescript_1 = applescript; return applescript_1; } var arcade_1; var hasRequiredArcade; function requireArcade() { if (hasRequiredArcade) return arcade_1; hasRequiredArcade = 1; function arcade(hljs2) { const regex = hljs2.regex; const IDENT_RE2 = "[A-Za-z_][0-9A-Za-z_]*"; const KEYWORDS = { keyword: [ "break", "case", "catch", "continue", "debugger", "do", "else", "export", "for", "function", "if", "import", "in", "new", "of", "return", "switch", "try", "var", "void", "while" ], literal: [ "BackSlash", "DoubleQuote", "ForwardSlash", "Infinity", "NaN", "NewLine", "PI", "SingleQuote", "Tab", "TextFormatting", "false", "null", "true", "undefined" ], built_in: [ "Abs", "Acos", "All", "Angle", "Any", "Area", "AreaGeodetic", "Array", "Asin", "Atan", "Atan2", "Attachments", "Average", "Back", "Bearing", "Boolean", "Buffer", "BufferGeodetic", "Ceil", "Centroid", "ChangeTimeZone", "Clip", "Concatenate", "Console", "Constrain", "Contains", "ConvertDirection", "ConvexHull", "Cos", "Count", "Crosses", "Cut", "Date|0", "DateAdd", "DateDiff", "DateOnly", "Day", "Decode", "DefaultValue", "Densify", "DensifyGeodetic", "Dictionary", "Difference", "Disjoint", "Distance", "DistanceGeodetic", "DistanceToCoordinate", "Distinct", "Domain", "DomainCode", "DomainName", "EnvelopeIntersects", "Equals", "Erase", "Exp", "Expects", "Extent", "Feature", "FeatureInFilter", "FeatureSet", "FeatureSetByAssociation", "FeatureSetById", "FeatureSetByName", "FeatureSetByPortalItem", "FeatureSetByRelationshipClass", "FeatureSetByRelationshipName", "Filter", "FilterBySubtypeCode", "Find", "First|0", "Floor", "FromCharCode", "FromCodePoint", "FromJSON", "Front", "GdbVersion", "Generalize", "Geometry", "GetEnvironment", "GetFeatureSet", "GetFeatureSetInfo", "GetUser", "GroupBy", "Guid", "HasKey", "HasValue", "Hash", "Hour", "IIf", "ISOMonth", "ISOWeek", "ISOWeekday", "ISOYear", "Includes", "IndexOf", "Insert", "Intersection", "Intersects", "IsEmpty", "IsNan", "IsSelfIntersecting", "IsSimple", "KnowledgeGraphByPortalItem", "Left|0", "Length", "Length3D", "LengthGeodetic", "Log", "Lower", "Map", "Max", "Mean", "MeasureToCoordinate", "Mid", "Millisecond", "Min", "Minute", "Month", "MultiPartToSinglePart", "Multipoint", "NearestCoordinate", "NearestVertex", "NextSequenceValue", "None", "Now", "Number", "Offset", "OrderBy", "Overlaps", "Point", "PointToCoordinate", "Polygon", "Polyline", "Pop", "Portal", "Pow", "Proper", "Push", "QueryGraph", "Random", "Reduce", "Relate", "Replace", "Resize", "Reverse", "Right|0", "RingIsClockwise", "Rotate", "Round", "Schema", "Second", "SetGeometry", "Simplify", "Sin", "Slice", "Sort", "Splice", "Split", "Sqrt", "StandardizeFilename", "StandardizeGuid", "Stdev", "SubtypeCode", "SubtypeName", "Subtypes", "Sum", "SymmetricDifference", "Tan", "Text", "Time", "TimeZone", "TimeZoneOffset", "Timestamp", "ToCharCode", "ToCodePoint", "ToHex", "ToLocal", "ToUTC", "Today", "Top|0", "Touches", "TrackAccelerationAt", "TrackAccelerationWindow", "TrackCurrentAcceleration", "TrackCurrentDistance", "TrackCurrentSpeed", "TrackCurrentTime", "TrackDistanceAt", "TrackDistanceWindow", "TrackDuration", "TrackFieldWindow", "TrackGeometryWindow", "TrackIndex", "TrackSpeedAt", "TrackSpeedWindow", "TrackStartTime", "TrackWindow", "Trim", "TypeOf", "Union", "Upper", "UrlEncode", "Variance", "Week", "Weekday", "When|0", "Within", "Year|0" ] }; const PROFILE_VARS = [ "aggregatedFeatures", "analytic", "config", "datapoint", "datastore", "editcontext", "feature", "featureSet", "feedfeature", "fencefeature", "fencenotificationtype", "graph", "join", "layer", "locationupdate", "map", "measure", "measure", "originalFeature", "record", "reference", "rowindex", "sourcedatastore", "sourcefeature", "sourcelayer", "target", "targetdatastore", "targetfeature", "targetlayer", "userInput", "value", "variables", "view" ]; const SYMBOL = { className: "symbol", begin: "\\$" + regex.either(...PROFILE_VARS) }; const NUMBER = { className: "number", variants: [ { begin: "\\b(0[bB][01]+)" }, { begin: "\\b(0[oO][0-7]+)" }, { begin: hljs2.C_NUMBER_RE } ], relevance: 0 }; const SUBST = { className: "subst", begin: "\\$\\{", end: "\\}", keywords: KEYWORDS, contains: [] // defined later }; const TEMPLATE_STRING = { className: "string", begin: "`", end: "`", contains: [ hljs2.BACKSLASH_ESCAPE, SUBST ] }; SUBST.contains = [ hljs2.APOS_STRING_MODE, hljs2.QUOTE_STRING_MODE, TEMPLATE_STRING, NUMBER, hljs2.REGEXP_MODE ]; const PARAMS_CONTAINS = SUBST.contains.concat([ hljs2.C_BLOCK_COMMENT_MODE, hljs2.C_LINE_COMMENT_MODE ]); return { name: "ArcGIS Arcade", case_insensitive: true, keywords: KEYWORDS, contains: [ hljs2.APOS_STRING_MODE, hljs2.QUOTE_STRING_MODE, TEMPLATE_STRING, hljs2.C_LINE_COMMENT_MODE, hljs2.C_BLOCK_COMMENT_MODE, SYMBOL, NUMBER, { // object attr container begin: /[{,]\s*/, relevance: 0, contains: [ { begin: IDENT_RE2 + "\\s*:", returnBegin: true, relevance: 0, contains: [ { className: "attr", begin: IDENT_RE2, relevance: 0 } ] } ] }, { // "value" container begin: "(" + hljs2.RE_STARTERS_RE + "|\\b(return)\\b)\\s*", keywords: "return", contains: [ hljs2.C_LINE_COMMENT_MODE, hljs2.C_BLOCK_COMMENT_MODE, hljs2.REGEXP_MODE, { className: "function", begin: "(\\(.*?\\)|" + IDENT_RE2 + ")\\s*=>", returnBegin: true, end: "\\s*=>", contains: [ { className: "params", variants: [ { begin: IDENT_RE2 }, { begin: /\(\s*\)/ }, { begin: /\(/, end: /\)/, excludeBegin: true, excludeEnd: true, keywords: KEYWORDS, contains: PARAMS_CONTAINS } ] } ] } ], relevance: 0 }, { beginKeywords: "function", end: /\{/, excludeEnd: true, contains: [ hljs2.inherit(hljs2.TITLE_MODE, { className: "title.function", begin: IDENT_RE2 }), { className: "params", begin: /\(/, end: /\)/, excludeBegin: true, excludeEnd: true, contains: PARAMS_CONTAINS } ], illegal: /\[|%/ }, { begin: /\$[(.]/ } ], illegal: /#(?!!)/ }; } arcade_1 = arcade; return arcade_1; } var arduino_1; var hasRequiredArduino; function requireArduino() { if (hasRequiredArduino) return arduino_1; hasRequiredArduino = 1; function cPlusPlus(hljs2) { const regex = hljs2.regex; const C_LINE_COMMENT_MODE2 = hljs2.COMMENT("//", "$", { contains: [{ begin: /\\\n/ }] }); const DECLTYPE_AUTO_RE = "decltype\\(auto\\)"; const NAMESPACE_RE = "[a-zA-Z_]\\w*::"; const TEMPLATE_ARGUMENT_RE = "<[^<>]+>"; const FUNCTION_TYPE_RE = "(?!struct)(" + DECLTYPE_AUTO_RE + "|" + regex.optional(NAMESPACE_RE) + "[a-zA-Z_]\\w*" + regex.optional(TEMPLATE_ARGUMENT_RE) + ")"; const CPP_PRIMITIVE_TYPES = { className: "type", begin: "\\b[a-z\\d_]*_t\\b" }; const CHARACTER_ESCAPES = "\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)"; const STRINGS = { className: "string", variants: [ { begin: '(u8?|U|L)?"', end: '"', illegal: "\\n", contains: [hljs2.BACKSLASH_ESCAPE] }, { begin: "(u8?|U|L)?'(" + CHARACTER_ESCAPES + "|.)", end: "'", illegal: "." }, hljs2.END_SAME_AS_BEGIN({ begin: /(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/, end: /\)([^()\\ ]{0,16})"/ }) ] }; const NUMBERS = { className: "number", variants: [ // Floating-point literal. { begin: "[+-]?(?:(?:[0-9](?:'?[0-9])*\\.(?:[0-9](?:'?[0-9])*)?|\\.[0-9](?:'?[0-9])*)(?:[Ee][+-]?[0-9](?:'?[0-9])*)?|[0-9](?:'?[0-9])*[Ee][+-]?[0-9](?:'?[0-9])*|0[Xx](?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*(?:\\.(?:[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)?)?|\\.[0-9A-Fa-f](?:'?[0-9A-Fa-f])*)[Pp][+-]?[0-9](?:'?[0-9])*)(?:[Ff](?:16|32|64|128)?|(BF|bf)16|[Ll]|)" }, // Integer literal. { begin: "[+-]?\\b(?:0[Bb][01](?:'?[01])*|0[Xx][0-9A-Fa-f](?:'?[0-9A-Fa-f])*|0(?:'?[0-7])*|[1-9](?:'?[0-9])*)(?:[Uu](?:LL?|ll?)|[Uu][Zz]?|(?:LL?|ll?)[Uu]?|[Zz][Uu]|)" // Note: there are user-defined literal suffixes too, but perhaps having the custom suffix not part of the // literal highlight actually makes it stand out more. } ], relevance: 0 }; const PREPROCESSOR = { className: "meta", begin: /#\s*[a-z]+\b/, end: /$/, keywords: { keyword: "if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" }, contains: [ { begin: /\\\n/, relevance: 0 }, hljs2.inherit(STRINGS, { className: "string" }), { className: "string", begin: /<.*?>/ }, C_LINE_COMMENT_MODE2, hljs2.C_BLOCK_COMMENT_MODE ] }; const TITLE_MODE2 = { className: "title", begin: regex.optional(NAMESPACE_RE) + hljs2.IDENT_RE, relevance: 0 }; const FUNCTION_TITLE = regex.optional(NAMESPACE_RE) + hljs2.IDENT_RE + "\\s*\\("; const RESERVED_KEYWORDS = [ "alignas", "alignof", "and", "and_eq", "asm", "atomic_cancel", "atomic_commit", "atomic_noexcept", "auto", "bitand", "bitor", "break", "case", "catch", "class", "co_await", "co_return", "co_yield", "compl", "concept", "const_cast|10", "consteval", "constexpr", "constinit", "continue", "decltype", "default", "delete", "do", "dynamic_cast|10", "else", "enum", "explicit", "export", "extern", "false", "final", "for", "friend", "goto", "if", "import", "inline", "module", "mutable", "namespace", "new", "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", "override", "private", "protected", "public", "reflexpr", "register", "reinterpret_cast|10", "requires", "return", "sizeof", "static_assert", "static_cast|10", "struct", "switch", "synchronized", "template", "this", "thread_local", "throw", "transaction_safe", "transaction_safe_dynamic", "true", "try", "typedef", "typeid", "typename", "union", "using", "virtual", "volatile", "while", "xor", "xor_eq" ]; const RESERVED_TYPES = [ "bool", "char", "char16_t", "char32_t", "char8_t", "double", "float", "int", "long", "short", "void", "wchar_t", "unsigned", "signed", "const", "static" ]; const TYPE_HINTS = [ "any", "auto_ptr", "barrier", "binary_semaphore", "bitset", "complex", "condition_variable", "condition_variable_any", "counting_semaphore", "deque", "false_type", "flat_map", "flat_set", "future", "imaginary", "initializer_list", "istringstream", "jthread", "latch", "lock_guard", "multimap", "multiset", "mutex", "optional", "ostringstream", "packaged_task", "pair", "promise", "priority_queue", "queue", "recursive_mutex", "recursive_timed_mutex", "scoped_lock", "set", "shared_future", "shared_lock", "shared_mutex", "shared_timed_mutex", "shared_ptr", "stack", "string_view", "stringstream", "timed_mutex", "thread", "true_type", "tuple", "unique_lock", "unique_ptr", "unordered_map", "unordered_multimap", "unordered_multiset", "unordered_set", "variant", "vector", "weak_ptr", "wstring", "wstring_view" ]; const FUNCTION_HINTS = [ "abort", "abs", "acos", "apply", "as_const", "asin", "atan", "atan2", "calloc", "ceil", "cerr", "cin", "clog", "cos", "cosh", "cout", "declval", "endl", "exchange", "exit", "exp", "fabs", "floor", "fmod", "forward", "fprintf", "fputs", "free", "frexp", "fscanf", "future", "invoke", "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower", "isprint", "ispunct", "isspace", "isupper", "isxdigit", "labs", "launder", "ldexp", "log", "log10", "make_pair", "make_shared", "make_shared_for_overwrite", "make_tuple", "make_unique", "malloc", "memchr", "memcmp", "memcpy", "memset", "modf", "move", "pow", "printf", "putchar", "puts", "realloc", "scanf", "sin", "sinh", "snprintf", "sprintf", "sqrt", "sscanf", "std", "stderr", "stdin", "stdout", "strcat", "strchr", "strcmp", "strcpy", "strcspn", "strlen", "strncat", "strncmp", "strncpy", "strpbrk", "strrchr", "strspn", "strstr", "swap", "tan", "tanh", "terminate", "to_underlying", "tolower", "toupper", "vfprintf", "visit", "vprintf", "vsprintf" ]; const LITERALS = [ "NULL", "false", "nullopt", "nullptr", "true" ]; const BUILT_IN = ["_Pragma"]; const CPP_KEYWORDS = { type: RESERVED_TYPES, keyword: RESERVED_KEYWORDS, literal: LITERALS, built_in: BUILT_IN, _type_hints: TYPE_HINTS }; const FUNCTION_DISPATCH = { className: "function.dispatch", relevance: 0, keywords: { // Only for relevance, not highlighting. _hint: FUNCTION_HINTS }, begin: regex.concat( /\b/, /(?!decltype)/, /(?!if)/, /(?!for)/, /(?!switch)/, /(?!while)/, hljs2.IDENT_RE, regex.lookahead(/(<[^<>]+>|)\s*\(/) ) }; const EXPRESSION_CONTAINS = [ FUNCTION_DISPATCH, PREPROCESSOR, CPP_PRIMITIVE_TYPES, C_LINE_COMMENT_MODE2, hljs2.C_BLOCK_COMMENT_MODE, NUMBERS, STRINGS ]; const EXPRESSION_CONTEXT = { // This mode covers expression context where we can't expect a function // definition and shouldn't highlight anything that looks like one: // `return some()`, `else if()`, `(x*sum(1, 2))` variants: [ { begin: /=/, end: /;/ }, { begin: /\(/, end: /\)/ }, { beginKeywords: "new throw return else", end: /;/ } ], keywords: CPP_KEYWORDS, contains: EXPRESSION_CONTAINS.concat([ { begin: /\(/, end: /\)/, keywords: CPP_KEYWORDS, contains: EXPRESSION_CONTAINS.concat(["self"]), relevance: 0 } ]), relevance: 0 }; const FUNCTION_DECLARATION = { className: "function", begin: "(" + FUNCTION_TYPE_RE + "[\\*&\\s]+)+" + FUNCTION_TITLE, returnBegin: true, end: /[{;=]/, excludeEnd: true, keywords: CPP_KEYWORDS, illegal: /[^\w\s\*&:<>.]/, contains: [ { // to prevent it from being confused as the function title begin: DECLTYPE_AUTO_RE, keywords: CPP_KEYWORDS, relevance: 0 }, { begin: FUNCTION_TITLE, returnBegin: true, contains: [TITLE_MODE2], relevance: 0 }, // needed because we do not have look-behind on the below rule // to prevent it from grabbing the final : in a :: pair { begin: /::/, relevance: 0 }, // initializers { begin: /:/, endsWithParent: true, contains: [ STRINGS, NUMBERS ] }, // allow for multiple declarations, e.g.: // extern void f(int), g(char); { relevance: 0, match: /,/ }, { className: "params", begin: /\(/, end: /\)/, keywords: CPP_KEYWORDS, relevance: 0, contains: [ C_LINE_COMMENT_MODE2, hljs2.C_BLOCK_COMMENT_MODE, STRINGS, NUMBERS, CPP_PRIMITIVE_TYPES, // Count matching parentheses. { begin: /\(/, end: /\)/, keywords: CPP_KEYWORDS, relevance: 0, contains: [ "self", C_LINE_COMMENT_MODE2, hljs2.C_BLOCK_COMMENT_MODE, STRINGS, NUMBERS, CPP_PRIMITIVE_TYPES ] } ] }, CPP_PRIMITIVE_TYPES, C_LINE_COMMENT_MODE2, hljs2.C_BLOCK_COMMENT_MODE, PREPROCESSOR ] }; return { name: "C++", aliases: [ "cc", "c++", "h++", "hpp", "hh", "hxx", "cxx" ], keywords: CPP_KEYWORDS, illegal: " rooms (9);` begin: "\\b(deque|list|queue|priority_queue|pair|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array|tuple|optional|variant|function|flat_map|flat_set)\\s*<(?!<)", end: ">", keywords: CPP_KEYWORDS, contains: [ "self", CPP_PRIMITIVE_TYPES ] }, { begin: hljs2.IDENT_RE + "::", keywords: CPP_KEYWORDS }, { match: [ // extra complexity to deal with `enum class` and `enum struct` /\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/, /\s+/, /\w+/ ], className: { 1: "keyword", 3: "title.class" } } ] ) }; } function arduino(hljs2) { const ARDUINO_KW = { type: [ "boolean", "byte", "word", "String" ], built_in: [ "KeyboardController", "MouseController", "SoftwareSerial", "EthernetServer", "EthernetClient", "LiquidCrystal", "RobotControl", "GSMVoiceCall", "EthernetUDP", "EsploraTFT", "HttpClient", "RobotMotor", "WiFiClient", "GSMScanner", "FileSystem", "Scheduler", "GSMServer", "YunClient", "YunServer", "IPAddress", "GSMClient", "GSMModem", "Keyboard", "Ethernet", "Console", "GSMBand", "Esplora", "Stepper", "Process", "WiFiUDP", "GSM_SMS", "Mailbox", "USBHost", "Firmata", "PImage", "Client", "Server", "GSMPIN", "FileIO", "Bridge", "Serial", "EEPROM", "Stream", "Mouse", "Audio", "Servo", "File", "Task", "GPRS", "WiFi", "Wire", "TFT", "GSM", "SPI", "SD" ], _hints: [ "setup", "loop", "runShellCommandAsynchronously", "analogWriteResolution", "retrieveCallingNumber", "printFirmwareVersion", "analogReadResolution", "sendDigitalPortPair", "noListenOnLocalhost", "readJoystickButton", "setFirmwareVersion", "readJoystickSwitch", "scrollDisplayRight", "getVoiceCallStatus", "scrollDisplayLeft", "writeMicroseconds", "delayMicroseconds", "beginTransmission", "getSignalStrength", "runAsynchronously", "getAsynchronously", "listenOnLocalhost", "getCurrentCarrier", "readAccelerometer", "messageAvailable", "sendDigitalPorts", "lineFollowConfig", "countryNameWrite", "runShellCommand", "readStringUntil", "rewindDirectory", "readTemperature", "setClockDivider", "readLightSensor", "endTransmission", "analogReference", "detachInterrupt", "countryNameRead", "attachInterrupt", "encryptionType", "readBytesUntil", "robotNameWrite", "readMicrophone", "robotNameRead", "cityNameWrite", "userNameWrite", "readJoystickY", "readJoystickX", "mouseReleased", "openNextFile", "scanNetworks", "noInterrupts", "digitalWrite", "beginSpeaker", "mousePressed", "isActionDone", "mouseDragged", "displayLogos", "noAutoscroll", "addParameter", "remoteNumber", "getModifiers", "keyboardRead", "userNameRead", "waitContinue", "processInput", "parseCommand", "printVersion", "readNetworks", "writeMessage", "blinkVersion", "cityNameRead", "readMessage", "setDataMode", "parsePacket", "isListening", "setBitOrder", "beginPacket", "isDirectory", "motorsWrite", "drawCompass", "digitalRead", "clearScreen", "serialEvent", "rightToLeft", "setTextSize", "leftToRight", "requestFrom", "keyReleased", "compassRead", "analogWrite", "interrupts", "WiFiServer", "disconnect", "playMelody", "parseFloat", "autoscroll", "getPINUsed", "setPINUsed", "setTimeout", "sendAnalog", "readSlider", "analogRead", "beginWrite", "createChar", "motorsStop", "keyPressed", "tempoWrite", "readButton", "subnetMask", "debugPrint", "macAddress", "writeGreen", "randomSeed", "attachGPRS", "readString", "sendString", "remotePort", "releaseAll", "mouseMoved", "background", "getXChange", "getYChange", "answerCall", "getResult", "voiceCall", "endPacket", "constrain", "getSocket", "writeJSON", "getButton", "available", "connected", "findUntil", "readBytes", "exitValue", "readGreen", "writeBlue", "startLoop", "IPAddress", "isPressed", "sendSysex", "pauseMode", "gatewayIP", "setCursor", "getOemKey", "tuneWrite", "noDisplay", "loadImage", "switchPIN", "onRequest", "onReceive", "changePIN", "playFile", "noBuffer", "parseInt", "overflow", "checkPIN", "knobRead", "beginTFT", "bitClear", "updateIR", "bitWrite", "position", "writeRGB", "highByte", "writeRed", "setSpeed", "readBlue", "noStroke", "remoteIP", "transfer", "shutdown", "hangCall", "beginSMS", "endWrite", "attached", "maintain", "noCursor", "checkReg", "checkPUK", "shiftOut", "isValid", "shiftIn", "pulseIn", "connect", "println", "localIP", "pinMode", "getIMEI", "display", "noBlink", "process", "getBand", "running", "beginSD", "drawBMP", "lowByte", "setBand", "release", "bitRead", "prepare", "pointTo", "readRed", "setMode", "noFill", "remove", "listen", "stroke", "detach", "attach", "noTone", "exists", "buffer", "height", "bitSet", "circle", "config", "cursor", "random", "IRread", "setDNS", "endSMS", "getKey", "micros", "millis", "begin", "print", "write", "ready", "flush", "width", "isPIN", "blink", "clear", "press", "mkdir", "rmdir", "close", "point", "yield", "image", "BSSID", "click", "delay", "read", "text", "move", "peek", "beep", "rect", "line", "open", "seek", "fill", "size", "turn", "stop", "home", "find", "step", "tone", "sqrt", "RSSI", "SSID", "end", "bit", "tan", "cos", "sin", "pow", "map", "abs", "max", "min", "get", "run", "put" ], literal: [ "DIGITAL_MESSAGE", "FIRMATA_STRING", "ANALOG_MESSAGE", "REPORT_DIGITAL", "REPORT_ANALOG", "INPUT_PULLUP", "SET_PIN_MODE", "INTERNAL2V56", "SYSTEM_RESET", "LED_BUILTIN", "INTERNAL1V1", "SYSEX_START", "INTERNAL", "EXTERNAL", "DEFAULT", "OUTPUT", "INPUT", "HIGH", "LOW" ] }; const ARDUINO = cPlusPlus(hljs2); const kws = ( /** @type {Record} */ ARDUINO.keywords ); kws.type = [ ...kws.type, ...ARDUINO_KW.type ]; kws.literal = [ ...kws.literal, ...ARDUINO_KW.literal ]; kws.built_in = [ ...kws.built_in, ...ARDUINO_KW.built_in ]; kws._hints = ARDUINO_KW._hints; ARDUINO.name = "Arduino"; ARDUINO.aliases = ["ino"]; ARDUINO.supersetOf = "cpp"; return ARDUINO; } arduino_1 = arduino; return arduino_1; } var armasm_1; var hasRequiredArmasm; function requireArmasm() { if (hasRequiredArmasm) return armasm_1; hasRequiredArmasm = 1; function armasm(hljs2) { const COMMENT2 = { variants: [ hljs2.COMMENT("^[ \\t]*(?=#)", "$", { relevance: 0, excludeBegin: true }), hljs2.COMMENT("[;@]", "$", { relevance: 0 }), hljs2.C_LINE_COMMENT_MODE, hljs2.C_BLOCK_COMMENT_MODE ] }; return { name: "ARM Assembly", case_insensitive: true, aliases: ["arm"], keywords: { $pattern: "\\.?" + hljs2.IDENT_RE, meta: ( // GNU preprocs ".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND " ), built_in: "r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 w0 w1 w2 w3 w4 w5 w6 w7 w8 w9 w10 w11 w12 w13 w14 w15 w16 w17 w18 w19 w20 w21 w22 w23 w24 w25 w26 w27 w28 w29 w30 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 x11 x12 x13 x14 x15 x16 x17 x18 x19 x20 x21 x22 x23 x24 x25 x26 x27 x28 x29 x30 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @" }, contains: [ { className: "keyword", begin: "\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?(?=\\s)" // followed by space }, COMMENT2, hljs2.QUOTE_STRING_MODE, { className: "string", begin: "'", end: "[^\\\\]'", relevance: 0 }, { className: "title", begin: "\\|", end: "\\|", illegal: "\\n", relevance: 0 }, { className: "number", variants: [ { // hex begin: "[#$=]?0x[0-9a-f]+" }, { // bin begin: "[#$=]?0b[01]+" }, { // literal begin: "[#$=]\\d+" }, { // bare number begin: "\\b\\d+" } ], relevance: 0 }, { className: "symbol", variants: [ { // GNU ARM syntax begin: "^[ \\t]*[a-z_\\.\\$][a-z0-9_\\.\\$]+:" }, { // ARM syntax begin: "^[a-z_\\.\\$][a-z0-9_\\.\\$]+" }, { // label reference begin: "[=#]\\w+" } ], relevance: 0 } ] }; } armasm_1 = armasm; return armasm_1; } var xml_1; var hasRequiredXml; function requireXml() { if (hasRequiredXml) return xml_1; hasRequiredXml = 1; function xml(hljs2) { const regex = hljs2.regex; const TAG_NAME_RE = regex.concat(/[\p{L}_]/u, regex.optional(/[\p{L}0-9_.-]*:/u), /[\p{L}0-9_.-]*/u); const XML_IDENT_RE = /[\p{L}0-9._:-]+/u; const XML_ENTITIES = { className: "symbol", begin: /&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/ }; const XML_META_KEYWORDS = { begin: /\s/, contains: [ { className: "keyword", begin: /#?[a-z_][a-z1-9_-]+/, illegal: /\n/ } ] }; const XML_META_PAR_KEYWORDS = hljs2.inherit(XML_META_KEYWORDS, { begin: /\(/, end: /\)/ }); const APOS_META_STRING_MODE = hljs2.inherit(hljs2.APOS_STRING_MODE, { className: "string" }); const QUOTE_META_STRING_MODE = hljs2.inherit(hljs2.QUOTE_STRING_MODE, { className: "string" }); const TAG_INTERNALS = { endsWithParent: true, illegal: /`]+/ } ] } ] } ] }; return { name: "HTML, XML", aliases: [ "html", "xhtml", "rss", "atom", "xjb", "xsd", "xsl", "plist", "wsf", "svg" ], case_insensitive: true, unicodeRegex: true, contains: [ { className: "meta", begin: //, relevance: 10, contains: [ XML_META_KEYWORDS, QUOTE_META_STRING_MODE, APOS_META_STRING_MODE, XML_META_PAR_KEYWORDS, { begin: /\[/, end: /\]/, contains: [ { className: "meta", begin: //, contains: [ XML_META_KEYWORDS, XML_META_PAR_KEYWORDS, QUOTE_META_STRING_MODE, APOS_META_STRING_MODE ] } ] } ] }, hljs2.COMMENT( //, { relevance: 10 } ), { begin: //, relevance: 10 }, XML_ENTITIES, // xml processing instructions { className: "meta", end: /\?>/, variants: [ { begin: /<\?xml/, relevance: 10, contains: [ QUOTE_META_STRING_MODE ] }, { begin: /<\?[a-z][a-z0-9]+/ } ] }, { className: "tag", /* The lookahead pattern (?=...) ensures that 'begin' only matches ')/, end: />/, keywords: { name: "style" }, contains: [TAG_INTERNALS], starts: { end: /<\/style>/, returnEnd: true, subLanguage: [ "css", "xml" ] } }, { className: "tag", // See the comment in the