diff --git a/tools/server/public_simplechat/typemd.mjs b/tools/server/public_simplechat/typemd.mjs index 125f68343b..d4c41382b6 100644 --- a/tools/server/public_simplechat/typemd.mjs +++ b/tools/server/public_simplechat/typemd.mjs @@ -40,9 +40,14 @@ export class MarkDown { this.html = "" } + /** @typedef {{prev: number, cur: number}} EmptyTrackerResult */ + /** + * Track how many adjacent empty lines have been seen till now, in the immidate past. + * as well as whether the current line is empty or otherwise. * @param {string} key * @param {string} line + * @returns {EmptyTrackerResult} */ empty_tracker(key, line) { if (this.in.empty[key] == undefined) { @@ -57,6 +62,46 @@ export class MarkDown { return {prev: prev, cur: this.in.empty[key]} } + /** + * Append a new block to the end of html. + * @param {string} line + * @param {string} startMarker + * @param {string} endMarker + */ + appendnew(line, startMarker, endMarker) { + this.html += `${startMarker}${line}${endMarker}` + } + + /** + * Extend to the existing last block + * @param {string} line + * @param {string} endMarker + */ + extend(line, endMarker) { + let html = this.html + this.html = `${html.slice(0,html.length-endMarker.length)} ${line}${endMarker}` + } + + /** + * Extend the existing block, if + * * there was no immidiate empty lines AND + * * the existing block corresponds to what is specified. + * Else + * * append a new block + * + * @param {string} line + * @param {string} endMarker + * @param {string} startMarker + * @param {EmptyTrackerResult} emptyTracker + */ + extend_else_appendnew(line, endMarker, startMarker, emptyTracker) { + if ((emptyTracker.prev != 0) || (!this.html.endsWith(endMarker))) { + this.appendnew(line, startMarker, endMarker) + } else { + this.extend(line, endMarker) + } + } + unwind_list() { while (true) { let popped = this.in.list.endType.pop() @@ -126,12 +171,7 @@ export class MarkDown { if (matchOffset[1].length < lastOffset) { return false } - if ((emptyTracker.prev != 0) || (!this.html.endsWith("\n"))) { - this.html += `
${line}
` + let emptyTrackerPara = this.empty_tracker("para", line) + this.extend_else_appendnew(line, "\n", "", emptyTrackerPara) } /**