Skip to content

Commit d7298ce

Browse files
0x1b2cclaude
andcommitted
Seed bundled default custom phrases to user config on first launch
Closes #7 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent b81c81e commit d7298ce

4 files changed

Lines changed: 261 additions & 1 deletion

File tree

Apps/LaplaceIME/LaplaceIME/AppDelegate.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import Carbon
99
import Cocoa
1010
import InputMethodKit
11+
import PinyinEngine
1112

1213
@main
1314
class AppDelegate: NSObject, NSApplicationDelegate {
@@ -16,6 +17,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
1617

1718
func applicationDidFinishLaunching(_ aNotification: Notification) {
1819
registerInputSourceIfNeeded()
20+
CustomPhraseStore.seedDefaultIfMissing()
1921

2022
server = IMKServer(
2123
name: "LaplaceIME_Connection",

Packages/PinyinEngine/Package.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ let package = Package(
2323
name: "PinyinEngine",
2424
dependencies: [],
2525
resources: [
26-
.process("Resources")
26+
.copy("Seeds"),
27+
.process("Resources"),
2728
],
2829
plugins: [
2930
.plugin(name: "BuildInfoPlugin")

Packages/PinyinEngine/Sources/PinyinEngine/CustomPhraseStore.swift

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,4 +331,30 @@ public class CustomPhraseStore {
331331
let path = appSupport.appendingPathComponent("LaplaceIME/custom_phrases.toml").path
332332
return CustomPhraseStore(path: path)
333333
}
334+
335+
/// 首启 seed:若用户目录下尚无 `custom_phrases.toml`,从 bundle 内的
336+
/// `Seeds/custom_phrases.toml` 拷贝一份过去。已存在则不动,确保用户后续
337+
/// 编辑不被覆盖。失败静默——用户层缺失等价于无自定义短语。
338+
public static func seedDefaultIfMissing() {
339+
guard
340+
let appSupport = FileManager.default.urls(
341+
for: .applicationSupportDirectory, in: .userDomainMask
342+
).first
343+
else { return }
344+
let targetDir = appSupport.appendingPathComponent("LaplaceIME")
345+
let target = targetDir.appendingPathComponent("custom_phrases.toml")
346+
guard !FileManager.default.fileExists(atPath: target.path) else { return }
347+
guard
348+
let source = Bundle.module.url(
349+
forResource: "custom_phrases", withExtension: "toml",
350+
subdirectory: "Seeds")
351+
else { return }
352+
do {
353+
try FileManager.default.createDirectory(
354+
at: targetDir, withIntermediateDirectories: true)
355+
try FileManager.default.copyItem(at: source, to: target)
356+
} catch {
357+
// 忽略
358+
}
359+
}
334360
}
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
# 紫霞输入法自定义短语配置文件
2+
#
3+
# 示例条目继承自紫光拼音输入法默认配置,保留以延续老用户的使用习惯。
4+
#
5+
# 文件格式:TOML(https://toml.io)
6+
#
7+
# 短语定义:
8+
# 单值 name = '内容'
9+
# 多个候选 name = ['候选 1', '候选 2', ...]
10+
# 多行内容 name = '''
11+
# 多行
12+
# 文本
13+
# '''
14+
#
15+
# 短语名称约定:
16+
# - 须以英文字母开头,大小写敏感。
17+
# - 名称中加入 `0` 可避免与日常拼音输入冲突(如 `xl0`、`sz0kh`)。这并非语法要求,
18+
# 仅是约定俗成的反碰撞做法。候选区激活时 `1`-`9` 作为选字数字键,
19+
# 故标记字符几乎只能选 `0`。紫光传统采用 `_` 作为分隔符,
20+
# 但本输入法已将 `_` 用于中文破折号的快捷输入,故不再适用。
21+
# - 建议长度 ≥ 4 个字符,进一步降低误触发概率。
22+
23+
[phrases]
24+
# 电子邮件地址
25+
# email = 'user@company.com'
26+
27+
# 邮件签名
28+
# sign = '''
29+
# --乘风破浪会有时--
30+
# --直挂云帆济沧海--'''
31+
32+
# 其他文字的字母定义
33+
# 小写希腊字母
34+
xl0 = ['α', 'β', 'γ', 'δ', 'ε', 'ζ', 'η', 'θ', 'ι', 'κ', 'λ', 'μ', 'ν', 'ξ', 'ο', 'π', 'ρ', 'σ', 'τ', 'υ', 'φ', 'χ', 'ψ', 'ω']
35+
36+
# 大写希腊字母
37+
XL0 = ['Α', 'Β', 'Γ', 'Δ', 'Ε', 'Ζ', 'Η', 'Θ', 'Ι', 'Κ', 'Λ', 'Μ', 'Ν', 'Ξ', 'Ο', 'Π', 'Ρ', 'Σ', 'Τ', 'Υ', 'Φ', 'Χ', 'Ψ', 'Ω']
38+
39+
# 小写俄文字母
40+
ew0 = ['а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я', 'ё']
41+
42+
# 大写俄文字母
43+
EW0 = ['А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'Ё']
44+
45+
# 数学常数定义
46+
# 圆周率(几种精度)
47+
pi0 = ['π', '3.14', '3.1415927', '3.1415926535897932384626']
48+
49+
# 自然对数底
50+
e0 = ['2.71828', '2.71828182859045']
51+
52+
# 罗马字母
53+
alpha = 'α'
54+
beta = 'β'
55+
fai = 'Φ'
56+
sigma = ''
57+
58+
# 生肖汉字
59+
sx0 = ['', '', '', '', '', '', '', '', '', '', '', '']
60+
61+
# 天干汉字
62+
tg0 = ['', '', '', '', '', '', '', '', '', '']
63+
64+
# 地支汉字
65+
dz0 = ['', '', '', '', '', '', '', '', '', '', '', '']
66+
67+
# 数字符号
68+
sz0 = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '亿']
69+
70+
# 带点的阿拉伯数字
71+
sz0d = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
72+
73+
# 带圈的阿拉伯数字
74+
sz0q = ['', '', '', '', '', '', '', '', '', '']
75+
76+
# 带括号的阿拉伯数字
77+
sz0k = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
78+
sz0kh = ['', '', '', '', '', '', '', '', '', '']
79+
80+
# 罗马数字
81+
sz0lm = ['', '', '', '', '', '', '', '', '', '', 'ⅩⅠ', 'ⅩⅡ', 'ⅩⅢ', 'ⅩⅣ', 'ⅩⅤ', 'ⅩⅥ', 'ⅩⅦ', 'ⅩⅧ', 'ⅩⅨ', 'ⅩⅩ']
82+
83+
# 单位符号(来自拼音佳佳,谢谢!)
84+
dw0 = ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '?', '']
85+
86+
# 标点符号定义示例
87+
dh = ['', '']
88+
jh = ['', '', '']
89+
pzh = '——'
90+
blh = ''
91+
slh = '……'
92+
ch = ['×', '÷']
93+
mh = ''
94+
bfh = ''
95+
wh = ''
96+
fh = ''
97+
my = ''
98+
yb = ''
99+
rmb = ''
100+
wd = ''
101+
wjx = ''
102+
sjx = ['', '']
103+
104+
# 现在进入休闲一些的定义。
105+
xin0 = [
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+
happy0 = '''
144+
( ) ( )
145+
| |_| | _ _ _ _ _ _ _ _
146+
| _ | /'_` )( '_`\ ( '_`\ ( ) ( )
147+
| | | |( (_| || (_) )| (_) )| (_) |
148+
(_) (_)`\__,_)| ,__/'| ,__/'`\__, |
149+
| | | | ( )_| |
150+
(_) (_) `\___/''''
151+
hc0 = '''
152+
.---- -. -. . . .
153+
( .',----- - - ' '
154+
\_/ ;--:- __--------------------___ ____=====
155+
__U__n_^_''__[. ooo___ | |_!_||_!_||_!_||_!_| | |..|_i_|.
156+
c(_ ..(_ ..(_ ..( /,,,,,,] | |___||___||___||___| | |
157+
,_\___________'_|,L______],|______________________|_i,!________
158+
/;_(@)(@)==(@)(@) (o)(o) (o)^(o)--(o)^(o) (o)(o)'''
159+
160+
# 常用对数值
161+
log2 = '0.30103'
162+
log3 = '0.47712'
163+
log5 = '0.69897'
164+
log7 = '0.84510'
165+
166+
# 常用平方根
167+
sqrt2 = '1.414213562'
168+
sqrt3 = '1.732050808'
169+
sqrt5 = '2.236067977'
170+
sqrt6 = '2.449489743'
171+
sqrt7 = '2.645751311'
172+
sqrt10 = '3.16227766'
173+
174+
# 请把想象力发挥到极致吧!
175+
cai0 = '''
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+
shuiba0 = '''
203+
╱Z╭ ﹌╮╭ ?]╮.╲
204+
╲z(o-.-o)(o-.-o) ╱
205+
╭~﹊︸ ̄~﹊︸ ̄~╮
206+
┋?] ﹏ ?] ┋
207+
┋ (~(~)﹏ ┋
208+
┋ ?] ﹏︶~ ?] ┋
209+
┋ ?] ﹏︶~ ?] ┋'''
210+
ding0 = '''
211+
顶顶顶顶顶顶顶顶顶顶顶顶顶●●●●●●●●●●●●●顶顶顶
212+
顶顶●●●●●●●●●●顶顶顶顶顶●●●●●顶顶顶顶顶顶顶
213+
顶●●●●●●●●●●●顶顶顶顶顶顶●●●顶顶顶顶顶顶顶顶
214+
顶顶顶●●●●●●●顶顶顶顶顶顶顶顶●●●顶顶顶顶顶顶顶顶
215+
顶顶顶顶顶顶●●●顶顶顶顶顶顶顶●●●●●●●●●顶顶顶顶
216+
顶顶顶顶顶顶●●●顶顶顶顶顶●●●●●●●●●●●顶顶顶顶
217+
顶顶顶顶顶顶●●●顶顶顶顶●●●●●顶顶顶顶●●●●顶顶顶
218+
顶顶顶顶顶顶●●●顶顶顶顶●●●●顶顶顶顶顶顶●●●顶顶顶
219+
顶顶顶顶顶顶●●●顶顶顶顶●●●顶顶●●●顶顶●●●顶顶顶
220+
顶顶顶顶顶顶●●●顶顶顶顶●●●顶顶●●●顶顶●●●顶顶顶
221+
顶顶顶顶顶顶●●●顶顶顶顶●●●顶顶●●●顶顶●●●顶顶顶
222+
顶顶顶顶顶顶●●●顶顶顶顶●●●顶顶●●●顶顶●●●顶顶顶
223+
顶顶顶顶顶顶●●●顶顶顶顶●●●顶顶●●●顶顶●●●顶顶顶
224+
顶顶顶顶顶顶●●●顶顶顶顶●●●顶顶●●●顶顶●●●顶顶顶
225+
顶●●顶顶●●●●顶顶顶顶顶顶顶顶●●●●●●顶顶顶顶顶顶
226+
顶●●●●●●●●顶顶顶顶顶顶顶●●●●顶●●●●顶顶顶顶
227+
顶顶●●●●●●●顶顶顶顶顶顶●●●●顶顶顶●●●●顶顶顶
228+
顶顶顶●●●●●●顶顶顶顶顶●●●●●顶顶顶顶●●●●顶顶
229+
顶顶顶顶顶●●●顶顶顶顶顶●●●●●顶顶顶顶顶顶●●●●顶
230+
顶顶顶顶顶顶顶顶顶顶顶顶●●●●●顶顶顶顶顶顶顶顶●●●●
231+
顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶'''

0 commit comments

Comments
 (0)