Files
Tony 4618a9803a docs: bring back remark formatter (#14040)
* docs: format docs

* docs: Fix URLs in website documentation

* chore: bring back mdast formatter

* docs: format docs

* docs: remove heading id in jsx component

* docs: fix heading level

* chore: update remark formatter plugins

* chore: Update dependabot ignore list
2023-12-15 01:27:02 +08:00

82 lines
2.5 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Fork of https://github.com/syntax-tree/mdast-util-to-markdown/blob/8ce8dbf681a29f0f33db91bcfffdabeb9345d609/lib/handle/heading.js
* v1.5.0
*/
/**
* @typedef {import('mdast').Heading} Heading
* @typedef {import('../types.js').Parent} Parent
* @typedef {import('../types.js').State} State
* @typedef {import('../types.js').Info} Info
*/
// import { formatHeadingAsSetext } from "../util/format-heading-as-setext.js";
/**
* @param {Heading} node
* @param {Parent | undefined} _
* @param {State} state
* @param {Info} info
* @returns {string}
*/
export function heading(node, _, state, info) {
const rank = Math.max(Math.min(6, node.depth || 1), 1);
const tracker = state.createTracker(info);
// if (formatHeadingAsSetext(node, state)) {
// const exit = state.enter("headingSetext");
// const subexit = state.enter("phrasing");
// const value = state.containerPhrasing(node, {
// ...tracker.current(),
// before: "\n",
// after: "\n",
// });
// subexit();
// exit();
// return (
// value +
// "\n" +
// (rank === 1 ? "=" : "-").repeat(
// // The whole size…
// value.length -
// // Minus the position of the character after the last EOL (or
// // 0 if there is none)…
// (Math.max(value.lastIndexOf("\r"), value.lastIndexOf("\n")) + 1),
// )
// );
// }
const sequence = '#'.repeat(rank);
const exit = state.enter('headingAtx');
const subexit = state.enter('phrasing');
// Note: for proper tracking, we should reset the output positions when there
// is no content returned, because then the space is not output.
// Practically, in that case, there is no content, so it doesn’t matter that
// we’ve tracked one too many characters.
tracker.move(sequence + ' ');
let value = state.containerPhrasing(node, {
before: '# ',
after: '\n',
...tracker.current(),
});
if (/^[\t ]/.test(value)) {
// To do: what effect has the character reference on tracking?
value = '&#x' + value.charCodeAt(0).toString(16).toUpperCase() + ';' + value.slice(1);
}
value = value ? sequence + ' ' + value + (node.data?.id ? ' {#' + node.data?.id + '}' : '') : sequence;
if (state.options.closeAtx) {
value += ' ' + sequence;
}
subexit();
exit();
return value;
}