ukagaka-doc-mcp 0.1.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.
- package/LICENSE +21 -0
- package/NOTICE.md +24 -0
- package/README.md +109 -0
- package/SPEC.md +356 -0
- package/data/index.json +22046 -0
- package/dist/bootstrap.d.ts +17 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +57 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/build-index.d.ts +12 -0
- package/dist/build-index.d.ts.map +1 -0
- package/dist/build-index.js +51 -0
- package/dist/build-index.js.map +1 -0
- package/dist/constants.d.ts +77 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +86 -0
- package/dist/constants.js.map +1 -0
- package/dist/index-builder.d.ts +5 -0
- package/dist/index-builder.d.ts.map +1 -0
- package/dist/index-builder.js +53 -0
- package/dist/index-builder.js.map +1 -0
- package/dist/index-validation.d.ts +9 -0
- package/dist/index-validation.d.ts.map +1 -0
- package/dist/index-validation.js +75 -0
- package/dist/index-validation.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +27 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/satori-scraper.d.ts +35 -0
- package/dist/parser/satori-scraper.d.ts.map +1 -0
- package/dist/parser/satori-scraper.js +272 -0
- package/dist/parser/satori-scraper.js.map +1 -0
- package/dist/parser/ukadoc-parser.d.ts +21 -0
- package/dist/parser/ukadoc-parser.d.ts.map +1 -0
- package/dist/parser/ukadoc-parser.js +231 -0
- package/dist/parser/ukadoc-parser.js.map +1 -0
- package/dist/parser/yaya-scraper.d.ts +46 -0
- package/dist/parser/yaya-scraper.d.ts.map +1 -0
- package/dist/parser/yaya-scraper.js +308 -0
- package/dist/parser/yaya-scraper.js.map +1 -0
- package/dist/search/engine.d.ts +41 -0
- package/dist/search/engine.d.ts.map +1 -0
- package/dist/search/engine.js +114 -0
- package/dist/search/engine.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +36 -0
- package/dist/server.js.map +1 -0
- package/dist/text.d.ts +2 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +8 -0
- package/dist/text.js.map +1 -0
- package/dist/tools/get-doc.d.ts +4 -0
- package/dist/tools/get-doc.d.ts.map +1 -0
- package/dist/tools/get-doc.js +29 -0
- package/dist/tools/get-doc.js.map +1 -0
- package/dist/tools/list-categories.d.ts +3 -0
- package/dist/tools/list-categories.d.ts.map +1 -0
- package/dist/tools/list-categories.js +21 -0
- package/dist/tools/list-categories.js.map +1 -0
- package/dist/tools/search-docs.d.ts +4 -0
- package/dist/tools/search-docs.d.ts.map +1 -0
- package/dist/tools/search-docs.js +45 -0
- package/dist/tools/search-docs.js.map +1 -0
- package/dist/types.d.ts +59 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 里々Wiki スクレイパー
|
|
3
|
+
*
|
|
4
|
+
* https://soliton.sub.jp/satori/ (PukiWiki 1.5.4)
|
|
5
|
+
*
|
|
6
|
+
* 里々Wikiのコンテンツ構造:
|
|
7
|
+
* - 資料系: 特殊記号一覧, 演算子一覧, 変数, 情報取得変数, 特殊変数, 関数一覧, ファイル構成
|
|
8
|
+
* - 独自イベント
|
|
9
|
+
* - TIPS: TIPS総合, ゴースト作りのTIPSまとめ, 困ったときの対処法 + 個別TIPSページ
|
|
10
|
+
* - 里々について: 里々の内部処理, 栞としての里々
|
|
11
|
+
* - SAORI: SAORI, SAORI/里々
|
|
12
|
+
*/
|
|
13
|
+
import { SCRAPE_RATE_LIMIT_MS } from '../constants.js';
|
|
14
|
+
import * as cheerio from 'cheerio';
|
|
15
|
+
const BASE_URL = 'https://soliton.sub.jp/satori/';
|
|
16
|
+
const INVALID_PAGE_MARKERS = ['有効なWikiNameではありません'];
|
|
17
|
+
/** 静的スクレイプ対象ページ */
|
|
18
|
+
export const SATORI_STATIC_PAGES = [
|
|
19
|
+
// 資料
|
|
20
|
+
{ pageName: '特殊記号一覧', category: 'satori_reference' },
|
|
21
|
+
{ pageName: '演算子一覧', category: 'satori_reference' },
|
|
22
|
+
{ pageName: '変数', category: 'satori_reference' },
|
|
23
|
+
{ pageName: '情報取得変数', category: 'satori_reference' },
|
|
24
|
+
{ pageName: '特殊変数', category: 'satori_reference' },
|
|
25
|
+
{ pageName: '関数', category: 'satori_reference' },
|
|
26
|
+
{ pageName: '関数一覧', category: 'satori_reference' },
|
|
27
|
+
{ pageName: 'ファイル構成', category: 'satori_reference' },
|
|
28
|
+
// 独自イベント
|
|
29
|
+
{ pageName: '独自イベント', category: 'satori_event' },
|
|
30
|
+
// TIPS
|
|
31
|
+
{ pageName: 'TIPS総合', category: 'satori_tips' },
|
|
32
|
+
{ pageName: 'ゴースト作りのTIPSまとめ', category: 'satori_tips' },
|
|
33
|
+
{ pageName: '困ったときの対処法', category: 'satori_tips' },
|
|
34
|
+
// 里々について
|
|
35
|
+
{ pageName: '里々の内部処理', category: 'satori_reference' },
|
|
36
|
+
{ pageName: '栞としての里々', category: 'satori_reference' },
|
|
37
|
+
// SAORI
|
|
38
|
+
{ pageName: 'SAORI', category: 'satori_saori' },
|
|
39
|
+
{ pageName: 'SAORI/里々', category: 'satori_saori' },
|
|
40
|
+
];
|
|
41
|
+
// ============================================================
|
|
42
|
+
// HTTP取得
|
|
43
|
+
// ============================================================
|
|
44
|
+
async function fetchPageHtml(pageName) {
|
|
45
|
+
const url = `${BASE_URL}?${encodeURIComponent(pageName)}`;
|
|
46
|
+
try {
|
|
47
|
+
const res = await fetch(url, {
|
|
48
|
+
headers: {
|
|
49
|
+
'User-Agent': 'ukagaka-doc-mcp/0.1 (index builder)',
|
|
50
|
+
'Accept': 'text/html',
|
|
51
|
+
},
|
|
52
|
+
signal: AbortSignal.timeout(15000),
|
|
53
|
+
});
|
|
54
|
+
if (!res.ok) {
|
|
55
|
+
console.error(`[satori-scraper] HTTP ${res.status} for ${url}`);
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return await res.text();
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error(`[satori-scraper] Failed to fetch ${url}:`, err);
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function sleep(ms) {
|
|
66
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
67
|
+
}
|
|
68
|
+
// ============================================================
|
|
69
|
+
// HTMLパース
|
|
70
|
+
// ============================================================
|
|
71
|
+
/**
|
|
72
|
+
* 里々WikiページのHTMLをパースして DocEntry[] を返す。
|
|
73
|
+
*/
|
|
74
|
+
export function parseSatoriPage(html, pageName, category) {
|
|
75
|
+
const $ = cheerio.load(html);
|
|
76
|
+
const pageUrl = `${BASE_URL}?${encodeURIComponent(pageName)}`;
|
|
77
|
+
const usedAnchors = new Map();
|
|
78
|
+
// メタ要素・ナビゲーション除去
|
|
79
|
+
$('script, style').remove();
|
|
80
|
+
// PukiWiki のナビゲーション部分除去
|
|
81
|
+
// (#navi, .navi, #menubar, .menubar, #toolbar, .toolbar)
|
|
82
|
+
$('#navi, .navi, #menubar, .menubar, #toolbar, .toolbar').remove();
|
|
83
|
+
// フッター除去 (#lastmodified, #footer, .footer)
|
|
84
|
+
$('#lastmodified, #footer, .footer').remove();
|
|
85
|
+
// 編集リンク除去
|
|
86
|
+
$('a[href*="cmd=edit"], a[href*="cmd=freeze"]').remove();
|
|
87
|
+
const pageTitle = $('h1').first().text().trim() ||
|
|
88
|
+
$('#page-title').text().trim() ||
|
|
89
|
+
pageName;
|
|
90
|
+
// PukiWiki のコンテンツ領域
|
|
91
|
+
const $content = $('#content, #body, .body, .wiki').first();
|
|
92
|
+
const $root = $content.length ? $content : $('body');
|
|
93
|
+
if (isInvalidWikiPage(pageTitle, $root.text().replace(/\s+/g, ' ').trim())) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
const entries = [];
|
|
97
|
+
const headers = $root.find('h2, h3');
|
|
98
|
+
if (headers.length === 0) {
|
|
99
|
+
// セクションなし: ページ全体を1エントリ
|
|
100
|
+
const content = $root.text().replace(/\s+/g, ' ').trim();
|
|
101
|
+
if (content.length > 20) {
|
|
102
|
+
entries.push({
|
|
103
|
+
id: `satori:${pageName}`,
|
|
104
|
+
title: pageTitle,
|
|
105
|
+
source: 'satori_wiki',
|
|
106
|
+
category,
|
|
107
|
+
content,
|
|
108
|
+
url: pageUrl,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return entries;
|
|
112
|
+
}
|
|
113
|
+
// セクション単位で分割
|
|
114
|
+
headers.each((_, header) => {
|
|
115
|
+
const $header = $(header);
|
|
116
|
+
// PukiWiki の見出し末尾 † を除去
|
|
117
|
+
const sectionTitle = $header.text().replace(/†/g, '').trim();
|
|
118
|
+
if (!sectionTitle || sectionTitle.length < 2)
|
|
119
|
+
return;
|
|
120
|
+
const anchor = $header.find('a[id], a[name]').attr('id') ||
|
|
121
|
+
$header.find('a[id], a[name]').attr('name') ||
|
|
122
|
+
slugify(sectionTitle);
|
|
123
|
+
const uniqueAnchor = makeUniqueAnchor(anchor, usedAnchors);
|
|
124
|
+
const parts = [sectionTitle];
|
|
125
|
+
let $sibling = $header.next();
|
|
126
|
+
while ($sibling.length && !$sibling.is('h2, h3')) {
|
|
127
|
+
const text = $sibling.text().trim();
|
|
128
|
+
if (text)
|
|
129
|
+
parts.push(text);
|
|
130
|
+
$sibling = $sibling.next();
|
|
131
|
+
}
|
|
132
|
+
const content = parts.join('\n');
|
|
133
|
+
if (content.trim().length < 5)
|
|
134
|
+
return;
|
|
135
|
+
entries.push({
|
|
136
|
+
id: `satori:${pageName}#${uniqueAnchor}`,
|
|
137
|
+
title: `${pageTitle} - ${sectionTitle}`,
|
|
138
|
+
source: 'satori_wiki',
|
|
139
|
+
category,
|
|
140
|
+
content,
|
|
141
|
+
url: `${pageUrl}#${uniqueAnchor}`,
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
// セクションが取れなかった場合はページ全体
|
|
145
|
+
if (entries.length === 0) {
|
|
146
|
+
const content = $root.text().replace(/\s+/g, ' ').trim();
|
|
147
|
+
if (content.length > 20) {
|
|
148
|
+
entries.push({
|
|
149
|
+
id: `satori:${pageName}`,
|
|
150
|
+
title: pageTitle,
|
|
151
|
+
source: 'satori_wiki',
|
|
152
|
+
category,
|
|
153
|
+
content,
|
|
154
|
+
url: pageUrl,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return entries;
|
|
159
|
+
}
|
|
160
|
+
// ============================================================
|
|
161
|
+
// 動的ページ一覧取得(個別Tipsページ)
|
|
162
|
+
// ============================================================
|
|
163
|
+
/**
|
|
164
|
+
* TIPS総合ページからリンクされている個別Tipsページを収集する。
|
|
165
|
+
*/
|
|
166
|
+
export async function fetchSatoriTipsPageList() {
|
|
167
|
+
const tipsPages = [];
|
|
168
|
+
const html = await fetchPageHtml('TIPS総合');
|
|
169
|
+
if (!html)
|
|
170
|
+
return tipsPages;
|
|
171
|
+
const $ = cheerio.load(html);
|
|
172
|
+
$('a[href]').each((_, a) => {
|
|
173
|
+
const href = normalizeSatoriWikiHref($(a).attr('href'));
|
|
174
|
+
try {
|
|
175
|
+
if (!href?.startsWith('?') || isMetaWikiHref(href)) {
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
const pageName = decodeURIComponent(href.slice(1));
|
|
179
|
+
// TIPS一覧・注意書き等のメタページを除外
|
|
180
|
+
if (pageName &&
|
|
181
|
+
pageName !== 'TIPS総合' &&
|
|
182
|
+
pageName !== 'RecentChanges' &&
|
|
183
|
+
!pageName.startsWith('cmd=') &&
|
|
184
|
+
!pageName.startsWith('plugin=') &&
|
|
185
|
+
pageName.length > 1) {
|
|
186
|
+
tipsPages.push(pageName);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// ignore
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
await sleep(SCRAPE_RATE_LIMIT_MS);
|
|
194
|
+
return [...new Set(tipsPages)];
|
|
195
|
+
}
|
|
196
|
+
// ============================================================
|
|
197
|
+
// メインスクレイプ関数
|
|
198
|
+
// ============================================================
|
|
199
|
+
/**
|
|
200
|
+
* 里々Wiki全体をスクレイプして DocEntry[] を返す。
|
|
201
|
+
*/
|
|
202
|
+
export async function scrapeSatoriWiki() {
|
|
203
|
+
const allEntries = [];
|
|
204
|
+
// 1. 静的ページ
|
|
205
|
+
console.error('[satori-scraper] Scraping static pages...');
|
|
206
|
+
for (const pageDef of SATORI_STATIC_PAGES) {
|
|
207
|
+
const html = await fetchPageHtml(pageDef.pageName);
|
|
208
|
+
if (html) {
|
|
209
|
+
const entries = parseSatoriPage(html, pageDef.pageName, pageDef.category);
|
|
210
|
+
allEntries.push(...entries);
|
|
211
|
+
console.error(`[satori-scraper] ${pageDef.pageName}: ${entries.length} entries`);
|
|
212
|
+
}
|
|
213
|
+
await sleep(SCRAPE_RATE_LIMIT_MS);
|
|
214
|
+
}
|
|
215
|
+
// 2. 個別Tipsページ(動的に一覧を取得)
|
|
216
|
+
console.error('[satori-scraper] Fetching Tips page list...');
|
|
217
|
+
const tipsPages = await fetchSatoriTipsPageList();
|
|
218
|
+
console.error(`[satori-scraper] Found ${tipsPages.length} Tips pages`);
|
|
219
|
+
for (const pageName of tipsPages) {
|
|
220
|
+
// すでにスクレイプ済みのページはスキップ
|
|
221
|
+
if (SATORI_STATIC_PAGES.some(p => p.pageName === pageName))
|
|
222
|
+
continue;
|
|
223
|
+
const html = await fetchPageHtml(pageName);
|
|
224
|
+
if (html) {
|
|
225
|
+
const entries = parseSatoriPage(html, pageName, 'satori_tips');
|
|
226
|
+
allEntries.push(...entries);
|
|
227
|
+
}
|
|
228
|
+
await sleep(SCRAPE_RATE_LIMIT_MS);
|
|
229
|
+
}
|
|
230
|
+
console.error(`[satori-scraper] Total: ${allEntries.length} entries`);
|
|
231
|
+
return allEntries;
|
|
232
|
+
}
|
|
233
|
+
// ============================================================
|
|
234
|
+
// ユーティリティ
|
|
235
|
+
// ============================================================
|
|
236
|
+
function slugify(text) {
|
|
237
|
+
return text
|
|
238
|
+
.replace(/[^\w\u3040-\u9FFF]/g, '_')
|
|
239
|
+
.replace(/_+/g, '_')
|
|
240
|
+
.slice(0, 64);
|
|
241
|
+
}
|
|
242
|
+
function makeUniqueAnchor(anchor, usedAnchors) {
|
|
243
|
+
const seenCount = (usedAnchors.get(anchor) ?? 0) + 1;
|
|
244
|
+
usedAnchors.set(anchor, seenCount);
|
|
245
|
+
if (seenCount === 1) {
|
|
246
|
+
return anchor;
|
|
247
|
+
}
|
|
248
|
+
return `${anchor}:${seenCount}`;
|
|
249
|
+
}
|
|
250
|
+
export function normalizeSatoriWikiHref(href) {
|
|
251
|
+
if (!href) {
|
|
252
|
+
return null;
|
|
253
|
+
}
|
|
254
|
+
if (href.startsWith('#')) {
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
let normalized = href;
|
|
258
|
+
if (normalized.startsWith('./?')) {
|
|
259
|
+
normalized = normalized.slice(2);
|
|
260
|
+
}
|
|
261
|
+
if (!normalized.startsWith('?')) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
return normalized.split('#', 1)[0] || null;
|
|
265
|
+
}
|
|
266
|
+
function isMetaWikiHref(href) {
|
|
267
|
+
return href.startsWith('?cmd=') || href.startsWith('?plugin=');
|
|
268
|
+
}
|
|
269
|
+
function isInvalidWikiPage(pageTitle, bodyText) {
|
|
270
|
+
return INVALID_PAGE_MARKERS.some(marker => pageTitle.includes(marker) || bodyText.includes(marker));
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=satori-scraper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"satori-scraper.js","sourceRoot":"","sources":["../../src/parser/satori-scraper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UKADOCパーサー
|
|
3
|
+
*
|
|
4
|
+
* UKADOC の HTMLファイルを解析して DocEntry 配列を返す。
|
|
5
|
+
*
|
|
6
|
+
* HTML構造の観察:
|
|
7
|
+
* - list_sakura_script.html: section.category > dl > dt.entry が各タグ
|
|
8
|
+
* - list_shiori_event.html: section.category > dl > dt.entry が各イベント
|
|
9
|
+
* - descript_*.html: section > dl > dt.entry or セクション形式
|
|
10
|
+
* - spec_*.html: セクション形式(h2/h3 + 説明文)
|
|
11
|
+
*/
|
|
12
|
+
import type { DocEntry, Category } from '../types.js';
|
|
13
|
+
/**
|
|
14
|
+
* UKADOC の manual/ ディレクトリ全体をパースして DocEntry[] を返す。
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseUkadocManual(manualDir: string): DocEntry[];
|
|
17
|
+
/**
|
|
18
|
+
* 単一のUKADOC HTMLファイルをパースして DocEntry[] を返す。
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseUkadocFile(html: string, filename: string, category: Category): DocEntry[];
|
|
21
|
+
//# sourceMappingURL=ukadoc-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ukadoc-parser.d.ts","sourceRoot":"","sources":["../../src/parser/ukadoc-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAoDtD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,EAAE,CAyB/D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,GACjB,QAAQ,EAAE,CAsHZ"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UKADOCパーサー
|
|
3
|
+
*
|
|
4
|
+
* UKADOC の HTMLファイルを解析して DocEntry 配列を返す。
|
|
5
|
+
*
|
|
6
|
+
* HTML構造の観察:
|
|
7
|
+
* - list_sakura_script.html: section.category > dl > dt.entry が各タグ
|
|
8
|
+
* - list_shiori_event.html: section.category > dl > dt.entry が各イベント
|
|
9
|
+
* - descript_*.html: section > dl > dt.entry or セクション形式
|
|
10
|
+
* - spec_*.html: セクション形式(h2/h3 + 説明文)
|
|
11
|
+
*/
|
|
12
|
+
import { readFileSync, readdirSync, existsSync } from 'node:fs';
|
|
13
|
+
import { join, basename } from 'node:path';
|
|
14
|
+
import * as cheerio from 'cheerio';
|
|
15
|
+
// ============================================================
|
|
16
|
+
// ファイル → カテゴリ のマッピング
|
|
17
|
+
// ============================================================
|
|
18
|
+
/** filename (拡張子なし) → Category */
|
|
19
|
+
const FILE_CATEGORY_MAP = {
|
|
20
|
+
list_sakura_script: 'sakurascript',
|
|
21
|
+
list_shiori_event: 'shiori_event',
|
|
22
|
+
list_shiori_event_ex: 'shiori_event',
|
|
23
|
+
list_shiori_resource: 'shiori_event',
|
|
24
|
+
list_plugin_event: 'shiori_event',
|
|
25
|
+
list_propertysystem: 'protocol',
|
|
26
|
+
descript_ghost: 'descript',
|
|
27
|
+
descript_shell: 'descript',
|
|
28
|
+
descript_shell_surfaces: 'descript',
|
|
29
|
+
descript_shell_surfacetable: 'descript',
|
|
30
|
+
descript_balloon: 'descript',
|
|
31
|
+
descript_install: 'descript',
|
|
32
|
+
descript_headline: 'descript',
|
|
33
|
+
descript_plugin: 'descript',
|
|
34
|
+
spec_shiori3: 'protocol',
|
|
35
|
+
spec_sstp: 'protocol',
|
|
36
|
+
spec_dll: 'protocol',
|
|
37
|
+
spec_plugin: 'protocol',
|
|
38
|
+
spec_fmo_mutex: 'protocol',
|
|
39
|
+
spec_headline: 'protocol',
|
|
40
|
+
spec_update_file: 'protocol',
|
|
41
|
+
spec_web: 'protocol',
|
|
42
|
+
manual_directory: 'file_structure',
|
|
43
|
+
manual_ghost: 'file_structure',
|
|
44
|
+
manual_shell: 'file_structure',
|
|
45
|
+
manual_balloon: 'file_structure',
|
|
46
|
+
manual_install: 'file_structure',
|
|
47
|
+
manual_update: 'file_structure',
|
|
48
|
+
manual_translator: 'file_structure',
|
|
49
|
+
manual_owner_draw_menu: 'file_structure',
|
|
50
|
+
dev_bind: 'dev_guide',
|
|
51
|
+
dev_nar: 'dev_guide',
|
|
52
|
+
dev_ownerdraw: 'dev_guide',
|
|
53
|
+
dev_shell: 'dev_guide',
|
|
54
|
+
dev_shell_error: 'dev_guide',
|
|
55
|
+
dev_update: 'dev_guide',
|
|
56
|
+
memo: 'dev_guide',
|
|
57
|
+
memo_shiorievent: 'shiori_event',
|
|
58
|
+
};
|
|
59
|
+
// ============================================================
|
|
60
|
+
// パース関数
|
|
61
|
+
// ============================================================
|
|
62
|
+
/**
|
|
63
|
+
* UKADOC の manual/ ディレクトリ全体をパースして DocEntry[] を返す。
|
|
64
|
+
*/
|
|
65
|
+
export function parseUkadocManual(manualDir) {
|
|
66
|
+
if (!existsSync(manualDir)) {
|
|
67
|
+
throw new Error(`UKADOC manual directory not found: ${manualDir}\nRun: git submodule update --init --recursive`);
|
|
68
|
+
}
|
|
69
|
+
const htmlFiles = readdirSync(manualDir)
|
|
70
|
+
.filter(f => f.endsWith('.html') && !f.startsWith('index') && f !== 'base.css');
|
|
71
|
+
const entries = [];
|
|
72
|
+
for (const filename of htmlFiles) {
|
|
73
|
+
const stem = basename(filename, '.html');
|
|
74
|
+
const category = FILE_CATEGORY_MAP[stem];
|
|
75
|
+
if (!category) {
|
|
76
|
+
// マッピングにないファイルはスキップ
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const filePath = join(manualDir, filename);
|
|
80
|
+
const html = readFileSync(filePath, 'utf-8');
|
|
81
|
+
const fileEntries = parseUkadocFile(html, filename, category);
|
|
82
|
+
entries.push(...fileEntries);
|
|
83
|
+
}
|
|
84
|
+
return entries;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 単一のUKADOC HTMLファイルをパースして DocEntry[] を返す。
|
|
88
|
+
*/
|
|
89
|
+
export function parseUkadocFile(html, filename, category) {
|
|
90
|
+
const $ = cheerio.load(html);
|
|
91
|
+
const stem = basename(filename, '.html');
|
|
92
|
+
const baseUrl = `https://ssp.shillest.net/ukadoc/manual/${filename}`;
|
|
93
|
+
const usedAnchors = new Map();
|
|
94
|
+
const fallbackAnchorCounts = new Map();
|
|
95
|
+
// まずナビゲーションを除去
|
|
96
|
+
$('nav').remove();
|
|
97
|
+
$('.navigation-bar').remove();
|
|
98
|
+
$('header').remove();
|
|
99
|
+
const pageTitle = $('h1#page-title').text().trim() || $('title').text().trim() || stem;
|
|
100
|
+
const entries = [];
|
|
101
|
+
// --------------------------------------------------------
|
|
102
|
+
// パターン1: dt.entry を持つ定義リスト形式
|
|
103
|
+
// (list_sakura_script, list_shiori_event, descript_* 等)
|
|
104
|
+
// --------------------------------------------------------
|
|
105
|
+
const dtEntries = $('dt.entry');
|
|
106
|
+
if (dtEntries.length > 0) {
|
|
107
|
+
dtEntries.each((_, dt) => {
|
|
108
|
+
const $dt = $(dt);
|
|
109
|
+
const entryName = $dt.text().trim();
|
|
110
|
+
if (!entryName)
|
|
111
|
+
return;
|
|
112
|
+
// id 属性または前のアンカーから anchor を取得
|
|
113
|
+
const anchor = createUkadocAnchor($dt.attr('id') || $dt.prev('a').attr('name'), entryName, fallbackAnchorCounts, usedAnchors);
|
|
114
|
+
// dd (説明) を取得
|
|
115
|
+
const $dd = $dt.next('dd');
|
|
116
|
+
const description = $dd.text().trim();
|
|
117
|
+
// セクション見出しを取得(親の section 内の最初の caption/h2 等)
|
|
118
|
+
const sectionTitle = getSectionTitle($, $dt);
|
|
119
|
+
const content = [
|
|
120
|
+
sectionTitle ? `[${sectionTitle}]` : '',
|
|
121
|
+
entryName,
|
|
122
|
+
description,
|
|
123
|
+
].filter(Boolean).join('\n');
|
|
124
|
+
entries.push({
|
|
125
|
+
id: `ukadoc:${stem}:${anchor}`,
|
|
126
|
+
title: entryName,
|
|
127
|
+
source: 'ukadoc',
|
|
128
|
+
category,
|
|
129
|
+
content,
|
|
130
|
+
url: `${baseUrl}#${anchor}`,
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
return entries;
|
|
134
|
+
}
|
|
135
|
+
// --------------------------------------------------------
|
|
136
|
+
// パターン2: セクション形式 (spec_*, manual_*, dev_*)
|
|
137
|
+
// h2 または h3 でセクション分割
|
|
138
|
+
// --------------------------------------------------------
|
|
139
|
+
const sectionHeaders = $('h2, h3');
|
|
140
|
+
if (sectionHeaders.length > 0) {
|
|
141
|
+
sectionHeaders.each((_, header) => {
|
|
142
|
+
const $header = $(header);
|
|
143
|
+
const sectionTitle = $header.text().trim();
|
|
144
|
+
if (!sectionTitle)
|
|
145
|
+
return;
|
|
146
|
+
const anchor = createUkadocAnchor($header.attr('id'), sectionTitle, fallbackAnchorCounts, usedAnchors);
|
|
147
|
+
// セクションの本文: 次のh2/h3が来るまでのテキストを集める
|
|
148
|
+
const contentParts = [sectionTitle];
|
|
149
|
+
let $next = $header.next();
|
|
150
|
+
while ($next.length && !$next.is('h2, h3')) {
|
|
151
|
+
const text = $next.text().trim();
|
|
152
|
+
if (text)
|
|
153
|
+
contentParts.push(text);
|
|
154
|
+
$next = $next.next();
|
|
155
|
+
}
|
|
156
|
+
const content = contentParts.join('\n');
|
|
157
|
+
if (content.length <= sectionTitle.length + 5)
|
|
158
|
+
return; // 本文がほぼ空ならスキップ
|
|
159
|
+
entries.push({
|
|
160
|
+
id: `ukadoc:${stem}:${anchor}`,
|
|
161
|
+
title: `${pageTitle} - ${sectionTitle}`,
|
|
162
|
+
source: 'ukadoc',
|
|
163
|
+
category,
|
|
164
|
+
content,
|
|
165
|
+
url: `${baseUrl}#${anchor}`,
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
if (entries.length > 0)
|
|
169
|
+
return entries;
|
|
170
|
+
}
|
|
171
|
+
// --------------------------------------------------------
|
|
172
|
+
// パターン3: フォールバック - ページ全体を1エントリとして扱う
|
|
173
|
+
// --------------------------------------------------------
|
|
174
|
+
const bodyText = $('body').text().replace(/\s+/g, ' ').trim();
|
|
175
|
+
entries.push({
|
|
176
|
+
id: `ukadoc:${stem}`,
|
|
177
|
+
title: pageTitle,
|
|
178
|
+
source: 'ukadoc',
|
|
179
|
+
category,
|
|
180
|
+
content: bodyText,
|
|
181
|
+
url: baseUrl,
|
|
182
|
+
});
|
|
183
|
+
return entries;
|
|
184
|
+
}
|
|
185
|
+
// ============================================================
|
|
186
|
+
// ユーティリティ
|
|
187
|
+
// ============================================================
|
|
188
|
+
function getSectionTitle($, $el) {
|
|
189
|
+
// 親の section 内の caption または h2 を探す
|
|
190
|
+
const $section = $el.closest('section.category');
|
|
191
|
+
if ($section.length) {
|
|
192
|
+
const caption = $section.prev('section.caption').find('h2').first().text().trim();
|
|
193
|
+
if (caption)
|
|
194
|
+
return caption;
|
|
195
|
+
const h2 = $section.find('h2').first().text().trim();
|
|
196
|
+
if (h2)
|
|
197
|
+
return h2;
|
|
198
|
+
}
|
|
199
|
+
return '';
|
|
200
|
+
}
|
|
201
|
+
function createUkadocAnchor(explicitAnchor, rawTitle, fallbackAnchorCounts, usedAnchors) {
|
|
202
|
+
let anchor = explicitAnchor?.trim();
|
|
203
|
+
if (!anchor) {
|
|
204
|
+
const normalizedRawTitle = normalizeRawTitleForFallback(rawTitle);
|
|
205
|
+
const occurrenceIndex = (fallbackAnchorCounts.get(normalizedRawTitle) ?? 0) + 1;
|
|
206
|
+
fallbackAnchorCounts.set(normalizedRawTitle, occurrenceIndex);
|
|
207
|
+
anchor = `${normalizedRawTitle}:${occurrenceIndex}`;
|
|
208
|
+
}
|
|
209
|
+
const seenCount = (usedAnchors.get(anchor) ?? 0) + 1;
|
|
210
|
+
usedAnchors.set(anchor, seenCount);
|
|
211
|
+
if (seenCount === 1) {
|
|
212
|
+
return anchor;
|
|
213
|
+
}
|
|
214
|
+
return `${anchor}:${seenCount}`;
|
|
215
|
+
}
|
|
216
|
+
function normalizeRawTitleForFallback(text) {
|
|
217
|
+
return text
|
|
218
|
+
.trim()
|
|
219
|
+
.replace(/\s+/g, ' ')
|
|
220
|
+
.normalize('NFKC')
|
|
221
|
+
.split('')
|
|
222
|
+
.map(char => {
|
|
223
|
+
if (/^[A-Za-z0-9._-]$/.test(char)) {
|
|
224
|
+
return char;
|
|
225
|
+
}
|
|
226
|
+
return `_${char.codePointAt(0)?.toString(16) ?? '0'}`;
|
|
227
|
+
})
|
|
228
|
+
.join('')
|
|
229
|
+
.slice(0, 120);
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=ukadoc-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ukadoc-parser.js","sourceRoot":"","sources":["../../src/parser/ukadoc-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YAYA Wiki スクレイパー
|
|
3
|
+
*
|
|
4
|
+
* https://emily.shillest.net/ayaya/ (PukiWiki Plus!)
|
|
5
|
+
*
|
|
6
|
+
* 設計方針:
|
|
7
|
+
* - YAYA関数ページ(マニュアル/関数/*)は1ページ=1エントリ(情報断片化防止)
|
|
8
|
+
* - その他のページはセクション(h2/h3)単位で分割
|
|
9
|
+
* - レート制限: 500ms/リクエスト
|
|
10
|
+
*/
|
|
11
|
+
import type { DocEntry, Category } from '../types.js';
|
|
12
|
+
interface YayaPageDef {
|
|
13
|
+
path: string;
|
|
14
|
+
category: Category;
|
|
15
|
+
onePageOneEntry?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/** スクレイプ対象ページ一覧。ビルド時に動的取得するページのベース。 */
|
|
18
|
+
export declare const YAYA_STATIC_PAGES: YayaPageDef[];
|
|
19
|
+
/** 関数ページのプレフィックス */
|
|
20
|
+
export declare const YAYA_FUNCTION_PAGE_PREFIX = "\u30DE\u30CB\u30E5\u30A2\u30EB/\u95A2\u6570/";
|
|
21
|
+
/** Tipsページのプレフィックス */
|
|
22
|
+
export declare const YAYA_TIPS_PAGE_PREFIX = "Tips/";
|
|
23
|
+
/**
|
|
24
|
+
* PukiWiki のHTMLからコンテンツ本文を抽出し、DocEntry を生成する。
|
|
25
|
+
*
|
|
26
|
+
* @param html 取得したHTML
|
|
27
|
+
* @param pagePath Wikiページパス(canonical_id生成に使用)
|
|
28
|
+
* @param category カテゴリ
|
|
29
|
+
* @param onePageOneEntry true の場合はセクション分割せず1エントリにする
|
|
30
|
+
*/
|
|
31
|
+
export declare function parseYayaPage(html: string, pagePath: string, category: Category, onePageOneEntry?: boolean): DocEntry[];
|
|
32
|
+
/**
|
|
33
|
+
* YAYA Wiki の関数一覧ページから個別関数ページのリストを取得する。
|
|
34
|
+
*/
|
|
35
|
+
export declare function fetchYayaFunctionPageList(): Promise<string[]>;
|
|
36
|
+
/**
|
|
37
|
+
* YAYA Wiki の Tips 一覧ページから個別Tipsページのリストを取得する。
|
|
38
|
+
*/
|
|
39
|
+
export declare function fetchYayaTipsPageList(): Promise<string[]>;
|
|
40
|
+
/**
|
|
41
|
+
* YAYA Wiki全体をスクレイプして DocEntry[] を返す。
|
|
42
|
+
*/
|
|
43
|
+
export declare function scrapeYayaWiki(): Promise<DocEntry[]>;
|
|
44
|
+
export declare function normalizeYayaWikiHref(href: string | undefined): string | null;
|
|
45
|
+
export {};
|
|
46
|
+
//# sourceMappingURL=yaya-scraper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaya-scraper.d.ts","sourceRoot":"","sources":["../../src/parser/yaya-scraper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAUtD,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,uCAAuC;AACvC,eAAO,MAAM,iBAAiB,EAAE,WAAW,EAgC1C,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,yBAAyB,iDAAc,CAAC;AACrD,sBAAsB;AACtB,eAAO,MAAM,qBAAqB,UAAU,CAAC;AA4C7C;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,eAAe,UAAQ,GACtB,QAAQ,EAAE,CAgFZ;AAMD;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CA6BnE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAsB/D;AAMD;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CA8C1D;AAiBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAoB7E"}
|