markdown-it-any-block 3.4.11 → 3.5.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.
@@ -198,17 +198,21 @@ const ABAlias_json_mdit = [
198
198
  { regex: /\|:::_140lne\|(?:mdit2|2)?(puml)?(plantuml|mindmap|脑图|思维导图)\|/, replacement: "|mdit2list|list2pumlMindmap|" },
199
199
  { regex: /\|:::_140lne\|(?:mdit2|2)?(markmap|mdMindmap|md脑图|md思维导图)\|/, replacement: "|mdit2list|list2markmap|" },
200
200
  { regex: /\|:::_140lne\|(?:mdit2|2)?(wbs|(工作)?分解(图|结构))\|/, replacement: "|mdit2list|list2pumlWBS|" },
201
- { regex: /\|:::_140lne\|(?:mdit2|2)?(table|multiWayTable|multiCrossTable|表格?|多叉表格?|跨行表格?)\|/, replacement: "|mdit2list|list2table|" },
201
+ { regex: /\|:::_140lne\|(?:mdit2|2)?(table|multiWayTable|multiCrossTable|表格?|多叉表格?|跨行表格?)\|/, replacement: "|mdit2Listdata|listdata2strict|listdata2table|" },
202
202
  // list - lt树 (属于多层一叉树)
203
203
  { regex: /\|:::_140lne\|(?:mdit2|2)?(lt|listTable|treeTable|listGrid|treeGrid|列表格|树形表格?)\|/, replacement: "|mdit2list|list2lt|" },
204
- { regex: /\|:::_140lne\|(?:mdit2|2)?(list|列表)\|/, replacement: "|mdit2list|list2lt|addClass(ab-listtable-likelist)|" },
204
+ { regex: /\|:::_140lne\|2?(list|列表)\|/, replacement: "|mdit2list|list2lt|addClass(ab-listtable-likelist)|" },
205
205
  { regex: /\|:::_140lne\|(?:mdit2|2)?(dir|dirTree|目录树?|目录结构)\|/, replacement: "|mdit2list|list2dt|" },
206
206
  // list - 二层树
207
207
  { regex: /\|:::_140lne\|(fakeList|仿列表)\|/, replacement: "|mdit2list|list2table|addClass(ab-table-fc)|addClass(ab-table-likelist)|" },
208
208
  // 至后
209
- { regex: "|mdit2list|", replacement: "|mdit2listdata|listdata2strict|listdata2list|" }
209
+ { regex: "|mdit2list|", replacement: "|mdit2listdata|listdata2strict|listdata2list|" },
210
+ { regex: "|mdit2List|", replacement: "|mdit2Listdata|listdata2strict|listdata2list|" }
210
211
  ];
