parse-gedcom
Version:
a simple and readable gedcom parser
3 lines (2 loc) • 6.73 kB
JavaScript
import r from"unist-util-visit-parents";import e from"unist-util-remove";import t from"graphlib-dot";import{Graph as E}from"graphlib";function n(r,e){(null==e||e>r.length)&&(e=r.length);for(var t=0,E=new Array(e);t<e;t++)E[t]=r[t];return E}function A(r,e){var t;if("undefined"==typeof Symbol||null==r[Symbol.iterator]){if(Array.isArray(r)||(t=function(r,e){if(r){if("string"==typeof r)return n(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?n(r,e):void 0}}(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var E=0;return function(){return E>=r.length?{done:!0}:{done:!1,value:r[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=r[Symbol.iterator]()).next.bind(t)}var a=new RegExp("^([0-9]*)"),I=new RegExp("(\\s+)"),N=new RegExp("^(["+I+"])"),o=new RegExp("^@([A-ZÀ-ÿa-z_0-9])([A-ZÀ-ÿa-z_0-9"+I+"#])*@"),R=new RegExp("^(_?[A-ZÀ-ÿa-z_0-9]+)"),i=new RegExp(/^(.*)/);function T(r){function e(e,t){var E=r.match(e);if(!E)throw new Error(t);return r=r.substring(E[0].length),E[1]}r=r.trimStart();var t=void 0,E=e(a,"Expected level");if(E.length>2||2===E.length&&"0"===E[0])throw new Error("Invalid level: "+E);var n=parseInt(E);e(N,"Expected delimiter after level");var A=r.match(o);A&&(t=A[0],r=r.substring(A[0].length),e(N,"Expected delimiter after pointer"));var I={level:n,tag:e(R,"Expected tag")};t&&(I.xref_id=t);var T=r.match(N);if(T){var S=(r=r.substring(T[0].length)).match(o),C=r.match(i);S?I.pointer=S[0]:C&&(I.value=C[1])}return I}var S={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"},C=new RegExp("(\\r|\\n|\\r\\n|\\n\\r)","g");function l(r){var e=r.tag,t=r.xref_id,E=r.pointer,n={type:e,data:{formal_name:S[e]},value:r.value,children:[]};return t&&(n.data.xref_id=t),E&&(n.data.pointer=E),e.startsWith("_")&&(n.data.custom_tag=!0),n}function O(r,e){var t=r.tag,E=r.value;if("CONC"!==t&&"CONT"!==t)return!1;if(r.pointer)throw new Error("Cannot concatenate a pointer");return e.value||(e.value=""),"CONT"===t&&(e.value+="\n"),E&&(e.value+=E),!0}function u(r){for(var e,t={type:"root",children:[]},E=[],n=0,a=A(r.split(C).filter(function(r){return r.trim()}));!(e=a()).done;){var I=T(e.value);if(!O(I,E[E.length-1])){var N=l(I),o=I.level;if(0==o)t.children.push(N),E=[N];else{if(!(n==o-1||o<=n))throw new Error("Illegal nesting: transition from "+n+" to "+o);for(var R=0;R<=n-o;R++)E.pop();E[E.length-1].children.push(N),E.push(N)}n=o}}return t}function M(r,e,t){r[e]?r["+"+e]=(r["+"+e]||[]).concat(t):r[e]=t}function f(t,E){void 0===E&&(E=["TRLR","SUBM","SUBN","HEAD","NOTE","SOUR"]),e(t,E);for(var n,a=function(){var e=n.value;e.data||(e.data={}),r(e,function(r,t){var E,n=t.slice(1).concat(r).map(function(r){var e;return(null==(e=r.data)?void 0:e.formal_name)||r.type}).join("/");r.value?M(e.data,n,r.value):null!=(E=r.data)&&E.pointer&&M(e.data,"@"+n,r.data.pointer)}),e.children=[]},I=A(t.children);!(n=I()).done;)a();return t}function D(r){var e=f(r).children,t=new Set(e.map(function(r){var e;return null==(e=r.data)?void 0:e.xref_id}).filter(Boolean)),E=[],n=new Map;return e.forEach(function(r){r.data&&Object.entries(r.data).filter(function(r){return r[0].startsWith("@")}).forEach(function(e){var A,a,I=e[0],N=e[1];if(!t.has(N))throw new Error("Undefined reference: "+N);if(null==(A=r.data)||!A.xref_id)throw new Error("Link from node with no xref id");var o=null==(a=r.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(r,e){for(var t,E=[["@HUSBAND","@FAMILY_SPOUSE"],["@WIFE","@FAMILY_SPOUSE"],["@FAMILY_CHILD","@CHILD"]],n=function(){var r=t.value[1];E.forEach(function(t){var E=t.map(function(e){return r.find(function(r){return r.value==e})}),n=E[0];n&&E[1]&&e.splice(e.indexOf(n),1)})},a=A(r);!(t=a()).done;)n()}(n,E),{nodes:e,links:E}}function L(r){for(var e,t=D(r),n=t.nodes,a=t.links,I=new E,N=A(n);!(e=N()).done;){var o,R=e.value,i=(R.data||{}).NAME;I.setNode(null==(o=R.data)?void 0:o.xref_id,{label:i?i.replace(/^@/,""):R.type})}for(var T,S=A(a);!(T=S()).done;){var C=T.value;I.setEdge(C.source,C.target,{label:C.value})}return I}function d(r){return t.write(L(r))}export{f as compact,u as parse,D as toD3Force,d as toDot,L as toGraphlib,T as tokenize};
//# sourceMappingURL=index.m.js.map