mirror of https://github.com/fantasticit/think.git
43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
|
const isString = (val) => typeof val === 'string';
|
||
|
|
||
|
export const getFullSource = (element) => {
|
||
|
const commentNode = element.ownerDocument.body.lastChild;
|
||
|
|
||
|
if (commentNode?.nodeName === '#comment' && isString(commentNode.textContent)) {
|
||
|
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();
|
||
|
};
|