[${index}]: ${title}[${index}] ${title}: ${link}-- `; - } - - const buildFootnotes = () => { - if (!footnotes.length) { - return ""; - } - - return ( - styledContent("h4", "引用链接") - + styledContent("footnotes", buildFootnoteArray(footnotes), "p") - ); - }; - - const renderer: RendererObject = { - heading({ tokens, depth }: Tokens.Heading) { - const text = this.parser.parseInline(tokens); - const tag = `h${depth}`; - return styledContent(tag, text); - }, - - paragraph({ tokens }: Tokens.Paragraph): string { - const text = this.parser.parseInline(tokens); - const isFigureImage = text.includes("字数 ${readingTimeResult?.words},阅读大约需 ${Math.ceil(readingTimeResult?.minutes)} 分钟
-
${text}`;
- }
- const langText = lang.split(" ")[0];
- const isLanguageRegistered = hljs.getLanguage(langText);
- const language = isLanguageRegistered ? langText : "plaintext";
-
- const highlighted = highlightAndFormatCode(
- text,
- language,
- hljs,
- !!opts.isShowLineNumber
- );
-
- const span = `${macCodeSvg}`;
- let pendingAttr = "";
- if (!isLanguageRegistered && langText !== "plaintext") {
- const escapedText = text.replace(/"/g, """);
- pendingAttr = ` data-language-pending="${langText}" data-raw-code="${escapedText}" data-show-line-number="${opts.isShowLineNumber}"`;
- }
- const code = `${highlighted}`;
-
- return `${span}${code}`;
- },
-
- codespan({ text }: Tokens.Codespan): string {
- const escapedText = escapeHtml(text);
- return styledContent("codespan", escapedText, "code");
- },
-
- list({ ordered, items, start = 1 }: Tokens.List) {
- listOrderedStack.push(ordered);
- listCounters.push(Number(start));
-
- const html = items.map((item) => this.listitem(item)).join("");
-
- listOrderedStack.pop();
- listCounters.pop();
-
- return styledContent(ordered ? "ol" : "ul", html);
- },
-
- listitem(token: Tokens.ListItem) {
- const ordered = listOrderedStack[listOrderedStack.length - 1];
- const idx = listCounters[listCounters.length - 1]!;
-
- listCounters[listCounters.length - 1] = idx + 1;
-
- const prefix = ordered ? `${idx}. ` : "• ";
-
- let content: string;
- try {
- content = this.parser.parseInline(token.tokens);
- } catch {
- content = this.parser
- .parse(token.tokens)
- .replace(/^]*)?>([\s\S]*?)<\/p>/, "$1");
- }
-
- return styledContent("listitem", `${prefix}${content}`, "li");
- },
-
- image({ href, title, text }: Tokens.Image): string {
- const newText = opts.legend ? transform(opts.legend, text, title) : "";
- const subText = newText ? styledContent("figcaption", newText) : "";
- const titleAttr = title ? ` title="${title}"` : "";
- return ` 字数 ${readingTimeResult?.words},阅读大约需 ${Math.ceil(readingTimeResult?.minutes)} 分钟 ]*)?>([\s\S]*?)<\/p>/, "$1");
+ }
+ return styledContent("listitem", `${prefix}${content}`, "li");
+ },
+
+ image({ href, title, text }: Tokens.Image): string {
+ const newText = opts.legend ? transform(opts.legend, text, title) : "";
+ const subText = newText ? styledContent("figcaption", newText) : "";
+ const titleAttr = title ? ` title="${title}"` : "";
+ return `${subText}
- ${headerRow}
- ${body}
-
- |
)<\/li>/i;
- while (pattern.test(output)) {
- output = output.replace(pattern, "
[${index}]: ${title}
`
+ : `[${index}] ${title}: ${link}
`
+ )
+ .join("\n");
+}
+
+function transform(legend: string, text: string | null, title: string | null): string {
+ const options = legend.split("-");
+ for (const option of options) {
+ if (option === "alt" && text) {
+ return text;
+ }
+ if (option === "title" && title) {
+ return title;
+ }
+ }
+ return "";
+}
+
+function parseFrontMatterAndContent(markdownText: string): ParseResult {
+ try {
+ const parsed = frontMatter(markdownText);
+ const yamlData = parsed.attributes;
+ const markdownContent = parsed.body;
+ const readingTimeResult = readingTime(markdownContent);
+ return {
+ yamlData: yamlData as Record
+
+ `;
+ }
+
+ const buildFootnotes = () => {
+ if (!footnotes.length) {
+ return "";
+ }
+ return (
+ styledContent("h4", "引用链接")
+ + styledContent("footnotes", buildFootnoteArray(footnotes), "p")
+ );
+ };
+
+ const renderer: RendererObject = {
+ heading({ tokens, depth }: Tokens.Heading) {
+ const text = this.parser.parseInline(tokens);
+ const tag = `h${depth}`;
+ return styledContent(tag, text);
+ },
+
+ paragraph({ tokens }: Tokens.Paragraph): string {
+ const text = this.parser.parseInline(tokens);
+ const isFigureImage = text.includes("${text}`;
+ }
+ const langText = lang.split(" ")[0];
+ const isLanguageRegistered = hljs.getLanguage(langText);
+ const language = isLanguageRegistered ? langText : "plaintext";
+
+ const highlighted = highlightAndFormatCode(
+ text,
+ language,
+ hljs,
+ !!opts.isShowLineNumber
+ );
+
+ const span = `${macCodeSvg}`;
+ let pendingAttr = "";
+ if (!isLanguageRegistered && langText !== "plaintext") {
+ const escapedText = text.replace(/"/g, """);
+ pendingAttr = ` data-language-pending="${langText}" data-raw-code="${escapedText}" data-show-line-number="${opts.isShowLineNumber}"`;
+ }
+ const code = `${highlighted}`;
+
+ return `${span}${code}`;
+ },
+
+ codespan({ text }: Tokens.Codespan): string {
+ const escapedText = escapeHtml(text);
+ return styledContent("codespan", escapedText, "code");
+ },
+
+ list({ ordered, items, start = 1 }: Tokens.List) {
+ listOrderedStack.push(ordered);
+ listCounters.push(Number(start));
+ const html = items.map((item) => this.listitem(item)).join("");
+ listOrderedStack.pop();
+ listCounters.pop();
+ return styledContent(ordered ? "ol" : "ul", html);
+ },
+
+ listitem(token: Tokens.ListItem) {
+ const ordered = listOrderedStack[listOrderedStack.length - 1];
+ const idx = listCounters[listCounters.length - 1]!;
+ listCounters[listCounters.length - 1] = idx + 1;
+ const prefix = ordered ? `${idx}. ` : "• ";
+ let content: string;
+ try {
+ content = this.parser.parseInline(token.tokens);
+ } catch {
+ content = this.parser
+ .parse(token.tokens)
+ .replace(/^${subText}
+ ${headerRow}
+ ${body}
+
+