diff --git a/backend/functions/src/services/snapshot-formatter.ts b/backend/functions/src/services/snapshot-formatter.ts index fdce1d5..12ce7c0 100644 --- a/backend/functions/src/services/snapshot-formatter.ts +++ b/backend/functions/src/services/snapshot-formatter.ts @@ -295,9 +295,10 @@ export class SnapshotFormatter extends AsyncService { } if ( - !contentText || (contentText.startsWith('<') && contentText.endsWith('>')) + this.isPoorlyTransformed(contentText, toBeTurnedToMd) && toBeTurnedToMd !== jsDomElementOfHTML ) { + toBeTurnedToMd = jsDomElementOfHTML; try { contentText = this.jsdomControl.runTurndown(turnDownService, jsDomElementOfHTML); } catch (err) { @@ -310,7 +311,7 @@ export class SnapshotFormatter extends AsyncService { } } } - if (!contentText || (contentText.startsWith('<') || contentText.endsWith('>'))) { + if (this.isPoorlyTransformed(contentText, toBeTurnedToMd)) { contentText = snapshot.text; } } while (false); @@ -551,11 +552,58 @@ ${suffixMixins.length ? `\n${suffixMixins.join('\n\n')}\n` : ''}`; return delimiter + extraSpace + content + (delimiter === '```' && !content.endsWith(extraSpace) ? extraSpace : '') + delimiter; } }); + turnDownService.addRule('flattened-tables', { + filter: (node) => { + if (node.tagName !== 'TABLE') { + return false; + } + let parentHasTable = false; + let ptr = node.parentElement; + while (ptr) { + if (ptr.tagName === 'TABLE') { + parentHasTable = true; + break; + } + ptr = ptr.parentElement; + } + + return parentHasTable; + }, + replacement: (innerText) => { + return innerText.trim(); + } + }); return turnDownService; } + isPoorlyTransformed(content?: string, node?: Element) { + if (!content) { + return true; + } + + if (content.startsWith('<') && content.endsWith('>')) { + return true; + } + + if (content.includes('