Skip to content

Commit 950e59e

Browse files
committed
优化 db 尺寸
1 parent d5a45c1 commit 950e59e

File tree

6 files changed

+107
-93
lines changed

6 files changed

+107
-93
lines changed

tools/build_db.py

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import json
2+
import shutil
3+
4+
import unidata_blocks
5+
from character_encoding_utils import gb2312, big5, shiftjis, ksx1001
6+
7+
from tools import data_dir, www_data_dir, font_styles, language_flavors
8+
9+
10+
def _build_db() -> dict:
11+
tags = []
12+
13+
for block in unidata_blocks.get_blocks():
14+
tags.append(block.name)
15+
for category in gb2312.get_categories():
16+
tags.append(f'gb2312/{category}')
17+
for category in big5.get_categories():
18+
tags.append(f'big5/{category}')
19+
for category in shiftjis.get_categories():
20+
tags.append(f'shiftjis/{category}')
21+
for category in ksx1001.get_categories():
22+
tags.append(f'ksx1001/{category}')
23+
24+
ai0 = {}
25+
26+
for font_style in font_styles:
27+
glyph_names = []
28+
for line in data_dir.joinpath(font_style, f'AI0-SourceHan{font_style.capitalize()}').read_text('utf-8').splitlines():
29+
glyph_names.append(line.split(' ')[3])
30+
ai0[font_style] = glyph_names
31+
32+
mapping = {}
33+
34+
for (font_style_index, font_style) in enumerate(font_styles):
35+
for language_flavor in language_flavors:
36+
for line in data_dir.joinpath(font_style, f'utf32-{language_flavor}.map').read_text('utf-8').splitlines():
37+
tokens = line.split(' ')
38+
code_point = int(tokens[0].removeprefix('<').removesuffix('>'), 16)
39+
glyph_id = int(tokens[1])
40+
41+
if code_point not in mapping:
42+
c = chr(code_point)
43+
tag_indices = [tags.index(unidata_blocks.get_block_by_code_point(code_point).name)]
44+
45+
gb2312_category = gb2312.query_category(c)
46+
if gb2312_category is not None:
47+
tag_indices.append(tags.index(f'gb2312/{gb2312_category}'))
48+
49+
big5_category = big5.query_category(c)
50+
if big5_category is not None:
51+
tag_indices.append(tags.index(f'big5/{big5_category}'))
52+
53+
shiftjis_category = shiftjis.query_category(c)
54+
if shiftjis_category is not None:
55+
tag_indices.append(tags.index(f'shiftjis/{shiftjis_category}'))
56+
57+
ksx1001_category = ksx1001.query_category(c)
58+
if ksx1001_category is not None:
59+
tag_indices.append(tags.index(f'ksx1001/{ksx1001_category}'))
60+
61+
mapping[code_point] = [
62+
[],
63+
[],
64+
tag_indices,
65+
]
66+
67+
mapping[code_point][font_style_index].append(glyph_id)
68+
69+
return {
70+
'tags': tags,
71+
'ai0': ai0,
72+
'mapping': mapping,
73+
}
74+
75+
76+
def main():
77+
if www_data_dir.exists():
78+
shutil.rmtree(www_data_dir)
79+
www_data_dir.mkdir(parents=True)
80+
81+
db = _build_db()
82+
83+
file_path = www_data_dir.joinpath('db.json')
84+
file_path.write_text(json.dumps(db), 'utf-8')
85+
print(f"Build: '{file_path}'")
86+
87+
88+
if __name__ == '__main__':
89+
main()

tools/build_www_data.py

Lines changed: 0 additions & 76 deletions
This file was deleted.

www/data/db.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

www/data/mapping.json

Lines changed: 0 additions & 1 deletion
This file was deleted.

