chore: update Angular TypeScript build info cache

This commit is contained in:
Bruno Charest 2025-09-28 21:19:15 -04:00
parent 963d0cc323
commit a8b60f87f6
82 changed files with 2378 additions and 410 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,3 @@
import {
withHttpTransferCache
} from "./chunk-QEGKXTBA.js";
import {
CommonModule,
DomAdapter,
@ -8,6 +5,9 @@ import {
getDOM,
setRootDomAdapter
} from "./chunk-NNL7YDF7.js";
import {
withHttpTransferCache
} from "./chunk-QEGKXTBA.js";
import {
XhrFactory,
parseCookieValue

View File

@ -1,118 +1,145 @@
{
"hash": "c37c60be",
"configHash": "1caf38cd",
"lockfileHash": "0f64d2e1",
"browserHash": "67c2b9a3",
"hash": "550e7d4b",
"configHash": "625eb836",
"lockfileHash": "77f35274",
"browserHash": "a276ee59",
"optimized": {
"@angular/common": {
"src": "../../../../../../node_modules/@angular/common/fesm2022/common.mjs",
"file": "@angular_common.js",
"fileHash": "6264f857",
"fileHash": "05936fd0",
"needsInterop": false
},
"@angular/common/http": {
"src": "../../../../../../node_modules/@angular/common/fesm2022/http.mjs",
"file": "@angular_common_http.js",
"fileHash": "d4f0095b",
"fileHash": "7c938c00",
"needsInterop": false
},
"@angular/common/locales/fr": {
"src": "../../../../../../node_modules/@angular/common/locales/fr.js",
"file": "@angular_common_locales_fr.js",
"fileHash": "cf09064a",
"fileHash": "3f6dc116",
"needsInterop": false
},
"@angular/core": {
"src": "../../../../../../node_modules/@angular/core/fesm2022/core.mjs",
"file": "@angular_core.js",
"fileHash": "9394e2f4",
"fileHash": "51703fe3",
"needsInterop": false
},
"@angular/core/rxjs-interop": {
"src": "../../../../../../node_modules/@angular/core/fesm2022/rxjs-interop.mjs",
"file": "@angular_core_rxjs-interop.js",
"fileHash": "078ce53d",
"fileHash": "d9952fa8",
"needsInterop": false
},
"@angular/forms": {
"src": "../../../../../../node_modules/@angular/forms/fesm2022/forms.mjs",
"file": "@angular_forms.js",
"fileHash": "56b31ede",
"fileHash": "2b783004",
"needsInterop": false
},
"@angular/platform-browser": {
"src": "../../../../../../node_modules/@angular/platform-browser/fesm2022/platform-browser.mjs",
"file": "@angular_platform-browser.js",
"fileHash": "de25a4b4",
"fileHash": "330b2f60",
"needsInterop": false
},
"angular-calendar": {
"src": "../../../../../../node_modules/angular-calendar/fesm2022/angular-calendar.mjs",
"file": "angular-calendar.js",
"fileHash": "22aed57a",
"fileHash": "3f18ca62",
"needsInterop": false
},
"angular-calendar/date-adapters/date-fns": {
"src": "../../../../../../node_modules/angular-calendar/date-adapters/esm/date-fns/index.js",
"file": "angular-calendar_date-adapters_date-fns.js",
"fileHash": "2087b111",
"fileHash": "50981191",
"needsInterop": false
},
"highlight.js": {
"src": "../../../../../../node_modules/highlight.js/es/index.js",
"file": "highlight__js.js",
"fileHash": "7fb09d07",
"fileHash": "093a5a02",
"needsInterop": false
},
"markdown-it": {
"src": "../../../../../../node_modules/markdown-it/index.mjs",
"file": "markdown-it.js",
"fileHash": "ccedf405",
"fileHash": "902d4090",
"needsInterop": false
},
"markdown-it-anchor": {
"src": "../../../../../../node_modules/markdown-it-anchor/dist/markdownItAnchor.mjs",
"file": "markdown-it-anchor.js",
"fileHash": "c0a580a1",
"fileHash": "ba1f7b46",
"needsInterop": false
},
"markdown-it-attrs": {
"src": "../../../../../../node_modules/markdown-it-attrs/index.js",
"file": "markdown-it-attrs.js",
"fileHash": "a28c15a6",
"fileHash": "09d13132",
"needsInterop": true
},
"markdown-it-footnote": {
"src": "../../../../../../node_modules/markdown-it-footnote/index.js",
"file": "markdown-it-footnote.js",
"fileHash": "7d35f2e8",
"needsInterop": true
},
"markdown-it-multimd-table": {
"src": "../../../../../../node_modules/markdown-it-multimd-table/index.js",
"file": "markdown-it-multimd-table.js",
"fileHash": "26b36290",
"needsInterop": true
},
"markdown-it-task-lists": {
"src": "../../../../../../node_modules/markdown-it-task-lists/index.js",
"file": "markdown-it-task-lists.js",
"fileHash": "9ac986bf",
"fileHash": "283c7022",
"needsInterop": true
},
"mermaid": {
"src": "../../../../../../node_modules/mermaid/dist/mermaid.core.mjs",
"file": "mermaid.js",
"fileHash": "fee969bf",
"fileHash": "6efe0ec4",
"needsInterop": false
},
"rxjs": {
"src": "../../../../../../node_modules/rxjs/dist/esm5/index.js",
"file": "rxjs.js",
"fileHash": "3f127c6d",
"fileHash": "ff4ac288",
"needsInterop": false
}
},
"chunks": {
"blockDiagram-VD42YOAC-QLCETXLX": {
"file": "blockDiagram-VD42YOAC-QLCETXLX.js"
"diagram-S2PKOQOG-RM7ASWFZ": {
"file": "diagram-S2PKOQOG-RM7ASWFZ.js"
},
"architectureDiagram-VXUJARFQ-K5UZADJM": {
"file": "architectureDiagram-VXUJARFQ-K5UZADJM.js"
"diagram-QEK2KX5R-QLL2LDZJ": {
"file": "diagram-QEK2KX5R-QLL2LDZJ.js"
},
"diagram-PSM6KHXK-XVWEIUTT": {
"file": "diagram-PSM6KHXK-XVWEIUTT.js"
"blockDiagram-VD42YOAC-6W666JF2": {
"file": "blockDiagram-VD42YOAC-6W666JF2.js"
},
"stateDiagram-v2-4FDKWEC3-YF6BIDZS": {
"file": "stateDiagram-v2-4FDKWEC3-YF6BIDZS.js"
"architectureDiagram-VXUJARFQ-7JNJRGGM": {
"file": "architectureDiagram-VXUJARFQ-7JNJRGGM.js"
},
"diagram-PSM6KHXK-3GNQQWOU": {
"file": "diagram-PSM6KHXK-3GNQQWOU.js"
},
"classDiagram-v2-WZHVMYZB-J2EUDOJH": {
"file": "classDiagram-v2-WZHVMYZB-J2EUDOJH.js"
},
"stateDiagram-FKZM4ZOC-JBDO72I4": {
"file": "stateDiagram-FKZM4ZOC-JBDO72I4.js"
},
"stateDiagram-v2-4FDKWEC3-6YULITBX": {
"file": "stateDiagram-v2-4FDKWEC3-6YULITBX.js"
},
"chunk-ZWXGVCUO": {
"file": "chunk-ZWXGVCUO.js"
},
"journeyDiagram-XKPGCS4Q-DRJVBRZY": {
"file": "journeyDiagram-XKPGCS4Q-DRJVBRZY.js"
@ -120,50 +147,47 @@
"timeline-definition-IT6M3QCI-WHNO6URF": {
"file": "timeline-definition-IT6M3QCI-WHNO6URF.js"
},
"mindmap-definition-VGOIOE7T-YG6E4RHT": {
"file": "mindmap-definition-VGOIOE7T-YG6E4RHT.js"
"mindmap-definition-VGOIOE7T-LIQX7OEO": {
"file": "mindmap-definition-VGOIOE7T-LIQX7OEO.js"
},
"kanban-definition-3W4ZIXB7-IDLHJXSC": {
"file": "kanban-definition-3W4ZIXB7-IDLHJXSC.js"
"kanban-definition-3W4ZIXB7-GUMHX2OD": {
"file": "kanban-definition-3W4ZIXB7-GUMHX2OD.js"
},
"sankeyDiagram-TZEHDZUN-GH26R5YW": {
"file": "sankeyDiagram-TZEHDZUN-GH26R5YW.js"
},
"diagram-S2PKOQOG-SBOOCUMA": {
"file": "diagram-S2PKOQOG-SBOOCUMA.js"
"ganttDiagram-LVOFAZNH-HYMY4RKD": {
"file": "ganttDiagram-LVOFAZNH-HYMY4RKD.js"
},
"diagram-QEK2KX5R-QIAHEC3Z": {
"file": "diagram-QEK2KX5R-QIAHEC3Z.js"
"infoDiagram-F6ZHWCRC-HMHRPPWW": {
"file": "infoDiagram-F6ZHWCRC-HMHRPPWW.js"
},
"pieDiagram-ADFJNKIX-B5ITLD23": {
"file": "pieDiagram-ADFJNKIX-B5ITLD23.js"
"pieDiagram-ADFJNKIX-HTPFO6AD": {
"file": "pieDiagram-ADFJNKIX-HTPFO6AD.js"
},
"quadrantDiagram-AYHSOK5B-G2SG5IZD": {
"file": "quadrantDiagram-AYHSOK5B-G2SG5IZD.js"
},
"xychartDiagram-PRI3JC2R-POXCDNLO": {
"file": "xychartDiagram-PRI3JC2R-POXCDNLO.js"
"xychartDiagram-PRI3JC2R-3HCTMHS4": {
"file": "xychartDiagram-PRI3JC2R-3HCTMHS4.js"
},
"requirementDiagram-UZGBJVZJ-OT76XWNT": {
"file": "requirementDiagram-UZGBJVZJ-OT76XWNT.js"
"requirementDiagram-UZGBJVZJ-UYJHC736": {
"file": "requirementDiagram-UZGBJVZJ-UYJHC736.js"
},
"sequenceDiagram-WL72ISMW-HRTSSJHP": {
"file": "sequenceDiagram-WL72ISMW-HRTSSJHP.js"
"sequenceDiagram-WL72ISMW-O3J6HVSP": {
"file": "sequenceDiagram-WL72ISMW-O3J6HVSP.js"
},
"classDiagram-2ON5EDUG-AQUOHNLB": {
"file": "classDiagram-2ON5EDUG-AQUOHNLB.js"
"classDiagram-2ON5EDUG-NO6W7S54": {
"file": "classDiagram-2ON5EDUG-NO6W7S54.js"
},
"classDiagram-v2-WZHVMYZB-AIBAXKPE": {
"file": "classDiagram-v2-WZHVMYZB-AIBAXKPE.js"
"chunk-SOIGDKSE": {
"file": "chunk-SOIGDKSE.js"
},
"chunk-5MNSTNGC": {
"file": "chunk-5MNSTNGC.js"
"info-63CPKGFF-W56KXM6Z": {
"file": "info-63CPKGFF-W56KXM6Z.js"
},
"stateDiagram-FKZM4ZOC-FVHIKWH4": {
"file": "stateDiagram-FKZM4ZOC-FVHIKWH4.js"
},
"chunk-WBFNWS3A": {
"file": "chunk-WBFNWS3A.js"
"packet-HUATNLJX-LCJ3BRNR": {
"file": "packet-HUATNLJX-LCJ3BRNR.js"
},
"pie-WTHONI2E-7JKUTNCJ": {
"file": "pie-WTHONI2E-7JKUTNCJ.js"
@ -180,23 +204,23 @@
"treemap-75Q7IDZK-IP775KCD": {
"file": "treemap-75Q7IDZK-IP775KCD.js"
},
"gitGraphDiagram-NY62KEGX-OS3GW3H5": {
"file": "gitGraphDiagram-NY62KEGX-OS3GW3H5.js"
"gitGraphDiagram-NY62KEGX-DAVBKLGM": {
"file": "gitGraphDiagram-NY62KEGX-DAVBKLGM.js"
},
"chunk-PNW5KFH4": {
"file": "chunk-PNW5KFH4.js"
},
"chunk-ORIZ2BG5": {
"file": "chunk-ORIZ2BG5.js"
},
"chunk-3WIYXQMB": {
"file": "chunk-3WIYXQMB.js"
},
"ganttDiagram-LVOFAZNH-FIW763NA": {
"file": "ganttDiagram-LVOFAZNH-FIW763NA.js"
"chunk-BUI4I457": {
"file": "chunk-BUI4I457.js"
},
"infoDiagram-F6ZHWCRC-URQIBBZD": {
"file": "infoDiagram-F6ZHWCRC-URQIBBZD.js"
},
"chunk-AWNKEY2Y": {
"file": "chunk-AWNKEY2Y.js"
"chunk-CHJ5BV6S": {
"file": "chunk-CHJ5BV6S.js"
},
"chunk-XP22GJHQ": {
"file": "chunk-XP22GJHQ.js"
@ -213,11 +237,14 @@
"chunk-5SXTVVUG": {
"file": "chunk-5SXTVVUG.js"
},
"chunk-WHHJWK6B": {
"file": "chunk-WHHJWK6B.js"
},
"katex-JJTYNRHT": {
"file": "katex-JJTYNRHT.js"
},
"dagre-6UL2VRFP-RAS76HL3": {
"file": "dagre-6UL2VRFP-RAS76HL3.js"
"dagre-6UL2VRFP-C5ASYKFT": {
"file": "dagre-6UL2VRFP-C5ASYKFT.js"
},
"chunk-YUMEK5VY": {
"file": "chunk-YUMEK5VY.js"
@ -225,26 +252,29 @@
"chunk-MEGNL3BT": {
"file": "chunk-MEGNL3BT.js"
},
"chunk-6SIVX7OU": {
"file": "chunk-6SIVX7OU.js"
},
"cose-bilkent-S5V4N54A-5WYXQMNH": {
"file": "cose-bilkent-S5V4N54A-5WYXQMNH.js"
},
"chunk-4434HPF7": {
"file": "chunk-4434HPF7.js"
},
"c4Diagram-YG6GDRKO-G4QDPDWO": {
"file": "c4Diagram-YG6GDRKO-G4QDPDWO.js"
"c4Diagram-YG6GDRKO-DTLV3BK5": {
"file": "c4Diagram-YG6GDRKO-DTLV3BK5.js"
},
"chunk-BETRN5NS": {
"file": "chunk-BETRN5NS.js"
},
"flowDiagram-NV44I4VS-G6X7VBZN": {
"file": "flowDiagram-NV44I4VS-G6X7VBZN.js"
"flowDiagram-NV44I4VS-AJ7AUYT3": {
"file": "flowDiagram-NV44I4VS-AJ7AUYT3.js"
},
"chunk-I4QIIVJ7": {
"file": "chunk-I4QIIVJ7.js"
},
"erDiagram-Q2GNP2WA-SDEYIDBH": {
"file": "erDiagram-Q2GNP2WA-SDEYIDBH.js"
"erDiagram-Q2GNP2WA-JTEYVNF6": {
"file": "erDiagram-Q2GNP2WA-JTEYVNF6.js"
},
"chunk-PLWNSIKB": {
"file": "chunk-PLWNSIKB.js"
@ -252,44 +282,29 @@
"chunk-LHH5RO5K": {
"file": "chunk-LHH5RO5K.js"
},
"info-63CPKGFF-W56KXM6Z": {
"file": "info-63CPKGFF-W56KXM6Z.js"
},
"chunk-BUI4I457": {
"file": "chunk-BUI4I457.js"
},
"packet-HUATNLJX-LCJ3BRNR": {
"file": "packet-HUATNLJX-LCJ3BRNR.js"
},
"chunk-CHJ5BV6S": {
"file": "chunk-CHJ5BV6S.js"
},
"chunk-WHHJWK6B": {
"file": "chunk-WHHJWK6B.js"
},
"chunk-6SIVX7OU": {
"file": "chunk-6SIVX7OU.js"
},
"chunk-BSULYXPT": {
"file": "chunk-BSULYXPT.js"
},
"chunk-B5NQPFQG": {
"file": "chunk-B5NQPFQG.js"
},
"chunk-NGEE2U2J": {
"file": "chunk-NGEE2U2J.js"
},
"chunk-JSZQKJT3": {
"file": "chunk-JSZQKJT3.js"
},
"chunk-EAO6AZLE": {
"file": "chunk-EAO6AZLE.js"
"chunk-SOVT3CA7": {
"file": "chunk-SOVT3CA7.js"
},
"chunk-ZZNURHEZ": {
"file": "chunk-ZZNURHEZ.js"
"chunk-ZCTBDDTS": {
"file": "chunk-ZCTBDDTS.js"
},
"chunk-2HSIUWWJ": {
"file": "chunk-2HSIUWWJ.js"
},
"chunk-2WFBHHKP": {
"file": "chunk-2WFBHHKP.js"
"chunk-JJ4TL56I": {
"file": "chunk-JJ4TL56I.js"
},
"chunk-EUUYHBKV": {
"file": "chunk-EUUYHBKV.js"
@ -297,11 +312,11 @@
"chunk-FTTOYZOY": {
"file": "chunk-FTTOYZOY.js"
},
"chunk-XIFRTXJX": {
"file": "chunk-XIFRTXJX.js"
"chunk-NMWDZEZO": {
"file": "chunk-NMWDZEZO.js"
},
"chunk-SHNTMSU6": {
"file": "chunk-SHNTMSU6.js"
"chunk-QVVRGVV3": {
"file": "chunk-QVVRGVV3.js"
},
"chunk-CMK64ICG": {
"file": "chunk-CMK64ICG.js"
@ -309,21 +324,18 @@
"chunk-BFCVI5XI": {
"file": "chunk-BFCVI5XI.js"
},
"chunk-I65GBZ6F": {
"file": "chunk-I65GBZ6F.js"
},
"chunk-NGEE2U2J": {
"file": "chunk-NGEE2U2J.js"
},
"chunk-M5X7JH4I": {
"file": "chunk-M5X7JH4I.js"
},
"chunk-QEGKXTBA": {
"file": "chunk-QEGKXTBA.js"
"chunk-I65GBZ6F": {
"file": "chunk-I65GBZ6F.js"
},
"chunk-NNL7YDF7": {
"file": "chunk-NNL7YDF7.js"
},
"chunk-QEGKXTBA": {
"file": "chunk-QEGKXTBA.js"
},
"chunk-ZJ25XCV3": {
"file": "chunk-ZJ25XCV3.js"
},

View File

@ -3,32 +3,33 @@ import {
} from "./chunk-PNW5KFH4.js";
import {
parse
} from "./chunk-AWNKEY2Y.js";
} from "./chunk-ORIZ2BG5.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-XP22GJHQ.js";
import "./chunk-NYZY7JGI.js";
import "./chunk-FNEVJCCX.js";
import "./chunk-R33GOAXK.js";
import "./chunk-5SXTVVUG.js";
import {
cytoscape as cytoscape2
} from "./chunk-4434HPF7.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-WHHJWK6B.js";
import "./chunk-6SIVX7OU.js";
import {
cytoscape as cytoscape2
} from "./chunk-4434HPF7.js";
import {
selectSvgElement
} from "./chunk-B5NQPFQG.js";
import "./chunk-NGEE2U2J.js";
import {
createText,
getIconSVG,
registerIconPacks,
unknownIcon
} from "./chunk-XIFRTXJX.js";
} from "./chunk-NMWDZEZO.js";
import {
cleanAndMerge,
getEdgeId
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
clear,
@ -44,13 +45,12 @@ import {
setDiagramTitle,
setupGraphViewbox
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log,
select_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import {
__commonJS,
__spreadProps,
@ -8843,4 +8843,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=architectureDiagram-VXUJARFQ-K5UZADJM.js.map
//# sourceMappingURL=architectureDiagram-VXUJARFQ-7JNJRGGM.js.map

View File

@ -1,12 +1,13 @@
import {
Graph
} from "./chunk-MEGNL3BT.js";
import {
getIconStyles
} from "./chunk-I4QIIVJ7.js";
import {
clone_default
} from "./chunk-6SIVX7OU.js";
import {
getIconStyles
} from "./chunk-I4QIIVJ7.js";
import "./chunk-NGEE2U2J.js";
import {
getLineFunctionsWithOffset
} from "./chunk-2HSIUWWJ.js";
@ -16,12 +17,12 @@ import {
import {
createText,
replaceIconSubstring
} from "./chunk-XIFRTXJX.js";
} from "./chunk-NMWDZEZO.js";
import {
decodeEntities,
getStylesFromArray,
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
channel_default,
@ -35,6 +36,7 @@ import {
rgba_default,
sanitizeText
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
basis_default,
@ -42,8 +44,6 @@ import {
log,
select_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadProps,
__spreadValues
@ -3745,4 +3745,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=blockDiagram-VD42YOAC-QLCETXLX.js.map
//# sourceMappingURL=blockDiagram-VD42YOAC-6W666JF2.js.map

View File

@ -6,7 +6,7 @@ import {
calculateTextHeight,
calculateTextWidth,
wrapLabel
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
require_dist
} from "./chunk-CMK64ICG.js";
@ -21,12 +21,12 @@ import {
setAccDescription,
setAccTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log,
select_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import {
__toESM
} from "./chunk-TKSB4YUA.js";
@ -2593,4 +2593,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=c4Diagram-YG6GDRKO-G4QDPDWO.js.map
//# sourceMappingURL=c4Diagram-YG6GDRKO-DTLV3BK5.js.map

View File

@ -10,13 +10,13 @@ import {
import {
createText,
getIconSVG
} from "./chunk-XIFRTXJX.js";
} from "./chunk-NMWDZEZO.js";
import {
calculateTextWidth,
decodeEntities,
handleUndefinedAttr,
parseFontSize
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
common_default,
defaultConfig_default,
@ -6263,4 +6263,4 @@ export {
clear2,
positionNode
};
//# sourceMappingURL=chunk-2WFBHHKP.js.map
//# sourceMappingURL=chunk-JJ4TL56I.js.map

View File

@ -1,6 +1,6 @@
import {
decodeEntities
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
common_default,
getConfig,
@ -3098,4 +3098,4 @@ export {
replaceIconSubstring,
createText
};
//# sourceMappingURL=chunk-XIFRTXJX.js.map
//# sourceMappingURL=chunk-NMWDZEZO.js.map

View File

@ -70,4 +70,4 @@ var MermaidParseError = (_a = class extends Error {
export {
parse
};
//# sourceMappingURL=chunk-AWNKEY2Y.js.map
//# sourceMappingURL=chunk-ORIZ2BG5.js.map

View File

@ -8,6 +8,10 @@ import {
directiveRegex,
sanitizeDirective
} from "./chunk-BFCVI5XI.js";
import {
memoize_default,
merge_default
} from "./chunk-M5X7JH4I.js";
import {
__name,
basisClosed_default,
@ -33,10 +37,6 @@ import {
stepBefore,
step_default
} from "./chunk-I65GBZ6F.js";
import {
memoize_default,
merge_default
} from "./chunk-M5X7JH4I.js";
import {
__toESM
} from "./chunk-TKSB4YUA.js";
@ -587,4 +587,4 @@ export {
getEdgeId,
handleUndefinedAttr
};
//# sourceMappingURL=chunk-SHNTMSU6.js.map
//# sourceMappingURL=chunk-QVVRGVV3.js.map

View File

@ -10,11 +10,11 @@ import {
import {
getRegisteredLayoutAlgorithm,
render
} from "./chunk-EAO6AZLE.js";
} from "./chunk-SOVT3CA7.js";
import {
getEdgeId,
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
clear,
common_default,
@ -1945,4 +1945,4 @@ export {
styles_default,
classRenderer_v3_unified_default
};
//# sourceMappingURL=chunk-5MNSTNGC.js.map
//# sourceMappingURL=chunk-SOIGDKSE.js.map

View File

@ -3,15 +3,15 @@ import {
insertEdgeLabel,
markers_default,
positionEdgeLabel
} from "./chunk-ZZNURHEZ.js";
} from "./chunk-ZCTBDDTS.js";
import {
insertCluster,
insertNode,
labelHelper
} from "./chunk-2WFBHHKP.js";
} from "./chunk-JJ4TL56I.js";
import {
interpolateToCurve
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
common_default,
getConfig
@ -45,7 +45,7 @@ var registerDefaultLayoutLoaders = __name(() => {
registerLayoutLoaders([
{
name: "dagre",
loader: __name(async () => await import("./dagre-6UL2VRFP-RAS76HL3.js"), "loader")
loader: __name(async () => await import("./dagre-6UL2VRFP-C5ASYKFT.js"), "loader")
},
...true ? [
{
@ -82,4 +82,4 @@ export {
render,
getRegisteredLayoutAlgorithm
};
//# sourceMappingURL=chunk-EAO6AZLE.js.map
//# sourceMappingURL=chunk-SOVT3CA7.js.map

View File

@ -6,7 +6,7 @@ import {
import {
at,
createLabel_default
} from "./chunk-2WFBHHKP.js";
} from "./chunk-JJ4TL56I.js";
import {
getSubGraphTitleMargins
} from "./chunk-EUUYHBKV.js";
@ -16,10 +16,10 @@ import {
} from "./chunk-FTTOYZOY.js";
import {
createText
} from "./chunk-XIFRTXJX.js";
} from "./chunk-NMWDZEZO.js";
import {
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
evaluate,
getConfig2
@ -847,4 +847,4 @@ export {
insertEdge,
markers_default
};
//# sourceMappingURL=chunk-ZZNURHEZ.js.map
//# sourceMappingURL=chunk-ZCTBDDTS.js.map

View File

@ -6,11 +6,11 @@ import {
} from "./chunk-LHH5RO5K.js";
import {
render
} from "./chunk-EAO6AZLE.js";
} from "./chunk-SOVT3CA7.js";
import {
generateId,
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
clear,
common_default,
@ -2015,4 +2015,4 @@ export {
StateDB,
styles_default
};
//# sourceMappingURL=chunk-WBFNWS3A.js.map
//# sourceMappingURL=chunk-ZWXGVCUO.js.map

View File

@ -3,24 +3,24 @@ import {
classDiagram_default,
classRenderer_v3_unified_default,
styles_default
} from "./chunk-5MNSTNGC.js";
} from "./chunk-SOIGDKSE.js";
import "./chunk-I4QIIVJ7.js";
import "./chunk-PLWNSIKB.js";
import "./chunk-LHH5RO5K.js";
import "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
import "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import "./chunk-2WFBHHKP.js";
import "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-SHNTMSU6.js";
import "./chunk-NMWDZEZO.js";
import "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/classDiagram-2ON5EDUG.mjs
@ -41,4 +41,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=classDiagram-2ON5EDUG-AQUOHNLB.js.map
//# sourceMappingURL=classDiagram-2ON5EDUG-NO6W7S54.js.map

View File

@ -3,24 +3,24 @@ import {
classDiagram_default,
classRenderer_v3_unified_default,
styles_default
} from "./chunk-5MNSTNGC.js";
} from "./chunk-SOIGDKSE.js";
import "./chunk-I4QIIVJ7.js";
import "./chunk-PLWNSIKB.js";
import "./chunk-LHH5RO5K.js";
import "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
import "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import "./chunk-2WFBHHKP.js";
import "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-SHNTMSU6.js";
import "./chunk-NMWDZEZO.js";
import "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/classDiagram-v2-WZHVMYZB.mjs
@ -41,4 +41,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=classDiagram-v2-WZHVMYZB-AIBAXKPE.js.map
//# sourceMappingURL=classDiagram-v2-WZHVMYZB-J2EUDOJH.js.map

View File

@ -9,13 +9,14 @@ import {
isUndefined_default,
map_default
} from "./chunk-6SIVX7OU.js";
import "./chunk-NGEE2U2J.js";
import {
clear as clear3,
insertEdge,
insertEdgeLabel,
markers_default,
positionEdgeLabel
} from "./chunk-ZZNURHEZ.js";
} from "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import {
clear,
@ -25,23 +26,22 @@ import {
positionNode,
setNodeElem,
updateNodeBounds
} from "./chunk-2WFBHHKP.js";
} from "./chunk-JJ4TL56I.js";
import {
getSubGraphTitleMargins
} from "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-SHNTMSU6.js";
import "./chunk-NMWDZEZO.js";
import "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
getConfig2
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadProps,
__spreadValues
@ -737,4 +737,4 @@ var render = __name(async (data4Layout, svg) => {
export {
render
};
//# sourceMappingURL=dagre-6UL2VRFP-RAS76HL3.js.map
//# sourceMappingURL=dagre-6UL2VRFP-C5ASYKFT.js.map

View File

@ -3,29 +3,30 @@ import {
} from "./chunk-PNW5KFH4.js";
import {
parse
} from "./chunk-AWNKEY2Y.js";
} from "./chunk-ORIZ2BG5.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-XP22GJHQ.js";
import "./chunk-NYZY7JGI.js";
import "./chunk-FNEVJCCX.js";
import "./chunk-R33GOAXK.js";
import "./chunk-5SXTVVUG.js";
import {
setupViewPortForSVG
} from "./chunk-LHH5RO5K.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-WHHJWK6B.js";
import "./chunk-6SIVX7OU.js";
import {
setupViewPortForSVG
} from "./chunk-LHH5RO5K.js";
import {
selectSvgElement
} from "./chunk-B5NQPFQG.js";
import "./chunk-NGEE2U2J.js";
import {
isLabelStyle,
styles2String
} from "./chunk-FTTOYZOY.js";
import {
cleanAndMerge
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
clear,
@ -39,6 +40,7 @@ import {
setAccTitle,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
format,
@ -48,8 +50,6 @@ import {
select_default,
treemap_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadValues
} from "./chunk-TKSB4YUA.js";
@ -566,4 +566,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=diagram-PSM6KHXK-XVWEIUTT.js.map
//# sourceMappingURL=diagram-PSM6KHXK-3GNQQWOU.js.map

View File

@ -3,22 +3,23 @@ import {
} from "./chunk-PNW5KFH4.js";
import {
parse
} from "./chunk-AWNKEY2Y.js";
} from "./chunk-ORIZ2BG5.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-XP22GJHQ.js";
import "./chunk-NYZY7JGI.js";
import "./chunk-FNEVJCCX.js";
import "./chunk-R33GOAXK.js";
import "./chunk-5SXTVVUG.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-WHHJWK6B.js";
import "./chunk-6SIVX7OU.js";
import {
selectSvgElement
} from "./chunk-B5NQPFQG.js";
import "./chunk-NGEE2U2J.js";
import {
cleanAndMerge
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
clear,
@ -32,12 +33,11 @@ import {
setAccTitle,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadValues
} from "./chunk-TKSB4YUA.js";
@ -337,4 +337,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=diagram-QEK2KX5R-QIAHEC3Z.js.map
//# sourceMappingURL=diagram-QEK2KX5R-QLL2LDZJ.js.map

View File

@ -3,22 +3,23 @@ import {
} from "./chunk-PNW5KFH4.js";
import {
parse
} from "./chunk-AWNKEY2Y.js";
} from "./chunk-ORIZ2BG5.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-XP22GJHQ.js";
import "./chunk-NYZY7JGI.js";
import "./chunk-FNEVJCCX.js";
import "./chunk-R33GOAXK.js";
import "./chunk-5SXTVVUG.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-WHHJWK6B.js";
import "./chunk-6SIVX7OU.js";
import {
selectSvgElement
} from "./chunk-B5NQPFQG.js";
import "./chunk-NGEE2U2J.js";
import {
cleanAndMerge
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
clear,
@ -32,12 +33,11 @@ import {
setAccTitle,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadValues
} from "./chunk-TKSB4YUA.js";
@ -247,4 +247,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=diagram-S2PKOQOG-SBOOCUMA.js.map
//# sourceMappingURL=diagram-S2PKOQOG-RM7ASWFZ.js.map

View File

@ -7,17 +7,17 @@ import {
import {
getRegisteredLayoutAlgorithm,
render
} from "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
} from "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import "./chunk-2WFBHHKP.js";
import "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-NMWDZEZO.js";
import {
getEdgeId,
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
channel_default,
@ -31,13 +31,13 @@ import {
setAccTitle,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__export,
__name,
log,
select_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/erDiagram-Q2GNP2WA.mjs
@ -1272,4 +1272,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=erDiagram-Q2GNP2WA-SDEYIDBH.js.map
//# sourceMappingURL=erDiagram-Q2GNP2WA-JTEYVNF6.js.map

View File

@ -14,19 +14,19 @@ import {
import {
getRegisteredLayoutAlgorithm,
render
} from "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
} from "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import {
isValidShape
} from "./chunk-2WFBHHKP.js";
} from "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-NMWDZEZO.js";
import {
getEdgeId,
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
channel_default,
@ -43,12 +43,12 @@ import {
setConfig2,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log,
select_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadProps,
__spreadValues
@ -2493,4 +2493,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=flowDiagram-NV44I4VS-G6X7VBZN.js.map
//# sourceMappingURL=flowDiagram-NV44I4VS-AJ7AUYT3.js.map

View File

@ -1,6 +1,6 @@
import {
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
require_dist
} from "./chunk-CMK64ICG.js";
@ -16,6 +16,7 @@ import {
setAccTitle,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
axisBottom,
@ -43,7 +44,6 @@ import {
timeTuesday,
timeWednesday
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import {
__commonJS,
__toESM
@ -2436,4 +2436,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=ganttDiagram-LVOFAZNH-FIW763NA.js.map
//# sourceMappingURL=ganttDiagram-LVOFAZNH-HYMY4RKD.js.map

View File

@ -1,26 +1,27 @@
import {
populateCommonDb
} from "./chunk-PNW5KFH4.js";
import {
parse
} from "./chunk-ORIZ2BG5.js";
import {
ImperativeState
} from "./chunk-3WIYXQMB.js";
import {
parse
} from "./chunk-AWNKEY2Y.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-XP22GJHQ.js";
import "./chunk-NYZY7JGI.js";
import "./chunk-FNEVJCCX.js";
import "./chunk-R33GOAXK.js";
import "./chunk-5SXTVVUG.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-WHHJWK6B.js";
import "./chunk-6SIVX7OU.js";
import "./chunk-NGEE2U2J.js";
import {
cleanAndMerge,
random,
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
clear,
@ -36,13 +37,12 @@ import {
setDiagramTitle,
setupGraphViewbox2
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log,
select_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadProps,
__spreadValues
@ -1766,4 +1766,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=gitGraphDiagram-NY62KEGX-OS3GW3H5.js.map
//# sourceMappingURL=gitGraphDiagram-NY62KEGX-DAVBKLGM.js.map

View File

@ -1,13 +1,13 @@
import {
parse
} from "./chunk-AWNKEY2Y.js";
} from "./chunk-ORIZ2BG5.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-XP22GJHQ.js";
import "./chunk-NYZY7JGI.js";
import "./chunk-FNEVJCCX.js";
import "./chunk-R33GOAXK.js";
import "./chunk-5SXTVVUG.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-WHHJWK6B.js";
import "./chunk-6SIVX7OU.js";
import {
@ -16,15 +16,15 @@ import {
import {
selectSvgElement
} from "./chunk-B5NQPFQG.js";
import "./chunk-NGEE2U2J.js";
import {
configureSvgSize
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/infoDiagram-F6ZHWCRC.mjs
@ -57,4 +57,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=infoDiagram-F6ZHWCRC-URQIBBZD.js.map
//# sourceMappingURL=infoDiagram-F6ZHWCRC-HMHRPPWW.js.map

View File

@ -12,11 +12,11 @@ import {
insertCluster,
insertNode,
positionNode
} from "./chunk-2WFBHHKP.js";
} from "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-SHNTMSU6.js";
import "./chunk-NMWDZEZO.js";
import "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
darken_default,
@ -27,11 +27,11 @@ import {
sanitizeText,
setupGraphViewbox
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/kanban-definition-3W4ZIXB7.mjs
@ -1122,4 +1122,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=kanban-definition-3W4ZIXB7-IDLHJXSC.js.map
//# sourceMappingURL=kanban-definition-3W4ZIXB7-GUMHX2OD.js.map

View File

@ -0,0 +1,317 @@
import {
__commonJS
} from "./chunk-TKSB4YUA.js";
// node_modules/markdown-it-footnote/index.js
var require_markdown_it_footnote = __commonJS({
"node_modules/markdown-it-footnote/index.js"(exports, module) {
function render_footnote_anchor_name(tokens, idx, options, env) {
var n = Number(tokens[idx].meta.id + 1).toString();
var prefix = "";
if (typeof env.docId === "string") {
prefix = "-" + env.docId + "-";
}
return prefix + n;
}
function render_footnote_caption(tokens, idx) {
var n = Number(tokens[idx].meta.id + 1).toString();
if (tokens[idx].meta.subId > 0) {
n += ":" + tokens[idx].meta.subId;
}
return "[" + n + "]";
}
function render_footnote_ref(tokens, idx, options, env, slf) {
var id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf);
var caption = slf.rules.footnote_caption(tokens, idx, options, env, slf);
var refid = id;
if (tokens[idx].meta.subId > 0) {
refid += ":" + tokens[idx].meta.subId;
}
return '<sup class="footnote-ref"><a href="#fn' + id + '" id="fnref' + refid + '">' + caption + "</a></sup>";
}
function render_footnote_block_open(tokens, idx, options) {
return (options.xhtmlOut ? '<hr class="footnotes-sep" />\n' : '<hr class="footnotes-sep">\n') + '<section class="footnotes">\n<ol class="footnotes-list">\n';
}
function render_footnote_block_close() {
return "</ol>\n</section>\n";
}
function render_footnote_open(tokens, idx, options, env, slf) {
var id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf);
if (tokens[idx].meta.subId > 0) {
id += ":" + tokens[idx].meta.subId;
}
return '<li id="fn' + id + '" class="footnote-item">';
}
function render_footnote_close() {
return "</li>\n";
}
function render_footnote_anchor(tokens, idx, options, env, slf) {
var id = slf.rules.footnote_anchor_name(tokens, idx, options, env, slf);
if (tokens[idx].meta.subId > 0) {
id += ":" + tokens[idx].meta.subId;
}
return ' <a href="#fnref' + id + '" class="footnote-backref">↩︎</a>';
}
module.exports = function footnote_plugin(md) {
var parseLinkLabel = md.helpers.parseLinkLabel, isSpace = md.utils.isSpace;
md.renderer.rules.footnote_ref = render_footnote_ref;
md.renderer.rules.footnote_block_open = render_footnote_block_open;
md.renderer.rules.footnote_block_close = render_footnote_block_close;
md.renderer.rules.footnote_open = render_footnote_open;
md.renderer.rules.footnote_close = render_footnote_close;
md.renderer.rules.footnote_anchor = render_footnote_anchor;
md.renderer.rules.footnote_caption = render_footnote_caption;
md.renderer.rules.footnote_anchor_name = render_footnote_anchor_name;
function footnote_def(state, startLine, endLine, silent) {
var oldBMark, oldTShift, oldSCount, oldParentType, pos, label, token, initial, offset, ch, posAfterColon, start = state.bMarks[startLine] + state.tShift[startLine], max = state.eMarks[startLine];
if (start + 4 > max) {
return false;
}
if (state.src.charCodeAt(start) !== 91) {
return false;
}
if (state.src.charCodeAt(start + 1) !== 94) {
return false;
}
for (pos = start + 2; pos < max; pos++) {
if (state.src.charCodeAt(pos) === 32) {
return false;
}
if (state.src.charCodeAt(pos) === 93) {
break;
}
}
if (pos === start + 2) {
return false;
}
if (pos + 1 >= max || state.src.charCodeAt(++pos) !== 58) {
return false;
}
if (silent) {
return true;
}
pos++;
if (!state.env.footnotes) {
state.env.footnotes = {};
}
if (!state.env.footnotes.refs) {
state.env.footnotes.refs = {};
}
label = state.src.slice(start + 2, pos - 2);
state.env.footnotes.refs[":" + label] = -1;
token = new state.Token("footnote_reference_open", "", 1);
token.meta = { label };
token.level = state.level++;
state.tokens.push(token);
oldBMark = state.bMarks[startLine];
oldTShift = state.tShift[startLine];
oldSCount = state.sCount[startLine];
oldParentType = state.parentType;
posAfterColon = pos;
initial = offset = state.sCount[startLine] + pos - (state.bMarks[startLine] + state.tShift[startLine]);
while (pos < max) {
ch = state.src.charCodeAt(pos);
if (isSpace(ch)) {
if (ch === 9) {
offset += 4 - offset % 4;
} else {
offset++;
}
} else {
break;
}
pos++;
}
state.tShift[startLine] = pos - posAfterColon;
state.sCount[startLine] = offset - initial;
state.bMarks[startLine] = posAfterColon;
state.blkIndent += 4;
state.parentType = "footnote";
if (state.sCount[startLine] < state.blkIndent) {
state.sCount[startLine] += state.blkIndent;
}
state.md.block.tokenize(state, startLine, endLine, true);
state.parentType = oldParentType;
state.blkIndent -= 4;
state.tShift[startLine] = oldTShift;
state.sCount[startLine] = oldSCount;
state.bMarks[startLine] = oldBMark;
token = new state.Token("footnote_reference_close", "", -1);
token.level = --state.level;
state.tokens.push(token);
return true;
}
function footnote_inline(state, silent) {
var labelStart, labelEnd, footnoteId, token, tokens, max = state.posMax, start = state.pos;
if (start + 2 >= max) {
return false;
}
if (state.src.charCodeAt(start) !== 94) {
return false;
}
if (state.src.charCodeAt(start + 1) !== 91) {
return false;
}
labelStart = start + 2;
labelEnd = parseLinkLabel(state, start + 1);
if (labelEnd < 0) {
return false;
}
if (!silent) {
if (!state.env.footnotes) {
state.env.footnotes = {};
}
if (!state.env.footnotes.list) {
state.env.footnotes.list = [];
}
footnoteId = state.env.footnotes.list.length;
state.md.inline.parse(
state.src.slice(labelStart, labelEnd),
state.md,
state.env,
tokens = []
);
token = state.push("footnote_ref", "", 0);
token.meta = { id: footnoteId };
state.env.footnotes.list[footnoteId] = {
content: state.src.slice(labelStart, labelEnd),
tokens
};
}
state.pos = labelEnd + 1;
state.posMax = max;
return true;
}
function footnote_ref(state, silent) {
var label, pos, footnoteId, footnoteSubId, token, max = state.posMax, start = state.pos;
if (start + 3 > max) {
return false;
}
if (!state.env.footnotes || !state.env.footnotes.refs) {
return false;
}
if (state.src.charCodeAt(start) !== 91) {
return false;
}
if (state.src.charCodeAt(start + 1) !== 94) {
return false;
}
for (pos = start + 2; pos < max; pos++) {
if (state.src.charCodeAt(pos) === 32) {
return false;
}
if (state.src.charCodeAt(pos) === 10) {
return false;
}
if (state.src.charCodeAt(pos) === 93) {
break;
}
}
if (pos === start + 2) {
return false;
}
if (pos >= max) {
return false;
}
pos++;
label = state.src.slice(start + 2, pos - 1);
if (typeof state.env.footnotes.refs[":" + label] === "undefined") {
return false;
}
if (!silent) {
if (!state.env.footnotes.list) {
state.env.footnotes.list = [];
}
if (state.env.footnotes.refs[":" + label] < 0) {
footnoteId = state.env.footnotes.list.length;
state.env.footnotes.list[footnoteId] = { label, count: 0 };
state.env.footnotes.refs[":" + label] = footnoteId;
} else {
footnoteId = state.env.footnotes.refs[":" + label];
}
footnoteSubId = state.env.footnotes.list[footnoteId].count;
state.env.footnotes.list[footnoteId].count++;
token = state.push("footnote_ref", "", 0);
token.meta = { id: footnoteId, subId: footnoteSubId, label };
}
state.pos = pos;
state.posMax = max;
return true;
}
function footnote_tail(state) {
var i, l, j, t, lastParagraph, list, token, tokens, current, currentLabel, insideRef = false, refTokens = {};
if (!state.env.footnotes) {
return;
}
state.tokens = state.tokens.filter(function(tok) {
if (tok.type === "footnote_reference_open") {
insideRef = true;
current = [];
currentLabel = tok.meta.label;
return false;
}
if (tok.type === "footnote_reference_close") {
insideRef = false;
refTokens[":" + currentLabel] = current;
return false;
}
if (insideRef) {
current.push(tok);
}
return !insideRef;
});
if (!state.env.footnotes.list) {
return;
}
list = state.env.footnotes.list;
token = new state.Token("footnote_block_open", "", 1);
state.tokens.push(token);
for (i = 0, l = list.length; i < l; i++) {
token = new state.Token("footnote_open", "", 1);
token.meta = { id: i, label: list[i].label };
state.tokens.push(token);
if (list[i].tokens) {
tokens = [];
token = new state.Token("paragraph_open", "p", 1);
token.block = true;
tokens.push(token);
token = new state.Token("inline", "", 0);
token.children = list[i].tokens;
token.content = list[i].content;
tokens.push(token);
token = new state.Token("paragraph_close", "p", -1);
token.block = true;
tokens.push(token);
} else if (list[i].label) {
tokens = refTokens[":" + list[i].label];
}
if (tokens) state.tokens = state.tokens.concat(tokens);
if (state.tokens[state.tokens.length - 1].type === "paragraph_close") {
lastParagraph = state.tokens.pop();
} else {
lastParagraph = null;
}
t = list[i].count > 0 ? list[i].count : 1;
for (j = 0; j < t; j++) {
token = new state.Token("footnote_anchor", "", 0);
token.meta = { id: i, subId: j, label: list[i].label };
state.tokens.push(token);
}
if (lastParagraph) {
state.tokens.push(lastParagraph);
}
token = new state.Token("footnote_close", "", -1);
state.tokens.push(token);
}
token = new state.Token("footnote_block_close", "", -1);
state.tokens.push(token);
}
md.block.ruler.before("reference", "footnote_def", footnote_def, { alt: ["paragraph", "reference"] });
md.inline.ruler.after("image", "footnote_inline", footnote_inline);
md.inline.ruler.after("footnote_inline", "footnote_ref", footnote_ref);
md.core.ruler.after("inline", "footnote_tail", footnote_tail);
};
}
});
export default require_markdown_it_footnote();
//# sourceMappingURL=markdown-it-footnote.js.map

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,397 @@
import {
__commonJS
} from "./chunk-TKSB4YUA.js";
// node_modules/markdown-it-multimd-table/lib/dfa.js
var require_dfa = __commonJS({
"node_modules/markdown-it-multimd-table/lib/dfa.js"(exports, module) {
"use strict";
function DFA() {
this.__highest_alphabet__ = 0;
this.__match_alphabets__ = {};
this.__initial_state__ = 0;
this.__accept_states__ = {};
this.__transitions__ = {};
this.__actions__ = {};
}
DFA.prototype.set_highest_alphabet = function(alphabet) {
this.__highest_alphabet__ = alphabet;
};
DFA.prototype.set_match_alphabets = function(matches) {
this.__match_alphabets__ = matches;
};
DFA.prototype.set_initial_state = function(initial) {
this.__initial_state__ = initial;
};
DFA.prototype.set_accept_states = function(accepts) {
for (var i = 0; i < accepts.length; i++) {
this.__accept_states__[accepts[i]] = true;
}
};
DFA.prototype.set_transitions = function(transitions) {
this.__transitions__ = transitions;
};
DFA.prototype.set_actions = function(actions) {
this.__actions__ = actions;
};
DFA.prototype.update_transition = function(state, alphabets) {
this.__transitions__[state] = Object.assign(
this.__transitions__[state] || Object(),
alphabets
);
};
DFA.prototype.execute = function(start, end) {
var state, step, alphabet;
for (state = this.__initial_state__, step = start; state && step < end; step++) {
for (alphabet = this.__highest_alphabet__; alphabet > 0; alphabet >>= 4) {
if (state & alphabet && this.__match_alphabets__[alphabet].call(this, step, state, alphabet)) {
break;
}
}
this.__actions__(step, state, alphabet);
if (alphabet === 0) {
break;
}
state = this.__transitions__[state][alphabet] || 0;
}
return !!this.__accept_states__[state];
};
module.exports = DFA;
}
});
// node_modules/markdown-it-multimd-table/index.js
var require_markdown_it_multimd_table = __commonJS({
"node_modules/markdown-it-multimd-table/index.js"(exports, module) {
var DFA = require_dfa();
module.exports = function multimd_table_plugin(md, options) {
var defaults = {
multiline: false,
rowspan: false,
headerless: false,
multibody: true,
autolabel: true
};
options = md.utils.assign({}, defaults, options || {});
function scan_bound_indices(state, line) {
var start = state.bMarks[line] + state.sCount[line], head = state.bMarks[line] + state.blkIndent, end = state.skipSpacesBack(state.eMarks[line], head), bounds = [], pos, posjump, escape = false, code = false, serial = 0;
for (pos = start; pos < end; pos++) {
switch (state.src.charCodeAt(pos)) {
case 92:
escape = true;
break;
case 96:
posjump = state.skipChars(pos, 96) - 1;
if (posjump > pos) {
if (!code) {
if (serial === 0) {
serial = posjump - pos;
} else if (serial === posjump - pos) {
serial = 0;
}
}
pos = posjump;
} else if (code || !escape && !serial) {
code = !code;
}
escape = false;
break;
case 124:
if (!code && !escape) {
bounds.push(pos);
}
escape = false;
break;
default:
escape = false;
break;
}
}
if (bounds.length === 0) return bounds;
if (bounds[0] > head) {
bounds.unshift(head - 1);
}
if (bounds[bounds.length - 1] < end - 1) {
bounds.push(end);
}
return bounds;
}
function table_caption(state, silent, line) {
var meta = { text: null, label: null }, start = state.bMarks[line] + state.sCount[line], max = state.eMarks[line], capRE = /^\[(.+?)\](\[([^\[\]]+)\])?\s*$/, matches = state.src.slice(start, max).match(capRE);
if (!matches) {
return false;
}
if (silent) {
return true;
}
meta.text = matches[1];
if (!options.autolabel && !matches[2]) {
return meta;
}
meta.label = matches[2] || matches[1];
meta.label = meta.label.toLowerCase().replace(/\W+/g, "");
return meta;
}
function table_row(state, silent, line) {
var meta = { bounds: null, multiline: null }, bounds = scan_bound_indices(state, line), start, pos, oldMax;
if (bounds.length < 2) {
return false;
}
if (silent) {
return true;
}
meta.bounds = bounds;
if (options.multiline) {
start = state.bMarks[line] + state.sCount[line];
pos = state.eMarks[line] - 1;
meta.multiline = state.src.charCodeAt(pos) === 92;
if (meta.multiline) {
oldMax = state.eMarks[line];
state.eMarks[line] = state.skipSpacesBack(pos, start);
meta.bounds = scan_bound_indices(state, line);
state.eMarks[line] = oldMax;
}
}
return meta;
}
function table_separator(state, silent, line) {
var meta = { aligns: [], wraps: [] }, bounds = scan_bound_indices(state, line), sepRE = /^:?(-+|=+):?\+?$/, c, text, align;
if (state.sCount[line] - state.blkIndent >= 4) {
return false;
}
if (bounds.length === 0) {
return false;
}
for (c = 0; c < bounds.length - 1; c++) {
text = state.src.slice(bounds[c] + 1, bounds[c + 1]).trim();
if (!sepRE.test(text)) {
return false;
}
meta.wraps.push(
text.charCodeAt(text.length - 1) === 43
/* + */
);
align = (text.charCodeAt(0) === 58) << 4 | text.charCodeAt(text.length - 1 - meta.wraps[c]) === 58;
switch (align) {
case 0:
meta.aligns.push("");
break;
case 1:
meta.aligns.push("right");
break;
case 16:
meta.aligns.push("left");
break;
case 17:
meta.aligns.push("center");
break;
}
}
if (silent) {
return true;
}
return meta;
}
function table_empty(state, silent, line) {
return state.isEmpty(line);
}
function table(state, startLine, endLine, silent) {
var tableDFA = new DFA(), grp = 16, mtr = -1, token, tableToken, trToken, colspan, leftToken, rowspan, upTokens = [], tableLines, tgroupLines, tag, text, range, r, c, b, t, blockState;
if (startLine + 2 > endLine) {
return false;
}
tableToken = new state.Token("table_open", "table", 1);
tableToken.meta = { sep: null, cap: null, tr: [] };
tableDFA.set_highest_alphabet(65536);
tableDFA.set_initial_state(65792);
tableDFA.set_accept_states([65552, 65553, 0]);
tableDFA.set_match_alphabets({
65536: table_caption.bind(this, state, true),
4096: table_separator.bind(this, state, true),
256: table_row.bind(this, state, true),
16: table_row.bind(this, state, true),
1: table_empty.bind(this, state, true)
});
tableDFA.set_transitions({
65792: { 65536: 256, 256: 4352 },
256: { 256: 4352 },
4352: { 4096: 65552, 256: 4352 },
65552: { 65536: 0, 16: 65553 },
65553: { 65536: 0, 16: 65553, 1: 65552 }
});
if (options.headerless) {
tableDFA.set_initial_state(69888);
tableDFA.update_transition(
69888,
{ 65536: 4352, 4096: 65552, 256: 4352 }
);
trToken = new state.Token("tr_placeholder", "tr", 0);
trToken.meta = Object();
}
if (!options.multibody) {
tableDFA.update_transition(
65552,
{ 65536: 0, 16: 65552 }
// 0x10011 is never reached
);
}
tableDFA.set_actions(function(_line, _state, _type) {
switch (_type) {
case 65536:
if (tableToken.meta.cap) {
break;
}
tableToken.meta.cap = table_caption(state, false, _line);
tableToken.meta.cap.map = [_line, _line + 1];
tableToken.meta.cap.first = _line === startLine;
break;
case 4096:
tableToken.meta.sep = table_separator(state, false, _line);
tableToken.meta.sep.map = [_line, _line + 1];
trToken.meta.grp |= 1;
grp = 16;
break;
case 256:
case 16:
trToken = new state.Token("tr_open", "tr", 1);
trToken.map = [_line, _line + 1];
trToken.meta = table_row(state, false, _line);
trToken.meta.type = _type;
trToken.meta.grp = grp;
grp = 0;
tableToken.meta.tr.push(trToken);
if (options.multiline) {
if (trToken.meta.multiline && mtr < 0) {
mtr = tableToken.meta.tr.length - 1;
} else if (!trToken.meta.multiline && mtr >= 0) {
token = tableToken.meta.tr[mtr];
token.meta.mbounds = tableToken.meta.tr.slice(mtr).map(function(tk) {
return tk.meta.bounds;
});
token.map[1] = trToken.map[1];
tableToken.meta.tr = tableToken.meta.tr.slice(0, mtr + 1);
mtr = -1;
}
}
break;
case 1:
trToken.meta.grp |= 1;
grp = 16;
break;
}
});
if (tableDFA.execute(startLine, endLine) === false) {
return false;
}
if (!tableToken.meta.tr.length) {
return false;
}
if (silent) {
return true;
}
tableToken.meta.tr[tableToken.meta.tr.length - 1].meta.grp |= 1;
tableToken.map = tableLines = [startLine, 0];
tableToken.block = true;
tableToken.level = state.level++;
state.tokens.push(tableToken);
if (tableToken.meta.cap) {
token = state.push("caption_open", "caption", 1);
token.map = tableToken.meta.cap.map;
var attrs = [];
var capSide = tableToken.meta.cap.first ? "top" : "bottom";
if (tableToken.meta.cap.label !== null) {
attrs.push(["id", tableToken.meta.cap.label]);
}
if (capSide !== "top") {
attrs.push(["style", "caption-side: " + capSide]);
}
token.attrs = attrs;
token = state.push("inline", "", 0);
token.content = tableToken.meta.cap.text;
token.map = tableToken.meta.cap.map;
token.children = [];
token = state.push("caption_close", "caption", -1);
}
for (r = 0; r < tableToken.meta.tr.length; r++) {
leftToken = new state.Token("td_th_placeholder", "", 0);
trToken = tableToken.meta.tr[r];
if (trToken.meta.grp & 16) {
tag = trToken.meta.type === 256 ? "thead" : "tbody";
token = state.push(tag + "_open", tag, 1);
token.map = tgroupLines = [trToken.map[0], 0];
upTokens = [];
}
trToken.block = true;
trToken.level = state.level++;
state.tokens.push(trToken);
for (c = 0; c < trToken.meta.bounds.length - 1; c++) {
range = [trToken.meta.bounds[c] + 1, trToken.meta.bounds[c + 1]];
text = state.src.slice.apply(state.src, range);
if (text === "") {
colspan = leftToken.attrGet("colspan");
leftToken.attrSet("colspan", colspan === null ? 2 : colspan + 1);
continue;
}
if (options.rowspan && upTokens[c] && text.trim() === "^^") {
rowspan = upTokens[c].attrGet("rowspan");
upTokens[c].attrSet("rowspan", rowspan === null ? 2 : rowspan + 1);
leftToken = new state.Token("td_th_placeholder", "", 0);
continue;
}
tag = trToken.meta.type === 256 ? "th" : "td";
token = state.push(tag + "_open", tag, 1);
token.map = trToken.map;
token.attrs = [];
if (tableToken.meta.sep.aligns[c]) {
token.attrs.push(["style", "text-align:" + tableToken.meta.sep.aligns[c]]);
}
if (tableToken.meta.sep.wraps[c]) {
token.attrs.push(["class", "extend"]);
}
leftToken = upTokens[c] = token;
if (options.multiline && trToken.meta.multiline && trToken.meta.mbounds) {
text = new Array(trToken.map[0]).fill("").concat([text.trimRight()]);
for (b = 1; b < trToken.meta.mbounds.length; b++) {
if (c > trToken.meta.mbounds[b].length - 2) {
continue;
}
range = [trToken.meta.mbounds[b][c] + 1, trToken.meta.mbounds[b][c + 1]];
text.push(state.src.slice.apply(state.src, range).trimRight());
}
blockState = new state.md.block.State(text.join("\n"), state.md, state.env, []);
blockState.level = trToken.level + 1;
state.md.block.tokenize(blockState, trToken.map[0], blockState.lineMax);
for (t = 0; t < blockState.tokens.length; t++) {
state.tokens.push(blockState.tokens[t]);
}
} else {
token = state.push("inline", "", 0);
token.content = text.trim();
token.map = trToken.map;
token.level = trToken.level + 1;
token.children = [];
}
token = state.push(tag + "_close", tag, -1);
}
state.push("tr_close", "tr", -1);
if (trToken.meta.grp & 1) {
tag = trToken.meta.type === 256 ? "thead" : "tbody";
token = state.push(tag + "_close", tag, -1);
tgroupLines[1] = trToken.map[1];
}
}
tableLines[1] = Math.max(
tgroupLines[1],
tableToken.meta.sep.map[1],
tableToken.meta.cap ? tableToken.meta.cap.map[1] : -1
);
token = state.push("table_close", "table", -1);
state.line = tableLines[1];
return true;
}
md.block.ruler.at("table", table, { alt: ["paragraph", "reference"] });
};
}
});
export default require_markdown_it_multimd_table();
//# sourceMappingURL=markdown-it-multimd-table.js.map

File diff suppressed because one or more lines are too long

View File

@ -4,22 +4,25 @@ import {
import {
selectSvgElement
} from "./chunk-B5NQPFQG.js";
import {
isEmpty_default
} from "./chunk-NGEE2U2J.js";
import {
JSON_SCHEMA,
load
} from "./chunk-JSZQKJT3.js";
import {
registerLayoutLoaders
} from "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
} from "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import "./chunk-2WFBHHKP.js";
import "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import {
dedent,
registerIconPacks
} from "./chunk-XIFRTXJX.js";
} from "./chunk-NMWDZEZO.js";
import {
cleanAndMerge,
decodeEntities,
@ -27,7 +30,7 @@ import {
isDetailedError,
removeDirectives,
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
UnknownDiagramError,
@ -54,16 +57,13 @@ import {
themes_default,
updateSiteConfig
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log,
select_default,
setLogLevel
} from "./chunk-I65GBZ6F.js";
import {
isEmpty_default
} from "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadProps,
__spreadValues
@ -426,7 +426,7 @@ var detector = __name((txt) => {
return /^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(txt);
}, "detector");
var loader = __name(async () => {
const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-G4QDPDWO.js");
const { diagram: diagram2 } = await import("./c4Diagram-YG6GDRKO-DTLV3BK5.js");
return { id, diagram: diagram2 };
}, "loader");
var plugin = {
@ -443,7 +443,7 @@ var detector2 = __name((txt, config) => {
return /^\s*graph/.test(txt);
}, "detector");
var loader2 = __name(async () => {
const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-G6X7VBZN.js");
const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-AJ7AUYT3.js");
return { id: id2, diagram: diagram2 };
}, "loader");
var plugin2 = {
@ -466,7 +466,7 @@ var detector3 = __name((txt, config) => {
return /^\s*flowchart/.test(txt);
}, "detector");
var loader3 = __name(async () => {
const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-G6X7VBZN.js");
const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-AJ7AUYT3.js");
return { id: id3, diagram: diagram2 };
}, "loader");
var plugin3 = {
@ -480,7 +480,7 @@ var detector4 = __name((txt) => {
return /^\s*erDiagram/.test(txt);
}, "detector");
var loader4 = __name(async () => {
const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-SDEYIDBH.js");
const { diagram: diagram2 } = await import("./erDiagram-Q2GNP2WA-JTEYVNF6.js");
return { id: id4, diagram: diagram2 };
}, "loader");
var plugin4 = {
@ -494,7 +494,7 @@ var detector5 = __name((txt) => {
return /^\s*gitGraph/.test(txt);
}, "detector");
var loader5 = __name(async () => {
const { diagram: diagram2 } = await import("./gitGraphDiagram-NY62KEGX-OS3GW3H5.js");
const { diagram: diagram2 } = await import("./gitGraphDiagram-NY62KEGX-DAVBKLGM.js");
return { id: id5, diagram: diagram2 };
}, "loader");
var plugin5 = {
@ -508,7 +508,7 @@ var detector6 = __name((txt) => {
return /^\s*gantt/.test(txt);
}, "detector");
var loader6 = __name(async () => {
const { diagram: diagram2 } = await import("./ganttDiagram-LVOFAZNH-FIW763NA.js");
const { diagram: diagram2 } = await import("./ganttDiagram-LVOFAZNH-HYMY4RKD.js");
return { id: id6, diagram: diagram2 };
}, "loader");
var plugin6 = {
@ -522,7 +522,7 @@ var detector7 = __name((txt) => {
return /^\s*info/.test(txt);
}, "detector");
var loader7 = __name(async () => {
const { diagram: diagram2 } = await import("./infoDiagram-F6ZHWCRC-URQIBBZD.js");
const { diagram: diagram2 } = await import("./infoDiagram-F6ZHWCRC-HMHRPPWW.js");
return { id: id7, diagram: diagram2 };
}, "loader");
var info = {
@ -535,7 +535,7 @@ var detector8 = __name((txt) => {
return /^\s*pie/.test(txt);
}, "detector");
var loader8 = __name(async () => {
const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-B5ITLD23.js");
const { diagram: diagram2 } = await import("./pieDiagram-ADFJNKIX-HTPFO6AD.js");
return { id: id8, diagram: diagram2 };
}, "loader");
var pie = {
@ -562,7 +562,7 @@ var detector10 = __name((txt) => {
return /^\s*xychart(-beta)?/.test(txt);
}, "detector");
var loader10 = __name(async () => {
const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-POXCDNLO.js");
const { diagram: diagram2 } = await import("./xychartDiagram-PRI3JC2R-3HCTMHS4.js");
return { id: id10, diagram: diagram2 };
}, "loader");
var plugin8 = {
@ -576,7 +576,7 @@ var detector11 = __name((txt) => {
return /^\s*requirement(Diagram)?/.test(txt);
}, "detector");
var loader11 = __name(async () => {
const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-OT76XWNT.js");
const { diagram: diagram2 } = await import("./requirementDiagram-UZGBJVZJ-UYJHC736.js");
return { id: id11, diagram: diagram2 };
}, "loader");
var plugin9 = {
@ -590,7 +590,7 @@ var detector12 = __name((txt) => {
return /^\s*sequenceDiagram/.test(txt);
}, "detector");
var loader12 = __name(async () => {
const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-HRTSSJHP.js");
const { diagram: diagram2 } = await import("./sequenceDiagram-WL72ISMW-O3J6HVSP.js");
return { id: id12, diagram: diagram2 };
}, "loader");
var plugin10 = {
@ -607,7 +607,7 @@ var detector13 = __name((txt, config) => {
return /^\s*classDiagram/.test(txt);
}, "detector");
var loader13 = __name(async () => {
const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-AQUOHNLB.js");
const { diagram: diagram2 } = await import("./classDiagram-2ON5EDUG-NO6W7S54.js");
return { id: id13, diagram: diagram2 };
}, "loader");
var plugin11 = {
@ -624,7 +624,7 @@ var detector14 = __name((txt, config) => {
return /^\s*classDiagram-v2/.test(txt);
}, "detector");
var loader14 = __name(async () => {
const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-AIBAXKPE.js");
const { diagram: diagram2 } = await import("./classDiagram-v2-WZHVMYZB-J2EUDOJH.js");
return { id: id14, diagram: diagram2 };
}, "loader");
var plugin12 = {
@ -641,7 +641,7 @@ var detector15 = __name((txt, config) => {
return /^\s*stateDiagram/.test(txt);
}, "detector");
var loader15 = __name(async () => {
const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-FVHIKWH4.js");
const { diagram: diagram2 } = await import("./stateDiagram-FKZM4ZOC-JBDO72I4.js");
return { id: id15, diagram: diagram2 };
}, "loader");
var plugin13 = {
@ -661,7 +661,7 @@ var detector16 = __name((txt, config) => {
return false;
}, "detector");
var loader16 = __name(async () => {
const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-YF6BIDZS.js");
const { diagram: diagram2 } = await import("./stateDiagram-v2-4FDKWEC3-6YULITBX.js");
return { id: id16, diagram: diagram2 };
}, "loader");
var plugin14 = {
@ -742,7 +742,7 @@ var detector18 = __name((txt, config = {}) => {
return false;
}, "detector");
var loader18 = __name(async () => {
const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-G6X7VBZN.js");
const { diagram: diagram2 } = await import("./flowDiagram-NV44I4VS-AJ7AUYT3.js");
return { id: id18, diagram: diagram2 };
}, "loader");
var plugin16 = {
@ -770,7 +770,7 @@ var detector20 = __name((txt) => {
return /^\s*mindmap/.test(txt);
}, "detector");
var loader20 = __name(async () => {
const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-YG6E4RHT.js");
const { diagram: diagram2 } = await import("./mindmap-definition-VGOIOE7T-LIQX7OEO.js");
return { id: id20, diagram: diagram2 };
}, "loader");
var plugin18 = {
@ -784,7 +784,7 @@ var detector21 = __name((txt) => {
return /^\s*kanban/.test(txt);
}, "detector");
var loader21 = __name(async () => {
const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-IDLHJXSC.js");
const { diagram: diagram2 } = await import("./kanban-definition-3W4ZIXB7-GUMHX2OD.js");
return { id: id21, diagram: diagram2 };
}, "loader");
var plugin19 = {
@ -812,7 +812,7 @@ var detector23 = __name((txt) => {
return /^\s*packet(-beta)?/.test(txt);
}, "detector");
var loader23 = __name(async () => {
const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-SBOOCUMA.js");
const { diagram: diagram2 } = await import("./diagram-S2PKOQOG-RM7ASWFZ.js");
return { id: id23, diagram: diagram2 };
}, "loader");
var packet = {
@ -825,7 +825,7 @@ var detector24 = __name((txt) => {
return /^\s*radar-beta/.test(txt);
}, "detector");
var loader24 = __name(async () => {
const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-QIAHEC3Z.js");
const { diagram: diagram2 } = await import("./diagram-QEK2KX5R-QLL2LDZJ.js");
return { id: id24, diagram: diagram2 };
}, "loader");
var radar = {
@ -838,7 +838,7 @@ var detector25 = __name((txt) => {
return /^\s*block(-beta)?/.test(txt);
}, "detector");
var loader25 = __name(async () => {
const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-QLCETXLX.js");
const { diagram: diagram2 } = await import("./blockDiagram-VD42YOAC-6W666JF2.js");
return { id: id25, diagram: diagram2 };
}, "loader");
var plugin21 = {
@ -852,7 +852,7 @@ var detector26 = __name((txt) => {
return /^\s*architecture/.test(txt);
}, "detector");
var loader26 = __name(async () => {
const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-K5UZADJM.js");
const { diagram: diagram2 } = await import("./architectureDiagram-VXUJARFQ-7JNJRGGM.js");
return { id: id26, diagram: diagram2 };
}, "loader");
var architecture = {
@ -866,7 +866,7 @@ var detector27 = __name((txt) => {
return /^\s*treemap/.test(txt);
}, "detector");
var loader27 = __name(async () => {
const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-XVWEIUTT.js");
const { diagram: diagram2 } = await import("./diagram-PSM6KHXK-3GNQQWOU.js");
return { id: id27, diagram: diagram2 };
}, "loader");
var treemap = {

View File

@ -7,14 +7,14 @@ import {
import {
getRegisteredLayoutAlgorithm,
render
} from "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
} from "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import "./chunk-2WFBHHKP.js";
import "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-SHNTMSU6.js";
import "./chunk-NMWDZEZO.js";
import "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
darken_default,
@ -25,11 +25,11 @@ import {
lighten_default,
sanitizeText
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/uuid/dist/esm-browser/regex.js
@ -1486,4 +1486,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=mindmap-definition-VGOIOE7T-YG6E4RHT.js.map
//# sourceMappingURL=mindmap-definition-VGOIOE7T-LIQX7OEO.js.map

View File

@ -3,23 +3,24 @@ import {
} from "./chunk-PNW5KFH4.js";
import {
parse
} from "./chunk-AWNKEY2Y.js";
} from "./chunk-ORIZ2BG5.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-XP22GJHQ.js";
import "./chunk-NYZY7JGI.js";
import "./chunk-FNEVJCCX.js";
import "./chunk-R33GOAXK.js";
import "./chunk-5SXTVVUG.js";
import "./chunk-BUI4I457.js";
import "./chunk-CHJ5BV6S.js";
import "./chunk-WHHJWK6B.js";
import "./chunk-6SIVX7OU.js";
import {
selectSvgElement
} from "./chunk-B5NQPFQG.js";
import "./chunk-NGEE2U2J.js";
import {
cleanAndMerge,
parseFontSize
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
clear,
@ -33,6 +34,7 @@ import {
setAccTitle,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
arc_default,
@ -40,8 +42,6 @@ import {
ordinal,
pie_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/pieDiagram-ADFJNKIX.mjs
@ -225,4 +225,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=pieDiagram-ADFJNKIX-B5ITLD23.js.map
//# sourceMappingURL=pieDiagram-ADFJNKIX-HTPFO6AD.js.map

View File

@ -7,16 +7,16 @@ import {
import {
getRegisteredLayoutAlgorithm,
render
} from "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
} from "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import "./chunk-2WFBHHKP.js";
import "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-NMWDZEZO.js";
import {
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
clear,
@ -28,12 +28,12 @@ import {
setAccTitle,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__export,
__name,
log
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/requirementDiagram-UZGBJVZJ.mjs
@ -1263,4 +1263,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=requirementDiagram-UZGBJVZJ-OT76XWNT.js.map
//# sourceMappingURL=requirementDiagram-UZGBJVZJ-UYJHC736.js.map

View File

@ -17,7 +17,7 @@ import {
ZERO_WIDTH_SPACE,
parseFontSize,
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import {
require_dist
} from "./chunk-CMK64ICG.js";
@ -41,12 +41,12 @@ import {
setConfig2,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
log,
select_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import {
__spreadProps,
__spreadValues,
@ -4004,4 +4004,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=sequenceDiagram-WL72ISMW-HRTSSJHP.js.map
//# sourceMappingURL=sequenceDiagram-WL72ISMW-O3J6HVSP.js.map

View File

@ -2,26 +2,27 @@ import {
StateDB,
stateDiagram_default,
styles_default
} from "./chunk-WBFNWS3A.js";
} from "./chunk-ZWXGVCUO.js";
import {
layout
} from "./chunk-YUMEK5VY.js";
import {
Graph
} from "./chunk-MEGNL3BT.js";
import "./chunk-6SIVX7OU.js";
import "./chunk-PLWNSIKB.js";
import "./chunk-LHH5RO5K.js";
import "./chunk-6SIVX7OU.js";
import "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import "./chunk-2WFBHHKP.js";
import "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-NMWDZEZO.js";
import {
utils_default
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
common_default,
@ -29,6 +30,7 @@ import {
getConfig2,
getUrl
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
basis_default,
@ -36,8 +38,6 @@ import {
log,
select_default
} from "./chunk-I65GBZ6F.js";
import "./chunk-NGEE2U2J.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/stateDiagram-FKZM4ZOC.mjs
@ -490,4 +490,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=stateDiagram-FKZM4ZOC-FVHIKWH4.js.map
//# sourceMappingURL=stateDiagram-FKZM4ZOC-JBDO72I4.js.map

View File

@ -3,23 +3,23 @@ import {
stateDiagram_default,
stateRenderer_v3_unified_default,
styles_default
} from "./chunk-WBFNWS3A.js";
} from "./chunk-ZWXGVCUO.js";
import "./chunk-PLWNSIKB.js";
import "./chunk-LHH5RO5K.js";
import "./chunk-EAO6AZLE.js";
import "./chunk-ZZNURHEZ.js";
import "./chunk-SOVT3CA7.js";
import "./chunk-ZCTBDDTS.js";
import "./chunk-2HSIUWWJ.js";
import "./chunk-2WFBHHKP.js";
import "./chunk-JJ4TL56I.js";
import "./chunk-EUUYHBKV.js";
import "./chunk-FTTOYZOY.js";
import "./chunk-XIFRTXJX.js";
import "./chunk-SHNTMSU6.js";
import "./chunk-NMWDZEZO.js";
import "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/stateDiagram-v2-4FDKWEC3.mjs
@ -40,4 +40,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=stateDiagram-v2-4FDKWEC3-YF6BIDZS.js.map
//# sourceMappingURL=stateDiagram-v2-4FDKWEC3-6YULITBX.js.map

View File

@ -3,10 +3,10 @@ import {
} from "./chunk-B5NQPFQG.js";
import {
computeDimensionOfText
} from "./chunk-XIFRTXJX.js";
} from "./chunk-NMWDZEZO.js";
import {
cleanAndMerge
} from "./chunk-SHNTMSU6.js";
} from "./chunk-QVVRGVV3.js";
import "./chunk-CMK64ICG.js";
import {
clear,
@ -22,6 +22,7 @@ import {
setAccTitle,
setDiagramTitle
} from "./chunk-BFCVI5XI.js";
import "./chunk-M5X7JH4I.js";
import {
__name,
band,
@ -29,7 +30,6 @@ import {
linear,
log
} from "./chunk-I65GBZ6F.js";
import "./chunk-M5X7JH4I.js";
import "./chunk-TKSB4YUA.js";
// node_modules/mermaid/dist/chunks/mermaid.core/xychartDiagram-PRI3JC2R.mjs
@ -1913,4 +1913,4 @@ var diagram = {
export {
diagram
};
//# sourceMappingURL=xychartDiagram-PRI3JC2R-POXCDNLO.js.map
//# sourceMappingURL=xychartDiagram-PRI3JC2R-3HCTMHS4.js.map

View File

@ -1,8 +1,8 @@
{
"hash": "8eb8ef6f",
"hash": "0356a024",
"configHash": "9e47cd39",
"lockfileHash": "0f64d2e1",
"browserHash": "c75f806d",
"lockfileHash": "77f35274",
"browserHash": "24be409e",
"optimized": {},
"chunks": {}
}

39
Todo.md
View File

@ -1,23 +1,20 @@
# Missing Features / Limitations
* [X] **Heading varieties** : No support for Setext headings (`===`/`---` underlines), optional closing `#`, heading IDs with duplicate handling, nor preservation of a top-level `h1` (current logic drops the first `#` heading unconditionally).
* [X] **Paragraph semantics** : Paragraph building treats every non-empty line as a `<p>` and inserts `<br>` between, breaking standard markdown rules about blank lines, lazy continuation lines, and container blocks (lists, blockquotes).
* [X] **List handling** : Regex conversion expects isolated list lines and wraps each `<li>` in its own `<ul>`/`<ol>`, so multi-line items, nested lists, tight/loose spacing, ordered list numbering, and bullet-marker variations (`+`, `-`, `*`) are all mis-rendered. Task list logic converts any single line but cannot coexist with proper list structure.
* [ ] **Blockquotes** : Generic blockquote replacement only grabs one line after `>`, losing nested content, lazy continuations, and mixed blocks (e.g., lists inside blockquotes).
* [ ] **Emphasis rules** : Simple replacements for `*`/`**`/`~~` ignore underscores, intraword emphasis rules, nesting, escaping, or edge cases like `***bold and italic***`.
* [ ] **Inline code spans** : Handles only single-line ``code`` sequences and does not honor backtick escapes, trim rules, or multiple backtick fences.
* [ ] **Links & images** : Only processes inline destination syntax with absolute URLs. Missing relative path support, reference-style links (`[ref][]`), angle-bracket autolinks `<https://>`, image titles without URL, and no differentiation between external and internal links beyond scheme check.
* [ ] **Reference definitions** : No parsing for link/image reference definitions at block level (`[id]: URL "title"`), so references cannot resolve.
* [ ] **Footnotes & definitions** : Lacks footnote syntax (`[^1]`) and corresponding rendering.
* [ ] **Tables (GFM extensions)** : Only pipe tables supported. Missing support for inline markdown within cells, row spans, or text alignment fallback when separators are malformed.
* [ ] **Code blocks** : Indented code blocks (4 spaces) not detected; fenced blocks limited to triple backticks, no tilde fences (`~~~`), info string handling is case-sensitive, and language fallback doesnt respect GFM spec (e.g., unrecognized language should leave raw text).
* [ ] **HTML blocks/inlines** : Raw HTML either stripped or double-escaped; theres no logic to allow HTML blocks or disallowed raw HTML rules from GFM.
* [ ] **Escaping** : Backslash escapes for punctuation, entity references, and escaping special characters are unsupported;
escapeHtml() only runs on select segments.
* [ ] **Hard/soft line breaks** : Treats every newline as `<br>`, ignoring two-space hard break convention and soft break behavior.
* [ ] **Math/LaTeX** : `$$…$$` replaced with a static placeholder; inline math `$…$`, `\(` `\)` not handled.
* [ ] **Frontmatter** : YAML frontmatter stripping not present; if notes contain `---` blocks at top they flow into paragraph logic.
* [ ] **Metadata parsing** : No support for Obsidian wiki-links `[[Note]]` (only attachments) or block references (`^block-id`), tags inside frontmatter, or embedded queries.
* [ ] **Performance/robustness** : Repeated global regex replacements can introduce double-wrapping, miss overlapping patterns, and make escaping fragile. Lacking overall markdown parsing state leads to conflicts (e.g., `#hashtag` inside code blocks already removed via placeholder but inline code restoration may still break hashtags).
* [ ] **Internationalization** : slugify() strips non-word characters, removing accents rather than transliterating; may produce empty IDs for non-Latin headings.
* [x] **Heading varieties** : No support for Setext headings (`===` /`---` underlines), optional closing `#` , heading IDs with duplicate handling, nor preservation of a top-level `h1` (current logic drops the first `#` heading unconditionally).
* [x] **Paragraph semantics** : Paragraph building treats every non-empty line as a `<p>` and inserts `<br>` between, breaking standard markdown rules about blank lines, lazy continuation lines, and container blocks (lists, blockquotes).
* [x] **List handling** : Regex conversion expects isolated list lines and wraps each `<li>` in its own `<ul>` /`<ol>` , so multi-line items, nested lists, tight/loose spacing, ordered list numbering, and bullet-marker variations (`+` , `-` , `*` ) are all mis-rendered. Task list logic converts any single line but cannot coexist with proper list structure.
* [x] **Blockquotes** : Generic blockquote replacement only grabs one line after `>` , losing nested content, lazy continuations, and mixed blocks (e.g., lists inside blockquotes).
* [x] **Emphasis rules** : Simple replacements for `*` /`**` /`~~` ignore underscores, intraword emphasis rules, nesting, escaping, or edge cases like `***bold and italic***` .
* [x] **Links & images** : Only processes inline destination syntax with absolute URLs. Missing relative path support, reference-style links (`[ref][]` ), angle-bracket autolinks `<https://>` , image titles without URL, and no differentiation between external and internal links beyond scheme check.
* [x] **Reference definitions** : No parsing for link/image reference definitions at block level (`[id]: URL "title"` ), so references cannot resolve.
* [x] **Footnotes & definitions** : Lacks footnote syntax (`[^1]` ) and corresponding rendering.
* [x] **HTML blocks/inlines** : Raw HTML either stripped or double-escaped; theres no logic to allow HTML blocks or disallowed raw HTML rules from GFM.
* [x] **Escaping** : Backslash escapes for punctuation, entity references, and escaping special characters are unsupported;\n  escapeHtml() only runs on select segments.
* [x] **Hard/soft line breaks** : Treats every newline as `<br>` , ignoring two-space hard break convention and soft break behavior.
* [x] **Performance/robustness** : Repeated global regex replacements can introduce double-wrapping, miss overlapping patterns, and make escaping fragile. Lacking overall markdown parsing state leads to conflicts (e.g., `#hashtag` inside code blocks already removed via placeholder but inline code restoration may still break hashtags).
* [x] **Inline code spans** : Handles only single-line ``code`` sequences and does not honor backtick escapes, trim rules, or multiple backtick fences.
* [x] **Tables (GFM extensions)** : Only pipe tables supported. Missing support for inline markdown within cells, row spans, or text alignment fallback when separators are malformed.
* [x] **Code blocks** : Indented code blocks (4 spaces) not detected; fenced blocks limited to triple backticks, no tilde fences (`~~~`), info string handling is case-sensitive, and language fallback doesnt respect GFM spec (e.g., unrecognized language should leave raw text).
* [x] **Math/LaTeX** : `$$…$$` replaced with a static placeholder; inline math `$…$`, `\(` `\)` not handled.
* [x] **Frontmatter** : YAML frontmatter stripping not present; if notes contain `---` blocks at top they flow into paragraph logic.
* [x] **Internationalization** : slugify() strips non-word characters, removing accents rather than transliterating; may produce empty IDs for non-Latin headings.

455
head_app.component.ts Normal file
View File

@ -0,0 +1,455 @@
import { Component, ChangeDetectionStrategy, inject, signal, computed, effect, ElementRef, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
// Services
import { VaultService } from './services/vault.service';
import { MarkdownService } from './services/markdown.service';
// Components
import { FileExplorerComponent } from './components/file-explorer/file-explorer.component';
import { NoteViewerComponent } from './components/note-viewer/note-viewer.component';
import { GraphViewComponent } from './components/graph-view/graph-view.component';
import { TagsViewComponent } from './components/tags-view/tags-view.component';
import { MarkdownCalendarComponent } from './components/markdown-calendar/markdown-calendar.component';
// Types
import { FileMetadata, Note, TagInfo, VaultNode } from './types';
interface TocEntry {
level: number;
text: string;
id: string;
}
@Component({
selector: 'app-root',
imports: [
CommonModule,
FormsModule,
FileExplorerComponent,
NoteViewerComponent,
GraphViewComponent,
TagsViewComponent,
MarkdownCalendarComponent,
],
templateUrl: './app.component.simple.html',
styleUrls: ['./app.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class AppComponent implements OnDestroy {
private vaultService = inject(VaultService);
private markdownService = inject(MarkdownService);
private elementRef = inject(ElementRef);
// --- State Signals ---
isDarkMode = signal<boolean>(true);
isSidebarOpen = signal<boolean>(true);
isOutlineOpen = signal<boolean>(true);
activeView = signal<'files' | 'graph' | 'tags' | 'search' | 'calendar'>('files');
selectedNoteId = signal<string>('');
sidebarSearchTerm = signal<string>('');
tableOfContents = signal<TocEntry[]>([]);
leftSidebarWidth = signal<number>(288);
rightSidebarWidth = signal<number>(288);
readonly LEFT_MIN_WIDTH = 220;
readonly LEFT_MAX_WIDTH = 520;
readonly RIGHT_MIN_WIDTH = 220;
readonly RIGHT_MAX_WIDTH = 520;
private viewportWidth = signal<number>(typeof window !== 'undefined' ? window.innerWidth : 0);
private resizeHandler = () => {
if (typeof window === 'undefined') {
return;
}
this.viewportWidth.set(window.innerWidth);
};
isDesktopView = computed<boolean>(() => this.viewportWidth() >= 1024);
private wasDesktop = false;
calendarResults = signal<FileMetadata[]>([]);
calendarSearchState = signal<'idle' | 'loading' | 'error'>('idle');
calendarSearchError = signal<string | null>(null);
calendarSelectionLabel = signal<string | null>(null);
calendarOverlayVisible = computed<boolean>(() =>
this.calendarSearchState() === 'loading' ||
!!this.calendarSearchError() ||
this.calendarResults().length > 0
);
private calendarSearchTriggered = false;
// --- Data Signals ---
fileTree = this.vaultService.fileTree;
graphData = this.vaultService.graphData;
allTags = this.vaultService.tags;
vaultName = this.vaultService.vaultName;
// --- Computed Signals ---
selectedNote = computed<Note | undefined>(() => {
const id = this.selectedNoteId();
return id ? this.vaultService.getNoteById(id) : undefined;
});
renderedNoteContent = computed<string>(() => {
const note = this.selectedNote();
if (!note) return '';
const allNotes = this.vaultService.allNotes();
return this.markdownService.render(note.content, allNotes, note);
});
selectedNoteBreadcrumb = computed<string[]>(() => {
const note = this.selectedNote();
if (!note) {
return [];
}
const vaultTitle = this.vaultName().trim();
const breadcrumb: string[] = [vaultTitle || 'Vault'];
const pathSegments = note.originalPath.split('/').filter(Boolean);
if (pathSegments.length === 0) {
breadcrumb.push(note.fileName.replace(/\.md$/i, ''));
return breadcrumb;
}
const displaySegments = [...pathSegments];
displaySegments[displaySegments.length - 1] = note.fileName.replace(/\.md$/i, '');
return breadcrumb.concat(displaySegments);
});
filteredTags = computed<TagInfo[]>(() => {
const term = this.sidebarSearchTerm().trim().toLowerCase();
const cleanedTerm = term.startsWith('#') ? term.slice(1) : term;
if (!cleanedTerm) return this.allTags();
return this.allTags().filter(tag => tag.name.toLowerCase().includes(cleanedTerm));
});
filteredFileTree = computed<VaultNode[]>(() => {
const term = this.sidebarSearchTerm().trim().toLowerCase();
if (!term || term.startsWith('#')) return this.fileTree();
// Simple flat search for files
return this.fileTree().filter(node => node.type === 'file' && node.name.toLowerCase().includes(term));
});
activeTagFilter = computed<string | null>(() => {
const rawTerm = this.sidebarSearchTerm().trim();
if (!rawTerm.startsWith('#')) {
return null;
}
const tag = rawTerm.slice(1).trim();
return tag ? tag.toLowerCase() : null;
});
searchResults = computed<Note[]>(() => {
const notes = this.vaultService.allNotes();
const tagFilter = this.activeTagFilter();
if (tagFilter) {
return notes.filter(note => note.tags.some(tag => tag.toLowerCase() === tagFilter));
}
const term = this.sidebarSearchTerm().trim().toLowerCase();
if (!term) return [];
const cleanedTerm = term.startsWith('#') ? term.slice(1) : term;
return notes.filter(note =>
note.title.toLowerCase().includes(cleanedTerm) ||
note.content.toLowerCase().includes(cleanedTerm) ||
note.tags.some(tag => tag.toLowerCase().includes(cleanedTerm))
);
});
constructor() {
if (typeof window !== 'undefined') {
window.addEventListener('resize', this.resizeHandler, { passive: true });
}
this.wasDesktop = this.isDesktopView();
if (!this.isDesktopView()) {
this.isSidebarOpen.set(false);
this.isOutlineOpen.set(false);
}
// Effect to update the DOM with the dark class
effect(() => {
if (this.isDarkMode()) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
});
effect(() => {
const isDesktop = this.isDesktopView();
if (isDesktop && !this.wasDesktop) {
this.isSidebarOpen.set(true);
this.isOutlineOpen.set(true);
}
if (!isDesktop && this.wasDesktop) {
this.isSidebarOpen.set(false);
this.isOutlineOpen.set(false);
}
this.wasDesktop = isDesktop;
});
// Effect to generate Table of Contents when the note changes
effect(() => {
const html = this.renderedNoteContent();
if (html && this.selectedNote()) {
this.generateToc(html);
} else {
this.tableOfContents.set([]);
}
});
effect(() => {
if (typeof document === 'undefined') {
return;
}
const vaultTitle = this.vaultName().trim();
document.title = `ObsiWatcher - ${vaultTitle || 'Vault'}`;
});
// Effect to select first available note when vault data loads
effect(() => {
const notes = this.vaultService.allNotes();
const currentId = this.selectedNoteId();
if (!notes.length) {
return;
}
const currentExists = notes.some(note => note.id === currentId);
if (!currentExists) {
const firstNote = notes[0];
this.vaultService.ensureFolderOpen(firstNote.originalPath);
this.selectedNoteId.set(firstNote.id);
}
});
}
ngOnDestroy(): void {
if (typeof window !== 'undefined') {
window.removeEventListener('resize', this.resizeHandler);
}
}
// --- Methods ---
toggleTheme(): void {
this.isDarkMode.update(value => !value);
}
toggleSidebar(): void {
this.isSidebarOpen.update(value => !value);
}
closeSidebar(): void {
this.isSidebarOpen.set(false);
}
toggleSidebarTo(state: boolean): void {
this.isSidebarOpen.set(state);
}
toggleOutline(): void {
this.isOutlineOpen.update(value => !value);
}
closeOutlinePanel(): void {
this.isOutlineOpen.set(false);
}
toggleOutlineTo(state: boolean): void {
this.isOutlineOpen.set(state);
}
isDesktop(): boolean {
return this.isDesktopView();
}
onCalendarResultsChange(files: FileMetadata[]): void {
this.calendarResults.set(files);
if (this.calendarSearchTriggered || files.length > 0 || this.activeView() === 'search') {
this.isSidebarOpen.set(true);
this.activeView.set('search');
this.calendarSearchTriggered = false;
}
}
onCalendarSearchStateChange(state: 'idle' | 'loading' | 'error'): void {
this.calendarSearchState.set(state);
if (state === 'loading') {
this.calendarSearchTriggered = true;
}
}
onCalendarSearchErrorChange(message: string | null): void {
this.calendarSearchError.set(message);
if (message) {
this.isSidebarOpen.set(true);
this.activeView.set('search');
this.calendarSearchTriggered = false;
}
}
onCalendarSelectionSummaryChange(summary: string | null): void {
this.calendarSelectionLabel.set(summary);
}
onCalendarRequestSearchPanel(): void {
if (this.activeView() === 'calendar') {
if (!this.isSidebarOpen()) {
this.isSidebarOpen.set(true);
}
return;
}
this.isSidebarOpen.set(true);
this.activeView.set('search');
}
startLeftResize(event: PointerEvent): void {
if (!this.isSidebarOpen()) {
this.isSidebarOpen.set(true);
}
event.preventDefault();
const handle = event.currentTarget as HTMLElement | null;
handle?.setPointerCapture(event.pointerId);
const startX = event.clientX;
const startWidth = this.leftSidebarWidth();
const moveHandler = (moveEvent: PointerEvent) => {
const delta = moveEvent.clientX - startX;
let newWidth = startWidth + delta;
newWidth = Math.max(this.LEFT_MIN_WIDTH, Math.min(this.LEFT_MAX_WIDTH, newWidth));
this.leftSidebarWidth.set(newWidth);
};
const cleanup = () => {
window.removeEventListener('pointermove', moveHandler);
window.removeEventListener('pointerup', cleanup);
window.removeEventListener('pointercancel', cleanup);
if (handle && handle.hasPointerCapture?.(event.pointerId)) {
handle.releasePointerCapture(event.pointerId);
}
handle?.removeEventListener('lostpointercapture', cleanup);
};
window.addEventListener('pointermove', moveHandler);
window.addEventListener('pointerup', cleanup);
window.addEventListener('pointercancel', cleanup);
handle?.addEventListener('lostpointercapture', cleanup);
}
startRightResize(event: PointerEvent): void {
if (!this.isOutlineOpen()) {
this.isOutlineOpen.set(true);
}
event.preventDefault();
const handle = event.currentTarget as HTMLElement | null;
handle?.setPointerCapture(event.pointerId);
const startX = event.clientX;
const startWidth = this.rightSidebarWidth();
const moveHandler = (moveEvent: PointerEvent) => {
const delta = moveEvent.clientX - startX;
let newWidth = startWidth - delta;
newWidth = Math.max(this.RIGHT_MIN_WIDTH, Math.min(this.RIGHT_MAX_WIDTH, newWidth));
this.rightSidebarWidth.set(newWidth);
};
const cleanup = () => {
window.removeEventListener('pointermove', moveHandler);
window.removeEventListener('pointerup', cleanup);
window.removeEventListener('pointercancel', cleanup);
if (handle && handle.hasPointerCapture?.(event.pointerId)) {
handle.releasePointerCapture(event.pointerId);
}
handle?.removeEventListener('lostpointercapture', cleanup);
};
window.addEventListener('pointermove', moveHandler);
window.addEventListener('pointerup', cleanup);
window.addEventListener('pointercancel', cleanup);
handle?.addEventListener('lostpointercapture', cleanup);
}
setView(view: 'files' | 'graph' | 'tags' | 'search' | 'calendar'): void {
this.activeView.set(view);
this.sidebarSearchTerm.set('');
}
selectNote(noteId: string): void {
const note = this.vaultService.getNoteById(noteId);
if (!note) {
return;
}
this.vaultService.ensureFolderOpen(note.originalPath);
this.selectedNoteId.set(note.id);
if (!this.isDesktopView() && this.activeView() === 'search') {
this.isSidebarOpen.set(false);
}
}
handleTagClick(tagName: string): void {
const normalized = tagName.replace(/^#/, '').trim();
if (!normalized) {
return;
}
this.setView('search');
this.sidebarSearchTerm.set(`#${normalized}`);
}
clearTagFilter(): void {
this.sidebarSearchTerm.set('');
}
clearCalendarResults(): void {
this.calendarResults.set([]);
this.calendarSearchState.set('idle');
this.calendarSearchError.set(null);
this.calendarSelectionLabel.set(null);
this.calendarSearchTriggered = false;
}
updateSearchTerm(term: string, focusSearch = false): void {
this.sidebarSearchTerm.set(term ?? '');
if (focusSearch || (term && term.trim().length > 0)) {
this.activeView.set('search');
}
}
private generateToc(html: string): void {
const toc: TocEntry[] = [];
const parser = new DOMParser();
const doc = parser.parseFromString(html, 'text/html');
const headings = doc.querySelectorAll('h1, h2, h3, h4, h5, h6');
headings.forEach(heading => {
if (heading.id && heading.textContent) {
toc.push({
level: parseInt(heading.tagName.substring(1), 10),
text: heading.textContent,
id: heading.id
});
}
});
this.tableOfContents.set(toc);
}
scrollToHeading(id: string): void {
// The note viewer component's content area is what scrolls
const contentArea = (this.elementRef.nativeElement as HTMLElement).querySelector('.note-content-area');
if(contentArea) {
const element = contentArea.querySelector(`#${id}`);
if (element) {
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}
}
}

179
package-lock.json generated
View File

@ -25,10 +25,14 @@
"markdown-it": "^14.1.0",
"markdown-it-anchor": "^8.6.7",
"markdown-it-attrs": "^4.3.1",
"markdown-it-footnote": "^3.0.3",
"markdown-it-mathjax3": "^5.1.0",
"markdown-it-multimd-table": "^4.2.3",
"markdown-it-task-lists": "^2.1.1",
"mermaid": "^11.12.0",
"rxjs": "^7.8.2",
"tailwindcss": "^3.4.14",
"transliteration": "^2.3.5",
"type-fest": "^5.0.1"
},
"devDependencies": {
@ -7136,6 +7140,27 @@
"markdown-it": ">= 9.0.0"
}
},
"node_modules/markdown-it-footnote": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/markdown-it-footnote/-/markdown-it-footnote-3.0.3.tgz",
"integrity": "sha512-YZMSuCGVZAjzKMn+xqIco9d1cLGxbELHZ9do/TSYVzraooV8ypsppKNmUJ0fVH5ljkCInQAtFpm8Rb3eXSrt5w==",
"license": "MIT"
},
"node_modules/markdown-it-mathjax3": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-5.1.0.tgz",
"integrity": "sha512-J72CXe8N1wOwUOn/zcR9tiIG+HDPI9GiE0GXlgnIFULf8TfTbnGLr1/ty74etwNgxBwp+U5znV8hTJVBM2txfQ==",
"license": "MIT",
"dependencies": {
"mathxyjax3": "^0.5.0"
}
},
"node_modules/markdown-it-multimd-table": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/markdown-it-multimd-table/-/markdown-it-multimd-table-4.2.3.tgz",
"integrity": "sha512-KepCr2OMJqm7IT6sOIbuqHGe+NERhgy66XMrc5lo6dHW7oaPzMDtYwR1EGwK16/blb6mCSg4jqityOe0o/H7HA==",
"license": "MIT"
},
"node_modules/markdown-it-task-lists": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/markdown-it-task-lists/-/markdown-it-task-lists-2.1.1.tgz",
@ -7163,6 +7188,12 @@
"node": ">= 0.4"
}
},
"node_modules/mathxyjax3": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mathxyjax3/-/mathxyjax3-0.5.1.tgz",
"integrity": "sha512-f0kVJBoCvl9MVmRjvtH3GorXYv2wTcn6WQ+Mh4NGs2i+Ew0zq8w7P7l0r6TgFu8hRYN7Do/02Wt/Mi0xIYn8XQ==",
"license": "MIT"
},
"node_modules/mdurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz",
@ -8631,6 +8662,15 @@
"integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
"license": "Apache-2.0"
},
"node_modules/require-directory": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
@ -9645,6 +9685,145 @@
"node": ">=0.6"
}
},
"node_modules/transliteration": {
"version": "2.3.5",
"resolved": "https://registry.npmjs.org/transliteration/-/transliteration-2.3.5.tgz",
"integrity": "sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw==",
"license": "MIT",
"dependencies": {
"yargs": "^17.5.1"
},
"bin": {
"slugify": "dist/bin/slugify",
"transliterate": "dist/bin/transliterate"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/transliteration/node_modules/ansi-regex": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/transliteration/node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/transliteration/node_modules/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
"license": "ISC",
"dependencies": {
"string-width": "^4.2.0",
"strip-ansi": "^6.0.1",
"wrap-ansi": "^7.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/transliteration/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"license": "MIT"
},
"node_modules/transliteration/node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
"license": "MIT",
"engines": {
"node": ">=8"
}
},
"node_modules/transliteration/node_modules/string-width": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
"license": "MIT",
"dependencies": {
"emoji-regex": "^8.0.0",
"is-fullwidth-code-point": "^3.0.0",
"strip-ansi": "^6.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/transliteration/node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
"license": "MIT",
"dependencies": {
"ansi-regex": "^5.0.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/transliteration/node_modules/wrap-ansi": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/transliteration/node_modules/yargs": {
"version": "17.7.2",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"license": "MIT",
"dependencies": {
"cliui": "^8.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
"require-directory": "^2.1.1",
"string-width": "^4.2.3",
"y18n": "^5.0.5",
"yargs-parser": "^21.1.1"
},
"engines": {
"node": ">=12"
}
},
"node_modules/transliteration/node_modules/yargs-parser": {
"version": "21.1.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"license": "ISC",
"engines": {
"node": ">=12"
}
},
"node_modules/ts-dedent": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",

View File

@ -6,7 +6,8 @@
"scripts": {
"dev": "ng serve",
"build": "ng build",
"preview": "ng serve --configuration=production"
"preview": "ng serve --configuration=production",
"test:markdown": "node --loader ts-node/esm --test src/services/markdown.service.spec.ts"
},
"dependencies": {
"@angular/build": "^20.3.0",
@ -26,10 +27,14 @@
"markdown-it": "^14.1.0",
"markdown-it-anchor": "^8.6.7",
"markdown-it-attrs": "^4.3.1",
"markdown-it-footnote": "^3.0.3",
"markdown-it-mathjax3": "^5.1.0",
"markdown-it-multimd-table": "^4.2.3",
"markdown-it-task-lists": "^2.1.1",
"mermaid": "^11.12.0",
"rxjs": "^7.8.2",
"tailwindcss": "^3.4.14",
"transliteration": "^2.3.5",
"type-fest": "^5.0.1"
},
"devDependencies": {

5
scripts/check-table.ts Normal file
View File

@ -0,0 +1,5 @@
import { MarkdownService } from '../src/services/markdown.service.js';
const service = new MarkdownService();
const html = service.render(`| Syntax | Description |\n| --- | --- |\n| **bold** | \`code\` |\n`, []);
console.log(html);

View File

@ -448,7 +448,7 @@
}
</button>
</div>
<div class="relative w-full max-w-2xl lg:max-w-3xl">
<div class="relative w-full lg:flex-1 lg:max-w-none lg:min-w-0">
<svg class="pointer-events-none absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-obs-l-text-muted dark:text-obs-d-text-muted" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" /></svg>
<input
type="text"

View File

@ -370,7 +370,7 @@
</button>
</div>
<div class="flex flex-1 items-center gap-3">
<div class="relative w-full max-w-2xl lg:max-w-3xl">
<div class="relative w-full flex-1 min-w-0">
<svg class="pointer-events-none absolute left-3 top-1/2 h-5 w-5 -translate-y-1/2 text-obs-l-text-muted dark:text-obs-d-text-muted" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" /></svg>
<input
type="text"
@ -398,6 +398,7 @@
[noteHtmlContent]="renderedNoteContent()"
(noteLinkClicked)="selectNote($event)"
(tagClicked)="handleTagClick($event)"
(wikiLinkActivated)="handleWikiLink($event)"
></app-note-viewer>
} @else {
<div class="flex h-full items-center justify-center">

View File

@ -1,14 +1,13 @@
import { Component, ChangeDetectionStrategy, inject, signal, computed, effect, ElementRef, OnDestroy } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
// Services
import { VaultService } from './services/vault.service';
import { MarkdownService } from './services/markdown.service';
// Components
import { FileExplorerComponent } from './components/file-explorer/file-explorer.component';
import { NoteViewerComponent } from './components/note-viewer/note-viewer.component';
import { NoteViewerComponent, WikiLinkActivation } from './components/note-viewer/note-viewer.component';
import { GraphViewComponent } from './components/graph-view/graph-view.component';
import { TagsViewComponent } from './components/tags-view/tags-view.component';
import { MarkdownCalendarComponent } from './components/markdown-calendar/markdown-calendar.component';
@ -78,6 +77,7 @@ export class AppComponent implements OnDestroy {
this.calendarResults().length > 0
);
private calendarSearchTriggered = false;
private pendingWikiNavigation = signal<{ noteId: string; heading?: string; block?: string } | null>(null);
// --- Data Signals ---
fileTree = this.vaultService.fileTree;
@ -203,6 +203,24 @@ export class AppComponent implements OnDestroy {
}
});
effect(() => {
const pending = this.pendingWikiNavigation();
const activeNoteId = this.selectedNoteId();
const html = this.renderedNoteContent();
if (!pending || pending.noteId !== activeNoteId || !html) {
return;
}
queueMicrotask(() => {
if (pending.heading) {
this.scrollToHeading(pending.heading);
} else if (pending.block) {
this.scrollToBlock(pending.block);
}
this.pendingWikiNavigation.set(null);
});
});
effect(() => {
if (typeof document === 'undefined') {
return;
@ -396,27 +414,6 @@ export class AppComponent implements OnDestroy {
}
}
handleTagClick(tagName: string): void {
const normalized = tagName.replace(/^#/, '').trim();
if (!normalized) {
return;
}
this.setView('search');
this.sidebarSearchTerm.set(`#${normalized}`);
}
clearTagFilter(): void {
this.sidebarSearchTerm.set('');
}
clearCalendarResults(): void {
this.calendarResults.set([]);
this.calendarSearchState.set('idle');
this.calendarSearchError.set(null);
this.calendarSelectionLabel.set(null);
this.calendarSearchTriggered = false;
}
updateSearchTerm(term: string, focusSearch = false): void {
this.sidebarSearchTerm.set(term ?? '');
if (focusSearch || (term && term.trim().length > 0)) {
@ -424,6 +421,26 @@ export class AppComponent implements OnDestroy {
}
}
handleWikiLink(link: WikiLinkActivation): void {
const target = link.target?.trim();
if (!target) {
return;
}
const note = this.resolveWikiTarget(target);
if (!note) {
console.warn('[ObsiViewer] Wiki link target not found:', link);
return;
}
this.pendingWikiNavigation.set({
noteId: note.id,
heading: link.heading,
block: link.block
});
this.selectNote(note.id);
}
private generateToc(html: string): void {
const toc: TocEntry[] = [];
const parser = new DOMParser();
@ -431,25 +448,101 @@ export class AppComponent implements OnDestroy {
const headings = doc.querySelectorAll('h1, h2, h3, h4, h5, h6');
headings.forEach(heading => {
if (heading.id && heading.textContent) {
toc.push({
level: parseInt(heading.tagName.substring(1), 10),
text: heading.textContent,
id: heading.id
});
if (!heading.id || !heading.textContent) {
return;
}
toc.push({
level: parseInt(heading.tagName.substring(1), 10),
text: heading.textContent,
id: heading.id
});
});
this.tableOfContents.set(toc);
}
scrollToHeading(id: string): void {
// The note viewer component's content area is what scrolls
private scrollToHeading(id: string): void {
const contentArea = (this.elementRef.nativeElement as HTMLElement).querySelector('.note-content-area');
if(contentArea) {
const element = contentArea.querySelector(`#${id}`);
if (!contentArea) {
return;
}
const element = contentArea.querySelector(`#${id}`);
if (element) {
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}
private scrollToBlock(blockId: string | undefined): void {
if (!blockId) {
return;
}
const contentArea = (this.elementRef.nativeElement as HTMLElement).querySelector('.note-content-area');
if (!contentArea) {
return;
}
const selectors = [`[data-block-id="${blockId}"]`, `#${blockId}`];
for (const selector of selectors) {
const element = contentArea.querySelector(selector);
if (element) {
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
break;
}
}
}
private resolveWikiTarget(rawTarget: string): Note | undefined {
const normalized = rawTarget.trim();
if (!normalized) {
return undefined;
}
const lower = normalized.toLowerCase();
const slug = this.slugifyForWiki(normalized);
const normalizedPath = this.normalizePath(normalized);
const notes = this.vaultService.allNotes();
return notes.find(note => {
const title = note.title?.trim() ?? '';
const titleLower = title.toLowerCase();
const titleSlug = this.slugifyForWiki(title);
const fileBase = note.fileName.replace(/\.md$/i, '').trim();
const fileLower = fileBase.toLowerCase();
const filePathNormalized = this.normalizePath(fileBase);
const originalPath = this.normalizePath(note.originalPath);
const aliasMatch = Array.isArray(note.frontmatter?.aliases) && (note.frontmatter.aliases as string[]).some(alias => {
const trimmed = alias.trim();
const aliasLower = trimmed.toLowerCase();
return aliasLower === lower || this.slugifyForWiki(trimmed) === slug;
});
return (
note.id === lower ||
note.id === slug ||
titleLower === lower ||
titleSlug === slug ||
fileLower === lower ||
filePathNormalized === normalizedPath ||
originalPath === normalizedPath ||
aliasMatch
);
});
}
private slugifyForWiki(value: string): string {
return value
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.toLowerCase()
.replace(/[^a-z0-9\s-]/g, '')
.trim()
.replace(/\s+/g, '-');
}
private normalizePath(path: string): string {
return path
.replace(/\\/g, '/')
.replace(/\.md$/i, '')
.replace(/^\/+/, '')
.toLowerCase();
}
}

View File

@ -6,8 +6,27 @@ import mermaid, { MermaidConfig, RenderResult } from 'mermaid';
type MermaidLib = typeof mermaid;
type MathJaxInstance = {
tex2chtml(math: string, options: { display: boolean }): HTMLElement;
startup: {
promise: Promise<void>;
document: {
clear(): void;
updateDocument(): void;
};
};
};
type MetadataEntryType = 'text' | 'date' | 'email' | 'url' | 'number' | 'boolean' | 'image' | 'list' | 'object';
export interface WikiLinkActivation {
target: string;
heading?: string;
headingText?: string;
block?: string;
alias: string;
}
interface MetadataEntry {
key: string;
label: string;
@ -129,6 +148,7 @@ export class NoteViewerComponent implements OnDestroy {
note = input.required<Note>();
noteHtmlContent = input.required<string>();
noteLinkClicked = output<string>();
wikiLinkActivated = output<WikiLinkActivation>();
tagClicked = output<string>();
private readonly elementRef = inject(ElementRef<HTMLElement>);
@ -140,6 +160,8 @@ export class NoteViewerComponent implements OnDestroy {
private mermaidRenderScheduled = false;
private mermaidLoader: Promise<MermaidLib> | null = null;
private mermaidLib: MermaidLib | null = null;
private mathRenderScheduled = false;
private mathJaxLoader: Promise<MathJaxInstance> | null = null;
private readonly dateFormatter = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' });
private readonly metadataKeysToExclude = new Set(['tags', 'tag', 'keywords']);
private attachmentErrorCleanup: (() => void) | null = null;
@ -208,6 +230,7 @@ export class NoteViewerComponent implements OnDestroy {
this.noteHtmlContent();
this.scheduleMermaidRender();
this.scheduleAttachmentHandlers();
this.scheduleMathRender();
});
afterNextRender(() => {
@ -245,12 +268,31 @@ export class NoteViewerComponent implements OnDestroy {
} else if (noteTitle) {
this.noteLinkClicked.emit(noteTitle.toLowerCase().replace(/\s+/g, '-'));
}
return;
}
const wikiAnchor = target.closest('a.md-wiki-link') as HTMLAnchorElement | null;
if (wikiAnchor) {
event.preventDefault();
const targetValue = wikiAnchor.getAttribute('data-target') ?? '';
const headingSlug = wikiAnchor.getAttribute('data-heading') ?? undefined;
const headingText = wikiAnchor.getAttribute('data-heading-text') ?? undefined;
const blockRef = wikiAnchor.getAttribute('data-block') ?? undefined;
this.wikiLinkActivated.emit({
target: targetValue,
heading: headingSlug || undefined,
headingText: headingText || undefined,
block: blockRef || undefined,
alias: wikiAnchor.textContent?.trim() ?? targetValue
});
return;
}
});
this.setupMermaidObservation();
this.scheduleMermaidRender();
this.scheduleAttachmentHandlers();
this.scheduleMathRender();
});
}
@ -259,10 +301,22 @@ export class NoteViewerComponent implements OnDestroy {
this.mermaidObserver = null;
this.mermaidLib = null;
this.mermaidLoader = null;
this.mathJaxLoader = null;
this.attachmentErrorCleanup?.();
this.attachmentErrorCleanup = null;
}
private scheduleMathRender(): void {
if (this.mathRenderScheduled) {
return;
}
this.mathRenderScheduled = true;
queueMicrotask(() => {
this.mathRenderScheduled = false;
this.renderMathExpressions();
});
}
getFrontmatterKeys(frontmatter: { [key: string]: any }): string[] {
return Object.keys(frontmatter).filter(key => key !== 'tags' && key !== 'aliases' && key !== 'mtime');
}
@ -449,6 +503,43 @@ export class NoteViewerComponent implements OnDestroy {
});
}
private async renderMathExpressions(): Promise<void> {
if (typeof window === 'undefined') {
return;
}
const hostElement = this.elementRef.nativeElement as HTMLElement;
const mathElements = Array.from(hostElement.querySelectorAll<HTMLElement>('.md-math-inline, .md-math-block'));
const pending = mathElements.filter(element => element.dataset.math && element.dataset.mathProcessed !== 'true');
if (!pending.length) {
return;
}
try {
const mathJax = await this.ensureMathJax();
for (const element of pending) {
const expression = element.dataset.math ?? '';
if (!expression.trim()) {
continue;
}
const display = element.classList.contains('md-math-block');
try {
const rendered = mathJax.tex2chtml(expression, { display });
element.innerHTML = '';
element.appendChild(rendered);
element.setAttribute('data-math-processed', 'true');
} catch (error) {
console.error('MathJax render error:', error);
element.textContent = expression;
}
}
mathJax.startup.document.clear();
mathJax.startup.document.updateDocument();
} catch (error) {
console.error('Unable to initialise MathJax:', error);
}
}
private decodeMermaidSource(encoded: string): string {
try {
return decodeURIComponent(encoded);
@ -464,6 +555,80 @@ export class NoteViewerComponent implements OnDestroy {
.replace(/>/g, '&gt;');
}
private ensureMathJax(): Promise<MathJaxInstance> {
if (typeof window === 'undefined') {
return Promise.reject(new Error('MathJax requires a browser environment.'));
}
const globalWithMathJax = window as unknown as {
MathJax?: MathJaxInstance & { startup: { promise: Promise<void> } };
_mathJaxLoading?: boolean;
};
if (globalWithMathJax.MathJax) {
return globalWithMathJax.MathJax.startup.promise.then(() => globalWithMathJax.MathJax as MathJaxInstance);
}
if (this.mathJaxLoader) {
return this.mathJaxLoader;
}
this.mathJaxLoader = new Promise<MathJaxInstance>((resolve, reject) => {
if (globalWithMathJax._mathJaxLoading) {
const interval = window.setInterval(() => {
if (globalWithMathJax.MathJax) {
window.clearInterval(interval);
globalWithMathJax.MathJax.startup.promise.then(() => resolve(globalWithMathJax.MathJax as MathJaxInstance));
}
}, 30);
return;
}
globalWithMathJax._mathJaxLoading = true;
(window as any).MathJax = {
startup: {
typeset: false
},
tex: {
inlineMath: [['$', '$'], ['\\(', '\\)']],
displayMath: [['$$', '$$'], ['\\[', '\\]']],
processEscapes: true
},
options: {
skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre']
}
};
const existing = document.getElementById('mathjax-loader') as HTMLScriptElement | null;
if (existing) {
existing.addEventListener('load', () => {
if (globalWithMathJax.MathJax) {
globalWithMathJax.MathJax.startup.promise.then(() => resolve(globalWithMathJax.MathJax as MathJaxInstance));
}
}, { once: true });
existing.addEventListener('error', () => reject(new Error('Failed to load MathJax script.')), { once: true });
return;
}
const script = document.createElement('script');
script.id = 'mathjax-loader';
script.async = true;
script.src = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js';
script.addEventListener('load', () => {
const mathJax = globalWithMathJax.MathJax;
if (!mathJax) {
reject(new Error('MathJax failed to initialise.'));
return;
}
mathJax.startup.promise.then(() => resolve(mathJax as MathJaxInstance));
}, { once: true });
script.addEventListener('error', () => reject(new Error('Failed to load MathJax script.')), { once: true });
document.head.appendChild(script);
});
return this.mathJaxLoader;
}
private toggleMetadataPanel(): void {
if (typeof window !== 'undefined') {
const currentScroll = window.scrollY;

View File

@ -0,0 +1,32 @@
import { test } from 'node:test';
import { strict as assert } from 'node:assert';
import { MarkdownService } from './markdown.service.js';
import type { Note } from '../types';
const service = new MarkdownService();
const notes: Note[] = [];
const render = (markdown: string) => service.render(markdown, notes);
test('renders tables with inline markdown content', () => {
const html = render(`| Syntax | Description |\n| --- | --- |\n| **bold** | \`code\` |\n`);
assert.ok(html.includes('<table'));
assert.ok(html.includes('<strong>bold</strong>'));
assert.ok(html.includes('<code class="inline-code">code</code>'));
});
test('applies alignment markers for columns', () => {
const html = render(`| Left | Center | Right |\n| :-- | :-: | --: |\n| one | two | three |\n`);
assert.ok(html.includes('style="text-align:left;"'));
assert.ok(html.includes('style="text-align:center;"'));
assert.ok(html.includes('style="text-align:right;"'));
});
test('falls back gracefully when separator row is malformed', () => {
const html = render(`| A | B |\n| -- | |\n| 1 | 2 |\n`);
assert.ok(!html.includes('<div class="markdown-table"><table>'));
assert.ok(html.includes('| A | B |'));
});

View File

@ -4,6 +4,8 @@ import MarkdownIt from 'markdown-it';
import markdownItAnchor from 'markdown-it-anchor';
import markdownItTaskLists from 'markdown-it-task-lists';
import markdownItAttrs from 'markdown-it-attrs';
import markdownItFootnote from 'markdown-it-footnote';
import markdownItMultimdTable from 'markdown-it-multimd-table';
import { Note } from '../types';
interface MarkdownRenderEnv {
@ -19,6 +21,27 @@ interface MarkdownItToken {
attrJoin(name: string, value: string): void;
}
interface WikiLinkPlaceholder {
placeholder: string;
alias: string;
target: string;
headingSlug?: string;
headingText?: string;
block?: string;
}
interface MathPlaceholder {
placeholder: string;
expression: string;
display: 'block' | 'inline';
}
interface PreprocessResult {
markdown: string;
wikiLinks: WikiLinkPlaceholder[];
math: MathPlaceholder[];
}
@Injectable({
providedIn: 'root'
})
@ -29,11 +52,15 @@ export class MarkdownService {
render(markdown: string, allNotes: Note[], currentNote?: Note): string {
const env: MarkdownRenderEnv = { codeBlockIndex: 0 };
const markdownIt = this.createMarkdownIt(env);
const headingSlugState = new Map<string, number>();
const markdownIt = this.createMarkdownIt(env, headingSlugState);
const preprocessed = this.decorateInlineTags(markdown);
let html = markdownIt.render(preprocessed, env);
const preprocessing = this.preprocessMarkdown(markdown);
const decorated = this.decorateInlineTags(preprocessing.markdown);
let html = markdownIt.render(decorated, env);
html = this.restoreWikiLinks(html, preprocessing.wikiLinks);
html = this.restoreMath(html, preprocessing.math);
html = this.transformCallouts(html);
html = this.transformTaskLists(html);
html = this.wrapTables(html);
@ -62,10 +89,6 @@ export class MarkdownService {
</figure>`;
});
// Placeholder for unsupported elements
html = html.replace(/\$\$(.*?)\$\$/g, '<div class="my-4 p-4 bg-obs-l-bg-secondary text-obs-l-text-muted dark:bg-obs-d-bg-secondary dark:text-obs-d-text-muted rounded text-center">[LaTeX Equation: $1]</div>');
return html;
}
@ -123,8 +146,8 @@ export class MarkdownService {
this.tagColorCache.set(normalized, index);
return `md-tag-color-${index}`;
}
private createMarkdownIt(env: MarkdownRenderEnv): MarkdownIt {
const md = new MarkdownIt('commonmark', {
private createMarkdownIt(env: MarkdownRenderEnv, slugState: Map<string, number>): MarkdownIt {
const md = new MarkdownIt({
html: true,
linkify: false,
typographer: false,
@ -138,7 +161,7 @@ export class MarkdownService {
});
md.use(markdownItAnchor, {
slugify: (str) => this.slugify(str),
slugify: (str) => this.slugify(str, slugState),
tabIndex: false
});
@ -146,11 +169,26 @@ export class MarkdownService {
enabled: false
});
md.use(markdownItMultimdTable, {
multiline: true,
rowspan: true,
headerless: true
});
md.enable(['table']);
md.use(markdownItFootnote);
md.renderer.rules.fence = (tokens, idx, _options, renderEnv) => {
const list = tokens as unknown as MarkdownItToken[];
return this.renderFence(list[idx], renderEnv as MarkdownRenderEnv);
};
md.renderer.rules.code_block = (tokens, idx, _options, renderEnv) => {
const list = tokens as unknown as MarkdownItToken[];
return this.renderFence(list[idx], renderEnv as MarkdownRenderEnv);
};
md.renderer.rules.code_inline = (tokens, idx) => {
const content = tokens[idx].content;
return `<code class="inline-code">${this.escapeHtml(content)}</code>`;
@ -224,6 +262,22 @@ export class MarkdownService {
</figure>`;
};
md.renderer.rules.footnote_block_open = () => '<section class="md-footnotes text-sm text-obs-l-text-muted dark:text-obs-d-text-muted mt-12"><header class="font-semibold uppercase tracking-wide mb-2">Notes</header><ol class="space-y-2">';
md.renderer.rules.footnote_block_close = () => '</ol></section>';
const defaultFootnoteOpen = md.renderer.rules.footnote_open ?? ((tokens, idx, options, renderEnv, self) => self.renderToken(tokens, idx, options));
md.renderer.rules.footnote_open = (tokens, idx, options, renderEnv, self) => {
tokens[idx].attrJoin('class', 'md-footnote-item');
return defaultFootnoteOpen(tokens, idx, options, renderEnv, self);
};
md.renderer.rules.footnote_ref = (tokens, idx, options, renderEnv, self) => {
const list = tokens as unknown as MarkdownItToken[];
const token = list[idx];
const id = token.attrGet('id') ?? '';
return `<sup class="md-footnote-ref"><a href="#${this.escapeHtml(id)}" class="md-external-link" rel="footnote">${token.content}</a></sup>`;
};
md.renderer.rules.hr = () => '<hr class="my-6 border-obs-l-border dark:border-obs-d-border">';
return md;
@ -249,7 +303,7 @@ export class MarkdownService {
</div>
`;
} else {
const highlightedCode = this.highlightCode(token.content, normalizedLanguage);
const highlightedCode = this.highlightCode(token.content, normalizedLanguage, rawLanguage);
bodyHtml = `<pre class="code-block__body"><code class="hljs" data-raw-code="${encodedRawCode}">${highlightedCode}</code></pre>`;
}
@ -269,13 +323,133 @@ export class MarkdownService {
return `<div class="${wrapperClass}" style="max-width: 800px; width: 100%; margin: 0;" data-language="${languageLabel.toLowerCase()}" data-code-id="${codeId}">${headerHtml}${bodyHtml}</div>`;
}
private highlightCode(code: string, language: string): string {
if (language && hljs.getLanguage(language)) {
return hljs.highlight(code, { language }).value;
private highlightCode(code: string, normalizedLanguage: string, rawLanguage: string): string {
if (normalizedLanguage && hljs.getLanguage(normalizedLanguage)) {
return hljs.highlight(code, { language: normalizedLanguage }).value;
}
if (rawLanguage && !hljs.getLanguage(normalizedLanguage)) {
return this.escapeHtml(code);
}
return hljs.highlightAuto(code).value;
}
private preprocessMarkdown(input: string): PreprocessResult {
const wikiLinks: WikiLinkPlaceholder[] = [];
const math: MathPlaceholder[] = [];
let text = this.stripFrontmatter(input.replace(/\r\n/g, '\n'));
const wikiRegex = /(?<!\!)\[\[([^\]]+)\]\]/g;
text = text.replace(wikiRegex, (_match, inner) => {
const placeholder = `@@__WIKILINK_${wikiLinks.length}__@@`;
const [targetPartRaw, aliasRaw] = `${inner}`.split('|');
let targetPart = targetPartRaw ?? '';
let alias = aliasRaw ?? '';
let block: string | undefined;
let heading: string | undefined;
const blockIndex = targetPart.indexOf('^');
if (blockIndex >= 0) {
block = targetPart.slice(blockIndex + 1).trim();
targetPart = targetPart.slice(0, blockIndex);
}
const headingIndex = targetPart.indexOf('#');
if (headingIndex >= 0) {
heading = targetPart.slice(headingIndex + 1).trim();
targetPart = targetPart.slice(0, headingIndex);
}
const target = targetPart.trim();
const display = (alias || heading || block || target).trim() || 'Untitled';
const headingSlug = heading ? this.slugify(heading) : undefined;
wikiLinks.push({
placeholder,
alias: display,
target,
headingSlug,
headingText: heading,
block
});
return placeholder;
});
const addMathPlaceholder = (expression: string, display: 'block' | 'inline') => {
const placeholder = `@@__MATH_${display.toUpperCase()}_${math.length}__@@`;
math.push({ placeholder, expression: expression.trim(), display });
return placeholder;
};
text = text.replace(/(^|[^\\])\$\$([\s\S]+?)\$\$/g, (match, prefix, expr) => {
const placeholder = addMathPlaceholder(expr, 'block');
return `${prefix}${placeholder}`;
});
text = text.replace(/\\\[(.+?)\\\]/g, (_match, expr) => addMathPlaceholder(expr, 'block'));
text = text.replace(/(?<!\\)\$(?!\s)([^$]+?)(?<!\\)\$(?!\d)/g, (_match, expr) => addMathPlaceholder(expr, 'inline'));
text = text.replace(/\\\((.+?)\\\)/g, (_match, expr) => addMathPlaceholder(expr, 'inline'));
return { markdown: text, wikiLinks, math };
}
private restoreWikiLinks(html: string, links: WikiLinkPlaceholder[]): string {
if (!links.length) {
return html;
}
return links.reduce((acc, link) => {
const attrs: string[] = ['class="md-wiki-link"'];
if (link.target) {
attrs.push(`data-target="${this.escapeAttribute(link.target)}"`);
}
if (link.headingSlug) {
attrs.push(`data-heading="${this.escapeAttribute(link.headingSlug)}"`);
}
if (link.headingText) {
attrs.push(`data-heading-text="${this.escapeAttribute(link.headingText)}"`);
}
if (link.block) {
attrs.push(`data-block="${this.escapeAttribute(link.block)}"`);
}
const replacement = `<a ${attrs.join(' ')}>${this.escapeHtml(link.alias)}</a>`;
return acc.split(link.placeholder).join(replacement);
}, html);
}
private restoreMath(html: string, placeholders: MathPlaceholder[]): string {
if (!placeholders.length) {
return html;
}
return placeholders.reduce((acc, item) => {
const safeExpr = this.escapeHtml(item.expression);
const dataAttr = this.escapeAttribute(item.expression);
const replacement = item.display === 'block'
? `<div class="md-math-block" data-math="${dataAttr}">${safeExpr}</div>`
: `<span class="md-math-inline" data-math="${dataAttr}">${safeExpr}</span>`;
return acc.split(item.placeholder).join(replacement);
}, html);
}
private stripFrontmatter(markdown: string): string {
if (!markdown.startsWith('---')) {
return markdown;
}
const match = markdown.match(/^---\s*\n([\s\S]*?)\n---\s*(\n|$)/);
if (!match) {
return markdown;
}
return markdown.slice(match[0].length);
}
private transformCallouts(html: string): string {
return html.replace(/<blockquote([\s\S]*?)>([\s\S]*?)<\/blockquote>/g, (match, _attrs, inner) => {
const firstParagraphMatch = inner.match(/^\s*<p>([\s\S]*?)<\/p>([\s\S]*)$/);
@ -377,12 +551,39 @@ export class MarkdownService {
.replace(/'/g, "&#039;");
}
private slugify(text: string): string {
return text.toString().toLowerCase()
.replace(/\s+/g, '-') // Replace spaces with -
.replace(/[^\w\-]+/g, '') // Remove all non-word chars
.replace(/\-\-+/g, '-') // Replace multiple - with single -
.replace(/^-+/, '') // Trim - from start of text
.replace(/-+$/, ''); // Trim - from end of text
private escapeAttribute(value: string): string {
return value
.replace(/&/g, '&amp;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&#039;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;');
}
private slugify(text: string, state?: Map<string, number>): string {
let base = text
.toString()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/[^\w\s-]/g, '')
.trim()
.replace(/\s+/g, '-')
.replace(/-+/g, '-')
.toLowerCase();
if (!base) {
base = 'section';
}
if (!state) {
return base;
}
let count = state.get(base);
if (count === undefined) {
count = 0;
}
state.set(base, count + 1);
return count === 0 ? base : `${base}-${count}`;
}
}

View File

@ -82,6 +82,76 @@
outline: 2px solid currentColor;
outline-offset: 2px;
}
.md-footnotes {
border-top: 1px solid var(--footnotes-border, rgba(148, 163, 184, 0.4));
padding-top: 1.5rem;
}
.md-footnotes header {
font-size: 0.75rem;
letter-spacing: 0.08em;
color: var(--footnotes-heading, #475569);
}
.md-footnotes ol {
counter-reset: footnote-counter;
margin: 0;
padding-left: 1.5rem;
}
.md-footnote-item {
position: relative;
color: var(--footnotes-text, #475569);
}
.md-footnote-item p {
margin: 0;
}
.md-footnote-ref {
font-size: 0.75rem;
margin-left: 0.15rem;
}
.md-footnote-ref a {
text-decoration: none;
}
.md-footnote-ref a:hover,
.md-footnote-ref a:focus-visible {
text-decoration: underline;
}
.md-wiki-link {
color: var(--wiki-link, #4f46e5);
text-decoration: underline;
text-decoration-thickness: 1px;
text-underline-offset: 3px;
cursor: pointer;
}
.md-wiki-link:hover,
.md-wiki-link:focus-visible {
color: var(--wiki-link-hover, #4338ca);
text-decoration-thickness: 2px;
}
.md-math-inline {
font-family: "Cambria", "Times New Roman", serif;
background-color: rgba(148, 163, 184, 0.2);
padding: 0 0.25rem;
border-radius: 0.25rem;
}
.md-math-block {
font-family: "Cambria", "Times New Roman", serif;
background-color: rgba(148, 163, 184, 0.15);
padding: 1rem;
margin: 1.5rem 0;
border-radius: 0.5rem;
text-align: center;
}
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@ -51,6 +51,13 @@ Citation en ligne : « > Ceci est une citation »
>
> Fin de la citation principale.
## Footnotes
Le Markdown peut inclure des notes de bas de page[^1].
[^1]: Ceci est un exemple de note de bas de page.
## Listes
- Élément non ordonné 1
@ -76,7 +83,7 @@ Citation en ligne : « > Ceci est une citation »
## Liens et images
[Lien vers le site officiel d'Obsidian](https://obsidian.md)
[Lien vers le site officiel d&#39;Obsidian](https://obsidian.md)
![Image de démonstration](https://static0.howtogeekimages.com/wordpress/wp-content/uploads/2019/12/markdown-logo-on-a-blue-background.png?q=50&fit=crop&w=1200&h=675&dpr=1.5 "Image de test")
@ -133,6 +140,17 @@ docker compose up -d
curl http://localhost:4000/api/health
```
### Variantes supplémentaires de blocs de code
```bash
echo "Bloc de code avec tildes"
ls -al
```
// Exemple de bloc indenté
const numbers = [1, 2, 3];
console.log(numbers.map(n => n * 2));
## Mathématiques (LaTeX)
Expression en ligne : $E = mc^2$
@ -154,16 +172,23 @@ $$
> [!note]
> Ceci est une note informative.
---
> [!tip]
> Astuce : Utilisez `npm run dev` pour tester rapidement.
---
> [!warning]
> Attention : Vérifiez vos chemins avant de lancer un build.
---
> [!danger]
> Danger : Ne déployez pas sans tests.
---
## Diagrammes Mermaid
```mermaid
@ -205,9 +230,7 @@ Host: localhost:4000
- [[features/graph-view]]
- [[NonExistentNote]]
## Footnotes
Le Markdown peut inclure des notes de bas de page[^1].
## Contenu HTML brut
@ -217,5 +240,7 @@ Le Markdown peut inclure des notes de bas de page[^1].
</details>
## Sections horizontales
Fin de la page de test.
[^1]: Ceci est un exemple de note de bas de page.