Merge branch 'master' of github.com:mumuy/relationship

This commit is contained in:
PASSER-BY 2022-11-16 14:20:13 +08:00
commit 303128974a
24 changed files with 347 additions and 248 deletions

1
dist/relationship-mode.min.js vendored Normal file
View File

@ -0,0 +1 @@
!function(s,d){"object"==typeof exports&&"object"==typeof module?module.exports=d():"function"==typeof define&&define.amd?define([],d):"object"==typeof exports?exports.relationshipMode=d():s.relationshipMode=d()}(this,(()=>(()=>{"use strict";var s={d:(d,f)=>{for(var m in f)s.o(f,m)&&!s.o(d,m)&&Object.defineProperty(d,m,{enumerable:!0,get:f[m]})},o:(s,d)=>Object.prototype.hasOwnProperty.call(s,d)},d={};s.d(d,{default:()=>f});const f={guangdong:{name:"广东",data:{f:["老窦"],"f,f":["阿爷"],"f,f,f":["太公"],"f,f,m":["太婆"],"f,m":["阿嫲"],"f,m,f":["太外公"],"f,m,m":["太外婆"],"f,ob":["伯伯"],"f,ob,w":["伯娘"],"f,lb":["阿叔"],"f,lb,w":["阿婶"],"0,f,xb,d,s":["堂姨甥"],"1,f,xb,d,s":["堂外甥"],"0,f,xb,d,d":["堂姨甥女"],"1,f,xb,d,d":["堂外甥女"],"f,os":["姑妈"],"f,ls":["姑姐"],"f,xs,h":["姑丈"],"0,f,xs,d,s":["姑表姨甥"],"1,f,xs,d,s":["姑表外甥"],"0,f,xs,d,d":["姑表姨甥女"],"1,f,xs,d,d":["姑表外甥女"],m:["老母"],"m,f":["阿公"],"m,f,f":["外太公"],"m,f,m":["外太婆"],"m,m":["阿婆"],"m,m,f":["外太外公"],"m,m,m":["外太外婆"],"m,ob":["舅父"],"m,lb":["舅仔"],"m,xb,w":["舅母"],"0,m,xb,d,s":["舅表姨甥"],"1,m,xb,d,s":["舅表外甥"],"0,m,xb,d,d":["舅表姨甥女"],"1,m,xb,d,d":["舅表外甥女"],"m,os":["姨妈"],"m,ls":["姨仔"],"m,xs,h":["姨丈"],"0,m,xb,d,s":["姨姨甥"],"1,m,xb,d,s":["姨外甥"],"0,m,xb,d,d":["姨姨甥女"],"1,m,xb,d,d":["姨外甥女"],ob:["大佬"],"ob,w":["阿嫂"],lb:["细佬"],"lb,w":["弟妇"],"xb,s":["侄"],"xb,d":["侄女"],os:["家姐"],"os,h":["姐夫"],ls:["阿妹"],"ls,h":["妹夫"],"0,xs,s":["姨甥"],"1,xs,s":["外甥"],"0,xs,d":["姨甥女"],"1,xs,d":["外甥女"],s:["仔"],"s,w":["新妇"],"s,s":["孙"],"s,s,w":["孙新妇"],"s,s,s":["息仔"],"s,s,d":["息女"],"s,d":["孙女"],"s,d,h":["孙女婿"],"s,d,s":["外息仔"],"s,d,d":["外息女"],d:["女"],"d,s":["外孙"],"d,s,w":["外孙新妇"],"d,s,s":["外息仔"],"d,s,d":["外息女"],"d,d":["外孙女"],"d,d,h":["外孙女婿"],"d,d,s":["外息仔"],"d,d,d":["外息女"]}},north:{name:"北方",data:{"m,m":["姥姥"],"m,m,xs":["姨姥姥"],"m,m,xs,h":["姨姥爷"],"m,m,xb":["舅姥爷"],"m,m,xb,w":["舅姥姥"],"m,f":["姥爷"],"m,f,xs":["姑姥姥"],"m,f,xs,h":["姑姥爷"],"m,f,ob":["大姥爷"],"m,f,ob,w":["大姥姥"],"m,f,lb":["小姥爷"],"m,f,lb,w":["小姥姥"],"f,ob":["大爷"],"f,ob,w":["大娘"]}}};return d=d.default})()));

1
dist/relationship-mode.zh-HK.min.js vendored Normal file
View File

