This commit is contained in:
@@ -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 };
|
||||
Reference in New Issue
Block a user