diff options
| author | おさむのひと <46447427+samunohito@users.noreply.github.com> | 2024-01-13 21:17:30 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-13 21:17:30 +0900 |
| commit | 57017f2747eeb7d77f9c573f54de85f4198dd3b1 (patch) | |
| tree | c02a197d423a998cd0cca4fb032bccbd1b4fa8ba /scripts/changelog-checker/src/parser.ts | |
| parent | feat: 枠線をつけるMFMを追加 (#12981) (diff) | |
| download | misskey-57017f2747eeb7d77f9c573f54de85f4198dd3b1.tar.gz misskey-57017f2747eeb7d77f9c573f54de85f4198dd3b1.tar.bz2 misskey-57017f2747eeb7d77f9c573f54de85f4198dd3b1.zip | |
feat(CI): CHANGELOG.mdの追記個所をチェックするCIを追加 (#12963)
* feat(CI): CHANGELOG.mdの追記個所をチェックするCIを追加
* fix
* remove strategy
* fix
* fix
Diffstat (limited to 'scripts/changelog-checker/src/parser.ts')
| -rw-r--r-- | scripts/changelog-checker/src/parser.ts | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/scripts/changelog-checker/src/parser.ts b/scripts/changelog-checker/src/parser.ts new file mode 100644 index 0000000000..d6a9ddeda8 --- /dev/null +++ b/scripts/changelog-checker/src/parser.ts @@ -0,0 +1,62 @@ +import * as fs from 'node:fs'; +import { unified } from 'unified'; +import remarkParse from 'remark-parse'; +import { Heading, List, Node } from 'mdast'; +import { toString } from 'mdast-util-to-string'; + +export class Release { + public readonly releaseName: string; + public readonly categories: ReleaseCategory[]; + + constructor(releaseName: string, categories: ReleaseCategory[] = []) { + this.releaseName = releaseName; + this.categories = [...categories]; + } +} + +export class ReleaseCategory { + public readonly categoryName: string; + public readonly items: string[]; + + constructor(categoryName: string, items: string[] = []) { + this.categoryName = categoryName; + this.items = [...items]; + } +} + +function isHeading(node: Node): node is Heading { + return node.type === 'heading'; +} + +function isList(node: Node): node is List { + return node.type === 'list'; +} + +export function parseChangeLog(path: string): Release[] { + const input = fs.readFileSync(path, { encoding: 'utf8' }); + const processor = unified().use(remarkParse); + + const releases: Release[] = []; + const root = processor.parse(input); + + let release: Release | null = null; + let category: ReleaseCategory | null = null; + for (const it of root.children) { + if (isHeading(it) && it.depth === 2) { + // リリース + release = new Release(toString(it)); + releases.push(release); + } else if (isHeading(it) && it.depth === 3 && release) { + // リリース配下のカテゴリ + category = new ReleaseCategory(toString(it)); + release.categories.push(category); + } else if (isList(it) && category) { + for (const listItem of it.children) { + // カテゴリ配下のリスト項目 + category.items.push(toString(listItem)); + } + } + } + + return releases; +} |