@ -0,0 +1 @@
!function(s,d){"object"==typeof exports&&"object"==typeof module?module.exports=d():"function"==typeof define&&define.amd?define([],d):"object"==typeof exports?exports.relationshipMode=d():s.relationshipMode=d()}(this,(()=>(()=>{"use strict";var s={d:(d,f)=>{for(var m in f)s.o(f,m)&&!s.o(d,m)&&Object.defineProperty(d,m,{enumerable:!0,get:f[m]})},o:(s,d)=>Object.prototype.hasOwnProperty.call(s,d)},d={};s.d(d,{default:()=>f});const f={guangdong:{name:"廣東",data:{f:["老竇"],"f,f":["阿爺"],"f,f,f":["太公"],"f,f,m":["太婆"],"f,m":["阿嫲"],"f,m,f":["太外公"],"f,m,m":["太外婆"],"f,ob":["伯伯"],"f,ob,w":["伯娘"],"f,lb":["阿叔"],"f,lb,w":["阿嬸"],"0,f,xb,d,s":["堂姨甥"],"1,f,xb,d,s":["堂外甥"],"0,f,xb,d,d":["堂姨甥女"],"1,f,xb,d,d":["堂外甥女"],"f,os":["姑媽"],"f,ls":["姑姐"],"f,xs,h":["姑丈"],"0,f,xs,d,s":["姑表姨甥"],"1,f,xs,d,s":["姑表外甥"],"0,f,xs,d,d":["姑表姨甥女"],"1,f,xs,d,d":["姑表外甥女"],m:["老母"],"m,f":["阿公"],"m,f,f":["外太公"],"m,f,m":["外太婆"],"m,m":["阿婆"],"m,m,f":["外太外公"],"m,m,m":["外太外婆"],"m,ob":["舅父"],"m,lb":["舅仔"],"m,xb,w":["舅母"],"0,m,xb,d,s":["舅表姨甥"],"1,m,xb,d,s":["舅表外甥"],"0,m,xb,d,d":["舅表姨甥女"],"1,m,xb,d,d":["舅表外甥女"],"m,os":["姨媽"],"m,ls":["姨仔"],"m,xs,h":["姨丈"],"0,m,xb,d,s":["姨姨甥"],"1,m,xb,d,s":["姨外甥"],"0,m,xb,d,d":["姨姨甥女"],"1,m,xb,d,d":["姨外甥女"],ob:["大佬"],"ob,w":["阿嫂"],lb:["細佬"],"lb,w":["弟婦"],"xb,s":["侄"],"xb,d":["侄女"],os:["家姐"],"os,h":["姐夫"],ls:["阿妹"],"ls,h":["妹夫"],"0,xs,s":["姨甥"],"1,xs,s":["外甥"],"0,xs,d":["姨甥女"],"1,xs,d":["外甥女"],s:["仔"],"s,w":["新婦"],"s,s":["孫"],"s,s,w":["孫新婦"],"s,s,s":["息仔"],"s,s,d":["息女"],"s,d":["孫女"],"s,d,h":["孫女婿"],"s,d,s":["外息仔"],"s,d,d":["外息女"],d:["女"],"d,s":["外孫"],"d,s,w":["外孫新婦"],"d,s,s":["外息仔"],"d,s,d":["外息女"],"d,d":["外孫女"],"d,d,h":["外孫女婿"],"d,d,s":["外息仔"],"d,d,d":["外息女"]}},north:{name:"北方",data:{"m,m":["姥姥"],"m,m,xs":["姨姥姥"],"m,m,xs,h":["姨姥爺"],"m,m,xb":["舅姥爺"],"m,m,xb,w":["舅姥姥"],"m,f":["姥爺"],"m,f,xs":["姑姥姥"],"m,f,xs,h":["姑姥爺"],"m,f,ob":["大姥爺"],"m,f,ob,w":["大姥姥"],"m,f,lb":["小姥爺"],"m,f,lb,w":["小姥姥"],"f,ob":["大爺"],"f,ob,w":["大娘"]}}};return d=d.default})()));

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -9,6 +9,11 @@ gulp.task('mini', () => {
// .pipe(rename("zh-HK.html"))
// .pipe(gulp.dest("./"));
gulp.src('dist/relationship-mode.min.js')
.pipe(cht())
.pipe(rename("relationship-mode.zh-HK.min.js"))
.pipe(gulp.dest('dist/'))
return gulp.src('dist/relationship.min.js')
.pipe(cht())
.pipe(rename("relationship.zh-HK.min.js"))

View File

@ -75,7 +75,11 @@
<span>默认</span>
</label>
<label for="field-0-2">
<input id="field-0-2" type="radio" name="mode" value="cantonese">
<input id="field-0-2" type="radio" name="mode" value="north">
<span>北方地区</span>
</label>
<label for="field-0-3">
<input id="field-0-3" type="radio" name="mode" value="guangdong">
<span>粤语惯用</span>
</label>
</div>
@ -409,89 +413,15 @@
</div>
</div>
<script type="text/javascript" src="dist/relationship.min.js"></script>
<script type="text/javascript" src="dist/relationship-mode.min.js"></script>
<script type="text/javascript">
// 获取数量
document.getElementById('count').innerText = relationship.dataCount;
// 自定义模式
relationship.setMode('cantonese',{
'f':['阿爸'],
'f,f':['阿爷'],
'f,f,f':['太公'],
'f,f,m':['太婆'],
'f,m':['阿嫲'],
'f,m,f':['太外公'],
'f,m,m':['太外婆'],
'f,ob':['大伯'],
'f,ob,w':['伯娘'],
'f,lb':['阿叔'],
'f,lb,w':['阿婶'],
'0,f,xb,d,s':['堂姨甥'],
'1,f,xb,d,s':['堂外甥'],
'0,f,xb,d,d':['堂姨甥女'],
'1,f,xb,d,d':['堂外甥女'],
'f,os':['姑妈'],
'f,ls':['姑姐'],
'f,xs,h':['姑丈'],
'0,f,xs,d,s':['姑表姨甥'],
'1,f,xs,d,s':['姑表外甥'],
'0,f,xs,d,d':['姑表姨甥女'],
'1,f,xs,d,d':['姑表外甥女'],
'm':['阿妈','老母'],
'm,f':['阿公'],
'm,f,f':['外太公'],
'm,f,m':['外太婆'],
'm,m':['阿婆'],
'm,m,f':['外太外公'],
'm,m,m':['外太外婆'],
'm,ob':['舅父'],
'm,lb':['舅仔'],
'm,xb,w':['舅母'],
'0,m,xb,d,s':['舅表姨甥'],
'1,m,xb,d,s':['舅表外甥'],
'0,m,xb,d,d':['舅表姨甥女'],
'1,m,xb,d,d':['舅表外甥女'],
'm,os':['姨妈'],
'm,ls':['姨仔'],
'm,xs,h':['姨丈'],
'0,m,xb,d,s':['姨姨甥'],
'1,m,xb,d,s':['姨外甥'],
'0,m,xb,d,d':['姨姨甥女'],
'1,m,xb,d,d':['姨外甥女'],
'ob':['阿哥'],
'ob,w':['阿嫂'],
'lb':['阿弟','细佬'],
'lb,w':['弟妇'],
'xb,s':['侄'],
'xb,d':['侄女'],
'os':['阿姐'],
'os,h':['姐夫'],
'ls':['阿妹'],
'ls,h':['妹夫'],
'0,xs,s':['姨甥'],
'1,xs,s':['外甥'],
'0,xs,d':['姨甥女'],
'1,xs,d':['外甥女'],
's':['仔'],
's,w':['新妇'],
's,s':['孙'],
's,s,w':['孙新妇'],
's,s,s':['息仔'],
's,s,d':['息女'],
's,d':['孙女'],
's,d,h':['孙女婿'],
's,d,s':['外息仔'],
's,d,d':['外息女'],
'd':['女'],
'd,s':['外孙'],
'd,s,w':['外孙新妇'],
'd,s,s':['外息仔'],
'd,s,d':['外息女'],
'd,d':['外孙女'],
'd,d,h':['外孙女婿'],
'd,d,s':['外息仔'],
'd,d,d':['外息女'],
});
for(var key in relationshipMode){
relationship.setMode(key,relationshipMode[key]['data']);
}
// 标签页
(function(){
@ -534,7 +464,12 @@
var value = $input.value.trim();
if(value){
var sex = $sex[0].checked?1:0;
var mode = $mode[0].checked?$mode[0].value:$mode[1].value;
var mode = 'default';
if($mode[1].checked){
mode = $mode[1].value;
}else if($mode[2].checked){
mode = $mode[2].value;
}
var reverse = !$reverse[0].checked;
var result = relationship({text:value,sex:sex,reverse:reverse,mode:mode});
$result.value = '';

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "relationship.js",
"version": "1.2.0",
"version": "1.2.2",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "relationship.js",
"version": "1.2.0",
"version": "1.2.2",
"license": "MIT",
"devDependencies": {
"gulp": "^4.0.2",

View File

@ -1,6 +1,6 @@
{
"name": "relationship.js",
"version": "1.2.0",
"version": "1.2.2",
"summary": "relationship.js is a javascript library for chinese family relationship. 中国家庭亲戚称谓计算器,家庭关系、亲戚关系算法。",
"description": "Chinese kinship library",
"author": "HaoLe Zheng",

View File

@ -26,7 +26,9 @@ var relationship = require("relationship.js");
## 二、使用
1. 通用方法: 唯一的计算方法 `relationship(options)`.
1. 通用方法: 唯一的计算方法 `relationship`.
* 选项模式`relationship(options)`
参数`options`结构为:
@ -53,7 +55,7 @@ relationship({text:'妈妈的妈妈的哥哥'});
relationship({text:'七舅姥爷',reverse:true,sex:1});
// => ['甥外孙']
// 如:舅公和我具体是什么关系?
// 如:舅公是什么亲戚
relationship({text:'舅公',type:'chain'});
// => ['爸爸的妈妈的兄弟', '妈妈的妈妈的兄弟', '老公的妈妈的兄弟']
@ -64,8 +66,24 @@ relationship({text:'外婆',target:'舅妈',sex:1});
// 如:外婆和奶奶之间是什么关系?
relationship({text:'外婆',target:'奶奶',type:'pair'});
// => ['儿女亲家']
```
* 语句模式`relationship(exptession)`
参数`exptession`句式可以为:`xxx是xxx的什么人``xxx叫xxx什么``xxx如何称呼xxx`等.
代码示例:
```js
// 如:舅妈如何称呼外婆?
relationship('舅妈如何称呼外婆?');
// => ['婆婆']
// 如:外婆和奶奶之间是什么关系?
relationship('外婆和奶奶之间是什么关系?');
// => ['儿女亲家']
```
2. 内部属性:获取当前数据表 `relationship.data`.
3. 内部属性:获取当前数据量 `relationship.dataCount`.

81
src/locale/guangdong.js Normal file
View File

@ -0,0 +1,81 @@
export default {
'name':'广东',
'data':{
'f':['老窦'],
'f,f':['阿爷'],
'f,f,f':['太公'],
'f,f,m':['太婆'],
'f,m':['阿嫲'],
'f,m,f':['太外公'],
'f,m,m':['太外婆'],
'f,ob':['伯伯'],
'f,ob,w':['伯娘'],
'f,lb':['阿叔'],
'f,lb,w':['阿婶'],
'0,f,xb,d,s':['堂姨甥'],
'1,f,xb,d,s':['堂外甥'],
'0,f,xb,d,d':['堂姨甥女'],
'1,f,xb,d,d':['堂外甥女'],
'f,os':['姑妈'],
'f,ls':['姑姐'],
'f,xs,h':['姑丈'],
'0,f,xs,d,s':['姑表姨甥'],
'1,f,xs,d,s':['姑表外甥'],
'0,f,xs,d,d':['姑表姨甥女'],
'1,f,xs,d,d':['姑表外甥女'],
'm':['老母'],
'm,f':['阿公'],
'm,f,f':['外太公'],
'm,f,m':['外太婆'],
'm,m':['阿婆'],
'm,m,f':['外太外公'],
'm,m,m':['外太外婆'],
'm,ob':['舅父'],
'm,lb':['舅仔'],
'm,xb,w':['舅母'],
'0,m,xb,d,s':['舅表姨甥'],
'1,m,xb,d,s':['舅表外甥'],
'0,m,xb,d,d':['舅表姨甥女'],
'1,m,xb,d,d':['舅表外甥女'],
'm,os':['姨妈'],
'm,ls':['姨仔'],
'm,xs,h':['姨丈'],
'0,m,xb,d,s':['姨姨甥'],
'1,m,xb,d,s':['姨外甥'],
'0,m,xb,d,d':['姨姨甥女'],
'1,m,xb,d,d':['姨外甥女'],
'ob':['大佬'],
'ob,w':['阿嫂'],
'lb':['细佬'],
'lb,w':['弟妇'],
'xb,s':['侄'],
'xb,d':['侄女'],
'os':['家姐'],
'os,h':['姐夫'],
'ls':['阿妹'],
'ls,h':['妹夫'],
'0,xs,s':['姨甥'],
'1,xs,s':['外甥'],
'0,xs,d':['姨甥女'],
'1,xs,d':['外甥女'],
's':['仔'],
's,w':['新妇'],
's,s':['孙'],
's,s,w':['孙新妇'],
's,s,s':['息仔'],
's,s,d':['息女'],
's,d':['孙女'],
's,d,h':['孙女婿'],
's,d,s':['外息仔'],
's,d,d':['外息女'],
'd':['女'],
'd,s':['外孙'],
'd,s,w':['外孙新妇'],
'd,s,s':['外息仔'],
'd,s,d':['外息女'],
'd,d':['外孙女'],
'd,d,h':['外孙女婿'],
'd,d,s':['外息仔'],
'd,d,d':['外息女'],
}
}

19
src/locale/north.js Normal file
View File

@ -0,0 +1,19 @@
export default {
'name':'北方',
'data':{
'm,m':['姥姥'],
'm,m,xs':['姨姥姥'],
'm,m,xs,h':['姨姥爷'],
'm,m,xb':['舅姥爷'],
'm,m,xb,w':['舅姥姥'],
'm,f':['姥爷'],
'm,f,xs':['姑姥姥'],
'm,f,xs,h':['姑姥爷'],
'm,f,ob':['大姥爷'],
'm,f,ob,w':['大姥姥'],
'm,f,lb':['小姥爷'],
'm,f,lb,w':['小姥姥'],
'f,ob':['大爷'],
'f,ob,w':['大娘'],
}
}

82
src/module/expression.js Normal file
View File

@ -0,0 +1,82 @@
// 自然语言表达
export default [
{
exp:/^(\S+?)(应该|得)?(称呼|叫|喊)(什么|啥)?$/,
opt:match=>({
text:match[1]
})
},
{
exp:/^(\S+?)(应该|得)?(如何|怎么)(称呼|叫|喊)?$/,
opt:match=>({
text:match[1]
})
},
{
exp:/^(\S+?)是(谁|什么亲戚|啥亲戚|什么辈分|啥辈分)?$/,
opt:match=>{
return {
text:match[1],
type:match[0].indexOf('的')>-1?'default':'chain'
};
}
},
{
exp:/^(\S+?)(应该|得)?(称呼|叫|喊)(\S+?)(什么|啥)?$/,
opt:match=>({
text:match[4],
target:match[1]
})
},
{
exp:/^(\S+?)(应该|得)?(如何|怎么)(称呼|叫|喊)(\S+?)?$/,
opt:match=>({
text:match[5],
target:match[1]
})
},
{
exp:/^(\S+?)是(\S+?)的(谁|什么|什么亲戚|啥亲戚|什么人)?$/,
opt:match=>({
text:match[1],
target:match[2]
})
},
{
exp:/^(\S+?)(应该|得)?管(\S+?)叫(什么|啥)?$/,
opt:match=>({
text:match[2],
target:match[1]
})
},
{
exp:/^(\S+?)(和|与)(\S+?)(之间)?是(什么|啥)关系??$/,
opt:match=>({
text:match[1],
target:match[3],
type:'pair'
})
},
{
exp:/^(\S+?)(指的)?是(什么|啥)(意思|关系|辈分|人)?$/,
opt:match=>({
text:match[1],
type:'chain'
})
},
{
exp:/^(\S+?)(指的)?是(什么|啥)亲戚关系??$/,
opt:match=>({
text:match[1],
type:'chain'
})
},
{
exp:/^(\S+?)对于(\S+?)是(什么|啥)关系??$/,
opt:match=>({
text:match[1],
target:match[2],
type:'chain'
})
},
];

View File

@ -2,6 +2,7 @@
import _filter from './filter';
import _map from './map';
import _pair from './pair';
import _expression from './expression';
var _mode = {}; // 模式数据
var _data = Object.assign({},_map); // 最终数据
@ -14,17 +15,8 @@ var zh2number = function(text){
if(map[text]){
num = map[text];
}else{
if(text.includes('十')){
var numAttr = text.split('十');
if(!numAttr[0]){
num = 10;
}else{
num = textAttr.indexOf(numAttr[0])*10;
}
num += textAttr.indexOf(numAttr[1]);
}else{
num += textAttr.includes(text)?textAttr.indexOf(text):0;
}
var [unit,dec=0] = text.replace(/^十/,'一十').split('十').map(word=> textAttr.indexOf(word)).reverse();
num = dec*10+unit;
}
return num;
};
@ -39,15 +31,7 @@ var number2zh = function(num){
}else{
var dec = ~~(num/10);
var unit = num%10;
if(dec){
if(dec>1){
text = dec<textAttr.length?textAttr[dec]:'';
}
text += '十';
text += unit<textAttr.length?textAttr[unit]:'';
}else{
text += num<textAttr.length?textAttr[num]:'';
}
text = (dec?(textAttr[dec]+'十').replace('一十','十'):'')+textAttr[unit];
}
return text;
};
@ -66,9 +50,7 @@ var getGen = function(id){
// 获得最简
var getOptimal = function(options){
var from = options['from'];
var to = options['to']
var sex = options['sex'];
var {from,to,sex} = options;
var from_chain = options['from'].split(',');
var to_chain = options['to'].split(',');
for(var i=0;i<from_chain.length&&i<to_chain.length;i++){
@ -217,10 +199,10 @@ export function getSelectors(str){
getList(name);
// 通过关键词找关系
keywords.forEach(function(name){
var x_name = name.replace(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/,'几');
var r_name = name.replace(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/,'');
var match = name.match(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/);
if(match){
var x_name = name.replace(match[0],'几');
var r_name = name.replace(match[0],'');
var num = zh2number(match[0]);
for(var i in _data){
var r_i = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num);
@ -272,9 +254,7 @@ export function getSelectors(str){
// 合并选择器,查找两个对象之间的关系
export function mergeSelector(param){
var from_selector = param['from'];
var to_selector = param['to'];
var my_sex = param['sex'];
var {from:from_selector,to:to_selector,sex:my_sex} = param;
if(my_sex<0){
var to_sex = -1;
var from_sex = -1;
@ -379,8 +359,7 @@ export function selector2id(selector,sex){
hash[selector] = true;
do{
s = selector;
for(var i in _filter){
var item = _filter[i];
for(var item of _filter){
// console.log('[filter]',item['exp'],selector);
selector = selector.replace(item['exp'],item['str']);
if(selector.includes('#')){
@ -457,19 +436,18 @@ export function reverseId(id,sex){
// 通过ID获取关系称呼
export function getItemsById(id){
var items = [];
var getData = function(d){
var getData = function(key){
var res = [];
if(_data[d]){
res.push(_data[d][0]);
if(_data[key]){
res.push(_data[key][0]);
}else{
for(var i in _data){
if(i.replace(/&[ol]/g,'')==d){
if(i.replace(/&[ol]/g,'')==key){
res.push(_data[i][0]);
}else{
var expr = d;
while (expr.match(/[ol](b|s)/)){
expr = expr.replace(/[ol](b|s)/,'x$1');
if(expr==i){
while (key.match(/[ol](b|s)/)){
key = key.replace(/[ol](b|s)/,'x$1');
if(key==i){
res.push(_data[i][0]);
break;
}
@ -589,11 +567,22 @@ export function setMode(sign,data){
// 获取模式数据
export function getDataByMode(sign){
var data = Object.assign({},_map);
_data = Object.assign({},_map);
if(sign&&_mode[sign]){
for(var key in _mode[sign]){
data[key] = [].concat(_mode[sign][key],_map[key]||[]);
_data[key] = [].concat(_mode[sign][key],_map[key]||[]);
}
}
return data;
return _data;
};
// 获取配置
export function getOptions(text){
for(var item of _expression){
var match = text.match(item['exp']);
if(match){
return item['opt'](match);
}
}
return {};
};

View File

@ -209,9 +209,7 @@ var prefix = {
for(var key in prefixMap){
for(var selector in prefixMap[key]){
var ids = selector2id(selector);
if(typeof prefix[key]=='undefined'){
prefix[key] = {};
}
prefix[key] = prefix[key]||{};
ids.forEach(function(id){
prefix[key][id] = prefixMap[key][selector];
});

7
src/relationship-mode.js Normal file
View File

@ -0,0 +1,7 @@
import guangdong from './locale/guangdong';
import north from './locale/north';
export default {
guangdong,
north
};

View File

@ -1,5 +1,6 @@
import {
unique,
getOptions,
getSelectors,
mergeSelector,
selector2id,
@ -9,11 +10,14 @@ import {
getPairsByIds,
setMode,
getDataByMode
} from './method';
} from './module/method';
var _data = getDataByMode(); // 最终数据
// 对外方法
var relationship = function (parameter){
if(typeof parameter =='string'){
parameter = getOptions(parameter);
}
var options = Object.assign({
text:'', // 目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔
target:'', // 相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己
@ -33,13 +37,12 @@ var relationship = function (parameter){
// console.log('[selectors]',from_selectors,to_selectors);
from_selectors.forEach(function(from_selector){
to_selectors.forEach(function(to_selector){
var list = mergeSelector({
mergeSelector({
from:from_selector,
to:to_selector,
sex:options.sex,
optimal:options.optimal
});
list.forEach(function(data){
}).forEach(function(data){
// console.log('[data]',from_selector,to_selector,data);
var ids = data?selector2id(data['selector'],data['sex']):null;
// console.log('[ids]',data['selector'],data['sex'],ids);
@ -73,9 +76,7 @@ var relationship = function (parameter){
temps = reverseId(id,data['sex']);
temps.forEach(function(r_id){
var pairs = getPairsByIds(id,r_id);
if(pairs.length){
result = result.concat(pairs);
}
result = result.concat(pairs);
});
}else{
temps.forEach(function(id){
@ -83,9 +84,7 @@ var relationship = function (parameter){
if(!items.length){
items = getItemsById(sex+','+id);
}
if(items.length){
result = result.concat(items);
}
result = result.concat(items);
});
}
});

View File

@ -3,8 +3,8 @@ var test = require('tape');
var relationship = require('..');
test('relationship.js show to be tested', function (t) {
// console.log('[test]',relationship({text:'堂哥',target:'叔叔',type:'pair',optimal:true}));
// console.log('[test]',relationship('妈妈应该如何称呼姑姑'));
t.deepEqual(relationship({text:'儿子的爸爸的妈妈',sex:1}),['妈妈']);
t.deepEqual(relationship({text:'爱人',sex:1}),['老婆']);
t.deepEqual(relationship({text:'爱人的爱人',sex:1}),['自己']);
@ -39,5 +39,13 @@ test('relationship.js show to be tested', function (t) {
t.deepEqual(relationship({text:'大舅',target:'二舅的儿子'}),['伯父']);
t.deepEqual(relationship({text:'堂哥',target:'叔叔',type:'pair'}),['叔侄','父子']);
t.deepEqual(relationship({text:'堂哥',target:'叔叔',type:'pair',optimal:true}),['父子']);
t.deepEqual(relationship('妈妈应该如何称呼姑姑'),['姑子']);
t.deepEqual(relationship('姑奶奶是什么关系'),['爸爸的爸爸的姐妹']);
t.deepEqual(relationship('姑奶奶和爸爸是什么关系'),['姑侄']);
t.deepEqual(relationship('我应该叫外婆的哥哥什么?'),['舅外公']);
t.deepEqual(relationship('七舅姥爷应该叫我什么?'),['甥外孙','甥外孙女']);
t.deepEqual(relationship('舅公是什么关系?'),['爸爸的妈妈的兄弟', '妈妈的妈妈的兄弟', '老公的妈妈的兄弟']);
t.deepEqual(relationship('舅妈如何称呼外婆?'),['婆婆']);
t.deepEqual(relationship('外婆和奶奶之间是什么关系?'),['儿女亲家']);
t.end();
});

View File

@ -17,25 +17,46 @@ ${repository}
Create on: ${date}`;
module.exports = {
mode: 'production',
entry: './src/relationship.js',
output: {
path: path.resolve(__dirname,'dist'),
filename: 'relationship.min.js',
globalObject: 'this',
library: 'relationship',
libraryTarget: 'umd',
libraryExport:'default'
module.exports = [
{
mode: 'production',
entry: './src/relationship.js',
output: {
path: path.resolve(__dirname,'dist'),
filename: 'relationship.min.js',
globalObject: 'this',
library: 'relationship',
libraryTarget: 'umd',
libraryExport:'default'
},
plugins: [
new webpack.BannerPlugin(copyright)
],
optimization: {
minimizer: [
new TerserJSPlugin({
extractComments: false
}),
]
}
},
plugins: [
new webpack.BannerPlugin(copyright)
],
optimization: {
minimizer: [
new TerserJSPlugin({
extractComments: false
}),
]
{
mode: 'production',
entry:'./src/relationship-mode.js',
output: {
path: path.resolve(__dirname,'dist'),
filename: 'relationship-mode.min.js',
globalObject: 'this',
library: 'relationshipMode',
libraryTarget: 'umd',
libraryExport:'default'
},
optimization: {
minimizer: [
new TerserJSPlugin({
extractComments: false
}),
]
}
}
};
];

View File

@ -75,7 +75,11 @@
<span>默認</span>
</label>
<label for="field-0-2">
<input id="field-0-2" type="radio" name="mode" value="cantonese">
<input id="field-0-2" type="radio" name="mode" value="north">
<span>北方地區</span>
</label>
<label for="field-0-3">
<input id="field-0-3" type="radio" name="mode" value="guangdong">
<span>粵語慣用</span>
</label>
</div>
@ -409,89 +413,15 @@
</div>
</div>
<script type="text/javascript" src="dist/relationship.zh-HK.min.js"></script>
<script type="text/javascript" src="dist/relationship-mode.zh-HK.min.js"></script>
<script type="text/javascript">
// 獲取數量
document.getElementById('count').innerText = relationship.dataCount;
// 自定義模式
relationship.setMode('cantonese',{
'f':['阿爸'],
'f,f':['阿爺'],
'f,f,f':['太公'],
'f,f,m':['太婆'],
'f,m':['阿嫲'],
'f,m,f':['太外公'],
'f,m,m':['太外婆'],
'f,ob':['大伯'],
'f,ob,w':['伯娘'],
'f,lb':['阿叔'],
'f,lb,w':['阿嬸'],
'0,f,xb,d,s':['堂姨甥'],
'1,f,xb,d,s':['堂外甥'],
'0,f,xb,d,d':['堂姨甥女'],
'1,f,xb,d,d':['堂外甥女'],
'f,os':['姑媽'],
'f,ls':['姑姐'],
'f,xs,h':['姑丈'],
'0,f,xs,d,s':['姑表姨甥'],
'1,f,xs,d,s':['姑表外甥'],
'0,f,xs,d,d':['姑表姨甥女'],
'1,f,xs,d,d':['姑表外甥女'],
'm':['阿媽','老母'],
'm,f':['阿公'],
'm,f,f':['外太公'],
'm,f,m':['外太婆'],
'm,m':['阿婆'],
'm,m,f':['外太外公'],
'm,m,m':['外太外婆'],
'm,ob':['舅父'],
'm,lb':['舅仔'],
'm,xb,w':['舅母'],
'0,m,xb,d,s':['舅表姨甥'],
'1,m,xb,d,s':['舅表外甥'],
'0,m,xb,d,d':['舅表姨甥女'],
'1,m,xb,d,d':['舅表外甥女'],
'm,os':['姨媽'],
'm,ls':['姨仔'],
'm,xs,h':['姨丈'],
'0,m,xb,d,s':['姨姨甥'],
'1,m,xb,d,s':['姨外甥'],
'0,m,xb,d,d':['姨姨甥女'],
'1,m,xb,d,d':['姨外甥女'],
'ob':['阿哥'],
'ob,w':['阿嫂'],
'lb':['阿弟','細佬'],
'lb,w':['弟婦'],
'xb,s':['侄'],
'xb,d':['侄女'],
'os':['阿姐'],
'os,h':['姐夫'],
'ls':['阿妹'],
'ls,h':['妹夫'],
'0,xs,s':['姨甥'],
'1,xs,s':['外甥'],
'0,xs,d':['姨甥女'],
'1,xs,d':['外甥女'],
's':['仔'],
's,w':['新婦'],
's,s':['孫'],
's,s,w':['孫新婦'],
's,s,s':['息仔'],
's,s,d':['息女'],
's,d':['孫女'],
's,d,h':['孫女婿'],
's,d,s':['外息仔'],
's,d,d':['外息女'],
'd':['女'],
'd,s':['外孫'],
'd,s,w':['外孫新婦'],
'd,s,s':['外息仔'],
'd,s,d':['外息女'],
'd,d':['外孫女'],
'd,d,h':['外孫女婿'],
'd,d,s':['外息仔'],
'd,d,d':['外息女'],
});
for(var key in relationshipMode){
relationship.setMode(key,relationshipMode[key]['data']);
}
// 標籤頁
(function(){
@ -534,7 +464,12 @@
var value = $input.value.trim();
if(value){
var sex = $sex[0].checked?1:0;
var mode = $mode[0].checked?$mode[0].value:$mode[1].value;
var mode = 'default';
if($mode[1].checked){
mode = $mode[1].value;
}else if($mode[2].checked){
mode = $mode[2].value;
}
var reverse = !$reverse[0].checked;
var result = relationship({text:value,sex:sex,reverse:reverse,mode:mode});
$result.value = '';