@lancc/cmark 0.0.0-stage → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/LICENSE +21 -0
  3. package/README.md +217 -2
  4. package/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  5. package/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  6. package/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  7. package/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  8. package/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  9. package/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  10. package/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  11. package/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  12. package/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  13. package/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  14. package/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  15. package/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  16. package/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  17. package/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  18. package/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  19. package/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  20. package/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  21. package/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  22. package/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  23. package/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  24. package/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  25. package/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  26. package/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  27. package/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  28. package/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  29. package/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  30. package/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  31. package/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  32. package/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  33. package/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  34. package/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  35. package/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  36. package/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  37. package/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  38. package/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  39. package/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  40. package/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  41. package/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  42. package/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  43. package/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  44. package/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  45. package/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  46. package/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  47. package/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  48. package/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  49. package/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  50. package/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  51. package/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  52. package/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  53. package/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  54. package/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  55. package/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  56. package/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  57. package/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  58. package/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  59. package/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  60. package/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  61. package/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  62. package/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  63. package/assets/abnfDiagram-WEYOIA3C-BgXsTF7a.js +1 -0
  64. package/assets/architectureDiagram-ZHVYKT53-BsCWa_qC.js +36 -0
  65. package/assets/blockDiagram-RJAE7QA3-wbIxEiYN.js +140 -0
  66. package/assets/c4Diagram-XDPPPE54-5zdyxFvA.js +38 -0
  67. package/assets/chunk-2E7WHVMD-F85Lca-i.js +88 -0
  68. package/assets/chunk-2Q5K7J3B-CjpAZ0OI.js +1 -0
  69. package/assets/chunk-4EMNKR2T-C8Kbh83c.js +1 -0
  70. package/assets/chunk-55XCU76K-BINcFiLN.js +1 -0
  71. package/assets/chunk-5VM5RSS4-Diy5h2LS.js +15 -0
  72. package/assets/chunk-JWPE2WC7-BXnjDdh1.js +1 -0
  73. package/assets/chunk-VQ5W62QI-BM7ZZo1I.js +1 -0
  74. package/assets/chunk-XXDRQBXY-CW8CjB1w.js +1 -0
  75. package/assets/chunk-ZCHMQSOR-C7ATz1L1.js +2 -0
  76. package/assets/classDiagram-v2-4MYWR3UA-CMoqNk-b.js +217 -0
  77. package/assets/cose-bilkent-JH36ORCC-6rqR5iJk.js +1 -0
  78. package/assets/cynefin-EF2NZ3EQ-DypLIJxl.js +141 -0
  79. package/assets/cynefinDiagram-WF24UDRP-8b2CEBlR.js +62 -0
  80. package/assets/cytoscape.esm-CjX6Hyah.js +331 -0
  81. package/assets/dagre-NK4GIZVX-Dv6vuUbR.js +4 -0
  82. package/assets/diagram-CBK3MWTC-DJgMDeYd.js +24 -0
  83. package/assets/diagram-I5XIIV2D-BB9cMoRW.js +24 -0
  84. package/assets/diagram-ODIL2UCW-BVcRtsdy.js +30 -0
  85. package/assets/diagram-PFBEJUXE-BbGSOtJx.js +3 -0
  86. package/assets/diagram-RJA3I4VV-CzkY_8Fo.js +41 -0
  87. package/assets/diagram-TYUNFSNR-YTl5QdfL.js +200 -0
  88. package/assets/ebnfDiagram-V4P3TTPT-COVjPAjE.js +1 -0
  89. package/assets/echarts-BAPDkhe3.js +61 -0
  90. package/assets/elk-QONTBCTQ-DHsjY8Z_.js +27 -0
  91. package/assets/erDiagram-KYQIGQAA-CUAbTUl1.js +99 -0
  92. package/assets/flowDiagram-IUGLLWBU-CWsiqTQC.js +213 -0
  93. package/assets/ganttDiagram-R7GPNTJY-DetBW0Wm.js +292 -0
  94. package/assets/gitGraphDiagram-PDYL7XHY-ByrdgJmw.js +106 -0
  95. package/assets/graph-D8UmR1vK.js +1 -0
  96. package/assets/index-B17NCAw4.js +758 -0
  97. package/assets/index-eB_q_VA3.css +1 -0
  98. package/assets/infoDiagram-MVDRKAX5-BM48fjhU.js +2 -0
  99. package/assets/ishikawaDiagram-HPEHV2GE-DtHYywHZ.js +70 -0
  100. package/assets/journeyDiagram-BOSHW7O7-DJ1LiRh3.js +139 -0
  101. package/assets/kanban-definition-FNSA4HC5-DPPt8pwJ.js +89 -0
  102. package/assets/katex-CQL9J12G.js +257 -0
  103. package/assets/markdown-DVehI1Sg.js +314 -0
  104. package/assets/mermaid-C_q9pug0.js +312 -0
  105. package/assets/mindmap-definition-6OY57UG3-zbqYOEY6.js +98 -0
  106. package/assets/pegDiagram-ECIUJNBX-e7QG7TMq.js +1 -0
  107. package/assets/pieDiagram-GNMPY74T-Duf6YP0N.js +39 -0
  108. package/assets/quadrantDiagram-D57K4MC3-B2eYoUUy.js +7 -0
  109. package/assets/railroadDiagram-Y72NRBL7-BWCzPcI_.js +1 -0
  110. package/assets/requirementDiagram-EQYSW5RA-HhPMEqB1.js +84 -0
  111. package/assets/sankeyDiagram-SY24JHO5-CMUTwFBB.js +40 -0
  112. package/assets/sequenceDiagram-BLEHNHQU-C9wR2ll7.js +169 -0
  113. package/assets/sizeCapture-INFHLROL-DXfz37S6.js +1 -0
  114. package/assets/stateDiagram-v2-A6IESKWZ-D_gtonhE.js +291 -0
  115. package/assets/swimlanes-B3ENRKFQ-DdJOuuMV.js +1 -0
  116. package/assets/swimlanesDiagram-AYQRV4AK-BWt3HxHV.js +8 -0
  117. package/assets/timeline-definition-JXYKGLGB-DQsdwJe-.js +120 -0
  118. package/assets/usecaseDiagram-WPOLBNNX-DTRyFq7d.js +370 -0
  119. package/assets/vennDiagram-Q3Y3IDCW-dihYszm0.js +34 -0
  120. package/assets/wardleyDiagram-IVAIDKWA-BoPpgYfK.js +78 -0
  121. package/assets/xychartDiagram-4URNHDU4-DoLjYxeB.js +7 -0
  122. package/export-file/github-markdown.css +550 -0
  123. package/export-file/index.html +33 -0
  124. package/fonts/KaTeX_AMS-Regular.ttf +0 -0
  125. package/fonts/KaTeX_AMS-Regular.woff +0 -0
  126. package/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  127. package/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  128. package/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  129. package/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  130. package/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  131. package/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  132. package/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  133. package/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  134. package/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  135. package/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  136. package/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  137. package/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  138. package/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  139. package/fonts/KaTeX_Main-Bold.ttf +0 -0
  140. package/fonts/KaTeX_Main-Bold.woff +0 -0
  141. package/fonts/KaTeX_Main-Bold.woff2 +0 -0
  142. package/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  143. package/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  144. package/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  145. package/fonts/KaTeX_Main-Italic.ttf +0 -0
  146. package/fonts/KaTeX_Main-Italic.woff +0 -0
  147. package/fonts/KaTeX_Main-Italic.woff2 +0 -0
  148. package/fonts/KaTeX_Main-Regular.ttf +0 -0
  149. package/fonts/KaTeX_Main-Regular.woff +0 -0
  150. package/fonts/KaTeX_Main-Regular.woff2 +0 -0
  151. package/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  152. package/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  153. package/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  154. package/fonts/KaTeX_Math-Italic.ttf +0 -0
  155. package/fonts/KaTeX_Math-Italic.woff +0 -0
  156. package/fonts/KaTeX_Math-Italic.woff2 +0 -0
  157. package/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  158. package/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  159. package/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  160. package/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  161. package/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  162. package/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  163. package/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  164. package/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  165. package/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  166. package/fonts/KaTeX_Script-Regular.ttf +0 -0
  167. package/fonts/KaTeX_Script-Regular.woff +0 -0
  168. package/fonts/KaTeX_Script-Regular.woff2 +0 -0
  169. package/fonts/KaTeX_Size1-Regular.ttf +0 -0
  170. package/fonts/KaTeX_Size1-Regular.woff +0 -0
  171. package/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  172. package/fonts/KaTeX_Size2-Regular.ttf +0 -0
  173. package/fonts/KaTeX_Size2-Regular.woff +0 -0
  174. package/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  175. package/fonts/KaTeX_Size3-Regular.ttf +0 -0
  176. package/fonts/KaTeX_Size3-Regular.woff +0 -0
  177. package/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  178. package/fonts/KaTeX_Size4-Regular.ttf +0 -0
  179. package/fonts/KaTeX_Size4-Regular.woff +0 -0
  180. package/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  181. package/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  182. package/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  183. package/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  184. package/index.html +15 -0
  185. package/katex.min.css +1 -0
  186. package/logo.png +0 -0
  187. package/package.json +31 -4
  188. package/plugin.json +31 -0
  189. package/preload/branch-bar.js +201 -0
  190. package/preload/export-css.js +59 -0
  191. package/preload/git-panel.js +1366 -0
  192. package/preload/git-service.js +1463 -0
  193. package/preload/host.js +130 -0
  194. package/preload/ndb.js +1407 -0
  195. package/preload/package.json +3 -0
  196. package/preload/remote-setup.js +392 -0
  197. package/preload/remote-wizard.js +328 -0
  198. package/preload/rename-note.js +150 -0
  199. package/preload/services.js +423 -0
  200. package/preload/settings-panel.js +959 -0
  201. package/preload/ws-prefs.js +55 -0
  202. package/preload.js +1870 -0
