stream-markdown-parser 0.0.61 → 0.0.63
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 +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +145 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
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":";;;UAaiB,cAAA,SAAuB;sBAClB;;EADL,gBAAA,CAAe,EAAA,OAAA;;;;ECXf,CAAA;EAaL;AAEZ;AAMA;;EAKY,cAAA,CAAA,EAAA,SAAA,MAAA,EAAA;EALyB;;AAQrC;AAMA;EAMiB,0BAKR,CAAA,EAAA,OAAA;AAGT;;;UAjDiB,QAAA;;EDWA,GAAA,EAAA,MAAA;;;;ACXjB;AAaA;AAEA;AAMA;;;AAAqC,KARzB,WAAA,GAAc,QAQW,GARA,MAQA,CAAA,MAAA,EAAA,OAAA,CAAA;AAAQ,UAN5B,QAAA,SAAiB,QAMW,CAAA;EAQ5B,IAAA,EAAA,MAAA;EAMA,OAAA,EAAA,MAAW;EAMX,MAAA,CAAA,EAAA,OAAS;AAQ1B;AAKiB,UAjCA,WAAA,SAAoB,QAiCU,CAAA;EAiB9B,IAAA,EAAA,SAAA;EAOA,KAAA,EAAA,MAAA;EAYL,IAAA,EAAA,MAAA;EAYK,KAAA,CAAA,EA7EP,MA6EO,CAAA,MAAA,EAAoB,MAAA,GAAA,OAAA,CAAA;EAK3B,QAAA,EAjFE,UAiFF,EAAA;;AALmC,UAzE5B,aAAA,SAAsB,QAyEM,CAAA;EAAQ,IAAA,EAAA,WAAA;EAUpC,QAAA,EAjFL,UAiFoB,EAAA;EAKf,aAAS,CAAA,EAAA,
|
|
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":";;;UAaiB,cAAA,SAAuB;sBAClB;;EADL,gBAAA,CAAe,EAAA,OAAA;;;;ECXf,CAAA;EAaL;AAEZ;AAMA;;EAKY,cAAA,CAAA,EAAA,SAAA,MAAA,EAAA;EALyB;;AAQrC;AAMA;EAMiB,0BAKR,CAAA,EAAA,OAAA;AAGT;;;UAjDiB,QAAA;;EDWA,GAAA,EAAA,MAAA;;;;ACXjB;AAaA;AAEA;AAMA;;;AAAqC,KARzB,WAAA,GAAc,QAQW,GARA,MAQA,CAAA,MAAA,EAAA,OAAA,CAAA;AAAQ,UAN5B,QAAA,SAAiB,QAMW,CAAA;EAQ5B,IAAA,EAAA,MAAA;EAMA,OAAA,EAAA,MAAW;EAMX,MAAA,CAAA,EAAA,OAAS;AAQ1B;AAKiB,UAjCA,WAAA,SAAoB,QAiCU,CAAA;EAiB9B,IAAA,EAAA,SAAA;EAOA,KAAA,EAAA,MAAA;EAYL,IAAA,EAAA,MAAA;EAYK,KAAA,CAAA,EA7EP,MA6EO,CAAA,MAAA,EAAoB,MAAA,GAAA,OAAA,CAAA;EAK3B,QAAA,EAjFE,UAiFF,EAAA;;AALmC,UAzE5B,aAAA,SAAsB,QAyEM,CAAA;EAAQ,IAAA,EAAA,WAAA;EAUpC,QAAA,EAjFL,UAiFoB,EAAA;EAKf,aAAS,CAAA,EAAA,OAMd;AAGZ;AAOiB,UAlGA,UAAA,SAAmB,QAkGO,CAAQ;EAIlC,IAAA,EAAA,QAAA;EASL,QAAA,EA7GA,UA6Gc,EAAA;EAST,OAAA,CAAA,EAAA,MAAA;AAKjB;AAEU,UAzHO,QAAA,SAAiB,QAyHxB,CAAA;EACF,IAAA,EAAA,MAAA;EAH2B,OAAA,EAAA,OAAA;EAAQ,KAAA,CAAA,EAAA,MAAA;EAM1B,KAAA,EAxHR,YAwHqB,EAAA;AAK9B;AAOiB,UAjIA,YAAA,SAAqB,QAmI7B,CAAA;EAGQ,IAAA,EAAA,WAAA;EAET,QAAA,EAtII,UAsIJ,EAAA;;AAFoC,UAjI3B,aAAA,SAAsB,QAiIK,CAAA;EAAQ,IAAA,EAAA,YAAA;EAMnC,QAAA,EAAA,MAAa;EAMb,IAAA,EAAA,MAAA;EAKA,SAAA,CAAA,EAAA,MAAA;EAKA,OAAA,CAAA,EAAA,MAAA;EAOA,OAAA,CAAA,EAAA,OAAA;EAKP,IAAA,CAAA,EAAA,OAAA;EACE,YAAA,CAAA,EAAA,MAAA;EAN8B,WAAA,CAAA,EAAA,MAAA;EAAQ,GAAA,EAAA,MAAA;AASlD;AAKiB,UA3JA,aAAA,SAAsB,QA2JD,CAAA;EAKrB,IAAA,EAAA,YAAA;EAKA,KAAA,CAAA,EAAA,CAAA,MAAA,EAAc,MAAA,CAAA,EAAA,GAEnB,IAAA;EAGK,GAAA,EAAA,MAAA;EAKA,OAAA,EAAA,MAAA;AAKjB;AAKiB,UAlLA,cAAA,SAAuB,QAkLM,CAAA;EAK7B,IAAA,EAAA,aAAA;EAKA,GAAA,CAAA,EAAA,MAAU;EAMV,OAAA,EAAA,MAAA;EAIA,QAAA,EAlML,UAkMoB,EAAA;EAMf;AAMjB;AAMA;AAkBA;EAEY,UAAA,CAAA,EAAU,OAAA;;AAEhB,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,KAAA,CAAA,EAAA,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA;EACA,QAAA,EA9NM,UA8NN,EAAA;;AAEA,UA7NW,SAAA,SAAkB,QA6N7B,CAAA;EACA,IAAA,EAAA,OAAA;EACA,GAAA,EAAA,MAAA;EACA,GAAA,EAAA,MAAA;EACA,KAAA,EAAA,MAAA,GAAA,IAAA;;AACW,UA3NA,iBAAA,SAA0B,QA2N1B,CAAA;EACA,IAAA,EAAA,gBAAgB;AAmCjC;AAEiB,UA7PA,gBAAA,CA8PM;EA6BX,IAAA,EAAA;;;;ICpVI,OAAA,CAAA,EAAA,OAAiB;EACvB,CAAA;;AAIP,KD6DS,cAAA,GC7DT;EAAU,OAAA,EAAA,MAAA;;;;ECszBG,KAAA,EFlvBL,QEkvBK,EAAA;CAEV;AACK,UFnvBM,cAAA,SAAuB,QEmvB7B,CAAA;EACR,IAAA,EAAA,YAAA;EAAU,QAAA,EFlvBD,UEkvBC,EAAA;AAuLb;AAAsC,UFt6BrB,SAAA,SAAkB,QEs6BG,CAAA;EAA2B,IAAA,EAAA,OAAA;EAAe,MAAA,EFp6BtE,YEo6BsE;EAAU,IAAA,EFn6BlF,YEm6BkF,EAAA;;UFh6BzE,YAAA,SAAqB;;EG/JrB,KAAA,EHiKR,aGjKmB,EAAA;AAqB5B;UH+IiB,aAAA,SAAsB;;;EI7KvB,QAAA,EJgLJ,UIhLqB,EAAA;;;UJoLhB,kBAAA,SAA2B;EKhJ5B,IAAA,EAAA,iBAAe;SLkJtB;;UAGQ,kBAAA,SAA2B;EMxD5B,IAAA,EAAA,iBAAe;QN0DvB;cACM;;AO5LD,UP+LI,YAAA,SAAqB,QO7KrC,CAAA;EAEY,IAAA,EAAA,UAAA;EA6BG,EAAA,EAAA,MAAA;YPiJJ;;UAGK,qBAAA,SAA8B;EQpLlC,IAAA,EAAA,oBA4DZ;EA6Ge,EAAA,EAAA,MAAA;AA8JhB;UR9IiB,kBAAA,SAA2B;;;ASrL5C;AAIgB,UTsLC,cAAA,SAAuB,QStLM,CAAA;EAwB7B,IAAA,EAAA,YAAA;EACN,IAAA,EAAA,MAAA;EACU,KAAA,EAAA,MAAA;EAAX,QAAA,ETgKE,UShKF,EAAA;;AAFkC,UTqK3B,gBAAA,SAAyB,QSrKE,CAAA;EAAc,IAAA,EAAA,eAAA;EAU1C,IAAA,EAAA,MAAA;;;UTgKN;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;;;;;UAMvB,aAAA,SAAsB;;;;;UAMtB,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;;;;;;;;;;;;;;;;;;;;;;;;;KA4BZ,sBAAA,WAAiC,iBAAiB;;;iBCpV9C,iBAAA,SACN,2CAEI;EFxEG,oBAAe,CAAA,EAAA,OACV;;;IEyEnB;;;iBCszBa,wBAAA,uBAEV,wBACK,eACR;iBAuLa,aAAA,SAAsB,2BAA2B,eAAe;;;;;;AH3jChF;;;;ACXA;AAaA;AAEiB,UGRA,WAAA,CHQiB;EAMjB;EAIP,QAAA,CAAA,EAAA,SAAA,MAAA,EAAA;EACE;EALyB,iBAAA,CAAA,EAAA,OAAA;EAAQ;AAQ7C;AAMA;AAMA;AAQA;AAKA;AAiBA;AAOA;AAYA;AAYA;;EAMa,gBAAA,CAAA,EAAA,OAAA;;AANwC,iBG1ErC,qBAAA,CH0EqC,IAAA,EG1ET,WH0ES,GAAA,SAAA,CAAA,EAAA,IAAA;;;iBIxGrC,iBAAA;;;iBCoCA,eAAA,QAAuB,gBAAgB;;;iBC6FvC,eAAA,KAAoB;;;cCjIvB;cAoBA;iBA6BG,UAAA;;;cChCH;iBAyKG,6BAAA,mBAAgD;iBA8JhD,SAAA,KAAc,yBAAuB;;;AT3UpC,iBUQD,sBAAA,CVR8B,MAAA,EAAA,OAAA,CAAA,EAAA,IAAA;iBUY9B,8BAAA,CAAA;ATMC,USkBA,kBAAA,SAA2B,cTlBG,CAAA;EAM9B,MAAA,CAAA,ESaN,KTbiB,CAAA,OAAA,CAAA;EAMX,KAAA,CAAA,ESQP,KTRgB,CAAA,CAAA,EAAA,ESQL,UTHZ,EAAA,GAAA,IALyB,CAAA;EAQjB;AAKjB;AAiBA;AAOA;EAYY,IAAA,CAAA,EAAA,CAAA,CAAA,GAAA,EAAA,MAAA,EAAA,GAAoB,MAAA,CAAA,GSpCK,MTsC/B,CAAA,MACA,EAAK,MAAA,CAAA;AASX;AAKU,iBSlDM,WAAA,CTkDN,KAAA,CAAA,EAAA,MAAA,EAAA,OAAA,CAAA,ESlDmE,kBTkDnE,CAAA,ESlD0F,UTkD1F"}
|
package/dist/index.js
CHANGED
|
@@ -8962,6 +8962,56 @@ function isPlainBracketMathLike(content) {
|
|
|
8962
8962
|
if (!(/\\[a-z]+/i.test(stripped) || /[=+*/^<>]|\\times|\\pm|\\cdot|\\le|\\ge|\\neq/.test(stripped) || /[_^]/.test(stripped)) && /\s-\s/.test(stripped)) return false;
|
|
8963
8963
|
return true;
|
|
8964
8964
|
}
|
|
8965
|
+
function buildCodeSpanRanges(src) {
|
|
8966
|
+
const ranges = [];
|
|
8967
|
+
let i = 0;
|
|
8968
|
+
while (i < src.length) {
|
|
8969
|
+
if (src[i] !== "`") {
|
|
8970
|
+
i++;
|
|
8971
|
+
continue;
|
|
8972
|
+
}
|
|
8973
|
+
const openStart = i;
|
|
8974
|
+
let openLen = 1;
|
|
8975
|
+
while (openStart + openLen < src.length && src[openStart + openLen] === "`") openLen++;
|
|
8976
|
+
let j = openStart + openLen;
|
|
8977
|
+
let closeStart = -1;
|
|
8978
|
+
while (j < src.length) {
|
|
8979
|
+
if (src[j] !== "`") {
|
|
8980
|
+
j++;
|
|
8981
|
+
continue;
|
|
8982
|
+
}
|
|
8983
|
+
let runLen = 1;
|
|
8984
|
+
while (j + runLen < src.length && src[j + runLen] === "`") runLen++;
|
|
8985
|
+
if (runLen === openLen) {
|
|
8986
|
+
closeStart = j;
|
|
8987
|
+
break;
|
|
8988
|
+
}
|
|
8989
|
+
j += runLen;
|
|
8990
|
+
}
|
|
8991
|
+
if (closeStart !== -1) {
|
|
8992
|
+
ranges.push([openStart, closeStart + openLen]);
|
|
8993
|
+
i = closeStart + openLen;
|
|
8994
|
+
continue;
|
|
8995
|
+
}
|
|
8996
|
+
i = openStart + openLen;
|
|
8997
|
+
}
|
|
8998
|
+
return ranges;
|
|
8999
|
+
}
|
|
9000
|
+
function findCodeSpanRangeAt(ranges, index) {
|
|
9001
|
+
for (const range of ranges) if (index >= range[0] && index < range[1]) return range;
|
|
9002
|
+
return null;
|
|
9003
|
+
}
|
|
9004
|
+
function isLikelyCurrencyRangeDollar(content, nextChar) {
|
|
9005
|
+
const stripped = String(content ?? "").trim();
|
|
9006
|
+
if (!stripped) return false;
|
|
9007
|
+
if (!/^\d[\d,.]*(?:\s*[~~-]\s*)$/.test(stripped)) return false;
|
|
9008
|
+
return /\d/.test(String(nextChar ?? ""));
|
|
9009
|
+
}
|
|
9010
|
+
function isLikelyPlaceholderDollar(content) {
|
|
9011
|
+
const stripped = String(content ?? "").trim();
|
|
9012
|
+
if (!stripped) return false;
|
|
9013
|
+
return /^(?:\.{3,}|…+)$/.test(stripped);
|
|
9014
|
+
}
|
|
8965
9015
|
function applyMath(md, mathOpts) {
|
|
8966
9016
|
const mathInline = (state, silent) => {
|
|
8967
9017
|
const s = state;
|
|
@@ -8978,6 +9028,7 @@ function applyMath(md, mathOpts) {
|
|
|
8978
9028
|
const initialPos = s.pos;
|
|
8979
9029
|
for (const [open, close] of delimiters) {
|
|
8980
9030
|
const src = s.src;
|
|
9031
|
+
const codeSpanRanges = buildCodeSpanRanges(src);
|
|
8981
9032
|
let foundAny = false;
|
|
8982
9033
|
if (open === "$$" && searchPos !== initialPos) searchPos = initialPos;
|
|
8983
9034
|
let lastIndex = -1;
|
|
@@ -9043,7 +9094,10 @@ function applyMath(md, mathOpts) {
|
|
|
9043
9094
|
const content = text$1.slice(dollarIndex + 1, closingDollarIndex);
|
|
9044
9095
|
const hasBacktick = content.includes("`");
|
|
9045
9096
|
const isEmpty = !content || !content.trim();
|
|
9046
|
-
|
|
9097
|
+
const nextChar = text$1[closingDollarIndex + 1];
|
|
9098
|
+
const isCurrencyRange = isLikelyCurrencyRangeDollar(content, nextChar);
|
|
9099
|
+
const isPlaceholder = isLikelyPlaceholderDollar(content);
|
|
9100
|
+
if (!hasBacktick && !isEmpty && !isCurrencyRange && !isPlaceholder) {
|
|
9047
9101
|
const token = s.push("math_inline", "math", 0);
|
|
9048
9102
|
token.content = normalizeStandaloneBackslashT(content, mathOpts);
|
|
9049
9103
|
token.markup = "$";
|
|
@@ -9107,6 +9161,11 @@ function applyMath(md, mathOpts) {
|
|
|
9107
9161
|
if (searchPos >= src.length) break;
|
|
9108
9162
|
const index = src.indexOf(open, searchPos);
|
|
9109
9163
|
if (index === -1) break;
|
|
9164
|
+
const codeSpanAtIndex = findCodeSpanRangeAt(codeSpanRanges, index);
|
|
9165
|
+
if (codeSpanAtIndex) {
|
|
9166
|
+
searchPos = codeSpanAtIndex[1];
|
|
9167
|
+
continue;
|
|
9168
|
+
}
|
|
9110
9169
|
if (index === lastIndex && searchPos === lastSearchPos) {
|
|
9111
9170
|
stallCount++;
|
|
9112
9171
|
if (stallCount > 2) {
|
|
@@ -9184,7 +9243,11 @@ function applyMath(md, mathOpts) {
|
|
|
9184
9243
|
const content = src.slice(index + open.length, endIdx);
|
|
9185
9244
|
const hasBacktick = content.includes("`");
|
|
9186
9245
|
const isEmpty = !content || !content.trim();
|
|
9187
|
-
|
|
9246
|
+
const isDollar = open === "$";
|
|
9247
|
+
const nextChar = src[endIdx + close.length];
|
|
9248
|
+
const isCurrencyRange = isDollar && isLikelyCurrencyRangeDollar(content, nextChar);
|
|
9249
|
+
const isPlaceholder = isDollar && isLikelyPlaceholderDollar(content);
|
|
9250
|
+
if (strict ? hasBacktick || isEmpty || isCurrencyRange || isPlaceholder : hasBacktick || isEmpty || isCurrencyRange || isPlaceholder || !isDollar && !isMathLike(content)) {
|
|
9188
9251
|
searchPos = endIdx + close.length;
|
|
9189
9252
|
const text$1 = src.slice(s.pos, searchPos);
|
|
9190
9253
|
if (!s.pending) {
|
|
@@ -9266,7 +9329,10 @@ function applyMath(md, mathOpts) {
|
|
|
9266
9329
|
const content = src.slice(dollarIndex + 1, closingDollarIndex);
|
|
9267
9330
|
const hasBacktick = content.includes("`");
|
|
9268
9331
|
const isEmpty = !content || !content.trim();
|
|
9269
|
-
|
|
9332
|
+
const nextChar = src[closingDollarIndex + 1];
|
|
9333
|
+
const isCurrencyRange = isLikelyCurrencyRangeDollar(content, nextChar);
|
|
9334
|
+
const isPlaceholder = isLikelyPlaceholderDollar(content);
|
|
9335
|
+
if (!hasBacktick && !isEmpty && !isCurrencyRange && !isPlaceholder) {
|
|
9270
9336
|
const before = src.slice(searchPos, dollarIndex);
|
|
9271
9337
|
if (before) pushText(before);
|
|
9272
9338
|
const token = s.push("math_inline", "math", 0);
|
|
@@ -9701,6 +9767,31 @@ function tokenToRaw(token) {
|
|
|
9701
9767
|
const raw = shape.raw ?? shape.content ?? shape.markup ?? "";
|
|
9702
9768
|
return String(raw ?? "");
|
|
9703
9769
|
}
|
|
9770
|
+
function parseTagAttrs(openTag) {
|
|
9771
|
+
const attrs = [];
|
|
9772
|
+
const attrRegex = /\s([\w:-]+)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s"'>]+)))?/g;
|
|
9773
|
+
let match;
|
|
9774
|
+
while ((match = attrRegex.exec(openTag)) !== null) {
|
|
9775
|
+
const attrName = match[1];
|
|
9776
|
+
if (!attrName) continue;
|
|
9777
|
+
const attrValue = match[2] || match[3] || match[4] || "";
|
|
9778
|
+
attrs.push([attrName, attrValue]);
|
|
9779
|
+
}
|
|
9780
|
+
return attrs;
|
|
9781
|
+
}
|
|
9782
|
+
function getAttrValue$1(attrs, name) {
|
|
9783
|
+
const lowerName = name.toLowerCase();
|
|
9784
|
+
for (let i = attrs.length - 1; i >= 0; i--) {
|
|
9785
|
+
const [key, value] = attrs[i];
|
|
9786
|
+
if (String(key).toLowerCase() === lowerName) return value;
|
|
9787
|
+
}
|
|
9788
|
+
}
|
|
9789
|
+
function normalizeLinkAttrs$1(attrs, href, title) {
|
|
9790
|
+
const normalized = attrs.slice();
|
|
9791
|
+
if (!getAttrValue$1(normalized, "href")) normalized.push(["href", href]);
|
|
9792
|
+
if (title != null && !getAttrValue$1(normalized, "title")) normalized.push(["title", title]);
|
|
9793
|
+
return normalized;
|
|
9794
|
+
}
|
|
9704
9795
|
function stringifyTokens(tokens) {
|
|
9705
9796
|
return tokens.map(tokenToRaw).join("");
|
|
9706
9797
|
}
|
|
@@ -9782,9 +9873,12 @@ function parseHtmlInlineCodeToken(token, tokens, i, parseInlineTokens$1, raw, pP
|
|
|
9782
9873
|
}, i + 1];
|
|
9783
9874
|
if (tag === "a") {
|
|
9784
9875
|
const fragment$1 = collectHtmlFragment(tokens, i, tag);
|
|
9876
|
+
const attrs$1 = parseTagAttrs(code$1);
|
|
9785
9877
|
const innerTokens = fragment$1.innerTokens;
|
|
9786
|
-
const
|
|
9787
|
-
const
|
|
9878
|
+
const href = String(getAttrValue$1(attrs$1, "href") ?? "");
|
|
9879
|
+
const titleAttr = getAttrValue$1(attrs$1, "title");
|
|
9880
|
+
const title = titleAttr == null ? null : String(titleAttr);
|
|
9881
|
+
const normalizedAttrs = normalizeLinkAttrs$1(attrs$1, href, title);
|
|
9788
9882
|
const children$1 = innerTokens.length ? parseInlineTokens$1(innerTokens, raw, pPreToken, options) : [];
|
|
9789
9883
|
const textContent = innerTokens.length ? stringifyTokens(innerTokens) : href || "";
|
|
9790
9884
|
if (!children$1.length && textContent) children$1.push({
|
|
@@ -9794,9 +9888,10 @@ function parseHtmlInlineCodeToken(token, tokens, i, parseInlineTokens$1, raw, pP
|
|
|
9794
9888
|
});
|
|
9795
9889
|
return [{
|
|
9796
9890
|
type: "link",
|
|
9797
|
-
href
|
|
9798
|
-
title
|
|
9891
|
+
href,
|
|
9892
|
+
title,
|
|
9799
9893
|
text: textContent,
|
|
9894
|
+
attrs: normalizedAttrs,
|
|
9800
9895
|
children: children$1,
|
|
9801
9896
|
loading: !fragment$1.closed,
|
|
9802
9897
|
raw: fragment$1.html || code$1
|
|
@@ -9929,11 +10024,36 @@ function parseInsertToken(tokens, startIndex, options) {
|
|
|
9929
10024
|
|
|
9930
10025
|
//#endregion
|
|
9931
10026
|
//#region src/parser/inline-parsers/link-parser.ts
|
|
10027
|
+
function toAttrsTuple(attrs) {
|
|
10028
|
+
const tuples = [];
|
|
10029
|
+
if (!Array.isArray(attrs)) return tuples;
|
|
10030
|
+
for (const attr of attrs) {
|
|
10031
|
+
const key = attr?.[0];
|
|
10032
|
+
if (!key) continue;
|
|
10033
|
+
tuples.push([String(key), String(attr?.[1] ?? "")]);
|
|
10034
|
+
}
|
|
10035
|
+
return tuples;
|
|
10036
|
+
}
|
|
10037
|
+
function getAttrValue(attrs, name) {
|
|
10038
|
+
const lowerName = name.toLowerCase();
|
|
10039
|
+
for (let i = attrs.length - 1; i >= 0; i--) {
|
|
10040
|
+
const [key, value] = attrs[i];
|
|
10041
|
+
if (String(key).toLowerCase() === lowerName) return value;
|
|
10042
|
+
}
|
|
10043
|
+
}
|
|
10044
|
+
function normalizeLinkAttrs(attrs, href, title) {
|
|
10045
|
+
const normalized = attrs.slice();
|
|
10046
|
+
if (!getAttrValue(normalized, "href")) normalized.push(["href", href]);
|
|
10047
|
+
if (title != null && !getAttrValue(normalized, "title")) normalized.push(["title", title]);
|
|
10048
|
+
return normalized;
|
|
10049
|
+
}
|
|
9932
10050
|
function parseLinkToken(tokens, startIndex, options) {
|
|
9933
|
-
const
|
|
9934
|
-
const
|
|
9935
|
-
const
|
|
9936
|
-
const
|
|
10051
|
+
const openToken = tokens[startIndex];
|
|
10052
|
+
const attrsTuple = toAttrsTuple(openToken.attrs);
|
|
10053
|
+
const href = String(getAttrValue(attrsTuple, "href") ?? "");
|
|
10054
|
+
const _title = getAttrValue(attrsTuple, "title");
|
|
10055
|
+
const title = _title == null ? null : String(_title);
|
|
10056
|
+
const normalizedAttrs = normalizeLinkAttrs(attrsTuple, href, title);
|
|
9937
10057
|
let i = startIndex + 1;
|
|
9938
10058
|
const linkTokens = [];
|
|
9939
10059
|
let loading = true;
|
|
@@ -9959,7 +10079,8 @@ function parseLinkToken(tokens, startIndex, options) {
|
|
|
9959
10079
|
text: linkText,
|
|
9960
10080
|
children,
|
|
9961
10081
|
raw: String(`[${linkText}](${href}${title ? ` "${title}"` : ""})`),
|
|
9962
|
-
loading
|
|
10082
|
+
loading,
|
|
10083
|
+
attrs: normalizedAttrs
|
|
9963
10084
|
},
|
|
9964
10085
|
nextIndex: i < tokens.length ? i + 1 : tokens.length
|
|
9965
10086
|
};
|
|
@@ -10393,7 +10514,17 @@ function parseInlineTokens(tokens, raw, pPreToken, options) {
|
|
|
10393
10514
|
}
|
|
10394
10515
|
function handleInlineCodeContent(content, _token) {
|
|
10395
10516
|
if (!content.includes("`")) return false;
|
|
10396
|
-
const
|
|
10517
|
+
const findFirstUnescapedBacktick = (src) => {
|
|
10518
|
+
for (let idx = 0; idx < src.length; idx++) {
|
|
10519
|
+
if (src[idx] !== "`") continue;
|
|
10520
|
+
let slashCount = 0;
|
|
10521
|
+
for (let j = idx - 1; j >= 0 && src[j] === "\\"; j--) slashCount++;
|
|
10522
|
+
if (slashCount % 2 === 0) return idx;
|
|
10523
|
+
}
|
|
10524
|
+
return -1;
|
|
10525
|
+
};
|
|
10526
|
+
const codeStart = findFirstUnescapedBacktick(content);
|
|
10527
|
+
if (codeStart === -1) return false;
|
|
10397
10528
|
let runLen = 1;
|
|
10398
10529
|
for (let k = codeStart + 1; k < content.length && content[k] === "`"; k++) runLen++;
|
|
10399
10530
|
const closingSeq = "`".repeat(runLen);
|
|
@@ -10718,7 +10849,7 @@ function parseInlineTokens(tokens, raw, pPreToken, options) {
|
|
|
10718
10849
|
i++;
|
|
10719
10850
|
return;
|
|
10720
10851
|
}
|
|
10721
|
-
if (handleInlineCodeContent(
|
|
10852
|
+
if (handleInlineCodeContent(rawContent, token)) return;
|
|
10722
10853
|
if (handleInlineImageContent(content, token)) return;
|
|
10723
10854
|
if (tokens[i + 1]?.type !== "link_open" && handleInlineLinkContent(content, token)) return;
|
|
10724
10855
|
if (handleEmphasisAndStrikethrough(content, token)) return;
|