@clize/clize 0.35.4 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,388 @@
1
+ // ============================================================
2
+ // 格子(design/seo-cell-funnel.md v2):页面是资产、产品自记;agent 只说「这个词由哪个族在哪个语区承载」。
3
+ //
4
+ // 本文件 = 纯函数,无 I/O:
5
+ // ① 页首解析(hreflang / <html lang> / noindex / title)—— 外部站 check 抓一次页首,托管站 deploy 直接写;
6
+ // ② 分族:hreflang 互链的并查集簇,族键 = x-default / en 页的末段 slug;
7
+ // ③ 格子面 deriveCells:families / queue / missing / retire / cannibal / defects —— 全是事实,动作是 agent 的。
8
+ // D1 读写在 seo.ts(数据在那);判断层在 clize-seo skill §7.2 / §7.3 / §10。
9
+ // ============================================================
10
+ import { localeOfSegment } from "./site-manifest.js";
11
+ import { normalizePageUrl } from "./seo-pages.js";
12
+ const HEAD_WINDOW = 64 * 1024;
13
+ function attr(tag, name) {
14
+ const m = new RegExp(`\\b${name}\\s*=\\s*("([^"]*)"|'([^']*)'|([^\\s>]+))`, "i").exec(tag);
15
+ return m ? (m[2] ?? m[3] ?? m[4] ?? "").trim() : null;
16
+ }
17
+ function decode(s) {
18
+ return s
19
+ .replace(/&amp;/g, "&")
20
+ .replace(/&lt;/g, "<")
21
+ .replace(/&gt;/g, ">")
22
+ .replace(/&quot;/g, '"')
23
+ .replace(/&#39;/g, "'")
24
+ .replace(/&#x27;/gi, "'");
25
+ }
26
+ /** 页首解析:只看前 64KB;属性顺序无关;相对 href 按页 URL 补全。 */
27
+ export function parsePageHead(html, pageUrl) {
28
+ const head = html.slice(0, HEAD_WINDOW);
29
+ const alternates = {};
30
+ for (const tag of head.match(/<link\b[^>]*>/gi) ?? []) {
31
+ const rel = (attr(tag, "rel") ?? "").toLowerCase();
32
+ if (!/\balternate\b/.test(rel))
33
+ continue;
34
+ const hreflang = attr(tag, "hreflang");
35
+ const href = attr(tag, "href");
36
+ if (!hreflang || !href)
37
+ continue;
38
+ let abs = decode(href);
39
+ if (pageUrl)
40
+ try {
41
+ abs = new URL(abs, pageUrl).toString();
42
+ }
43
+ catch {
44
+ /* 保持原样 */
45
+ }
46
+ if (!(hreflang in alternates))
47
+ alternates[hreflang] = abs;
48
+ }
49
+ const htmlTag = /<html\b[^>]*>/i.exec(head)?.[0] ?? "";
50
+ const lang = attr(htmlTag, "lang");
51
+ let noindex = false;
52
+ for (const tag of head.match(/<meta\b[^>]*>/gi) ?? []) {
53
+ const name = (attr(tag, "name") ?? "").toLowerCase();
54
+ if (name !== "robots" && name !== "googlebot")
55
+ continue;
56
+ if (/\bnoindex\b/i.test(attr(tag, "content") ?? ""))
57
+ noindex = true;
58
+ }
59
+ const title = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(head)?.[1];
60
+ return {
61
+ title: title ? decode(title).replace(/\s+/g, " ").trim().slice(0, 200) || null : null,
62
+ lang: lang || null,
63
+ alternates,
64
+ noindex,
65
+ };
66
+ }
67
+ // ---- 语区 ----
68
+ /** 语言码 → 缺省市场(seo 白名单里的写法)。列表外的语言保留规范形(it / nl / es-MX),照样能算格子,只是不能定价。 */
69
+ const DEFAULT_MARKET = {
70
+ en: "en-US",
71
+ de: "de-DE",
72
+ fr: "fr-FR",
73
+ es: "es-ES",
74
+ ja: "ja-JP",
75
+ ko: "ko-KR",
76
+ pt: "pt-BR",
77
+ };
78
+ /** hreflang / lang / 目录名 → 市场标签:ja → ja-JP,zh-Hant / zh-TW → zh-TW,pt-br → pt-BR,x-default → null。 */
79
+ export function normalizeLocaleTag(raw) {
80
+ if (!raw)
81
+ return null;
82
+ const s = raw.trim();
83
+ if (!s || s.toLowerCase() === "x-default")
84
+ return null;
85
+ const m = /^([a-z]{2,3})(?:[-_]([a-z]{2}|[a-z]{4}|[0-9]{3}))?$/i.exec(s);
86
+ if (!m)
87
+ return null;
88
+ const lang = (m[1] ?? "").toLowerCase();
89
+ const sub = m[2];
90
+ if (lang === "zh") {
91
+ const t = (sub ?? "").toLowerCase();
92
+ if (t === "tw" || t === "hant" || t === "hk")
93
+ return "zh-TW";
94
+ if (t === "cn" || t === "hans" || t === "sg")
95
+ return "zh-CN";
96
+ return "zh";
97
+ }
98
+ if (!sub)
99
+ return DEFAULT_MARKET[lang] ?? lang;
100
+ if (/^[0-9]{3}$/.test(sub))
101
+ return `${lang}-${sub}`;
102
+ if (sub.length === 2)
103
+ return `${lang}-${sub.toUpperCase()}`;
104
+ // 文字变体(Latn / Cyrl):没有市场含义,退回语言的缺省市场
105
+ return DEFAULT_MARKET[lang] ?? lang;
106
+ }
107
+ /** 路径首段是语言目录 → 市场标签;不是 → null(根目录页由调用方按站点缺省处理)。 */
108
+ export function localeOfUrl(url) {
109
+ try {
110
+ const seg = new URL(url).pathname.split("/").filter(Boolean)[0] ?? "";
111
+ return normalizeLocaleTag(localeOfSegment(seg));
112
+ }
113
+ catch {
114
+ return null;
115
+ }
116
+ }
117
+ /** 族键:URL 末段 slug(/ja/tools/csv-split/ → csv-split;根 → home)。 */
118
+ export function familyKeyOf(url) {
119
+ try {
120
+ const segs = new URL(url).pathname.split("/").filter(Boolean);
121
+ const last = segs[segs.length - 1] ?? "";
122
+ return (last.replace(/\.html?$/i, "") || "home").toLowerCase();
123
+ }
124
+ catch {
125
+ return url.toLowerCase();
126
+ }
127
+ }
128
+ /** hreflang 互链簇 → 族键 + 每页语区。族键取簇内 x-default(或 en)页的末段;没有就取排序后首页的末段。
129
+ * 页的语区:自指 hreflang 的键 > 别页指向它时用的键 > <html lang> > 路径首段 > 站点缺省(调用方给)。 */
130
+ export function derivePageFamilies(pages, defaultLocale = "en-US") {
131
+ const key = (u) => normalizePageUrl(u);
132
+ const known = new Map();
133
+ for (const p of pages)
134
+ known.set(key(p.url), p);
135
+ const parent = new Map();
136
+ const find = (x) => {
137
+ let r = x;
138
+ while (parent.get(r) !== undefined && parent.get(r) !== r)
139
+ r = parent.get(r);
140
+ parent.set(x, r);
141
+ return r;
142
+ };
143
+ const union = (a, b) => {
144
+ const ra = find(a);
145
+ const rb = find(b);
146
+ if (ra !== rb)
147
+ parent.set(ra, rb);
148
+ };
149
+ for (const k of known.keys())
150
+ parent.set(k, k);
151
+ // 每页被谁用什么 hreflang 指过(别页的 alternates 里的键)
152
+ const pointedAs = new Map();
153
+ for (const [k, p] of known) {
154
+ for (const [tag, href] of Object.entries(p.alternates)) {
155
+ const hk = key(href);
156
+ if (!known.has(hk))
157
+ continue; // 指向清单外的页:不建簇(可能是别的站 / 已删的页)
158
+ union(k, hk);
159
+ const loc = normalizeLocaleTag(tag);
160
+ if (loc && hk !== k && !pointedAs.has(hk))
161
+ pointedAs.set(hk, loc);
162
+ }
163
+ }
164
+ const clusters = new Map();
165
+ for (const k of known.keys()) {
166
+ const r = find(k);
167
+ const arr = clusters.get(r) ?? [];
168
+ arr.push(k);
169
+ clusters.set(r, arr);
170
+ }
171
+ const out = new Map();
172
+ for (const members of clusters.values()) {
173
+ members.sort();
174
+ // 族键:x-default / en 成员优先
175
+ let anchor = null;
176
+ for (const m of members) {
177
+ const p = known.get(m);
178
+ if (!p)
179
+ continue;
180
+ const selfTags = Object.entries(p.alternates)
181
+ .filter(([, href]) => key(href) === m)
182
+ .map(([tag]) => tag.toLowerCase());
183
+ if (selfTags.includes("x-default")) {
184
+ anchor = m;
185
+ break;
186
+ }
187
+ if (!anchor && (selfTags.includes("en") || selfTags.some((t) => t.startsWith("en-"))))
188
+ anchor = m;
189
+ }
190
+ if (!anchor)
191
+ anchor = members.find((m) => !localeOfUrl(known.get(m)?.url ?? m)) ?? members[0] ?? "";
192
+ const family = familyKeyOf(known.get(anchor)?.url ?? anchor);
193
+ for (const m of members) {
194
+ const p = known.get(m);
195
+ const selfTag = p
196
+ ? Object.entries(p.alternates).find(([tag, href]) => key(href) === m && tag.toLowerCase() !== "x-default")?.[0]
197
+ : undefined;
198
+ const locale = normalizeLocaleTag(selfTag) ??
199
+ pointedAs.get(m) ??
200
+ normalizeLocaleTag(p?.lang) ??
201
+ localeOfUrl(p?.url ?? m) ??
202
+ defaultLocale;
203
+ out.set(m, { family, locale, size: members.length });
204
+ }
205
+ }
206
+ return out;
207
+ }
208
+ const ENTERABLE = new Set(["tool_window", "listicle_window", "open"]);
209
+ const WINDOW_DAYS = 28;
210
+ const RETIRE_MIN_WINDOWS = 2;
211
+ const DAY_MS = 86_400_000;
212
+ /** 格子面。纯函数:页 + 词 + 本窗口末端日期 → 六张清单。 */
213
+ export function deriveCells(pages, keywords, opts) {
214
+ const byUrl = new Map();
215
+ for (const p of pages)
216
+ byUrl.set(normalizePageUrl(p.url), p);
217
+ const fams = new Map();
218
+ const fam = (f) => {
219
+ let x = fams.get(f);
220
+ if (!x) {
221
+ x = { pages: new Map(), keywords: [], earning: false };
222
+ fams.set(f, x);
223
+ }
224
+ return x;
225
+ };
226
+ const sameLocaleInCluster = [];
227
+ for (const p of pages) {
228
+ if (!p.family || !p.locale)
229
+ continue;
230
+ const f = fam(p.family);
231
+ const prev = f.pages.get(p.locale);
232
+ if (prev && normalizePageUrl(prev.url) !== normalizePageUrl(p.url)) {
233
+ sameLocaleInCluster.push([prev.url, p.url].sort());
234
+ continue;
235
+ }
236
+ f.pages.set(p.locale, p);
237
+ if (p.impressions > 0)
238
+ f.earning = true;
239
+ }
240
+ for (const k of keywords)
241
+ if (k.family)
242
+ fam(k.family).keywords.push(k);
243
+ // 服务的语区:覆盖 > 清单派生(缺省语区在前,其余按页数降序、同数按字母,稳定)
244
+ let locales;
245
+ if (opts.locales?.length)
246
+ locales = [...new Set(opts.locales)];
247
+ else {
248
+ const count = new Map();
249
+ for (const p of pages)
250
+ if (p.locale)
251
+ count.set(p.locale, (count.get(p.locale) ?? 0) + 1);
252
+ const def = opts.defaultLocale ?? "en-US";
253
+ locales = [...count.entries()]
254
+ .sort((a, b) => Number(b[0] === def) - Number(a[0] === def) || b[1] - a[1] || (a[0] < b[0] ? -1 : 1))
255
+ .map(([l]) => l);
256
+ }
257
+ const verifiedOf = (f) => f.earning || f.keywords.some((k) => k.serpVerdict !== null && ENTERABLE.has(k.serpVerdict));
258
+ // 目录规则:族的锚页(缺省语区那页,或路径不带语言目录的页)的首段是它的「目录」;目录自己的索引页若已翻译成 ≥2 个语区
259
+ // (tabledi:/tools/ 有 8 个语区),目录下每个族都按这些语区数空格 —— 一个只有英文页、还没登记过词的工具族,
260
+ // 空格照样数得出来(7 个从未本地化的工具正是这样漏掉的);没有翻译索引页的目录(/blog/)不数。
261
+ const def = opts.defaultLocale ?? "en-US";
262
+ const anchorPathOf = (f) => {
263
+ const p = f.pages.get(def) ?? [...f.pages.values()].find((x) => localeOfUrl(x.url) === null);
264
+ if (!p)
265
+ return null;
266
+ try {
267
+ return new URL(p.url).pathname;
268
+ }
269
+ catch {
270
+ return null;
271
+ }
272
+ };
273
+ // 目录 = 锚页的父路径(/tools/split-csv/ → /tools/;/tools/blog/x/ → /tools/blog/,tabledi 把博客和词汇表挂在 /tools/ 下,
274
+ // 只看首段会把它们当工具族数);根目录不算目录(/terms/ 的父目录是站本身,不因首页有 13 个语区就数它)。
275
+ const dirOf = (path) => {
276
+ const segs = path.split("/").filter(Boolean);
277
+ return segs.length ? `/${segs.slice(0, -1).join("/")}${segs.length > 1 ? "/" : ""}` : "/";
278
+ };
279
+ const sectionLocales = new Map();
280
+ for (const f of fams.values()) {
281
+ const a = anchorPathOf(f);
282
+ if (a && a !== "/" && /\/$/.test(a) && f.pages.size >= 2)
283
+ sectionLocales.set(a.toLowerCase(), new Set(f.pages.keys()));
284
+ }
285
+ const sectionOf = (f) => {
286
+ const a = anchorPathOf(f);
287
+ if (!a)
288
+ return null;
289
+ const dir = dirOf(a);
290
+ return dir === "/" ? null : (sectionLocales.get(dir.toLowerCase()) ?? null);
291
+ };
292
+ const families = [];
293
+ const missing = [];
294
+ const queue = [];
295
+ let familyUnverified = 0;
296
+ for (const [name, f] of [...fams.entries()].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))) {
297
+ const verified = verifiedOf(f);
298
+ if (!verified)
299
+ familyUnverified++;
300
+ // 只对「已倍增的族」(≥2 语区有页)或「有词的族」数空格:单语区的营销页不是格子
301
+ const section = sectionOf(f);
302
+ const multiplied = f.pages.size >= 2 || f.keywords.length > 0 || (section?.size ?? 0) >= 2;
303
+ let countable = opts.locales?.length ? locales : section ? locales.filter((l) => section.has(l)) : locales;
304
+ if (!opts.locales?.length && opts.priceable)
305
+ countable = countable.filter((l) => opts.priceable.has(l));
306
+ const miss = multiplied
307
+ ? countable.filter((l) => !f.pages.has(l) && !f.keywords.some((k) => k.locale === l))
308
+ : [];
309
+ for (const l of miss)
310
+ missing.push({ family: name, locale: l });
311
+ const pagesRec = {};
312
+ for (const [l, p] of [...f.pages.entries()].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)))
313
+ pagesRec[l] = p.url;
314
+ families.push({ family: name, verified, pages: pagesRec, missing: miss, keywords: f.keywords.length });
315
+ for (const k of f.keywords) {
316
+ const built = f.pages.has(k.locale) || (k.pageUrl !== null && byUrl.has(normalizePageUrl(k.pageUrl)));
317
+ if (!built)
318
+ queue.push({ family: name, locale: k.locale, keyword: k.keyword, sv: k.sv, band: k.band, verified });
319
+ }
320
+ }
321
+ const svOrder = (a, b) => (b ?? -1) - (a ?? -1);
322
+ queue.sort((a, b) => Number(b.verified) - Number(a.verified) || svOrder(a.sv, b.sv) || (a.keyword < b.keyword ? -1 : 1));
323
+ // 退役清单:建 ≥2 整窗 + 已收录 + 两窗零曝光 + 非 noindex
324
+ const endMs = Date.parse(`${opts.windowTo}T00:00:00Z`);
325
+ const retire = [];
326
+ let built = 0;
327
+ let indexed = 0;
328
+ let earning = 0;
329
+ for (const p of pages) {
330
+ if (!p.family)
331
+ continue;
332
+ built++;
333
+ const isIndexed = /indexed/i.test(p.indexState ?? "") && !/not indexed/i.test(p.indexState ?? "");
334
+ if (isIndexed)
335
+ indexed++;
336
+ if (p.impressions > 0)
337
+ earning++;
338
+ const ageDays = Number.isFinite(endMs) ? Math.floor((endMs - Date.parse(p.firstSeen)) / DAY_MS) : 0;
339
+ const windows = Math.floor(ageDays / WINDOW_DAYS);
340
+ if (!p.noindex && isIndexed && windows >= RETIRE_MIN_WINDOWS && p.impressions === 0 && (p.prevImpressions ?? 0) === 0)
341
+ retire.push({
342
+ url: p.url,
343
+ family: p.family,
344
+ locale: p.locale,
345
+ firstSeen: p.firstSeen,
346
+ zeroWindows: Math.min(windows, RETIRE_MIN_WINDOWS),
347
+ index: p.indexState,
348
+ });
349
+ }
350
+ // 缺陷:语言目录下没有 hreflang 的页;单向互链
351
+ const noAlternates = [];
352
+ const oneWay = [];
353
+ for (const p of pages) {
354
+ const inLocaleDir = localeOfUrl(p.url) !== null;
355
+ const alts = Object.entries(p.alternates);
356
+ if (inLocaleDir && !alts.length)
357
+ noAlternates.push(p.url);
358
+ for (const [, href] of alts) {
359
+ const other = byUrl.get(normalizePageUrl(href));
360
+ if (!other || normalizePageUrl(other.url) === normalizePageUrl(p.url))
361
+ continue;
362
+ if (!Object.keys(other.alternates).length)
363
+ continue; // 对方页首没抓过,判不了单向
364
+ const back = Object.values(other.alternates).some((h) => normalizePageUrl(h) === normalizePageUrl(p.url));
365
+ if (!back)
366
+ oneWay.push([p.url, other.url]);
367
+ }
368
+ }
369
+ return {
370
+ locales,
371
+ families,
372
+ byStatus: {
373
+ family_unverified: familyUnverified,
374
+ missing: missing.length,
375
+ queued: queue.length,
376
+ built,
377
+ indexed,
378
+ earning,
379
+ retire: retire.length,
380
+ },
381
+ queue,
382
+ missing,
383
+ retire,
384
+ cannibal: opts.cannibal ?? [],
385
+ defects: { noAlternates, oneWay, sameLocaleInCluster },
386
+ };
387
+ }
388
+ //# sourceMappingURL=seo-cells.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-cells.js","sourceRoot":"","sources":["../../src/core/seo-cells.ts"],"names":[],"mappings":"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"}