UNPKG

@convo-lang/convo-lang

Version:
59 lines 2.56 kB
import { unescapeHtml } from '@iyio/common'; import { unescapeConvo } from './convo-parser.js'; import { convoMessageSourceReferenceKey } from './convo-types.js'; const blockReg = /(?<start>(^|\r|\n)[ \t]*)<(?<tagName>[\w-]+)(?<attributes>[^>]*)>[ \t\r\n]*```[ \t]*(?<lang>[\w-]+)(?<content>[\s\S]*?)```[ \t\r\n]*<\/\k<tagName>>/g; const attReg = /(?<name>[\w-]+)([ \t]*=[ \t]*("(?<dq>[^"]*)"|'(?<sq>[^']*)'))?/g; export const parseConvoCodeBlocks = (text, indexOffsetOrParentMessage, blockIndexOffset = 0) => { let indexOffset; if (typeof indexOffsetOrParentMessage === 'number') { indexOffset = indexOffsetOrParentMessage; } else if (indexOffsetOrParentMessage) { const src = indexOffsetOrParentMessage[convoMessageSourceReferenceKey]; if (src && indexOffsetOrParentMessage.s !== undefined && indexOffsetOrParentMessage.e !== undefined) { text = src.source.substring(indexOffsetOrParentMessage.s, indexOffsetOrParentMessage.e); } indexOffset = indexOffsetOrParentMessage.s ?? 0; } else { indexOffset = 0; } blockReg.lastIndex = 0; let blocks; let match; while (match = blockReg.exec(text)) { const start = match.groups?.['start'] ?? ''; const tagName = match.groups?.['tagName'] ?? ''; const attributes = match.groups?.['attributes'] ?? ''; const lang = match.groups?.['lang'] ?? ''; const atts = {}; attReg.lastIndex = 0; let attMatch; while (attMatch = attReg.exec(attributes)) { atts[attMatch.groups?.['name'] ?? ''] = unescapeHtml(attMatch.groups?.['dq'] ?? attMatch.groups?.['sq'] ?? ''); } if (!blocks) { blocks = []; } blocks.push({ tagName, attributes: atts, lang, content: normalizeConvoCodeBlockContent(tagName, match.groups?.['content'] ?? '', atts), index: blockIndexOffset + blocks.length, startIndex: indexOffset + (match.index ?? 0) + start.length, endIndex: indexOffset + (match.index ?? 0) + match[0].length, }); } return blocks; }; export const normalizeConvoCodeBlockContent = (tag, content, attrs) => { content = content.trim(); content = unescapeConvo(content); const closing = attrs?.['closing-escape']; if (closing) { content = content.split(closing).join(`</${tag}>`); } return content.endsWith('\n') ? content : content + '\n'; }; //# sourceMappingURL=convo-code-block-lib.js.map