import { repeat } from 'lodash';
const topLevelOrderedRegexp = /^\d{1,3}/;
const nestedLineRegexp = /^\s+/;
/**
* DISCLAIMER: This is a temporary fix that corrects the indentation
* spaces of list items. This workaround originates in the usage of
* the Static Site Editor to edit the Handbook. The Handbook uses a
* Markdown parser called Kramdown interprets lines indented
* with two spaces as content within a list. For example:
*
* 1. ordered list
* - nested unordered list
*
* The Static Site Editor uses a different Markdown parser based on the
* CommonMark specification (official Markdown spec) called ToastMark.
* When the SSE encounters a nested list with only two spaces, it flattens
* the list:
*
* 1. ordered list
* - nested unordered list
*
* This function attempts to correct this problem before the content is loaded
* by Toast UI.
*/
const correctNestedContentIndenation = (source) => {
const lines = source.split('\n');
let topLevelOrderedListDetected = false;
return lines
.reduce((result, line) => {
if (topLevelOrderedListDetected && nestedLineRegexp.test(line)) {
return [...result, line.replace(nestedLineRegexp, repeat(' ', 4))];
}
topLevelOrderedListDetected = topLevelOrderedRegexp.test(line);
return [...result, line];
}, [])
.join('\n');
};
const removeOrphanedBrTags = (source) => {
/* Until the underlying Squire editor of Toast UI Editor resolves duplicate `
` tags, this
`replace` solution will clear out orphaned `
` tags that it generates. Additionally,
it cleans up orphaned `
` tags in the source markdown document that should be new lines.
https://gitlab.com/gitlab-org/gitlab/-/issues/227602#note_380765330
*/
return source.replace(/\n^
$/gm, '');
};
const format = (source) => {
return correctNestedContentIndenation(removeOrphanedBrTags(source));
};
export default format;