edgepress 2026.9.5 → 2026.9.8
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/README.md +5 -3
- package/config.yml +121 -69
- package/content/pages/home/en.md +15 -0
- package/content/pages/home/zh-cn.md +16 -1
- package/content/pages/plugin-development/en.md +5 -4
- package/content/pages/plugin-development/zh-cn.md +5 -4
- package/content/pages/privacy-policy/en.md +8 -5
- package/content/pages/privacy-policy/zh-cn.md +8 -5
- package/content/pages/theme-development/en.md +24 -0
- package/content/pages/theme-development/zh-cn.md +24 -0
- package/content/posts/2026-09-23-edgepress-on-the-edge/en.md +12 -2
- package/content/posts/2026-09-23-edgepress-on-the-edge/zh-cn.md +12 -2
- package/content/posts/2026-09-24-edgepress-release-2026-9-1/en.md +2 -0
- package/content/posts/2026-09-24-edgepress-release-2026-9-1/zh-cn.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-2/en.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-2/zh-cn.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-3/en.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-3/zh-cn.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-4/en.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-4/zh-cn.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-5/en.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-5/zh-cn.md +2 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-6/en.md +31 -0
- package/content/posts/2026-09-25-edgepress-release-2026-9-6/zh-cn.md +31 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-7/en.md +26 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-7/zh-cn.md +26 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-8/en.md +26 -0
- package/content/posts/2026-09-26-edgepress-release-2026-9-8/zh-cn.md +26 -0
- package/languages/base/en.json +9 -2
- package/languages/packs/zh-CN.json +9 -2
- package/package.json +2 -1
- package/plugins/consent/index.js +4 -2
- package/project-compatibility.json +26 -2
- package/src/build.js +5 -4
- package/src/cli.js +8 -13
- package/src/config.js +72 -14
- package/src/content.js +55 -1
- package/src/generators.js +125 -23
- package/src/i18n.js +6 -0
- package/src/icons.js +16 -0
- package/src/maintenance.js +0 -27
- package/src/markdown.js +88 -9
- package/src/page-blocks.js +84 -18
- package/src/page-check.js +79 -25
- package/src/report-visuals.js +111 -16
- package/src/theme.js +13 -2
- package/static/edgepress/brand/edgepress-mark.svg +7 -0
- 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 +46 -0
- package/static/edgepress/code-copy.js +55 -0
- package/static/edgepress/icons.svg +24 -0
- package/static/edgepress/plugins/consent/manager.js +204 -71
- package/static/edgepress/plugins/statistics/cloudflare-web-analytics.js +1 -0
- package/themes/atelier/assets/style.css +98 -20
- package/themes/atelier/layouts/partials/head.html +5 -0
- package/themes/atelier/layouts/partials/header.html +1 -1
- package/themes/default/assets/style.css +99 -20
- package/themes/default/layouts/partials/head.html +3 -0
- package/themes/default/layouts/partials/header.html +1 -1
- package/themes/signal/assets/style.css +98 -20
- package/themes/signal/layouts/partials/head.html +5 -0
- package/themes/signal/layouts/partials/header.html +1 -1
package/README.md
CHANGED
|
@@ -63,8 +63,10 @@ Posts under content/posts/ use the Markdown renderer. Themes own shared head, na
|
|
|
63
63
|
|
|
64
64
|
The only persisted page-audit report is the accessible PDF at tools/page-check.pdf. Desktop and mobile screenshots are embedded in the PDF and removed from temporary storage afterward. Automated checks do not replace manual accessibility or legal review.
|
|
65
65
|
|
|
66
|
-
The header search page filters Markdown posts from the generated local search index; it does not send search queries to an external service. The first post, “EdgePress and Markdown: a complete writing guide,” documents and verifies the supported Markdown syntax in English and Chinese.
|
|
66
|
+
The main navigation includes a Posts entry to the localized article archive. The header search page filters Markdown posts from the generated local search index; it does not send search queries to an external service. Article pages show a linked table of contents and code blocks have accessible copy buttons. The first post, “EdgePress and Markdown: a complete writing guide,” documents and verifies the supported Markdown syntax in English and Chinese.
|
|
67
67
|
|
|
68
|
-
Project guides are published from content/pages/: project introduction, quick start, theme development, plugin development, and privacy policy. The
|
|
68
|
+
Project guides are published from content/pages/: project introduction, quick start, theme development, plugin development, and privacy policy. The starter config uses `https://edgepress.js.gripe` and credits `toewpq`; the privacy policy still reports that its real operator name and working privacy contact must be added before publication.
|
|
69
69
|
|
|
70
|
-
Version 2026.9.
|
|
70
|
+
Version 2026.9.8 records the eighth requested release update for September 2026. It is available as the `edgepress` npm package. See the [request 1 notes](content/posts/2026-09-24-edgepress-release-2026-9-1/), [request 2 notes](content/posts/2026-09-25-edgepress-release-2026-9-2/), [request 3 notes](content/posts/2026-09-25-edgepress-release-2026-9-3/), [request 4 notes](content/posts/2026-09-25-edgepress-release-2026-9-4/), [request 5 notes](content/posts/2026-09-25-edgepress-release-2026-9-5/), [request 6 notes](content/posts/2026-09-25-edgepress-release-2026-9-6/), [request 7 notes](content/posts/2026-09-26-edgepress-release-2026-9-7/), and [request 8 notes](content/posts/2026-09-26-edgepress-release-2026-9-8/).
|
|
71
|
+
|
|
72
|
+
This release adds Markdown video syntax for posts, locale-deduplicated chronological archives, Markdown-rendered post excerpts, date-based consent policy metadata, localized service disclosures, and separate consent-component layout checks. Optional services remain disabled until a visitor makes an explicit choice.
|
package/config.yml
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
# Site owner
|
|
1
|
+
# Site owner metadata and shared website components.
|
|
2
2
|
site:
|
|
3
3
|
title: EdgePress
|
|
4
4
|
description: A static website builder for Cloudflare Workers with editable pages, Markdown posts, themes, and plugins.
|
|
5
|
-
url: https://
|
|
5
|
+
url: https://edgepress.js.gripe
|
|
6
6
|
language: en
|
|
7
7
|
head:
|
|
8
8
|
titleSuffix: ""
|
|
@@ -32,6 +32,11 @@ site:
|
|
|
32
32
|
labels:
|
|
33
33
|
en: Quick start
|
|
34
34
|
zh-CN: 快速入门
|
|
35
|
+
- key: posts
|
|
36
|
+
url: "@archives"
|
|
37
|
+
labels:
|
|
38
|
+
en: Posts
|
|
39
|
+
zh-CN: 文章
|
|
35
40
|
- key: search
|
|
36
41
|
url: "@search"
|
|
37
42
|
labels:
|
|
@@ -50,12 +55,12 @@ site:
|
|
|
50
55
|
zh-CN: Atom 订阅
|
|
51
56
|
footer: ""
|
|
52
57
|
seo:
|
|
53
|
-
author:
|
|
58
|
+
author: toewpq
|
|
54
59
|
keywords:
|
|
55
60
|
- Markdown website builder
|
|
56
61
|
- Cloudflare Workers
|
|
57
62
|
- static site generator
|
|
58
|
-
image:
|
|
63
|
+
image: https://edgepress.js.gripe/edgepress/brand/og-image.png
|
|
59
64
|
robots: index,follow
|
|
60
65
|
# GEO here means agent SEO: make authoritative project information easy to discover and interpret.
|
|
61
66
|
agentSeo:
|
|
@@ -73,74 +78,121 @@ site:
|
|
|
73
78
|
- PerplexityBot
|
|
74
79
|
privacy:
|
|
75
80
|
controller:
|
|
76
|
-
name:
|
|
77
|
-
contact:
|
|
81
|
+
name: toewpq
|
|
82
|
+
contact: toewpq@gmail.com
|
|
78
83
|
policyUrl: /privacy-policy/
|
|
79
84
|
plugins:
|
|
80
85
|
consent:
|
|
81
86
|
enabled: true
|
|
82
|
-
|
|
87
|
+
# Drafting date; set effectiveDate when a revised notice takes effect.
|
|
88
|
+
proposedDate: "2026-09-26"
|
|
89
|
+
effectiveDate: "2026-09-26"
|
|
83
90
|
expiresDays: 180
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
#
|
|
91
|
+
tracking:
|
|
92
|
+
enabled: true
|
|
93
|
+
services: []
|
|
94
|
+
# Example:
|
|
95
|
+
# - id: tag-manager
|
|
96
|
+
# provider: google-tag-manager
|
|
97
|
+
# name: { en: Google Tag Manager, zh-CN: Google 跟踪代码管理器 }
|
|
98
|
+
# purpose: { en: Load campaign tags after consent., zh-CN: 经同意后加载营销标签。 }
|
|
99
|
+
# dataCategories: { en: Describe data sent by this container., zh-CN: 填写此容器发送的数据类别。 }
|
|
100
|
+
# recipient: { en: Google LLC, zh-CN: Google LLC }
|
|
101
|
+
# retention: { en: Configure the retention period., zh-CN: 填写适用的数据保留期限。 }
|
|
102
|
+
# containerId: GTM-ABCD123
|
|
103
|
+
# - id: social-pixel
|
|
104
|
+
# provider: meta-pixel
|
|
105
|
+
# name: { en: Meta Pixel, zh-CN: Meta Pixel }
|
|
106
|
+
# purpose: { en: Measure campaign traffic after consent., zh-CN: 经同意后衡量营销流量。 }
|
|
107
|
+
# dataCategories: { en: Describe data sent by this pixel., zh-CN: 填写此像素发送的数据类别。 }
|
|
108
|
+
# recipient: { en: Meta Platforms, Inc., zh-CN: Meta Platforms, Inc. }
|
|
109
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
110
|
+
# pixelId: "123456789012345"
|
|
111
|
+
statistics:
|
|
112
|
+
enabled: true
|
|
113
|
+
services:
|
|
114
|
+
- id: cloudflare-web-analytics
|
|
115
|
+
provider: cloudflare-web-analytics
|
|
116
|
+
name:
|
|
117
|
+
en: Cloudflare Web Analytics
|
|
118
|
+
zh-CN: Cloudflare 网站分析
|
|
119
|
+
purpose:
|
|
120
|
+
en: Measure page views and page-load performance after consent.
|
|
121
|
+
zh-CN: 经访客同意后衡量页面浏览量和页面加载性能。
|
|
122
|
+
dataCategories:
|
|
123
|
+
en: Performance timing and page-view metrics. Report dimensions can include page path, referrer, device type, browser, operating system, and country.
|
|
124
|
+
zh-CN: 性能计时和页面浏览指标。报告维度可能包括页面路径、来源页、设备类型、浏览器、操作系统和国家或地区。
|
|
125
|
+
recipient:
|
|
126
|
+
en: Cloudflare, Inc.
|
|
127
|
+
zh-CN: Cloudflare, Inc.
|
|
128
|
+
retention:
|
|
129
|
+
en: Unsampled beacon data is kept for 7 days, then aggregated to about 10% for long-term storage. Dashboard history is available for 6 months.
|
|
130
|
+
zh-CN: 未采样的信标数据保留 7 天,之后会汇总为约 10% 的长期数据。仪表板可查看最近 6 个月的历史记录。
|
|
131
|
+
token: "8347d72ba9f84e6783bf441e7832a80e"
|
|
132
|
+
# Examples use public provider IDs only.
|
|
133
|
+
# - id: primary-analytics
|
|
134
|
+
# provider: google-analytics
|
|
135
|
+
# name: { en: Google Analytics, zh-CN: Google Analytics }
|
|
136
|
+
# purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
|
|
137
|
+
# dataCategories: { en: Describe the data processed by this property., zh-CN: 填写此媒体资源处理的数据类别。 }
|
|
138
|
+
# recipient: { en: Google LLC, zh-CN: Google LLC }
|
|
139
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
140
|
+
# measurementId: G-ABC12345
|
|
141
|
+
# - id: edge-analytics
|
|
142
|
+
# provider: cloudflare-web-analytics
|
|
143
|
+
# name: { en: Cloudflare Web Analytics, zh-CN: Cloudflare 网站分析 }
|
|
144
|
+
# purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
|
|
145
|
+
# dataCategories: { en: Describe the data processed by this site., zh-CN: 填写此站点处理的数据类别。 }
|
|
146
|
+
# recipient: { en: Cloudflare, Inc., zh-CN: Cloudflare, Inc. }
|
|
147
|
+
# retention: { en: Configure the retention period., zh-CN: 填写数据保留期限。 }
|
|
148
|
+
# token: 01234567-89ab-cdef-0123-456789abcdef
|
|
149
|
+
# - id: baidu-analytics
|
|
150
|
+
# provider: baidu-tongji
|
|
151
|
+
# name: { en: Baidu Tongji, zh-CN: 百度统计 }
|
|
152
|
+
# purpose: { en: Measure site visits after consent., zh-CN: 经访客同意后衡量网站访问情况。 }
|
|
153
|
+
# dataCategories: { en: Describe data sent to this site ID., zh-CN: 填写此站点编号接收的数据类别。 }
|
|
154
|
+
# recipient: { en: Baidu, Inc., zh-CN: 百度 }
|
|
155
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
156
|
+
# siteId: abcdef0123456789abcdef01
|
|
157
|
+
advertising:
|
|
158
|
+
enabled: true
|
|
159
|
+
services: []
|
|
160
|
+
# Example:
|
|
161
|
+
# - id: display-ads
|
|
162
|
+
# provider: google-adsense
|
|
163
|
+
# name: { en: Google AdSense, zh-CN: Google AdSense }
|
|
164
|
+
# purpose: { en: Display ads after consent., zh-CN: 经访客同意后展示广告。 }
|
|
165
|
+
# dataCategories: { en: Describe the data processed for ad delivery., zh-CN: 填写广告投放处理的数据类别。 }
|
|
166
|
+
# recipient: { en: Google LLC, zh-CN: Google LLC }
|
|
167
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
168
|
+
# clientId: ca-pub-1234567890123456
|
|
169
|
+
captcha:
|
|
170
|
+
enabled: true
|
|
171
|
+
services: []
|
|
172
|
+
# Choose a provider for each CAPTCHA block. Never add its secret key here.
|
|
173
|
+
# - id: contact-form-check
|
|
174
|
+
# provider: cloudflare-turnstile
|
|
175
|
+
# name: { en: Cloudflare Turnstile, zh-CN: Cloudflare Turnstile }
|
|
176
|
+
# purpose: { en: Reduce automated contact form submissions., zh-CN: 减少联系表单中的自动化提交。 }
|
|
177
|
+
# dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
|
|
178
|
+
# recipient: { en: Cloudflare, Inc., zh-CN: Cloudflare, Inc. }
|
|
179
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
180
|
+
# siteKey: 0x4AAAAAAABBBBBBBBCCCCCCDDDD
|
|
181
|
+
# - id: signup-form-check
|
|
182
|
+
# provider: google-recaptcha
|
|
183
|
+
# name: { en: Google reCAPTCHA, zh-CN: Google reCAPTCHA }
|
|
184
|
+
# purpose: { en: Reduce automated signup submissions., zh-CN: 减少注册表单中的自动化提交。 }
|
|
185
|
+
# dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
|
|
186
|
+
# recipient: { en: Google LLC, zh-CN: Google LLC }
|
|
187
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
188
|
+
# siteKey: 6LcAbCdEfGhIjKlMnOpQrStUvWxYz0123456789a
|
|
189
|
+
# - id: support-form-check
|
|
190
|
+
# provider: hcaptcha
|
|
191
|
+
# name: { en: hCaptcha, zh-CN: hCaptcha }
|
|
192
|
+
# purpose: { en: Reduce automated support requests., zh-CN: 减少自动化的支持请求。 }
|
|
193
|
+
# dataCategories: { en: Describe challenge and response data., zh-CN: 填写验证挑战和响应处理的数据类别。 }
|
|
194
|
+
# recipient: { en: Intuition Machines, Inc., zh-CN: Intuition Machines, Inc. }
|
|
195
|
+
# retention: { en: Configure the provider's retention period., zh-CN: 填写供应商的数据保留期限。 }
|
|
196
|
+
# siteKey: 0123456789abcdefghijklmnopqrstuvwx
|
|
197
|
+
# Add browser services under plugins.consent after filling the real site operator details above.
|
|
146
198
|
# Every configured service waits for the visitor's explicit consent before its vendor code loads.
|
package/content/pages/home/en.md
CHANGED
|
@@ -17,6 +17,16 @@ blocks:
|
|
|
17
17
|
eyebrow: A project built for the edge
|
|
18
18
|
title: Build a fast website from clear, editable source files.
|
|
19
19
|
text: EdgePress turns Markdown posts, page layouts, themes, and consent-aware integrations into a static site served by Cloudflare Workers.
|
|
20
|
+
mascotSrc: /edgepress/brand/mascot-418.png
|
|
21
|
+
mascotAlt: A curious sparrow folded from layered paper pages, EdgePress's project mascot.
|
|
22
|
+
mascotWidth: 418
|
|
23
|
+
mascotHeight: 440
|
|
24
|
+
mascotSizes: 209px
|
|
25
|
+
mascotWebpSrcset:
|
|
26
|
+
- src: /edgepress/brand/mascot-209.webp
|
|
27
|
+
width: 209
|
|
28
|
+
- src: /edgepress/brand/mascot-418.webp
|
|
29
|
+
width: 418
|
|
20
30
|
cta:
|
|
21
31
|
label: Start with the quick guide
|
|
22
32
|
url: /quick-start/
|
|
@@ -31,15 +41,19 @@ blocks:
|
|
|
31
41
|
title: A clear place for each part of a site
|
|
32
42
|
items:
|
|
33
43
|
- title: Pages use editable elements
|
|
44
|
+
icon: layout-grid
|
|
34
45
|
text: Set the number of columns first, then choose elements and edit their content in each page file.
|
|
35
46
|
url: /theme-development/
|
|
36
47
|
- title: Posts use Markdown
|
|
48
|
+
icon: file-text
|
|
37
49
|
text: Write long-form articles in Markdown and let the built-in renderer sanitize and format them.
|
|
38
50
|
url: /project-introduction/
|
|
39
51
|
- title: Themes own the design
|
|
52
|
+
icon: palette
|
|
40
53
|
text: Build layouts with HTML partials and keep each theme's color palette in its stylesheet.
|
|
41
54
|
url: /theme-development/
|
|
42
55
|
- title: Integrations wait for consent
|
|
56
|
+
icon: shield-check
|
|
43
57
|
text: Add tracking, statistics, advertising, or CAPTCHA services with provider details in configuration.
|
|
44
58
|
url: /plugin-development/
|
|
45
59
|
- columns: 2
|
|
@@ -81,4 +95,5 @@ blocks:
|
|
|
81
95
|
- type: latest-posts
|
|
82
96
|
title: Latest project updates
|
|
83
97
|
count: 3
|
|
98
|
+
paginate: true
|
|
84
99
|
---
|
|
@@ -17,6 +17,16 @@ blocks:
|
|
|
17
17
|
eyebrow: 为边缘网络构建
|
|
18
18
|
title: 用清晰、可编辑的源文件构建快速网站。
|
|
19
19
|
text: EdgePress 将 Markdown 文章、页面布局、主题和遵循同意状态的集成构建为由 Cloudflare Workers 提供服务的静态网站。
|
|
20
|
+
mascotSrc: /edgepress/brand/mascot-418.png
|
|
21
|
+
mascotAlt: EdgePress 吉祥物,一只由层叠折页构成、神情好奇的小鸟。
|
|
22
|
+
mascotWidth: 418
|
|
23
|
+
mascotHeight: 440
|
|
24
|
+
mascotSizes: 209px
|
|
25
|
+
mascotWebpSrcset:
|
|
26
|
+
- src: /edgepress/brand/mascot-209.webp
|
|
27
|
+
width: 209
|
|
28
|
+
- src: /edgepress/brand/mascot-418.webp
|
|
29
|
+
width: 418
|
|
20
30
|
cta:
|
|
21
31
|
label: 从快速入门开始
|
|
22
32
|
url: /quick-start/
|
|
@@ -31,15 +41,19 @@ blocks:
|
|
|
31
41
|
title: 网站各部分各有清晰位置
|
|
32
42
|
items:
|
|
33
43
|
- title: 页面使用可编辑元素
|
|
44
|
+
icon: layout-grid
|
|
34
45
|
text: 先设置栏数,再选择元素类型,并在各页面文件中编辑对应内容。
|
|
35
46
|
url: /theme-development/
|
|
36
47
|
- title: 文章使用 Markdown
|
|
48
|
+
icon: file-text
|
|
37
49
|
text: 使用 Markdown 撰写长文,由内置渲染器进行清理和排版。
|
|
38
50
|
url: /project-introduction/
|
|
39
51
|
- title: 主题负责视觉设计
|
|
52
|
+
icon: palette
|
|
40
53
|
text: 使用 HTML 局部模板构建布局,并将各主题的配色保留在样式表中。
|
|
41
54
|
url: /theme-development/
|
|
42
55
|
- title: 集成遵循用户同意
|
|
56
|
+
icon: shield-check
|
|
43
57
|
text: 配置跟踪、统计、广告或人机验证服务及其供应商信息。
|
|
44
58
|
url: /plugin-development/
|
|
45
59
|
- columns: 2
|
|
@@ -81,4 +95,5 @@ blocks:
|
|
|
81
95
|
- type: latest-posts
|
|
82
96
|
title: 最新项目动态
|
|
83
97
|
count: 3
|
|
84
|
-
|
|
98
|
+
paginate: true
|
|
99
|
+
---
|
|
@@ -43,9 +43,10 @@ blocks:
|
|
|
43
43
|
blocks:
|
|
44
44
|
- type: text
|
|
45
45
|
paragraphs:
|
|
46
|
-
- Add browser providers in config.yml under plugins.tracking, plugins.statistics, plugins.advertising, or plugins.captcha. Each
|
|
46
|
+
- Add browser providers in config.yml under plugins.consent.tracking, plugins.consent.statistics, plugins.consent.advertising, or plugins.consent.captcha. Each service needs a unique ID, provider, purpose, dataCategories, recipient, retention, and its public site identifier. Localized fields are maps keyed by every enabled locale, such as en and zh-CN.
|
|
47
47
|
- Available providers include Google Tag Manager and Meta Pixel; Cloudflare Web Analytics, Google Analytics, and Baidu Tongji; Google AdSense; and Cloudflare Turnstile, Google reCAPTCHA, and hCaptcha.
|
|
48
|
-
-
|
|
48
|
+
- Set plugins.consent.proposedDate to the YYYY-MM-DD date the notice was drafted. Set effectiveDate when the notice takes effect; omit it while no effective date has been set. Updating either date makes saved consent stale, so visitors are asked again.
|
|
49
|
+
- Provider code is imported only after the visitor accepts that integration. The first layer offers accept and reject together; service data and individual switches are available in its details. Keep CAPTCHA secret keys out of config.yml and client code. The server must submit each CAPTCHA response to the provider verification API before accepting a form.
|
|
49
50
|
- type: notice
|
|
50
51
|
title: Operator details
|
|
51
52
|
text: Fill privacy.controller.name, privacy.controller.contact, and privacy.policyUrl before configuring any browser provider. The build rejects provider services when the controller name or contact is blank.
|
|
@@ -85,8 +86,8 @@ blocks:
|
|
|
85
86
|
items:
|
|
86
87
|
- label: Cloudflare Turnstile Siteverify
|
|
87
88
|
url: https://developers.cloudflare.com/turnstile/get-started/server-side-validation/
|
|
88
|
-
- label:
|
|
89
|
-
url: https://www.edpb.europa.eu/
|
|
89
|
+
- label: EDPB consent summary
|
|
90
|
+
url: https://www.edpb.europa.eu/system/files/2026-04/edpb-summary-consent_en.pdf
|
|
90
91
|
- columns: 1
|
|
91
92
|
cells:
|
|
92
93
|
-
|
|
@@ -43,9 +43,10 @@ blocks:
|
|
|
43
43
|
blocks:
|
|
44
44
|
- type: text
|
|
45
45
|
paragraphs:
|
|
46
|
-
- 在 config.yml 的 plugins.tracking、plugins.statistics、plugins.advertising 或 plugins.captcha 下添加浏览器供应商。每项需要唯一 ID
|
|
46
|
+
- 在 config.yml 的 plugins.consent.tracking、plugins.consent.statistics、plugins.consent.advertising 或 plugins.consent.captcha 下添加浏览器供应商。每项需要唯一 ID、provider、purpose、dataCategories、recipient、retention 和公开站点标识。多语言字段需使用语言映射,覆盖已启用的每种语言,例如 en 与 zh-CN。
|
|
47
47
|
- 可用供应商包括 Google Tag Manager 和 Meta Pixel;Cloudflare Web Analytics、Google Analytics 和百度统计;Google AdSense;以及 Cloudflare Turnstile、Google reCAPTCHA 和 hCaptcha。
|
|
48
|
-
-
|
|
48
|
+
- plugins.consent.proposedDate 必须设置为 YYYY-MM-DD 格式的告知拟定日期。告知生效后再设置 effectiveDate;尚未生效时可以省略。修改任一日期都会使旧的同意记录失效,并重新询问访客。
|
|
49
|
+
- 只有访客接受对应集成后才会导入供应商代码。首层同时提供接受和拒绝,数据详情与逐项开关位于展开内容中。不要把 CAPTCHA 密钥放入 config.yml 或客户端代码。服务器必须在接受表单前将每个 CAPTCHA 响应提交给供应商验证 API。
|
|
49
50
|
- type: notice
|
|
50
51
|
title: 运营者信息
|
|
51
52
|
text: 配置浏览器供应商前,请填写 privacy.controller.name、privacy.controller.contact 和 privacy.policyUrl。控制者名称或联系方式为空时,构建器会拒绝启用供应商服务。
|
|
@@ -85,8 +86,8 @@ blocks:
|
|
|
85
86
|
items:
|
|
86
87
|
- label: Cloudflare Turnstile Siteverify
|
|
87
88
|
url: https://developers.cloudflare.com/turnstile/get-started/server-side-validation/
|
|
88
|
-
- label: EDPB
|
|
89
|
-
url: https://www.edpb.europa.eu/
|
|
89
|
+
- label: EDPB 同意摘要
|
|
90
|
+
url: https://www.edpb.europa.eu/system/files/2026-04/edpb-summary-consent_en.pdf
|
|
90
91
|
- columns: 1
|
|
91
92
|
cells:
|
|
92
93
|
-
|
|
@@ -15,7 +15,7 @@ blocks:
|
|
|
15
15
|
nameLabel: Controller
|
|
16
16
|
contactLabel: Privacy contact
|
|
17
17
|
missingTitle: Publication setup required
|
|
18
|
-
missingText:
|
|
18
|
+
missingText: config.yml still needs the site's real operator name and a working privacy contact. Add both before publishing this policy.
|
|
19
19
|
- columns: 2
|
|
20
20
|
cells:
|
|
21
21
|
-
|
|
@@ -32,7 +32,7 @@ blocks:
|
|
|
32
32
|
title: Optional browser services
|
|
33
33
|
blocks:
|
|
34
34
|
- type: text
|
|
35
|
-
text:
|
|
35
|
+
text: This list is regenerated on each build from enabled browser services in config.yml under plugins.consent. It shows each service name, provider category, purpose, data categories, recipient, and configured retention period.
|
|
36
36
|
- type: privacy-services
|
|
37
37
|
emptyText: No optional third-party browser services are configured in this source build.
|
|
38
38
|
- columns: 1
|
|
@@ -44,12 +44,14 @@ blocks:
|
|
|
44
44
|
blocks:
|
|
45
45
|
- type: text
|
|
46
46
|
paragraphs:
|
|
47
|
-
-
|
|
48
|
-
-
|
|
47
|
+
- Optional browser integrations stay off until a visitor actively accepts them. No service is selected on a first visit. Accept and reject are both available at the same level; visitors can also open the service details and save a granular choice.
|
|
48
|
+
- The interface stores the selected service IDs in first-party browser storage for the configured period. This preference record is stored on the visitor's device; it is not a server-side audit log.
|
|
49
|
+
- Visitors can reopen Privacy settings to change or withdraw a choice. If they withdraw a previously active service, the page reloads so the integration can stop running.
|
|
49
50
|
- type: privacy-consent
|
|
50
51
|
storageLabel: Browser storage key
|
|
51
52
|
expiryLabel: Preference expiry
|
|
52
|
-
|
|
53
|
+
proposedDateLabel: Notice proposed
|
|
54
|
+
effectiveDateLabel: Notice effective
|
|
53
55
|
expiryText: "{days} days after saving"
|
|
54
56
|
- columns: 1
|
|
55
57
|
cells:
|
|
@@ -61,6 +63,7 @@ blocks:
|
|
|
61
63
|
paragraphs:
|
|
62
64
|
- Before enabling a provider, the operator must document the information it receives, purposes, recipients, applicable retention, and any cross-border transfers. Public site identifiers may be configured in the browser; CAPTCHA secret keys must stay on a trusted server, which must verify each response token.
|
|
63
65
|
- This starter configuration cannot determine the operator's jurisdiction, legal bases, retention obligations, or the rights that apply to a particular deployment. Complete this policy for the actual site and seek qualified advice where needed.
|
|
66
|
+
- Review the current privacy information and terms for every provider listed above. Confirm that its actual data collection, recipients, retention, and transfer practices match this policy before publication and whenever the configuration changes.
|
|
64
67
|
- type: link-list
|
|
65
68
|
title: Primary legal references
|
|
66
69
|
items:
|
|
@@ -15,7 +15,7 @@ blocks:
|
|
|
15
15
|
nameLabel: 个人信息处理者
|
|
16
16
|
contactLabel: 隐私联系
|
|
17
17
|
missingTitle: 发布前需要补充信息
|
|
18
|
-
missingText:
|
|
18
|
+
missingText: config.yml 尚未填写真实运营者名称和有效的隐私联系方式。正式发布前请补充这两项信息。
|
|
19
19
|
- columns: 2
|
|
20
20
|
cells:
|
|
21
21
|
-
|
|
@@ -32,7 +32,7 @@ blocks:
|
|
|
32
32
|
title: 可选浏览器服务
|
|
33
33
|
blocks:
|
|
34
34
|
- type: text
|
|
35
|
-
text:
|
|
35
|
+
text: 下方列表会在每次构建时根据 config.yml 中 plugins.consent 下已启用的浏览器服务重新生成,显示服务名称、供应商类别、用途、数据类别、接收方和配置的保留期限。
|
|
36
36
|
- type: privacy-services
|
|
37
37
|
emptyText: 此源项目当前没有配置可选的第三方浏览器服务。
|
|
38
38
|
- columns: 1
|
|
@@ -44,12 +44,14 @@ blocks:
|
|
|
44
44
|
blocks:
|
|
45
45
|
- type: text
|
|
46
46
|
paragraphs:
|
|
47
|
-
-
|
|
48
|
-
-
|
|
47
|
+
- 可选浏览器集成只有在访客主动接受后才会加载。首次访问时没有预先选中的服务;接受和拒绝选项处于同一层级,访客也可以展开服务详情并保存逐项选择。
|
|
48
|
+
- 同意界面会在第一方浏览器存储中保存访客选择的服务 ID,并遵循下方配置的有效期限。该偏好记录只保存在访客设备上,不是服务器端审计日志。
|
|
49
|
+
- 访客可以重新打开“隐私设置”更改或撤回选择。撤回之前已启用的服务后,页面会重新载入,以停止该集成继续运行。
|
|
49
50
|
- type: privacy-consent
|
|
50
51
|
storageLabel: 浏览器存储键
|
|
51
52
|
expiryLabel: 偏好过期时间
|
|
52
|
-
|
|
53
|
+
proposedDateLabel: 隐私告知拟定日期
|
|
54
|
+
effectiveDateLabel: 隐私告知生效日期
|
|
53
55
|
expiryText: "保存后 {days} 天"
|
|
54
56
|
- columns: 1
|
|
55
57
|
cells:
|
|
@@ -61,6 +63,7 @@ blocks:
|
|
|
61
63
|
paragraphs:
|
|
62
64
|
- 启用供应商前,运营者应记录供应商接收的信息、处理目的、接收方、适用保留期限和跨境传输情况。浏览器配置中只能填写公开站点标识;CAPTCHA 密钥必须保存在可信服务器中,并由服务器验证每个响应令牌。
|
|
63
65
|
- 此起始配置无法确定实际部署的运营者所在地、法律依据、数据保留义务或适用的个人权利。请根据实际网站完成政策,必要时咨询合格的专业人员。
|
|
66
|
+
- 请核对上方每个供应商当前的隐私说明和适用条款,确认其实际收集的数据、接收方、保留期限和传输方式与本政策一致。发布前以及配置变更后都应重新检查。
|
|
64
67
|
- type: link-list
|
|
65
68
|
title: 主要法律资料
|
|
66
69
|
items:
|
|
@@ -39,6 +39,7 @@ blocks:
|
|
|
39
39
|
- The shared layout renders every page and post. The head, header, and footer partials provide common site components. Configure the page-title suffix and separator, site title, shared navigation, language links, footer text, and component visibility in config.yml.
|
|
40
40
|
- Use double-brace placeholders for escaped values. The approved raw placeholders are generated page content, JSON-LD, and EdgePress-generated navigation markup. Keep the skip link, one main landmark, labeled navigation, visible focus, and one page-level h1.
|
|
41
41
|
- Keep the body as a full-height vertical layout and let main grow so the footer stays at the bottom on short pages.
|
|
42
|
+
- Style shared code blocks, copy buttons, and article contents in the theme. Code lines wrap on small viewports, copy controls have visible keyboard focus, and the generated post contents list links to heading anchors.
|
|
42
43
|
-
|
|
43
44
|
- type: section
|
|
44
45
|
title: Choose a theme palette
|
|
@@ -65,6 +66,7 @@ blocks:
|
|
|
65
66
|
- Each page and locale is a Markdown file, but the page body after front matter must stay empty. The editor data lives in its blocks YAML.
|
|
66
67
|
- "Order the data from the outside inward: set each row's columns count first, provide one cells entry per column, select an element type inside a cell, then edit that element's fields. The validator rejects mismatched column counts and empty cells."
|
|
67
68
|
- Pages do not use the post Markdown renderer. Posts remain Markdown articles and use the built-in sanitizing renderer.
|
|
69
|
+
- Hero blocks can use mascotWebpSrcset with ascending path-and-width candidates, mascotSizes matching the rendered width, and mascotWidth/mascotHeight matching the fallback image. mascotSrc remains the fallback for browsers without WebP support.
|
|
68
70
|
- type: data-table
|
|
69
71
|
title: Available element families
|
|
70
72
|
headers:
|
|
@@ -103,4 +105,26 @@ blocks:
|
|
|
103
105
|
- title: Preview the site
|
|
104
106
|
text: The server watches source files, rebuilds the output, refreshes the browser, and updates the accessibility and agent-friendliness report.
|
|
105
107
|
command: edgepress server
|
|
108
|
+
- columns: 1
|
|
109
|
+
cells:
|
|
110
|
+
-
|
|
111
|
+
- type: section
|
|
112
|
+
title: Use the shared icon library
|
|
113
|
+
tone: soft
|
|
114
|
+
text: EdgePress ships 22 local SVG icons at /edgepress/icons.svg. Theme navigation uses them automatically; feature-grid items can also name an icon, with no runtime package or third-party request.
|
|
115
|
+
blocks:
|
|
116
|
+
- type: code
|
|
117
|
+
title: Add a decorative icon to a theme partial
|
|
118
|
+
language: html
|
|
119
|
+
code: |
|
|
120
|
+
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
121
|
+
<use href="/edgepress/icons.svg#layers"></use>
|
|
122
|
+
</svg>
|
|
123
|
+
- type: code
|
|
124
|
+
title: Choose an icon for a feature card
|
|
125
|
+
language: yaml
|
|
126
|
+
code: |
|
|
127
|
+
- title: Posts use Markdown
|
|
128
|
+
icon: file-text
|
|
129
|
+
text: Write and publish an article.
|
|
106
130
|
---
|
|
@@ -39,6 +39,7 @@ blocks:
|
|
|
39
39
|
- 共享布局会渲染所有页面和文章。head、header 和 footer 局部模板提供常见网站组件。在 config.yml 中配置页面标题后缀与分隔符、站点标题、全站导航、语言链接、页脚内容和组件显示状态。
|
|
40
40
|
- 使用双花括号占位符输出经过转义的值。唯一允许的原样占位符是生成的页面内容、JSON-LD 和 EdgePress 生成的导航标记。保留跳转链接、唯一 main 主区域、带标签的导航、可见焦点和一个页面级 h1。
|
|
41
41
|
- 将 body 保持为全高纵向布局,并让 main 延伸,这样短页面的页脚也会留在视口底部。
|
|
42
|
+
- 在主题中统一设计代码块、复制按钮和文章目录。窄屏代码行会自动折行,复制控件具有清晰的键盘焦点,生成的文章目录会链接到标题锚点。
|
|
42
43
|
-
|
|
43
44
|
- type: section
|
|
44
45
|
title: 选择主题配色
|
|
@@ -65,6 +66,7 @@ blocks:
|
|
|
65
66
|
- 每个页面和语言版本都是一个 Markdown 文件,但 front matter 之后必须保持空白。页面编辑数据放在 YAML blocks 中。
|
|
66
67
|
- 数据从外向内排列:先设每行的 columns 栏数,再为每栏设置一个 cells 项,然后在栏内选择元素类型,最后编辑该元素字段。验证器会拒绝栏数不匹配或空白的栏。
|
|
67
68
|
- 页面不使用文章 Markdown 渲染器。文章仍使用 Markdown 撰写,并由内置安全渲染器输出。
|
|
69
|
+
- hero 元素可用 mascotWebpSrcset 提供按宽度递增的路径候选项,并设置与显示宽度一致的 mascotSizes,以及匹配备用图片尺寸的 mascotWidth 和 mascotHeight。mascotSrc 会留作不支持 WebP 的浏览器备用图。
|
|
68
70
|
- type: data-table
|
|
69
71
|
title: 可用元素类别
|
|
70
72
|
headers:
|
|
@@ -103,4 +105,26 @@ blocks:
|
|
|
103
105
|
- title: 预览网站
|
|
104
106
|
text: server 会监视源文件、重新构建输出、刷新浏览器,并更新无障碍化和 agent 友好度报告。
|
|
105
107
|
command: edgepress server
|
|
108
|
+
- columns: 1
|
|
109
|
+
cells:
|
|
110
|
+
-
|
|
111
|
+
- type: section
|
|
112
|
+
title: 使用共享图标库
|
|
113
|
+
tone: soft
|
|
114
|
+
text: EdgePress 随站点提供 22 个本地 SVG 图标 /edgepress/icons.svg。主题导航会自动使用图标;feature-grid 也可为功能卡片指定图标,不增加运行时依赖,也不会请求第三方服务器。
|
|
115
|
+
blocks:
|
|
116
|
+
- type: code
|
|
117
|
+
title: 在主题局部模板中添加装饰图标
|
|
118
|
+
language: html
|
|
119
|
+
code: |
|
|
120
|
+
<svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
|
|
121
|
+
<use href="/edgepress/icons.svg#layers"></use>
|
|
122
|
+
</svg>
|
|
123
|
+
- type: code
|
|
124
|
+
title: 为功能卡片指定图标
|
|
125
|
+
language: yaml
|
|
126
|
+
code: |
|
|
127
|
+
- title: 文章使用 Markdown
|
|
128
|
+
icon: file-text
|
|
129
|
+
text: 撰写并发布文章。
|
|
106
130
|
---
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: "EdgePress and Markdown: a complete writing guide"
|
|
3
|
+
author: toewpq
|
|
3
4
|
date: 2026-09-23
|
|
4
5
|
lang: en
|
|
5
6
|
slug: markdown-syntax-guide
|
|
@@ -8,6 +9,7 @@ tags:
|
|
|
8
9
|
- Markdown
|
|
9
10
|
- writing guide
|
|
10
11
|
description: "A hands-on guide to the Markdown syntax EdgePress renders, including GitHub Flavored Markdown, safe HTML, nested formatting, and its supported limits."
|
|
12
|
+
|
|
11
13
|
---
|
|
12
14
|
|
|
13
15
|
EdgePress keeps **pages** and **posts** deliberately different. Pages use ordered, editable element blocks from their Markdown front matter. Posts use the Markdown renderer, so this article is also a working reference: every example below is rendered from a real post.
|
|
@@ -102,6 +104,14 @@ Images use the same shape as links, with an exclamation mark and useful alternat
|
|
|
102
104
|
|
|
103
105
|

