updated 添加target参数,更新Demo

This commit is contained in:
PASSER-BY 2021-11-16 07:36:33 +08:00
parent a5c960f1d4
commit b765cc30bb
7 changed files with 563 additions and 327 deletions

153
dist/relationship.js vendored
View File

@ -610,7 +610,7 @@
'f,m,m,xs,d,d':['再从母姑母'],
'f,m,m,xs,d,d,h':['再从母姑父'],
// 舅表*
'f,m,xb':['舅公','舅祖父','舅老爷','舅爷爷','舅爷','舅祖','舅奶爷','太舅父','x舅公'],
'f,m,xb':['舅公','舅祖父','舅老爷','舅爷爷','舅爷','舅祖','舅奶爷','太舅父','x舅老爷','x舅公'],
'f,m,xb,w':['舅婆','舅祖母','舅奶奶','舅奶','妗婆','太舅母'],
// 舅表叔表
'f,m,xb,s&o':['舅表伯父','表伯父','表伯'],
@ -1438,6 +1438,8 @@
'ob':['哥哥','哥','兄','阿哥','大佬','老哥','兄长','胞哥','大哥','x哥'],
'ob,w':['嫂子','嫂','嫂嫂','阿嫂','兄嫂','大嫂','x嫂'],
'ob,w,f':['兄姻父','兄眷父','姻父'],
'ob,w,f,f':['兄姻公'],
'ob,w,f,m':['兄姻婆'],
'ob,w,m':['兄姻母','兄眷母','姻母'],
'ob,w,ob':['兄姻兄','兄眷兄','姻兄'],
'ob,w,ob,w':['兄姻兄妇','兄眷兄妇'],
@ -1453,8 +1455,10 @@
'ob,w,xs,d':['兄姻甥女','兄眷甥女'],
'lb':['弟弟','弟','细佬','胞弟','老弟','x弟'],
'lb,w':['弟妹','弟媳','弟媳妇','弟妇','x弟妹'],
'lb,w,f':['弟姻父','姻父'],
'lb,w,m':['弟姻母','姻母'],
'lb,w,f':['弟姻父','弟眷母','姻父'],
'lb,w,f,f':['弟姻公'],
'lb,w,f,m':['弟姻婆'],
'lb,w,m':['弟姻母','弟眷母','姻母'],
'lb,w,ob':['弟姻兄','弟眷兄','姻兄'],
'lb,w,ob,w':['弟姻兄妇','弟眷兄妇'],
'lb,w,lb':['弟姻弟','弟眷弟','姻弟'],
@ -1468,10 +1472,10 @@
'lb,w,xs,s':['弟姻甥男','弟眷甥男'],
'lb,w,xs,d':['弟姻甥女','弟眷甥女'],
'xb':['兄弟'],
'xb,w,f':['姻伯父','姻世伯'],
'xb,w,f,f':['姻伯公'],
'xb,w,f,m':['姻伯婆'],
'xb,w,m':['姻伯母'],
'xb,w,f,ob':['姻伯父'],
'xb,w,f,ob,w':['姻伯母'],
'xb,w,f,lb':['姻叔父'],
'xb,w,f,lb,w':['姻叔母'],
'0,xb,w,xb,s':['舅眷舅男'],
'1,xb,w,xb,s':['叔眷舅男'],
'0,xb,w,xb,d':['舅眷舅女'],
@ -1558,10 +1562,10 @@
'ls,h,xs,s':['妹姻侄男'],
'ls,h,xs,d':['妹姻侄女'],
'xs':['姐妹','姊妹'],
'xs,h,f':['姻伯父','姻世伯'],
'xs,h,f,f':['姻伯公'],
'xs,h,f,m':['姻伯婆'],
'xs,h,m':['姻伯母'],
'xs,h,f,ob':['姻伯父'],
'xs,h,f,ob,w':['姻伯母'],
'xs,h,f,lb':['姻叔父'],
'xs,h,f,lb,w':['姻叔母'],
'0,xs,h,xb,s':['姨姻叔男'],
'1,xs,h,xb,s':['姑姻叔男'],
'0,xs,h,xb,d':['姨姻叔女'],
@ -1767,17 +1771,26 @@
'd,h,xs,d':['女息姻外孙女','息姻外孙女'],
};
//数组去重
// 数组去重
var unique = function(arr) {
var result = [], hash = {};
var item;
for (var i = 0; (item = arr[i]) != null; i++) {
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''); //对特殊语法标识相互包含的行为去重
if (!hash[item]&&!hash[temp]){
result.push(item);
if (temp==item&&!hash[temp]){
hash[item] = true;
}
}
for (var i = 0; (item = arr[i]) != null; i++) {
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''); //对特殊语法标识相互包含的行为去重
if (temp!=item){
if(!hash[temp]){
result.push(item);
}
}else{
result.push(item);
}
}
return result;
};
@ -1820,7 +1833,7 @@
return match?result:[];
}
// 简化选择器
// 选择器转ID
function selector2id(selector,sex){
var result = [];
var hash = {};
@ -1872,7 +1885,7 @@
return unique(result);
}
//获取数据
// 通过ID获取数据
function getDataById(id){
var items = [];
var getData = function(d){
@ -1918,7 +1931,7 @@
return items;
}
//逆转ID
// 逆转ID
function reverseId(id,sex){
var hash = {
f:['d','s'],
@ -1956,7 +1969,7 @@
return '';
}
//获取关系链条
// 通过ID获取关系链条
function getChainById(id){
var arr = id.split(',');
var items = [];
@ -1967,45 +1980,93 @@
return items.join('的');
}
// 合并选择器,查找两个对象之间的关系
function mergeSelector(from,to){
var Index = 0;
var from_arr = from.split(',');
var to_arr = to.split(',');
for(var i=0;i<from_arr.length&&i<to_arr.length;i++){
if(from_arr[i]!=to_arr[i]){
break;
}
}
var mid_sex = 0;
if(to_arr[i-1].match(/([fhs1](&[ol])?|[olx]b)$/)){
mid_sex=1;
}
var sex = -1;
if(to){
if(to.match(/,([fhs1](&[ol])?|[olx]b)$/)){
sex=1;
}else{
sex=0;
}
}
if(i){
var from_sub = from_arr.slice(i).join(',');
var to_sub = to_arr.slice(i).join(',');
return {
'selector':(to_sub?','+reverseId(to_sub,mid_sex):'')+(from_sub?','+from_sub:''),
'sex':sex
};
}else{
return {
'selector':from,
'sex':sex
};
}
}
return (function (parameter){
var options = Object.assign({
text:'',
target:'',
sex:-1,
type:'default', //为'chain'时,reverse无效
reverse:false
},parameter);
var selectors = getSelectors(options.text);
// console.log('[selectors]',selectors);
var sex = options.sex;
var from_selectors = getSelectors(options.text);
var to_selectors = options.target?getSelectors(options.target):[''];
// console.log('[selectors]',from_selectors,to_selectors);
var result = []; //匹配结果
for(var i = 0;i<selectors.length;i++){ //遍历所有可能性
var ids = selector2id(selectors[i],options.sex);
// console.log('[ids]',ids);
for(var j=0;j<ids.length;j++){
var id = ids[j];
if(options.type=='chain'){
var item = getChainById(id);
if(item){
result.push(item);
}
}else{
if(options.reverse){
id = reverseId(id,options.sex);
}
var items = getDataById(options.sex+','+id);
if(!items.length){
items = getDataById(id);
}
if(!items.length){
if(id.indexOf('w')==0||id.indexOf('h')==0){ //找不到关系,随爱人叫
items = getDataById(id.substr(2));
from_selectors.forEach(function(from){
to_selectors.forEach(function(to){
var data = mergeSelector(from,to);
// console.log('#data#',data);
sex = data['sex']>-1?data['sex']:options.sex;
var ids = selector2id(data['selector'],sex);
// console.log('[ids]',ids);
for(var j=0;j<ids.length;j++){
var id = ids[j];
if(options.type=='chain'){
if(options.reverse){
id = reverseId(id,sex);
}
var item = getChainById(id);
if(item){
result.push(item);
}
}else{
if(options.reverse){
id = reverseId(id,sex);
}
var items = getDataById(sex+','+id);
if(!items.length){
items = getDataById(id);
}
if(!items.length){
if(id.indexOf('w')==0||id.indexOf('h')==0){ //找不到关系,随爱人叫
items = getDataById(id.substr(2));
}
}
if(items.length){
result = result.concat(items);
}
}
if(items.length){
result = result.concat(items);
}
}
}
}
});
});
return unique(result);
});
});

File diff suppressed because one or more lines are too long

View File

@ -17,7 +17,7 @@
<script type="text/javascript">
setTimeout(function(){
if(location.hostname.indexOf('passer-by.com')<0){
location.href = 'http://passer-by.com/';
//location.href = 'http://passer-by.com/';
}else if( window.top != window.self ) {
window.top.location = self.location.href;
}
@ -45,78 +45,132 @@
<p>当前已收录约<b>1450</b>条亲戚关系</p>
</div>
<div class="bd">
<div class="row">
<div class="field">
计算类型:
<label for="default">
<input id="default" type="radio" name="type" value="default" checked>
<span>找称呼</span>
</label>
<label for="chain">
<input id="chain" type="radio" name="type" value="chain">
<span>找关系</span>
</label>
<div class="c-hd">
<ul>
<li class="active"><a href="javascript:;" rel="nofollow">通过关系找称呼</a></li>
<li><a href="javascript:;" rel="nofollow">通过称呼找关系</a></li>
<li><a href="javascript:;" rel="nofollow">任意两者间称呼</a></li>
</ul>
</div>
<div class="c-bd">
<div class="c-panel" style="display:block;">
<div class="row">
<div class="field">
我的性别:
<label for="field-1-1">
<input id="field-1-1" type="radio" name="sex" value="1" checked>
<span></span>
</label>
<label for="field-1-2">
<input id="field-1-2" type="radio" name="sex" value="0">
<span></span>
</label>
</div>
<div class="field">
称呼方式:
<label for="field-2-1">
<input id="field-2-1" type="radio" name="reverse" value="0" checked>
<span>我称呼对方</span>
</label>
<label for="field-2-2">
<input id="field-2-2" type="radio" name="reverse" value="1">
<span>对方称呼我</span>
</label>
</div>
</div>
<div class="row">
<textarea name="input" placeholder="称呼之间用'的'字分开…"></textarea>
</div>
<div class="operation">
<div class="row">
<p>快速选择:</p>
<p>
<span>
<button class="btn btn-small" data-value="爸爸"></button>
<button class="btn btn-small" data-value="妈妈"></button>
</span>
<span>
<button class="btn btn-small" data-value="老公"></button>
<button class="btn btn-small" data-value="老婆"></button>
</span>
<span>
<button class="btn btn-small" data-value="哥哥"></button>
<button class="btn btn-small" data-value="弟弟"></button>
</span>
<span>
<button class="btn btn-small" data-value="姐姐"></button>
<button class="btn btn-small" data-value="妹妹"></button>
</span>
<span>
<button class="btn btn-small" data-value="儿子"></button>
<button class="btn btn-small" data-value="女儿"></button>
</span>
</p>
</div>
<div class="row">
<button class="btn btn-orange">回退</button>
<button class="btn btn-red">清空</button>
<button class="btn btn-green">计算</button>
</div>
</div>
<div class="row">
<p>计算结果:</p>
<p><textarea name="result" readonly></textarea></p>
</div>
</div>
<div class="c-panel">
<div class="row">
<div class="field">
输入称呼:
<input class="input-text" type="text" name="input" placeholder="输入要查询的称呼"/>
</div>
</div>
<div class="operation">
<div class="row">
<button class="btn btn-red">清空</button>
<button class="btn btn-green">计算</button>
</div>
</div>
<div class="row">
<p>计算结果:</p>
<p><textarea name="result" readonly></textarea></p>
</div>
</div>
<div class="c-panel">
<div class="row">
<div class="field">
<input class="input-text" type="text" name="person" placeholder="输入称呼"/>
</div>
<div class="field">
称呼方式:
<label for="field-3-1">
<input id="field-3-1" type="radio" name="reverse2" value="1" checked>
<span>前者称呼后者</span>
</label>
<label for="field-3-2">
<input id="field-3-2" type="radio" name="reverse2" value="0">
<span>后者称呼前者</span>
</label>
</div>
<div class="field">
<input class="input-text" type="text" name="target" placeholder="输入称呼"/>
</div>
</div>
<div class="operation">
<div class="row">
<button class="btn btn-red">清空</button>
<button class="btn btn-green">计算</button>
</div>
</div>
<div class="row">
<p>计算结果:</p>
<p><textarea name="result" readonly></textarea></p>
</div>
</div>
</div>
<div class="row group">
<div class="field">
我的性别:
<label for="male">
<input id="male" type="radio" name="sex" value="1" checked>
<span></span>
</label>
<label for="female">
<input id="female" type="radio" name="sex" value="0">
<span></span>
</label>
</div>
<div class="field">
称呼方式:
<label for="call">
<input id="call" type="radio" name="reverse" value="0" checked>
<span>我称呼对方</span>
</label>
<label for="called">
<input id="called" type="radio" name="reverse" value="1">
<span>对方称呼我</span>
</label>
</div>
<div class="c-ft">
</div>
<div class="row">
<textarea id="input" placeholder="称谓间用'的'字分开…"></textarea>
</div>
<p>
<label>快速选择:</label><br/>
<span>
<button class="btn" data-value="爸爸"></button>
<button class="btn" data-value="妈妈"></button>
</span>
<span>
<button class="btn" data-value="老公"></button>
<button class="btn" data-value="老婆"></button>
</span>
<span>
<button class="btn" data-value="哥哥"></button>
<button class="btn" data-value="弟弟"></button>
</span>
<span>
<button class="btn" data-value="姐姐"></button>
<button class="btn" data-value="妹妹"></button>
</span>
<span>
<button class="btn" data-value="儿子"></button>
<button class="btn" data-value="女儿"></button>
</span>
</p>
<p>
<button class="input-button">回退</button>
<button class="input-button">清空</button>
<button class="input-button">计算</button>
</p>
<p>计算结果:</p>
<p>
<textarea id="reslut" readonly></textarea>
</p>
</div>
<div class="ft">
<div class="intro">
@ -151,85 +205,163 @@
<script src="script/common.js"></script>
<script src="script/relationship.js"></script>
<script>
// tabs
(function(){
var $module = DOMUtil.getElementsByClassName('mod-panel')[0];
var $type = document.getElementsByName('type');
var $sex = document.getElementsByName('sex');
var $reverse = document.getElementsByName('reverse');
var $radio = document.getElementsByTagName('INPUT');
var $textarea = document.getElementsByTagName('TEXTAREA');
var $group = DOMUtil.getElementsByClassName('group',$module)[0];
var $btns = DOMUtil.getElementsByClassName('btn',$module);
var $buttons = DOMUtil.getElementsByClassName('input-button',$module);
var toggle = function(sex){
var $module = document.querySelector('.mod-panel');
var $items = $module.querySelectorAll('li');
var $panels = $module.querySelectorAll('.c-panel');
for(var i=0;i<$items.length;i++){
(function(i){
$items[i].addEventListener('click',function(){
for(var j=0;j<$panels.length;j++){
$items[j].className = i==j?'active':'';
$panels[j].style.display = i==j?'block':'none';
}
});
})(i);
}
})();
// 通过关系找称呼
(function(){
var $module = document.querySelector('.mod-panel');
var $panel = $module.querySelector('.c-panel:nth-child(1)');
var $radio = $panel.querySelectorAll('input[type="radio"]');
var $sex = $panel.querySelectorAll('input[name="sex"]');
var $reverse = $panel.querySelectorAll('input[name="reverse"]');
var $small_btns = $panel.querySelectorAll('.btn-small');
var $input = $panel.querySelector('textarea[name="input"]');
var $result = $panel.querySelector('textarea[name="result"]');
var toggleSex = function(sex){
if(sex){ //男女判断
$btns[2].disabled=true;
$btns[3].disabled=false;
$small_btns[2].disabled=true;
$small_btns[3].disabled=false;
}else{
$btns[2].disabled=false;
$btns[3].disabled=true;
$small_btns[2].disabled=false;
$small_btns[3].disabled=true;
}
}
var count = function(){
var value = $textarea[0].value.trim();
var value = $input.value.trim();
if(value){
var sex = $sex[0].checked?1:0;
var type = $type[0].checked?'default':'chain';
var reverse = !$reverse[0].checked;
var result = relationship({text:value,sex:sex,reverse:reverse,type:type});
$textarea[1].value = '';
var result = relationship({text:value,sex:sex,reverse:reverse});
$result.value = '';
if(result.length){
$textarea[1].value = result.join('\n');
$result.value = result.join('\n');
}else{
$textarea[1].value = '貌似他/她跟你不是很熟哦!';
$result.value = '貌似他/她跟你不是很熟哦!';
}
}else{
$textarea[1].value = '';
$result.value = '';
}
}
for(var i=0;i<$btns.length;i++){
$btns[i].onclick = function(){
var value = $textarea[0].value.trim();
for(var i=0;i<$small_btns.length;i++){
$small_btns[i].onclick = function(){
var value = $input.value.trim();
var name = this.getAttribute('data-value');
if(value){
$textarea[0].value= value+'的'+name;
$input.value= value+'的'+name;
}else{
$textarea[0].value= name;
$input.value= name;
}
toggle('爸爸,老公,儿子,哥哥,弟弟'.indexOf(name)>-1);
toggleSex('爸爸,老公,儿子,哥哥,弟弟'.indexOf(name)>-1);
}
}
for(var i=0;i<$radio.length;i++){
$radio[i].onchange=function(){
toggle($sex[0].checked);
$group.style.display = $type[0].checked?'block':'none';
if($textarea[1].value){
toggleSex($sex[0].checked);
if($result.value){
count();
}
}
}
$buttons[0].onclick = function(){
var value = $textarea[0].value.trim();
$panel.querySelector('.btn-orange').onclick = function(){
var value = $input.value.trim();
var index = value.lastIndexOf('的');
index = Math.max(0,index);
var search = value.substr(0,index);
$textarea[0].value = search;
$textarea[1].value = '';
$input.value = search;
$result.value = '';
var name = search.split('的').pop();
if(!name){
toggle($sex[0].checked);
toggleSex($sex[0].checked);
}else{
toggle('爸爸,老公,儿子,哥哥,弟弟'.indexOf(name)>-1);
toggleSex('爸爸,老公,儿子,哥哥,弟弟'.indexOf(name)>-1);
}
};
$panel.querySelector('.btn-red').onclick = function(){
$result.value = $input.value = '';
toggleSex($sex[0].checked);
};
$panel.querySelector('.btn-green').onclick = count;
toggleSex($sex[0].checked);
})();
// 通过称呼找关系
(function(){
var $module = document.querySelector('.mod-panel');
var $panel = $module.querySelector('.c-panel:nth-child(2)');
var $radio = $panel.querySelectorAll('input[type="radio"]');
var $input = $panel.querySelector('input[name="input"]');
var $result = $panel.querySelector('textarea[name="result"]');
var count = function(){
var value = $input.value.trim();
if(value){
var result = relationship({text:value,type:'chain'});
if(result.length){
$result.value = result.join('\n');
}else{
$result.value = '貌似他/她跟你不是很熟哦!';
}
}else{
$result.value = '';
}
};
$panel.querySelector('.btn-red').onclick = function(){
$result.value = $input.value = '';
};
$panel.querySelector('.btn-green').onclick = count;
})();
// 任意两者间称呼
(function(){
var $module = document.querySelector('.mod-panel');
var $panel = $module.querySelector('.c-panel:nth-child(3)');
var $radio = $panel.querySelectorAll('input[type="radio"]');
var $reverse = $panel.querySelectorAll('input[name="reverse2"]');
var $person = $panel.querySelector('input[name="person"]');
var $target = $panel.querySelector('input[name="target"]');
var $result = $panel.querySelector('textarea[name="result"]');
var count = function(){
var person = $person.value.trim();
var target = $target.value.trim();
if(person){
var reverse = !$reverse[1].checked;
var result = relationship({text:person,reverse:reverse,target:target});
if(result.length){
$result.value = result.join('\n');
}else{
$result.value = '他们貌似不是很熟哦!';
}
}else{
$result.value = '';
}
};
for(var i=0;i<$radio.length;i++){
$radio[i].onchange=function(){
if($result.value){
count();
}
}
}
$buttons[1].onclick = function(){
$textarea[1].value = $textarea[0].value = '';
toggle($sex[0].checked);
}
$buttons[2].onclick = count;
toggle($sex[0].checked);
$panel.querySelector('.btn-red').onclick = function(){
$result.value = $person.value = $target.value = '';
};
$panel.querySelector('.btn-green').onclick = count;
})();
</script>
<script async defer src="https://buttons.github.io/buttons.js"></script>

View File

@ -43,8 +43,9 @@ relationship(options);
```js
var options = {
text:'', //输入的文本
target:'', //针对对象:空表示自己
sex:-1, //自己的性别0女性,1男性
type:'default', //转换类型:'default'算称谓,'chain'算关系(此时reverse无效)
type:'default', //转换类型:'default'算称谓,'chain'算关系
reverse:false //称呼方式true对方称呼我,false我称呼对方
};
```

View File

@ -1,95 +0,0 @@
if (typeof Array.prototype.indexOf != "function") {
Array.prototype.indexOf = function (searchElement, fromIndex) {
var index = -1;
fromIndex = fromIndex * 1 || 0;
for (var k = 0, length = this.length; k < length; k++) {
if (k >= fromIndex && this[k] === searchElement) {
index = k;
break;
}
}
return index;
};
}
if(!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^\s+|\s+$/g,'');
};
}
//跨浏览器DOM对象
var DOMUtil = {
getStyle:function(node,attr){
return node.currentStyle ? node.currentStyle[attr] : getComputedStyle(node,0)[attr];
},
getScroll:function(){ //获取滚动条的滚动距离
var scrollPos={};
if (window.pageYOffset||window.pageXOffset) {
scrollPos['top'] = window.pageYOffset;
scrollPos['left'] = window.pageXOffset;
}else if (document.compatMode && document.compatMode != 'BackCompat'){
scrollPos['top'] = document.documentElement.scrollTop;
scrollPos['left'] = document.documentElement.scrollLeft;
}else if(document.body){
scrollPos['top'] = document.body.scrollTop;
scrollPos['left'] = document.body.scrollLeft;
}
return scrollPos;
},
getClient:function(){ //获取浏览器的可视区域位置
var l,t,w,h;
l = document.documentElement.scrollLeft || document.body.scrollLeft;
t = document.documentElement.scrollTop || document.body.scrollTop;
w = document.documentElement.clientWidth;
h = document.documentElement.clientHeight;
return {'left':l,'top':t,'width':w,'height':h} ;
},
getNextElement:function(node){ //获取下一个节点
if(node.nextElementSibling){
return node.nextElementSibling;
}else{
var NextElementNode = node.nextSibling;
while(NextElementNode.nodeValue != null){
NextElementNode = NextElementNode.nextSibling
}
return NextElementNode;
}
},
getElementById:function(idName){
return document.getElementById(idName);
},
getElementsByClassName:function(className,context,tagName){ //根据class获取节点
if(typeof context == 'string'){
tagName = context;
context = document;
}else{
context = context || document;
tagName = tagName || '*';
}
if(context.getElementsByClassName){
return context.getElementsByClassName(className);
}
var nodes = context.getElementsByTagName(tagName);
var results= [];
for (var i = 0; i < nodes.length; i++) {
var node = nodes[i];
var classNames = node.className.split(' ');
for (var j = 0; j < classNames.length; j++) {
if (classNames[j] == className) {
results.push(node);
break;
}
}
}
return results;
},
addClass:function(node,classname){ //对节点增加class
if(!new RegExp("(^|\s+)"+classname).test(node.className)){
node.className = (node.className+" "+classname).replace(/^\s+|\s+$/g,'');
}
},
removeClass:function(node,classname){ //对节点删除class
node.className = (node.className.replace(classname,"")).replace(/^\s+|\s+$/g,'');
}
};

View File

@ -610,7 +610,7 @@
'f,m,m,xs,d,d':['再从母姑母'],
'f,m,m,xs,d,d,h':['再从母姑父'],
// 舅表*
'f,m,xb':['舅公','舅祖父','舅老爷','舅爷爷','舅爷','舅祖','舅奶爷','太舅父','x舅公'],
'f,m,xb':['舅公','舅祖父','舅老爷','舅爷爷','舅爷','舅祖','舅奶爷','太舅父','x舅老爷','x舅公'],
'f,m,xb,w':['舅婆','舅祖母','舅奶奶','舅奶','妗婆','太舅母'],
// 舅表叔表
'f,m,xb,s&o':['舅表伯父','表伯父','表伯'],
@ -1438,6 +1438,8 @@
'ob':['哥哥','哥','兄','阿哥','大佬','老哥','兄长','胞哥','大哥','x哥'],
'ob,w':['嫂子','嫂','嫂嫂','阿嫂','兄嫂','大嫂','x嫂'],
'ob,w,f':['兄姻父','兄眷父','姻父'],
'ob,w,f,f':['兄姻公'],
'ob,w,f,m':['兄姻婆'],
'ob,w,m':['兄姻母','兄眷母','姻母'],
'ob,w,ob':['兄姻兄','兄眷兄','姻兄'],
'ob,w,ob,w':['兄姻兄妇','兄眷兄妇'],
@ -1453,8 +1455,10 @@
'ob,w,xs,d':['兄姻甥女','兄眷甥女'],
'lb':['弟弟','弟','细佬','胞弟','老弟','x弟'],
'lb,w':['弟妹','弟媳','弟媳妇','弟妇','x弟妹'],
'lb,w,f':['弟姻父','姻父'],
'lb,w,m':['弟姻母','姻母'],
'lb,w,f':['弟姻父','弟眷母','姻父'],
'lb,w,f,f':['弟姻公'],
'lb,w,f,m':['弟姻婆'],
'lb,w,m':['弟姻母','弟眷母','姻母'],
'lb,w,ob':['弟姻兄','弟眷兄','姻兄'],
'lb,w,ob,w':['弟姻兄妇','弟眷兄妇'],
'lb,w,lb':['弟姻弟','弟眷弟','姻弟'],
@ -1468,10 +1472,10 @@
'lb,w,xs,s':['弟姻甥男','弟眷甥男'],
'lb,w,xs,d':['弟姻甥女','弟眷甥女'],
'xb':['兄弟'],
'xb,w,f':['姻伯父','姻世伯'],
'xb,w,f,f':['姻伯公'],
'xb,w,f,m':['姻伯婆'],
'xb,w,m':['姻伯母'],
'xb,w,f,ob':['姻伯父'],
'xb,w,f,ob,w':['姻伯母'],
'xb,w,f,lb':['姻叔父'],
'xb,w,f,lb,w':['姻叔母'],
'0,xb,w,xb,s':['舅眷舅男'],
'1,xb,w,xb,s':['叔眷舅男'],
'0,xb,w,xb,d':['舅眷舅女'],
@ -1558,10 +1562,10 @@
'ls,h,xs,s':['妹姻侄男'],
'ls,h,xs,d':['妹姻侄女'],
'xs':['姐妹','姊妹'],
'xs,h,f':['姻伯父','姻世伯'],
'xs,h,f,f':['姻伯公'],
'xs,h,f,m':['姻伯婆'],
'xs,h,m':['姻伯母'],
'xs,h,f,ob':['姻伯父'],
'xs,h,f,ob,w':['姻伯母'],
'xs,h,f,lb':['姻叔父'],
'xs,h,f,lb,w':['姻叔母'],
'0,xs,h,xb,s':['姨姻叔男'],
'1,xs,h,xb,s':['姑姻叔男'],
'0,xs,h,xb,d':['姨姻叔女'],
@ -1767,17 +1771,26 @@
'd,h,xs,d':['女息姻外孙女','息姻外孙女'],
};
//数组去重
// 数组去重
var unique = function(arr) {
var result = [], hash = {};
var item;
for (var i = 0; (item = arr[i]) != null; i++) {
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''); //对特殊语法标识相互包含的行为去重
if (!hash[item]&&!hash[temp]){
result.push(item);
if (temp==item&&!hash[temp]){
hash[item] = true;
}
}
for (var i = 0; (item = arr[i]) != null; i++) {
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''); //对特殊语法标识相互包含的行为去重
if (temp!=item){
if(!hash[temp]){
result.push(item);
}
}else{
result.push(item);
}
}
return result;
};
@ -1820,7 +1833,7 @@
return match?result:[];
}
// 简化选择器
// 选择器转ID
function selector2id(selector,sex){
var result = [];
var hash = {};
@ -1872,7 +1885,7 @@
return unique(result);
}
//获取数据
// 通过ID获取数据
function getDataById(id){
var items = [];
var getData = function(d){
@ -1918,7 +1931,7 @@
return items;
}
//逆转ID
// 逆转ID
function reverseId(id,sex){
var hash = {
f:['d','s'],
@ -1956,7 +1969,7 @@
return '';
}
//获取关系链条
// 通过ID获取关系链条
function getChainById(id){
var arr = id.split(',');
var items = [];
@ -1967,45 +1980,93 @@
return items.join('的');
}
// 合并选择器,查找两个对象之间的关系
function mergeSelector(from,to){
var Index = 0;
var from_arr = from.split(',');
var to_arr = to.split(',');
for(var i=0;i<from_arr.length&&i<to_arr.length;i++){
if(from_arr[i]!=to_arr[i]){
break;
}
}
var mid_sex = 0;
if(to_arr[i-1].match(/([fhs1](&[ol])?|[olx]b)$/)){
mid_sex=1;
}
var sex = -1;
if(to){
if(to.match(/,([fhs1](&[ol])?|[olx]b)$/)){
sex=1;
}else{
sex=0;
}
}
if(i){
var from_sub = from_arr.slice(i).join(',');
var to_sub = to_arr.slice(i).join(',');
return {
'selector':(to_sub?','+reverseId(to_sub,mid_sex):'')+(from_sub?','+from_sub:''),
'sex':sex
};
}else{
return {
'selector':from,
'sex':sex
};
}
}
return (function (parameter){
var options = Object.assign({
text:'',
target:'',
sex:-1,
type:'default', //为'chain'时,reverse无效
reverse:false
},parameter);
var selectors = getSelectors(options.text);
// console.log('[selectors]',selectors);
var sex = options.sex;
var from_selectors = getSelectors(options.text);
var to_selectors = options.target?getSelectors(options.target):[''];
// console.log('[selectors]',from_selectors,to_selectors);
var result = []; //匹配结果
for(var i = 0;i<selectors.length;i++){ //遍历所有可能性
var ids = selector2id(selectors[i],options.sex);
// console.log('[ids]',ids);
for(var j=0;j<ids.length;j++){
var id = ids[j];
if(options.type=='chain'){
var item = getChainById(id);
if(item){
result.push(item);
}
}else{
if(options.reverse){
id = reverseId(id,options.sex);
}
var items = getDataById(options.sex+','+id);
if(!items.length){
items = getDataById(id);
}
if(!items.length){
if(id.indexOf('w')==0||id.indexOf('h')==0){ //找不到关系,随爱人叫
items = getDataById(id.substr(2));
from_selectors.forEach(function(from){
to_selectors.forEach(function(to){
var data = mergeSelector(from,to);
// console.log('#data#',data);
sex = data['sex']>-1?data['sex']:options.sex;
var ids = selector2id(data['selector'],sex);
// console.log('[ids]',ids);
for(var j=0;j<ids.length;j++){
var id = ids[j];
if(options.type=='chain'){
if(options.reverse){
id = reverseId(id,sex);
}
var item = getChainById(id);
if(item){
result.push(item);
}
}else{
if(options.reverse){
id = reverseId(id,sex);
}
var items = getDataById(sex+','+id);
if(!items.length){
items = getDataById(id);
}
if(!items.length){
if(id.indexOf('w')==0||id.indexOf('h')==0){ //找不到关系,随爱人叫
items = getDataById(id.substr(2));
}
}
if(items.length){
result = result.concat(items);
}
}
if(items.length){
result = result.concat(items);
}
}
}
}
});
});
return unique(result);
});
});

View File

@ -93,58 +93,134 @@ a:hover{
.mod-panel .bd p{
overflow: hidden;
}
.mod-panel .c-hd{
height: 36px;
margin-bottom: 15px;
border-bottom: 1px solid #e2e2e2;
}
.mod-panel .c-hd li{
float: left;
width: 33.33%;
height: 36px;
line-height: 36px;
}
.mod-panel .c-hd li a{
display: block;
text-align: center;
text-decoration: none;
color: #999;
}
.mod-panel .c-hd li.active a{
position: relative;
color: #333;
}
.mod-panel .c-hd li.active a::after{
position: absolute;
left: 50%;
bottom: 0;
display: block;
content: '';
width: 16px;
height: 4px;
margin-left: -8px;
background: #2095f2;
border-radius: 3px;
}
.mod-panel .c-panel{
display: none;
}
.mod-panel .operation{
margin: 15px 0;
}
.mod-panel .row{
margin-bottom: 5px;
}
.mod-panel .field{
line-height: 28px;
}
.mod-panel .field span,.mod-panel .field input{
.mod-panel .bd label{
display: inline-block;
min-width: 90px;
margin-right: 15px;
}
.mod-panel .bd label span,.mod-panel .bd label input{
vertical-align: middle;
}
.mod-panel .input-text{
width: 60px;
height: 20px;
margin-right:20px;
border: 1px solid #ebebeb;
padding: 4px 8px;
.mod-panel .bd .input-text{
display: inline-block;
width: 100%;
height: 30px;
border: 1px solid #e8e8e8;
padding: 5px 10px;
box-sizing: border-box;
line-height: 20px;
outline: none;
}
.mod-panel .input-button {
height: 30px;
width: 80px;
margin: 10px 10px 10px 0;
background: #4bae4f;
.mod-panel .bd .input-text-small{
width: 200px;
}
.mod-panel .bd .btn {
height: 32px;
min-width: 90px;
background: #eeeeee;
border: medium none;
line-height: 30px;
vertical-align: middle;
font-size: 16px;
color: #fff;
color: #333333;
cursor: pointer;
outline: none;
}
.mod-panel label{
display: inline-block;
min-width: 90px;
margin-right:10px;
.mod-panel .bd .btn:hover{
background: #e4e4e4;
}
.mod-panel p span{
margin-right: 10px;
.mod-panel .bd .btn-green{
background: #4bae4f;
color: #fff;
}
.mod-panel .btn{
width: 36px;
.mod-panel .bd .btn-green:hover{
background: #47a04b;
}
.mod-panel .bd .btn-red{
background: #f56954;
color: #fff;
}
.mod-panel .bd .btn-red:hover{
background: #f4543c;;
}
.mod-panel .bd .btn-orange{
background: #ff9000;
color: #fff;
}
.mod-panel .bd .btn-orange:hover{
background: #e18309;
}
.mod-panel .bd .btn-small{
min-width: 40px;
cursor: pointer;
}
.mod-panel textarea{
.mod-panel .bd .btn[disabled]{
background: #f0f0f0;
color: #aaa;
}
.mod-panel .bd textarea{
display: block;
width: 90%;
width: 100%;
height: 150px;
padding:5px 10px;
border: 1px solid #ebebeb;
background: #f8f8f8;
border: 1px solid #e8e8e8;
box-sizing: border-box;
border-radius: 5px;
resize: none;
outline: none;
}
.mod-panel .bd p{
line-height: 30px;
}
.mod-panel .bd p span{
margin-right: 10px;
}
.mod-panel .ft{
padding-top: 20px;
border-top:1px dotted #e0e0e0;