@lancc/cmark 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/LICENSE +21 -21
  3. package/README.md +47 -107
  4. package/assets/abnfDiagram-WEYOIA3C-CKV_7Upb.js +1 -0
  5. package/assets/architectureDiagram-ZHVYKT53-BvLudDvk.js +1 -0
  6. package/assets/blockDiagram-RJAE7QA3--gzkMGi2.js +1 -0
  7. package/assets/c4Diagram-XDPPPE54-ByfRiJGR.js +1 -0
  8. package/assets/chunk-2E7WHVMD-TfbC_dmh.js +1 -0
  9. package/assets/chunk-2Q5K7J3B-0YJgChVo.js +1 -0
  10. package/assets/chunk-4EMNKR2T-DHoYW7g5.js +1 -0
  11. package/assets/chunk-55XCU76K-Cq25Yw_G.js +1 -0
  12. package/assets/chunk-5VM5RSS4-CJaRXFHK.js +1 -0
  13. package/assets/chunk-JWPE2WC7-BP2iXBhe.js +1 -0
  14. package/assets/chunk-VQ5W62QI-B95zur4F.js +1 -0
  15. package/assets/chunk-XXDRQBXY-Ct0MhvQo.js +1 -0
  16. package/assets/chunk-ZCHMQSOR-C5VhW-wL.js +2 -0
  17. package/assets/classDiagram-v2-4MYWR3UA-C1G-Vkj0.js +1 -0
  18. package/assets/cose-bilkent-JH36ORCC-qIQoIBv0.js +1 -0
  19. package/assets/cynefin-EF2NZ3EQ-CR1E3YiZ.js +1 -0
  20. package/assets/cynefinDiagram-WF24UDRP-DaJFvZ3b.js +1 -0
  21. package/assets/cytoscape.esm-SjxgSg6I.js +9 -0
  22. package/assets/dagre-NK4GIZVX-BFRQhpii.js +1 -0
  23. package/assets/diagram-CBK3MWTC-DlueL6XZ.js +1 -0
  24. package/assets/diagram-I5XIIV2D-bITyafYX.js +1 -0
  25. package/assets/diagram-ODIL2UCW-Dlb4hg_-.js +1 -0
  26. package/assets/diagram-PFBEJUXE-CRfen0O7.js +1 -0
  27. package/assets/diagram-RJA3I4VV-CK-FlhGV.js +1 -0
  28. package/assets/diagram-TYUNFSNR-DmgVsxqa.js +1 -0
  29. package/assets/ebnfDiagram-V4P3TTPT-B9KGI9eQ.js +1 -0
  30. package/assets/echarts-CytsvCdp.js +25 -0
  31. package/assets/elk-QONTBCTQ-VgDftvsU.js +1 -0
  32. package/assets/erDiagram-KYQIGQAA-DkpP7sS4.js +1 -0
  33. package/assets/flowDiagram-IUGLLWBU-CRXa9Kxy.js +1 -0
  34. package/assets/ganttDiagram-R7GPNTJY-Cu2I55Wb.js +1 -0
  35. package/assets/gitGraphDiagram-PDYL7XHY-CwSo663I.js +1 -0
  36. package/assets/graph-Dz7AM1Q5.js +1 -0
  37. package/assets/index-BJ-NdQc4.js +100 -0
  38. package/assets/infoDiagram-MVDRKAX5-D3Qknzuo.js +1 -0
  39. package/assets/ishikawaDiagram-HPEHV2GE-9qYT75tk.js +1 -0
  40. package/assets/journeyDiagram-BOSHW7O7-DeSrJg9o.js +1 -0
  41. package/assets/kanban-definition-FNSA4HC5-DINkB6G7.js +1 -0
  42. package/assets/katex-DN8cTsI3.js +1 -0
  43. package/assets/markdown-S2mWvoE-.js +5 -0
  44. package/assets/mermaid-T_6Ze_cT.js +7 -0
  45. package/assets/mindmap-definition-6OY57UG3-DW5hqiAe.js +1 -0
  46. package/assets/pegDiagram-ECIUJNBX-BWy_tkzy.js +1 -0
  47. package/assets/pieDiagram-GNMPY74T-CniJbr6l.js +1 -0
  48. package/assets/quadrantDiagram-D57K4MC3-BVnDJkCv.js +1 -0
  49. package/assets/railroadDiagram-Y72NRBL7-BNKZpJJb.js +1 -0
  50. package/assets/requirementDiagram-EQYSW5RA-BETipHj0.js +1 -0
  51. package/assets/sankeyDiagram-SY24JHO5-ByEYqT7T.js +1 -0
  52. package/assets/sequenceDiagram-BLEHNHQU-BqCJ2tKG.js +1 -0
  53. package/assets/sizeCapture-INFHLROL-DlhrWFj-.js +1 -0
  54. package/assets/stateDiagram-v2-A6IESKWZ-DJUBWLTP.js +1 -0
  55. package/assets/swimlanes-B3ENRKFQ-D7k7tF5U.js +1 -0
  56. package/assets/swimlanesDiagram-AYQRV4AK-DoQBgB9o.js +1 -0
  57. package/assets/timeline-definition-JXYKGLGB-BCNhwnn6.js +1 -0
  58. package/assets/usecaseDiagram-WPOLBNNX-DRa_Rgl3.js +1 -0
  59. package/assets/vennDiagram-Q3Y3IDCW-Ba2eaO68.js +1 -0
  60. package/assets/wardleyDiagram-IVAIDKWA-W_i9vzY-.js +1 -0
  61. package/assets/xychartDiagram-4URNHDU4-ByfaGjvc.js +1 -0
  62. package/index.html +3 -3
  63. package/package.json +1 -1
  64. package/plugin.json +1 -1
  65. package/preload/git-panel.js +29 -5
  66. package/preload/git-service.js +48 -15
  67. package/preload/remote-setup.js +66 -33
  68. package/preload/remote-wizard.js +2 -0
  69. package/preload.js +30 -0
  70. package/assets/abnfDiagram-WEYOIA3C-BgXsTF7a.js +0 -1
  71. package/assets/architectureDiagram-ZHVYKT53-BsCWa_qC.js +0 -36
  72. package/assets/blockDiagram-RJAE7QA3-wbIxEiYN.js +0 -140
  73. package/assets/c4Diagram-XDPPPE54-5zdyxFvA.js +0 -38
  74. package/assets/chunk-2E7WHVMD-F85Lca-i.js +0 -88
  75. package/assets/chunk-2Q5K7J3B-CjpAZ0OI.js +0 -1
  76. package/assets/chunk-4EMNKR2T-C8Kbh83c.js +0 -1
  77. package/assets/chunk-55XCU76K-BINcFiLN.js +0 -1
  78. package/assets/chunk-5VM5RSS4-Diy5h2LS.js +0 -15
  79. package/assets/chunk-JWPE2WC7-BXnjDdh1.js +0 -1
  80. package/assets/chunk-VQ5W62QI-BM7ZZo1I.js +0 -1
  81. package/assets/chunk-XXDRQBXY-CW8CjB1w.js +0 -1
  82. package/assets/chunk-ZCHMQSOR-C7ATz1L1.js +0 -2
  83. package/assets/classDiagram-v2-4MYWR3UA-CMoqNk-b.js +0 -217
  84. package/assets/cose-bilkent-JH36ORCC-6rqR5iJk.js +0 -1
  85. package/assets/cynefin-EF2NZ3EQ-DypLIJxl.js +0 -141
  86. package/assets/cynefinDiagram-WF24UDRP-8b2CEBlR.js +0 -62
  87. package/assets/cytoscape.esm-CjX6Hyah.js +0 -331
  88. package/assets/dagre-NK4GIZVX-Dv6vuUbR.js +0 -4
  89. package/assets/diagram-CBK3MWTC-DJgMDeYd.js +0 -24
  90. package/assets/diagram-I5XIIV2D-BB9cMoRW.js +0 -24
  91. package/assets/diagram-ODIL2UCW-BVcRtsdy.js +0 -30
  92. package/assets/diagram-PFBEJUXE-BbGSOtJx.js +0 -3
  93. package/assets/diagram-RJA3I4VV-CzkY_8Fo.js +0 -41
  94. package/assets/diagram-TYUNFSNR-YTl5QdfL.js +0 -200
  95. package/assets/ebnfDiagram-V4P3TTPT-COVjPAjE.js +0 -1
  96. package/assets/echarts-BAPDkhe3.js +0 -61
  97. package/assets/elk-QONTBCTQ-DHsjY8Z_.js +0 -27
  98. package/assets/erDiagram-KYQIGQAA-CUAbTUl1.js +0 -99
  99. package/assets/flowDiagram-IUGLLWBU-CWsiqTQC.js +0 -213
  100. package/assets/ganttDiagram-R7GPNTJY-DetBW0Wm.js +0 -292
  101. package/assets/gitGraphDiagram-PDYL7XHY-ByrdgJmw.js +0 -106
  102. package/assets/graph-D8UmR1vK.js +0 -1
  103. package/assets/index-B17NCAw4.js +0 -758
  104. package/assets/infoDiagram-MVDRKAX5-BM48fjhU.js +0 -2
  105. package/assets/ishikawaDiagram-HPEHV2GE-DtHYywHZ.js +0 -70
  106. package/assets/journeyDiagram-BOSHW7O7-DJ1LiRh3.js +0 -139
  107. package/assets/kanban-definition-FNSA4HC5-DPPt8pwJ.js +0 -89
  108. package/assets/katex-CQL9J12G.js +0 -257
  109. package/assets/markdown-DVehI1Sg.js +0 -314
  110. package/assets/mermaid-C_q9pug0.js +0 -312
  111. package/assets/mindmap-definition-6OY57UG3-zbqYOEY6.js +0 -98
  112. package/assets/pegDiagram-ECIUJNBX-e7QG7TMq.js +0 -1
  113. package/assets/pieDiagram-GNMPY74T-Duf6YP0N.js +0 -39
  114. package/assets/quadrantDiagram-D57K4MC3-B2eYoUUy.js +0 -7
  115. package/assets/railroadDiagram-Y72NRBL7-BWCzPcI_.js +0 -1
  116. package/assets/requirementDiagram-EQYSW5RA-HhPMEqB1.js +0 -84
  117. package/assets/sankeyDiagram-SY24JHO5-CMUTwFBB.js +0 -40
  118. package/assets/sequenceDiagram-BLEHNHQU-C9wR2ll7.js +0 -169
  119. package/assets/sizeCapture-INFHLROL-DXfz37S6.js +0 -1
  120. package/assets/stateDiagram-v2-A6IESKWZ-D_gtonhE.js +0 -291
  121. package/assets/swimlanes-B3ENRKFQ-DdJOuuMV.js +0 -1
  122. package/assets/swimlanesDiagram-AYQRV4AK-BWt3HxHV.js +0 -8
  123. package/assets/timeline-definition-JXYKGLGB-DQsdwJe-.js +0 -120
  124. package/assets/usecaseDiagram-WPOLBNNX-DTRyFq7d.js +0 -370
  125. package/assets/vennDiagram-Q3Y3IDCW-dihYszm0.js +0 -34
  126. package/assets/wardleyDiagram-IVAIDKWA-BoPpgYfK.js +0 -78
  127. package/assets/xychartDiagram-4URNHDU4-DoLjYxeB.js +0 -7
