telegram-transformer 1.1.1 → 1.3.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/README.md CHANGED
@@ -1,7 +1,12 @@
1
1
  <header>
2
-
2
+ <div align="center">
3
3
  <h1 align="center">Telegram message transformer</h1>
4
4
 
5
+ <a href="https://www.npmjs.com/package/telegram-transformer">
6
+ <img src="https://img.shields.io/npm/v/telegram-transformer.svg" alt="Latest Release">
7
+ </a>
8
+
9
+ </div>
5
10
  </header>
6
11
 
7
12
  ## Introduction
@@ -29,7 +34,7 @@ import formatText, { htmlFormatters } from 'telegram-transformer';
29
34
  import { MessageEntity } from 'typegram';
30
35
 
31
36
  const text =
32
- 'Hello @username #awesome_hashtag $USD /start@jobs_bot https://telegram.org do-not-reply@telegram.org +1-212-555-0123 bold text italic text underlined text strikethrough text spoiler message monowidth string monowidth block text_link';
37
+ 'Hello @username #awesome_hashtag $USD /start@jobs_bot https://telegram.org do-not-reply@telegram.org +1-212-555-0123 bold text italic text underlined text strikethrough text spoiler message monowidth string monowidth block text_link custom_emoji text_mention';
33
38
  const entities: MessageEntity[] = [
34
39
  { offset: 6, length: 9, type: 'mention' },
35
40
  { offset: 16, length: 16, type: 'hashtag' },
@@ -52,6 +57,22 @@ const entities: MessageEntity[] = [
52
57
  type: 'text_link',
53
58
  url: 'https://telegram.org/',
54
59
  },
60
+ {
61
+ offset: 233,
62
+ length: 12,
63
+ type: 'custom_emoji',
64
+ custom_emoji_id: '12345',
65
+ },
66
+ {
67
+ offset: 246,
68
+ length: 12,
69
+ type: 'text_mention',
70
+ user: {
71
+ id: 9876543210,
72
+ is_bot: false,
73
+ first_name: 'First Name',
74
+ },
75
+ },
55
76
  ];
56
77
 
57
78
  const formatted = formatText(text, entities, { formatters: htmlFormatters });
@@ -60,9 +81,9 @@ console.log(formatted);
60
81
 
61
82
  /*
62
83
  {
63
- text: "Hello <a href='https://t.me/username'>@username</a> <a href='#awesome_hashtag'>#awesome_<strong>hashtag</strong></a> $USD /start@jobs_bot <a href='https://telegram.org'>https://telegram.org</a> <a href='mailto:do-not-reply@telegram.org'>do-not-reply@telegram.org</a> <a href='tel:+1-212-555-0123'>+1-212-555-0123</a> <strong>bold text</strong> <i>italic text</i> <u>under</u><u><strong>lined</strong> text</u> <strike>strikethrough text</strike> <span class='spoiler-hover'>spoiler message</span> monowidth string monowidth block <a href='https://telegram.org/'>text_link</a>",
84
+ text: "Hello <a href='https://t.me/username'>@username</a> <a href='#awesome_hashtag'>#awesome_<strong>hashtag</strong></a> $USD /start@jobs_bot <a href='https://telegram.org'>https://telegram.org</a> <a href='mailto:do-not-reply@telegram.org'>do-not-reply@telegram.org</a> <a href='tel:+1-212-555-0123'>+1-212-555-0123</a> <strong>bold text</strong> <i>italic text</i> <u>under</u><u><strong>lined</strong> text</u> <strike>strikethrough text</strike> <span class='spoiler-hover'>spoiler message</span> monowidth string monowidth block <a href='https://telegram.org/'>text_link</a> <span>custom_emoji | <b>EMOJI ID:12345</b></span> <span>text_mention: First Name | <b>ID:9876543210</b></span>",
64
85
  entities: [
65
- { offset: 6, length: 45, type: 'mention' },
86
+ { offset: 6, length: 45, type: 'mention' },
66
87
  { offset: 16, length: 16, type: 'hashtag' },
67
88
  { offset: 88, length: 24, type: 'bold' },
68
89
  { offset: 117, length: 4, type: 'cashtag' },
@@ -82,8 +103,64 @@ console.log(formatted);
82
103
  length: 45,
83
104
  type: 'text_link',
84
105
  url: 'https://telegram.org/'
106
+ },
107
+ {
108
+ offset: 576,
109
+ length: 25,
110
+ type: 'custom_emoji',
111
+ custom_emoji_id: '12345'
112
+ },
113
+ {
114
+ offset: 626,
115
+ length: 25,
116
+ type: 'text_mention',
117
+ user: {
118
+ id: 9876543210,
119
+ is_bot: false,
120
+ first_name: 'First Name',
121
+ }
85
122
  }
86
123
  ]
87
124
  }
88
125
  */
