@mtcute/markdown-parser 0.11.0 → 0.12.5
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/cjs/index.d.ts +2 -1
- package/cjs/index.js +72 -37
- package/cjs/index.js.map +1 -1
- package/esm/index.d.ts +2 -1
- package/esm/index.js +66 -37
- package/esm/index.js.map +1 -1
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +3 -3
package/cjs/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import Long from 'long';
|
|
1
2
|
import type { InputText, MessageEntity, TextWithEntities } from '@mtcute/core';
|
|
2
3
|
/**
|
|
3
4
|
* Escape a string to be safely used in Markdown.
|
|
@@ -25,7 +26,7 @@ export declare const md: {
|
|
|
25
26
|
* const text = md`**${user.displayName}**`
|
|
26
27
|
* ```
|
|
27
28
|
*/
|
|
28
|
-
(strings: TemplateStringsArray, ...sub: (InputText | MessageEntity | boolean | number | undefined | null)[]): TextWithEntities;
|
|
29
|
+
(strings: TemplateStringsArray, ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]): TextWithEntities;
|
|
29
30
|
/**
|
|
30
31
|
* A variant taking a plain JS string as input
|
|
31
32
|
* and parsing it.
|
package/cjs/index.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
if (typeof globalThis !== 'undefined' && !globalThis._MTCUTE_CJS_DEPRECATION_WARNED) {
|
|
3
|
+
globalThis._MTCUTE_CJS_DEPRECATION_WARNED = true
|
|
4
|
+
console.warn("[@mtcute/markdown-parser] CommonJS support is deprecated and will be removed soon. Please consider switching to ESM, it's "+(new Date()).getFullYear()+" already.")
|
|
5
|
+
console.warn("[@mtcute/markdown-parser] Learn more about switching to ESM: https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c")
|
|
6
|
+
}
|
|
7
|
+
"use strict";
|
|
2
8
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
9
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
10
|
};
|
|
@@ -123,13 +129,20 @@ function parse(strings, ...sub) {
|
|
|
123
129
|
let insideCode = false;
|
|
124
130
|
let insidePre = false;
|
|
125
131
|
let insideLink = false;
|
|
132
|
+
let insideLinkUrl = false;
|
|
133
|
+
let pendingLinkUrl = '';
|
|
126
134
|
function feed(text) {
|
|
127
135
|
const len = text.length;
|
|
128
136
|
let pos = 0;
|
|
129
137
|
while (pos < len) {
|
|
130
138
|
const c = text[pos];
|
|
131
139
|
if (c === '\\') {
|
|
132
|
-
|
|
140
|
+
if (insideLinkUrl) {
|
|
141
|
+
pendingLinkUrl += text[pos + 1];
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
result += text[pos + 1];
|
|
145
|
+
}
|
|
133
146
|
pos += 2;
|
|
134
147
|
continue;
|
|
135
148
|
}
|
|
@@ -187,47 +200,53 @@ function parse(strings, ...sub) {
|
|
|
187
200
|
continue;
|
|
188
201
|
}
|
|
189
202
|
pos += 2;
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
203
|
+
insideLink = false;
|
|
204
|
+
insideLinkUrl = true;
|
|
205
|
+
stacks.link.push(ent);
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
if (insideLinkUrl) {
|
|
209
|
+
pos += 1;
|
|
210
|
+
if (c !== ')') {
|
|
211
|
+
// not ended yet
|
|
212
|
+
pendingLinkUrl += c;
|
|
213
|
+
continue;
|
|
197
214
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
else if ((m = EMOJI_REGEX.exec(url))) {
|
|
219
|
-
ent._ = 'messageEntityCustomEmoji';
|
|
220
|
-
ent.documentId = long_1.default.fromString(m[1]);
|
|
215
|
+
const ent = stacks.link.pop();
|
|
216
|
+
let url = pendingLinkUrl;
|
|
217
|
+
pendingLinkUrl = '';
|
|
218
|
+
insideLinkUrl = false;
|
|
219
|
+
if (!url.length)
|
|
220
|
+
continue;
|
|
221
|
+
ent.length = result.length - ent.offset;
|
|
222
|
+
let m = url.match(MENTION_REGEX);
|
|
223
|
+
if (m) {
|
|
224
|
+
const userId = parseInt(m[1]);
|
|
225
|
+
const accessHash = m[2];
|
|
226
|
+
if (accessHash) {
|
|
227
|
+
ent._ = 'inputMessageEntityMentionName';
|
|
228
|
+
ent.userId = {
|
|
229
|
+
_: 'inputUser',
|
|
230
|
+
userId,
|
|
231
|
+
accessHash: long_1.default.fromString(accessHash, false, 16),
|
|
232
|
+
};
|
|
221
233
|
}
|
|
222
234
|
else {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
ent._ = 'messageEntityTextUrl';
|
|
226
|
-
ent.url = url;
|
|
235
|
+
ent._ = 'messageEntityMentionName';
|
|
236
|
+
ent.userId = userId;
|
|
227
237
|
}
|
|
228
|
-
entities.push(ent);
|
|
229
238
|
}
|
|
230
|
-
|
|
239
|
+
else if ((m = EMOJI_REGEX.exec(url))) {
|
|
240
|
+
ent._ = 'messageEntityCustomEmoji';
|
|
241
|
+
ent.documentId = long_1.default.fromString(m[1]);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
if (url.match(/^\/\//))
|
|
245
|
+
url = 'http:' + url;
|
|
246
|
+
ent._ = 'messageEntityTextUrl';
|
|
247
|
+
ent.url = url;
|
|
248
|
+
}
|
|
249
|
+
entities.push(ent);
|
|
231
250
|
continue;
|
|
232
251
|
}
|
|
233
252
|
if (c === '[' && !insideLink) {
|
|
@@ -345,9 +364,25 @@ function parse(strings, ...sub) {
|
|
|
345
364
|
feed(strings[idx]);
|
|
346
365
|
if (typeof it === 'boolean' || !it)
|
|
347
366
|
return;
|
|
367
|
+
if (insideLinkUrl) {
|
|
368
|
+
if (typeof it === 'string' || typeof it === 'number') {
|
|
369
|
+
pendingLinkUrl += it;
|
|
370
|
+
}
|
|
371
|
+
else if (long_1.default.isLong(it)) {
|
|
372
|
+
pendingLinkUrl += it.toString(10);
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
// ignore the entity, only use text
|
|
376
|
+
pendingLinkUrl += it.text;
|
|
377
|
+
}
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
348
380
|
if (typeof it === 'string' || typeof it === 'number') {
|
|
349
381
|
result += it;
|
|
350
382
|
}
|
|
383
|
+
else if (long_1.default.isLong(it)) {
|
|
384
|
+
result += it.toString(10);
|
|
385
|
+
}
|
|
351
386
|
else {
|
|
352
387
|
// TextWithEntities or MessageEntity
|
|
353
388
|
const text = it.text;
|
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 | 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 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 result += text[pos + 1]\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 let url = ''\n\n while (pos < text.length && text[pos] !== ')') {\n url += text[pos++]\n }\n\n pos += 1 // )\n\n if (pos > text.length) {\n throw new Error('Malformed LINK entity, expected )')\n }\n\n if (url.length) {\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>)._ =\n '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\n insideLink = false\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(/\\S/)\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 (typeof it === 'string' || typeof it === 'number') {\n result += it\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 | 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'\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(/\\S/)\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.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import Long from 'long';
|
|
1
2
|
import type { InputText, MessageEntity, TextWithEntities } from '@mtcute/core';
|
|
2
3
|
/**
|
|
3
4
|
* Escape a string to be safely used in Markdown.
|
|
@@ -25,7 +26,7 @@ export declare const md: {
|
|
|
25
26
|
* const text = md`**${user.displayName}**`
|
|
26
27
|
* ```
|
|
27
28
|
*/
|
|
28
|
-
(strings: TemplateStringsArray, ...sub: (InputText | MessageEntity | boolean | number | undefined | null)[]): TextWithEntities;
|
|
29
|
+
(strings: TemplateStringsArray, ...sub: (InputText | MessageEntity | Long | boolean | number | undefined | null)[]): TextWithEntities;
|
|
29
30
|
/**
|
|
30
31
|
* A variant taking a plain JS string as input
|
|
31
32
|
* and parsing it.
|
package/esm/index.js
CHANGED
|
@@ -117,13 +117,20 @@ function parse(strings, ...sub) {
|
|
|
117
117
|
let insideCode = false;
|
|
118
118
|
let insidePre = false;
|
|
119
119
|
let insideLink = false;
|
|
120
|
+
let insideLinkUrl = false;
|
|
121
|
+
let pendingLinkUrl = '';
|
|
120
122
|
function feed(text) {
|
|
121
123
|
const len = text.length;
|
|
122
124
|
let pos = 0;
|
|
123
125
|
while (pos < len) {
|
|
124
126
|
const c = text[pos];
|
|
125
127
|
if (c === '\\') {
|
|
126
|
-
|
|
128
|
+
if (insideLinkUrl) {
|
|
129
|
+
pendingLinkUrl += text[pos + 1];
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
result += text[pos + 1];
|
|
133
|
+
}
|
|
127
134
|
pos += 2;
|
|
128
135
|
continue;
|
|
129
136
|
}
|
|
@@ -181,47 +188,53 @@ function parse(strings, ...sub) {
|
|
|
181
188
|
continue;
|
|
182
189
|
}
|
|
183
190
|
pos += 2;
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
+
insideLink = false;
|
|
192
|
+
insideLinkUrl = true;
|
|
193
|
+
stacks.link.push(ent);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
if (insideLinkUrl) {
|
|
197
|
+
pos += 1;
|
|
198
|
+
if (c !== ')') {
|
|
199
|
+
// not ended yet
|
|
200
|
+
pendingLinkUrl += c;
|
|
201
|
+
continue;
|
|
191
202
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
else if ((m = EMOJI_REGEX.exec(url))) {
|
|
213
|
-
ent._ = 'messageEntityCustomEmoji';
|
|
214
|
-
ent.documentId = Long.fromString(m[1]);
|
|
203
|
+
const ent = stacks.link.pop();
|
|
204
|
+
let url = pendingLinkUrl;
|
|
205
|
+
pendingLinkUrl = '';
|
|
206
|
+
insideLinkUrl = false;
|
|
207
|
+
if (!url.length)
|
|
208
|
+
continue;
|
|
209
|
+
ent.length = result.length - ent.offset;
|
|
210
|
+
let m = url.match(MENTION_REGEX);
|
|
211
|
+
if (m) {
|
|
212
|
+
const userId = parseInt(m[1]);
|
|
213
|
+
const accessHash = m[2];
|
|
214
|
+
if (accessHash) {
|
|
215
|
+
ent._ = 'inputMessageEntityMentionName';
|
|
216
|
+
ent.userId = {
|
|
217
|
+
_: 'inputUser',
|
|
218
|
+
userId,
|
|
219
|
+
accessHash: Long.fromString(accessHash, false, 16),
|
|
220
|
+
};
|
|
215
221
|
}
|
|
216
222
|
else {
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
ent._ = 'messageEntityTextUrl';
|
|
220
|
-
ent.url = url;
|
|
223
|
+
ent._ = 'messageEntityMentionName';
|
|
224
|
+
ent.userId = userId;
|
|
221
225
|
}
|
|
222
|
-
entities.push(ent);
|
|
223
226
|
}
|
|
224
|
-
|
|
227
|
+
else if ((m = EMOJI_REGEX.exec(url))) {
|
|
228
|
+
ent._ = 'messageEntityCustomEmoji';
|
|
229
|
+
ent.documentId = Long.fromString(m[1]);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
if (url.match(/^\/\//))
|
|
233
|
+
url = 'http:' + url;
|
|
234
|
+
ent._ = 'messageEntityTextUrl';
|
|
235
|
+
ent.url = url;
|
|
236
|
+
}
|
|
237
|
+
entities.push(ent);
|
|
225
238
|
continue;
|
|
226
239
|
}
|
|
227
240
|
if (c === '[' && !insideLink) {
|
|
@@ -339,9 +352,25 @@ function parse(strings, ...sub) {
|
|
|
339
352
|
feed(strings[idx]);
|
|
340
353
|
if (typeof it === 'boolean' || !it)
|
|
341
354
|
return;
|
|
355
|
+
if (insideLinkUrl) {
|
|
356
|
+
if (typeof it === 'string' || typeof it === 'number') {
|
|
357
|
+
pendingLinkUrl += it;
|
|
358
|
+
}
|
|
359
|
+
else if (Long.isLong(it)) {
|
|
360
|
+
pendingLinkUrl += it.toString(10);
|
|
361
|
+
}
|
|
362
|
+
else {
|
|
363
|
+
// ignore the entity, only use text
|
|
364
|
+
pendingLinkUrl += it.text;
|
|
365
|
+
}
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
342
368
|
if (typeof it === 'string' || typeof it === 'number') {
|
|
343
369
|
result += it;
|
|
344
370
|
}
|
|
371
|
+
else if (Long.isLong(it)) {
|
|
372
|
+
result += it.toString(10);
|
|
373
|
+
}
|
|
345
374
|
else {
|
|
346
375
|
// TextWithEntities or MessageEntity
|
|
347
376
|
const text = it.text;
|
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 | 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 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 result += text[pos + 1]\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 let url = ''\n\n while (pos < text.length && text[pos] !== ')') {\n url += text[pos++]\n }\n\n pos += 1 // )\n\n if (pos > text.length) {\n throw new Error('Malformed LINK entity, expected )')\n }\n\n if (url.length) {\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>)._ =\n '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\n insideLink = false\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(/\\S/)\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 (typeof it === 'string' || typeof it === 'number') {\n result += it\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 | 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'\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(/\\S/)\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/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './esm/index.js'
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './esm/index.js'
|
package/package.json
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mtcute/markdown-parser",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.5",
|
|
4
4
|
"description": "Markdown entities parser for mtcute",
|
|
5
5
|
"author": "alina sireneva <alina@tei.su>",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"main": "cjs/index.js",
|
|
8
7
|
"type": "module",
|
|
9
8
|
"sideEffects": false,
|
|
10
9
|
"scripts": {},
|
|
@@ -16,7 +15,8 @@
|
|
|
16
15
|
},
|
|
17
16
|
"dependencies": {
|
|
18
17
|
"long": "5.2.3",
|
|
19
|
-
"@mtcute/core": "^0.
|
|
18
|
+
"@mtcute/core": "^0.12.5"
|
|
20
19
|
},
|
|
20
|
+
"main": "cjs/index.js",
|
|
21
21
|
"module": "esm/index.js"
|
|
22
22
|
}
|