Compare commits

..

No commits in common. "master" and "v1.2.0" have entirely different histories.

69 changed files with 11832 additions and 7475 deletions

13
.github/FUNDING.yml vendored Normal file
View File

@ -0,0 +1,13 @@
# These are supported funding model platforms
github: [mumuy]# Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View File

@ -1,28 +0,0 @@
name: Project Build Test
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20.x, 22.x]
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Build
run: |
npm install
npm run build

16
.travis.yml Normal file
View File

@ -0,0 +1,16 @@
language: node_js
node_js:
- "6.2.0"
- "5.6.0"
- "4.4.4"
install:
- npm install
script:
- npm run build
branches:
only:
- gh-pages

View File

@ -1,6 +0,0 @@
module.exports = {
presets: ['@babel/preset-env'],
plugins: [
'@babel/plugin-transform-runtime'
]
}

View File

@ -1 +0,0 @@
!function(f,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s():"function"==typeof define&&define.amd?define(s):(f="undefined"!=typeof globalThis?globalThis:f||self).relationshipMode=s()}(this,(function(){"use strict";function f(s){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(f){return typeof f}:function(f){return f&&"function"==typeof Symbol&&f.constructor===Symbol&&f!==Symbol.prototype?"symbol":typeof f},f(s)}function s(s){var m=function(s,m){if("object"!=f(s)||!s)return s;var o=s[Symbol.toPrimitive];if(void 0!==o){var d=o.call(s,m||"default");if("object"!=f(d))return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===m?String:Number)(s)}(s,"string");return"symbol"==f(m)?m:m+""}function m(f,m,o){return(m=s(m))in f?Object.defineProperty(f,m,{value:o,enumerable:!0,configurable:!0,writable:!0}):f[m]=o,f}var o;return{guangdong:{name:"廣東",data:(o={f:["老竇"],"f,f":["阿爺"],"f,f,f":["太公"],"f,f,m":["太婆"],"f,m":["阿嫲"],"f,m,f":["太外公"],"f,m,m":["太外婆"],"f,ob":["伯伯"],"f,ob,w":["伯娘"],"f,lb":["阿叔"],"f,lb,w":["阿嬸"],"0,f,xb,d,s":["堂姨甥"],"1,f,xb,d,s":["堂外甥"],"0,f,xb,d,d":["堂姨甥女"],"1,f,xb,d,d":["堂外甥女"],"f,os":["姑母"],"f,ls":["姑姐"],"f,xs,h":["姑丈"],"0,f,xs,d,s":["姑表姨甥"],"1,f,xs,d,s":["姑表外甥"],"0,f,xs,d,d":["姑表姨甥女"],"1,f,xs,d,d":["姑表外甥女"],m:["老母"],"m,f":["阿公"],"m,f,f":["外太公"],"m,f,m":["外太婆"],"m,m":["阿婆"],"m,m,f":["外太外公"],"m,m,m":["外太外婆"],"m,ob":["舅父"],"m,lb":["舅仔"],"m,xb,w":["舅母"],"0,m,xb,d,s":["舅表姨甥"],"1,m,xb,d,s":["舅表外甥"],"0,m,xb,d,d":["舅表姨甥女"],"1,m,xb,d,d":["舅表外甥女"],"m,os":["姨媽"],"m,ls":["姨仔"],"m,xs,h":["姨丈"]},m(m(m(m(m(m(m(m(m(m(o,"0,m,xb,d,s",["姨姨甥"]),"1,m,xb,d,s",["姨外甥"]),"0,m,xb,d,d",["姨姨甥女"]),"1,m,xb,d,d",["姨外甥女"]),"ob",["大佬"]),"ob,w",["阿嫂"]),"lb",["細佬"]),"lb,w",["弟婦"]),"xb,s",["侄"]),"xb,d",["侄女"]),m(m(m(m(m(m(m(m(m(m(o,"os",["家姐"]),"os,h",["姐夫"]),"ls",["阿妹"]),"ls,h",["妹夫"]),"0,xs,s",["姨甥"]),"1,xs,s",["外甥"]),"0,xs,d",["姨甥女"]),"1,xs,d",["外甥女"]),"s",["仔"]),"s,w",["新婦"]),m(m(m(m(m(m(m(m(m(m(o,"s,s",["孫"]),"s,s,w",["孫新婦"]),"s,s,s",["息仔"]),"s,s,d",["息女"]),"s,d",["孫女"]),"s,d,h",["孫女婿"]),"s,d,s",["外息仔"]),"s,d,d",["外息女"]),"d",["女"]),"d,s",["外孫"]),m(m(m(m(m(m(m(o,"d,s,w",["外孫新婦"]),"d,s,s",["外息仔"]),"d,s,d",["外息女"]),"d,d",["外孫女"]),"d,d,h",["外孫女婿"]),"d,d,s",["外息仔"]),"d,d,d",["外息女"]))},north:{name:"北方",data:{"m,m":["姥姥"],"m,m,xs":["姨姥姥"],"m,m,xs,h":["姨姥爺"],"m,m,xb":["舅姥爺"],"m,m,xb,w":["舅姥姥"],"m,f":["姥爺"],"m,f,xs":["姑姥姥"],"m,f,xs,h":["姑姥爺"],"m,f,ob":["大姥爺"],"m,f,ob,w":["大姥姥"],"m,f,lb":["小姥爺"],"m,f,lb,w":["小姥姥"],"f,ob":["大爺"],"f,ob,w":["大娘"]}}}}));

View File

