dsh-metaphysics 0.38.2 → 0.46.5
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/CHANGELOG.md +215 -8
- package/README.md +348 -342
- package/client.js +2134 -129
- package/engine/bazi-words.js +174 -0
- package/engine/classics.js +136 -7
- package/engine/fengshui.js +197 -11
- package/engine/followup.js +29 -5
- package/engine/geju.js +41 -0
- package/engine/index.js +96 -8
- package/engine/interpret-knowledge.js +31 -4
- package/engine/interpret-plain.js +367 -322
- package/engine/interpret.js +288 -32
- package/engine/liuyao.js +85 -0
- package/engine/name-data.js +229 -0
- package/engine/name.js +234 -9
- package/engine/ziwei-words.js +245 -0
- package/engine/ziwei.js +254 -26
- package/index.js +65 -9
- package/package.json +2 -2
- package//345/221/275/347/220/206/346/216/222/347/233/230.html +2933 -487
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
// 起名用字的数据层:读音(声调用数字另存)+ 康熙笔画、常见姓氏笔画与读音、81 数理。
|
|
2
|
+
//
|
|
3
|
+
// 笔画口径(写清楚,别让人猜):
|
|
4
|
+
// - 按康熙字典的繁体字形计。简体字取对应繁体:华→華14、马→馬10、荣→榮14、宁→寧14、
|
|
5
|
+
// 灵→靈24、兰→蘭23、丰→豐18、书→書10、画→畫12、云→雲12、风→風9、阳→陽17、涛→濤18。
|
|
6
|
+
// - 偏旁按本字计:氵→水(4)、艹→艸(6)、辶→辵(7)、忄→心(4)、扌→手(4)、
|
|
7
|
+
// 阝(左)→阜(8)、阝(右)→邑(7)、王/玉旁→玉(5)、衤→衣(6)、礻→示(5)、
|
|
8
|
+
// 讠→言(7)、钅→金(8)、纟→糸(6)、饣→食(9)。
|
|
9
|
+
// - 各派五格工具对个别字取法不一(如 沈、蒋),这里取最常见的一种;
|
|
10
|
+
// 调用方可以用 strokeOverrides 覆盖任意字的笔画,覆盖值会被标注为「用户指定」。
|
|
11
|
+
//
|
|
12
|
+
// 读数口径:拼音只写声母韵母(ü 写作 v),声调 1–4 单独一列;轻声不收录(人名用字几乎不读轻声)。
|
|
13
|
+
|
|
14
|
+
/** [字, 拼音(无声调), 声调, 康熙笔画] */
|
|
15
|
+
export const READING = [
|
|
16
|
+
// ── 木 ──
|
|
17
|
+
['梓', 'zi', 3, 11], ['桐', 'tong', 2, 10], ['楠', 'nan', 2, 13], ['楷', 'kai', 3, 13],
|
|
18
|
+
['松', 'song', 1, 8], ['柏', 'bai', 3, 9], ['枫', 'feng', 1, 13], ['榕', 'rong', 2, 14],
|
|
19
|
+
['槿', 'jin', 3, 15], ['棠', 'tang', 2, 12], ['楚', 'chu', 3, 13], ['柯', 'ke', 1, 9],
|
|
20
|
+
['桓', 'huan', 2, 10], ['榆', 'yu', 2, 13], ['栩', 'xu', 3, 10], ['榛', 'zhen', 1, 14],
|
|
21
|
+
['芸', 'yun', 2, 10], ['芷', 'zhi', 3, 10], ['芮', 'rui', 4, 10], ['若', 'ruo', 4, 11],
|
|
22
|
+
['茜', 'qian', 4, 12], ['茵', 'yin', 1, 12], ['茗', 'ming', 2, 12], ['莎', 'sha', 1, 13],
|
|
23
|
+
['茉', 'mo', 4, 11], ['筱', 'xiao', 3, 13], ['蓉', 'rong', 2, 16], ['萱', 'xuan', 1, 15],
|
|
24
|
+
['蕙', 'hui', 4, 18], ['蕊', 'rui', 3, 18], ['菲', 'fei', 1, 14], ['蔓', 'man', 4, 17],
|
|
25
|
+
['荣', 'rong', 2, 14], ['茂', 'mao', 4, 11], ['栋', 'dong', 4, 12], ['梁', 'liang', 2, 11],
|
|
26
|
+
['朴', 'pu', 3, 6], ['本', 'ben', 3, 5], ['林', 'lin', 2, 8], ['森', 'sen', 1, 12],
|
|
27
|
+
['枝', 'zhi', 1, 8], ['果', 'guo', 3, 8], ['禾', 'he', 2, 5], ['秀', 'xiu', 4, 7],
|
|
28
|
+
['穗', 'sui', 4, 17], ['稼', 'jia', 4, 15], ['颖', 'ying', 3, 16], ['苗', 'miao', 2, 8],
|
|
29
|
+
['菁', 'jing', 1, 14], ['菡', 'han', 4, 14], ['蕴', 'yun', 4, 22], ['蕾', 'lei', 3, 19],
|
|
30
|
+
['薇', 'wei', 1, 19], ['薏', 'yi', 4, 19], ['菀', 'wan', 3, 14], ['荷', 'he', 2, 13],
|
|
31
|
+
['莲', 'lian', 2, 17], ['菱', 'ling', 2, 14], ['苇', 'wei', 3, 15], ['荻', 'di', 2, 13],
|
|
32
|
+
['筠', 'yun', 2, 13], ['笛', 'di', 2, 11], ['杉', 'shan', 1, 7], ['柠', 'ning', 2, 18],
|
|
33
|
+
['桢', 'zhen', 1, 13], ['樾', 'yue', 4, 16], ['柘', 'zhe', 4, 9], ['权', 'quan', 2, 22],
|
|
34
|
+
['材', 'cai', 2, 7], ['杭', 'hang', 2, 8], ['枚', 'mei', 2, 8], ['梧', 'wu', 2, 11],
|
|
35
|
+
['竹', 'zhu', 2, 6], ['简', 'jian', 3, 18], ['策', 'ce', 4, 12], ['筹', 'chou', 2, 20],
|
|
36
|
+
['芬', 'fen', 1, 10], ['芳', 'fang', 1, 10], ['花', 'hua', 1, 10], ['菊', 'ju', 2, 14],
|
|
37
|
+
['兰', 'lan', 2, 23], ['芝', 'zhi', 1, 10], ['芹', 'qin', 2, 10], ['荃', 'quan', 2, 12],
|
|
38
|
+
['萃', 'cui', 4, 14], ['蓁', 'zhen', 1, 16], ['荞', 'qiao', 2, 18], ['莞', 'wan', 3, 13],
|
|
39
|
+
['萦', 'ying', 2, 16], ['蔚', 'wei', 4, 17], ['芃', 'peng', 2, 9], ['芩', 'qin', 2, 10],
|
|
40
|
+
['苡', 'yi', 3, 11], ['莱', 'lai', 2, 14], ['萌', 'meng', 2, 14], ['葆', 'bao', 3, 15],
|
|
41
|
+
['萧', 'xiao', 1, 18], ['樟', 'zhang', 1, 15], ['樱', 'ying', 1, 21], ['栎', 'li', 4, 19],
|
|
42
|
+
['棹', 'zhao', 4, 12], ['楸', 'qiu', 1, 13], ['槐', 'huai', 2, 14], ['橙', 'cheng', 2, 16],
|
|
43
|
+
['檀', 'tan', 2, 17],
|
|
44
|
+
// ── 火 ──
|
|
45
|
+
['炎', 'yan', 2, 8], ['灿', 'can', 4, 17], ['炫', 'xuan', 4, 9], ['炜', 'wei', 3, 13],
|
|
46
|
+
['烨', 'ye', 4, 14], ['煜', 'yu', 4, 13], ['熙', 'xi', 1, 13], ['煊', 'xuan', 1, 13],
|
|
47
|
+
['焕', 'huan', 4, 13], ['熠', 'yi', 4, 15], ['炅', 'jiong', 3, 8], ['昱', 'yu', 4, 9],
|
|
48
|
+
['晗', 'han', 2, 11], ['旭', 'xu', 4, 6], ['昊', 'hao', 4, 8], ['晟', 'sheng', 4, 11],
|
|
49
|
+
['晨', 'chen', 2, 11], ['景', 'jing', 3, 12], ['曜', 'yao', 4, 18], ['曦', 'xi', 1, 20],
|
|
50
|
+
['朗', 'lang', 3, 11], ['昭', 'zhao', 1, 9], ['昕', 'xin', 1, 8], ['昀', 'yun', 2, 8],
|
|
51
|
+
['暖', 'nuan', 3, 13], ['灵', 'ling', 2, 24], ['丹', 'dan', 1, 4], ['彤', 'tong', 2, 7],
|
|
52
|
+
['冉', 'ran', 3, 5], ['南', 'nan', 2, 9], ['丰', 'feng', 1, 18], ['日', 'ri', 4, 4],
|
|
53
|
+
['阳', 'yang', 2, 17], ['光', 'guang', 1, 6], ['亮', 'liang', 4, 9], ['明', 'ming', 2, 8],
|
|
54
|
+
['晶', 'jing', 1, 12], ['晴', 'qing', 2, 12], ['夏', 'xia', 4, 10], ['智', 'zhi', 4, 12],
|
|
55
|
+
['卓', 'zhuo', 2, 8], ['乐', 'le', 4, 15], ['恺', 'kai', 3, 14], ['恬', 'tian', 2, 10],
|
|
56
|
+
['甜', 'tian', 2, 11], ['亭', 'ting', 2, 9], ['俊', 'jun', 4, 9], ['丙', 'bing', 3, 5],
|
|
57
|
+
['丁', 'ding', 1, 2], ['鼎', 'ding', 3, 13], ['陶', 'tao', 2, 16], ['熹', 'xi', 1, 16],
|
|
58
|
+
['炀', 'yang', 2, 13], ['烜', 'xuan', 3, 10], ['暻', 'jing', 3, 16], ['晖', 'hui', 1, 13],
|
|
59
|
+
['晔', 'ye', 4, 16], ['旻', 'min', 2, 8], ['晏', 'yan', 4, 10], ['晓', 'xiao', 3, 16],
|
|
60
|
+
['暄', 'xuan', 1, 13], ['昆', 'kun', 1, 8], ['伶', 'ling', 2, 7],
|
|
61
|
+
// ── 土 ──
|
|
62
|
+
['坤', 'kun', 1, 8], ['垚', 'yao', 2, 9], ['培', 'pei', 2, 11], ['城', 'cheng', 2, 10],
|
|
63
|
+
['域', 'yu', 4, 11], ['坚', 'jian', 1, 11], ['墨', 'mo', 4, 15], ['均', 'jun', 1, 7],
|
|
64
|
+
['坦', 'tan', 3, 8], ['基', 'ji', 1, 11], ['堂', 'tang', 2, 11], ['圣', 'sheng', 4, 13],
|
|
65
|
+
['在', 'zai', 4, 6], ['岳', 'yue', 4, 8], ['峰', 'feng', 1, 10], ['峻', 'jun', 4, 10],
|
|
66
|
+
['岚', 'lan', 2, 12], ['岩', 'yan', 2, 8], ['崇', 'chong', 2, 11], ['岐', 'qi', 2, 7],
|
|
67
|
+
['屿', 'yu', 3, 17], ['磊', 'lei', 3, 15], ['尧', 'yao', 2, 12], ['圆', 'yuan', 2, 13],
|
|
68
|
+
['恩', 'en', 1, 10], ['惟', 'wei', 2, 11], ['轩', 'xuan', 1, 10], ['逸', 'yi', 4, 15],
|
|
69
|
+
['山', 'shan', 1, 3], ['岸', 'an', 4, 8], ['岑', 'cen', 2, 7], ['巍', 'wei', 1, 21],
|
|
70
|
+
['嵩', 'song', 1, 13], ['岭', 'ling', 3, 17], ['奥', 'ao', 4, 13], ['宜', 'yi', 2, 8],
|
|
71
|
+
['容', 'rong', 2, 10], ['意', 'yi', 4, 13], ['依', 'yi', 1, 8], ['悠', 'you', 1, 11],
|
|
72
|
+
['维', 'wei', 2, 14], ['纬', 'wei', 3, 15], ['永', 'yong', 3, 5], ['远', 'yuan', 3, 17],
|
|
73
|
+
['辰', 'chen', 2, 7], ['壁', 'bi', 4, 16], ['田', 'tian', 2, 5], ['由', 'you', 2, 5],
|
|
74
|
+
['画', 'hua', 4, 12], ['延', 'yan', 2, 7], ['建', 'jian', 4, 9], ['音', 'yin', 1, 9],
|
|
75
|
+
['韵', 'yun', 4, 19], ['玮', 'wei', 3, 14], ['雍', 'yong', 1, 13], ['懿', 'yi', 4, 22],
|
|
76
|
+
['宇', 'yu', 3, 6], ['亦', 'yi', 4, 6], ['安', 'an', 1, 6], ['宁', 'ning', 2, 14],
|
|
77
|
+
// ── 金 ──
|
|
78
|
+
['锋', 'feng', 1, 15], ['钢', 'gang', 1, 16], ['钧', 'jun', 1, 12], ['铭', 'ming', 2, 14],
|
|
79
|
+
['锐', 'rui', 4, 15], ['锡', 'xi', 1, 16], ['锦', 'jin', 3, 16], ['鑫', 'xin', 1, 24],
|
|
80
|
+
['键', 'jian', 4, 17], ['鉴', 'jian', 4, 22], ['钦', 'qin', 1, 12], ['镇', 'zhen', 4, 18],
|
|
81
|
+
['铮', 'zheng', 1, 16], ['钰', 'yu', 4, 13], ['铠', 'kai', 3, 18], ['珊', 'shan', 1, 10],
|
|
82
|
+
['珠', 'zhu', 1, 10], ['琳', 'lin', 2, 13], ['琦', 'qi', 2, 13], ['琪', 'qi', 2, 13],
|
|
83
|
+
['瑜', 'yu', 2, 14], ['瑞', 'rui', 4, 14], ['瑄', 'xuan', 1, 14], ['璇', 'xuan', 2, 16],
|
|
84
|
+
['璟', 'jing', 3, 17], ['璐', 'lu', 4, 18], ['瑾', 'jin', 3, 16], ['珏', 'jue', 2, 9],
|
|
85
|
+
['环', 'huan', 2, 18], ['玲', 'ling', 2, 10], ['珑', 'long', 2, 21], ['瑶', 'yao', 2, 15],
|
|
86
|
+
['莹', 'ying', 2, 15], ['铎', 'duo', 2, 21], ['金', 'jin', 1, 8], ['秋', 'qiu', 1, 9],
|
|
87
|
+
['书', 'shu', 1, 10], ['舒', 'shu', 1, 12], ['善', 'shan', 4, 12], ['信', 'xin', 4, 9],
|
|
88
|
+
['修', 'xiu', 1, 10], ['素', 'su', 4, 10], ['静', 'jing', 4, 16], ['心', 'xin', 1, 4],
|
|
89
|
+
['新', 'xin', 1, 13], ['正', 'zheng', 4, 5], ['世', 'shi', 4, 5], ['少', 'shao', 3, 4],
|
|
90
|
+
['西', 'xi', 1, 6], ['白', 'bai', 2, 5], ['辛', 'xin', 1, 7], ['成', 'cheng', 2, 7],
|
|
91
|
+
['利', 'li', 4, 7], ['剑', 'jian', 4, 15], ['刚', 'gang', 1, 10], ['则', 'ze', 2, 9],
|
|
92
|
+
['初', 'chu', 1, 7], ['硕', 'shuo', 4, 14], ['尚', 'shang', 4, 8], ['臣', 'chen', 2, 6],
|
|
93
|
+
['川', 'chuan', 1, 3], ['舟', 'zhou', 1, 6], ['州', 'zhou', 1, 6], ['祖', 'zu', 3, 10],
|
|
94
|
+
['祥', 'xiang', 2, 11], ['禄', 'lu', 4, 13], ['禧', 'xi', 3, 17], ['珍', 'zhen', 1, 10],
|
|
95
|
+
['宣', 'xuan', 1, 9], ['序', 'xu', 4, 7], ['谦', 'qian', 1, 17], ['赞', 'zan', 4, 19],
|
|
96
|
+
['超', 'chao', 1, 12], ['锴', 'kai', 3, 17], ['承', 'cheng', 2, 8], ['语', 'yu', 3, 14],
|
|
97
|
+
['诺', 'nuo', 4, 16], ['诗', 'shi', 1, 13], ['梦', 'meng', 4, 14], ['思', 'si', 1, 9],
|
|
98
|
+
['悦', 'yue', 4, 11], ['欣', 'xin', 1, 8], ['嘉', 'jia', 1, 14], ['佳', 'jia', 1, 8],
|
|
99
|
+
['博', 'bo', 2, 12], ['睿', 'rui', 4, 14], ['知', 'zhi', 1, 8], ['星', 'xing', 1, 9],
|
|
100
|
+
['言', 'yan', 2, 7], ['和', 'he', 2, 8],
|
|
101
|
+
// ── 水 ──
|
|
102
|
+
['江', 'jiang', 1, 7], ['河', 'he', 2, 9], ['海', 'hai', 3, 11], ['洋', 'yang', 2, 10],
|
|
103
|
+
['波', 'bo', 1, 9], ['涛', 'tao', 1, 18], ['涵', 'han', 2, 12], ['清', 'qing', 1, 12],
|
|
104
|
+
['澈', 'che', 4, 16], ['澄', 'cheng', 2, 16], ['润', 'run', 4, 16], ['泽', 'ze', 2, 17],
|
|
105
|
+
['沛', 'pei', 4, 8], ['沁', 'qin', 4, 8], ['泓', 'hong', 2, 9], ['泉', 'quan', 2, 9],
|
|
106
|
+
['汐', 'xi', 1, 7], ['淇', 'qi', 2, 12], ['鸿', 'hong', 2, 17], ['滋', 'zi', 1, 13],
|
|
107
|
+
['淼', 'miao', 3, 12], ['雨', 'yu', 3, 8], ['雪', 'xue', 3, 11], ['霖', 'lin', 2, 16],
|
|
108
|
+
['霏', 'fei', 1, 16], ['露', 'lu', 4, 21], ['霆', 'ting', 2, 15], ['雯', 'wen', 2, 12],
|
|
109
|
+
['霓', 'ni', 2, 16], ['湉', 'tian', 2, 13], ['沐', 'mu', 4, 8], ['宸', 'chen', 2, 10],
|
|
110
|
+
['然', 'ran', 2, 12], ['文', 'wen', 2, 4], ['月', 'yue', 4, 4], ['水', 'shui', 3, 4],
|
|
111
|
+
['冰', 'bing', 1, 6], ['洁', 'jie', 2, 16], ['浩', 'hao', 4, 11], ['瀚', 'han', 4, 20],
|
|
112
|
+
['渊', 'yuan', 1, 12], ['澜', 'lan', 2, 21], ['潮', 'chao', 2, 16], ['溪', 'xi', 1, 14],
|
|
113
|
+
['湘', 'xiang', 1, 13], ['渝', 'yu', 2, 13], ['深', 'shen', 1, 12], ['湛', 'zhan', 4, 13],
|
|
114
|
+
['汇', 'hui', 4, 13], ['洲', 'zhou', 1, 10], ['湾', 'wan', 1, 26], ['云', 'yun', 2, 12],
|
|
115
|
+
['风', 'feng', 1, 9], ['北', 'bei', 3, 5], ['冬', 'dong', 1, 5], ['玄', 'xuan', 2, 5],
|
|
116
|
+
['子', 'zi', 3, 3], ['平', 'ping', 2, 5], ['方', 'fang', 1, 4], ['帆', 'fan', 1, 6],
|
|
117
|
+
['航', 'hang', 2, 10], ['敏', 'min', 3, 11], ['慧', 'hui', 4, 15], ['惠', 'hui', 4, 12],
|
|
118
|
+
['霈', 'pei', 4, 15], ['灏', 'hao', 4, 25], ['湄', 'mei', 2, 13], ['滨', 'bin', 1, 18],
|
|
119
|
+
['洛', 'luo', 4, 10], ['津', 'jin', 1, 10], ['泊', 'bo', 2, 9], ['沧', 'cang', 1, 14],
|
|
120
|
+
['浦', 'pu', 3, 11],
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
/** 常见单姓的康熙笔画(复姓见 DOUBLE_SURNAMES)。没有的姓可用 surnameStrokes 传入。 */
|
|
124
|
+
export const SURNAME_STROKES = {
|
|
125
|
+
王: 4, 李: 7, 张: 11, 刘: 15, 陈: 16, 杨: 13, 黄: 12, 赵: 14, 吴: 7, 周: 8,
|
|
126
|
+
徐: 10, 孙: 10, 马: 10, 朱: 6, 胡: 11, 郭: 15, 何: 7, 高: 10, 林: 8, 罗: 20,
|
|
127
|
+
郑: 19, 梁: 11, 谢: 17, 宋: 7, 唐: 10, 许: 11, 韩: 17, 冯: 12, 曹: 11, 彭: 12,
|
|
128
|
+
曾: 12, 萧: 18, 田: 5, 董: 15, 潘: 16, 袁: 10, 蔡: 17, 余: 7, 于: 3, 杜: 7,
|
|
129
|
+
叶: 15, 程: 12, 魏: 18, 吕: 7, 丁: 2, 任: 6, 姚: 9, 卢: 16, 姜: 9, 崔: 11,
|
|
130
|
+
钟: 17, 谭: 19, 陆: 16, 范: 15, 金: 8, 石: 5, 廖: 14, 贾: 13, 夏: 10, 韦: 9,
|
|
131
|
+
付: 5, 方: 4, 白: 5, 邹: 17, 孟: 8, 熊: 14, 秦: 10, 邱: 12, 江: 7, 尹: 4,
|
|
132
|
+
薛: 19, 段: 9, 雷: 13, 侯: 9, 龙: 16, 史: 5, 陶: 16, 黎: 15, 贺: 12, 顾: 21,
|
|
133
|
+
毛: 4, 郝: 14, 龚: 22, 邵: 12, 钱: 16, 严: 20, 武: 8, 戴: 18, 莫: 13, 孔: 4,
|
|
134
|
+
向: 6, 常: 11, 康: 11, 易: 8, 文: 4, 施: 9, 洪: 10, 安: 6, 颜: 18, 温: 13,
|
|
135
|
+
章: 11, 鲁: 15, 葛: 15, 伍: 6, 申: 5, 尤: 4, 焦: 12, 柳: 9, 邢: 11, 路: 13,
|
|
136
|
+
岳: 8, 乔: 12, 赖: 20, 万: 15, 苏: 22, 蒋: 17, 沈: 8, 汪: 8, 邓: 19, 覃: 12,
|
|
137
|
+
房: 8, 边: 22, 辛: 7, 涂: 11, 甘: 5, 封: 9, 储: 18, 邬: 17, 路: 13, 詹: 13,
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/** 常见单姓读音:[拼音, 声调] */
|
|
141
|
+
export const SURNAME_READING = {
|
|
142
|
+
王: ['wang', 2], 李: ['li', 3], 张: ['zhang', 1], 刘: ['liu', 2], 陈: ['chen', 2],
|
|
143
|
+
杨: ['yang', 2], 黄: ['huang', 2], 赵: ['zhao', 4], 吴: ['wu', 2], 周: ['zhou', 1],
|
|
144
|
+
徐: ['xu', 2], 孙: ['sun', 1], 马: ['ma', 3], 朱: ['zhu', 1], 胡: ['hu', 2],
|
|
145
|
+
郭: ['guo', 1], 何: ['he', 2], 高: ['gao', 1], 林: ['lin', 2], 罗: ['luo', 2],
|
|
146
|
+
郑: ['zheng', 4], 梁: ['liang', 2], 谢: ['xie', 4], 宋: ['song', 4], 唐: ['tang', 2],
|
|
147
|
+
许: ['xu', 3], 韩: ['han', 2], 冯: ['feng', 2], 曹: ['cao', 2], 彭: ['peng', 2],
|
|
148
|
+
曾: ['zeng', 1], 萧: ['xiao', 1], 田: ['tian', 2], 董: ['dong', 3], 潘: ['pan', 1],
|
|
149
|
+
袁: ['yuan', 2], 蔡: ['cai', 4], 余: ['yu', 2], 于: ['yu', 2], 杜: ['du', 4],
|
|
150
|
+
叶: ['ye', 4], 程: ['cheng', 2], 魏: ['wei', 4], 吕: ['lv', 3], 丁: ['ding', 1],
|
|
151
|
+
任: ['ren', 2], 姚: ['yao', 2], 卢: ['lu', 2], 姜: ['jiang', 1], 崔: ['cui', 1],
|
|
152
|
+
钟: ['zhong', 1], 谭: ['tan', 2], 陆: ['lu', 4], 范: ['fan', 4], 金: ['jin', 1],
|
|
153
|
+
石: ['shi', 2], 廖: ['liao', 4], 贾: ['jia', 3], 夏: ['xia', 4], 韦: ['wei', 2],
|
|
154
|
+
付: ['fu', 4], 方: ['fang', 1], 白: ['bai', 2], 邹: ['zou', 1], 孟: ['meng', 4],
|
|
155
|
+
熊: ['xiong', 2], 秦: ['qin', 2], 邱: ['qiu', 1], 江: ['jiang', 1], 尹: ['yin', 3],
|
|
156
|
+
薛: ['xue', 1], 段: ['duan', 4], 雷: ['lei', 2], 侯: ['hou', 2], 龙: ['long', 2],
|
|
157
|
+
史: ['shi', 3], 陶: ['tao', 2], 黎: ['li', 2], 贺: ['he', 4], 顾: ['gu', 4],
|
|
158
|
+
毛: ['mao', 2], 郝: ['hao', 3], 龚: ['gong', 1], 邵: ['shao', 4], 钱: ['qian', 2],
|
|
159
|
+
严: ['yan', 2], 武: ['wu', 3], 戴: ['dai', 4], 莫: ['mo', 4], 孔: ['kong', 3],
|
|
160
|
+
向: ['xiang', 4], 常: ['chang', 2], 康: ['kang', 1], 易: ['yi', 4], 文: ['wen', 2],
|
|
161
|
+
施: ['shi', 1], 洪: ['hong', 2], 安: ['an', 1], 颜: ['yan', 2], 温: ['wen', 1],
|
|
162
|
+
章: ['zhang', 1], 鲁: ['lu', 3], 葛: ['ge', 3], 伍: ['wu', 3], 申: ['shen', 1],
|
|
163
|
+
尤: ['you', 2], 焦: ['jiao', 1], 柳: ['liu', 3], 邢: ['xing', 2], 路: ['lu', 4],
|
|
164
|
+
岳: ['yue', 4], 乔: ['qiao', 2], 赖: ['lai', 4], 万: ['wan', 4], 苏: ['su', 1],
|
|
165
|
+
蒋: ['jiang', 3], 沈: ['shen', 3], 汪: ['wang', 1], 邓: ['deng', 4], 覃: ['tan', 2],
|
|
166
|
+
房: ['fang', 2], 边: ['bian', 1], 辛: ['xin', 1], 涂: ['tu', 2], 甘: ['gan', 1],
|
|
167
|
+
封: ['feng', 1], 储: ['chu', 3], 邬: ['wu', 1], 詹: ['zhan', 1],
|
|
168
|
+
欧: ['ou', 1],
|
|
169
|
+
阳: ['yang', 2],
|
|
170
|
+
司: ['si', 1],
|
|
171
|
+
上: ['shang', 4],
|
|
172
|
+
官: ['guan', 1],
|
|
173
|
+
诸: ['zhu', 1],
|
|
174
|
+
东: ['dong', 1],
|
|
175
|
+
皇: ['huang', 2],
|
|
176
|
+
甫: ['fu', 3],
|
|
177
|
+
尉: ['yu', 4],
|
|
178
|
+
迟: ['chi', 2],
|
|
179
|
+
令: ['ling', 4],
|
|
180
|
+
狐: ['hu', 2],
|
|
181
|
+
慕: ['mu', 4],
|
|
182
|
+
徒: ['tu', 2],
|
|
183
|
+
公: ['gong', 1],
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
/** 常见复姓:两字各自的康熙笔画(s)与读音(首字拼音连写,声调取首字) */
|
|
187
|
+
export const DOUBLE_SURNAMES = {
|
|
188
|
+
欧阳: { s: [15, 17], py: 'ouyang', tone: 1 },
|
|
189
|
+
司马: { s: [5, 10], py: 'sima', tone: 1 },
|
|
190
|
+
上官: { s: [3, 8], py: 'shangguan', tone: 4 },
|
|
191
|
+
诸葛: { s: [15, 15], py: 'zhuge', tone: 1 },
|
|
192
|
+
东方: { s: [8, 4], py: 'dongfang', tone: 1 },
|
|
193
|
+
皇甫: { s: [9, 7], py: 'huangfu', tone: 2 },
|
|
194
|
+
尉迟: { s: [11, 19], py: 'yuchi', tone: 4 },
|
|
195
|
+
令狐: { s: [5, 8], py: 'linghu', tone: 4 },
|
|
196
|
+
慕容: { s: [14, 10], py: 'murong', tone: 4 },
|
|
197
|
+
宇文: { s: [6, 4], py: 'yuwen', tone: 3 },
|
|
198
|
+
司徒: { s: [5, 10], py: 'situ', tone: 1 },
|
|
199
|
+
夏侯: { s: [10, 9], py: 'xiahou', tone: 4 },
|
|
200
|
+
公孙: { s: [4, 10], py: 'gongsun', tone: 1 },
|
|
201
|
+
};
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* 81 数理(通行本):索引即数,[吉凶, 意象]。
|
|
205
|
+
* 吉凶分三档:吉 / 半吉 / 凶。各派工具对少数数取法有出入,这里取通行本,页面会标明。
|
|
206
|
+
*/
|
|
207
|
+
export const SHULI_81 = [null,
|
|
208
|
+
['吉', '太极之数'], ['凶', '两仪之数'], ['吉', '三才之数'], ['凶', '四象之数'],
|
|
209
|
+
['吉', '五行之数'], ['吉', '六爻之数'], ['吉', '七政之数'], ['吉', '八卦之数'],
|
|
210
|
+
['凶', '大成之数'], ['凶', '终结之数'], ['吉', '旱苗逢雨'], ['凶', '掘井无泉'],
|
|
211
|
+
['吉', '春日牡丹'], ['凶', '破兆之数'], ['吉', '福寿之数'], ['吉', '厚重之数'],
|
|
212
|
+
['吉', '刚强之数'], ['吉', '铁镜重磨'], ['凶', '多难之数'], ['凶', '屋下藏金'],
|
|
213
|
+
['吉', '明月中天'], ['凶', '秋草逢霜'], ['吉', '壮丽之数'], ['吉', '掘藏得金'],
|
|
214
|
+
['吉', '荣俊之数'], ['凶', '变怪之数'], ['半吉', '增长之数'], ['凶', '阔水浮萍'],
|
|
215
|
+
['吉', '智谋之数'], ['半吉', '非运之数'], ['吉', '春日花开'], ['吉', '宝马金鞍'],
|
|
216
|
+
['吉', '旭日升天'], ['凶', '破家之数'], ['吉', '高楼望月'], ['凶', '波澜重叠'],
|
|
217
|
+
['吉', '猛虎出林'], ['半吉', '磨铁成针'], ['吉', '富贵荣华'], ['半吉', '退安之数'],
|
|
218
|
+
['吉', '有德之数'], ['半吉', '寒蝉在柳'], ['凶', '散财破产'], ['凶', '烦闷之数'],
|
|
219
|
+
['吉', '顺风之数'], ['凶', '浪里淘金'], ['吉', '点石成金'], ['吉', '古松立鹤'],
|
|
220
|
+
['半吉', '转变之数'], ['半吉', '小舟入海'], ['半吉', '沉浮之数'], ['吉', '先见之明'],
|
|
221
|
+
['半吉', '曲卷难星'], ['凶', '石上栽花'], ['半吉', '善恶之数'], ['凶', '浪里行舟'],
|
|
222
|
+
['吉', '日照春松'], ['半吉', '晚行遇月'], ['凶', '寒蝉悲风'], ['凶', '无谋之数'],
|
|
223
|
+
['吉', '牡丹芙蓉'], ['凶', '衰败之数'], ['吉', '舟归平海'], ['凶', '非命之数'],
|
|
224
|
+
['吉', '巨流归海'], ['凶', '岩头步马'], ['吉', '通达之数'], ['吉', '顺风吹帆'],
|
|
225
|
+
['凶', '非业之数'], ['凶', '残菊经霜'], ['半吉', '石上金花'], ['凶', '劳苦之数'],
|
|
226
|
+
['半吉', '志高力微'], ['凶', '残菊逢霜'], ['半吉', '退守之数'], ['凶', '离散之数'],
|
|
227
|
+
['半吉', '半吉之数'], ['半吉', '晚苦之数'], ['凶', '云头望月'], ['半吉', '遁吉之数'],
|
|
228
|
+
['吉', '万物回春'],
|
|
229
|
+
];
|
package/engine/name.js
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
// 起名:字库五行匹配 +
|
|
1
|
+
// 起名:字库五行匹配 + 候选组合(纯本地确定性),另附五格剖象与音韵检查。
|
|
2
2
|
// 口径:字之五行按通行字义/偏旁归类(自建常用字库,未收录的字如实标注,不猜);
|
|
3
3
|
// 喜用倾向取八字旺衰的简化判定(偏强喜克泄耗、偏弱喜生扶、中和不筛)。
|
|
4
|
-
//
|
|
4
|
+
// 五格按康熙字典繁体笔画计(见 name-data.js 的口径说明),81 数理取通行本;
|
|
5
|
+
// 音韵只做机械检查(同调、相邻同声母/同韵母、叠字),不做语义谐音判断。
|
|
5
6
|
import { buildBazi } from './bazi.js';
|
|
6
7
|
import { assertCivil } from './validate.js';
|
|
8
|
+
import {
|
|
9
|
+
READING, SURNAME_STROKES, SURNAME_READING, DOUBLE_SURNAMES, SHULI_81,
|
|
10
|
+
} from './name-data.js';
|
|
7
11
|
|
|
8
12
|
const SHENG = { 木: '火', 火: '土', 土: '金', 金: '水', 水: '木' };
|
|
9
13
|
const KE = { 木: '土', 土: '水', 水: '火', 火: '金', 金: '木' };
|
|
@@ -228,8 +232,195 @@ export const CHAR_LIB = [
|
|
|
228
232
|
];
|
|
229
233
|
|
|
230
234
|
const EL_INDEX = new Map();
|
|
235
|
+
const EXTRA_INDEX = new Map();
|
|
236
|
+
for (const [c, py, tone, st] of READING) {
|
|
237
|
+
if (!EXTRA_INDEX.has(c)) EXTRA_INDEX.set(c, { py, tone, st });
|
|
238
|
+
}
|
|
231
239
|
for (const c of CHAR_LIB) {
|
|
232
|
-
if (!EL_INDEX.has(c[0]))
|
|
240
|
+
if (!EL_INDEX.has(c[0])) {
|
|
241
|
+
const x = EXTRA_INDEX.get(c[0]) || {};
|
|
242
|
+
EL_INDEX.set(c[0], {
|
|
243
|
+
c: c[0], el: c[1], meaning: c[2], g: c[3], order: EL_INDEX.size,
|
|
244
|
+
py: x.py || null, tone: x.tone || null, strokes: x.st || null,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const NUM_ELEMENT = { 1: '木', 2: '木', 3: '火', 4: '火', 5: '土', 6: '土', 7: '金', 8: '金', 9: '水', 0: '水' };
|
|
250
|
+
const WX_REL = (a, b) => (a === b ? '同' : SHENG[a] === b ? '生' : KE[a] === b ? '克' : SHENG[b] === a ? '被生' : '被克');
|
|
251
|
+
|
|
252
|
+
/** 数理超过 81 按传统「减 80 循环」取(如 104 → 24)。 */
|
|
253
|
+
export function shuliOf(n) {
|
|
254
|
+
let x = n;
|
|
255
|
+
while (x > 81) x -= 80;
|
|
256
|
+
if (!(x >= 1)) return null;
|
|
257
|
+
const row = SHULI_81[x];
|
|
258
|
+
return row ? { num: x, level: row[0], name: row[1] } : null;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** 合并两处笔画覆盖:surnameStrokes(按姓给的)+ strokeOverrides(逐字覆盖),后者优先。 */
|
|
262
|
+
function overridesOf(input) {
|
|
263
|
+
const out = {};
|
|
264
|
+
for (const src of [input && input.surnameStrokes, input && input.strokeOverrides]) {
|
|
265
|
+
if (!src || typeof src !== 'object') continue;
|
|
266
|
+
for (const [k, v] of Object.entries(src)) {
|
|
267
|
+
if (Number.isInteger(v) && v > 0) out[k] = v;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return Object.keys(out).length ? out : undefined;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
function strokeOf(ch, overrides, kind) {
|
|
274
|
+
if (overrides && Number.isInteger(overrides[ch]) && overrides[ch] > 0) {
|
|
275
|
+
return { strokes: overrides[ch], source: 'user' };
|
|
276
|
+
}
|
|
277
|
+
const info = EL_INDEX.get(ch);
|
|
278
|
+
if (info && info.strokes) return { strokes: info.strokes, source: 'lib' };
|
|
279
|
+
if (kind === 'surname' && SURNAME_STROKES[ch]) return { strokes: SURNAME_STROKES[ch], source: 'surname' };
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function readingOf(ch, kind) { const info = EL_INDEX.get(ch);
|
|
284
|
+
if (info && info.py) return { py: info.py, tone: info.tone };
|
|
285
|
+
if (kind === 'surname' && SURNAME_READING[ch]) {
|
|
286
|
+
const [py, tone] = SURNAME_READING[ch];
|
|
287
|
+
return { py, tone };
|
|
288
|
+
}
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* 五格剖象:天格 / 人格 / 地格 / 外格 / 总格 + 81 数理 + 三才。
|
|
294
|
+
* 单姓单名、单姓双名、复姓都按通行算法;任一字缺笔画就整体返回 uncomputable,不半算。
|
|
295
|
+
* @param {string} surname
|
|
296
|
+
* @param {string} given
|
|
297
|
+
* @param {Object<string, number>} [overrides] 字 → 康熙笔画,覆盖数据表(会被标为「用户指定」)
|
|
298
|
+
*/
|
|
299
|
+
export function wuge(surname, given, overrides) {
|
|
300
|
+
const s = [...String(surname || '')];
|
|
301
|
+
const g = [...String(given || '')];
|
|
302
|
+
if (!s.length || !g.length) return { available: false, reason: '需要姓与名才能排五格' };
|
|
303
|
+
if (s.length > 2) return { available: false, reason: '姓超过两字:五格只算单姓与常见复姓' };
|
|
304
|
+
|
|
305
|
+
// 复姓两字的笔画取自复姓表(逐字存,人格要用姓末字);表里有但用户又覆盖时以用户为准
|
|
306
|
+
const dbl = s.length === 2 ? DOUBLE_SURNAMES[surname] : null;
|
|
307
|
+
const useDbl = dbl && !s.some((ch) => overrides && overrides[ch]);
|
|
308
|
+
const sInfo = useDbl
|
|
309
|
+
? dbl.s.map((n) => ({ strokes: n, source: 'table' }))
|
|
310
|
+
: s.map((ch) => strokeOf(ch, overrides, 'surname'));
|
|
311
|
+
const gInfo = g.map((ch) => strokeOf(ch, overrides, 'given'));
|
|
312
|
+
const missing = [...s, ...g].filter((ch, i) => !(i < s.length ? sInfo[i] : gInfo[i - s.length]));
|
|
313
|
+
if (missing.length) {
|
|
314
|
+
return {
|
|
315
|
+
available: false,
|
|
316
|
+
reason: `这些字没有康熙笔画数据,五格算不了:${missing.join('、')}——可用 strokeOverrides 传入笔画后再算`,
|
|
317
|
+
missing,
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const sStroke = sInfo.map((x) => x.strokes);
|
|
322
|
+
const gStroke = gInfo.map((x) => x.strokes);
|
|
323
|
+
const sum = (a) => a.reduce((x, y) => x + y, 0);
|
|
324
|
+
const isDouble = s.length === 2;
|
|
325
|
+
const tian = isDouble ? sum(sStroke) : sStroke[0] + 1;
|
|
326
|
+
const ren = sStroke[s.length - 1] + gStroke[0];
|
|
327
|
+
const di = sum(gStroke) + (g.length === 1 ? 1 : 0);
|
|
328
|
+
const zong = sum(sStroke) + sum(gStroke);
|
|
329
|
+
// 单姓单名没有「外侧」,通行本固定记 2;其余情形(单姓双名 / 复姓单名 / 复姓双名)都是 总−人+1
|
|
330
|
+
const wai = s.length === 1 && g.length === 1 ? 2 : zong - ren + 1;
|
|
331
|
+
|
|
332
|
+
const rows = [['天格', tian], ['人格', ren], ['地格', di], ['外格', wai], ['总格', zong]].map(([key, n]) => ({
|
|
333
|
+
key, strokes: n, ...shuliOf(n),
|
|
334
|
+
}));
|
|
335
|
+
const sancaiNums = [tian, ren, di].map((n) => n % 10);
|
|
336
|
+
const sancaiEl = sancaiNums.map((n) => NUM_ELEMENT[n]);
|
|
337
|
+
const rels = [
|
|
338
|
+
{ pair: '天与人', rel: WX_REL(sancaiEl[0], sancaiEl[1]) },
|
|
339
|
+
{ pair: '人与地', rel: WX_REL(sancaiEl[1], sancaiEl[2]) },
|
|
340
|
+
];
|
|
341
|
+
const ordered = sancaiEl[0] === sancaiEl[1] && sancaiEl[1] === sancaiEl[2]
|
|
342
|
+
? '三才同气,气脉集中'
|
|
343
|
+
: rels.every((x) => x.rel === '生' || x.rel === '同')
|
|
344
|
+
? '一路相生,传统看作顺遂'
|
|
345
|
+
: rels.every((x) => x.rel === '克' || x.rel === '被克')
|
|
346
|
+
? '相连相克,传统看作内外拉扯'
|
|
347
|
+
: `${rels.map((x) => `${x.pair}${x.rel}`).join('、')},吉凶各派看法不一`;
|
|
348
|
+
|
|
349
|
+
const source = [...sInfo, ...gInfo].some((x) => x.source === 'user') ? 'mixed' : 'table';
|
|
350
|
+
return {
|
|
351
|
+
available: true,
|
|
352
|
+
surnameStyle: isDouble ? '复姓' : '单姓',
|
|
353
|
+
strokes: [
|
|
354
|
+
...s.map((ch, i) => ({ char: ch, strokes: sInfo[i].strokes, source: sInfo[i].source, kind: '姓' })),
|
|
355
|
+
...g.map((ch, i) => ({ char: ch, strokes: gInfo[i].strokes, source: gInfo[i].source, kind: '名' })),
|
|
356
|
+
],
|
|
357
|
+
rows,
|
|
358
|
+
sancai: {
|
|
359
|
+
elements: sancaiEl,
|
|
360
|
+
text: `${sancaiEl.join('')}(${ordered})`,
|
|
361
|
+
relations: rels,
|
|
362
|
+
},
|
|
363
|
+
summary: rows.map((r) => `${r.key}${r.strokes}${r.level}`).join(' '),
|
|
364
|
+
source,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
const INITIALS = ['zh', 'ch', 'sh', 'b', 'p', 'm', 'f', 'd', 't', 'n', 'l', 'g', 'k', 'h', 'j', 'q', 'x', 'r', 'z', 'c', 's', 'y', 'w'];
|
|
369
|
+
|
|
370
|
+
/** 按拼写切声母韵母:先匹配双字母声母(zh/ch/sh),其余取单字母;y/w 按拼写当声母处理。 */
|
|
371
|
+
export function splitPinyin(py) {
|
|
372
|
+
const p = String(py || '').toLowerCase();
|
|
373
|
+
for (const ini of INITIALS) {
|
|
374
|
+
if (p.startsWith(ini)) return { ini, fin: p.slice(ini.length) };
|
|
375
|
+
}
|
|
376
|
+
return { ini: '', fin: p };
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
const TONE_LABEL = { 1: '一', 2: '二', 3: '三', 4: '四' };
|
|
380
|
+
|
|
381
|
+
/**
|
|
382
|
+
* 音韵的机械检查:全名同调 / 相邻同声母 / 相邻同韵母 / 相邻同音(叠字)。
|
|
383
|
+
* 只报可数的事实,不替人判断好不好听,也不查语义谐音(那需要词库,没做就说没做)。
|
|
384
|
+
*/
|
|
385
|
+
export function phonetics(fullName) {
|
|
386
|
+
const chars = [...String(fullName || '')];
|
|
387
|
+
if (chars.length < 2) return { available: false, reason: '至少两个字才谈得上音韵' };
|
|
388
|
+
const items = chars.map((ch, i) => {
|
|
389
|
+
const r = readingOf(ch, i === 0 ? 'surname' : 'given');
|
|
390
|
+
return r ? { char: ch, py: r.py, tone: r.tone, ...splitPinyin(r.py) } : { char: ch, py: null, tone: null, ini: null, fin: null };
|
|
391
|
+
});
|
|
392
|
+
const missing = items.filter((x) => !x.py).map((x) => x.char);
|
|
393
|
+
if (missing.length) {
|
|
394
|
+
return { available: false, reason: `这些字没有读音数据:${missing.join('、')}`, missing };
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const issues = [];
|
|
398
|
+
const tones = new Set(items.map((x) => x.tone));
|
|
399
|
+
if (tones.size === 1 && items.length >= 2) {
|
|
400
|
+
issues.push({ type: 'tone', text: `全名都是${TONE_LABEL[items[0].tone]}声,声调没有起伏` });
|
|
401
|
+
}
|
|
402
|
+
for (let i = 1; i < items.length; i++) {
|
|
403
|
+
const a = items[i - 1];
|
|
404
|
+
const b = items[i];
|
|
405
|
+
if (a.py === b.py && a.tone === b.tone) {
|
|
406
|
+
issues.push({ type: 'same', text: `「${a.char}${b.char}」同音同调(叠字或撞音)` });
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
if (a.ini && a.ini === b.ini) issues.push({ type: 'initial', text: `「${a.char}${b.char}」同声母 ${a.ini}` });
|
|
410
|
+
if (a.fin === b.fin) issues.push({ type: 'final', text: `「${a.char}${b.char}」同韵母 ${a.fin}` });
|
|
411
|
+
}
|
|
412
|
+
const inis = new Set(items.map((x) => x.ini).filter(Boolean));
|
|
413
|
+
if (items.length >= 3 && inis.size === 1) {
|
|
414
|
+
issues.push({ type: 'initial', text: `三字同声母 ${[...inis][0]},连着读容易黏在一起` });
|
|
415
|
+
}
|
|
416
|
+
const level = issues.length === 0 ? '顺口' : issues.length === 1 ? '略拗' : '拗口';
|
|
417
|
+
return {
|
|
418
|
+
available: true,
|
|
419
|
+
chars: items.map((x) => ({ char: x.char, py: x.py, tone: x.tone })),
|
|
420
|
+
tonePattern: items.map((x) => x.tone).join('-'),
|
|
421
|
+
issues,
|
|
422
|
+
level,
|
|
423
|
+
};
|
|
233
424
|
}
|
|
234
425
|
|
|
235
426
|
/** 用户可自带某字的五行(字库未收时用,按你信的那派算;传了就算「用户指定」)。 */
|
|
@@ -345,6 +536,10 @@ export function assessName(input) {
|
|
|
345
536
|
else if (favCount > 0) verdict = `部分用字合喜用(${favCount}/${judged}),其余可再斟酌;喜用为 ${favorable.list.join('、')}。`;
|
|
346
537
|
else verdict = `用字未落在喜用(${favorable.list.join('、')})上;不必然是坏名,但若想贴合命局可换字再看。`;
|
|
347
538
|
|
|
539
|
+
const ov = overridesOf(input);
|
|
540
|
+
const wu = wuge(surname, given, ov);
|
|
541
|
+
const ph = phonetics(surname + given);
|
|
542
|
+
|
|
348
543
|
return {
|
|
349
544
|
system: 'name',
|
|
350
545
|
action: 'assess',
|
|
@@ -360,11 +555,14 @@ export function assessName(input) {
|
|
|
360
555
|
},
|
|
361
556
|
} : {}),
|
|
362
557
|
chars,
|
|
363
|
-
|
|
558
|
+
wuge: wu,
|
|
559
|
+
phonetics: ph,
|
|
560
|
+
stats: { chars: chars.length, known, unknown, favorableCount: favCount, libSize: CHAR_LIB.length, wugeReady: wu.available === true },
|
|
364
561
|
verdict,
|
|
365
562
|
notes: [
|
|
366
563
|
`字之五行按通行字义/偏旁归类,自建字库共 ${CHAR_LIB.length} 字(常用名用字为主);未收录的字不猜五行,如实标注,「用户指定」是你传入的归类。`,
|
|
367
|
-
'
|
|
564
|
+
'五格按康熙字典繁体笔画计(氵→水4、艹→艸6、华→華14 这类换算),81 数理取通行本、各派对少数数取法有出入;姓氏笔画表没覆盖的姓或你想按别派算,可传 strokeOverrides 覆盖。',
|
|
565
|
+
'音韵只做机械检查(全名同调、相邻同声母/同韵母、叠字),不做语义谐音判断——谐音、方言读法还得自己读三遍。',
|
|
368
566
|
'起名只做用字参考,不替父母做决定。',
|
|
369
567
|
],
|
|
370
568
|
};
|
|
@@ -397,6 +595,15 @@ export function generateNames(input) {
|
|
|
397
595
|
const fav = favorableElements(strength);
|
|
398
596
|
const pool = CHAR_LIB.filter((c) => fav.list.includes(c[1]) && c[0] !== surname);
|
|
399
597
|
const gPref = gender === 'male' ? 'm' : 'f';
|
|
598
|
+
// 五格只影响排序:姓的笔画整轮不变,先备好;每个候选只做四次取数与查表
|
|
599
|
+
const sChars = [...surname];
|
|
600
|
+
const ov = overridesOf(input);
|
|
601
|
+
const sStroke = sChars.map((ch) => strokeOf(ch, ov, 'surname'));
|
|
602
|
+
const sReady = sChars.length <= 2 && sStroke.every(Boolean);
|
|
603
|
+
const sSum = sReady ? sStroke.reduce((x, y) => x + y.strokes, 0) : 0;
|
|
604
|
+
const sLast = sReady ? sStroke[sStroke.length - 1].strokes : 0;
|
|
605
|
+
const lv = (n) => { const r = shuliOf(n); return r ? (r.level === '吉' ? 2 : r.level === '半吉' ? 1 : 0) : 0; };
|
|
606
|
+
const poolStroke = new Map(pool.map((c) => [c[0], (strokeOf(c[0], ov, 'given') || {}).strokes || 0]));
|
|
400
607
|
const scored = [];
|
|
401
608
|
for (let i = 0; i < pool.length; i++) {
|
|
402
609
|
for (let j = 0; j < pool.length; j++) {
|
|
@@ -406,6 +613,15 @@ export function generateNames(input) {
|
|
|
406
613
|
// 性别倾向:优先本性别与中性,避免两个字都强烈偏另一性别
|
|
407
614
|
const fit = (x) => (x[3] === gPref || x[3] === 'n' ? 1 : 0);
|
|
408
615
|
const gScore = fit(a) + fit(b) - (a[3] !== gPref && a[3] !== 'n' && b[3] !== gPref && b[3] !== 'n' ? 2 : 0);
|
|
616
|
+
const aSt = poolStroke.get(a[0]);
|
|
617
|
+
const bSt = poolStroke.get(b[0]);
|
|
618
|
+
let wuScore = 0;
|
|
619
|
+
if (sReady && aSt && bSt) {
|
|
620
|
+
const ren = sLast + aSt;
|
|
621
|
+
const di = aSt + bSt;
|
|
622
|
+
const zong = sSum + aSt + bSt;
|
|
623
|
+
wuScore = lv(ren) + lv(di) + lv(zong) + lv(zong - ren + 1);
|
|
624
|
+
}
|
|
409
625
|
scored.push({
|
|
410
626
|
name: a[0] + b[0],
|
|
411
627
|
chars: [
|
|
@@ -415,12 +631,14 @@ export function generateNames(input) {
|
|
|
415
631
|
elements: [a[1], b[1]],
|
|
416
632
|
allFavorable: fav.list.includes(a[1]) && fav.list.includes(b[1]),
|
|
417
633
|
genderScore: gScore,
|
|
634
|
+
wugeScore: wuScore,
|
|
418
635
|
order: (i * 7 + j * 13) % 9973, // 打散字库顺序,避免候选清一色都是前几个字
|
|
419
636
|
});
|
|
420
637
|
}
|
|
421
638
|
}
|
|
422
639
|
const mixed = (c) => (c.elements[0] !== c.elements[1] ? 1 : 0); // 两字异行,比同气堆叠更有层次
|
|
423
|
-
scored.sort((x, y) => (y.allFavorable - x.allFavorable) || (mixed(y) - mixed(x))
|
|
640
|
+
scored.sort((x, y) => (y.allFavorable - x.allFavorable) || (mixed(y) - mixed(x))
|
|
641
|
+
|| (y.wugeScore - x.wugeScore) || (y.genderScore - x.genderScore) || (x.order - y.order));
|
|
424
642
|
// 去重 + 用字轮换:先收「两个字都没出现过」的候选,再放宽——避免 20 个候选里 13 个都用同一个「梓」
|
|
425
643
|
const out = [];
|
|
426
644
|
const usedNames = new Set();
|
|
@@ -435,7 +653,11 @@ export function generateNames(input) {
|
|
|
435
653
|
usedNames.add(key);
|
|
436
654
|
usedPairs.add(pair);
|
|
437
655
|
cand.chars.forEach((x) => usedChars.add(x.char));
|
|
438
|
-
out.push({
|
|
656
|
+
out.push({
|
|
657
|
+
rank: out.length + 1, name: surname + cand.name, given: cand.name, chars: cand.chars,
|
|
658
|
+
wuge: wuge(surname, cand.name, ov),
|
|
659
|
+
phonetics: phonetics(surname + cand.name),
|
|
660
|
+
});
|
|
439
661
|
return true;
|
|
440
662
|
};
|
|
441
663
|
// 三轮:①新字 + 新五行组合 ②新字 ③放开——先保证候选之间不撞字、不撞组合
|
|
@@ -460,8 +682,11 @@ export function generateNames(input) {
|
|
|
460
682
|
candidates: out,
|
|
461
683
|
notes: [
|
|
462
684
|
`字库共 ${CHAR_LIB.length} 字,只在喜用五行(${fav.list.join('、')})里选字;未覆盖的生僻好字可用 charElements 指定五行后评估。`,
|
|
463
|
-
'
|
|
464
|
-
|
|
685
|
+
'候选排序依次看:合喜用 → 两字异行 → 五格(人格/地格/总格/外格 吉多者先)→ 性别倾向 → 字库序,是排序不是「吉名」判定。',
|
|
686
|
+
sReady
|
|
687
|
+
? '五格按康熙字典繁体笔画与通行本 81 数理算;姓的笔画取自内置姓氏表,没覆盖的姓可传 surnameStrokes 或 strokeOverrides。'
|
|
688
|
+
: '姓的笔画不在内置姓氏表里,这一轮没按五格排序(不半算);可传 surnameStrokes 或 strokeOverrides 后重算。',
|
|
689
|
+
'音韵只做机械检查(同调、相邻同声母/同韵母、叠字),不做语义谐音判断——候选的音韵结果随每条一起给出。',
|
|
465
690
|
],
|
|
466
691
|
};
|
|
467
692
|
}
|