edgepress 2026.10.1 → 2026.10.13
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/LICENSE +21 -0
- package/README.md +216 -16
- package/config.yml +99 -127
- package/content/assets/edgepress/brand/avatar.png +0 -0
- package/content/assets/edgepress/brand/deploy-esa.svg +1 -0
- package/content/assets/edgepress/brand/home-hero-768.webp +0 -0
- package/content/assets/edgepress/brand/home-hero.png +0 -0
- package/content/assets/edgepress/brand/home-hero.webp +0 -0
- package/content/assets/edgepress/brand/mascot.png +0 -0
- package/content/assets/edgepress/brand/mascot.webp +0 -0
- package/content/assets/edgepress/brand/og-image.png +0 -0
- package/content/assets/edgepress/brand/og-image.webp +0 -0
- package/content/assets/edgepress/brand/sources/edgepress-avatar-master.png +0 -0
- package/content/assets/edgepress/brand/sources/export-manifest.json +181 -0
- package/content/assets/edgepress/brand/sources/prompts.json +12 -0
- package/content/assets/edgepress/favicon/apple-touch-icon.png +0 -0
- package/content/assets/edgepress/favicon/favicon-16.png +0 -0
- package/content/assets/edgepress/favicon/favicon-32.png +0 -0
- package/content/assets/edgepress/favicon/favicon-48.png +0 -0
- package/content/assets/edgepress/favicon/favicon-64.png +0 -0
- package/content/assets/edgepress/favicon/favicon.ico +0 -0
- package/content/assets/edgepress/icons/LICENSE.txt +43 -0
- package/content/assets/edgepress/icons/arrow-right.svg +16 -0
- package/content/assets/edgepress/icons/arrow-up-right.svg +16 -0
- package/content/assets/edgepress/icons/book-open.svg +16 -0
- package/content/assets/edgepress/icons/check-circle.svg +16 -0
- package/content/assets/edgepress/icons/check.svg +15 -0
- package/content/assets/edgepress/icons/cloud.svg +15 -0
- package/content/assets/edgepress/icons/code.svg +16 -0
- package/content/assets/edgepress/icons/cpu.svg +28 -0
- package/content/assets/edgepress/icons/file-text.svg +19 -0
- package/content/assets/edgepress/icons/github.svg +17 -0
- package/content/assets/edgepress/icons/globe.svg +17 -0
- package/content/assets/edgepress/icons/help-circle.svg +17 -0
- package/content/assets/edgepress/icons/home.svg +16 -0
- package/content/assets/edgepress/icons/layers.svg +17 -0
- package/content/assets/edgepress/icons/layout-grid.svg +18 -0
- package/content/assets/edgepress/icons/mail.svg +16 -0
- package/content/assets/edgepress/icons/newspaper.svg +18 -0
- package/content/assets/edgepress/icons/palette.svg +19 -0
- package/content/assets/edgepress/icons/plug.svg +18 -0
- package/content/assets/edgepress/icons/provenance.json +8 -0
- package/content/assets/edgepress/icons/puzzle.svg +15 -0
- package/content/assets/edgepress/icons/rocket.svg +18 -0
- package/content/assets/edgepress/icons/rss.svg +17 -0
- package/content/assets/edgepress/icons/search.svg +16 -0
- package/content/assets/edgepress/icons/settings.svg +16 -0
- package/content/assets/edgepress/icons/shield-check.svg +16 -0
- package/content/assets/edgepress/icons/sparkles.svg +18 -0
- package/content/assets/edgepress/icons/terminal.svg +16 -0
- package/content/assets/edgepress/icons/x.svg +16 -0
- package/{static → content/assets}/edgepress-markdown-guide.svg +1 -1
- package/content/assets/images/previews/edgepress-en.webp +0 -0
- package/content/assets/images/previews/edgepress-revisions-en.png +0 -0
- package/content/assets/images/previews/edgepress-workflow-en.90f4650b21013786.gif +0 -0
- package/content/assets/images/previews/edgepress-workflow-zh.41f1e0a685f47267.gif +0 -0
- package/content/assets/images/previews/edgepress-zh.webp +0 -0
- package/content/assets/images/previews/provenance.json +49 -0
- package/content/guides/markdown-media.md +38 -0
- package/content/guides/platforms.md +15 -0
- package/content/guides/product-demos.md +37 -0
- package/content/guides/zh-cn.md +62 -0
- package/content/pages/deployment/en.json +74 -0
- package/content/pages/deployment/zh-cn.json +74 -0
- package/content/pages/home/en.json +248 -0
- package/content/pages/home/zh-cn.json +248 -0
- package/content/pages/local-tools/en.json +14 -0
- package/content/pages/local-tools/zh-cn.json +14 -0
- package/content/pages/page-authoring/en.json +107 -0
- package/content/pages/page-authoring/zh-cn.json +107 -0
- package/content/pages/plugin-development/en.json +202 -0
- package/content/pages/plugin-development/zh-cn.json +202 -0
- package/content/pages/privacy-policy/en.json +171 -0
- package/content/pages/privacy-policy/zh-cn.json +171 -0
- package/content/pages/project-introduction/en.json +158 -0
- package/content/pages/project-introduction/zh-cn.json +158 -0
- package/content/pages/quick-start/en.json +325 -0
- package/content/pages/quick-start/zh-cn.json +325 -0
- package/content/pages/theme-development/en.json +353 -0
- package/content/pages/theme-development/zh-cn.json +349 -0
- package/content/posts/2026-09-24-edgepress-release-2026-9-1/en.md +1 -1
- package/content/posts/2026-09-24-edgepress-release-2026-9-1/zh-cn.md +1 -1
- package/content/posts/2026-10-03-edgepress-release-2026-10-3/en.md +16 -0
- package/content/posts/2026-10-03-edgepress-release-2026-10-3/zh-cn.md +16 -0
- package/content/posts/2026-10-03-edgepress-release-202610-4/en.md +22 -0
- package/content/posts/2026-10-03-edgepress-release-202610-4/zh-cn.md +20 -0
- package/content/posts/2026-10-03-edgepress-release-202610-5/en.md +15 -0
- package/content/posts/2026-10-03-edgepress-release-202610-5/zh-cn.md +15 -0
- package/edgeone.json +43 -0
- package/esa.jsonc +9 -0
- package/languages/base/en.json +75 -10
- package/languages/packs/zh-CN.json +74 -9
- package/netlify.toml +6 -0
- package/package.json +37 -6
- package/plugins/consent/index.js +10 -17
- package/project-compatibility.json +142 -25
- package/schemas/pages.schema.json +74 -0
- package/src/assets.js +146 -18
- package/src/browser-audit.js +158 -0
- package/src/build.js +34 -9
- package/src/cli.js +46 -41
- package/src/config.js +114 -63
- package/src/consent-csp.js +137 -0
- package/src/content.js +55 -30
- package/src/data-saver.js +194 -0
- package/src/deploy.js +28 -0
- package/src/document.js +44 -0
- package/src/embed.js +60 -0
- package/src/generators.js +101 -59
- package/src/i18n.js +19 -3
- package/src/icons.js +5 -4
- package/src/image-dimensions.js +17 -0
- package/src/local-tool.js +29 -0
- package/src/maintenance.js +25 -8
- package/src/markdown-fixture.js +20 -0
- package/src/markdown.js +80 -16
- package/src/media-assets.js +19 -0
- package/src/media-viewer.js +47 -0
- package/src/oembed.js +53 -0
- package/src/page-blocks.js +124 -54
- package/src/page-check.js +29 -39
- package/src/plugin-api.js +7 -1
- package/src/post-details.js +60 -0
- package/src/post-template.js +5 -0
- package/src/publication-time.js +47 -0
- package/src/report-path.js +19 -0
- package/src/report-visuals.js +91 -18
- package/src/revision-cards.js +30 -0
- package/src/revision-images.js +44 -0
- package/src/revisions.js +77 -0
- package/src/rss.js +100 -0
- package/src/service-block.js +18 -0
- package/src/theme.js +59 -9
- package/src/video-metadata.js +36 -0
- package/static/edgepress/data-saver.css +12 -0
- package/static/edgepress/data-saver.js +333 -0
- package/static/edgepress/document-viewer.js +35 -0
- package/static/edgepress/external-links-policy.js +14 -0
- package/static/edgepress/external-links.css +13 -0
- package/static/edgepress/external-links.js +120 -0
- package/static/edgepress/fonts/faces.css +2217 -0
- package/static/edgepress/fonts/noto-sans-OFL.txt +93 -0
- package/static/edgepress/fonts/noto-sans-cyrillic-ext-wght-normal.82ff72b28e6610f2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-cyrillic-wght-normal.6ab64433de6077ca.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-devanagari-wght-normal.ea6a530b75d93de7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-greek-ext-wght-normal.790b255c10c32e0b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-greek-wght-normal.7f655207c2f6c140.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-latin-ext-wght-normal.6d5a79315528df19.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-latin-wght-normal.51ca196f49a33e79.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-100-wght-normal.ad5f29028d5699a5.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-101-wght-normal.e189b81fc22ca6af.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-102-wght-normal.941c0c2971fc1d6d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-103-wght-normal.bafbd591af6493ff.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-104-wght-normal.b0bf80ced89dd61b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-105-wght-normal.8d8b4e6f4a00621d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-106-wght-normal.bae74acc629d2e74.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-107-wght-normal.a42eff5010de7b0d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-108-wght-normal.91882203459867be.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-109-wght-normal.a91f8b038e5ce108.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-110-wght-normal.bbca9081655c4523.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-111-wght-normal.372be010ac0e87cb.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-112-wght-normal.34a4580239eae8dc.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-113-wght-normal.614ab8f616352583.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-114-wght-normal.cf7b8344807a316e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-115-wght-normal.fb29957c7adccb9a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-116-wght-normal.a98dc5a726f82141.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-117-wght-normal.d94b5af0c14838af.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-118-wght-normal.76c9ddb85ae4578c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-119-wght-normal.b3b2374881f4cd93.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-21-wght-normal.c1409c43e55ecff2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-22-wght-normal.77037ed42ff4e7b0.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-23-wght-normal.38d0df21ac374e93.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-24-wght-normal.8fa21e7e457acf3e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-25-wght-normal.f760b7a3871d214d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-26-wght-normal.be8386e7bd7facfe.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-27-wght-normal.4895abcaddbd162e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-28-wght-normal.82540b6201a9b9ad.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-29-wght-normal.ff21d8fcc60ce391.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-30-wght-normal.1f76f6ffded00b9e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-31-wght-normal.e6c25be1bb08a63a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-32-wght-normal.0cda750d7d04a4e1.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-33-wght-normal.b9732b5606bd87c5.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-34-wght-normal.38aa326b4c84902a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-35-wght-normal.bd98226c8e0aa808.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-36-wght-normal.0db1ca695a491d37.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-37-wght-normal.8df409a4e0a237c2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-38-wght-normal.672d2d994994a3c3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-39-wght-normal.272d6d0e153f56e8.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-4-wght-normal.9fafd93ac77b81ff.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-40-wght-normal.5b9ef1ed48420aa7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-41-wght-normal.30aee47f660fd88a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-42-wght-normal.ec0014830db682b6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-43-wght-normal.43df2b5dad9bb835.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-44-wght-normal.acaa6195041b1a92.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-45-wght-normal.8cdb9903f770db21.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-46-wght-normal.6590d0a6fe94571c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-47-wght-normal.b05afdd32b3bf722.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-48-wght-normal.c9585f7d070700be.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-49-wght-normal.4943895a4dfa5dcf.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-5-wght-normal.e64f57937e3ae4fe.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-50-wght-normal.13e51063d7743cfe.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-51-wght-normal.fd4df1f02c2cb4d7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-52-wght-normal.06999a39c4c3a7ea.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-53-wght-normal.767b7b9864658d91.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-54-wght-normal.4cd00537a46f6f1a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-55-wght-normal.0118ec5d8c30b197.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-56-wght-normal.a3e4a78929826930.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-57-wght-normal.7623501009e4a6db.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-58-wght-normal.56ae1a59a32e4a25.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-59-wght-normal.7a377a40e99fd9bc.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-6-wght-normal.17e15c4f0a5bfd92.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-60-wght-normal.3657f66babdf6aff.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-61-wght-normal.23919a2eb11d25dd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-62-wght-normal.a901edf25bc1cfae.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-63-wght-normal.92f56f713cc0b62f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-64-wght-normal.4929c9f39a5a4bd9.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-65-wght-normal.8daa61282fb62a11.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-66-wght-normal.6479166925eb462b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-67-wght-normal.a6b0e11c4c761ffd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-68-wght-normal.65b77f1fe9d68dae.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-69-wght-normal.b34f765cbbf4d02e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-70-wght-normal.a99d55c00e4f95b7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-71-wght-normal.3298bed30dc8d233.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-72-wght-normal.6597209ca9707726.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-73-wght-normal.e7ac1d4930eabd78.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-74-wght-normal.1f0287be83a28e7a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-75-wght-normal.d9a4bb7bcc2be578.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-76-wght-normal.5a019946bcadcec6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-77-wght-normal.7c445e85d04f5319.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-78-wght-normal.7d4afb70f641781c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-79-wght-normal.5798753a721bb4ec.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-80-wght-normal.db887159ca6e46f3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-81-wght-normal.71e5743bbd225b3d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-82-wght-normal.8c5094c3785fd04f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-83-wght-normal.4a60a1ccba905284.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-84-wght-normal.3ed54e59ef4758e3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-85-wght-normal.e87e0a1342e1778c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-86-wght-normal.6d3ac3e20959dbcb.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-87-wght-normal.0eeffd5daad5c17b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-88-wght-normal.b1d9582dfa268463.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-89-wght-normal.8b437aeb9e9fcb5a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-90-wght-normal.83b0a59e0a5e045a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-91-wght-normal.382f72b98d4bb9d7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-97-wght-normal.5e52856457c5cdab.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-98-wght-normal.ffded4e7fd560d93.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-99-wght-normal.54e302c23f11a8fd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-OFL.txt +93 -0
- package/static/edgepress/fonts/noto-sans-sc-cyrillic-wght-normal.5932d441e7126669.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-latin-ext-wght-normal.e316201f3fc493d1.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-latin-wght-normal.c1d919c8701a86ed.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-sc-vietnamese-wght-normal.cba3d00c8db989f0.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-0-wght-normal.63c21eda5d20203f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-100-wght-normal.87a7c76301c24a28.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-101-wght-normal.c9e83fc4ffd53746.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-102-wght-normal.9a00ae0e5735852b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-103-wght-normal.7cfe93b3221f4def.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-104-wght-normal.2d5ac7497d84cb99.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-105-wght-normal.0989885bb16bcd9b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-106-wght-normal.1faa921b035064e7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-107-wght-normal.2f6006745ae16d69.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-108-wght-normal.a61e48c10a2cf4b9.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-109-wght-normal.f28c767724736d2d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-110-wght-normal.4b04bd88c3dc7c5d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-111-wght-normal.b6251e1967932a52.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-112-wght-normal.e264513b32f90660.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-113-wght-normal.46cb347d88f3338e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-114-wght-normal.9f9e1e0d0ab2aeb4.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-115-wght-normal.653dd2ab7d551b40.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-116-wght-normal.4718bf3627191297.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-117-wght-normal.b241a9409682af5f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-118-wght-normal.fda2800dc1c06852.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-119-wght-normal.948af36bd63a72c7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-19-wght-normal.62191cdc3a10e60a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-20-wght-normal.65c90892c2e01657.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-21-wght-normal.d3f59b094c334866.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-22-wght-normal.b1983a041d7e4e1f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-23-wght-normal.16e2163b66c7732a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-24-wght-normal.72c8561976116537.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-25-wght-normal.b2948d928ce4dd54.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-26-wght-normal.d583236b90abedc9.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-27-wght-normal.7d6073ba07597c9b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-28-wght-normal.517204d716b089cd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-29-wght-normal.10189a8f8ca38099.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-30-wght-normal.695a71d72dfab3f7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-31-wght-normal.868d59473ef0e73c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-32-wght-normal.92efa2d4b3702ec0.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-33-wght-normal.d2274bcd5636197d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-34-wght-normal.1ac8c3718ee2eed2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-35-wght-normal.00b3df730d5a4c73.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-36-wght-normal.6963feb6c628b81f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-37-wght-normal.a1b4bd294af24cd1.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-38-wght-normal.8edb2f7f2955921b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-39-wght-normal.37bf7394eb3148c6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-40-wght-normal.3efa655bc48f9133.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-41-wght-normal.48d47014544ebd5d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-42-wght-normal.214c733a59d423e7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-43-wght-normal.c2c9876f138bb20f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-44-wght-normal.28928bfea29db06a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-45-wght-normal.bf3743f8155fa9d2.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-46-wght-normal.06970903593781c3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-47-wght-normal.8932ed83a91794d4.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-48-wght-normal.dfd9225628bcf234.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-49-wght-normal.c27d341ad39d44eb.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-50-wght-normal.01a0f4e7dfba0a56.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-51-wght-normal.5a30022af3d30e0f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-52-wght-normal.4884f032342a3274.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-53-wght-normal.537adcae44511270.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-54-wght-normal.6bc8c7d3e47c6fde.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-55-wght-normal.725a48711f1e1997.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-56-wght-normal.f43ecaa73e0cd8fc.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-57-wght-normal.15b24e9d42a3270f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-58-wght-normal.9b2d8a71667d3da6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-59-wght-normal.a68535a6b3289d89.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-6-wght-normal.32cece1ae80c4f2b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-60-wght-normal.3b2c56a921d1cad4.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-61-wght-normal.54f51f80a0740878.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-62-wght-normal.ba029c5bb6c07bf1.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-63-wght-normal.380919beec4c7f3d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-64-wght-normal.f96fe0be479d201f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-65-wght-normal.7d544b80701fe678.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-66-wght-normal.fab669c07a1e3bee.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-67-wght-normal.0001bb744743fdfa.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-68-wght-normal.1a57eda03886b43c.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-69-wght-normal.017fecc749bcd6d5.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-7-wght-normal.cd0f0cac743dbbfe.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-70-wght-normal.79fb9d70b9534ec7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-71-wght-normal.04a6ea581b5f1195.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-72-wght-normal.d3a4eb35499157b7.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-73-wght-normal.d81f8484404ee465.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-74-wght-normal.4a5da9e0c2702f7d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-75-wght-normal.8b87f9c6c164513a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-76-wght-normal.a71463dbfd9fa7b5.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-77-wght-normal.d094414ea752cd52.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-78-wght-normal.04f7c97bd9cbc73b.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-79-wght-normal.1ed089d037a02049.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-8-wght-normal.d052677dfb5db5bd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-80-wght-normal.6d41ca59cfd50442.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-81-wght-normal.f09bd0afa8a58114.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-82-wght-normal.7920841c526b1b02.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-83-wght-normal.0c6f7f82db8da0d8.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-84-wght-normal.f37c0a853b31265e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-85-wght-normal.4173bff087653b82.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-86-wght-normal.dac35605ebec15c4.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-87-wght-normal.8ac85fdd0b15a6bd.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-88-wght-normal.61625b0b21e8407f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-89-wght-normal.a1da3dccbf00698e.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-90-wght-normal.bf08f0355222a782.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-91-wght-normal.2ecf295bba2bfaa3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-92-wght-normal.36508326bb68115f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-97-wght-normal.c712899e0fc9e947.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-98-wght-normal.13a648e521d18d7f.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-99-wght-normal.7f8c9a777e64159a.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-OFL.txt +93 -0
- package/static/edgepress/fonts/noto-sans-tc-cyrillic-wght-normal.dd0980ced8e46cb3.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-latin-ext-wght-normal.817d96335dc52ce6.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-latin-wght-normal.50cb5fb0a522cfaf.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-tc-vietnamese-wght-normal.2a77fb7b70fa304d.woff2 +0 -0
- package/static/edgepress/fonts/noto-sans-vietnamese-wght-normal.791e3f213c155a5b.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-OFL.txt +93 -0
- package/static/edgepress/fonts/noto-serif-cyrillic-ext-wght-normal.7c7afb20d33e30ec.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-cyrillic-wght-normal.54e3bd0c4a002b0f.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-greek-ext-wght-normal.9b3f4c4ff3adefd2.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-greek-wght-normal.1252037b6f1d6e86.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-latin-ext-wght-normal.2654f8d1261a420f.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-latin-wght-normal.46281456234014ce.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-math-wght-normal.d4a6aba2cb4636b3.woff2 +0 -0
- package/static/edgepress/fonts/noto-serif-vietnamese-wght-normal.fb6a5ed734c2fbe3.woff2 +0 -0
- package/static/edgepress/fonts/provenance.json +1356 -0
- package/static/edgepress/fonts.css +14 -0
- package/static/edgepress/image-viewer.js +23 -0
- package/static/edgepress/images.css +4 -0
- package/static/edgepress/link-directory.css +14 -0
- package/static/edgepress/local-time.js +12 -0
- package/static/edgepress/media-viewer.css +1 -0
- package/static/edgepress/media-viewer.js +111 -0
- package/static/edgepress/navigation-select.js +14 -0
- package/static/edgepress/oembed.js +129 -0
- package/static/edgepress/plugins/backend/external-api.js +4 -0
- package/static/edgepress/plugins/backend/external-widget.js +13 -0
- package/static/edgepress/plugins/consent/choices.js +47 -0
- package/static/edgepress/plugins/consent/manager.js +56 -74
- package/static/edgepress/project-demo.js +93 -0
- package/static/edgepress/search.js +2 -2
- package/static/edgepress/services-consent.js +3 -0
- package/static/edgepress/services.js +15 -0
- package/static/edgepress/webmcp.js +86 -0
- package/tests/assets-runtime.test.mjs +91 -0
- package/tests/audit.test.mjs +142 -0
- package/tests/brand-regression.test.mjs +110 -0
- package/tests/consent-browser.test.mjs +132 -0
- package/tests/consent-config.test.mjs +85 -0
- package/tests/consent-csp.test.mjs +90 -0
- package/tests/data-saver-loading.test.mjs +158 -0
- package/tests/data-saver-network.test.mjs +99 -0
- package/tests/data-saver.test.mjs +294 -0
- package/tests/document-package.test.mjs +28 -0
- package/tests/document-viewer.test.mjs +152 -0
- package/tests/edge-issues.test.mjs +65 -0
- package/tests/embed-syntax.test.mjs +68 -0
- package/tests/external-links.test.mjs +198 -0
- package/tests/fixtures/recording.mp4 +0 -0
- package/tests/fonts.test.mjs +99 -0
- package/tests/image-dimensions.test.mjs +15 -0
- package/tests/image-viewer.test.mjs +36 -0
- package/tests/json-pages.test.mjs +66 -0
- package/tests/link-directory.test.mjs +51 -0
- package/tests/local-tool.test.mjs +34 -0
- package/tests/markdown-media.test.mjs +119 -0
- package/tests/media-block.test.mjs +102 -0
- package/tests/navigation.test.mjs +87 -0
- package/tests/oembed-layout.test.mjs +98 -0
- package/tests/oembed.test.mjs +96 -0
- package/tests/page-authoring.test.mjs +27 -0
- package/tests/page-formatting.test.mjs +37 -0
- package/tests/post-list.test.mjs +96 -0
- package/tests/project-demo.test.mjs +73 -0
- package/tests/publication-time.test.mjs +43 -0
- package/tests/release-version.test.mjs +28 -0
- package/tests/revisions.test.mjs +93 -0
- package/tests/rss.test.mjs +54 -0
- package/tests/services.test.mjs +35 -0
- package/tests/theme-layout.test.mjs +95 -0
- package/tests/video-metadata.test.mjs +28 -0
- package/tests/webmcp.test.mjs +121 -0
- package/tests/writing.test.mjs +101 -0
- package/themes/atelier/assets/style.css +144 -22
- package/themes/atelier/layouts/partials/head.html +8 -1
- package/themes/atelier/layouts/partials/header.html +3 -1
- package/themes/default/assets/data-saver-theme.css +2 -0
- package/themes/default/assets/style.css +139 -23
- package/themes/default/layouts/partials/head.html +9 -2
- package/themes/default/layouts/partials/header.html +3 -1
- package/themes/default/theme.json +1 -0
- package/themes/folio/README.md +7 -0
- package/themes/folio/assets/data-saver-theme.css +3 -0
- package/themes/folio/assets/folio/navigation.js +10 -0
- package/themes/folio/assets/style.css +516 -0
- package/themes/folio/layouts/layout.html +15 -0
- package/themes/folio/layouts/partials/footer.html +6 -0
- package/themes/folio/layouts/partials/head.html +30 -0
- package/themes/folio/layouts/partials/header.html +8 -0
- package/themes/folio/theme.json +7 -0
- package/themes/signal/assets/style.css +143 -21
- package/themes/signal/layouts/partials/head.html +8 -1
- package/themes/signal/layouts/partials/header.html +3 -1
- package/tools/README.md +14 -0
- package/tools/assets/format-pages.mjs +56 -0
- package/tools/assets/generate-brand-assets.py +160 -0
- package/tools/assets/sync-fonts.mjs +71 -0
- package/tools/assets/sync-icons.mjs +17 -0
- package/tools/assets/video-preview.mjs +15 -0
- package/tools/recordings/capture-document-demo.mjs +147 -0
- package/tools/recordings/demo-workbench.mjs +57 -0
- package/tools/recordings/desktop-recording.mjs +92 -0
- package/tools/recordings/provision-vm.sh +18 -0
- package/tools/recordings/start-vm-desktop.sh +28 -0
- package/tools/recordings/vm-desktop.mjs +124 -0
- package/tools/verification/README.md +44 -0
- package/tools/verification/data-saver-site.mjs +405 -0
- package/tools/verification/page-performance.mjs +76 -0
- package/tools/verification/verify-brand-assets.py +52 -0
- package/tools/verification/verify-brand.mjs +180 -0
- package/vercel.json +36 -0
- package/wrangler.jsonc +5 -7
- package/content/pages/home/en.md +0 -99
- package/content/pages/home/zh-cn.md +0 -99
- package/content/pages/plugin-development/en.md +0 -109
- package/content/pages/plugin-development/zh-cn.md +0 -109
- package/content/pages/privacy-policy/en.md +0 -93
- package/content/pages/privacy-policy/zh-cn.md +0 -93
- package/content/pages/project-introduction/en.md +0 -88
- package/content/pages/project-introduction/zh-cn.md +0 -88
- package/content/pages/quick-start/en.md +0 -153
- package/content/pages/quick-start/zh-cn.md +0 -153
- package/content/pages/theme-development/en.md +0 -132
- package/content/pages/theme-development/zh-cn.md +0 -132
- package/src/worker.js +0 -139
- package/static/edgepress/brand/edgepress-mark.svg +0 -7
- package/static/edgepress/brand/mascot-209.webp +0 -0
- package/static/edgepress/brand/mascot-418.png +0 -0
- package/static/edgepress/brand/mascot-418.webp +0 -0
- package/static/edgepress/brand/mascot.png +0 -0
- package/static/edgepress/brand/og-image.png +0 -0
- package/static/edgepress/brand/og-image.svg +0 -46
- package/static/edgepress/icons.svg +0 -24
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
{
|
|
2
|
+
"dataSaverLoadFailed": "页面必需资源加载失败。请重试,或切换可用的文字省流版。",
|
|
3
|
+
"dataSaverRetry": "重新加载",
|
|
4
|
+
"dataSaverProgressControls": "页面操作:已完成 {loaded} / {total} 个脚本",
|
|
5
|
+
"dataSaverLoadingNotice": "正在加载完整版。你可以现在切换文字省流版,跳过字体与多媒体。",
|
|
6
|
+
"dataSaverProgressStyles": "页面样式:已完成 {loaded} / {total} 个文件",
|
|
7
|
+
"dataSaverProgressMedia": "首屏图片:已完成 {loaded} / {total}",
|
|
8
|
+
"serviceLoad": "加载这项服务",
|
|
9
|
+
"dataSaverLoading": "正在准备页面…",
|
|
10
|
+
"dataSaverTitle": "流量使用",
|
|
11
|
+
"dataSaverAuto": "自动",
|
|
12
|
+
"dataSaverText": "仅文字",
|
|
13
|
+
"dataSaverFull": "完整显示",
|
|
14
|
+
"dataSaverNotice": "文字模式暂停加载图片、字体、文档预览及可选外部服务。需要时单独加载媒体,或切换到完整显示。",
|
|
15
|
+
"dataSaverLoad": "加载这项媒体",
|
|
16
|
+
"dataSaverMissingDescription": "这项媒体没有提供文字说明,请按需加载以查看内容。",
|
|
17
|
+
"dataSaverSlowTitle": "这个页面加载得有些久",
|
|
18
|
+
"dataSaverSlowNotice": "可以切换到不加载图片和网络字体的文字省流版,或继续等待完整页面。",
|
|
19
|
+
"dataSaverSwitchText": "切换文字省流版",
|
|
20
|
+
"dataSaverKeepFull": "继续等待",
|
|
21
|
+
"dataSaverReturnFull": "切回完整页面",
|
|
22
|
+
"dataSaverTextNotice": "文字省流版 · 图片、字体和预览仅在需要时加载。",
|
|
23
|
+
"documentViewerPreview": "预览文档",
|
|
24
|
+
"documentViewerClose": "关闭预览",
|
|
25
|
+
"documentViewerLoading": "正在加载文档…",
|
|
26
|
+
"documentViewerError": "无法预览。请检查文件、访问权限和跨域设置。",
|
|
27
|
+
"documentViewerPage": "页码",
|
|
28
|
+
"documentViewerSheet": "工作表",
|
|
2
29
|
"home": "首页",
|
|
3
|
-
"archives": "
|
|
30
|
+
"archives": "见闻",
|
|
4
31
|
"noPosts": "还没有文章",
|
|
5
32
|
"newer": "较新文章",
|
|
6
33
|
"older": "较早文章",
|
|
@@ -11,13 +38,13 @@
|
|
|
11
38
|
"forbidden": "无权访问",
|
|
12
39
|
"forbiddenText": "你没有权限访问此页面。",
|
|
13
40
|
"returnHome": "返回首页",
|
|
14
|
-
"allPosts": "
|
|
41
|
+
"allPosts": "全部见闻",
|
|
15
42
|
"searchPosts": "搜索文章",
|
|
16
43
|
"searchIntro": "搜索此网站发布的 Markdown 文章。搜索在你的浏览器本地运行。",
|
|
17
44
|
"searchLabel": "搜索文章",
|
|
18
45
|
"searchButton": "搜索",
|
|
19
|
-
"searchHint": "
|
|
20
|
-
"searchPrompt": "
|
|
46
|
+
"searchHint": "",
|
|
47
|
+
"searchPrompt": "",
|
|
21
48
|
"searchNeedsJavaScript": "文章搜索需要启用 JavaScript。搜索索引保存在此网站。",
|
|
22
49
|
"searchNoResults": "没有找到匹配的文章。",
|
|
23
50
|
"searchResults": "匹配的文章",
|
|
@@ -33,6 +60,7 @@
|
|
|
33
60
|
"languageLabel": "语言",
|
|
34
61
|
"skipToContent": "跳转到正文",
|
|
35
62
|
"pagination": "分页导航",
|
|
63
|
+
"pageNumber": "第 {page} 页",
|
|
36
64
|
"pages": "项目文档",
|
|
37
65
|
"latestPosts": "最新文章",
|
|
38
66
|
"postAuthor": "作者:{author}",
|
|
@@ -55,12 +83,49 @@
|
|
|
55
83
|
"servicePrivacyLink": "查看政策",
|
|
56
84
|
"reviewDetails": "详情",
|
|
57
85
|
"essentialStorage": "选择保存在此设备,最长 {days} 天。",
|
|
58
|
-
"pluginTracking": "跟踪",
|
|
59
|
-
"pluginStatistics": "统计",
|
|
60
|
-
"pluginAdvertising": "广告",
|
|
61
|
-
"pluginCaptcha": "人机验证",
|
|
62
86
|
"consentReload": "选择已保存,正在重新载入以应用设置。",
|
|
63
87
|
"agentSummary": "EdgePress 网站构建器的项目指南与参考文档。",
|
|
64
88
|
"closePrivacy": "关闭设置",
|
|
65
|
-
"consentStoredOnDevice": "此设备"
|
|
89
|
+
"consentStoredOnDevice": "此设备",
|
|
90
|
+
"postStarter": "在这里写第一段正文。需要时可使用 ## 小标题、列表、链接和代码块。",
|
|
91
|
+
"postCreated": "已创建 {file}",
|
|
92
|
+
"postNextSteps": "打开这个文件,在第二个 --- 后用 Markdown 写正文。标题、日期和语言已经填好。",
|
|
93
|
+
"postPreview": "运行 npm run dev 预览,npm run build 构建,再通过已有部署流程发布。",
|
|
94
|
+
"postReadingTime": "约 {minutes} 分钟阅读",
|
|
95
|
+
"categoryBlog": "博客",
|
|
96
|
+
"categoryUncategorized": "未分类",
|
|
97
|
+
"allCategoryPosts": "此分类全部文章",
|
|
98
|
+
"postPinned": "置顶",
|
|
99
|
+
"postUpdated": "更新于",
|
|
100
|
+
"postChanges": "最近一次变动",
|
|
101
|
+
"loadMedia": "加载媒体",
|
|
102
|
+
"embedUnavailable": "媒体暂时不可用。",
|
|
103
|
+
"embedNeedsConsent": "此媒体由 {service} 提供。你同意此服务并请求查看后才会加载,当前尚未连接平台。",
|
|
104
|
+
"embedReady": "你已同意 {service}。内容进入画面时会自动加载。",
|
|
105
|
+
"embedLoading": "正在加载 {service} 媒体…",
|
|
106
|
+
"embedLoaded": "已加载 {service} 媒体。",
|
|
107
|
+
"embedDisabled": "本站已关闭 {service} 服务,此媒体未加载。",
|
|
108
|
+
"imageViewerOpenImage": "放大图片",
|
|
109
|
+
"imageViewerCloseImage": "关闭图片",
|
|
110
|
+
"imageViewerZoomIn": "放大",
|
|
111
|
+
"imageViewerZoomOut": "缩小",
|
|
112
|
+
"imageViewerSaveOriginal": "保存原图",
|
|
113
|
+
"imageViewerRetryMedia": "重新加载",
|
|
114
|
+
"imageViewerLoading": "加载中…",
|
|
115
|
+
"imageViewerImageUnavailable": "图片已删除或暂时无法加载。",
|
|
116
|
+
"postChangeBefore": "修改前",
|
|
117
|
+
"postChangeAfter": "修改后",
|
|
118
|
+
"postChangeAdded": "新增内容",
|
|
119
|
+
"postChangeRemoved": "移除内容",
|
|
120
|
+
"demoPlay": "播放演示",
|
|
121
|
+
"demoPause": "暂停演示",
|
|
122
|
+
"demoReplay": "重新播放",
|
|
123
|
+
"demoError": "演示暂时无法加载,请重试。",
|
|
124
|
+
"demoResume": "继续播放",
|
|
125
|
+
"demoLoading": "正在加载演示…",
|
|
126
|
+
"demoSeek": "演示进度",
|
|
127
|
+
"externalLinkTitle": "即将离开本站",
|
|
128
|
+
"externalLinkDescription": "这个链接指向其他网站,其内容与隐私政策由对方负责。是否继续由你决定。",
|
|
129
|
+
"externalLinkBack": "返回",
|
|
130
|
+
"externalLinkContinue": "继续前往"
|
|
66
131
|
}
|
package/netlify.toml
ADDED
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "edgepress",
|
|
3
|
-
"
|
|
4
|
-
"
|
|
3
|
+
"license": "MIT",
|
|
4
|
+
"version": "2026.10.13",
|
|
5
|
+
"description": "Static websites from Markdown and editable pages, with themes, consent-controlled embeds and readable article updates.",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"bin": {
|
|
7
8
|
"edgepress": "src/cli.js"
|
|
@@ -11,13 +12,22 @@
|
|
|
11
12
|
"languages",
|
|
12
13
|
"plugins",
|
|
13
14
|
"src",
|
|
15
|
+
"schemas",
|
|
14
16
|
"static",
|
|
15
17
|
"themes",
|
|
16
18
|
"config.yml",
|
|
17
19
|
"edgepress.config.mjs",
|
|
18
20
|
"project-compatibility.json",
|
|
19
21
|
"wrangler.jsonc",
|
|
20
|
-
"README.md"
|
|
22
|
+
"README.md",
|
|
23
|
+
"vercel.json",
|
|
24
|
+
"edgeone.json",
|
|
25
|
+
"esa.jsonc",
|
|
26
|
+
"netlify.toml",
|
|
27
|
+
"tests",
|
|
28
|
+
"tools/assets",
|
|
29
|
+
"tools/recordings",
|
|
30
|
+
"tools/verification"
|
|
21
31
|
],
|
|
22
32
|
"repository": {
|
|
23
33
|
"type": "git",
|
|
@@ -45,15 +55,36 @@
|
|
|
45
55
|
"check": "node src/cli.js check",
|
|
46
56
|
"doctor": "node src/cli.js doctor",
|
|
47
57
|
"iterate": "node src/cli.js iterate",
|
|
48
|
-
"security:check": "node src/cli.js security"
|
|
58
|
+
"security:check": "node src/cli.js security",
|
|
59
|
+
"test": "node --test --test-concurrency=2 tests/*.test.mjs",
|
|
60
|
+
"icons:sync": "node tools/assets/sync-icons.mjs",
|
|
61
|
+
"deploy:cloudflare": "node src/cli.js deploy cloudflare",
|
|
62
|
+
"deploy:vercel": "node src/cli.js deploy vercel",
|
|
63
|
+
"deploy:edgeone": "node src/cli.js deploy edgeone",
|
|
64
|
+
"deploy:esa": "node src/cli.js deploy esa",
|
|
65
|
+
"deploy:netlify": "node src/cli.js deploy netlify",
|
|
66
|
+
"fonts:sync": "node tools/assets/sync-fonts.mjs"
|
|
49
67
|
},
|
|
50
68
|
"dependencies": {
|
|
69
|
+
"@jsw-teams/document-viewer": "https://codeload.github.com/jsw-teams/document-viewer/tar.gz/ab21d0ee9c078d084b2abee373ffad302928978c",
|
|
70
|
+
"@jsw-teams/media-viewer": "https://codeload.github.com/jsw-teams/media-viewer/tar.gz/12eb8983c2df1eabb3aaece44b232c56b4a9e1fe",
|
|
71
|
+
"esbuild": "^0.28.2",
|
|
72
|
+
"htmlparser2": "^12.0.0",
|
|
73
|
+
"image-size": "^2.0.4",
|
|
51
74
|
"marked": "^18.0.13",
|
|
52
|
-
"
|
|
75
|
+
"postcss": "^8.5.15",
|
|
76
|
+
"sanitize-html": "^2.18.1",
|
|
53
77
|
"yaml": "^2.9.1"
|
|
54
78
|
},
|
|
79
|
+
"overrides": {
|
|
80
|
+
"@file-viewer/doc": {
|
|
81
|
+
"dompurify": "3.4.17"
|
|
82
|
+
}
|
|
83
|
+
},
|
|
55
84
|
"devDependencies": {
|
|
85
|
+
"lucide-static": "1.55.0",
|
|
56
86
|
"playwright": "^1.63.0",
|
|
57
|
-
"
|
|
87
|
+
"vscode-json-languageservice": "^6.0.0-next.3",
|
|
88
|
+
"wrangler": "^4.149.0"
|
|
58
89
|
}
|
|
59
90
|
}
|
package/plugins/consent/index.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import {createHash} from 'node:crypto';
|
|
2
|
+
import {choiceSnapshot} from '../../static/edgepress/plugins/consent/choices.js';
|
|
1
3
|
function translate(config, locale, key) {
|
|
2
4
|
const base = config.i18n.translationsByLocale?.[config.i18n.defaultLocale];
|
|
3
5
|
const selected = config.i18n.translationsByLocale?.[locale];
|
|
@@ -22,35 +24,26 @@ export default function consentManager(api) {
|
|
|
22
24
|
'privacySettings', 'privacyNotice', 'privacyIntro', 'acceptOptional', 'rejectOptional',
|
|
23
25
|
'savePreferences', 'optionalServices', 'noIntegrations', 'privacyPolicy', 'privacyController', 'privacyContact',
|
|
24
26
|
'serviceDataCategories', 'serviceRecipient', 'serviceRetention', 'servicePrivacyDetails', 'servicePrivacyLink', 'consentReload',
|
|
25
|
-
'closePrivacy', 'reviewDetails', 'essentialStorage', '
|
|
26
|
-
'
|
|
27
|
+
'closePrivacy', 'reviewDetails', 'essentialStorage', 'loadMedia', 'embedUnavailable',
|
|
28
|
+
'embedNeedsConsent', 'embedReady', 'embedLoading', 'embedLoaded', 'embedDisabled'
|
|
27
29
|
].map((key) => [key, translate(config, locale, key)]));
|
|
28
|
-
const services =
|
|
29
|
-
config.browserPlugins[group].enabled ? config.browserPlugins[group].services.map((service) => ({ ...service, category: group })) : []
|
|
30
|
-
);
|
|
30
|
+
const services = config.browserPlugins.services.filter(service => service.enabled !== false);
|
|
31
31
|
const privacy = {
|
|
32
32
|
...config.privacy,
|
|
33
33
|
consent: config.browserPlugins.consent,
|
|
34
34
|
integrations: services
|
|
35
35
|
};
|
|
36
36
|
if (privacy.policyUrl.startsWith('/')) privacy.policyUrl = localizedUrl(config, locale, privacy.policyUrl);
|
|
37
|
-
const
|
|
37
|
+
const snapshot = choiceSnapshot({
|
|
38
38
|
controller: config.privacy.controller,
|
|
39
39
|
policyUrl: config.privacy.policyUrl,
|
|
40
40
|
consent: config.browserPlugins.consent,
|
|
41
41
|
integrations: services
|
|
42
|
-
});
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
policyUrl: config.privacy.policyUrl.startsWith('/')
|
|
46
|
-
? localizedUrl(config, legacyLocale, config.privacy.policyUrl)
|
|
47
|
-
: config.privacy.policyUrl,
|
|
48
|
-
consent: config.browserPlugins.consent,
|
|
49
|
-
integrations: services
|
|
50
|
-
}));
|
|
51
|
-
const payload = safeJson({ privacy, ui, siteLanguage: locale, defaultLocale: config.i18n.defaultLocale, choiceFingerprint, legacyChoiceFingerprints });
|
|
42
|
+
},config.site.url);
|
|
43
|
+
const choiceFingerprint=createHash('sha256').update(snapshot).digest('hex');
|
|
44
|
+
const payload = safeJson({ privacy, ui, siteOrigin:config.site.url,siteLanguage: locale, defaultLocale: config.i18n.defaultLocale, choiceFingerprint,choiceSnapshot:snapshot });
|
|
52
45
|
const integration = '<script type="application/json" id="edgepress-privacy-config">' + payload + '</script>' +
|
|
53
|
-
'<script src="/edgepress/plugins/consent/manager.js"
|
|
46
|
+
'<script type="module" src="/edgepress/plugins/consent/manager.js"></script>';
|
|
54
47
|
return html.replace(/<\/body\s*>/i, integration + '</body>');
|
|
55
48
|
});
|
|
56
49
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"frameworkVersion": "2026.
|
|
3
|
+
"frameworkVersion": "2026.10.5",
|
|
4
4
|
"requirements": {
|
|
5
5
|
"nodeMajor": 22,
|
|
6
6
|
"nodeMinimumVersion": "22.12.0",
|
|
@@ -10,30 +10,141 @@
|
|
|
10
10
|
"pluginApiMajor": 1
|
|
11
11
|
},
|
|
12
12
|
"features": [
|
|
13
|
-
{
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
{
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
{
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
{
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
13
|
+
{
|
|
14
|
+
"name": "Static generation and content-hash cache",
|
|
15
|
+
"stage": "stable",
|
|
16
|
+
"since": "2026.9.1"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "Cloudflare Static Assets deployment",
|
|
20
|
+
"stage": "stable",
|
|
21
|
+
"since": "2026.9.1"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "Row-based editable pages and reusable layout components",
|
|
25
|
+
"stage": "experimental",
|
|
26
|
+
"since": "2026.9.1"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "Image/video with text and display typography elements",
|
|
30
|
+
"stage": "experimental",
|
|
31
|
+
"since": "2026.9.1"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"name": "i18n locale routes",
|
|
35
|
+
"stage": "experimental",
|
|
36
|
+
"since": "2026.9.1"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"name": "Accessibility and agent-friendliness PDF report with embedded screenshots",
|
|
40
|
+
"stage": "experimental",
|
|
41
|
+
"since": "2026.9.1"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "Consent-gated browser plugins",
|
|
45
|
+
"stage": "experimental",
|
|
46
|
+
"since": "2026.9.1"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "Live local preview and theme switching",
|
|
50
|
+
"stage": "experimental",
|
|
51
|
+
"since": "2026.9.1"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "Report-only maintenance iteration",
|
|
55
|
+
"stage": "experimental",
|
|
56
|
+
"since": "2026.9.1"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"name": "Local browser search across Markdown posts",
|
|
60
|
+
"stage": "experimental",
|
|
61
|
+
"since": "2026.9.2"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "Markdown syntax verification and responsive post screenshots",
|
|
65
|
+
"stage": "experimental",
|
|
66
|
+
"since": "2026.9.2"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "Compact localized language selector",
|
|
70
|
+
"stage": "experimental",
|
|
71
|
+
"since": "2026.9.2"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"name": "npm theme installation and blank theme scaffolds",
|
|
75
|
+
"stage": "experimental",
|
|
76
|
+
"since": "2026.9.3"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"name": "PDF-only audit output and temporary screenshot capture",
|
|
80
|
+
"stage": "experimental",
|
|
81
|
+
"since": "2026.9.4"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"name": "Cloudflare one-click deployment guidance for existing and new projects",
|
|
85
|
+
"stage": "stable",
|
|
86
|
+
"since": "2026.9.5"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"name": "Localized Posts navigation and responsive code copy controls",
|
|
90
|
+
"stage": "experimental",
|
|
91
|
+
"since": "2026.9.6"
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "Linked tables of contents on Markdown post pages",
|
|
95
|
+
"stage": "experimental",
|
|
96
|
+
"since": "2026.9.6"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"name": "Consent-nested browser services and generated privacy disclosures",
|
|
100
|
+
"stage": "experimental",
|
|
101
|
+
"since": "2026.9.7"
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"name": "Responsive homepage imagery and chronological all-post archives",
|
|
105
|
+
"stage": "experimental",
|
|
106
|
+
"since": "2026.9.7"
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"name": "Date-versioned localized consent disclosures with isolated responsive checks",
|
|
110
|
+
"stage": "experimental",
|
|
111
|
+
"since": "2026.9.8"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"name": "Markdown video syntax and locale-deduplicated chronological post lists",
|
|
115
|
+
"stage": "experimental",
|
|
116
|
+
"since": "2026.9.8"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"name": "Floating post contents and compact consent controls",
|
|
120
|
+
"stage": "experimental",
|
|
121
|
+
"since": "2026.9.9"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"name": "Locale-stable consent choices and localized page-block links",
|
|
125
|
+
"stage": "experimental",
|
|
126
|
+
"since": "2026.9.10"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"name": "Consent-gated RepoRelay GitHub App comments, pinned posts, local times and automatic content revisions",
|
|
130
|
+
"stage": "experimental",
|
|
131
|
+
"since": "2026.10.3"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"name": "CommentNest URL integration and persistent consent with isolated comment UI",
|
|
135
|
+
"stage": "experimental",
|
|
136
|
+
"since": "2026.10.5"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"name": "Static deployment for Vercel, Netlify, EdgeOne Pages and ESA Pages",
|
|
140
|
+
"stage": "experimental",
|
|
141
|
+
"since": "2026.10.5"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"name": "Consent-registered external APIs and widgets",
|
|
145
|
+
"stage": "experimental",
|
|
146
|
+
"since": "2026.10.5"
|
|
147
|
+
}
|
|
37
148
|
],
|
|
38
149
|
"releaseHistory": [
|
|
39
150
|
{
|
|
@@ -95,6 +206,12 @@
|
|
|
95
206
|
"date": "2026-09-27",
|
|
96
207
|
"request": 10,
|
|
97
208
|
"notes": "Keep consent choices across locale changes and migrate existing records; add localized page-block links; make article tags clear; load search only where needed; redraw icons and simplify privacy wording."
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"version": "2026.10.5",
|
|
212
|
+
"date": "2026-10-03",
|
|
213
|
+
"request": 5,
|
|
214
|
+
"notes": "Move all comment frontend assets and backend implementation to CommentNest; keep only a consent-gated backend URL adapter. Preserve privacy choices across refresh and presentation changes, including blocked local storage fallback."
|
|
98
215
|
}
|
|
99
216
|
]
|
|
100
217
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
|
+
"title": "EdgePress Page / 写文建站页面",
|
|
4
|
+
"description": "Page → rows → cells → ordered elements. 页面 → 行 → 单元格 → 按顺序排列的元素。",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"required": ["blocks"],
|
|
7
|
+
"properties": {
|
|
8
|
+
"$schema": {"type": "string", "description": "Local editor schema; never fetched by the built website. 编辑器的本地结构说明。"},
|
|
9
|
+
"title": {"type": "string", "minLength": 1, "description": "Page title / 页面标题"},
|
|
10
|
+
"lang": {"type": "string", "description": "Enabled locale matching the lowercase filename / 与文件名匹配的已启用语言"},
|
|
11
|
+
"slug": {"type": "string", "description": "Page path / 页面路径"},
|
|
12
|
+
"homepage": {"type": "boolean", "description": "Publish at the localized site root / 发布为当前语言首页"},
|
|
13
|
+
"description": {"type": "string"},
|
|
14
|
+
"keywords": {"type": "array", "items": {"type": "string"}},
|
|
15
|
+
"draft": {"type": "boolean"},
|
|
16
|
+
"robots": {"type": "string"},
|
|
17
|
+
"image": {"type": "string"},
|
|
18
|
+
"blocks": {
|
|
19
|
+
"type": "array", "minItems": 1, "maxItems": 100,
|
|
20
|
+
"description": "Page rows in display order / 页面中按顺序显示的行",
|
|
21
|
+
"items": {"$ref": "#/definitions/row"}
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"definitions": {
|
|
25
|
+
"row": {
|
|
26
|
+
"type": "object", "required": ["columns", "cells"], "additionalProperties": false,
|
|
27
|
+
"description": "One row; columns must equal the cell count / 一行,栏数必须等于单元格个数",
|
|
28
|
+
"properties": {
|
|
29
|
+
"columns": {"type": "integer", "minimum": 1, "maximum": 4, "description": "Column count / 栏数"},
|
|
30
|
+
"cells": {"type": "array", "minItems": 1, "maxItems": 4, "description": "Parallel cells in this row / 这一行的并列单元格", "items": {"$ref": "#/definitions/elements"}}
|
|
31
|
+
},
|
|
32
|
+
"allOf": [
|
|
33
|
+
{"if": {"properties": {"columns": {"const": 1}}}, "then": {"properties": {"cells": {"minItems": 1, "maxItems": 1}}}},
|
|
34
|
+
{"if": {"properties": {"columns": {"const": 2}}}, "then": {"properties": {"cells": {"minItems": 2, "maxItems": 2}}}},
|
|
35
|
+
{"if": {"properties": {"columns": {"const": 3}}}, "then": {"properties": {"cells": {"minItems": 3, "maxItems": 3}}}},
|
|
36
|
+
{"if": {"properties": {"columns": {"const": 4}}}, "then": {"properties": {"cells": {"minItems": 4, "maxItems": 4}}}}
|
|
37
|
+
]
|
|
38
|
+
},
|
|
39
|
+
"elements": {
|
|
40
|
+
"type": "array", "minItems": 1, "maxItems": 100,
|
|
41
|
+
"description": "Ordered elements inside one cell or section / 单元格或分区内按顺序排列的元素",
|
|
42
|
+
"items": {"$ref": "#/definitions/element"}
|
|
43
|
+
},
|
|
44
|
+
"element": {
|
|
45
|
+
"type": "object", "required": ["type"],
|
|
46
|
+
"description": "One element; type selects its renderer / 一个元素,type 指定呈现方式",
|
|
47
|
+
"allOf": [{"if": {"properties": {"type": {"const": "local-tool"}}}, "then": {"required": ["id", "title", "script", "fallback"]}}],
|
|
48
|
+
"properties": {
|
|
49
|
+
"type": {"enum": ["hero", "section", "heading", "text", "media-text", "display-text", "link-list", "steps", "code", "data-table", "list", "notice", "privacy-services", "privacy-consent", "privacy-controller", "link-directory", "feature-grid", "image", "quote", "cta", "faq", "oembed", "service", "post-list", "latest-posts", "ad-slot", "captcha", "document", "media-viewer", "local-tool"]},
|
|
50
|
+
"id": {"type": "string"},
|
|
51
|
+
"script": {"type": "string", "description": "Same-origin local browser module / 站内浏览器模块"},
|
|
52
|
+
"stylesheet": {"type": "string", "description": "Optional local CSS / 可选站内样式"},
|
|
53
|
+
"data": {"type": "string", "description": "Optional public local JSON asset / 可选站内公开 JSON 数据"},
|
|
54
|
+
"fallback": {"type": "string", "description": "Explanation when JavaScript is disabled / 未启用 JavaScript 时的说明"},
|
|
55
|
+
"title": {"type": "string"},
|
|
56
|
+
"text": {"type": "string"},
|
|
57
|
+
"paragraphs": {"type": "array", "items": {"type": "string"}},
|
|
58
|
+
"items": {"type": "array", "description": "Entries for this element / 此元素的条目"},
|
|
59
|
+
"blocks": {"$ref": "#/definitions/elements", "description": "Section child elements, not page rows / 分区的子元素,不是页面行"},
|
|
60
|
+
"category": {"type": "string"},
|
|
61
|
+
"categories": {"type": "array", "items": {"type": "string"}},
|
|
62
|
+
"count": {"type": "integer", "minimum": 1, "maximum": 12},
|
|
63
|
+
"level": {"type": "integer", "minimum": 2, "maximum": 6},
|
|
64
|
+
"code": {"type": "string", "description": "Code content; use \\n for line breaks / 代码内容,换行使用 \\n"},
|
|
65
|
+
"language": {"type": "string"},
|
|
66
|
+
"src": {"type": "string"},
|
|
67
|
+
"url": {"type": "string"},
|
|
68
|
+
"alt": {"type": "string"},
|
|
69
|
+
"caption": {"type": "string"},
|
|
70
|
+
"cta": {"type": "object", "properties": {"label": {"type": "string"}, "url": {"type": "string"}}, "required": ["label", "url"]}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|