@ -1 +0,0 @@
function m(s){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(m){return typeof m}:function(m){return m&&"function"==typeof Symbol&&m.constructor===Symbol&&m!==Symbol.prototype?"symbol":typeof m},m(s)}function s(s){var f=function(s,f){if("object"!=m(s)||!s)return s;var d=s[Symbol.toPrimitive];if(void 0!==d){var o=d.call(s,f||"default");if("object"!=m(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===f?String:Number)(s)}(s,"string");return"symbol"==m(f)?f:f+""}function f(m,f,d){return(f=s(f))in m?Object.defineProperty(m,f,{value:d,enumerable:!0,configurable:!0,writable:!0}):m[f]=d,m}var d,o={guangdong:{name:"廣東",data:(d={f:["老竇"],"f,f":["阿爺"],"f,f,f":["太公"],"f,f,m":["太婆"],"f,m":["阿嫲"],"f,m,f":["太外公"],"f,m,m":["太外婆"],"f,ob":["伯伯"],"f,ob,w":["伯娘"],"f,lb":["阿叔"],"f,lb,w":["阿嬸"],"0,f,xb,d,s":["堂姨甥"],"1,f,xb,d,s":["堂外甥"],"0,f,xb,d,d":["堂姨甥女"],"1,f,xb,d,d":["堂外甥女"],"f,os":["姑母"],"f,ls":["姑姐"],"f,xs,h":["姑丈"],"0,f,xs,d,s":["姑表姨甥"],"1,f,xs,d,s":["姑表外甥"],"0,f,xs,d,d":["姑表姨甥女"],"1,f,xs,d,d":["姑表外甥女"],m:["老母"],"m,f":["阿公"],"m,f,f":["外太公"],"m,f,m":["外太婆"],"m,m":["阿婆"],"m,m,f":["外太外公"],"m,m,m":["外太外婆"],"m,ob":["舅父"],"m,lb":["舅仔"],"m,xb,w":["舅母"],"0,m,xb,d,s":["舅表姨甥"],"1,m,xb,d,s":["舅表外甥"],"0,m,xb,d,d":["舅表姨甥女"],"1,m,xb,d,d":["舅表外甥女"],"m,os":["姨媽"],"m,ls":["姨仔"],"m,xs,h":["姨丈"]},f(f(f(f(f(f(f(f(f(f(d,"0,m,xb,d,s",["姨姨甥"]),"1,m,xb,d,s",["姨外甥"]),"0,m,xb,d,d",["姨姨甥女"]),"1,m,xb,d,d",["姨外甥女"]),"ob",["大佬"]),"ob,w",["阿嫂"]),"lb",["細佬"]),"lb,w",["弟婦"]),"xb,s",["侄"]),"xb,d",["侄女"]),f(f(f(f(f(f(f(f(f(f(d,"os",["家姐"]),"os,h",["姐夫"]),"ls",["阿妹"]),"ls,h",["妹夫"]),"0,xs,s",["姨甥"]),"1,xs,s",["外甥"]),"0,xs,d",["姨甥女"]),"1,xs,d",["外甥女"]),"s",["仔"]),"s,w",["新婦"]),f(f(f(f(f(f(f(f(f(f(d,"s,s",["孫"]),"s,s,w",["孫新婦"]),"s,s,s",["息仔"]),"s,s,d",["息女"]),"s,d",["孫女"]),"s,d,h",["孫女婿"]),"s,d,s",["外息仔"]),"s,d,d",["外息女"]),"d",["女"]),"d,s",["外孫"]),f(f(f(f(f(f(f(d,"d,s,w",["外孫新婦"]),"d,s,s",["外息仔"]),"d,s,d",["外息女"]),"d,d",["外孫女"]),"d,d,h",["外孫女婿"]),"d,d,s",["外息仔"]),"d,d,d",["外息女"]))},north:{name:"北方",data:{"m,m":["姥姥"],"m,m,xs":["姨姥姥"],"m,m,xs,h":["姨姥爺"],"m,m,xb":["舅姥爺"],"m,m,xb,w":["舅姥姥"],"m,f":["姥爺"],"m,f,xs":["姑姥姥"],"m,f,xs,h":["姑姥爺"],"m,f,ob":["大姥爺"],"m,f,ob,w":["大姥姥"],"m,f,lb":["小姥爺"],"m,f,lb,w":["小姥姥"],"f,ob":["大爺"],"f,ob,w":["大娘"]}}};export{o as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
!function(f,s){"object"==typeof exports&&"undefined"!=typeof module?module.exports=s():"function"==typeof define&&define.amd?define(s):(f="undefined"!=typeof globalThis?globalThis:f||self).relationshipMode=s()}(this,(function(){"use strict";function f(s){return f="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(f){return typeof f}:function(f){return f&&"function"==typeof Symbol&&f.constructor===Symbol&&f!==Symbol.prototype?"symbol":typeof f},f(s)}function s(s){var m=function(s,m){if("object"!=f(s)||!s)return s;var o=s[Symbol.toPrimitive];if(void 0!==o){var d=o.call(s,m||"default");if("object"!=f(d))return d;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===m?String:Number)(s)}(s,"string");return"symbol"==f(m)?m:m+""}function m(f,m,o){return(m=s(m))in f?Object.defineProperty(f,m,{value:o,enumerable:!0,configurable:!0,writable:!0}):f[m]=o,f}var o;return{guangdong:{name:"广东",data:(o={f:["老窦"],"f,f":["阿爷"],"f,f,f":["太公"],"f,f,m":["太婆"],"f,m":["阿嫲"],"f,m,f":["太外公"],"f,m,m":["太外婆"],"f,ob":["伯伯"],"f,ob,w":["伯娘"],"f,lb":["阿叔"],"f,lb,w":["阿婶"],"0,f,xb,d,s":["堂姨甥"],"1,f,xb,d,s":["堂外甥"],"0,f,xb,d,d":["堂姨甥女"],"1,f,xb,d,d":["堂外甥女"],"f,os":["姑母"],"f,ls":["姑姐"],"f,xs,h":["姑丈"],"0,f,xs,d,s":["姑表姨甥"],"1,f,xs,d,s":["姑表外甥"],"0,f,xs,d,d":["姑表姨甥女"],"1,f,xs,d,d":["姑表外甥女"],m:["老母"],"m,f":["阿公"],"m,f,f":["外太公"],"m,f,m":["外太婆"],"m,m":["阿婆"],"m,m,f":["外太外公"],"m,m,m":["外太外婆"],"m,ob":["舅父"],"m,lb":["舅仔"],"m,xb,w":["舅母"],"0,m,xb,d,s":["舅表姨甥"],"1,m,xb,d,s":["舅表外甥"],"0,m,xb,d,d":["舅表姨甥女"],"1,m,xb,d,d":["舅表外甥女"],"m,os":["姨妈"],"m,ls":["姨仔"],"m,xs,h":["姨丈"]},m(m(m(m(m(m(m(m(m(m(o,"0,m,xb,d,s",["姨姨甥"]),"1,m,xb,d,s",["姨外甥"]),"0,m,xb,d,d",["姨姨甥女"]),"1,m,xb,d,d",["姨外甥女"]),"ob",["大佬"]),"ob,w",["阿嫂"]),"lb",["细佬"]),"lb,w",["弟妇"]),"xb,s",["侄"]),"xb,d",["侄女"]),m(m(m(m(m(m(m(m(m(m(o,"os",["家姐"]),"os,h",["姐夫"]),"ls",["阿妹"]),"ls,h",["妹夫"]),"0,xs,s",["姨甥"]),"1,xs,s",["外甥"]),"0,xs,d",["姨甥女"]),"1,xs,d",["外甥女"]),"s",["仔"]),"s,w",["新妇"]),m(m(m(m(m(m(m(m(m(m(o,"s,s",["孙"]),"s,s,w",["孙新妇"]),"s,s,s",["息仔"]),"s,s,d",["息女"]),"s,d",["孙女"]),"s,d,h",["孙女婿"]),"s,d,s",["外息仔"]),"s,d,d",["外息女"]),"d",["女"]),"d,s",["外孙"]),m(m(m(m(m(m(m(o,"d,s,w",["外孙新妇"]),"d,s,s",["外息仔"]),"d,s,d",["外息女"]),"d,d",["外孙女"]),"d,d,h",["外孙女婿"]),"d,d,s",["外息仔"]),"d,d,d",["外息女"]))},north:{name:"北方",data:{"m,m":["姥姥"],"m,m,xs":["姨姥姥"],"m,m,xs,h":["姨姥爷"],"m,m,xb":["舅姥爷"],"m,m,xb,w":["舅姥姥"],"m,f":["姥爷"],"m,f,xs":["姑姥姥"],"m,f,xs,h":["姑姥爷"],"m,f,ob":["大姥爷"],"m,f,ob,w":["大姥姥"],"m,f,lb":["小姥爷"],"m,f,lb,w":["小姥姥"],"f,ob":["大爷"],"f,ob,w":["大娘"]}}}}));

View File

@ -1 +0,0 @@
function m(s){return m="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(m){return typeof m}:function(m){return m&&"function"==typeof Symbol&&m.constructor===Symbol&&m!==Symbol.prototype?"symbol":typeof m},m(s)}function s(s){var f=function(s,f){if("object"!=m(s)||!s)return s;var d=s[Symbol.toPrimitive];if(void 0!==d){var o=d.call(s,f||"default");if("object"!=m(o))return o;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===f?String:Number)(s)}(s,"string");return"symbol"==m(f)?f:f+""}function f(m,f,d){return(f=s(f))in m?Object.defineProperty(m,f,{value:d,enumerable:!0,configurable:!0,writable:!0}):m[f]=d,m}var d,o={guangdong:{name:"广东",data:(d={f:["老窦"],"f,f":["阿爷"],"f,f,f":["太公"],"f,f,m":["太婆"],"f,m":["阿嫲"],"f,m,f":["太外公"],"f,m,m":["太外婆"],"f,ob":["伯伯"],"f,ob,w":["伯娘"],"f,lb":["阿叔"],"f,lb,w":["阿婶"],"0,f,xb,d,s":["堂姨甥"],"1,f,xb,d,s":["堂外甥"],"0,f,xb,d,d":["堂姨甥女"],"1,f,xb,d,d":["堂外甥女"],"f,os":["姑母"],"f,ls":["姑姐"],"f,xs,h":["姑丈"],"0,f,xs,d,s":["姑表姨甥"],"1,f,xs,d,s":["姑表外甥"],"0,f,xs,d,d":["姑表姨甥女"],"1,f,xs,d,d":["姑表外甥女"],m:["老母"],"m,f":["阿公"],"m,f,f":["外太公"],"m,f,m":["外太婆"],"m,m":["阿婆"],"m,m,f":["外太外公"],"m,m,m":["外太外婆"],"m,ob":["舅父"],"m,lb":["舅仔"],"m,xb,w":["舅母"],"0,m,xb,d,s":["舅表姨甥"],"1,m,xb,d,s":["舅表外甥"],"0,m,xb,d,d":["舅表姨甥女"],"1,m,xb,d,d":["舅表外甥女"],"m,os":["姨妈"],"m,ls":["姨仔"],"m,xs,h":["姨丈"]},f(f(f(f(f(f(f(f(f(f(d,"0,m,xb,d,s",["姨姨甥"]),"1,m,xb,d,s",["姨外甥"]),"0,m,xb,d,d",["姨姨甥女"]),"1,m,xb,d,d",["姨外甥女"]),"ob",["大佬"]),"ob,w",["阿嫂"]),"lb",["细佬"]),"lb,w",["弟妇"]),"xb,s",["侄"]),"xb,d",["侄女"]),f(f(f(f(f(f(f(f(f(f(d,"os",["家姐"]),"os,h",["姐夫"]),"ls",["阿妹"]),"ls,h",["妹夫"]),"0,xs,s",["姨甥"]),"1,xs,s",["外甥"]),"0,xs,d",["姨甥女"]),"1,xs,d",["外甥女"]),"s",["仔"]),"s,w",["新妇"]),f(f(f(f(f(f(f(f(f(f(d,"s,s",["孙"]),"s,s,w",["孙新妇"]),"s,s,s",["息仔"]),"s,s,d",["息女"]),"s,d",["孙女"]),"s,d,h",["孙女婿"]),"s,d,s",["外息仔"]),"s,d,d",["外息女"]),"d",["女"]),"d,s",["外孙"]),f(f(f(f(f(f(f(d,"d,s,w",["外孙新妇"]),"d,s,s",["外息仔"]),"d,s,d",["外息女"]),"d,d",["外孙女"]),"d,d,h",["外孙女婿"]),"d,d,s",["外息仔"]),"d,d,d",["外息女"]))},north:{name:"北方",data:{"m,m":["姥姥"],"m,m,xs":["姨姥姥"],"m,m,xs,h":["姨姥爷"],"m,m,xb":["舅姥爷"],"m,m,xb,w":["舅姥姥"],"m,f":["姥爷"],"m,f,xs":["姑姥姥"],"m,f,xs,h":["姑姥爷"],"m,f,ob":["大姥爷"],"m,f,ob,w":["大姥姥"],"m,f,lb":["小姥爷"],"m,f,lb,w":["小姥姥"],"f,ob":["大爷"],"f,ob,w":["大娘"]}}};export{o as default};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

13
dist/relationship.zh-HK.min.js vendored Normal file

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

View File

@ -1,25 +1,16 @@
const fs = require('fs');
const gulp = require('gulp');
const rename = require("gulp-rename");
const cht = require('gulp-cht');
const replace = require('gulp-replace');
gulp.task('localization', () => {
gulp.task('mini', () => {
// gulp.src('./index.html')
// .pipe(cht())
// .pipe(rename("zh-HK.html"))
// .pipe(gulp.dest("./"));
return gulp.src([
'dist/relationship.min.js',
'dist/relationship.min.mjs',
'dist/relationship-mode.min.js',
'dist/relationship-mode.min.mjs',
]).pipe(cht())
.pipe(replace('嶽','岳'))
.pipe(rename(function(path) {
path.basename = path.basename.replace('.min','.zh-HK.min');
}))
.pipe(gulp.dest('dist/lang/'))
return gulp.src('dist/relationship.min.js')
.pipe(cht())
.pipe(rename("relationship.zh-HK.min.js"))
.pipe(gulp.dest('dist/'))
});
gulp.task('default', gulp.series(['localization']))

1560
index.html

File diff suppressed because it is too large Load Diff

12179
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
{
"name": "relationship.js",
"version": "1.2.7",
"version": "1.2.0",
"summary": "relationship.js is a javascript library for chinese family relationship. 中国家庭亲戚称谓计算器,家庭关系、亲戚关系算法。",
"description": "Chinese kinship library",
"author": "HaoLe Zheng",
"license": "MIT",
@ -9,34 +10,11 @@
"relationship.js",
"chinese",
"family",
"kinship",
"relationship",
"家庭亲戚称谓",
"亲戚关系算法"
],
"main": "./dist/relationship.min.js",
"module": "./dist/relationship.min.mjs",
"exports": {
".": {
"import": "./dist/relationship.min.mjs",
"require": "./dist/relationship.min.js",
"default": "./dist/relationship.min.js"
},
"./mode": {
"import": "./dist/relationship-mode.min.mjs",
"require": "./dist/relationship-mode.min.js",
"default": "./dist/relationship-mode.min.js"
},
"./zh-HK": {
"import": "./dist/lang/relationship.zh-HK.min.mjs",
"require": "./dist/lang/relationship.zh-HK.min.js",
"default": "./dist/lang/relationship.zh-HK.min.js"
},
"./zh-HK/mode": {
"import": "./dist/lang/relationship-mode.zh-HK.min.mjs",
"require": "./dist/lang/relationship-mode.zh-HK.min.js",
"default": "./dist/lang/relationship-mode.zh-HK.min.js"
}
},
"main": "dist/relationship.min.js",
"repository": {
"type": "git",
"url": "git+https://github.com/mumuy/relationship.git"
@ -44,34 +22,17 @@
"bugs": {
"url": "https://github.com/mumuy/relationship/issues"
},
"engines": {
"node": ">=20",
"yarn": "please-use-npm",
"npm": ">=8"
},
"files": [
"dist"
],
"devDependencies": {
"@babel/core": "^7.26.0",
"@babel/plugin-transform-runtime": "^7.25.9",
"@babel/preset-env": "^7.26.0",
"@babel/runtime": "^7.26.0",
"@rollup/plugin-babel": "^6.0.4",
"@rollup/plugin-node-resolve": "^15.3.0",
"@rollup/plugin-terser": "^0.4.4",
"gulp": "^5.0.0",
"gulp": "^4.0.2",
"gulp-cht": "^2.0.20",
"gulp-rename": "^2.0.0",
"gulp-replace": "^1.1.4",
"rollup": "^3.29.5",
"tape": "^5.9.0",
"through2": "^4.0.2"
"tape": "^5.3.1",
"webpack": "^5.74.0",
"webpack-cli": "^4.10.0"
},
"scripts": {
"test": "node test/index.js",
"build": "rollup -c && gulp && npm run test",
"watch": "rollup -wc"
"build": "webpack && gulp mini && npm run test"
},
"homepage": "https://passer-by.com/relationship/",
"directories": {

131
readme.md
View File

@ -1,115 +1,90 @@
![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/mumuy/relationship/test.yml)
[![Build Status](https://travis-ci.org/mumuy/relationship.svg?branch=gh-pages)](https://travis-ci.org/mumuy/relationship/)
由于工作生活节奏不同,如今很多关系稍疏远的亲戚之间来往并不多。因此放假回家过年时,往往会搞不清楚哪位亲戚应该喊什么称呼,很是尴尬。然而搞不清亲戚关系和亲戚称谓的不仅是小孩,就连年轻一代的大人也都常常模糊混乱。
“中国家庭称谓计算器”为你避免了这种尴尬,只需简单的输入即可算出称谓。输入框兼容了不同的叫法,你可以称呼父亲为:“老爸”、“爹地”、“老爷子”等等,方便不同地域的习惯叫法。快捷输入按键,只需简单的点击即可完成关系输入,算法还支持逆向查找称呼哦~!
项目演示地址:[https://passer-by.com/relationship/](https://passer-by.com/relationship/)
移动版演示地址: [https://passer-by.com/relationship/vue/](https://passer-by.com/relationship/vue/)
## 一、下载 & 安装
脚本库可以用于浏览器,也可以用于 Nodejs 环境中。
该 Javascript 库 / 模块可以用于前端也可以用于后端 Nodejs 中。
1. 在网页中引入 `<script src="https://passer-by.com/relationship/dist/relationship.min.js">`
获取全局方法 `relationship`
2. 使用 npm 安装名为 `relationship.js ` 的包
1. 直接下载dist/relationship.min.js然后使用 `<script>`标签引入,可以得到全局的方法 `relationship`.
2. 使用 npm 进行包管理,具体为:
> **npm install relationship.js**
在脚本中引入模块
然后使用 `require` 引入模块
```js
var relationship = require("relationship.js");
```
```js
// CommonJS 引入
const relationship = require("relationship.js");
```
```js
// ES Module 引入
import relationship from 'relationship.js';
```
![npm](https://img.shields.io/npm/v/relationship.js) ![npm](https://img.shields.io/npm/dw/relationship.js)
## 二、使用
1. 通用方法: 唯一的计算方法 `relationship`.
1. 通用方法: 唯一的计算方法 `relationship(options)`.
* 选项模式 `relationship(options)`
参数`options`结构为:
参数`options`结构为:
```js
var options = {
text:'', // 目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔
target:'', // 相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己
sex:-1, // 本人性别0表示女性,1表示男性
type:'default', // 转换类型:'default'计算称谓,'chain'计算关系链,'pair'计算关系合称
reverse:false, // 称呼方式true对方称呼我,false我称呼对方
mode:'default', // 模式选择使用setMode方法定制不同地区模式在此选择自定义模式
optimal:false, // 最短关系:计算两者之间的最短关系
};
```
```js
var options = {
text:'', // 目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔
target:'', // 相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己
sex:-1, // 本人性别0表示女性,1表示男性
type:'default', // 转换类型:'default'计算称谓,'chain'计算关系链,'pair'计算关系合称
reverse:false, // 称呼方式true对方称呼我,false我称呼对方
mode:'default', // 模式选择使用setMode方法定制不同地区模式在此选择自定义模式
optimal:false, // 最短关系:计算两者之间的最短关系
};
```
代码示例:
代码示例:
```js
// 如:我应该叫外婆的哥哥什么?
relationship({text:'妈妈的妈妈的哥哥'});
// => ['舅外公']
```js
// 如:我应该叫外婆的哥哥什么?
relationship({text:'妈妈的妈妈的哥哥'});
// => ['舅外公']
// 如:七舅姥爷应该叫我什么?
relationship({text:'七舅姥爷',reverse:true,sex:1});
// => ['甥外孙']
// 如:七舅姥爷应该叫我什么
relationship({text:'七舅姥爷',reverse:true,sex:1});
// => ['甥外孙']
// 如:舅公和我具体是什么关系
relationship({text:'舅公',type:'chain'});
// => ['爸爸的妈妈的兄弟', '妈妈的妈妈的兄弟', '老公的妈妈的兄弟']
// 如:舅公是什么亲戚
relationship({text:'舅公',type:'chain'});
// => ['爸爸的妈妈的兄弟', '妈妈的妈妈的兄弟', '老公的妈妈的兄弟']
// 如:舅妈如何称呼外婆?
relationship({text:'外婆',target:'舅妈',sex:1});
// => ['婆婆']
// 如:舅妈如何称呼外婆?
relationship({text:'外婆',target:'舅妈',sex:1});
// => ['婆婆']
// 如:外婆和奶奶之间是什么关系?
relationship({text:'外婆',target:'奶奶',type:'pair'});
// => ['儿女亲家']
```
* 语句模式 `relationship(exptession)`
参数`exptession`句式可以为:`xxx是xxx的什么人``xxx叫xxx什么``xxx如何称呼xxx`等.
代码示例:
```js
// 如:舅妈如何称呼外婆?
relationship('舅妈如何称呼外婆?');
// => ['婆婆']
// 如:外婆和奶奶之间是什么关系?
relationship('外婆和奶奶之间是什么关系?');
// => ['儿女亲家']
```
// 如:外婆和奶奶之间是什么关系?
relationship({text:'外婆',target:'奶奶',type:'pair'});
// => ['儿女亲家']
```
2. 内部属性:获取当前数据表 `relationship.data`.
3. 内部属性:获取当前数据量 `relationship.dataCount`.
4. 内部方法:用户自定义模式 `relationship.setMode(mode_name,mode_data)`.
代码示例(可参考数据表格式对数据进行覆盖)
代码示例(可参考数据表格式对数据进行覆盖)
```js
// 关系解析语法
// 【关系链】f:父,m:母,h:夫,w:妻,s:子,d:女,xb:兄弟,ob:兄,lb:弟,xs:姐妹,os:姐,ls:妹
// 【修饰符】 1:男性,0:女性,&o:年长,&l:年幼,#:隔断,[a|b]:并列
relationship.setMode('northern',{
'm,f':['姥爷'],
'm,m':['姥姥'],
'm,xb,s&o':['表哥'],
'm,xb,s&l':['表弟'],
});
```
```js
// 关系解析语法
// 【关系链】f:父,m:母,h:夫,w:妻,s:子,d:女,xb:兄弟,ob:兄,lb:弟,xs:姐妹,os:姐,ls:妹
// 【修饰符】 1:男性,0:女性,&o:年长,&l:年幼,#:隔断,[a|b]:并列
relationship.setMode('northern',{
'm,f':['姥爷'],
'm,m':['姥姥'],
'm,xb,s&o':['表哥'],
'm,xb,s&l':['表弟'],
});
```
## 三、开发 & 贡献

View File

@ -1,62 +0,0 @@
import resolve from '@rollup/plugin-node-resolve'; // 使用node_modules包
import terser from '@rollup/plugin-terser'; // 代码压缩
import babel from '@rollup/plugin-babel'; // ECMAScript兼容
import pkg from './package.json' with { type:'json' }; // 获取package信息
// 版权信息
const repository = pkg.repository.url.replace(/(.+)(:\/\/.+)\.git$/,'https$2');
const now = new Date();
const date = (new Date(now.getTime()-now.getTimezoneOffset()*60000)).toISOString().substr(0,10);
const banner = `/*!
* ${pkg.name} v${pkg.version}
* ${pkg.description}
* ${pkg.homepage}
*
* Copyright (c) 2016-present, ${pkg.author}
*
* Released under the ${pkg.license} License
* ${repository}
*
* Created on: ${date}
*/`;
const commonPlugins = [
resolve(),
terser(),
babel({
babelHelpers: 'runtime',
exclude:'node_modules/**'
})
];
export default [{
input: './src/relationship.js',
output:[{
file: pkg.main,
format: 'umd',
name: 'relationship',
banner
},{
file: pkg.module,
format: 'es',
banner
}],
plugins: commonPlugins,
watch: {
exclude: 'node_modules/**'
}
},{
input: './src/relationship-mode.js',
output:[{
file: './dist/relationship-mode.min.js',
format: 'umd',
name: 'relationshipMode'
},{
file: './dist/relationship-mode.min.mjs',
format: 'es'
}],
plugins: commonPlugins,
watch: {
exclude: 'node_modules/**'
}
}];

View File

@ -1,60 +1,120 @@
/*
* 分支关系链 - 旁支亲戚的分支关系链
*/
// 分支关系链
export default {
// 其他旁系
'{G2}':['祖父'],
'{G2},w':['祖母'],
'{G2},s':['父'],
'{G2},s,w':['母'],
'{G2},s,s':['兄弟'],
'{G2},s,s&o':['兄'],
'{G2},s,s&l':['弟'],
'{G2},s,s,s':['男','子'],
'{G2},s,s,d':['女'],
'{G2},s,d':['姊妹'],
'{G2},s,s':['兄弟'],
'{G2},s,d&o':['姊'],
'{G2},s,d&l':['妹'],
'{G2},s,d':['姊妹'],
'{G2},s,s,s':['男','子'],
'{G2},s,s,d':['女'],
'{G2C},s&o':['伯父'],
'{G2C},s&o,w':['伯母'],
'{G2C},s&l':['叔父'],
'{G2C},s&l,w':['叔母'],
'{G2C},s,s&o':['兄'],
'{G2C},s,s&l':['弟'],
'{G2C},s,s,s':['侄男'],
'{G2C},s,s,d':['侄女'],
'{G2C},s,d&o':['姐'],
'{G2C},s,d&l':['妹'],
'{G2C},s,d,s':['甥男'],
'{G2C},s,d,d':['甥女'],
'{G2C},d':['姑母'],
'{G2C},d,h':['姑父'],
'{G2C},d,s&o':['兄'],
'{G2C},d,s&l':['弟'],
'{G2C},d,s,s':['侄男'],
'{G2C},d,s,d':['侄女'],
'{G2C},d,d&o':['姐'],
'{G2C},d,d&l':['妹'],
'{G2C},d,d,s':['甥男'],
'{G2C},d,d,d':['甥女'],
// 高祖以上
'f,f,f,f,f,f,f,f,[{G1M}|{G1W},h]':['鼻祖父'],
'f,f,f,f,f,f,f,f,[{G1M},w|{G1W}]':['鼻祖母'],
'f,f,f,f,f,f,f,[{G1M}|{G1W},h]':['远祖父'],
'f,f,f,f,f,f,f,[{G1M},w|{G1W}]':['远祖母'],
'f,f,f,f,f,f,[{G1M}|{G1W},h]':['太祖父'],
'f,f,f,f,f,f,[{G1M},w|{G1W}]':['太祖母'],
'f,f,f,f,f,[{G1M}|{G1W},h]':['烈祖父'],
'f,f,f,f,f,[{G1M},w|{G1W}]':['烈祖母'],
'f,f,f,f,[{G1M}|{G1W},h]':['天祖父'],
'f,f,f,f,[{G1M},w|{G1W}]':['天祖母'],
'f,f,f,f,f,f,f,f,{G1M}':['鼻祖父'],
'f,f,f,f,f,f,f,f,{G1M},w':['鼻祖母'],
'f,f,f,f,f,f,f,f,{G1W}':['鼻祖母'],
'f,f,f,f,f,f,f,f,{G1W},h':['鼻祖父'],
'f,f,f,f,f,f,f,{G1M}':['远祖父'],
'f,f,f,f,f,f,f,{G1M},w':['远祖母'],
'f,f,f,f,f,f,f,{G1W}':['远祖母'],
'f,f,f,f,f,f,f,{G1W},h':['远祖父'],
'f,f,f,f,f,f,{G1M}':['太祖父'],
'f,f,f,f,f,f,{G1M},w':['太祖母'],
'f,f,f,f,f,f,{G1W}':['姑太祖母'],
'f,f,f,f,f,f,{G1W},h':['姑太祖父'],
'f,f,f,f,f,{G1M}':['烈祖父'],
'f,f,f,f,f,{G1M},w':['烈祖母'],
'f,f,f,f,f,{G1W}':['烈祖母'],
'f,f,f,f,f,{G1W},h':['烈祖父'],
'f,f,f,f,{G1M}':['天祖父'],
'f,f,f,f,{G1M},w':['天祖母'],
'f,f,f,f,{G1W}':['天祖母'],
'f,f,f,f,{G1W},h':['天祖父'],
// 高祖辈
'f,f,f,[{G1M}|{G1W},h]':['高祖父','外曾外曾外毑父'],
'f,f,f,[{G1M},w|{G1W}]':['高祖母','外曾外曾外毑母'],
'f,f,m,[{G1M}|{G1W},h]':['高外祖父','外曾外曾毑父'],
'f,f,m,[{G1M},w|{G1W}]':['高外祖母','外曾外曾毑母'],
'f,m,f,[{G1M}|{G1W},h]':['曾外曾祖父','外高外毑父'],
'f,m,f,[{G1M},w|{G1W}]':['曾外曾祖母','外高外毑母'],
'f,m,m,[{G1M}|{G1W},h]':['曾外曾外祖父','外高毑父'],
'f,m,m,[{G1M},w|{G1W}]':['曾外曾外祖母','外高毑母'],
'm,f,f,[{G1M}|{G1W},h]':['外高祖父','曾外曾外毑父'],
'm,f,f,[{G1M},w|{G1W}]':['外高祖母','曾外曾外毑母'],
'm,f,m,[{G1M}|{G1W},h]':['外高外祖父','曾外曾祖毑父'],
'm,f,m,[{G1M},w|{G1W}]':['外高外祖母','曾外曾祖毑母'],
'm,m,f,[{G1M}|{G1W},h]':['外曾外曾祖父','高外毑父'],
'm,m,f,[{G1M},w|{G1W}]':['外曾外曾祖母','高外毑母'],
'm,m,m,[{G1M}|{G1W},h]':['外曾外曾外祖父','高毑父'],
'm,m,m,[{G1M},w|{G1W}]':['外曾外曾外祖母','高毑母'],
'f,f,f,{G1M}':['高祖父','外曾外曾外毑父'],
'f,f,f,{G1M},w':['高祖母','外曾外曾外毑母'],
'f,f,f,{G1W}':['高祖母','外曾外曾外毑母'],
'f,f,f,{G1W},h':['高祖父','外曾外曾外毑父'],
'f,f,m,{G1M}':['高外祖父','外曾外曾毑父'],
'f,f,m,{G1M},w':['高外祖母','外曾外曾毑母'],
'f,f,m,{G1W}':['高外祖母','外曾外曾毑母'],
'f,f,m,{G1W},h':['高外祖父','外曾外曾毑父'],
'f,m,f,{G1M}':['曾外曾祖父','外高外毑父'],
'f,m,f,{G1M},w':['曾外曾祖母','外高外毑母'],
'f,m,f,{G1W}':['曾外曾祖母','外高外毑母'],
'f,m,f,{G1W},h':['曾外曾祖父','外高外毑父'],
'f,m,m,{G1M}':['曾外曾外祖父','外高毑父'],
'f,m,m,{G1M},w':['曾外曾外祖母','外高毑母'],
'f,m,m,{G1W}':['曾外曾外祖母','外高毑母'],
'f,m,m,{G1W},h':['曾外曾外祖父','外高毑父'],
'm,f,f,{G1M}':['外高祖父','曾外曾外毑父'],
'm,f,f,{G1M},w':['外高祖母','曾外曾外毑母'],
'm,f,f,{G1W}':['外高祖母','曾外曾外毑母'],
'm,f,f,{G1W},h':['外高祖父','曾外曾外毑父'],
'm,f,m,{G1M}':['外高外祖父','曾外曾祖毑父'],
'm,f,m,{G1M},w':['外高外祖母','曾外曾祖毑母'],
'm,f,m,{G1W}':['外高外祖母','曾外曾祖毑母'],
'm,f,m,{G1W},h':['外高外祖父','曾外曾祖毑父'],
'm,m,f,{G1M}':['外曾外曾祖父','高外毑父'],
'm,m,f,{G1M},w':['外曾外曾祖母','高外毑母'],
'm,m,f,{G1W}':['外曾外曾祖母','高外毑母'],
'm,m,f,{G1W},h':['外曾外曾祖父','高外毑父'],
'm,m,m,{G1M}':['外曾外曾外祖父','高毑父'],
'm,m,m,{G1M},w':['外曾外曾外祖母','高毑母'],
'm,m,m,{G1W}':['外曾外曾外祖母','高毑母'],
'm,m,m,{G1W},h':['外曾外曾外祖父','高毑父'],
// 曾祖辈
'f,f,[{G1M}|{G1W},h]':['?曾祖父','曾?祖父','?太公','太?公','?公太','太?爷','?太爷','?太爷爷','太?爷爷'],
'f,f,[{G1M},w|{G1W}]':['?曾祖母','曾?祖母','?太婆','太?婆','?婆太','太?奶','?太奶','?太奶奶','太?奶奶'],
'f,m,[{G1M}|{G1W},h]':['?曾外祖父','曾外?祖父','?太外公','太外?公','太外?爷','?太外爷','?太外爷爷','太外?爷爷'],
'f,m,[{G1M},w|{G1W}]':['?曾外祖母','曾外?祖母','?太外婆','太外?婆','太外?奶','?太外奶','?太外奶奶','太外?奶奶'],
'm,f,[{G1M}|{G1W},h]':['?外曾祖父','外曾?祖父','?外太公','外太?公','外太?爷','?外太爷','?外太爷爷','外太?爷爷'],
'm,f,[{G1M},w|{G1W}]':['?外曾祖母','外曾?祖母','?外太婆','外太?婆','外太?奶','?外太奶','?外太奶奶','外太?奶奶'],
'm,m,[{G1M}|{G1W},h]':['?外曾外祖父','外曾外?祖父','?外太外公','外太外?公','外太外?爷','?外太外爷','?外太外爷爷','外太外?爷爷'],
'm,m,[{G1M},w|{G1W}]':['?外曾外祖母','外曾外?祖母','?外太外婆','外太外?婆','外太外?奶','?外太外奶','?外太外奶奶','外太外?奶奶'],
'f,f,{G1M}':['?曾祖父','曾?祖父','?太公','太?公','?公太','太?爷','?太爷','?太爷爷','太?爷爷'],
'f,f,{G1M},w':['?曾祖母','曾?祖母','?太婆','太?婆','?婆太','太?奶','?太奶','?太奶奶','太?奶奶'],
'f,f,{G1W}':['?曾祖母','曾?祖母','?太婆','太?婆','?婆太','太?奶','?太奶','?太奶奶','太?奶奶'],
'f,f,{G1W},h':['?曾祖父','曾?祖父','?太公','太?公','?公太','太?爷','?太爷','?太爷爷','太?爷爷'],
'f,m,{G1M}':['?曾外祖父','曾外?祖父','?太外公','太外?公','太外?爷','?太外爷','?太外爷爷','太外?爷爷'],
'f,m,{G1M},w':['?曾外祖母','曾外?祖母','?太外婆','太外?婆','太外?奶','?太外奶','?太外奶奶','太外?奶奶'],
'f,m,{G1W}':['?曾外祖母','曾外?祖母','?太外婆','太外?婆','太外?奶','?太外奶','?太外奶奶','太外?奶奶'],
'f,m,{G1W},h':['?曾外祖父','曾外?祖父','?太外公','太外?公','太外?爷','?太外爷','?太外爷爷','太外?爷爷'],
'm,f,{G1M}':['?外曾祖父','外曾?祖父','?外太公','外太?公','外太?爷','?外太爷','?外太爷爷','外太?爷爷'],
'm,f,{G1M},w':['?外曾祖母','外曾?祖母','?外太婆','外太?婆','外太?奶','?外太奶','?外太奶奶','外太?奶奶'],
'm,f,{G1W}':['?外曾祖母','外曾?祖母','?外太婆','外太?婆','外太?奶','?外太奶','?外太奶奶','外太?奶奶'],
'm,f,{G1W},h':['?外曾祖父','外曾?祖父','?外太公','外太?公','外太?爷','?外太爷','?外太爷爷','外太?爷爷'],
'm,m,{G1M}':['?外曾外祖父','外曾外?祖父','?外太外公','外太外?公','外太外?爷','?外太外爷','?外太外爷爷','外太外?爷爷'],
'm,m,{G1M},w':['?外曾外祖母','外曾外?祖母','?外太外婆','外太外?婆','外太外?奶','?外太外奶','?外太外奶奶','外太外?奶奶'],
'm,m,{G1W}':['?外曾外祖母','外曾外?祖母','?外太外婆','外太外?婆','外太外?奶','?外太外奶','?外太外奶奶','外太外?奶奶'],
'm,m,{G1W},h':['?外曾外祖父','外曾外?祖父','?外太外公','外太外?公','外太外?爷','?外太外爷','?外太外爷爷','外太?外爷爷'],
// 祖辈
'f,[{G1M}|{G1W},h]':['祖父','公','太?父','奶爷','爷爷','爷'],
'f,[{G1M},w|{G1W}]':['祖母','婆','太?母','奶奶','奶'],
'm,[{G1M}|{G1W},h]':['外祖父','外公','外爷','外?公','外?祖父','外太?父','太外?父','姥爷','姥公','毑公','毑爷','毑父','嘎公'],
'm,[{G1M},w|{G1W}]':['外祖母','外婆','外奶','外?婆','外?祖母','外太?母','太外?母','姥姥','姥婆','毑婆','毑毑','毑母','嘎嘎'],
'f,{G1M}':['祖父','公','太?父','奶爷','爷爷','爷'],
'f,{G1M},w':['祖母','婆','太?母','奶奶','奶'],
'f,{G1W}':['祖母','婆','太?母','奶奶','奶'],
'f,{G1W},h':['祖父','公','太?父','奶爷','爷爷','爷'],
'm,{G1M}':['外祖父','外公','外爷','外?公','外?祖父','外太?父','太外?父','姥爷','姥公','毑公','毑爷','毑父','嘎公'],
'm,{G1M},w':['外祖母','外婆','外奶','外?婆','外?祖母','外太?母','太外?母','姥姥','姥娘','姥婆','毑婆','毑毑','毑母','嘎嘎','嫏嫏','嫏娘','姥'],
'm,{G1W}':['外祖母','外婆','外奶','外?婆','外?祖母','外太?母','太外?母','姥姥','姥娘','姥婆','毑婆','毑毑','毑母','嘎嘎','嫏嫏','嫏娘','姥'],
'm,{G1W},h':['外祖父','外公','外爷','外?公','外?祖父','外太?父','太外?父','姥爷','姥公','毑公','毑爷','毑父','嘎公'],
'f,f,{G1},s&o':['伯祖父','伯爷爷'],
'f,f,{G1},s&o,w':['伯祖母','伯奶奶'],
'f,f,{G1},s&l':['叔祖父','叔爷爷'],
@ -63,8 +123,8 @@ export default {
'f,f,{G1},d,h':['姑祖父','姑爷爷'],
'f,m,{G1},s':['舅祖父','舅爷爷'],
'f,m,{G1},s,w':['舅祖母','舅奶奶'],
'f,m,{G1},d':['姨祖母','姨奶奶'],
'f,m,{G1},d,h':['姨祖父','姨爷爷'],
'f,m,{G1},d':['姨祖母','姨爷爷'],
'f,m,{G1},d,h':['姨祖父','姨奶奶'],
'm,f,{G1},s&o':['伯外祖父','伯外公','伯姥爷'],
'm,f,{G1},s&o,w':['伯外祖母','伯外婆','伯姥姥'],
'm,f,{G1},s&l':['叔外祖父','叔外公','叔姥爷'],
@ -76,24 +136,26 @@ export default {
'm,m,{G1},d':['姨外祖母','姨外公','姨姥爷'],
'm,m,{G1},d,h':['姨外祖父','姨外婆','姨姥姥'],
// 父辈
'{G1M}#{G1W},h':['父'],
'{G1M},w#{G1W}':['母'],
'{G1M}':['父'],
'{G1M},w':['母'],
'{G1W}':['母'],
'{G1W},h':['父'],
'f,{G1},s&o':['伯父','伯伯','伯','大爷'],
'f,{G1},s&o,w':['伯母','大娘'],
'f,{G1},s&l':['叔父','叔爸','叔叔','叔'],
'f,{G1},s&l,w':['叔母','婶'],
'f,{G1},d':['姑母','姑姑','姑妈','姑'],
'f,{G1},d,h':['姑父','姑丈','姑爸','姑夫'],
'f,{G1},d,h':['姑父'],
'm,{G1},s':['舅父','舅舅','舅爸','舅'],
'm,{G1},s,w':['舅母','舅妈'],
'm,{G1},d':['姨母','姨姨','姨妈','姨'],
'm,{G1},d,h':['姨父','姨丈','姨爸','姨夫'],
'm,{G1},d,h':['姨父','姨爸','姨丈'],
// 同辈及以下
'{G1},s':['兄弟'],
'{G1},s,w':['兄弟妇'],
'{G1},s&o':['哥','哥哥','阿哥'],
'{G1},[s&o|s&l]':['兄弟'],
'{G1},[s&o|s&l],w':['兄弟妇'],
'{G1},s&o':['哥',''],
'{G1},s&o,w':['嫂','嫂子','兄妇'],
'{G1},s&l':['弟','弟弟','阿弟'],
'{G1},s&l':['弟'],
'{G1},s&l,w':['弟媳','弟妇'],
'{G1},s,s':['侄男','侄子','侄儿'],
'{G1},s,s,w':['侄妇'],
@ -115,11 +177,11 @@ export default {
'{G1},s,d,s,w':['侄外孙妇'],
'{G1},s,d,d':['侄外孙女','外孙女'],
'{G1},s,d,d,h':['侄外孙婿'],
'{G1},d':['姐妹'],
'{G1},d,h':['姐妹壻'],
'{G1},d&o':['姐','姐姐','阿姐'],
'{G1},[d&o|d&l]':['姐妹'],
'{G1},[d&o|d&l],h':['姐妹壻'],
'{G1},d&o':['姐'],
'{G1},d&o,h':['姐夫'],
'{G1},d&l':['妹','妹妹','阿妹'],
'{G1},d&l':['妹'],
'{G1},d&l,h':['妹夫'],
'{G1},d,s':['甥男'],
'{G1},d,s,w':['甥妇'],
@ -134,12 +196,18 @@ export default {
'{G1},d,d,d':['甥外孙女','外孙女'],
'{G1},d,d,d,h':['甥外孙婿'],
// 夫族
'h,f,[{G1M}|{G1W},h]':['祖公父','祖公','祖翁','奶公'],
'h,f,[{G1M},w|{G1W}]':['祖婆母','祖婆','祖姆','奶婆'],
'h,m,[{G1M}|{G1W},h]':['外祖公父','外祖公','外祖翁','姥公'],
'h,m,[{G1M},w|{G1W}]':['外祖婆母','外祖婆','外祖姆','姥婆'],
'h,[{G1M}|{G1W},h]':['公父','公公'],
'h,[{G1M},w|{G1W}]':['婆母','婆婆'],
'h,f,{G1M}':['祖公父','祖公','祖翁','奶公'],
'h,f,{G1M},w':['祖婆母','祖婆','祖姆','奶婆'],
'h,f,{G1W}':['祖婆母','祖婆','祖姆','奶婆'],
'h,f,{G1W},h':['祖公父','祖公','祖翁','奶公'],
'h,m,{G1M}':['外祖公父','外祖公','外祖翁','姥公'],
'h,m,{G1M},w':['外祖婆母','外祖婆','外祖姆','姥婆'],
'h,m,{G1W}':['外祖婆母','外祖婆','外祖姆','姥婆'],
'h,m,{G1W},h':['外祖公父','外祖公','外祖翁','姥公'],
'h,{G1M}':['公父','公公'],
'h,{G1M},w':['婆母','婆婆'],
'h,{G1W}':['婆母','婆婆'],
'h,{G1W},h':['公父','公公'],
'h,{G1},s&o':['大伯子','大伯兄'],
'h,{G1},s&o,w':['大婶子','大伯嫂'],
'h,{G1},s&l':['小叔子','小叔弟'],
@ -153,12 +221,18 @@ export default {
'h,{G1},d':['姑子'],
'h,{G1},d,h':['姑夫'],
// 妻族
'w,f,[{G1M}|{G1W},h]':['祖岳父','太?岳','祖丈人','爷丈人','奶爷丈人'],
'w,f,[{G1M},w|{G1W}]':['祖岳母','太?岳母','祖丈母','祖丈母娘','奶丈母娘','奶丈母'],
'w,m,[{G1M}|{G1W},h]':['外祖岳父','外太?岳父','太外?岳父','外祖丈人','姥爷丈人'],
'w,m,[{G1M},w|{G1W}]':['外祖岳母','外太?岳母','太外?岳母','外祖丈母','外祖丈母娘','姥丈母娘','姥丈母'],
'w,[{G1M}|{G1W},h]':['岳父','丈人','丈人爹'],
'w,[{G1M},w|{G1W}]':['岳母','丈母','丈母娘'],
'w,f,{G1M}':['祖岳父','太?岳','祖丈人','爷丈人','奶爷丈人'],
'w,f,{G1M},w':['祖岳母','太?岳母','祖丈母','祖丈母娘','奶丈母娘','奶丈母'],
'w,f,{G1W}':['祖岳母','太?岳母','祖丈母','祖丈母娘','奶丈母娘','奶丈母'],
'w,f,{G1W},h':['祖岳父','太?岳父','祖丈人','爷丈人','奶爷丈人'],
'w,m,{G1M}':['外祖岳父','外太?岳父','太外?岳父','外祖丈人','姥爷丈人'],
'w,m,{G1M},w':['外祖岳母','外太?岳母','太外?岳母','外祖丈母','外祖丈母娘','姥丈母娘','姥丈母'],
'w,m,{G1W}':['外祖岳母','外太?岳母','太外?岳母','外祖丈母','外祖丈母娘','姥丈母娘','姥丈母'],
'w,m,{G1W},h':['外祖岳父','外太?岳父','太外?岳父','外祖丈人','外爷丈人','姥爷丈人'],
'w,{G1M}':['岳父','丈人','丈人爹'],
'w,{G1M},w':['岳母','丈母','丈母娘'],
'w,{G1W}':['岳母','丈母','丈母娘'],
'w,{G1W},h':['岳父','丈人','丈人爹'],
'w,{G1},s&o':['大舅子','大舅兄','舅兄'],
'w,{G1},s&o,w':['大舅妇','大舅姆','大舅兄妇','舅兄妇','舅姐','大舅姐','大妗子','大妗儿'],
'w,{G1},s&l':['小舅子','小舅弟','舅弟'],
@ -178,30 +252,22 @@ export default {
'{G0},s,s,w':['孙妇'],
'{G0},s,s,s':['曾孙','曾孙男'],
'{G0},s,s,s,w':['曾孙妇'],
'{G0},s,s,s,s':['玄孙','玄孙男','元孙','元孙男'],
'{G0},s,s,s,s,w':['玄孙妇'],
'{G0},s,s,s,d':['玄孙女','元孙女'],
'{G0},s,s,s,d,h':['玄孙婿'],
'{G0},s,s,s,s':['玄孙','玄孙男'],
'{G0},s,s,s,d':['玄孙女'],
'{G0},s,s,d':['曾孙女'],
'{G0},s,s,d,h':['曾孙婿'],
'{G0},s,s,d,s':['玄外孙','玄外孙男'],
'{G0},s,s,d,s,w':['玄外孙妇'],
'{G0},s,s,d,d':['玄外孙女'],
'{G0},s,s,d,d,h':['玄外孙婿'],
'{G0},s,d':['孙女'],
'{G0},s,d,h':['孙婿'],
'{G0},s,d,s':['曾外孙','曾外孙男'],
'{G0},s,d,s,w':['曾外孙妇'],
'{G0},s,d,s,s':['曾外曾孙','曾外曾孙男'],
'{G0},s,d,s,s,w':['曾外曾孙妇'],
'{G0},s,d,s,d':['曾外曾孙女'],
'{G0},s,d,s,d,h':['曾外曾孙婿'],
'{G0},s,d,d':['曾外孙女'],
'{G0},s,d,d,h':['曾外孙婿'],
'{G0},s,d,d,s':['曾外曾外孙','曾外曾外孙男'],
'{G0},s,d,d,s,w':['曾外曾外孙妇'],
'{G0},s,d,d,d':['曾外曾外孙女'],
'{G0},s,d,d,d,h':['曾外曾外孙婿'],
'{G0},d':['女','女儿'],
'{G0},d,h':['女婿','婿'],
'{G0},d,s':['外孙','外孙男'],
@ -308,8 +374,8 @@ export default {
'{M1W},xb,d,s,w':['舅表甥妇','甥妇'],
'{M1W},xb,d,d':['舅表甥女','甥女'],
'{M1W},xb,d,d,h':['舅表甥婿','甥婿'],
'{M1W},xs':['姨母','姨妈'],
'{M1W},xs,h':['姨父','姨丈','姨夫'],
'{M1W},xs':['姨母'],
'{M1W},xs,h':['姨父'],
'{M1W},xs,[s|d]':['姨表兄弟姊妹'],
'{M1W},xs,s':['姨表兄弟'],
'{M1W},xs,s,w':['姨表兄弟妇'],
@ -394,8 +460,8 @@ export default {
'{M1M},xb,d,s,w':['叔表甥妇','甥妇'],
'{M1M},xb,d,d':['叔表甥女','甥女'],
'{M1M},xb,d,d,h':['叔表甥婿','甥婿'],
'{M1M},xs':['姑母','姑妈'],
'{M1M},xs,h':['姑父','姑丈','姑夫'],
'{M1M},xs':['姑母'],
'{M1M},xs,h':['姑父'],
'{M1M},xs,[s|d]':['姑表兄弟姊妹'],
'{M1M},xs,s':['姑表兄弟'],
'{M1M},xs,s,w':['姑表兄弟妇'],
@ -447,8 +513,8 @@ export default {
'{M0},f,xb,d&o,h':['叔表姊壻'],
'{M0},f,xb,d&l':['叔表妹'],
'{M0},f,xb,d&l,h':['叔表妹壻'],
'{M0},f,xs':['姑母','姑妈'],
'{M0},f,xs,h':['姑父','姑丈','姑夫'],
'{M0},f,xs':['姑母'],
'{M0},f,xs,h':['姑父'],
'{M0},f,xs,[s|d]':['姑表兄弟姊妹','姑表姊妹兄弟'],
'{M0},f,xs,s':['姑表兄弟'],
'{M0},f,xs,s,w':['姑表兄弟妇'],
@ -490,8 +556,8 @@ export default {
'{M0},m,xb,d&o,h':['舅表姊壻'],
'{M0},m,xb,d&l':['舅表妹'],
'{M0},m,xb,d&l,h':['舅表妹壻'],
'{M0},m,xs':['姨母','姨妈'],
'{M0},m,xs,h':['姨父','姨丈','姨夫'],
'{M0},m,xs':['姨母'],
'{M0},m,xs,h':['姨父'],
'{M0},m,xs,[s|d]':['姨兄弟姊妹','姨姊妹兄弟'],
'{M0},m,xs,s':['姨兄弟'],
'{M0},m,xs,s,w':['姨兄弟妇'],
@ -592,11 +658,15 @@ export default {
'{M-1},xs,d':['外孙女'],
'{M-1},xs,d,h':['外孙婿'],
'{M-2},f':['男'],
'{M-2},f,f&o':['兄'],
'{M-2},f,f&l':['弟'],
'{M-2},f,m&o':['姊'],
'{M-2},f,m&l':['妹'],
'{M-2},m':['女'],
'{M-2},[f|m],f&o':['兄'],
'{M-2},[f|m],f&l':['弟'],
'{M-2},[f|m],m&o':['姊'],
'{M-2},[f|m],m&l':['妹'],
'{M-2},m,f&o':['兄'],
'{M-2},m,f&l':['弟'],
'{M-2},m,m&o':['姊'],
'{M-2},m,m&l':['妹'],
'{M-2},xb':['孙男'],
'{M-2},xb,w':['孙妇'],
'{M-2},xs':['孙女'],

View File

@ -1,10 +1,9 @@
/*
* 关系链缩写规则 - 关系链缩减成最简表达
*
* 关系数据语法说明
* 关系符 f:; m:; h:; w:; s:; d:; xb:兄弟; ob:; lb:; xs:姐妹; os:; ls:
* 修饰符 1:男性; 0:女性; &o:年长; &l:年幼; &\d+:排序 #:隔断; [a|b]:并列
*/
// 关系链缩写规则
export default [
/* 年龄 */
{//有大有小,增加不确定性

View File

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

View File

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

View File

@ -1,8 +1,159 @@
/*
* 主要关系链
*/
// 主要关系链
export default {
'':['自己','我','俺','吾','本人','在下'],
//并称
'[f,f|f,m|m,f],[f,m],f':['老太奶爷','祖太奶爷'],
'[f,f|f,m|m,f],[f,m],m':['老太奶奶','祖太奶奶'],
'[f,m|m,f|m,m],[f,m],f':['老太姥爷','祖太姥爷'],
'[f,m|m,f|m,m],[f,m],m':['老太姥姥','祖太姥姥'],
'[f|m],[f|m],f':['太老爷'],
'[f|m],[f|m],f,ob':['伯太老爷'],
'[f|m],[f|m],f,ob,w':['伯太老姥'],
'[f|m],[f|m],f,lb':['叔太老爷'],
'[f|m],[f|m],f,lb,w':['叔太老姥'],
'[f|m],[f|m],f,xs':['姑太老姥'],
'[f|m],[f|m],f,xs,h':['姑太老爷'],
'[f|m],[f|m],m':['太老姥'],
'[f|m],[f|m],m,xb':['舅太老爷'],
'[f|m],[f|m],m,xb,w':['舅太老姥'],
'[f|m],[f|m],m,xs':['姨太老姥'],
'[f|m],[f|m],m,xs,h':['姨太老爷'],
'[f,f|f,m|m,f],f':['太奶爷','祖奶爷'],
'[f,f|f,m|m,f],f,ob':['伯太奶爷','太伯奶爷'],
'[f,f|f,m|m,f],f,ob,w':['伯太奶奶','太伯奶奶'],
'[f,f|f,m|m,f],f,lb':['叔太奶爷','太叔奶爷'],
'[f,f|f,m|m,f],f,lb,w':['叔太奶奶','太叔奶奶'],
'[f,f|f,m|m,f],f,xs':['姑太奶奶','太姑奶奶'],
'[f,f|f,m|m,f],f,xs,h':['姑太奶爷','太姑奶爷'],
'[f,f|f,m|m,f],m':['太奶奶','祖奶奶'],
'[f,f|f,m|m,f],m,xb':['舅太奶爷','太舅奶爷'],
'[f,f|f,m|m,f],m,xb,w':['舅太奶奶','太舅奶奶'],
'[f,f|f,m|m,f],m,xs':['姨太奶奶','太姨奶奶'],
'[f,f|f,m|m,f],m,xs,h':['姨太奶爷','太姨奶爷'],
'[f,m|m,f|m,m],f':['太姥爷','祖姥爷','太毑爷'],
'[f,m|m,f|m,m],f,ob':['伯太姥爷','伯叔姥爷'],
'[f,m|m,f|m,m],f,ob,w':['伯太姥姥','太伯姥姥'],
'[f,m|m,f|m,m],f,lb':['叔太姥爷','太叔姥爷'],
'[f,m|m,f|m,m],f,lb,w':['叔太姥姥','太叔姥姥'],
'[f,m|m,f|m,m],f,xs':['姑太姥姥','太姑姥姥'],
'[f,m|m,f|m,m],f,xs,h':['姑太姥爷','太姑姥爷'],
'[f,m|m,f|m,m],m':['太姥姥','祖姥姥','太毑毑','太姥'],
'[f,m|m,f|m,m],m,xb':['舅太姥爷','太舅姥爷'],
'[f,m|m,f|m,m],m,xb,w':['舅太姥姥','太舅姥姥'],
'[f,m|m,f|m,m],m,xs':['姨太姥姥','太姨姥姥'],
'[f,m|m,f|m,m],m,xs,h':['姨太姥爷','太姨姥爷'],
'[f|m],[f|m],[f|m]':['曾祖辈','祖祖','老太'],
'[f|m],[f|m]':['祖辈'],
'[f|m],f':['老爷'],
'[f|m],f,ob':['伯老爷'],
'[f|m],f,ob,w':['伯老姥'],
'[f|m],f,lb':['叔老爷'],
'[f|m],f,lb,w':['叔老姥'],
'[f|m],f,xs':['姑老姥'],
'[f|m],f,xs,h':['姑老爷'],
'[f|m],m':['老姥'],
'[f|m],m,xb':['舅老爷'],
'[f|m],m,xb,w':['舅老姥'],
'[f|m],m,xs':['姨老姥'],
'[f|m],m,xs,h':['姨老爷'],
'f,f,[f|m]':['曾祖父母'],
'f,f,[f,xs|m,xb],s':['舅姑爷爷','舅姑爷'],
'f,[f|m]':['祖父母','爷爷奶奶'],
'f,[ob|ob,w]':['伯父母'],
'f,[lb|lb,w]':['叔父母'],
'f,xb,[s|d]':['堂兄弟姐妹','堂姐妹兄弟','从父兄弟姐妹'],
'f,[xs|xs,h]':['姑父母'],
'f,xs,[s|d]':['姑表兄弟姐妹'],
'm,[f|m],f':['老外公','老外爷','老姥爷'],
'm,[f|m],m,':['老外婆','老外奶','老姥姥','老姥娘','老嫏娘'],
'm,[f|m]':['外祖父母','外公外婆','姥姥姥爷'],
'm,f,[f,xs|m,xb],s':['舅姑姥爷'],
'm,[xb|xb,w]':['舅父母'],
'm,xb,[s|d]':['舅表兄弟姐妹'],
'm,[xs|xs,h]':['姨父母'],
'm,xs,[s|d]':['姨兄弟姐妹','姨姐妹兄弟','从母兄弟姐妹'],
'[f|m]':['父母','爹娘','爹妈','爸妈','爸爸妈妈','父母亲','双亲','二亲','两亲','二老','高堂'],
'[f|m],[f,xs|m,xb],s':['舅姑爸','姑舅爸'],
'[f|m],[f,xs|m,xb],s&o,w':['舅姑姆','姑舅姆'],
'[f|m],[f,xs|m,xb],s&l,w':['舅姑婶','姑舅婶'],
'[f|m],[f,xs|m,xb],d':['姑舅娘娘'],
'[f|m],m,xs,s':['两姨爸'],
'[f|m],m,xs,s&o,w':['两姨姆'],
'[f|m],m,xs,s&l,w':['两姨婶'],
'[f|m],m,xs,d':['两姨娘娘'],
'w,[f|m]':['岳父母','岳父岳母','丈人丈母','舅姑'],
'w,f,[ob|ob,w]':['伯岳父母'],
'w,f,[lb|lb,w]':['叔岳父母'],
'w,f,[xs|xs,h]':['姑岳父母'],
'w,m,[xb|xb,w]':['舅岳父母'],
'w,m,[xs|xs,h]':['姨岳父母'],
'w,[ls|os],h':['襟兄弟'],
'w,[f,xs|m,xb],d':['姑舅姨子'],
'w,[f,xs|m,xb],d,h':['姑舅连襟','姑舅连桥'],
'h,[f|m]':['公婆','翁姑','姑翁','大家官','公公婆婆','姑嫜'],
'h,f,[ob|ob,w]':['伯公婆'],
'h,f,[lb|lb,w]':['叔公婆'],
'h,f,[xs|xs,h]':['姑公婆'],
'h,m,[xb|xb,w]':['舅公婆'],
'h,m,[xs|xs,h]':['姨公婆'],
'[ob|lb]':['兄弟','晜弟','亲兄弟','同胞兄弟'],
'[ob|lb],w':['兄弟媳妇','兄弟妇'],
'[os|ls]':['姐妹','亲姐妹','同胞姐妹'],
'[os|ls],h':['姐妹夫','姊妹婿'],
'[xb|xs]':['兄弟姐妹','同胞','同胞兄弟姐妹','手足'],
'[ob|os]':['哥哥姐姐'],
'[lb|ls]':['弟弟妹妹'],
'[ob|ob,w]':['哥哥嫂嫂'],
'[f,xb|m,xs],[s|d]':['从兄弟姐妹','从姐妹兄弟'],
'[f,xs|m,xb],[s|d]':['表兄弟姐妹','表姐妹兄弟','老表','阿表'],
'[f,xs|m,xb],s':['姑舅兄弟','舅姑兄弟'],
'[f,xs|m,xb],s&o':['姑舅哥','姑舅哥哥'],
'[f,xs|m,xb],s&l':['姑舅弟','姑舅弟弟'],
'[f,xs|m,xb],d':['姑舅姊妹','舅姑姊妹'],
'[f,xs|m,xb],d&o':['姑舅姐','姑舅姐姐'],
'[f,xs|m,xb],d&l':['姑舅妹','姑舅妹妹'],
'[f,xs|m,xb],s,s':['姑舅儿子'],
'[f,xs|m,xb],s,d':['姑舅女儿'],
'[xb|xs],[s|d]':['侄甥'],
'xb,[s|d]':['侄子女','侄子侄女'],
'xs,[s|d]':['甥子女','外甥子女'],
'[w|s|d]':['妻儿'],
'[s|d]':['子女','儿女','小孩','孩子','孩子们','孩儿','小孩儿','宝宝','宝贝','娃','儿辈','子辈','子息','子嗣','崽','幺儿'],
'[s|d],[s|d]':['孙辈','孙息','孙枝'],
's,[s|d]':['孙子女'],
'd,[s|d]':['外孙子女'],
's#xb,s':['子侄'],
's#s,w':['子媳'],
'[s|d]#[s|d],[s|d]':['儿孙','子孙','孙息'],
'[s,w|d,h],[f|m]':['亲家','儿女亲家'],
'[s,w|d,h],f':['亲家公','亲家父','亲家翁','亲家世翁','姻翁'],
'[s,w|d,h],f,f':['太姻翁'],
'[s,w|d,h],f,m':['太姻姆'],
'[s,w|d,h],f,f,f':['太姻翁'],
'[s,w|d,h],f,f,m':['太姻姆'],
'[s,w|d,h],f,f,ob':['姻伯翁'],
'[s,w|d,h],f,f,ob,w':['姻伯姆'],
'[s,w|d,h],f,f,lb':['姻叔翁'],
'[s,w|d,h],f,f,lb,w':['姻叔母'],
'[s,w|d,h],f,f,xb,s&o':['姻家兄'],
'[s,w|d,h],f,f,xb,s&o,w':['姻家兄妇'],
'[s,w|d,h],f,f,xb,s&l':['姻家弟'],
'[s,w|d,h],f,f,xb,s&l,w':['姻家弟妇'],
'[s,w|d,h],f,f,xb,s,s':['姻家侄'],
'[s,w|d,h],f,f,xb,s,s,w':['姻家侄妇'],
'[s,w|d,h],f,ob':['姻兄'],
'[s,w|d,h],f,ob,w':['姻兄妇'],
'[s,w|d,h],f,lb':['姻弟'],
'[s,w|d,h],f,lb,w':['姻弟妇'],
'[s,w|d,h],f,xb,s':['姻侄'],
'[s,w|d,h],f,xb,s,w':['姻侄妇'],
'[s,w|d,h],m':['亲家母','亲家婆','亲家姆','亲姆','姻姆'],
'[s,w|d,h],m,ob':['姻仁兄'],
'[s,w|d,h],m,ob,w':['姻仁兄妇'],
'[s,w|d,h],m,lb':['姻仁弟'],
'[s,w|d,h],m,lb,w':['姻仁弟妇'],
'[s,w|d,h],[f|m],f':['姻太翁'],
'[s,w|d,h],[f|m],m':['姻太姆'],
// 主线
'f,f,f,f,f,f,f,f,f,f,f,f':['先祖父','先太爷','十二世祖'],
'f,f,f,f,f,f,f,f,f,f,f,m':['先祖母','先太奶'],
@ -23,8 +174,8 @@ export default {
// 高祖辈
'f,f,f,f':['高祖父','外曾外曾外毑父','曾曾祖父','祖太公','祖太爷','高太爷','祖太翁','祖太爷爷','四世祖'],
'f,f,f,m':['高祖母','外曾外曾外毑母','曾曾祖母','祖太婆','祖太奶','高太奶','祖太姆','祖太奶奶'],
'f,f,m,f':['高外祖父','外曾外曾毑父','高外翁'],
'f,f,m,m':['高外祖母','外曾外曾毑母','高外婆'],
'f,f,m,f':['高外祖父','外曾外曾毑父'],
'f,f,m,m':['高外祖母','外曾外曾毑母'],
'f,m,f,f':['曾外曾祖父','外高外毑父'],
'f,m,f,m':['曾外曾祖母','外高外毑母'],
'f,m,m,f':['曾外曾外祖父','外高毑父'],
@ -38,8 +189,8 @@ export default {
'm,m,m,f':['外曾外曾外祖父','高毑父'],
'm,m,m,m':['外曾外曾外祖母','高毑母'],
// 曾祖辈
'f,f,f':['曾祖父','曾祖','外曾外毑父','太公','太爷','老太爷','太翁','太爷爷','曾爷爷','公太','佬嗲','祖爷','三世祖'],
'f,f,m':['曾祖母','外曾外毑母','太婆','太奶','老太奶','太嬷','太姆','太奶奶','曾奶奶','婆太','老娭毑'],
'f,f,f':['曾祖父','曾祖','外曾外毑父','太公','太爷','老太爷','太翁','太爷爷','佬嗲','祖爷','三世祖'],
'f,f,m':['曾祖母','外曾外毑母','太婆','太奶','老太奶','太嬷','太姆','太奶奶','老娭毑'],
'f,m,f':['曾外祖父','曾外祖','外曾毑父','太外公','太外爷','太外翁','太外爷爷'],
'f,m,m':['曾外祖母','外曾毑母','太外婆','太外奶','太外嬷','太外姆','太外奶奶'],
'm,f,f':['外曾祖父','外曾祖','曾外毑父','外太公','外太爷','外太翁','外太爷爷'],
@ -47,28 +198,28 @@ export default {
'm,m,f':['外曾外祖父','外曾外祖','曾毑父','外太外公','外太外爷','外太外翁','外太外爷爷','外太姥爷'],
'm,m,m':['外曾外祖母','曾毑母','外太外婆','外太外奶','外太外嬷','外太外姆','外太外奶奶','外太姥姥'],
// 祖父辈
'f,f':['爷爷','祖父','祖公','阿爷','阿公','奶爹','亚爷','亚公','依爷','大父','祖翁','嗲嗲','爷','祖君','奶爷','爷儿','爷老','爷老子','爷老倌','二世祖'],
'f,m':['奶奶','祖母','祖婆','阿奶','阿婆','奶娘','亚嬷','亚婆','依奶','大母','祖嫲','嫲嫲','奶','重慈','阿嬷','婻婻','娭毑','嗯奶','娘姆','媪婆','亲婆'],
'm,f':['外公','外祖父','姥爷','阿公','外爷','客公','毑父','毑公','姥公','舅家爷','嘎公','嘎爹','嘎嘎爹','嘎爷爷','尕公','毑爹','毑爷','外大父','姥爹','魏公','魏爷','简爷'],
'm,m':['外婆','外祖母','姥姥','阿婆','外奶','客婆','毑母','毑婆','姥婆','舅家婆','嘎嘎','嘎婆','嘎嘎婆','嘎奶奶','尕婆','毑娘','毑毑','外大母','姥娘','魏婆','魏奶','简婆','阿嬷','外嬷','嫲嫲','好婆','嫏嫏','嫏娘','姥'],
'f,f':['爷爷','祖父','奶爷','阿爷','阿公','依爷','嗲嗲','爷儿','大父','爷','爷老','爷老子','爷老倌','二世祖'],
'f,m':['奶奶','祖母','阿奶','阿姆','阿婆','依奶','阿嬷','阿嫲','大母','奶','嫲嫲','婻婻','娭毑','嗯奶','娘姆','媪婆','亲婆'],
'm,f':['外公','外祖父','姥爷','阿公','外爷','客公','毑父','毑公','姥公','舅家爷','嘎公','嘎嘎爹','尕公','毑爹','外大父','毑爷'],
'm,m':['外婆','外祖母','姥姥','阿婆','外奶','客婆','毑母','毑婆','姥婆','舅家婆','嘎嘎','嘎嘎婆','尕婆','毑毑','外大母','姥娘','阿嬷','阿嫲','嫲嫲','好婆','嫏嫏','嫏娘'],
'f,f,ob':['伯公','伯祖','伯翁','大爷爷','大嗲','大爷','大公','大阿爷'],
'f,f,ob,w':['伯婆','姆婆','大奶奶','伯娭毑'],
'f,f,ob,w':['伯婆','姆婆','大奶奶'],
'f,f,lb':['叔公','叔祖','叔翁','小爷爷','晚公','幺爷','细嗲'],
'f,f,lb,w':['叔婆','婶婆','小奶奶','叔娭毑','晚婆','幺奶'],
'f,f,xs':['姑奶奶','祖姑','姑奶','恩婆','姑娭毑'],
'f,f,xs,h':['姑爷爷','祖姑丈','恩爹','姑丈公','丈公'],
'f,m,ob':['大舅爷','大舅爹'],
'f,m,ob,w':['大舅婆'],
'f,m,lb':['小舅爷','小舅爹'],
'f,m,lb,w':['小舅婆'],
'f,f,lb,w':['叔婆','婶婆','晚婆','幺奶','小奶奶'],
'f,f,xb':['伯叔祖父','从祖父','几爷爷','几大爷','几嗲','几爷','几公'],
'f,f,xb,w':['伯叔祖母','从祖母','几奶奶','几大娘','几奶','几婆'],
'f,f,xs':['姑奶奶','祖姑','恩婆'],
'f,f,xs,h':['姑爷爷','姑公公','恩爹','祖姑丈','姑丈公','丈公'],
'f,m,xb':['舅爷爷','舅祖','舅爹','太舅父'],
'f,m,xb,w':['舅奶奶','妗婆','舅婆','妗奶','太舅母'],
'f,m,xs':['姨奶奶','姨奶','姨娭毑'],
'f,m,xs':['姨奶奶','姨奶'],
'f,m,xs,h':['姨爷爷','姨公公','姨爹','姨丈公','丈公'],
'm,f,ob':['伯外公','外伯祖','伯外祖','大外公','大姥爷','大外爷'],
'm,f,ob,w':['伯外婆','外姆婆','大外婆','大姥姥','大姥奶'],
'm,f,lb':['叔外公','外叔祖','叔外祖','小外公','小姥爷','小外爷'],
'm,f,lb,w':['叔外婆','外婶婆','小外婆','小姥姥','婶姥姥','小姥奶'],
'm,f,xb':['堂外祖父','几外公','几姥爷','几外爷'],
'm,f,xb,w':['堂外祖母','几外婆','几姥姥','几姥奶','几外奶','几姥'],
'm,f,xs':['姑外婆','姑婆','恩婆'],
'm,f,xs,h':['姑外公','姑公','恩爹','外姑丈公','外丈公'],
'm,m,xb':['舅外公','舅公','舅爹'],
@ -77,13 +228,15 @@ export default {
'm,m,xs,h':['姨外公','姨公','外姨丈公','外丈公'],
// 父系
'f':['爸爸','父亲','老父亲','老爸','阿爸','阿父','阿爹','老窦','爹地','依爹','老爹','老汉','老爷子','老子','牙老子','爸','父','爹','老汉儿','牙老倌','爸比','爹爹','爹啲','一世祖'],
'f,ob':['伯父','伯伯','伯爸','阿伯','伯爷','依伯','伯儿','大伯','大爹','大爸','大爸爸','世父','大爷','大大','几伯','伯'],
'f,ob,w':['伯母','伯妈','伯娘','依姆','世母','大娘','伯妇','大嬷','大妈','大妈妈','大姆妈','伯姐','姆'],
'f,lb':['叔叔','叔父','叔爸','阿叔','叔爹','依叔','叔儿','小叔','小爹','小爸','小爸爸','仲父','季父','叔仔','几叔','叔'],
'f,lb,w':['婶婶','叔母','叔妈','阿婶','叔娘','依婶','婶儿','小婶','小娘','小妈','小妈妈','仲母','季母','叔妇','几婶','婶','婶母','婶妈','婶娘','婶子','家婶','婶爹','嬢嬢'],
'f,xb,s&o':['堂哥','堂老兄'],
'f,ob':['伯父','伯伯','伯爸','伯爷','依伯','世父','大爷','大爸','大爸爸','大爹','伯儿','大伯','大大','阿伯','几伯','伯'],
'f,ob,w':['伯母','伯妈','伯娘','依姆','世母','大娘','大妈','大妈妈','大嬷','伯妇','大嬷','大姆妈','伯姐','姆'],
'f,lb':['叔叔','叔父','叔爸','叔爹','阿叔','叔儿','仲父','季父','叔仔','依叔','小叔','小爹','小爸','尕爸','幺爸','幺爹','幺叔','细叔','满叔','晚叔','几叔','叔'],
'f,lb,w':['婶婶','婶母','婶妈','婶娘','阿婶','婶儿','仲母','季母','叔妇','依婶','小婶','小娘','小妈','尕婶','幺妈','幺娘','幺婶','细婶','满婶','晚婆','几婶','婶','婶子','家婶','叔母','叔妈','叔娘','婶爹'],
'f,xb':['伯叔父','叔伯','几爸爸','几爸','几爹'],
'f,xb,w':['伯叔母','几妈妈','几妈','几娘'],
'f,xb,s&o':['堂哥','堂阿哥','堂房哥哥','堂房阿哥','叔伯哥哥','叔伯阿哥','堂老兄'],
'f,xb,s&o,w':['堂嫂','堂兄嫂'],
'f,xb,s&l':['堂弟','堂老弟'],
'f,xb,s&l':['堂弟','堂阿弟','堂房弟弟','堂房阿弟','叔伯弟弟','叔伯老弟','堂老弟'],
'f,xb,s&l,w':['堂弟媳','堂弟妇','堂弟妹'],
'f,xb,s,s':['堂侄','再从子'],
'f,xb,s,s,w':['堂侄媳妇'],
@ -92,20 +245,20 @@ export default {
'f,xb,s,s,s,s,s':['堂玄孙','再玄孙'],
'f,xb,s,d':['堂侄女'],
'f,xb,s,d,h':['堂侄女婿'],
'f,xb,d&o':['堂姐','堂大姐'],
'f,xb,d&o':['堂姐','堂阿姐','堂房姐姐','堂房阿姐','叔伯姐姐','叔伯阿姊','堂大姐'],
'f,xb,d&o,h':['堂姐夫'],
'f,xb,d&l':['堂妹','堂细妹'],
'f,xb,d&l':['堂妹','堂阿妹','堂房妹妹','堂房阿妹','叔伯妹妹','叔伯老妹','堂细妹'],
'f,xb,d&l,h':['堂妹夫'],
'f,xb,d,s':['堂外甥'],
'f,xb,d,s,w':['堂外甥媳妇'],
'f,xb,d,d':['堂外甥女'],
'f,xb,d,d,h':['堂外甥女婿'],
'f,os':['大姑','姑姊','姑嬷'],
'f,os,h':['大姑丈','大姑','恩伯'],
'f,ls':['小姑','姑姐','姑妹','姑仔','尕娘','幺姑姐','老姑'],
'f,ls,h':['小姑丈','小姑','恩叔'],
'f,xs':['姑妈','姑母','姑姑','恩妈','几姑','姑','嬢嬢','娘娘'],
'f,xs,h':['姑丈','姑父','姑爸','恩爸','姑伯','姑爹','姑夫','姑婿','姑郎','亘'],
'f,os':['大姑','大姑妈','姑姊'],
'f,os,h':['大姑丈','大姑父','大姑爸','恩伯'],
'f,ls':['小姑','小姑妈','姑姐','姑妹','姑仔','尕娘','幺姑','幺姑姐','老姑','细姑','满姑'],
'f,ls,h':['小姑丈','小姑父','小姑爹','恩叔'],
'f,xs':['姑妈','姑母','姑姑','恩妈','嬢嬢','娘娘','几姑','姑','阿姑'],
'f,xs,h':['姑丈','姑父','姑爸','恩爸','姑爹','姑夫','姑婿','亘'],
'f,f,xb,s&o':['堂伯'],
'f,f,xb,s&o,w':['堂伯母'],
'f,f,xb,s&l':['堂叔'],
@ -151,17 +304,17 @@ export default {
// 母系
'm':['妈妈','母亲','老母亲','老妈','阿妈','阿母','阿娘','老母','妈咪','依妈','老娘','老乸','老妈子','妈子','娘老子','妈','母','娘','阿毑','姆嬷','姆妈','娘亲'],
'm,ob':['大舅','大舅舅','舅伯','元舅'],
'm,ob,w':['大舅妈','大妗','舅'],
'm,lb':['小舅','小舅舅','舅仔','舅父仔','尕阿舅','老舅'],
'm,ob,w':['大舅妈','大妗','舅'],
'm,lb':['小舅','小舅舅','舅仔','舅父仔','幺舅','老舅','细舅','满舅','尕阿舅'],
'm,lb,w':['小舅妈','小妗','细妗'],
'm,xb':['舅舅','舅爸','舅父','舅爹','娘舅','母舅','阿舅','妗公','舅台','几舅','舅'],
'm,xb,w':['舅妈','舅母','舅娘','娘妗','舅妻','舅姆','舅姆妈','舅媳妇','舅妇','舅姥','舅毑','老妗','妗子','妗妗','妗妗儿','妗爹','妗娘','妗爸','妗妈','妗母','阿妗','妗门','妗婆仔','妗儿妈','子','妗','嬢嬢'],
'm,os':['大姨','姨嬷'],
'm,os,h':['大姨丈','大姨父','大姨','姨伯'],
'm,ls':['小姨','姨仔','老姨'],
'm,ls,h':['小姨丈','小姨父','小姨夫','姨叔'],
'm,xs':['姨妈','姨母','姨姨','姨娘','阿姨','从母','几姨','姨','嬢嬢'],
'm,xs,h':['姨丈','姨父','姨夫','姨爸','姨爹','姨婿','姨郎','尹'],
'm,xb':['舅舅','舅爸','舅父','舅爹','娘舅','母舅','阿舅','妗公','几舅','舅'],
'm,xb,w':['舅妈','舅母','舅娘','舅妻','舅姆','舅姆妈','舅媳妇','舅妇','舅姥','老妗','妗子','妗妗','妗','妗娘','妗母','阿妗','妗门','妗婆仔','妗儿妈','妗'],
'm,os':['大姨','大姨妈'],
'm,os,h':['大姨丈','大姨父','大姨','姨伯'],
'm,ls':['小姨','小姨妈','姨仔','幺姨','老姨','满姨','细姨','尕姨娘'],
'm,ls,h':['小姨丈','小姨父','小姨爹','老姨夫','姨叔'],
'm,xs':['姨妈','姨母','姨姨','姨娘','阿姨','几姨','姨','从母'],
'm,xs,h':['姨丈','姨父','姨爸','姨爹','姨夫','姨婿','姨郎','尹'],
'm,f,xb,s':['堂舅'],
'm,f,xb,s,w':['堂舅妈'],
'm,f,xb,d':['堂姨'],
@ -185,8 +338,8 @@ export default {
'h,f,m':['祖婆母','祖婆','祖婆婆','奶婆母'],
'h,m,f':['外祖公父','毑公父','外祖公','外祖公公','姥公父','姥公'],
'h,m,m':['外祖婆母','毑婆母','外祖婆','外祖婆婆','姥婆母','姥婆'],
'h,f':['公公','公父','家公','家爷','大官','老公公','老人公','大人公','公公爸','公爹','翁亲','君舅','老公爹','家官','老官','婆父','婆爹'],
'h,m':['婆婆','婆母','家婆','家娘','大家','老婆婆','老人婆','大人婆','婆妈','婆妈','姑亲','君姑','婆母娘','婆子妈','姑'],
'h,f':['公公','公父','家公','家官','家翁','家爷','翁亲','老官','大官','老公公','老人公','大人公','公爹','老公爹','婆父','婆爹','君舅'],
'h,m':['婆婆','婆母','家婆','家娘','姑亲','大家','老婆婆','老人婆','大人婆','婆妈','婆母娘','婆子妈','姑'],
'h,f,ob':['伯公父','伯公','伯翁','伯公公','伯祖','婆婆伯'],
'h,f,ob,w':['伯婆母','伯婆','姆婆','伯婆婆','伯姆','婆婆伯姆'],
'h,f,lb':['叔公父','叔公','叔翁','叔公公','叔祖','婆婆叔'],
@ -200,8 +353,10 @@ export default {
'h':['老公','丈夫','先生','夫','男人','新郎','爱爷','夫亲','夫君','官人','汉子','老头子','郎君','相公','夫婿','良人','老公仔','爱人','老伴','那口子','配偶','伴侣','伉俪','卿卿'],
'h,ob':['大伯子','大伯儿','大伯兄','伯子','伯仔','伯兄','阿伯','大伯爷','伯爷子','婿伯'],
'h,ob,w':['大婶子','大婶儿','大叔兄妇','伯兄妇','伯嫂','伯妇','伯姆','姒妇','姒姆','大伯嫂','姆姆','大姆','大伯妇','大伯娘','姐妇','阿姆'],
'h,lb':['小叔子','小叔儿','小叔弟','叔子','叔仔','叔弟','阿叔','叔郎','小郎'],
'h,lb,w':['小婶子','小婶儿','小叔弟妇','叔弟妇','叔嫂','叔妇','叔姆','娣妇','娣姆','小叔妇','婶婶','小婶','小婶婶'],
'h,lb':['小叔子','小叔儿','小叔弟','叔子','叔仔','叔弟','阿叔'],
'h,lb,w':['小婶子','小婶儿','小叔弟妇','叔弟妇','叔嫂','叔妇','叔姆','娣妇','娣姆','小叔妇','婶婶','小婶','小叔妇','小婶婶'],
'h,[ob|lb]':['伯叔'],
'h,xb,w':['妯娌','娣姒','娣姒姊妹','婶子'],
'h,xb,s':['叔侄'],
'h,xb,d':['叔侄女'],
'h,os':['大姑子','大姑姐','大姑儿','大姑娘','姑姊','婆姐','婆婆姐','大娘姑'],
@ -233,48 +388,48 @@ export default {
'w,f,f,xb,s&l,w':['姻婶'],
'w,m,f':['外祖岳父','毑岳父','外祖丈人爹','外祖丈人','外太岳父','姥岳父','姥丈爷','姥丈人','姥丈人爹','老丈爷','姥爷丈人'],
'w,m,m':['外祖岳母','毑岳母','外祖丈母娘','外祖丈母','外太岳母','姥岳母','姥丈姥','姥丈母','姥丈母娘','老丈娘'],
'w,f':['岳父','丈人','老丈人','外父','泰山','外舅','老亲爷','丈人爹','老干爷','丈人公','丈母爷','丈爷','丈爷爹','丈父','岳老子','老丈杆子','岳丈','岳翁','妻公','妇翁','冰翁'],
'w,m':['岳母','丈母','老丈母','外母','泰水','外姑','老亲娘','丈人娘','老干娘','丈人婆','丈母娘','丈姥','丈姥娘','丈姆','岳母娘','丈母婆','丈姆婆','丈姆娘'],
'w':['老婆','妻子','媳妇','媳妇儿','媳妇子','太太','妻','女人','新娘','爱姥','妻亲','娘子','新娘子','夫人','婆娘','老太婆','内人','内子','内助','贤内助','爱妻','发妻','婆姨','婆子','老婆子','老婆儿','老婆仔','堂客','爱人','老伴','那口子','配偶','伴侣','伉俪','卿卿'],
'w,ob':['大舅子','大舅哥','大舅佬','大阿舅','丈人兄','舅哥'],
'w,ob,w':['大舅妇','大妗子','大妗儿','大舅姆','大舅兄嫂','大舅嫂','大舅姐','大舅媳妇','丈人嫂'],
'w,lb':['小舅子','小舅弟','小舅佬','小阿舅','丈人弟','舅弟'],
'w,lb,w':['小舅妇','小妗子','小妗儿','小舅姆','小舅弟妇','小舅嫂','舅弟媳','小舅妹','小舅媳妇'],
'w,f':['岳父','丈人','老丈人','外父','泰山','外舅','老亲爷','丈人爹','老干爷','丈人公','丈母爷','丈爷','丈爷爹','丈父','岳老子','老丈杆子','岳丈','岳翁','家岳'],
'w,m':['岳母','丈母','老丈母','外母','泰水','外姑','老亲娘','丈人娘','老干娘','丈人婆','丈母娘','丈姥','丈姥娘','丈姆','岳母娘','丈母婆','丈姆婆'],
'w':['老婆','妻子','媳妇','媳妇儿','太太','妻','女人','新娘','爱姥','妻亲','娘子','新娘子','夫人','婆娘','老太婆','内人','内子','内助','贤内助','爱妻','发妻','婆子','老婆子','老婆儿','老婆仔','堂客','爱人','老伴','那口子','配偶','伴侣','伉俪','卿卿'],
'w,ob':['大舅子','大舅哥','大舅佬','大阿舅','舅哥'],
'w,ob,w':['大舅妇','大舅姆','大舅兄嫂','大舅嫂','大舅姐','大舅媳妇','大妗子','大妗儿'],
'w,lb':['小舅子','小舅弟','小舅佬','小阿舅','舅弟'],
'w,lb,w':['小舅妇','小舅姆','小舅弟妇','小舅嫂','舅弟媳','小舅妹','小舅媳妇','小妗子','小妗儿'],
'w,xb':['舅子','舅佬','妻舅','老婆舅','阿舅','亲家舅','舅老倌'],
'w,xb,w':['舅嫂','舅妇','舅姆','妻妗','妗仔','妗子','妗儿'],
'w,xb,s':['舅侄'],
'w,xb,d':['舅侄女'],
'w,os':['大姨子','大姨姐','大姨儿','姨姐'],
'w,os,h':['大姨夫','大姨姐夫','姨姐夫','襟兄','大尹子'],
'w,os,h':['大姨夫','大姨姐夫','襟兄','大尹子'],
'w,ls':['小姨子','小姨妹','小茙儿','姨妹','姨仔','姨妹子'],
'w,ls,h':['小姨夫','小姨妹夫','姨妹夫','小茙夫','襟弟','小尹子'],
'w,ls,h':['小姨夫','小姨妹夫','小茙夫','襟弟','小尹子'],
'w,xs':['姨子','妻姨'],
'w,xs,h':['连襟','姨夫','连桥','两桥','两乔','姨夫爷','老襟','一担挑','老挑','挑担','担儿挑','连襟儿','襟兄弟','友婿','妻尹','娅'],
'w,xs,h':['连襟','连桥','两桥','姨夫','姨夫爷','一担挑','老挑','挑担','担儿挑','连襟儿','妻尹','娅'],
'w,xs,s':['姨甥'],
'w,xs,d':['姨甥女'],
// 兄弟姐妹系
'ob':['哥哥','哥','胞兄','亲哥','兄亲','老哥','依哥','阿哥','兄台','大佬','家兄','兄长','元兄','长兄','几哥'],
'ob':['哥哥','哥','胞兄','亲哥','老哥','依哥','阿哥','家兄','兄长','大佬','元兄','长兄','几哥'],
'ob,w':['嫂子','嫂','嫂嫂','阿嫂','家嫂','兄姊','兄嫂','兄妇','兄妻','几嫂'],
'ob,s':['侄子','兄子'],
'ob,d':['侄女','兄女'],
'lb':['弟弟','弟','胞弟','亲弟','弟亲','老弟','依弟','阿弟','弟子','细佬','小弟','几弟'],
'lb':['弟弟','弟','胞弟','亲弟','老弟','阿弟','细佬','依弟','小弟','幺弟','细弟','满弟','幼弟','几弟'],
'lb,w':['弟妹','弟媳','弟媳妇','弟媳妇子','弟新妇','老弟嫂'],
'lb,s':['侄子','弟子'],
'lb,d':['侄女','弟女'],
'xb,s':['侄子','侄男','侄儿子','侄小子','嫡侄','亲侄','侄儿','侄仔','阿侄','老侄','侄'],
'xb,s':['侄子','侄男','侄儿','侄儿子','侄','侄仔','阿侄'],
'xb,s,w':['侄媳妇','侄媳','侄嫂','侄妇'],
'xb,d':['侄女','侄囡','侄女儿','侄丫头','侄闺女'],
'xb,d,h':['侄女婿','侄婿','侄郎'],
'os':['姐姐','姐','胞姐','亲姐','姊亲','老姐','依姐','阿姐','姊台','家姐','长姐','姊仔','几姐'],
'xb,d':['侄女','侄囡','侄女儿','侄闺女'],
'xb,d,h':['侄女婿','侄婿'],
'os':['姐姐','姐','胞姐','亲姐','阿姐','阿姊','姊仔','家姐','依姐','长姐','几姐'],
'os,h':['姐夫','姐丈','姐婿','姐郎','姊兄','姐夫哥','胞姐夫'],
'ls':['妹妹','妹','胞妹','亲妹','妹亲','老妹','依妹','阿妹','妹子','小妹','妹儿','几妹'],
'ls':['妹妹','妹','胞妹','亲妹','阿妹','妹儿','妹子','依妹','幺妹','细妹','满妹','幼妹','几妹'],
'ls,h':['妹夫','妹丈','妹婿','妹郎','妹弟','妹夫子','胞妹夫'],
'xs,s':['外甥','甥子','甥男','甥儿','甥儿子','甥','甥'],
'xs,s':['外甥','甥子','甥男','甥儿','甥儿子','甥','甥'],
'xs,s,w':['甥媳妇','甥媳','甥嫂','甥妇','甥儿息妇儿'],
'xs,s,s':['甥孙','远甥','弥甥'],
'xs,s,d':['甥孙女','远甥女','弥甥女'],
'xs,d':['外甥女','甥女','甥囡','甥女儿','甥闺女'],
'xs,d,h':['甥女婿','甥婿','甥郎','甥儿息婿儿'],
'xs,d,h':['甥女婿','甥婿','甥儿息婿儿'],
// 子系
's':['儿子','男儿','息男','闺男','囝囝','囝男','囝儿','小子','娃子','男亲','伢子','长子','次子','幼子','儿','仔','囝','子','阿仔','仔仔','后生','公子','少爷','一世孙'],
's,w':['儿媳','儿媳妇','息妇儿','儿媳妇儿','新妇','新妇囝','心抱','息妇','儿妇','子妇','小妇','少奶奶','少夫人'],
@ -290,21 +445,21 @@ export default {
's,w,xs,h':['姻侄婿'],
's,w,xs,s':['姻侄外孙'],
's,w,xs,d':['姻侄外孙女'],
's,s':['孙子','孙男','孙男儿','孙儿','长孙','嗣孙','孙仔','孙囝','孙娃子','孙伢子','二世孙'],
's,s':['孙子','孙男','孙男儿','孙儿','长孙','孙仔','孙囝','孙娃子','孙伢子','二世孙'],
's,s,w':['孙媳妇','孙媳','孙妇','孙息妇','孙新妇'],
's,s,s':['曾孙','曾孙男','重孙','重孙子','息仔','三世孙'],
's,s,s,w':['曾孙妇','重孙媳妇'],
's,s,s,s':['玄孙','元孙','膀孙','重重孙','四世孙'],
's,s,s,s':['玄孙','元孙','膀孙','四世孙'],
's,s,s,s,w':['玄孙媳妇'],
's,s,s,s,s':['来孙','五世孙'],
's,s,s,s,s,w':['来孙媳妇'],
's,s,s,s,s,s':['晜孙','昆孙','六世孙'],
's,s,s,s,s,s':['晜孙','六世孙'],
's,s,s,s,s,s,w':['晜孙媳妇'],
's,s,s,s,s,s,s':['仍孙','礽孙','七世孙'],
's,s,s,s,s,s,s,w':['仍孙媳妇'],
's,s,s,s,s,s,s,s':['云孙','八世孙'],
's,s,s,s,s,s,s,s,w':['云孙媳妇'],
's,s,s,s,s,s,s,s,s':['耳孙','远孙','裔孙','季孙','九世孙'],
's,s,s,s,s,s,s,s,s':['耳孙','远孙','九世孙'],
's,s,s,s,s,s,s,s,s,w':['耳孙媳妇'],
's,s,s,s,s,s,s,s,s,s':['弥孙','十世孙'],
's,s,s,s,s,s,s,s,s,s,w':['弥孙媳妇'],
@ -369,7 +524,7 @@ export default {
's,s,d,d':['玄外孙女'],
's,s,d,d,h':['玄外孙女婿'],
's,d':['孙女','孙女儿','孙囡','孙囡儿','女孙','孙女子'],
's,d,h':['孙女婿','孙婿','孙郎','孙息婿'],
's,d,h':['孙女婿','孙婿','孙息婿'],
's,d,s':['曾外孙','外息仔'],
's,d,s,w':['曾外孙媳妇'],
's,d,s,s':['曾外曾孙'],
@ -383,7 +538,7 @@ export default {
's,d,d,d':['曾外曾外孙女'],
's,d,d,d,h':['曾外曾外孙女婿'],
'd':['女儿','千金','小姐','掌上明珠','息女','闺女','囡囡','囡女','囡儿','乖囡','囡嗯','丫头','姑娘','妮子','女亲','长女','次女','幼女','女','阿女','女女'],
'd,h':['女婿','姑爷','姑爷儿','女婿子','女婿儿','儿婿','子婿','息婿','小婿','快婿','郎婿','郎婿子','息婿儿','囝婿','囡婿','东床','半子','甥馆','女夫'],
'd,h':['女婿','姑爷','姑爷儿','女婿子','女婿儿','儿婿','子婿','息婿','小婿','郎婿','郎婿子','息婿儿','囝婿','囡婿','东床','半子'],
'd,h,f':['亲家公'],
'd,h,f,f&o':['姻伯'],
'd,h,f,f&l':['姻叔'],
@ -411,7 +566,7 @@ export default {
'd,s,d,d':['外玄外孙女'],
'd,s,d,d,h':['外玄外孙女婿'],
'd,d':['外孙女','外孙囡','外孙女儿'],
'd,d,h':['外孙女婿','外孙婿','外孙郎'],
'd,d,h':['外孙女婿','外孙婿'],
'd,d,s':['外曾外孙','外息仔'],
'd,d,s,w':['外曾外孙媳妇'],
'd,d,s,s':['外曾外曾孙'],
@ -444,8 +599,7 @@ export default {
'1,xs,h,xs':['姑姻姊妹'],
'1,xs,h,xs,s':['姑姻姑男'],
'1,xs,h,xs,d':['姑姻姑女'],
'1,xs,s,s':['离孙男','离孙子'],
'1,xs,s,d':['离孙女'],
'1,xs,s,s':['离孙'],
'0,xb,w,xb':['舅眷兄弟'],
'0,xb,w,xb,s':['舅眷舅男'],
'0,xb,w,xb,d':['舅眷舅女'],
@ -459,8 +613,7 @@ export default {
'0,xs,h,xs,s':['姨姻姑男'],
'0,xs,h,xs,d':['姨姻姑女'],
'0,xb,s':['娘家侄子','娘家侄'],
'0,xb,s,s':['归孙男','归孙子'],
'0,xb,s,d':['归孙女'],
'0,xb,s,s':['归孙'],
'0,xb,d':['娘家侄女'],
'0,xs,s':['姨甥','姨甥男','从男','从子'],
'0,xs,s,w':['从妇'],

64
src/map.js Normal file
View File

@ -0,0 +1,64 @@
// 默认完整映射关系
import _main from './main';
import _prefix from './prefix';
import _branch from './branch';
var _map = {};
// 分支关系
for(var key in _branch){
var tag = key.match(/\{.+?\}/)[0];
var nameList = _branch[key];
for(var k in _prefix[tag]){
var prefixList = _prefix[tag][k];
var newKey = key.replace(tag,k);
var isFilter = ['h,h','w,w','w,h','h,w'].some(pair=>(newKey.includes(pair)));
var newList = [];
if(!isFilter){
prefixList.forEach(function(prefix){
nameList.forEach(function(name){
if(name.includes('?')){
newList.push(name.replace('?',prefix));
}else{
newList.push(prefix+name);
}
});
});
_map[newKey] = [].concat(_map[newKey]||[],newList);
}
}
}
// 主要关系
for(var key in _main){
_map[key] = [].concat(_main[key],_map[key]||[]);
}
// 版权彩蛋
_map['o']=['passer-by.com','\u4f5c\u8005'];
// 配偶关系
var branch = {
'w':['妻','内','岳','岳家','丈人'],
'h':['夫','外','公','婆家','婆婆'],
};
var nameSet = new Set(Object.values(_map).flat());
for(var key in _map){
if(key.match(/^[fm]/)||key.match(/^[olx][bs]$|^[olx][bs],[^mf]/)){
for(var k in branch){
var newKey = k+','+key;
if(!_map[newKey]){
_map[newKey] = [];
}
var prefixList = branch[k];
var nameList = _map[key];
prefixList.forEach(function(prefix){
nameList.forEach(function(name){
var newName = prefix+name;
if(!nameSet.has(newName)){ // 配偶组合的称呼不得已原有称呼冲突(如:妻舅!=妻子的舅舅;外舅公!=老公的舅公)
_map[newKey].push(newName);
}
});
});
}
}
}
export default _map;

597
src/method.js Normal file
View File

@ -0,0 +1,597 @@
// 通用方法
import _filter from './filter';
import _map from './map';
import _pair from './pair';
var _mode = {}; // 模式数据
var _data = Object.assign({},_map); // 最终数据
// 中文数字转阿拉伯数字
var zh2number = function(text){
var num = 0;
var map = {'大':1,'小':99};
var textAttr = ['','一','二','三','四','五','六','七','八','九','十'];
if(map[text]){
num = map[text];
}else{
if(text.includes('十')){
var numAttr = text.split('十');
if(!numAttr[0]){
num = 10;
}else{
num = textAttr.indexOf(numAttr[0])*10;
}
num += textAttr.indexOf(numAttr[1]);
}else{
num += textAttr.includes(text)?textAttr.indexOf(text):0;
}
}
return num;
};
// 阿拉伯数字转中文数字
var number2zh = function(num){
var text = '';
var map = {1:'大',99:'小'};
var textAttr = ['','一','二','三','四','五','六','七','八','九','十'];
if(map[num]){
text = map[num];
}else{
var dec = ~~(num/10);
var unit = num%10;
if(dec){
if(dec>1){
text = dec<textAttr.length?textAttr[dec]:'';
}
text += '十';
text += unit<textAttr.length?textAttr[unit]:'';
}else{
text += num<textAttr.length?textAttr[num]:'';
}
}
return text;
};
// 获得代数
var getGen = function(id){
var gMap = {'f':1,'m':1,'s':-1,'d':-1};
var arr = id.split(',');
var gen = 0;
arr.forEach(function(sub){
var s = sub.replace(/&[ol\d]+/,'');
gen += gMap[s]||0;
});
return gen;
};
// 获得最简
var getOptimal = function(options){
var from = options['from'];
var to = options['to']
var sex = options['sex'];
var from_chain = options['from'].split(',');
var to_chain = options['to'].split(',');
for(var i=0;i<from_chain.length&&i<to_chain.length;i++){
if(from_chain[i]==to_chain[i]){
from = from_chain.slice(i+1).join(',');
to = to_chain.slice(i+1).join(',');
sex = from_chain[i].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;
continue;
}else{
if(getGen(from_chain[i])==getGen(to_chain[i])&&from_chain[i].match(/^[xol][bs]|^[sd]/)){
var from_match = from_chain[i].match(/&([ol\d]+)/);
var to_match = to_chain[i].match(/&([ol\d]+)/);
if(!from_match){
from_match = from_chain[i].match(/([ol])[bs]/);
}
if(!to_match){
to_match = to_chain[i].match(/([ol])[bs]/);
}
var from_attr = from_match?from_match[1]:'';
var to_attr = to_match?to_match[1]:'';
if(from_attr&&to_attr){
if(!isNaN(from_attr)&&!isNaN(to_attr)){
if(+from_attr>+to_attr){
from_chain[i] = from_chain[i].replace(/^[xol]b|^s/,'lb').replace(/^[xol]s|^d/,'ls');
}else if(+from_attr<+to_attr){
from_chain[i] = from_chain[i].replace(/^[xol]b|^s/,'ob').replace(/^[xol]s|^d/,'os');
}
}else if(!isNaN(from_attr)&&to_attr=='o'||from_attr=='l'&&!isNaN(to_attr)){
from_chain[i] = from_chain[i].replace(/^[xol]b|^s/,'lb').replace(/^[xol]s|^d/,'ls');
}else if(!isNaN(from_attr)&&to_attr=='l'||from_attr=='o'&&!isNaN(to_attr)){
from_chain[i] = from_chain[i].replace(/^[xol]b|^s/,'ob').replace(/^[xol]s|^d/,'os');
}
from = from_chain.slice(i).join(',');
to = to_chain.slice(i+1).join(',');
sex = to_chain[i].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;
}else if(options['optimal']){
from_match = from_chain[i].match(/([xol])[bs]/);
to_match = to_chain[i].match(/([xol])[bs]/);
from_attr = from_match?from_match[1]:'';
to_attr = to_match?to_match[1]:'';
if(from_attr=='x'||to_attr=='x'){
from = from_chain.slice(i+1).join(',');
to = to_chain.slice(i+1).join(',');
sex = from_chain[i].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;
continue;
}
}
}
break;
}
}
return {
'from':from,
'to':to,
'sex':sex
};
};
// 数组去重
export function unique(arr){
var sameList = arr.filter(item=>item==item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,''));
return arr.filter(item=>{
var temp = item.replace(/[ol](?=s|b)/,'x').replace(/&[ol]/,'');
return sameList.includes(item)||item!=temp&&!sameList.includes(temp);
}).filter((item,idx,arr) => arr.indexOf(item) === idx);
};
// 中文获取选择器
export function getSelectors(str){
str = str.replace(/之/g,'的').replace(/吾之?(.+)/,'$1').replace(/我的?(.+)/,'$1');
if(str.match(/[^娘婆岳亲]家的?/)){
str = str.replace(/家的?/,'的');
}
var lists = str.split('的');
var result = [];
var isMatch = true;
// 双向替换
var replaceMap = {
'晜':'兄',
'哥':'兄',
'姐':'姊',
'侄':'姪',
'婿':'壻',
'祖父':'王父',
'祖母':'王母',
'弟媳':'弟妇',
'嫂':'兄妇',
'孙女婿':'孙婿',
'甥女婿':'甥婿',
'侄女婿':'侄婿',
'孙媳妇':'孙妇',
'甥媳妇':'甥妇',
'侄媳妇':'侄妇',
};
// 含义扩展
var replaceFilter = {
'^从表':['从父姑表','从父舅表','从父姨表','从母姑表','从母舅表','从母叔表'],
'^表表':['姑表叔表','姑表姑表','姑表舅表','姑表姨表','舅表叔表','舅表姑表','舅表舅表','舅表姨表'],
'^([夫妻内外]?)表':['$1姑表','$1舅表'],
'^([姑舅])表(?=[^伯叔])':['$1表伯','$1表叔'],
'^姻':['姑姻','姨姻','姊妹姻','女姻'],
'^眷':['叔眷','舅眷','兄弟眷','男眷'],
'^亲家':['姊妹姻','兄弟眷'],
'^([堂表姨]?)([曾高天烈太远鼻]?)(祖?)([伯叔姑舅姨])':['$1$4$2$3'],
'^([曾高天烈太远鼻]?)祖?王姑':['姑$1祖母'],
'^([曾玄来晜仍云耳])([侄甥])':['$2$1'],
'^外表([伯叔姑舅姨])':['姑表$1外','舅表$1外'],
'^([堂表姨]?)外甥':['$1甥'],
'^([舅叔])([曾玄外]*)孙':['$1侄$2孙'],
'^([姨姑])([曾玄外]*)孙':['$1甥$2孙'],
'([孙甥侄])$':['$1男','$1女'],
'([姑舅姨叔])([孙外]*)([男女])$':['$1表侄$2$3','$1表甥$2$3'],
'祖$':['祖父'],
'嫂$':['兄妇'],
'女儿$':['女'],
};
while(lists.length){
var name = lists.shift(); //当前匹配词
var items = []; //当前匹配词可能性
var x_items = [];
var r_items = [];
var keywords = [name];
var getList = function(name){
for(var filter in replaceFilter){
var word_list = replaceFilter[filter];
word_list.forEach(function(word){
var name1 = name.replace(new RegExp(filter),word);
if(name1!=name){
keywords.push(name1);
getList(name1);
}
});
}
for(var word in replaceMap){
var name1 = name.replace(word,replaceMap[word]);
var name2 = name.replace(replaceMap[word],word);
if(name1!=name){
keywords.push(name1);
}
if(name2!=name){
keywords.push(name2);
}
}
};
getList(name);
// 通过关键词找关系
keywords.forEach(function(name){
var x_name = name.replace(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/,'几');
var r_name = name.replace(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/,'');
var match = name.match(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/);
if(match){
var num = zh2number(match[0]);
for(var i in _data){
var r_i = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num);
if(_data[i].includes(x_name)){
x_items.push(r_i);
}else if(_data[i].includes(r_name)){
if(!i.match(/^[mf,]+$/)&&!r_name.match(/^[从世]/)){ // 直系祖辈不参与排序
r_items.push(r_i);
}
}
if(_data[i].includes(name)){
items.push(r_i);
}
}
}else{
for(var i in _data){
if(_data[i].includes(name)){
items.push(i);
}
}
}
});
// console.log('[keywords]',keywords);
// 如找不到结果,再是否存在称呼的排行问题(不直接判断,因存在"大舅""三从父兄""三世祖"这样特俗含义的情况)
if(!items.length){
items = x_items;
}
if(!items.length){
items = r_items;
}
// 完全匹配不到结果
if(!items.length){
isMatch = false;
}
var res = [];
if(!result.length){
result = [''];
}
result.forEach(function(a){
items.forEach(function(b){
res.push(a+(b?','+b:''));
});
});
result = res;
}
return isMatch?result:[];
};
// 合并选择器,查找两个对象之间的关系
export function mergeSelector(param){
var from_selector = param['from'];
var to_selector = param['to'];
var my_sex = param['sex'];
if(my_sex<0){
var to_sex = -1;
var 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{
return [];
}
}
var from_ids = selector2id(param['from'],my_sex);
var to_ids = selector2id(param['to'],my_sex);
if(!from_ids.length||!to_ids.length){
return [];
}
var result = [];
from_ids.forEach(function(from){
to_ids.forEach(function(to){
var sex = my_sex;
var selector = ','+to;
if(selector.match(/,([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?$/)){
sex = 1;
}
if(selector.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)){
sex = 0;
}
if(from&&to){
var isOptimal = param.optimal;
if(from.match(/&\d+/)||to.match(/&\d+/)){
isOptimal = true;
}
if(isOptimal){
var ops = getOptimal({
'from':from,
'to':to,
'sex':my_sex,
'optimal':param.optimal
});
from = ops['from'];
to = ops['to'];
my_sex = ops['sex'];
}
}
var to_rids = to?reverseId(to,my_sex):[''];
to_rids.forEach(function(to_r){
var selector = (to_r?','+to_r:'')+(from?','+from:'');
result.push({
'selector':selector,
'sex':sex
});
});
});
});
return result;
};
// 选择器转ID
export function selector2id(selector,sex){
var result = [];
var hash = {};
if(!selector.match(/^,/)){
selector = ','+selector;
}
//性别判断
if(sex<0){
if(selector.match(/^,[w1]/)){
sex = 1;
}else if(selector.match(/^,[h0]/)){
sex = 0;
}
}else if(sex==1&&selector.match(/^,[h0]/)){
return [];
}else if(sex==0&&selector.match(/^,[w1]/)){
return [];
}
// console.log('[selector]',selector);
var getId = function(selector,sex){
if(!selector.match(/^,/)){
selector = ','+selector;
}
if(sex>-1&&!selector.includes(',1')&&!selector.includes(',0')){
selector = ','+sex+selector;
}
if(selector.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/)){ //同志关系去除
return [];
}
var s='';
if(!hash[selector]){
hash[selector] = true;
do{
s = selector;
for(var i in _filter){
var item = _filter[i];
// console.log('[filter]',item['exp'],selector);
selector = selector.replace(item['exp'],item['str']);
if(selector.includes('#')){
selector.split('#').forEach(getId);
return false;
}
}
}while(s!=selector);
if(selector.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/)){ //同志关系去除
return false;
}
selector = selector.replace(/,[01]/,'').substr(1); //去前面逗号和性别信息
result.push(selector);
}
}
getId(selector,sex);
return unique(result);
};
// 逆转ID
export function reverseId(id,sex){
var hash = {
f:['d','s'],
m:['d','s'],
h:['w',''],
w:['','h'],
s:['m','f'],
d:['m','f'],
lb:['os','ob'],
ob:['ls','lb'],
xb:['xs','xb'],
ls:['os','ob'],
os:['ls','lb'],
xs:['xs','xb']
};
var age = '';
if(id.match(/&o$/)){
age = '&l';
}else if(id.match(/&l$/)){
age = '&o';
}
if(id){
id = id.replace(/&[ol\d+]/g,'');
//性别判断
if(sex<0){
if(id.match(/^w/)){
sex = 1;
}else if(id.match(/^h/)){
sex = 0;
}
}
var result = [];
var doing = function(sex){
var sid = (','+sex+','+id).replace(/,[fhs]|,[olx]b/g,',1').replace(/,[mwd]|,[olx]s/g,',0');
sid = sid.substring(0,sid.length-2);
var id_arr = id.split(',').reverse();
var sid_arr = sid.split(',').reverse();
var arr = id_arr.map((id,i)=>hash[id][sid_arr[i]]);
var r_id = arr.join(',');
var gen = getGen(r_id);
return r_id +(gen?'':age);
};
if(sex<0){
result.push(doing(1));
result.push(doing(0));
}else{
result.push(doing(sex));
}
return result;
}
return [''];
};
// 通过ID获取关系称呼
export function getItemsById(id){
var items = [];
var getData = function(d){
var res = [];
if(_data[d]){
res.push(_data[d][0]);
}else{
for(var i in _data){
if(i.replace(/&[ol]/g,'')==d){
res.push(_data[i][0]);
}else{
var expr = d;
while (expr.match(/[ol](b|s)/)){
expr = expr.replace(/[ol](b|s)/,'x$1');
if(expr==i){
res.push(_data[i][0]);
break;
}
}
}
}
}
return res;
};
// 对排序进行处理
if(id.match(/&([\d]+)(,[hw])?$/)){
var num = id.match(/&([\d]+)(,[hw])?$/)[1];
var zh = number2zh(num);
id = id.replace(/&\d+/g,'');
if(_data[id]){
var item = '';
var gen = getGen(id);
if(gen<3&&!id.match(/[hw],/)){
_data[id].forEach(function(name){
if(!item&&name.includes('几')){
item = name.replace('几',zh);
}
});
if(!item){
item = _data[id][0].match(/^[大小]/)?_data[id][0].replace(/^[大小]/,zh):zh+_data[id][0];
}
}else{
item = _data[id][0]
}
items.push(item);
}
}else{
id = id.replace(/&\d+/g,'');
}
// 直接匹配称呼
if(!items.length){
items = getData(id);
}
// 忽略年龄条件查找
if(!items.length){
id = id.replace(/&[ol]/g,'');
items = getData(id);
}
// 忽略年龄条件查找
if(!items.length){
id = id.replace(/[ol](b|s)/g,'x$1');
items = getData(id);
}
// 缩小访问查找
if(!items.length){
var l = id.replace(/x/g,'l');
var o = id.replace(/x/g,'o');
items = items.concat(getData(o),getData(l));
}
return items;
};
// 通过ID获取关系链
export function getChainById(id){
var arr = id.split(',');
return arr.map(function(sign){
var key = sign.replace(/&[ol\d]+/,'');
var data = Object.assign({},_data,{
'xb':['兄弟'],
'xs':['姐妹']
});
return data[key][0];
}).join('的');
};
// 通过ID获取关系合称
export function getPairsByIds(id1,id2){
var result = [];
var result_x = [];
var result_r = [];
id1 = id1.replace(/&\d+/,'');
id2 = id2.replace(/&\d+/,'');
var id1_x = id1.replace(/([ol])([bs])/,'x$2');
var id2_x = id2.replace(/([ol])([bs])/,'x$2');
var id1_r = id1.replace(/&[ol]/,'');
var id2_r = id2.replace(/&[ol]/,'');
for(var key in _pair){
var selectors = key.split('#');
if(selectors.length>1){
var list1 = selector2id(selectors[0]);
var list2 = selector2id(selectors[1]);
var list1_r = list1.map(function(selector){
return selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2');
});
var list2_r = list2.map(function(selector){
return selector.replace(/&[ol\d]+/,'').replace(/([ol])([bs])/,'x$2');
});
if(list1.includes(id1)&&list2.includes(id2)||list1.includes(id2)&&list2.includes(id1)){
result.push(_pair[key][0]);
}
if(list1_r.includes(id1_x)&&list2_r.includes(id2_x)||list1_r.includes(id2_x)&&list2_r.includes(id1_x)){
result_x.push(_pair[key][0]);
}
if(list1_r.includes(id1_r)&&list2_r.includes(id2_r)||list1_r.includes(id2_r)&&list2_r.includes(id1_r)){
result_r.push(_pair[key][0]);
}
}
}
if(!result.length){
result = result_x;
}
if(!result.length){
result = result_r;
}
return result;
};
// 设置模式数据
export function setMode(sign,data){
_mode[sign] = Object.assign(_mode[sign]||{},data);
};
// 获取模式数据
export function getDataByMode(sign){
var data = Object.assign({},_map);
if(sign&&_mode[sign]){
for(var key in _mode[sign]){
data[key] = [].concat(_mode[sign][key],_map[key]||[]);
}
}
return data;
};

View File

@ -1,27 +0,0 @@
/*
* 缓存数据
*/
import _input from './data/input.js';
import _sort from './data/sort.js';
import {modeData} from './mode.js';
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 = {};
Object.entries(_hash).forEach(([key, names]) => {
names.forEach((name) => {
if (!cacheData[name]) {
cacheData[name] = [];
}
cacheData[name].push(key);
});
});
export {cacheData};

View File

@ -1,17 +0,0 @@
/*
* 只作为输入关系链判断
*/
export default {
'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':['妯娌','娣姒','娣姒姊妹','婶子'],
};

View File

@ -1,153 +0,0 @@
/*
* 并称关系链 - 某个称呼同时包含多层关系链
*/
export default {
'[f,f|f,m|m,f],[f,m],f':['老太奶爷','祖太奶爷'],
'[f,f|f,m|m,f],[f,m],m':['老太奶奶','祖太奶奶'],
'[f,m|m,f|m,m],[f,m],f':['老太姥爷','祖太姥爷'],
'[f,m|m,f|m,m],[f,m],m':['老太姥姥','祖太姥姥'],
'[f|m],[f|m],f':['太老爷'],
'[f|m],[f|m],f,ob':['伯太老爷'],
'[f|m],[f|m],f,ob,w':['伯太老姥'],
'[f|m],[f|m],f,lb':['叔太老爷'],
'[f|m],[f|m],f,lb,w':['叔太老姥'],
'[f|m],[f|m],f,xs':['姑太老姥'],
'[f|m],[f|m],f,xs,h':['姑太老爷'],
'[f|m],[f|m],m':['太老姥'],
'[f|m],[f|m],m,xb':['舅太老爷'],
'[f|m],[f|m],m,xb,w':['舅太老姥'],
'[f|m],[f|m],m,xs':['姨太老姥'],
'[f|m],[f|m],m,xs,h':['姨太老爷'],
'[f,f|f,m|m,f],f':['太奶爷','祖奶爷','祖爷爷'],
'[f,f|f,m|m,f],f,ob':['伯太奶爷','太伯奶爷'],
'[f,f|f,m|m,f],f,ob,w':['伯太奶奶','太伯奶奶'],
'[f,f|f,m|m,f],f,lb':['叔太奶爷','太叔奶爷'],
'[f,f|f,m|m,f],f,lb,w':['叔太奶奶','太叔奶奶'],
'[f,f|f,m|m,f],f,xs':['姑太奶奶','太姑奶奶'],
'[f,f|f,m|m,f],f,xs,h':['姑太奶爷','太姑奶爷'],
'[f,f|f,m|m,f],m':['太奶奶','祖奶奶'],
'[f,f|f,m|m,f],m,xb':['舅太奶爷','太舅奶爷'],
'[f,f|f,m|m,f],m,xb,w':['舅太奶奶','太舅奶奶'],
'[f,f|f,m|m,f],m,xs':['姨太奶奶','太姨奶奶'],
'[f,f|f,m|m,f],m,xs,h':['姨太奶爷','太姨奶爷'],
'[f,m|m,f|m,m],f':['太姥爷','祖姥爷','太毑爷'],
'[f,m|m,f|m,m],f,ob':['伯太姥爷','伯叔姥爷'],
'[f,m|m,f|m,m],f,ob,w':['伯太姥姥','太伯姥姥'],
'[f,m|m,f|m,m],f,lb':['叔太姥爷','太叔姥爷'],
'[f,m|m,f|m,m],f,lb,w':['叔太姥姥','太叔姥姥'],
'[f,m|m,f|m,m],f,xs':['姑太姥姥','太姑姥姥'],
'[f,m|m,f|m,m],f,xs,h':['姑太姥爷','太姑姥爷'],
'[f,m|m,f|m,m],m':['太姥姥','祖姥姥','太毑毑','太姥'],
'[f,m|m,f|m,m],m,xb':['舅太姥爷','太舅姥爷'],
'[f,m|m,f|m,m],m,xb,w':['舅太姥姥','太舅姥姥'],
'[f,m|m,f|m,m],m,xs':['姨太姥姥','太姨姥姥'],
'[f,m|m,f|m,m],m,xs,h':['姨太姥爷','太姨姥爷'],
'[f|m],[f|m],[f|m]':['曾祖辈','祖祖','老太','阿太'],
'[f|m],[f|m]':['祖辈'],
'[f|m],f':['老爷'],
'[f|m],f,ob':['伯老爷'],
'[f|m],f,ob,w':['伯老姥'],
'[f|m],f,lb':['叔老爷'],
'[f|m],f,lb,w':['叔老姥'],
'[f|m],f,xs':['姑老姥'],
'[f|m],f,xs,h':['姑老爷'],
'[f|m],m':['老姥'],
'[f|m],m,xb':['舅老爷'],
'[f|m],m,xb,w':['舅老姥'],
'[f|m],m,xs':['姨老姥'],
'[f|m],m,xs,h':['姨老爷'],
'f,f,[f|m]':['曾祖父母'],
'f,f,[f,xs|m,xb],s':['舅姑爷爷','舅姑爷'],
'f,[f|m]':['祖父母','爷爷奶奶'],
'f,[ob|ob,w]':['伯父母'],
'f,[lb|lb,w]':['叔父母'],
'f,xb,[s|d]':['堂兄弟姐妹','堂姐妹兄弟','从父兄弟姐妹'],
'f,[xs|xs,h]':['姑父母'],
'f,xs,[s|d]':['姑表兄弟姐妹'],
'm,[f|m],f':['老外公','老外爷','老姥爷'],
'm,[f|m],m,':['老外婆','老外奶','老姥姥','老姥娘','老嫏娘'],
'm,[f|m]':['外祖父母','外公外婆','姥姥姥爷'],
'm,f,[f,xs|m,xb],s':['舅姑姥爷'],
'm,[xb|xb,w]':['舅父母'],
'm,xb,[s|d]':['舅表兄弟姐妹'],
'm,[xs|xs,h]':['姨父母'],
'm,xs,[s|d]':['姨兄弟姐妹','姨姐妹兄弟','从母兄弟姐妹'],
'[f|m]':['父母','爹娘','爹妈','爸妈','爸爸妈妈','父母亲','双亲','二亲','两亲','二老','高堂'],
'[f|m],[f,xs|m,xb],s':['舅姑爸','姑舅爸'],
'[f|m],[f,xs|m,xb],s&o,w':['舅姑姆','姑舅姆'],
'[f|m],[f,xs|m,xb],s&l,w':['舅姑婶','姑舅婶'],
'[f|m],[f,xs|m,xb],d':['姑舅娘娘'],
'[f|m],m,xs,s':['两姨爸'],
'[f|m],m,xs,s&o,w':['两姨姆'],
'[f|m],m,xs,s&l,w':['两姨婶'],
'[f|m],m,xs,d':['两姨娘娘'],
'w,[f|m]':['岳父母','岳父岳母','丈人丈母','舅姑'],
'w,f,[ob|ob,w]':['伯岳父母'],
'w,f,[lb|lb,w]':['叔岳父母'],
'w,f,[xs|xs,h]':['姑岳父母'],
'w,m,[xb|xb,w]':['舅岳父母'],
'w,m,[xs|xs,h]':['姨岳父母'],
'w,[f,xs|m,xb],d':['姑舅姨子'],
'w,[f,xs|m,xb],d,h':['姑舅连襟','姑舅连桥'],
'h,[f|m]':['公婆','翁姑','姑翁','姑舅','大家官','公公婆婆','姑章','姑嫜'],
'h,f,[ob|ob,w]':['伯公婆'],
'h,f,[lb|lb,w]':['叔公婆'],
'h,f,[xs|xs,h]':['姑公婆'],
'h,m,[xb|xb,w]':['舅公婆'],
'h,m,[xs|xs,h]':['姨公婆'],
'[xb|xs]':['兄弟姐妹','同胞','同胞兄弟姐妹','手足'],
'[ob|os]':['哥哥姐姐'],
'[lb|ls]':['弟弟妹妹'],
'[ob|ob,w]':['哥哥嫂嫂','兄嫂'],
'[f,xb|m,xs],[s|d]':['从兄弟姐妹','从姐妹兄弟'],
'[f,xs|m,xb],[s|d]':['表兄弟姐妹','表姐妹兄弟','老表','阿表'],
'[f,xs|m,xb],s':['姑舅兄弟','舅姑兄弟'],
'[f,xs|m,xb],s&o':['姑舅哥','姑舅哥哥'],
'[f,xs|m,xb],s&l':['姑舅弟','姑舅弟弟'],
'[f,xs|m,xb],d':['姑舅姊妹','舅姑姊妹'],
'[f,xs|m,xb],d&o':['姑舅姐','姑舅姐姐'],
'[f,xs|m,xb],d&l':['姑舅妹','姑舅妹妹'],
'[f,xs|m,xb],s,s':['姑舅儿子'],
'[f,xs|m,xb],s,d':['姑舅女儿'],
'[xb|xs],[s|d]':['侄甥'],
'xb,[s|d]':['侄子女','侄子侄女'],
'xs,[s|d]':['甥子女','外甥子女'],
'[w|s|d]':['妻儿','妻小'],
'[w|d]':['妻女'],
'[s|d]':['子女','儿女','仔女','小孩','孩子','孩子们','孩儿','小孩儿','宝宝','宝贝','娃','娃子','儿辈','子辈','细伢','伢子','子息','子嗣','崽','幺儿'],
'[s|d],[s|d]':['孙辈','孙息','孙枝'],
's,[s|d]':['孙子女'],
'd,[s|d]':['外孙子女'],
's#xb,s':['子侄'],
's#s,w':['子媳'],
'[s|d]#[s|d],[s|d]':['儿孙','子孙','孙息'],
'[s,w|d,h],[f|m]':['亲家','儿女亲家'],
'[s,w|d,h],f':['亲家公','亲家父','亲家翁','亲家世翁','姻翁'],
'[s,w|d,h],f,f':['太姻翁'],
'[s,w|d,h],f,m':['太姻姆'],
'[s,w|d,h],f,f,f':['太姻翁'],
'[s,w|d,h],f,f,m':['太姻姆'],
'[s,w|d,h],f,f,ob':['姻伯翁'],
'[s,w|d,h],f,f,ob,w':['姻伯姆'],
'[s,w|d,h],f,f,lb':['姻叔翁'],
'[s,w|d,h],f,f,lb,w':['姻叔母'],
'[s,w|d,h],f,f,xb,s&o':['姻家兄'],
'[s,w|d,h],f,f,xb,s&o,w':['姻家兄妇'],
'[s,w|d,h],f,f,xb,s&l':['姻家弟'],
'[s,w|d,h],f,f,xb,s&l,w':['姻家弟妇'],
'[s,w|d,h],f,f,xb,s,s':['姻家侄'],
'[s,w|d,h],f,f,xb,s,s,w':['姻家侄妇'],
'[s,w|d,h],f,ob':['姻兄'],
'[s,w|d,h],f,ob,w':['姻兄妇'],
'[s,w|d,h],f,lb':['姻弟'],
'[s,w|d,h],f,lb,w':['姻弟妇'],
'[s,w|d,h],f,xb,s':['姻侄'],
'[s,w|d,h],f,xb,s,w':['姻侄妇'],
'[s,w|d,h],m':['亲家母','亲家婆','亲家姆','亲姆','姻姆'],
'[s,w|d,h],m,ob':['姻仁兄'],
'[s,w|d,h],m,ob,w':['姻仁兄妇'],
'[s,w|d,h],m,lb':['姻仁弟'],
'[s,w|d,h],m,lb,w':['姻仁弟妇'],
'[s,w|d,h],[f|m],f':['姻太翁'],
'[s,w|d,h],[f|m],m':['姻太姆'],
};

View File

@ -1,11 +0,0 @@
/*
* 排序字段
*/
export default {
'f,xb':['几爸爸','几爸','几爹'],
'f,xb,w':['几妈妈','几妈','几娘'],
'f,f,xb':['几爷爷','几大爷','几嗲','几爷','几公'],
'f,f,xb,w':['几奶奶','几大娘','几奶','几婆'],
'm,f,xb':['几外公','几姥爷','几外爷'],
'm,f,xb,w':['几外婆','几姥姥','几姥奶','几外奶','几姥'],
};

View File

@ -1,201 +0,0 @@
/*
* 标识符 - 唯一性关系链关系链转换成中文表述
*/
import _pair from './data/pair.js';
import _sort from './data/sort.js';
import {number2zh} from './unit.js';
import {selector2id} from './selector.js';
import {modeData} from './mode.js';
// 逆转ID
export function reverseId(id,sex){
if(!id){
return [''];
}
// 映射关系
let hash = {
f:['d','s'],
m:['d','s'],
h:['w',''],
w:['','h'],
s:['m','f'],
d:['m','f'],
lb:['os','ob'],
ob:['ls','lb'],
xb:['xs','xb'],
ls:['os','ob'],
os:['ls','lb'],
xs:['xs','xb']
};
// 年纪判断
let age = '';
if(id.match(/&o$/)){
age = '&l';
}else if(id.match(/&l$/)){
age = '&o';
}
id = id.replace(/&[ol\d+]/g,'');
// 性别判断
if(sex<0){
if(id.match(/^w/)){
sex = 1;
}else if(id.match(/^h/)){
sex = 0;
}
}
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){
return [doing(1),doing(0)];
}else{
return [doing(sex)];
}
};
// ID列表去重
export function filterId(arr){
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){
const gMap = {'f':1,'m':1,'s':-1,'d':-1};
let gen = 0;
id.split(',').forEach(sub => {
const s = sub.replace(/&[ol\d]+/,'');
gen += gMap[s]||0;
});
return gen;
};
// 通过ID获取关系称呼
export function getItemsById(id){
let items = [];
const getData = function(key){
let ids = [];
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(id => modeData[id][0]);
};
// 对排序进行处理
if(id.match(/&([\d]+)(,[hw])?$/)){
const num = id.match(/&([\d]+)(,[hw])?$/)[1];
const zh = number2zh(num);
id = id.replace(/&\d+/g,'');
if(_sort[id]){
items.push(_sort[id][0].replace('几',zh));
}else if(modeData[id]){
const gen = getGenById(id);
let item = '';
if(gen<3&&!id.match(/[hw],/)){
modeData[id].forEach(function(name){
if(!item&&name.includes('几')){
item = name.replace('几',zh);
}
});
if(!item){
item = modeData[id][0];
item = item.match(/^[大小]/)?item.replace(/^[大小]/,zh):zh+item;
}
}
items.push(item);
}
}
// 直接匹配称呼
if(!items.length){
id = id.replace(/&\d+/g,'');
items = getData(id);
}
// 忽略年龄条件查找
if(!items.length){
id = id.replace(/&[ol]/g,'');
items = getData(id);
}
// 忽略年龄条件查找
if(!items.length){
id = id.replace(/[ol](b|s)/g,'x$1');
items = getData(id);
}
// 缩小访问查找
if(!items.length){
let l = id.replace(/x/g,'l');
let o = id.replace(/x/g,'o');
items = items.concat(getData(o),getData(l));
}
return items;
};
// 通过ID获取关系链
let data = {
...modeData,
'xb': ['兄弟'],
'xs': ['姐妹']
};
export function getChainById(id,sex=-1){
let item = id.split(',').map(sign => {
const key = sign.replace(/&[ol\d]+/,'');
return data[key][0];
}).join('的');
if(sex>-1&&data[sex+','+id]){
if(sex==0){
item = '(女性)'+item;
}else if(sex==1){
item = '(男性)'+item;
}
}
return item;
};
// 通过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 = [];
for(const key in _pair){
const selectors = key.split('#');
if(selectors.length>1){
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]);
}
if(list1_r.includes(id1_x)&&list2_r.includes(id2_x)||list1_r.includes(id2_x)&&list2_r.includes(id1_x)){
result_x.push(_pair[key][0]);
}
if(list1_r.includes(id1_r)&&list2_r.includes(id2_r)||list1_r.includes(id2_r)&&list2_r.includes(id1_r)){
result_r.push(_pair[key][0]);
}
}
}
if(!result.length){
result = result_x;
}
if(!result.length){
result = result_r;
}
return result;
};

View File

@ -1,96 +0,0 @@
/*
* 完整关系链数据 - 合并各类关系链数据
*/
import _prefix from './data/prefix.js';
import _branch from './data/branch.js';
import _main from './data/main.js';
import _multipie from './data/multiple.js';
import {expandSelector} from './selector.js';
let _map = { ..._multipie };
// 分支 - 前缀处理
const prefixMap = {};
for(const key in _prefix){
prefixMap[key] = {};
for(const selector in _prefix[key]){
expandSelector(selector).forEach(function(s){
prefixMap[key][s] = _prefix[key][selector];
});
}
}
// 分支 - 节点处理
const branchMap = {};
for(const selector in _branch){
expandSelector(selector).forEach(function(s){
branchMap[s] = _branch[selector];
});
}
// 分支 - 合并
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){
const newList = prefixList.flatMap((prefix) =>
nameList.map((name) => (name.includes('?') ? name.replace('?', prefix) : prefix + name))
);
if(!map[newKey]){
map[newKey] = _map[newKey]||[];
}
map[newKey] = newList.concat(map[newKey]);
}
}
}
return map;
};
_map = {..._map,...getMap(prefixMap,branchMap)};
// 主要关系
for(let key in _main){
_map[key] = [..._main[key], ...(_map[key] || [])];
}
// 版权彩蛋
_map['o']=['passer-by.com','\u4f5c\u8005'];
// 配偶关系
const mateMap = {
'w':['妻','内','岳','岳家','丈人'],
'h':['夫','外','公','婆家','婆婆'],
};
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(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');
if(newKey_x!=newKey&&_map[newKey_x]){ // 不扩大解释年龄
continue;
}
}
if(!_map[newKey]){
_map[newKey] = [];
}
const prefixList = mateMap[k];
const nameList = _map[key];
prefixList.forEach(function(prefix){
nameList.forEach(function(name){
const newName = prefix+name;
if(!nameSet.has(newName)){ // 配偶组合的称呼不得与原有称呼冲突(如:妻舅!=妻子的舅舅;外舅公!=老公的舅公)
_map[newKey].push(newName);
}
});
});
}
}
}
export default _map;

View File

@ -1,25 +0,0 @@
/*
* 模式数据
*/
import _map from './map.js';
let _mode = {}; // 模式缓存
let modeData = { ..._map }; // 最终数据
// 设置模式数据
export function setModeData(sign,data){
_mode[sign] = { ...(_mode[sign] || {}), ...data };
};
// 获取模式数据
export function getModeData(sign){
modeData = { ..._map };
if(sign&&_mode[sign]){
for(const key in _mode[sign]){
modeData[key] = [].concat(_mode[sign][key],_map[key]||[]);
}
}
return modeData;
};
export {modeData};

View File

@ -1,14 +0,0 @@
/*
* 通过表达式获取配置
*/
import _expression from './rule/expression.js';
export function getOptions(text){
for(const item of _expression){
const match = text.match(item['exp']);
if(match){
return item['opt'](match);
}
}
return {};
};

View File

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

View File

@ -1,93 +0,0 @@
/*
* 词义扩展 - 对称呼词义进行扩展
*/
export default [
{
exp:/^从表/,
arr:['从父姑表','从父舅表','从父姨表','从母姑表','从母舅表','从母叔表']
},
{
exp:/^表表/,
arr:['姑表叔表','姑表姑表','姑表舅表','姑表姨表','舅表叔表','舅表姑表','舅表舅表','舅表姨表']
},
{
exp:/^([夫妻内外]?)表/,
arr:['$1姑表','$1舅表']
},
{
exp:/^([姑舅])表(?=[^伯叔])/,
arr:['$1表伯','$1表叔']
},
{
exp:/^姻/,
arr:['姑姻','姨姻','姊妹姻','女姻']
},
{
exp:/^眷/,
arr:['叔眷','舅眷','兄弟眷','男眷']
},
{
exp:/^亲家/,
arr:['姊妹姻','兄弟眷']
},
{
exp:/^([堂表姨]?)([曾高天烈太远鼻]?)(祖?)([伯叔姑舅姨])/,
arr:['$1$4$2$3']
},
{
exp:/^([曾高天烈太远鼻]?)祖?王姑/,
arr:['姑$1祖母']
},
{
exp:/^([曾玄元来晜仍云耳])([侄甥])/,
arr:['$2$1']
},
{
exp:/^外表([伯叔姑舅姨])/,
arr:['姑表$1外','舅表$1外']
},
{
exp:/([堂表姨]?)外甥/,
arr:['$1甥']
},
{
exp:/^([舅叔])([曾玄外]*)孙/,
arr:['$1侄$2孙']
},
{
exp:/^([姨姑])([曾玄外]*)孙/,
arr:['$1甥$2孙']
},
{
exp:/([孙甥侄])$/,
arr:['$1男','$1女']
},
{
exp:/([姑舅姨叔])([孙外]*)([男女])$/,
arr:['$1表侄$2$3','$1表甥$2$3']
},
{
exp:/(.+)父母$/,
arr:['$1父','$1母']
},
{
exp:/(.+)公婆$/,
arr:['$1公','$1婆']
},
{
exp:/祖$/,
arr:['祖父']
},
{
exp:/(新妇|媳)$/,
arr:['媳妇']
},
{
exp:/嫂$/,
arr:['兄妇']
},
{
exp:/女儿$/,
arr:['女']
},
];

View File

@ -1,20 +0,0 @@
/*
* 同义词替换 - 对称呼中的近义词进行替换
*/
export default {
'晜':'兄',
'哥':'兄',
'姐':'姊',
'侄':'姪',
'婿':'壻',
'嬷':'嫲',
'祖父':'王父',
'祖母':'王母',
'孙女婿':'孙婿',
'甥女婿':'甥婿',
'侄女婿':'侄婿',
'孙媳妇':'孙妇',
'甥媳妇':'甥妇',
'侄媳妇':'侄妇',
'弟媳妇':'弟妇',
};

View File

@ -1,284 +0,0 @@
/*
* 选择器 - 非唯一性关系链中文表述转换为关系链
*/
import _filter from './rule/filter.js';
import _replace from './rule/replace.js';
import _similar from './rule/similar.js';
import {zh2number} from './unit.js';
import {reverseId,filterId,getGenById} from './id.js';
import {cacheData} from './cache.js';
// 获得最简
const getOptimal = function(options){
let {
from,
to,
sex
} = options;
let from_chain = from.split(',');
let to_chain = to.split(',');
for(let i=0;i<from_chain.length&&i<to_chain.length;i++){
if(from_chain[i]==to_chain[i]){
from = from_chain.slice(i+1).join(',');
to = to_chain.slice(i+1).join(',');
sex = from_chain[i].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;
continue;
}else{
if(getGenById(from_chain[i])==getGenById(to_chain[i])&&from_chain[i].match(/^[xol][bs]|^[sd]/)&&to_chain[i].match(/^[xol][bs]|^[sd]/)){
let form_type = from_chain[i].replace(/&([ol\d]+)/,'').replace(/^[xol]([bs])/,'$1');
let to_type = to_chain[i].replace(/&([ol\d]+)/,'').replace(/^[xol]([bs])/,'$1');
if(form_type!=to_type){
break;
}
let from_attr = from_chain[i].match(/&([ol\d]+)/)?.[1]||from_chain[i].match(/([ol])[bs]/)?.[1]||'';
let to_attr = to_chain[i].match(/&([ol\d]+)/)?.[1]||to_chain[i].match(/([ol])[bs]/)?.[1]||'';
if(from_attr&&to_attr){
if(!isNaN(from_attr)&&!isNaN(to_attr)){
if(+from_attr>+to_attr){
from_chain[i] = from_chain[i].replace(/^[xol]b|^s/,'lb').replace(/^[xol]s|^d/,'ls');
}else if(+from_attr<+to_attr){
from_chain[i] = from_chain[i].replace(/^[xol]b|^s/,'ob').replace(/^[xol]s|^d/,'os');
}
}else if(!isNaN(from_attr)&&to_attr=='o'||from_attr=='l'&&!isNaN(to_attr)){
from_chain[i] = from_chain[i].replace(/^[xol]b|^s/,'lb').replace(/^[xol]s|^d/,'ls');
}else if(!isNaN(from_attr)&&to_attr=='l'||from_attr=='o'&&!isNaN(to_attr)){
from_chain[i] = from_chain[i].replace(/^[xol]b|^s/,'ob').replace(/^[xol]s|^d/,'os');
}
from = from_chain.slice(i).join(',');
to = to_chain.slice(i+1).join(',');
sex = to_chain[i].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;
}else if(options['optimal']){
from_attr = from_chain[i].match(/([xol])[bs]/)?.[1]||'';
to_attr = to_chain[i].match(/([xol])[bs]/)?.[1]||'';
if(from_attr=='x'||to_attr=='x'){
from = from_chain.slice(i+1).join(',');
to = to_chain.slice(i+1).join(',');
sex = from_chain[i].match(/^([fhs1](&[ol\d]+)?|[olx]b)(&[ol\d]+)?/)?1:0;
continue;
}
}
}
break;
}
}
return {
from,
to,
sex
};
};
// 中文获取选择器
export function getSelectors(str){
str = str.replace(/之/g,'的').replace(/吾之?(.+)/,'$1').replace(/我的?(.+)/,'$1');
// 惯用口语标准化
// str = str.replace(/(?<![娘婆岳亲])家的?(?=(孩子|儿子|女儿))/,'的');
if(str.match(/[^娘婆岳亲]家的?(孩子|儿子|女儿)/)){
str = str.replace(/家的?/,'的');
}
str = str.replace(/(舅|姑)+(爸|父|丈|妈|母)?家的?(哥|姐|弟|妹)+/,'$1表$3').replace(/(舅|姑)+(爸|父|丈|妈|母)?家的?/,'$1表');
str = str.replace(/(伯|叔)+(父|母)?家的?(哥|姐|弟|妹)+/,'堂$3').replace(/(伯|叔)+(父|母)?家的?/,'堂');
str = str.replace(/姨+(爸|父|丈|妈|母)?家的?(哥|姐|弟|妹)+/,'姨$2').replace(/姨+(爸|父|丈|妈|母)?家的?/,'姨');
const lists = str.split('的');
let result = [];
let isMatch = true;
while(lists.length){
const name = lists.shift(); //当前匹配词
let items = []; //当前匹配词可能性
const keywords = [name];
let getList = function(name){
// 词义扩展
_replace.forEach(item => {
item['arr'].forEach(word =>{
const name1 = name.replace(item['exp'],word);
if(name1!=name){
keywords.push(name1);
getList(name1);
}
});
});
// 同义词替换
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);
}
if(name2!=name){
keywords.push(name2);
}
}
};
getList(name);
// 通过关键词找关系
const items_map = [[],[],[]];
keywords.forEach(function(name){
name = name.replace(/^[尕幺细满碎晚末尾幼]/,'小');
const match = name.match(/^[大|小]|^[一|二|三|四|五|六|七|八|九|十]+/);
if(match){ // 匹配排序
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(i => {
const id = i.replace(/(,[hw])$/,'&'+num+'$1').replace(/([^hw]+)$/,'$1&'+num);
if(!i.match(/^[mf,]+$/)&&!name.match(/^[从世]/)){ // 直系祖辈不参与排序
items_map[index].push(id);
}
});
}
});
}
items = items.concat(cacheData[name]||[]);
});
// console.log('[keywords]',keywords);
// 如找不到结果,再是否存在称呼的排行问题(不直接判断,因存在"大舅""三从父兄""三世祖"这样特俗含义的情况)
items_map.forEach(function(items_x){
if(!items.length){
items = items_x;
}
});
// 完全匹配不到结果
if(!items.length){
isMatch = false;
}
const res = [];
if(!result.length){
result = [''];
}
result.forEach(function(a){
items.forEach(function(b){
res.push(a+(b?','+b:''));
});
});
result = res;
}
return isMatch?filterId(result):[];
};
// 合并选择器,查找两个对象之间的关系
export function mergeSelector(param){
let {
from:from_selector,
to:to_selector,
sex:my_sex
} = param;
if(my_sex<0){
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 [];
}
}
let from_ids = selector2id(param['from'],my_sex);
let to_ids = selector2id(param['to'],my_sex);
if(!from_ids.length||!to_ids.length){
return [];
}
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]+)?$/)){
sex = 1;
}
if(selector.match(/,([mwd0](&[ol\d]+)?|[olx]s)(&[ol\d]+)?$/)){
sex = 0;
}
if(from&&to){
let isOptimal = param.optimal;
if(from.match(/&\d+/)||to.match(/&\d+/)){
isOptimal = true;
}
if(isOptimal){
({
from,
to,
sex:my_sex
} = getOptimal({
from,
to,
sex:my_sex,
optimal:param.optimal
}));
}
}
let to_rids = to?reverseId(to,my_sex):[''];
to_rids.forEach(function(to_r){
let selector = (to_r?','+to_r:'')+(from?','+from:'');
result.push({
selector,
sex
});
});
});
});
return result;
};
// 扩展选择器
export function expandSelector(selector){
const result = [];
const hash = {};
const getSelector = function(selector){
if(!hash[selector]){
hash[selector] = true;
let s='';
do{
s = selector;
for(const item of _filter){
// console.log('[filter]',item['exp'],selector);
selector = selector.replace(item['exp'],item['str']);
if(selector.includes('#')){
selector.split('#').forEach(getSelector);
return false;
}
}
}while(s!=selector);
if(selector.match(/,[mwd0](&[ol\d+])?,w|,[hfs1](&[ol\d]+)?,h/)){ //同志关系去除
return false;
}
result.push(selector);
}
};
getSelector(selector);
return result;
};
// 选择器转ID
export function selector2id(selector,sex){
if(!selector.match(/^,/)){
selector = ','+selector;
}
//性别判断
if(sex<0){
if(selector.match(/^,[w1]/)){
sex = 1;
}else if(selector.match(/^,[h0]/)){
sex = 0;
}
}else if(sex==1&&selector.match(/^,[h0]/)){
return [];
}else if(sex==0&&selector.match(/^,[w1]/)){
return [];
}
if(sex>-1&&!selector.includes(',1')&&!selector.includes(',0')){
selector = ','+sex+selector;
}
if(selector.match(/,[mwd0](&[ol\d]+)?,w|,[hfs1](&[ol\d]+)?,h/)){ //同志关系去除
return [];
}
const result = expandSelector(selector).map(selector => selector.replace(/,[01]/, '').substr(1)); //去前面逗号和性别信息
return filterId(result);
};

View File

@ -1,32 +0,0 @@
/*
* 数值转换
*/
const textAttr = ['','一','二','三','四','五','六','七','八','九','十'];
// 中文数字转阿拉伯数字
export function zh2number(text){
let num = 0;
const map = {'大':1,'小':99};
if(map[text]){
num = map[text];
}else{
let [unit,dec=0] = text.replace(/^十/,'一十').split('十').map(word=> textAttr.indexOf(word)).reverse();
num = dec*10+unit;
}
return num;
};
// 阿拉伯数字转中文数字
export function number2zh(num){
let text = '';
const map = {1:'大',99:'小'};
if(map[num]){
text = map[num];
}else{
let dec = ~~(num/10);
let unit = num%10;
text = (dec?(textAttr[dec]+'十').replace('一十','十'):'')+textAttr[unit];
}
return text;
};

View File

@ -1,6 +1,4 @@
/*
* 关系合称 - 两个人之间的关系合称
*/
// 关系合称
export default {
'f#s':['父子'],
'm#s':['母子'],
@ -15,15 +13,11 @@ export default {
'w,m#d,h':['母婿'],
'h,f#s,w':['翁媳'],
'h,m#s,w':['婆媳'],
'f,[f|m]#s,[s|d]':['祖孙'],
'm,f#d,[s|d]':['公孙'],
'm,m#d,[s|d]':['婆孙'],
'f,[ob|ob,w]#[lb|h,lb],[s|d]':['伯侄'],
'f,lb#ob,[s|d]':['叔侄'],
'f,lb,w#h,ob,[s|d]':['婶侄'],
'f,[xs|xs,h]#[xb|w,xb],[s|d]':['姑侄'],
'm,[xb|xb,w]#[xs|h,xs],[s|d]':['舅甥'],
'm,[xs|xs,h]#[xs|w,xs],[s|d]':['姨甥'],
'[f|m],[f|m]#[s|d],[s|d]':['祖孙'],
'f,[xb|xb,w]#xb,[s|d]':['叔侄'],
'f,[xs|xs,h]#xb,[s|d]':['姑侄'],
'm,[xb|xb,w]#xs,[s|d]':['舅甥'],
'm,[xs|xs,h]#xs,[s|d]':['姨甥'],
'f,xb,s&o#f,xb,s&l':['堂兄弟'],
'f,xb,s&o#f,xb,d&l':['堂兄妹'],
'f,xb,d&o#f,xb,s&l':['堂姐弟'],
@ -41,14 +35,10 @@ export default {
'm,xs,d&o#m,xs,s&l':['姨姐弟'],
'm,xs,d&o#m,xs,d&l':['姨姐妹'],
'h,ob,w#h,lb,w':['妯娌'],
'w,os,h#w,ls,h':['连襟'],
'w,os#ls,h':['襟姐弟'],
'w,ls#os,h':['襟兄妹'],
'w,os,h#w,ob,h':['连襟','连桥'],
'xs,h#w,xb':['郎舅'],
'xs,h#w,xs':['郎姨'],
'lb,w#h,ob':['伯媳'],
'ob,w#h,lb':['叔嫂'],
'xb,w#h,xb':['叔嫂'],
'xb,w#h,xs':['姑嫂'],
'xs,h,xb#xb,w,xb':['姻兄弟'],
'd,h,[f|m]#s,w,[f|m]':['儿女亲家'],
}

View File

@ -1,16 +1,25 @@
/*
* 分支前缀 - 旁支亲戚的分支节点
*/
export default {
// 分支前缀
import {
selector2id
} from './method';
// 合并写法
var prefixMap = {
'{G2C}':{
'[f|m],[f|m],[f|m],[f,xs|m,xb|m,xs],[s|d],[s|d]':['重表'], // 曾祖辈的表兄弟姐妹的子女
'[f|m],[f|m],[f,xs|m,xb|m,xs],[s|d]':['重表'], // 祖辈的表兄弟姐妹的子女
},
};
// 分解写法
var prefix = {
'{G2}':{
'f,f,xb':['从祖'],
'm,f,xb':['外从祖'],
},
'{G1}':{
'f,xb':['堂','同堂','亲堂','从父','叔伯','堂房','从'],
'f,xb':['堂','同堂','亲堂','从父','叔伯','从'],
'f,xs':['姑表','姑家'],
'm,xb':['舅表','舅家'],
'm,xs':['姨','从母','两姨','姨表','从'],
'm,xs':['姨','从母','','姨','从'],
'f,f,xb,s':['从堂','再从父','远堂','堂叔伯','叔伯叔伯','再从'],
'f,f,xb,d':['堂姑表','从父姑表'],
'f,f,xs,s':['姑表叔表'],
@ -31,8 +40,6 @@ export default {
'm,m,m,xs,d,d':['三从母','三从'],
'f,f,f,f,xb,s,s,s':['四从父','三从堂','远堂','族','四从'],
'm,m,m,m,xs,d,d,d':['四从母','四从'],
'[f|m],[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],[s|d]':['重表'],
'[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d]':['重表'],
},
'{G1M}':{
'f,ob':['伯'],
@ -51,16 +58,10 @@ export default {
'f,m,xb,s&l':['舅表叔'],
'f,m,xs,s&o':['姨伯','从母伯','从伯'],
'f,m,xs,s&l':['姨叔','从母叔','从叔'],
'm,f,xb,s':['堂舅','从父舅','叔伯舅'],
'm,f,xb,s':['堂舅','从父舅'],
'm,f,xs,s':['姑表舅'],
'm,m,xb,s':['舅表舅'],
'm,m,xs,s':['姨舅','从母舅'],
'f,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],s&o':['重表伯'],
'f,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],s&l':['重表叔'],
'f,[f|m],[f,xs|m,xb],[s|d],s&o':['重表伯'],
'f,[f|m],[f,xs|m,xb],[s|d],s&l':['重表叔'],
'm,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],s':['重表舅'],
'm,[f|m],[f,xs|m,xb],[s|d],s':['重表舅'],
},
'{G1W}':{
'f,xs':['姑'],
@ -70,14 +71,10 @@ export default {
'f,f,xs,d':['姑表姑'],
'f,m,xb,d':['舅表姑'],
'f,m,xs,d':['姨姑','从母姑'],
'm,f,xb,d':['堂姨','从父姨','叔伯姨'],
'm,f,xb,d':['堂姨','从父姨'],
'm,f,xs,d':['姑表姨'],
'm,m,xb,d':['舅表姨'],
'm,m,xs,d':['姨姨','从母姨'],
'f,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],d':['重表姑'],
'f,[f|m],[f,xs|m,xb],[s|d],d':['重表姑'],
'm,[f|m],[f|m],[f,xs|m,xb],[s|d],[s|d],d':['重表姨'],
'm,[f|m],[f,xs|m,xb],[s|d],d':['重表姨'],
},
'{G0}':{
'xb':['侄'],
@ -110,24 +107,24 @@ export default {
'f,f,xb,s,w':['从父叔眷'],
'f,f,xs,s,w':['姑表叔眷'],
'f,m,xb,s,w':['舅表叔眷'],
'f,m,xs,s,w':['从母叔眷'],
'f,m,xs,s,w':['姨表叔眷'],
'm,xb,w':['舅眷'],
'm,f,xb,s,w':['从父舅眷'],
'm,f,xs,s,w':['姑表舅眷'],
'm,m,xb,s,w':['舅表舅眷'],
'm,m,xs,s,w':['从母舅眷'],
'm,m,xs,s,w':['姨表舅眷'],
},
'{M1M}':{
'f,xs,h':['姑姻'],
'f,f,xb,d,h':['从父姑姻'],
'f,f,xs,d,h':['姑表姑姻'],
'f,m,xb,d,h':['舅表姑姻'],
'f,m,xs,d,h':['从母姑姻'],
'f,m,xs,d,h':['姨表姑姻'],
'm,xs,h':['姨姻'],
'm,f,xb,d,h':['从父姨姻'],
'm,f,xs,d,h':['姑表姨姻'],
'm,m,xb,d,h':['舅表姨姻'],
'm,m,xs,d,h':['从母姨姻'],
'm,m,xs,d,h':['姨表姨姻'],
},
'{M0}':{
'xb,w':['兄弟眷'],
@ -208,3 +205,17 @@ export default {
'w,xs,d,d,h':['姨甥外孙姻','姨外孙姻'],
}
};
for(var key in prefixMap){
for(var selector in prefixMap[key]){
var ids = selector2id(selector);
if(typeof prefix[key]=='undefined'){
prefix[key] = {};
}
ids.forEach(function(id){
prefix[key][id] = prefixMap[key][selector];
});
}
}
export default prefix;

View File

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

View File

@ -1,76 +1,105 @@
import {getOptions} from './module/options.js';
import {getSelectors,mergeSelector,selector2id} from './module/selector.js';
import {reverseId,getItemsById,getChainById,getPairsById} from './module/id.js';
import {setModeData,getModeData,modeData} from './module/mode.js';
import {
unique,
getSelectors,
mergeSelector,
selector2id,
reverseId,
getItemsById,
getChainById,
getPairsByIds,
setMode,
getDataByMode
} from './method';
var _data = getDataByMode(); // 最终数据
// 对外方法
let relationship = function (parameter) {
if(typeof parameter =='string'){
parameter = getOptions(parameter);
var relationship = function (parameter){
var options = Object.assign({
text:'', // 目标对象:目标对象的称谓汉字表达,称谓间用‘的’字分隔
target:'', // 相对对象:相对对象的称谓汉字表达,称谓间用‘的’字分隔,空表示自己
sex:-1, // 本人性别0表示女性,1表示男性
type:'default', // 转换类型:'default'计算称谓,'chain'计算关系链,'pair'计算关系合称
reverse:false, // 称呼方式true对方称呼我,false我称呼对方
mode:'default', // 模式选择使用setMode方法定制不同地区模式在此选择自定义模式
optimal:false // 最短关系:计算两者之间的最短关系
},parameter);
_data = getDataByMode(options.mode);
var from_selectors = getSelectors(options.text);
var to_selectors = getSelectors(options.target);
if(!to_selectors.length){
to_selectors = [''];
}
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);
// 切换模式
getModeData(options.mode);
let fromSelectors = getSelectors(options.text);
let toSelectors = getSelectors(options.target);
if (!toSelectors.length) {
toSelectors = [''];
}
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) {
temps = reverseId(id,sex);
if(id.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)){
sex = 1;
}else{
sex = 0;
}
}
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);
var result = []; //匹配结果
// console.log('[selectors]',from_selectors,to_selectors);
from_selectors.forEach(function(from_selector){
to_selectors.forEach(function(to_selector){
var list = mergeSelector({
from:from_selector,
to:to_selector,
sex:options.sex,
optimal:options.optimal
});
list.forEach(function(data){
// console.log('[data]',from_selector,to_selector,data);
var ids = data?selector2id(data['selector'],data['sex']):null;
// console.log('[ids]',data['selector'],data['sex'],ids);
if(ids){
ids.forEach(function(id){
var temps = [id];
var sex = data['sex'];
if(options.reverse){
temps = reverseId(id,sex);
if(id.match(/([fhs1](&[ol\d]+)?|[olx]b)$/)){
sex = 1;
}else{
sex = 0;
}
return items;
});
}
});
}
if(options.type=='chain'){
temps.forEach(function(id){
var item = getChainById(id);
if(data['sex']>-1&&_data[data['sex']+','+id]){
if(data['sex']==0){
item = '(女性)'+item;
}else if(data['sex']==1){
item = '(男性)'+item;
}
}
if(item){
result.push(item);
}
});
}else if(options.type=='pair'){
temps = reverseId(id,data['sex']);
temps.forEach(function(r_id){
var pairs = getPairsByIds(id,r_id);
if(pairs.length){
result = result.concat(pairs);
}
});
}else{
temps.forEach(function(id){
var items = getItemsById(id);
if(!items.length){
items = getItemsById(sex+','+id);
}
if(items.length){
result = result.concat(items);
}
});
}
});
}
});
});
});
return [...new Set(result)];
return unique(result);
};
// 获取数据表
relationship.data = modeData;
relationship.data = _data;
// 获取数据量
relationship.dataCount = Object.keys(modeData).length;
relationship.dataCount = Object.keys(_data).length;
// 设置语言模式
relationship.setMode = setModeData;
relationship.setMode = setMode;
export default relationship;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -1,6 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1440px" height="448px" viewBox="0 0 1440 448" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Background</title>
<!-- Generator: Sketch 59.1 (86144) - https://sketch.com -->
<title>编组 5备份</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="-5.68700053%" y1="45.5298642%" x2="84.7892757%" y2="53.934985%" id="linearGradient-1">
@ -23,14 +24,14 @@
<rect id="path-7" x="0" y="259" width="1440" height="189"></rect>
<linearGradient x1="54.7550093%" y1="16.6478641%" x2="54.7550093%" y2="112.331979%" id="linearGradient-8">
<stop stop-color="#FFFFFF" stop-opacity="0" offset="0%"></stop>
<stop stop-color="#84c1ec" stop-opacity="0.225387893" offset="100%"></stop>
<stop stop-color="#D2ECFF" stop-opacity="0.225387893" offset="100%"></stop>
</linearGradient>
</defs>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g>
<g>
<g>
<g>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="导航方案备份">
<g id="编组-5备份">
<g id="路径备份">
<g id="蒙版">
<g transform="translate(0.000000, 0.000000)">
<mask id="mask-4" fill="white">
<use xlink:href="#path-3"></use>
@ -39,11 +40,11 @@
<use fill="url(#linearGradient-1)" xlink:href="#path-3"></use>
<use fill="url(#radialGradient-2)" xlink:href="#path-3"></use>
</g>
<g mask="url(#mask-4)">
<g id="矩形备份-32" mask="url(#mask-4)">
<use fill="url(#linearGradient-5)" xlink:href="#path-7"></use>
<use fill="url(#linearGradient-6)" xlink:href="#path-7"></use>
</g>
<rect fill="url(#linearGradient-8)" mask="url(#mask-4)" x="0" y="166" width="1440" height="282"></rect>
<rect id="矩形" fill="url(#linearGradient-8)" mask="url(#mask-4)" x="0" y="166" width="1440" height="282"></rect>
</g>
</g>
</g>

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.6 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 19 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 881 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 489 B

View File

@ -1 +0,0 @@
<svg xmlns='http://www.w3.org/2000/svg' width='25' height='25' viewBox='0 0 25 25'><circle cx='1.5' cy='1.5' r='2' fill='#DCE2E6' fill-rule='evenodd'/></svg>

Before

Width:  |  Height:  |  Size: 158 B

View File

@ -1,46 +0,0 @@
// 头部滚动
(function(){
let $header = document.querySelector('.mod-head');
document.querySelector('.scroll-container').addEventListener('scroll',function(){
let scrollTop = this.scrollTop;
let ratio = Math.min(scrollTop/1000,1);
$header.style.background = 'rgba(255,255,255,'+(ratio*0.8)+')';
$header.style.boxShadow = '1px 1px 6px rgba(0,0,0,'+(ratio*0.1)+')';
});
})();
// 特征选项卡
(function(){
let $mod_feature = document.querySelector('.mod-feature');
let $nav = $mod_feature.querySelectorAll('.nav li');
let $panels = $mod_feature.querySelectorAll('.panels .panel');
let togglePanel = function(index = 0){
$nav.forEach(function($li){
$li.classList.remove('active');
});
$nav[index].classList.add('active');
$panels.forEach(function($panel){
$panel.classList.remove('active');
});
$panels[index].classList.add('active');
};
$nav.forEach(function($item,index){
$item.addEventListener('click',function(){
togglePanel(index);
});
});
togglePanel(0);
})();
// 底部滚动
(function(){
let $gotop = document.querySelector('.mod-fixedbar .gotop');
let $container = document.querySelector('.scroll-container');
$gotop.addEventListener('click',function(){
$container.scrollTo({
left:0,
top:0,
behavior:'smooth'
});
});
})();

File diff suppressed because it is too large Load Diff

View File

@ -2,79 +2,42 @@
var test = require('tape');
var relationship = require('..');
test('[call]', function (t) {
// console.log('[test]',relationship({text:'爸爸的妈妈的姐姐的儿子'}));
test('relationship.js show to be tested', function (t) {
// console.log('[test]',relationship({text:'堂哥',target:'叔叔',type:'pair',optimal:true}));
t.deepEqual(relationship({text:'爸爸的哥哥的弟弟的儿子'}),['堂哥','堂弟','哥哥','弟弟','自己']);
t.deepEqual(relationship({text:'爸爸的妹妹的女儿的老公'}),['姑表姐夫','姑表妹夫']);
t.deepEqual(relationship({text:'表姐的哥哥',sex:1}),['姑表哥','舅表哥']);
t.deepEqual(relationship({text:'表姐的妹妹',sex:1}),['姑表姐','姑表妹','舅表姐','舅表妹']);
t.deepEqual(relationship({text:'弟弟的表哥',sex:1}),['姑表哥','姑表弟','舅表哥','舅表弟']);
t.deepEqual(relationship({text:'姐姐的老公的姐姐的老公'}),['姊妹姻姊妹壻']);
t.deepEqual(relationship({text:'哥哥的弟弟的爸爸的儿子',sex:1}),['哥哥','弟弟','自己']);
t.deepEqual(relationship({text:'儿子的爸爸的妈妈',sex:1}),['妈妈']);
t.deepEqual(relationship({text:'爱人',sex:1}),['老婆']);
t.deepEqual(relationship({text:'爱人的爱人',sex:1}),['自己']);
t.deepEqual(relationship({text:'老婆的爱人',sex:1}),['自己']);
t.deepEqual(relationship({text:'老婆的老公',sex:1}),['自己']);
t.deepEqual(relationship({text:'老婆的外孙的姥爷',sex:1}),['自己']);
t.deepEqual(relationship({text:'表姐的哥哥',sex:1}),['姑表哥','舅表哥']);
t.deepEqual(relationship({text:'表姐的妹妹',sex:1}),['姑表姐','姑表妹','舅表姐','舅表妹']);
t.deepEqual(relationship({text:'弟弟的表哥',sex:1}),['姑表哥','姑表弟','舅表哥','舅表弟']);
t.deepEqual(relationship({text:'老公的老婆的儿子的爸爸',sex:0}),['老公']);
t.deepEqual(relationship({text:'堂兄弟的孩子',sex:1}),['堂侄','堂侄女']);
t.deepEqual(relationship({text:'儿子的爸爸的妈妈',sex:1}),['妈妈']);
t.deepEqual(relationship({text:'岳母的配偶的孩子的爸爸'}),['岳父']);
t.deepEqual(relationship({text:'爸爸的妈妈的姐姐的儿子'}),['姨伯父','姨叔父']);
t.end();
});
test('[target]', function (t) {
t.deepEqual(relationship({text:'我',target:'爸爸'}),['儿子','女儿']);
t.deepEqual(relationship({text:'老公的父母',target:'孩子'}),['爷爷','奶奶']);
t.deepEqual(relationship({text:'爱人',target:'娘家侄子'}),['姑丈']);
t.end();
});
test('[reverse]', function (t) {
t.deepEqual(relationship({text:'哥哥的弟弟的爸爸的儿子',sex:1}),['哥哥','弟弟','自己']);
t.deepEqual(relationship({text:'爸爸的舅舅',sex:0,reverse:true}),['甥孙女']);
t.deepEqual(relationship({text:'舅爷爷',type:'chain'}),['爸爸的妈妈的兄弟']);
t.deepEqual(relationship({text:'堂兄弟的孩子',sex:1}),['堂侄','堂侄女']);
t.deepEqual(relationship({text:'岳母',target:'女儿',reverse:true}),['外孙女']);
t.deepEqual(relationship({text:'姑妈',target:'舅妈',reverse:true}),['兄弟眷兄弟妇']);
t.deepEqual(relationship({text:'舅妈',target:'女儿',reverse:true}),['姑甥孙女','姑甥外孙女']);
t.deepEqual(relationship({text:'老公的父母',target:'孩子'}),['爷爷','奶奶']);
t.deepEqual(relationship({text:'爸爸的哥哥的弟弟的儿子'}),['堂哥','堂弟','哥哥','弟弟','自己']);
t.deepEqual(relationship({text:'外婆',target:'女婿',reverse:true}),['外曾孙女婿','外曾外孙女婿']);
t.end();
});
test('[filter]', function (t) {
t.deepEqual(relationship({text:'内侄'}),['舅侄','舅侄女']);
t.end();
});
test('[type:chain]', function (t) {
t.deepEqual(relationship({text:'舅爷爷',type:'chain'}),['爸爸的妈妈的兄弟']);
t.deepEqual(relationship({text:'妻儿',type:'chain'}),['老婆','儿子','女儿']);
t.deepEqual(relationship({text:'父母',target:'老公',type:'chain'}),['老婆的爸爸','老婆的妈妈']);
t.end();
});
test('[type:pair]', function (t) {
t.deepEqual(relationship({text:'舅妈',target:'哥哥',type:'pair'}),['舅甥']);
t.deepEqual(relationship({text:'我',target:'爸爸'}),['儿子','女儿']);
t.deepEqual(relationship({text:'爱人',target:'娘家侄子'}),['姑丈']);
t.deepEqual(relationship({text:'岳母的配偶的孩子的爸爸'}),['岳父']);
t.deepEqual(relationship({text:'舅妈',target:'外婆',type:'pair'}),['婆媳']);
t.deepEqual(relationship({text:'舅妈',target:'二舅',type:'pair'}),['伯媳','叔嫂','夫妻']);
t.deepEqual(relationship({text:'堂哥',target:'叔叔',type:'pair'}),['伯侄', '叔侄', '父子']);
t.end();
});
test('[age]', function (t) {
t.deepEqual(relationship({text:'妈妈的二哥'}),['二舅']);
t.deepEqual(relationship({text:'爸爸的二哥'}),['二伯']);
t.deepEqual(relationship({text:'二舅妈',target:'二舅',type:'pair'}),['夫妻']);
t.deepEqual(relationship({text:'二舅妈',target:'大舅',type:'pair'}),['叔嫂']);
t.deepEqual(relationship({text:'舅妈',target:'二舅',type:'pair'}),['叔嫂','夫妻']);
t.deepEqual(relationship({text:'二舅妈',target:'三舅'}),['二嫂']);
t.deepEqual(relationship({text:'爸爸的二爸'}),['二爷爷']);
t.deepEqual(relationship({text:'姑姑',target:'叔叔',optimal:true}),['姐姐','妹妹']);
t.deepEqual(relationship({text:'大舅',target:'二舅的儿子'}),['伯父']);
t.deepEqual(relationship({text:'二舅妈',target:'二舅',type:'pair'}),['夫妻']);
t.deepEqual(relationship({text:'二舅妈',target:'大舅',type:'pair'}),['伯媳']);
t.end();
});
test('[expression]', function (t) {
t.deepEqual(relationship('外婆和奶奶之间是什么关系?'),['儿女亲家']);
t.deepEqual(relationship('妈妈应该如何称呼姑姑'),['姑子']);
t.deepEqual(relationship('姑奶奶是什么关系'),['爸爸的爸爸的姐妹']);
t.deepEqual(relationship('姑奶奶和爸爸是什么关系'),['姑侄']);
t.deepEqual(relationship('我应该叫外婆的哥哥什么?'),['舅外公']);
t.deepEqual(relationship('七舅姥爷应该叫我什么?'),['甥外孙','甥外孙女']);
t.deepEqual(relationship('舅公是什么关系?'),['爸爸的妈妈的兄弟', '妈妈的妈妈的兄弟', '老公的妈妈的兄弟']);
t.deepEqual(relationship('舅妈如何称呼外婆?'),['婆婆']);
t.deepEqual(relationship('外婆和奶奶之间是什么关系?'),['儿女亲家']);
t.deepEqual(relationship({text:'大舅',target:'二舅的儿子'}),['大伯']);
t.deepEqual(relationship({text:'堂哥',target:'叔叔',type:'pair'}),['叔侄','父子']);
t.deepEqual(relationship({text:'堂哥',target:'叔叔',type:'pair',optimal:true}),['父子']);
t.end();
});

View File

@ -1,5 +0,0 @@
{
"github": {
"silent": true
}
}

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -10,14 +10,14 @@
<meta http-equiv="Cache-Control" content="no-transform" />
<meta name="format-detection" content="telephone=no"/>
<meta name="applicable-device" content="pc,mobile"/>
<meta name="mobile-web-app-capable" content="yes"/>
<meta name="mobile-web-app-status-bar-style" content="black"/>
<link rel="icon" href="/relationship/vue/assets/favicon-CcRSb4Ef.ico">
<meta name="apple-mobile-web-app-capable" content="yes"/>
<meta name="apple-mobile-web-app-status-bar-style" content="black"/>
<link rel="icon" href="./assets/favicon.71a59e4c.ico">
<title>亲戚计算器手机版 亲戚称呼计算器APP</title>
<meta name="keywords" content="家庭称谓,亲戚称呼,亲戚称谓,亲戚叫法,亲戚关系计算器,亲戚计算器,称呼计算器,親戚關係稱呼,亲戚关系大全,叫什么,什么关系">
<meta name="description" content="中国亲戚关系计算器手机版,走亲访友,逢年过节必备神器。它避免了叫错、不会叫亲戚的尴尬,人人必备家庭教育工具。">
<script type="module" crossorigin src="/relationship/vue/assets/index-BiHcNiMB.js"></script>
<link rel="stylesheet" crossorigin href="/relationship/vue/assets/index-Bqz9Bu5y.css">
<script type="module" crossorigin src="./assets/index.05002aa2.js"></script>
<link rel="stylesheet" href="./assets/index.e63eeab7.css">
</head>
<body>
<noscript>
@ -34,28 +34,29 @@
</script>
<div id="app"></div>
<script type="text/javascript" src="https://passer-by.com/relationship/dist/relationship.min.js"></script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?b86879c9cc57dd112fe1f7dd75206b82";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<script>
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?b86879c9cc57dd112fe1f7dd75206b82";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<script>
(function(){
var bp = document.createElement('script');
var curProtocol = window.location.protocol.split(':')[0];
if (curProtocol === 'https') {
bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
}
else {
bp.src = 'http://push.zhanzhang.baidu.com/push.js';
}
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(bp, s);
})();
</script>
</body>
</html>

41
webpack.config.js Normal file
View File

@ -0,0 +1,41 @@
var path = require('path');
var webpack = require('webpack');
const TerserJSPlugin = require('terser-webpack-plugin');
const pkg = require('./package');
var repository = pkg.repository.url.replace(/(.+)(:\/\/.+)\.git$/,'https$2');
var now = new Date();
var date = (new Date(now.getTime()-now.getTimezoneOffset()*60000)).toISOString().substr(0,10);
var copyright = `${pkg.name} v${pkg.version}
${pkg.description}
${pkg.homepage}
Copyright (c) 2016-present, ${pkg.author}
Released under the ${pkg.license} License
${repository}
Create on: ${date}`;
module.exports = {
mode: 'production',
entry: './src/relationship.js',
output: {
path: path.resolve(__dirname,'dist'),
filename: 'relationship.min.js',
globalObject: 'this',
library: 'relationship',
libraryTarget: 'umd',
libraryExport:'default'
},
plugins: [
new webpack.BannerPlugin(copyright)
],
optimization: {
minimizer: [
new TerserJSPlugin({
extractComments: false
}),
]
}
};

1560
zh-HK.html

File diff suppressed because it is too large Load Diff