this repo has no description

Replace remark-title

Changed files
+51 -44
src
-7
src/types.d.ts
···
-
declare module 'remark-title' {
-
interface TitleOptions {
-
title: string;
-
}
-
export default function remarkTitle(opts: TitleOptions): (tree: Root) => undefined;
-
export type Root = import('mdast').Root;
-
}
···
+51 -37
src/unified.ts
···
-
import type { List, ListItem, PhrasingContent, Root } from 'mdast';
import { unified } from 'unified';
import { visit } from 'unist-util-visit';
import { defaultSchema as defaultSanitizeSchema } from 'hast-util-sanitize';
···
import remarkGfm from 'remark-gfm';
import remarkParse from 'remark-parse';
import remarkSqueezeParagraphs from 'remark-squeeze-paragraphs';
-
import remarkTitle from 'remark-title';
export async function sanitizeHtml(html: string): Promise<string> {
const vfile = await unified()
···
}
function extractTitle(markdown: string): string | null {
-
let depth: number | null = null;
-
let title: string | null = null;
-
const toString = (nodes: PhrasingContent[]): string =>
-
nodes.map((node) => {
-
switch (node.type) {
-
case 'break':
-
return '\n';
-
case 'delete':
-
case 'emphasis':
-
case 'link':
-
case 'strong':
-
return toString(node.children);
-
case 'inlineCode':
-
return `\`${node.value}\``;
-
case 'text':
-
return node.value;
-
case 'footnoteReference':
-
case 'html':
-
case 'image':
-
case 'imageReference':
-
case 'linkReference':
-
default:
-
return '';
-
}
-
}).join('');
const tree = unified()
.use(remarkParse, { fragment: true })
.use(remarkGfm, {
···
tableCellPadding: false,
})
.parse(markdown);
-
visit(tree, function (node) {
-
if (node.type !== 'heading')
-
return;
-
if (!depth || node.depth < depth)
-
title = toString(node.children);
-
});
-
return title;
}
export async function transferTitle(from: string, to: string): Promise<string> {
···
tablePipeAlign: false,
tableCellPadding: false,
})
-
.use(remarkTitle, {
-
title,
-
})
.use(remarkStringify, {
bullet: '-',
incrementListMarker: false,
···
+
import type { Heading, List, ListItem, PhrasingContent, Root } from 'mdast';
import { unified } from 'unified';
import { visit } from 'unist-util-visit';
import { defaultSchema as defaultSanitizeSchema } from 'hast-util-sanitize';
···
import remarkGfm from 'remark-gfm';
import remarkParse from 'remark-parse';
import remarkSqueezeParagraphs from 'remark-squeeze-paragraphs';
+
+
const toString = (nodes: PhrasingContent[]): string =>
+
nodes.map((node) => {
+
switch (node.type) {
+
case 'break':
+
return '\n';
+
case 'delete':
+
case 'emphasis':
+
case 'link':
+
case 'strong':
+
return toString(node.children);
+
case 'inlineCode':
+
return `\`${node.value}\``;
+
case 'text':
+
return node.value;
+
case 'footnoteReference':
+
case 'html':
+
case 'image':
+
case 'imageReference':
+
case 'linkReference':
+
default:
+
return '';
+
}
+
}).join('');
export async function sanitizeHtml(html: string): Promise<string> {
const vfile = await unified()
···
}
function extractTitle(markdown: string): string | null {
const tree = unified()
.use(remarkParse, { fragment: true })
.use(remarkGfm, {
···
tableCellPadding: false,
})
.parse(markdown);
+
const node = tree.children[0];
+
if (node && node.type === 'heading' && node.depth === 1) {
+
return toString(node.children);
+
} else {
+
return null;
+
}
+
}
+
+
function remarkTitle(opts: { title: string }) {
+
return function checkTitleTransformer(root: Root) {
+
const node = root.children[0]!;
+
const replacement: Heading = {
+
type: 'heading',
+
depth: 1,
+
children: [
+
{ type: 'text', value: opts.title }
+
]
+
};
+
if (node && node.type === 'heading') {
+
node.depth = 1;
+
node.children = replacement.children;
+
} else {
+
root.children?.unshift(replacement);
+
}
+
}
}
export async function transferTitle(from: string, to: string): Promise<string> {
···
tablePipeAlign: false,
tableCellPadding: false,
})
+
.use(remarkTitle, { title })
.use(remarkStringify, {
bullet: '-',
incrementListMarker: false,