@mtcute/markdown-parser 0.16.3 → 0.16.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/cjs/index.js +6 -7
- package/cjs/index.js.map +1 -1
- package/esm/index.js +6 -7
- package/esm/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -129,10 +129,10 @@ You can interpolate one of the following:
|
|
|
129
129
|
- `number` - will be converted to string and appended to plain text as-is
|
|
130
130
|
- `TextWithEntities` or `MessageEntity` - will add the text and its entities to the output. This is the type returned by `md` itself:
|
|
131
131
|
```ts
|
|
132
|
-
|
|
133
|
-
|
|
132
|
+
const bold = md`**bold**`
|
|
133
|
+
const text = md`Hello, ${bold}!`
|
|
134
134
|
```
|
|
135
135
|
- falsy value (i.e. `null`, `undefined`, `false`) - will be ignored
|
|
136
136
|
|
|
137
137
|
Because of interpolation, you almost never need to think about escaping anything,
|
|
138
|
-
since the values are not even parsed as Markdown, and are appended to the output as-is.
|
|
138
|
+
since the values are not even parsed as Markdown, and are appended to the output as-is.
|
package/cjs/index.js
CHANGED
|
@@ -28,7 +28,7 @@ const TO_BE_ESCAPED = /[*_\-~`[\\\]|]/g;
|
|
|
28
28
|
* > handles all `string`s passed to it automatically as plain text.
|
|
29
29
|
*/
|
|
30
30
|
function escape(str) {
|
|
31
|
-
return str.replace(TO_BE_ESCAPED,
|
|
31
|
+
return str.replace(TO_BE_ESCAPED, s => `\\${s}`);
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
34
|
* Add Markdown formatting to the text given the plain text and entities contained in it.
|
|
@@ -42,7 +42,7 @@ function unparse(input) {
|
|
|
42
42
|
const escaped = [];
|
|
43
43
|
text = text.replace(TO_BE_ESCAPED, (s, pos) => {
|
|
44
44
|
escaped.push(pos);
|
|
45
|
-
return
|
|
45
|
+
return `\\${s}`;
|
|
46
46
|
});
|
|
47
47
|
const hasEscaped = escaped.length > 0;
|
|
48
48
|
const insert = [];
|
|
@@ -95,7 +95,7 @@ function unparse(input) {
|
|
|
95
95
|
startTag += entity.language;
|
|
96
96
|
}
|
|
97
97
|
startTag += '\n';
|
|
98
|
-
endTag =
|
|
98
|
+
endTag = `\n${TAG_PRE}`;
|
|
99
99
|
break;
|
|
100
100
|
case 'messageEntityTextUrl':
|
|
101
101
|
startTag = '[';
|
|
@@ -221,7 +221,7 @@ function parse(strings, ...sub) {
|
|
|
221
221
|
ent.length = result.length - ent.offset;
|
|
222
222
|
let m = url.match(MENTION_REGEX);
|
|
223
223
|
if (m) {
|
|
224
|
-
const userId = parseInt(m[1]);
|
|
224
|
+
const userId = Number.parseInt(m[1]);
|
|
225
225
|
const accessHash = m[2];
|
|
226
226
|
if (accessHash) {
|
|
227
227
|
ent._ = 'inputMessageEntityMentionName';
|
|
@@ -242,7 +242,7 @@ function parse(strings, ...sub) {
|
|
|
242
242
|
}
|
|
243
243
|
else {
|
|
244
244
|
if (url.match(/^\/\//))
|
|
245
|
-
url =
|
|
245
|
+
url = `http:${url}`;
|
|
246
246
|
ent._ = 'messageEntityTextUrl';
|
|
247
247
|
ent.url = url;
|
|
248
248
|
}
|
|
@@ -254,11 +254,10 @@ function parse(strings, ...sub) {
|
|
|
254
254
|
insideLink = true;
|
|
255
255
|
if (!('link' in stacks))
|
|
256
256
|
stacks.link = [];
|
|
257
|
-
// eslint-disable-next-line
|
|
257
|
+
// eslint-disable-next-line ts/no-unsafe-argument
|
|
258
258
|
stacks.link.push({
|
|
259
259
|
offset: result.length,
|
|
260
260
|
length: 0,
|
|
261
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
262
261
|
}); // other fields are added after the second part
|
|
263
262
|
continue;
|
|
264
263
|
}
|
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport type { InputText, MessageEntity, TextWithEntities, tl } from '@mtcute/core'\n\nconst MENTION_REGEX = /^tg:\\/\\/user\\?id=(\\d+)(?:&hash=(-?[0-9a-fA-F]+)(?:&|$)|&|$)/\nconst EMOJI_REGEX = /^tg:\\/\\/emoji\\?id=(-?\\d+)/\n\nconst TAG_BOLD = '**'\nconst TAG_ITALIC = '__'\nconst TAG_UNDERLINE = '--'\nconst TAG_STRIKE = '~~'\nconst TAG_SPOILER = '||'\nconst TAG_CODE = '`'\nconst TAG_PRE = '```'\n\nconst TO_BE_ESCAPED = /[*_\\-~`[\\\\\\]|]/g\n\n/**\n * Escape a string to be safely used in Markdown.\n *\n * > **Note**: this function is in most cases not needed, as `md` function\n * > handles all `string`s passed to it automatically as plain text.\n */\nfunction escape(str: string): string {\n return str.replace(TO_BE_ESCAPED, (s) => '\\\\' + s)\n}\n\n/**\n * Add Markdown formatting to the text given the plain text and entities contained in it.\n */\nfunction unparse(input: InputText): string {\n if (typeof input === 'string') return escape(input)\n\n let text = input.text\n const entities = input.entities ?? []\n\n // keep track of positions of inserted escape symbols\n const escaped: number[] = []\n text = text.replace(TO_BE_ESCAPED, (s, pos: number) => {\n escaped.push(pos)\n\n return '\\\\' + s\n })\n const hasEscaped = escaped.length > 0\n\n type InsertLater = [number, string]\n const insert: InsertLater[] = []\n\n for (const entity of entities) {\n const type = entity._\n\n let start = entity.offset\n let end = start + entity.length\n\n if (start > text.length) continue\n if (start < 0) start = 0\n if (end > text.length) end = text.length\n\n if (hasEscaped) {\n // determine number of escape chars since the beginning of the string\n let escapedPos = 0\n\n while (escapedPos < escaped.length && escaped[escapedPos] < start) {\n escapedPos += 1\n }\n start += escapedPos\n\n while (escapedPos < escaped.length && escaped[escapedPos] <= end) {\n escapedPos += 1\n }\n end += escapedPos\n }\n\n let startTag\n let endTag: string\n\n switch (type) {\n case 'messageEntityBold':\n startTag = endTag = TAG_BOLD\n break\n case 'messageEntityItalic':\n startTag = endTag = TAG_ITALIC\n break\n case 'messageEntityUnderline':\n startTag = endTag = TAG_UNDERLINE\n break\n case 'messageEntityStrike':\n startTag = endTag = TAG_STRIKE\n break\n case 'messageEntitySpoiler':\n startTag = endTag = TAG_SPOILER\n break\n case 'messageEntityCode':\n startTag = endTag = TAG_CODE\n break\n case 'messageEntityPre':\n startTag = TAG_PRE\n\n if (entity.language) {\n startTag += entity.language\n }\n\n startTag += '\\n'\n endTag = '\\n' + TAG_PRE\n break\n case 'messageEntityTextUrl':\n startTag = '['\n endTag = `](${entity.url})`\n break\n case 'messageEntityMentionName':\n startTag = '['\n endTag = `](tg://user?id=${entity.userId})`\n break\n case 'messageEntityCustomEmoji':\n startTag = '['\n endTag = `](tg://emoji?id=${entity.documentId.toString()})`\n break\n default:\n continue\n }\n\n insert.push([start, startTag])\n insert.push([end, endTag])\n }\n\n // sort by offset desc\n insert.sort((a, b) => b[0] - a[0])\n\n for (const [offset, tag] of insert) {\n text = text.substr(0, offset) + tag + text.substr(offset)\n }\n\n return text\n}\n\nfunction parse(\n strings: TemplateStringsArray | string,\n ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]\n): TextWithEntities {\n const entities: tl.TypeMessageEntity[] = []\n let result = ''\n\n const stacks: Record<string, tl.Mutable<tl.TypeMessageEntity>[]> = {}\n\n let insideCode = false\n let insidePre = false\n let insideLink = false\n\n let insideLinkUrl = false\n let pendingLinkUrl = ''\n\n function feed(text: string) {\n const len = text.length\n let pos = 0\n\n while (pos < len) {\n const c = text[pos]\n\n if (c === '\\\\') {\n if (insideLinkUrl) {\n pendingLinkUrl += text[pos + 1]\n } else {\n result += text[pos + 1]\n }\n pos += 2\n continue\n }\n\n if (insideCode) {\n if (c === '`') {\n // we can be certain that we're inside code\n\n const ent = stacks.code.pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n insideCode = false\n pos += 1\n } else {\n pos += 1\n result += c\n }\n continue\n }\n\n if (insidePre) {\n if (c === '`' || (c === '\\n' && text[pos + 1] === '`')) {\n if (c === '\\n') pos += 1\n\n if (text[pos + 1] === '`' && text[pos + 2] === '`') {\n // we can be certain that we're inside pre\n\n const ent = stacks.pre.pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n insidePre = false\n pos += 3\n continue\n\n // closed with single or double backtick\n // i.e. not closed actually! this is totally valid md:\n // ```javascript\n // const a = ``;\n // ```\n // compensate that `pos` change we made earliers\n } else if (c === '\\n') {\n pos -= 1\n }\n }\n\n pos += 1\n result += c\n continue\n }\n\n if (insideLink && c === ']') {\n // we can be certain that we're inside link\n\n const ent = stacks.link.pop()!\n\n if (text[pos + 1] !== '(') {\n // [link text]\n // ignore this, and add opening [\n result = `${result.substr(0, ent.offset)}[${result.substr(ent.offset)}]`\n pos += 1\n insideLink = false\n continue\n }\n\n pos += 2\n insideLink = false\n insideLinkUrl = true\n stacks.link.push(ent)\n continue\n }\n\n if (insideLinkUrl) {\n pos += 1\n\n if (c !== ')') {\n // not ended yet\n pendingLinkUrl += c\n continue\n }\n\n const ent = stacks.link.pop()!\n\n let url = pendingLinkUrl\n pendingLinkUrl = ''\n insideLinkUrl = false\n\n if (!url.length) continue\n\n ent.length = result.length - ent.offset\n\n let m = url.match(MENTION_REGEX)\n\n if (m) {\n const userId = parseInt(m[1])\n const accessHash = m[2]\n\n if (accessHash) {\n (ent as tl.Mutable<tl.RawInputMessageEntityMentionName>)._ = 'inputMessageEntityMentionName'\n ;(ent as tl.Mutable<tl.RawInputMessageEntityMentionName>).userId = {\n _: 'inputUser',\n userId,\n accessHash: Long.fromString(accessHash, false, 16),\n }\n } else {\n (ent as tl.Mutable<tl.RawMessageEntityMentionName>)._ = 'messageEntityMentionName'\n ;(ent as tl.Mutable<tl.RawMessageEntityMentionName>).userId = userId\n }\n } else if ((m = EMOJI_REGEX.exec(url))) {\n (ent as tl.Mutable<tl.RawMessageEntityCustomEmoji>)._ = 'messageEntityCustomEmoji'\n ;(ent as tl.Mutable<tl.RawMessageEntityCustomEmoji>).documentId = Long.fromString(m[1])\n } else {\n if (url.match(/^\\/\\//)) url = 'http:' + url\n ;(ent as tl.Mutable<tl.RawMessageEntityTextUrl>)._ = 'messageEntityTextUrl'\n ;(ent as tl.Mutable<tl.RawMessageEntityTextUrl>).url = url\n }\n entities.push(ent)\n\n continue\n }\n\n if (c === '[' && !insideLink) {\n pos += 1\n insideLink = true\n if (!('link' in stacks)) stacks.link = []\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n stacks.link.push({\n offset: result.length,\n length: 0,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any) // other fields are added after the second part\n continue\n }\n\n if (c === '`') {\n const isPre = text[pos + 1] === '`' && text[pos + 2] === '`'\n\n if (isPre) {\n pos += 3\n let language = ''\n\n while (pos < text.length && text[pos] !== '\\n') {\n language += text[pos++]\n }\n\n // newline\n pos += 1\n\n if (pos > text.length) {\n throw new Error('Malformed PRE entity, expected LF after ```')\n }\n\n if (!('pre' in stacks)) stacks.pre = []\n stacks.pre.push({\n _: 'messageEntityPre',\n offset: result.length,\n length: 0,\n language,\n })\n insidePre = true\n } else {\n pos += 1\n if (!('code' in stacks)) stacks.code = []\n stacks.code.push({\n _: 'messageEntityCode',\n offset: result.length,\n length: 0,\n })\n insideCode = true\n }\n\n continue\n }\n\n if (c === text[pos + 1]) {\n // maybe (?) start or end of an entity\n let type: 'Italic' | 'Bold' | 'Underline' | 'Strike' | 'Spoiler' | null = null\n\n switch (c) {\n case '_':\n type = 'Italic'\n break\n case '*':\n type = 'Bold'\n break\n case '-':\n type = 'Underline'\n break\n case '~':\n type = 'Strike'\n break\n case '|':\n type = 'Spoiler'\n break\n }\n\n if (type) {\n if (!(type in stacks)) stacks[type] = []\n const isBegin = stacks[type].length === 0\n\n if (isBegin) {\n stacks[type].push({\n _: `messageEntity${type}`,\n offset: result.length,\n length: 0,\n })\n } else {\n // valid because isBegin is false\n\n const ent = stacks[type].pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n }\n\n pos += 2\n continue\n }\n }\n\n if (c === '\\n') {\n if (pos !== 0) {\n result += '\\n'\n }\n\n const nonWhitespace = text.slice(pos + 1).search(/[^ \\t]/)\n\n if (nonWhitespace !== -1) {\n pos += nonWhitespace + 1\n } else {\n pos = len\n result = result.trimEnd()\n }\n continue\n }\n\n // nothing matched => normal character\n result += c\n pos += 1\n }\n }\n\n if (typeof strings === 'string') strings = [strings] as unknown as TemplateStringsArray\n\n sub.forEach((it, idx) => {\n feed(strings[idx])\n\n if (typeof it === 'boolean' || !it) return\n\n if (insideLinkUrl) {\n if (typeof it === 'string' || typeof it === 'number') {\n pendingLinkUrl += it\n } else if (Long.isLong(it)) {\n pendingLinkUrl += it.toString(10)\n } else {\n // ignore the entity, only use text\n pendingLinkUrl += it.text\n }\n\n return\n }\n\n if (typeof it === 'string' || typeof it === 'number') {\n result += it\n } else if (Long.isLong(it)) {\n result += it.toString(10)\n } else {\n // TextWithEntities or MessageEntity\n const text = it.text\n const innerEntities = 'raw' in it ? [it.raw] : it.entities\n\n const baseOffset = result.length\n result += text\n\n if (innerEntities) {\n for (const ent of innerEntities) {\n entities.push({ ...ent, offset: ent.offset + baseOffset })\n }\n }\n }\n })\n\n feed(strings[strings.length - 1])\n\n for (const [name, stack] of Object.entries(stacks)) {\n if (stack.length) {\n throw new Error(`Unterminated ${name} entity`)\n }\n }\n\n return {\n text: result,\n entities,\n }\n}\n\n// typedoc doesn't support this yet, so we'll have to do it manually\n// https://github.com/TypeStrong/typedoc/issues/2436\n\nexport const md: {\n /**\n * Tagged template based Markdown-to-entities parser function\n *\n * Additionally, `md` function has two static methods:\n * - `md.escape` - escape a string to be safely used in Markdown\n * (should not be needed in most cases, as `md` function itself handles all `string`s\n * passed to it automatically as plain text)\n * - `md.unparse` - add Markdown formatting to the text given the plain text and entities contained in it\n *\n * @example\n * ```typescript\n * const text = md`**${user.displayName}**`\n * ```\n */\n (\n strings: TemplateStringsArray,\n ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]\n ): TextWithEntities\n /**\n * A variant taking a plain JS string as input\n * and parsing it.\n *\n * Useful for cases when you already have a string\n * (e.g. from some server) and want to parse it.\n *\n * @example\n * ```typescript\n * const string = '**hello**'\n * const text = md(string)\n * ```\n */\n (string: string): TextWithEntities\n escape: typeof escape\n unparse: typeof unparse\n} = Object.assign(parse, {\n escape,\n unparse,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\nimport type { InputText, MessageEntity, TextWithEntities, tl } from '@mtcute/core'\n\nconst MENTION_REGEX = /^tg:\\/\\/user\\?id=(\\d+)(?:&hash=(-?[0-9a-fA-F]+)(?:&|$)|&|$)/\nconst EMOJI_REGEX = /^tg:\\/\\/emoji\\?id=(-?\\d+)/\n\nconst TAG_BOLD = '**'\nconst TAG_ITALIC = '__'\nconst TAG_UNDERLINE = '--'\nconst TAG_STRIKE = '~~'\nconst TAG_SPOILER = '||'\nconst TAG_CODE = '`'\nconst TAG_PRE = '```'\n\nconst TO_BE_ESCAPED = /[*_\\-~`[\\\\\\]|]/g\n\n/**\n * Escape a string to be safely used in Markdown.\n *\n * > **Note**: this function is in most cases not needed, as `md` function\n * > handles all `string`s passed to it automatically as plain text.\n */\nfunction escape(str: string): string {\n return str.replace(TO_BE_ESCAPED, s => `\\\\${s}`)\n}\n\n/**\n * Add Markdown formatting to the text given the plain text and entities contained in it.\n */\nfunction unparse(input: InputText): string {\n if (typeof input === 'string') return escape(input)\n\n let text = input.text\n const entities = input.entities ?? []\n\n // keep track of positions of inserted escape symbols\n const escaped: number[] = []\n text = text.replace(TO_BE_ESCAPED, (s, pos: number) => {\n escaped.push(pos)\n\n return `\\\\${s}`\n })\n const hasEscaped = escaped.length > 0\n\n type InsertLater = [number, string]\n const insert: InsertLater[] = []\n\n for (const entity of entities) {\n const type = entity._\n\n let start = entity.offset\n let end = start + entity.length\n\n if (start > text.length) continue\n if (start < 0) start = 0\n if (end > text.length) end = text.length\n\n if (hasEscaped) {\n // determine number of escape chars since the beginning of the string\n let escapedPos = 0\n\n while (escapedPos < escaped.length && escaped[escapedPos] < start) {\n escapedPos += 1\n }\n start += escapedPos\n\n while (escapedPos < escaped.length && escaped[escapedPos] <= end) {\n escapedPos += 1\n }\n end += escapedPos\n }\n\n let startTag\n let endTag: string\n\n switch (type) {\n case 'messageEntityBold':\n startTag = endTag = TAG_BOLD\n break\n case 'messageEntityItalic':\n startTag = endTag = TAG_ITALIC\n break\n case 'messageEntityUnderline':\n startTag = endTag = TAG_UNDERLINE\n break\n case 'messageEntityStrike':\n startTag = endTag = TAG_STRIKE\n break\n case 'messageEntitySpoiler':\n startTag = endTag = TAG_SPOILER\n break\n case 'messageEntityCode':\n startTag = endTag = TAG_CODE\n break\n case 'messageEntityPre':\n startTag = TAG_PRE\n\n if (entity.language) {\n startTag += entity.language\n }\n\n startTag += '\\n'\n endTag = `\\n${TAG_PRE}`\n break\n case 'messageEntityTextUrl':\n startTag = '['\n endTag = `](${entity.url})`\n break\n case 'messageEntityMentionName':\n startTag = '['\n endTag = `](tg://user?id=${entity.userId})`\n break\n case 'messageEntityCustomEmoji':\n startTag = '['\n endTag = `](tg://emoji?id=${entity.documentId.toString()})`\n break\n default:\n continue\n }\n\n insert.push([start, startTag])\n insert.push([end, endTag])\n }\n\n // sort by offset desc\n insert.sort((a, b) => b[0] - a[0])\n\n for (const [offset, tag] of insert) {\n text = text.substr(0, offset) + tag + text.substr(offset)\n }\n\n return text\n}\n\nfunction parse(\n strings: TemplateStringsArray | string,\n ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]\n): TextWithEntities {\n const entities: tl.TypeMessageEntity[] = []\n let result = ''\n\n const stacks: Record<string, tl.Mutable<tl.TypeMessageEntity>[]> = {}\n\n let insideCode = false\n let insidePre = false\n let insideLink = false\n\n let insideLinkUrl = false\n let pendingLinkUrl = ''\n\n function feed(text: string) {\n const len = text.length\n let pos = 0\n\n while (pos < len) {\n const c = text[pos]\n\n if (c === '\\\\') {\n if (insideLinkUrl) {\n pendingLinkUrl += text[pos + 1]\n } else {\n result += text[pos + 1]\n }\n pos += 2\n continue\n }\n\n if (insideCode) {\n if (c === '`') {\n // we can be certain that we're inside code\n\n const ent = stacks.code.pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n insideCode = false\n pos += 1\n } else {\n pos += 1\n result += c\n }\n continue\n }\n\n if (insidePre) {\n if (c === '`' || (c === '\\n' && text[pos + 1] === '`')) {\n if (c === '\\n') pos += 1\n\n if (text[pos + 1] === '`' && text[pos + 2] === '`') {\n // we can be certain that we're inside pre\n\n const ent = stacks.pre.pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n insidePre = false\n pos += 3\n continue\n\n // closed with single or double backtick\n // i.e. not closed actually! this is totally valid md:\n // ```javascript\n // const a = ``;\n // ```\n // compensate that `pos` change we made earliers\n } else if (c === '\\n') {\n pos -= 1\n }\n }\n\n pos += 1\n result += c\n continue\n }\n\n if (insideLink && c === ']') {\n // we can be certain that we're inside link\n\n const ent = stacks.link.pop()!\n\n if (text[pos + 1] !== '(') {\n // [link text]\n // ignore this, and add opening [\n result = `${result.substr(0, ent.offset)}[${result.substr(ent.offset)}]`\n pos += 1\n insideLink = false\n continue\n }\n\n pos += 2\n insideLink = false\n insideLinkUrl = true\n stacks.link.push(ent)\n continue\n }\n\n if (insideLinkUrl) {\n pos += 1\n\n if (c !== ')') {\n // not ended yet\n pendingLinkUrl += c\n continue\n }\n\n const ent = stacks.link.pop()!\n\n let url = pendingLinkUrl\n pendingLinkUrl = ''\n insideLinkUrl = false\n\n if (!url.length) continue\n\n ent.length = result.length - ent.offset\n\n let m = url.match(MENTION_REGEX)\n\n if (m) {\n const userId = Number.parseInt(m[1])\n const accessHash = m[2]\n\n if (accessHash) {\n (ent as tl.Mutable<tl.RawInputMessageEntityMentionName>)._ = 'inputMessageEntityMentionName'\n ;(ent as tl.Mutable<tl.RawInputMessageEntityMentionName>).userId = {\n _: 'inputUser',\n userId,\n accessHash: Long.fromString(accessHash, false, 16),\n }\n } else {\n (ent as tl.Mutable<tl.RawMessageEntityMentionName>)._ = 'messageEntityMentionName'\n ;(ent as tl.Mutable<tl.RawMessageEntityMentionName>).userId = userId\n }\n } else if ((m = EMOJI_REGEX.exec(url))) {\n (ent as tl.Mutable<tl.RawMessageEntityCustomEmoji>)._ = 'messageEntityCustomEmoji'\n ;(ent as tl.Mutable<tl.RawMessageEntityCustomEmoji>).documentId = Long.fromString(m[1])\n } else {\n if (url.match(/^\\/\\//)) url = `http:${url}`\n ;(ent as tl.Mutable<tl.RawMessageEntityTextUrl>)._ = 'messageEntityTextUrl'\n ;(ent as tl.Mutable<tl.RawMessageEntityTextUrl>).url = url\n }\n entities.push(ent)\n\n continue\n }\n\n if (c === '[' && !insideLink) {\n pos += 1\n insideLink = true\n if (!('link' in stacks)) stacks.link = []\n // eslint-disable-next-line ts/no-unsafe-argument\n stacks.link.push({\n offset: result.length,\n length: 0,\n } as any) // other fields are added after the second part\n continue\n }\n\n if (c === '`') {\n const isPre = text[pos + 1] === '`' && text[pos + 2] === '`'\n\n if (isPre) {\n pos += 3\n let language = ''\n\n while (pos < text.length && text[pos] !== '\\n') {\n language += text[pos++]\n }\n\n // newline\n pos += 1\n\n if (pos > text.length) {\n throw new Error('Malformed PRE entity, expected LF after ```')\n }\n\n if (!('pre' in stacks)) stacks.pre = []\n stacks.pre.push({\n _: 'messageEntityPre',\n offset: result.length,\n length: 0,\n language,\n })\n insidePre = true\n } else {\n pos += 1\n if (!('code' in stacks)) stacks.code = []\n stacks.code.push({\n _: 'messageEntityCode',\n offset: result.length,\n length: 0,\n })\n insideCode = true\n }\n\n continue\n }\n\n if (c === text[pos + 1]) {\n // maybe (?) start or end of an entity\n let type: 'Italic' | 'Bold' | 'Underline' | 'Strike' | 'Spoiler' | null = null\n\n switch (c) {\n case '_':\n type = 'Italic'\n break\n case '*':\n type = 'Bold'\n break\n case '-':\n type = 'Underline'\n break\n case '~':\n type = 'Strike'\n break\n case '|':\n type = 'Spoiler'\n break\n }\n\n if (type) {\n if (!(type in stacks)) stacks[type] = []\n const isBegin = stacks[type].length === 0\n\n if (isBegin) {\n stacks[type].push({\n _: `messageEntity${type}`,\n offset: result.length,\n length: 0,\n })\n } else {\n // valid because isBegin is false\n\n const ent = stacks[type].pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n }\n\n pos += 2\n continue\n }\n }\n\n if (c === '\\n') {\n if (pos !== 0) {\n result += '\\n'\n }\n\n const nonWhitespace = text.slice(pos + 1).search(/[^ \\t]/)\n\n if (nonWhitespace !== -1) {\n pos += nonWhitespace + 1\n } else {\n pos = len\n result = result.trimEnd()\n }\n continue\n }\n\n // nothing matched => normal character\n result += c\n pos += 1\n }\n }\n\n if (typeof strings === 'string') strings = [strings] as unknown as TemplateStringsArray\n\n sub.forEach((it, idx) => {\n feed(strings[idx])\n\n if (typeof it === 'boolean' || !it) return\n\n if (insideLinkUrl) {\n if (typeof it === 'string' || typeof it === 'number') {\n pendingLinkUrl += it\n } else if (Long.isLong(it)) {\n pendingLinkUrl += it.toString(10)\n } else {\n // ignore the entity, only use text\n pendingLinkUrl += it.text\n }\n\n return\n }\n\n if (typeof it === 'string' || typeof it === 'number') {\n result += it\n } else if (Long.isLong(it)) {\n result += it.toString(10)\n } else {\n // TextWithEntities or MessageEntity\n const text = it.text\n const innerEntities = 'raw' in it ? [it.raw] : it.entities\n\n const baseOffset = result.length\n result += text\n\n if (innerEntities) {\n for (const ent of innerEntities) {\n entities.push({ ...ent, offset: ent.offset + baseOffset })\n }\n }\n }\n })\n\n feed(strings[strings.length - 1])\n\n for (const [name, stack] of Object.entries(stacks)) {\n if (stack.length) {\n throw new Error(`Unterminated ${name} entity`)\n }\n }\n\n return {\n text: result,\n entities,\n }\n}\n\n// typedoc doesn't support this yet, so we'll have to do it manually\n// https://github.com/TypeStrong/typedoc/issues/2436\n\nexport const md: {\n /**\n * Tagged template based Markdown-to-entities parser function\n *\n * Additionally, `md` function has two static methods:\n * - `md.escape` - escape a string to be safely used in Markdown\n * (should not be needed in most cases, as `md` function itself handles all `string`s\n * passed to it automatically as plain text)\n * - `md.unparse` - add Markdown formatting to the text given the plain text and entities contained in it\n *\n * @example\n * ```typescript\n * const text = md`**${user.displayName}**`\n * ```\n */\n (\n strings: TemplateStringsArray,\n ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]\n ): TextWithEntities\n /**\n * A variant taking a plain JS string as input\n * and parsing it.\n *\n * Useful for cases when you already have a string\n * (e.g. from some server) and want to parse it.\n *\n * @example\n * ```typescript\n * const string = '**hello**'\n * const text = md(string)\n * ```\n */\n (string: string): TextWithEntities\n escape: typeof escape\n unparse: typeof unparse\n} = Object.assign(parse, {\n escape,\n unparse,\n})\n"]}
|
package/esm/index.js
CHANGED
|
@@ -16,7 +16,7 @@ const TO_BE_ESCAPED = /[*_\-~`[\\\]|]/g;
|
|
|
16
16
|
* > handles all `string`s passed to it automatically as plain text.
|
|
17
17
|
*/
|
|
18
18
|
function escape(str) {
|
|
19
|
-
return str.replace(TO_BE_ESCAPED,
|
|
19
|
+
return str.replace(TO_BE_ESCAPED, s => `\\${s}`);
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
22
|
* Add Markdown formatting to the text given the plain text and entities contained in it.
|
|
@@ -30,7 +30,7 @@ function unparse(input) {
|
|
|
30
30
|
const escaped = [];
|
|
31
31
|
text = text.replace(TO_BE_ESCAPED, (s, pos) => {
|
|
32
32
|
escaped.push(pos);
|
|
33
|
-
return
|
|
33
|
+
return `\\${s}`;
|
|
34
34
|
});
|
|
35
35
|
const hasEscaped = escaped.length > 0;
|
|
36
36
|
const insert = [];
|
|
@@ -83,7 +83,7 @@ function unparse(input) {
|
|
|
83
83
|
startTag += entity.language;
|
|
84
84
|
}
|
|
85
85
|
startTag += '\n';
|
|
86
|
-
endTag =
|
|
86
|
+
endTag = `\n${TAG_PRE}`;
|
|
87
87
|
break;
|
|
88
88
|
case 'messageEntityTextUrl':
|
|
89
89
|
startTag = '[';
|
|
@@ -209,7 +209,7 @@ function parse(strings, ...sub) {
|
|
|
209
209
|
ent.length = result.length - ent.offset;
|
|
210
210
|
let m = url.match(MENTION_REGEX);
|
|
211
211
|
if (m) {
|
|
212
|
-
const userId = parseInt(m[1]);
|
|
212
|
+
const userId = Number.parseInt(m[1]);
|
|
213
213
|
const accessHash = m[2];
|
|
214
214
|
if (accessHash) {
|
|
215
215
|
ent._ = 'inputMessageEntityMentionName';
|
|
@@ -230,7 +230,7 @@ function parse(strings, ...sub) {
|
|
|
230
230
|
}
|
|
231
231
|
else {
|
|
232
232
|
if (url.match(/^\/\//))
|
|
233
|
-
url =
|
|
233
|
+
url = `http:${url}`;
|
|
234
234
|
ent._ = 'messageEntityTextUrl';
|
|
235
235
|
ent.url = url;
|
|
236
236
|
}
|
|
@@ -242,11 +242,10 @@ function parse(strings, ...sub) {
|
|
|
242
242
|
insideLink = true;
|
|
243
243
|
if (!('link' in stacks))
|
|
244
244
|
stacks.link = [];
|
|
245
|
-
// eslint-disable-next-line
|
|
245
|
+
// eslint-disable-next-line ts/no-unsafe-argument
|
|
246
246
|
stacks.link.push({
|
|
247
247
|
offset: result.length,
|
|
248
248
|
length: 0,
|
|
249
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
250
249
|
}); // other fields are added after the second part
|
|
251
250
|
continue;
|
|
252
251
|
}
|
package/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\n\nimport type { InputText, MessageEntity, TextWithEntities, tl } from '@mtcute/core'\n\nconst MENTION_REGEX = /^tg:\\/\\/user\\?id=(\\d+)(?:&hash=(-?[0-9a-fA-F]+)(?:&|$)|&|$)/\nconst EMOJI_REGEX = /^tg:\\/\\/emoji\\?id=(-?\\d+)/\n\nconst TAG_BOLD = '**'\nconst TAG_ITALIC = '__'\nconst TAG_UNDERLINE = '--'\nconst TAG_STRIKE = '~~'\nconst TAG_SPOILER = '||'\nconst TAG_CODE = '`'\nconst TAG_PRE = '```'\n\nconst TO_BE_ESCAPED = /[*_\\-~`[\\\\\\]|]/g\n\n/**\n * Escape a string to be safely used in Markdown.\n *\n * > **Note**: this function is in most cases not needed, as `md` function\n * > handles all `string`s passed to it automatically as plain text.\n */\nfunction escape(str: string): string {\n return str.replace(TO_BE_ESCAPED, (s) => '\\\\' + s)\n}\n\n/**\n * Add Markdown formatting to the text given the plain text and entities contained in it.\n */\nfunction unparse(input: InputText): string {\n if (typeof input === 'string') return escape(input)\n\n let text = input.text\n const entities = input.entities ?? []\n\n // keep track of positions of inserted escape symbols\n const escaped: number[] = []\n text = text.replace(TO_BE_ESCAPED, (s, pos: number) => {\n escaped.push(pos)\n\n return '\\\\' + s\n })\n const hasEscaped = escaped.length > 0\n\n type InsertLater = [number, string]\n const insert: InsertLater[] = []\n\n for (const entity of entities) {\n const type = entity._\n\n let start = entity.offset\n let end = start + entity.length\n\n if (start > text.length) continue\n if (start < 0) start = 0\n if (end > text.length) end = text.length\n\n if (hasEscaped) {\n // determine number of escape chars since the beginning of the string\n let escapedPos = 0\n\n while (escapedPos < escaped.length && escaped[escapedPos] < start) {\n escapedPos += 1\n }\n start += escapedPos\n\n while (escapedPos < escaped.length && escaped[escapedPos] <= end) {\n escapedPos += 1\n }\n end += escapedPos\n }\n\n let startTag\n let endTag: string\n\n switch (type) {\n case 'messageEntityBold':\n startTag = endTag = TAG_BOLD\n break\n case 'messageEntityItalic':\n startTag = endTag = TAG_ITALIC\n break\n case 'messageEntityUnderline':\n startTag = endTag = TAG_UNDERLINE\n break\n case 'messageEntityStrike':\n startTag = endTag = TAG_STRIKE\n break\n case 'messageEntitySpoiler':\n startTag = endTag = TAG_SPOILER\n break\n case 'messageEntityCode':\n startTag = endTag = TAG_CODE\n break\n case 'messageEntityPre':\n startTag = TAG_PRE\n\n if (entity.language) {\n startTag += entity.language\n }\n\n startTag += '\\n'\n endTag = '\\n' + TAG_PRE\n break\n case 'messageEntityTextUrl':\n startTag = '['\n endTag = `](${entity.url})`\n break\n case 'messageEntityMentionName':\n startTag = '['\n endTag = `](tg://user?id=${entity.userId})`\n break\n case 'messageEntityCustomEmoji':\n startTag = '['\n endTag = `](tg://emoji?id=${entity.documentId.toString()})`\n break\n default:\n continue\n }\n\n insert.push([start, startTag])\n insert.push([end, endTag])\n }\n\n // sort by offset desc\n insert.sort((a, b) => b[0] - a[0])\n\n for (const [offset, tag] of insert) {\n text = text.substr(0, offset) + tag + text.substr(offset)\n }\n\n return text\n}\n\nfunction parse(\n strings: TemplateStringsArray | string,\n ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]\n): TextWithEntities {\n const entities: tl.TypeMessageEntity[] = []\n let result = ''\n\n const stacks: Record<string, tl.Mutable<tl.TypeMessageEntity>[]> = {}\n\n let insideCode = false\n let insidePre = false\n let insideLink = false\n\n let insideLinkUrl = false\n let pendingLinkUrl = ''\n\n function feed(text: string) {\n const len = text.length\n let pos = 0\n\n while (pos < len) {\n const c = text[pos]\n\n if (c === '\\\\') {\n if (insideLinkUrl) {\n pendingLinkUrl += text[pos + 1]\n } else {\n result += text[pos + 1]\n }\n pos += 2\n continue\n }\n\n if (insideCode) {\n if (c === '`') {\n // we can be certain that we're inside code\n\n const ent = stacks.code.pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n insideCode = false\n pos += 1\n } else {\n pos += 1\n result += c\n }\n continue\n }\n\n if (insidePre) {\n if (c === '`' || (c === '\\n' && text[pos + 1] === '`')) {\n if (c === '\\n') pos += 1\n\n if (text[pos + 1] === '`' && text[pos + 2] === '`') {\n // we can be certain that we're inside pre\n\n const ent = stacks.pre.pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n insidePre = false\n pos += 3\n continue\n\n // closed with single or double backtick\n // i.e. not closed actually! this is totally valid md:\n // ```javascript\n // const a = ``;\n // ```\n // compensate that `pos` change we made earliers\n } else if (c === '\\n') {\n pos -= 1\n }\n }\n\n pos += 1\n result += c\n continue\n }\n\n if (insideLink && c === ']') {\n // we can be certain that we're inside link\n\n const ent = stacks.link.pop()!\n\n if (text[pos + 1] !== '(') {\n // [link text]\n // ignore this, and add opening [\n result = `${result.substr(0, ent.offset)}[${result.substr(ent.offset)}]`\n pos += 1\n insideLink = false\n continue\n }\n\n pos += 2\n insideLink = false\n insideLinkUrl = true\n stacks.link.push(ent)\n continue\n }\n\n if (insideLinkUrl) {\n pos += 1\n\n if (c !== ')') {\n // not ended yet\n pendingLinkUrl += c\n continue\n }\n\n const ent = stacks.link.pop()!\n\n let url = pendingLinkUrl\n pendingLinkUrl = ''\n insideLinkUrl = false\n\n if (!url.length) continue\n\n ent.length = result.length - ent.offset\n\n let m = url.match(MENTION_REGEX)\n\n if (m) {\n const userId = parseInt(m[1])\n const accessHash = m[2]\n\n if (accessHash) {\n (ent as tl.Mutable<tl.RawInputMessageEntityMentionName>)._ = 'inputMessageEntityMentionName'\n ;(ent as tl.Mutable<tl.RawInputMessageEntityMentionName>).userId = {\n _: 'inputUser',\n userId,\n accessHash: Long.fromString(accessHash, false, 16),\n }\n } else {\n (ent as tl.Mutable<tl.RawMessageEntityMentionName>)._ = 'messageEntityMentionName'\n ;(ent as tl.Mutable<tl.RawMessageEntityMentionName>).userId = userId\n }\n } else if ((m = EMOJI_REGEX.exec(url))) {\n (ent as tl.Mutable<tl.RawMessageEntityCustomEmoji>)._ = 'messageEntityCustomEmoji'\n ;(ent as tl.Mutable<tl.RawMessageEntityCustomEmoji>).documentId = Long.fromString(m[1])\n } else {\n if (url.match(/^\\/\\//)) url = 'http:' + url\n ;(ent as tl.Mutable<tl.RawMessageEntityTextUrl>)._ = 'messageEntityTextUrl'\n ;(ent as tl.Mutable<tl.RawMessageEntityTextUrl>).url = url\n }\n entities.push(ent)\n\n continue\n }\n\n if (c === '[' && !insideLink) {\n pos += 1\n insideLink = true\n if (!('link' in stacks)) stacks.link = []\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n stacks.link.push({\n offset: result.length,\n length: 0,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any) // other fields are added after the second part\n continue\n }\n\n if (c === '`') {\n const isPre = text[pos + 1] === '`' && text[pos + 2] === '`'\n\n if (isPre) {\n pos += 3\n let language = ''\n\n while (pos < text.length && text[pos] !== '\\n') {\n language += text[pos++]\n }\n\n // newline\n pos += 1\n\n if (pos > text.length) {\n throw new Error('Malformed PRE entity, expected LF after ```')\n }\n\n if (!('pre' in stacks)) stacks.pre = []\n stacks.pre.push({\n _: 'messageEntityPre',\n offset: result.length,\n length: 0,\n language,\n })\n insidePre = true\n } else {\n pos += 1\n if (!('code' in stacks)) stacks.code = []\n stacks.code.push({\n _: 'messageEntityCode',\n offset: result.length,\n length: 0,\n })\n insideCode = true\n }\n\n continue\n }\n\n if (c === text[pos + 1]) {\n // maybe (?) start or end of an entity\n let type: 'Italic' | 'Bold' | 'Underline' | 'Strike' | 'Spoiler' | null = null\n\n switch (c) {\n case '_':\n type = 'Italic'\n break\n case '*':\n type = 'Bold'\n break\n case '-':\n type = 'Underline'\n break\n case '~':\n type = 'Strike'\n break\n case '|':\n type = 'Spoiler'\n break\n }\n\n if (type) {\n if (!(type in stacks)) stacks[type] = []\n const isBegin = stacks[type].length === 0\n\n if (isBegin) {\n stacks[type].push({\n _: `messageEntity${type}`,\n offset: result.length,\n length: 0,\n })\n } else {\n // valid because isBegin is false\n\n const ent = stacks[type].pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n }\n\n pos += 2\n continue\n }\n }\n\n if (c === '\\n') {\n if (pos !== 0) {\n result += '\\n'\n }\n\n const nonWhitespace = text.slice(pos + 1).search(/[^ \\t]/)\n\n if (nonWhitespace !== -1) {\n pos += nonWhitespace + 1\n } else {\n pos = len\n result = result.trimEnd()\n }\n continue\n }\n\n // nothing matched => normal character\n result += c\n pos += 1\n }\n }\n\n if (typeof strings === 'string') strings = [strings] as unknown as TemplateStringsArray\n\n sub.forEach((it, idx) => {\n feed(strings[idx])\n\n if (typeof it === 'boolean' || !it) return\n\n if (insideLinkUrl) {\n if (typeof it === 'string' || typeof it === 'number') {\n pendingLinkUrl += it\n } else if (Long.isLong(it)) {\n pendingLinkUrl += it.toString(10)\n } else {\n // ignore the entity, only use text\n pendingLinkUrl += it.text\n }\n\n return\n }\n\n if (typeof it === 'string' || typeof it === 'number') {\n result += it\n } else if (Long.isLong(it)) {\n result += it.toString(10)\n } else {\n // TextWithEntities or MessageEntity\n const text = it.text\n const innerEntities = 'raw' in it ? [it.raw] : it.entities\n\n const baseOffset = result.length\n result += text\n\n if (innerEntities) {\n for (const ent of innerEntities) {\n entities.push({ ...ent, offset: ent.offset + baseOffset })\n }\n }\n }\n })\n\n feed(strings[strings.length - 1])\n\n for (const [name, stack] of Object.entries(stacks)) {\n if (stack.length) {\n throw new Error(`Unterminated ${name} entity`)\n }\n }\n\n return {\n text: result,\n entities,\n }\n}\n\n// typedoc doesn't support this yet, so we'll have to do it manually\n// https://github.com/TypeStrong/typedoc/issues/2436\n\nexport const md: {\n /**\n * Tagged template based Markdown-to-entities parser function\n *\n * Additionally, `md` function has two static methods:\n * - `md.escape` - escape a string to be safely used in Markdown\n * (should not be needed in most cases, as `md` function itself handles all `string`s\n * passed to it automatically as plain text)\n * - `md.unparse` - add Markdown formatting to the text given the plain text and entities contained in it\n *\n * @example\n * ```typescript\n * const text = md`**${user.displayName}**`\n * ```\n */\n (\n strings: TemplateStringsArray,\n ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]\n ): TextWithEntities\n /**\n * A variant taking a plain JS string as input\n * and parsing it.\n *\n * Useful for cases when you already have a string\n * (e.g. from some server) and want to parse it.\n *\n * @example\n * ```typescript\n * const string = '**hello**'\n * const text = md(string)\n * ```\n */\n (string: string): TextWithEntities\n escape: typeof escape\n unparse: typeof unparse\n} = Object.assign(parse, {\n escape,\n unparse,\n})\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import Long from 'long'\nimport type { InputText, MessageEntity, TextWithEntities, tl } from '@mtcute/core'\n\nconst MENTION_REGEX = /^tg:\\/\\/user\\?id=(\\d+)(?:&hash=(-?[0-9a-fA-F]+)(?:&|$)|&|$)/\nconst EMOJI_REGEX = /^tg:\\/\\/emoji\\?id=(-?\\d+)/\n\nconst TAG_BOLD = '**'\nconst TAG_ITALIC = '__'\nconst TAG_UNDERLINE = '--'\nconst TAG_STRIKE = '~~'\nconst TAG_SPOILER = '||'\nconst TAG_CODE = '`'\nconst TAG_PRE = '```'\n\nconst TO_BE_ESCAPED = /[*_\\-~`[\\\\\\]|]/g\n\n/**\n * Escape a string to be safely used in Markdown.\n *\n * > **Note**: this function is in most cases not needed, as `md` function\n * > handles all `string`s passed to it automatically as plain text.\n */\nfunction escape(str: string): string {\n return str.replace(TO_BE_ESCAPED, s => `\\\\${s}`)\n}\n\n/**\n * Add Markdown formatting to the text given the plain text and entities contained in it.\n */\nfunction unparse(input: InputText): string {\n if (typeof input === 'string') return escape(input)\n\n let text = input.text\n const entities = input.entities ?? []\n\n // keep track of positions of inserted escape symbols\n const escaped: number[] = []\n text = text.replace(TO_BE_ESCAPED, (s, pos: number) => {\n escaped.push(pos)\n\n return `\\\\${s}`\n })\n const hasEscaped = escaped.length > 0\n\n type InsertLater = [number, string]\n const insert: InsertLater[] = []\n\n for (const entity of entities) {\n const type = entity._\n\n let start = entity.offset\n let end = start + entity.length\n\n if (start > text.length) continue\n if (start < 0) start = 0\n if (end > text.length) end = text.length\n\n if (hasEscaped) {\n // determine number of escape chars since the beginning of the string\n let escapedPos = 0\n\n while (escapedPos < escaped.length && escaped[escapedPos] < start) {\n escapedPos += 1\n }\n start += escapedPos\n\n while (escapedPos < escaped.length && escaped[escapedPos] <= end) {\n escapedPos += 1\n }\n end += escapedPos\n }\n\n let startTag\n let endTag: string\n\n switch (type) {\n case 'messageEntityBold':\n startTag = endTag = TAG_BOLD\n break\n case 'messageEntityItalic':\n startTag = endTag = TAG_ITALIC\n break\n case 'messageEntityUnderline':\n startTag = endTag = TAG_UNDERLINE\n break\n case 'messageEntityStrike':\n startTag = endTag = TAG_STRIKE\n break\n case 'messageEntitySpoiler':\n startTag = endTag = TAG_SPOILER\n break\n case 'messageEntityCode':\n startTag = endTag = TAG_CODE\n break\n case 'messageEntityPre':\n startTag = TAG_PRE\n\n if (entity.language) {\n startTag += entity.language\n }\n\n startTag += '\\n'\n endTag = `\\n${TAG_PRE}`\n break\n case 'messageEntityTextUrl':\n startTag = '['\n endTag = `](${entity.url})`\n break\n case 'messageEntityMentionName':\n startTag = '['\n endTag = `](tg://user?id=${entity.userId})`\n break\n case 'messageEntityCustomEmoji':\n startTag = '['\n endTag = `](tg://emoji?id=${entity.documentId.toString()})`\n break\n default:\n continue\n }\n\n insert.push([start, startTag])\n insert.push([end, endTag])\n }\n\n // sort by offset desc\n insert.sort((a, b) => b[0] - a[0])\n\n for (const [offset, tag] of insert) {\n text = text.substr(0, offset) + tag + text.substr(offset)\n }\n\n return text\n}\n\nfunction parse(\n strings: TemplateStringsArray | string,\n ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]\n): TextWithEntities {\n const entities: tl.TypeMessageEntity[] = []\n let result = ''\n\n const stacks: Record<string, tl.Mutable<tl.TypeMessageEntity>[]> = {}\n\n let insideCode = false\n let insidePre = false\n let insideLink = false\n\n let insideLinkUrl = false\n let pendingLinkUrl = ''\n\n function feed(text: string) {\n const len = text.length\n let pos = 0\n\n while (pos < len) {\n const c = text[pos]\n\n if (c === '\\\\') {\n if (insideLinkUrl) {\n pendingLinkUrl += text[pos + 1]\n } else {\n result += text[pos + 1]\n }\n pos += 2\n continue\n }\n\n if (insideCode) {\n if (c === '`') {\n // we can be certain that we're inside code\n\n const ent = stacks.code.pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n insideCode = false\n pos += 1\n } else {\n pos += 1\n result += c\n }\n continue\n }\n\n if (insidePre) {\n if (c === '`' || (c === '\\n' && text[pos + 1] === '`')) {\n if (c === '\\n') pos += 1\n\n if (text[pos + 1] === '`' && text[pos + 2] === '`') {\n // we can be certain that we're inside pre\n\n const ent = stacks.pre.pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n insidePre = false\n pos += 3\n continue\n\n // closed with single or double backtick\n // i.e. not closed actually! this is totally valid md:\n // ```javascript\n // const a = ``;\n // ```\n // compensate that `pos` change we made earliers\n } else if (c === '\\n') {\n pos -= 1\n }\n }\n\n pos += 1\n result += c\n continue\n }\n\n if (insideLink && c === ']') {\n // we can be certain that we're inside link\n\n const ent = stacks.link.pop()!\n\n if (text[pos + 1] !== '(') {\n // [link text]\n // ignore this, and add opening [\n result = `${result.substr(0, ent.offset)}[${result.substr(ent.offset)}]`\n pos += 1\n insideLink = false\n continue\n }\n\n pos += 2\n insideLink = false\n insideLinkUrl = true\n stacks.link.push(ent)\n continue\n }\n\n if (insideLinkUrl) {\n pos += 1\n\n if (c !== ')') {\n // not ended yet\n pendingLinkUrl += c\n continue\n }\n\n const ent = stacks.link.pop()!\n\n let url = pendingLinkUrl\n pendingLinkUrl = ''\n insideLinkUrl = false\n\n if (!url.length) continue\n\n ent.length = result.length - ent.offset\n\n let m = url.match(MENTION_REGEX)\n\n if (m) {\n const userId = Number.parseInt(m[1])\n const accessHash = m[2]\n\n if (accessHash) {\n (ent as tl.Mutable<tl.RawInputMessageEntityMentionName>)._ = 'inputMessageEntityMentionName'\n ;(ent as tl.Mutable<tl.RawInputMessageEntityMentionName>).userId = {\n _: 'inputUser',\n userId,\n accessHash: Long.fromString(accessHash, false, 16),\n }\n } else {\n (ent as tl.Mutable<tl.RawMessageEntityMentionName>)._ = 'messageEntityMentionName'\n ;(ent as tl.Mutable<tl.RawMessageEntityMentionName>).userId = userId\n }\n } else if ((m = EMOJI_REGEX.exec(url))) {\n (ent as tl.Mutable<tl.RawMessageEntityCustomEmoji>)._ = 'messageEntityCustomEmoji'\n ;(ent as tl.Mutable<tl.RawMessageEntityCustomEmoji>).documentId = Long.fromString(m[1])\n } else {\n if (url.match(/^\\/\\//)) url = `http:${url}`\n ;(ent as tl.Mutable<tl.RawMessageEntityTextUrl>)._ = 'messageEntityTextUrl'\n ;(ent as tl.Mutable<tl.RawMessageEntityTextUrl>).url = url\n }\n entities.push(ent)\n\n continue\n }\n\n if (c === '[' && !insideLink) {\n pos += 1\n insideLink = true\n if (!('link' in stacks)) stacks.link = []\n // eslint-disable-next-line ts/no-unsafe-argument\n stacks.link.push({\n offset: result.length,\n length: 0,\n } as any) // other fields are added after the second part\n continue\n }\n\n if (c === '`') {\n const isPre = text[pos + 1] === '`' && text[pos + 2] === '`'\n\n if (isPre) {\n pos += 3\n let language = ''\n\n while (pos < text.length && text[pos] !== '\\n') {\n language += text[pos++]\n }\n\n // newline\n pos += 1\n\n if (pos > text.length) {\n throw new Error('Malformed PRE entity, expected LF after ```')\n }\n\n if (!('pre' in stacks)) stacks.pre = []\n stacks.pre.push({\n _: 'messageEntityPre',\n offset: result.length,\n length: 0,\n language,\n })\n insidePre = true\n } else {\n pos += 1\n if (!('code' in stacks)) stacks.code = []\n stacks.code.push({\n _: 'messageEntityCode',\n offset: result.length,\n length: 0,\n })\n insideCode = true\n }\n\n continue\n }\n\n if (c === text[pos + 1]) {\n // maybe (?) start or end of an entity\n let type: 'Italic' | 'Bold' | 'Underline' | 'Strike' | 'Spoiler' | null = null\n\n switch (c) {\n case '_':\n type = 'Italic'\n break\n case '*':\n type = 'Bold'\n break\n case '-':\n type = 'Underline'\n break\n case '~':\n type = 'Strike'\n break\n case '|':\n type = 'Spoiler'\n break\n }\n\n if (type) {\n if (!(type in stacks)) stacks[type] = []\n const isBegin = stacks[type].length === 0\n\n if (isBegin) {\n stacks[type].push({\n _: `messageEntity${type}`,\n offset: result.length,\n length: 0,\n })\n } else {\n // valid because isBegin is false\n\n const ent = stacks[type].pop()!\n ent.length = result.length - ent.offset\n entities.push(ent)\n }\n\n pos += 2\n continue\n }\n }\n\n if (c === '\\n') {\n if (pos !== 0) {\n result += '\\n'\n }\n\n const nonWhitespace = text.slice(pos + 1).search(/[^ \\t]/)\n\n if (nonWhitespace !== -1) {\n pos += nonWhitespace + 1\n } else {\n pos = len\n result = result.trimEnd()\n }\n continue\n }\n\n // nothing matched => normal character\n result += c\n pos += 1\n }\n }\n\n if (typeof strings === 'string') strings = [strings] as unknown as TemplateStringsArray\n\n sub.forEach((it, idx) => {\n feed(strings[idx])\n\n if (typeof it === 'boolean' || !it) return\n\n if (insideLinkUrl) {\n if (typeof it === 'string' || typeof it === 'number') {\n pendingLinkUrl += it\n } else if (Long.isLong(it)) {\n pendingLinkUrl += it.toString(10)\n } else {\n // ignore the entity, only use text\n pendingLinkUrl += it.text\n }\n\n return\n }\n\n if (typeof it === 'string' || typeof it === 'number') {\n result += it\n } else if (Long.isLong(it)) {\n result += it.toString(10)\n } else {\n // TextWithEntities or MessageEntity\n const text = it.text\n const innerEntities = 'raw' in it ? [it.raw] : it.entities\n\n const baseOffset = result.length\n result += text\n\n if (innerEntities) {\n for (const ent of innerEntities) {\n entities.push({ ...ent, offset: ent.offset + baseOffset })\n }\n }\n }\n })\n\n feed(strings[strings.length - 1])\n\n for (const [name, stack] of Object.entries(stacks)) {\n if (stack.length) {\n throw new Error(`Unterminated ${name} entity`)\n }\n }\n\n return {\n text: result,\n entities,\n }\n}\n\n// typedoc doesn't support this yet, so we'll have to do it manually\n// https://github.com/TypeStrong/typedoc/issues/2436\n\nexport const md: {\n /**\n * Tagged template based Markdown-to-entities parser function\n *\n * Additionally, `md` function has two static methods:\n * - `md.escape` - escape a string to be safely used in Markdown\n * (should not be needed in most cases, as `md` function itself handles all `string`s\n * passed to it automatically as plain text)\n * - `md.unparse` - add Markdown formatting to the text given the plain text and entities contained in it\n *\n * @example\n * ```typescript\n * const text = md`**${user.displayName}**`\n * ```\n */\n (\n strings: TemplateStringsArray,\n ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]\n ): TextWithEntities\n /**\n * A variant taking a plain JS string as input\n * and parsing it.\n *\n * Useful for cases when you already have a string\n * (e.g. from some server) and want to parse it.\n *\n * @example\n * ```typescript\n * const string = '**hello**'\n * const text = md(string)\n * ```\n */\n (string: string): TextWithEntities\n escape: typeof escape\n unparse: typeof unparse\n} = Object.assign(parse, {\n escape,\n unparse,\n})\n"]}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mtcute/markdown-parser",
|
|
3
|
-
"
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.16.7",
|
|
4
5
|
"description": "Markdown entities parser for mtcute",
|
|
5
6
|
"author": "alina sireneva <alina@tei.su>",
|
|
6
7
|
"license": "MIT",
|
|
7
|
-
"type": "module",
|
|
8
8
|
"sideEffects": false,
|
|
9
|
-
"scripts": {},
|
|
10
9
|
"exports": {
|
|
11
10
|
".": {
|
|
12
11
|
"import": "./esm/index.js",
|
|
13
12
|
"require": "./cjs/index.js"
|
|
14
13
|
}
|
|
15
14
|
},
|
|
15
|
+
"scripts": {},
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"
|
|
18
|
-
"
|
|
17
|
+
"@mtcute/core": "^0.16.7",
|
|
18
|
+
"long": "5.2.3"
|
|
19
19
|
},
|
|
20
20
|
"main": "cjs/index.js",
|
|
21
21
|
"module": "esm/index.js",
|