|
|
104
106
|
|
|
107
|
+
Posts also accept a direct video file in the same image-shaped syntax. The alt text describes the video for assistive technology, and the optional title becomes its caption:
|
|
108
|
+
|
|
109
|
+
```markdown
|
|
110
|
+

|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
MP4, WebM, OGV, and OGG files are rendered in a native video player with controls. Media uses `preload="none"` so the browser waits for playback before downloading the video. Embedded video players and arbitrary iframe markup are not supported.
|
|
114
|
+
|
|
105
115
|
## Lists, including nested combinations
|
|
106
116
|
|
|
107
117
|
Start unordered items with `-`, `+`, or `*`; start ordered items with a number and a period. Indent child items by at least two spaces. Inline emphasis, code, and links work inside either level:
|
|
@@ -158,12 +168,12 @@ Small semantic HTML elements such as <kbd>Ctrl</kbd> can be useful inside Markdo
|
|
|
158
168
|
|
|
159
169
|
<script>alert('unsafe');</script>
|
|
160
170
|
|
|
161
|
-
Use
|
|
171
|
+
Use the Markdown image-shaped syntax above for a direct video file; embedded frames and arbitrary scripts are not allowed in posts.
|
|
162
172
|
|
|
163
173
|
This is the complete enabled post dialect: CommonMark block and inline syntax plus GFM tables, autolinks, task lists, and strikethrough. Extensions such as footnotes, math notation, Mermaid diagrams, underline syntax, and definition lists are not enabled by this project. They remain ordinary text unless you add a trusted renderer extension.
|
|
164
174
|
|
|
165
175
|
## Writing posts in EdgePress
|
|
166
176
|
|
|
167
|
-
Create a post directory under `content/posts/` with one lowercase locale file such as `en.md` or `zh-cn.md`. Keep the `lang` front matter value matched to the locale filename. Add title, date, slug, tags, and an optional description above the Markdown body. Then run `edgepress build` to render the post, or `edgepress check` to build the site and generate the accessibility, agent-friendliness, responsive screenshot, and Markdown-rendering report.
|
|
177
|
+
Create a post directory under `content/posts/` with one lowercase locale file such as `en.md` or `zh-cn.md`. Keep the `lang` front matter value matched to the locale filename. Add title, author, date, slug, tags, and an optional description above the Markdown body. The author appears in article cards, article bylines, feeds, search data, and BlogPosting metadata. Then run `edgepress build` to render the post, or `edgepress check` to build the site and generate the accessibility, agent-friendliness, responsive screenshot, and Markdown-rendering report.
|
|
168
178
|
|
|
169
179
|
The local article search reads the generated `search.json` file from this site and searches post titles and text in the browser. It does not send a query to a third-party service.
|