telegram-transformer 1.2.0 → 1.4.0

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/lib/formatters.js CHANGED
@@ -1,137 +1,186 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.htmlFormatters = exports.formatters = exports.defaultFormatter = void 0;
4
- const defaultFormatter = (entityText, entity, text) => {
5
- const before = '';
6
- const after = '';
7
- return {
8
- before,
9
- after,
10
- text: entityText,
11
- };
12
- };
13
- exports.defaultFormatter = defaultFormatter;
14
- exports.formatters = {
15
- mention: exports.defaultFormatter,
16
- hashtag: exports.defaultFormatter,
17
- cashtag: exports.defaultFormatter,
18
- bot_command: exports.defaultFormatter,
19
- url: exports.defaultFormatter,
20
- email: exports.defaultFormatter,
21
- phone_number: exports.defaultFormatter,
22
- bold: exports.defaultFormatter,
23
- italic: exports.defaultFormatter,
24
- underline: exports.defaultFormatter,
25
- strikethrough: exports.defaultFormatter,
26
- spoiler: exports.defaultFormatter,
27
- code: exports.defaultFormatter,
28
- pre: exports.defaultFormatter,
29
- text_link: exports.defaultFormatter,
30
- };
31
- exports.htmlFormatters = {
32
- ...exports.formatters,
33
- mention: (entityText, entity, text) => {
34
- const before = `<a href='https://t.me/${entityText.substring(1)}'>`;
35
- const after = '</a>';
36
- return {
37
- before,
38
- after,
39
- text: entityText,
40
- };
41
- },
42
- hashtag: (entityText, entity, text) => {
43
- const before = `<a href='${entityText}'>`;
44
- const after = '</a>';
45
- return {
46
- before,
47
- after,
48
- text: entityText,
49
- };
50
- },
51
- url: (entityText, entity, text) => {
52
- const url = entityText.startsWith('http')
53
- ? entityText
54
- : `http://${entityText}`;
55
- const before = `<a href='${url}'>`;
56
- const after = '</a>';
57
- return {
58
- before,
59
- after,
60
- text: entityText,
61
- };
62
- },
63
- email: (entityText, entity, text) => {
64
- const before = `<a href='mailto:${entityText}'>`;
65
- const after = '</a>';
66
- return {
67
- before,
68
- after,
69
- text: entityText,
70
- };
71
- },
72
- phone_number: (entityText, entity, text) => {
73
- const before = `<a href='tel:${entityText}'>`;
74
- const after = '</a>';
75
- return {
76
- before,
77
- after,
78
- text: entityText,
79
- };
80
- },
81
- spoiler: (entityText, entity, text) => {
82
- const before = `<span class='spoiler-hover'>`;
83
- const after = '</span>';
84
- return {
85
- before,
86
- after,
87
- text: entityText,
88
- };
89
- },
90
- text_link: (entityText, entity, text) => {
91
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
92
- // @ts-ignore
93
- const before = `<a href='${entity.url}'>`;
94
- const after = '</a>';
95
- return {
96
- before,
97
- after,
98
- text: entityText,
99
- };
100
- },
101
- bold: (entityText, entity, text) => {
102
- const before = `<strong>`;
103
- const after = '</strong>';
104
- return {
105
- before,
106
- after,
107
- text: entityText,
108
- };
109
- },
110
- italic: (entityText, entity, text) => {
111
- const before = `<i>`;
112
- const after = '</i>';
113
- return {
114
- before,
115
- after,
116
- text: entityText,
117
- };
118
- },
119
- underline: (entityText, entity, text) => {
120
- const before = `<u>`;
121
- const after = '</u>';
122
- return {
123
- before,
124
- after,
125
- text: entityText,
126
- };
127
- },
128
- strikethrough: (entityText, entity, text) => {
129
- const before = `<strike>`;
130
- const after = '</strike>';
131
- return {
132
- before,
133
- after,
134
- text: entityText,
135
- };
136
- },
137
- };
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.htmlFormatters = exports.formatters = exports.defaultCustomEmojiFormatter = exports.defaultPreFormatter = exports.defaultTextLinkFormatter = exports.defaultTextMentaionFormatter = exports.defaultFormatter = exports.abstractDefaultFormatter = void 0;
4
+ const abstractDefaultFormatter = (entityText, entity, text) => {
5
+ const before = '';
6
+ const after = '';
7
+ return {
8
+ before,
9
+ after,
10
+ text: entityText,
11
+ };
12
+ };
13
+ exports.abstractDefaultFormatter = abstractDefaultFormatter;
14
+ const defaultFormatter = (entityText, entity, text) => {
15
+ return (0, exports.abstractDefaultFormatter)(entityText, entity, text);
16
+ };
17
+ exports.defaultFormatter = defaultFormatter;
18
+ const defaultTextMentaionFormatter = (entityText, entity, text) => {
19
+ const lastName = entity.user.last_name ? ` ${entity.user.last_name}` : '';
20
+ return (0, exports.abstractDefaultFormatter)(`${entity.user.first_name}${lastName}`, entity, text);
21
+ };
22
+ exports.defaultTextMentaionFormatter = defaultTextMentaionFormatter;
23
+ const defaultTextLinkFormatter = (entityText, entity, text) => {
24
+ return (0, exports.abstractDefaultFormatter)(entityText, entity, text);
25
+ };
26
+ exports.defaultTextLinkFormatter = defaultTextLinkFormatter;
27
+ const defaultPreFormatter = (entityText, entity, text) => {
28
+ return (0, exports.abstractDefaultFormatter)(entityText, entity, text);
29
+ };
30
+ exports.defaultPreFormatter = defaultPreFormatter;
31
+ const defaultCustomEmojiFormatter = (entityText, entity, text) => {
32
+ return (0, exports.abstractDefaultFormatter)(entityText, entity, text);
33
+ };
34
+ exports.defaultCustomEmojiFormatter = defaultCustomEmojiFormatter;
35
+ exports.formatters = {
36
+ mention: exports.defaultFormatter,
37
+ hashtag: exports.defaultFormatter,
38
+ cashtag: exports.defaultFormatter,
39
+ bot_command: exports.defaultFormatter,
40
+ url: exports.defaultFormatter,
41
+ email: exports.defaultFormatter,
42
+ phone_number: exports.defaultFormatter,
43
+ bold: exports.defaultFormatter,
44
+ italic: exports.defaultFormatter,
45
+ underline: exports.defaultFormatter,
46
+ strikethrough: exports.defaultFormatter,
47
+ spoiler: exports.defaultFormatter,
48
+ code: exports.defaultFormatter,
49
+ pre: exports.defaultPreFormatter,
50
+ text_link: exports.defaultTextLinkFormatter,
51
+ text_mention: exports.defaultTextMentaionFormatter,
52
+ custom_emoji: exports.defaultCustomEmojiFormatter,
53
+ };
54
+ exports.htmlFormatters = {
55
+ ...exports.formatters,
56
+ mention: (entityText, entity, text) => {
57
+ const before = `<a href='https://t.me/${entityText.substring(1)}'>`;
58
+ const after = '</a>';
59
+ return {
60
+ before,
61
+ after,
62
+ text: entityText,
63
+ };
64
+ },
65
+ hashtag: (entityText, entity, text) => {
66
+ const before = `<a href='${entityText}'>`;
67
+ const after = '</a>';
68
+ return {
69
+ before,
70
+ after,
71
+ text: entityText,
72
+ };
73
+ },
74
+ url: (entityText, entity, text) => {
75
+ const url = entityText.startsWith('http')
76
+ ? entityText
77
+ : `http://${entityText}`;
78
+ const before = `<a href='${url}'>`;
79
+ const after = '</a>';
80
+ return {
81
+ before,
82
+ after,
83
+ text: entityText,
84
+ };
85
+ },
86
+ email: (entityText, entity, text) => {
87
+ const before = `<a href='mailto:${entityText}'>`;
88
+ const after = '</a>';
89
+ return {
90
+ before,
91
+ after,
92
+ text: entityText,
93
+ };
94
+ },
95
+ phone_number: (entityText, entity, text) => {
96
+ const before = `<a href='tel:${entityText}'>`;
97
+ const after = '</a>';
98
+ return {
99
+ before,
100
+ after,
101
+ text: entityText,
102
+ };
103
+ },
104
+ spoiler: (entityText, entity, text) => {
105
+ const before = `<span class='spoiler-hover'>`;
106
+ const after = '</span>';
107
+ return {
108
+ before,
109
+ after,
110
+ text: entityText,
111
+ };
112
+ },
113
+ text_link: (entityText, entity, text) => {
114
+ const before = `<a href='${entity.url}'>`;
115
+ const after = '</a>';
116
+ return {
117
+ before,
118
+ after,
119
+ text: entityText,
120
+ };
121
+ },
122
+ bold: (entityText, entity, text) => {
123
+ const before = `<strong>`;
124
+ const after = '</strong>';
125
+ return {
126
+ before,
127
+ after,
128
+ text: entityText,
129
+ };
130
+ },
131
+ italic: (entityText, entity, text) => {
132
+ const before = `<i>`;
133
+ const after = '</i>';
134
+ return {
135
+ before,
136
+ after,
137
+ text: entityText,
138
+ };
139
+ },
140
+ underline: (entityText, entity, text) => {
141
+ const before = `<u>`;
142
+ const after = '</u>';
143
+ return {
144
+ before,
145
+ after,
146
+ text: entityText,
147
+ };
148
+ },
149
+ strikethrough: (entityText, entity, text) => {
150
+ const before = `<strike>`;
151
+ const after = '</strike>';
152
+ return {
153
+ before,
154
+ after,
155
+ text: entityText,
156
+ };
157
+ },
158
+ pre: (entityText, entity, text) => {
159
+ const before = `<pre>`;
160
+ const after = '</pre>';
161
+ return {
162
+ before,
163
+ after,
164
+ text: entityText,
165
+ };
166
+ },
167
+ text_mention: (entityText, entity, text) => {
168
+ const lastName = entity.user.last_name ? ` ${entity.user.last_name}` : '';
169
+ const before = `<span>`;
170
+ const after = '</span>';
171
+ return {
172
+ before,
173
+ after,
174
+ text: `${entityText}: ${entity.user.first_name}${lastName} | <b>ID:${entity.user.id}</b>`,
175
+ };
176
+ },
177
+ custom_emoji: (entityText, entity, text) => {
178
+ const before = `<span>`;
179
+ const after = '</span>';
180
+ return {
181
+ before,
182
+ after,
183
+ text: `${entityText} | <b>EMOJI ID:${entity.custom_emoji_id}</b>`,
184
+ };
185
+ },
186
+ };
package/lib/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- import { format } from './format';
2
- export * from './types';
3
- export * from './formatters';
4
- export * from './format';
5
- export default format;
1
+ import { format } from './format';
2
+ export * from './types';
3
+ export * from './formatters';
4
+ export * from './format';
5
+ export * from './sortEntities';
6
+ export default format;
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AAEzB,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC;AAE/B,eAAe,MAAM,CAAC"}
package/lib/index.js CHANGED
@@ -1,21 +1,22 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- const format_1 = require("./format");
18
- __exportStar(require("./types"), exports);
19
- __exportStar(require("./formatters"), exports);
20
- __exportStar(require("./format"), exports);
21
- exports.default = format_1.format;
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const format_1 = require("./format");
18
+ __exportStar(require("./types"), exports);
19
+ __exportStar(require("./formatters"), exports);
20
+ __exportStar(require("./format"), exports);
21
+ __exportStar(require("./sortEntities"), exports);
22
+ exports.default = format_1.format;
@@ -0,0 +1,41 @@
1
+ import { MessageEntity } from 'typegram';
2
+ import { FormattersDict, Node } from './types';
3
+ export declare const renderNode: ({ node, parts, formatters, partialText, currentPosition, text, entries, }: {
4
+ node: Node;
5
+ parts: string[];
6
+ formatters: FormattersDict;
7
+ partialText: string;
8
+ currentPosition: number;
9
+ text: string;
10
+ entries: MessageEntity[];
11
+ }) => {
12
+ entity: {
13
+ offset: number;
14
+ length: number;
15
+ type: "mention" | "hashtag" | "cashtag" | "bot_command" | "url" | "email" | "phone_number" | "bold" | "italic" | "underline" | "strikethrough" | "spoiler" | "code";
16
+ } | {
17
+ offset: number;
18
+ length: number;
19
+ type: "custom_emoji";
20
+ custom_emoji_id: string;
21
+ } | {
22
+ offset: number;
23
+ length: number;
24
+ type: "pre";
25
+ language?: string | undefined;
26
+ } | {
27
+ offset: number;
28
+ length: number;
29
+ type: "text_link";
30
+ url: string;
31
+ } | {
32
+ offset: number;
33
+ length: number;
34
+ type: "text_mention";
35
+ user: import("typegram").User;
36
+ };
37
+ length: number;
38
+ offset: number;
39
+ currentPosition: number;
40
+ };
41
+ //# sourceMappingURL=renderNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderNode.d.ts","sourceRoot":"","sources":["../src/renderNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAe,cAAc,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG5D,eAAO,MAAM,UAAU;UASf,IAAI;WACH,MAAM,EAAE;gBACH,cAAc;iBACb,MAAM;qBACF,MAAM;UACjB,MAAM;aACH,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFzB,CAAC"}
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderNode = void 0;
4
+ const formatters_1 = require("./formatters");
5
+ const renderNode = ({ node, parts, formatters, partialText, currentPosition, text, entries, }) => {
6
+ const formatter = (formatters[node.entity.type] ||
7
+ formatters_1.defaultFormatter);
8
+ const originalOffset = node.entity.offset;
9
+ const originalLength = originalOffset + node.entity.length;
10
+ const rawText = partialText.substring(originalOffset, originalLength);
11
+ const formatted = formatter(rawText, node.entity, text);
12
+ const nodeOffset = currentPosition;
13
+ let nodeLength = 0;
14
+ currentPosition += formatted.before.length;
15
+ parts.push(formatted.before);
16
+ const sortedChildren = node.children
17
+ .slice()
18
+ .sort((a, b) => a.entity.offset - b.entity.offset);
19
+ let substringOffset = originalOffset;
20
+ for (const child of sortedChildren) {
21
+ const plain = partialText.substring(substringOffset, child.entity.offset);
22
+ parts.push(plain);
23
+ currentPosition += plain.length;
24
+ nodeLength += plain.length;
25
+ const nodeResult = (0, exports.renderNode)({
26
+ node: child,
27
+ parts,
28
+ formatters,
29
+ partialText,
30
+ currentPosition,
31
+ text,
32
+ entries,
33
+ });
34
+ nodeLength += nodeResult.length;
35
+ currentPosition = nodeResult.currentPosition;
36
+ substringOffset = child.entity.offset + child.entity.length;
37
+ }
38
+ if (node.children.length === 0) {
39
+ parts.push(formatted.text);
40
+ currentPosition += formatted.text.length;
41
+ nodeLength =
42
+ formatted.before.length + formatted.text.length + formatted.after.length;
43
+ }
44
+ else {
45
+ const trailing = partialText.substring(substringOffset, originalLength);
46
+ parts.push(trailing);
47
+ currentPosition += trailing.length;
48
+ nodeLength +=
49
+ formatted.before.length + trailing.length + formatted.after.length;
50
+ // if (formatted.text.length !== rawText.length) {
51
+ // console.warn(
52
+ // `Formatter for ${node.entity.type} changed text length but has children. Change ignored`,
53
+ // );
54
+ // }
55
+ }
56
+ currentPosition += formatted.after.length;
57
+ parts.push(formatted.after);
58
+ entries.push({
59
+ ...node.entity,
60
+ offset: nodeOffset,
61
+ length: nodeLength,
62
+ });
63
+ return {
64
+ entity: {
65
+ ...node.entity,
66
+ offset: nodeOffset,
67
+ length: nodeLength,
68
+ },
69
+ length: nodeLength,
70
+ offset: nodeOffset,
71
+ currentPosition,
72
+ };
73
+ };
74
+ exports.renderNode = renderNode;
@@ -0,0 +1,3 @@
1
+ import { MessageEntity } from 'typegram';
2
+ export declare const sortEntities: (entities: MessageEntity[]) => MessageEntity[];
3
+ //# sourceMappingURL=sortEntities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortEntities.d.ts","sourceRoot":"","sources":["../src/sortEntities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,YAAY,aAAc,aAAa,EAAE,oBAIrD,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sortEntities = void 0;
4
+ const sortEntities = (entities) => {
5
+ return entities
6
+ .slice()
7
+ .sort((a, b) => a.offset - b.offset || b.length - a.length);
8
+ };
9
+ exports.sortEntities = sortEntities;