211
212
  const ABAlias_json_title = [
213
+ // 至前,特殊
214
+ { regex: "|heading2", replacement: "|title2" },
215
+ { regex: "|h2", replacement: "|title2" },
212
216
  // title - list&title
213
217
  { regex: /\|heading_140lne\|2?(timeline|时间线)\|/, replacement: "|title2timeline|" },
214
218
  { regex: /\|heading_140lne\|2?(tabs?|标签页?)\||\|title2tabs?\|/, replacement: "|title2c2listdata|c2listdata2tab|" },
@@ -221,7 +225,7 @@ const ABAlias_json_title = [
221
225
  { regex: /\|heading_140lne\|2?(puml)?(plantuml|mindmap|脑图|思维导图)\|/, replacement: "|title2list|list2pumlMindmap|" },
222
226
  { regex: /\|heading_140lne\|2?(markmap|mdMindmap|md脑图|md思维导图)\|/, replacement: "|title2list|list2markmap|" },
223
227
  { regex: /\|heading_140lne\|2?(wbs|(工作)?分解(图|结构))\|/, replacement: "|title2list|list2pumlWBS|" },
224
- { regex: /\|heading_140lne\|2?(table|multiWayTable|multiCrossTable|表格?|多叉表格?|跨行表格?)\|/, replacement: "|title2list|list2table|" },
228
+ { regex: /\|heading_140lne\|2?(table|multiWayTable|multiCrossTable|表格?|多叉表格?|跨行表格?)\|/, replacement: "|title2Listdata|listdata2strict|listdata2table|" },
225
229
  // list - lt树 (属于多层一叉树)
226
230
  { regex: /\|heading_140lne\|2?(lt|listTable|treeTable|listGrid|treeGrid|列表格|树形表格?)\|/, replacement: "|title2list|list2lt|" },
227
231
  { regex: /\|heading_140lne\|2?(list|列表)\|/, replacement: "|title2list|list2lt|addClass(ab-listtable-likelist)|" },
@@ -955,8 +959,12 @@ class ListProcess {
955
959
  * 3. 列表等级, = `(.*)-`个数+1, 取值[0]
956
960
  *
957
961
  * (比较旧版是正文+10,列表+11,后来允许标题等级为负数。这样方便很多)
962
+ *
963
+ * @fine_mode 精细拆分模式
964
+ * - true: 会将正文和列表拆分成多个节点
965
+ * - false: 会将标题+正文+列表合并成一个节点
958
966
  */
959
- static title2data(text2) {
967
+ static title2data(text2, fine_mode = true) {
960
968
  let list_itemInfo = [];
961
969
  const list_text = text2.split("\n");
962
970
  let mul_mode = "";
@@ -965,14 +973,17 @@ class ListProcess {
965
973
  if (codeBlockFlag == "") {
966
974
  const match2 = line.match(ABReg.reg_code);
967
975
  if (match2 && match2[3]) {
968
- if (mul_mode === "heading" || mul_mode === "") {
976
+ codeBlockFlag = match2[1] + match2[3];
977
+ if (!fine_mode && list_itemInfo.length > 0) {
978
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
979
+ } else if (mul_mode === "heading" || mul_mode === "") {
980
+ removeTailBlank();
969
981
  list_itemInfo.push({
970
982
  content: line,
971
983
  level: 0
972
984
  });
973
985
  mul_mode = "para";
974
986
  } else {
975
- codeBlockFlag = match2[1] + match2[3];
976
987
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
977
988
  }
978
989
  continue;
@@ -987,10 +998,14 @@ class ListProcess {
987
998
  if (match_heading && !match_heading[1]) {
988
999
  removeTailBlank();
989
1000
  list_itemInfo.push({
990
- content: match_heading[4],
1001
+ content: fine_mode ? match_heading[4] : line,
1002
+ // 可选是否把标题标志也放进去
991
1003
  level: match_heading[3].length - 1 - 10
992
1004
  });
993
1005
  mul_mode = "heading";
1006
+ } else if (!fine_mode && list_itemInfo.length > 0) {
1007
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1008
+ continue;
994
1009
  } else if (match_list) {
995
1010
  removeTailBlank();
996
1011
  list_itemInfo.push({
@@ -998,19 +1013,23 @@ class ListProcess {
998
1013
  level: match_list[1].length + 1
999
1014
  });
1000
1015
  mul_mode = "list";
1001
- } else if (/^\S/.test(line) && mul_mode == "list") {
1002
- list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1016
+ } else if (mul_mode == "list" && /^\s/.test(line)) {
1017
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line.trimStart();
1018
+ continue;
1003
1019
  } else {
1004
1020
  if (mul_mode == "para") {
1005
1021
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1022
+ continue;
1006
1023
  } else if (/^\s*$/.test(line)) {
1007
1024
  continue;
1008
1025
  } else {
1026
+ removeTailBlank();
1009
1027
  list_itemInfo.push({
1010
1028
  content: line,
1011
1029
  level: 0
1012
1030
  });
1013
1031
  mul_mode = "para";
1032
+ continue;
1014
1033
  }
1015
1034
  }
1016
1035
  }
@@ -1028,41 +1047,20 @@ class ListProcess {
1028
1047
  * @detail
1029
1048
  * 与 title2data 的逻辑基本相同
1030
1049
  *
1031
- * 这里要将Mdit标识 (@xxx)、正文、列表 的等级合为一块,所以存在偏移值:
1032
- *
1033
- * 1. Mdit等级, = `@<数字>`-100,
1034
- * 2. 正文等级, = 0, 取值[+1,+Infi]
1035
- * 3. 列表等级, = `(.*)-`个数+1, 取值[0]
1036
- *
1037
- * 例如:
1050
+ * 有很多写法变型和语法糖,所以逻辑比较复杂。
1051
+ * 具体设计详见 "docs/docs/dev docs/其他层级表示法.md"
1038
1052
  *
1039
- * :::
1053
+ * 支持:
1040
1054
  *
1041
- * @1 AAA
1055
+ * - 单行标题模式
1056
+ * - 多行标题模式
1057
+ * - 缺少分割标题模式
1042
1058
  *
1043
- * aaa
1044
- *
1045
- * @2 BBB
1046
- *
1047
- * @2 B22
1048
- *
1049
- * ccc
1050
- * ddd
1051
- *
1052
- * @1 A22
1053
- *
1054
- * :::
1055
- *
1056
- * 会被转化为
1057
- *
1058
- * - AAA
1059
- * - BBB
1060
- * - B22
1061
- * - ccc
1062
- * ddd
1063
- * - A22
1064
- */
1065
- static mdit2data(text2) {
1059
+ * @fine_mode 精细拆分模式
1060
+ * - true: 会将正文和列表拆分成多个节点
1061
+ * - false: 会将标题+正文+列表合并成一个节点
1062
+ */
1063
+ static mdit2data(text2, fine_mode = true) {
1066
1064
  let list_itemInfo = [];
1067
1065
  const list_text = text2.split("\n");
1068
1066
  let mul_mode = "";
@@ -1071,14 +1069,17 @@ class ListProcess {
1071
1069
  if (codeBlockFlag == "") {
1072
1070
  const match2 = line.match(ABReg.reg_code);
1073
1071
  if (match2 && match2[3]) {
1074
- if (mul_mode === "mdit" || mul_mode === "") {
1072
+ codeBlockFlag = match2[1] + match2[3];
1073
+ if (!fine_mode && list_itemInfo.length > 0) {
1074
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1075
+ } else if (mul_mode === "mdit" || mul_mode === "") {
1076
+ removeTailBlank();
1075
1077
  list_itemInfo.push({
1076
1078
  content: line,
1077
1079
  level: 0
1078
1080
  });
1079
1081
  mul_mode = "para";
1080
1082
  } else {
1081
- codeBlockFlag = match2[1] + match2[3];
1082
1083
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1083
1084
  }
1084
1085
  continue;
@@ -1088,15 +1089,18 @@ class ListProcess {
1088
1089
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1089
1090
  continue;
1090
1091
  }
1091
- const match_mdit = line.match(/^(\s*)@(\d+)\s+(.*)$/);
1092
+ const match_mdit = line.match(/^(\s*)@(\d+)(?:\s+(.*))?$/);
1092
1093
  const match_list = line.match(ABReg.reg_list_noprefix);
1093
1094
  if (match_mdit && !match_mdit[1]) {
1094
1095
  removeTailBlank();
1095
1096
  list_itemInfo.push({
1096
- content: match_mdit[3],
1097
+ content: match_mdit[3] ?? "",
1097
1098
  level: Number(match_mdit[2]) - 100
1098
1099
  });
1099
1100
  mul_mode = "mdit";
1101
+ } else if (!fine_mode && list_itemInfo.length > 0) {
1102
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1103
+ continue;
1100
1104
  } else if (match_list) {
1101
1105
  removeTailBlank();
1102
1106
  list_itemInfo.push({
@@ -1104,19 +1108,23 @@ class ListProcess {
1104
1108
  level: match_list[1].length + 1
1105
1109
  });
1106
1110
  mul_mode = "list";
1107
- } else if (/^\S/.test(line) && mul_mode == "list") {
1108
- list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1111
+ } else if (mul_mode == "list" && /^\s/.test(line)) {
1112
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line.trimStart();
1113
+ continue;
1109
1114
  } else {
1110
1115
  if (mul_mode == "para") {
1111
1116
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1117
+ continue;
1112
1118
  } else if (/^\s*$/.test(line)) {
1113
1119
  continue;
1114
1120
  } else {
1121
+ removeTailBlank();
1115
1122
  list_itemInfo.push({
1116
1123
  content: line,
1117
1124
  level: 0
1118
1125
  });
1119
1126
  mul_mode = "para";
1127
+ continue;
1120
1128
  }
1121
1129
  }
1122
1130
  }
@@ -1335,7 +1343,7 @@ const abc_list2listdata = ABConvert.factory({
1335
1343
  process_param: ABConvert_IOEnum.text,
1336
1344
  process_return: ABConvert_IOEnum.list_stream,
1337
1345
  detail: "列表到listdata",
1338
- process: (el, header, content) => {
1346
+ process: (_el, _header, content) => {
1339
1347
  return ListProcess.list2data(content);
1340
1348
  }
1341
1349
  });
@@ -1344,9 +1352,19 @@ const abc_title2listdata = ABConvert.factory({
1344
1352
  name: "标题到listdata",
1345
1353
  process_param: ABConvert_IOEnum.text,
1346
1354
  process_return: ABConvert_IOEnum.list_stream,
1347
- detail: "标题到listdata",
1348
- process: (el, header, content) => {
1349
- return ListProcess.title2data(content);
1355
+ detail: "标题到listdata。细粒度版本,列表会拆分成多个节点",
1356
+ process: (_el, _header, content) => {
1357
+ return ListProcess.title2data(content, true);
1358
+ }
1359
+ });
1360
+ ABConvert.factory({
1361
+ id: "title2Listdata",
1362
+ name: "标题到Listdata",
1363
+ process_param: ABConvert_IOEnum.text,
1364
+ process_return: ABConvert_IOEnum.list_stream,
1365
+ detail: "标题到Listdata。粗粒度版本,列表为一个节点,不会拆分",
1366
+ process: (_el, _header, content) => {
1367
+ return ListProcess.title2data(content, false);
1350
1368
  }
1351
1369
  });
1352
1370
  ABConvert.factory({
@@ -1354,9 +1372,19 @@ ABConvert.factory({
1354
1372
  name: "mdit到listdata",
1355
1373
  process_param: ABConvert_IOEnum.text,
1356
1374
  process_return: ABConvert_IOEnum.list_stream,
1357
- detail: "mdit到listdata",
1358
- process: (el, header, content) => {
1359
- return ListProcess.mdit2data(content);
1375
+ detail: "mdit到listdata。细粒度版本,列表会拆分成多个节点",
1376
+ process: (_el, _header, content) => {
1377
+ return ListProcess.mdit2data(content, true);
1378
+ }
1379
+ });
1380
+ ABConvert.factory({
1381
+ id: "mdit2Listdata",
1382
+ name: "mdit到Listdata",
1383
+ process_param: ABConvert_IOEnum.text,
1384
+ process_return: ABConvert_IOEnum.list_stream,
1385
+ detail: "mdit到Listdata。粗粒度版本,列表为一个节点,不会拆分",
1386
+ process: (_el, _header, content) => {
1387
+ return ListProcess.mdit2data(content, false);
1360
1388
  }
1361
1389
  });
1362
1390
  ABConvert.factory({
@@ -1365,7 +1393,7 @@ ABConvert.factory({
1365
1393
  process_param: ABConvert_IOEnum.list_stream,
1366
1394
  process_return: ABConvert_IOEnum.text,
1367
1395
  detail: "listdata到列表",
1368
- process: (el, header, content) => {
1396
+ process: (_el, _header, content) => {
1369
1397
  return ListProcess.data2list(content);
1370
1398
  }
1371
1399
  });
@@ -1375,17 +1403,18 @@ ABConvert.factory({
1375
1403
  process_param: ABConvert_IOEnum.list_stream,
1376
1404
  process_return: ABConvert_IOEnum.el,
1377
1405
  detail: "listdata到节点图",
1378
- process: (el, header, content) => {
1406
+ process: (el, _header, content) => {
1379
1407
  return ListProcess.data2nodes(content, el);
1380
1408
  }
1381
1409
  });
1382
1410
  ABConvert.factory({
1383
1411
  id: "listdata2strict",
1384
1412
  name: "listdata严格化",
1413
+ match: /listdata2strict|listdata2lint/,
1385
1414
  process_param: ABConvert_IOEnum.list_stream,
1386
1415
  process_return: ABConvert_IOEnum.list_stream,
1387
1416
  detail: "将列表数据转化为更规范的列表数据。统一缩进符(2空格 4空格 tab混用)为level 1、禁止跳等级(h1直接就到h3)",
1388
- process: (el, header, content) => {
1417
+ process: (_el, _header, content) => {
1389
1418
  return ListProcess.data2strict(content);
1390
1419
  }
1391
1420
  });
@@ -1395,7 +1424,7 @@ ABConvert.factory({
1395
1424
  process_param: ABConvert_IOEnum.list_stream,
1396
1425
  process_return: ABConvert_IOEnum.list_stream,
1397
1426
  detail: "当列表中存在任务列表项时,令此列表项支持任务项",
1398
- process: (el, header, content) => {
1427
+ process: (_el, _header, content) => {
1399
1428
  return ListProcess.data2taskData(content);
1400
1429
  }
1401
1430
  });
@@ -1405,7 +1434,7 @@ ABConvert.factory({
1405
1434
  process_param: ABConvert_IOEnum.text,
1406
1435
  process_return: ABConvert_IOEnum.json,
1407
1436
  detail: "列表到listnode",
1408
- process: (el, header, content) => {
1437
+ process: (_el, _header, content) => {
1409
1438
  const data2 = ListProcess.list2listnode(content);
1410
1439
  return JSON.stringify(data2, null, 2);
1411
1440
  }
@@ -1416,7 +1445,7 @@ ABConvert.factory({
1416
1445
  process_param: ABConvert_IOEnum.text,
1417
1446
  process_return: ABConvert_IOEnum.json,
1418
1447
  detail: "列表到json",
1419
- process: (el, header, content) => {
1448
+ process: (_el, _header, content) => {
1420
1449
  const data2 = ListProcess.list2json(content);
1421
1450
  return JSON.stringify(data2, null, 2);
1422
1451
  }
@@ -1929,6 +1958,19 @@ ABConvert.factory({
1929
1958
  return el = TableProcess.data2table(data2, el, matchs[2] == "T");
1930
1959
  }
1931
1960
  });
1961
+ ABConvert.factory({
1962
+ id: "listdata2table",
1963
+ name: "列表数据转表格",
1964
+ match: /listdata2(md)?table(T)?/,
1965
+ default: "listdata2table",
1966
+ process_param: ABConvert_IOEnum.list_stream,
1967
+ process_return: ABConvert_IOEnum.el,
1968
+ process: (el, header, content) => {
1969
+ const matchs = header.match(/listdata2(md)?table(T)?/);
1970
+ if (!matchs) return el;
1971
+ return el = TableProcess.data2table(content, el, matchs[2] == "T");
1972
+ }
1973
+ });
1932
1974
  ABConvert.factory({
1933
1975
  id: "list2c2t",
1934
1976
  name: "列表转二列表格",
@@ -50816,4 +50858,4 @@ exports.abConvertEvent = abConvertEvent;
50816
50858
  exports.ab_mdit = ab_mdit;
50817
50859
  exports.ab_mdit_client = ab_mdit_client;
50818
50860
  exports.jsdom_api = jsdom_api;
50819
- //# sourceMappingURL=ABConvertEvent-npBaIgYL.cjs.map
50861
+ //# sourceMappingURL=ABConvertEvent-Bka43YZF.cjs.map
@@ -197,17 +197,21 @@ const ABAlias_json_mdit = [
197
197
  { regex: /\|:::_140lne\|(?:mdit2|2)?(puml)?(plantuml|mindmap|脑图|思维导图)\|/, replacement: "|mdit2list|list2pumlMindmap|" },
198
198
  { regex: /\|:::_140lne\|(?:mdit2|2)?(markmap|mdMindmap|md脑图|md思维导图)\|/, replacement: "|mdit2list|list2markmap|" },
199
199
  { regex: /\|:::_140lne\|(?:mdit2|2)?(wbs|(工作)?分解(图|结构))\|/, replacement: "|mdit2list|list2pumlWBS|" },
200
- { regex: /\|:::_140lne\|(?:mdit2|2)?(table|multiWayTable|multiCrossTable|表格?|多叉表格?|跨行表格?)\|/, replacement: "|mdit2list|list2table|" },
200
+ { regex: /\|:::_140lne\|(?:mdit2|2)?(table|multiWayTable|multiCrossTable|表格?|多叉表格?|跨行表格?)\|/, replacement: "|mdit2Listdata|listdata2strict|listdata2table|" },
201
201
  // list - lt树 (属于多层一叉树)
202
202
  { regex: /\|:::_140lne\|(?:mdit2|2)?(lt|listTable|treeTable|listGrid|treeGrid|列表格|树形表格?)\|/, replacement: "|mdit2list|list2lt|" },
203
- { regex: /\|:::_140lne\|(?:mdit2|2)?(list|列表)\|/, replacement: "|mdit2list|list2lt|addClass(ab-listtable-likelist)|" },
203
+ { regex: /\|:::_140lne\|2?(list|列表)\|/, replacement: "|mdit2list|list2lt|addClass(ab-listtable-likelist)|" },
204
204
  { regex: /\|:::_140lne\|(?:mdit2|2)?(dir|dirTree|目录树?|目录结构)\|/, replacement: "|mdit2list|list2dt|" },
205
205
  // list - 二层树
206
206
  { regex: /\|:::_140lne\|(fakeList|仿列表)\|/, replacement: "|mdit2list|list2table|addClass(ab-table-fc)|addClass(ab-table-likelist)|" },
207
207
  // 至后
208
- { regex: "|mdit2list|", replacement: "|mdit2listdata|listdata2strict|listdata2list|" }
208
+ { regex: "|mdit2list|", replacement: "|mdit2listdata|listdata2strict|listdata2list|" },
209
+ { regex: "|mdit2List|", replacement: "|mdit2Listdata|listdata2strict|listdata2list|" }
209
210
  ];
210
211
  const ABAlias_json_title = [
212
+ // 至前,特殊
213
+ { regex: "|heading2", replacement: "|title2" },
214
+ { regex: "|h2", replacement: "|title2" },
211
215
  // title - list&title
212
216
  { regex: /\|heading_140lne\|2?(timeline|时间线)\|/, replacement: "|title2timeline|" },
213
217
  { regex: /\|heading_140lne\|2?(tabs?|标签页?)\||\|title2tabs?\|/, replacement: "|title2c2listdata|c2listdata2tab|" },
@@ -220,7 +224,7 @@ const ABAlias_json_title = [
220
224
  { regex: /\|heading_140lne\|2?(puml)?(plantuml|mindmap|脑图|思维导图)\|/, replacement: "|title2list|list2pumlMindmap|" },
221
225
  { regex: /\|heading_140lne\|2?(markmap|mdMindmap|md脑图|md思维导图)\|/, replacement: "|title2list|list2markmap|" },
222
226
  { regex: /\|heading_140lne\|2?(wbs|(工作)?分解(图|结构))\|/, replacement: "|title2list|list2pumlWBS|" },
223
- { regex: /\|heading_140lne\|2?(table|multiWayTable|multiCrossTable|表格?|多叉表格?|跨行表格?)\|/, replacement: "|title2list|list2table|" },
227
+ { regex: /\|heading_140lne\|2?(table|multiWayTable|multiCrossTable|表格?|多叉表格?|跨行表格?)\|/, replacement: "|title2Listdata|listdata2strict|listdata2table|" },
224
228
  // list - lt树 (属于多层一叉树)
225
229
  { regex: /\|heading_140lne\|2?(lt|listTable|treeTable|listGrid|treeGrid|列表格|树形表格?)\|/, replacement: "|title2list|list2lt|" },
226
230
  { regex: /\|heading_140lne\|2?(list|列表)\|/, replacement: "|title2list|list2lt|addClass(ab-listtable-likelist)|" },
@@ -954,8 +958,12 @@ class ListProcess {
954
958
  * 3. 列表等级, = `(.*)-`个数+1, 取值[0]
955
959
  *
956
960
  * (比较旧版是正文+10,列表+11,后来允许标题等级为负数。这样方便很多)
961
+ *
962
+ * @fine_mode 精细拆分模式
963
+ * - true: 会将正文和列表拆分成多个节点
964
+ * - false: 会将标题+正文+列表合并成一个节点
957
965
  */
958
- static title2data(text2) {
966
+ static title2data(text2, fine_mode = true) {
959
967
  let list_itemInfo = [];
960
968
  const list_text = text2.split("\n");
961
969
  let mul_mode = "";
@@ -964,14 +972,17 @@ class ListProcess {
964
972
  if (codeBlockFlag == "") {
965
973
  const match2 = line.match(ABReg.reg_code);
966
974
  if (match2 && match2[3]) {
967
- if (mul_mode === "heading" || mul_mode === "") {
975
+ codeBlockFlag = match2[1] + match2[3];
976
+ if (!fine_mode && list_itemInfo.length > 0) {
977
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
978
+ } else if (mul_mode === "heading" || mul_mode === "") {
979
+ removeTailBlank();
968
980
  list_itemInfo.push({
969
981
  content: line,
970
982
  level: 0
971
983
  });
972
984
  mul_mode = "para";
973
985
  } else {
974
- codeBlockFlag = match2[1] + match2[3];
975
986
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
976
987
  }
977
988
  continue;
@@ -986,10 +997,14 @@ class ListProcess {
986
997
  if (match_heading && !match_heading[1]) {
987
998
  removeTailBlank();
988
999
  list_itemInfo.push({
989
- content: match_heading[4],
1000
+ content: fine_mode ? match_heading[4] : line,
1001
+ // 可选是否把标题标志也放进去
990
1002
  level: match_heading[3].length - 1 - 10
991
1003
  });
992
1004
  mul_mode = "heading";
1005
+ } else if (!fine_mode && list_itemInfo.length > 0) {
1006
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1007
+ continue;
993
1008
  } else if (match_list) {
994
1009
  removeTailBlank();
995
1010
  list_itemInfo.push({
@@ -997,19 +1012,23 @@ class ListProcess {
997
1012
  level: match_list[1].length + 1
998
1013
  });
999
1014
  mul_mode = "list";
1000
- } else if (/^\S/.test(line) && mul_mode == "list") {
1001
- list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1015
+ } else if (mul_mode == "list" && /^\s/.test(line)) {
1016
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line.trimStart();
1017
+ continue;
1002
1018
  } else {
1003
1019
  if (mul_mode == "para") {
1004
1020
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1021
+ continue;
1005
1022
  } else if (/^\s*$/.test(line)) {
1006
1023
  continue;
1007
1024
  } else {
1025
+ removeTailBlank();
1008
1026
  list_itemInfo.push({
1009
1027
  content: line,
1010
1028
  level: 0
1011
1029
  });
1012
1030
  mul_mode = "para";
1031
+ continue;
1013
1032
  }
1014
1033
  }
1015
1034
  }
@@ -1027,41 +1046,20 @@ class ListProcess {
1027
1046
  * @detail
1028
1047
  * 与 title2data 的逻辑基本相同
1029
1048
  *
1030
- * 这里要将Mdit标识 (@xxx)、正文、列表 的等级合为一块,所以存在偏移值:
1031
- *
1032
- * 1. Mdit等级, = `@<数字>`-100,
1033
- * 2. 正文等级, = 0, 取值[+1,+Infi]
1034
- * 3. 列表等级, = `(.*)-`个数+1, 取值[0]
1035
- *
1036
- * 例如:
1049
+ * 有很多写法变型和语法糖,所以逻辑比较复杂。
1050
+ * 具体设计详见 "docs/docs/dev docs/其他层级表示法.md"
1037
1051
  *
1038
- * :::
1052
+ * 支持:
1039
1053
  *
1040
- * @1 AAA
1054
+ * - 单行标题模式
1055
+ * - 多行标题模式
1056
+ * - 缺少分割标题模式
1041
1057
  *
1042
- * aaa
1043
- *
1044
- * @2 BBB
1045
- *
1046
- * @2 B22
1047
- *
1048
- * ccc
1049
- * ddd
1050
- *
1051
- * @1 A22
1052
- *
1053
- * :::
1054
- *
1055
- * 会被转化为
1056
- *
1057
- * - AAA
1058
- * - BBB
1059
- * - B22
1060
- * - ccc
1061
- * ddd
1062
- * - A22
1063
- */
1064
- static mdit2data(text2) {
1058
+ * @fine_mode 精细拆分模式
1059
+ * - true: 会将正文和列表拆分成多个节点
1060
+ * - false: 会将标题+正文+列表合并成一个节点
1061
+ */
1062
+ static mdit2data(text2, fine_mode = true) {
1065
1063
  let list_itemInfo = [];
1066
1064
  const list_text = text2.split("\n");
1067
1065
  let mul_mode = "";
@@ -1070,14 +1068,17 @@ class ListProcess {
1070
1068
  if (codeBlockFlag == "") {
1071
1069
  const match2 = line.match(ABReg.reg_code);
1072
1070
  if (match2 && match2[3]) {
1073
- if (mul_mode === "mdit" || mul_mode === "") {
1071
+ codeBlockFlag = match2[1] + match2[3];
1072
+ if (!fine_mode && list_itemInfo.length > 0) {
1073
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1074
+ } else if (mul_mode === "mdit" || mul_mode === "") {
1075
+ removeTailBlank();
1074
1076
  list_itemInfo.push({
1075
1077
  content: line,
1076
1078
  level: 0
1077
1079
  });
1078
1080
  mul_mode = "para";
1079
1081
  } else {
1080
- codeBlockFlag = match2[1] + match2[3];
1081
1082
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1082
1083
  }
1083
1084
  continue;
@@ -1087,15 +1088,18 @@ class ListProcess {
1087
1088
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1088
1089
  continue;
1089
1090
  }
1090
- const match_mdit = line.match(/^(\s*)@(\d+)\s+(.*)$/);
1091
+ const match_mdit = line.match(/^(\s*)@(\d+)(?:\s+(.*))?$/);
1091
1092
  const match_list = line.match(ABReg.reg_list_noprefix);
1092
1093
  if (match_mdit && !match_mdit[1]) {
1093
1094
  removeTailBlank();
1094
1095
  list_itemInfo.push({
1095
- content: match_mdit[3],
1096
+ content: match_mdit[3] ?? "",
1096
1097
  level: Number(match_mdit[2]) - 100
1097
1098
  });
1098
1099
  mul_mode = "mdit";
1100
+ } else if (!fine_mode && list_itemInfo.length > 0) {
1101
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1102
+ continue;
1099
1103
  } else if (match_list) {
1100
1104
  removeTailBlank();
1101
1105
  list_itemInfo.push({
@@ -1103,19 +1107,23 @@ class ListProcess {
1103
1107
  level: match_list[1].length + 1
1104
1108
  });
1105
1109
  mul_mode = "list";
1106
- } else if (/^\S/.test(line) && mul_mode == "list") {
1107
- list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1110
+ } else if (mul_mode == "list" && /^\s/.test(line)) {
1111
+ list_itemInfo[list_itemInfo.length - 1].content += "\n" + line.trimStart();
1112
+ continue;
1108
1113
  } else {
1109
1114
  if (mul_mode == "para") {
1110
1115
  list_itemInfo[list_itemInfo.length - 1].content += "\n" + line;
1116
+ continue;
1111
1117
  } else if (/^\s*$/.test(line)) {
1112
1118
  continue;
1113
1119
  } else {
1120
+ removeTailBlank();
1114
1121
  list_itemInfo.push({
1115
1122
  content: line,
1116
1123
  level: 0
1117
1124
  });
1118
1125
  mul_mode = "para";
1126
+ continue;
1119
1127
  }
1120
1128
  }
1121
1129
  }
@@ -1334,7 +1342,7 @@ const abc_list2listdata = ABConvert.factory({
1334
1342
  process_param: ABConvert_IOEnum.text,
1335
1343
  process_return: ABConvert_IOEnum.list_stream,
1336
1344
  detail: "列表到listdata",
1337
- process: (el, header, content) => {
1345
+ process: (_el, _header, content) => {
1338
1346
  return ListProcess.list2data(content);
1339
1347
  }
1340
1348
  });
@@ -1343,9 +1351,19 @@ const abc_title2listdata = ABConvert.factory({
1343
1351
  name: "标题到listdata",
1344
1352
  process_param: ABConvert_IOEnum.text,
1345
1353
  process_return: ABConvert_IOEnum.list_stream,
1346
- detail: "标题到listdata",
1347
- process: (el, header, content) => {
1348
- return ListProcess.title2data(content);
1354
+ detail: "标题到listdata。细粒度版本,列表会拆分成多个节点",
1355
+ process: (_el, _header, content) => {
1356
+ return ListProcess.title2data(content, true);
1357
+ }
1358
+ });
1359
+ ABConvert.factory({
1360
+ id: "title2Listdata",
1361
+ name: "标题到Listdata",
1362
+ process_param: ABConvert_IOEnum.text,
1363
+ process_return: ABConvert_IOEnum.list_stream,
1364
+ detail: "标题到Listdata。粗粒度版本,列表为一个节点,不会拆分",
1365
+ process: (_el, _header, content) => {
1366
+ return ListProcess.title2data(content, false);
1349
1367
  }
1350
1368
  });
1351
1369
  ABConvert.factory({
@@ -1353,9 +1371,19 @@ ABConvert.factory({
1353
1371
  name: "mdit到listdata",
1354
1372
  process_param: ABConvert_IOEnum.text,
1355
1373
  process_return: ABConvert_IOEnum.list_stream,
1356
- detail: "mdit到listdata",
1357
- process: (el, header, content) => {
1358
- return ListProcess.mdit2data(content);
1374
+ detail: "mdit到listdata。细粒度版本,列表会拆分成多个节点",
1375
+ process: (_el, _header, content) => {
1376
+ return ListProcess.mdit2data(content, true);
1377
+ }
1378
+ });
1379
+ ABConvert.factory({
1380
+ id: "mdit2Listdata",
1381
+ name: "mdit到Listdata",
1382
+ process_param: ABConvert_IOEnum.text,
1383
+ process_return: ABConvert_IOEnum.list_stream,
1384
+ detail: "mdit到Listdata。粗粒度版本,列表为一个节点,不会拆分",
1385
+ process: (_el, _header, content) => {
1386
+ return ListProcess.mdit2data(content, false);
1359
1387
  }
1360
1388
  });
1361
1389
  ABConvert.factory({
@@ -1364,7 +1392,7 @@ ABConvert.factory({
1364
1392
  process_param: ABConvert_IOEnum.list_stream,
1365
1393
  process_return: ABConvert_IOEnum.text,
1366
1394
  detail: "listdata到列表",
1367
- process: (el, header, content) => {
1395
+ process: (_el, _header, content) => {
1368
1396
  return ListProcess.data2list(content);
1369
1397
  }
1370
1398
  });
@@ -1374,17 +1402,18 @@ ABConvert.factory({
1374
1402
  process_param: ABConvert_IOEnum.list_stream,
1375
1403
  process_return: ABConvert_IOEnum.el,
1376
1404
  detail: "listdata到节点图",
1377
- process: (el, header, content) => {
1405
+ process: (el, _header, content) => {
1378
1406
  return ListProcess.data2nodes(content, el);
1379
1407
  }
1380
1408
  });
1381
1409
  ABConvert.factory({
1382
1410
  id: "listdata2strict",
1383
1411
  name: "listdata严格化",
1412
+ match: /listdata2strict|listdata2lint/,
1384
1413
  process_param: ABConvert_IOEnum.list_stream,
1385
1414
  process_return: ABConvert_IOEnum.list_stream,
1386
1415
  detail: "将列表数据转化为更规范的列表数据。统一缩进符(2空格 4空格 tab混用)为level 1、禁止跳等级(h1直接就到h3)",
1387
- process: (el, header, content) => {
1416
+ process: (_el, _header, content) => {
1388
1417
  return ListProcess.data2strict(content);
1389
1418
  }
1390
1419
  });
@@ -1394,7 +1423,7 @@ ABConvert.factory({
1394
1423
  process_param: ABConvert_IOEnum.list_stream,
1395
1424
  process_return: ABConvert_IOEnum.list_stream,
1396
1425
  detail: "当列表中存在任务列表项时,令此列表项支持任务项",
1397
- process: (el, header, content) => {
1426
+ process: (_el, _header, content) => {
1398
1427
  return ListProcess.data2taskData(content);
1399
1428
  }
1400
1429
  });
@@ -1404,7 +1433,7 @@ ABConvert.factory({
1404
1433
  process_param: ABConvert_IOEnum.text,
1405
1434
  process_return: ABConvert_IOEnum.json,
1406
1435
  detail: "列表到listnode",
1407
- process: (el, header, content) => {
1436
+ process: (_el, _header, content) => {
1408
1437
  const data2 = ListProcess.list2listnode(content);
1409
1438
  return JSON.stringify(data2, null, 2);
1410
1439
  }
@@ -1415,7 +1444,7 @@ ABConvert.factory({
1415
1444
  process_param: ABConvert_IOEnum.text,
1416
1445
  process_return: ABConvert_IOEnum.json,
1417
1446
  detail: "列表到json",
1418
- process: (el, header, content) => {
1447
+ process: (_el, _header, content) => {
1419
1448
  const data2 = ListProcess.list2json(content);
1420
1449
  return JSON.stringify(data2, null, 2);
1421
1450
  }
@@ -1928,6 +1957,19 @@ ABConvert.factory({
1928
1957
  return el = TableProcess.data2table(data2, el, matchs[2] == "T");
1929
1958
  }
1930
1959
  });
1960
+ ABConvert.factory({
1961
+ id: "listdata2table",
1962
+ name: "列表数据转表格",
1963
+ match: /listdata2(md)?table(T)?/,
1964
+ default: "listdata2table",
1965
+ process_param: ABConvert_IOEnum.list_stream,
1966
+ process_return: ABConvert_IOEnum.el,
1967
+ process: (el, header, content) => {
1968
+ const matchs = header.match(/listdata2(md)?table(T)?/);
1969
+ if (!matchs) return el;
1970
+ return el = TableProcess.data2table(content, el, matchs[2] == "T");
1971
+ }
1972
+ });
1931
1973
  ABConvert.factory({
1932
1974
  id: "list2c2t",
1933
1975
  name: "列表转二列表格",
@@ -50817,4 +50859,4 @@ export {
50817
50859
  ABConvertManager as d,
50818
50860
  jsdom_api as j
50819
50861
  };
50820
- //# sourceMappingURL=ABConvertEvent-CSIDczUT.js.map
50862
+ //# sourceMappingURL=ABConvertEvent-DXDgKtXz.js.map
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const ABConvertEvent = require("./ABConvertEvent-npBaIgYL.cjs");
3
+ const ABConvertEvent = require("./ABConvertEvent-Bka43YZF.cjs");
4
4
  exports.ABConvertManager = ABConvertEvent.ABConvertManager;
5
5
  exports.ABReg = ABConvertEvent.ABReg;
6
6
  exports.abConvertEvent = ABConvertEvent.abConvertEvent;
@@ -1,4 +1,4 @@
1
- import { d, A, c, a, b } from "./ABConvertEvent-CSIDczUT.js";
1
+ import { d, A, c, a, b } from "./ABConvertEvent-DXDgKtXz.js";
2
2
  export {
3
3
  d as ABConvertManager,
4
4
  A as ABReg,
@@ -22,7 +22,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
22
22
  mod
23
23
  ));
24
24
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
25
- const ABConvertEvent = require("./ABConvertEvent-npBaIgYL.cjs");
25
+ const ABConvertEvent = require("./ABConvertEvent-Bka43YZF.cjs");
26
26
  let dom = null;
27
27
  let disable_disable_flag = false;
28
28
  async function jsdom_init(enable = true, disable_disable = false) {
@@ -1,5 +1,5 @@
1
- import { j as jsdom_api } from "./ABConvertEvent-CSIDczUT.js";
2
- import { d, A, c, a, b } from "./ABConvertEvent-CSIDczUT.js";
1
+ import { j as jsdom_api } from "./ABConvertEvent-DXDgKtXz.js";
2
+ import { d, A, c, a, b } from "./ABConvertEvent-DXDgKtXz.js";
3
3
  let dom = null;
4
4
  let disable_disable_flag = false;
5
5
  async function jsdom_init(enable = true, disable_disable = false) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "markdown-it-any-block",
3
- "version": "3.4.11",
3
+ "version": "3.5.0",
4
4
  "description": "You can flexibility to create a 'Block' by many means. It also provides many useful features, like `list to table`. (obsidian/markdown-it/vuepress plugin/app)",
5
5
  "types": "@types/index_mdit.d.ts",
6
6
  "type": "module",