mirror of
https://github.com/usememos/memos.git
synced 2025-06-05 22:09:59 +02:00
feat: update marked parsers (#260)
* chore: remove external match functions * chore: update parsers
This commit is contained in:
@ -1,18 +1,50 @@
|
|||||||
import { parserList } from "./parser";
|
import { blockElementParserList, inlineElementParserList } from "./parser";
|
||||||
|
|
||||||
export const marked = (markdownStr: string, parsers = parserList) => {
|
const match = (rawStr: string, regex: RegExp): number => {
|
||||||
for (const parser of parsers) {
|
const matchResult = rawStr.match(regex);
|
||||||
|
if (!matchResult) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const matchStr = matchResult[0];
|
||||||
|
return matchStr.length;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const marked = (markdownStr: string, blockParsers = blockElementParserList, inlineParsers = inlineElementParserList): string => {
|
||||||
|
for (const parser of blockParsers) {
|
||||||
const startIndex = markdownStr.search(parser.regex);
|
const startIndex = markdownStr.search(parser.regex);
|
||||||
const matchedLength = parser.match(markdownStr);
|
const matchedLength = match(markdownStr, parser.regex);
|
||||||
|
|
||||||
if (startIndex > -1 && matchedLength > 0) {
|
if (startIndex > -1 && matchedLength > 0) {
|
||||||
const prefixStr = markdownStr.slice(0, startIndex);
|
const prefixStr = markdownStr.slice(0, startIndex);
|
||||||
const matchedStr = markdownStr.slice(startIndex, startIndex + matchedLength);
|
const matchedStr = markdownStr.slice(startIndex, startIndex + matchedLength);
|
||||||
const suffixStr = markdownStr.slice(startIndex + matchedLength);
|
const suffixStr = markdownStr.slice(startIndex + matchedLength);
|
||||||
markdownStr = marked(prefixStr, parsers) + parser.renderer(matchedStr) + marked(suffixStr, parsers);
|
return marked(prefixStr, blockParsers, inlineParsers) + parser.renderer(matchedStr) + marked(suffixStr, blockParsers, inlineParsers);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let matchedInlineParser = undefined;
|
||||||
|
let matchedIndex = -1;
|
||||||
|
|
||||||
|
for (const parser of inlineElementParserList) {
|
||||||
|
const startIndex = markdownStr.search(parser.regex);
|
||||||
|
const matchedLength = match(markdownStr, parser.regex);
|
||||||
|
|
||||||
|
if (startIndex > -1 && matchedLength > 0) {
|
||||||
|
if (!matchedInlineParser || matchedIndex > startIndex) {
|
||||||
|
matchedIndex = startIndex;
|
||||||
|
matchedInlineParser = parser;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (matchedInlineParser) {
|
||||||
|
const matchedLength = match(markdownStr, matchedInlineParser.regex);
|
||||||
|
const prefixStr = markdownStr.slice(0, matchedIndex);
|
||||||
|
const matchedStr = markdownStr.slice(matchedIndex, matchedIndex + matchedLength);
|
||||||
|
const suffixStr = markdownStr.slice(matchedIndex + matchedLength);
|
||||||
|
return prefixStr + matchedInlineParser.renderer(matchedStr) + marked(suffixStr, [], inlineParsers);
|
||||||
|
}
|
||||||
|
|
||||||
return markdownStr;
|
return markdownStr;
|
||||||
};
|
};
|
||||||
|
@ -94,6 +94,30 @@ console.log("hello world!")
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
for (const t of tests) {
|
||||||
|
expect(marked(t.markdown)).toBe(t.want);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
test("parse bold and em text", () => {
|
||||||
|
const tests = [
|
||||||
|
{
|
||||||
|
markdown: `Important: **Minecraft**`,
|
||||||
|
want: `<p>Important: <strong>Minecraft</strong></p>`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
markdown: `Em: *Minecraft*`,
|
||||||
|
want: `<p>Em: <em>Minecraft</em></p>`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
markdown: `Important: ***Minecraft/123***`,
|
||||||
|
want: `<p>Important: <strong><em>Minecraft/123</em></strong></p>`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
markdown: `Important: ***[baidu](https://baidu.com)***`,
|
||||||
|
want: `<p>Important: <strong><em><a class='link' target='_blank' rel='noreferrer' href='https://baidu.com'>baidu</a></em></strong></p>`,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
for (const t of tests) {
|
for (const t of tests) {
|
||||||
expect(marked(t.markdown)).toBe(t.want);
|
expect(marked(t.markdown)).toBe(t.want);
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,21 @@
|
|||||||
export const BOLD_REG = /\*\*([\S ]+?)\*\*/;
|
import { marked } from "..";
|
||||||
|
import Emphasis from "./Emphasis";
|
||||||
|
import Link from "./Link";
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
export const BOLD_REG = /\*\*([\S ]+)\*\*/;
|
||||||
const matchResult = rawStr.match(BOLD_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(BOLD_REG, "<strong>$1</strong>");
|
const matchResult = rawStr.match(BOLD_REG);
|
||||||
return parsedStr;
|
if (!matchResult) {
|
||||||
|
return rawStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedContent = marked(matchResult[1], [], [Emphasis, Link]);
|
||||||
|
return `<strong>${parsedContent}</strong>`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "bold",
|
name: "bold",
|
||||||
regex: BOLD_REG,
|
regex: BOLD_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,5 @@
|
|||||||
export const CODE_BLOCK_REG = /^```(\S*?)\s([\s\S]*?)```(\n?)/;
|
export const CODE_BLOCK_REG = /^```(\S*?)\s([\s\S]*?)```(\n?)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(CODE_BLOCK_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(CODE_BLOCK_REG, "<pre lang='$1'>\n$2</pre>$3");
|
const parsedStr = rawStr.replace(CODE_BLOCK_REG, "<pre lang='$1'>\n$2</pre>$3");
|
||||||
return parsedStr;
|
return parsedStr;
|
||||||
@ -18,6 +8,5 @@ const renderer = (rawStr: string): string => {
|
|||||||
export default {
|
export default {
|
||||||
name: "code block",
|
name: "code block",
|
||||||
regex: CODE_BLOCK_REG,
|
regex: CODE_BLOCK_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -3,29 +3,18 @@ import { marked } from "..";
|
|||||||
|
|
||||||
export const DONE_LIST_REG = /^- \[x\] ([\S ]+)(\n?)/;
|
export const DONE_LIST_REG = /^- \[x\] ([\S ]+)(\n?)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(DONE_LIST_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const matchResult = rawStr.match(DONE_LIST_REG);
|
const matchResult = rawStr.match(DONE_LIST_REG);
|
||||||
if (!matchResult) {
|
if (!matchResult) {
|
||||||
return rawStr;
|
return rawStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const parsedContent = marked(matchResult[1], inlineElementParserList);
|
const parsedContent = marked(matchResult[1], [], inlineElementParserList);
|
||||||
return `<p><span class='todo-block done' data-value='DONE'>✓</span>${parsedContent}</p>${matchResult[2]}`;
|
return `<p><span class='todo-block done' data-value='DONE'>✓</span>${parsedContent}</p>${matchResult[2]}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "done list",
|
name: "done list",
|
||||||
regex: DONE_LIST_REG,
|
regex: DONE_LIST_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -1,23 +1,21 @@
|
|||||||
export const EMPHASIS_REG = /\*([\S ]+?)\*/;
|
import { marked } from "..";
|
||||||
|
import Bold from "./Bold";
|
||||||
|
import Link from "./Link";
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
export const EMPHASIS_REG = /\*([\S ]+)\*/;
|
||||||
const matchResult = rawStr.match(EMPHASIS_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(EMPHASIS_REG, "<em>$1</em>");
|
const matchResult = rawStr.match(EMPHASIS_REG);
|
||||||
return parsedStr;
|
if (!matchResult) {
|
||||||
|
return rawStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedContent = marked(matchResult[1], [], [Bold, Link]);
|
||||||
|
return `<em>${parsedContent}</em>`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "emphasis",
|
name: "emphasis",
|
||||||
regex: EMPHASIS_REG,
|
regex: EMPHASIS_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,5 @@
|
|||||||
export const IMAGE_REG = /!\[.*?\]\((.+?)\)/;
|
export const IMAGE_REG = /!\[.*?\]\((.+?)\)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(IMAGE_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(IMAGE_REG, "<img class='img' src='$1' />");
|
const parsedStr = rawStr.replace(IMAGE_REG, "<img class='img' src='$1' />");
|
||||||
return parsedStr;
|
return parsedStr;
|
||||||
@ -18,6 +8,5 @@ const renderer = (rawStr: string): string => {
|
|||||||
export default {
|
export default {
|
||||||
name: "image",
|
name: "image",
|
||||||
regex: IMAGE_REG,
|
regex: IMAGE_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,5 @@
|
|||||||
export const INLINE_CODE_REG = /`([\S ]+?)`/;
|
export const INLINE_CODE_REG = /`([\S ]+?)`/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(INLINE_CODE_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(INLINE_CODE_REG, "<code>$1</code>");
|
const parsedStr = rawStr.replace(INLINE_CODE_REG, "<code>$1</code>");
|
||||||
return parsedStr;
|
return parsedStr;
|
||||||
@ -18,6 +8,5 @@ const renderer = (rawStr: string): string => {
|
|||||||
export default {
|
export default {
|
||||||
name: "inline code",
|
name: "inline code",
|
||||||
regex: INLINE_CODE_REG,
|
regex: INLINE_CODE_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,5 @@
|
|||||||
export const LINK_REG = /\[(.*?)\]\((.+?)\)/;
|
export const LINK_REG = /\[(.*?)\]\((.+?)\)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(LINK_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(LINK_REG, "<a class='link' target='_blank' rel='noreferrer' href='$2'>$1</a>");
|
const parsedStr = rawStr.replace(LINK_REG, "<a class='link' target='_blank' rel='noreferrer' href='$2'>$1</a>");
|
||||||
return parsedStr;
|
return parsedStr;
|
||||||
@ -18,6 +8,5 @@ const renderer = (rawStr: string): string => {
|
|||||||
export default {
|
export default {
|
||||||
name: "link",
|
name: "link",
|
||||||
regex: LINK_REG,
|
regex: LINK_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,5 @@
|
|||||||
export const MARK_REG = /@\[([\S ]+?)\]\((\S+?)\)/;
|
export const MARK_REG = /@\[([\S ]+?)\]\((\S+?)\)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(MARK_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(MARK_REG, "<span class='memo-link-text' data-value='$2'>$1</span>");
|
const parsedStr = rawStr.replace(MARK_REG, "<span class='memo-link-text' data-value='$2'>$1</span>");
|
||||||
return parsedStr;
|
return parsedStr;
|
||||||
@ -18,6 +8,5 @@ const renderer = (rawStr: string): string => {
|
|||||||
export default {
|
export default {
|
||||||
name: "mark",
|
name: "mark",
|
||||||
regex: MARK_REG,
|
regex: MARK_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -3,29 +3,18 @@ import { marked } from "..";
|
|||||||
|
|
||||||
export const ORDERED_LIST_REG = /^(\d+)\. ([\S ]+)(\n?)/;
|
export const ORDERED_LIST_REG = /^(\d+)\. ([\S ]+)(\n?)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(ORDERED_LIST_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const matchResult = rawStr.match(ORDERED_LIST_REG);
|
const matchResult = rawStr.match(ORDERED_LIST_REG);
|
||||||
if (!matchResult) {
|
if (!matchResult) {
|
||||||
return rawStr;
|
return rawStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const parsedContent = marked(matchResult[2], inlineElementParserList);
|
const parsedContent = marked(matchResult[2], [], inlineElementParserList);
|
||||||
return `<p><span class='ol-block'>${matchResult[1]}.</span>${parsedContent}</p>${matchResult[3]}`;
|
return `<p><span class='ol-block'>${matchResult[1]}.</span>${parsedContent}</p>${matchResult[3]}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ordered list",
|
name: "ordered list",
|
||||||
regex: ORDERED_LIST_REG,
|
regex: ORDERED_LIST_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -3,29 +3,18 @@ import { marked } from "..";
|
|||||||
|
|
||||||
export const PARAGRAPH_REG = /^([\S ]*)(\n?)/;
|
export const PARAGRAPH_REG = /^([\S ]*)(\n?)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(PARAGRAPH_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const matchResult = rawStr.match(PARAGRAPH_REG);
|
const matchResult = rawStr.match(PARAGRAPH_REG);
|
||||||
if (!matchResult) {
|
if (!matchResult) {
|
||||||
return rawStr;
|
return rawStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const parsedContent = marked(matchResult[1], inlineElementParserList);
|
const parsedContent = marked(matchResult[1], [], inlineElementParserList);
|
||||||
return `<p>${parsedContent}</p>${matchResult[2]}`;
|
return `<p>${parsedContent}</p>${matchResult[2]}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "ordered list",
|
name: "ordered list",
|
||||||
regex: PARAGRAPH_REG,
|
regex: PARAGRAPH_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,5 @@
|
|||||||
export const PLAIN_LINK_REG = /(https?:\/\/[^ ]+)/;
|
export const PLAIN_LINK_REG = /(https?:\/\/[^ ]+)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(PLAIN_LINK_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(PLAIN_LINK_REG, "<a class='link' target='_blank' rel='noreferrer' href='$1'>$1</a>");
|
const parsedStr = rawStr.replace(PLAIN_LINK_REG, "<a class='link' target='_blank' rel='noreferrer' href='$1'>$1</a>");
|
||||||
return parsedStr;
|
return parsedStr;
|
||||||
@ -18,6 +8,5 @@ const renderer = (rawStr: string): string => {
|
|||||||
export default {
|
export default {
|
||||||
name: "plain link",
|
name: "plain link",
|
||||||
regex: PLAIN_LINK_REG,
|
regex: PLAIN_LINK_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -1,15 +1,5 @@
|
|||||||
export const TAG_REG = /[^\s]?#([^\s#]+?) /;
|
export const TAG_REG = /[^\s]?#([^\s#]+?) /;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(TAG_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const parsedStr = rawStr.replace(TAG_REG, "<span class='tag-span'>#$1</span> ");
|
const parsedStr = rawStr.replace(TAG_REG, "<span class='tag-span'>#$1</span> ");
|
||||||
return parsedStr;
|
return parsedStr;
|
||||||
@ -18,6 +8,5 @@ const renderer = (rawStr: string): string => {
|
|||||||
export default {
|
export default {
|
||||||
name: "tag",
|
name: "tag",
|
||||||
regex: TAG_REG,
|
regex: TAG_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -3,29 +3,18 @@ import { marked } from "..";
|
|||||||
|
|
||||||
export const TODO_LIST_REG = /^- \[ \] ([\S ]+)(\n?)/;
|
export const TODO_LIST_REG = /^- \[ \] ([\S ]+)(\n?)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(TODO_LIST_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const matchResult = rawStr.match(TODO_LIST_REG);
|
const matchResult = rawStr.match(TODO_LIST_REG);
|
||||||
if (!matchResult) {
|
if (!matchResult) {
|
||||||
return rawStr;
|
return rawStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const parsedContent = marked(matchResult[1], inlineElementParserList);
|
const parsedContent = marked(matchResult[1], [], inlineElementParserList);
|
||||||
return `<p><span class='todo-block todo' data-value='TODO'></span>${parsedContent}</p>${matchResult[2]}`;
|
return `<p><span class='todo-block todo' data-value='TODO'></span>${parsedContent}</p>${matchResult[2]}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "todo list",
|
name: "todo list",
|
||||||
regex: TODO_LIST_REG,
|
regex: TODO_LIST_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -3,29 +3,18 @@ import { marked } from "..";
|
|||||||
|
|
||||||
export const UNORDERED_LIST_REG = /^[*-] ([\S ]+)(\n?)/;
|
export const UNORDERED_LIST_REG = /^[*-] ([\S ]+)(\n?)/;
|
||||||
|
|
||||||
const match = (rawStr: string): number => {
|
|
||||||
const matchResult = rawStr.match(UNORDERED_LIST_REG);
|
|
||||||
if (!matchResult) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const matchStr = matchResult[0];
|
|
||||||
return matchStr.length;
|
|
||||||
};
|
|
||||||
|
|
||||||
const renderer = (rawStr: string): string => {
|
const renderer = (rawStr: string): string => {
|
||||||
const matchResult = rawStr.match(UNORDERED_LIST_REG);
|
const matchResult = rawStr.match(UNORDERED_LIST_REG);
|
||||||
if (!matchResult) {
|
if (!matchResult) {
|
||||||
return rawStr;
|
return rawStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const parsedContent = marked(matchResult[1], inlineElementParserList);
|
const parsedContent = marked(matchResult[1], [], inlineElementParserList);
|
||||||
return `<p><span class='ul-block'>•</span>${parsedContent}</p>${matchResult[2]}`;
|
return `<p><span class='ul-block'>•</span>${parsedContent}</p>${matchResult[2]}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "unordered list",
|
name: "unordered list",
|
||||||
regex: UNORDERED_LIST_REG,
|
regex: UNORDERED_LIST_REG,
|
||||||
match,
|
|
||||||
renderer,
|
renderer,
|
||||||
};
|
};
|
||||||
|
@ -16,17 +16,12 @@ import InlineCode from "./InlineCode";
|
|||||||
export { CODE_BLOCK_REG } from "./CodeBlock";
|
export { CODE_BLOCK_REG } from "./CodeBlock";
|
||||||
export { TODO_LIST_REG } from "./TodoList";
|
export { TODO_LIST_REG } from "./TodoList";
|
||||||
export { DONE_LIST_REG } from "./DoneList";
|
export { DONE_LIST_REG } from "./DoneList";
|
||||||
export { ORDERED_LIST_REG } from "./OrderedList";
|
|
||||||
export { UNORDERED_LIST_REG } from "./UnorderedList";
|
|
||||||
export { PARAGRAPH_REG } from "./Paragraph";
|
|
||||||
export { TAG_REG } from "./Tag";
|
export { TAG_REG } from "./Tag";
|
||||||
export { IMAGE_REG } from "./Image";
|
export { IMAGE_REG } from "./Image";
|
||||||
export { LINK_REG } from "./Link";
|
export { LINK_REG } from "./Link";
|
||||||
export { MARK_REG } from "./Mark";
|
export { MARK_REG } from "./Mark";
|
||||||
export { BOLD_REG } from "./Bold";
|
|
||||||
export { EMPHASIS_REG } from "./Emphasis";
|
|
||||||
|
|
||||||
// The order determines the order of execution.
|
// The order determines the order of execution.
|
||||||
export const blockElementParserList = [CodeBlock, TodoList, DoneList, OrderedList, UnorderedList, Paragraph];
|
export const blockElementParserList = [CodeBlock, TodoList, DoneList, OrderedList, UnorderedList, Paragraph];
|
||||||
export const inlineElementParserList = [Image, Mark, Link, Bold, Emphasis, InlineCode, PlainLink, Tag];
|
export const inlineElementParserList = [Image, Mark, Bold, Emphasis, Link, InlineCode, PlainLink, Tag];
|
||||||
export const parserList = [...blockElementParserList, ...inlineElementParserList];
|
export const parserList = [...blockElementParserList, ...inlineElementParserList];
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.img {
|
.img {
|
||||||
@apply float-left max-w-full w-full;
|
@apply float-left max-w-full;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag-span {
|
.tag-span {
|
||||||
@ -52,7 +52,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
code {
|
code {
|
||||||
@apply bg-gray-100 px-1 rounded text-sm leading-6 inline-block;
|
@apply bg-gray-100 px-1 rounded text-sm font-mono leading-6 inline-block;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user