Refact for 0.2.0; Modular View Extension System; Canvas View; Object View; Numerous optimizations
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
/**
|
||||
* Code Scripts Loader - Loads Prism.js for syntax highlighting
|
||||
* Shared across code view modules (Python, JavaScript, CSS, YAML, Markdown)
|
||||
*/
|
||||
|
||||
import { loadScriptText } from "./base_view.js";
|
||||
import { triggerViewsRefresh } from "./view_loader.js";
|
||||
|
||||
const PRISM_FILES = [
|
||||
"prism.min.txt",
|
||||
"prism-python.min.txt",
|
||||
"prism-javascript.min.txt",
|
||||
"prism-css.min.txt",
|
||||
"prism-markup.min.txt",
|
||||
"prism-json.min.txt",
|
||||
"prism-bash.min.txt",
|
||||
];
|
||||
|
||||
let prismScripts = null;
|
||||
let loadPromise = null;
|
||||
|
||||
/**
|
||||
* Load all Prism scripts
|
||||
* @param {string} basePath - Base path for scripts (web folder)
|
||||
* @returns {Promise<string>}
|
||||
*/
|
||||
export async function loadPrismScripts(basePath) {
|
||||
if (prismScripts) return prismScripts;
|
||||
if (loadPromise) return loadPromise;
|
||||
|
||||
loadPromise = (async () => {
|
||||
try {
|
||||
const scripts = await Promise.all(
|
||||
PRISM_FILES.map(file => loadScriptText(`${basePath}/views/code_scripts/${file}`))
|
||||
);
|
||||
prismScripts = scripts.join("\n");
|
||||
if (prismScripts) {
|
||||
triggerViewsRefresh();
|
||||
}
|
||||
return prismScripts;
|
||||
} catch (e) {
|
||||
console.error("[WAS Viewer] Failed to load Prism scripts:", e);
|
||||
return "";
|
||||
}
|
||||
})();
|
||||
|
||||
return loadPromise;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get loaded Prism scripts
|
||||
* @returns {string|null}
|
||||
*/
|
||||
export function getPrismScripts() {
|
||||
return prismScripts;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if Prism scripts are loaded
|
||||
* @returns {boolean}
|
||||
*/
|
||||
export function isPrismReady() {
|
||||
return prismScripts !== null && prismScripts.length > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Prism theme styles
|
||||
* @param {object} theme - Theme tokens
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getPrismTheme(theme) {
|
||||
return `
|
||||
code[class*="language-"], pre[class*="language-"] {
|
||||
color: ${theme.fg};
|
||||
text-shadow: none;
|
||||
font-family: "Fira Code", Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
font-size: 13px;
|
||||
text-align: left;
|
||||
white-space: pre-wrap;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: break-word;
|
||||
line-height: 1.5;
|
||||
tab-size: 4;
|
||||
hyphens: none;
|
||||
}
|
||||
pre[class*="language-"] {
|
||||
padding: 12px;
|
||||
margin: 0;
|
||||
overflow: auto;
|
||||
border-radius: 6px;
|
||||
background: rgba(0,0,0,0.3);
|
||||
}
|
||||
:not(pre) > code[class*="language-"] {
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
background: rgba(0,0,0,0.2);
|
||||
}
|
||||
.token.comment, .token.prolog, .token.doctype, .token.cdata { color: #6a9955; }
|
||||
.token.punctuation { color: ${theme.fg}; }
|
||||
.token.namespace { opacity: .7; }
|
||||
.token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: #b5cea8; }
|
||||
.token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #ce9178; }
|
||||
.token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #d4d4d4; }
|
||||
.token.atrule, .token.attr-value, .token.keyword { color: #569cd6; }
|
||||
.token.function, .token.class-name { color: #dcdcaa; }
|
||||
.token.regex, .token.important, .token.variable { color: #d16969; }
|
||||
.token.important, .token.bold { font-weight: bold; }
|
||||
.token.italic { font-style: italic; }
|
||||
`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Prism script tags for iframe injection
|
||||
* @returns {string}
|
||||
*/
|
||||
export function getPrismScriptTags() {
|
||||
if (!prismScripts) return "";
|
||||
return `
|
||||
<script>${prismScripts}<\/script>
|
||||
<script>document.addEventListener('DOMContentLoaded', () => Prism.highlightAll());<\/script>
|
||||
`;
|
||||
}
|
||||
Reference in New Issue
Block a user