CI/CD test
Some checks failed
Build and Deploy Nuxt / build (push) Has been cancelled

This commit is contained in:
2026-05-02 16:15:36 +02:00
parent 139e7d0ef5
commit 3fdced84bf
7 changed files with 315 additions and 31 deletions

View File

@@ -1,15 +1,25 @@
import { Marked } from "marked";
const marker = new Marked();
// optional: use a shared marked instance inside renderer
const renderMarkdown = (text) => marker.parse(text);
const WidgetMap = {
const widget_map = {
test: () => import("~/components/viewer/widgets/TestWidget.vue"),
table: () => import("~/components/viewer/widgets/TableWidget.vue"),
roll: () => import("~/components/viewer/widgets/RollWidget.vue"),
};
const componentCache = {}
const GetWidget = (type) => {
if (!componentCache[type]) {
componentCache[type] = defineAsyncComponent(
widget_map[type]
)
}
return componentCache[type]
}
const marker = new Marked();
const extension = {
name: "something",
level: "block",
@@ -33,12 +43,37 @@ const extension = {
},
};
const inlineExtension = {
name: "something_inline",
level: "inline",
start(src) {
return src.indexOf("@");
},
tokenizer(src) {
const rule = /^@(\w+)\s*\[([^\]]*)\]/;
const match = rule.exec(src);
if (!match) return;
return {
type: "something_inline",
raw: match[0],
name: match[1],
text: match[2],
};
},
renderer(token) {
return `<span class="vue-component" data-component="${token.name}" data-content="${token.text}"></span>`;
},
};
marker.use({
extensions: [extension],
extensions: [extension, inlineExtension],
});
function ParseMarkdown(source) {
return marker.parse(source || "");
}
export { ParseMarkdown, WidgetMap };
export { ParseMarkdown, GetWidget };