summaryrefslogtreecommitdiff
path: root/scripts/changelog-checker/src/parser.ts
diff options
context:
space:
mode:
authorおさむのひと <46447427+samunohito@users.noreply.github.com>2024-01-13 21:17:30 +0900
committerGitHub <noreply@github.com>2024-01-13 21:17:30 +0900
commit57017f2747eeb7d77f9c573f54de85f4198dd3b1 (patch)
treec02a197d423a998cd0cca4fb032bccbd1b4fa8ba /scripts/changelog-checker/src/parser.ts
parentfeat: 枠線をつけるMFMを追加 (#12981) (diff)
downloadmisskey-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.ts62
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;
+}