stream-markdown-parser 0.0.56 → 0.0.58-beta.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/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +203 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -194,6 +194,8 @@ interface AdmonitionNode extends BaseNode {
|
|
|
194
194
|
interface VmrContainerNode extends BaseNode {
|
|
195
195
|
type: 'vmr_container';
|
|
196
196
|
name: string;
|
|
197
|
+
/** True while the opening `:::` has been seen but the closing `:::` hasn't (streaming mid-state). */
|
|
198
|
+
loading?: boolean;
|
|
197
199
|
attrs?: Record<string, string>;
|
|
198
200
|
children: ParsedNode[];
|
|
199
201
|
}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/factory.ts","../src/types.ts","../src/parser/inline-parsers/index.ts","../src/parser/index.ts","../src/config.ts","../src/findMatchingClose.ts","../src/parser/inline-parsers/fence-parser.ts","../src/plugins/containers.ts","../src/plugins/isMathLike.ts","../src/plugins/math.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;UAYiB,cAAA,SAAuB;sBAClB;;EADL,gBAAA,CAAe,EAAA,OAAA;;;;ECVf,CAAA;EAaL;AAEZ;AAMA;AAOA;EAMiB,cAAW,CAAA,EAAA,SAEhB,MAAA,EAAA;AAIZ;;;UAxCiB,QAAA;;EDUA,GAAA,EAAA,MAAA;;;;ACVjB;AAaA;AAEA;AAMA;AAOA;AAMA;AAMiB,KA3BL,WAAA,GAAc,QAgCjB,GAhC4B,MA2BH,CAAA,MAAQ,EAAA,OAAA,CAAA;AAQzB,UAjCA,QAAA,SAAiB,QAmCtB,CAF0B;EAKrB,IAAA,EAAA,MAAA;EAiBA,OAAA,EAAA,MAAA;EAOA,MAAA,CAAA,EAAA,OAAA;AAYjB;AAYiB,UAhFA,WAAA,SAAoB,QAgFA,CAAA;EAK3B,IAAA,EAAA,SAAA;EACG,KAAA,EAAA,MAAA;EANgC,IAAA,EAAA,MAAA;EAAQ,QAAA,EA5EzC,UA4EyC,EAAA;AAUrD;AAKiB,UAxFA,aAAA,SAAsB,QAwFL,CAAQ;EAQzB,IAAA,EAAA,WAAU;EAOV,QAAA,EArGL,UAqGuB,EAAA;EAIlB,aAAA,CAAA,EAAA,OAAgB;AASjC;AASiB,UAvHA,UAAA,SAAmB,QAyHxB,CAF4B;EAKvB,IAAA,EAAA,QAAU;EAEjB,QAAA,EA5HE,UA4HF,EAAA;EACF,OAAA,CAAA,EAAA,MAAA;;AAHmC,UAtH1B,QAAA,SAAiB,QAsHS,CAAA;EAM1B,IAAA,EAAA,MAAA;EAKA,OAAA,EAAA,OAAc;EAOd,KAAA,CAAA,EAAA,MAAA;EAKA,KAAA,EAxIR,YAwIQ,EAAmB;;AAGtB,UAxIG,YAAA,SAAqB,QAwIxB,CAAA;EAH8B,IAAA,EAAA,WAAA;EAAQ,QAAA,EAnIxC,UAmIwC,EAAA;AAMpD;AAMiB,UA5IA,aAAA,SAAsB,QA4IQ,CAAA;EAK9B,IAAA,EAAA,YAAA;EAKA,QAAA,EAAA,MAAA;EAOA,IAAA,EAAA,MAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/factory.ts","../src/types.ts","../src/parser/inline-parsers/index.ts","../src/parser/index.ts","../src/config.ts","../src/findMatchingClose.ts","../src/parser/inline-parsers/fence-parser.ts","../src/plugins/containers.ts","../src/plugins/isMathLike.ts","../src/plugins/math.ts","../src/index.ts"],"sourcesContent":[],"mappings":";;;UAYiB,cAAA,SAAuB;sBAClB;;EADL,gBAAA,CAAe,EAAA,OAAA;;;;ECVf,CAAA;EAaL;AAEZ;AAMA;AAOA;EAMiB,cAAW,CAAA,EAAA,SAEhB,MAAA,EAAA;AAIZ;;;UAxCiB,QAAA;;EDUA,GAAA,EAAA,MAAA;;;;ACVjB;AAaA;AAEA;AAMA;AAOA;AAMA;AAMiB,KA3BL,WAAA,GAAc,QAgCjB,GAhC4B,MA2BH,CAAA,MAAQ,EAAA,OAAA,CAAA;AAQzB,UAjCA,QAAA,SAAiB,QAmCtB,CAF0B;EAKrB,IAAA,EAAA,MAAA;EAiBA,OAAA,EAAA,MAAA;EAOA,MAAA,CAAA,EAAA,OAAA;AAYjB;AAYiB,UAhFA,WAAA,SAAoB,QAgFA,CAAA;EAK3B,IAAA,EAAA,SAAA;EACG,KAAA,EAAA,MAAA;EANgC,IAAA,EAAA,MAAA;EAAQ,QAAA,EA5EzC,UA4EyC,EAAA;AAUrD;AAKiB,UAxFA,aAAA,SAAsB,QAwFL,CAAQ;EAQzB,IAAA,EAAA,WAAU;EAOV,QAAA,EArGL,UAqGuB,EAAA;EAIlB,aAAA,CAAA,EAAA,OAAgB;AASjC;AASiB,UAvHA,UAAA,SAAmB,QAyHxB,CAF4B;EAKvB,IAAA,EAAA,QAAU;EAEjB,QAAA,EA5HE,UA4HF,EAAA;EACF,OAAA,CAAA,EAAA,MAAA;;AAHmC,UAtH1B,QAAA,SAAiB,QAsHS,CAAA;EAM1B,IAAA,EAAA,MAAA;EAKA,OAAA,EAAA,OAAc;EAOd,KAAA,CAAA,EAAA,MAAA;EAKA,KAAA,EAxIR,YAwIQ,EAAmB;;AAGtB,UAxIG,YAAA,SAAqB,QAwIxB,CAAA;EAH8B,IAAA,EAAA,WAAA;EAAQ,QAAA,EAnIxC,UAmIwC,EAAA;AAMpD;AAMiB,UA5IA,aAAA,SAAsB,QA4IQ,CAAA;EAK9B,IAAA,EAAA,YAAA;EAKA,QAAA,EAAA,MAAA;EAOA,IAAA,EAAA,MAAA;EAKP,SAAA,CAAA,EAAA,MAAA;EACE,OAAA,CAAA,EAAA,MAAA;EAN8B,OAAA,CAAA,EAAA,OAAA;EAAQ,IAAA,CAAA,EAAA,OAAA;EASjC,YAAA,CAAW,EAAA,MAAA;EAKX,WAAA,CAAA,EAAA,MAAa;EAKb,GAAA,EAAA,MAAA;AAKjB;AAKiB,UAzKA,aAAA,SAAsB,QAyKH,CAAA;EAKnB,IAAA,EAAA,YAAc;EAKd,KAAA,CAAA,EAAA,CAAA,MAAA,EAAA,MAAgB,CAAA,EAAA,GAAA,IAErB;EAGK,GAAA,EAAA,MAAA;EAKA,OAAA,EAAA,MAAA;AAKjB;AAMiB,UAjMA,cAAA,SAAuB,QAiMO,CAAA;EAI9B,IAAA,EAAA,aAAe;EAKf,GAAA,CAAA,EAAA,MAAA;EAKA,OAAA,EAAA,MAAA;EAMA,QAAA,EAjNL,UAiNsB,EAAA;EAkBtB;AAEZ;;;EAGM,UAAA,CAAA,EAAA,OAAA;;AAEA,KAlOM,oBAAA,GAkON,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,GAhOA,MAgOA,CAAA,MAAA,EAAA,MAAA,GAAA,OAAA,CAAA,GA/NA,KA+NA,CAAA;EACA,IAAA,EAAA,MAAA;EACA,KAAA,EAAA,MAAA,GAAA,OAAA;CACA,CAAA,GAAA,IAAA;;;;;;;AAOA,UAhOW,mBAAA,SAA4B,QAgOvC,CAAA;EACA;EACA,IAAA,EAAA,MAAA;EACA,GAAA,EAAA,MAAA;EACA,OAAA,EAAA,MAAA;EACA,KAAA,CAAA,EAhOI,oBAgOJ;EACA,QAAA,CAAA,EAhOO,UAgOP,EAAA;EACA,UAAA,CAAA,EAAA,OAAA;;AAEA,UA/NW,cAAA,SAAuB,QA+NlC,CAAA;EACA,IAAA,EAAA,aAAA;EACA,IAAA,EAAA,MAAA;;AAEA,UA9NW,QAAA,SAAiB,QA8N5B,CAAA;EACA,IAAA,EAAA,MAAA;EACA,IAAA,EAAA,MAAA;EACA,KAAA,EAAA,MAAA,GAAA,IAAA;EACA,IAAA,EAAA,MAAA;EACA,QAAA,EA9NM,UA8NN,EAAA;;AAEA,UA7NW,SAAA,SAAkB,QA6N7B,CAAA;EACA,IAAA,EAAA,OAAA;EACA,GAAA,EAAA,MAAA;EACA,GAAA,EAAA,MAAA;EAAW,KAAA,EAAA,MAAA,GAAA,IAAA;AACjB;AAmCY,UA7PK,iBAAA,SAA0B,QA6PA,CAAA;EAE1B,IAAA,EAAA,gBAAY;AAsB7B;UAjRiB,gBAAA;;;IChGD,QAAA,EAAA,MAAiB;IACvB,IAAA,EAAA,MAAA;IAEI,OAAA,CAAA,EAAA,OAAA;EAEX,CAAA;;KDoGS,cAAA;;;AEyNZ,CAAA,GAAgB;EAEV,OAAA,CAAA,EAAA,SAAA;EACK,KAAA,EFrNA,QEqNA,EAAA;CACR;AAAU,UFpNI,cAAA,SAAuB,QEoN3B,CAAA;EA4IG,IAAA,EAAA,YAAa;EAAS,QAAA,EF9V1B,UE8V0B,EAAA;;AAA0C,UF3V/D,SAAA,SAAkB,QE2V6C,CAAA;EAAU,IAAA,EAAA,OAAA;UFzVhF;QACF;;AG1JS,UH6JA,YAAA,SAAqB,QG7JV,CAAA;EAqBZ,IAAA,EAAA,WAAA;SH0IP;;UAGQ,aAAA,SAAsB;EI3KvB,IAAA,EAAA,YAAA;;YJ8KJ;;AK1IZ;UL8IiB,kBAAA,SAA2B;;SAEnC;AMnDT;UNsDiB,kBAAA,SAA2B;;QAEpC;EOzLK,UAAA,EP0LC,UOxKb,EAAA;AAED;AA6BgB,UP4IC,YAAA,SAAqB,QO5IZ,CAAA;;;YP+Id;AQ/KZ;AAyKgB,URSC,qBAAA,SAA8B,QQTiB,CAAA;EA2EhD,IAAA,EAAA,oBAAc;;;UR7Db,kBAAA,SAA2B;ESnL5B,IAAA,EAAA,iBAAA;EAIA,EAAA,EAAA,MAAA;AAwBhB;AACW,UT2JM,cAAA,SAAuB,QS3J7B,CAAA;EACU,IAAA,EAAA,YAAA;EAAX,IAAA,EAAA,MAAA;EAK2B,KAAA,EAAA,MAAA;EAPO,QAAA,ETgKhC,UShKgC,EAAA;;AAU5B,UTyJC,gBAAA,SAAyB,QSzJ0D,CAAA;;;;;UT8J1F;YACE;;UAGK,UAAA,SAAmB;;YAExB;;UAGK,YAAA,SAAqB;;YAE1B;;UAGK,iBAAA,SAA0B;;YAE/B;;UAGK,aAAA,SAAsB;;YAE3B;;UAGK,UAAA,SAAmB;;YAExB;;UAGK,aAAA,SAAsB;;YAE3B;;UAGK,eAAA,SAAwB;;YAE7B;;UAGK,YAAA,SAAqB;;;;UAKrB,iBAAA,SAA0B;;;;UAK1B,SAAA,SAAkB;;;;;UAMlB,aAAA,SAAsB;;;UAItB,cAAA,SAAuB;;;;UAKvB,aAAA,SAAsB;;;;UAKtB,aAAA,SAAsB;;;;UAMtB,iBAAA;;;;;;;;;;;;;aAaJ;;;;KAKD,aAAA,IAAiB;;;KAA+C;KAEhE,UAAA,GACN,WACA,cACA,gBACA,WACA,eACA,gBACA,iBACA,WACA,YACA,oBACA,iBACA,YACA,eACA,gBACA,aACA,eACA,oBACA,gBACA,aACA,gBACA,kBACA,eACA,oBACA,YACA,qBACA,qBACA,eACA,wBACA,iBACA,mBACA,gBACA,iBACA,gBACA,gBACA,gBACA,iBACA,sBACA;UACW,gBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmCL,mBAAA,YAA+B,oBAAoB;UAE9C,YAAA;uBACM;wBACC;;;;;;;;;;;;;;;;;KAoBZ,sBAAA,WAAiC,iBAAiB;;;iBCjX9C,iBAAA,SACN,2CAEI;EFhCG,oBAAe,CAAA,EAAA,OACV;;IEiCnB;;;AFlCc,iBG+VD,wBAAA,CH/V8B,QAAA,EAAA,MAAA,EAAA,EAAA,EGiWxC,YHjWwC,EAAA,OAAA,CAAA,EGkWnC,YHlWmC,CAAA,EGmW3C,UHnW2C,EAAA;iBG+e9B,aAAA,SAAsB,2BAA2B,eAAe;;;;;;AH/ehF;;;;ACVA;AAaA;AAEiB,UGRA,WAAA,CHQiB;EAMjB;EAOA,QAAA,CAAA,EAAA,SAAc,MAAA,EAEnB;EAIK;EAMA,iBAAS,CAAA,EAAA,OAKjB;EAGQ;AAKjB;AAiBA;AAOA;AAYA;AAYA;;;;;AAUA;EAKiB,gBAAS,CAAA,EAAA,OAKd;AAGZ;AAOiB,iBGvGD,qBAAA,CHuGmC,IAAA,EGvGP,WHuGO,GAAA,SAAA,CAAA,EAAA,IAAA;;;iBIrInC,iBAAA;;;iBCoCA,eAAA,QAAuB,gBAAgB;;;iBC6FvC,eAAA,KAAoB;;;cCjIvB;cAoBA;iBA6BG,UAAA;;;cChCH;iBAyKG,6BAAA,mBAAgD;iBA2EhD,SAAA,KAAc,yBAAuB;;;ATzPpC,iBUSD,sBAAA,CVTwB,MAAM,EAAA,OAAA,CAAA,EAAA,IAAA;iBUa9B,8BAAA,CAAA;AT8BC,USNA,kBAAA,SAA2B,cTMG,CAAA;EAiB9B,MAAA,CAAA,EStBN,KTsBM,CAAA,OAAc,CAAA;EAOd,KAAA,CAAA,ES5BP,KT4BO,CAAA,CAAA,EAAe,ES5BX,UTgCT,EAAA,GAAA,IAAA,CAAA;EAQA;AAYZ;;;EAA6C,IAAA,CAAA,EAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GAAA,MAAA,CAAA,GS/CR,MT+CQ,CAAA,MAAA,EAAA,MAAA,CAAA;;AAU5B,iBStDD,WAAA,CTsDwB,KAAQ,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EStD6B,kBTsD7B,CAAA,EStDoD,UTsDpD"}
|
package/dist/index.js
CHANGED
|
@@ -6731,6 +6731,95 @@ function container_plugin(md, name, options) {
|
|
|
6731
6731
|
|
|
6732
6732
|
//#endregion
|
|
6733
6733
|
//#region src/plugins/containers.ts
|
|
6734
|
+
function parseLooseInlineAttrs(input) {
|
|
6735
|
+
const s = String(input ?? "").trim();
|
|
6736
|
+
if (!s.startsWith("{") || !s.endsWith("}")) return null;
|
|
6737
|
+
const inner = s.slice(1, -1).trim();
|
|
6738
|
+
if (!inner) return {};
|
|
6739
|
+
if (inner.includes("{") || inner.includes("[") || inner.includes("]")) return null;
|
|
6740
|
+
const parts = [];
|
|
6741
|
+
let buf = "";
|
|
6742
|
+
let inSingle = false;
|
|
6743
|
+
let inDouble = false;
|
|
6744
|
+
for (let i = 0; i < inner.length; i++) {
|
|
6745
|
+
const ch = inner[i];
|
|
6746
|
+
if (ch === "\\") {
|
|
6747
|
+
buf += ch;
|
|
6748
|
+
if (i + 1 < inner.length) {
|
|
6749
|
+
buf += inner[i + 1];
|
|
6750
|
+
i++;
|
|
6751
|
+
}
|
|
6752
|
+
continue;
|
|
6753
|
+
}
|
|
6754
|
+
if (!inDouble && ch === "'") {
|
|
6755
|
+
inSingle = !inSingle;
|
|
6756
|
+
buf += ch;
|
|
6757
|
+
continue;
|
|
6758
|
+
}
|
|
6759
|
+
if (!inSingle && ch === "\"") {
|
|
6760
|
+
inDouble = !inDouble;
|
|
6761
|
+
buf += ch;
|
|
6762
|
+
continue;
|
|
6763
|
+
}
|
|
6764
|
+
if (!inSingle && !inDouble && ch === ",") {
|
|
6765
|
+
parts.push(buf.trim());
|
|
6766
|
+
buf = "";
|
|
6767
|
+
continue;
|
|
6768
|
+
}
|
|
6769
|
+
buf += ch;
|
|
6770
|
+
}
|
|
6771
|
+
if (buf.trim()) parts.push(buf.trim());
|
|
6772
|
+
const out = {};
|
|
6773
|
+
for (const part of parts) {
|
|
6774
|
+
if (!part) continue;
|
|
6775
|
+
let inS = false;
|
|
6776
|
+
let inD = false;
|
|
6777
|
+
let split = -1;
|
|
6778
|
+
for (let i = 0; i < part.length; i++) {
|
|
6779
|
+
const ch = part[i];
|
|
6780
|
+
if (ch === "\\") {
|
|
6781
|
+
i++;
|
|
6782
|
+
continue;
|
|
6783
|
+
}
|
|
6784
|
+
if (!inD && ch === "'") {
|
|
6785
|
+
inS = !inS;
|
|
6786
|
+
continue;
|
|
6787
|
+
}
|
|
6788
|
+
if (!inS && ch === "\"") {
|
|
6789
|
+
inD = !inD;
|
|
6790
|
+
continue;
|
|
6791
|
+
}
|
|
6792
|
+
if (!inS && !inD && ch === ":") {
|
|
6793
|
+
split = i;
|
|
6794
|
+
break;
|
|
6795
|
+
}
|
|
6796
|
+
}
|
|
6797
|
+
if (split === -1) return null;
|
|
6798
|
+
const rawKey = part.slice(0, split).trim();
|
|
6799
|
+
const rawVal = part.slice(split + 1).trim();
|
|
6800
|
+
if (!rawKey) return null;
|
|
6801
|
+
let key = rawKey;
|
|
6802
|
+
if (key.startsWith("\"") && key.endsWith("\"") || key.startsWith("'") && key.endsWith("'")) try {
|
|
6803
|
+
key = JSON.parse(key.replace(/^'/, "\"").replace(/'$/, "\""));
|
|
6804
|
+
} catch {
|
|
6805
|
+
return null;
|
|
6806
|
+
}
|
|
6807
|
+
if (!/^[_$A-Z][\w$-]*$/i.test(key)) return null;
|
|
6808
|
+
let value;
|
|
6809
|
+
if (!rawVal) value = "";
|
|
6810
|
+
else if (rawVal.startsWith("\"") && rawVal.endsWith("\"") || rawVal.startsWith("'") && rawVal.endsWith("'")) try {
|
|
6811
|
+
value = JSON.parse(rawVal.replace(/^'/, "\"").replace(/'$/, "\""));
|
|
6812
|
+
} catch {
|
|
6813
|
+
value = rawVal;
|
|
6814
|
+
}
|
|
6815
|
+
else if (/^-?\d+(?:\.\d+)?$/.test(rawVal)) value = Number(rawVal);
|
|
6816
|
+
else if (rawVal === "true" || rawVal === "false") value = rawVal === "true";
|
|
6817
|
+
else if (rawVal === "null") value = null;
|
|
6818
|
+
else value = rawVal;
|
|
6819
|
+
out[key] = value;
|
|
6820
|
+
}
|
|
6821
|
+
return out;
|
|
6822
|
+
}
|
|
6734
6823
|
function applyContainers(md) {
|
|
6735
6824
|
[
|
|
6736
6825
|
"admonition",
|
|
@@ -6777,8 +6866,10 @@ function applyContainers(md) {
|
|
|
6777
6866
|
}
|
|
6778
6867
|
if (jsonEnd > 0) jsonStr = jsonCandidate.slice(0, jsonEnd);
|
|
6779
6868
|
}
|
|
6869
|
+
if (!jsonStr) argsStr = trimmedRest || void 0;
|
|
6780
6870
|
}
|
|
6781
6871
|
if (silent) return true;
|
|
6872
|
+
const envFinal = !!s.env?.__markstreamFinal;
|
|
6782
6873
|
let nextLine = startLine + 1;
|
|
6783
6874
|
let found = false;
|
|
6784
6875
|
while (nextLine <= endLine) {
|
|
@@ -6790,9 +6881,13 @@ function applyContainers(md) {
|
|
|
6790
6881
|
}
|
|
6791
6882
|
nextLine++;
|
|
6792
6883
|
}
|
|
6793
|
-
if (!found)
|
|
6884
|
+
if (!found) nextLine = endLine;
|
|
6794
6885
|
const tokenOpen = s.push("vmr_container_open", "div", 1);
|
|
6795
6886
|
tokenOpen.attrSet("class", `vmr-container vmr-container-${name}`);
|
|
6887
|
+
tokenOpen.meta = {
|
|
6888
|
+
...tokenOpen.meta,
|
|
6889
|
+
unclosed: !found && !envFinal
|
|
6890
|
+
};
|
|
6796
6891
|
if (argsStr) tokenOpen.attrSet("data-args", argsStr);
|
|
6797
6892
|
if (jsonStr) try {
|
|
6798
6893
|
const attrs = JSON.parse(jsonStr);
|
|
@@ -6801,7 +6896,12 @@ function applyContainers(md) {
|
|
|
6801
6896
|
tokenOpen.attrSet(`data-${key}`, isComplexValue ? JSON.stringify(value) : String(value));
|
|
6802
6897
|
}
|
|
6803
6898
|
} catch {
|
|
6804
|
-
|
|
6899
|
+
const loose = parseLooseInlineAttrs(jsonStr);
|
|
6900
|
+
if (loose) for (const [key, value] of Object.entries(loose)) {
|
|
6901
|
+
const isComplexValue = value != null && typeof value === "object";
|
|
6902
|
+
tokenOpen.attrSet(`data-${key}`, isComplexValue ? JSON.stringify(value) : String(value));
|
|
6903
|
+
}
|
|
6904
|
+
else tokenOpen.attrSet("data-attrs", jsonStr);
|
|
6805
6905
|
}
|
|
6806
6906
|
const contentLines = [];
|
|
6807
6907
|
for (let i = startLine + 1; i < nextLine; i++) {
|
|
@@ -6817,8 +6917,8 @@ function applyContainers(md) {
|
|
|
6817
6917
|
s.md.block.parse(innerSrc, s.md, s.env, innerTokens);
|
|
6818
6918
|
s.tokens.push(...innerTokens);
|
|
6819
6919
|
}
|
|
6820
|
-
s.push("vmr_container_close", "div", -1);
|
|
6821
|
-
s.line = nextLine + 1;
|
|
6920
|
+
if (found) s.push("vmr_container_close", "div", -1);
|
|
6921
|
+
s.line = found ? nextLine + 1 : nextLine;
|
|
6822
6922
|
return true;
|
|
6823
6923
|
}, { alt: [
|
|
6824
6924
|
"paragraph",
|
|
@@ -10854,6 +10954,8 @@ function parseVmrContainer(tokens, index, options) {
|
|
|
10854
10954
|
j = handled[1];
|
|
10855
10955
|
} else j++;
|
|
10856
10956
|
}
|
|
10957
|
+
const hasCloseToken = j < tokens.length && tokens[j].type === "vmr_container_close";
|
|
10958
|
+
const closed = hasCloseToken || !!options?.final;
|
|
10857
10959
|
let raw = `::: ${name}`;
|
|
10858
10960
|
if (Object.keys(containerAttrs).length > 0) raw += ` ${JSON.stringify(containerAttrs)}`;
|
|
10859
10961
|
raw += "\n";
|
|
@@ -10865,10 +10967,11 @@ function parseVmrContainer(tokens, index, options) {
|
|
|
10865
10967
|
return [{
|
|
10866
10968
|
type: "vmr_container",
|
|
10867
10969
|
name,
|
|
10970
|
+
loading: !closed,
|
|
10868
10971
|
attrs: Object.keys(containerAttrs).length > 0 ? containerAttrs : void 0,
|
|
10869
10972
|
children,
|
|
10870
10973
|
raw
|
|
10871
|
-
}, j + 1];
|
|
10974
|
+
}, hasCloseToken ? j + 1 : j];
|
|
10872
10975
|
}
|
|
10873
10976
|
function findTagCloseIndexOutsideQuotes(input) {
|
|
10874
10977
|
let inSingle = false;
|
|
@@ -11236,6 +11339,95 @@ function stripDanglingHtmlLikeTail(markdown) {
|
|
|
11236
11339
|
if (!isLikelyHtmlTagPrefix(tail)) return s;
|
|
11237
11340
|
return s.slice(0, lastLt);
|
|
11238
11341
|
}
|
|
11342
|
+
function normalizeCustomHtmlOpeningTagSameLine(markdown, tags) {
|
|
11343
|
+
if (!markdown || !tags.length) return markdown;
|
|
11344
|
+
const tagSet = new Set(tags.map((t) => String(t ?? "").toLowerCase()));
|
|
11345
|
+
if (!tagSet.size) return markdown;
|
|
11346
|
+
const isIndentWs = (ch) => ch === " " || ch === " ";
|
|
11347
|
+
const isNameChar = (ch) => {
|
|
11348
|
+
const c = ch.charCodeAt(0);
|
|
11349
|
+
return c >= 65 && c <= 90 || c >= 97 && c <= 122 || c >= 48 && c <= 57 || ch === "_" || ch === "-";
|
|
11350
|
+
};
|
|
11351
|
+
const trimStartIndentWs = (s) => {
|
|
11352
|
+
let i = 0;
|
|
11353
|
+
while (i < s.length && isIndentWs(s[i])) i++;
|
|
11354
|
+
return s.slice(i);
|
|
11355
|
+
};
|
|
11356
|
+
const hasClosingTagOnLine = (line, from, tag) => {
|
|
11357
|
+
const lowerTag = tag.toLowerCase();
|
|
11358
|
+
let pos = line.indexOf("<", from);
|
|
11359
|
+
while (pos !== -1) {
|
|
11360
|
+
let i = pos + 1;
|
|
11361
|
+
while (i < line.length && isIndentWs(line[i])) i++;
|
|
11362
|
+
if (i >= line.length || line[i] !== "/") {
|
|
11363
|
+
pos = line.indexOf("<", pos + 1);
|
|
11364
|
+
continue;
|
|
11365
|
+
}
|
|
11366
|
+
i++;
|
|
11367
|
+
while (i < line.length && isIndentWs(line[i])) i++;
|
|
11368
|
+
if (i + lowerTag.length > line.length) {
|
|
11369
|
+
pos = line.indexOf("<", pos + 1);
|
|
11370
|
+
continue;
|
|
11371
|
+
}
|
|
11372
|
+
let matched = true;
|
|
11373
|
+
for (let j = 0; j < lowerTag.length; j++) {
|
|
11374
|
+
const ch = line[i + j];
|
|
11375
|
+
if ((ch >= "A" && ch <= "Z" ? String.fromCharCode(ch.charCodeAt(0) + 32) : ch) !== lowerTag[j]) {
|
|
11376
|
+
matched = false;
|
|
11377
|
+
break;
|
|
11378
|
+
}
|
|
11379
|
+
}
|
|
11380
|
+
if (!matched) {
|
|
11381
|
+
pos = line.indexOf("<", pos + 1);
|
|
11382
|
+
continue;
|
|
11383
|
+
}
|
|
11384
|
+
let k = i + lowerTag.length;
|
|
11385
|
+
if (k < line.length && isNameChar(line[k])) {
|
|
11386
|
+
pos = line.indexOf("<", pos + 1);
|
|
11387
|
+
continue;
|
|
11388
|
+
}
|
|
11389
|
+
while (k < line.length && isIndentWs(line[k])) k++;
|
|
11390
|
+
if (k < line.length && line[k] === ">") return true;
|
|
11391
|
+
pos = line.indexOf("<", pos + 1);
|
|
11392
|
+
}
|
|
11393
|
+
return false;
|
|
11394
|
+
};
|
|
11395
|
+
const normalizeLine = (line) => {
|
|
11396
|
+
let i = 0;
|
|
11397
|
+
while (i < line.length && isIndentWs(line[i])) i++;
|
|
11398
|
+
if (i >= line.length || line[i] !== "<") return line;
|
|
11399
|
+
i++;
|
|
11400
|
+
while (i < line.length && isIndentWs(line[i])) i++;
|
|
11401
|
+
if (i >= line.length || line[i] === "/") return line;
|
|
11402
|
+
const nameStart = i;
|
|
11403
|
+
while (i < line.length && isNameChar(line[i])) i++;
|
|
11404
|
+
if (i === nameStart) return line;
|
|
11405
|
+
const tagName = line.slice(nameStart, i).toLowerCase();
|
|
11406
|
+
if (!tagSet.has(tagName)) return line;
|
|
11407
|
+
const gt = line.indexOf(">", i);
|
|
11408
|
+
if (gt === -1) return line;
|
|
11409
|
+
if (hasClosingTagOnLine(line, gt + 1, tagName)) return line;
|
|
11410
|
+
const rest = trimStartIndentWs(line.slice(gt + 1));
|
|
11411
|
+
if (!rest) return line;
|
|
11412
|
+
return `${line.slice(0, gt + 1)}\n${rest}`;
|
|
11413
|
+
};
|
|
11414
|
+
let out = "";
|
|
11415
|
+
let idx = 0;
|
|
11416
|
+
while (idx < markdown.length) {
|
|
11417
|
+
const nl = markdown.indexOf("\n", idx);
|
|
11418
|
+
if (nl === -1) {
|
|
11419
|
+
out += normalizeLine(markdown.slice(idx));
|
|
11420
|
+
break;
|
|
11421
|
+
}
|
|
11422
|
+
const isCrlf = nl > idx && markdown[nl - 1] === "\r";
|
|
11423
|
+
const lineEnd = isCrlf ? nl - 1 : nl;
|
|
11424
|
+
const line = markdown.slice(idx, lineEnd);
|
|
11425
|
+
out += normalizeLine(line);
|
|
11426
|
+
out += isCrlf ? "\r\n" : "\n";
|
|
11427
|
+
idx = nl + 1;
|
|
11428
|
+
}
|
|
11429
|
+
return out;
|
|
11430
|
+
}
|
|
11239
11431
|
function parseMarkdownToStructure(markdown, md, options = {}) {
|
|
11240
11432
|
const isFinal = !!options.final;
|
|
11241
11433
|
let safeMarkdown = (markdown ?? "").toString().replace(/([^\\])\r(ight|ho)/g, "$1\\r$2").replace(/([^\\])\n(abla|eq|ot|exists)/g, "$1\\n$2");
|
|
@@ -11257,9 +11449,12 @@ function parseMarkdownToStructure(markdown, md, options = {}) {
|
|
|
11257
11449
|
const tags = options.customHtmlTags.map((t) => String(t ?? "").trim()).filter(Boolean).map((t) => {
|
|
11258
11450
|
return (t.match(/^[<\s/]*([A-Z][\w-]*)/i)?.[1] ?? "").toLowerCase();
|
|
11259
11451
|
}).filter(Boolean);
|
|
11260
|
-
if (tags.length)
|
|
11261
|
-
|
|
11262
|
-
|
|
11452
|
+
if (tags.length) {
|
|
11453
|
+
safeMarkdown = normalizeCustomHtmlOpeningTagSameLine(safeMarkdown, tags);
|
|
11454
|
+
if (!safeMarkdown.includes("</")) {} else for (const tag of tags) {
|
|
11455
|
+
const re = new RegExp(String.raw`(^[\t ]*<\s*\/\s*${tag}\s*>[\t ]*)(\r?\n)(?![\t ]*\r?\n|$)`, "gim");
|
|
11456
|
+
safeMarkdown = safeMarkdown.replace(re, "$1$2$2");
|
|
11457
|
+
}
|
|
11263
11458
|
}
|
|
11264
11459
|
}
|
|
11265
11460
|
if (!isFinal) safeMarkdown = stripDanglingHtmlLikeTail(safeMarkdown);
|