Fixed paragraphs in stage three processing

This commit is contained in:
2023-09-19 21:17:02 +02:00
parent e76fee2c68
commit d926e06fa8

View File

@@ -116,6 +116,41 @@ class Heading extends Symbol {
}
}
class JustALineBreak extends Symbol {
/**
*
* @param {string} line
* @returns {boolean}
*/
static canParse(line) {
return line === "";
}
/**
*
* @param {LineFeed} lineFeed
* @returns {Symbol}
*/
static create(lineFeed) {
const instance = new JustALineBreak();
lineFeed.claim();
return instance;
}
/**
*
* @param {string} assetDirectory
* @returns {void}
*/
process(assetDirectory) {
return;
}
render() {
throw new Error("Symbol cannot be rendered directly");
}
}
class Paragraph extends Symbol {
/**
* @type {string[]}
@@ -164,10 +199,7 @@ class Paragraph extends Symbol {
* @returns {void}
*/
process(assetDirectory) {
if (this.lines.length === 0) return;
const symbols = toSymbols(this.lines.join("\n"), assetDirectory);
this.lines = [];
this.children = symbols;
return;
}
render() {
@@ -823,6 +855,7 @@ const getAmountOfTokenInBeginningOfFile = (token, string) => {
* @type {Symbol[]}
*/
const AllSymbols = [
JustALineBreak,
Heading,
UnorderedListItem,
OrderedListItem,
@@ -846,16 +879,52 @@ export const toHtml = (markdown, assetDirectory) => {
const symbols = toSymbols(markdown, assetDirectory);
// Stage two, expanding symbols
console.log("starting processing");
symbols.forEach((s) => s.process(assetDirectory));
// Stage three, operations based on symbol relationship
const stageThree = stageThreeProcessing(symbols);
// Stage four, rendering
const html = symbols.map((s) => s.render()).join("");
const html = stageThree
// .filter((s) => !(s instanceof JustALineBreak))
.map((s) => s.render())
.join("");
return `<div>${html}</div>`;
};
/**
*
* @param {Symbol[]} symbols
* @returns {Symbol[]}
*/
const stageThreeProcessing = (symbols) => {
const localSymbols = [...symbols];
// Turn line break pairs into paragraphs
while (localSymbols.filter((s) => s instanceof JustALineBreak).length !== 0) {
const startIndex = localSymbols.findIndex(
(s) => s instanceof JustALineBreak
);
const subEndIndex = localSymbols
.slice(startIndex + 1)
.findIndex((s) => s instanceof JustALineBreak);
const endIndex =
subEndIndex === -1
? localSymbols.length - 1
: startIndex + 1 + subEndIndex;
const lastItemIsNotLineBreak = subEndIndex === -1;
const children = localSymbols.slice(
startIndex + 1,
lastItemIsNotLineBreak ? localSymbols.length : endIndex
);
const paragraph = new Paragraph();
paragraph.children = children;
console.log(children, startIndex, endIndex);
localSymbols.splice(startIndex, children.length + 1, paragraph);
console.log(localSymbols.filter((s) => s instanceof JustALineBreak).length);
}
// Fix indentation of bullet elements
return localSymbols;
};
/**
*
* @param {string} markdown