@jayfong/x-text-render 2.62.3 → 2.64.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.
@@ -1,9 +1,9 @@
1
- .xtr_6933 {
1
+ .xtr_8967 {
2
2
  margin: 6px 0;
3
3
  margin-left: var(--text-indent, 0px);
4
4
  }
5
5
 
6
- .xtr_6933 .xtr_19503 {
6
+ .xtr_8967 .xtr_1630 {
7
7
  text-indent: 0;
8
8
  white-space: pre-wrap;
9
9
  background-color: rgba(0, 0, 0, 0.5);
@@ -6,7 +6,7 @@ require("./code_render.css");
6
6
  var _vtils = require("vtils");
7
7
  var _html_render = require("./html_render");
8
8
  // @ts-ignore
9
- var _ = {"code":"xtr_6933","content":"xtr_19503"};
9
+ var _ = {"code":"xtr_8967","content":"xtr_1630"};
10
10
  var codeRegExp = /```[^\r\n]*[\r\n]([\s\S]+?)```/g;
11
11
  var CodeRender = exports.CodeRender = /*#__PURE__*/function () {
12
12
  function CodeRender() {}
@@ -1,4 +1,4 @@
1
- .xtr_14853 {
1
+ .xtr_1045 {
2
2
  display: inline-block;
3
3
  font-size: 1.2em;
4
4
  width: 1em;
@@ -6,76 +6,76 @@
6
6
  vertical-align: -0.2em;
7
7
  }
8
8
 
9
- .xtr_3626 {
9
+ .xtr_7154 {
10
10
  background-size: 100% 100%;
11
11
  background-repeat: no-repeat;
12
12
  background-position: center;
13
13
  }
14
14
 
15
- .xtr_16479 {
15
+ .xtr_3674 {
16
16
  width: 1.0781em;
17
17
  }
18
18
 
19
- .xtr_11967 {
19
+ .xtr_11615 {
20
20
  width: 1.0313em;
21
21
  }
22
22
 
23
- .xtr_1742 {
23
+ .xtr_11456 {
24
24
  width: 1.0625em;
25
25
  }
26
26
 
27
- .xtr_2476 {
27
+ .xtr_17243 {
28
28
  width: 1.1563em;
29
29
  }
30
30
 
31
- .xtr_10243 {
31
+ .xtr_19257 {
32
32
  width: 1.0469em;
33
33
  }
34
34
 
35
- .xtr_335 {
35
+ .xtr_3254 {
36
36
  width: 1.1406em;
37
37
  }
38
38
 
39
- .xtr_8140 {
39
+ .xtr_13218 {
40
40
  width: 1.0781em;
41
41
  }
42
42
 
43
- .xtr_16378 {
43
+ .xtr_17458 {
44
44
  width: 1.1406em;
45
45
  }
46
46
 
47
- .xtr_18375 {
47
+ .xtr_19104 {
48
48
  width: 1.0781em;
49
49
  }
50
50
 
51
- .xtr_13601 {
51
+ .xtr_7593 {
52
52
  width: 1.1406em;
53
53
  }
54
54
 
55
- .xtr_5363 {
55
+ .xtr_12634 {
56
56
  width: 1.375em;
57
57
  }
58
58
 
59
- .xtr_10115 {
59
+ .xtr_9977 {
60
60
  width: 1.0625em;
61
61
  }
62
62
 
63
- .xtr_1383 {
63
+ .xtr_7513 {
64
64
  width: 1.1406em;
65
65
  }
66
66
 
67
- .xtr_1938 {
67
+ .xtr_18959 {
68
68
  width: 1.1406em;
69
69
  }
70
70
 
71
- .xtr_18740 {
71
+ .xtr_18075 {
72
72
  width: 1.0625em;
73
73
  }
74
74
 
75
- .xtr_4282 {
75
+ .xtr_6857 {
76
76
  width: 1.125em;
77
77
  }
78
78
 
79
- .xtr_9668 {
79
+ .xtr_19561 {
80
80
  width: 1.0469em;
81
81
  }
@@ -5,7 +5,7 @@ exports.DouyinEmojiRender = void 0;
5
5
  require("./douyin_emoji_render.css");
6
6
  var _html_render = require("./html_render");
7
7
  // @ts-ignore
8
- var _ = {"emoji":"xtr_14853","background":"xtr_3626","_互粉":"xtr_16479","_再见":"xtr_11967","_吐血":"xtr_1742","_听歌":"xtr_2476","_嘿哈":"xtr_10243","_大哭":"xtr_335","_强":"xtr_8140","_我想静静":"xtr_16378","_擦汗":"xtr_18375","_机智":"xtr_13601","_求抱抱":"xtr_5363","_灵机一动":"xtr_10115","_熊吉":"xtr_1383","_笑哭":"xtr_1938","_紫薇别走":"xtr_18740","_耶":"xtr_4282","_飞吻":"xtr_9668"};
8
+ var _ = {"emoji":"xtr_1045","background":"xtr_7154","_互粉":"xtr_3674","_再见":"xtr_11615","_吐血":"xtr_11456","_听歌":"xtr_17243","_嘿哈":"xtr_19257","_大哭":"xtr_3254","_强":"xtr_13218","_我想静静":"xtr_17458","_擦汗":"xtr_19104","_机智":"xtr_7593","_求抱抱":"xtr_12634","_灵机一动":"xtr_9977","_熊吉":"xtr_7513","_笑哭":"xtr_18959","_紫薇别走":"xtr_18075","_耶":"xtr_6857","_飞吻":"xtr_19561"};
9
9
  // douyinEmojiAllList
10
10
  // biome-ignore format:
11
11
  var douyinEmojiAllList = ["6", "666", "18禁", "OK", "V5", "candy", "emo", "iloveyou", "okk", "yyds", "一起加油", "不失礼貌的微笑", "不看", "二哈", "互粉", "做鬼脸", "偷笑", "元宝", "再见", "冷漠", "凋谢", "减一", "凝视", "击掌", "加一", "加好友", "加鸡腿", "勾引", "去污粉", "发", "发呆", "发怒", "可怜", "右边", "吃瓜群众", "吐", "吐彩虹", "吐舌", "吐血", "听歌", "呆无辜", "呲牙", "咒骂", "咖啡", "哈欠", "啤酒", "嘘", "嘴唇", "嘿哈", "囧", "困", "圣诞帽", "圣诞树", "坏笑", "大哭", "大笑", "大金牙", "太阳", "奋斗", "奸笑", "如花", "委屈", "害羞", "小黄鸭", "小鼓掌", "尬笑", "屎", "左上", "左边", "巧克力", "干杯", "干饭人", "平安果", "年兽兔", "开心兔", "弱", "强", "强壮", "得意", "微笑", "微笑袋鼠", "心碎", "必胜", "快哭了", "思考", "恐惧", "悠闲", "情书", "惊喜", "惊恐", "惊讶", "愉快", "感谢", "憨笑", "我太难了", "我想静静", "我酸了", "戒指", "手套", "扎心", "打call", "打脸", "抓狂", "抠鼻", "抱抱", "抱抱你", "抱拳", "招财兔", "拥抱", "拳头", "捂脸", "握手", "握爪", "摸头", "撇嘴", "撒花", "擦汗", "敲打", "斜眼", "无语", "晕", "暗中观察", "月亮", "机智", "来看我", "栓Q", "棒棒糖", "比心", "气球", "求抱抱", "汤圆", "泣不成声", "泪奔", "流泪", "灯笼", "灵机一动", "炸弹", "烟花", "熊吉", "爱心", "猪头", "玫瑰", "球鞋", "疑问", "白眼", "皱眉", "看", "石化", "碰拳", "礼物", "福", "笑哭", "粽子", "糖葫芦", "紫薇别走", "红包", "红脸", "纸飞机", "给力", "给跪了", "绝", "绝望的凝视", "绿帽子", "翻白眼", "耶", "胜利", "胡瓜", "舔屏", "色", "菜狗", "蕉绿", "虎头", "蛋糕", "衰", "裂开", "西瓜", "调皮", "赞", "足球", "送心", "鄙视", "酷拽", "钱", "锦鲤", "闭嘴", "阴险", "难过", "雪人", "雪花", "震惊", "鞭炮", "飞吻", "饺子", "黑脸", "鼓掌", "不是吧", "动动脑子", "叹气", "好开心", "展开说说", "投降", "敢怒不敢言", "求求了", "真的会谢", "眼含热泪", "蜜蜂狗", "表面呲牙", "表面微笑", "躺平", "达咩", "鞠躬", "kisskiss", "一头乱麻", "不你不想", "九转大肠", "亚运鼓掌", "他急了", "你不大行", "噢买尬", "宕机", "手花", "敲木鱼", "脸疼", "苦涩", "还得是我", "逞强落泪", "金牌"];
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
3
4
  exports.__esModule = true;
4
5
  exports.TextParserNodeType = exports.TextParser = void 0;
6
+ var _createForOfIteratorHelperLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelperLoose"));
5
7
  var _simpleTextParser = require("simple-text-parser");
6
8
  var _douyin_emoji_render = require("./douyin_emoji_render");
7
9
  var _unified_emoji_render = require("./unified_emoji_render");
8
10
  var _weixin_emoji_render = require("./weixin_emoji_render");
9
- var TextParserNodeType = exports.TextParserNodeType = /*#__PURE__*/function (TextParserNodeType) {
11
+ var TextParserNodeType = exports.TextParserNodeType = function (TextParserNodeType) {
10
12
  TextParserNodeType[TextParserNodeType["PARAGRAPH"] = 1] = "PARAGRAPH";
11
13
  TextParserNodeType[TextParserNodeType["PLAIN_TEXT"] = 2] = "PLAIN_TEXT";
12
14
  TextParserNodeType[TextParserNodeType["WEB_LINK"] = 4] = "WEB_LINK";
@@ -15,16 +17,45 @@ var TextParserNodeType = exports.TextParserNodeType = /*#__PURE__*/function (Tex
15
17
  TextParserNodeType[TextParserNodeType["UNIFIED_EMOJI"] = 32] = "UNIFIED_EMOJI";
16
18
  TextParserNodeType[TextParserNodeType["DOUYIN_EMOJI"] = 64] = "DOUYIN_EMOJI";
17
19
  TextParserNodeType[TextParserNodeType["MINI_PROGRAM_SHORT_LINK"] = 128] = "MINI_PROGRAM_SHORT_LINK";
20
+ TextParserNodeType[TextParserNodeType["BOLD"] = 256] = "BOLD";
21
+ TextParserNodeType[TextParserNodeType["ELLIPSIS"] = 512] = "ELLIPSIS";
22
+ TextParserNodeType[TextParserNodeType["ANY_EMOJI"] = TextParserNodeType.UNIFIED_EMOJI | TextParserNodeType.WEIXIN_EMOJI | TextParserNodeType.DOUYIN_EMOJI] = "ANY_EMOJI";
23
+ TextParserNodeType[TextParserNodeType["ANY_LINK"] = TextParserNodeType.WEB_LINK | TextParserNodeType.MINI_PROGRAM_SHORT_LINK] = "ANY_LINK";
18
24
  return TextParserNodeType;
19
25
  }({});
20
26
  var TextParser = exports.TextParser = function TextParser(options) {
21
27
  var _this = this;
22
28
  this.options = options;
23
29
  this.parser = void 0;
24
- this.parse = function (text) {
30
+ this.parse = function (options) {
31
+ if (!options.store) {
32
+ var _store = {
33
+ maxLength: options.maxLength || 0,
34
+ currentLength: 0,
35
+ get remainingLength() {
36
+ return _store.maxLength - _store.currentLength;
37
+ },
38
+ get isReachMaxLength() {
39
+ return _store.maxLength > 0 && _store.currentLength >= _store.maxLength;
40
+ },
41
+ get isOverMaxLength() {
42
+ return _store.maxLength > 0 && _store.currentLength > _store.maxLength;
43
+ },
44
+ hasEllipsis: false
45
+ };
46
+ options.store = _store;
47
+ }
48
+ var text = options.text;
49
+ var asFragment = options.asFragment;
50
+ var store = options.store;
25
51
  var paragraphs = [];
26
52
  var paragraph = [];
27
- _this.parser.toTree(text).forEach(function (item) {
53
+ for (var _iterator = (0, _createForOfIteratorHelperLoose2.default)(_this.parser.toTree(text)), _step; !(_step = _iterator()).done;) {
54
+ var item = _step.value;
55
+ if (store.isReachMaxLength) {
56
+ store.hasEllipsis = true;
57
+ break;
58
+ }
28
59
  var nodeType = item.type === 'text' ? TextParserNodeType.PLAIN_TEXT : item.type === 'url' ? TextParserNodeType.WEB_LINK : item.type;
29
60
  if (nodeType & TextParserNodeType.LINE_BREAK) {
30
61
  if (paragraph.length > 0) {
@@ -35,15 +66,43 @@ var TextParser = exports.TextParser = function TextParser(options) {
35
66
  paragraph = [];
36
67
  }
37
68
  } else {
38
- var node = {
69
+ var node = item.continue ? {
70
+ type: nodeType,
71
+ nodes: _this.parse({
72
+ text: item.text,
73
+ asFragment: true,
74
+ store: store
75
+ }),
76
+ info: item.info
77
+ } : {
39
78
  type: nodeType,
40
79
  content: item.text,
41
80
  info: item.info
42
81
  };
43
82
  paragraph.push(node);
83
+ if (!item.continue) {
84
+ var isEmoji = nodeType & TextParserNodeType.ANY_EMOJI;
85
+ var isPlainText = nodeType & TextParserNodeType.PLAIN_TEXT;
86
+ var chars = isEmoji ? [item.text] : Array.from(item.text);
87
+ store.currentLength += chars.length;
88
+ if (store.isReachMaxLength) {
89
+ if (isPlainText && store.isOverMaxLength) {
90
+ node.content = chars.slice(0, store.remainingLength).join('');
91
+ store.hasEllipsis = true;
92
+ }
93
+ }
94
+ }
44
95
  }
45
- });
96
+ }
97
+ if (asFragment) {
98
+ return paragraph;
99
+ }
46
100
  if (paragraph.length > 0) {
101
+ if (store.hasEllipsis) {
102
+ paragraph.push({
103
+ type: TextParserNodeType.ELLIPSIS
104
+ });
105
+ }
47
106
  paragraphs.push({
48
107
  type: TextParserNodeType.PARAGRAPH,
49
108
  nodes: paragraph
@@ -61,6 +120,15 @@ var TextParser = exports.TextParser = function TextParser(options) {
61
120
  text: lineBreak
62
121
  };
63
122
  });
123
+ if (this.options.bold) {
124
+ parser.addRule(/\*\*(.*?)\*\*/g, function (_, text) {
125
+ return {
126
+ type: TextParserNodeType.BOLD,
127
+ text: text,
128
+ continue: true
129
+ };
130
+ });
131
+ }
64
132
  if (this.options.weixinEmoji) {
65
133
  parser.addRule(_weixin_emoji_render.WeixinEmojiRender.regExp, function (weixinEmoji) {
66
134
  return {
@@ -1,4 +1,4 @@
1
- .xtr_18256 {
1
+ .xtr_2734 {
2
2
  display: inline-block;
3
3
  font-size: 1.2em;
4
4
  width: 1em;
@@ -6,7 +6,7 @@
6
6
  vertical-align: -0.2em;
7
7
  }
8
8
 
9
- .xtr_13917 {
9
+ .xtr_12256 {
10
10
  background-size: 100% 100%;
11
11
  background-repeat: no-repeat;
12
12
  background-position: center;
@@ -7,7 +7,7 @@ var _vtils = require("vtils");
7
7
  var _regexp = require("vtils/regexp");
8
8
  var _html_render = require("./html_render");
9
9
  var _UnifiedEmojiRender; // @ts-ignore
10
- var _ = {"unifiedEmoji":"xtr_18256","background":"xtr_13917"};
10
+ var _ = {"unifiedEmoji":"xtr_2734","background":"xtr_12256"};
11
11
  var unifiedEmojiRegExp = _regexp.emojiRegExpBuilder.build({
12
12
  global: true
13
13
  });
@@ -1,4 +1,4 @@
1
- .xtr_4610 {
1
+ .xtr_4380 {
2
2
  display: inline-block;
3
3
  font-size: 1.2em;
4
4
  width: 1em;
@@ -6,7 +6,7 @@
6
6
  vertical-align: -0.2em;
7
7
  }
8
8
 
9
- .xtr_11399 {
9
+ .xtr_76 {
10
10
  background-size: 100% 100%;
11
11
  background-repeat: no-repeat;
12
12
  background-position: center;
@@ -6,7 +6,7 @@ require("./weixin_emoji_render.css");
6
6
  var _vtils = require("vtils");
7
7
  var _html_render = require("./html_render");
8
8
  // @ts-ignore
9
- var _ = {"weixinEmoji":"xtr_4610","background":"xtr_11399"};
9
+ var _ = {"weixinEmoji":"xtr_4380","background":"xtr_76"};
10
10
  var weixinEmojiBaseUrl = "https://wxpublic-1251448646.file.myqcloud.com/public/common/files/";
11
11
 
12
12
  // weixinEmojiUrlMap
@@ -1,9 +1,9 @@
1
- .xtr_6933 {
1
+ .xtr_8967 {
2
2
  margin: 6px 0;
3
3
  margin-left: var(--text-indent, 0px);
4
4
  }
5
5
 
6
- .xtr_6933 .xtr_19503 {
6
+ .xtr_8967 .xtr_1630 {
7
7
  text-indent: 0;
8
8
  white-space: pre-wrap;
9
9
  background-color: rgba(0, 0, 0, 0.5);
@@ -1,6 +1,6 @@
1
1
  // @ts-ignore
2
2
  import "./code_render.css";
3
- var _ = {"code":"xtr_6933","content":"xtr_19503"};
3
+ var _ = {"code":"xtr_8967","content":"xtr_1630"};
4
4
  import { escape } from 'vtils';
5
5
  import { HTMLRender } from "./html_render";
6
6
  var codeRegExp = /```[^\r\n]*[\r\n]([\s\S]+?)```/g;
@@ -1,4 +1,4 @@
1
- .xtr_14853 {
1
+ .xtr_1045 {
2
2
  display: inline-block;
3
3
  font-size: 1.2em;
4
4
  width: 1em;
@@ -6,76 +6,76 @@
6
6
  vertical-align: -0.2em;
7
7
  }
8
8
 
9
- .xtr_3626 {
9
+ .xtr_7154 {
10
10
  background-size: 100% 100%;
11
11
  background-repeat: no-repeat;
12
12
  background-position: center;
13
13
  }
14
14
 
15
- .xtr_16479 {
15
+ .xtr_3674 {
16
16
  width: 1.0781em;
17
17
  }
18
18
 
19
- .xtr_11967 {
19
+ .xtr_11615 {
20
20
  width: 1.0313em;
21
21
  }
22
22
 
23
- .xtr_1742 {
23
+ .xtr_11456 {
24
24
  width: 1.0625em;
25
25
  }
26
26
 
27
- .xtr_2476 {
27
+ .xtr_17243 {
28
28
  width: 1.1563em;
29
29
  }
30
30
 
31
- .xtr_10243 {
31
+ .xtr_19257 {
32
32
  width: 1.0469em;
33
33
  }
34
34
 
35
- .xtr_335 {
35
+ .xtr_3254 {
36
36
  width: 1.1406em;
37
37
  }
38
38
 
39
- .xtr_8140 {
39
+ .xtr_13218 {
40
40
  width: 1.0781em;
41
41
  }
42
42
 
43
- .xtr_16378 {
43
+ .xtr_17458 {
44
44
  width: 1.1406em;
45
45
  }
46
46
 
47
- .xtr_18375 {
47
+ .xtr_19104 {
48
48
  width: 1.0781em;
49
49
  }
50
50
 
51
- .xtr_13601 {
51
+ .xtr_7593 {
52
52
  width: 1.1406em;
53
53
  }
54
54
 
55
- .xtr_5363 {
55
+ .xtr_12634 {
56
56
  width: 1.375em;
57
57
  }
58
58
 
59
- .xtr_10115 {
59
+ .xtr_9977 {
60
60
  width: 1.0625em;
61
61
  }
62
62
 
63
- .xtr_1383 {
63
+ .xtr_7513 {
64
64
  width: 1.1406em;
65
65
  }
66
66
 
67
- .xtr_1938 {
67
+ .xtr_18959 {
68
68
  width: 1.1406em;
69
69
  }
70
70
 
71
- .xtr_18740 {
71
+ .xtr_18075 {
72
72
  width: 1.0625em;
73
73
  }
74
74
 
75
- .xtr_4282 {
75
+ .xtr_6857 {
76
76
  width: 1.125em;
77
77
  }
78
78
 
79
- .xtr_9668 {
79
+ .xtr_19561 {
80
80
  width: 1.0469em;
81
81
  }
@@ -1,6 +1,6 @@
1
1
  // @ts-ignore
2
2
  import "./douyin_emoji_render.css";
3
- var _ = {"emoji":"xtr_14853","background":"xtr_3626","_互粉":"xtr_16479","_再见":"xtr_11967","_吐血":"xtr_1742","_听歌":"xtr_2476","_嘿哈":"xtr_10243","_大哭":"xtr_335","_强":"xtr_8140","_我想静静":"xtr_16378","_擦汗":"xtr_18375","_机智":"xtr_13601","_求抱抱":"xtr_5363","_灵机一动":"xtr_10115","_熊吉":"xtr_1383","_笑哭":"xtr_1938","_紫薇别走":"xtr_18740","_耶":"xtr_4282","_飞吻":"xtr_9668"};
3
+ var _ = {"emoji":"xtr_1045","background":"xtr_7154","_互粉":"xtr_3674","_再见":"xtr_11615","_吐血":"xtr_11456","_听歌":"xtr_17243","_嘿哈":"xtr_19257","_大哭":"xtr_3254","_强":"xtr_13218","_我想静静":"xtr_17458","_擦汗":"xtr_19104","_机智":"xtr_7593","_求抱抱":"xtr_12634","_灵机一动":"xtr_9977","_熊吉":"xtr_7513","_笑哭":"xtr_18959","_紫薇别走":"xtr_18075","_耶":"xtr_6857","_飞吻":"xtr_19561"};
4
4
  import { HTMLRender } from "./html_render";
5
5
  // douyinEmojiAllList
6
6
  // biome-ignore format:
@@ -14,7 +14,15 @@ export declare enum TextParserNodeType {
14
14
  /** 抖音表情 */
15
15
  DOUYIN_EMOJI = 64,
16
16
  /** 小程序短链接 */
17
- MINI_PROGRAM_SHORT_LINK = 128
17
+ MINI_PROGRAM_SHORT_LINK = 128,
18
+ /** 加粗效果 */
19
+ BOLD = 256,
20
+ /** 省略 */
21
+ ELLIPSIS = 512,
22
+ /** 任意表情 */
23
+ ANY_EMOJI = 112,
24
+ /** 任意链接 */
25
+ ANY_LINK = 132
18
26
  }
19
27
  export type TextParserNodeEmojiInfo = {
20
28
  /** 图片链接 */
@@ -51,10 +59,36 @@ export type TextParserOptions = {
51
59
  douyinEmojiInfo?: boolean;
52
60
  /** 是否解析小程序短链接 */
53
61
  miniProgramShortLink?: boolean;
62
+ /** 是否解析加粗效果 */
63
+ bold?: boolean;
64
+ };
65
+ export type TextParserParseStore = {
66
+ /** 最大长度 */
67
+ maxLength: number;
68
+ /** 当前长度 */
69
+ currentLength: number;
70
+ /** 剩余长度 */
71
+ remainingLength: number;
72
+ /** 是否已达到最大长度 */
73
+ isReachMaxLength: boolean;
74
+ /** 是否已超过最大长度 */
75
+ isOverMaxLength: boolean;
76
+ /** 是否有省略 */
77
+ hasEllipsis: boolean;
78
+ };
79
+ export type TextParserParseOptions = {
80
+ /** 文本 */
81
+ text: string;
82
+ /** 最大长度 */
83
+ maxLength?: number;
84
+ /** 作为片段返回 */
85
+ asFragment?: boolean;
86
+ /** 状态管理 */
87
+ store?: TextParserParseStore;
54
88
  };
55
89
  export declare class TextParser {
56
90
  private options;
57
91
  private parser;
58
92
  constructor(options: TextParserOptions);
59
- parse: (text: string) => TextParserNode[];
93
+ parse: (options: TextParserParseOptions) => TextParserNode[];
60
94
  }
@@ -1,8 +1,9 @@
1
+ import _createForOfIteratorHelperLoose from "@babel/runtime/helpers/esm/createForOfIteratorHelperLoose";
1
2
  import { Parser } from 'simple-text-parser';
2
3
  import { DouyinEmojiRender } from "./douyin_emoji_render";
3
4
  import { UnifiedEmojiRender } from "./unified_emoji_render";
4
5
  import { WeixinEmojiRender } from "./weixin_emoji_render";
5
- export var TextParserNodeType = /*#__PURE__*/function (TextParserNodeType) {
6
+ export var TextParserNodeType = function (TextParserNodeType) {
6
7
  TextParserNodeType[TextParserNodeType["PARAGRAPH"] = 1] = "PARAGRAPH";
7
8
  TextParserNodeType[TextParserNodeType["PLAIN_TEXT"] = 2] = "PLAIN_TEXT";
8
9
  TextParserNodeType[TextParserNodeType["WEB_LINK"] = 4] = "WEB_LINK";
@@ -11,16 +12,45 @@ export var TextParserNodeType = /*#__PURE__*/function (TextParserNodeType) {
11
12
  TextParserNodeType[TextParserNodeType["UNIFIED_EMOJI"] = 32] = "UNIFIED_EMOJI";
12
13
  TextParserNodeType[TextParserNodeType["DOUYIN_EMOJI"] = 64] = "DOUYIN_EMOJI";
13
14
  TextParserNodeType[TextParserNodeType["MINI_PROGRAM_SHORT_LINK"] = 128] = "MINI_PROGRAM_SHORT_LINK";
15
+ TextParserNodeType[TextParserNodeType["BOLD"] = 256] = "BOLD";
16
+ TextParserNodeType[TextParserNodeType["ELLIPSIS"] = 512] = "ELLIPSIS";
17
+ TextParserNodeType[TextParserNodeType["ANY_EMOJI"] = TextParserNodeType.UNIFIED_EMOJI | TextParserNodeType.WEIXIN_EMOJI | TextParserNodeType.DOUYIN_EMOJI] = "ANY_EMOJI";
18
+ TextParserNodeType[TextParserNodeType["ANY_LINK"] = TextParserNodeType.WEB_LINK | TextParserNodeType.MINI_PROGRAM_SHORT_LINK] = "ANY_LINK";
14
19
  return TextParserNodeType;
15
20
  }({});
16
21
  export var TextParser = function TextParser(options) {
17
22
  var _this = this;
18
23
  this.options = options;
19
24
  this.parser = void 0;
20
- this.parse = function (text) {
25
+ this.parse = function (options) {
26
+ if (!options.store) {
27
+ var _store = {
28
+ maxLength: options.maxLength || 0,
29
+ currentLength: 0,
30
+ get remainingLength() {
31
+ return _store.maxLength - _store.currentLength;
32
+ },
33
+ get isReachMaxLength() {
34
+ return _store.maxLength > 0 && _store.currentLength >= _store.maxLength;
35
+ },
36
+ get isOverMaxLength() {
37
+ return _store.maxLength > 0 && _store.currentLength > _store.maxLength;
38
+ },
39
+ hasEllipsis: false
40
+ };
41
+ options.store = _store;
42
+ }
43
+ var text = options.text;
44
+ var asFragment = options.asFragment;
45
+ var store = options.store;
21
46
  var paragraphs = [];
22
47
  var paragraph = [];
23
- _this.parser.toTree(text).forEach(function (item) {
48
+ for (var _iterator = _createForOfIteratorHelperLoose(_this.parser.toTree(text)), _step; !(_step = _iterator()).done;) {
49
+ var item = _step.value;
50
+ if (store.isReachMaxLength) {
51
+ store.hasEllipsis = true;
52
+ break;
53
+ }
24
54
  var nodeType = item.type === 'text' ? TextParserNodeType.PLAIN_TEXT : item.type === 'url' ? TextParserNodeType.WEB_LINK : item.type;
25
55
  if (nodeType & TextParserNodeType.LINE_BREAK) {
26
56
  if (paragraph.length > 0) {
@@ -31,15 +61,43 @@ export var TextParser = function TextParser(options) {
31
61
  paragraph = [];
32
62
  }
33
63
  } else {
34
- var node = {
64
+ var node = item.continue ? {
65
+ type: nodeType,
66
+ nodes: _this.parse({
67
+ text: item.text,
68
+ asFragment: true,
69
+ store: store
70
+ }),
71
+ info: item.info
72
+ } : {
35
73
  type: nodeType,
36
74
  content: item.text,
37
75
  info: item.info
38
76
  };
39
77
  paragraph.push(node);
78
+ if (!item.continue) {
79
+ var isEmoji = nodeType & TextParserNodeType.ANY_EMOJI;
80
+ var isPlainText = nodeType & TextParserNodeType.PLAIN_TEXT;
81
+ var chars = isEmoji ? [item.text] : Array.from(item.text);
82
+ store.currentLength += chars.length;
83
+ if (store.isReachMaxLength) {
84
+ if (isPlainText && store.isOverMaxLength) {
85
+ node.content = chars.slice(0, store.remainingLength).join('');
86
+ store.hasEllipsis = true;
87
+ }
88
+ }
89
+ }
40
90
  }
41
- });
91
+ }
92
+ if (asFragment) {
93
+ return paragraph;
94
+ }
42
95
  if (paragraph.length > 0) {
96
+ if (store.hasEllipsis) {
97
+ paragraph.push({
98
+ type: TextParserNodeType.ELLIPSIS
99
+ });
100
+ }
43
101
  paragraphs.push({
44
102
  type: TextParserNodeType.PARAGRAPH,
45
103
  nodes: paragraph
@@ -57,6 +115,15 @@ export var TextParser = function TextParser(options) {
57
115
  text: lineBreak
58
116
  };
59
117
  });
118
+ if (this.options.bold) {
119
+ parser.addRule(/\*\*(.*?)\*\*/g, function (_, text) {
120
+ return {
121
+ type: TextParserNodeType.BOLD,
122
+ text: text,
123
+ continue: true
124
+ };
125
+ });
126
+ }
60
127
  if (this.options.weixinEmoji) {
61
128
  parser.addRule(WeixinEmojiRender.regExp, function (weixinEmoji) {
62
129
  return {
@@ -1,4 +1,4 @@
1
- .xtr_18256 {
1
+ .xtr_2734 {
2
2
  display: inline-block;
3
3
  font-size: 1.2em;
4
4
  width: 1em;
@@ -6,7 +6,7 @@
6
6
  vertical-align: -0.2em;
7
7
  }
8
8
 
9
- .xtr_13917 {
9
+ .xtr_12256 {
10
10
  background-size: 100% 100%;
11
11
  background-repeat: no-repeat;
12
12
  background-position: center;
@@ -1,7 +1,7 @@
1
1
  var _UnifiedEmojiRender;
2
2
  // @ts-ignore
3
3
  import "./unified_emoji_render.css";
4
- var _ = {"unifiedEmoji":"xtr_18256","background":"xtr_13917"};
4
+ var _ = {"unifiedEmoji":"xtr_2734","background":"xtr_12256"};
5
5
  import { characterToCodepoint, escapeRegExp } from 'vtils';
6
6
  import { emojiRegExpBuilder } from 'vtils/regexp';
7
7
  import { HTMLRender } from "./html_render";
@@ -1,4 +1,4 @@
1
- .xtr_4610 {
1
+ .xtr_4380 {
2
2
  display: inline-block;
3
3
  font-size: 1.2em;
4
4
  width: 1em;
@@ -6,7 +6,7 @@
6
6
  vertical-align: -0.2em;
7
7
  }
8
8
 
9
- .xtr_11399 {
9
+ .xtr_76 {
10
10
  background-size: 100% 100%;
11
11
  background-repeat: no-repeat;
12
12
  background-position: center;
@@ -1,6 +1,6 @@
1
1
  // @ts-ignore
2
2
  import "./weixin_emoji_render.css";
3
- var _ = {"weixinEmoji":"xtr_4610","background":"xtr_11399"};
3
+ var _ = {"weixinEmoji":"xtr_4380","background":"xtr_76"};
4
4
  import { escapeRegExp, keysStrict } from 'vtils';
5
5
  import { HTMLRender } from "./html_render";
6
6
  var weixinEmojiBaseUrl = "https://wxpublic-1251448646.file.myqcloud.com/public/common/files/";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jayfong/x-text-render",
3
- "version": "2.62.3",
3
+ "version": "2.64.0",
4
4
  "license": "ISC",
5
5
  "sideEffects": [
6
6
  "*.css"
@@ -26,7 +26,7 @@
26
26
  "vtils": "^4.95.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@jayfong/x-request": "^2.62.3",
29
+ "@jayfong/x-request": "^2.64.0",
30
30
  "fs-extra": "^10.0.1",
31
31
  "globby": "^11",
32
32
  "katex": "^0.16.8",