diff --git a/README.ja-JP.md b/README.ja-JP.md index dee2e7b..c837d84 100644 --- a/README.ja-JP.md +++ b/README.ja-JP.md @@ -45,7 +45,7 @@ - 本アプリが比較するのは、一般的なゴシック体と明朝体における印刷字形だけです。手書きの慣習は対象外で、教科書体の例示字形も基準にしません。日本語の教科書体は主に日本語教育向けに設計され、中国大陸・香港・台湾・韓国と同じグリフプールを共有する正式な地域版がありません。見た目の近い別々のフォントを組み合わせると、地域差とフォント固有のデザイン差を分離できません。条件を揃えるため、5地域版を同時に提供する同系統のフォントファミリーだけを使います。 - 判定対象はSource Hanの地域別字形デザインであり、各地域の標準そのものではありません。ただし高品質な代理です。Adobeの地域別字形は、中国大陸の『印刷通用漢字字形表』、台湾教育部の『國字標準字體』、香港教育局の『常用字字形表』、日本のJIS X 0208/0213、韓国のKS X 1001/1002をそれぞれ根拠としています。 - Source Hanの香港字形は網羅的ではないため、「香港だけが異なる」パターンは少なく報告される可能性があります。 -- 画数は地域ごとに取得します。まずUnihanの `kAlternateTotalStrokes` を参照し、日本については次に `kRSAdobe_Japan1_6` を使います。これはAdobe-Japan1-6に収録された日本字形を分析するため、たとえば「突」は9画ではなく8画になります。どちらもない場合のみ `kTotalStrokes` を使います。最後の値は簡体・繁体の2区分しかなく、香港・台湾・日本・韓国は通常、繁体字側の値を共有します。たとえば「那」の5列の画数は6/6/6/7/6です。 +- 漢字表の絞り込み・並べ替えと詳細ページは、同じ地域別画数を使います。まず筆順データの実際の画数を採用し、香港は筆順機能と同じ同形フォールバックで台湾、中国大陸、日本、韓国の順に参照します。筆順データがない場合は `kAlternateTotalStrokes` → 日本の `kRSAdobe_Japan1_6` → `kTotalStrokes` の順に補います。たとえば「以」の5地域の画数は4/5/5/5/5です。 - 韓国語の読みにはUnihan推奨の `kHangul` を使い、現代ハングルの一音節読みをすべて保持します。語の文脈に応じた読みの選択や、頭音法則の追加導出は行いません。 - 未収録セルに表示するのは伝承字形の参考形であり、その地域で実際に採用または規範収録されていることを意味しません。「関係未確認」も、既存の公開情報だけでは関係を確定できないことを示します。 @@ -96,7 +96,7 @@ Cloudflareの **Settings → Domains & Routes** でproductionドメインを接 サードパーティ資産の具体的なcommit、公式添付ファイル識別子、SHA-256は `data/sources.lock.json` に記録しています。更新時には `pnpm update:sources` を実行します。バージョンのある上流データについてはバージョン番号を解決し、バージョンのない公式直リンクについては改めて検証します。内容が変わっていればlockfileを更新してデータを再生成し、まったく変わっていなければ生成をスキップします。ビルド時の `pnpm build:data` はlockfileに従い、約 **261 MiB** の元データをダウンロードして検証します。このうち195 MiBは10個のNoto CJKフォントです。明示的な更新を行っていない直リンクの内容が変わった場合は、チェックサム不一致として失敗し、黙ってデータに取り込むことはありません。Actionsでは元データのダウンロードと生成フォントを別々にキャッシュします。前者はlockfileだけで決まり、後者はlockfile、実際の生成スクリプト、関連依存関係、locale、字表から決まります。フォント入力が完全に同じ場合は、データ生成を省略します。 -筆順シャードは `pnpm build:dataset` が `app/assets/strokes/` に生成し、リポジトリにはコミットしません。デプロイ処理はテストと静的生成の前に毎回再生成し、Viteが内容ハッシュ付きのファイル名で出力します。付属ライセンスは `public/notices/` の安定URLに置き、再検証を必須にします。同じ字グループ内で筆画順に並べた輪郭が完全に一致する場合は、最初のバリアントとその中心線だけを保存し、画面上でも対応する地域を1つの選択肢にまとめます。ページ読み込み時に所属シャードを一度だけ取得し、その後の地域切替ではメモリ上の字グループデータを再利用します。 +筆順シャードは `pnpm build:dataset` が `app/assets/strokes/` に生成し、リポジトリにはコミットしません。デプロイ処理はテストと静的生成の前に毎回再生成し、Viteが内容ハッシュ付きのファイル名で出力します。付属ライセンスは `public/notices/` の安定URLに置き、再検証を必須にします。同じ字グループ内で筆画順に並べた輪郭が完全に一致する場合は、最初のバリアントとその中心線だけを保存し、画面上でも対応する地域を1つの選択肢にまとめます。ページ読み込み時に所属シャードを一度だけ取得し、その後の地域切替ではメモリ上の字グループデータを再利用します。サイト全体で、ここから解析した輪郭数を第一候補の画数として使います。 ローカルでも、ビルド後に直接アップロードできます。 @@ -115,9 +115,9 @@ pnpm deploy | 5地域の字形差異の判定 | [Adobe Source Han Sans / Serif(CMapリソース)](https://github.com/adobe-fonts/source-han-sans) | [SIL OFL 1.1](https://openfontlicense.org/) | | ページ表示用フォント | [Noto Sans / Noto Serif(CJKを含む)](https://github.com/notofonts/noto-cjk) | [SIL OFL 1.1](https://openfontlicense.org/) | | 簡体・繁体、香港・台湾異体字、日本新旧字体の対応 | [OpenCC(中国語文字変換)](https://github.com/BYVoid/OpenCC) | [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| 中国・台湾・日本・韓国の筆順アニメーション | [AnimCJK](https://github.com/parsimonhi/animCJK) | [Arphic Public License](https://github.com/parsimonhi/animCJK/blob/master/licenses/APL/english/ARPHICPL.TXT) | +| 中国・台湾・日本・韓国の筆順と画数 | [AnimCJK](https://github.com/parsimonhi/animCJK) | [Arphic Public License](https://github.com/parsimonhi/animCJK/blob/master/licenses/APL/english/ARPHICPL.TXT) | | 5地域の標準字表 | [zispace/hanzi-chars](https://github.com/zispace/hanzi-chars) | [リポジトリに記載なし](https://github.com/zispace/hanzi-chars) | -| 画数・読み | [Unicode Han Database(Unihan)](https://www.unicode.org/reports/tr38/) | [Unicode License v3](https://www.unicode.org/license.txt) | +| 画数の補完・読み | [Unicode Han Database(Unihan)](https://www.unicode.org/reports/tr38/) | [Unicode License v3](https://www.unicode.org/license.txt) | | 韓国式異体字の対応 | [Unicode IRG N2200(韓国教育用漢字提案)](https://www.unicode.org/L2/L2017/17173-irgn2200-unihan-db.pdf) | [Unicode License v3](https://www.unicode.org/license.txt) | | 中国大陸の文字頻度順位 | [hanziDB.csv(Jun Da『現代中国語単字頻度一覧』)](https://github.com/ruddfawcett/hanziDB.csv) | [MIT](https://opensource.org/licenses/MIT) | | 香港の文字頻度順位 | [粵典「コーパス単字使用頻度」](https://words.hk/faiman/analysis/charcount/) | [Public Domain](https://words.hk/faiman/analysis/) | diff --git a/README.md b/README.md index 2952f7a..54cef75 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ - 本应用只比较通用黑体与宋体中的印刷字形,不涵盖手写习惯,也不以教科书体的示范字形为准。日语教科书体主要为日语教学设计,并没有与中、港、台、韩共享同一字形池的正式地区版本;若拼接风格相近但来源不同的字体,地区差异与字体自身的设计差异就无法分开。为了控制变量,本应用只能选用同时提供五地版本的同源字体系列。 - 判定的对象是 Source Han 的地区字形设计,不是各地标准本身。它是个高质量的代理——Adobe 的地区字形分别依据大陆《印刷通用汉字字形表》、台湾教育部《國字標準字體》、香港教育局《常用字字形表》、日本 JIS X 0208/0213、韩国 KS X 1001/1002。 - Source Han 的香港字形覆盖并不完整,「只有香港不同」这一类可能少报。 -- 笔画数逐地区取:先看 Unihan 的 `kAlternateTotalStrokes`,日本再退到 `kRSAdobe_Japan1_6`(它分析的是 Adobe-Japan1-6 收的日本字形,所以 突 是 8 画而不是 9 画),都没有才用 `kTotalStrokes`。后者只区分简繁两档,港台日韩通常共用繁体值;例如 那 的五列笔画数是 6/6/6/7/6。 +- 字表筛选、排序与详情页共用同一套地区笔画数:先取笔顺数据的实际笔画数;香港沿用笔顺功能的同形回退,依次尝试台湾、大陆、日本、韩国。没有笔顺数据时,再按 `kAlternateTotalStrokes` → 日本的 `kRSAdobe_Japan1_6` → `kTotalStrokes` 顺延。例如 以 的五地笔画数是 4/5/5/5/5。 - 韩语读音取 Unihan 推荐的 `kHangul`,保留全部现代韩文单字音;它不根据词语语境替用户选择读音,也不另行推导头音法则。 - 未收录格显示的是传承参考形,不表示该地区实际采用或规范收录该形;“关系未确认”同样表示现有公开来源不足以裁决。 @@ -96,7 +96,7 @@ Cloudflare Worker 名称须为 `hanji`,与 `wrangler.json` 中的 `name` 一 第三方资产的具体 commit、官方附件标识与 SHA-256 记录在 `data/sources.lock.json`;需要升级时运行 `pnpm update:sources`。它会解析有版本上游的版本号,并重新校验没有版本号的官方直链;内容有变化时更新 lockfile 并直接重新生成数据,完全未变则跳过生成。构建时 `pnpm build:data` 会按 lockfile 下载并校验约 **261 MiB** 原始数据(其中 195 MiB 是十份 Noto CJK 字体);任何未显式更新的直链内容变化都会因校验和不符而失败,不会静默进入数据。Actions 分开缓存原始下载与生成字体:前者只由 lockfile 决定,后者由 lockfile、实际生成脚本、相关依赖、locale 与字表决定;字体输入完全不变时跳过数据生成。 -笔顺分片由 `pnpm build:dataset` 生成到 `app/assets/strokes/`,不提交到仓库;部署流程会在测试和静态生成前重建,再由 Vite 输出带内容哈希的文件名。随附授权保留在 `public/notices/` 的稳定 URL 下并要求重新验证。同一字组内,按笔画顺序排列的轮廓完全一致时只保存第一份变体及其中线,界面也把对应地区合并为一个选择项;页面加载时只获取一次所属分片,之后切换地区直接复用内存中的字组数据。 +笔顺分片由 `pnpm build:dataset` 生成到 `app/assets/strokes/`,不提交到仓库;部署流程会在测试和静态生成前重建,再由 Vite 输出带内容哈希的文件名。随附授权保留在 `public/notices/` 的稳定 URL 下并要求重新验证。同一字组内,按笔画顺序排列的轮廓完全一致时只保存第一份变体及其中线,界面也把对应地区合并为一个选择项;页面加载时只获取一次所属分片,之后切换地区直接复用内存中的字组数据。整站使用这里解析出的轮廓数量作为首选笔画数。 本地也可构建后直传: @@ -115,9 +115,9 @@ pnpm deploy | 判定五地字形差异 | [Adobe Source Han Sans / Serif(CMap 资源)](https://github.com/adobe-fonts/source-han-sans) | [SIL OFL 1.1](https://openfontlicense.org/) | | 页面展示用字体 | [Noto Sans / Noto Serif(含 CJK)](https://github.com/notofonts/noto-cjk) | [SIL OFL 1.1](https://openfontlicense.org/) | | 简繁、港台异体、日本新旧字体对应 | [OpenCC 开放中文转换](https://github.com/BYVoid/OpenCC) | [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) | -| 中、台、日、韩笔顺动画 | [AnimCJK](https://github.com/parsimonhi/animCJK) | [Arphic Public License](https://github.com/parsimonhi/animCJK/blob/master/licenses/APL/english/ARPHICPL.TXT) | +| 中、台、日、韩笔顺动画与笔画数 | [AnimCJK](https://github.com/parsimonhi/animCJK) | [Arphic Public License](https://github.com/parsimonhi/animCJK/blob/master/licenses/APL/english/ARPHICPL.TXT) | | 五地标准字表 | [zispace/hanzi-chars](https://github.com/zispace/hanzi-chars) | [仓库未声明](https://github.com/zispace/hanzi-chars) | -| 笔画数、读音 | [Unicode Han Database (Unihan)](https://www.unicode.org/reports/tr38/) | [Unicode License v3](https://www.unicode.org/license.txt) | +| 笔画数回退、读音 | [Unicode Han Database (Unihan)](https://www.unicode.org/reports/tr38/) | [Unicode License v3](https://www.unicode.org/license.txt) | | 韩式异体对应 | [Unicode IRG N2200(韩国教育用汉字提案)](https://www.unicode.org/L2/L2017/17173-irgn2200-unihan-db.pdf) | [Unicode License v3](https://www.unicode.org/license.txt) | | 大陆字频排名 | [hanziDB.csv(Jun Da《现代汉语单字频率列表》)](https://github.com/ruddfawcett/hanziDB.csv) | [MIT](https://opensource.org/licenses/MIT) | | 香港字频排名 | [粵典「語料庫單字使用頻率」](https://words.hk/faiman/analysis/charcount/) | [Public Domain](https://words.hk/faiman/analysis/) | diff --git a/app/components/CharRowItem.vue b/app/components/CharRowItem.vue index 07b549d..799c14b 100644 --- a/app/components/CharRowItem.vue +++ b/app/components/CharRowItem.vue @@ -16,17 +16,6 @@ const props = defineProps<{ const morphing = useMorphingKey() const morphTo = useMorphTo() const route = useRoute() -const { regionIndices } = useColumnVisibility() - -/** - * The stroke counts the row leads with: the first column on show, and the - * second only where it disagrees. Reading them off fixed regions would keep - * quoting a column the reader has taken off the page. - */ -const strokes = computed(() => { - const [first, second] = regionIndices.value.map((i) => props.row.strokes[i]) - return { first, second: second !== first ? second : undefined } -}) /** * Opening a row records where the reader was standing in the list, which is @@ -65,12 +54,5 @@ async function open(event: MouseEvent) { - -
- {{ strokes.first }} - - /{{ strokes.second }} - -
diff --git a/app/components/CharTable.vue b/app/components/CharTable.vue index 5ed1cba..7721d79 100644 --- a/app/components/CharTable.vue +++ b/app/components/CharTable.vue @@ -11,11 +11,11 @@ const headerViewport = ref() /** * Narrow screens scroll instead of crushing the regional forms together. The - * fixed allowance covers the overprint thumbnail, stroke count, gaps and row - * padding; every visible region then keeps a comfortable character column. + * fixed allowance covers the overprint thumbnail, gaps and row padding; every + * visible region then keeps a comfortable character column. */ const tableMinWidth = computed( - () => `${visibleRegions.value.length * 4.5 + 10.75}rem`, + () => `${visibleRegions.value.length * 4.5 + 8}rem`, ) /** Keep the sticky header aligned with the horizontally moving data rows. */ @@ -53,7 +53,6 @@ function turnTo(page: number) { > - {{ t('table.strokes') }} diff --git a/app/components/FilterBar.vue b/app/components/FilterBar.vue index 7066b7e..5af0c25 100644 --- a/app/components/FilterBar.vue +++ b/app/components/FilterBar.vue @@ -1,7 +1,7 @@