@danything/arib 0.1.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +39 -0
- package/README.md +12 -8
- package/dist/ait.d.ts +1 -1
- package/dist/ait.js +4 -1
- package/dist/aribtext.d.ts +8 -5
- package/dist/aribtext.js +60 -26
- package/dist/b24-tables.d.ts +22 -4
- package/dist/b24-tables.js +97 -6
- package/dist/b24caption.d.ts +5 -1
- package/dist/b24caption.js +42 -13
- package/dist/bml-protocol.d.ts +3 -2
- package/dist/bml-protocol.js +2 -1
- package/dist/bml.d.ts +4 -4
- package/dist/bml.js +30 -9
- package/dist/caption-text.d.ts +8 -3
- package/dist/caption-text.js +3 -3
- package/dist/drcs-smooth.d.ts +1 -1
- package/dist/drcs-smooth.js +2 -1
- package/dist/dsmcc.d.ts +23 -5
- package/dist/dsmcc.js +50 -10
- package/dist/eit.d.ts +42 -9
- package/dist/eit.js +44 -14
- package/dist/multipart.d.ts +1 -1
- package/dist/multipart.js +1 -1
- package/dist/pes.d.ts +3 -3
- package/dist/pes.js +24 -11
- package/dist/psi.d.ts +4 -4
- package/dist/psi.js +5 -5
- package/dist/service-filter.d.ts +16 -5
- package/dist/service-filter.js +38 -6
- package/dist/synth-av.d.ts +3 -3
- package/dist/synth-av.js +3 -3
- package/dist/synth-caption.d.ts +1 -1
- package/dist/synth-caption.js +1 -1
- package/dist/synth.d.ts +21 -3
- package/dist/synth.js +39 -6
- package/package.json +1 -1
package/LICENSE
CHANGED
|
@@ -80,3 +80,42 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
80
80
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
81
81
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
82
82
|
SOFTWARE.
|
|
83
|
+
|
|
84
|
+
## web-bml
|
|
85
|
+
|
|
86
|
+
The data broadcasting message types (src/bml-protocol.ts) follow the protocol
|
|
87
|
+
types of web-bml (server/ws_api.ts), kept as they were so that recorded
|
|
88
|
+
.bml.jsonl files stay readable. https://github.com/otya128/web-bml
|
|
89
|
+
|
|
90
|
+
MIT License
|
|
91
|
+
|
|
92
|
+
Copyright (c) 2022 otya
|
|
93
|
+
|
|
94
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
95
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
96
|
+
in the Software without restriction, including without limitation the rights
|
|
97
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
98
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
99
|
+
furnished to do so, subject to the following conditions:
|
|
100
|
+
|
|
101
|
+
The above copyright notice and this permission notice shall be included in all
|
|
102
|
+
copies or substantial portions of the Software.
|
|
103
|
+
|
|
104
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
105
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
106
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
107
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
108
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
109
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
110
|
+
SOFTWARE.
|
|
111
|
+
|
|
112
|
+
## JIS X 0213:2004 vs Unicode mapping table (x0213.org)
|
|
113
|
+
|
|
114
|
+
The JIS X 0213 tables of src/b24-tables.ts (KANJI_SEQUENCES, PLANE1_HIGH_ROWS,
|
|
115
|
+
PLANE2) are generated by scripts/jisx0213.ts from jisx0213-2004-std.txt.
|
|
116
|
+
https://x0213.org/codetable/jisx0213-2004-std.txt
|
|
117
|
+
|
|
118
|
+
Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
|
|
119
|
+
Copyright (C) 2001 I'O, All Rights Reserved.
|
|
120
|
+
Copyright (C) 2006, 2009 Project X0213, All Rights Reserved.
|
|
121
|
+
You can use, modify, distribute this table freely.
|
package/README.md
CHANGED
|
@@ -5,11 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
- **PSI** — パケットの切り出し、セクションの組み立て、PAT / PMT / SDT / NIT (`psi`)
|
|
7
7
|
- **PES** — 映像・音声の PES と ADTS (`pes`)
|
|
8
|
-
- **番組表** — EIT[p/f] と EIT[schedule]
|
|
9
|
-
- **ARIB の文字** — STD-B24 の8
|
|
8
|
+
- **番組表** — EIT[p/f] と EIT[schedule]。ジャンル・音声・拡張形式イベント・シリーズ記述子まで (`eit`)
|
|
9
|
+
- **ARIB の文字** — STD-B24 の8単位符号 (JIS X 0213 の1面・2面まで) と ARIB 外字 (`aribtext`、`aribtext-gaiji`)
|
|
10
10
|
- **字幕** — STD-B24 の字幕文を、字の置き場所まで決めた JSON にする (`b24caption`、形式は `caption-text`)
|
|
11
|
-
- **データ放送** — DSM-CC のカルーセルからモジュールとファイルを組み立てる (`dsmcc`、`multipart`、`bml`)
|
|
11
|
+
- **データ放送** — DSM-CC のカルーセルからモジュールとファイルを組み立てる (`dsmcc`、`multipart`、`bml`、形式は `bml-protocol`)
|
|
12
12
|
- **Hybridcast の AIT** (`ait`)、**1つの局だけを抜き出す** (`service-filter`)
|
|
13
|
+
- **試験用の TS を組み立てる** — PSI・EIT・字幕・カルーセル・映像と音声 (`synth`、`synth-caption`、`synth-av`)
|
|
14
|
+
- 下で使う道具 — バイト列 (`bytes`)、言語の名前 (`language`)、文字の表 (`b24-tables`)、字幕の外字の画像をなめらかにする (`drcs-smooth`)
|
|
13
15
|
|
|
14
16
|
依存するパッケージはありません。
|
|
15
17
|
|
|
@@ -19,7 +21,7 @@
|
|
|
19
21
|
npm install @danything/arib
|
|
20
22
|
```
|
|
21
23
|
|
|
22
|
-
ES モジュールだけです。`bml
|
|
24
|
+
ES モジュールだけです。`bml`・`b24caption`・`drcs-smooth` は `node:zlib`・`node:crypto`・`node:buffer` を使うので、
|
|
23
25
|
Node.js・Bun・Deno で動きます。ほかのモジュールはブラウザでも動きます。型は TypeScript 5.7 以降で読めます。
|
|
24
26
|
|
|
25
27
|
## 使い方
|
|
@@ -33,8 +35,9 @@ const epg = new EpgReader();
|
|
|
33
35
|
for await (const chunk of stream) {
|
|
34
36
|
// 長さはそろっていなくてよい
|
|
35
37
|
if (epg.feed(chunk)) {
|
|
38
|
+
// 返るのは開始時刻の決まった番組だけ
|
|
36
39
|
for (const event of epg.takeChanged()) {
|
|
37
|
-
console.log(event.serviceId, new Date(event.startAt), event.name);
|
|
40
|
+
console.log(event.serviceId, new Date(event.startAt!), event.name);
|
|
38
41
|
}
|
|
39
42
|
}
|
|
40
43
|
}
|
|
@@ -55,12 +58,13 @@ const page = captions.decode(pesPayload);
|
|
|
55
58
|
if (page !== null) draw(page); // 形式は caption-text.ts の CaptionPage
|
|
56
59
|
```
|
|
57
60
|
|
|
58
|
-
##
|
|
61
|
+
## バージョン
|
|
59
62
|
|
|
60
|
-
|
|
63
|
+
[セマンティック バージョニング](https://semver.org/lang/ja/) に従います。互換のない変更 (モジュールや書き出している名前を消す・型や形式を変える) はメジャーバージョンを上げます。
|
|
61
64
|
|
|
62
65
|
## ライセンス
|
|
63
66
|
|
|
64
67
|
MIT。字幕の表とデコードの方法は [libaribcaption](https://github.com/xqq/libaribcaption) (MIT)、
|
|
65
|
-
外字表の一部は [ariblib](https://github.com/youzaka/ariblib) (MIT)
|
|
68
|
+
外字表の一部は [ariblib](https://github.com/youzaka/ariblib) (MIT)、
|
|
69
|
+
JIS X 0213 の表は [x0213.org](https://x0213.org/) の対応表 (自由に使ってよいと書かれたもの) から来ています。
|
|
66
70
|
著作権表示は [LICENSE](LICENSE) にあります。
|
package/dist/ait.d.ts
CHANGED
|
@@ -73,7 +73,7 @@ export declare function parseAit(section: Uint8Array): Ait | null;
|
|
|
73
73
|
* TS から Hybridcast のアプリを見つける。
|
|
74
74
|
*
|
|
75
75
|
* **PMT を見てから AIT を読む** という2段なので、繋いだ直後は何も返しません。
|
|
76
|
-
*
|
|
76
|
+
* 局を変えたら作り直します。
|
|
77
77
|
*
|
|
78
78
|
* 局に Hybridcast が無ければ、**PMT に印が無い**ので AIT を待つこともしません
|
|
79
79
|
* — その局では永久に何も返さないのが正しい振る舞いです。
|
package/dist/ait.js
CHANGED
|
@@ -143,6 +143,9 @@ export function parseAit(section) {
|
|
|
143
143
|
// **URL の無いものは出さない。** 在ることだけ言われても行き先が無い
|
|
144
144
|
if (base === null)
|
|
145
145
|
continue;
|
|
146
|
+
// **http(s) でないものも出さない。** この URL は画面で `window.open` に渡る (`javascript:` などを開かせない。XML の AIT と同じ)
|
|
147
|
+
if (!/^https?:\/\//i.test(base))
|
|
148
|
+
continue;
|
|
146
149
|
applications.push({
|
|
147
150
|
organisationId,
|
|
148
151
|
applicationId,
|
|
@@ -157,7 +160,7 @@ export function parseAit(section) {
|
|
|
157
160
|
* TS から Hybridcast のアプリを見つける。
|
|
158
161
|
*
|
|
159
162
|
* **PMT を見てから AIT を読む** という2段なので、繋いだ直後は何も返しません。
|
|
160
|
-
*
|
|
163
|
+
* 局を変えたら作り直します。
|
|
161
164
|
*
|
|
162
165
|
* 局に Hybridcast が無ければ、**PMT に印が無い**ので AIT を待つこともしません
|
|
163
166
|
* — その局では永久に何も返さないのが正しい振る舞いです。
|
package/dist/aribtext.d.ts
CHANGED
|
@@ -12,15 +12,18 @@
|
|
|
12
12
|
* 英数集合 (と空白) は**いまの文字の大きさ**で描く。SI の初期状態は標準 (NSZ) で、
|
|
13
13
|
* テレビはこれを全角で描く。半角にしたい局は中型 (MSZ) を挟んでくる (ARIB TR-B14)。
|
|
14
14
|
* 番組名の「Venue101」は英数集合を標準のまま送ったもの。**放送のとおりに出す** —
|
|
15
|
-
* 探すときや比べるときに半角へ寄せるのは使う側 (`fold.toHalfWidth` / `title.searchable`)。
|
|
15
|
+
* 探すときや比べるときに半角へ寄せるのは使う側 (denpa なら `fold.toHalfWidth` / `title.searchable`)。
|
|
16
16
|
* 全角は `toHalfWidth` でそのまま戻る字 (U+FF01〜U+FF5E) にする (0x5C は \、0x7E は ~)
|
|
17
17
|
*
|
|
18
18
|
* ## 漢字は EUC-JP に押し付ける
|
|
19
19
|
*
|
|
20
|
-
* 2バイトの漢字集合は JIS X 0208
|
|
21
|
-
* **各バイトの最上位を立てれば EUC-JP
|
|
22
|
-
* `TextDecoder('euc-jp')`
|
|
23
|
-
*
|
|
20
|
+
* 2バイトの漢字集合は JIS X 0208 の並びで、区点は (第1-0x20, 第2-0x20)。
|
|
21
|
+
* **各バイトの最上位を立てれば EUC-JP になる**ので、ほとんどの字は
|
|
22
|
+
* `TextDecoder('euc-jp')` に渡せる。自前の表を引くのは:
|
|
23
|
+
*
|
|
24
|
+
* - 85区から先の外字 ([aribtext-gaiji.ts](aribtext-gaiji.ts))
|
|
25
|
+
* - EUC-JP に無い JIS X 0213 の1面の字 (字幕と同じ表。▷ や ⓐ、か゚ のような2つのコードポイントの字も)
|
|
26
|
+
* - JIS互換漢字1面 (終端 0x39) の 85〜94区と、2面 (0x3A) 全部 (`PLANE1_HIGH`・`PLANE2`)
|
|
24
27
|
*/
|
|
25
28
|
/**
|
|
26
29
|
* 8単位符号を読んで文字列にする。
|
package/dist/aribtext.js
CHANGED
|
@@ -12,18 +12,21 @@
|
|
|
12
12
|
* 英数集合 (と空白) は**いまの文字の大きさ**で描く。SI の初期状態は標準 (NSZ) で、
|
|
13
13
|
* テレビはこれを全角で描く。半角にしたい局は中型 (MSZ) を挟んでくる (ARIB TR-B14)。
|
|
14
14
|
* 番組名の「Venue101」は英数集合を標準のまま送ったもの。**放送のとおりに出す** —
|
|
15
|
-
* 探すときや比べるときに半角へ寄せるのは使う側 (`fold.toHalfWidth` / `title.searchable`)。
|
|
15
|
+
* 探すときや比べるときに半角へ寄せるのは使う側 (denpa なら `fold.toHalfWidth` / `title.searchable`)。
|
|
16
16
|
* 全角は `toHalfWidth` でそのまま戻る字 (U+FF01〜U+FF5E) にする (0x5C は \、0x7E は ~)
|
|
17
17
|
*
|
|
18
18
|
* ## 漢字は EUC-JP に押し付ける
|
|
19
19
|
*
|
|
20
|
-
* 2バイトの漢字集合は JIS X 0208
|
|
21
|
-
* **各バイトの最上位を立てれば EUC-JP
|
|
22
|
-
* `TextDecoder('euc-jp')`
|
|
23
|
-
*
|
|
20
|
+
* 2バイトの漢字集合は JIS X 0208 の並びで、区点は (第1-0x20, 第2-0x20)。
|
|
21
|
+
* **各バイトの最上位を立てれば EUC-JP になる**ので、ほとんどの字は
|
|
22
|
+
* `TextDecoder('euc-jp')` に渡せる。自前の表を引くのは:
|
|
23
|
+
*
|
|
24
|
+
* - 85区から先の外字 ([aribtext-gaiji.ts](aribtext-gaiji.ts))
|
|
25
|
+
* - EUC-JP に無い JIS X 0213 の1面の字 (字幕と同じ表。▷ や ⓐ、か゚ のような2つのコードポイントの字も)
|
|
26
|
+
* - JIS互換漢字1面 (終端 0x39) の 85〜94区と、2面 (0x3A) 全部 (`PLANE1_HIGH`・`PLANE2`)
|
|
24
27
|
*/
|
|
25
28
|
import { GAIJI } from "./aribtext-gaiji.js";
|
|
26
|
-
import { HIRAGANA as HIRAGANA_TABLE, JISX0201_HALF, KATAKANA as KATAKANA_TABLE, } from "./b24-tables.js";
|
|
29
|
+
import { HIRAGANA as HIRAGANA_TABLE, JISX0201_HALF, KANJI_DIFF, KANJI_SEQUENCES, KATAKANA as KATAKANA_TABLE, PLANE1_HIGH, PLANE2, } from "./b24-tables.js";
|
|
27
30
|
const KANJI = { bytes: 2, kind: "kanji" };
|
|
28
31
|
const ALNUM = { bytes: 1, kind: "alnum" };
|
|
29
32
|
const HIRAGANA = { bytes: 1, kind: "hiragana" };
|
|
@@ -41,9 +44,9 @@ const MOSAIC = { bytes: 1, kind: "blank" };
|
|
|
41
44
|
*/
|
|
42
45
|
const CHARSETS = new Map([
|
|
43
46
|
[0x42, KANJI],
|
|
44
|
-
[0x39,
|
|
47
|
+
[0x39, { bytes: 2, kind: "plane1" }], // JIS互換漢字1面
|
|
45
48
|
[0x3a, { bytes: 2, kind: "plane2" }], // JIS互換漢字2面
|
|
46
|
-
[0x3b,
|
|
49
|
+
[0x3b, KANJI], // 追加記号 (漢字集合と同じ表を引く)
|
|
47
50
|
[0x4a, ALNUM],
|
|
48
51
|
[0x30, HIRAGANA],
|
|
49
52
|
[0x31, KATAKANA],
|
|
@@ -64,12 +67,26 @@ const UNKNOWN = "□";
|
|
|
64
67
|
* - ひらがなの 0x74〜0x76 は規格で空き。字幕は全角の空白で埋めるが、番組表では何も出さない
|
|
65
68
|
* - JIS X 0201 カタカナはいつも半角 (字幕は大きさで全角と半角を描き分ける)
|
|
66
69
|
* - 英数は大きさに従って全角か ASCII (字幕の半角の表は 0x5C が ¥、0x7E が ‾。番組表は検索で打つ字に合わせる)
|
|
67
|
-
* - 漢字は EUC-JP のまま読む (字幕は 1区33点の 〜・34点の ‖・61点の − などを差し替える。`KANJI_DIFF`)
|
|
70
|
+
* - 漢字は EUC-JP のまま読む (字幕は 1区33点の 〜・34点の ‖・61点の − などを差し替える。`KANJI_DIFF`)。
|
|
71
|
+
* EUC-JP に無い点だけ字幕と同じ JIS X 0213 の字を引く
|
|
68
72
|
*/
|
|
69
73
|
const HIRA = [...HIRAGANA_TABLE];
|
|
70
74
|
const KATA = [...KATAKANA_TABLE];
|
|
71
75
|
const ANK = [...JISX0201_HALF];
|
|
72
76
|
const eucjp = new TextDecoder("euc-jp");
|
|
77
|
+
/** EUC-JP に無い JIS X 0213 の1面の字 (区×94+点 → 字)。字幕と同じ表 */
|
|
78
|
+
const x0213 = new Map(KANJI_SEQUENCES);
|
|
79
|
+
for (const [start, chars] of KANJI_DIFF) {
|
|
80
|
+
let i = start;
|
|
81
|
+
for (const char of chars) {
|
|
82
|
+
if (!x0213.has(i))
|
|
83
|
+
x0213.set(i, char);
|
|
84
|
+
i++;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const PLANE1_HIGH_CHARS = [...PLANE1_HIGH];
|
|
88
|
+
/** 2面の区 (1〜94) → 94 字 */
|
|
89
|
+
const PLANE2_ROWS = new Map(PLANE2.map(([ku, row]) => [ku, [...row]]));
|
|
73
90
|
/**
|
|
74
91
|
* 2バイト文字の変換結果を覚えておく。
|
|
75
92
|
*
|
|
@@ -77,21 +94,40 @@ const eucjp = new TextDecoder("euc-jp");
|
|
|
77
94
|
* 呼び直すと配列の確保だけで効いてくる。
|
|
78
95
|
*/
|
|
79
96
|
const cache = new Map();
|
|
80
|
-
function twoByte(code,
|
|
81
|
-
// 2
|
|
82
|
-
const
|
|
97
|
+
function twoByte(code, kind) {
|
|
98
|
+
// 2面と、1面の 85区から先は同じ区点でも別の字。覚えるときも漢字集合と混ぜない
|
|
99
|
+
const high = code >> 8;
|
|
100
|
+
const low = code & 0xff;
|
|
101
|
+
const key = kind === "plane2"
|
|
102
|
+
? code | 0x10000
|
|
103
|
+
: kind === "plane1" && high >= 0x75
|
|
104
|
+
? code | 0x20000
|
|
105
|
+
: code;
|
|
83
106
|
const cached = cache.get(key);
|
|
84
107
|
if (cached !== undefined)
|
|
85
108
|
return cached;
|
|
86
|
-
const
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
109
|
+
const ku = high - 0x20;
|
|
110
|
+
const cell = (ku - 1) * 94 + low - 0x21;
|
|
111
|
+
let decoded;
|
|
112
|
+
if (low > 0x7e) {
|
|
113
|
+
decoded = ""; // 0x7F は字ではない (次の区の頭を引かないように)
|
|
114
|
+
}
|
|
115
|
+
else if (kind === "plane2") {
|
|
116
|
+
decoded = PLANE2_ROWS.get(ku)?.[low - 0x21] ?? "";
|
|
117
|
+
}
|
|
118
|
+
else if (ku >= 85) {
|
|
119
|
+
// 85区から先は自前の表だけで引く。EUC-JP に渡すと 89〜92区が IBM 拡張の漢字になる
|
|
120
|
+
decoded =
|
|
121
|
+
kind === "plane1"
|
|
122
|
+
? (PLANE1_HIGH_CHARS[cell - 84 * 94] ?? "")
|
|
123
|
+
: (GAIJI.get(code) ?? "");
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// EUC-JP は最上位を立てたもの。EUC-JP に無い点は JIS X 0213 の字
|
|
127
|
+
decoded = eucjp.decode(Uint8Array.of(high | 0x80, low | 0x80));
|
|
128
|
+
if (decoded.includes("�"))
|
|
129
|
+
decoded = x0213.get(cell) ?? "";
|
|
130
|
+
}
|
|
95
131
|
// 変換できないと置換文字が返る。そのまま出すとタイトルに「�」が並ぶ
|
|
96
132
|
const text = decoded === "" || decoded.includes("�") ? UNKNOWN : decoded;
|
|
97
133
|
cache.set(key, text);
|
|
@@ -212,7 +248,7 @@ export function decodeAribText(data) {
|
|
|
212
248
|
else if (byte === SZX)
|
|
213
249
|
half = data[at] === SZX_TINY;
|
|
214
250
|
let params = C1_PARAMS.get(byte) ?? 0;
|
|
215
|
-
// COL と CDC
|
|
251
|
+
// COL と CDC は「色を直に指定する」形式のときだけ引数が1つ増える
|
|
216
252
|
if ((byte === 0x90 || byte === 0x92) && data[at] === 0x20)
|
|
217
253
|
params = 2;
|
|
218
254
|
at += params;
|
|
@@ -229,9 +265,7 @@ export function decodeAribText(data) {
|
|
|
229
265
|
if (second < 0x21)
|
|
230
266
|
continue;
|
|
231
267
|
out +=
|
|
232
|
-
set.kind === "blank"
|
|
233
|
-
? ""
|
|
234
|
-
: twoByte((first << 8) | second, set.kind === "plane2");
|
|
268
|
+
set.kind === "blank" ? "" : twoByte((first << 8) | second, set.kind);
|
|
235
269
|
continue;
|
|
236
270
|
}
|
|
237
271
|
at += 1;
|
|
@@ -303,7 +337,7 @@ function afterEscape(data, at, designate, invoke) {
|
|
|
303
337
|
const target = byte - 0x28;
|
|
304
338
|
if (data[at + 1] === 0x20) {
|
|
305
339
|
// 1バイトDRCS
|
|
306
|
-
designate(target,
|
|
340
|
+
designate(target, MOSAIC);
|
|
307
341
|
return at + 3;
|
|
308
342
|
}
|
|
309
343
|
designate(target, CHARSETS.get(data[at + 1]));
|
package/dist/b24-tables.d.ts
CHANGED
|
@@ -5,13 +5,16 @@
|
|
|
5
5
|
* 元は libaribcaption v1.1.2 の表 (b24_conv_tables.hpp / b24_gaiji_table.hpp / b24_colors.cpp /
|
|
6
6
|
* b24_drcs_conv.cpp) に denpa の外字の直しを当てたもの。ここが元で、上流は追わない。
|
|
7
7
|
*
|
|
8
|
-
* libaribcaption: Copyright (C) 2021 magicxqq <xqq@xqq.im> (MIT
|
|
8
|
+
* libaribcaption: Copyright (C) 2021 magicxqq <xqq@xqq.im> (MIT。著作権表示は [LICENSE](../LICENSE))
|
|
9
9
|
*
|
|
10
10
|
* **表の名前と `export const` の形は変えない。** danything/denpa-font の道具がこのファイルを
|
|
11
|
-
* 名前で読んでフォントに入れる字を決める (`ADDITIONAL_ROWS` も。`aribtext-gaiji.ts`・`fold.ts` も同じ)。
|
|
11
|
+
* 名前で読んでフォントに入れる字を決める (`ADDITIONAL_ROWS`・`PLANE1_HIGH_ROWS` も。`aribtext-gaiji.ts`・`fold.ts` も同じ)。
|
|
12
12
|
*
|
|
13
13
|
* - 漢字は EUC-JP で読んだものと違うところだけ持つ (`KANJI_DIFF`。番組表は EUC-JP のまま読む —
|
|
14
|
-
* 1区33点の 〜 / ~ などは字幕と番組表で違えてある。aribtext.ts の説明)
|
|
14
|
+
* 1区33点の 〜 / ~ などは字幕と番組表で違えてある。aribtext.ts の説明)。1〜84区は JIS X 0213:2004 の1面と
|
|
15
|
+
* 同じ字 (全角の形を選んだ点と、1区17点の  ̄ など libaribcaption のとおりの数点を除く)
|
|
16
|
+
* - JIS X 0213 の表 (2つのコードポイントの字・1面の 85〜94区・2面) は [scripts/jisx0213.ts](../scripts/jisx0213.ts) が
|
|
17
|
+
* x0213.org の対応表から書く。手で直さない
|
|
15
18
|
* - U+FFFD は規格で空いているところ
|
|
16
19
|
*
|
|
17
20
|
* ## 外字 (DRCS) の置き換えを足す
|
|
@@ -44,7 +47,22 @@ export declare const KANJI_SYMBOLS_HALF = " \uFF64\uFF61,.\uFF65:;?!\uFF9E\uFF9F
|
|
|
44
47
|
export declare const KANJI_DIFF: [number, string][];
|
|
45
48
|
/** 追加記号・追加漢字を1つの文字列にしたもの。(区 − 85) × 94 + (点 − 1) 番目のコードポイント */
|
|
46
49
|
export declare const ADDITIONAL: string;
|
|
47
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* JIS X 0213:2004 の1面で、2つのコードポイントで表す字 (半濁点の付いたかな・発音記号と、声調の組)。
|
|
52
|
+
* [区×94+点 (0 から), 字]。字幕は1区画、番組表は2つのコードポイントのまま出す
|
|
53
|
+
*/
|
|
54
|
+
export declare const KANJI_SEQUENCES: [number, string][];
|
|
55
|
+
/** `PLANE1_HIGH_ROWS` を1つの文字列にしたもの。(区 − 85) × 94 + (点 − 1) 番目のコードポイント */
|
|
56
|
+
export declare const PLANE1_HIGH: string;
|
|
57
|
+
/**
|
|
58
|
+
* JIS X 0213:2004 の2面 (JIS互換漢字2面。終端 0x3A)。[区, 94 字 (点の順)]。字のある区だけ
|
|
59
|
+
*/
|
|
60
|
+
export declare const PLANE2: [number, string][];
|
|
61
|
+
/**
|
|
62
|
+
* 色の表 (CLUT)。8つの組 × 16色、RGBA の16進。後ろの4組 (65〜127) は 64 を引いた番号の色を半分透かしたもの (65〜72 だけは 0〜7 番の基本の色)。
|
|
63
|
+
* libaribcaption の表は 101 番と 119 番の青が `09` になっていたが、
|
|
64
|
+
* 元の 37 番・55 番 (`55ff00`・`ff5500`) を透かしたものなので `00`
|
|
65
|
+
*/
|
|
48
66
|
export declare const CLUT: string[];
|
|
49
67
|
/** 外字 (DRCS) の画像の MD5 → 置き換える字。足し方は上の説明 */
|
|
50
68
|
export declare const DRCS_REPLACE: Map<string, number>;
|
package/dist/b24-tables.js
CHANGED
|
@@ -5,13 +5,16 @@
|
|
|
5
5
|
* 元は libaribcaption v1.1.2 の表 (b24_conv_tables.hpp / b24_gaiji_table.hpp / b24_colors.cpp /
|
|
6
6
|
* b24_drcs_conv.cpp) に denpa の外字の直しを当てたもの。ここが元で、上流は追わない。
|
|
7
7
|
*
|
|
8
|
-
* libaribcaption: Copyright (C) 2021 magicxqq <xqq@xqq.im> (MIT
|
|
8
|
+
* libaribcaption: Copyright (C) 2021 magicxqq <xqq@xqq.im> (MIT。著作権表示は [LICENSE](../LICENSE))
|
|
9
9
|
*
|
|
10
10
|
* **表の名前と `export const` の形は変えない。** danything/denpa-font の道具がこのファイルを
|
|
11
|
-
* 名前で読んでフォントに入れる字を決める (`ADDITIONAL_ROWS` も。`aribtext-gaiji.ts`・`fold.ts` も同じ)。
|
|
11
|
+
* 名前で読んでフォントに入れる字を決める (`ADDITIONAL_ROWS`・`PLANE1_HIGH_ROWS` も。`aribtext-gaiji.ts`・`fold.ts` も同じ)。
|
|
12
12
|
*
|
|
13
13
|
* - 漢字は EUC-JP で読んだものと違うところだけ持つ (`KANJI_DIFF`。番組表は EUC-JP のまま読む —
|
|
14
|
-
* 1区33点の 〜 / ~ などは字幕と番組表で違えてある。aribtext.ts の説明)
|
|
14
|
+
* 1区33点の 〜 / ~ などは字幕と番組表で違えてある。aribtext.ts の説明)。1〜84区は JIS X 0213:2004 の1面と
|
|
15
|
+
* 同じ字 (全角の形を選んだ点と、1区17点の  ̄ など libaribcaption のとおりの数点を除く)
|
|
16
|
+
* - JIS X 0213 の表 (2つのコードポイントの字・1面の 85〜94区・2面) は [scripts/jisx0213.ts](../scripts/jisx0213.ts) が
|
|
17
|
+
* x0213.org の対応表から書く。手で直さない
|
|
15
18
|
* - U+FFFD は規格で空いているところ
|
|
16
19
|
*
|
|
17
20
|
* ## 外字 (DRCS) の置き換えを足す
|
|
@@ -97,7 +100,93 @@ const ADDITIONAL_ROWS = [
|
|
|
97
100
|
];
|
|
98
101
|
/** 追加記号・追加漢字を1つの文字列にしたもの。(区 − 85) × 94 + (点 − 1) 番目のコードポイント */
|
|
99
102
|
export const ADDITIONAL = ADDITIONAL_ROWS.join('');
|
|
100
|
-
|
|
103
|
+
// ここから JIS X 0213 の表 (packages/arib/scripts/jisx0213.ts が書く。手で直さない)
|
|
104
|
+
/**
|
|
105
|
+
* JIS X 0213:2004 の1面で、2つのコードポイントで表す字 (半濁点の付いたかな・発音記号と、声調の組)。
|
|
106
|
+
* [区×94+点 (0 から), 字]。字幕は1区画、番組表は2つのコードポイントのまま出す
|
|
107
|
+
*/
|
|
108
|
+
export const KANJI_SEQUENCES = [
|
|
109
|
+
[368, "か゚"], // 4区87点
|
|
110
|
+
[369, "き゚"], // 4区88点
|
|
111
|
+
[370, "く゚"], // 4区89点
|
|
112
|
+
[371, "け゚"], // 4区90点
|
|
113
|
+
[372, "こ゚"], // 4区91点
|
|
114
|
+
[462, "カ゚"], // 5区87点
|
|
115
|
+
[463, "キ゚"], // 5区88点
|
|
116
|
+
[464, "ク゚"], // 5区89点
|
|
117
|
+
[465, "ケ゚"], // 5区90点
|
|
118
|
+
[466, "コ゚"], // 5区91点
|
|
119
|
+
[467, "セ゚"], // 5区92点
|
|
120
|
+
[468, "ツ゚"], // 5区93点
|
|
121
|
+
[469, "ト゚"], // 5区94点
|
|
122
|
+
[557, "ㇷ゚"], // 6区88点
|
|
123
|
+
[975, "æ̀"], // 11区36点
|
|
124
|
+
[979, "ɔ̀"], // 11区40点
|
|
125
|
+
[980, "ɔ́"], // 11区41点
|
|
126
|
+
[981, "ʌ̀"], // 11区42点
|
|
127
|
+
[982, "ʌ́"], // 11区43点
|
|
128
|
+
[983, "ə̀"], // 11区44点
|
|
129
|
+
[984, "ə́"], // 11区45点
|
|
130
|
+
[985, "ɚ̀"], // 11区46点
|
|
131
|
+
[986, "ɚ́"], // 11区47点
|
|
132
|
+
[1008, "˩˥"], // 11区69点
|
|
133
|
+
[1009, "˥˩"], // 11区70点
|
|
134
|
+
];
|
|
135
|
+
/**
|
|
136
|
+
* JIS X 0213:2004 の1面の 85〜94区 (第3水準の漢字)。JIS互換漢字1面 (終端 0x39) だけが引く。
|
|
137
|
+
* 漢字集合 (0x42) と追加記号 (0x3B) の 85区から先は `ADDITIONAL`
|
|
138
|
+
*/
|
|
139
|
+
const PLANE1_HIGH_ROWS = [
|
|
140
|
+
"擄擊擐擷擻攢攩敏敧斝既昀昉昕昞昺昢昤昫昰昱昳曻晈晌𣇄晙晚晡晥晳晷晸暍暑暠暲暻曆曈㬢曛曨曺朓朗朳杦杇杈杻极枓枘枛枻柹柀柗柼栁桒栝栬栱桛桲桵梅梣梥梲棈棐棨棭棰棱棼椊楉𣗄椵楂楗楣楤楨榀﨔榥榭槏㮶", // 85区
|
|
141
|
+
"㯃槢槩槪槵槶樏樕𣜿樻樾橅橐橖橛橫橳𣝣檉檔檝檞檥櫤櫧㰏欄欛欞欬欵歆歖歠步歧歷殂殩殭殺每毖毗毿氅氐氳汙汜沪汴汶沅沆沘沜泻泆泔泠泫泮𣳾洄洎洮洱洹洿浘浥海涂涇涉涔涪涬涿淄淖淚淛淝淼渚渴湄湜湞溫溱滁", // 86区
|
|
142
|
+
"滇滎漐漚漢漪漯漳潑潙潞潡潢潾澈澌澍澔澠澧澶澼濇濊濹濰濵瀅瀆瀨灊灝灞灎灤灵炅炤炫炷烔烘烤焏焫焞焠焮焰煆煇煑煮煒煜煠煨凞熅熇熒燁熺燄燾爀爕牕牖㸿犍犛犾狀狻𤟱猧猨猪獐獦獼玕玟玠玢玦玫珉珏珖珙珣珩", // 87区
|
|
143
|
+
"琇琊琚琛琢琦琨琪琫琬琮琯琰瑄瑆瑇瑋瑗瑢瑫瑭璆璇璉璘璜璟璣璐璦璨璩璵璿瓈瓉瓚瓿甁甗甯畯畹疒㽲痎痤瘀瘂瘈瘕瘖瘙瘞瘭瘵癃癋癤癥癭癯癱皁皛皝皞皦皪皶盅盌盎盔盦盱盼眊眙眴眶睆睍睎睜睟睢睺瞀瞔瞪矠砭𥒎", // 88区
|
|
144
|
+
"硃硎硏硑硨确碑碰𥔎碭磤磲礀磷礜礮礱礴社祉祅祆祈祐祖祜祝神祥祹禍禎福禘禱禸秈秊𥝱秔秞秫秭稃穀稹穝穭突窅窠𥧄窳窻竎竫竽笒笭笻筇筎筠筭筯筲箞節篗篙簁簱簞簠簳簶䉤𥶡籙籭籹粏粔粠粼糕糙糝紇紈紓紝紣紱", // 89区
|
|
145
|
+
"絁絈絓絜絺綃綋綠綦緂緌緖緣練縨縈縑縕繁繇繒繡纊纍罇署羑羗羿翎翛翟翬翮翺者耔耦耵耷耼胊胗胠胳脘腊腠腧腨腭膻臊臏臗臭䑓䑛艠艴𦫿芎芡芣芤芩芮芷芾芿苆苕苽苾茀茁荢茢茭茺荃荇荑荕荽莆莒莘莧莩莿菀菇菏", // 90区
|
|
146
|
+
"菑菡菪萁萆萊著葈葟葰葳蒅蒞蒯蒴蒺蓀蓂𦹀蔲蔞蔣蔯蕙蕤﨟薭蕺薌薏薢薰藋藎藭蘒藿蘄蘅蘐𧃴蘘蘩蘸虗虛虜虢䖝虬虵蚘蚸蛺蛼蛽蜋蝱螇螈螬螭螵䗪蟖蟬蠆蠊蠐蠔蠟袘袪裊裎𧚄裵褜褐褘褙褚褧褰褲褹襀覔視觔觥觶訒訕", // 91区
|
|
147
|
+
"訢訷詇詎詝詡詵詹誧諐諟諴諶諸謁謹譆譔譙譩讝豉豨賓賡賴賸賾贈贒贛趯跎跑跗踠踣踽蹰蹻𨉷軀䡄軺輞輭輶轔𨏍辦辵迤迨迮逈逭逸邈邕邗邙邛邢邳邾郄郅郇郗郝郞郯郴都鄔鄕鄖鄢鄣鄧鄯鄱鄴鄽酈酛醃醞醬醱醼釗釻釤", // 92区
|
|
148
|
+
"釥釭釱鈇鈐鈸鈹鈺鈼鉀鉃鉏鉸銈鋂鋋鋌鋓鋠鋿錄錟錡錥鍈鍉鍊鍤鍥鍪鍰鎛鎣鎺鏆鏞鏟鐄鏽鐳鑊鑣鑫鑱鑲閎閟閦閩閬閶閽闋闐闓䦰闚闞陘隄隆隝隤隥雒雞難雩雯霳霻靍靎靏靚靮靳鞕鞮鞺韁韉韞韛韴響頊頞頫頰頻顒顓顖", // 93区
|
|
149
|
+
"顗顙顚類顥顬颺飈飧饘馞騂騃騤騭騮騸驊驎驒骶髁髃髎髖髹鬂鬈鬠䰗鬭魞魹魦魲魵鮄鮊鮏鮞鮧鯁鯎鯥鯸鯽鰀鰣鱁鱏鱐鱓鱣鱥鱷鴝鴞鵃鵇鵒鵣鵰鵼鶊鶖鷀鶬鶼鷗𪆐鷧鸇鸕鹼麞麤麬麯麴麵黃黑鼐鼹齗龐龔龗龢姸屛幷瘦繫", // 94区
|
|
150
|
+
];
|
|
151
|
+
/** `PLANE1_HIGH_ROWS` を1つの文字列にしたもの。(区 − 85) × 94 + (点 − 1) 番目のコードポイント */
|
|
152
|
+
export const PLANE1_HIGH = PLANE1_HIGH_ROWS.join('');
|
|
153
|
+
/**
|
|
154
|
+
* JIS X 0213:2004 の2面 (JIS互換漢字2面。終端 0x3A)。[区, 94 字 (点の順)]。字のある区だけ
|
|
155
|
+
*/
|
|
156
|
+
export const PLANE2 = [
|
|
157
|
+
[1, "𠂉丂丏丒丩丫丮乀乇么𠂢乑㐆𠂤乚乩亝㐬㐮亹亻𠆢亼仃仈仐仫仚仱仵伀伖佤伷伾佔佘𠈓佷佸佺佽侂侅侒侚俦侲侾俅俋俏俒㑪俲倀倐倓倜倞倢㑨偂偆偎偓偗偣偦偪偰傣傈傒傓傕傖傜傪𠌫傱傺傻僄僇僳𠎁僎𠍱僔僙僡僩㒒"],
|
|
158
|
+
[3, "儈𠏹儗儛𠑊兠𠔉关冃冋㒼冘冣冭㓇冼𠗖𠘨凳凴刂划刖𠝏剕剜剬剷劄劂𠠇劘𠠺劤劦劯劺劻勊㔟勑𠢹勷匊匋匤匵匾卂𠥼𠦝卧卬卺厤厴𠫓厷叀𠬝㕝㕞叕叚㕣叴叵呕吤吨㕮呃呢呦呬咊咍咕咠咦咭咮咷咺咿哃𠵅哬哯哱哳唀唁唉"],
|
|
159
|
+
[4, "唼啁㖦啇啊㖨啠啡啤𠷡啽喂喈喑㗅嗒𠺕𠹭喿嗉嗌嗑嗝㗚嗢𠹤嗩嘨𠽟嘇嘐嘰嘷㗴嘽嘿噀噇噞噠噭㘅嚈嚌嚕嚚嚝嚨嚭嚲囅囍囟囨囶囷𡈁圕圣𡉕圩𡉻坅坆坌坍𡉴坨坯坳坴坵坻𡋤𡋗垬垚垝垞垨埗𡋽埌𡌶𡍄埞埦埰㙊埸埻埽堄堞"],
|
|
160
|
+
[5, "堠堧堲堹𡏄塉塌塧墊墋墍墏墐墔墝墪墱𡑭壃壍壢壳壴夅夆夋复夔夤𡗗㚑夽㚙奆㚖𦰩奛奟𡙇奵奶奼妟妮妼姈姍姞姣姤姧姮𡜆𡝂㛏娌娍娗娧娭婕婥婺媋媜媟媠媢媱媳媵媺媿嫚嫜嫠嫥嫰嫮嫵嬀嬈嬗嬴嬭孌孒孨孯孼孿宁宄𡧃"],
|
|
161
|
+
[8, "宖宬㝡寀㝢寎寖㝬㝫寱寽㝵尃尩尰𡱖屟屣屧屨屩屰𡴭𡵅屼𡵸𡵢岈岊㟁𡶡𡶜岠岢岦岧𡶒岭岵𡶷峉𡷠𡸳崆崐崫崝崠崤崦崱崹嵂㟨嵡嵪㟴嵰𡼞㟽嶈㠀嶒嶔嶗嶙嶰嶲嶴𡽶嶹巑巗巘巠𡿺巤巩㠯帀㠶帒帕㡀帟帮帾幉㡜幖㡡幫幬幭"],
|
|
162
|
+
[12, "幮𢅻庥庪庬庹庿廆廒廙𢌞廽弈弎弜𢎭弞彇彣彲彾徏徢徤徸忄㣺忇忋忒忓忔忢忮忯忳忼㤗怗怢怤㤚恌恿悊悕您𢛳悰悱悾惈惙惛惮惲惵愐愒愓愙愞愺㥯慁慆慠慼𢡛憒憓憗憘憥憨憭𢢫懕懝懟懵𢦏戕戣戩扆扌扑扒扡扤扻扭扳"],
|
|
163
|
+
[13, "抙抦拕𢪸拽挃挍挐𢭏𢭐挲挵挻挼捁捄捎𢭆捙𢰝𢮦捬掄掙𢰤掔掽揷揔揕揜揠揫揬揲搉搞搥搩搯摚摛摝摳摽撇撑撝撟擋擌擕擗𢷡擤擥擿攄㩮攏攔攖㩳攞攲敄敔敫敺斁斄斅斊斲斵斸斿旂旉旔㫖旲旹旼昄昈昡昪晅晑晎㫪𣇃晗"],
|
|
164
|
+
[14, "晛晣𣇵𣆶晪晫晬晭晻暀暐暒暙㬎暭暱暵㬚暿㬜曬㫗朁朅朒𣍲朙𣏓𣏒杌杍杔杝𣏐𣏤𣏕杴杶𣏚枒𣏟荣栐枰枲柃柈柒柙柛柰柷𣑊𣑑𣑋栘栟栭𣑥栳栻栾桄桅桉桌桕桗㭷桫桮桺桼梂梐梖㭭梘梙梚梜梪梫梴梻棻𣓤𣕚﨓棃棅棌棏棖"],
|
|
165
|
+
[15, "棙棤棥棬棷椃椇㮇㮈𣖔椻㮍楆楩楬楲楺楿榒㮤榖榘榦榰榷榺榼槀槑槖𣘹𣙇樰𣘸𣘺槣槮槯槳㯍槴槾樑樚樝𣜜樲樳樴樿橆橉橺橎橒橤𣜌橾檃檋㯰檑檟檡𣝤檫檽櫆櫔櫐櫜櫝𣟿𣟧櫬櫱櫲櫳櫽𣠤欋欏欐欑𣠽欗㰦欯歊歘歬歵歺殁"],
|
|
166
|
+
[78, "殛殮𣪘殽殾毇毈毉毚毦毧毮毱氂氊氎氵氶氺𣱿氿汍汛汭沄沉㳃沔沕沗沭泂泐㳒泖泚泜泩泬泭𣴀洀洊洤洦洧汧洯洼浛浞浠浰涀涁涊涍涑涘𣵀渗𣷺𣷹𣷓涫涮涴淂洴淈淎淏淐淟淩淶渶渞渢渧㴑渲渼湈湉湋湌湏湑湓湔湗湣㴞"],
|
|
167
|
+
[79, "溓溧溴溿滃滊滙漵滫滹滻漊漌漘漥漶漼𣽾潒潗潚潠潨澘潽澐澖澾澟澥澯㵤澵濈濉濚濞濩𤂖濼瀀瀇瀊瀣𤄃瀹瀺瀼灃灇灋㶚灔灥灩灬灮灶灾炁炆炕炗炻𤇆炟炱𤇾烬烊烑烓烜焃焄焆焇焈焌㷀焯焱煐煊煓煞㷔熖熀熛熠熢熮熯"],
|
|
168
|
+
[80, "熳𤎼燋燓燙燜爇㸅爫爫爴爸爹丬牂牓牗牣𤘩牮牯牸牿犎𤚥犭犮犰犱狁㹠狌㹦㹨狳狺猇猒猘猙㺃猹猬猱猳猽獒㺔獫獬𤢖獮獯獱獷玁玅玊玔玘玜玞玥玨玵玷玹玼玿珅珋珡珧珹琓珺琁琤琱琹瑓瑀瑃瑍瑒瑝瑱璁璅璈𤩍璒璗璙"],
|
|
169
|
+
[81, "璠璡璥璪璫璹璻璺瓖瓘瓞瓯瓫𤭖瓺𤭯甠甤甪㽗𤰖甽甾畀畈畎畐畒畬畲畱畺畽畾疁𤴔疌㽵疢㽷疰疷疿痀痆痏痓痝痟痠痧痬痮痱痹瘃瘘瘇瘏㾮𤸎瘓瘛瘜𤸷瘥瘨瘼瘳𤹪㿉癁𤺋癉癕㿗癮皕皜皡皠皧皨皯𥁊盉𥁕盨盬𥄢眗眚眭眵"],
|
|
170
|
+
[82, "𥆩䀹𥇥𥇍睘睠睪𥈞睲睼睽𥉌䁘瞚瞟瞢瞤瞩矞矟矤矦矪矬䂓矰矴矻𥐮砅砆砉砍砙砡砬硇硤硪𥓙碊碔碤碝碞碟碻磈磌磎磕磠磡磦磹磺磻磾𥖧礐礛礰礥礻祊祘祛䄅祧祲禔禕禖禛禡禩禴离秂秇秌种秖䅈𥞩𥞴䅏稊稑稕稛稞䅣稭"],
|
|
171
|
+
[83, "稸穇穌穖穙穜穟穠穧穪穵穸窂窊窐窣窬𥧔䆴窹窼窾䆿竌竑竧竨竴𥫤𥫣笇𥫱笽笧笪笮笯笱䇦䇳筿筁䇮筕筹筤筦筩筳𥮲䈇箐箑箛䈎箯箵箼篅篊𥱋𥱤篔篖篚篪篰簃簋簎簏簦籅籊籑籗籞籡籩籮籯籰𥸮𥹖𥹥粦𥹢粶粷粿𥻘糄𥻂糈"],
|
|
172
|
+
[84, "糍𥻨糗𥼣糦糫𥽜糵紃紉䋆紒紞𥿠𥿔紽紾絀絇𦀌𥿻䋖絙絚絪絰䋝絿𦀗綆綈綌綗𦁠綝綧綪綶綷緀緗緙緦緱緹䌂𦃭縉縐縗縝縠縧縬繅繳繵繾纆纇䌫纑纘纚䍃缼缻缾罃罄罏㓁𦉰罒𦊆罡罣罤罭罽罾𦍌羐养𣴎羖羜羭𦐂翃翏翣翥翯"],
|
|
173
|
+
[85, "翲耂耊耈耎耑耖耤耬耰聃聦聱聵聻肙肜肤肧肸𦙾胅胕胘胦𦚰脍胵胻䏮脵脖脞䏰脤脧脬𦜝脽䐈腩䐗膁䐜膄膅䐢膘膲臁臃臖臛𦣝臤𦣪臬𦥑臽臿𦥯舄𦧝舙舡舢𦨞舲舴舼艆艉艅𦩘艋䑶艏䑺艗𦪌艜艣𦪷艹艹艹䒑艽艿芃芊芓芧芨"],
|
|
174
|
+
[86, "芲芴芺芼苢苨苷茇茈茌荔茛茝茰茼荄荗䒾荿䓔䒳莍莔莕莛莝菉菐菔菝菥菹萏萑萕𦱳萗萹葊葏葑葒葙葚葜𦳝葥葶葸葼蒁䔍蓜蒗蒦蒾䔈蓎蓏蓓𦹥蓧蓪蓯蓰蓱蓺蓽蔌蔛蔤蔥蔫蔴蕏蕯䔥䕃蔾蕑蕓蕞蕡蕢𦾔蕻蕽蕿薁薆薓薝薟𦿸"],
|
|
175
|
+
[87, "𦿶𦿷薷薼藇藊藘藙藟藡藦藶蘀蘑蘞蘡蘤蘧𧄍蘹蘼𧄹虀蘒虓虖虯虷虺蚇蚉蚍蚑蚜蚝蚨﨡蚱蚳蛁蛃蛑蛕蛗蛣蛦䖸蜅蜇蜎蜐蜓蜙蜟蜡蜣蜱蜺蜾蝀蝃蝑蝘蝤蝥蝲蝼𧏛𧏚螧螉螋螓螠𧏾䗥螾𧐐蟁蟎蟵蟟𧑉蟣蟥蟦蟪蟫蟭蠁蠃蠋蠓蠨"],
|
|
176
|
+
[88, "蠮蠲蠼䘏衊衘衟衤𧘕𧘔衩𧘱衯袠袼袽袾裀裒𧚓裑裓裛裰裱䙁褁𧜎褷𧜣襂襅襉𧝒䙥襢覀覉覐覟覰覷觖觘觫䚡觱觳觽觿䚯訑訔𧦅訡訵訾詅詍詘誮誐誷誾諗諼𧪄謊謅謍謜謟謭譃䜌譑譞譶譿讁讋讔讕讜讞谹𧮳谽𧮾𧯇豅豇豏豔"],
|
|
177
|
+
[89, "豗豩豭豳𧲸貓貒貙䝤貛貤賖賕賙𧶠賰賱𧸐贉贎赬趄趕趦𧾷跆跈跙跬踌䟽跽踆𨂊踔踖踡踢踧𨂻䠖踶踹蹋蹔蹢蹬蹭蹯躘躞躮躳躵躶躻𨊂軑軔䡎軹𨋳輀輈輗輫轀轊轘𨐌辤辴辶辶𨑕迁迆﨤迊迍迓迕迠迱迵迻适逌逷𨕫遃遄遝𨗈"],
|
|
178
|
+
[90, "𨗉邅邌邐阝邡䢵邰邶郃郈𨛗郜郟𨛺郶郲鄀郫郾郿鄄鄆鄘鄜鄞鄷鄹鄺酆酇酗酙酡酤酴酹醅醎醨醮醳醶釃釄釚𨥉𨥆釬釮鈁鈊鈖鈗𨥫鈳鉂鉇鉊鉎鉑鉖鉙鉠鉡鉥鉧鉨𨦇𨦈鉼鉽鉿銉銍銗銙銟銧銫𨦺𨦻銲銿鋀鋆鋎鋐鋗鋙鋥鋧錑𨨞"],
|
|
179
|
+
[91, "𨨩鋷鋹鋻錂錍錕錝錞錧錩𨩱𨩃鍇鍑鍗鍚鍫鍱鍳鎡𨪙𨫍鎈鎋鎏鎞鏵𨫤𨫝鏱鏁鏇鏜鏢鏧鐉鐏鐖鐗鏻鐲鐴鐻鑅𨯁𨯯鑭鑯镸镹閆閌閍𨴐閫閴𨵱闈𨷻𨸟阬阳阴𨸶阼陁陡𨺉隂𨻫隚𨼲䧧隩隯隳隺隽䧺𨿸雘雚雝䨄霔霣䨩霶靁靇靕靗靛"],
|
|
180
|
+
[92, "靪𩊠𩊱鞖鞚鞞鞢鞱鞲鞾韌韑韔韘韙韡韱頄頍頎頔頖䪼𩒐頣頲頳頥顇顦颫颭颰𩗏颷颸颻颼颿飂飇飋飠𩙿飡飣飥飪飰飱飳餈䬻𩛰餖餗𩜙餚餛餜𩝐餱餲餳餺餻餼饀饁饆饍饎饜饟饠馣馦馹馽馿駃駉駔駙駞𩣆駰駹駼騊騑騖騚騠"],
|
|
181
|
+
[93, "騱騶驄驌驘䯂骯䯊骷䯒骹𩩲髆髐髒髕䯨髜髠髥髩鬃鬌鬐鬒鬖鬜鬫鬳鬽䰠魋魣魥魫魬魳魶魷鮦鮬鮱𩷛𩸽鮲鮸鮾鯇鯳鯘鯝鯧鯪鯫鯯鯮𩸕鯺𩺊鯷𩹉鰖鰘鰙鰚鰝鰢鰧鰩鰪𩻄鰱鰶鰷鱅鱜𩻩鱉鱊𩻛鱔鱘鱛鱝鱟鱩鱪鱫鱭鱮鱰鱲鱵鱺"],
|
|
182
|
+
[94, "鳦鳲鴋鴂𩿎鴑鴗鴘𪀯䳄𪀚鴲䳑鵂鵊鵟鵢𪃹鵩鵫𪂂鵳鵶鵷鵾鶄鶍鶙鶡鶿鶵鶹鶽鷃鷇鷉鷖鷚鷟鷠鷣鷴䴇鸊鸂鸍鸙鸜鸝鹻𢈘麀麅麛麨𪎌麽𪐷黟黧黮黿鼂䵷鼃鼗鼙鼯鼷鼺鼽齁齅齆齓齕齘𪗱齝𪘂齩𪘚齭齰齵𪚲��������"],
|
|
183
|
+
];
|
|
184
|
+
// ここまで JIS X 0213 の表
|
|
185
|
+
/**
|
|
186
|
+
* 色の表 (CLUT)。8つの組 × 16色、RGBA の16進。後ろの4組 (65〜127) は 64 を引いた番号の色を半分透かしたもの (65〜72 だけは 0〜7 番の基本の色)。
|
|
187
|
+
* libaribcaption の表は 101 番と 119 番の青が `09` になっていたが、
|
|
188
|
+
* 元の 37 番・55 番 (`55ff00`・`ff5500`) を透かしたものなので `00`
|
|
189
|
+
*/
|
|
101
190
|
export const CLUT = [
|
|
102
191
|
"000000ff", "ff0000ff", "00ff00ff", "ffff00ff", "0000ffff", "ff00ffff", "00ffffff", "ffffffff", "00000000", "aa0000ff", "00aa00ff", "aaaa00ff", "0000aaff", "aa00aaff", "00aaaaff", "aaaaaaff", // 0
|
|
103
192
|
"000055ff", "005500ff", "005555ff", "0055aaff", "0055ffff", "00aa55ff", "00aaffff", "00ff55ff", "00ffaaff", "550000ff", "550055ff", "5500aaff", "5500ffff", "555500ff", "555555ff", "5555aaff", // 1
|
|
@@ -105,8 +194,8 @@ export const CLUT = [
|
|
|
105
194
|
"aaaaffff", "aaff00ff", "aaff55ff", "aaffaaff", "aaffffff", "ff0055ff", "ff00aaff", "ff5500ff", "ff5555ff", "ff55aaff", "ff55ffff", "ffaa00ff", "ffaa55ff", "ffaaaaff", "ffaaffff", "ffff55ff", // 3
|
|
106
195
|
"ffffaaff", "00000080", "ff000080", "00ff0080", "ffff0080", "0000ff80", "ff00ff80", "00ffff80", "ffffff80", "aa000080", "00aa0080", "aaaa0080", "0000aa80", "aa00aa80", "00aaaa80", "aaaaaa80", // 4
|
|
107
196
|
"00005580", "00550080", "00555580", "0055aa80", "0055ff80", "00aa5580", "00aaff80", "00ff5580", "00ffaa80", "55000080", "55005580", "5500aa80", "5500ff80", "55550080", "55555580", "5555aa80", // 5
|
|
108
|
-
"5555ff80", "55aa0080", "55aa5580", "55aaaa80", "55aaff80", "
|
|
109
|
-
"aaaaff80", "aaff0080", "aaff5580", "aaffaa80", "aaffff80", "ff005580", "ff00aa80", "
|
|
197
|
+
"5555ff80", "55aa0080", "55aa5580", "55aaaa80", "55aaff80", "55ff0080", "55ff5580", "55ffaa80", "55ffff80", "aa005580", "aa00ff80", "aa550080", "aa555580", "aa55aa80", "aa55ff80", "aaaa5580", // 6
|
|
198
|
+
"aaaaff80", "aaff0080", "aaff5580", "aaffaa80", "aaffff80", "ff005580", "ff00aa80", "ff550080", "ff555580", "ff55aa80", "ff55ff80", "ffaa0080", "ffaa5580", "ffaaaa80", "ffaaff80", "ffff5580", // 7
|
|
110
199
|
];
|
|
111
200
|
/** 外字 (DRCS) の画像の MD5 → 置き換える字。足し方は上の説明 */
|
|
112
201
|
export const DRCS_REPLACE = new Map([
|
|
@@ -407,4 +496,6 @@ export const DRCS_REPLACE = new Map([
|
|
|
407
496
|
['dedbee40c06e17b51932431dc8cd8334', 0x8fc2], // denpa: 一点しんにょうの「迂」。2026-10-10 時点の録画 58 本で表に無かったもの
|
|
408
497
|
['e806d1481cfa721da5f60413531f39bd', 0x1f4f1], // denpa: 携帯電話 📱 (36x36・4階調)。NHK総合 2026-10-11。録画 20 本 (字幕に字のあったのは 9 本) で表に無かったのはこれだけ
|
|
409
498
|
['d9b5d861024ce112c12fa5f155bb1af3', 0x1f50a], // denpa: 音の出ているスピーカー 🔊 (36x36・4階調)。テレビ朝日 2026-10-17 のアニメの字幕で1本に5回
|
|
499
|
+
['d1e6371a34eaf49154ea6a4d0e9064ac', 0x1f50a], // denpa: 音の出ているスピーカー 🔊。TBS 2026-10 のアニメの字幕で1本に22回 (テレビ朝日のものと画像が違う)
|
|
500
|
+
['22db8ff6ac75b60b76a15a6e9c42a5db', 0x1f4fa], // denpa: テレビ 📺。上と同じ番組で2回
|
|
410
501
|
]);
|
package/dist/b24caption.d.ts
CHANGED
|
@@ -14,6 +14,10 @@
|
|
|
14
14
|
* 取っていて常に 0 になり、最初の1回しか読まない。ここは群を正しく見る
|
|
15
15
|
* (番組が変わって群が替わったときに書式を読み直す)
|
|
16
16
|
* - **点滅 (FLC) を読み取る。** あちらは読み捨てている
|
|
17
|
+
* - **JIS X 0213 を最後まで読む。** JIS互換漢字2面 (0x3A) を2面の表で、1面 (0x39) の 85〜94区を
|
|
18
|
+
* 第3水準の漢字で引く。か゚ のような2つのコードポイントの字も出す (あちらは空き)
|
|
19
|
+
* - **表で空いている点 (U+FFFD) はゲタ (〓) にする。** 「�」は Denpa Font に無く、端末の字の
|
|
20
|
+
* 「?」の印で出る。定義されていない外字と同じ扱い
|
|
17
21
|
*
|
|
18
22
|
* 入力は字幕の PES の中身 (データ識別 0x80 から)。ffmpeg が `-c:s copy` で Matroska
|
|
19
23
|
* (`S_ARIBSUB`) に入れたコマの中身がそのままこれになる。
|
|
@@ -24,7 +28,7 @@ import { type CaptionLanguage, type CaptionPage } from "./caption-text.js";
|
|
|
24
28
|
* ストリームごとに1つ作って、届いた順に食わせる。
|
|
25
29
|
*
|
|
26
30
|
* **読むのは1つの言語だけ** (`language`。1〜8)。言語ごとに書式も位置も別に続くので、2つの言語を出し分けるなら
|
|
27
|
-
* 言語ごとに1つ作って、同じコマを両方に食わせる (`server/captions.ts` の `CaptionText`)
|
|
31
|
+
* 言語ごとに1つ作って、同じコマを両方に食わせる (denpa の `server/captions.ts` の `CaptionText`)
|
|
28
32
|
*/
|
|
29
33
|
export declare class B24CaptionDecoder {
|
|
30
34
|
readonly language: number;
|