@@ -231,12 +231,24 @@ function giteeCreateRepo (token, name, isPrivate) {
231
231
  }
232
232
 
233
233
  /* ---------------- git 绑定 ---------------- */
234
- const TOKEN_HELPER = '!f() { echo username=x-access-token; echo password=$CMARK_GIT_TOKEN; }; f'
234
+ // Gitee 的 HTTPS 用户名是强校验的:必须与令牌所有者一致,否则回 403
235
+ // 「The token username invalid」(x-access-token 只有 GitHub 认)。
236
+ // 用户名优先级:调用方给的 login > 从仓库地址推断的 owner > x-access-token
237
+ const SAFE_USER = /^[A-Za-z0-9._-]{1,64}$/
238
+ function userForUrl (url) {
239
+ const m = /^https?:\/\/(?:[^@/]+@)?([^/:]+)(?::\d+)?\/([^/]+)\//.exec(String(url || ''))
240
+ if (m && /(^|\.)gitee\.com$/i.test(m[1]) && SAFE_USER.test(m[2])) return m[2]
241
+ return 'x-access-token'
242
+ }
243
+ function tokenHelper (username) {
244
+ const u = SAFE_USER.test(String(username || '')) ? String(username) : 'x-access-token'
245
+ return '!f() { echo username=' + u + '; echo password=$CMARK_GIT_TOKEN; }; f'
246
+ }
235
247
 
