From 2292b7e11ecf6f5fedaecd7b1bb0cf7531f198e7 Mon Sep 17 00:00:00 2001 From: hiro08gh Date: Sun, 25 Aug 2024 13:56:42 +0900 Subject: [PATCH 1/2] chore: replace biome lint --- .vscode/extension.json | 5 + .vscode/settings.json | 7 + biome.json | 12 + package-lock.json | 165 +++++++ package.json | 9 +- src/convert-dom-to-markdown.ts | 451 ++++++++++---------- src/html-to-markdown-parser.ts | 23 +- src/index.ts | 22 +- src/marks.ts | 122 +++--- src/options.ts | 66 +-- src/utils.ts | 74 ++-- test/marks/code.test.ts | 64 +-- test/marks/heading.test.ts | 60 +-- test/marks/horizontalRule.test.ts | 28 +- test/marks/image.test.ts | 72 ++-- test/marks/list.test.ts | 40 +- test/marks/options.ts | 24 +- test/marks/table.test.ts | 16 +- test/marks/text.test.ts | 120 +++--- test/rich-editor-to-markdown-perser.test.ts | 12 +- 20 files changed, 782 insertions(+), 610 deletions(-) create mode 100644 .vscode/extension.json create mode 100644 .vscode/settings.json create mode 100644 biome.json diff --git a/.vscode/extension.json b/.vscode/extension.json new file mode 100644 index 0000000..89f19e1 --- /dev/null +++ b/.vscode/extension.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "biomejs.biome" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..7eac4fc --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "editor.defaultFormatter": "biomejs.biome", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports.biome": "explicit" + } +} \ No newline at end of file diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..3867749 --- /dev/null +++ b/biome.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + } +} diff --git a/package-lock.json b/package-lock.json index bbeb8ff..6f65587 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "html-dom-parser": "^5.0.4" }, "devDependencies": { + "@biomejs/biome": "1.8.3", "@types/jest": "^29.5.10", "@typescript-eslint/eslint-plugin": "^6.13.2", "@typescript-eslint/parser": "^6.13.2", @@ -669,6 +670,170 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@biomejs/biome": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", + "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.8.3", + "@biomejs/cli-darwin-x64": "1.8.3", + "@biomejs/cli-linux-arm64": "1.8.3", + "@biomejs/cli-linux-arm64-musl": "1.8.3", + "@biomejs/cli-linux-x64": "1.8.3", + "@biomejs/cli-linux-x64-musl": "1.8.3", + "@biomejs/cli-win32-arm64": "1.8.3", + "@biomejs/cli-win32-x64": "1.8.3" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", + "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", + "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", + "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", + "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", + "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, "node_modules/@esbuild/android-arm": { "version": "0.19.8", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.8.tgz", diff --git a/package.json b/package.json index 8701916..ab24b66 100644 --- a/package.json +++ b/package.json @@ -10,8 +10,7 @@ "watch": "tsup src/index.ts --watch", "test": "jest", "test:watch": "jest --watch", - "lint": "eslint ./src", - "lint:fix": "eslint --fix ./src" + "lint": "biome lint ./*" }, "keywords": [ "markdown", @@ -23,12 +22,8 @@ "dist" ], "devDependencies": { + "@biomejs/biome": "1.8.3", "@types/jest": "^29.5.10", - "@typescript-eslint/eslint-plugin": "^6.13.2", - "@typescript-eslint/parser": "^6.13.2", - "eslint": "^8.55.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-jest": "^27.6.0", "jest": "^29.7.0", "prettier": "^3.1.0", "ts-jest": "^29.1.1", diff --git a/src/convert-dom-to-markdown.ts b/src/convert-dom-to-markdown.ts index 476d94d..ebf61d0 100644 --- a/src/convert-dom-to-markdown.ts +++ b/src/convert-dom-to-markdown.ts @@ -1,275 +1,272 @@ -import type { DOMNode, Element, Text } from 'html-dom-parser'; -import type { MarkStyle, Image } from './options'; +import type { DOMNode, Element, Text } from "html-dom-parser"; import { - createTextMark, - createHorizontalRuleMark, - createLinkMark, - createImageMark, - createCodeBlockMark, - createInlineCodeMark, - createCustomClass, -} from './marks'; + createCodeBlockMark, + createCustomClass, + createHorizontalRuleMark, + createImageMark, + createInlineCodeMark, + createLinkMark, + createTextMark, +} from "./marks"; +import type { Image, MarkStyle } from "./options"; import { - isTextElement, - isHorizontalRuleElement, - isLinkElement, - isListElement, - isImageElement, - isCodeElement, - isTableElement, - isCustomClassElement, -} from './utils'; + isCodeElement, + isCustomClassElement, + isHorizontalRuleElement, + isImageElement, + isLinkElement, + isListElement, + isTableElement, + isTextElement, +} from "./utils"; const convertDOMToMarkdown = ({ - nodes, - image, - markStyle, + nodes, + image, + markStyle, }: { - nodes: DOMNode[]; - image: Image; - markStyle: MarkStyle; + nodes: DOMNode[]; + image: Image; + markStyle: MarkStyle; }): string => { - const result = []; - - for (const node of nodes) { - if (node.type === 'text') { - result.push(convertTextNode(node)); - } - - if (node.type === 'tag') { - result.push(convertTagNode(node, image, markStyle)); - - if (node.children.length !== 0) { - convertDOMToMarkdown({ - nodes: node.children as DOMNode[], - image, - markStyle, - }); - } - } - } - - return result.join('\n\n'); + const result = []; + + for (const node of nodes) { + if (node.type === "text") { + result.push(convertTextNode(node)); + } + + if (node.type === "tag") { + result.push(convertTagNode(node, image, markStyle)); + + if (node.children.length !== 0) { + convertDOMToMarkdown({ + nodes: node.children as DOMNode[], + image, + markStyle, + }); + } + } + } + + return result.join("\n\n"); }; /** * Get text in DOMNode */ const convertTextNode = (node: Text): string => { - return node.data; + return node.data; }; /** * Converts HTML tags to marks */ const convertTagNode = ( - node: Element, - image: Image, - markStyle: MarkStyle, + node: Element, + image: Image, + markStyle: MarkStyle, ): string => { - if (isTextElement(node)) { - const marks = getRecursionMarks(node, image, markStyle); - return createTextMark({ tagName: node.name, marks, markStyle }); - } - - if (isHorizontalRuleElement(node)) { - const marks = getRecursionMarks(node, image, markStyle); - return createHorizontalRuleMark(marks, markStyle); - } - - if (isLinkElement(node)) { - const { href } = node.attribs; - const marks = getRecursionMarks(node, image, markStyle); - - return createLinkMark(marks, href); - } - - if (isImageElement(node)) { - if (node.name === 'figure') { - const marks = getRecursionMarks(node, image, markStyle); - - return marks; - } else { - const { alt } = node.attribs; - const imgUrl = buildImageUrl(node, image); - - return createImageMark({ - src: imgUrl, - alt, - }); - } - } - if (isCodeElement(node)) { - if (node.name === 'div') { - const marks = getRecursionMarks(node, image, markStyle); - - return marks; - } - - if (node.name === 'pre') { - const marks = getRecursionMarks(node, image, markStyle); - - const language = getChildNodeClass(node) - .join('') - .replace('language-', ''); - const fileName = - node.parentNode?.type === 'tag' - ? node.parentNode.attribs['data-filename'] - : undefined; - - return createCodeBlockMark({ marks, markStyle, language, fileName }); - } - - if (node.name === 'code') { - const marks = getRecursionMarks(node, image, markStyle); - const isCodeBlock = - node.parentNode?.type === 'tag' && node.parentNode?.name === 'pre'; - - return isCodeBlock ? marks : createInlineCodeMark(marks); - } - } - - if (isListElement(node)) { - if (node.name === 'ul' || node.name === 'ol') { - const marks = getRecursionMarks(node, image, markStyle); - if (node.parentNode?.type === 'tag' && node.parentNode?.name === 'li') { - return marks; - } - - return marks; - } else { - const marks = getRecursionMarks(node, image, markStyle); - const space = - node.parent?.type === 'tag' && - node.parent.prev && - (node.parent.name === 'ul' || node.parent.name === 'ol') - ? ' '.repeat(findDepth(node) - 1) - : ''; - const addLine = - node.parent?.type === 'tag' && !node.prev && node.parent.prev - ? '\n' - : ''; - const endLine = node.next ? '\n' : ''; - - if (node.parentNode?.type === 'tag' && node.parentNode?.name === 'ol') { - const olNum = Array.from(node.parentNode.children).indexOf(node) + 1; - - return addLine + space + olNum + ' ' + marks + endLine; - } else { - return addLine + space + '-' + ' ' + marks + endLine; - } - } - } - - if (isTableElement(node)) { - if (node.name === 'table' || node.name === 'tbody') { - const marks = getRecursionMarks(node, image, markStyle); - - return marks; - } - - if (node.name === 'tr') { - const marks = getRecursionMarks(node, image, markStyle); - const head = node.prev - ? '' - : '| --- '.repeat(node.children.length) + '|' + '\n'; - - return marks + head; - } - - if (node.name === 'th' || node.name === 'td') { - const marks = getRecursionMarks(node, image, markStyle); - const nextStr = node.next ? ' ' : ' ' + '|'; - const endLine = node.next ? '' : '\n'; - - return '|' + ' ' + marks + nextStr + endLine; - } - } - - if (isCustomClassElement(node)) { - const marks = getRecursionMarks(node, image, markStyle); - const { class: _class } = node.attribs; - - return createCustomClass(marks, _class); - } - - if (node.children.length !== 0) { - convertDOMToMarkdown({ - nodes: node.children as DOMNode[], - image, - markStyle, - }); - } - - return ''; + if (isTextElement(node)) { + const marks = getRecursionMarks(node, image, markStyle); + return createTextMark({ tagName: node.name, marks, markStyle }); + } + + if (isHorizontalRuleElement(node)) { + const marks = getRecursionMarks(node, image, markStyle); + return createHorizontalRuleMark(marks, markStyle); + } + + if (isLinkElement(node)) { + const { href } = node.attribs; + const marks = getRecursionMarks(node, image, markStyle); + + return createLinkMark(marks, href); + } + + if (isImageElement(node)) { + if (node.name === "figure") { + const marks = getRecursionMarks(node, image, markStyle); + + return marks; + } + + const { alt } = node.attribs; + const imgUrl = buildImageUrl(node, image); + + return createImageMark({ + src: imgUrl, + alt, + }); + } + if (isCodeElement(node)) { + if (node.name === "div") { + const marks = getRecursionMarks(node, image, markStyle); + + return marks; + } + + if (node.name === "pre") { + const marks = getRecursionMarks(node, image, markStyle); + + const language = getChildNodeClass(node) + .join("") + .replace("language-", ""); + const fileName = + node.parentNode?.type === "tag" + ? node.parentNode.attribs["data-filename"] + : undefined; + + return createCodeBlockMark({ marks, markStyle, language, fileName }); + } + + if (node.name === "code") { + const marks = getRecursionMarks(node, image, markStyle); + const isCodeBlock = + node.parentNode?.type === "tag" && node.parentNode?.name === "pre"; + + return isCodeBlock ? marks : createInlineCodeMark(marks); + } + } + + if (isListElement(node)) { + if (node.name === "ul" || node.name === "ol") { + const marks = getRecursionMarks(node, image, markStyle); + if (node.parentNode?.type === "tag" && node.parentNode?.name === "li") { + return marks; + } + + return marks; + } + const marks = getRecursionMarks(node, image, markStyle); + const space = + node.parent?.type === "tag" && + node.parent.prev && + (node.parent.name === "ul" || node.parent.name === "ol") + ? " ".repeat(findDepth(node) - 1) + : ""; + const addLine = + node.parent?.type === "tag" && !node.prev && node.parent.prev ? "\n" : ""; + const endLine = node.next ? "\n" : ""; + + if (node.parentNode?.type === "tag" && node.parentNode?.name === "ol") { + const olNum = Array.from(node.parentNode.children).indexOf(node) + 1; + + return `${addLine}${space}${olNum} ${marks}${endLine}`; + } + + return `${addLine}${space}- ${marks}${endLine}`; + } + + if (isTableElement(node)) { + if (node.name === "table" || node.name === "tbody") { + const marks = getRecursionMarks(node, image, markStyle); + + return marks; + } + + if (node.name === "tr") { + const marks = getRecursionMarks(node, image, markStyle); + const head = node.prev + ? "" + : `${"| --- ".repeat(node.children.length)}|\n`; + + return marks + head; + } + + if (node.name === "th" || node.name === "td") { + const marks = getRecursionMarks(node, image, markStyle); + const nextStr = node.next ? " " : " " + "|"; + const endLine = node.next ? "" : "\n"; + + return `| ${marks}${nextStr}${endLine}`; + } + } + + if (isCustomClassElement(node)) { + const marks = getRecursionMarks(node, image, markStyle); + const { class: _class } = node.attribs; + + return createCustomClass(marks, _class); + } + + if (node.children.length !== 0) { + convertDOMToMarkdown({ + nodes: node.children as DOMNode[], + image, + markStyle, + }); + } + + return ""; }; /** * Recursively process convertDOMToMarkdown to get the markdown string */ const getRecursionMarks = ( - node: Element, - image: Image, - markStyle: MarkStyle, + node: Element, + image: Image, + markStyle: MarkStyle, ) => { - return node.childNodes - .map((child) => { - const childNode = - child.type === 'tag' || child.type === 'text' ? child : null; - - if (childNode === null) { - return ''; - } - - return convertDOMToMarkdown({ - nodes: [childNode], - image, - markStyle, - }); - }) - .join(''); + return node.childNodes + .map((child) => { + const childNode = + child.type === "tag" || child.type === "text" ? child : null; + + if (childNode === null) { + return ""; + } + + return convertDOMToMarkdown({ + nodes: [childNode], + image, + markStyle, + }); + }) + .join(""); }; /** * Get child node class. */ const getChildNodeClass = (node: Element) => { - return node.children - .map((child) => (child.type === 'tag' ? child.attribs.class : undefined)) - .filter(Boolean); + return node.children + .map((child) => (child.type === "tag" ? child.attribs.class : undefined)) + .filter(Boolean); }; const buildImageUrl = ( - node: Element, - image: { size?: boolean; query?: string }, + node: Element, + image: { size?: boolean; query?: string }, ) => { - const { src, width, height } = node.attribs; - const url = new URL(src); + const { src, width, height } = node.attribs; + const url = new URL(src); - if (image.size) { - url.searchParams.set('w', width?.toString() ?? ''); - url.searchParams.set('h', height?.toString() ?? ''); - } + if (image.size) { + url.searchParams.set("w", width?.toString() ?? ""); + url.searchParams.set("h", height?.toString() ?? ""); + } - if (image.query) { - const params = new URLSearchParams(image.query); + if (image.query) { + const params = new URLSearchParams(image.query); - params.forEach((value, key) => { - url.searchParams.set(key, value); - }); - } + params.forEach((value, key) => { + url.searchParams.set(key, value); + }); + } - return url.href; + return url.href; }; const findDepth = (node: Element, currentDepth = 0): number => { - const depth = currentDepth; + const depth = currentDepth; - if (node.parent?.type === 'tag' && isListElement(node.parent)) { - return findDepth(node.parent, depth + 1); - } + if (node.parent?.type === "tag" && isListElement(node.parent)) { + return findDepth(node.parent, depth + 1); + } - return depth; + return depth; }; export { convertDOMToMarkdown }; diff --git a/src/html-to-markdown-parser.ts b/src/html-to-markdown-parser.ts index 673e6c5..4fc3fca 100644 --- a/src/html-to-markdown-parser.ts +++ b/src/html-to-markdown-parser.ts @@ -1,7 +1,7 @@ -import parse from 'html-dom-parser'; -import { makeOptions } from './options'; -import type { OptionTypes } from './options'; -import { convertDOMToMarkdown } from './convert-dom-to-markdown'; +import parse from "html-dom-parser"; +import { convertDOMToMarkdown } from "./convert-dom-to-markdown"; +import { makeOptions } from "./options"; +import type { OptionTypes } from "./options"; /** * @param html - HTML string. @@ -9,15 +9,14 @@ import { convertDOMToMarkdown } from './convert-dom-to-markdown'; * @returns - String */ const HTMLToMarkdownParser = (html: string, options?: OptionTypes) => { - const { image, markStyle } = makeOptions(options); - const nodes = parse(html); - if (nodes) { - return convertDOMToMarkdown({ nodes, image, markStyle }); - } else { - console.error('Failed to parse HTML string.'); + const { image, markStyle } = makeOptions(options); + const nodes = parse(html); + if (nodes) { + return convertDOMToMarkdown({ nodes, image, markStyle }); + } - return ''; - } + console.error("Failed to parse HTML string."); + return ""; }; export { HTMLToMarkdownParser }; diff --git a/src/index.ts b/src/index.ts index 5500482..776f40a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ -import { HTMLToMarkdownParser } from './html-to-markdown-parser'; -import type { OptionTypes } from './options'; +import { HTMLToMarkdownParser } from "./html-to-markdown-parser"; +import type { OptionTypes } from "./options"; /** * @param html - HTML string. @@ -7,18 +7,18 @@ import type { OptionTypes } from './options'; * @returns - String */ export const RichEditorToMarkdownParser = ( - html: string, - options?: OptionTypes, + html: string, + options?: OptionTypes, ) => { - if (typeof html !== 'string') { - throw new TypeError('First argument must be a string'); - } + if (typeof html !== "string") { + throw new TypeError("First argument must be a string"); + } - if (!html) { - return ''; - } + if (!html) { + return ""; + } - return HTMLToMarkdownParser(html, options); + return HTMLToMarkdownParser(html, options); }; export default RichEditorToMarkdownParser; diff --git a/src/marks.ts b/src/marks.ts index e6c48f8..c2c9a1a 100644 --- a/src/marks.ts +++ b/src/marks.ts @@ -1,93 +1,85 @@ -import { MarkStyle } from './options'; +import type { MarkStyle } from "./options"; const createTextMark = ({ - tagName, - marks, - markStyle, + tagName, + marks, + markStyle, }: { - tagName: string; - marks: string; - markStyle: MarkStyle; + tagName: string; + marks: string; + markStyle: MarkStyle; }) => { - switch (tagName) { - case 'p': - return marks; - case 'h1': - return '#' + ' ' + marks; - case 'h2': - return '##' + ' ' + marks; - case 'h3': - return '###' + ' ' + marks; - case 'h4': - return '####' + ' ' + marks; - case 'h5': - return '#####' + ' ' + marks; - case 'strong': - return markStyle.strong + marks + markStyle.strong; - case 'em': - return markStyle.em + marks + markStyle.em; - case 's': - return '~~' + marks + '~~'; - case 'u': - return '' + marks + ''; - case 'blockquote': - return '>' + ' ' + marks; - case 'br': - return '\n'; - default: - return ''; - } + switch (tagName) { + case "p": + return marks; + case "h1": + return `# ${marks}`; + case "h2": + return `## ${marks}`; + case "h3": + return `### ${marks}`; + case "h4": + return `#### ${marks}`; + case "h5": + return `##### ${marks}`; + case "strong": + return markStyle.strong + marks + markStyle.strong; + case "em": + return markStyle.em + marks + markStyle.em; + case "s": + return `~~${marks}~~`; + case "u": + return `${marks}`; + case "blockquote": + return `> ${marks}`; + case "br": + return "\n"; + default: + return ""; + } }; const createHorizontalRuleMark = (marks: string, markStyle: MarkStyle) => { - return marks + markStyle.hr; + return marks + markStyle.hr; }; const createImageMark = ({ src, alt }: { src: string; alt: string }) => { - return `![${alt}](${src})`; + return `![${alt}](${src})`; }; const createLinkMark = (marks: string, href: string) => { - return `[${marks}](${href})`; + return `[${marks}](${href})`; }; const createCodeBlockMark = ({ - marks, - markStyle, - language, - fileName, + marks, + markStyle, + language, + fileName, }: { - marks: string; - markStyle: MarkStyle; - language?: string; - fileName?: string; + marks: string; + markStyle: MarkStyle; + language?: string; + fileName?: string; }) => { - const fileNameMark = fileName ? ':' + fileName : ''; - return ( - markStyle.pre + - language + - fileNameMark + - '\n' + - marks + - '\n' + - markStyle.pre - ); + const fileNameMark = fileName ? `:${fileName}` : ""; + return `${markStyle.pre}${language}${fileNameMark}\n${marks}\n${markStyle.pre}`; }; const createInlineCodeMark = (marks: string) => { - return '`' + marks + '`'; + return `\`${marks}\``; }; const createCustomClass = (marks: string, _class: string) => { - return `` + marks + ''; + return `${marks}`; }; export { - createTextMark, - createHorizontalRuleMark, - createLinkMark, - createImageMark, - createCodeBlockMark, - createInlineCodeMark, - createCustomClass, + createTextMark, + createHorizontalRuleMark, + createLinkMark, + createImageMark, + createCodeBlockMark, + createInlineCodeMark, + createCustomClass, }; diff --git a/src/options.ts b/src/options.ts index 9c0aee1..b893938 100644 --- a/src/options.ts +++ b/src/options.ts @@ -1,46 +1,46 @@ export type OptionTypes = { - image?: Partial; - /** - * Change markdown style. - */ - markStyle?: Partial; + image?: Partial; + /** + * Change markdown style. + */ + markStyle?: Partial; }; export type Image = { - /** - * Contain width and height image size - * ex) ?w=1200&h=630 - */ - size: boolean; - /** - * Add image query in markdown. - * ex) ?format=webp - */ - query: string; + /** + * Contain width and height image size + * ex) ?w=1200&h=630 + */ + size: boolean; + /** + * Add image query in markdown. + * ex) ?format=webp + */ + query: string; }; export type MarkStyle = { - strong: '**' | '__'; - em: '*' | '_'; - li: '*' | '-' | '+'; - hr: '---' | '***' | '___'; - pre: '```' | '~~~'; + strong: "**" | "__"; + em: "*" | "_"; + li: "*" | "-" | "+"; + hr: "---" | "***" | "___"; + pre: "```" | "~~~"; }; const makeOptions = (options?: OptionTypes) => { - return { - image: { - size: options?.image?.size ?? true, - query: options?.image?.query ?? '', - }, - markStyle: { - strong: options?.markStyle?.strong ?? '**', - em: options?.markStyle?.em ?? '*', - li: options?.markStyle?.li ?? '-', - hr: options?.markStyle?.hr ?? '---', - pre: options?.markStyle?.pre ?? '```', - }, - }; + return { + image: { + size: options?.image?.size ?? true, + query: options?.image?.query ?? "", + }, + markStyle: { + strong: options?.markStyle?.strong ?? "**", + em: options?.markStyle?.em ?? "*", + li: options?.markStyle?.li ?? "-", + hr: options?.markStyle?.hr ?? "---", + pre: options?.markStyle?.pre ?? "```", + }, + }; }; export { makeOptions }; diff --git a/src/utils.ts b/src/utils.ts index 1680e12..c2cd321 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,76 +1,76 @@ -import type { Element } from 'html-dom-parser'; +import type { Element } from "html-dom-parser"; /** * DOM Element group. */ const TEXT_ELEMENT = [ - 'p', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'strong', - 'em', - 's', - 'br', - 'u', - 'blockquote', + "p", + "h1", + "h2", + "h3", + "h4", + "h5", + "strong", + "em", + "s", + "br", + "u", + "blockquote", ]; -const HORIZONTAL_RULE_ELEMENT = ['hr']; -const LINK_ELEMENT = ['a']; -const IMAGE_ELEMENT = ['img', 'figure', 'figcaption']; -const CODE_ELEMENT = ['div', 'pre', 'code']; -const TABLE_ELEMENT = ['table', 'tbody', 'tr', 'th', 'td']; -const LIST_ELEMENT = ['ul', 'ol', 'li']; -const CUSTOM_CLASS_ELEMENT = ['span']; +const HORIZONTAL_RULE_ELEMENT = ["hr"]; +const LINK_ELEMENT = ["a"]; +const IMAGE_ELEMENT = ["img", "figure", "figcaption"]; +const CODE_ELEMENT = ["div", "pre", "code"]; +const TABLE_ELEMENT = ["table", "tbody", "tr", "th", "td"]; +const LIST_ELEMENT = ["ul", "ol", "li"]; +const CUSTOM_CLASS_ELEMENT = ["span"]; /** * Find target DOM element. */ const isTextElement = (node: Element) => { - return find(TEXT_ELEMENT, node.name); + return find(TEXT_ELEMENT, node.name); }; const isHorizontalRuleElement = (node: Element) => { - return find(HORIZONTAL_RULE_ELEMENT, node.name); + return find(HORIZONTAL_RULE_ELEMENT, node.name); }; const isLinkElement = (node: Element) => { - return find(LINK_ELEMENT, node.name); + return find(LINK_ELEMENT, node.name); }; const isImageElement = (node: Element) => { - return find(IMAGE_ELEMENT, node.name); + return find(IMAGE_ELEMENT, node.name); }; const isCodeElement = (node: Element) => { - return find(CODE_ELEMENT, node.name); + return find(CODE_ELEMENT, node.name); }; const isTableElement = (node: Element) => { - return find(TABLE_ELEMENT, node.name); + return find(TABLE_ELEMENT, node.name); }; const isListElement = (node: Element) => { - return find(LIST_ELEMENT, node.name); + return find(LIST_ELEMENT, node.name); }; const isCustomClassElement = (node: Element) => { - return node.attribs.class && find(CUSTOM_CLASS_ELEMENT, node.name); + return node.attribs.class && find(CUSTOM_CLASS_ELEMENT, node.name); }; const find = (elements: string[], name: string) => { - return elements.some((v) => v === name); + return elements.some((v) => v === name); }; export { - isTextElement, - isHorizontalRuleElement, - isLinkElement, - isListElement, - isImageElement, - isCodeElement, - isTableElement, - isCustomClassElement, + isTextElement, + isHorizontalRuleElement, + isLinkElement, + isListElement, + isImageElement, + isCodeElement, + isTableElement, + isCustomClassElement, }; diff --git a/test/marks/code.test.ts b/test/marks/code.test.ts index 80125fb..8a0db75 100644 --- a/test/marks/code.test.ts +++ b/test/marks/code.test.ts @@ -1,38 +1,38 @@ -import { HTMLToMarkdownParser } from '../../src/html-to-markdown-parser'; -import { options } from './options'; +import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; +import { options } from "./options"; -describe('Code Block', () => { - test('should return convert code block', () => { - const parsed = HTMLToMarkdownParser('text'); - expect(parsed).toBe('`text`'); - }); +describe("Code Block", () => { + test("should return convert code block", () => { + const parsed = HTMLToMarkdownParser("text"); + expect(parsed).toBe("`text`"); + }); - test('should return convert code block', () => { - const parsed = HTMLToMarkdownParser( - '
console.log('test')
', - ); - expect(parsed).toBe("```\nconsole.log('test')\n```"); - }); + test("should return convert code block", () => { + const parsed = HTMLToMarkdownParser( + "
console.log('test')
", + ); + expect(parsed).toBe("```\nconsole.log('test')\n```"); + }); - test('should return convert code block to option', () => { - const parsed = HTMLToMarkdownParser( - '
console.log('test')
', - options, - ); - expect(parsed).toBe("~~~\nconsole.log('test')\n~~~"); - }); + test("should return convert code block to option", () => { + const parsed = HTMLToMarkdownParser( + "
console.log('test')
", + options, + ); + expect(parsed).toBe("~~~\nconsole.log('test')\n~~~"); + }); - test('should return convert code block with language', () => { - const parsed = HTMLToMarkdownParser( - '
console.log('test')
', - ); - expect(parsed).toBe("```javascript\nconsole.log('test')\n```"); - }); + test("should return convert code block with language", () => { + const parsed = HTMLToMarkdownParser( + '
console.log('test')
', + ); + expect(parsed).toBe("```javascript\nconsole.log('test')\n```"); + }); - test('should return convert code block with filename', () => { - const parsed = HTMLToMarkdownParser( - '
console.log('test')
', - ); - expect(parsed).toBe("```javascript:filename\nconsole.log('test')\n```"); - }); + test("should return convert code block with filename", () => { + const parsed = HTMLToMarkdownParser( + '
console.log('test')
', + ); + expect(parsed).toBe("```javascript:filename\nconsole.log('test')\n```"); + }); }); diff --git a/test/marks/heading.test.ts b/test/marks/heading.test.ts index b1739c7..83c92f3 100644 --- a/test/marks/heading.test.ts +++ b/test/marks/heading.test.ts @@ -1,38 +1,38 @@ -import { HTMLToMarkdownParser } from '../../src/html-to-markdown-parser'; +import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; -describe('Heading', () => { - test('should return convert h1 to #', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('# Hello'); - }); +describe("Heading", () => { + test("should return convert h1 to #", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("# Hello"); + }); - test('should return convert h2 to ##', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('## Hello'); - }); + test("should return convert h2 to ##", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("## Hello"); + }); - test('should return convert h3 to ###', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('### Hello'); - }); + test("should return convert h3 to ###", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("### Hello"); + }); - test('should return convert h4 to ####', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('#### Hello'); - }); + test("should return convert h4 to ####", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("#### Hello"); + }); - test('should return convert h5 to #####', () => { - const parsed = HTMLToMarkdownParser('
Hello
'); - expect(parsed).toBe('##### Hello'); - }); + test("should return convert h5 to #####", () => { + const parsed = HTMLToMarkdownParser("
Hello
"); + expect(parsed).toBe("##### Hello"); + }); - test('should return convert h1 with strong', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('# **Hello**'); - }); + test("should return convert h1 with strong", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("# **Hello**"); + }); - test('should return convert h6 to empty', () => { - const parsed = HTMLToMarkdownParser('
Hello
'); - expect(parsed).toBe(''); - }); + test("should return convert h6 to empty", () => { + const parsed = HTMLToMarkdownParser("
Hello
"); + expect(parsed).toBe(""); + }); }); diff --git a/test/marks/horizontalRule.test.ts b/test/marks/horizontalRule.test.ts index 7c8a089..f13b6fe 100644 --- a/test/marks/horizontalRule.test.ts +++ b/test/marks/horizontalRule.test.ts @@ -1,17 +1,17 @@ -import { HTMLToMarkdownParser } from '../../src/html-to-markdown-parser'; -import { options } from './options'; +import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; +import { options } from "./options"; -describe('Horizontal Rule', () => { - test('should return convert hr to ---', () => { - const parsed = HTMLToMarkdownParser('

text


text

'); - expect(parsed).toBe('text\n\n---\n\ntext'); - }); +describe("Horizontal Rule", () => { + test("should return convert hr to ---", () => { + const parsed = HTMLToMarkdownParser("

text


text

"); + expect(parsed).toBe("text\n\n---\n\ntext"); + }); - test('should return convert hr to option', () => { - const parsed = HTMLToMarkdownParser( - '

text


text

', - options, - ); - expect(parsed).toBe('text\n\n***\n\ntext'); - }); + test("should return convert hr to option", () => { + const parsed = HTMLToMarkdownParser( + "

text


text

", + options, + ); + expect(parsed).toBe("text\n\n***\n\ntext"); + }); }); diff --git a/test/marks/image.test.ts b/test/marks/image.test.ts index 1bfa9bd..8d5dbd7 100644 --- a/test/marks/image.test.ts +++ b/test/marks/image.test.ts @@ -1,41 +1,41 @@ -import { HTMLToMarkdownParser } from '../../src/html-to-markdown-parser'; -import { options } from './options'; +import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; +import { options } from "./options"; -describe('Image', () => { - test('should return convert img to image marks', () => { - const parsed = HTMLToMarkdownParser( - '
text
', - ); - expect(parsed).toBe( - '![text](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)', - ); - }); +describe("Image", () => { + test("should return convert img to image marks", () => { + const parsed = HTMLToMarkdownParser( + '
text
', + ); + expect(parsed).toBe( + "![text](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)", + ); + }); - test('should return convert img to without alt', () => { - const parsed = HTMLToMarkdownParser( - '
', - ); - expect(parsed).toBe( - '![](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)', - ); - }); + test("should return convert img to without alt", () => { + const parsed = HTMLToMarkdownParser( + '
', + ); + expect(parsed).toBe( + "![](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)", + ); + }); - test('should return convert img to option', () => { - const parsed = HTMLToMarkdownParser( - '
', - options, - ); - expect(parsed).toBe( - '![](https://images.microcms-assets.io/assets/service/test/file.png?format=webp)', - ); - }); + test("should return convert img to option", () => { + const parsed = HTMLToMarkdownParser( + '
', + options, + ); + expect(parsed).toBe( + "![](https://images.microcms-assets.io/assets/service/test/file.png?format=webp)", + ); + }); - test('should return convert img with link', () => { - const parsed = HTMLToMarkdownParser( - '
', - ); - expect(parsed).toBe( - '[![](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)](https://example.com)', - ); - }); + test("should return convert img with link", () => { + const parsed = HTMLToMarkdownParser( + '
', + ); + expect(parsed).toBe( + "[![](https://images.microcms-assets.io/assets/service/test/file.png?w=1200&h=630)](https://example.com)", + ); + }); }); diff --git a/test/marks/list.test.ts b/test/marks/list.test.ts index 1850d09..c148ced 100644 --- a/test/marks/list.test.ts +++ b/test/marks/list.test.ts @@ -1,24 +1,24 @@ -import { HTMLToMarkdownParser } from '../../src/html-to-markdown-parser'; +import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; -describe('List', () => { - test('should return convert ul to -', () => { - const parsed = HTMLToMarkdownParser('
  • text
  • text2
'); - expect(parsed).toBe('- text\n- text2'); - }); +describe("List", () => { + test("should return convert ul to -", () => { + const parsed = HTMLToMarkdownParser("
  • text
  • text2
"); + expect(parsed).toBe("- text\n- text2"); + }); - test('should return convert ol to number', () => { - const parsed = HTMLToMarkdownParser( - '
  1. text
  2. text
  3. text
', - ); - expect(parsed).toBe('1 text\n2 text\n3 text'); - }); + test("should return convert ol to number", () => { + const parsed = HTMLToMarkdownParser( + '
  1. text
  2. text
  3. text
', + ); + expect(parsed).toBe("1 text\n2 text\n3 text"); + }); - test('should return convert nested list', () => { - const parsed = HTMLToMarkdownParser( - '
  • text1
  • text2
    • text3
    • text4
      1. text5
      2. text6
      3. text7
', - ); - expect(parsed).toBe( - '- text1\n- text2\n - text3\n - text4\n 1 text5\n 2 text6\n 3 text7', - ); - }); + test("should return convert nested list", () => { + const parsed = HTMLToMarkdownParser( + "
  • text1
  • text2
    • text3
    • text4
      1. text5
      2. text6
      3. text7
", + ); + expect(parsed).toBe( + "- text1\n- text2\n - text3\n - text4\n 1 text5\n 2 text6\n 3 text7", + ); + }); }); diff --git a/test/marks/options.ts b/test/marks/options.ts index fded757..4a094a7 100644 --- a/test/marks/options.ts +++ b/test/marks/options.ts @@ -1,15 +1,15 @@ -import { OptionTypes } from '../../src/options'; +import type { OptionTypes } from "../../src/options"; export const options: OptionTypes = { - image: { - size: false, - query: 'format=webp', - }, - markStyle: { - strong: '__', - em: '_', - li: '*', - hr: '***', - pre: '~~~', - }, + image: { + size: false, + query: "format=webp", + }, + markStyle: { + strong: "__", + em: "_", + li: "*", + hr: "***", + pre: "~~~", + }, }; diff --git a/test/marks/table.test.ts b/test/marks/table.test.ts index 8a7075f..bd2b577 100644 --- a/test/marks/table.test.ts +++ b/test/marks/table.test.ts @@ -1,10 +1,10 @@ -import { HTMLToMarkdownParser } from '../../src/html-to-markdown-parser'; +import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; -describe('Table', () => { - test('should return convert table', () => { - const parsed = HTMLToMarkdownParser( - '

TH

TH

TD

', - ); - expect(parsed).toBe('| TH | TH |\n| --- | --- |\n| TD |\n'); - }); +describe("Table", () => { + test("should return convert table", () => { + const parsed = HTMLToMarkdownParser( + '

TH

TH

TD

', + ); + expect(parsed).toBe("| TH | TH |\n| --- | --- |\n| TD |\n"); + }); }); diff --git a/test/marks/text.test.ts b/test/marks/text.test.ts index b24ac16..c56fa8a 100644 --- a/test/marks/text.test.ts +++ b/test/marks/text.test.ts @@ -1,73 +1,73 @@ -import { HTMLToMarkdownParser } from '../../src/html-to-markdown-parser'; -import { options } from './options'; +import { HTMLToMarkdownParser } from "../../src/html-to-markdown-parser"; +import { options } from "./options"; -describe('Text', () => { - test('should return convert p to text', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('Hello'); - }); +describe("Text", () => { + test("should return convert p to text", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("Hello"); + }); - test('should return convert p to text', () => { - const parsed = HTMLToMarkdownParser('

Hello

World

'); - expect(parsed).toBe('Hello\n\nWorld'); - }); + test("should return convert p to text", () => { + const parsed = HTMLToMarkdownParser("

Hello

World

"); + expect(parsed).toBe("Hello\n\nWorld"); + }); - test('should return convert br to \n', () => { - const parsed = HTMLToMarkdownParser('

Hello
World

'); - expect(parsed).toBe('Hello\nWorld'); - }); + test("should return convert br to \n", () => { + const parsed = HTMLToMarkdownParser("

Hello
World

"); + expect(parsed).toBe("Hello\nWorld"); + }); - test('should return convert strong to **text**', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('**Hello**'); - }); + test("should return convert strong to **text**", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("**Hello**"); + }); - test('should return convert strong to option', () => { - const parsed = HTMLToMarkdownParser( - '

Hello

', - options, - ); - expect(parsed).toBe('__Hello__'); - }); + test("should return convert strong to option", () => { + const parsed = HTMLToMarkdownParser( + "

Hello

", + options, + ); + expect(parsed).toBe("__Hello__"); + }); - test('should return convert italic to *text*', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('*Hello*'); - }); + test("should return convert italic to *text*", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("*Hello*"); + }); - test('should return convert italic to option', () => { - const parsed = HTMLToMarkdownParser('

Hello

', options); - expect(parsed).toBe('_Hello_'); - }); + test("should return convert italic to option", () => { + const parsed = HTMLToMarkdownParser("

Hello

", options); + expect(parsed).toBe("_Hello_"); + }); - test('should return convert s to ~~text~~', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('~~Hello~~'); - }); + test("should return convert s to ~~text~~", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("~~Hello~~"); + }); - test('should return convert u to text', () => { - const parsed = HTMLToMarkdownParser('

Hello

'); - expect(parsed).toBe('Hello'); - }); + test("should return convert u to text", () => { + const parsed = HTMLToMarkdownParser("

Hello

"); + expect(parsed).toBe("Hello"); + }); - test('should return convert a to link marks', () => { - const parsed = HTMLToMarkdownParser( - '

ここにリンク

', - ); - expect(parsed).toBe('[ここにリンク](https://example.com)'); - }); + test("should return convert a to link marks", () => { + const parsed = HTMLToMarkdownParser( + '

ここにリンク

', + ); + expect(parsed).toBe("[ここにリンク](https://example.com)"); + }); - test('should return convert blockquote to >', () => { - const parsed = HTMLToMarkdownParser( - '

Hello World!

', - ); - expect(parsed).toBe('> Hello World!'); - }); + test("should return convert blockquote to >", () => { + const parsed = HTMLToMarkdownParser( + "

Hello World!

", + ); + expect(parsed).toBe("> Hello World!"); + }); - test('should return convert custom class', () => { - const parsed = HTMLToMarkdownParser( - '

Hello World!

', - ); - expect(parsed).toBe('Hello World!'); - }); + test("should return convert custom class", () => { + const parsed = HTMLToMarkdownParser( + '

Hello World!

', + ); + expect(parsed).toBe('Hello World!'); + }); }); diff --git a/test/rich-editor-to-markdown-perser.test.ts b/test/rich-editor-to-markdown-perser.test.ts index 14975d9..0ecbcc6 100644 --- a/test/rich-editor-to-markdown-perser.test.ts +++ b/test/rich-editor-to-markdown-perser.test.ts @@ -1,8 +1,8 @@ -import Parser from '../src'; +import Parser from "../src"; -describe('HTMLToMarkdownParser', () => { - test('should return convert markdown', () => { - const parsed = Parser('

Hello World!

Hello World!

'); - expect(parsed).toBe('# Hello World!\n\nHello World!'); - }); +describe("HTMLToMarkdownParser", () => { + test("should return convert markdown to HTML", () => { + const parsed = Parser("

Hello World!

Hello World!

"); + expect(parsed).toBe("# Hello World!\n\nHello World!"); + }); }); From 45324f49fb54485f2d5482760fda18c4a2305146 Mon Sep 17 00:00:00 2001 From: hiro08gh Date: Sun, 25 Aug 2024 13:59:40 +0900 Subject: [PATCH 2/2] add: ignore --- biome.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/biome.json b/biome.json index 3867749..735884c 100644 --- a/biome.json +++ b/biome.json @@ -7,6 +7,9 @@ "enabled": true, "rules": { "recommended": true - } + }, + "ignore": [ + "dist" + ] } -} +} \ No newline at end of file