@convo-lang/convo-lang
Version:
The language of AI
59 lines • 2.56 kB
JavaScript
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