czon 0.7.2 → 0.7.4
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/dist/build/pipeline.js +3 -10
- package/dist/build/robots.js +1 -1
- package/dist/cli.js +0 -10
- package/dist/ssg/ContentPage.js +2 -0
- package/dist/ssg/IndexPage.js +2 -0
- package/dist/ssg/RootPage.js +2 -0
- package/dist/ssg/components/Analytics.js +40 -0
- package/dist/ssg/components/CZONHeader.js +1 -1
- package/package.json +1 -1
package/dist/build/pipeline.js
CHANGED
|
@@ -57,13 +57,6 @@ async function applyConfig(options) {
|
|
|
57
57
|
console.log(`🌐 Target languages: ${options.langs.join(', ')}`);
|
|
58
58
|
metadata_1.MetaData.options.langs = options.langs;
|
|
59
59
|
}
|
|
60
|
-
if (options.baseUrl !== undefined) {
|
|
61
|
-
metadata_1.MetaData.options.baseUrl = options.baseUrl;
|
|
62
|
-
}
|
|
63
|
-
if (options.siteTitle !== undefined) {
|
|
64
|
-
console.log(`🏷️ Site title: ${options.siteTitle}`);
|
|
65
|
-
metadata_1.MetaData.options.siteTitle = options.siteTitle;
|
|
66
|
-
}
|
|
67
60
|
}
|
|
68
61
|
/**
|
|
69
62
|
* 构建管道(函数组合)
|
|
@@ -120,11 +113,11 @@ async function buildPipeline(options) {
|
|
|
120
113
|
// 生成 robots.txt
|
|
121
114
|
await (0, robots_1.generateRobotsTxt)();
|
|
122
115
|
// 生成 sitemap.xml
|
|
123
|
-
if (metadata_1.MetaData.options.baseUrl) {
|
|
124
|
-
await (0, sitemap_1.generateSitemap)(metadata_1.MetaData.options.baseUrl);
|
|
116
|
+
if (metadata_1.MetaData.options.site?.baseUrl) {
|
|
117
|
+
await (0, sitemap_1.generateSitemap)(metadata_1.MetaData.options.site.baseUrl);
|
|
125
118
|
}
|
|
126
119
|
else {
|
|
127
|
-
console.log('ℹ️ Skipping sitemap generation (
|
|
120
|
+
console.log('ℹ️ Skipping sitemap generation (site.baseUrl not configured)');
|
|
128
121
|
}
|
|
129
122
|
}
|
|
130
123
|
/**
|
package/dist/build/robots.js
CHANGED
|
@@ -105,7 +105,7 @@ Disallow:
|
|
|
105
105
|
User-agent: KHTML, like Gecko
|
|
106
106
|
Disallow:
|
|
107
107
|
|
|
108
|
-
${metadata_1.MetaData.options.baseUrl ? `Sitemap: ${path.join(metadata_1.MetaData.options.baseUrl, 'sitemap.xml')}` : ''}
|
|
108
|
+
${metadata_1.MetaData.options.site?.baseUrl ? `Sitemap: ${path.join(metadata_1.MetaData.options.site.baseUrl, 'sitemap.xml')}` : ''}
|
|
109
109
|
`;
|
|
110
110
|
const robotsPath = path.join(paths_1.CZON_DIST_DIR, 'robots.txt');
|
|
111
111
|
await (0, writeFile_1.writeFile)(robotsPath, robotsTxtContent);
|
package/dist/cli.js
CHANGED
|
@@ -166,19 +166,11 @@ class BuildCommand extends clipanion_1.Command {
|
|
|
166
166
|
this.lang = clipanion_1.Option.Array('--lang', {
|
|
167
167
|
description: 'Target languages for translation (e.g., en-US, ja-JP)',
|
|
168
168
|
});
|
|
169
|
-
this.baseUrl = clipanion_1.Option.String('--baseUrl', {
|
|
170
|
-
description: 'Base URL for sitemap generation (e.g., https://yoursite.com). If not provided, sitemap will not be generated.',
|
|
171
|
-
});
|
|
172
|
-
this.siteTitle = clipanion_1.Option.String('--siteTitle', {
|
|
173
|
-
description: 'Site title to replace "CZON" in the header (e.g., "My Docs")',
|
|
174
|
-
});
|
|
175
169
|
}
|
|
176
170
|
async execute() {
|
|
177
171
|
try {
|
|
178
172
|
await (0, pipeline_1.buildSite)({
|
|
179
173
|
langs: this.lang,
|
|
180
|
-
baseUrl: this.baseUrl,
|
|
181
|
-
siteTitle: this.siteTitle,
|
|
182
174
|
});
|
|
183
175
|
return 0;
|
|
184
176
|
}
|
|
@@ -198,8 +190,6 @@ BuildCommand.usage = clipanion_1.Command.Usage({
|
|
|
198
190
|
Examples:
|
|
199
191
|
$ czon build
|
|
200
192
|
$ czon build --lang en-US --lang ja-JP (translate to English and Japanese)
|
|
201
|
-
$ czon build --baseUrl https://yoursite.com (generate sitemap.xml)
|
|
202
|
-
$ czon build --siteTitle "My Docs" (replace "CZON" in header)
|
|
203
193
|
`,
|
|
204
194
|
});
|
|
205
195
|
// 创建 CLI 应用
|
package/dist/ssg/ContentPage.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.ContentPage = void 0;
|
|
7
7
|
const node_path_1 = require("node:path");
|
|
8
8
|
const react_1 = __importDefault(require("react"));
|
|
9
|
+
const Analytics_1 = require("./components/Analytics");
|
|
9
10
|
const ContentMeta_1 = require("./components/ContentMeta");
|
|
10
11
|
const CZONFooter_1 = require("./components/CZONFooter");
|
|
11
12
|
const CZONHeader_1 = require("./components/CZONHeader");
|
|
@@ -33,6 +34,7 @@ const ContentPage = props => {
|
|
|
33
34
|
react_1.default.createElement("title", null, title),
|
|
34
35
|
react_1.default.createElement("link", { rel: "icon", href: faviconUrl, type: "image/x-icon" }),
|
|
35
36
|
react_1.default.createElement("meta", { name: "description", content: `tags: ${tags.join(', ')}` }),
|
|
37
|
+
react_1.default.createElement(Analytics_1.Analytics, { ctx: props.ctx }),
|
|
36
38
|
react_1.default.createElement("script", { src: (0, resourceMap_1.getResourceUrlFrom)(props.ctx.path, 'tailwindcss.js') }),
|
|
37
39
|
react_1.default.createElement("style", null, style_1.style),
|
|
38
40
|
react_1.default.createElement("script", { dangerouslySetInnerHTML: {
|
package/dist/ssg/IndexPage.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.IndexPage = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const sortBy_1 = require("../utils/sortBy");
|
|
9
|
+
const Analytics_1 = require("./components/Analytics");
|
|
9
10
|
const ContentMeta_1 = require("./components/ContentMeta");
|
|
10
11
|
const CZONFooter_1 = require("./components/CZONFooter");
|
|
11
12
|
const CZONHeader_1 = require("./components/CZONHeader");
|
|
@@ -29,6 +30,7 @@ const IndexPage = props => {
|
|
|
29
30
|
react_1.default.createElement("link", { rel: "icon", href: faviconUrl, type: "image/x-icon" }),
|
|
30
31
|
react_1.default.createElement("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
|
|
31
32
|
react_1.default.createElement("meta", { name: "description", content: `Index page for language ${props.lang}` }),
|
|
33
|
+
react_1.default.createElement(Analytics_1.Analytics, { ctx: props.ctx }),
|
|
32
34
|
react_1.default.createElement("script", { src: (0, resourceMap_1.getResourceUrlFrom)(props.ctx.path, 'tailwindcss.js') }),
|
|
33
35
|
react_1.default.createElement("style", null, style_1.style),
|
|
34
36
|
react_1.default.createElement("script", { dangerouslySetInnerHTML: {
|
package/dist/ssg/RootPage.js
CHANGED
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.RootPage = void 0;
|
|
7
7
|
const react_1 = __importDefault(require("react"));
|
|
8
8
|
const languages_1 = require("../languages");
|
|
9
|
+
const Analytics_1 = require("./components/Analytics");
|
|
9
10
|
const resourceMap_1 = require("./resourceMap");
|
|
10
11
|
// /index.html 的根页面
|
|
11
12
|
// 需要实现多语言选择,自动重定向到用户浏览器语言对应的首页
|
|
@@ -27,6 +28,7 @@ const RootPage = props => {
|
|
|
27
28
|
react_1.default.createElement("title", null, "CZON Multilingual Site Navigator"),
|
|
28
29
|
react_1.default.createElement("link", { rel: "icon", href: faviconUrl, type: "image/x-icon" }),
|
|
29
30
|
react_1.default.createElement("meta", { name: "description", content: "Select your preferred language to explore our content." }),
|
|
31
|
+
react_1.default.createElement(Analytics_1.Analytics, { ctx: props.ctx }),
|
|
30
32
|
props.ctx.site.options.langs.map(lang => (react_1.default.createElement("link", { key: lang, rel: "alternate", hrefLang: lang, href: `${lang}/index.html` }))),
|
|
31
33
|
react_1.default.createElement("link", { rel: "alternate", hrefLang: "x-default", href: `${props.ctx.site.options.langs[0]}/index.html` }),
|
|
32
34
|
react_1.default.createElement("script", { dangerouslySetInnerHTML: {
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.Analytics = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
/**
|
|
9
|
+
* Google Analytics and Microsoft Clarity integration component.
|
|
10
|
+
* Renders tracking scripts in <head> when IDs are configured.
|
|
11
|
+
*/
|
|
12
|
+
const Analytics = ({ ctx }) => {
|
|
13
|
+
const gaID = ctx.site.options.site?.gaID;
|
|
14
|
+
const clarityID = ctx.site.options.site?.clarityID;
|
|
15
|
+
if (!gaID && !clarityID) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
19
|
+
gaID && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
20
|
+
react_1.default.createElement("script", { async: true, src: `https://www.googletagmanager.com/gtag/js?id=${gaID}` }),
|
|
21
|
+
react_1.default.createElement("script", { dangerouslySetInnerHTML: {
|
|
22
|
+
__html: `
|
|
23
|
+
window.dataLayer = window.dataLayer || [];
|
|
24
|
+
function gtag(){dataLayer.push(arguments);}
|
|
25
|
+
gtag('js', new Date());
|
|
26
|
+
gtag('config', '${gaID}');
|
|
27
|
+
`,
|
|
28
|
+
} }))),
|
|
29
|
+
clarityID && (react_1.default.createElement("script", { dangerouslySetInnerHTML: {
|
|
30
|
+
__html: `
|
|
31
|
+
(function(c,l,a,r,i,t,y){
|
|
32
|
+
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
|
|
33
|
+
t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
|
|
34
|
+
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
|
|
35
|
+
})(window, document, "clarity", "script", "${clarityID}");
|
|
36
|
+
`,
|
|
37
|
+
} }))));
|
|
38
|
+
};
|
|
39
|
+
exports.Analytics = Analytics;
|
|
40
|
+
//# sourceMappingURL=Analytics.js.map
|
|
@@ -10,7 +10,7 @@ const LanguageSwitch_1 = require("./LanguageSwitch");
|
|
|
10
10
|
const CZONHeader = props => {
|
|
11
11
|
return (react_1.default.createElement("header", { className: "czon-header py-4 border-b flex justify-between items-center px-6" },
|
|
12
12
|
react_1.default.createElement("h1", { className: "text-2xl font-bold" },
|
|
13
|
-
react_1.default.createElement("a", { href: "index.html" }, props.ctx.site.options.
|
|
13
|
+
react_1.default.createElement("a", { href: "index.html" }, props.ctx.site.options.site?.title ?? 'CZON')),
|
|
14
14
|
react_1.default.createElement("div", { className: "flex items-center gap-4" },
|
|
15
15
|
react_1.default.createElement(DarkModeSwitch_1.DarkModeSwitch, null),
|
|
16
16
|
props.lang && react_1.default.createElement(LanguageSwitch_1.LanguageSwitch, { ctx: props.ctx, lang: props.lang, file: props.file }))));
|