telegram-transformer 1.1.0 → 1.2.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
@@ -60,26 +60,26 @@ console.log(formatted);
60
60
 
61
61
  /*
62
62
  {
63
- text: "Hello <a href='https://tg.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>",
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>",
64
64
  entities: [
65
- { offset: 6, length: 9, type: 'mention' },
66
- { offset: 53, length: 16, type: 'hashtag' },
67
- { offset: 89, length: 7, type: 'bold' },
68
- { offset: 118, length: 4, type: 'cashtag' },
69
- { offset: 123, length: 15, type: 'bot_command' },
70
- { offset: 139, length: 20, type: 'url' },
71
- { offset: 195, length: 25, type: 'email' },
72
- { offset: 268, length: 15, type: 'phone_number' },
73
- { offset: 318, length: 9, type: 'bold' },
74
- { offset: 345, length: 11, type: 'italic' },
75
- { offset: 364, length: 5, type: 'underline' },
76
- { offset: 376, length: 10, type: 'underline' },
77
- { offset: 379, length: 5, type: 'bold' },
78
- { offset: 411, length: 18, type: 'strikethrough' },
79
- { offset: 447, length: 15, type: 'spoiler' },
65
+ { offset: 6, length: 45, type: 'mention' },
66
+ { offset: 16, length: 16, type: 'hashtag' },
67
+ { offset: 88, length: 24, type: 'bold' },
68
+ { offset: 117, length: 4, type: 'cashtag' },
69
+ { offset: 122, length: 15, type: 'bot_command' },
70
+ { offset: 138, length: 55, type: 'url' },
71
+ { offset: 194, length: 72, type: 'email' },
72
+ { offset: 267, length: 49, type: 'phone_number' },
73
+ { offset: 317, length: 26, type: 'bold' },
74
+ { offset: 344, length: 18, type: 'italic' },
75
+ { offset: 363, length: 12, type: 'underline' },
76
+ { offset: 144, length: 10, type: 'underline' },
77
+ { offset: 378, length: 22, type: 'bold' },
78
+ { offset: 410, length: 35, type: 'strikethrough' },
79
+ { offset: 446, length: 50, type: 'spoiler' },
80
80
  {
81
- offset: 531,
82
- length: 9,
81
+ offset: 530,
82
+ length: 45,
83
83
  type: 'text_link',
84
84
  url: 'https://telegram.org/'
85
85
  }
@@ -87,3 +87,43 @@ console.log(formatted);
87
87
  }
88
88
  */
