@akairos/myno 0.2.4 → 0.3.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.
- package/CHANGELOG.md +8 -0
- package/LICENSE +21 -0
- package/README.md +79 -2
- package/dist/.vite/manifest.json +74 -37
- package/dist/adapter.d.ts +20 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +31 -0
- package/dist/adapter.js.map +1 -0
- package/dist/assets/index-76YuLxi3.js +1 -0
- package/dist/assets/index-B7RyVmkn.js +1 -0
- package/dist/assets/index-BFqVGrx5.js +1 -0
- package/dist/assets/index-BWCTJYba.js +1 -0
- package/dist/assets/index-BafFtz6v.js +1 -0
- package/dist/assets/index-BbBk60Ij.js +1 -0
- package/dist/assets/index-Be5b0nfK.js +7 -0
- package/dist/assets/index-BsFL19fO.js +1 -0
- package/dist/assets/index-BvNjhitP.js +1 -0
- package/dist/assets/index-C4U9J6mP.js +1 -0
- package/dist/assets/index-C6M3EF2u.js +1 -0
- package/dist/assets/index-CFRD2Kea.js +13 -0
- package/dist/assets/index-CMxKN2ug.js +1 -0
- package/dist/assets/{index-CddMuxp_.js → index-CYmRM47f.js} +2 -2
- package/dist/assets/index-CbDkmZGJ.js +1 -0
- package/dist/assets/index-CgHZBsFk.js +3 -0
- package/dist/assets/index-CkuA2-Dq.js +1 -0
- package/dist/assets/index-DAD2d4p9.js +1 -0
- package/dist/assets/index-Dap3LTeU.js +1 -0
- package/dist/assets/index-N1oAD1df.js +1 -0
- package/dist/assets/{index-CDgREgYC.js → index-geduL7if.js} +2 -2
- package/dist/assets/style-Dbq6kayK.css +1 -0
- package/dist/assets/syntax-presets-CoA-zUgk.js +1263 -0
- package/dist/editor/myno-editor.d.ts +2 -2
- package/dist/editor/myno-editor.d.ts.map +1 -1
- package/dist/editor/myno-editor.js +2 -2
- package/dist/editor/myno-editor.js.map +1 -1
- package/dist/editor-export.js +3 -0
- package/dist/src/studio/studio.html +8 -7
- package/dist/studio/editor-export.d.ts +22 -0
- package/dist/studio/editor-export.d.ts.map +1 -0
- package/dist/studio/editor-export.js +42 -0
- package/dist/studio/editor-export.js.map +1 -0
- package/dist/studio/studio-config.d.ts +32 -0
- package/dist/studio/studio-config.d.ts.map +1 -0
- package/dist/studio/studio-config.js +70 -0
- package/dist/studio/studio-config.js.map +1 -0
- package/dist/studio/studio.js +56 -36
- package/dist/studio/studio.js.map +1 -1
- package/dist/studio.js +107 -1353
- package/dist/styles/article.css +646 -0
- package/dist/styles/index.css +2 -0
- package/dist/styles/tokens-default.css +30 -0
- package/package.json +12 -4
- package/dist/assets/index-6xZjfNBY.js +0 -1
- package/dist/assets/index-7jqFg9Mv.js +0 -13
- package/dist/assets/index-AdP2vXVD.js +0 -1
- package/dist/assets/index-BHPv-A3N.js +0 -1
- package/dist/assets/index-BL9wSBtZ.js +0 -1
- package/dist/assets/index-BjawAflQ.js +0 -1
- package/dist/assets/index-C0JZnjgf.js +0 -3
- package/dist/assets/index-C1vHAMos.js +0 -1
- package/dist/assets/index-CIYtVPt-.js +0 -1
- package/dist/assets/index-CmlqrlxY.js +0 -7
- package/dist/assets/index-Crr2UUqW.js +0 -1
- package/dist/assets/index-D3-l1kuh.js +0 -1
- package/dist/assets/index-D5AbviI1.js +0 -1
- package/dist/assets/index-D8eibMZn.js +0 -1
- package/dist/assets/index-DLh7eEmr.js +0 -1
- package/dist/assets/index-Q5rzr3Yl.js +0 -1
- package/dist/assets/index-RrNfwOco.js +0 -1
- package/dist/assets/index-kgpju2R2.js +0 -1
- package/dist/assets/index-qjQPn-9r.js +0 -1
- package/dist/assets/style-Cif_gYUW.css +0 -1
- package/dist/assets/style-DG6dI-L6.css +0 -1
|
@@ -3,8 +3,8 @@ import type { CrepeConfig } from "@milkdown/crepe";
|
|
|
3
3
|
import type { MilkdownPlugin } from "@milkdown/kit/ctx";
|
|
4
4
|
import "@milkdown/crepe/theme/common/style.css";
|
|
5
5
|
import "@milkdown/crepe/theme/frame.css";
|
|
6
|
-
import "
|
|
7
|
-
import "
|
|
6
|
+
import "../styles/tokens-default.css";
|
|
7
|
+
import "../styles/article.css";
|
|
8
8
|
export interface MynoEditorOptions {
|
|
9
9
|
root: HTMLElement;
|
|
10
10
|
defaultValue?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"myno-editor.d.ts","sourceRoot":"","sources":["../../src/editor/myno-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAiBxD,OAAO,wCAAwC,CAAC;AAChD,OAAO,iCAAiC,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"myno-editor.d.ts","sourceRoot":"","sources":["../../src/editor/myno-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAiBxD,OAAO,wCAAwC,CAAC;AAChD,OAAO,iCAAiC,CAAC;AACzC,OAAO,8BAA8B,CAAC;AACtC,OAAO,uBAAuB,CAAC;AAE/B,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,kDAAkD;IAClD,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9C,sDAAsD;IACtD,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,6CAA6C;IAC7C,cAAc,CAAC,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAC/C,0CAA0C;IAC1C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;QACjD,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,CAAC;CACH;AAID,qBAAa,UAAU;IACrB,OAAO,CAAC,KAAK,CAAsB;IACnC,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,iBAAiB;IAIhC,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;IA2E9B,sDAAsD;IACtD,gBAAgB,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC,aAAa,CAAC;IAuB/D,WAAW,IAAI,MAAM;IAKrB,WAAW,CAAC,QAAQ,EAAE,MAAM;IAc5B,WAAW,CAAC,QAAQ,EAAE,OAAO;IAI7B,QAAQ,IAAI,KAAK,GAAG,IAAI;IAIlB,OAAO;CAOd"}
|
|
@@ -10,8 +10,8 @@ import { buildCombinedPresetsCss } from "../studio/syntax-presets";
|
|
|
10
10
|
import { buildWechatThemeCss, getWechatPreviewTheme } from "../studio/themes";
|
|
11
11
|
import "@milkdown/crepe/theme/common/style.css";
|
|
12
12
|
import "@milkdown/crepe/theme/frame.css";
|
|
13
|
-
import "
|
|
14
|
-
import "
|
|
13
|
+
import "../styles/tokens-default.css";
|
|
14
|
+
import "../styles/article.css";
|
|
15
15
|
const PRESET_STYLE_ID = "myno-editor-preset-css";
|
|
16
16
|
export class MynoEditor {
|
|
17
17
|
crepe = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"myno-editor.js","sourceRoot":"","sources":["../../src/editor/myno-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5E,iDAAiD;AACjD,+CAA+C;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,wCAAwC,CAAC;AAChD,OAAO,iCAAiC,CAAC;AACzC,OAAO,
|
|
1
|
+
{"version":3,"file":"myno-editor.js","sourceRoot":"","sources":["../../src/editor/myno-editor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,EACnB,aAAa,EACb,SAAS,GACV,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5E,iDAAiD;AACjD,+CAA+C;AAC/C,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAE9E,OAAO,wCAAwC,CAAC;AAChD,OAAO,iCAAiC,CAAC;AACzC,OAAO,8BAA8B,CAAC;AACtC,OAAO,uBAAuB,CAAC;AA2B/B,MAAM,eAAe,GAAG,wBAAwB,CAAC;AAEjD,MAAM,OAAO,UAAU;IACb,KAAK,GAAiB,IAAI,CAAC;IAC3B,OAAO,CAAoB;IAC3B,WAAW,GAAG,KAAK,CAAC;IAE5B,YAAY,OAA0B;QACpC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,EAAE,EAAE,QAAQ,GAAG,KAAK,EAAE,WAAW,GAAG,wBAAwB,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAEzK,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAEnC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC;YACtB,IAAI;YACJ,YAAY;YACZ,QAAQ,EAAE,QAAQ;gBAChB,CAAC,CAAC;oBACE,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK;oBAChC,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK;oBAClC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK;oBAC9B,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK;iBAC9B;gBACH,CAAC,CAAC,SAAS;YACb,cAAc,EAAE;gBACd,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;oBACzB,SAAS,EAAE,gBAAgB;iBAC5B;gBACD,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;oBACvB,YAAY,EAAE,oBAAoB;iBACnC;gBACD,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBACtB,WAAW,EAAE,mBAAmB;iBACjC;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,WAAW;oBACjB,IAAI,EAAE,KAAK;iBACZ;gBACD,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjF,GAAG,cAAc;aAClB;SACF,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,0BAA0B,EAAE,CAAC,CAAC;QAC/C,KAAK,MAAM,MAAM,IAAI,OAAO,IAAI,EAAE,EAAE,CAAC;YACnC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YAChB,sCAAsC;YACtC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,CAC3B,2BAA2B,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAC/F,CAAC,CAAC;QACL,CAAC;QAED,KAAK,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE;YACpB,QAAQ,CAAC,eAAe,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;gBAC1C,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;oBACvD,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,IAAI,WAAW,EAAE,CAAC;YAChB,2BAA2B;YAC3B,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC1B,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtF,CAAC,CAAC,CAAC;QACL,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;QAEzB,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,IAAI,EAAE,GAAG,EAAE,CAAC;gBACd,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACjD,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sDAAsD;IACtD,gBAAgB,CAAC,WAA8C;QAC7D,IAAI,QAAQ,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAA4B,CAAC;QACnF,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC3C,QAAQ,CAAC,EAAE,GAAG,eAAe,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QACD,MAAM,OAAO,GAAG,uBAAuB,CAAC,WAAW,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;eAChF,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,WAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7G,uCAAuC;QACvC,MAAM,QAAQ,GAAG,QAAQ;YACvB,CAAC,CAAC,mBAAmB,CACjB,WAAY,CAAC,UAAU,IAAI,EAAE,EAC7B,qBAAqB,CAAC,SAAS,EAAE;gBAC/B,UAAU,EAAE,WAAY,CAAC,UAAU;gBACnC,WAAW,EAAE,WAAY,CAAC,WAAoB;aAC/C,CAAC,CAAC,WAAW,CACf;YACH,CAAC,CAAC,EAAE,CAAC;QACP,QAAQ,CAAC,WAAW,GAAG,GAAG,OAAO,KAAK,QAAQ,EAAE,CAAC;IACnD,CAAC;IAED,WAAW;QACT,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACxB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAC/B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;YAChC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;YACvB,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;YACxE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,QAAiB;QAC3B,IAAI,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{E as c,r as m,d,c as _,g as l,a as u,b as w,e as f,f as g,h}from"./assets/syntax-presets-CoA-zUgk.js";async function C(){const t=window.__ZZHUB_WECHAT_PAYLOAD__,s=c.make().config(e=>{e.set(m,document.getElementById("editor-host")),e.set(d,t.markdown)}).use(_).use(l).use(u());try{await s.create();const e=new DOMParser().parseFromString(s.action(w()),"text/html");for(const n of e.querySelectorAll("img")){const r=n.getAttribute("src")||"";if(r&&!/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i.test(r)){const o=new URL(r,t.assetBaseUrl);n.src=o.protocol==="file:"?decodeURIComponent(o.pathname):o.href}}const a=e.body.innerHTML,i=await f({semanticHtml:a,baseCss:h,customCss:[g(t.syntaxPresets??{}),t.customCss].filter(Boolean).join(`
|
|
2
|
+
|
|
3
|
+
`),structure:t.structure,editorVars:t.editorVars,theme:t.exportTheme});window.__ZZHUB_SET_RESULT__({status:"success",html:i,semanticHtml:a})}catch(e){window.__ZZHUB_SET_RESULT__({status:"error",error:e instanceof Error?e.message:String(e)})}finally{await s.destroy()}}C().catch(t=>window.__ZZHUB_SET_RESULT__({status:"error",error:String(t)}));
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
6
|
<title>myno — 微信公众号排版工作台</title>
|
|
7
|
-
<script type="module" crossorigin src="
|
|
8
|
-
<link rel="
|
|
7
|
+
<script type="module" crossorigin src="../../studio.js"></script>
|
|
8
|
+
<link rel="modulepreload" crossorigin href="../../assets/syntax-presets-CoA-zUgk.js">
|
|
9
|
+
<link rel="stylesheet" crossorigin href="../../assets/style-Dbq6kayK.css">
|
|
9
10
|
</head>
|
|
10
11
|
<body>
|
|
11
12
|
<!-- Header -->
|
|
@@ -21,14 +22,14 @@
|
|
|
21
22
|
<span class="brand-title">myno</span>
|
|
22
23
|
<span class="brand-subtitle">WeChat Visual Studio</span>
|
|
23
24
|
</div>
|
|
24
|
-
<span id="config-mode-badge" class="badge badge-subtle"
|
|
25
|
+
<span id="config-mode-badge" class="badge badge-subtle">本地模式</span>
|
|
25
26
|
</div>
|
|
26
27
|
|
|
27
28
|
<!-- Center Config Selector -->
|
|
28
29
|
<div class="header-center">
|
|
29
30
|
<div class="config-selector-group">
|
|
30
|
-
<label for="account-select" class="selector-label">目标配置:</label>
|
|
31
|
-
<select id="account-select" class="select-control">
|
|
31
|
+
<label for="account-select" class="selector-label" hidden>目标配置:</label>
|
|
32
|
+
<select id="account-select" class="select-control" hidden>
|
|
32
33
|
<option value="default">默认账号 (default)</option>
|
|
33
34
|
</select>
|
|
34
35
|
<button id="btn-import-config" class="btn btn-ghost btn-sm" title="导入已有 wechat-style.json 排版配置">
|
|
@@ -47,7 +48,7 @@
|
|
|
47
48
|
<span>🔄 重置</span>
|
|
48
49
|
</button>
|
|
49
50
|
|
|
50
|
-
<button id="btn-save" class="btn btn-primary btn-sm" title="保存当前调整至本地 config.json 的当前账号">
|
|
51
|
+
<button id="btn-save" class="btn btn-primary btn-sm" title="保存当前调整至本地 config.json 的当前账号" hidden>
|
|
51
52
|
<span>💾 保存至账号</span>
|
|
52
53
|
</button>
|
|
53
54
|
|
|
@@ -55,7 +56,7 @@
|
|
|
55
56
|
<span>📋 一键复制到公众号</span>
|
|
56
57
|
</button>
|
|
57
58
|
|
|
58
|
-
<a href="/" class="btn btn-ghost btn-sm" title="查看最近渲染记录">
|
|
59
|
+
<a id="history-link" href="/" class="btn btn-ghost btn-sm" title="查看最近渲染记录" hidden>
|
|
59
60
|
<span>📜 历史记录</span>
|
|
60
61
|
</a>
|
|
61
62
|
</div>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ArticleStructure } from "./wechat-renderer";
|
|
2
|
+
import type { WechatExportTheme } from "./themes";
|
|
3
|
+
declare global {
|
|
4
|
+
interface Window {
|
|
5
|
+
__ZZHUB_WECHAT_PAYLOAD__: {
|
|
6
|
+
markdown: string;
|
|
7
|
+
assetBaseUrl: string;
|
|
8
|
+
editorVars: Record<string, string>;
|
|
9
|
+
exportTheme: WechatExportTheme;
|
|
10
|
+
syntaxPresets?: Record<string, string>;
|
|
11
|
+
structure?: ArticleStructure;
|
|
12
|
+
customCss?: string;
|
|
13
|
+
};
|
|
14
|
+
__ZZHUB_SET_RESULT__: (result: {
|
|
15
|
+
status: "success" | "error";
|
|
16
|
+
html?: string;
|
|
17
|
+
semanticHtml?: string;
|
|
18
|
+
error?: string;
|
|
19
|
+
}) => void;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=editor-export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-export.d.ts","sourceRoot":"","sources":["../../src/studio/editor-export.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,wBAAwB,EAAE;YACxB,QAAQ,EAAE,MAAM,CAAC;YACjB,YAAY,EAAE,MAAM,CAAC;YACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACnC,WAAW,EAAE,iBAAiB,CAAC;YAC/B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACvC,SAAS,CAAC,EAAE,gBAAgB,CAAC;YAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,oBAAoB,EAAE,CAAC,MAAM,EAAE;YAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,YAAY,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;KAC/H;CACF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defaultValueCtx, Editor, rootCtx } from "@milkdown/kit/core";
|
|
2
|
+
import { commonmark } from "@milkdown/kit/preset/commonmark";
|
|
3
|
+
import { gfm } from "@milkdown/kit/preset/gfm";
|
|
4
|
+
import { getHTML } from "@milkdown/kit/utils";
|
|
5
|
+
import articleCss from "../styles/article.css?raw";
|
|
6
|
+
import { getCombinedMilkdownPlugins } from "@akairos/milkdown-article-plugins";
|
|
7
|
+
import { renderWechatHtml } from "./wechat-renderer";
|
|
8
|
+
import { buildCombinedPresetsCss } from "./syntax-presets";
|
|
9
|
+
/** 无交互导出入口,与 Studio 共用 myno 的语法、预设和微信渲染器。 */
|
|
10
|
+
async function main() {
|
|
11
|
+
const payload = window.__ZZHUB_WECHAT_PAYLOAD__;
|
|
12
|
+
const editor = Editor.make().config(ctx => {
|
|
13
|
+
ctx.set(rootCtx, document.getElementById("editor-host"));
|
|
14
|
+
ctx.set(defaultValueCtx, payload.markdown);
|
|
15
|
+
}).use(commonmark).use(gfm).use(getCombinedMilkdownPlugins());
|
|
16
|
+
try {
|
|
17
|
+
await editor.create();
|
|
18
|
+
const semantic = new DOMParser().parseFromString(editor.action(getHTML()), "text/html");
|
|
19
|
+
for (const image of semantic.querySelectorAll("img")) {
|
|
20
|
+
const src = image.getAttribute("src") || "";
|
|
21
|
+
if (src && !/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i.test(src)) {
|
|
22
|
+
const url = new URL(src, payload.assetBaseUrl);
|
|
23
|
+
image.src = url.protocol === "file:" ? decodeURIComponent(url.pathname) : url.href;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const semanticHtml = semantic.body.innerHTML;
|
|
27
|
+
const html = await renderWechatHtml({
|
|
28
|
+
semanticHtml, baseCss: articleCss,
|
|
29
|
+
customCss: [buildCombinedPresetsCss(payload.syntaxPresets ?? {}), payload.customCss].filter(Boolean).join("\n\n"),
|
|
30
|
+
structure: payload.structure, editorVars: payload.editorVars, theme: payload.exportTheme,
|
|
31
|
+
});
|
|
32
|
+
window.__ZZHUB_SET_RESULT__({ status: "success", html, semanticHtml });
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
window.__ZZHUB_SET_RESULT__({ status: "error", error: error instanceof Error ? error.message : String(error) });
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
await editor.destroy();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
void main().catch(error => window.__ZZHUB_SET_RESULT__({ status: "error", error: String(error) }));
|
|
42
|
+
//# sourceMappingURL=editor-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-export.js","sourceRoot":"","sources":["../../src/studio/editor-export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type WechatPluginDoc } from "@akairos/milkdown-article-plugins";
|
|
2
|
+
import { type WechatExportTheme } from "./themes";
|
|
3
|
+
import type { ArticleStructure } from "./wechat-renderer";
|
|
4
|
+
export interface AccountData {
|
|
5
|
+
name: string;
|
|
6
|
+
customCssPath: string | null;
|
|
7
|
+
customCssContent: string;
|
|
8
|
+
theme: {
|
|
9
|
+
editorVars: Record<string, string>;
|
|
10
|
+
exportTheme: Partial<WechatExportTheme>;
|
|
11
|
+
syntaxPresets?: Record<string, string>;
|
|
12
|
+
structure?: ArticleStructure;
|
|
13
|
+
};
|
|
14
|
+
articleThemeCss?: string;
|
|
15
|
+
articleTheme?: string | null;
|
|
16
|
+
articleThemeStandalone?: boolean;
|
|
17
|
+
}
|
|
18
|
+
export interface StudioConfigResponse {
|
|
19
|
+
defaultAccount: string;
|
|
20
|
+
accounts: Record<string, AccountData>;
|
|
21
|
+
plugins: WechatPluginDoc[];
|
|
22
|
+
sampleMarkdown: string;
|
|
23
|
+
}
|
|
24
|
+
/** 独立工作台使用本包主题和语法示例,不带发布账号的署名。 */
|
|
25
|
+
export declare function createLocalStudioConfig(): StudioConfigResponse;
|
|
26
|
+
/** 宿主配置优先;接口缺失或失败时保留完整的本地工作台。 */
|
|
27
|
+
export declare function loadStudioConfig(fetchConfig?: (input: string, init: RequestInit) => Promise<Response>): Promise<{
|
|
28
|
+
config: StudioConfigResponse;
|
|
29
|
+
source: "local" | "pipeline";
|
|
30
|
+
error?: string;
|
|
31
|
+
}>;
|
|
32
|
+
//# sourceMappingURL=studio-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-config.d.ts","sourceRoot":"","sources":["../../src/studio/studio-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACxF,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,EAAE;QACL,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,WAAW,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACxC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,SAAS,CAAC,EAAE,gBAAgB,CAAC;KAC9B,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,kCAAkC;AAClC,wBAAgB,uBAAuB,IAAI,oBAAoB,CA4B9D;AAED,iCAAiC;AACjC,wBAAsB,gBAAgB,CAAC,WAAW,GAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAS,GAAG,OAAO,CAAC;IAC5H,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CA+BD"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { getPluginDocs } from "@akairos/milkdown-article-plugins";
|
|
2
|
+
import { getWechatPreviewTheme } from "./themes";
|
|
3
|
+
/** 独立工作台使用本包主题和语法示例,不带发布账号的署名。 */
|
|
4
|
+
export function createLocalStudioConfig() {
|
|
5
|
+
const theme = getWechatPreviewTheme("default", { exportTheme: { footerText: "" } });
|
|
6
|
+
const plugins = getPluginDocs();
|
|
7
|
+
return {
|
|
8
|
+
defaultAccount: "default",
|
|
9
|
+
accounts: {
|
|
10
|
+
default: {
|
|
11
|
+
name: "本地默认",
|
|
12
|
+
customCssPath: null,
|
|
13
|
+
customCssContent: "",
|
|
14
|
+
theme: { editorVars: { ...theme.editorVars }, exportTheme: { ...theme.exportTheme } },
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
plugins,
|
|
18
|
+
sampleMarkdown: [
|
|
19
|
+
"# 微信排版示例",
|
|
20
|
+
"## 从一段文字开始",
|
|
21
|
+
"在这里写下你的内容,调整左侧样式后,可一键复制到公众号,或导出配置供下次使用。",
|
|
22
|
+
"这段正文包含 **加粗**、*斜体*、[链接](https://example.com) 和 `行内代码`。",
|
|
23
|
+
"> 引用可以补充背景,也可以呈现一段值得记住的话。",
|
|
24
|
+
"### 列表与表格",
|
|
25
|
+
"- 写作\n- 调整样式\n- 复制或导出",
|
|
26
|
+
"| 项目 | 说明 |\n| --- | --- |\n| 正文 | 调整字号与行距 |\n| 配置 | 导出为 JSON |",
|
|
27
|
+
"```ts\nconst message = 'Hello, myno';\n```",
|
|
28
|
+
"---",
|
|
29
|
+
...plugins.map(plugin => `### ${plugin.name}\n\n${plugin.sampleMarkdown}`),
|
|
30
|
+
].join("\n\n"),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
/** 宿主配置优先;接口缺失或失败时保留完整的本地工作台。 */
|
|
34
|
+
export async function loadStudioConfig(fetchConfig = fetch) {
|
|
35
|
+
const local = createLocalStudioConfig();
|
|
36
|
+
try {
|
|
37
|
+
const response = await fetchConfig("/api/studio/config", { signal: AbortSignal.timeout(3000) });
|
|
38
|
+
if (response.status === 404)
|
|
39
|
+
return { config: local, source: "local" };
|
|
40
|
+
if (!response.ok)
|
|
41
|
+
throw new Error(`HTTP ${response.status}`);
|
|
42
|
+
const data = await response.json();
|
|
43
|
+
if (!data?.accounts || typeof data.accounts !== "object" || Array.isArray(data.accounts) || !data.accounts[data.defaultAccount]?.theme) {
|
|
44
|
+
throw new Error("工作台配置缺少有效的默认账号");
|
|
45
|
+
}
|
|
46
|
+
const accounts = {};
|
|
47
|
+
for (const [key, account] of Object.entries(data.accounts)) {
|
|
48
|
+
if (!account?.theme)
|
|
49
|
+
throw new Error(`账号 ${key} 缺少主题配置`);
|
|
50
|
+
const theme = getWechatPreviewTheme("default", {
|
|
51
|
+
editorVars: account.theme.editorVars,
|
|
52
|
+
exportTheme: { footerText: "", ...account.theme.exportTheme },
|
|
53
|
+
});
|
|
54
|
+
accounts[key] = {
|
|
55
|
+
...local.accounts.default,
|
|
56
|
+
...account,
|
|
57
|
+
name: account.name || key,
|
|
58
|
+
theme: { ...account.theme, editorVars: { ...theme.editorVars }, exportTheme: { ...theme.exportTheme } },
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
source: "pipeline",
|
|
63
|
+
config: { ...data, accounts, plugins: data.plugins ?? local.plugins, sampleMarkdown: data.sampleMarkdown || local.sampleMarkdown },
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return { config: local, source: "local", error: error instanceof Error ? error.message : String(error) };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=studio-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-config.js","sourceRoot":"","sources":["../../src/studio/studio-config.ts"],"names":[],"mappings":"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"}
|
package/dist/studio/studio.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import articleCss from "
|
|
1
|
+
import articleCss from "../styles/article.css?raw";
|
|
2
2
|
import { Editor, defaultValueCtx, rootCtx } from "@milkdown/kit/core";
|
|
3
3
|
import { commonmark } from "@milkdown/kit/preset/commonmark";
|
|
4
4
|
import { gfm } from "@milkdown/kit/preset/gfm";
|
|
@@ -11,9 +11,12 @@ import { COLOR_PALETTES } from "./color-palettes";
|
|
|
11
11
|
import { parseStyleConfig, exportStyleConfigBlob } from "./config-manager";
|
|
12
12
|
import { renderWechatHtml } from "./wechat-renderer";
|
|
13
13
|
import { buildWechatThemeCss } from "./themes";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
let
|
|
14
|
+
import { createLocalStudioConfig, loadStudioConfig } from "./studio-config";
|
|
15
|
+
// 本地默认数据始终可用,宿主加载失败不会中断编辑器初始化。
|
|
16
|
+
let studioConfig = createLocalStudioConfig();
|
|
17
|
+
let accounts = studioConfig.accounts;
|
|
18
|
+
let currentAccount = studioConfig.defaultAccount;
|
|
19
|
+
let pipelineConnected = false;
|
|
17
20
|
let latestWechatHtml = "";
|
|
18
21
|
let debounceTimer = null;
|
|
19
22
|
let showingHtmlSource = false;
|
|
@@ -71,6 +74,8 @@ const btnCopy = document.getElementById("btn-copy");
|
|
|
71
74
|
const btnToggleView = document.getElementById("btn-toggle-view");
|
|
72
75
|
const btnLoadSample = document.getElementById("btn-load-sample");
|
|
73
76
|
const btnClearMd = document.getElementById("btn-clear-md");
|
|
77
|
+
const historyLink = document.getElementById("history-link");
|
|
78
|
+
const accountLabel = document.querySelector('label[for="account-select"]');
|
|
74
79
|
// ── Toast System ────────────────────────────────────────────────────────
|
|
75
80
|
function showToast(message, type = "info") {
|
|
76
81
|
if (!toastContainer)
|
|
@@ -620,8 +625,12 @@ function applyAccountConfig(accountKey) {
|
|
|
620
625
|
if (!account)
|
|
621
626
|
return;
|
|
622
627
|
const standalone = Boolean(account.articleThemeStandalone);
|
|
623
|
-
|
|
628
|
+
standaloneThemeName = "";
|
|
629
|
+
configModeBadge.textContent = !pipelineConnected ? "本地模式" : standalone ? "独立排版文件" : "账号默认配置";
|
|
624
630
|
configModeBadge.className = `badge ${standalone ? "badge-primary" : "badge-subtle"}`;
|
|
631
|
+
accountSelect.hidden = accountLabel.hidden = !pipelineConnected;
|
|
632
|
+
btnSave.hidden = historyLink.hidden = !pipelineConnected;
|
|
633
|
+
btnReset.title = pipelineConnected ? "恢复当前账号默认样式" : "恢复本地默认样式";
|
|
625
634
|
btnSave.disabled = Boolean(account.articleThemeStandalone);
|
|
626
635
|
btnSave.title = account.articleThemeStandalone
|
|
627
636
|
? "当前账号引用独立配置,请通过「导出配置」保存调整后替换原文件"
|
|
@@ -718,45 +727,58 @@ async function initStudio() {
|
|
|
718
727
|
bindColorPair(pickerH3Color, hexH3Color, () => scheduleRender(20));
|
|
719
728
|
bindColorPair(pickerQuoteColor, hexQuoteColor, () => scheduleRender(20));
|
|
720
729
|
bindColorPair(pickerDividerColor, hexDividerColor, () => scheduleRender(20));
|
|
730
|
+
const localMarkdown = studioConfig.sampleMarkdown;
|
|
731
|
+
editorMarkdown.value = localMarkdown;
|
|
732
|
+
const configRequest = loadStudioConfig();
|
|
733
|
+
let initialMarkdown = localMarkdown;
|
|
721
734
|
try {
|
|
722
|
-
|
|
723
|
-
if (!res.ok)
|
|
724
|
-
throw new Error(`HTTP ${res.status}`);
|
|
725
|
-
const data = (await res.json());
|
|
726
|
-
accounts = data.accounts || {};
|
|
727
|
-
currentAccount = data.defaultAccount || "default";
|
|
728
|
-
pluginsList = data.plugins || [];
|
|
729
|
-
// Account selector
|
|
730
|
-
accountSelect.innerHTML = "";
|
|
731
|
-
for (const [key, acc] of Object.entries(accounts)) {
|
|
732
|
-
const opt = document.createElement("option");
|
|
733
|
-
opt.value = key;
|
|
734
|
-
opt.textContent = `${acc.name || key} (${key})`;
|
|
735
|
-
if (key === currentAccount)
|
|
736
|
-
opt.selected = true;
|
|
737
|
-
accountSelect.appendChild(opt);
|
|
738
|
-
}
|
|
739
|
-
const initialMd = data.sampleMarkdown || "# 微信排版标题\n\n欢迎使用 myno 微信排版工作台!";
|
|
740
|
-
editorMarkdown.value = initialMd;
|
|
741
|
-
// Mount MynoEditor (Milkdown Crepe)
|
|
735
|
+
// 编辑器先用本地默认值创建,配置接口不是启动前提。
|
|
742
736
|
if (milkdownEditorRoot) {
|
|
743
737
|
mynoEditor = new MynoEditor({
|
|
744
738
|
root: milkdownEditorRoot,
|
|
745
|
-
defaultValue:
|
|
739
|
+
defaultValue: localMarkdown,
|
|
746
740
|
onMarkdownChange: (md) => {
|
|
747
741
|
editorMarkdown.value = md;
|
|
748
742
|
scheduleRender(40);
|
|
749
743
|
},
|
|
750
744
|
});
|
|
751
745
|
await mynoEditor.create();
|
|
746
|
+
initialMarkdown = mynoEditor.getMarkdown();
|
|
752
747
|
}
|
|
753
|
-
renderSyntaxCards(pluginsList);
|
|
754
748
|
applyAccountConfig(currentAccount);
|
|
749
|
+
renderSyntaxCards(studioConfig.plugins);
|
|
755
750
|
}
|
|
756
751
|
catch (err) {
|
|
757
|
-
console.error("Failed to
|
|
758
|
-
|
|
759
|
-
|
|
752
|
+
console.error("Failed to initialize editor:", err);
|
|
753
|
+
await mynoEditor?.destroy();
|
|
754
|
+
mynoEditor = null;
|
|
755
|
+
showToast("编辑器初始化失败,可切换 Markdown 源码模式继续编辑", "error");
|
|
756
|
+
}
|
|
757
|
+
const result = await configRequest;
|
|
758
|
+
if (result.source === "pipeline") {
|
|
759
|
+
studioConfig = result.config;
|
|
760
|
+
accounts = studioConfig.accounts;
|
|
761
|
+
currentAccount = studioConfig.defaultAccount;
|
|
762
|
+
pipelineConnected = true;
|
|
763
|
+
accountSelect.innerHTML = "";
|
|
764
|
+
for (const [key, account] of Object.entries(accounts)) {
|
|
765
|
+
const option = document.createElement("option");
|
|
766
|
+
option.value = key;
|
|
767
|
+
option.textContent = `${account.name} (${key})`;
|
|
768
|
+
option.selected = key === currentAccount;
|
|
769
|
+
accountSelect.appendChild(option);
|
|
770
|
+
}
|
|
771
|
+
// 只替换尚未编辑的示例正文,迟到的配置不能覆盖用户输入。
|
|
772
|
+
if (getActiveMarkdown() === initialMarkdown) {
|
|
773
|
+
editorMarkdown.value = studioConfig.sampleMarkdown;
|
|
774
|
+
mynoEditor?.setMarkdown(studioConfig.sampleMarkdown);
|
|
775
|
+
}
|
|
776
|
+
applyAccountConfig(currentAccount);
|
|
777
|
+
renderSyntaxCards(studioConfig.plugins);
|
|
778
|
+
}
|
|
779
|
+
else if (result.error) {
|
|
780
|
+
configModeBadge.textContent = "本地模式 · 配置未加载";
|
|
781
|
+
showToast("未能加载 pipeline 配置,当前使用本地默认配置;可正常编辑和导出", "info");
|
|
760
782
|
}
|
|
761
783
|
}
|
|
762
784
|
// ── Event Handlers ──────────────────────────────────────────────────────
|
|
@@ -841,10 +863,8 @@ tabBtnSyntax?.addEventListener("click", () => {
|
|
|
841
863
|
tabContentSyntax.style.display = "block";
|
|
842
864
|
});
|
|
843
865
|
// Load sample / clear
|
|
844
|
-
btnLoadSample?.addEventListener("click",
|
|
845
|
-
const
|
|
846
|
-
const data = (await res.json());
|
|
847
|
-
const sample = data.sampleMarkdown || "";
|
|
866
|
+
btnLoadSample?.addEventListener("click", () => {
|
|
867
|
+
const sample = studioConfig.sampleMarkdown;
|
|
848
868
|
editorMarkdown.value = sample;
|
|
849
869
|
if (mynoEditor)
|
|
850
870
|
mynoEditor.setMarkdown(sample);
|
|
@@ -872,12 +892,12 @@ btnToggleView?.addEventListener("click", () => {
|
|
|
872
892
|
// Reset
|
|
873
893
|
btnReset?.addEventListener("click", () => {
|
|
874
894
|
applyAccountConfig(currentAccount);
|
|
875
|
-
showToast("已重置为当前账号默认样式", "info");
|
|
895
|
+
showToast(pipelineConnected ? "已重置为当前账号默认样式" : "已重置为本地默认样式", "info");
|
|
876
896
|
});
|
|
877
897
|
// Save to config.json
|
|
878
898
|
btnSave?.addEventListener("click", async () => {
|
|
879
899
|
const account = accounts[currentAccount];
|
|
880
|
-
if (!account)
|
|
900
|
+
if (!pipelineConnected || !account || account.articleThemeStandalone)
|
|
881
901
|
return;
|
|
882
902
|
const { structure, ...theme } = readStyleControls();
|
|
883
903
|
const { headerImageUrl: _headerImageUrl, ...savedStructure } = structure;
|