import { Sourcepos } from '@t/node'; import { AutolinkParser } from '@t/parser'; import { createNode, text } from '../node'; import NodeWalker from '../nodeWalker'; const DOMAIN = '(?:[w-]+.)*[A-Za-z0-9-]+.[A-Za-z0-9-]+'; const PATH = '[^<\\s]*[^ a.range[0] - b.range[0] ); } export function convertExtAutoLinks(walker: NodeWalker, autolinkParser: boolean | AutolinkParser) { if (typeof autolinkParser === 'boolean') { autolinkParser = baseAutolinkParser; } let event; while ((event = walker.next())) { const { entering, node } = event; if (entering && node.type === 'text' && node.parent!.type !== 'link') { const literal = node.literal!; const linkInfos = autolinkParser(literal); if (!linkInfos || !linkInfos.length) { continue; } let lastIdx = 0; const [lineNum, chPos] = node.sourcepos![0]; const sourcepos = (startIdx: number, endIdx: number): Sourcepos => [ [lineNum, chPos + startIdx], [lineNum, chPos + endIdx], ]; const newNodes = []; for (const { range, url, text: linkText } of linkInfos) { if (range[0] > lastIdx) { newNodes.push( text(literal.substring(lastIdx, range[0]), sourcepos(lastIdx, range[0] - 1)) ); } const linkNode = createNode('link', sourcepos(...range)); linkNode.appendChild(text(linkText, sourcepos(...range))); linkNode.destination = url; linkNode.extendedAutolink = true; newNodes.push(linkNode); lastIdx = range[1] + 1; } if (lastIdx < literal.length) { newNodes.push(text(literal.substring(lastIdx), sourcepos(lastIdx, literal.length - 1))); } for (const newNode of newNodes) { node.insertBefore(newNode); } node.unlink(); } } }