UNPKG

parse-gedcom

Version:

a simple and readable gedcom parser

3 lines (2 loc) 6.86 kB
var e=require("unist-util-visit-parents"),r=require("unist-util-remove"),t=require("graphlib-dot"),E=require("graphlib");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var A=n(e),a=n(r),I=n(t);function N(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,E=new Array(r);t<r;t++)E[t]=e[t];return E}function o(e,r){var t;if("undefined"==typeof Symbol||null==e[Symbol.iterator]){if(Array.isArray(e)||(t=function(e,r){if(e){if("string"==typeof e)return N(e,r);var t=Object.prototype.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?N(e,r):void 0}}(e))||r&&e&&"number"==typeof e.length){t&&(e=t);var E=0;return function(){return E>=e.length?{done:!0}:{done:!1,value:e[E++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}return(t=e[Symbol.iterator]()).next.bind(t)}var R=new RegExp("^([0-9]*)"),i=new RegExp("(\\s+)"),T=new RegExp("^(["+i+"])"),u=new RegExp("^@([A-ZÀ-ÿa-z_0-9])([A-ZÀ-ÿa-z_0-9"+i+"#])*@"),S=new RegExp("^(_?[A-ZÀ-ÿa-z_0-9]+)"),l=new RegExp(/^(.*)/);function C(e){function r(r,t){var E=e.match(r);if(!E)throw new Error(t);return e=e.substring(E[0].length),E[1]}e=e.trimStart();var t=void 0,E=r(R,"Expected level");if(E.length>2||2===E.length&&"0"===E[0])throw new Error("Invalid level: "+E);var n=parseInt(E);r(T,"Expected delimiter after level");var A=e.match(u);A&&(t=A[0],e=e.substring(A[0].length),r(T,"Expected delimiter after pointer"));var a={level:n,tag:r(S,"Expected tag")};t&&(a.xref_id=t);var I=e.match(T);if(I){var N=(e=e.substring(I[0].length)).match(u),o=e.match(l);N?a.pointer=N[0]:o&&(a.value=o[1])}return a}var O={ABBR:"ABBREVIATION",ADDR:"ADDRESS",ADR1:"ADDRESS1",ADR2:"ADDRESS2",ADOP:"ADOPTION",AFN:"AFN",AGE:"AGE",AGNC:"AGENCY",ALIA:"ALIAS",ANCE:"ANCESTORS",ANCI:"ANCES_INTEREST",ANUL:"ANNULMENT",ASSO:"ASSOCIATES",AUTH:"AUTHOR",BAPL:"BAPTISM-LDS",BAPM:"BAPTISM",BARM:"BAR_MITZVAH",BASM:"BAS_MITZVAH",BIRT:"BIRTH",BLES:"BLESSING",BURI:"BURIAL",CALN:"CALL_NUMBER",CAST:"CASTE",CAUS:"CAUSE",CENS:"CENSUS",CHAN:"CHANGE",CHAR:"CHARACTER",CHIL:"CHILD",CHR:"CHRISTENING",CHRA:"ADULT_CHRISTENING",CITY:"CITY",CONC:"CONCATENATION",CONF:"CONFIRMATION",CONL:"CONFIRMATION_LDS",CONT:"CONTINUED",COPR:"COPYRIGHT",CORP:"CORPORATE",CREM:"CREMATION",CTRY:"COUNTRY",DATA:"DATA",DATE:"DATE",DEAT:"DEATH",DESC:"DESCENDANTS",DESI:"DESCENDANT_INT",DEST:"DESTINATION",DIV:"DIVORCE",DIVF:"DIVORCE_FILED",DSCR:"PHY_DESCRIPTION",EDUC:"EDUCATION",EMAI:"EMAIL",EMIG:"EMIGRATION",ENDL:"ENDOWMENT",ENGA:"ENGAGEMENT",EVEN:"EVENT",FACT:"FACT",FAM:"FAMILY",FAMC:"FAMILY_CHILD",FAMF:"FAMILY_FILE",FAMS:"FAMILY_SPOUSE",FAX:"FACIMILIE",FCOM:"FIRST_COMMUNICATION",FILE:"FILE",FORM:"FORMAT",FONE:"PHONETIC",GEDC:"GEDCOM",GIVN:"GIVEN_NAME",GRAD:"GRADUATION",HEAD:"HEADER",HUSB:"HUSBAND",IDNO:"IDENT_NUMVER",IMMI:"IMMIGRATION",INDI:"INDIVIDUAL",LANG:"LANGUAGE",LATI:"LATITUDE",LONG:"LONGITUDE",MAP:"MAP",MARB:"MARRIAGE_BANN",MARC:"MARRIAGE_CONTRACT",MARL:"MARRIAGE_LICENSE",MARR:"MARRIAGE",MARS:"MARRIAGE_SETTLEMENT",MEDI:"MEDIA",NAME:"NAME",NATI:"NATIONALITY",NATU:"NATURALIZATION",NCHI:"CHILDREN_COUNT",NICK:"NICKNAME",NMR:"MARRIAGE_COUNT",NOTE:"NOTE",NPFX:"NAME_PREFIX",NSFX:"NAME_SUFFIX",OBJE:"OBJECT",OCCU:"OCCUPATION",ORDI:"ORDINANCE",ORDN:"ORDINATION",PAGE:"PAGE",PEDI:"PEDIGREE",PHON:"PHONE",PLAC:"PLACE",POST:"POSTAL_CODE",PROB:"PROBATE",PROP:"PROPERTY",PUBL:"PUBLICATION",QUAY:"QUALITY_OF_DATA",REFN:"REFERENCE",RELA:"RELATIONSHIP",RELI:"RELIGION",REPO:"REPOSITORY",RESI:"RESIDENCE",RESN:"RESTRICTION",RETI:"RETIREMENT",RFN:"REC_FILE_NUMBER",RIN:"REC_ID_NUMBER",ROLE:"ROLE",ROMN:"ROMANIZED",SEX:"SEX",SLGC:"SEALING_CHILD",SLGS:"SEALING_SPOUCE",SOUR:"SOURCE",SPFX:"SURN_PREFIX",SSN:"SURN_PREFIX",STAE:"STATE",STAT:"STATUS",SUBM:"SUBMITTER",SUBN:"SUBMISSION",SURN:"SURNAME",TEMP:"TEMPLE",TEXT:"TEXT",TIME:"TIME",TITL:"TITLE",TRLR:"TRAILER",TYPE:"TYPE",VERS:"VERSION",WIFE:"WIFE",WILL:"WILL",WWW:"WEB"},f=new RegExp("(\\r|\\n|\\r\\n|\\n\\r)","g");function M(e){var r=e.tag,t=e.xref_id,E=e.pointer,n={type:r,data:{formal_name:O[r]},value:e.value,children:[]};return t&&(n.data.xref_id=t),E&&(n.data.pointer=E),r.startsWith("_")&&(n.data.custom_tag=!0),n}function D(e,r){var t=e.tag,E=e.value;if("CONC"!==t&&"CONT"!==t)return!1;if(e.pointer)throw new Error("Cannot concatenate a pointer");return r.value||(r.value=""),"CONT"===t&&(r.value+="\n"),E&&(r.value+=E),!0}function d(e,r,t){e[r]?e["+"+r]=(e["+"+r]||[]).concat(t):e[r]=t}function L(e,r){void 0===r&&(r=["TRLR","SUBM","SUBN","HEAD","NOTE","SOUR"]),a.default(e,r);for(var t,E=function(){var e=t.value;e.data||(e.data={}),A.default(e,function(r,t){var E,n=t.slice(1).concat(r).map(function(e){var r;return(null==(r=e.data)?void 0:r.formal_name)||e.type}).join("/");r.value?d(e.data,n,r.value):null!=(E=r.data)&&E.pointer&&d(e.data,"@"+n,r.data.pointer)}),e.children=[]},n=o(e.children);!(t=n()).done;)E();return e}function c(e){var r=L(e).children,t=new Set(r.map(function(e){var r;return null==(r=e.data)?void 0:r.xref_id}).filter(Boolean)),E=[],n=new Map;return r.forEach(function(e){e.data&&Object.entries(e.data).filter(function(e){return e[0].startsWith("@")}).forEach(function(r){var A,a,I=r[0],N=r[1];if(!t.has(N))throw new Error("Undefined reference: "+N);if(null==(A=e.data)||!A.xref_id)throw new Error("Link from node with no xref id");var o=null==(a=e.data)?void 0:a.xref_id,R=N,i={source:o,target:R,value:I};E.push(i);var T=[o,R].sort().join("/");n.has(T)?n.get(T).push(i):n.set(T,[i])})}),function(e,r){for(var t,E=[["@HUSBAND","@FAMILY_SPOUSE"],["@WIFE","@FAMILY_SPOUSE"],["@FAMILY_CHILD","@CHILD"]],n=function(){var e=t.value[1];E.forEach(function(t){var E=t.map(function(r){return e.find(function(e){return e.value==r})}),n=E[0];n&&E[1]&&r.splice(r.indexOf(n),1)})},A=o(e);!(t=A()).done;)n()}(n,E),{nodes:r,links:E}}function v(e){for(var r,t=c(e),n=t.nodes,A=t.links,a=new E.Graph,I=o(n);!(r=I()).done;){var N,R=r.value,i=(R.data||{}).NAME;a.setNode(null==(N=R.data)?void 0:N.xref_id,{label:i?i.replace(/^@/,""):R.type})}for(var T,u=o(A);!(T=u()).done;){var S=T.value;a.setEdge(S.source,S.target,{label:S.value})}return a}exports.compact=L,exports.parse=function(e){for(var r,t={type:"root",children:[]},E=[],n=0,A=o(e.split(f).filter(function(e){return e.trim()}));!(r=A()).done;){var a=C(r.value);if(!D(a,E[E.length-1])){var I=M(a),N=a.level;if(0==N)t.children.push(I),E=[I];else{if(!(n==N-1||N<=n))throw new Error("Illegal nesting: transition from "+n+" to "+N);for(var R=0;R<=n-N;R++)E.pop();E[E.length-1].children.push(I),E.push(I)}n=N}}return t},exports.toD3Force=c,exports.toDot=function(e){return I.default.write(v(e))},exports.toGraphlib=v,exports.tokenize=C; //# sourceMappingURL=index.js.map