building-standards-act-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/README.md +301 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cache.d.ts +11 -0
- package/dist/lib/cache.js +44 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/egov-client.d.ts +11 -0
- package/dist/lib/egov-client.js +67 -0
- package/dist/lib/egov-client.js.map +1 -0
- package/dist/lib/egov-parser.d.ts +35 -0
- package/dist/lib/egov-parser.js +498 -0
- package/dist/lib/egov-parser.js.map +1 -0
- package/dist/lib/errors.d.ts +18 -0
- package/dist/lib/errors.js +37 -0
- package/dist/lib/errors.js.map +1 -0
- package/dist/lib/kokuji-registry.d.ts +19 -0
- package/dist/lib/kokuji-registry.js +63 -0
- package/dist/lib/kokuji-registry.js.map +1 -0
- package/dist/lib/law-registry.d.ts +27 -0
- package/dist/lib/law-registry.js +623 -0
- package/dist/lib/law-registry.js.map +1 -0
- package/dist/lib/types.d.ts +70 -0
- package/dist/lib/types.js +3 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +42 -0
- package/dist/server.js.map +1 -0
- package/dist/tools/get-full-law.d.ts +2 -0
- package/dist/tools/get-full-law.js +40 -0
- package/dist/tools/get-full-law.js.map +1 -0
- package/dist/tools/get-kokuji.d.ts +2 -0
- package/dist/tools/get-kokuji.js +79 -0
- package/dist/tools/get-kokuji.js.map +1 -0
- package/dist/tools/get-law.d.ts +2 -0
- package/dist/tools/get-law.js +46 -0
- package/dist/tools/get-law.js.map +1 -0
- package/dist/tools/search-law.d.ts +2 -0
- package/dist/tools/search-law.js +54 -0
- package/dist/tools/search-law.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Constants
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
const TABLE_PLACEHOLDER = "[表]";
|
|
5
|
+
const FIGURE_PLACEHOLDER = "[図]";
|
|
6
|
+
/** Tags whose content should be skipped entirely. */
|
|
7
|
+
const SKIP_TAGS = new Set(["TOC", "Rt"]);
|
|
8
|
+
/** Tags that represent structural containers and produce a blank line before their content. */
|
|
9
|
+
const STRUCTURAL_TAGS = new Set([
|
|
10
|
+
"Part",
|
|
11
|
+
"Chapter",
|
|
12
|
+
"Section",
|
|
13
|
+
"Subsection",
|
|
14
|
+
"Division",
|
|
15
|
+
]);
|
|
16
|
+
/** Tags that hold the title of a structural container. */
|
|
17
|
+
const STRUCTURAL_TITLE_TAGS = new Set([
|
|
18
|
+
"PartTitle",
|
|
19
|
+
"ChapterTitle",
|
|
20
|
+
"SectionTitle",
|
|
21
|
+
"SubsectionTitle",
|
|
22
|
+
"DivisionTitle",
|
|
23
|
+
]);
|
|
24
|
+
/** Indentation width per subitem depth level (in full-width spaces). */
|
|
25
|
+
const INDENT_UNIT = " ";
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Article number normalization
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
/**
|
|
30
|
+
* Normalize a user-supplied article number string into the canonical form
|
|
31
|
+
* used in the `Num` attribute of Article nodes (e.g. "20", "6_2").
|
|
32
|
+
*
|
|
33
|
+
* Accepted inputs:
|
|
34
|
+
* "20" -> "20"
|
|
35
|
+
* "第20条" -> "20"
|
|
36
|
+
* "20条" -> "20"
|
|
37
|
+
* "第6条の2" -> "6_2"
|
|
38
|
+
* "6条の2" -> "6_2"
|
|
39
|
+
* "6_2" -> "6_2"
|
|
40
|
+
* "第百条" -> null (kanji numeral — handled via title matching)
|
|
41
|
+
*/
|
|
42
|
+
function normalizeArticleNumber(input) {
|
|
43
|
+
let s = input.trim();
|
|
44
|
+
// Strip leading "第" and trailing "条"
|
|
45
|
+
s = s.replace(/^第/, "");
|
|
46
|
+
s = s.replace(/条$/, "");
|
|
47
|
+
// If the string still contains kanji numerals we cannot normalize it;
|
|
48
|
+
// the caller should fall back to matching against ArticleTitle text.
|
|
49
|
+
if (/[一二三四五六七八九十百千万]/.test(s)) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
// Replace "の" with "_" (e.g. "6の2" -> "6_2")
|
|
53
|
+
s = s.replace(/の/g, "_");
|
|
54
|
+
// At this point the string should consist of digits, underscores, and
|
|
55
|
+
// possibly hyphens. Reject anything else.
|
|
56
|
+
if (!/^[\d_-]+$/.test(s)) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
return s;
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Helper: type guards and basic traversal
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
function isLawNode(child) {
|
|
65
|
+
return (typeof child !== "string" &&
|
|
66
|
+
child !== null &&
|
|
67
|
+
typeof child === "object" &&
|
|
68
|
+
"tag" in child);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Find all direct child nodes matching a given tag.
|
|
72
|
+
*/
|
|
73
|
+
function findChildrenByTag(node, tag) {
|
|
74
|
+
if (!node.children) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
return node.children.filter((c) => isLawNode(c) && c.tag === tag);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Find the first direct child node matching a given tag.
|
|
81
|
+
*/
|
|
82
|
+
function findChildByTag(node, tag) {
|
|
83
|
+
if (!node.children) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
return node.children.find((c) => isLawNode(c) && c.tag === tag);
|
|
87
|
+
}
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
// Text extraction
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
/**
|
|
92
|
+
* Recursively extract all plain text from a node subtree.
|
|
93
|
+
* Skips TOC, Rt (ruby reading), and replaces Table/FigStruct with placeholders.
|
|
94
|
+
*/
|
|
95
|
+
function extractText(node) {
|
|
96
|
+
if (typeof node === "string") {
|
|
97
|
+
return node;
|
|
98
|
+
}
|
|
99
|
+
if (SKIP_TAGS.has(node.tag)) {
|
|
100
|
+
return "";
|
|
101
|
+
}
|
|
102
|
+
if (node.tag === "Table" || node.tag === "TableStruct") {
|
|
103
|
+
return TABLE_PLACEHOLDER;
|
|
104
|
+
}
|
|
105
|
+
if (node.tag === "Fig" || node.tag === "FigStruct") {
|
|
106
|
+
return FIGURE_PLACEHOLDER;
|
|
107
|
+
}
|
|
108
|
+
if (!node.children || node.children.length === 0) {
|
|
109
|
+
return "";
|
|
110
|
+
}
|
|
111
|
+
return node.children.map(extractText).join("");
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Article text rendering
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
/**
|
|
117
|
+
* Render the body of an Article node into human-readable text.
|
|
118
|
+
* Handles Paragraph, Item, Subitem1..Subitem5 hierarchy.
|
|
119
|
+
*/
|
|
120
|
+
function renderArticleBody(article) {
|
|
121
|
+
const lines = [];
|
|
122
|
+
const paragraphs = findChildrenByTag(article, "Paragraph");
|
|
123
|
+
for (const paragraph of paragraphs) {
|
|
124
|
+
renderParagraph(paragraph, lines);
|
|
125
|
+
}
|
|
126
|
+
return lines.join("\n");
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Render a Paragraph node, including its items/subitems.
|
|
130
|
+
*/
|
|
131
|
+
function renderParagraph(paragraph, lines) {
|
|
132
|
+
// ParagraphNum: if it has text content, prefix the paragraph sentence with it.
|
|
133
|
+
const numNode = findChildByTag(paragraph, "ParagraphNum");
|
|
134
|
+
const numText = numNode ? extractText(numNode).trim() : "";
|
|
135
|
+
const sentenceNode = findChildByTag(paragraph, "ParagraphSentence");
|
|
136
|
+
const sentenceText = sentenceNode ? extractText(sentenceNode).trim() : "";
|
|
137
|
+
if (sentenceText) {
|
|
138
|
+
const prefix = numText ? `${numText} ` : "";
|
|
139
|
+
lines.push(`${prefix}${sentenceText}`);
|
|
140
|
+
}
|
|
141
|
+
// Render items within this paragraph
|
|
142
|
+
renderChildItems(paragraph, lines, 0);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Render Item / Subitem children at a given depth.
|
|
146
|
+
*
|
|
147
|
+
* depth 0 -> Item
|
|
148
|
+
* depth 1 -> Subitem1
|
|
149
|
+
* depth 2 -> Subitem2
|
|
150
|
+
* ...
|
|
151
|
+
*/
|
|
152
|
+
function renderChildItems(parent, lines, depth) {
|
|
153
|
+
const itemTag = depth === 0 ? "Item" : `Subitem${depth}`;
|
|
154
|
+
const items = findChildrenByTag(parent, itemTag);
|
|
155
|
+
for (const item of items) {
|
|
156
|
+
renderItem(item, lines, depth);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Render a single Item or Subitem node.
|
|
161
|
+
*/
|
|
162
|
+
function renderItem(item, lines, depth) {
|
|
163
|
+
const indent = INDENT_UNIT.repeat(depth + 1);
|
|
164
|
+
// Determine tag names for title and sentence based on depth.
|
|
165
|
+
const titleTag = depth === 0 ? "ItemTitle" : `Subitem${depth}Title`;
|
|
166
|
+
const sentenceTag = depth === 0 ? "ItemSentence" : `Subitem${depth}Sentence`;
|
|
167
|
+
const titleNode = findChildByTag(item, titleTag);
|
|
168
|
+
const titleText = titleNode ? extractText(titleNode).trim() : "";
|
|
169
|
+
const sentenceNode = findChildByTag(item, sentenceTag);
|
|
170
|
+
const sentenceText = sentenceNode ? extractText(sentenceNode).trim() : "";
|
|
171
|
+
if (sentenceText) {
|
|
172
|
+
const prefix = titleText ? `${titleText} ` : "";
|
|
173
|
+
lines.push(`${indent}${prefix}${sentenceText}`);
|
|
174
|
+
}
|
|
175
|
+
else if (titleText) {
|
|
176
|
+
lines.push(`${indent}${titleText}`);
|
|
177
|
+
}
|
|
178
|
+
// Recurse into deeper subitems (Subitem1 -> Subitem2 -> ...)
|
|
179
|
+
const nextDepth = depth + 1;
|
|
180
|
+
renderChildItems(item, lines, nextDepth);
|
|
181
|
+
}
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
// Article collection
|
|
184
|
+
// ---------------------------------------------------------------------------
|
|
185
|
+
/**
|
|
186
|
+
* Recursively collect all Article nodes from the law tree.
|
|
187
|
+
*/
|
|
188
|
+
function collectArticleNodes(node) {
|
|
189
|
+
const articles = [];
|
|
190
|
+
if (node.tag === "Article") {
|
|
191
|
+
articles.push(node);
|
|
192
|
+
return articles;
|
|
193
|
+
}
|
|
194
|
+
if (!node.children) {
|
|
195
|
+
return articles;
|
|
196
|
+
}
|
|
197
|
+
for (const child of node.children) {
|
|
198
|
+
if (isLawNode(child)) {
|
|
199
|
+
articles.push(...collectArticleNodes(child));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return articles;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Convert an Article node to a ParsedArticle.
|
|
206
|
+
*/
|
|
207
|
+
function articleNodeToParsed(article) {
|
|
208
|
+
const num = article.attr?.["Num"] ?? "";
|
|
209
|
+
const captionNode = findChildByTag(article, "ArticleCaption");
|
|
210
|
+
const caption = captionNode ? extractText(captionNode).trim() : "";
|
|
211
|
+
const titleNode = findChildByTag(article, "ArticleTitle");
|
|
212
|
+
const title = titleNode ? extractText(titleNode).trim() : "";
|
|
213
|
+
const text = renderArticleBody(article);
|
|
214
|
+
return {
|
|
215
|
+
article_num: num,
|
|
216
|
+
article_caption: caption,
|
|
217
|
+
article_title: title,
|
|
218
|
+
text,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Public API
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
/**
|
|
225
|
+
* Extract a specific article from the law tree.
|
|
226
|
+
*
|
|
227
|
+
* `articleNumber` can be in any of these formats:
|
|
228
|
+
* "20", "第20条", "20条", "6条の2", "第6条の2", "第百条"
|
|
229
|
+
*
|
|
230
|
+
* Returns null if the article is not found.
|
|
231
|
+
*/
|
|
232
|
+
export function parseArticle(root, articleNumber) {
|
|
233
|
+
const allArticles = collectArticleNodes(root);
|
|
234
|
+
if (allArticles.length === 0) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
const normalized = normalizeArticleNumber(articleNumber);
|
|
238
|
+
if (normalized !== null) {
|
|
239
|
+
// Primary match: compare against the Num attribute.
|
|
240
|
+
for (const article of allArticles) {
|
|
241
|
+
const num = article.attr?.["Num"];
|
|
242
|
+
if (num === normalized) {
|
|
243
|
+
return articleNodeToParsed(article);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
// Fallback: match against ArticleTitle text.
|
|
248
|
+
// This handles kanji numeral inputs like "第百条".
|
|
249
|
+
const cleanedInput = articleNumber.trim();
|
|
250
|
+
// Build candidate patterns to match.
|
|
251
|
+
const candidates = [cleanedInput];
|
|
252
|
+
// If user wrote "百条" without "第", try adding it.
|
|
253
|
+
if (!cleanedInput.startsWith("第")) {
|
|
254
|
+
candidates.push(`第${cleanedInput}`);
|
|
255
|
+
}
|
|
256
|
+
// If user wrote "第百条", also try without "第".
|
|
257
|
+
if (cleanedInput.startsWith("第")) {
|
|
258
|
+
candidates.push(cleanedInput.slice(1));
|
|
259
|
+
}
|
|
260
|
+
// Ensure all candidates end with "条" for matching against titles like "第百条".
|
|
261
|
+
const patternsWithJo = candidates.flatMap((c) => {
|
|
262
|
+
const result = [c];
|
|
263
|
+
if (!c.endsWith("条")) {
|
|
264
|
+
result.push(`${c}条`);
|
|
265
|
+
}
|
|
266
|
+
return result;
|
|
267
|
+
});
|
|
268
|
+
for (const article of allArticles) {
|
|
269
|
+
const titleNode = findChildByTag(article, "ArticleTitle");
|
|
270
|
+
const titleText = titleNode ? extractText(titleNode).trim() : "";
|
|
271
|
+
for (const pattern of patternsWithJo) {
|
|
272
|
+
if (titleText === pattern) {
|
|
273
|
+
return articleNodeToParsed(article);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Extract ALL articles from the law tree.
|
|
281
|
+
*/
|
|
282
|
+
export function parseAllArticles(root) {
|
|
283
|
+
const articleNodes = collectArticleNodes(root);
|
|
284
|
+
return articleNodes.map(articleNodeToParsed);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Convert entire law tree to formatted plain text.
|
|
288
|
+
* Used by the `get_full_law` tool.
|
|
289
|
+
*
|
|
290
|
+
* Output format:
|
|
291
|
+
* ```
|
|
292
|
+
* {LawTitle}
|
|
293
|
+
* {LawNum}
|
|
294
|
+
*
|
|
295
|
+
* {ChapterTitle}
|
|
296
|
+
*
|
|
297
|
+
* {ArticleCaption}
|
|
298
|
+
* {ArticleTitle}
|
|
299
|
+
* {paragraph text}
|
|
300
|
+
* ...
|
|
301
|
+
*
|
|
302
|
+
* 附則
|
|
303
|
+
* {supplement text}
|
|
304
|
+
* ```
|
|
305
|
+
*/
|
|
306
|
+
export function parseFullLaw(root) {
|
|
307
|
+
const lines = [];
|
|
308
|
+
// The root should be a "Law" node with a "LawBody" child.
|
|
309
|
+
const lawBody = findDeep(root, "LawBody");
|
|
310
|
+
if (!lawBody) {
|
|
311
|
+
// Fallback: try to render whatever we have.
|
|
312
|
+
return extractText(root);
|
|
313
|
+
}
|
|
314
|
+
// Law title
|
|
315
|
+
const lawTitle = findDeep(root, "LawTitle");
|
|
316
|
+
if (lawTitle) {
|
|
317
|
+
lines.push(extractText(lawTitle).trim());
|
|
318
|
+
}
|
|
319
|
+
// Law number
|
|
320
|
+
const lawNum = findDeep(root, "LawNum");
|
|
321
|
+
if (lawNum) {
|
|
322
|
+
lines.push(extractText(lawNum).trim());
|
|
323
|
+
}
|
|
324
|
+
if (lines.length > 0) {
|
|
325
|
+
lines.push("");
|
|
326
|
+
}
|
|
327
|
+
// Render the law body (MainProvision, SupplProvision, etc.)
|
|
328
|
+
if (lawBody.children) {
|
|
329
|
+
for (const child of lawBody.children) {
|
|
330
|
+
if (!isLawNode(child)) {
|
|
331
|
+
continue;
|
|
332
|
+
}
|
|
333
|
+
// Skip law title (already rendered above)
|
|
334
|
+
if (child.tag === "LawTitle") {
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
// Skip TOC
|
|
338
|
+
if (child.tag === "TOC") {
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
if (child.tag === "MainProvision") {
|
|
342
|
+
renderProvision(child, lines);
|
|
343
|
+
}
|
|
344
|
+
else if (child.tag === "SupplProvision") {
|
|
345
|
+
renderSupplProvision(child, lines);
|
|
346
|
+
}
|
|
347
|
+
else if (child.tag === "Preamble") {
|
|
348
|
+
renderPreamble(child, lines);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return lines.join("\n");
|
|
353
|
+
}
|
|
354
|
+
// ---------------------------------------------------------------------------
|
|
355
|
+
// Full law rendering helpers
|
|
356
|
+
// ---------------------------------------------------------------------------
|
|
357
|
+
/**
|
|
358
|
+
* Find a node with the given tag anywhere in the tree (depth-first).
|
|
359
|
+
*/
|
|
360
|
+
function findDeep(node, tag) {
|
|
361
|
+
if (node.tag === tag) {
|
|
362
|
+
return node;
|
|
363
|
+
}
|
|
364
|
+
if (!node.children) {
|
|
365
|
+
return undefined;
|
|
366
|
+
}
|
|
367
|
+
for (const child of node.children) {
|
|
368
|
+
if (isLawNode(child)) {
|
|
369
|
+
const found = findDeep(child, tag);
|
|
370
|
+
if (found) {
|
|
371
|
+
return found;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Render the MainProvision subtree into lines.
|
|
379
|
+
*/
|
|
380
|
+
function renderProvision(node, lines) {
|
|
381
|
+
if (!node.children) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
for (const child of node.children) {
|
|
385
|
+
if (!isLawNode(child)) {
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
if (STRUCTURAL_TAGS.has(child.tag)) {
|
|
389
|
+
renderStructural(child, lines);
|
|
390
|
+
}
|
|
391
|
+
else if (child.tag === "Article") {
|
|
392
|
+
renderArticleForFullLaw(child, lines);
|
|
393
|
+
}
|
|
394
|
+
else if (child.tag === "Paragraph") {
|
|
395
|
+
// Standalone paragraphs outside articles (rare but possible).
|
|
396
|
+
renderParagraph(child, lines);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Render a structural container (Part, Chapter, Section, etc.).
|
|
402
|
+
*/
|
|
403
|
+
function renderStructural(node, lines) {
|
|
404
|
+
if (!node.children) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
for (const child of node.children) {
|
|
408
|
+
if (!isLawNode(child)) {
|
|
409
|
+
continue;
|
|
410
|
+
}
|
|
411
|
+
if (STRUCTURAL_TITLE_TAGS.has(child.tag)) {
|
|
412
|
+
lines.push("");
|
|
413
|
+
lines.push(extractText(child).trim());
|
|
414
|
+
lines.push("");
|
|
415
|
+
}
|
|
416
|
+
else if (STRUCTURAL_TAGS.has(child.tag)) {
|
|
417
|
+
// Nested structural elements (e.g. Section inside Chapter).
|
|
418
|
+
renderStructural(child, lines);
|
|
419
|
+
}
|
|
420
|
+
else if (child.tag === "Article") {
|
|
421
|
+
renderArticleForFullLaw(child, lines);
|
|
422
|
+
}
|
|
423
|
+
else if (child.tag === "Paragraph") {
|
|
424
|
+
renderParagraph(child, lines);
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Render a single Article for the full law output.
|
|
430
|
+
*/
|
|
431
|
+
function renderArticleForFullLaw(article, lines) {
|
|
432
|
+
const captionNode = findChildByTag(article, "ArticleCaption");
|
|
433
|
+
const caption = captionNode ? extractText(captionNode).trim() : "";
|
|
434
|
+
const titleNode = findChildByTag(article, "ArticleTitle");
|
|
435
|
+
const title = titleNode ? extractText(titleNode).trim() : "";
|
|
436
|
+
if (caption) {
|
|
437
|
+
lines.push(caption);
|
|
438
|
+
}
|
|
439
|
+
if (title) {
|
|
440
|
+
lines.push(title);
|
|
441
|
+
}
|
|
442
|
+
const paragraphs = findChildrenByTag(article, "Paragraph");
|
|
443
|
+
for (const paragraph of paragraphs) {
|
|
444
|
+
renderParagraph(paragraph, lines);
|
|
445
|
+
}
|
|
446
|
+
// Blank line after each article for readability.
|
|
447
|
+
lines.push("");
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* Render SupplProvision (附則).
|
|
451
|
+
*/
|
|
452
|
+
function renderSupplProvision(node, lines) {
|
|
453
|
+
// SupplProvision label
|
|
454
|
+
const labelNode = findChildByTag(node, "SupplProvisionLabel");
|
|
455
|
+
const label = labelNode ? extractText(labelNode).trim() : "附則";
|
|
456
|
+
lines.push("");
|
|
457
|
+
lines.push(label);
|
|
458
|
+
lines.push("");
|
|
459
|
+
if (!node.children) {
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
for (const child of node.children) {
|
|
463
|
+
if (!isLawNode(child)) {
|
|
464
|
+
continue;
|
|
465
|
+
}
|
|
466
|
+
if (child.tag === "SupplProvisionLabel") {
|
|
467
|
+
// Already rendered above.
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
if (child.tag === "Article") {
|
|
471
|
+
renderArticleForFullLaw(child, lines);
|
|
472
|
+
}
|
|
473
|
+
else if (child.tag === "Paragraph") {
|
|
474
|
+
renderParagraph(child, lines);
|
|
475
|
+
}
|
|
476
|
+
else if (STRUCTURAL_TAGS.has(child.tag)) {
|
|
477
|
+
renderStructural(child, lines);
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Render Preamble (前文).
|
|
483
|
+
*/
|
|
484
|
+
function renderPreamble(node, lines) {
|
|
485
|
+
if (!node.children) {
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
for (const child of node.children) {
|
|
489
|
+
if (!isLawNode(child)) {
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
if (child.tag === "Paragraph") {
|
|
493
|
+
renderParagraph(child, lines);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
lines.push("");
|
|
497
|
+
}
|
|
498
|
+
//# sourceMappingURL=egov-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"egov-parser.js","sourceRoot":"","sources":["../../src/lib/egov-parser.ts"],"names":[],"mappings":"AAEA,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC,qDAAqD;AACrD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;AAEzC,+FAA+F;AAC/F,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,MAAM;IACN,SAAS;IACT,SAAS;IACT,YAAY;IACZ,UAAU;CACX,CAAC,CAAC;AAEH,0DAA0D;AAC1D,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,WAAW;IACX,cAAc;IACd,cAAc;IACd,iBAAiB;IACjB,eAAe;CAChB,CAAC,CAAC;AAEH,wEAAwE;AACxE,MAAM,WAAW,GAAG,IAAI,CAAC;AAEzB,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,SAAS,sBAAsB,CAAC,KAAa;IAC3C,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAErB,qCAAqC;IACrC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAExB,sEAAsE;IACtE,qEAAqE;IACrE,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAEzB,sEAAsE;IACtE,0CAA0C;IAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,CAAC;AACX,CAAC;AAED,8EAA8E;AAC9E,0CAA0C;AAC1C,8EAA8E;AAE9E,SAAS,SAAS,CAAC,KAAuB;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,IAAI,KAAK,CACf,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,IAAa,EAAE,GAAW;IACnD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CACzB,CAAC,CAAC,EAAgB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CACnD,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAa,EAAE,GAAW;IAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAChF,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAsB;IACzC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,IAAI,IAAI,CAAC,GAAG,KAAK,aAAa,EAAE,CAAC;QACvD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;QACnD,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,iBAAiB,CAAC,OAAgB;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE3D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,SAAkB,EAAE,KAAe;IAC1D,+EAA+E;IAC/E,MAAM,OAAO,GAAG,cAAc,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3D,MAAM,YAAY,GAAG,cAAc,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IACpE,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1E,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,qCAAqC;IACrC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CACvB,MAAe,EACf,KAAe,EACf,KAAa;IAEb,MAAM,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,KAAK,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,IAAa,EAAE,KAAe,EAAE,KAAa;IAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAE7C,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,KAAK,OAAO,CAAC;IACpE,MAAM,WAAW,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,UAAU,KAAK,UAAU,CAAC;IAE7E,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjE,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1E,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,SAAS,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,6DAA6D;IAC7D,MAAM,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC;IAC5B,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAE9E;;GAEG;AACH,SAAS,mBAAmB,CAAC,IAAa;IACxC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,OAAgB;IAC3C,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAExC,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAExC,OAAO;QACL,WAAW,EAAE,GAAG;QAChB,eAAe,EAAE,OAAO;QACxB,aAAa,EAAE,KAAK;QACpB,IAAI;KACL,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAa,EACb,aAAqB;IAErB,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAAC;IAEzD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,oDAAoD;QACpD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;YAClC,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBACvB,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,gDAAgD;IAChD,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC;IAC1C,qCAAqC;IACrC,MAAM,UAAU,GAAa,CAAC,YAAY,CAAC,CAAC;IAC5C,iDAAiD;IACjD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,UAAU,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,6CAA6C;IAC7C,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IACD,6EAA6E;IAC7E,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9C,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAEjE,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;YACrC,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC1B,OAAO,mBAAmB,CAAC,OAAO,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAa;IAC5C,MAAM,YAAY,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/C,OAAO,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa;IACxC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,0DAA0D;IAC1D,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,4CAA4C;QAC5C,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,YAAY;IACZ,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,IAAI,QAAQ,EAAE,CAAC;QACb,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,aAAa;IACb,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,4DAA4D;IAC5D,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,SAAS;YACX,CAAC;YAED,0CAA0C;YAC1C,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC7B,SAAS;YACX,CAAC;YAED,WAAW;YACX,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,GAAG,KAAK,eAAe,EAAE,CAAC;gBAClC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAChC,CAAC;iBAAM,IAAI,KAAK,CAAC,GAAG,KAAK,gBAAgB,EAAE,CAAC;gBAC1C,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACrC,CAAC;iBAAM,IAAI,KAAK,CAAC,GAAG,KAAK,UAAU,EAAE,CAAC;gBACpC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,8EAA8E;AAC9E,6BAA6B;AAC7B,8EAA8E;AAE9E;;GAEG;AACH,SAAS,QAAQ,CAAC,IAAa,EAAE,GAAW;IAC1C,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAa,EAAE,KAAe;IACrD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACnC,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACrC,8DAA8D;YAC9D,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAa,EAAE,KAAe;IACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;aAAM,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,4DAA4D;YAC5D,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YACnC,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACrC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,OAAgB,EAAE,KAAe;IAChE,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,IAAI,OAAO,EAAE,CAAC;QACZ,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC3D,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,eAAe,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAa,EAAE,KAAe;IAC1D,uBAAuB;IACvB,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAE/D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,qBAAqB,EAAE,CAAC;YACxC,0BAA0B;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;YAC5B,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YACrC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;aAAM,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,IAAa,EAAE,KAAe;IACpD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,SAAS;QACX,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;YAC9B,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare class EgovApiError extends Error {
|
|
2
|
+
readonly statusCode: number | undefined;
|
|
3
|
+
readonly endpoint: string | undefined;
|
|
4
|
+
constructor(message: string, statusCode?: number, endpoint?: string);
|
|
5
|
+
}
|
|
6
|
+
export declare class LawNotFoundError extends Error {
|
|
7
|
+
readonly lawName: string;
|
|
8
|
+
constructor(lawName: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class ArticleNotFoundError extends Error {
|
|
11
|
+
readonly articleNumber: string;
|
|
12
|
+
readonly lawName: string;
|
|
13
|
+
constructor(articleNumber: string, lawName: string);
|
|
14
|
+
}
|
|
15
|
+
export declare class KokujiNotFoundError extends Error {
|
|
16
|
+
readonly kokujiName: string;
|
|
17
|
+
constructor(kokujiName: string);
|
|
18
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export class EgovApiError extends Error {
|
|
2
|
+
statusCode;
|
|
3
|
+
endpoint;
|
|
4
|
+
constructor(message, statusCode, endpoint) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = "EgovApiError";
|
|
7
|
+
this.statusCode = statusCode;
|
|
8
|
+
this.endpoint = endpoint;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class LawNotFoundError extends Error {
|
|
12
|
+
lawName;
|
|
13
|
+
constructor(lawName) {
|
|
14
|
+
super(`法令が見つかりません: ${lawName}`);
|
|
15
|
+
this.name = "LawNotFoundError";
|
|
16
|
+
this.lawName = lawName;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class ArticleNotFoundError extends Error {
|
|
20
|
+
articleNumber;
|
|
21
|
+
lawName;
|
|
22
|
+
constructor(articleNumber, lawName) {
|
|
23
|
+
super(`${lawName}の${articleNumber}が見つかりません`);
|
|
24
|
+
this.name = "ArticleNotFoundError";
|
|
25
|
+
this.articleNumber = articleNumber;
|
|
26
|
+
this.lawName = lawName;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class KokujiNotFoundError extends Error {
|
|
30
|
+
kokujiName;
|
|
31
|
+
constructor(kokujiName) {
|
|
32
|
+
super(`告示が見つかりません: ${kokujiName}`);
|
|
33
|
+
this.name = "KokujiNotFoundError";
|
|
34
|
+
this.kokujiName = kokujiName;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrB,UAAU,CAAqB;IAC/B,QAAQ,CAAqB;IAE7C,YAAY,OAAe,EAAE,UAAmB,EAAE,QAAiB;QACjE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzB,OAAO,CAAS;IAEhC,YAAY,OAAe;QACzB,KAAK,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7B,aAAa,CAAS;IACtB,OAAO,CAAS;IAEhC,YAAY,aAAqB,EAAE,OAAe;QAChD,KAAK,CAAC,GAAG,OAAO,IAAI,aAAa,UAAU,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5B,UAAU,CAAS;IAEnC,YAAY,UAAkB;QAC5B,KAAK,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { KokujiPreset } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Registry for looking up kokuji (ministerial notification) presets.
|
|
4
|
+
* Currently empty as the e-Gov API v2 does not include kokuji in
|
|
5
|
+
* its law search endpoint.
|
|
6
|
+
*/
|
|
7
|
+
export declare class KokujiRegistry {
|
|
8
|
+
private readonly presets;
|
|
9
|
+
constructor();
|
|
10
|
+
/**
|
|
11
|
+
* Find a single kokuji by exact title or abbreviation.
|
|
12
|
+
* Falls back to partial match if no exact/abbreviation match is found.
|
|
13
|
+
*/
|
|
14
|
+
findByName(name: string): KokujiPreset | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Get a defensive copy of all kokuji presets.
|
|
17
|
+
*/
|
|
18
|
+
getAll(): KokujiPreset[];
|
|
19
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kokuji (ministerial notification) presets.
|
|
3
|
+
*
|
|
4
|
+
* NOTE: As of 2026-03-09, the e-Gov API v2 law search endpoint
|
|
5
|
+
* does NOT return kokuji (告示). Searches for all 7 kokuji titles
|
|
6
|
+
* returned 0 results. Broader keyword searches also returned 0.
|
|
7
|
+
*
|
|
8
|
+
* This registry is kept as a placeholder for future use, in case:
|
|
9
|
+
* - The e-Gov API adds kokuji support
|
|
10
|
+
* - A separate kokuji data source is integrated
|
|
11
|
+
* - Manual law_id mapping becomes available
|
|
12
|
+
*
|
|
13
|
+
* Known kokuji that would be relevant to building law:
|
|
14
|
+
* - 耐火構造の構造方法を定める件 (delegated by 建築基準法施行令)
|
|
15
|
+
* - 準耐火構造の構造方法を定める件 (delegated by 建築基準法施行令)
|
|
16
|
+
* - 防火構造の構造方法を定める件 (delegated by 建築基準法施行令)
|
|
17
|
+
* - 不燃材料を定める件 (delegated by 建築基準法施行令)
|
|
18
|
+
* - 採光に有効な部分の面積の算定方法を定める件 (delegated by 建築基準法施行令)
|
|
19
|
+
* - 避難安全検証法に関する算出方法等を定める件 (delegated by 建築基準法施行令)
|
|
20
|
+
* - 許容応力度計算等の方法を定める件 (delegated by 建築基準法施行令)
|
|
21
|
+
*/
|
|
22
|
+
const ALL_KOKUJI_PRESETS = [
|
|
23
|
+
// No verified kokuji available via e-Gov API v2 at this time.
|
|
24
|
+
// When law_id values become available, add entries in this format:
|
|
25
|
+
// {
|
|
26
|
+
// law_id: '...',
|
|
27
|
+
// law_num: '...',
|
|
28
|
+
// title: '耐火構造の構造方法を定める件',
|
|
29
|
+
// abbrev: ['耐火構造告示'],
|
|
30
|
+
// delegated_by: '建築基準法施行令',
|
|
31
|
+
// },
|
|
32
|
+
];
|
|
33
|
+
/**
|
|
34
|
+
* Registry for looking up kokuji (ministerial notification) presets.
|
|
35
|
+
* Currently empty as the e-Gov API v2 does not include kokuji in
|
|
36
|
+
* its law search endpoint.
|
|
37
|
+
*/
|
|
38
|
+
export class KokujiRegistry {
|
|
39
|
+
presets;
|
|
40
|
+
constructor() {
|
|
41
|
+
this.presets = ALL_KOKUJI_PRESETS;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Find a single kokuji by exact title or abbreviation.
|
|
45
|
+
* Falls back to partial match if no exact/abbreviation match is found.
|
|
46
|
+
*/
|
|
47
|
+
findByName(name) {
|
|
48
|
+
const exact = this.presets.find((p) => p.title === name);
|
|
49
|
+
if (exact)
|
|
50
|
+
return exact;
|
|
51
|
+
const abbr = this.presets.find((p) => p.abbrev.some((a) => a === name));
|
|
52
|
+
if (abbr)
|
|
53
|
+
return abbr;
|
|
54
|
+
return this.presets.find((p) => p.title.includes(name) || name.includes(p.title));
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Get a defensive copy of all kokuji presets.
|
|
58
|
+
*/
|
|
59
|
+
getAll() {
|
|
60
|
+
return [...this.presets];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=kokuji-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kokuji-registry.js","sourceRoot":"","sources":["../../src/lib/kokuji-registry.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,kBAAkB,GAAmB;AACzC,8DAA8D;AAC9D,mEAAmE;AACnE,IAAI;AACJ,mBAAmB;AACnB,oBAAoB;AACpB,6BAA6B;AAC7B,wBAAwB;AACxB,8BAA8B;AAC9B,KAAK;CACN,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,cAAc;IACR,OAAO,CAAiB;IAEzC;QACE,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC;IACpC,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,IAAY;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC;QACzD,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QACxE,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QAEtB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CACtB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CACxD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;CACF"}
|