forked from kudryavka/Ricty
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcalt_table_maker.sh
executable file
·6690 lines (5608 loc) · 319 KB
/
calt_table_maker.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#!/bin/bash
# GSUB calt table maker for Cyroit, Meroit and Soroit
#
# Copyright (c) 2023 omonomo
#
# GSUB calt フィーチャテーブル作成プログラム
#
# font_generator にて、条件成立時に呼び出す異体字変換テーブルが生成済みであること
# また uvs_table_maker にて GSUB のリストファイルが生成済みであること
# ログをファイル出力させる場合は有効にする (<< "#LOG" をコメントアウトさせる)
<< "#LOG"
LOG_OUT=/tmp/calt_table_maker.log
LOG_ERR=/tmp/calt_table_maker_err.log
exec 1> >(tee -a $LOG_OUT)
exec 2> >(tee -a $LOG_ERR)
#LOG
glyphNo="15000" # calt用異体字の先頭glyphナンバー (仮)
listNo="-1"
optimizeListNo="4" # -o -O オプションが設定してある場合、指定の listNo 以下は最適化ルーチンを実行する
caltListName="caltList" # caltテーブルリストの名称
caltList="${caltListName}_${listNo}" # Lookupごとのcaltテーブルリスト
dict="dict" # 略字をグリフ名に変換する辞書
gsubList="gsubList" # 作成フォントのGSUBから抽出した置き換え用リスト
checkListName="checkList" # 設定の重複を避けるためのリストの名称
tmpdir_name="calt_table_maker_tmpdir" # 一時保管フォルダ名
karndir_name="karningSettings" # カーニング設定の保存フォルダ名
karnsetdir_name="" # 各カーニング設定と calt_table_maker 情報の保存フォルダ名
fileDataName="fileData" # calt_table_maker のサイズと変更日を保存するファイル名
# lookup の IndexNo. (GSUBを変更すると変わる可能性あり)
lookupIndex_calt="18" # caltテーブルのlookupナンバー
num_calt_lookups="20" # calt のルックアップ数
lookupIndex_replace=$((lookupIndex_calt + num_calt_lookups)) # 単純置換のlookupナンバー
lookupIndexRR=${lookupIndex_replace} # 変換先(右に移動させた記号のグリフ)
lookupIndexLL=$((lookupIndexRR + 1)) # 変換先(左に移動させた記号のグリフ)
lookupIndexUD=$((lookupIndexLL + 1)) # 変換先(上下に移動させた記号のグリフ)
lookupIndex0=$((lookupIndexUD + 1)) # 変換先(小数のグリフ)
lookupIndex2=$((lookupIndex0 + 1)) # 変換先(12桁マークを付けたグリフ)
lookupIndex4=$((lookupIndex2 + 1)) # 変換先(4桁マークを付けたグリフ)
lookupIndex3=$((lookupIndex4 + 1)) # 変換先(3桁マークを付けたグリフ)
lookupIndexR=$((lookupIndex3 + 1)) # 変換先(右に移動させたグリフ)
lookupIndexL=$((lookupIndexR + 1)) # 変換先(左に移動させたグリフ)
lookupIndexN=$((lookupIndexL + 1)) # 変換先(ノーマルなグリフに戻す)
leaving_tmp_flag="false" # 一時ファイル残す
basic_only_flag="false" # 基本ラテン文字のみ
symbol_only_flag="false" # 記号、桁区切りのみ
optimize_mode="void" # なんちゃって最適化ルーチンのモード (void: 実行しない、optional: 任意のみ、force: 強制)
glyphNo_flag="false" # glyphナンバーの指定があるか
# エラー処理
trap "exit 3" HUP INT QUIT
# [@]なしで 同じ基底文字のバリエーション (例: A À Á...) を取得する関数 ||||||||||||||||||||||||||||||||||||||||
letter_members() {
local class # 基底文字
class=(${2})
if [ -n "${class}" ]; then
class=(${class[@]/#/\$\{}) # 先頭に ${ を付加
class=(${class[@]/%/[@]\}}) # 末尾に [@]} を付加
eval "${1}=(${class[@]})" # 戻り値を入れる変数名を1番目の引数に指定する
fi
}
# Lookup を追加するための前処理をする関数 ||||||||||||||||||||||||||||||||||||||||
pre_add_lookup() {
listNo=$((listNo + 1))
caltList="${caltListName}_${listNo}"
{
echo "<LookupType value=\"6\"/>"
echo "<LookupFlag value=\"0\"/>"
} >> "${caltList}.txt"
index="0"
if [ ${listNo} -le ${optimizeListNo} ]; then # 最適化する listNo の場合、チェックリストを削除
rm -f ${tmpdir}/${checkListName}*.txt # (デバッグで使えるかもしれないため最後のチェックリストは残す)
fi
}
# グリフの略号を通し番号と名前に変換する関数 ||||||||||||||||||||||||||||||||||||||||
glyph_name() {
echo $(grep -m 1 " ${1} " "${tmpdir}/${dict}.txt" | cut -d ' ' -f 1,3)
}
# グリフの通し番号と名前を backtrack、input、lookAhead の XML に変換する関数 ||||||||||||||||||||||||||||||||||||||||
glyph_value() {
sort -n -u "${1}" | cut -d ' ' -f 2 | sed -E 's/([0-9a-zA-z]+)/<Glyph value="\1"\/>/g' # ソートしないとttxにしかられる
}
# LookupType 6 を作成するための関数 ||||||||||||||||||||||||||||||||||||||||
chain_context() {
local optim optimCheck # 最適化を実行するか (optional の場合、0: 実行、1: データベース作成のみ、2: 完全スキップ)
local substIndex # 設定番号
local backtrack bt addBt removeBt # 1文字前
local input ip removeIp # 入力
local lookAhead la addLa removeLa # 1文字後
local lookupIndex # ジャンプする(グリフを置換する)テーブル番号
local backtrack1 bt1 # 2文字前
local lookAhead1 la1 # 2文字後
local lookAheadX laX # 3文字後以降
local aheadMax # lookAheadのIndex2以降はその数(最大のIndexNo)を入れる(当然内容は全て同じになる)
local overlap # 全ての設定が重複しているか
local S T line0 line1
optim="${1}"
substIndex="${3}"
backtrack=(${4})
input=(${5})
lookAhead=(${6})
lookupIndex="${7}"
backtrack1=(${8})
lookAhead1=(${9})
lookAheadX=(${10})
aheadMax="${11}"
for S in ${fixedGlyphL[@]} ${fixedGlyphR[@]} ${fixedGlyphN[@]}; do
input=(${input[@]//${S}/}) # input から移動しないグリフを削除
done
<< "#SUPPLEMENT" # 設定漏れを補完 (処理に時間がかかりすぎるため通常は無効) ====================
S=${input: -1} # input と lookupIndex から文字がどちらに移動しようとしているか判定
bt=(${backtrack[@]})
la=(${lookAhead[@]})
if [ "${S}" == "N" ]; then
if [ "${lookupIndex}" == "${lookupIndexL}" ]; then
T="moveLeft"
elif [ "${lookupIndex}" == "${lookupIndexR}" ]; then
T="moveRight"
else
T="doNotMove"
fi
elif [ "${S}" == "R" ]; then
if [ "${lookupIndex}" == "${lookupIndexL}" ] || [ "${lookupIndex}" == "${lookupIndexN}" ]; then
T="moveLeft"
else
T="doNotMove"
fi
else
if [ "${lookupIndex}" == "${lookupIndexN}" ] || [ "${lookupIndex}" == "${lookupIndexR}" ]; then
T="moveRight"
else
T="doNotMove"
fi
fi
if [ "${T}" == "moveLeft" ]; then # 左に移動する場合、L と N を追加
if [ -n "${backtrack}" ]; then
U=(${backtrack[@]/%R/N})
V=(${U[@]/%N/L})
backtrack=(${backtrack[@]} ${U[@]} ${V[@]})
fi
if [ -n "${lookAhead}" ] && [ ${listNo} -gt 0 ]; then # listNo が1以上だと lookAhead についても L と N を追加
U=(${lookAhead[@]/%R/N})
V=(${U[@]/%N/L})
lookAhead=(${lookAhead[@]} ${U[@]} ${V[@]})
fi
elif [ "${T}" == "moveRight" ]; then # 右に移動する場合 R と N を追加
if [ -n "${backtrack}" ]; then
U=(${backtrack[@]/%L/N})
V=(${U[@]/%N/R})
backtrack=(${backtrack[@]} ${U[@]} ${V[@]})
fi
if [ -n "${lookAhead}" ] && [ ${listNo} -gt 0 ]; then
U=(${lookAhead[@]/%L/N})
V=(${U[@]/%N/R})
lookAhead=(${lookAhead[@]} ${U[@]} ${V[@]})
fi
fi
addBt=(${backtrack[@]}) # 追加した設定を抽出
for S in ${bt[@]}; do
addBt=(${addBt[@]//${S}/})
done
if [ -n "${addBt}" ]; then
addBt=$(printf '%s\n' "${addBt[@]}" | sort -u | tr '\n' ' ')
echo "Add backtrack setting ${addBt//_/}"
fi
addLa=(${lookAhead[@]})
for S in ${la[@]}; do
addLa=(${addLa[@]//${S}/})
done
if [ -n "${addLa}" ]; then
addLa=$(printf '%s\n' "${addLa[@]}" | sort -u | tr '\n' ' ')
echo "Add lookAhead setting ${addLa//_/}"
fi
#SUPPLEMENT
# 重複している配列要素を削除 ====================
input=($(printf '%s\n' "${input[@]}" | sort -u))
backtrack=($(printf '%s\n' "${backtrack[@]}" | sort -u))
lookAhead=($(printf '%s\n' "${lookAhead[@]}" | sort -u))
backtrack1=($(printf '%s\n' "${backtrack1[@]}" | sort -u))
lookAhead1=($(printf '%s\n' "${lookAhead1[@]}" | sort -u))
lookAheadX=($(printf '%s\n' "${lookAheadX[@]}" | sort -u))
# 重複している設定を削除 ====================
if [ ${listNo} -le ${optimizeListNo} ]; then # 指定の listNo 以下で
if [ "${optimize_mode}" == "force" ] || \
[[ "${optimize_mode}" == "optional" && ${optim} -le 1 ]]; then # 最適化を実行する場合
optimCheck=0
# input --------------------
unset removeIp
for S in ${input[@]}; do # input の各グリフについて調査
rm -f ${tmpdir}/${checkListName}*.tmp.txt
overlap="true"
if [ -n "${backtrack}" ]; then bt="${backtrack[@]}"; else bt="@"; fi # eval とブレース展開を利用して順列を生成する
bt=${bt// /,}
if [ -n "${lookAhead}" ]; then la="${lookAhead[@]}"; else la="@"; fi
la=${la// /,}
if [ "${optimize_mode}" == "force" ] || [ ${optim} -eq 0 ]; then # 最適化処理を実行する場合
eval echo ${S}{${bt}}"@" | tr -d '{}' | tr ' ' '\n' >> "${tmpdir}/${checkListName}.short.backOnly.tmp.txt" # lookAhead が無い設定のチェック用に保存
eval echo ${S}"@"{${la}} | tr -d '{}' | tr ' ' '\n' >> "${tmpdir}/${checkListName}.short.aheadOnly.tmp.txt" # backtrack が無い設定のチェック用に保存
fi
eval echo ${S}{${bt}}{${la}} | tr -d '{}' | tr ' ' '\n' >> "${tmpdir}/${checkListName}.short.tmp.txt" # 前後2文字以上を省いた文字列を保存
if [ -n "${backtrack1}" ]; then bt1="${backtrack1[@]}"; else bt1="@"; fi
bt1=${bt1// /,}
if [ -n "${lookAhead1}" ]; then la1="${lookAhead1[@]}"; else la1="@"; fi
la1=${la1// /,}
if [ -n "${lookAheadX}" ]; then laX="${lookAheadX[@]}"; else laX="@"; fi
laX=${laX// /,}
if [ "${bt1}${la1}${laX}" != "@@@" ]; then
eval echo ${S}{${bt}}{${la}}{${bt1}}{${la1}}{${laX}} | tr -d '{}' | tr ' ' '\n' >> "${tmpdir}/${checkListName}.long.tmp.txt" # 前後2文字以上も含めた文字列を保存
fi
if [ "${optimize_mode}" == "optional" ] && [ ${optim} -ne 0 ]; then # 最適化処理をスキップする場合
overlap="false" # 無条件でチェックリストに追加
if [ -e "${tmpdir}/${checkListName}.long.tmp.txt" ]; then
cat "${tmpdir}/${checkListName}.long.tmp.txt" >> "${tmpdir}/${checkListName}Long${S}.txt"
else
cat "${tmpdir}/${checkListName}.short.tmp.txt" >> "${tmpdir}/${checkListName}Short${S}.txt"
fi
else # "${optimize_mode}" == "optional" && ${optim} -ne 0
if [[ ! -e "${tmpdir}/${checkListName}Short${S}.txt" ]]; then # 既設定ファイルがない場合は空のファイルを作成
:>| "${tmpdir}/${checkListName}Short${S}.txt"
fi
while read line0; do # 前後1文字のみで lookAhead が無い設定がすでに存在しないかチェック
if [ -z "$(grep -x -m 1 "${line0}" "${tmpdir}/${checkListName}Short${S}.txt")" ]; then
while read line1; do # lookAhead が無い設定に抜けがあった場合、前後1文字のみで backtrack が無い設定がすでに存在しないかチェック
if [ -z "$(grep -x -m 1 "${line1}" "${tmpdir}/${checkListName}Short${S}.txt")" ]; then
overlap="false" # backtrack と lookAhead の両方に重複していない設定があればフラグを立てて break
break 2
fi # -z "${grep (backtrack 無し)
done < "${tmpdir}/${checkListName}.short.aheadOnly.tmp.txt"
fi # -z "${grep (lookAhead 無し)
done < "${tmpdir}/${checkListName}.short.backOnly.tmp.txt" # backtrack か lookAhead 無しの設定のいずれかが全て重複していた場合、スルー
if [ "${overlap}" == "false" ]; then # backtrack と lookAhead 両方の設定に抜けがあった場合追試
overlap="true"
while read line0; do
if [ -z "$(grep -x -m 1 "${line0}" "${tmpdir}/${checkListName}Short${S}.txt")" ]; then # 前後1文字のみで重複する設定がないかチェック
if [ -e "${tmpdir}/${checkListName}.long.tmp.txt" ]; then # 重複していない設定があった場合、前後2文字以上参照する設定の場合は追試
if [[ ! -e "${tmpdir}/${checkListName}Long${S}.txt" ]]; then # 既設定ファイルがない場合は空のファイルを作成
:>| "${tmpdir}/${checkListName}Long${S}.txt"
fi
while read line1; do
if [ -z "$(grep -x -m 1 "${line1}" "${tmpdir}/${checkListName}Long${S}.txt")" ]; then # 前後2文字以上で重複する設定がないかチェック
overlap="false" # 重複していない設定があればチェックリストに追加して break
cat "${tmpdir}/${checkListName}.long.tmp.txt" >> "${tmpdir}/${checkListName}Long${S}.txt"
break 2
fi # -z "${grep (前後2文字以上)
done < "${tmpdir}/${checkListName}.long.tmp.txt"
else # -e "${tmpdir}/${checkListName}.long.tmp.txt" 前後1文字のみ参照の場合、追試なしでチェックリストに追加して break
overlap="false"
cat "${tmpdir}/${checkListName}.short.tmp.txt" >> "${tmpdir}/${checkListName}Short${S}.txt"
fi # -e "${tmpdir}/${checkListName}.long.tmp.txt"
break
fi # -z "${grep (前後1文字のみ)
done < "${tmpdir}/${checkListName}.short.tmp.txt" # 重複する設定がない場合、スルー
fi
if [ "${overlap}" == "true" ]; then # すでに設定が全て存在していた場合、input から重複したグリフを削除
input=(${input[@]/${S}/})
removeIp+=" ${S}"
fi
fi # "${optimize_mode}" == "optional" && ${optim} -ne 0
done # S
if [ -n "${removeIp}" ]; then
echo "Remove input setting${removeIp//_/}"
optimCheck=$((optimCheck + 1)) # 最適化が有効なので + 1
fi
if [ -z "${input}" ]; then # input のグリフが全て重複していた場合、設定を追加せず ruturn
echo "Removed all settings, skip ${caltList} index ${substIndex}: Lookup = ${lookupIndex}"
eval "${2}=\${substIndex}" # 戻り値を入れる変数名を1番目の引数に指定する
return
fi
# backtrack --------------------
unset removeBt
if [ -n "${backtrack}" ]; then # backtrack がある場合
for S in ${backtrack[@]}; do # backtrack の各グリフについて調査
rm -f ${tmpdir}/${checkListName}*.tmp.txt
overlap="true"
ip="${input[@]}"
ip=${ip// /,}
if [ "${optimize_mode}" == "force" ] || [ ${optim} -eq 0 ]; then # 最適化処理を実行する場合
eval echo ${S}{${ip}}"@@@@" | tr -d '{}' | tr ' ' '\n' >> "${tmpdir}/${checkListName}.backOnly.tmp.txt" # lookAhead がない設定のチェック用に保存
fi
if [ -n "${lookAhead}" ]; then la="${lookAhead[@]}"; else la="@"; fi
la=${la// /,}
if [ -n "${backtrack1}" ]; then bt1="${backtrack1[@]}"; else bt1="@"; fi
bt1=${bt1// /,}
if [ -n "${lookAhead1}" ]; then la1="${lookAhead1[@]}"; else la1="@"; fi
la1=${la1// /,}
if [ -n "${lookAheadX}" ]; then laX="${lookAheadX[@]}"; else laX="@"; fi
laX=${laX// /,}
eval echo ${S}{${ip}}{${la}}{${bt1}}{${la1}}{${laX}} | tr -d '{}' | tr ' ' '\n' >> "${tmpdir}/${checkListName}.back.tmp.txt" # 前後2文字以上も含めた文字列を保存
if [ "${optimize_mode}" == "optional" ] && [ ${optim} -ne 0 ]; then # 最適化処理をスキップする場合
overlap="false" # 無条件でチェックリストに追加
cat "${tmpdir}/${checkListName}.back.tmp.txt" >> "${tmpdir}/${checkListName}Back${S}.txt"
else # "${optimize_mode}" == "optional" && ${optim} -ne 0
if [[ ! -e "${tmpdir}/${checkListName}Back${S}.txt" ]]; then # 既設定ファイルが無い場合は空のファイルを作成
:>| "${tmpdir}/${checkListName}Back${S}.txt"
fi
while read line0; do
if [ -z "$(grep -x -m 1 "${line0}" "${tmpdir}/${checkListName}Back${S}.txt")" ]; then # lookAhead が無い設定がすでに存在しないかチェック
while read line1; do # lookAhead が無い設定に抜けがあった場合追試
if [ -z "$(grep -x -m 1 "${line1}" "${tmpdir}/${checkListName}Back${S}.txt")" ]; then # 重複する設定がないかチェック
overlap="false" # 重複していない設定があった場合チェックリストに追加して break
cat "${tmpdir}/${checkListName}.back.tmp.txt" >> "${tmpdir}/${checkListName}Back${S}.txt"
break 2
fi # -z "${T}" (重複する設定)
done < "${tmpdir}/${checkListName}.back.tmp.txt" # 重複する設定が無い場合、何もせずに break
break
fi # -z "${grep (lookAhead が無い)
done < "${tmpdir}/${checkListName}.backOnly.tmp.txt" # すでに lookAhead が無い設定が全て存在した場合、スルー
if [ "${overlap}" == "true" ]; then # すでに設定が全て存在していた場合、backtrack から重複したグリフを削除
backtrack=(${backtrack[@]/${S}/})
removeBt+=" ${S}"
fi
fi # "${optimize_mode}" == "optional" && ${optim} -ne 0
done # S
if [ -n "${removeBt}" ]; then
echo "Remove backtrack setting${removeBt//_/}"
if [ " ${addBt}" == "${removeBt} " ]; then # 設定漏れ補完で追加したグリフと最適化で除去したグリフが同じ場合
echo "Added and removed backtrack settings are the same"
elif [ -n "${addBt}" ]; then # 異なる場合
for S in ${removeBt}; do
addBt=${addBt//${S}/}
done
printf "Difference in backtrack settings: %s\n" "$(echo ${addBt//_/} | tr -s "[:space:]")"
fi
optimCheck=$((optimCheck + 1)) # 最適化が有効なので + 1
fi
if [ "${bt}" != "|" ] && [ -z "${backtrack}" ]; then # backtrack のグリフが全て重複していた場合、設定を追加せず ruturn
echo "Removed all settings, skip ${caltList} index ${substIndex}: Lookup = ${lookupIndex}"
eval "${2}=\${substIndex}" # 戻り値を入れる変数名を1番目の引数に指定する
return
fi
fi # -n "${backtrack}"
# lookAhead --------------------
unset removeLa
if [ -n "${lookAhead}" ]; then # lookAhead がある場合
for S in ${lookAhead[@]}; do # lookAhead の各グリフについて調査
rm -f ${tmpdir}/${checkListName}*.tmp.txt
overlap="true"
ip="${input[@]}"
ip=${ip// /,}
if [ "${optimize_mode}" == "force" ] || [ ${optim} -eq 0 ]; then # 最適化処理を実行する場合
eval echo ${S}{${ip}}"@@@@" | tr -d '{}' | tr ' ' '\n' >> "${tmpdir}/${checkListName}.aheadOnly.tmp.txt" # backtrack が無い設定のチェック用に保存
fi
if [ -n "${backtrack}" ]; then bt="${backtrack[@]}"; else bt="@"; fi
bt=${bt// /,}
if [ -n "${backtrack1}" ]; then bt1="${backtrack1[@]}"; else bt1="@"; fi
bt1=${bt1// /,}
if [ -n "${lookAhead1}" ]; then la1="${lookAhead1[@]}"; else la1="@"; fi
la1=${la1// /,}
if [ -n "${lookAheadX}" ]; then laX="${lookAheadX[@]}"; else laX="@"; fi
laX=${laX// /,}
eval echo ${S}{${ip}}{${bt}}{${bt1}}{${la1}}{${laX}} | tr -d '{}' | tr ' ' '\n' >> "${tmpdir}/${checkListName}.ahead.tmp.txt" # 前後2文字以上も含めた文字列を保存
if [ "${optimize_mode}" == "optional" ] && [ ${optim} -ne 0 ]; then # 最適化処理をスキップする場合
overlap="false" # 無条件でチェックリストに追加
cat "${tmpdir}/${checkListName}.ahead.tmp.txt" >> "${tmpdir}/${checkListName}Ahead${S}.txt"
else # "${optimize_mode}" == "optional" && ${optim} -ne 0
if [[ ! -e "${tmpdir}/${checkListName}Ahead${S}.txt" ]]; then # 既設定ファイルが無い場合は空のファイルを作成
:>| "${tmpdir}/${checkListName}Ahead${S}.txt"
fi
while read line0; do
if [ -z "$(grep -x -m 1 "${line0}" "${tmpdir}/${checkListName}Ahead${S}.txt")" ]; then # backtrack が無い設定がすでに存在しないかチェック
while read line1; do # backtrack が無い設定に抜けがあった場合追試
if [ -z "$(grep -x -m 1 "${line1}" "${tmpdir}/${checkListName}Ahead${S}.txt")" ]; then # 重複する設定がないかチェック
overlap="false" # 重複してい無い設定があった場合チェックリストに追加して break
cat "${tmpdir}/${checkListName}.ahead.tmp.txt" >> "${tmpdir}/${checkListName}Ahead${S}.txt"
break 2
fi # -z "${grep (重複する設定)
done < "${tmpdir}/${checkListName}.ahead.tmp.txt" # 重複する設定が無い場合、何もせずに break
break
fi # -z "${grep (lookAhead が無い)
done < "${tmpdir}/${checkListName}.aheadOnly.tmp.txt" # すでに backtrack が無い設定が全て存在した場合、スルー
if [ "${overlap}" == "true" ]; then # すでに設定が全て存在していた場合、lookAhead から重複したグリフを削除
lookAhead=(${lookAhead[@]/${S}/})
removeLa+=" ${S}"
fi
fi # "${optimize_mode}" == "optional" && ${optim} -ne 0
done # S
if [ -n "${removeLa}" ]; then
echo "Remove lookAhead setting${removeLa//_/}"
if [ " ${addLa}" == "${removeLa} " ]; then # 設定漏れ補完で追加したグリフと最適化で除去したグリフが同じ場合
echo "Added and removed lookAhead settings are the same"
elif [ -n "${addLa}" ]; then # 異なる場合
for S in ${removeLa}; do
addLa=${addLa//${S}/}
done
printf "Difference in lookAhead settings: %s\n" "$(echo ${addLa//_/} | tr -s "[:space:]")"
fi
optimCheck=$((optimCheck + 1)) # 最適化が有効なので + 1
fi
if [ "${la}" != "|" ] && [ -z "${lookAhead}" ]; then # lookAhead のグリフが全て重複していた場合、設定を追加せず ruturn
echo "Removed all settings, skip ${caltList} index ${substIndex}: Lookup = ${lookupIndex}"
eval "${2}=\${substIndex}" # 戻り値を入れる変数名を1番目の引数に指定する
return
fi
fi # -n "${lookAhead}"
# ---
if [ ${optim} -ge 1 ] && [ ${optimCheck} -ge 1 ]; then # input、backtrack、lookAhead のいずれかで最適化が有効な条件なのに
echo "Attention: Optimization flag is set to false" # スキップするように設定してある場合、注意を表示
elif [ ${optim} -eq 0 ] && [ ${optimCheck} -eq 0 ]; then # input、backtrack、lookAhead の全てで最適化が有効ではない条件なのに
echo "Attention: Optimization flag is set to true" # スキップしないように設定してある場合、注意を表示
fi
fi # "${optimize_mode}" == "force" || "${optimize_mode}" == "optional"
fi # ${listNo} -le ${optimizeListNo}
# 設定追加 ====================
if [ -n "${lookupIndex}" ]; then
echo "Make ${caltList} index ${substIndex}: Lookup = ${lookupIndex}"
else
echo "Make ${caltList} index ${substIndex}: Lookup = none"
fi
echo "<ChainContextSubst index=\"${substIndex}\" Format=\"3\">" >> "${caltList}.txt"
# backtrack --------------------
if [ -n "${backtrack}" ]; then # 入力した文字の左側
letter_members backtrack "${backtrack[*]}"
rm -f ${tmpdir}/${caltListName}.tmp.txt
for S in ${backtrack[@]}; do
glyph_name "${S}" >> "${tmpdir}/${caltListName}.tmp.txt" # 略号から通し番号とグリフ名を取得
done
{
echo "<BacktrackCoverage index=\"0\">"
glyph_value "${tmpdir}/${caltListName}.tmp.txt" # 通し番号とグリフ名から XML を取得
echo "</BacktrackCoverage>"
} >> "${caltList}.txt"
fi
if [ -n "${backtrack1}" ]; then # 入力した文字の左側2つ目
letter_members backtrack1 "${backtrack1[*]}"
rm -f ${tmpdir}/${caltListName}.tmp.txt
for S in ${backtrack1[@]}; do
glyph_name "${S}" >> "${tmpdir}/${caltListName}.tmp.txt"
done
{
echo "<BacktrackCoverage index=\"0\">"
glyph_value "${tmpdir}/${caltListName}.tmp.txt"
echo "</BacktrackCoverage>"
} >> "${caltList}.txt"
fi
# input --------------------
letter_members input "${input[*]}"
rm -f ${tmpdir}/${caltListName}.tmp.txt
for S in ${input[@]}; do
glyph_name "${S}" >> "${tmpdir}/${caltListName}.tmp.txt"
done
{
echo "<InputCoverage index=\"0\">" # 入力した文字(グリフ変換対象)
glyph_value "${tmpdir}/${caltListName}.tmp.txt"
echo "</InputCoverage>"
} >> "${caltList}.txt"
# lookAhead --------------------
if [ -n "${lookAhead}" ]; then # 入力した文字の右側
letter_members lookAhead "${lookAhead[*]}"
rm -f ${tmpdir}/${caltListName}.tmp.txt
for S in ${lookAhead[@]}; do
glyph_name "${S}" >> "${tmpdir}/${caltListName}.tmp.txt"
done
{
echo "<LookAheadCoverage index=\"0\">"
glyph_value "${tmpdir}/${caltListName}.tmp.txt"
echo "</LookAheadCoverage>"
} >> "${caltList}.txt"
fi
if [ -n "${lookAhead1}" ]; then # 入力した文字の右側2つ目
letter_members lookAhead1 "${lookAhead1[*]}"
rm -f ${tmpdir}/${caltListName}.tmp.txt
for S in ${lookAhead1[@]}; do
glyph_name "${S}" >> "${tmpdir}/${caltListName}.tmp.txt"
done
{
echo "<LookAheadCoverage index=\"0\">"
glyph_value "${tmpdir}/${caltListName}.tmp.txt"
echo "</LookAheadCoverage>"
} >> "${caltList}.txt"
fi
if [ -n "${lookAheadX}" ]; then # 入力した文字の右側3つ目以降
letter_members lookAheadX "${lookAheadX[*]}"
for i in $(seq 2 "${aheadMax}"); do
rm -f ${tmpdir}/${caltListName}.tmp.txt
for S in ${lookAheadX[@]}; do
glyph_name "${S}" >> "${tmpdir}/${caltListName}.tmp.txt"
done
{
echo "<LookAheadCoverage index=\"0\">"
glyph_value "${tmpdir}/${caltListName}.tmp.txt"
echo "</LookAheadCoverage>"
} >> "${caltList}.txt"
done
fi
# lookupIndex --------------------
if [ -n "${lookupIndex}" ]; then # 条件がそろった時にジャンプするテーブル番号
{
echo "<SubstLookupRecord index=\"0\">"
echo "<SequenceIndex value=\"0\"/>"
echo "<LookupListIndex value=\"${lookupIndex}\"/>"
echo "</SubstLookupRecord>"
} >> "${caltList}.txt"
fi
echo "</ChainContextSubst>" >> "${caltList}.txt"
eval "${2}=\$((substIndex + 1))" # 戻り値を入れる変数名を1番目の引数に指定する
}
# ヘルプを表示する関数 ||||||||||||||||||||||||||||||||||||||||
calt_table_maker_help()
{
echo "Usage: calt_table_maker.sh [options]"
echo ""
echo "Options:"
echo " -h Display this information"
echo " -x Cleaning temporary files" # 一時作成ファイルの消去のみ
echo " -X Cleaning temporary files and saved kerning settings" # 一時作成ファイルとカーニング設定の消去のみ
echo " -l Leave (do NOT remove) temporary files"
echo " -n number Set glyph number of \"A moved left\""
echo " -k Don't make calt settings for latin characters"
echo " -b Make kerning settings for basic latin characters only"
echo " -O Enable force optimization process"
echo " -o Enable optimization process"
}
# メイン ||||||||||||||||||||||||||||||||||||||||
echo
echo "- GSUB table [calt, LookupType 6] maker -"
echo
# Get options
while getopts hxXln:kbOo OPT
do
case "${OPT}" in
"h" )
calt_table_maker_help
exit 0
;;
"x" )
echo "Option: Cleaning temporary files"
echo "Remove temporary files"
rm -rf ${tmpdir_name}.*
exit 0
;;
"X" )
echo "Option: Cleaning temporary files and saved kerning settings"
echo "Remove temporary files"
rm -rf ${tmpdir_name}.*
echo "Remove kerning settings"
rm -f ${caltListName}*.txt
rm -rf "${karndir_name}"
exit 0
;;
"l" )
echo "Option: Leave (do NOT remove) temporary files"
leaving_tmp_flag="true"
;;
"n" )
echo "Option: Set glyph number of \"A moved left\": glyph${OPTARG}"
glyphNo_flag="true"
glyphNo="${OPTARG}"
;;
"k" )
echo "Option: Don't make calt settings for latin characters"
symbol_only_flag="true"
;;
"b" )
echo "Option: Make calt settings for basic latin characters only"
basic_only_flag="true"
;;
"O" )
echo "Option: Enable force optimization process"
optimize_mode="force"
;;
"o" )
echo "Option: Enable optimization process"
optimize_mode="optional"
;;
* )
calt_table_maker_help
exit 1
;;
esac
done
echo
if [ "${glyphNo_flag}" = "false" ]; then
gsubList_txt=$(find . -maxdepth 1 -name "${gsubList}.txt" | head -n 1)
if [ -n "${gsubList_txt}" ]; then # gsubListがあり、
echo "Found GSUB List"
caltNo=$(grep -m 1 'Substitution in="A"' "${gsubList}.txt")
if [ -n "${caltNo}" ]; then # calt用の異体字があった場合gSubListからglyphナンバーを取得
temp=${caltNo##*glyph} # glyphナンバーより前を削除
glyphNo=${temp%\"*} # glyphナンバーより後を削除してオフセット値追加
echo "Found glyph number of \"A moved left\": glyph${glyphNo}"
else
echo "Not found glyph number of \"A moved left\""
echo "Use default number"
echo
fi
else
echo "Not found GSUB List"
echo "Use default number"
echo
fi
fi
# txtファイルを削除
rm -f ${caltListName}*.txt
# calt_table_maker に変更が無く、すでに設定が作成されていた場合それを呼び出して終了
output_data=$(echo $(wc -c calt_table_maker.sh) | cut -d ' ' -f 1)"-"$(date -r calt_table_maker.sh "+%Y%m%d-%H%M%S")
if [ "${symbol_only_flag}" = "true" ]; then
karnsetdir_name="k"
fi
if [ "${basic_only_flag}" = "true" ]; then
karnsetdir_name="${karnsetdir_name}b"
fi
if [ "${optimize_mode}" = "force" ]; then
karnsetdir_name="${karnsetdir_name}O"
elif [ "${optimize_mode}" = "optional" ]; then
karnsetdir_name="${karnsetdir_name}o"
fi
karnsetdir_name="${karnsetdir_name}${glyphNo}"
file_data_txt=$(find "./${karndir_name}/${karnsetdir_name}" -maxdepth 1 -name "${fileDataName}.txt" | head -n 1)
if [ -n "${file_data_txt}" ]; then
input_data=$(head -n 1 "${karndir_name}/${karnsetdir_name}/${fileDataName}.txt")
if [ "${input_data}" = "${output_data}" ]; then
echo "calt_table_maker is unchanged"
echo "Use saved kerning settings"
cp -f ${karndir_name}/${karnsetdir_name}/${caltListName}_*.txt "."
echo
exit 0
fi
fi
echo "calt_table_maker is changed or kerning settings not exist"
echo "Make new kerning settings"
echo
# 一時保管フォルダ作成
tmpdir=$(mktemp -d ./"${tmpdir_name}".XXXXXX) || exit 2
# グリフ名変換用辞書作成 (グリフのIDS順に並べること) ||||||||||||||||||||||||||||||||||||||||
# 略号と名前 ----------------------------------------
exclam=("EXC") # 直接扱えない記号があるため略号を使用
quotedbl=("QTD")
number=("NUM")
dollar=("DOL")
percent=("PCT")
and=("AND")
quote=("QTE")
asterisk=("AST")
plus=("PLS")
comma=("COM")
hyphen=("HYP")
fullStop=("DOT")
solidus=("SLH")
parenLeft=("LPN")
parenRight=("RPN")
symbol2x=("${exclam}" "${quotedbl}" "${number}" "${dollar}" "${percent}" "${and}" "${quote}" \
"${parenLeft}" "${parenRight}" "${asterisk}" "${plus}" "${comma}" "${hyphen}" "${fullStop}" "${solidus}")
symbol2x_name=("exclam" "quotedbl" "numbersign" "dollar" "percent" "ampersand" "quotesingle" \
"parenleft" "parenright" "asterisk" "plus" "comma" "hyphen" "period" "slash")
figure=(0 1 2 3 4 5 6 7 8 9)
figure_name=("zero" "one" "two" "three" "four" "five" "six" "seven" "eight" "nine")
colon=("CLN")
semicolon=("SCL")
less=("LES")
equal=("EQL")
greater=("GRT")
question=("QET")
symbol3x=("${colon}" "${semicolon}" "${less}" "${equal}" "${greater}" "${question}")
symbol3x_name=("colon" "semicolon" "less" "equal" "greater" "question")
at=("ATT")
symbol4x=("${at}")
symbol4x_name=("at")
# グリフ略号 (A B..y z, AL BL..yL zL, AR BR..yR zR 通常のグリフ、左に移動したグリフ、右に移動したグリフ)
# グリフ名 (A B..y z, glyphXXXXX..glyphYYYYY)
latin45=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) # 略号の始めの文字
latin45_name=(${latin45[@]})
bracketLeft=("LBK")
rSolidus=("BSH")
bracketRight=("RBK")
circum=("CRC")
underscore=("USC")
grave=("GRV")
symbol5x=("${bracketLeft}" "${rSolidus}" "${bracketRight}" "${circum}" "${underscore}" "${grave}")
symbol5x_name=("bracketleft" "backslash" "bracketright" "asciicircum" "underscore" "grave")
latin67=(a b c d e f g h i j k l m n o p q r s t u v w x y z) # 略号の始めの文字
latin67_name=(${latin67[@]})
braceLeft=("LBC")
bar=("BAR")
braceRight=("RBC")
tilde=("TLD")
symbol7x=("${braceLeft}" "${bar}" "${braceRight}" "${tilde}")
symbol7x_name=("braceleft" "bar" "braceright" "asciitilde")
latinCx=(À Á Â Ã Ä Å)
latinCx_name=("Agrave" "Aacute" "Acircumflex" "Atilde" "Adieresis" "Aring")
latinCy=(Æ)
latinCy_name=("AE")
latinCz=(Ç È É Ê Ë Ì Í Î Ï)
latinCz_name=("Ccedilla" "Egrave" "Eacute" "Ecircumflex" "Edieresis" \
"Igrave" "Iacute" "Icircumflex" "Idieresis")
latinDx=(Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß)
latinDx_name=("Eth" "Ntilde" "Ograve" "Oacute" "Ocircumflex" "Otilde" "Odieresis" "Oslash" \
"Ugrave" "Uacute" "Ucircumflex" "Udieresis" "Yacute" "Thorn" "germandbls")
latinEx=(à á â ã ä å)
latinEx_name=("agrave" "aacute" "acircumflex" "atilde" "adieresis" "aring")
latinEy=(æ)
latinEy_name=("ae")
latinEz=(ç è é ê ë ì í î ï)
latinEz_name=("ccedilla" "egrave" "eacute" "ecircumflex" "edieresis" \
"igrave" "iacute" "icircumflex" "idieresis")
latinFx=(ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ)
latinFx_name=("eth" "ntilde" "ograve" "oacute" "ocircumflex" "otilde" "odieresis" "oslash" \
"ugrave" "uacute" "ucircumflex" "udieresis" "yacute" "thorn" "ydieresis")
latin10x=(Ā ā Ă ă Ą ą Ć ć Ĉ ĉ Ċ ċ Č č Ď ď)
latin10x_name=("Amacron" "amacron" "Abreve" "abreve" "Aogonek" "aogonek" "Cacute" "cacute" \
"Ccircumflex" "ccircumflex" "Cdotaccent" "cdotaccent" "Ccaron" "ccaron" "Dcaron" "dcaron")
latin11x=(Đ đ Ē ē Ĕ ĕ Ė ė Ę ę Ě ě Ĝ ĝ Ğ ğ)
latin11x_name=("Dcroat" "dcroat" "Emacron" "emacron" "Ebreve" "ebreve" "Edotaccent" "edotaccent" \
"Eogonek" "eogonek" "Ecaron" "ecaron" "Gcircumflex" "gcircumflex" "Gbreve" "gbreve")
latin12x=(Ġ ġ Ģ ģ Ĥ ĥ Ħ ħ Ĩ ĩ Ī ī Ĭ ĭ Į į)
latin12x_name=("Gdotaccent" "gdotaccent" "uni0122" "uni0123" "Hcircumflex" "hcircumflex" "Hbar" "hbar" \
"Itilde" "itilde" "Imacron" "imacron" "Ibreve" "ibreve" "Iogonek" "iogonek")
latin13x=(İ ı Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ)
latin13x_name=("Idotaccent" "dotlessi" "Jcircumflex" "jcircumflex" "uni0136" "uni0137" \
"kgreenlandic" "Lacute" "lacute" "uni013B" "uni013C" "Lcaron" "lcaron" "Ldot")
#latin13x=(İ ı IJ ij Ĵ ĵ Ķ ķ ĸ Ĺ ĺ Ļ ļ Ľ ľ Ŀ) # 除外した文字を入れる場合は、移動したグリフに対する処理を追加すること
#latin13x_name=("Idotaccent" "dotlessi" "IJ" "ij" "Jcircumflex" "jcircumflex" "uni0136" "uni0137" \
#"kgreenlandic" "Lacute" "lacute" "uni013B" "uni013C" "Lcaron" "lcaron" "Ldot")
latin14x=(ŀ Ł ł Ń ń Ņ ņ Ň ň Ŋ ŋ Ō ō Ŏ ŏ)
latin14x_name=("ldot" "Lslash" "lslash" "Nacute" "nacute" "uni0145" "uni0146" "Ncaron" \
"ncaron" "Eng" "eng" "Omacron" "omacron" "Obreve" "obreve")
#latin14x=(ŀ Ł ł Ń ń Ņ ņ Ň ň ʼn Ŋ ŋ Ō ō Ŏ ŏ) # 除外した文字を入れる場合は、移動したグリフに対する処理を追加すること
#latin14x_name=("ldot" "Lslash" "lslash" "Nacute" "nacute" "uni0145" "uni0146" "Ncaron" \
#"ncaron" "napostrophe" "Eng" "eng" "Omacron" "omacron" "Obreve" "obreve")
latin15x=(Ő ő)
latin15x_name=("Ohungarumlaut" "ohungarumlaut")
latin15y=(Œ œ)
latin15y_name=("OE" "oe")
latin15z=(Ŕ ŕ Ŗ ŗ Ř ř Ś ś Ŝ ŝ Ş ş)
latin15z_name=("Racute" "racute" "uni0156" "uni0157" \
"Rcaron" "rcaron" "Sacute" "sacute" "Scircumflex" "scircumflex" "Scedilla" "scedilla")
latin16x=(Š š Ţ ţ Ť ť Ŧ ŧ Ũ ũ Ū ū Ŭ ŭ Ů ů)
latin16x_name=("Scaron" "scaron" "uni0162" "uni0163" "Tcaron" "tcaron" "Tbar" "tbar" \
"Utilde" "utilde" "Umacron" "umacron" "Ubreve" "ubreve" "Uring" "uring")
latin17x=(Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž)
latin17x_name=("Uhungarumlaut" "uhungarumlaut" "Uogonek" "uogonek" "Wcircumflex" "wcircumflex" "Ycircumflex" "ycircumflex" \
"Ydieresis" "Zacute" "zacute" "Zdotaccent" "zdotaccent" "Zcaron" "zcaron")
#latin17x=(Ű ű Ų ų Ŵ ŵ Ŷ ŷ Ÿ Ź ź Ż ż Ž ž ſ) # 除外した文字を入れる場合は、移動したグリフに対する処理を追加すること
#latin17x_name=("Uhungarumlaut" "uhungarumlaut" "Uogonek" "uogonek" "Wcircumflex" "wcircumflex" "Ycircumflex" "ycircumflex" \
#"Ydieresis" "Zacute" "zacute" "Zdotaccent" "zdotaccent" "Zcaron" "zcaron" "longs")
latin21x=(Ș ș Ț ț)
latin21x_name=("uni0218" "uni0219" "uni021A" "uni021B")
latin1E9x=(ẞ)
latin1E9x_name=("uni1E9E")
# 移動していない文字 ----------------------------------------
i=0
word=(${symbol2x[@]} ${figure[@]} ${symbol3x[@]} ${symbol4x[@]}) # 記号・数字
name=(${symbol2x_name[@]} ${figure_name[@]} ${symbol3x_name[@]} ${symbol4x_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
word=(${latin45[@]}) # A-Z
name=(${latin45_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
word=(${symbol5x[@]}) # 記号
name=(${symbol5x_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
word=(${latin67[@]}) # a-z
name=(${latin67_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
word=(${symbol7x[@]}) # 記号
name=(${symbol7x_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
word=(${latinCx[@]}) # À-Å
name=(${latinCx_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
echo "$i ${latinCy}N ${latinCy_name}" >> "${tmpdir}/${dict}.txt" # Æ
i=$((i + 1))
echo "$i ${latinCy}L ${latinCy_name}" >> "${tmpdir}/${dict}.txt" # Æ は移動しないため
i=$((i + 1))
echo "$i ${latinCy}R ${latinCy_name}" >> "${tmpdir}/${dict}.txt" # Æ は移動しないため
i=$((i + 1))
word=(${latinCz[@]} ${latinDx[@]} ${latinEx[@]}) # Ç-å
name=(${latinCz_name[@]} ${latinDx_name[@]} ${latinEx_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
echo "$i ${latinEy}N ${latinEy_name}" >> "${tmpdir}/${dict}.txt" # æ
i=$((i + 1))
echo "$i ${latinEy}L ${latinEy_name}" >> "${tmpdir}/${dict}.txt" # æ は移動しないため
i=$((i + 1))
echo "$i ${latinEy}R ${latinEy_name}" >> "${tmpdir}/${dict}.txt" # æ は移動しないため
i=$((i + 1))
word=(${latinEz[@]} ${latinFx[@]} ${latin10x[@]} ${latin11x[@]} \
${latin12x[@]} ${latin13x[@]} ${latin14x[@]} ${latin15x[@]}) # ç-ő
name=(${latinEz_name[@]} ${latinFx_name[@]} ${latin10x_name[@]} ${latin11x_name[@]} \
${latin12x_name[@]} ${latin13x_name[@]} ${latin14x_name[@]} ${latin15x_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
for j in ${!latin15y[@]}; do # Œ œ
echo "$i ${latin15y[j]}N ${latin15y_name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
echo "$i ${latin15y[j]}L ${latin15y_name[j]}" >> "${tmpdir}/${dict}.txt" # Œ œ は移動しないため
i=$((i + 1))
echo "$i ${latin15y[j]}R ${latin15y_name[j]}" >> "${tmpdir}/${dict}.txt" # Œ œ は移動しないため
i=$((i + 1))
done
word=(${latin15z[@]} ${latin16x[@]} ${latin17x[@]} ${latin21x[@]} ${latin1E9x[@]}) # Ŕ-ẞ
name=(${latin15z_name[@]} ${latin16x_name[@]} ${latin17x_name[@]} ${latin21x_name[@]} ${latin1E9x_name[@]})
for j in ${!word[@]}; do
echo "$i ${word[j]}N ${name[j]}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
# 左に移動した文字 ----------------------------------------
word=(${latin45[@]} ${latin67[@]} \
${latinCx[@]} ${latinCz[@]} ${latinDx[@]} ${latinEx[@]} ${latinEz[@]} ${latinFx[@]} \
${latin10x[@]} ${latin11x[@]} ${latin12x[@]} ${latin13x[@]} ${latin14x[@]} ${latin15x[@]} ${latin15z[@]} \
${latin16x[@]} ${latin17x[@]} ${latin21x[@]} ${latin1E9x[@]}) # A-ẞ
i=${glyphNo}
for S in ${word[@]}; do
echo "$i ${S}L glyph${i}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
# 右に移動した文字 ----------------------------------------
for S in ${word[@]}; do
echo "$i ${S}R glyph${i}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
# 3桁マークの付いた数字 ----------------------------------------
word=(${figure[@]}) # 0-9
for S in ${word[@]}; do
echo "$i ${S}3 glyph${i}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
# 4桁マークの付いた数字 ----------------------------------------
for S in ${word[@]}; do
echo "$i ${S}4 glyph${i}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
# 12桁マークの付いた数字 ----------------------------------------
for S in ${word[@]}; do
echo "$i ${S}2 glyph${i}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
# 小数の数字 ----------------------------------------
for S in ${word[@]}; do
echo "$i ${S}0 glyph${i}" >> "${tmpdir}/${dict}.txt"
i=$((i + 1))
done
# 下に移動した記号 ----------------------------------------
word=(${bar} ${tilde}) # |~
for S in ${word[@]}; do
echo "$i ${S}D glyph${i}" >> "${tmpdir}/${dict}.txt"
echo "$i ${S}DN glyph${i}" >> "${tmpdir}/${dict}.txt" # |~ は左右にも動くため、左右移動設定時のノーマル状態として追加
i=$((i + 1))
done
# 上に移動した記号 ----------------------------------------
word=(${colon} ${asterisk} ${plus} ${hyphen} ${equal}) # :*+-=
for S in ${word[@]}; do