updated 将方法进行模块化管理
This commit is contained in:
parent
adcbd8530b
commit
7a0911d27d
4
dist/relationship.min.js
vendored
4
dist/relationship.min.js
vendored
File diff suppressed because one or more lines are too long
4
dist/relationship.zh-HK.min.js
vendored
4
dist/relationship.zh-HK.min.js
vendored
File diff suppressed because one or more lines are too long
@ -1,4 +1,6 @@
|
|||||||
// 分支关系链
|
/*
|
||||||
|
* 分支关系链 - 旁支亲戚的分支关系链
|
||||||
|
*/
|
||||||
export default {
|
export default {
|
||||||
// 其他旁系
|
// 其他旁系
|
||||||
'{G2}':['祖父'],
|
'{G2}':['祖父'],
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// 主要关系链
|
/*
|
||||||
|
* 主要关系链
|
||||||
|
*/
|
||||||
export default {
|
export default {
|
||||||
'':['自己','我','俺','吾','本人','在下'],
|
'':['自己','我','俺','吾','本人','在下'],
|
||||||
// 主线
|
// 主线
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// 并称关系链
|
/*
|
||||||
|
* 并称关系链 - 某个称呼同时包含多层关系链
|
||||||
|
*/
|
||||||
export default {
|
export default {
|
||||||
'[f,f|f,m|m,f],[f,m],f':['老太奶爷','祖太奶爷'],
|
'[f,f|f,m|m,f],[f,m],f':['老太奶爷','祖太奶爷'],
|
||||||
'[f,f|f,m|m,f],[f,m],m':['老太奶奶','祖太奶奶'],
|
'[f,f|f,m|m,f],[f,m],m':['老太奶奶','祖太奶奶'],
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// 关系合称
|
/*
|
||||||
|
* 关系合称 - 两个人之间的关系合称
|
||||||
|
*/
|
||||||
export default {
|
export default {
|
||||||
'f#s':['父子'],
|
'f#s':['父子'],
|
||||||
'm#s':['母子'],
|
'm#s':['母子'],
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// 分支前缀
|
/*
|
||||||
|
* 分支前缀 - 旁支亲戚的分支节点
|
||||||
|
*/
|
||||||
export default {
|
export default {
|
||||||
'{G2C}':{
|
'{G2C}':{
|
||||||
'[f|m],[f|m],[f|m],[f,xs|m,xb|m,xs],[s|d],[s|d]':['重表'], // 曾祖辈的表兄弟姐妹的子女
|
'[f|m],[f|m],[f|m],[f,xs|m,xb|m,xs],[s|d],[s|d]':['重表'], // 曾祖辈的表兄弟姐妹的子女
|
||||||
|
209
src/module/id.js
Normal file
209
src/module/id.js
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
/*
|
||||||
|
* 标识符 - 唯一性关系链,将【关系链】转换成【中文表述】
|
||||||
|
*/
|
||||||
|
import _pair from './data/pair';
|
||||||
|
|
||||||
|
import {number2zh} from './unit';
|
||||||
|
import {selector2id} from './selector';
|
||||||
|
import {modeData as _data} from './mode';
|
||||||
|
|
||||||
|
// 逆转ID
|
||||||
|
export function reverseId(id,sex){
|
||||||
|
var hash = {
|
||||||
|
f:['d','s'],
|
||||||
|
m:['d','s'],
|
||||||
|
h:['w',''],
|
||||||
|
w:['','h'],
|
||||||
|
s:['m','f'],
|
||||||
|
d:['m','f'],
|
||||||
|
lb:['os','ob'],
|
||||||
|
ob:['ls','lb'],
|
||||||
|
xb:['xs','xb'],
|
||||||
|
ls:['os','ob'],
|
||||||
|
os:['ls','lb'],
|
||||||
|
xs:['xs','xb']
|
||||||
|
};
|
||||||
|
var age = '';
|
||||||
|
if(id.match(/&o$/)){
|
||||||
|
age = '&l';
|
||||||
|
}else if(id.match(/&l$/)){
|
||||||
|
age = '&o';
|
||||||
|
}
|
||||||
|
if(id){
|
||||||
|
id = id.replace(/&[ol\d+]/g,'');
|
||||||
|
//性别判断
|
||||||
|
if(sex<0){
|
||||||
|
if(id.match(/^w/)){
|
||||||
|
sex = 1;
|
||||||
|
}else if(id.match(/^h/)){
|
||||||
|
sex = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var result = [];
|
||||||
|
var doing = function(sex){
|
||||||
|
var sid = (','+sex+','+id).replace(/,[fhs]|,[olx]b/g,',1').replace(/,[mwd]|,[olx]s/g,',0');
|
||||||
|
sid = sid.substring(0,sid.length-2);
|
||||||
|
var id_arr = id.split(',').reverse();
|
||||||
|
var sid_arr = sid.split(',').reverse();
|
||||||
|
var arr = id_arr.map((id,i)=>hash[id][sid_arr[i]]);
|
||||||
|
var r_id = arr.join(',');
|
||||||
|
var gen = getGenById(r_id);
|
||||||
|
return r_id +(gen?'':age);
|
||||||
|
};
|
||||||
|
if(sex<0){
|
||||||
|
result.push(doing(1));
|
||||||
|
result.push(doing(0));
|
||||||
|
}else{
|
||||||
|
result.push(doing(sex));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
return [''];
|
||||||
|
};
|
||||||
|
|
||||||
|
// 通过ID获取世代数
|
||||||
|
export function getGenById(id){
|
||||||
|
var gMap = {'f':1,'m':1,'s':-1,'d':-1};
|
||||||
|
var arr = id.split(',');
|
||||||
|
var gen = 0;
|
||||||
|
arr.forEach(function(sub){
|
||||||
|
var s = sub.replace(/&[ol\d]+/,'');
|
||||||
|
gen += gMap[s]||0;
|
||||||
|
});
|
||||||
|
return gen;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 通过ID获取关系称呼
|
||||||
|
export function getItemsById(id){
|
||||||
|
var items = [];
|
||||||
|
var getData = function(key){
|
||||||
|
var res = [];
|
||||||
|
if(_data[key]){
|
||||||
|
res.push(_data[key][0]);
|
||||||
|
}else{
|
||||||
|
for(var i in _data){
|
||||||
|
if(i.replace(/&[ol]/g,'')==key){
|
||||||
|
res.push(_data[i][0]);
|
||||||
|
}else{
|
||||||
|
while (key.match(/[ol](b|s)/)){
|
||||||
|
key = key.replace(/[ol](b|s)/,'x$1');
|
||||||
|
if(key==i){
|
||||||
|
res.push(_data[i][0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
// 对排序进行处理
|
||||||
|
if(id.match(/&([\d]+)(,[hw])?$/)){
|
||||||
|
var num = id.match(/&([\d]+)(,[hw])?$/)[1];
|
||||||
|
var zh = number2zh(num);
|
||||||
|
id = id.replace(/&\d+/g,'');
|
||||||
|
if(_data[id]){
|
||||||
|
var item = '';
|
||||||
|
var gen = getGenById(id);
|
||||||
|
if(gen<3&&!id.match(/[hw],/)){
|
||||||
|
_data[id].forEach(function(name){
|
||||||
|
if(!item&&name.includes('几')){
|
||||||
|
item = name.replace('几',zh);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(!item){
|
||||||
|
item = _data[id][0].match(/^[大小]/)?_data[id][0].replace(/^[大小]/,zh):zh+_data[id][0];
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
item = _data[id][0]
|
||||||
|
}
|
||||||
|
items.push(item);
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
id = id.replace(/&\d+/g,'');
|
||||||
|
}
|
||||||
|
// 直接匹配称呼
|
||||||
|
if(!items.length){
|
||||||
|
items = getData(id);
|
||||||
|
}
|
||||||
|
// 忽略年龄条件查找
|
||||||
|
if(!items.length){
|
||||||
|
id = id.replace(/&[ol]/g,'');
|
||||||
|
items = getData(id);
|
||||||
|
}
|
||||||
|
// 忽略年龄条件查找
|
||||||
|
if(!items.length){
|
||||||
|
id = id.replace(/[ol](b|s)/g,'x$1');
|
||||||
|
items = getData(id);
|
||||||
|
}
|
||||||
|
// 缩小访问查找
|
||||||
|
if(!items.length){
|
||||||
|
var l = id.replace(/x/g,'l');
|
||||||
|
var o = id.replace(/x/g,'o');
|
||||||
|
items = items.concat(getData(o),getData(l));
|
||||||
|
}
|
||||||
|
return items;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 通过ID获取关系链
|
||||||
|
export function getChainById(id,sex){
|
||||||
|
var arr = id.split(',');
|
||||||
|
var item = arr.map(function(sign){
|
||||||
|
var key = sign.replace(/&[ol\d]+/,'');
|
||||||
|
var data = Object.assign({},_data,{
|
||||||
|
'xb':['兄弟'],
|
||||||
|
'xs':['姐妹']
|
||||||
|
});
|
||||||
|
return data[key][0];
|
||||||
|
}).join('的');
|
||||||
|
if(sex&&sex>-1&&_data[sex+','+id]){
|
||||||
|
if(sex==0){
|
||||||
|
item = '(女性)'+item;
|
||||||
|
}else if(sex==1){
|
||||||
|
item = '(男性)'+item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return item
|
||||||
|
};
|
||||||
|
|
||||||
|
// 通过ID获取关系合称
|
||||||
|
export function getPairsById(id1,id2){
|
||||||
|
var result = [];
|
||||||
|
var result_x = [];
|
||||||
|
var result_r = [];
|
||||||
|
id1 = id1.replace(/&\d+/,'');
|
||||||
|
id2 = id2.replace(/&\d+/,'');
|
||||||
|
var id1_x = id1.replace(/([ol])([bs])/,'x$2');
|
||||||
|
var id2_x = id2.replace(/([ol])([bs])/,'x$2');
|
||||||
|
var id1_r = id1.replace(/&[ol]/,'');
|
||||||
|
var id2_r = id2.replace(/&[ol]/,'');
|
||||||
|
for(var key in _pair){
|
||||||
|
var selectors = key.split('#');
|
||||||
|
if(selectors.length>1){
|
||||||
|
var list1 = selector2id(selectors[0]);
|
||||||
|
var list2 = selector2id(selectors[1]);
|
||||||
|
var list1_r = list1.map(function(selector){
|
||||||
|
return selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2');
|
||||||
|
});
|
||||||
|
var list2_r = list2.map(function(selector){
|
||||||
|
return selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2');
|
||||||
|
});
|
||||||
|
if(list1.includes(id1)&&list2.includes(id2)||list1.includes(id2)&&list2.includes(id1)){
|
||||||
|
result.push(_pair[key][0]);
|
||||||
|
}
|
||||||
|
if(list1_r.includes(id1_x)&&list2_r.includes(id2_x)||list1_r.includes(id2_x)&&list2_r.includes(id1_x)){
|
||||||
|
result_x.push(_pair[key][0]);
|
||||||
|
}
|
||||||
|
if(list1_r.includes(id1_r)&&list2_r.includes(id2_r)||list1_r.includes(id2_r)&&list2_r.includes(id1_r)){
|
||||||
|
result_r.push(_pair[key][0]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!result.length){
|
||||||
|
result = result_x;
|
||||||
|
}
|
||||||
|
if(!result.length){
|
||||||
|
result = result_r;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
@ -1,12 +1,14 @@
|
|||||||
// 完整关系链数据 - 合并各类关系链数据
|
/*
|
||||||
|
* 完整关系链数据 - 合并各类关系链数据
|
||||||
|
*/
|
||||||
import _prefix from './data/prefix';
|
import _prefix from './data/prefix';
|
||||||
import _branch from './data/branch';
|
import _branch from './data/branch';
|
||||||
import _main from './data/main';
|
import _main from './data/main';
|
||||||
import _multipie from './data/multiple';
|
import _multipie from './data/multiple';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
selectorFormat
|
expandSelector
|
||||||
} from './method';
|
} from './selector';
|
||||||
|
|
||||||
var _map = Object.assign({},_multipie);
|
var _map = Object.assign({},_multipie);
|
||||||
|
|
||||||
@ -15,7 +17,7 @@ var prefixMap = {};
|
|||||||
for(var key in _prefix){
|
for(var key in _prefix){
|
||||||
prefixMap[key] = {};
|
prefixMap[key] = {};
|
||||||
for(var selector in _prefix[key]){
|
for(var selector in _prefix[key]){
|
||||||
selectorFormat(selector).forEach(function(s){
|
expandSelector(selector).forEach(function(s){
|
||||||
prefixMap[key][s] = _prefix[key][selector];
|
prefixMap[key][s] = _prefix[key][selector];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
26
src/module/mode.js
Normal file
26
src/module/mode.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
/*
|
||||||
|
* 模式数据
|
||||||
|
*/
|
||||||
|
import _map from './map';
|
||||||
|
|
||||||
|
var _cache = {}; // 模式缓存
|
||||||
|
var _data = Object.assign({},_map); // 最终数据
|
||||||
|
|
||||||
|
// 设置模式数据
|
||||||
|
export function setModeData(sign,data){
|
||||||
|
_cache[sign] = Object.assign(_cache[sign]||{},data);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取模式数据
|
||||||
|
export function getModeData(sign){
|
||||||
|
_data = Object.assign({},_map);
|
||||||
|
if(sign&&_cache[sign]){
|
||||||
|
for(var key in _cache[sign]){
|
||||||
|
_data[key] = [].concat(_cache[sign][key],_map[key]||[]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _data;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 获取数据
|
||||||
|
export {_data as modeData};
|
14
src/module/options.js
Normal file
14
src/module/options.js
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* 通过表达式获取配置
|
||||||
|
*/
|
||||||
|
import _expression from './rule/expression';
|
||||||
|
|
||||||
|
export function getOptions(text){
|
||||||
|
for(var item of _expression){
|
||||||
|
var match = text.match(item['exp']);
|
||||||
|
if(match){
|
||||||
|
return item['opt'](match);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
};
|
@ -1,4 +1,6 @@
|
|||||||
// 自然语言表达 - 将语句表达转换成参数调用
|
/*
|
||||||
|
* 自然语言表达 - 将【语言表达】转换成【参数调用】
|
||||||
|
*/
|
||||||
export default [
|
export default [
|
||||||
{
|
{
|
||||||
exp:/^(\S+?)(应该|得)?(称呼|叫|喊)(\S+?)(什么|啥)??$/,
|
exp:/^(\S+?)(应该|得)?(称呼|叫|喊)(\S+?)(什么|啥)??$/,
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
// 关系链缩写规则 - 将关系链转换成最短关系链
|
|
||||||
/*
|
/*
|
||||||
|
* 关系链缩写规则 - 将【关系链】缩减成最简表达
|
||||||
|
*
|
||||||
* 关系数据语法说明:
|
* 关系数据语法说明:
|
||||||
* 【关系符】 f:父; m:母; h:夫; w:妻; s:子; d:女; xb:兄弟; ob:兄; lb:弟; xs:姐妹; os:姐; ls:妹
|
* 【关系符】 f:父; m:母; h:夫; w:妻; s:子; d:女; xb:兄弟; ob:兄; lb:弟; xs:姐妹; os:姐; ls:妹
|
||||||
* 【修饰符】 1:男性; 0:女性; &o:年长; &l:年幼; &\d+:排序 #:隔断; [a|b]:并列
|
* 【修饰符】 1:男性; 0:女性; &o:年长; &l:年幼; &\d+:排序 #:隔断; [a|b]:并列
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// 词义扩展 - 对称呼词义进行扩展
|
/*
|
||||||
|
* 词义扩展 - 对称呼词义进行扩展
|
||||||
|
*/
|
||||||
export default [
|
export default [
|
||||||
{
|
{
|
||||||
exp:/^从表/,
|
exp:/^从表/,
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
// 同义词替换 - 对称呼中的近义词进行替换
|
/*
|
||||||
|
* 同义词替换 - 对称呼中的近义词进行替换
|
||||||
|
*/
|
||||||
export default {
|
export default {
|
||||||
'晜':'兄',
|
'晜':'兄',
|
||||||
'哥':'兄',
|
'哥':'兄',
|
||||||
|
@ -1,54 +1,13 @@
|
|||||||
// 通用方法
|
/*
|
||||||
|
* 选择器 - 非唯一性关系链,将【中文表述】转换为【关系链】
|
||||||
|
*/
|
||||||
import _filter from './rule/filter';
|
import _filter from './rule/filter';
|
||||||
import _expression from './rule/expression';
|
|
||||||
import _replace from './rule/replace';
|
import _replace from './rule/replace';
|
||||||
import _similar from './rule/similar';
|
import _similar from './rule/similar';
|
||||||
import _map from './map';
|
|
||||||
import _pair from './data/pair';
|
|
||||||
|
|
||||||
var _mode = {}; // 模式数据
|
import {zh2number} from './unit';
|
||||||
var _data = Object.assign({},_map); // 最终数据
|
import {reverseId,getGenById} from './id';
|
||||||
|
import {modeData as _data} from './mode';
|
||||||
// 中文数字转阿拉伯数字
|
|
||||||
var zh2number = function(text){
|
|
||||||
var num = 0;
|
|
||||||
var map = {'大':1,'小':99};
|
|
||||||
var textAttr = ['','一','二','三','四','五','六','七','八','九','十'];
|
|
||||||
if(map[text]){
|
|
||||||
num = map[text];
|
|
||||||
}else{
|
|
||||||
var [unit,dec=0] = text.replace(/^十/,'一十').split('十').map(word=> textAttr.indexOf(word)).reverse();
|
|
||||||
num = dec*10+unit;
|
|
||||||
}
|
|
||||||
return num;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 阿拉伯数字转中文数字
|
|
||||||
var number2zh = function(num){
|
|
||||||
var text = '';
|
|
||||||
var map = {1:'大',99:'小'};
|
|
||||||
var textAttr = ['','一','二','三','四','五','六','七','八','九','十'];
|
|
||||||
if(map[num]){
|
|
||||||
text = map[num];
|
|
||||||
}else{
|
|
||||||
var dec = ~~(num/10);
|
|
||||||
var unit = num%10;
|
|
||||||
text = (dec?(textAttr[dec]+'十').replace('一十','十'):'')+textAttr[unit];
|
|
||||||
}
|
|
||||||
return text;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 获得代数
|
|
||||||
var getGen = function(id){
|
|
||||||
var gMap = {'f':1,'m':1,'s':-1,'d':-1};
|
|
||||||
var arr = id.split(',');
|
|
||||||
var gen = 0;
|
|
||||||
arr.forEach(function(sub){
|
|
||||||
var s = sub.replace(/&[ol\d]+/,'');
|
|
||||||
gen += gMap[s]||0;
|
|
||||||
});
|
|
||||||
return gen;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 获得最简
|
// 获得最简
|
||||||
var getOptimal = function(options){
|
var getOptimal = function(options){
|
||||||
@ -62,7 +21,7 @@ var getOptimal = function(options){
|
|||||||
sex = from_chain[i].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;
|
sex = from_chain[i].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;
|
||||||
continue;
|
continue;
|
||||||
}else{
|
}else{
|
||||||
if(getGen(from_chain[i])==getGen(to_chain[i])&&from_chain[i].match(/^[xol][bs]|^[sd]/)){
|
if(getGenById(from_chain[i])==getGenById(to_chain[i])&&from_chain[i].match(/^[xol][bs]|^[sd]/)){
|
||||||
var from_match = from_chain[i].match(/&([ol\d]+)/);
|
var from_match = from_chain[i].match(/&([ol\d]+)/);
|
||||||
var to_match = to_chain[i].match(/&([ol\d]+)/);
|
var to_match = to_chain[i].match(/&([ol\d]+)/);
|
||||||
if(!from_match){
|
if(!from_match){
|
||||||
@ -111,8 +70,8 @@ var getOptimal = function(options){
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
// 数组去重
|
// 去重
|
||||||
export function unique(arr){
|
var unique = function(arr){
|
||||||
var sameList = arr.filter(item=>item==item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''));
|
var sameList = arr.filter(item=>item==item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''));
|
||||||
return arr.filter(item=>{
|
return arr.filter(item=>{
|
||||||
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,'');
|
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,'');
|
||||||
@ -290,8 +249,8 @@ export function mergeSelector(param){
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 选择器扩展
|
// 扩展选择器
|
||||||
export function selectorFormat(selector){
|
export function expandSelector(selector){
|
||||||
var result = [];
|
var result = [];
|
||||||
var hash = {};
|
var hash = {};
|
||||||
var getSelector = function(selector){
|
var getSelector = function(selector){
|
||||||
@ -336,226 +295,14 @@ export function selector2id(selector,sex){
|
|||||||
}else if(sex==0&&selector.match(/^,[w1]/)){
|
}else if(sex==0&&selector.match(/^,[w1]/)){
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
// console.log('[selector]',selector);
|
|
||||||
if(!selector.match(/^,/)){
|
|
||||||
selector = ','+selector;
|
|
||||||
}
|
|
||||||
if(sex>-1&&!selector.includes(',1')&&!selector.includes(',0')){
|
if(sex>-1&&!selector.includes(',1')&&!selector.includes(',0')){
|
||||||
selector = ','+sex+selector;
|
selector = ','+sex+selector;
|
||||||
}
|
}
|
||||||
if(selector.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/)){ //同志关系去除
|
if(selector.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/)){ //同志关系去除
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
var result = selectorFormat(selector).map(function(selector){
|
var result = expandSelector(selector).map(function(selector){
|
||||||
return selector.replace(/,[01]/,'').substr(1); //去前面逗号和性别信息
|
return selector.replace(/,[01]/,'').substr(1); //去前面逗号和性别信息
|
||||||
});
|
});
|
||||||
return unique(result);
|
return unique(result);
|
||||||
};
|
};
|
||||||
|
|
||||||
// 逆转ID
|
|
||||||
export function reverseId(id,sex){
|
|
||||||
var hash = {
|
|
||||||
f:['d','s'],
|
|
||||||
m:['d','s'],
|
|
||||||
h:['w',''],
|
|
||||||
w:['','h'],
|
|
||||||
s:['m','f'],
|
|
||||||
d:['m','f'],
|
|
||||||
lb:['os','ob'],
|
|
||||||
ob:['ls','lb'],
|
|
||||||
xb:['xs','xb'],
|
|
||||||
ls:['os','ob'],
|
|
||||||
os:['ls','lb'],
|
|
||||||
xs:['xs','xb']
|
|
||||||
};
|
|
||||||
var age = '';
|
|
||||||
if(id.match(/&o$/)){
|
|
||||||
age = '&l';
|
|
||||||
}else if(id.match(/&l$/)){
|
|
||||||
age = '&o';
|
|
||||||
}
|
|
||||||
if(id){
|
|
||||||
id = id.replace(/&[ol\d+]/g,'');
|
|
||||||
//性别判断
|
|
||||||
if(sex<0){
|
|
||||||
if(id.match(/^w/)){
|
|
||||||
sex = 1;
|
|
||||||
}else if(id.match(/^h/)){
|
|
||||||
sex = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var result = [];
|
|
||||||
var doing = function(sex){
|
|
||||||
var sid = (','+sex+','+id).replace(/,[fhs]|,[olx]b/g,',1').replace(/,[mwd]|,[olx]s/g,',0');
|
|
||||||
sid = sid.substring(0,sid.length-2);
|
|
||||||
var id_arr = id.split(',').reverse();
|
|
||||||
var sid_arr = sid.split(',').reverse();
|
|
||||||
var arr = id_arr.map((id,i)=>hash[id][sid_arr[i]]);
|
|
||||||
var r_id = arr.join(',');
|
|
||||||
var gen = getGen(r_id);
|
|
||||||
return r_id +(gen?'':age);
|
|
||||||
};
|
|
||||||
if(sex<0){
|
|
||||||
result.push(doing(1));
|
|
||||||
result.push(doing(0));
|
|
||||||
}else{
|
|
||||||
result.push(doing(sex));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
return [''];
|
|
||||||
};
|
|
||||||
|
|
||||||
// 通过ID获取关系称呼
|
|
||||||
export function getItemsById(id){
|
|
||||||
var items = [];
|
|
||||||
var getData = function(key){
|
|
||||||
var res = [];
|
|
||||||
if(_data[key]){
|
|
||||||
res.push(_data[key][0]);
|
|
||||||
}else{
|
|
||||||
for(var i in _data){
|
|
||||||
if(i.replace(/&[ol]/g,'')==key){
|
|
||||||
res.push(_data[i][0]);
|
|
||||||
}else{
|
|
||||||
while (key.match(/[ol](b|s)/)){
|
|
||||||
key = key.replace(/[ol](b|s)/,'x$1');
|
|
||||||
if(key==i){
|
|
||||||
res.push(_data[i][0]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
};
|
|
||||||
// 对排序进行处理
|
|
||||||
if(id.match(/&([\d]+)(,[hw])?$/)){
|
|
||||||
var num = id.match(/&([\d]+)(,[hw])?$/)[1];
|
|
||||||
var zh = number2zh(num);
|
|
||||||
id = id.replace(/&\d+/g,'');
|
|
||||||
if(_data[id]){
|
|
||||||
var item = '';
|
|
||||||
var gen = getGen(id);
|
|
||||||
if(gen<3&&!id.match(/[hw],/)){
|
|
||||||
_data[id].forEach(function(name){
|
|
||||||
if(!item&&name.includes('几')){
|
|
||||||
item = name.replace('几',zh);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
if(!item){
|
|
||||||
item = _data[id][0].match(/^[大小]/)?_data[id][0].replace(/^[大小]/,zh):zh+_data[id][0];
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
item = _data[id][0]
|
|
||||||
}
|
|
||||||
items.push(item);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
id = id.replace(/&\d+/g,'');
|
|
||||||
}
|
|
||||||
// 直接匹配称呼
|
|
||||||
if(!items.length){
|
|
||||||
items = getData(id);
|
|
||||||
}
|
|
||||||
// 忽略年龄条件查找
|
|
||||||
if(!items.length){
|
|
||||||
id = id.replace(/&[ol]/g,'');
|
|
||||||
items = getData(id);
|
|
||||||
}
|
|
||||||
// 忽略年龄条件查找
|
|
||||||
if(!items.length){
|
|
||||||
id = id.replace(/[ol](b|s)/g,'x$1');
|
|
||||||
items = getData(id);
|
|
||||||
}
|
|
||||||
// 缩小访问查找
|
|
||||||
if(!items.length){
|
|
||||||
var l = id.replace(/x/g,'l');
|
|
||||||
var o = id.replace(/x/g,'o');
|
|
||||||
items = items.concat(getData(o),getData(l));
|
|
||||||
}
|
|
||||||
return items;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 通过ID获取关系链
|
|
||||||
export function getChainById(id){
|
|
||||||
var arr = id.split(',');
|
|
||||||
return arr.map(function(sign){
|
|
||||||
var key = sign.replace(/&[ol\d]+/,'');
|
|
||||||
var data = Object.assign({},_data,{
|
|
||||||
'xb':['兄弟'],
|
|
||||||
'xs':['姐妹']
|
|
||||||
});
|
|
||||||
return data[key][0];
|
|
||||||
}).join('的');
|
|
||||||
};
|
|
||||||
|
|
||||||
// 通过ID获取关系合称
|
|
||||||
export function getPairsByIds(id1,id2){
|
|
||||||
var result = [];
|
|
||||||
var result_x = [];
|
|
||||||
var result_r = [];
|
|
||||||
id1 = id1.replace(/&\d+/,'');
|
|
||||||
id2 = id2.replace(/&\d+/,'');
|
|
||||||
var id1_x = id1.replace(/([ol])([bs])/,'x$2');
|
|
||||||
var id2_x = id2.replace(/([ol])([bs])/,'x$2');
|
|
||||||
var id1_r = id1.replace(/&[ol]/,'');
|
|
||||||
var id2_r = id2.replace(/&[ol]/,'');
|
|
||||||
for(var key in _pair){
|
|
||||||
var selectors = key.split('#');
|
|
||||||
if(selectors.length>1){
|
|
||||||
var list1 = selector2id(selectors[0]);
|
|
||||||
var list2 = selector2id(selectors[1]);
|
|
||||||
var list1_r = list1.map(function(selector){
|
|
||||||
return selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2');
|
|
||||||
});
|
|
||||||
var list2_r = list2.map(function(selector){
|
|
||||||
return selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2');
|
|
||||||
});
|
|
||||||
if(list1.includes(id1)&&list2.includes(id2)||list1.includes(id2)&&list2.includes(id1)){
|
|
||||||
result.push(_pair[key][0]);
|
|
||||||
}
|
|
||||||
if(list1_r.includes(id1_x)&&list2_r.includes(id2_x)||list1_r.includes(id2_x)&&list2_r.includes(id1_x)){
|
|
||||||
result_x.push(_pair[key][0]);
|
|
||||||
}
|
|
||||||
if(list1_r.includes(id1_r)&&list2_r.includes(id2_r)||list1_r.includes(id2_r)&&list2_r.includes(id1_r)){
|
|
||||||
result_r.push(_pair[key][0]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(!result.length){
|
|
||||||
result = result_x;
|
|
||||||
}
|
|
||||||
if(!result.length){
|
|
||||||
result = result_r;
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 设置模式数据
|
|
||||||
export function setMode(sign,data){
|
|
||||||
_mode[sign] = Object.assign(_mode[sign]||{},data);
|
|
||||||
};
|
|
||||||
|
|
||||||
// 获取模式数据
|
|
||||||
export function getDataByMode(sign){
|
|
||||||
_data = Object.assign({},_map);
|
|
||||||
if(sign&&_mode[sign]){
|
|
||||||
for(var key in _mode[sign]){
|
|
||||||
_data[key] = [].concat(_mode[sign][key],_map[key]||[]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _data;
|
|
||||||
};
|
|
||||||
|
|
||||||
// 获取配置
|
|
||||||
export function getOptions(text){
|
|
||||||
for(var item of _expression){
|
|
||||||
var match = text.match(item['exp']);
|
|
||||||
if(match){
|
|
||||||
return item['opt'](match);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {};
|
|
||||||
};
|
|
32
src/module/unit.js
Normal file
32
src/module/unit.js
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* 数值转换
|
||||||
|
*/
|
||||||
|
|
||||||
|
// 中文数字转阿拉伯数字
|
||||||
|
export function zh2number(text){
|
||||||
|
var num = 0;
|
||||||
|
var map = {'大':1,'小':99};
|
||||||
|
var textAttr = ['','一','二','三','四','五','六','七','八','九','十'];
|
||||||
|
if(map[text]){
|
||||||
|
num = map[text];
|
||||||
|
}else{
|
||||||
|
var [unit,dec=0] = text.replace(/^十/,'一十').split('十').map(word=> textAttr.indexOf(word)).reverse();
|
||||||
|
num = dec*10+unit;
|
||||||
|
}
|
||||||
|
return num;
|
||||||
|
};
|
||||||
|
|
||||||
|
// 阿拉伯数字转中文数字
|
||||||
|
export function number2zh(num){
|
||||||
|
var text = '';
|
||||||
|
var map = {1:'大',99:'小'};
|
||||||
|
var textAttr = ['','一','二','三','四','五','六','七','八','九','十'];
|
||||||
|
if(map[num]){
|
||||||
|
text = map[num];
|
||||||
|
}else{
|
||||||
|
var dec = ~~(num/10);
|
||||||
|
var unit = num%10;
|
||||||
|
text = (dec?(textAttr[dec]+'十').replace('一十','十'):'')+textAttr[unit];
|
||||||
|
}
|
||||||
|
return text;
|
||||||
|
};
|
@ -1,17 +1,7 @@
|
|||||||
import {
|
import {getOptions} from './module/options';
|
||||||
unique,
|
import {getSelectors,mergeSelector,selector2id} from './module/selector';
|
||||||
getOptions,
|
import {reverseId,getItemsById,getChainById,getPairsById} from './module/id';
|
||||||
getSelectors,
|
import {setModeData,getModeData,modeData as _data} from './module/mode';
|
||||||
mergeSelector,
|
|
||||||
selector2id,
|
|
||||||
reverseId,
|
|
||||||
getItemsById,
|
|
||||||
getChainById,
|
|
||||||
getPairsByIds,
|
|
||||||
setMode,
|
|
||||||
getDataByMode
|
|
||||||
} from './module/method';
|
|
||||||
var _data = getDataByMode(); // 最终数据
|
|
||||||
|
|
||||||
// 对外方法
|
// 对外方法
|
||||||
var relationship = function (parameter){
|
var relationship = function (parameter){
|
||||||
@ -27,7 +17,7 @@ var relationship = function (parameter){
|
|||||||
mode:'default', // 模式选择:使用setMode方法定制不同地区模式,在此选择自定义模式
|
mode:'default', // 模式选择:使用setMode方法定制不同地区模式,在此选择自定义模式
|
||||||
optimal:false // 最短关系:计算两者之间的最短关系
|
optimal:false // 最短关系:计算两者之间的最短关系
|
||||||
},parameter);
|
},parameter);
|
||||||
_data = getDataByMode(options.mode);
|
_data = getModeData(options.mode);
|
||||||
var from_selectors = getSelectors(options.text);
|
var from_selectors = getSelectors(options.text);
|
||||||
var to_selectors = getSelectors(options.target);
|
var to_selectors = getSelectors(options.target);
|
||||||
if(!to_selectors.length){
|
if(!to_selectors.length){
|
||||||
@ -44,61 +34,53 @@ var relationship = function (parameter){
|
|||||||
optimal:options.optimal
|
optimal:options.optimal
|
||||||
}).forEach(function(data){
|
}).forEach(function(data){
|
||||||
// console.log('[data]',from_selector,to_selector,data);
|
// console.log('[data]',from_selector,to_selector,data);
|
||||||
var ids = data?selector2id(data['selector'],data['sex']):null;
|
var ids = data?selector2id(data['selector'],data['sex']):[];
|
||||||
// console.log('[ids]',data['selector'],data['sex'],ids);
|
// console.log('[ids]',data['selector'],data['sex'],ids);
|
||||||
if(ids){
|
ids.forEach(function(id){
|
||||||
ids.forEach(function(id){
|
var temps = [id];
|
||||||
var temps = [id];
|
var sex = data['sex'];
|
||||||
var sex = data['sex'];
|
if(options.reverse){
|
||||||
if(options.reverse){
|
temps = reverseId(id,sex);
|
||||||
temps = reverseId(id,sex);
|
if(id.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)){
|
||||||
if(id.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)){
|
sex = 1;
|
||||||
sex = 1;
|
|
||||||
}else{
|
|
||||||
sex = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(options.type=='chain'){
|
|
||||||
temps.forEach(function(id){
|
|
||||||
var item = getChainById(id);
|
|
||||||
if(data['sex']>-1&&_data[data['sex']+','+id]){
|
|
||||||
if(data['sex']==0){
|
|
||||||
item = '(女性)'+item;
|
|
||||||
}else if(data['sex']==1){
|
|
||||||
item = '(男性)'+item;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(item){
|
|
||||||
result.push(item);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}else if(options.type=='pair'){
|
|
||||||
temps = reverseId(id,data['sex']);
|
|
||||||
temps.forEach(function(r_id){
|
|
||||||
var pairs = getPairsByIds(id,r_id);
|
|
||||||
result = result.concat(pairs);
|
|
||||||
});
|
|
||||||
}else{
|
}else{
|
||||||
temps.forEach(function(id){
|
sex = 0;
|
||||||
var items = getItemsById(id);
|
|
||||||
if(!items.length){
|
|
||||||
items = getItemsById(sex+','+id);
|
|
||||||
}
|
|
||||||
result = result.concat(items);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
}
|
if(options.type=='chain'){
|
||||||
|
temps.forEach(function(id){
|
||||||
|
var item = getChainById(id,data['sex']);
|
||||||
|
if(item){
|
||||||
|
result.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}else if(options.type=='pair'){
|
||||||
|
temps = reverseId(id,data['sex']);
|
||||||
|
temps.forEach(function(r_id){
|
||||||
|
var pairs = getPairsById(id,r_id);
|
||||||
|
result = result.concat(pairs);
|
||||||
|
});
|
||||||
|
}else{
|
||||||
|
temps.forEach(function(id){
|
||||||
|
var items = getItemsById(id);
|
||||||
|
if(!items.length){
|
||||||
|
items = getItemsById(sex+','+id);
|
||||||
|
}
|
||||||
|
result = result.concat(items);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
return unique(result);
|
return [...new Set(result)];
|
||||||
};
|
};
|
||||||
|
|
||||||
// 获取数据表
|
// 获取数据表
|
||||||
relationship.data = _data;
|
relationship.data = _data;
|
||||||
// 获取数据量
|
// 获取数据量
|
||||||
relationship.dataCount = Object.keys(_data).length;
|
relationship.dataCount = Object.keys(_data).length;
|
||||||
// 设置语言模式
|
// 设置语言模式
|
||||||
relationship.setMode = setMode;
|
relationship.setMode = setModeData;
|
||||||
|
|
||||||
export default relationship;
|
export default relationship;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user