236
- function git (args, cwd, token, timeout) {
248
+ function git (args, cwd, token, timeout, username) {
237
249
  return new Promise(function (resolve) {
238
250
  const pre = token
239
- ? ['-c', 'core.quotepath=false', '-c', 'credential.helper=', '-c', 'credential.helper=' + TOKEN_HELPER]
251
+ ? ['-c', 'core.quotepath=false', '-c', 'credential.helper=', '-c', 'credential.helper=' + tokenHelper(username)]
240
252
  : ['-c', 'core.quotepath=false', '-c', 'credential.helper=', '-c', 'credential.helper=manager']
241
253
  execFile('git', pre.concat(args), {
242
254
  cwd: cwd,
@@ -279,6 +291,9 @@ async function bind (o) {
279
291
  const dir = opt.dir
280
292
  const url = opt.url
281
293
  const token = opt.token
294
+ // Gitee 必须用令牌所有者的用户名校验;调用方(向导)拿到的是 login,
295
+ // 老路径/手填地址没有 login 时用仓库地址里的 owner 兜底
296
+ const username = opt.username || userForUrl(url)
282
297
  if (!dir || !url || !token) return { ok: false, message: '参数不完整' }
283
298
  if (!fs.existsSync(dir)) {
284
299
  try { fs.mkdirSync(dir, { recursive: true }) } catch (e) {
@@ -287,6 +302,25 @@ async function bind (o) {
287
302
  }
288
303
 
289
304
  const steps = []
305
+ // 首推:本地还没有提交就先提交,然后 push -u origin main。
306
+ // 全新仓库和「选了已有仓库但远端是空的」两种情况共用。
307
+ async function firstPush () {
308
+ const hasCommit = await git(['rev-parse', '--verify', 'HEAD'], dir)
309
+ if (!hasCommit.ok) {
310
+ const addAll = await git(['add', '-A', '--', '.'], dir)
311
+ if (!addAll.ok) return { ok: false, message: '暂存失败:' + addAll.message, steps: steps }
312
+ const commit = await git(['commit', '-m', '初始化笔记仓库'], dir)
313
+ if (!commit.ok && !/nothing to commit/i.test(commit.message)) {
314
+ return { ok: false, message: '提交失败:' + commit.message, steps: steps }
315
+ }
316
+ steps.push('commit')
317
+ }
318
+ const push = await git(['push', '-u', 'origin', 'main'], dir, token, 180000, username)
319
+ if (!push.ok) return { ok: false, message: '首次推送失败:' + push.message, steps: steps }
320
+ steps.push('push')
321
+ return { ok: true }
322
+ }
323
+
290
324
  if (!isRepo(dir)) {
291
325
  const init = await git(['init', '-b', 'main'], dir)
292
326
  if (!init.ok) return { ok: false, message: 'git init 失败:' + init.message }
@@ -306,42 +340,41 @@ async function bind (o) {
306
340
 
307
341
  if (opt.existing) {
308
342
  // 远程已有仓库:把内容拉下来(只能 fast-forward,避免覆盖本地笔记)
309
- const fetch = await git(['fetch', 'origin'], dir, token, 180000)
343
+ const fetch = await git(['fetch', 'origin'], dir, token, 180000, username)
310
344
  if (!fetch.ok) return { ok: false, message: '拉取失败:' + fetch.message, steps: steps }
311
345
  steps.push('fetch')
312
346
 
313
- // 远端默认分支不一定是 main(Gitee 新建仓库默认 master),按远端 HEAD 指向来合并
314
- let remoteBranch = 'main'
315
- try {
316
- const sym = await git(['ls-remote', '--symref', 'origin', 'HEAD'], dir, token, 60000)
317
- const m = sym.ok ? /ref:\s+refs\/heads\/(\S+)\s+HEAD/.exec(sym.data || '') : null
318
- if (m && m[1]) remoteBranch = m[1]
319
- } catch (e) {}
347
+ // 「使用已有仓库」也可能选到刚建好、还没推过东西的空仓库(auto_init:false 没有任何分支):
348
+ // 这种情况下 fetch 会成功但拉不到任何引用,接着 merge origin/main 必然失败。
349
+ // 所以要显式分叉到首推,而不是让用户看到「合并失败」这种莫名报错。
350
+ const heads = await git(['ls-remote', '--heads', 'origin'], dir, token, 60000, username)
351
+ const hasRemoteHeads = heads.ok && String(heads.data || '').trim() !== ''
352
+ if (!hasRemoteHeads) {
353
+ const fp = await firstPush()
354
+ if (!fp.ok) return fp
355
+ } else {
356
+ // 远端默认分支不一定是 main(Gitee 新建仓库默认 master),按远端 HEAD 指向来合并
357
+ let remoteBranch = 'main'
358
+ try {
359
+ const sym = await git(['ls-remote', '--symref', 'origin', 'HEAD'], dir, token, 60000, username)
360
+ const m = sym.ok ? /ref:\s+refs\/heads\/(\S+)\s+HEAD/.exec(sym.data || '') : null
361
+ if (m && m[1]) remoteBranch = m[1]
362
+ } catch (e) {}
320
363
 
321
- if (remoteBranch !== 'main') {
322
- // 本地是 main、远程是别的名字:把本地主干指到远程分支,避免两个平行根
323
- await git(['branch', '-M', remoteBranch], dir)
324
- }
325
- const merge = await git(['merge', '--ff-only', 'origin/' + remoteBranch], dir, token, 60000)
326
- if (!merge.ok) {
327
- return { ok: false, message: '合并远端分支 ' + remoteBranch + ' 失败:' + merge.message, steps: steps }
364
+ if (remoteBranch !== 'main') {
365
+ // 本地是 main、远程是别的名字:把本地主干指到远程分支,避免两个平行根
366
+ await git(['branch', '-M', remoteBranch], dir)
367
+ }
368
+ const merge = await git(['merge', '--ff-only', 'origin/' + remoteBranch], dir, token, 60000, username)
369
+ if (!merge.ok) {
370
+ return { ok: false, message: '合并远端分支 ' + remoteBranch + ' 失败:' + merge.message, steps: steps }
371
+ }
372
+ steps.push('merge')
328
373
  }
329
- steps.push('merge')
330
374
  } else {
331
375
  // 全新仓库:提交本地内容后首次推送
332
- const hasCommit = await git(['rev-parse', '--verify', 'HEAD'], dir)
333
- if (!hasCommit.ok) {
334
- const addAll = await git(['add', '-A', '--', '.'], dir)
335
- if (!addAll.ok) return { ok: false, message: '暂存失败:' + addAll.message }
336
- const commit = await git(['commit', '-m', '初始化笔记仓库'], dir)
337
- if (!commit.ok && !/nothing to commit/i.test(commit.message)) {
338
- return { ok: false, message: '提交失败:' + commit.message }
339
- }
340
- steps.push('commit')
341
- }
342
- const push = await git(['push', '-u', 'origin', 'main'], dir, token, 180000)
343
- if (!push.ok) return { ok: false, message: '首次推送失败:' + push.message, steps: steps }
344
- steps.push('push')
376
+ const fp = await firstPush()
377
+ if (!fp.ok) return fp
345
378
  }
346
379
 
347
380
  // dir 是工作区(仓库根)。笔记目录若已经在它之内就保持不动,
@@ -354,7 +387,7 @@ async function bind (o) {
354
387
  keepWs = !!curWs && !rel.startsWith('..') && !path.isAbsolute(rel)
355
388
  } catch (e) { keepWs = false }
356
389
  patchCfg(Object.assign({ repoDir: dir, initialized: true }, keepWs ? {} : { workspace: dir }))
357
- const savedRes = wsPrefs.patch(dir, { remoteToken: { provider: opt.provider || '', token: token, url: url } })
390
+ const savedRes = wsPrefs.patch(dir, { remoteToken: { provider: opt.provider || '', token: token, url: url, username: username } })
358
391
  const saved = !!(savedRes && savedRes.ok)
359
392
  return { ok: saved, steps: steps, message: saved ? '' : ((savedRes && savedRes.message) || '写入配置失败') }
360
393
  }
@@ -280,6 +280,8 @@ module.exports = function attachRemoteWizard (win) {
280
280
  provider: state.provider,
281
281
  url: c.url,
282
282
  token: state.token,
283
+ // Gitee 的 HTTPS 用户名必须等于令牌所有者(state.login 来自 /api/v5/user)
284
+ username: state.login,
283
285
  dir: ws,
284
286
  existing: !isNew
285
287
  }).then(function (b) {
package/preload.js CHANGED
@@ -93,6 +93,16 @@ function themeMode () {
93
93
 
94
94
  function resolveTheme (mode) {
95
95
  if (mode === 'light' || mode === 'dark') return mode
96
+ // system:优先跟随宿主(ZTools/uTools 的主题设置,而宿主自己也可以设为跟随系统)。
97
+ // 为什么不用 prefers-color-scheme:宿主的标题栏是它自己的 UI,颜色由宿主的主题决定,
98
+ // 插件改不了;只有让「跟随」这一档跟宿主同源,插件页面和顶部那条才不会一深一浅。
99
+ // preload 跑在 document-start,宿主可能还没注入 window.ztools(host shim 会先给 no-op),
100
+ // 此时拿到的是 undefined,必须回退到系统媒体查询。
101
+ try {
102
+ const z = window.ztools
103
+ const v = z && typeof z.isDarkColors === 'function' ? z.isDarkColors() : undefined
104
+ if (typeof v === 'boolean') return v ? 'dark' : 'light'
105
+ } catch (e) {}
96
106
  try {
97
107
  return typeof matchMedia === 'function' && matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
98
108
  } catch (e) {
@@ -159,6 +169,26 @@ try {
159
169
  else if (mq.addListener) mq.addListener(onChange)
160
170
  } catch (e) {}
161
171
 
172
+ // 「跟随」这一档还要跟宿主的主题变化走:用户在 ZTools 里切浅/深时,
173
+ // 插件页面要跟着换,否则会出现「顶部变了、页面没变」的反向不一致。
174
+ // preload 早期宿主可能还没注入,所以延后一段时间再注册一次。
175
+ function watchHostTheme () {
176
+ try {
177
+ const z = window.ztools
178
+ if (!z || typeof z.onThemeChange !== 'function') return false
179
+ z.onThemeChange(function () { if (themeMode() === 'system') applyTheme() })
180
+ return true
181
+ } catch (e) {
182
+ return false
183
+ }
184
+ }
185
+ if (!watchHostTheme()) {
186
+ setTimeout(watchHostTheme, 600)
187
+ setTimeout(watchHostTheme, 2000)
188
+ }
189
+ // 宿主注入晚于首帧时,system 档的首帧可能按系统色算错了,补算一次
190
+ setTimeout(function () { if (themeMode() === 'system') applyTheme() }, 300)
191
+
162
192
  // 工作区未设置或不存在时,退到 ~/Documents/CMark,不弹任何框
163
193
  let workspace = config.workspace
164
194
  if (!workspace || !fs.existsSync(workspace)) {
@@ -1 +0,0 @@
1
- import{g as p,r as u,d as a}from"./chunk-2E7WHVMD-F85Lca-i.js";import{p as f}from"./chunk-JWPE2WC7-BXnjDdh1.js";import{_ as n,l as o}from"./mermaid-C_q9pug0.js";import{M as c,b as d}from"./cynefin-EF2NZ3EQ-DypLIJxl.js";import"./markdown-DVehI1Sg.js";var v=d().RailroadAbnf.parser.LangiumParser,i=n(e=>{const r=e.alternatives.map(g);return r.length===1?r[0]:{type:"choice",alternatives:r}},"transformAlternation"),g=n(e=>{const r=e.elements.map(y);return r.length===1?r[0]:{type:"sequence",elements:r}},"transformConcatenation"),b=n(e=>{if(e.includes("*")){const[t,s]=e.split("*"),l=t?parseInt(t,10):0,m=s?parseInt(s,10):1/0;return{min:l,max:m}}const r=parseInt(e,10);return{min:r,max:r}},"parseRepeat"),y=n(e=>{const r=A(e.primary);if(!e.repeat)return r;const{min:t,max:s}=b(e.repeat);return t===0&&s===1?{type:"optional",element:r}:{type:"repetition",element:r,min:t,max:s}},"transformElement"),A=n(e=>{switch(e.$type){case"AbnfStringLiteral":return{type:"terminal",value:e.value};case"AbnfNumVal":return{type:"terminal",value:e.value};case"AbnfRuleName":return{type:"nonterminal",name:e.name};case"AbnfGroup":return i(e.element);case"AbnfOptionalGroup":return{type:"optional",element:i(e.element)};default:throw new Error(`Unsupported ABNF primary node: ${e.$type}`)}},"transformPrimary"),P=n(e=>({name:e.name,definition:i(e.definition)}),"transformRule"),h=n(e=>{f(e,a),e.title&&a.setTitle(e.title),e.rules.map(r=>a.addRule(P(r)))},"populateDb"),R={parse:n(e=>{a.clear(),o.debug("[ABNF Parser] Starting Langium parse");const r=v.parse(e);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new c(r);const t=r.value;o.debug("[ABNF Parser] Parsed rules:",t.rules.length),h(t),o.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:a}},B={parser:R,db:a,renderer:u,styles:p};export{B as diagram};