Hatena::ブログ(Diary)

コンピュータ技術者になるための備忘録

ページビュー
293413
 | 

2016/04/11

[]UTF-8-CJKのPKGBUILDを作った

前書き

http://d.hatena.ne.jp/silenvx/20120929/1348930210
以前こんな記事を書いてcharmapsのUTF-8.gzを改造してUTF-8-CJK.gzを生成した
のはいいけど新しい環境に行くたびにやるのがめんどくさいんでPKGBUILD書いた

本文

https://github.com/silenvx/PKGBUILD.git
ここのutf-8-cjkにおいた

書くためにやったこと

まずUTF-8.gzがどんな方法で追加されてるのか調べる

% pkgfile UTF-8.gz
core/glibc

glibcでインストールされていることがわかったので生成方法を調べるためにソースコードをダウンロード

% yaourt -G glibc
% cd glibc
% makepkg -o
% cd src

次に生成に関連してそうなキーワードとして生成元のデータが書かれているEastAsianWidth.txtで検索

% find . -type f -exec grep -nH "EastAsianWidth.txt" {} +
./src/glibc/localedata/unicode-gen/utf8_gen.py:25:Usage: python3 utf8_gen.py UnicodeData.txt EastAsianWidth.txt
./src/glibc/localedata/unicode-gen/utf8_gen.py:205:    outfile.write('%        "grep \'^[^;]*;[WF]\' EastAsianWidth.txt"\n')
./src/glibc/localedata/unicode-gen/utf8_gen.py:220:    EastAsianWidth.txt
./src/glibc/localedata/unicode-gen/utf8_gen.py:231:        # If an entry in EastAsianWidth.txt is found, it overrides entries in
./src/glibc/localedata/unicode-gen/utf8_gen.py:252:        print("USAGE: python3 utf8_gen.py UnicodeData.txt EastAsianWidth.txt")
./src/glibc/localedata/unicode-gen/utf8_gen.py:267:                # the EastAsianWidth.txt file.
./src/glibc/localedata/unicode-gen/utf8_gen.py:277:            # Processing EastAsianWidth.txt and write WIDTH to UTF-8 file
./src/glibc/localedata/unicode-gen/utf8_compatibility.py:240:        help='The EastAsianWidth.txt file to read.')
./src/glibc/localedata/unicode-gen/Makefile:43:DOWNLOADS = UnicodeData.txt DerivedCoreProperties.txt EastAsianWidth.txt
./src/glibc/localedata/unicode-gen/Makefile:93:UTF-8: UnicodeData.txt EastAsianWidth.txt
./src/glibc/localedata/unicode-gen/Makefile:95: $(PYTHON3) utf8_gen.py UnicodeData.txt EastAsianWidth.txt
./src/glibc/localedata/unicode-gen/Makefile:100:        -e EastAsianWidth.txt -o ../charmaps/UTF-8 \
./src/glibc/localedata/charmaps/GB18030:88685:%        "grep '^[^;]*;[AWF]' EastAsianWidth.txt"
./src/glibc/localedata/charmaps/GB18030:88686:%   and  "grep '^[^;]*;[^AWF]' EastAsianWidth.txt"
./src/glibc/localedata/charmaps/UTF-8:43789:%        "grep '^[^;]*;[WF]' EastAsianWidth.txt"
./src/glibc/localedata/ChangeLog:69:    * unicode-gen/EastAsianWidth.txt: Likewise.
./src/glibc/localedata/ChangeLog:102:   (UTF-8-report): Reference UnicodeData.txt and EastAsianWidth.txt.
./src/glibc/localedata/ChangeLog:237:   * unicode-gen/EastAsianWidth.txt: New, from Unicode.
Binary file ./src/glibc/.git/index matches
./src/glibc/benchtests/strcoll-inputs/filelist#en_US.UTF-8:10925:EastAsianWidth.txt

ChangeLogは関係なさそうなので
./src/glibc/localedata/unicode-gen/のMakefileからutf8-gen.pyを呼び出してるのがわかる
Makefileを見たら

UTF-8: UnicodeData.txt EastAsianWidth.txt
UTF-8: utf8_gen.py
    $(PYTHON3) utf8_gen.py UnicodeData.txt EastAsianWidth.txt

これしかしてない
なのでutf8_gen.pyをmain関数から追って行くと

if re.match(r'^[^;]*;[WF]', LINE):

この部分で2文字分の幅の文字をhitさせていたのでAを追加して

if re.match(r'^[^;]*;[WFA]', LINE):

こんな感じにして実行したらうまい具合に動いたのでこれでおk
後はPKGBUILDを書くだけだけどglibcにpatch当てる形式じゃ毎回コンパイル糞みたいにかかる上に
システムのUTF-8.gzをいじるのは嫌だったので新たにUTF-8-CJK.gzを追加するようにした

 | 
Connection: close