From a219cc350b1d62e701bde13d0d33bf3183dffc91 Mon Sep 17 00:00:00 2001 From: miteruzo Date: Thu, 8 Oct 2026 02:24:39 +0900 Subject: [PATCH] =?UTF-8?q?#424=20=E4=B8=80=E6=99=82=E3=82=B3=E3=83=9F?= =?UTF-8?q?=E3=83=83=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/lib/tasks/migrate_help_pages.rake | 44 +++++++++++++ frontend/.gitignore | 2 + frontend/package-lock.json | 47 ++------------ frontend/package.json | 1 + frontend/src/lib/help.ts | 75 ++++++++++++++++++++++ frontend/src/pages/help/HelpDetailPage.tsx | 0 6 files changed, 126 insertions(+), 43 deletions(-) create mode 100644 backend/lib/tasks/migrate_help_pages.rake create mode 100644 frontend/src/lib/help.ts create mode 100644 frontend/src/pages/help/HelpDetailPage.tsx diff --git a/backend/lib/tasks/migrate_help_pages.rake b/backend/lib/tasks/migrate_help_pages.rake new file mode 100644 index 0000000..ef9191a --- /dev/null +++ b/backend/lib/tasks/migrate_help_pages.rake @@ -0,0 +1,44 @@ +namespace :help do + desc 'ヘルプ移行' + task migrate: :environment do + help_path = ENV.fetch('BTRC_HUB_HELP_PATH') + abort if help_path.blank? + + # 現状物理削除はなぃはず + pages = + WikiPage + .joins(:tag_name) + .where(tag_names: { tag_id: nil }) + .where.not("tag_names.name LIKE 'タググループ:%'") + + pages.find_each do |page| + puts page.body + puts page.title + + puts 'この identifier は何にする?' + identifier = $stdin.gets.chomp + Dir.mkdir "#{ help_path }/#{ identifier }" + Dir.mkdir "#{ help_path }/#{ identifier }/editions" + Dir.mkdir "#{ help_path }/#{ identifier }/editions/ja" + + last_file_name = '' + WikiVersion.where(wiki_page_id: page.id).order(:version_no).each do |ver| + last_file_name, last_file_name_no = last_file_name.split('.') + + file_name = ver.created_at.strftime('%Y-%m-%d') + if file_name == last_file_name + file_name += ".#{ (last_file_name_no || 1).to_i + 1 }" + end + + File.write "#{ help_path }/#{ identifier }/editions/ja/#{ file_name }.mdx", ver.body + + last_file_name = file_name + end + + article_meta = { 'identifier' => identifier, + 'canonical_language' => 'ja', + 'languages' => { 'ja' => { 'current_edition' => last_file_name } } } + File.write "#{ help_path }/#{ identifier }/article.yml", article_meta.to_yaml + end + end +end diff --git a/frontend/.gitignore b/frontend/.gitignore index a547bf3..86addbc 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -22,3 +22,5 @@ dist-ssr *.njsproj *.sln *.sw? + +/help diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 799f788..7516be9 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -38,6 +38,7 @@ "remark-gfm": "^4.0.1", "tailwind-merge": "^3.3.0", "unist-util-visit-parents": "^6.0.1", + "yaml": "^2.9.1", "zustand": "^5.0.8" }, "devDependencies": { @@ -2060,9 +2061,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2077,9 +2075,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2094,9 +2089,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2111,9 +2103,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2128,9 +2117,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2145,9 +2131,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2162,9 +2145,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2179,9 +2159,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2196,9 +2173,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2213,9 +2187,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2230,9 +2201,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2247,9 +2215,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2264,9 +2229,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -9114,10 +9076,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", - "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", - "dev": true, + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/frontend/package.json b/frontend/package.json index 2d5d533..65b24e5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -42,6 +42,7 @@ "remark-gfm": "^4.0.1", "tailwind-merge": "^3.3.0", "unist-util-visit-parents": "^6.0.1", + "yaml": "^2.9.1", "zustand": "^5.0.8" }, "devDependencies": { diff --git a/frontend/src/lib/help.ts b/frontend/src/lib/help.ts new file mode 100644 index 0000000..7c01271 --- /dev/null +++ b/frontend/src/lib/help.ts @@ -0,0 +1,75 @@ +import { parse } from 'yaml' + +import type { ComponentType } from 'react' + +type ArticleLanguage = { + title: string + currentEdition: string } + +type ArticleMeta = { + identifier: string + canonicalLanguage: string + languages: Record } + +type MdxModule = { default: ComponentType } + + +const articleFiles = import.meta.glob ( + '../../help/*/article.yml', + { query: '?raw', import: 'default', eager: true, }) + +const editionFiles = import.meta.glob ('../../help/*/editions/*/*.mdx') + + +const cameliseArticle = (value: { + identifier: string + canonical_language: string + languages: Record }): ArticleMeta => ( + { identifier: value.identifier, + canonicalLanguage: value.canonical_language, + languages: Object.fromEntries ( + Object.entries (value.languages).map (([language, data]) => [ + language, + { title: data.title, + currentEdition: data.current_edition, }])) }) + + +export const getHelpArticle = (identifier: string): ArticleMeta | undefined => { + const path = `../../help/${identifier}/article.yml` + const source = articleFiles[path] + + if (!(source)) + return undefined + + return cameliseArticle (parse (source)) +} + + +export const getHelpEditions = ( + identifier: string, + language: string, +): string[] => { + const prefix = `../../help/${identifier}/editions/${language}/` + + return (Object.keys (editionFiles) + .filter (path => path.startsWith (prefix)) + .map (path => path.slice (prefix.length, -'.mdx'.length)) + .sort ()) +} + + +export const getHelpEdition = async ( + identifier: string, + language: string, + edition: string, +): Promise => { + const path = `../../help/${identifier}/editions/${language}/${edition}.mdx` + const loader = editionFiles[path] + + if (!(loader)) + return undefined + + return (await loader ()).default +} diff --git a/frontend/src/pages/help/HelpDetailPage.tsx b/frontend/src/pages/help/HelpDetailPage.tsx new file mode 100644 index 0000000..e69de29