From a706d387cc391f4a39e9deb3447d07d59556e86c Mon Sep 17 00:00:00 2001 From: mumuy Date: Sat, 12 Apr 2025 12:35:28 +0800 Subject: [PATCH] =?UTF-8?q?updated=20js=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/lang/relationship.zh-HK.min.js | 4 +- dist/lang/relationship.zh-HK.min.mjs | 4 +- dist/relationship.min.js | 4 +- dist/relationship.min.mjs | 4 +- src/module/cache.js | 23 ++++---- src/module/id.js | 86 +++++++++++++--------------- src/module/map.js | 59 +++++++++---------- src/module/mode.js | 10 ++-- src/module/options.js | 4 +- src/module/selector.js | 86 ++++++++++++---------------- src/relationship.js | 85 ++++++++++++--------------- 11 files changed, 166 insertions(+), 203 deletions(-) diff --git a/dist/lang/relationship.zh-HK.min.js b/dist/lang/relationship.zh-HK.min.js index c41528d..3da5d65 100644 --- a/dist/lang/relationship.zh-HK.min.js +++ b/dist/lang/relationship.zh-HK.min.js @@ -8,6 +8,6 @@ * Released under the MIT License * https://github.com/mumuy/relationship * - * Created on: 2024-11-28 + * Created on: 2025-04-12 */ -!function(s,f){"object"==typeof exports&&"undefined"!=typeof module?module.exports=f():"function"==typeof define&&define.amd?define(f):(s="undefined"!=typeof globalThis?globalThis:s||self).relationship=f()}(this,(function(){"use strict";function s(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:m}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,r=!0,e=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return r=s.done,s},e:function(s){e=!0,o=s},f:function(){try{r||null==x.return||x.return()}finally{if(e)throw o}}}}function b(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x1&&void 0!==arguments[1]?arguments[1]:-1,x=s.split(",").map((function(s){var f=s.replace(/&[ol\d]+/,"");return U[f][0]})).join("的");return f>-1&&U[f+","+s]&&(0==f?x="(女性)"+x:1==f&&(x="(男性)"+x)),x}var z={xb:["兄弟","親兄弟","同胞兄弟"],"xb,w":["兄弟媳婦","兄弟婦"],xs:["姐妹","親姐妹","同胞姐妹"],"xs,h":["姐妹夫","姊妹婿"],"f,xb":["伯叔父"],"f,xb,w":["伯叔母"],"f,f,xb":["從祖祖父","從祖父"],"f,f,xb,w":["從祖祖母","從祖母"],"m,f,xb":["外從祖祖父"],"m,f,xb,w":["外從祖祖母"],"h,xb":["伯叔"],"h,xb,w":["妯娌","娣姒","娣姒姊妹","嬸子"]},B=Object.assign({},N);for(var D in z)B[D]=(B[D]||[]).concat(z[D]);for(var F in w)B[F]=(B[F]||[]).concat(w[F]);var H={},J=function(s){B[s].forEach((function(f){void 0===H[f]&&(H[f]=[]),H[f].push(s)}))};for(var K in B)J(K);function L(s,f){var x="undefined"!=typeof Symbol&&s[Symbol.iterator]||s["@@iterator"];if(!x){if(Array.isArray(s)||(x=function(s,f){if(s){if("string"==typeof s)return P(s,f);var x={}.toString.call(s).slice(8,-1);return"Object"===x&&s.constructor&&(x=s.constructor.name),"Map"===x||"Set"===x?Array.from(s):"Arguments"===x||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(x)?P(s,f):void 0}}(s))||f&&s&&"number"==typeof s.length){x&&(s=x);var d=0,m=function(){};return{s:m,n:function(){return d>=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:m}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var b,o=!0,r=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return o=s.done,s},e:function(s){r=!0,b=s},f:function(){try{o||null==x.return||x.return()}finally{if(r)throw b}}}}function P(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x-1)d=m;else if(b>-1&&-1==m)d=b;else{if(b!=m)return[];d=b}}var o=X(s.from,d),r=X(s.to,d);if(!o.length||!r.length)return[];var e=[];return o.forEach((function(f){r.forEach((function(x){var m=d,b=","+x;if(b.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)&&(m=1),b.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)&&(m=0),f&&x){var o=s.optimal;if((f.match(/&\d+/)||x.match(/&\d+/))&&(o=!0),o){var r=function(s){for(var f=s.from,x=s.to,d=s.sex,m=f.split(","),b=x.split(","),o=0;o+w?m[o]=m[o].replace(/^[xol]b|^s/,"lb").replace(/^[xol]s|^d/,"ls"):+t<+w&&(m[o]=m[o].replace(/^[xol]b|^s/,"ob").replace(/^[xol]s|^d/,"os")),f=m.slice(o).join(","),x=b.slice(o+1).join(","),d=b[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;else if(s.optimal){var M,n;if(t=(null===(M=m[o].match(/([xol])[bs]/))||void 0===M?void 0:M[1])||"",w=(null===(n=b[o].match(/([xol])[bs]/))||void 0===n?void 0:n[1])||"","x"==t||"x"==w){f=m.slice(o+1).join(","),x=b.slice(o+1).join(","),d=m[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;continue}}}break}f=m.slice(o+1).join(","),x=b.slice(o+1).join(","),d=m[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0}return{from:f,to:x,sex:d}}({from:f,to:x,sex:d,optimal:s.optimal});f=r.from,x=r.to,d=r.sex}}(x?I(x,d):[""]).forEach((function(s){var x=(s?","+s:"")+(f?","+f:"");e.push({selector:x,sex:m})}))}))})),e}function V(s){var f=[],x={},d=function(s){var m="";if(!x[s]){x[s]=!0;do{m=s;var b,r=L(o);try{for(r.s();!(b=r.n()).done;){var e=b.value;if((s=s.replace(e.exp,e.str)).includes("#"))return s.split("#").forEach(d),!1}}catch(s){r.e(s)}finally{r.f()}}while(m!=s);if(s.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/))return!1;f.push(s)}};return d(s),f}function X(s,f){if(s.match(/^,/)||(s=","+s),f<0)s.match(/^,[w1]/)?f=1:s.match(/^,[h0]/)&&(f=0);else{if(1==f&&s.match(/^,[h0]/))return[];if(0==f&&s.match(/^,[w1]/))return[]}if(f>-1&&!s.includes(",1")&&!s.includes(",0")&&(s=","+f+s),s.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/))return[];var x=V(s).map((function(s){return s.replace(/,[01]/,"").substr(1)}));return T(x)}var Y=function(s){"string"==typeof s&&(s=function(s){var f,x=m(d);try{for(x.s();!(f=x.n()).done;){var b=f.value,o=s.match(b.exp);if(o)return b.opt(o)}}catch(s){x.e(s)}finally{x.f()}return{}}(s));var f=Object.assign({text:"",target:"",sex:-1,type:"default",reverse:!1,mode:"default",optimal:!1},s);!function(s){if(N=Object.assign({},A),s&&O[s])for(var f in O[s])N[f]=[].concat(O[s][f],A[f]||[])}(f.mode);var b=Q(f.text),o=Q(f.target);o.length||(o=[""]);var r=[];return b.forEach((function(s){o.forEach((function(x){R({from:s,to:x,sex:f.sex,optimal:f.optimal}).forEach((function(s){(s?X(s.selector,s.sex):[]).forEach((function(x){var d=[x],m=s.sex;f.reverse&&(d=I(x,m),m=x.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)?1:0),"chain"==f.type?d.forEach((function(f){var x=q(f,s.sex);x&&r.push(x)})):"pair"==f.type?(d=I(x,s.sex)).forEach((function(s){var f=function(s,f){var x=[],d=[],m=[];s=s.replace(/&\d+/g,""),f=f.replace(/&\d+/g,"");var b=s.replace(/([ol])([bs])/g,"x$2"),o=f.replace(/([ol])([bs])/g,"x$2"),r=s.replace(/&[ol]/g,""),e=f.replace(/&[ol]/g,"");for(var h in t){var l=h.split("#");if(l.length>1){var w=X(l[0]),M=X(l[1]),n=w.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")})),a=M.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")}));(w.includes(s)&&M.includes(f)||w.includes(f)&&M.includes(s))&&x.push(t[h][0]),(n.includes(b)&&a.includes(o)||n.includes(o)&&a.includes(b))&&d.push(t[h][0]),(n.includes(r)&&a.includes(e)||n.includes(e)&&a.includes(r))&&m.push(t[h][0])}}return x.length||(x=d),x.length||(x=m),x}(x,s);r=r.concat(f)})):d.forEach((function(s){var f=k(s);f.length||(f=k(m+","+s)),r=r.concat(f)}))}))}))}))})),x(new Set(r))};return Y.data=N,Y.dataCount=Object.keys(N).length,Y.setMode=function(s,f){O[s]=Object.assign(O[s]||{},f)},Y})); +!function(s,f){"object"==typeof exports&&"undefined"!=typeof module?module.exports=f():"function"==typeof define&&define.amd?define(f):(s="undefined"!=typeof globalThis?globalThis:s||self).relationship=f()}(this,(function(){"use strict";function s(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var e,o=!0,t=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return o=s.done,s},e:function(s){t=!0,e=s},f:function(){try{o||null==x.return||x.return()}finally{if(t)throw e}}}}function m(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x1&&void 0!==arguments[1]?arguments[1]:-1,x=s.split(",").map((function(s){var f=s.replace(/&[ol\d]+/,"");return K[f][0]})).join("的");return f>-1&&K[f+","+s]&&(0==f?x="(女性)"+x:1==f&&(x="(男性)"+x)),x}function Q(s,f){var x=Object.keys(s);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(s);f&&(d=d.filter((function(f){return Object.getOwnPropertyDescriptor(s,f).enumerable}))),x.push.apply(x,d)}return x}function R(s,f){return Object.entries(f).forEach((function(f){var x=b(f,2),d=x[0],r=x[1];s[d]=(s[d]||[]).concat(r)})),s}var V=R(function(s){for(var f=1;f=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,e=!0,o=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return e=s.done,s},e:function(s){o=!0,m=s},f:function(){try{e||null==x.return||x.return()}finally{if(o)throw m}}}}function Z(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x-1)d=m;else if(r>-1&&-1===m)d=r;else{if(r!==m)return[];d=r}}var e=xs(s.from,d),o=xs(s.to,d);if(!e.length||!o.length)return[];var t=[];return e.forEach((function(f){o.forEach((function(x){var r=d,m=","+x;if(m.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)&&(r=1),m.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)&&(r=0),f&&x){var e=s.optimal;if((f.match(/&\d+/)||x.match(/&\d+/))&&(e=!0),e){var o=function(s){for(var f=s.from,x=s.to,d=s.sex,r=f.split(","),m=x.split(","),e=0;e+h?r[e]=r[e].replace(/^[xol]b|^s/,"lb").replace(/^[xol]s|^d/,"ls"):+n<+h&&(r[e]=r[e].replace(/^[xol]b|^s/,"ob").replace(/^[xol]s|^d/,"os")),f=r.slice(e).join(","),x=m.slice(e+1).join(","),d=m[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;else if(s.optimal){var w,M;if(n=(null===(w=r[e].match(/([xol])[bs]/))||void 0===w?void 0:w[1])||"",h=(null===(M=m[e].match(/([xol])[bs]/))||void 0===M?void 0:M[1])||"","x"==n||"x"==h){f=r.slice(e+1).join(","),x=m.slice(e+1).join(","),d=r[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;continue}}}break}f=r.slice(e+1).join(","),x=m.slice(e+1).join(","),d=r[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0}return{from:f,to:x,sex:d}}({from:f,to:x,sex:d,optimal:s.optimal});f=o.from,x=o.to,d=o.sex}}(x?B(x,d):[""]).forEach((function(s){var x=(s?","+s:"")+(f?","+f:"");t.push({selector:x,sex:r})}))}))})),t}function fs(s){var f=[],x={},d=function(s){if(!x[s]){x[s]=!0;var r="";do{r=s;var m,o=Y(e);try{for(o.s();!(m=o.n()).done;){var t=m.value;if((s=s.replace(t.exp,t.str)).includes("#"))return s.split("#").forEach(d),!1}}catch(s){o.e(s)}finally{o.f()}}while(r!=s);if(s.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/))return!1;f.push(s)}};return d(s),f}function xs(s,f){if(s.match(/^,/)||(s=","+s),f<0)s.match(/^,[w1]/)?f=1:s.match(/^,[h0]/)&&(f=0);else{if(1==f&&s.match(/^,[h0]/))return[];if(0==f&&s.match(/^,[w1]/))return[]}if(f>-1&&!s.includes(",1")&&!s.includes(",0")&&(s=","+f+s),s.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/))return[];var x=fs(s).map((function(s){return s.replace(/,[01]/,"").substr(1)}));return F(x)}var ds=function(s){"string"==typeof s&&(s=function(s){var f,x=r(d);try{for(x.s();!(f=x.n()).done;){var m=f.value,e=s.match(m.exp);if(e)return m.opt(e)}}catch(s){x.e(s)}finally{x.f()}return{}}(s));var f=Object.assign({text:"",target:"",sex:-1,type:"default",reverse:!1,mode:"default",optimal:!1},s);!function(s){if(U=T({},I),s&&C[s])for(var f in C[s])U[f]=[].concat(C[s][f],I[f]||[])}(f.mode);var m=_(f.text),e=_(f.target);e.length||(e=[""]);var o=m.flatMap((function(s){return e.flatMap((function(x){return ss({from:s,to:x,sex:f.sex,optimal:f.optimal}).flatMap((function(s){return(s?xs(s.selector,s.sex):[]).flatMap((function(x){var d=[x],r=s.sex;return f.reverse&&(d=B(x,r),r=x.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)?1:0),"chain"===f.type?d.map((function(s){return L(s,r)})).filter((function(s){return s})):"pair"===f.type?B(x,s.sex).flatMap((function(s){return function(s,f){s=s.replace(/&\d+/g,""),f=f.replace(/&\d+/g,"");var x=s.replace(/([ol])([bs])/g,"x$2"),d=f.replace(/([ol])([bs])/g,"x$2"),r=s.replace(/&[ol]/g,""),m=f.replace(/&[ol]/g,""),e=[],o=[],t=[];for(var b in M){var l=b.split("#");if(l.length>1){var n=xs(l[0]),h=xs(l[1]),w=n.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")})),a=h.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")}));(n.includes(s)&&h.includes(f)||n.includes(f)&&h.includes(s))&&e.push(M[b][0]),(w.includes(x)&&a.includes(d)||w.includes(d)&&a.includes(x))&&o.push(M[b][0]),(w.includes(r)&&a.includes(m)||w.includes(m)&&a.includes(r))&&t.push(M[b][0])}}return e.length||(e=o),e.length||(e=t),e}(x,s)})):d.flatMap((function(s){var f=J(s);return f.length||(f=J(r+","+s)),f}))}))}))}))}));return x(new Set(o))};return ds.data=U,ds.dataCount=Object.keys(U).length,ds.setMode=function(s,f){C[s]=T(T({},C[s]||{}),f)},ds})); diff --git a/dist/lang/relationship.zh-HK.min.mjs b/dist/lang/relationship.zh-HK.min.mjs index 3e6d60a..cbe8e27 100644 --- a/dist/lang/relationship.zh-HK.min.mjs +++ b/dist/lang/relationship.zh-HK.min.mjs @@ -8,6 +8,6 @@ * Released under the MIT License * https://github.com/mumuy/relationship * - * Created on: 2024-11-28 + * Created on: 2025-04-12 */ -function s(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:m}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,r=!0,h=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return r=s.done,s},e:function(s){h=!0,o=s},f:function(){try{r||null==x.return||x.return()}finally{if(h)throw o}}}}function b(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x1&&void 0!==arguments[1]?arguments[1]:-1,x=s.split(",").map((function(s){var f=s.replace(/&[ol\d]+/,"");return U[f][0]})).join("的");return f>-1&&U[f+","+s]&&(0==f?x="(女性)"+x:1==f&&(x="(男性)"+x)),x}var z={xb:["兄弟","親兄弟","同胞兄弟"],"xb,w":["兄弟媳婦","兄弟婦"],xs:["姐妹","親姐妹","同胞姐妹"],"xs,h":["姐妹夫","姊妹婿"],"f,xb":["伯叔父"],"f,xb,w":["伯叔母"],"f,f,xb":["從祖祖父","從祖父"],"f,f,xb,w":["從祖祖母","從祖母"],"m,f,xb":["外從祖祖父"],"m,f,xb,w":["外從祖祖母"],"h,xb":["伯叔"],"h,xb,w":["妯娌","娣姒","娣姒姊妹","嬸子"]},B=Object.assign({},N);for(var D in z)B[D]=(B[D]||[]).concat(z[D]);for(var F in w)B[F]=(B[F]||[]).concat(w[F]);var H={},J=function(s){B[s].forEach((function(f){void 0===H[f]&&(H[f]=[]),H[f].push(s)}))};for(var K in B)J(K);function L(s,f){var x="undefined"!=typeof Symbol&&s[Symbol.iterator]||s["@@iterator"];if(!x){if(Array.isArray(s)||(x=function(s,f){if(s){if("string"==typeof s)return P(s,f);var x={}.toString.call(s).slice(8,-1);return"Object"===x&&s.constructor&&(x=s.constructor.name),"Map"===x||"Set"===x?Array.from(s):"Arguments"===x||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(x)?P(s,f):void 0}}(s))||f&&s&&"number"==typeof s.length){x&&(s=x);var d=0,m=function(){};return{s:m,n:function(){return d>=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:m}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var b,o=!0,r=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return o=s.done,s},e:function(s){r=!0,b=s},f:function(){try{o||null==x.return||x.return()}finally{if(r)throw b}}}}function P(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x-1)d=m;else if(b>-1&&-1==m)d=b;else{if(b!=m)return[];d=b}}var o=X(s.from,d),r=X(s.to,d);if(!o.length||!r.length)return[];var h=[];return o.forEach((function(f){r.forEach((function(x){var m=d,b=","+x;if(b.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)&&(m=1),b.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)&&(m=0),f&&x){var o=s.optimal;if((f.match(/&\d+/)||x.match(/&\d+/))&&(o=!0),o){var r=function(s){for(var f=s.from,x=s.to,d=s.sex,m=f.split(","),b=x.split(","),o=0;o+w?m[o]=m[o].replace(/^[xol]b|^s/,"lb").replace(/^[xol]s|^d/,"ls"):+t<+w&&(m[o]=m[o].replace(/^[xol]b|^s/,"ob").replace(/^[xol]s|^d/,"os")),f=m.slice(o).join(","),x=b.slice(o+1).join(","),d=b[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;else if(s.optimal){var M,n;if(t=(null===(M=m[o].match(/([xol])[bs]/))||void 0===M?void 0:M[1])||"",w=(null===(n=b[o].match(/([xol])[bs]/))||void 0===n?void 0:n[1])||"","x"==t||"x"==w){f=m.slice(o+1).join(","),x=b.slice(o+1).join(","),d=m[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;continue}}}break}f=m.slice(o+1).join(","),x=b.slice(o+1).join(","),d=m[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0}return{from:f,to:x,sex:d}}({from:f,to:x,sex:d,optimal:s.optimal});f=r.from,x=r.to,d=r.sex}}(x?I(x,d):[""]).forEach((function(s){var x=(s?","+s:"")+(f?","+f:"");h.push({selector:x,sex:m})}))}))})),h}function V(s){var f=[],x={},d=function(s){var m="";if(!x[s]){x[s]=!0;do{m=s;var b,r=L(o);try{for(r.s();!(b=r.n()).done;){var h=b.value;if((s=s.replace(h.exp,h.str)).includes("#"))return s.split("#").forEach(d),!1}}catch(s){r.e(s)}finally{r.f()}}while(m!=s);if(s.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/))return!1;f.push(s)}};return d(s),f}function X(s,f){if(s.match(/^,/)||(s=","+s),f<0)s.match(/^,[w1]/)?f=1:s.match(/^,[h0]/)&&(f=0);else{if(1==f&&s.match(/^,[h0]/))return[];if(0==f&&s.match(/^,[w1]/))return[]}if(f>-1&&!s.includes(",1")&&!s.includes(",0")&&(s=","+f+s),s.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/))return[];var x=V(s).map((function(s){return s.replace(/,[01]/,"").substr(1)}));return C(x)}var Y=function(s){"string"==typeof s&&(s=function(s){var f,x=m(d);try{for(x.s();!(f=x.n()).done;){var b=f.value,o=s.match(b.exp);if(o)return b.opt(o)}}catch(s){x.e(s)}finally{x.f()}return{}}(s));var f=Object.assign({text:"",target:"",sex:-1,type:"default",reverse:!1,mode:"default",optimal:!1},s);!function(s){if(N=Object.assign({},A),s&&O[s])for(var f in O[s])N[f]=[].concat(O[s][f],A[f]||[])}(f.mode);var b=Q(f.text),o=Q(f.target);o.length||(o=[""]);var r=[];return b.forEach((function(s){o.forEach((function(x){R({from:s,to:x,sex:f.sex,optimal:f.optimal}).forEach((function(s){(s?X(s.selector,s.sex):[]).forEach((function(x){var d=[x],m=s.sex;f.reverse&&(d=I(x,m),m=x.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)?1:0),"chain"==f.type?d.forEach((function(f){var x=q(f,s.sex);x&&r.push(x)})):"pair"==f.type?(d=I(x,s.sex)).forEach((function(s){var f=function(s,f){var x=[],d=[],m=[];s=s.replace(/&\d+/g,""),f=f.replace(/&\d+/g,"");var b=s.replace(/([ol])([bs])/g,"x$2"),o=f.replace(/([ol])([bs])/g,"x$2"),r=s.replace(/&[ol]/g,""),h=f.replace(/&[ol]/g,"");for(var l in t){var e=l.split("#");if(e.length>1){var w=X(e[0]),M=X(e[1]),n=w.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")})),a=M.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")}));(w.includes(s)&&M.includes(f)||w.includes(f)&&M.includes(s))&&x.push(t[l][0]),(n.includes(b)&&a.includes(o)||n.includes(o)&&a.includes(b))&&d.push(t[l][0]),(n.includes(r)&&a.includes(h)||n.includes(h)&&a.includes(r))&&m.push(t[l][0])}}return x.length||(x=d),x.length||(x=m),x}(x,s);r=r.concat(f)})):d.forEach((function(s){var f=k(s);f.length||(f=k(m+","+s)),r=r.concat(f)}))}))}))}))})),x(new Set(r))};Y.data=N,Y.dataCount=Object.keys(N).length,Y.setMode=function(s,f){O[s]=Object.assign(O[s]||{},f)};export{Y as default}; +function s(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var e,o=!0,b=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return o=s.done,s},e:function(s){b=!0,e=s},f:function(){try{o||null==x.return||x.return()}finally{if(b)throw e}}}}function m(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x1&&void 0!==arguments[1]?arguments[1]:-1,x=s.split(",").map((function(s){var f=s.replace(/&[ol\d]+/,"");return K[f][0]})).join("的");return f>-1&&K[f+","+s]&&(0==f?x="(女性)"+x:1==f&&(x="(男性)"+x)),x}function Q(s,f){var x=Object.keys(s);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(s);f&&(d=d.filter((function(f){return Object.getOwnPropertyDescriptor(s,f).enumerable}))),x.push.apply(x,d)}return x}function R(s,f){return Object.entries(f).forEach((function(f){var x=t(f,2),d=x[0],r=x[1];s[d]=(s[d]||[]).concat(r)})),s}var V=R(function(s){for(var f=1;f=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,e=!0,o=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return e=s.done,s},e:function(s){o=!0,m=s},f:function(){try{e||null==x.return||x.return()}finally{if(o)throw m}}}}function Z(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x-1)d=m;else if(r>-1&&-1===m)d=r;else{if(r!==m)return[];d=r}}var e=xs(s.from,d),o=xs(s.to,d);if(!e.length||!o.length)return[];var b=[];return e.forEach((function(f){o.forEach((function(x){var r=d,m=","+x;if(m.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)&&(r=1),m.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)&&(r=0),f&&x){var e=s.optimal;if((f.match(/&\d+/)||x.match(/&\d+/))&&(e=!0),e){var o=function(s){for(var f=s.from,x=s.to,d=s.sex,r=f.split(","),m=x.split(","),e=0;e+h?r[e]=r[e].replace(/^[xol]b|^s/,"lb").replace(/^[xol]s|^d/,"ls"):+n<+h&&(r[e]=r[e].replace(/^[xol]b|^s/,"ob").replace(/^[xol]s|^d/,"os")),f=r.slice(e).join(","),x=m.slice(e+1).join(","),d=m[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;else if(s.optimal){var w,M;if(n=(null===(w=r[e].match(/([xol])[bs]/))||void 0===w?void 0:w[1])||"",h=(null===(M=m[e].match(/([xol])[bs]/))||void 0===M?void 0:M[1])||"","x"==n||"x"==h){f=r.slice(e+1).join(","),x=m.slice(e+1).join(","),d=r[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;continue}}}break}f=r.slice(e+1).join(","),x=m.slice(e+1).join(","),d=r[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0}return{from:f,to:x,sex:d}}({from:f,to:x,sex:d,optimal:s.optimal});f=o.from,x=o.to,d=o.sex}}(x?B(x,d):[""]).forEach((function(s){var x=(s?","+s:"")+(f?","+f:"");b.push({selector:x,sex:r})}))}))})),b}function fs(s){var f=[],x={},d=function(s){if(!x[s]){x[s]=!0;var r="";do{r=s;var m,o=Y(e);try{for(o.s();!(m=o.n()).done;){var b=m.value;if((s=s.replace(b.exp,b.str)).includes("#"))return s.split("#").forEach(d),!1}}catch(s){o.e(s)}finally{o.f()}}while(r!=s);if(s.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/))return!1;f.push(s)}};return d(s),f}function xs(s,f){if(s.match(/^,/)||(s=","+s),f<0)s.match(/^,[w1]/)?f=1:s.match(/^,[h0]/)&&(f=0);else{if(1==f&&s.match(/^,[h0]/))return[];if(0==f&&s.match(/^,[w1]/))return[]}if(f>-1&&!s.includes(",1")&&!s.includes(",0")&&(s=","+f+s),s.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/))return[];var x=fs(s).map((function(s){return s.replace(/,[01]/,"").substr(1)}));return F(x)}var ds=function(s){"string"==typeof s&&(s=function(s){var f,x=r(d);try{for(x.s();!(f=x.n()).done;){var m=f.value,e=s.match(m.exp);if(e)return m.opt(e)}}catch(s){x.e(s)}finally{x.f()}return{}}(s));var f=Object.assign({text:"",target:"",sex:-1,type:"default",reverse:!1,mode:"default",optimal:!1},s);!function(s){if(U=T({},I),s&&C[s])for(var f in C[s])U[f]=[].concat(C[s][f],I[f]||[])}(f.mode);var m=_(f.text),e=_(f.target);e.length||(e=[""]);var o=m.flatMap((function(s){return e.flatMap((function(x){return ss({from:s,to:x,sex:f.sex,optimal:f.optimal}).flatMap((function(s){return(s?xs(s.selector,s.sex):[]).flatMap((function(x){var d=[x],r=s.sex;return f.reverse&&(d=B(x,r),r=x.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)?1:0),"chain"===f.type?d.map((function(s){return L(s,r)})).filter((function(s){return s})):"pair"===f.type?B(x,s.sex).flatMap((function(s){return function(s,f){s=s.replace(/&\d+/g,""),f=f.replace(/&\d+/g,"");var x=s.replace(/([ol])([bs])/g,"x$2"),d=f.replace(/([ol])([bs])/g,"x$2"),r=s.replace(/&[ol]/g,""),m=f.replace(/&[ol]/g,""),e=[],o=[],b=[];for(var t in M){var l=t.split("#");if(l.length>1){var n=xs(l[0]),h=xs(l[1]),w=n.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")})),a=h.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")}));(n.includes(s)&&h.includes(f)||n.includes(f)&&h.includes(s))&&e.push(M[t][0]),(w.includes(x)&&a.includes(d)||w.includes(d)&&a.includes(x))&&o.push(M[t][0]),(w.includes(r)&&a.includes(m)||w.includes(m)&&a.includes(r))&&b.push(M[t][0])}}return e.length||(e=o),e.length||(e=b),e}(x,s)})):d.flatMap((function(s){var f=J(s);return f.length||(f=J(r+","+s)),f}))}))}))}))}));return x(new Set(o))};ds.data=U,ds.dataCount=Object.keys(U).length,ds.setMode=function(s,f){C[s]=T(T({},C[s]||{}),f)};export{ds as default}; diff --git a/dist/relationship.min.js b/dist/relationship.min.js index 0120ad4..121d298 100644 --- a/dist/relationship.min.js +++ b/dist/relationship.min.js @@ -8,6 +8,6 @@ * Released under the MIT License * https://github.com/mumuy/relationship * - * Created on: 2024-11-28 + * Created on: 2025-04-12 */ -!function(s,f){"object"==typeof exports&&"undefined"!=typeof module?module.exports=f():"function"==typeof define&&define.amd?define(f):(s="undefined"!=typeof globalThis?globalThis:s||self).relationship=f()}(this,(function(){"use strict";function s(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:m}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,r=!0,e=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return r=s.done,s},e:function(s){e=!0,o=s},f:function(){try{r||null==x.return||x.return()}finally{if(e)throw o}}}}function b(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x1&&void 0!==arguments[1]?arguments[1]:-1,x=s.split(",").map((function(s){var f=s.replace(/&[ol\d]+/,"");return U[f][0]})).join("的");return f>-1&&U[f+","+s]&&(0==f?x="(女性)"+x:1==f&&(x="(男性)"+x)),x}var z={xb:["兄弟","亲兄弟","同胞兄弟"],"xb,w":["兄弟媳妇","兄弟妇"],xs:["姐妹","亲姐妹","同胞姐妹"],"xs,h":["姐妹夫","姊妹婿"],"f,xb":["伯叔父"],"f,xb,w":["伯叔母"],"f,f,xb":["从祖祖父","从祖父"],"f,f,xb,w":["从祖祖母","从祖母"],"m,f,xb":["外从祖祖父"],"m,f,xb,w":["外从祖祖母"],"h,xb":["伯叔"],"h,xb,w":["妯娌","娣姒","娣姒姊妹","婶子"]},B=Object.assign({},N);for(var D in z)B[D]=(B[D]||[]).concat(z[D]);for(var F in w)B[F]=(B[F]||[]).concat(w[F]);var H={},J=function(s){B[s].forEach((function(f){void 0===H[f]&&(H[f]=[]),H[f].push(s)}))};for(var K in B)J(K);function L(s,f){var x="undefined"!=typeof Symbol&&s[Symbol.iterator]||s["@@iterator"];if(!x){if(Array.isArray(s)||(x=function(s,f){if(s){if("string"==typeof s)return P(s,f);var x={}.toString.call(s).slice(8,-1);return"Object"===x&&s.constructor&&(x=s.constructor.name),"Map"===x||"Set"===x?Array.from(s):"Arguments"===x||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(x)?P(s,f):void 0}}(s))||f&&s&&"number"==typeof s.length){x&&(s=x);var d=0,m=function(){};return{s:m,n:function(){return d>=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:m}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var b,o=!0,r=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return o=s.done,s},e:function(s){r=!0,b=s},f:function(){try{o||null==x.return||x.return()}finally{if(r)throw b}}}}function P(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x-1)d=m;else if(b>-1&&-1==m)d=b;else{if(b!=m)return[];d=b}}var o=X(s.from,d),r=X(s.to,d);if(!o.length||!r.length)return[];var e=[];return o.forEach((function(f){r.forEach((function(x){var m=d,b=","+x;if(b.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)&&(m=1),b.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)&&(m=0),f&&x){var o=s.optimal;if((f.match(/&\d+/)||x.match(/&\d+/))&&(o=!0),o){var r=function(s){for(var f=s.from,x=s.to,d=s.sex,m=f.split(","),b=x.split(","),o=0;o+w?m[o]=m[o].replace(/^[xol]b|^s/,"lb").replace(/^[xol]s|^d/,"ls"):+t<+w&&(m[o]=m[o].replace(/^[xol]b|^s/,"ob").replace(/^[xol]s|^d/,"os")),f=m.slice(o).join(","),x=b.slice(o+1).join(","),d=b[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;else if(s.optimal){var M,n;if(t=(null===(M=m[o].match(/([xol])[bs]/))||void 0===M?void 0:M[1])||"",w=(null===(n=b[o].match(/([xol])[bs]/))||void 0===n?void 0:n[1])||"","x"==t||"x"==w){f=m.slice(o+1).join(","),x=b.slice(o+1).join(","),d=m[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;continue}}}break}f=m.slice(o+1).join(","),x=b.slice(o+1).join(","),d=m[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0}return{from:f,to:x,sex:d}}({from:f,to:x,sex:d,optimal:s.optimal});f=r.from,x=r.to,d=r.sex}}(x?I(x,d):[""]).forEach((function(s){var x=(s?","+s:"")+(f?","+f:"");e.push({selector:x,sex:m})}))}))})),e}function V(s){var f=[],x={},d=function(s){var m="";if(!x[s]){x[s]=!0;do{m=s;var b,r=L(o);try{for(r.s();!(b=r.n()).done;){var e=b.value;if((s=s.replace(e.exp,e.str)).includes("#"))return s.split("#").forEach(d),!1}}catch(s){r.e(s)}finally{r.f()}}while(m!=s);if(s.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/))return!1;f.push(s)}};return d(s),f}function X(s,f){if(s.match(/^,/)||(s=","+s),f<0)s.match(/^,[w1]/)?f=1:s.match(/^,[h0]/)&&(f=0);else{if(1==f&&s.match(/^,[h0]/))return[];if(0==f&&s.match(/^,[w1]/))return[]}if(f>-1&&!s.includes(",1")&&!s.includes(",0")&&(s=","+f+s),s.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/))return[];var x=V(s).map((function(s){return s.replace(/,[01]/,"").substr(1)}));return T(x)}var Y=function(s){"string"==typeof s&&(s=function(s){var f,x=m(d);try{for(x.s();!(f=x.n()).done;){var b=f.value,o=s.match(b.exp);if(o)return b.opt(o)}}catch(s){x.e(s)}finally{x.f()}return{}}(s));var f=Object.assign({text:"",target:"",sex:-1,type:"default",reverse:!1,mode:"default",optimal:!1},s);!function(s){if(N=Object.assign({},A),s&&O[s])for(var f in O[s])N[f]=[].concat(O[s][f],A[f]||[])}(f.mode);var b=Q(f.text),o=Q(f.target);o.length||(o=[""]);var r=[];return b.forEach((function(s){o.forEach((function(x){R({from:s,to:x,sex:f.sex,optimal:f.optimal}).forEach((function(s){(s?X(s.selector,s.sex):[]).forEach((function(x){var d=[x],m=s.sex;f.reverse&&(d=I(x,m),m=x.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)?1:0),"chain"==f.type?d.forEach((function(f){var x=q(f,s.sex);x&&r.push(x)})):"pair"==f.type?(d=I(x,s.sex)).forEach((function(s){var f=function(s,f){var x=[],d=[],m=[];s=s.replace(/&\d+/g,""),f=f.replace(/&\d+/g,"");var b=s.replace(/([ol])([bs])/g,"x$2"),o=f.replace(/([ol])([bs])/g,"x$2"),r=s.replace(/&[ol]/g,""),e=f.replace(/&[ol]/g,"");for(var h in t){var l=h.split("#");if(l.length>1){var w=X(l[0]),M=X(l[1]),n=w.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")})),a=M.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")}));(w.includes(s)&&M.includes(f)||w.includes(f)&&M.includes(s))&&x.push(t[h][0]),(n.includes(b)&&a.includes(o)||n.includes(o)&&a.includes(b))&&d.push(t[h][0]),(n.includes(r)&&a.includes(e)||n.includes(e)&&a.includes(r))&&m.push(t[h][0])}}return x.length||(x=d),x.length||(x=m),x}(x,s);r=r.concat(f)})):d.forEach((function(s){var f=k(s);f.length||(f=k(m+","+s)),r=r.concat(f)}))}))}))}))})),x(new Set(r))};return Y.data=N,Y.dataCount=Object.keys(N).length,Y.setMode=function(s,f){O[s]=Object.assign(O[s]||{},f)},Y})); +!function(s,f){"object"==typeof exports&&"undefined"!=typeof module?module.exports=f():"function"==typeof define&&define.amd?define(f):(s="undefined"!=typeof globalThis?globalThis:s||self).relationship=f()}(this,(function(){"use strict";function s(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var e,o=!0,t=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return o=s.done,s},e:function(s){t=!0,e=s},f:function(){try{o||null==x.return||x.return()}finally{if(t)throw e}}}}function m(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x1&&void 0!==arguments[1]?arguments[1]:-1,x=s.split(",").map((function(s){var f=s.replace(/&[ol\d]+/,"");return K[f][0]})).join("的");return f>-1&&K[f+","+s]&&(0==f?x="(女性)"+x:1==f&&(x="(男性)"+x)),x}function Q(s,f){var x=Object.keys(s);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(s);f&&(d=d.filter((function(f){return Object.getOwnPropertyDescriptor(s,f).enumerable}))),x.push.apply(x,d)}return x}function R(s,f){return Object.entries(f).forEach((function(f){var x=b(f,2),d=x[0],r=x[1];s[d]=(s[d]||[]).concat(r)})),s}var V=R(function(s){for(var f=1;f=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,e=!0,o=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return e=s.done,s},e:function(s){o=!0,m=s},f:function(){try{e||null==x.return||x.return()}finally{if(o)throw m}}}}function Z(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x-1)d=m;else if(r>-1&&-1===m)d=r;else{if(r!==m)return[];d=r}}var e=xs(s.from,d),o=xs(s.to,d);if(!e.length||!o.length)return[];var t=[];return e.forEach((function(f){o.forEach((function(x){var r=d,m=","+x;if(m.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)&&(r=1),m.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)&&(r=0),f&&x){var e=s.optimal;if((f.match(/&\d+/)||x.match(/&\d+/))&&(e=!0),e){var o=function(s){for(var f=s.from,x=s.to,d=s.sex,r=f.split(","),m=x.split(","),e=0;e+h?r[e]=r[e].replace(/^[xol]b|^s/,"lb").replace(/^[xol]s|^d/,"ls"):+n<+h&&(r[e]=r[e].replace(/^[xol]b|^s/,"ob").replace(/^[xol]s|^d/,"os")),f=r.slice(e).join(","),x=m.slice(e+1).join(","),d=m[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;else if(s.optimal){var w,M;if(n=(null===(w=r[e].match(/([xol])[bs]/))||void 0===w?void 0:w[1])||"",h=(null===(M=m[e].match(/([xol])[bs]/))||void 0===M?void 0:M[1])||"","x"==n||"x"==h){f=r.slice(e+1).join(","),x=m.slice(e+1).join(","),d=r[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;continue}}}break}f=r.slice(e+1).join(","),x=m.slice(e+1).join(","),d=r[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0}return{from:f,to:x,sex:d}}({from:f,to:x,sex:d,optimal:s.optimal});f=o.from,x=o.to,d=o.sex}}(x?B(x,d):[""]).forEach((function(s){var x=(s?","+s:"")+(f?","+f:"");t.push({selector:x,sex:r})}))}))})),t}function fs(s){var f=[],x={},d=function(s){if(!x[s]){x[s]=!0;var r="";do{r=s;var m,o=Y(e);try{for(o.s();!(m=o.n()).done;){var t=m.value;if((s=s.replace(t.exp,t.str)).includes("#"))return s.split("#").forEach(d),!1}}catch(s){o.e(s)}finally{o.f()}}while(r!=s);if(s.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/))return!1;f.push(s)}};return d(s),f}function xs(s,f){if(s.match(/^,/)||(s=","+s),f<0)s.match(/^,[w1]/)?f=1:s.match(/^,[h0]/)&&(f=0);else{if(1==f&&s.match(/^,[h0]/))return[];if(0==f&&s.match(/^,[w1]/))return[]}if(f>-1&&!s.includes(",1")&&!s.includes(",0")&&(s=","+f+s),s.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/))return[];var x=fs(s).map((function(s){return s.replace(/,[01]/,"").substr(1)}));return F(x)}var ds=function(s){"string"==typeof s&&(s=function(s){var f,x=r(d);try{for(x.s();!(f=x.n()).done;){var m=f.value,e=s.match(m.exp);if(e)return m.opt(e)}}catch(s){x.e(s)}finally{x.f()}return{}}(s));var f=Object.assign({text:"",target:"",sex:-1,type:"default",reverse:!1,mode:"default",optimal:!1},s);!function(s){if(U=T({},I),s&&C[s])for(var f in C[s])U[f]=[].concat(C[s][f],I[f]||[])}(f.mode);var m=_(f.text),e=_(f.target);e.length||(e=[""]);var o=m.flatMap((function(s){return e.flatMap((function(x){return ss({from:s,to:x,sex:f.sex,optimal:f.optimal}).flatMap((function(s){return(s?xs(s.selector,s.sex):[]).flatMap((function(x){var d=[x],r=s.sex;return f.reverse&&(d=B(x,r),r=x.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)?1:0),"chain"===f.type?d.map((function(s){return L(s,r)})).filter((function(s){return s})):"pair"===f.type?B(x,s.sex).flatMap((function(s){return function(s,f){s=s.replace(/&\d+/g,""),f=f.replace(/&\d+/g,"");var x=s.replace(/([ol])([bs])/g,"x$2"),d=f.replace(/([ol])([bs])/g,"x$2"),r=s.replace(/&[ol]/g,""),m=f.replace(/&[ol]/g,""),e=[],o=[],t=[];for(var b in M){var l=b.split("#");if(l.length>1){var n=xs(l[0]),h=xs(l[1]),w=n.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")})),a=h.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")}));(n.includes(s)&&h.includes(f)||n.includes(f)&&h.includes(s))&&e.push(M[b][0]),(w.includes(x)&&a.includes(d)||w.includes(d)&&a.includes(x))&&o.push(M[b][0]),(w.includes(r)&&a.includes(m)||w.includes(m)&&a.includes(r))&&t.push(M[b][0])}}return e.length||(e=o),e.length||(e=t),e}(x,s)})):d.flatMap((function(s){var f=J(s);return f.length||(f=J(r+","+s)),f}))}))}))}))}));return x(new Set(o))};return ds.data=U,ds.dataCount=Object.keys(U).length,ds.setMode=function(s,f){C[s]=T(T({},C[s]||{}),f)},ds})); diff --git a/dist/relationship.min.mjs b/dist/relationship.min.mjs index e150141..22c3423 100644 --- a/dist/relationship.min.mjs +++ b/dist/relationship.min.mjs @@ -8,6 +8,6 @@ * Released under the MIT License * https://github.com/mumuy/relationship * - * Created on: 2024-11-28 + * Created on: 2025-04-12 */ -function s(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:m}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,r=!0,h=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return r=s.done,s},e:function(s){h=!0,o=s},f:function(){try{r||null==x.return||x.return()}finally{if(h)throw o}}}}function b(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x1&&void 0!==arguments[1]?arguments[1]:-1,x=s.split(",").map((function(s){var f=s.replace(/&[ol\d]+/,"");return U[f][0]})).join("的");return f>-1&&U[f+","+s]&&(0==f?x="(女性)"+x:1==f&&(x="(男性)"+x)),x}var z={xb:["兄弟","亲兄弟","同胞兄弟"],"xb,w":["兄弟媳妇","兄弟妇"],xs:["姐妹","亲姐妹","同胞姐妹"],"xs,h":["姐妹夫","姊妹婿"],"f,xb":["伯叔父"],"f,xb,w":["伯叔母"],"f,f,xb":["从祖祖父","从祖父"],"f,f,xb,w":["从祖祖母","从祖母"],"m,f,xb":["外从祖祖父"],"m,f,xb,w":["外从祖祖母"],"h,xb":["伯叔"],"h,xb,w":["妯娌","娣姒","娣姒姊妹","婶子"]},B=Object.assign({},N);for(var D in z)B[D]=(B[D]||[]).concat(z[D]);for(var F in w)B[F]=(B[F]||[]).concat(w[F]);var H={},J=function(s){B[s].forEach((function(f){void 0===H[f]&&(H[f]=[]),H[f].push(s)}))};for(var K in B)J(K);function L(s,f){var x="undefined"!=typeof Symbol&&s[Symbol.iterator]||s["@@iterator"];if(!x){if(Array.isArray(s)||(x=function(s,f){if(s){if("string"==typeof s)return P(s,f);var x={}.toString.call(s).slice(8,-1);return"Object"===x&&s.constructor&&(x=s.constructor.name),"Map"===x||"Set"===x?Array.from(s):"Arguments"===x||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(x)?P(s,f):void 0}}(s))||f&&s&&"number"==typeof s.length){x&&(s=x);var d=0,m=function(){};return{s:m,n:function(){return d>=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:m}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var b,o=!0,r=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return o=s.done,s},e:function(s){r=!0,b=s},f:function(){try{o||null==x.return||x.return()}finally{if(r)throw b}}}}function P(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x-1)d=m;else if(b>-1&&-1==m)d=b;else{if(b!=m)return[];d=b}}var o=X(s.from,d),r=X(s.to,d);if(!o.length||!r.length)return[];var h=[];return o.forEach((function(f){r.forEach((function(x){var m=d,b=","+x;if(b.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)&&(m=1),b.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)&&(m=0),f&&x){var o=s.optimal;if((f.match(/&\d+/)||x.match(/&\d+/))&&(o=!0),o){var r=function(s){for(var f=s.from,x=s.to,d=s.sex,m=f.split(","),b=x.split(","),o=0;o+w?m[o]=m[o].replace(/^[xol]b|^s/,"lb").replace(/^[xol]s|^d/,"ls"):+t<+w&&(m[o]=m[o].replace(/^[xol]b|^s/,"ob").replace(/^[xol]s|^d/,"os")),f=m.slice(o).join(","),x=b.slice(o+1).join(","),d=b[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;else if(s.optimal){var M,n;if(t=(null===(M=m[o].match(/([xol])[bs]/))||void 0===M?void 0:M[1])||"",w=(null===(n=b[o].match(/([xol])[bs]/))||void 0===n?void 0:n[1])||"","x"==t||"x"==w){f=m.slice(o+1).join(","),x=b.slice(o+1).join(","),d=m[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;continue}}}break}f=m.slice(o+1).join(","),x=b.slice(o+1).join(","),d=m[o].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0}return{from:f,to:x,sex:d}}({from:f,to:x,sex:d,optimal:s.optimal});f=r.from,x=r.to,d=r.sex}}(x?I(x,d):[""]).forEach((function(s){var x=(s?","+s:"")+(f?","+f:"");h.push({selector:x,sex:m})}))}))})),h}function V(s){var f=[],x={},d=function(s){var m="";if(!x[s]){x[s]=!0;do{m=s;var b,r=L(o);try{for(r.s();!(b=r.n()).done;){var h=b.value;if((s=s.replace(h.exp,h.str)).includes("#"))return s.split("#").forEach(d),!1}}catch(s){r.e(s)}finally{r.f()}}while(m!=s);if(s.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/))return!1;f.push(s)}};return d(s),f}function X(s,f){if(s.match(/^,/)||(s=","+s),f<0)s.match(/^,[w1]/)?f=1:s.match(/^,[h0]/)&&(f=0);else{if(1==f&&s.match(/^,[h0]/))return[];if(0==f&&s.match(/^,[w1]/))return[]}if(f>-1&&!s.includes(",1")&&!s.includes(",0")&&(s=","+f+s),s.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/))return[];var x=V(s).map((function(s){return s.replace(/,[01]/,"").substr(1)}));return C(x)}var Y=function(s){"string"==typeof s&&(s=function(s){var f,x=m(d);try{for(x.s();!(f=x.n()).done;){var b=f.value,o=s.match(b.exp);if(o)return b.opt(o)}}catch(s){x.e(s)}finally{x.f()}return{}}(s));var f=Object.assign({text:"",target:"",sex:-1,type:"default",reverse:!1,mode:"default",optimal:!1},s);!function(s){if(N=Object.assign({},A),s&&O[s])for(var f in O[s])N[f]=[].concat(O[s][f],A[f]||[])}(f.mode);var b=Q(f.text),o=Q(f.target);o.length||(o=[""]);var r=[];return b.forEach((function(s){o.forEach((function(x){R({from:s,to:x,sex:f.sex,optimal:f.optimal}).forEach((function(s){(s?X(s.selector,s.sex):[]).forEach((function(x){var d=[x],m=s.sex;f.reverse&&(d=I(x,m),m=x.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)?1:0),"chain"==f.type?d.forEach((function(f){var x=q(f,s.sex);x&&r.push(x)})):"pair"==f.type?(d=I(x,s.sex)).forEach((function(s){var f=function(s,f){var x=[],d=[],m=[];s=s.replace(/&\d+/g,""),f=f.replace(/&\d+/g,"");var b=s.replace(/([ol])([bs])/g,"x$2"),o=f.replace(/([ol])([bs])/g,"x$2"),r=s.replace(/&[ol]/g,""),h=f.replace(/&[ol]/g,"");for(var l in t){var e=l.split("#");if(e.length>1){var w=X(e[0]),M=X(e[1]),n=w.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")})),a=M.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")}));(w.includes(s)&&M.includes(f)||w.includes(f)&&M.includes(s))&&x.push(t[l][0]),(n.includes(b)&&a.includes(o)||n.includes(o)&&a.includes(b))&&d.push(t[l][0]),(n.includes(r)&&a.includes(h)||n.includes(h)&&a.includes(r))&&m.push(t[l][0])}}return x.length||(x=d),x.length||(x=m),x}(x,s);r=r.concat(f)})):d.forEach((function(s){var f=k(s);f.length||(f=k(m+","+s)),r=r.concat(f)}))}))}))}))})),x(new Set(r))};Y.data=N,Y.dataCount=Object.keys(N).length,Y.setMode=function(s,f){O[s]=Object.assign(O[s]||{},f)};export{Y as default}; +function s(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var e,o=!0,b=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return o=s.done,s},e:function(s){b=!0,e=s},f:function(){try{o||null==x.return||x.return()}finally{if(b)throw e}}}}function m(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x1&&void 0!==arguments[1]?arguments[1]:-1,x=s.split(",").map((function(s){var f=s.replace(/&[ol\d]+/,"");return K[f][0]})).join("的");return f>-1&&K[f+","+s]&&(0==f?x="(女性)"+x:1==f&&(x="(男性)"+x)),x}function Q(s,f){var x=Object.keys(s);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(s);f&&(d=d.filter((function(f){return Object.getOwnPropertyDescriptor(s,f).enumerable}))),x.push.apply(x,d)}return x}function R(s,f){return Object.entries(f).forEach((function(f){var x=t(f,2),d=x[0],r=x[1];s[d]=(s[d]||[]).concat(r)})),s}var V=R(function(s){for(var f=1;f=s.length?{done:!0}:{done:!1,value:s[d++]}},e:function(s){throw s},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var m,e=!0,o=!1;return{s:function(){x=x.call(s)},n:function(){var s=x.next();return e=s.done,s},e:function(s){o=!0,m=s},f:function(){try{e||null==x.return||x.return()}finally{if(o)throw m}}}}function Z(s,f){(null==f||f>s.length)&&(f=s.length);for(var x=0,d=Array(f);x-1)d=m;else if(r>-1&&-1===m)d=r;else{if(r!==m)return[];d=r}}var e=xs(s.from,d),o=xs(s.to,d);if(!e.length||!o.length)return[];var b=[];return e.forEach((function(f){o.forEach((function(x){var r=d,m=","+x;if(m.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)&&(r=1),m.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)&&(r=0),f&&x){var e=s.optimal;if((f.match(/&\d+/)||x.match(/&\d+/))&&(e=!0),e){var o=function(s){for(var f=s.from,x=s.to,d=s.sex,r=f.split(","),m=x.split(","),e=0;e+h?r[e]=r[e].replace(/^[xol]b|^s/,"lb").replace(/^[xol]s|^d/,"ls"):+n<+h&&(r[e]=r[e].replace(/^[xol]b|^s/,"ob").replace(/^[xol]s|^d/,"os")),f=r.slice(e).join(","),x=m.slice(e+1).join(","),d=m[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;else if(s.optimal){var w,M;if(n=(null===(w=r[e].match(/([xol])[bs]/))||void 0===w?void 0:w[1])||"",h=(null===(M=m[e].match(/([xol])[bs]/))||void 0===M?void 0:M[1])||"","x"==n||"x"==h){f=r.slice(e+1).join(","),x=m.slice(e+1).join(","),d=r[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;continue}}}break}f=r.slice(e+1).join(","),x=m.slice(e+1).join(","),d=r[e].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0}return{from:f,to:x,sex:d}}({from:f,to:x,sex:d,optimal:s.optimal});f=o.from,x=o.to,d=o.sex}}(x?B(x,d):[""]).forEach((function(s){var x=(s?","+s:"")+(f?","+f:"");b.push({selector:x,sex:r})}))}))})),b}function fs(s){var f=[],x={},d=function(s){if(!x[s]){x[s]=!0;var r="";do{r=s;var m,o=Y(e);try{for(o.s();!(m=o.n()).done;){var b=m.value;if((s=s.replace(b.exp,b.str)).includes("#"))return s.split("#").forEach(d),!1}}catch(s){o.e(s)}finally{o.f()}}while(r!=s);if(s.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/))return!1;f.push(s)}};return d(s),f}function xs(s,f){if(s.match(/^,/)||(s=","+s),f<0)s.match(/^,[w1]/)?f=1:s.match(/^,[h0]/)&&(f=0);else{if(1==f&&s.match(/^,[h0]/))return[];if(0==f&&s.match(/^,[w1]/))return[]}if(f>-1&&!s.includes(",1")&&!s.includes(",0")&&(s=","+f+s),s.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/))return[];var x=fs(s).map((function(s){return s.replace(/,[01]/,"").substr(1)}));return F(x)}var ds=function(s){"string"==typeof s&&(s=function(s){var f,x=r(d);try{for(x.s();!(f=x.n()).done;){var m=f.value,e=s.match(m.exp);if(e)return m.opt(e)}}catch(s){x.e(s)}finally{x.f()}return{}}(s));var f=Object.assign({text:"",target:"",sex:-1,type:"default",reverse:!1,mode:"default",optimal:!1},s);!function(s){if(U=T({},I),s&&C[s])for(var f in C[s])U[f]=[].concat(C[s][f],I[f]||[])}(f.mode);var m=_(f.text),e=_(f.target);e.length||(e=[""]);var o=m.flatMap((function(s){return e.flatMap((function(x){return ss({from:s,to:x,sex:f.sex,optimal:f.optimal}).flatMap((function(s){return(s?xs(s.selector,s.sex):[]).flatMap((function(x){var d=[x],r=s.sex;return f.reverse&&(d=B(x,r),r=x.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)?1:0),"chain"===f.type?d.map((function(s){return L(s,r)})).filter((function(s){return s})):"pair"===f.type?B(x,s.sex).flatMap((function(s){return function(s,f){s=s.replace(/&\d+/g,""),f=f.replace(/&\d+/g,"");var x=s.replace(/([ol])([bs])/g,"x$2"),d=f.replace(/([ol])([bs])/g,"x$2"),r=s.replace(/&[ol]/g,""),m=f.replace(/&[ol]/g,""),e=[],o=[],b=[];for(var t in M){var l=t.split("#");if(l.length>1){var n=xs(l[0]),h=xs(l[1]),w=n.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")})),a=h.map((function(s){return s.replace(/&[ol\d]+/,"").replace(/([ol])([bs])/,"x$2")}));(n.includes(s)&&h.includes(f)||n.includes(f)&&h.includes(s))&&e.push(M[t][0]),(w.includes(x)&&a.includes(d)||w.includes(d)&&a.includes(x))&&o.push(M[t][0]),(w.includes(r)&&a.includes(m)||w.includes(m)&&a.includes(r))&&b.push(M[t][0])}}return e.length||(e=o),e.length||(e=b),e}(x,s)})):d.flatMap((function(s){var f=J(s);return f.length||(f=J(r+","+s)),f}))}))}))}))}));return x(new Set(o))};ds.data=U,ds.dataCount=Object.keys(U).length,ds.setMode=function(s,f){C[s]=T(T({},C[s]||{}),f)};export{ds as default}; diff --git a/src/module/cache.js b/src/module/cache.js index 2ddecf2..83d20a3 100644 --- a/src/module/cache.js +++ b/src/module/cache.js @@ -5,22 +5,23 @@ import _input from './data/input.js'; import _sort from './data/sort.js'; import {modeData} from './mode.js'; -let _hash = Object.assign({},modeData); -for(let key in _input){ - _hash[key] = (_hash[key]||[]).concat(_input[key]); -} -for(let key in _sort){ - _hash[key] = (_hash[key]||[]).concat(_sort[key]); +function mergeValues(target, source) { + Object.entries(source).forEach(([key, value]) => { + target[key] = (target[key] || []).concat(value); + }); + return target; } +let _hash = mergeValues({...modeData }, _input); +_hash = mergeValues(_hash, _sort); let cacheData = {}; -for(let key in _hash){ - _hash[key].forEach(function(name){ - if(typeof cacheData[name]=='undefined'){ +Object.entries(_hash).forEach(([key, names]) => { + names.forEach((name) => { + if (!cacheData[name]) { cacheData[name] = []; } cacheData[name].push(key); }); -} +}); -export {cacheData}; +export {cacheData}; \ No newline at end of file diff --git a/src/module/id.js b/src/module/id.js index 64756b8..0ed7088 100644 --- a/src/module/id.js +++ b/src/module/id.js @@ -44,12 +44,11 @@ export function reverseId(id,sex){ sex = 0; } } - let doing = function(sex){ - let sid = (','+sex+','+id).replace(/,[fhs]|,[olx]b/g,',1').replace(/,[mwd]|,[olx]s/g,',0'); - sid = sid.substring(0,sid.length-2); - let sid_arr = sid.split(',').reverse(); - let r_id = id.split(',').reverse().map((id,i)=>hash[id][sid_arr[i]]).join(','); - let gen = getGenById(r_id); + const doing = function(sex){ + const sid = (','+sex+','+id).replace(/,[fhs]|,[olx]b/g,',1').replace(/,[mwd]|,[olx]s/g,',0'); + const sid_arr = sid.substring(0,sid.length-2).split(',').reverse(); + const r_id = id.split(',').reverse().map((id,i)=>hash[id][sid_arr[i]]).join(','); + const gen = getGenById(r_id); return r_id + (gen?'':age); }; if(sex<0){ @@ -61,19 +60,19 @@ export function reverseId(id,sex){ // ID列表去重 export function filterId(arr){ - let sameList = arr.filter(item=>item==item.replace(/[ol](?=[s|b])/g,'x').replace(/&[ol]/,'')); - return arr.filter(item=>{ - let temp = item.replace(/[ol](?=[s|b])/g,'x').replace(/&[ol]/,''); + const sameList = arr.filter(item => item === item.replace(/[ol](?=[s|b])/g,'x').replace(/&[ol]/,'')); + return arr.filter(item => { + const temp = item.replace(/[ol](?=[s|b])/g,'x').replace(/&[ol]/,''); return sameList.includes(item)||item!=temp&&!sameList.includes(temp); }).filter((item,idx,arr) => arr.indexOf(item) === idx); }; // 通过ID获取世代数 export function getGenById(id){ - let gMap = {'f':1,'m':1,'s':-1,'d':-1}; + const gMap = {'f':1,'m':1,'s':-1,'d':-1}; let gen = 0; - id.split(',').forEach(function(sub){ - let s = sub.replace(/&[ol\d]+/,''); + id.split(',').forEach(sub => { + const s = sub.replace(/&[ol\d]+/,''); gen += gMap[s]||0; }); return gen; @@ -82,29 +81,26 @@ export function getGenById(id){ // 通过ID获取关系称呼 export function getItemsById(id){ let items = []; - let getData = function(key){ + const getData = function(key){ let ids = []; - let k1 = key.replace(/(,[sd])(,[wh])?$/,'$1&o$2'); - let k2 = key.replace(/(,[sd])(,[wh])?$/,'$1&l$2'); + const k1 = key.replace(/(,[sd])(,[wh])?$/,'$1&o$2'); + const k2 = key.replace(/(,[sd])(,[wh])?$/,'$1&l$2'); if(modeData[k1]&&modeData[k2]){ ids = [k1,k2]; }else if(modeData[key]){ ids = [key]; } - return filterId(ids).map(function(id){ - return modeData[id][0]; - }); + return filterId(ids).map(id => modeData[id][0]); }; // 对排序进行处理 if(id.match(/&([\d]+)(,[hw])?$/)){ - let num = id.match(/&([\d]+)(,[hw])?$/)[1]; - let zh = number2zh(num); + const num = id.match(/&([\d]+)(,[hw])?$/)[1]; + const zh = number2zh(num); id = id.replace(/&\d+/g,''); if(_sort[id]){ - let item = _sort[id][0].replace('几',zh); - items.push(item); + items.push(_sort[id][0].replace('几',zh)); }else if(modeData[id]){ - let gen = getGenById(id); + const gen = getGenById(id); let item = ''; if(gen<3&&!id.match(/[hw],/)){ modeData[id].forEach(function(name){ @@ -145,13 +141,14 @@ export function getItemsById(id){ }; // 通过ID获取关系链 -let data = Object.assign({},modeData,{ - 'xb':['兄弟'], - 'xs':['姐妹'] -}); +let data = { + ...modeData, + 'xb': ['兄弟'], + 'xs': ['姐妹'] +}; export function getChainById(id,sex=-1){ - let item = id.split(',').map(function(sign){ - let key = sign.replace(/&[ol\d]+/,''); + let item = id.split(',').map(sign => { + const key = sign.replace(/&[ol\d]+/,''); return data[key][0]; }).join('的'); if(sex>-1&&data[sex+','+id]){ @@ -166,26 +163,23 @@ export function getChainById(id,sex=-1){ // 通过ID获取关系合称 export function getPairsById(id1,id2){ + id1 = id1.replace(/&\d+/g,''); + id2 = id2.replace(/&\d+/g,''); + const id1_x = id1.replace(/([ol])([bs])/g,'x$2'); + const id2_x = id2.replace(/([ol])([bs])/g,'x$2'); + const id1_r = id1.replace(/&[ol]/g,''); + const id2_r = id2.replace(/&[ol]/g,''); + let result = []; let result_x = []; let result_r = []; - id1 = id1.replace(/&\d+/g,''); - id2 = id2.replace(/&\d+/g,''); - let id1_x = id1.replace(/([ol])([bs])/g,'x$2'); - let id2_x = id2.replace(/([ol])([bs])/g,'x$2'); - let id1_r = id1.replace(/&[ol]/g,''); - let id2_r = id2.replace(/&[ol]/g,''); - for(let key in _pair){ - let selectors = key.split('#'); + for(const key in _pair){ + const selectors = key.split('#'); if(selectors.length>1){ - let list1 = selector2id(selectors[0]); - let list2 = selector2id(selectors[1]); - let list1_r = list1.map(function(selector){ - return selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2'); - }); - let list2_r = list2.map(function(selector){ - return selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2'); - }); + const list1 = selector2id(selectors[0]); + const list2 = selector2id(selectors[1]); + const list1_r = list1.map(selector => selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2')); + const list2_r = list2.map(selector => 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]); } @@ -204,4 +198,4 @@ export function getPairsById(id1,id2){ result = result_r; } return result; -}; +}; \ No newline at end of file diff --git a/src/module/map.js b/src/module/map.js index 71edc2a..138e8ad 100644 --- a/src/module/map.js +++ b/src/module/map.js @@ -8,46 +8,39 @@ import _multipie from './data/multiple.js'; import {expandSelector} from './selector.js'; -let _map = Object.assign({},_multipie); +let _map = { ..._multipie }; // 分支 - 前缀处理 -let prefixMap = {}; -for(let key in _prefix){ +const prefixMap = {}; +for(const key in _prefix){ prefixMap[key] = {}; - for(let selector in _prefix[key]){ + for(const selector in _prefix[key]){ expandSelector(selector).forEach(function(s){ prefixMap[key][s] = _prefix[key][selector]; }); } } // 分支 - 节点处理 -let branchMap = {}; -for(let selector in _branch){ +const branchMap = {}; +for(const selector in _branch){ expandSelector(selector).forEach(function(s){ branchMap[s] = _branch[selector]; }); } // 分支 - 合并 -let getMap = function(prefixMap,branchMap){ - let map = {}; - for(let key in branchMap){ - let tag = key.match(/\{.+?\}/)[0]; - let nameList = branchMap[key]; - for(let k in prefixMap[tag]){ - let prefixList = prefixMap[tag][k]; - let newKey = key.replace(tag,k); - let isFilter = ['h,h','w,w','w,h','h,w'].some(pair=>(newKey.includes(pair))); +const getMap = function(prefixMap,branchMap){ + const map = {}; + for(const key in branchMap){ + const tag = key.match(/\{.+?\}/)[0]; + const nameList = branchMap[key]; + for(const k in prefixMap[tag]){ + const prefixList = prefixMap[tag][k]; + const newKey = key.replace(tag,k); + const isFilter = ['h,h','w,w','w,h','h,w'].some(pair=>(newKey.includes(pair))); if(!isFilter){ - let newList = []; - prefixList.forEach(function(prefix){ - nameList.forEach(function(name){ - if(name.includes('?')){ - newList.push(name.replace('?',prefix)); - }else{ - newList.push(prefix+name); - } - }); - }); + const newList = prefixList.flatMap((prefix) => + nameList.map((name) => (name.includes('?') ? name.replace('?', prefix) : prefix + name)) + ); if(!map[newKey]){ map[newKey] = _map[newKey]||[]; } @@ -57,11 +50,11 @@ let getMap = function(prefixMap,branchMap){ } return map; }; -_map = Object.assign({},_map,getMap(prefixMap,branchMap)); +_map = {..._map,...getMap(prefixMap,branchMap)}; // 主要关系 for(let key in _main){ - _map[key] = [].concat(_main[key],_map[key]||[]); + _map[key] = [..._main[key], ...(_map[key] || [])]; } // 版权彩蛋 @@ -72,10 +65,10 @@ const mateMap = { 'w':['妻','内','岳','岳家','丈人'], 'h':['夫','外','公','婆家','婆婆'], }; -let nameSet = new Set(Object.values(_map).flat()); -for(let key in _map){ +const nameSet = new Set(Object.values(_map).flat()); +for(const key in _map){ if(key.match(/^[fm]/)||key.match(/^[olx][bs]$|^[olx][bs],[^mf]/)){ // 只对长辈或者兄弟辈匹配 - for(let k in mateMap){ + for(const k in mateMap){ let newKey = k+','+key; if(key.match(/[fm]/)){ let newKey_x = newKey.replace(/,[ol]([sb])(,[wh])?$/,',x$1$2').replace(/(,[sd])&[ol](,[wh])?$/,'$1$2'); @@ -86,11 +79,11 @@ for(let key in _map){ if(!_map[newKey]){ _map[newKey] = []; } - let prefixList = mateMap[k]; - let nameList = _map[key]; + const prefixList = mateMap[k]; + const nameList = _map[key]; prefixList.forEach(function(prefix){ nameList.forEach(function(name){ - let newName = prefix+name; + const newName = prefix+name; if(!nameSet.has(newName)){ // 配偶组合的称呼不得与原有称呼冲突(如:妻舅!=妻子的舅舅;外舅公!=老公的舅公) _map[newKey].push(newName); } diff --git a/src/module/mode.js b/src/module/mode.js index ffbc78d..31c18df 100644 --- a/src/module/mode.js +++ b/src/module/mode.js @@ -4,22 +4,22 @@ import _map from './map.js'; let _mode = {}; // 模式缓存 -let modeData = Object.assign({},_map); // 最终数据 +let modeData = { ..._map }; // 最终数据 // 设置模式数据 export function setModeData(sign,data){ - _mode[sign] = Object.assign(_mode[sign]||{},data); + _mode[sign] = { ...(_mode[sign] || {}), ...data }; }; // 获取模式数据 export function getModeData(sign){ - modeData = Object.assign({},_map); + modeData = { ..._map }; if(sign&&_mode[sign]){ - for(let key in _mode[sign]){ + for(const key in _mode[sign]){ modeData[key] = [].concat(_mode[sign][key],_map[key]||[]); } } return modeData; }; -export {modeData}; +export {modeData}; \ No newline at end of file diff --git a/src/module/options.js b/src/module/options.js index 507cd80..44342ee 100644 --- a/src/module/options.js +++ b/src/module/options.js @@ -4,8 +4,8 @@ import _expression from './rule/expression.js'; export function getOptions(text){ - for(let item of _expression){ - let match = text.match(item['exp']); + for(const item of _expression){ + const match = text.match(item['exp']); if(match){ return item['opt'](match); } diff --git a/src/module/selector.js b/src/module/selector.js index d4f4db7..161deb6 100644 --- a/src/module/selector.js +++ b/src/module/selector.js @@ -10,7 +10,7 @@ import {reverseId,filterId,getGenById} from './id.js'; import {cacheData} from './cache.js'; // 获得最简 -let getOptimal = function(options){ +const getOptimal = function(options){ let { from, to, @@ -81,18 +81,18 @@ export function getSelectors(str){ str = str.replace(/(伯|叔)+(父|母)?家的?(哥|姐|弟|妹)+/,'堂$3').replace(/(伯|叔)+(父|母)?家的?/,'堂'); str = str.replace(/姨+(爸|父|丈|妈|母)?家的?(哥|姐|弟|妹)+/,'姨$2').replace(/姨+(爸|父|丈|妈|母)?家的?/,'姨'); - let lists = str.split('的'); + const lists = str.split('的'); let result = []; let isMatch = true; while(lists.length){ - let name = lists.shift(); //当前匹配词 + const name = lists.shift(); //当前匹配词 let items = []; //当前匹配词可能性 - let keywords = [name]; + const keywords = [name]; let getList = function(name){ // 词义扩展 _replace.forEach(item => { item['arr'].forEach(word =>{ - let name1 = name.replace(item['exp'],word); + const name1 = name.replace(item['exp'],word); if(name1!=name){ keywords.push(name1); getList(name1); @@ -100,9 +100,9 @@ export function getSelectors(str){ }); }); // 同义词替换 - for(let word in _similar){ - let name1 = name.replace(word,_similar[word]); - let name2 = name.replace(_similar[word],word); + for(const word in _similar){ + const name1 = name.replace(word,_similar[word]); + const name2 = name.replace(_similar[word],word); if(name1!=name){ keywords.push(name1); } @@ -113,19 +113,19 @@ export function getSelectors(str){ }; getList(name); // 通过关键词找关系 - let items_map = [[],[],[]]; + const items_map = [[],[],[]]; keywords.forEach(function(name){ name = name.replace(/^[尕幺细满碎晚末尾幼]/,'小'); - let match = name.match(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/); + const match = name.match(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/); if(match){ // 匹配排序 - let x_name = name.replace(match[0],'几'); - let r_name = name.replace(match[0],''); - let num = zh2number(match[0]); - [x_name,r_name,name].forEach(function(name,index){ - let ids = cacheData[name]; + const x_name = name.replace(match[0],'几'); + const r_name = name.replace(match[0],''); + const num = zh2number(match[0]); + [x_name,r_name,name].forEach((name, index) => { + const ids = cacheData[name]; if(ids&&ids.length){ - ids.forEach(function(i){ - let id = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num); + ids.forEach(i => { + const id = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num); if(!i.match(/^[mf,]+$/)&&!name.match(/^[从世]/)){ // 直系祖辈不参与排序 items_map[index].push(id); } @@ -146,7 +146,7 @@ export function getSelectors(str){ if(!items.length){ isMatch = false; } - let res = []; + const res = []; if(!result.length){ result = ['']; } @@ -168,25 +168,15 @@ export function mergeSelector(param){ sex:my_sex } = param; if(my_sex<0){ - let to_sex = -1; - let from_sex = -1; - if(from_selector.match(/^,[w1]/)){ - from_sex = 1; - }else if(from_selector.match(/^,[h0]/)){ - from_sex = 0; - } - if(to_selector.match(/^,[w1]/)){ - to_sex = 1; - }else if(to_selector.match(/^,[h0]/)){ - to_sex = 0; - } - if(from_sex==-1&&to_sex>-1){ - my_sex = to_sex; - }else if(from_sex>-1&&to_sex==-1){ - my_sex = from_sex; - }else if(from_sex==to_sex){ - my_sex = from_sex; - }else{ + const fromSex = from_selector.match(/^,[w1]/) ? 1 : from_selector.match(/^,[h0]/) ? 0 : -1; + const toSex = to_selector.match(/^,[w1]/) ? 1 : to_selector.match(/^,[h0]/) ? 0 : -1; + if (fromSex === -1 && toSex > -1) { + my_sex = toSex; + } else if (fromSex > -1 && toSex === -1) { + my_sex = fromSex; + } else if (fromSex === toSex) { + my_sex = fromSex; + } else { return []; } } @@ -195,9 +185,9 @@ export function mergeSelector(param){ if(!from_ids.length||!to_ids.length){ return []; } - let result = []; - from_ids.forEach(function(from){ - to_ids.forEach(function(to){ + const result = []; + from_ids.forEach(from => { + to_ids.forEach(to => { let sex = my_sex; let selector = ','+to; if(selector.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)){ @@ -239,15 +229,15 @@ export function mergeSelector(param){ // 扩展选择器 export function expandSelector(selector){ - let result = []; - let hash = {}; - let getSelector = function(selector){ - let s=''; + const result = []; + const hash = {}; + const getSelector = function(selector){ if(!hash[selector]){ hash[selector] = true; + let s=''; do{ s = selector; - for(let item of _filter){ + for(const item of _filter){ // console.log('[filter]',item['exp'],selector); selector = selector.replace(item['exp'],item['str']); if(selector.includes('#')){ @@ -289,8 +279,6 @@ export function selector2id(selector,sex){ if(selector.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/)){ //同志关系去除 return []; } - let result = expandSelector(selector).map(function(selector){ - return selector.replace(/,[01]/,'').substr(1); //去前面逗号和性别信息 - }); + const result = expandSelector(selector).map(selector => selector.replace(/,[01]/, '').substr(1)); //去前面逗号和性别信息 return filterId(result); -}; +}; \ No newline at end of file diff --git a/src/relationship.js b/src/relationship.js index 781322b..6be94fd 100644 --- a/src/relationship.js +++ b/src/relationship.js @@ -4,44 +4,39 @@ import {reverseId,getItemsById,getChainById,getPairsById} from './module/id.js'; import {setModeData,getModeData,modeData} from './module/mode.js'; // 对外方法 -let relationship = function (parameter){ +let relationship = function (parameter) { if(typeof parameter =='string'){ parameter = getOptions(parameter); } let options = Object.assign({ - text:'', // 目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔 - target:'', // 相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己 - sex:-1, // 本人性别:0表示女性,1表示男性 - type:'default', // 转换类型:'default'计算称谓,'chain'计算关系链,'pair'计算关系合称 - reverse:false, // 称呼方式:true对方称呼我,false我称呼对方 - mode:'default', // 模式选择:使用setMode方法定制不同地区模式,在此选择自定义模式 - optimal:false // 最短关系:计算两者之间的最短关系 - },parameter); + text: '', // 目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔 + target: '', // 相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己 + sex: -1, // 本人性别:0表示女性,1表示男性 + type: 'default', // 转换类型:'default'计算称谓,'chain'计算关系链,'pair'计算关系合称 + reverse: false, // 称呼方式:true对方称呼我,false我称呼对方 + mode: 'default', // 模式选择:使用setMode方法定制不同地区模式,在此选择自定义模式 + optimal: false // 最短关系:计算两者之间的最短关系 + }, parameter); // 切换模式 getModeData(options.mode); - - let from_selectors = getSelectors(options.text); - let to_selectors = getSelectors(options.target); - if(!to_selectors.length){ - to_selectors = ['']; + let fromSelectors = getSelectors(options.text); + let toSelectors = getSelectors(options.target); + if (!toSelectors.length) { + toSelectors = ['']; } - let result = []; //匹配结果 - // console.log('[selectors]',from_selectors,to_selectors); - from_selectors.forEach(function(from_selector){ - to_selectors.forEach(function(to_selector){ - mergeSelector({ - from:from_selector, - to:to_selector, - sex:options.sex, - optimal:options.optimal - }).forEach(function(data){ - // console.log('[data]',from_selector,to_selector,options.optimal,data); - let ids = data?selector2id(data['selector'],data['sex']):[]; - // console.log('[ids]',data['selector'],data['sex'],ids); - ids.forEach(function(id){ + const result = fromSelectors.flatMap(fromSelector => { + return toSelectors.flatMap(toSelector => { + return mergeSelector({ + from: fromSelector, + to: toSelector, + sex: options.sex, + optimal: options.optimal + }).flatMap(data => { + const ids = data ? selector2id(data['selector'], data['sex']) : []; + return ids.flatMap(id => { let temps = [id]; let sex = data['sex']; - if(options.reverse){ + if (options.reverse) { temps = reverseId(id,sex); if(id.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)){ sex = 1; @@ -49,33 +44,25 @@ let relationship = function (parameter){ sex = 0; } } - if(options.type=='chain'){ - temps.forEach(function(id){ - let 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){ - let pairs = getPairsById(id,r_id); - result = result.concat(pairs); - }); - }else{ - temps.forEach(function(id){ + if (options.type === 'chain') { + return temps.map(id => getChainById(id, sex)).filter(item => item); + } else if (options.type === 'pair') { + const reversedTemps = reverseId(id, data['sex']); + return reversedTemps.flatMap(rId => getPairsById(id, rId)); + } else { + return temps.flatMap(id => { let items = getItemsById(id); - if(!items.length){ - items = getItemsById(sex+','+id); + if (!items.length) { + items = getItemsById(sex + ',' + id); } - result = result.concat(items); + return items; }); } }); }); }); }); - // console.log('[result]',result); + return [...new Set(result)]; }; @@ -86,4 +73,4 @@ relationship.dataCount = Object.keys(modeData).length; // 设置语言模式 relationship.setMode = setModeData; -export default relationship; +export default relationship; \ No newline at end of file