89
89
  ```
90
+
91
+ ### Custom transformer
92
+
93
+ ```js
94
+ import formatText, { htmlFormatters } from 'telegram-transformer';
95
+ import { MessageEntity } from 'typegram';
96
+
97
+ const text = 'Hello @username #awesome_hashtag';
98
+ const entities: MessageEntity[] = [
99
+ { offset: 6, length: 9, type: 'mention' },
100
+ { offset: 16, length: 16, type: 'hashtag' },
101
+ ];
102
+
103
+ const formatters = {
104
+ mention: (entityText: string, entity: MessageEntity, text: string) => ({
105
+ before: '<awesome-mention>',
106
+ after: '</awesome-mention>',
107
+ text: entityText,
108
+ }),
109
+ hashtag: (entityText: string, entity: MessageEntity, text: string) => ({
110
+ before: '<span class="hashtag">',
111
+ after: '</span>',
112
+ text: entityText,
113
+ }),
114
+ };
115
+
116
+ const formatted = formatText(text, entities, { formatters });
117
+
118
+ console.log(formatted);
119
+
120
+ /*
121
+ {
122
+ text: 'Hello <awesome-mention>@username</awesome-mention> <span class="hashtag">#awesome_hashtag</span>',
123
+ entities: [
124
+ { offset: 6, length: 44, type: 'mention' },
125
+ { offset: 51, length: 45, type: 'hashtag' }
126
+ ]
127
+ }
128
+ */
129
+ ```
@@ -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;;;CA8DjB,CAAC"}
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"}
package/lib/format.js CHANGED
@@ -17,8 +17,10 @@ const format = (text, entities = [], options = constants_1.DEFAULT_OPTIONS) => {
17
17
  };
18
18
  const startFrom = options.startFrom || constants_1.DEFAULT_OPTIONS.startFrom;
19
19
  let newText = text;
20
+ let offsetChange = 0;
21
+ let afterOffsetChange = 0;
20
22
  let prevOffsetChange = 0;
21
- let prevAfterChange = 0;
23
+ let prevLengthChange = 0;
22
24
  for (let i = 0; i < newEntities.length; i++) {
23
25
  const entity = { ...newEntities[i] };
24
26
  const formatter = formatters[entity.type] || formatters_1.defaultFormatter;
@@ -28,23 +30,31 @@ const format = (text, entities = [], options = constants_1.DEFAULT_OPTIONS) => {
28
30
  if (isNotInRange) {
29
31
  continue;
30
32
  }
31
- let newOffset = entity.offset + prevOffsetChange;
33
+ let newOffset = entity.offset + offsetChange;
32
34
  let newOffsetWithLength = newOffset + entity.length;
33
35
  const prevEntity = newEntities[i - 1];
34
- if (prevEntity && newOffset > prevEntity.offset + prevEntity.length) {
35
- prevOffsetChange += prevAfterChange;
36
- prevAfterChange = 0;
36
+ if (prevEntity &&
37
+ newOffset >= (prevEntity === null || prevEntity === void 0 ? void 0 : prevEntity.offset) + offsetChange + (prevEntity === null || prevEntity === void 0 ? void 0 : prevEntity.length)) {
38
+ prevEntity.offset += prevOffsetChange;
39
+ prevEntity.length += prevLengthChange;
40
+ offsetChange += afterOffsetChange;
41
+ afterOffsetChange = 0;
42
+ newOffset = entity.offset + offsetChange;
43
+ newOffsetWithLength = newOffset + entity.length;
37
44
  }
38
- newOffset = entity.offset + prevOffsetChange;
39
- newOffsetWithLength = newOffset + entity.length;
40
45
  const beforeEntity = newText.substring(0, newOffset);
41
46
  const entityText = newText.substring(newOffset, newOffsetWithLength);
42
47
  const afterEntity = newText.substring(newOffsetWithLength, newText.length);
43
48
  const formatted = formatter(entityText, entity, text);
44
- prevOffsetChange += formatted.before.length;
45
- prevAfterChange += formatted.after.length;
46
- entity.offset = newOffset;
47
- newText = `${beforeEntity}${formatted.text}${afterEntity}`;
49
+ prevOffsetChange = offsetChange;
50
+ prevLengthChange = formatted.before.length + formatted.after.length;
51
+ offsetChange += formatted.before.length;
52
+ afterOffsetChange += formatted.after.length;
53
+ newText = `${beforeEntity}${formatted.before}${formatted.text}${formatted.after}${afterEntity}`;
54
+ if (i === entities.length - 1) {
55
+ entity.offset += prevOffsetChange;
56
+ entity.length += prevLengthChange;
57
+ }
48
58
  }
49
59
  return {
50
60
  text: newText,
package/lib/formatters.js CHANGED
@@ -7,7 +7,7 @@ const defaultFormatter = (entityText, entity, text) => {
7
7
  return {
8
8
  before,
9
9
  after,
10
- text: `${before}${entityText}${after}`,
10
+ text: entityText,
11
11
  };
12
12
  };
13
13
  exports.defaultFormatter = defaultFormatter;
@@ -36,7 +36,7 @@ exports.htmlFormatters = {
36
36
  return {
37
37
  before,
38
38
  after,
39
- text: `${before}${entityText}${after}`,
39
+ text: entityText,
40
40
  };
41
41
  },
42
42
  hashtag: (entityText, entity, text) => {
@@ -45,7 +45,7 @@ exports.htmlFormatters = {
45
45
  return {
46
46
  before,
47
47
  after,
48
- text: `${before}${entityText}${after}`,
48
+ text: entityText,
49
49
  };
50
50
  },
51
51
  url: (entityText, entity, text) => {
@@ -57,7 +57,7 @@ exports.htmlFormatters = {
57
57
  return {
58
58
  before,
59
59
  after,
60
- text: `${before}${entityText}${after}`,
60
+ text: entityText,
61
61
  };
62
62
  },
63
63
  email: (entityText, entity, text) => {
@@ -66,7 +66,7 @@ exports.htmlFormatters = {
66
66
  return {
67
67
  before,
68
68
  after,
69
- text: `${before}${entityText}${after}`,
69
+ text: entityText,
70
70
  };
71
71
  },
72
72
  phone_number: (entityText, entity, text) => {
@@ -75,7 +75,7 @@ exports.htmlFormatters = {
75
75
  return {
76
76
  before,
77
77
  after,
78
- text: `${before}${entityText}${after}`,
78
+ text: entityText,
79
79
  };
80
80
  },
81
81
  spoiler: (entityText, entity, text) => {
@@ -84,7 +84,7 @@ exports.htmlFormatters = {
84
84
  return {
85
85
  before,
86
86
  after,
87
- text: `${before}${entityText}${after}`,
87
+ text: entityText,
88
88
  };
89
89
  },
90
90
  text_link: (entityText, entity, text) => {
@@ -95,7 +95,7 @@ exports.htmlFormatters = {
95
95
  return {
96
96
  before,
97
97
  after,
98
- text: `${before}${entityText}${after}`,
98
+ text: entityText,
99
99
  };
100
100
  },
101
101
  bold: (entityText, entity, text) => {
@@ -104,7 +104,7 @@ exports.htmlFormatters = {
104
104
  return {
105
105
  before,
106
106
  after,
107
- text: `${before}${entityText}${after}`,
107
+ text: entityText,
108
108
  };
109
109
  },
110
110
  italic: (entityText, entity, text) => {
@@ -113,7 +113,7 @@ exports.htmlFormatters = {
113
113
  return {
114
114
  before,
115
115
  after,
116
- text: `${before}${entityText}${after}`,
116
+ text: entityText,
117
117
  };
118
118
  },
119
119
  underline: (entityText, entity, text) => {
@@ -122,7 +122,7 @@ exports.htmlFormatters = {
122
122
  return {
123
123
  before,
124
124
  after,
125
- text: `${before}${entityText}${after}`,
125
+ text: entityText,
126
126
  };
127
127
  },
128
128
  strikethrough: (entityText, entity, text) => {
@@ -131,7 +131,7 @@ exports.htmlFormatters = {
131
131
  return {
132
132
  before,
133
133
  after,
134
- text: `${before}${entityText}${after}`,
134
+ text: entityText,
135
135
  };
136
136
  },
137
137
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "telegram-transformer",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Telegram message transformer",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",