diff options
Diffstat (limited to 'app/assets/javascripts/content_editor/services/markdown_sourcemap.js')
-rw-r--r-- | app/assets/javascripts/content_editor/services/markdown_sourcemap.js | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/app/assets/javascripts/content_editor/services/markdown_sourcemap.js b/app/assets/javascripts/content_editor/services/markdown_sourcemap.js new file mode 100644 index 00000000000..a1199589c9b --- /dev/null +++ b/app/assets/javascripts/content_editor/services/markdown_sourcemap.js @@ -0,0 +1,40 @@ +const getFullSource = (element) => { + const commentNode = element.ownerDocument.body.lastChild; + + if (commentNode.nodeName === '#comment') { + return commentNode.textContent.split('\n'); + } + + return []; +}; + +const getRangeFromSourcePos = (sourcePos) => { + const [start, end] = sourcePos.split('-'); + const [startRow, startCol] = start.split(':'); + const [endRow, endCol] = end.split(':'); + + return { + start: { row: Number(startRow) - 1, col: Number(startCol) - 1 }, + end: { row: Number(endRow) - 1, col: Number(endCol) - 1 }, + }; +}; + +export const getMarkdownSource = (element) => { + if (!element.dataset.sourcepos) return undefined; + + const source = getFullSource(element); + const range = getRangeFromSourcePos(element.dataset.sourcepos); + let elSource = ''; + + for (let i = range.start.row; i <= range.end.row; i += 1) { + if (i === range.start.row) { + elSource += source[i]?.substring(range.start.col); + } else if (i === range.end.row) { + elSource += `\n${source[i]?.substring(0, range.start.col)}`; + } else { + elSource += `\n${source[i]}` || ''; + } + } + + return elSource.trim(); +}; |