@@ -0,0 +1,328 @@
1
+ /**
2
+ * remote-wizard.js —— 一键建仓向导(GitHub Device Flow / Gitee 私人令牌)
3
+ *
4
+ * 界面约束(ZTools 插件里不能用的东西):
5
+ * - 不用 window.confirm / alert:原生模态会抢焦点,宿主随即隐藏插件窗口
6
+ * - 不用 location.reload()
7
+ * 所以确认与进度都在自建遮罩层里完成。
8
+ */
9
+ module.exports = function attachRemoteWizard (win) {
10
+ const doc = win.document
11
+ if (!doc) return
12
+ if (!doc.body) { setTimeout(function () { try { attachRemoteWizard(win) } catch (e) {} }, 60); return }
13
+
14
+ const R = function () { return win.__CMARK_REMOTE }
15
+ const LABEL = { github: 'GitHub', gitee: 'Gitee' }
16
+
17
+ function injectCss () {
18
+ if (doc.getElementById('crw-css')) return
19
+ const st = doc.createElement('style')
20
+ st.id = 'crw-css'
21
+ st.textContent = `
22
+ .crw-mask{position:fixed;inset:0;z-index:99999;background:rgba(0,0,0,.45);
23
+ display:flex;align-items:center;justify-content:center;}
24
+ .crw-card{width:min(460px,calc(100vw - 48px));max-height:86vh;overflow:auto;
25
+ background:var(--zgp-bg,#fff);color:var(--zgp-fg,#1f2328);
26
+ border:1px solid var(--zgp-bd,#e3e6ea);border-radius:12px;
27
+ box-shadow:var(--zgp-shadow,0 8px 32px rgba(0,0,0,.18));padding:18px;}
28
+ .crw-h{font-size:14px;font-weight:600;margin:0 0 4px;display:flex;align-items:center;justify-content:space-between;}
29
+ .crw-x{cursor:pointer;border:none;background:transparent;color:var(--zgp-fg3,#8b949e);font-size:18px;line-height:1;}
30
+ .crw-desc{font-size:12px;line-height:1.75;color:var(--zgp-fg2,#57606a);}
31
+ .crw-code{font-family:Consolas,Menlo,monospace;font-size:26px;letter-spacing:.28em;
32
+ text-align:center;padding:14px 0;margin:10px 0;border-radius:10px;
33
+ background:var(--zgp-bg3,#eef0f4);color:var(--zgp-fg,#1f2328);user-select:all;}
34
+ .crw-row{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap;}
35
+ .crw-row.end{justify-content:flex-end;}
36
+ .crw-b{padding:6px 14px;border-radius:7px;border:1px solid var(--zgp-bd2,#d0d7de);
37
+ background:var(--zgp-bg,#fff);color:var(--zgp-fg2,#57606a);font-size:12.5px;cursor:pointer;}
38
+ .crw-b:hover{border-color:var(--zgp-acc,#2563eb);color:var(--zgp-acc,#2563eb);}
39
+ .crw-b.primary{background:var(--zgp-acc,#2563eb);border-color:var(--zgp-acc,#2563eb);color:#fff;}
40
+ .crw-b[disabled]{opacity:.5;cursor:not-allowed;}
41
+ .crw-url{flex:1;min-width:0;font-family:Consolas,Menlo,monospace;font-size:11.5px;line-height:1.5;
42
+ padding:7px 9px;border-radius:6px;background:var(--zgp-bg3,#eef0f4);
43
+ color:var(--zgp-fg2,#57606a);word-break:break-all;user-select:all;}
44
+ .crw-in{width:100%;box-sizing:border-box;padding:7px 10px;border-radius:7px;
45
+ border:1px solid var(--zgp-bd2,#d0d7de);background:var(--zgp-bg,#fff);
46
+ color:var(--zgp-fg,#1f2328);font-size:12.5px;font-family:inherit;}
47
+ .crw-in:focus{outline:none;border-color:var(--zgp-acc,#2563eb);}
48
+ .crw-sel{width:100%;box-sizing:border-box;padding:7px 10px;border-radius:7px;
49
+ border:1px solid var(--zgp-bd2,#d0d7de);background:var(--zgp-bg,#fff);
50
+ color:var(--zgp-fg,#1f2328);font-size:12.5px;}
51
+ .crw-msg{font-size:12px;margin-top:10px;line-height:1.7;}
52
+ .crw-ok{color:var(--zgp-ok,#1a7f37);}
53
+ .crw-err{color:var(--zgp-err,#cf222e);}
54
+ .crw-dim{color:var(--zgp-fg3,#8b949e);}
55
+ .crw-step{font-size:11.5px;color:var(--zgp-fg3,#8b949e);margin-bottom:8px;}
56
+ `
57
+ try { (doc.head || doc.documentElement).appendChild(st) } catch (e) {}
58
+ }
59
+
60
+ function open (provider) {
61
+ const api = R()
62
+ if (!api) return
63
+ injectCss()
64
+ if (doc.getElementById('crw-mask')) doc.getElementById('crw-mask').remove()
65
+
66
+ const mask = doc.createElement('div')
67
+ mask.className = 'crw-mask'
68
+ mask.id = 'crw-mask'
69
+ mask.innerHTML = `
70
+ <div class="crw-card">
71
+ <div class="crw-h"><span>绑定 ${LABEL[provider] || ''}</span><button class="crw-x" id="crw-close">×</button></div>
72
+ <div class="crw-step" id="crw-step"></div>
73
+ <div id="crw-body"></div>
74
+ </div>`
75
+ doc.body.appendChild(mask)
76
+ const $ = function (id) { return mask.querySelector('#' + id) }
77
+ const body = $('crw-body')
78
+ const stepEl = $('crw-step')
79
+ const close = function () {
80
+ try { if (typeof stopPoll === 'function') stopPoll() } catch (e) {}
81
+ try { mask.remove() } catch (e) {}
82
+ // 注意:这里不写 Git 开关。取消/关闭不等于建仓成功,只有成功分支才置为开启
83
+ try { win.dispatchEvent(new CustomEvent('cmark-git-changed')) } catch (e) {}
84
+ }
85
+ mask.addEventListener('click', function (e) { if (e.target === mask) close() })
86
+ $('crw-close').onclick = close
87
+
88
+ const state = { provider: provider, token: '', login: '', repos: [], timer: null }
89
+
90
+ function stopPoll () { if (state.timer) { clearTimeout(state.timer); state.timer = null } }
91
+
92
+ // 打开外部窗口前先提示:宿主的窗口策略是失焦即隐藏,授权页一开插件就收起
93
+ function confirmExternal (url) {
94
+ const box = doc.createElement('div')
95
+ box.className = 'crw-mask'
96
+ box.style.zIndex = '100001'
97
+ box.innerHTML = '<div class="crw-card">' +
98
+ '<div class="crw-h"><span>即将打开外部窗口</span><button class="crw-x" id="ce-x">×</button></div>' +
99
+ '<div class="crw-desc">CMark 窗口可能会被隐藏。<br>完成授权后重新呼出 CMark(快捷键),授权进度会保留,可以继续完成设置。</div>' +
100
+ '<div class="crw-row end"><button class="crw-b" id="ce-cancel">取消</button>' +
101
+ '<button class="crw-b primary" id="ce-ok">继续打开</button></div></div>'
102
+ doc.body.appendChild(box)
103
+ const closeBox = function () { try { box.remove() } catch (e) {} }
104
+ box.querySelector('#ce-x').onclick = closeBox
105
+ box.querySelector('#ce-cancel').onclick = closeBox
106
+ box.querySelector('#ce-ok').onclick = function () { closeBox(); api.openUrl(url) }
107
+ }
108
+
109
+ // ---- GitHub:申请设备码并轮询 ----
110
+ function ghAuth () {
111
+ stepEl.textContent = '第 1 步 / 共 2 步:授权 GitHub'
112
+ body.innerHTML = '<div class="crw-desc">正在向 GitHub 申请设备码…</div>'
113
+ api.ghStart().then(function (r) {
114
+ if (!r.ok) {
115
+ body.innerHTML = '<div class="crw-msg crw-err">' + esc(r.message) + '</div>'
116
+ return
117
+ }
118
+ const secs = Math.round((r.expiresIn || 900) / 60)
119
+ body.innerHTML = `
120
+ <div class="crw-desc">在浏览器里打开下面的地址,输入这串代码并确认授权(${secs} 分钟内有效):</div>
121
+ <div class="crw-code">${esc(r.userCode)}</div>
122
+ <div class="crw-row">
123
+ <button class="crw-b" id="crw-copy">复制代码</button>
124
+ <button class="crw-b primary" id="crw-open">打开授权页面</button>
125
+ </div>
126
+ <div class="crw-msg crw-dim" id="crw-wait">等待你在浏览器里确认…(授权完成会自动继续)</div>`
127
+ const openBtn = mask.querySelector('#crw-open')
128
+ if (openBtn) openBtn.onclick = function () { confirmExternal(r.verificationUri) }
129
+ const copyBtn = mask.querySelector('#crw-copy')
130
+ if (copyBtn) {
131
+ copyBtn.onclick = function () {
132
+ try {
133
+ if (win.navigator && win.navigator.clipboard) win.navigator.clipboard.writeText(r.userCode)
134
+ else if (win.ztools && win.ztools.copyText) win.ztools.copyText(r.userCode)
135
+ copyBtn.textContent = '已复制'
136
+ } catch (e) {}
137
+ }
138
+ }
139
+ const tick = function () {
140
+ api.ghPoll(r.deviceCode).then(function (p) {
141
+ if (p.ok) {
142
+ state.token = p.token
143
+ return afterToken()
144
+ }
145
+ if (p.message) {
146
+ const w = mask.querySelector('#crw-wait')
147
+ if (w) { w.className = 'crw-msg crw-err'; w.textContent = p.message }
148
+ return
149
+ }
150
+ const w = mask.querySelector('#crw-wait')
151
+ if (w) w.textContent = '等待你在浏览器里确认…(授权完成会自动继续)'
152
+ state.timer = setTimeout(tick, (r.interval || 5) * 1000)
153
+ })
154
+ }
155
+ state.timer = setTimeout(tick, (r.interval || 5) * 1000)
156
+ })
157
+ }
158
+
159
+ // ---- Gitee:粘贴私人令牌 ----
160
+ function giteeAuth () {
161
+ stepEl.textContent = '第 1 步 / 共 2 步:填写 Gitee 私人令牌'
162
+ const TOKEN_URL = 'https://gitee.com/profile/personal_access_tokens'
163
+ body.innerHTML = `
164
+ <div class="crw-desc">打开下面的地址生成私人令牌(勾选 <b>projects</b> 权限),复制后粘贴到下方。</div>
165
+ <div class="crw-row" style="margin-top:10px;align-items:center;gap:8px">
166
+ <span class="crw-url" id="crw-token-url">${TOKEN_URL}</span>
167
+ <button class="crw-b" id="crw-copy-token-url" style="flex:0 0 auto">复制</button>
168
+ </div>
169
+ <div class="crw-row" style="margin-top:12px"><input class="crw-in" id="crw-tk" placeholder="粘贴私人令牌" /></div>
170
+ <div class="crw-row end"><button class="crw-b primary" id="crw-verify">验证并继续</button></div>
171
+ <div class="crw-msg" id="crw-tkmsg"></div>`
172
+ const copyUrlBtn = mask.querySelector('#crw-copy-token-url')
173
+ if (copyUrlBtn) {
174
+ copyUrlBtn.onclick = function () {
175
+ let ok = false
176
+ try {
177
+ if (win.ztools && typeof win.ztools.copyText === 'function') { win.ztools.copyText(TOKEN_URL); ok = true }
178
+ else if (win.navigator && win.navigator.clipboard) { win.navigator.clipboard.writeText(TOKEN_URL); ok = true }
179
+ } catch (e) { ok = false }
180
+ copyUrlBtn.textContent = ok ? '已复制' : '复制失败'
181
+ setTimeout(function () { copyUrlBtn.textContent = '复制' }, 1600)
182
+ }
183
+ }
184
+ const btn = mask.querySelector('#crw-verify')
185
+ btn.onclick = function () {
186
+ const tk = (mask.querySelector('#crw-tk').value || '').trim()
187
+ if (!tk) return
188
+ btn.disabled = true
189
+ const m = mask.querySelector('#crw-tkmsg')
190
+ m.className = 'crw-msg crw-dim'
191
+ m.textContent = '验证中…'
192
+ api.giteeVerify(tk).then(function (r) {
193
+ btn.disabled = false
194
+ if (!r.ok) {
195
+ m.className = 'crw-msg crw-err'
196
+ m.textContent = r.message
197
+ return
198
+ }
199
+ state.token = tk
200
+ afterToken()
201
+ })
202
+ }
203
+ }
204
+
205
+ // ---- 授权完成:列仓库 + 新建/选择 ----
206
+ function afterToken () {
207
+ stopPoll()
208
+ stepEl.textContent = '第 2 步 / 共 2 步:选择仓库'
209
+ body.innerHTML = '<div class="crw-desc">正在读取你的仓库列表…</div>'
210
+ const listFn = state.provider === 'github' ? api.ghListRepos : api.giteeListRepos
211
+ const userFn = state.provider === 'github' ? api.ghUser : api.giteeVerify
212
+ userFn(state.token).then(function (u) {
213
+ if (!u.ok) {
214
+ body.innerHTML = '<div class="crw-msg crw-err">' + esc(u.message) + '</div>'
215
+ return
216
+ }
217
+ state.login = u.login || ''
218
+ return listFn(state.token).then(function (r) {
219
+ if (!r.ok) {
220
+ body.innerHTML = '<div class="crw-msg crw-err">' + esc(r.message) + '</div>'
221
+ return
222
+ }
223
+ state.repos = r.repos || []
224
+ renderPick()
225
+ })
226
+ })
227
+ }
228
+
229
+ function renderPick () {
230
+ const opts = state.repos.map(function (x) {
231
+ return '<option value="' + esc(x.url) + '">' + esc(x.fullName) + (x.private ? '(私有)' : '') + '</option>'
232
+ }).join('')
233
+ // 建仓目标是工作区(仓库根),不是笔记子目录
234
+ let ws = ''
235
+ try { ws = (win.__CMARK && win.__CMARK.repoDir ? win.__CMARK.repoDir() : '') || '' } catch (e) {}
236
+ if (!ws) ws = win.__ZNOTES_WS || ''
237
+ body.innerHTML = `
238
+ <div class="crw-desc">已授权 <b>${esc(state.login)}</b>。当前笔记目录:<br><span class="crw-dim">${esc(ws || '未设置')}</span></div>
239
+ <div class="crw-row" style="margin-top:14px">
240
+ <label class="crw-desc"><input type="radio" name="crw-mode" value="new" checked> 新建仓库</label>
241
+ <label class="crw-desc"><input type="radio" name="crw-mode" value="existing"> 使用已有仓库</label>
242
+ </div>
243
+ <div id="crw-new" class="crw-row"><input class="crw-in" id="crw-name" placeholder="仓库名,如 cmark-notes" value="cmark-notes" /></div>
244
+ <div id="crw-old" class="crw-row" style="display:none"><select class="crw-sel" id="crw-repolist">${opts || '<option value="">(没有可用仓库)</option>'}</select></div>
245
+ <div class="crw-row end"><button class="crw-b primary" id="crw-go">绑定并同步</button></div>
246
+ <div class="crw-msg" id="crw-go-msg"></div>`
247
+ const radios = mask.querySelectorAll('input[name=crw-mode]')
248
+ for (let i = 0; i < radios.length; i++) {
249
+ radios[i].onchange = function () {
250
+ const isNew = mask.querySelector('input[name=crw-mode]:checked').value === 'new'
251
+ mask.querySelector('#crw-new').style.display = isNew ? 'flex' : 'none'
252
+ mask.querySelector('#crw-old').style.display = isNew ? 'none' : 'flex'
253
+ }
254
+ }
255
+ mask.querySelector('#crw-go').onclick = function () {
256
+ const goBtn = mask.querySelector('#crw-go')
257
+ const msg = mask.querySelector('#crw-go-msg')
258
+ const isNew = mask.querySelector('input[name=crw-mode]:checked').value === 'new'
259
+ if (!ws) {
260
+ msg.className = 'crw-msg crw-err'
261
+ msg.textContent = '还没有笔记目录,请先在设置里选择目录'
262
+ return
263
+ }
264
+ goBtn.disabled = true
265
+ msg.className = 'crw-msg crw-dim'
266
+ msg.textContent = isNew ? '正在创建远程仓库…' : '正在绑定已有仓库…'
267
+ const createFn = state.provider === 'github' ? api.ghCreateRepo : api.giteeCreateRepo
268
+ const start = isNew
269
+ ? createFn(state.token, (mask.querySelector('#crw-name').value || 'cmark-notes').trim(), true)
270
+ : Promise.resolve({ ok: true, url: mask.querySelector('#crw-repolist').value })
271
+ start.then(function (c) {
272
+ if (!c.ok) {
273
+ goBtn.disabled = false
274
+ msg.className = 'crw-msg crw-err'
275
+ msg.textContent = c.message || '创建仓库失败'
276
+ return
277
+ }
278
+ msg.textContent = '正在初始化本地仓库并推送…'
279
+ return api.bind({
280
+ provider: state.provider,
281
+ url: c.url,
282
+ token: state.token,
283
+ dir: ws,
284
+ existing: !isNew
285
+ }).then(function (b) {
286
+ goBtn.disabled = false
287
+ if (!b.ok) {
288
+ msg.className = 'crw-msg crw-err'
289
+ msg.textContent = (b.message || '绑定失败') + (b.steps && b.steps.length ? '(已完成:' + b.steps.join(' / ') + ')' : '')
290
+ return
291
+ }
292
+ // 建仓真的成功了:打开 Git 集成开关(按当前工作区落盘),再锁定界面
293
+ try { if (win.__CMARK_GIT && win.__CMARK_GIT.set) win.__CMARK_GIT.set(true) } catch (e) {}
294
+ // git 服务是在插件启动时探测仓库的;刚建好的仓库要让它重新探测一次,
295
+ // 否则设置面板会一直显示「本地仓库未绑定」,直到重启插件
296
+ try { if (win.__znotesGit && win.__znotesGit.rediscover) win.__znotesGit.rediscover() } catch (e) {}
297
+ // 成功即锁定:清空可选仓库/输入,只留一个「完成按钮」,避免继续改配置把状态搞乱
298
+ stopPoll()
299
+ stepEl.textContent = '已完成'
300
+ body.innerHTML = `
301
+ <div class="crw-desc"><b>${state.provider === 'github' ? 'GitHub' : 'Gitee'}</b> 仓库已绑定</div>
302
+ <div class="crw-code" style="font-size:12.5px;letter-spacing:0;padding:12px;word-break:break-all;text-align:left">${esc(c.url)}</div>
303
+ <dl class="crw-kv" style="display:grid;grid-template-columns:56px 1fr;gap:6px 10px;font-size:12px;color:var(--zgp-fg2,#57606a)">
304
+ <dt>目录</dt><dd style="margin:0">${esc(ws)}</dd>
305
+ <dt>步骤</dt><dd style="margin:0">${esc((b.steps || []).join(' / ') || '已完成')}</dd>
306
+ </dl>
307
+ <div class="crw-msg crw-dim" style="margin-top:10px">这个窗口可以关掉了。之后的改动按设置里的自动同步策略推送。</div>
308
+ <div class="crw-row end"><button class="crw-b primary" id="crw-done">完成</button></div>`
309
+ const doneBtn = mask.querySelector('#crw-done')
310
+ if (doneBtn) doneBtn.onclick = close
311
+ return
312
+ })
313
+ })
314
+ }
315
+ }
316
+
317
+ if (provider === 'github') ghAuth()
318
+ else giteeAuth()
319
+ }
320
+
321
+ function esc (s) {
322
+ return String(s == null ? '' : s).replace(/[&<>"']/g, function (c) {
323
+ return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[c]
324
+ })
325
+ }
326
+
327
+ win.__CMARK_OPEN_WIZARD = open
328
+ }
@@ -0,0 +1,150 @@
1
+ // 笔记重命名弹层:目录树右键「重命名」调用
2
+ // 改标题后走 __NDB.put,put 内部会把磁盘文件同步改名
3
+ module.exports = function (win, findInstance) {
4
+ const doc = win.document
5
+ const ID = 'znotes-rename'
6
+ const STYLE_ID = ID + '-style'
7
+ const LOG = function () {} // 调试打点已关闭
8
+
9
+ function injectStyle() {
10
+ if (doc.getElementById(STYLE_ID)) return
11
+ const st = doc.createElement('style')
12
+ st.id = STYLE_ID
13
+ st.textContent = `
14
+ #${ID}{position:fixed;inset:0;z-index:2147483200;display:none;align-items:center;justify-content:center;
15
+ background:rgba(0,0,0,.28);}
16
+ #${ID}.open{display:flex;}
17
+ #${ID} .zrn-card{width:340px;max-width:86vw;border-radius:10px;background:#fff;color:#1f2328;
18
+ box-shadow:0 16px 40px rgba(0,0,0,.28);padding:16px 18px 14px;font-size:13px;}
19
+ #${ID} .zrn-title{font-weight:600;font-size:13.5px;margin-bottom:10px;}
20
+ #${ID} input{width:100%;box-sizing:border-box;padding:8px 10px;border-radius:6px;
21
+ border:1px solid rgba(128,128,128,.42);background:transparent;color:inherit;font-size:13px;outline:none;}
22
+ #${ID} input:focus{border-color:#3f7ef7;}
23
+ #${ID} .zrn-btns{display:flex;justify-content:flex-end;gap:8px;margin-top:14px;}
24
+ #${ID} button{padding:6px 14px;border-radius:6px;border:1px solid rgba(128,128,128,.36);
25
+ background:transparent;color:inherit;font-size:12.5px;cursor:pointer;}
26
+ #${ID} button.primary{background:#3f7ef7;border-color:#3f7ef7;color:#fff;}
27
+ :root[data-theme='dark'] #${ID} .zrn-card{background:#2b2f36;color:#e6e6e6;box-shadow:0 16px 40px rgba(0,0,0,.5);}
28
+ :root[data-theme='dark'] #${ID} input{border-color:rgba(255,255,255,.22);}
29
+ :root[data-theme='dark'] #${ID} button{border-color:rgba(255,255,255,.2);}
30
+
31
+ `
32
+ try { (doc.head || doc.body || doc.documentElement).appendChild(st) } catch (e) {}
33
+ }
34
+
35
+ let root = null
36
+ let onSubmit = null
37
+ let promptTitle = '重命名笔记'
38
+
39
+ function ensure() {
40
+ injectStyle()
41
+ if (root && doc.body.contains(root)) return root
42
+ root = doc.createElement('div')
43
+ root.id = ID
44
+ root.innerHTML =
45
+ '<div class="zrn-card">' +
46
+ '<div class="zrn-title"></div>' +
47
+ '<input type="text" maxlength="120" spellcheck="false">' +
48
+ '<div class="zrn-btns">' +
49
+ '<button data-act="cancel">取消</button>' +
50
+ '<button data-act="ok" class="primary">确定</button>' +
51
+ '</div></div>'
52
+ const input = root.querySelector('input')
53
+ root.addEventListener('mousedown', function (e) {
54
+ if (e.target === root) hide()
55
+ e.stopPropagation()
56
+ })
57
+ root.addEventListener('click', function (e) {
58
+ const b = e.target.closest && e.target.closest('button[data-act]')
59
+ LOG('click on rename root: ' + (b ? b.getAttribute('data-act') : 'non-button'))
60
+ if (!b) return
61
+ if (b.getAttribute('data-act') === 'ok') submit()
62
+ else hide()
63
+ })
64
+ root.addEventListener('keydown', function (e) {
65
+ if (e.key === 'Enter') { e.preventDefault(); submit() }
66
+ else if (e.key === 'Escape') { e.preventDefault(); hide() }
67
+ e.stopPropagation()
68
+ })
69
+ doc.body.appendChild(root)
70
+ return root
71
+ }
72
+
73
+ function hide() {
74
+ LOG('hide, was=' + (root ? root.classList.contains('open') : 'no-root'))
75
+ if (root) root.classList.remove('open')
76
+ onSubmit = null
77
+ }
78
+
79
+ function submit() {
80
+ LOG('submit called, hasCb=' + !!onSubmit)
81
+ const input = root && root.querySelector('input')
82
+ const val = input ? String(input.value || '').trim() : ''
83
+ const cur = onSubmit
84
+ hide()
85
+ if (!val || !cur) return
86
+ cur(val)
87
+ }
88
+
89
+ function openNote(node, fallbackDoc) {
90
+ const el = ensure()
91
+ let id = node && node.data && node.data.id
92
+ let d = id ? (win.NOTES_DIC || {})[id] : null
93
+ if (!d && fallbackDoc) { d = fallbackDoc; id = fallbackDoc._id }
94
+ if (!d) return
95
+ const old = String(d.title || '')
96
+ promptTitle = '重命名笔记'
97
+ el.querySelector('.zrn-title').textContent = promptTitle
98
+ const input = el.querySelector('input')
99
+ input.value = old
100
+ el.classList.add('open')
101
+ setTimeout(function () { try { input.focus(); input.select() } catch (e) {} }, 20)
102
+ onSubmit = function (next) {
103
+ if (next === old) return
104
+ const doc2 = {}
105
+ for (const k in d) if (Object.prototype.hasOwnProperty.call(d, k)) doc2[k] = d[k]
106
+ doc2.title = next
107
+ let res = null
108
+ try { res = win.__NDB.put(doc2) } catch (e) { res = { error: true, message: String(e && e.message) } }
109
+ if (res && res.error) {
110
+ try { win.ztools.showNotification('重命名失败:' + (res.message || '')) } catch (e) {}
111
+ return
112
+ }
113
+ // put 可能把 _id 改成新的物理路径,同步 NOTES_DIC 的键
114
+ const newId = (doc2 && doc2._id) || id
115
+ if (newId !== id) { try { delete win.NOTES_DIC[id] } catch (e) {} }
116
+ doc2._id = newId
117
+ win.NOTES_DIC[newId] = doc2
118
+ // 当前打开的就是这篇:立刻替换 workNote,面板顶部文件名即时更新
119
+ try {
120
+ const inst = findInstance('main')
121
+ if (inst && inst.state && inst.state.workNote && inst.state.workNote._id === id) {
122
+ inst.setState({ workNote: doc2 })
123
+ }
124
+ } catch (e) {}
125
+ try { if (win.__znotesRefreshTree) win.__znotesRefreshTree() } catch (e) {}
126
+ }
127
+ }
128
+
129
+ // 通用输入弹层:title=标题,value=默认值,cb(输入值)
130
+ win.__znotesPrompt = function (title, value, cb) {
131
+ const el = ensure()
132
+ promptTitle = title || ''
133
+ el.querySelector('.zrn-title').textContent = promptTitle
134
+ el.querySelector('input').value = value == null ? '' : String(value)
135
+ el.classList.add('open')
136
+ LOG('open title=' + promptTitle)
137
+ setTimeout(function () { try { const i = el.querySelector('input'); i.focus(); i.select() } catch (e) {} }, 20)
138
+ onSubmit = cb
139
+ }
140
+
141
+ win.__znotesRenameNote = function (node) {
142
+ let inst = null
143
+ try { inst = findInstance('main') } catch (e) {}
144
+ const sb = inst && inst.sidebarRef
145
+ const n = node || (sb && sb.state && sb.state.contextMenu && sb.state.contextMenu.node)
146
+ const fb = inst && inst.state && inst.state.workNote
147
+ openNote(n, fb)
148
+ }
149
+ win.__znotesRenameOpen = openNote
150
+ }