feat(*): svelte 5 panel view sharing the gateway ui, obsidian theme, preview and tests
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
export class TFile {
|
||||
path: string;
|
||||
extension: string;
|
||||
constructor(path: string, extension = "md") {
|
||||
this.path = path;
|
||||
this.extension = extension;
|
||||
}
|
||||
}
|
||||
|
||||
export class TFolder {
|
||||
path: string;
|
||||
constructor(path: string) {
|
||||
this.path = path;
|
||||
}
|
||||
}
|
||||
|
||||
export const notices: string[] = [];
|
||||
|
||||
export class Notice {
|
||||
constructor(message: string) {
|
||||
notices.push(message);
|
||||
}
|
||||
hide(): void {}
|
||||
}
|
||||
|
||||
export class Plugin {}
|
||||
export class ItemView {}
|
||||
export class PluginSettingTab {}
|
||||
export class Setting {}
|
||||
export class Component {}
|
||||
export class FuzzySuggestModal {}
|
||||
export const Platform = { isMobile: false };
|
||||
export const moment = () => undefined;
|
||||
export const requestUrl = () =>
|
||||
Promise.reject(new Error("no network in the stub"));
|
||||
export const setIcon = () => undefined;
|
||||
|
||||
function escapeHtml(value: string): string {
|
||||
return value
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">");
|
||||
}
|
||||
|
||||
// Enough of Obsidian's renderer for the panel: paragraphs, bold, code,
|
||||
// wikilinks as ``a.internal-link`` with ``data-href``, bare URLs.
|
||||
export const MarkdownRenderer = {
|
||||
render(
|
||||
_app: unknown,
|
||||
markdown: string,
|
||||
el: HTMLElement,
|
||||
_sourcePath: string,
|
||||
_component: unknown
|
||||
): Promise<void> {
|
||||
const blocks = markdown.split(/\n{2,}/).map((block) => {
|
||||
const html = escapeHtml(block)
|
||||
.replace(
|
||||
/!?\[\[([^\]|]+)(?:\|([^\]]+))?\]\]/g,
|
||||
(_full, target: string, alias?: string) =>
|
||||
`<a class="internal-link" data-href="${target}" href="${target}">${alias ?? target}</a>`
|
||||
)
|
||||
.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>")
|
||||
.replace(/`([^`]+)`/g, "<code>$1</code>")
|
||||
.replace(
|
||||
/(^|\s)(https?:\/\/[^\s]+)/g,
|
||||
(_full, lead: string, url: string) =>
|
||||
`${lead}<a class="external-link" href="${url}">${url}</a>`
|
||||
)
|
||||
.replace(/\n/g, "<br>");
|
||||
if (block.startsWith("- ")) {
|
||||
const items = html
|
||||
.split("<br>")
|
||||
.map((line) => `<li>${line.replace(/^- /, "")}</li>`);
|
||||
return `<ul>${items.join("")}</ul>`;
|
||||
}
|
||||
return `<p>${html}</p>`;
|
||||
});
|
||||
el.innerHTML = blocks.join("");
|
||||
return Promise.resolve();
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user