www/index.html

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@
1414
<h1 class="title">思源映射查看器</h1>
1515
</nav>
1616
<main class="main">
17-
<template v-if="mappingLoadFailed">
17+
<template v-if="dbLoadFailed">
1818
<div class="error-tip">映射数据加载失败,请刷新浏览器重试</div>
1919
</template>
20-
<template v-else-if="!mapping">
20+
<template v-else-if="!db">
2121
<div class="loading-tip">正在加载映射数据,请稍后</div>
2222
</template>
23-
<template v-if="mapping">
23+
<template v-if="db">
2424
<label class="input">
2525
<input type="text" placeholder="请在此输入字符" v-model="input">
2626
</label>
@@ -51,20 +51,20 @@ <h1 class="title">思源映射查看器</h1>
5151
<div class="title">
5252
<span class="code-point">U+{{ codePoint.toString(16).toUpperCase().padStart(4, '0') }}</span>
5353
<span class="char">{{ c === ' ' ? '&nbsp;' : c }}</span>
54-
<span class="tag" v-for="tag in mapping[codePoint].tags" :key="tag">{{ tag }}</span>
54+
<span class="tag" v-for="tagIndex in db.mapping[codePoint][2]" :key="tagIndex">{{ db.tags[tagIndex] }}</span>
5555
</div>
5656
<div class="glyphs">
57-
<div class="line" v-if="displaySans && 'sans' in mapping[codePoint]">
58-
<div class="glyph" v-for="languageFlavor in languageFlavors" :key="languageFlavor" :set="glyphName = mapping[codePoint]['sans'][languageFlavor]">
57+
<div class="line" v-if="displaySans && db.mapping[codePoint][0].length > 0">
58+
<div class="glyph" v-for="(languageFlavor, languageFlavorIndex) in languageFlavors" :key="languageFlavor" :set="glyphName = db.ai0['sans'][db.mapping[codePoint][0][languageFlavorIndex]]">
5959
<div class="info sans-info">
6060
<span class="language-flavor">{{ languageFlavor.toUpperCase() }}</span>
6161
<span class="glyph-name">{{ glyphName }}</span>
6262
</div>
6363
<span class="char" :style="{ width: fontSize * 1.4 + 'px', color: getGlyphColor(glyphName), fontFamily: 'SourceHanSans-' + languageFlavor.toUpperCase() + ', sans-serif', fontSize: fontSize + 'px', fontWeight: fontWeight }">{{ c === ' ' ? '&nbsp;' : c }}</span>
6464
</div>
6565
</div>
66-
<div class="line" v-if="displaySerif && 'serif' in mapping[codePoint]">
67-
<div class="glyph" v-for="languageFlavor in languageFlavors" :key="languageFlavor" :set="glyphName = mapping[codePoint]['serif'][languageFlavor]">
66+
<div class="line" v-if="displaySerif && db.mapping[codePoint][1].length > 0">
67+
<div class="glyph" v-for="(languageFlavor, languageFlavorIndex) in languageFlavors" :key="languageFlavor" :set="glyphName = db.ai0['serif'][db.mapping[codePoint][1][languageFlavorIndex]]">
6868
<div class="info serif-info">
6969
<span class="language-flavor">{{ languageFlavor.toUpperCase() }}</span>
7070
<span class="glyph-name">{{ glyphName }}</span>

www/js/app.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ createApp({
1010
'jp',
1111
'kr',
1212
],
13-
mapping: null,
14-
mappingLoadFailed: false,
13+
db: null,
14+
dbLoadFailed: false,
1515
input: '',
1616
displaySans: true,
1717
displaySerif: true,
@@ -24,7 +24,7 @@ createApp({
2424
let query = []
2525
for (let c of this.input) {
2626
let codePoint = c.codePointAt(0)
27-
if (codePoint in this.mapping && !query.includes(codePoint)) {
27+
if (codePoint in this.db.mapping && !query.includes(codePoint)) {
2828
query.push(codePoint)
2929
}
3030
}
@@ -51,16 +51,17 @@ createApp({
5151
},
5252
async created() {
5353
try {
54-
let response = await fetch('data/mapping.json')
54+
let response = await fetch('data/db.json')
5555
if (response.ok) {
56-
this.mapping = await response.json()
57-
console.log('加载映射:', this.mapping)
56+
let db = await response.json()
57+
console.log('加载映射:', db)
58+
this.db = db
5859
} else {
59-
this.mappingLoadFailed = true
60+
this.dbLoadFailed = true
6061
return
6162
}
6263
} catch (e) {
63-
this.mappingLoadFailed = true
64+
this.dbLoadFailed = true
6465
return
6566
}
6667

0 commit comments

Comments
 (0)