89
126
  ```
127
+
128
+ ### Custom transformer
129
+
130
+ ```js
131
+ import formatText, { htmlFormatters } from 'telegram-transformer';
132
+ import { MessageEntity } from 'typegram';
133
+
134
+ const text = 'Hello @username #awesome_hashtag';
135
+ const entities: MessageEntity[] = [
136
+ { offset: 6, length: 9, type: 'mention' },
137
+ { offset: 16, length: 16, type: 'hashtag' },
138
+ ];
139
+
140
+ const formatters = {
141
+ mention: (entityText: string, entity: MessageEntity, text: string) => ({
142
+ before: '<awesome-mention>',
143
+ after: '</awesome-mention>',
144
+ text: entityText,
145
+ }),
146
+ hashtag: (entityText: string, entity: MessageEntity, text: string) => ({
147
+ before: '<span class="hashtag">',
148
+ after: '</span>',
149
+ text: entityText,
150
+ }),
151
+ };
152
+
153
+ const formatted = formatText(text, entities, { formatters });
154
+
155
+ console.log(formatted);
156
+
157
+ /*
158
+ {
159
+ text: 'Hello <awesome-mention>@username</awesome-mention> <span class="hashtag">#awesome_hashtag</span>',
160
+ entities: [
161
+ { offset: 6, length: 44, type: 'mention' },
162
+ { offset: 51, length: 45, type: 'hashtag' }
163
+ ]
164
+ }
165
+ */
166
+ ```
package/lib/format.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { MessageEntity } from 'typegram';
1
+ import type { MessageEntity } from 'typegram';
2
2
  import { Options } from './types';
3
3
  export declare const format: (text: string, entities?: MessageEntity[], options?: Options) => {
4
4
  text: string;
@@ -1 +1 @@
1
- {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,eAAO,MAAM,MAAM,SACX,MAAM,aACF,aAAa,EAAE,YAChB,OAAO;;;CAyEjB,CAAC"}
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAG9C,OAAO,EAAe,OAAO,EAAE,MAAM,SAAS,CAAC;AAE/C,eAAO,MAAM,MAAM,SACX,MAAM,aACF,aAAa,EAAE,YAChB,OAAO;;;CA2EjB,CAAC"}
package/lib/format.js CHANGED
@@ -23,7 +23,8 @@ const format = (text, entities = [], options = constants_1.DEFAULT_OPTIONS) => {
23
23
  let prevLengthChange = 0;
24
24
  for (let i = 0; i < newEntities.length; i++) {
25
25
  const entity = { ...newEntities[i] };
26
- const formatter = formatters[entity.type] || formatters_1.defaultFormatter;
26
+ const formatter = (formatters[entity.type] ||
27
+ formatters_1.defaultFormatter);
27
28
  const isNotInRange = entity.offset < startFrom;
28
29
  newEntities[i] = entity;
29
30
  entity.offset -= startFrom;
@@ -49,8 +50,9 @@ const format = (text, entities = [], options = constants_1.DEFAULT_OPTIONS) => {
49
50
  prevOffsetChange = offsetChange;
50
51
  prevLengthChange = formatted.before.length + formatted.after.length;
51
52
  offsetChange += formatted.before.length;
52
- afterOffsetChange += formatted.after.length;
53
- newText = `${beforeEntity}${formatted.text}${afterEntity}`;
53
+ afterOffsetChange +=
54
+ formatted.after.length + (formatted.text.length - entityText.length);
55
+ newText = `${beforeEntity}${formatted.before}${formatted.text}${formatted.after}${afterEntity}`;
54
56
  if (i === entities.length - 1) {
55
57
  entity.offset += prevOffsetChange;
56
58
  entity.length += prevLengthChange;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "telegram-transformer",
3
- "version": "1.1.1",
3
+ "version": "1.3.0",
4
4
  "description": "Telegram message transformer",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -23,13 +23,13 @@
23
23
  "url": "git+ssh://git@github.com/ivanodintsov/telegram-transformer.git"
24
24
  },
25
25
  "bugs": {
26
- "url": "https://github.com/ivanodintsov/telegraf/telegram-transformer"
26
+ "url": "https://github.com/ivanodintsov/telegram-transformer"
27
27
  },
28
28
  "files": [
29
29
  "lib/**/*"
30
30
  ],
31
31
  "dependencies": {
32
- "typegram": "^4.1.1"
32
+ "typegram": "^5.2.0"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/jest": "^29.2.4",
@@ -1,3 +0,0 @@
1
- import { Options } from './types';
2
- export declare const DEFAULT_OPTIONS: Required<Options>;
3
- //# sourceMappingURL=constants.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,OAAO,CAG7C,CAAC"}
package/lib/constants.js DELETED
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_OPTIONS = void 0;
4
- const formatters_1 = require("./formatters");
5
- exports.DEFAULT_OPTIONS = {
6
- formatters: formatters_1.formatters,
7
- startFrom: 0,
8
- };
@@ -1,5 +0,0 @@
1
- import { FormatterFn, FormattersDict } from './types';
2
- export declare const defaultFormatter: FormatterFn;
3
- export declare const formatters: FormattersDict;
4
- export declare const htmlFormatters: FormattersDict;
5
- //# sourceMappingURL=formatters.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEtD,eAAO,MAAM,gBAAgB,EAAE,WAS9B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,cAgBxB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,cAsH5B,CAAC"}
package/lib/formatters.js DELETED
@@ -1,137 +0,0 @@
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: `${before}${entityText}${after}`,
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: `${before}${entityText}${after}`,
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: `${before}${entityText}${after}`,
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: `${before}${entityText}${after}`,
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: `${before}${entityText}${after}`,
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: `${before}${entityText}${after}`,
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: `${before}${entityText}${after}`,
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: `${before}${entityText}${after}`,
99
- };
100
- },
101
- bold: (entityText, entity, text) => {
102
- const before = `<strong>`;
103
- const after = '</strong>';
104
- return {
105
- before,
106
- after,
107
- text: `${before}${entityText}${after}`,
108
- };
109
- },
110
- italic: (entityText, entity, text) => {
111
- const before = `<i>`;
112
- const after = '</i>';
113
- return {
114
- before,
115
- after,
116
- text: `${before}${entityText}${after}`,
117
- };
118
- },
119
- underline: (entityText, entity, text) => {
120
- const before = `<u>`;
121
- const after = '</u>';
122
- return {
123
- before,
124
- after,
125
- text: `${before}${entityText}${after}`,
126
- };
127
- },
128
- strikethrough: (entityText, entity, text) => {
129
- const before = `<strike>`;
130
- const after = '</strike>';
131
- return {
132
- before,
133
- after,
134
- text: `${before}${entityText}${after}`,
135
- };
136
- },
137
- };
package/lib/types.d.ts DELETED
@@ -1,12 +0,0 @@
1
- import { MessageEntity } from 'typegram';
2
- export type FormatterFn = (entityText: string, entity: MessageEntity, text: string) => {
3
- text: string;
4
- before: string;
5
- after: string;
6
- };
7
- export type FormattersDict = Record<string, FormatterFn>;
8
- export type Options = {
9
- formatters?: FormattersDict;
10
- startFrom?: number;
11
- };
12
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,MAAM,WAAW,GAAG,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,KACT;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEzD,MAAM,MAAM,OAAO,GAAG;IAAE,UAAU,CAAC,EAAE,cAAc,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC"}
package/lib/types.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });