UNPKG

@jinntec/jinn-codemirror

Version:

Source code editor component based on codemirror with language support for XML and Leiden+

723 lines (558 loc) 35.2 kB
import { SourceType } from "../config"; function pointedCharacters2Epidoc(text: string): string { // var text = text.replace(/([aA-zZ])\x{323}/g, '<unclear>$1</unclear>'); //a //text = text.replace(/\u1E5B\/u/g, '<unclear>r</unclear>'); //r /* console.log("Texte dot ---:" + text);*/ return text; }; /** * Convert an input text using different variants of the Leiden conventions. * Adopted from the [Ausohnum Library](https://gitlab.huma-num.fr/estudium/ausohnum-library/-/blob/master/resources/scripts/teiEditor/ancientTextImportRules.js). * * @param text content to convert * @param importSource the type of the input * @returns resulting epiDoc XML */ export function ancientText2XML(text: string, importSource: SourceType): string { const textImportMode = 'newText'; const startingLineNumber = 1; //Clean tabs text = text.toString().replace(/\t+/g, '') ///r to /n text = text.replace(/\r/g, ''); if (text.toString().length - text.toString().lastIndexOf(" ") == 1) { text = text.toString().substring(0, text.toString().lastIndexOf(" ")); } //First Line if (textImportMode === "newText") { text = '<lb n="' + startingLineNumber.toString() + '"/>' + text; /* ***************************** * Line breaks * *****************************/ //New lines no word break const regexLine = /(\-|-?|\=?)\s?\n/g; let index = startingLineNumber - 1; text = text.replace(regexLine, function (match, selection) { if ((selection === "-") || (selection === "=")) { return '\n<lb n="' + (index++ + 2) + '" break="no"/>'; } else { return '\n<lb n="' + (index++ + 2) + '"/>'; } }); //All line in lacuna [— — — — — — — — — — —] text = text.replace(/(\<lb n=\"[0-9]*\"\/\>)\[(\s?—\s?){3,50}\]\n(\<lb n=\"[0-9]*\"\/\>)/g, '$1<gap reason="illegible" quantity="1" unit="line"/>\n$3'); if (importSource == SourceType.edcs) { index = 0; text = text.replace(/(\s)?(\/\/)(?!\>)(\s)?/g, function (match) { if (match[0] === "/") { var breakNo = ' break="no"' } else { var breakNo = "" }; return '\n<cb n="' + (index++ + 2) + '"' + breakNo + '/>'; }); //Line breaks const regexLine = /(\s)?(\/{1})(?!\>)(\s)?/g; index = 0; text = text.replace(regexLine, function (match) { if (match[0] === "/") { var breakNo = ' break="no"' } else { var breakNo = "" }; console.log("BreakNo = " + breakNo); console.log("Match 0= " + match[0]); return '\n<lb n="' + (index++ + 2) + '"' + breakNo + '/>'; }); }; if (importSource == SourceType.phi) { text = text.replace(/#⁷/g, '<gap reason="illegible" quantity="1" unit="character"/>'); text = text.replace(/#⁷#⁷#⁷/g, '<gap reason="illegible" quantity="3" unit="character"/>'); text = text.replace(/#⁵⁶/g, '<g type="interpunct"></g>'); }; //End of features specific to PHI //Lines 5, 10, 15, etc. const regexLines5 = /\n<lb n=\'([0-9])\'\/>\1\s/g; const substLines5 = '\n<lb n="$1"/>'; text = text.replace(regexLines5, substLines5); /* Removing original line number*/ const regexLineClean = /(\"[0-9]{1,3}\"\/>)([0-9]{1,3})/g; const substLineClean = "$1"; text = text.replace(regexLineClean, substLineClean); }; //End of line breaks if insertMode is newText /* ***************************** * Corrections * *****************************/ const regexCorrection = /\<([^\x00-\x7F]*[aA-zZ]*)(?!\=)(?!\/)\>/g; const substCorrection = '<supplied reason="omitted">$1</supplied>'; text = text.replace(regexCorrection, substCorrection); const regexCorrectionOther = /⟨([^\x00-\x7F]*[aA-zZ]*)(?!\=)(?!\/)⟩/g; const substCorrectionOther = '<supplied reason="omitted">$1</supplied>'; text = text.replace(regexCorrectionOther, substCorrectionOther); /****************************/ /* EDCS <x=Y>*/ /******************************/ if (importSource == SourceType.edcs) { /* console.log("in EDCS2 for " + text);*/ const regexCorrection2EDCS = /\<([^\x00-\x7F]*[aA-zZ]*)(\=)([^\x00-\x7F]*[aA-zZ]*)(?!\/)\>/g; const substCorrection2EDCS = "<choice>" + "<corr>$1</corr>" + "<sic>$3</sic></choice>" text = text.replace(regexCorrection2EDCS, substCorrection2EDCS); /* Line in lacuna [6]*/ text = text.replace(/\[6\]/g, '<gap reason="lost" quantity="1" unit="line"/>'); text = text.replace(/\[3\]/g, '<gap reason="lost" extent="unknown" unit="character"/>'); text = text.replace(/\[3\s([^\x00-\x7F]*[aA-zZ]*)\]/g, '<gap reason="lost" extent="unknown" unit="character"/>' + '<supplied reason="lost">$1</supplied>'); text = text.replace(/\[3\s/g, '<gap reason="lost" extent="unknown" unit="character"/>' + '<supplied reason="lost">'); text = text.replace(/\s3\s/g, ' - - - ' ); text = text.replace(/\s3\]/g, ' - - -]' ); text = text.replace(/a\(\)/g, '<abbr>a</abbr>'); }; /* End of EDCS-specific features*/ /*<note> (!), (sic)...*/ text = text.replace(/\(\!\)/g, '<note>!</note>'); text = text.replace(/\(sic\)/g, '<note>sic</note>'); //Lacunae [.....10.....] //[– – –] let regex = /\[(\–|\-)\s?(\–|\-)\s?(\–|\-)\]/g text = text.replace(regex, function (match, selection) { return '<gap reason="lost" extent="unknown" unit="character"/>'; }); //Lacunae with precise number of letters [...6...] regex = /\[(?:(?:\s?\.\s?){1,99})([1-9][0-9]*)(?:(?:\s?\.\s?){1,99})\]/g text = text.replace(regex, function (match, selection) { return '<gap reason="lost" quantity="' + selection + '" unit="character"/>'; }); //Lacunae with precise number of letters [...6...SPACEtext regex = /\[(?:(?:\s?\.\s?){1,99})([1-9][0-9]*)(?:(?:\s?\.\s?){1,99})\s/g text = text.replace(regex, function (match, selection) { const length = match.length - 2; return '<gap reason="lost" quantity="' + selection + '" unit="character"/><supplied reason="lost">'; }); //Lacunae with precise number of letters textSPACE...6...] regex = /\s(?:(?:\s?\.\s?){1,99})([1-9][0-9]*)(?:(?:\s?\.\s?){1,99})\]/g text = text.replace(regex, function (match, selection) { const length = match.length - 2; return '</supplied><gap reason="lost" quantity="' + selection + '" unit="character"/>'; }); //Lacunae with precise number of letters textSPACE...SPACEtext regex = /\s(?:(?:\s?\.\s?){1,99})([1-9][0-9]*)(?:(?:\s?\.\s?){1,99})\s/g text = text.replace(regex, function (match, selection) { const length = match.length - 2; return '</supplied><gap reason="lost" quantity="' + selection + '" unit="character"/><supplied reason="lost">'; }); //Lacunae with precise number of letters [....] regex = /\[((\.){1,99})\]/g text = text.replace(regex, function (match, selection) { const length = match.length - 2; return '<gap reason="lost" quantity="' + length + '" unit="character"/>'; }); //Lacunae with precise number of letters [...SPACEtext regex = /\[((\.){1,99})\s/g text = text.replace(regex, function (match, selection) { const length = match.length - 2; return '<gap reason="lost" quantity="' + length + '" unit="character"/><supplied reason="lost">'; }); //Lacunae with precise number of letters textSPACE...] regex = /\s((\.){1,99})\]/g text = text.replace(regex, function (match, selection) { const length = match.length - 2; return '</supplied><gap reason="lost" quantity="' + length + '" unit="character"/>'; }); //Lacunae with precise number of letters textSPACE...SPACEtext regex = /\s((\.){1,99})\s/g text = text.replace(regex, function (match, selection) { const length = match.length - 2; return '</supplied><gap reason="lost" quantity="' + length + '" unit="character"/><supplied reason="lost">'; }); //[ca. 5-7] text = text.replace(/\[(-|–|\.\s?){1,20}ca\.(\s?)([1-9][0-9]*)((-)([1-9][0-9]*))(\s?)(-|–|\.\s?){1,20}\]/g, '<gap reason="lost" atLeast="$3" atMost="$6" ' + 'unit="character"/>'); //[ca. 5] text = text.replace(/\[(-|–|\.\s?){1,20}ca\.(\s?)([1-9][0-9]*)(\s?)(-|–|\.\s?){1,20}\]/g, '<gap reason="lost" quantity="$3" ' + 'unit="character" precision="low"/>'); //[...c.5-7...] text = text.replace( /\[(?:[\.․]){1,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:(?:-)([1-9][0-9]*))(?:\s?)(?:[\.․]){1,20}(?:\s?)\]/g, '<gap reason="lost" atLeast="$1" atMost="$2" unit="character"/>'); //[...c.5...] text = text.replace( /\[(?:[\.․]){1,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:\s?)(?:[\.․]){1,20}(?:\s?)\]/g, '<gap reason="lost" quantity="$1" unit="character" precision="low"/>'); //[...c.5-7... text = text.replace( /\[(?:[\.․]){1,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:(?:-)([1-9][0-9]*))(?:\s?)(?:[\.․]){1,20}(?:\s)/g, '<gap reason="lost" atLeast="$1" atMost="$2" unit="character"/><supplied reason="lost">'); //[...c.5... text = text.replace( /\[(?:[\.․]){1,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:\s?)(?:[\.․]){1,20}(?:\s)/g, '<gap reason="lost" quantity="$1" unit="character" precision="low"/><supplied reason="lost">'); //[text ...c.5-7...] text = text.replace( /\s(?:[\.․]){1,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:(?:-)([1-9][0-9]*))(?:\s?)(?:[\.․]){1,20}(?:\s?)\]/g, '</supplied><gap reason="lost" atLeast="$1" atMost="$2" unit="character"/>'); //[text ...c.5...] text = text.replace( /\s(?:[\.․]){1,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:\s?)(?:[\.․]){1,20}(?:\s?)\]/g, '</supplied><gap reason="lost" quantity="$1" unit="character" precision="low"/>'); //...c.5-7... text = text.replace( /\s(?:[\.․]){2,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:(?:-)([1-9][0-9]*))(?:\s?)(?:[\.․]){1,20}(?:\s)/g, '</supplied><gap reason="lost" atLeast="$1" atMost="$2" unit="character"/><supplied reason="lost">'); //...c.5... text = text.replace( /\s(?:[\.․]){2,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:\s?)(?:[\.․]){1,20}(?:\s)/g, '</supplied><gap reason="lost" quantity="$1" unit="character" precision="low"/><supplied reason="lost">'); //Symbol (centurio) text = text.replace(/(?:\s|\n)\(([^\x00-\x7F]*[aA-zZ]*)\)/g, ' <expan><ex>$1</ex></expan>'); //Replacing double [[ with ⟦ text = text.replace(/\[{2}/g, '⟦'); //Replacing double ]] with ⟧ text = text.replace(/\]{2}/g, '⟧'); /* Abbreviation with [] [Q]ui(ina) */ text = text.replace(/\[([^\x00-\x7F]*[aA-zZ]*[^\]])\]([^\x00-\x7F]*[aA-zZ]*[^\]])\(([^\x00-\x7F]*?[aA-zZ]*?)\)/g, '<expan><abbr><supplied reason="lost">$1</supplied>$2</abbr><ex>$3</ex></expan>'); /* Abbreviation with Rasura [Q]ui(ina) */ text = text.replace(/(〚|⟦|\[\[)([^\x00-\x7F]*[aA-zZ]*[^\]])(〛|⟧|]])([^\x00-\x7F]*[aA-zZ]*[^\]])\(([^\x00-\x7F]*?[aA-zZ]*?)\)/g, '<expan><abbr><supplied reason="lost">$1</supplied>$2</abbr><ex>$3</ex></expan>'); /* Hermes [Augusti - - - lib(ertus)] ==> straitgh supplied with a gap inside (supplied not starting or ending in abbreviation */ text = text.replace(/\[(\w*?\s?)(?:(?:(?:\-|\–|\—)\s?){1,20})(\w*?)\](?![^\x00-\x7F]*?[aA-zZ]*?\()/g, '<supplied reason="lost">$1</supplied><gap reason="lost" extent="unknown" unit="character"/><supplied reason="lost">$2</supplied>'); //CLEANING </supplied>\s?</supplied> text = text.replace(/<supplied reason=\"lost\"><\/supplied>/g, ''); /* Hermes [Augusti - - - lib(ertus)] ==> straitgh RASURA with a gap inside (supplied not starting or ending in abbreviation */ text = text.replace(/(?:⟦|〚)(.*?\s?)(?:(?:(?:\-|\–|\—)\s?){1,20})(.*?)(?:⟧|〛)(?![^\x00-\x7F]*?[aA-zZ]*?\()/g, '<del rend="erasure">$1</del><gap reason="lost" extent="unknown" unit="character"/><del rend="erasure">$2</del>'); //Supplied: BLANK[szs szsz sszss(f) sss]CARRIAGE : if [] are preceded and followed by space, means can be replaced by <supplied> text = text.replace(/(?:\s)\[(.*?)\](?:\n)/g, ' <supplied reason="lost">$1</supplied>\n'); //Supplied: BLANK[szs szsz s sss]BLANK : if [] are preceded and followed by space, means can be replaced by <supplied> text = text.replace(/(?:\s)\[(.*)\](?:\s)/g, ' <supplied reason="lost">$1</supplied> '); //DEL: BLANK[szs szsz sszss(f) sss]CARRIAGE : if [] are preceded and followed by space, means can be replaced by <supplied> text = text.replace(/(?:\s)(?:⟦|〚)(.*?)(?:⟧|〛)(?:\n)/g, ' <del rend="erasure">$1</del>\n'); //DEL: BLANK[szs szsz s sss]BLANK : if [] are preceded and followed by space, means can be replaced by <supplied> text = text.replace(/(?:\s)(?:⟦|〚)(.*?)(?:⟧|〛)(?:\s)/g, ' <del256 rend="erasure">$1</del> '); /*//Supplied: BLANK[szs szsz sszss(f) sss]BLANK : if [] are preceded and followed by space, means can be replaced by <supplied> text = text.replace(/(?:\s)\[(.*?)\](?!(.*?))(?:\s)/g, ' <supplied262 reason="lost">$1</supplied> '); */ /*Abbreviation partly in lacuna without text after )*/ regex = /([^\x00-\x7F]*[aA-zZ]*)\[([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)(\])/g; let subst = '<expan><abbr>$1<supplied reason="lost">$2</supplied></abbr><ex>$3</ex></expan>' text = text.replace(regex, subst); /*Abbreviation partly in RASURA without text after )*/ regex = /([^\x00-\x7F]*[aA-zZ]*)(?:⟦|〚)([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)(?:⟧|〛)/g; subst = '<expan><abbr>$1<del rend="erasure">$2</del></abbr><ex>$3</ex></expan>' text = text.replace(regex, subst); /* SUPPLIED: Au[g(usti) followed by words even ABBREV but ] not in inside an abbreviation */ text = text.replace(/([^\x00-\x7F]*?[aA-zZ]*?[^>])?\[([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\)(.*?[^\-\–\—])\](?![^\x00-\x7F]*?[aA-zZ]*\()/g, '<expan><abbr>$1<supplied reason="lost">$2</supplied></abbr><ex>$3</ex></expan> <supplied reason="lost">$4</supplied>'); /* Before Chnage on 7/4/20 10:38: text = text.replace(/([^\x00-\x7F]*?[aA-zZ]*?[^\s][^>])?\[([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\)(.*?[^\-\–\—])\](?![^\x00-\x7F]*?[aA-zZ]*\()/g,*/ /* text = text.replace(/([^\x00-\x7F]*?[aA-zZ]*?[^\s][^>])?(?:\s)(?:⟦|〚)([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\)(.*?[^\-\–\—])(?:⟧|〛)(?![^\x00-\x7F]*?[aA-zZ]*\()/g,*/ /* DEL: Au[[g(usti) followed by words even ABBREV but ]] not in inside an abbreviation */ text = text.replace(/([^\x00-\x7F]*?[aA-zZ]*?[^\s][^>])?(?:\s?)(?:⟦|〚)([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\)(.*?[^\-\–\—])(?:⟧|〛)(?![^\x00-\x7F]*?[aA-zZ]*\()/g, '<expan><abbr>$1<del rend="erasure">$2</del></abbr><ex>$3</ex></expan> <del rend="erasure">$4</del>'); /* SUPPLIED: Hermes Au[g(usti) libertus pr]oc(urator) [ starting and ending in a abbreviation*/ text = text.replace(/([^\x00-\x7F]*?[aA-zZ]+)\[([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\)(.*?[^\-\–\—])([^\x00-\x7F]*?[aA-zZ]*?)\](?:([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\))/g, '<expan><abbr>$1<supplied reason="lost">$2</supplied></abbr><ex>$3</ex></expan> <supplied reason="lost">$4</supplied><expan><abbr><supplied reason="lost">$5</supplied>$6</abbr><ex>$7</ex></expan>'); /* DEL: Hermes Au[[g(usti) libertus pr]]oc(urator) [ starting and ending in a abbreviation*/ text = text.replace(/([^\x00-\x7F]*?[aA-zZ]*?)(?:⟦|〚)([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\)(.*?[^\-\–\—])([^\x00-\x7F]*?[aA-zZ]*?)(?:⟧|〛)(?:([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\))/g, '<expan><abbr>$1<del rend="erasure">$2</del></abbr><ex>$3</ex></expan> <del rend="erasure">$4</del><expan><abbr><del rend="erasure">$5</del>$6</abbr><ex>$7</ex></expan>'); // <supplied reason="lost"> ․․․c.5-7․․․ </supplied> text = text.replace(/<supplied reason="lost"> (?:[\.․]){1,20}c(?:a?)\.(?:\s?)([1-9][0-9]*)(?:(?:-)([1-9][0-9]*))(?:\s?)(?:[\.․]){1,20} <\/supplied>/g, '<gap reason="lost" atLeast="$1" atMost="$2" unit="character"/>'); //Cleaning <supplied reason="lost"><gap reason="lost" atLeast="5" atMost="7" unit="character"/></supplied> text = text.replace(/<supplied reason=\"lost\">(<gap reason=\"lost\" atLeast=\"[0-9]*\" atMost=\"[0-9]\" unit="character"\/>)<\/supplied>/g, '$1'); //Supplied: [szs szsz sszss(f) sss] text = text.replace(/\[(.[^\[\-\–\—]*)\](?![^\x00-\x7F]*[aA-zZ]*\()/g, '<supplied reason="lost">$1</supplied>'); //DEL: [[]szs szsz sszss(f) sss]] text = text.replace(/(?:⟦|〚)(.[^\[]*)\](?![^\x00-\x7F]*[aA-zZ]*\()/g, '<del rend="erasure">$1</supplied>'); /* * THIS regex is making everything slow /\* SUPPLIED: Herm[es Aug(usti) libertus pr]oc(urator) ending in a abbreviation*\/ text = text.replace(/(?:([^\x00-\x7F]*?[aA-zZ]*?[^\s])*)\[([^\x00-\x7F]*?[aA-zZ]*?)\s(.*?)([^\x00-\x7F]*?[aA-zZ]*?)\](?:([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*?[aA-zZ]*?)\))/g, '$1<supplied reason="lost">$3</supplied> <expan><abbr><supplied reason="lost">$4$5</supplied>$6</abbr><ex>$7</ex></expan>'); */ /* SUPPLIED: [Aug(usti) */ text = text.replace(/(?:\s)\[((.[^\.<])*)\s/g, ' <supplied reason="lost"><expan><abbr>$1</abbr><ex>$2</ex></expan></supplied>'); /*Was before: text = text.replace(/(?:\s)\[([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)/g,*/ /* SUPPLIED ddd(t)] */ text = text.replace(/(?!([^\x00-\x7F]*[aA-zZ]*))(\s)([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)\]/g, '$1<supplied reason="lost"><expan><abbr>$2</abbr><ex>$3</ex></expan></supplied>'); /* SUPPLIED dd]d(t) */ text = text.replace(/(\s)([^\x00-\x7F]*?[aA-zZ]*?)\]([^\x00-\x7F]*?[aA-zZ]*?)\(([^\x00-\x7F]*[aA-zZ]*)\)/g, '$1</supplied><expan><abbr><supplied reason="lost">$2</supplied>$3</abbr><ex>$4</ex></expan>'); /* SUPPLIED: A[ug(usti) */ text = text.replace(/(\s)([^\x00-\x7F]+[aA-zZ]+)\[([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)/g, ' <expan><abbr>$2<supplied reason="lost">$3</supplied></abbr><ex>$4</ex></expan> <supplied reason="lost">'); //SUPPLIED: xx[frfrfrf(?) - - - - - - ] text = text.replace(/\[([^\x00-\x7F]*[aA-zZ]*)\(\?\)((\s?(\-|\–|\—)\s?){1,20})\]/g, '<supplied reason="lost" cert="low">$1</supplied><gap reason="lost" extent="unknown" unit="character"/>'); //SUPPLIED: xx[frfrfrf - - - - - - frf] text = text.replace(/\[([^\x00-\x7F]*[aA-zZ]*)((\s?(\-|\–|\—)\s?){1,20})\]/g, '<supplied reason="lost">$1</supplied><gap reason="lost" extent="unknown" unit="character"/>'); /* ***************************** * Abbreviations * *****************************/ /*Word with multiple abbreviations*/ /* var regex= /\[(․{1,20})\]/g; index =0; text = text.replace(regex, function(match){ console.log('Ici match:' + match.length ); var length = parseInt(match.length) -2; return '<gap reason="illegible" quantity="' + length + '" unit="character"/>' ; }); */ /*Abbreviation partly in lacuna with text after )*/ regex = /([^\x00-\x7F]*[aA-zZ]*)\[([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)(\s)?([^\x00-\x7F]*[aA-zZ]*)?(\s)?(\])/g; subst = '<expan><abbr>$1<supplied reason="lost">$2</supplied></abbr><ex>$3</ex></expan><supplied reason="lost">$4$5</supplied>' text = text.replace(regex, subst); /* Abbreviation in Rasura*/ regex = /(〚|⟦|\[\[)([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)([^\x00-\x7F]*[aA-zZ]*)?(〛|⟧|]])/g; subst = '<del rend="erasure"><expan><abbr>$2</abbr><ex>$3</ex></expan>$4</del>'; text = text.replace(regex, subst); /* Abbreviation in Lacuna*/ regex = /\[([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)(])/g; subst = '<supplied reason="lost"><expan><abbr>$1</abbr><ex>$2</ex></expan></supplied>'; text = text.replace(regex, subst); /* Abbreviation with uncertain resolution*/ regex = /([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\?\)/g; const substAbbrevInLac = '<expan><abbr>$1</abbr><ex cert="low">$2</ex></expan>'; text = text.replace(regex, substAbbrevInLac); /*Double abbreviation*/ regex = /([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)([^\x00-\x7F]*[aA-zZ]*)*\(([^\x00-\x7F]*[aA-zZ]*)\)/g; subst = "<expan><abbr>$1</abbr><ex>$2</ex><abbr>$3</abbr><ex>$4</ex></expan>"; text = text.replace(regex, subst); /*Basic abbreviation*/ regex = /([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)([^\x00-\x7F]*[aA-zZ]*)*/g; subst = "<expan><abbr>$1</abbr><ex>$2</ex>$3</expan>"; text = text.replace(regex, subst); //cleaning wrong closing of expan text = text.replace("\<\/expan\>\<expan\>\<abbr\>", "<abbr>"); /* ***************************** * Line in lacuna * *****************************/ //Line in lacuna [------] text = text.replace('\n\[------\]', '<gap unit="line" />'); //Line in lacuna ------ text = text.replace(/(-){6}/g, '<gap unit="line" />'); /*//All line [— — — — — — — — — — — text = text.replace(/(\<lb n=\"[0-9]*\"\/\>)\[(—\s?)*\]/g, '$1<gap reason="lost" quantity="1" unit="line"/>'); */ //text = text.replace(/(\<lb n=\"[0-9]*\"\/\>)\[(\s?—\s?)*\]/g, '$1<gap reason="lost" quantity="1" unit="line"/>\n'); //Part of line [— — — — — — — — — — — text = text.replace(/\[(—\s?)*\]/g, '<gap reason="lost" extent="unknown" unit="character"/>'); //gap of 3? text = text.replace(/\[---\]/g, '<gap reason="lost" extent="unknown" unit="character"/>'); //[— — —ca.x-y— — —] text = text.replace(/\[— — —ca\.([1-9][0-9]*)((-)([1-9][0-9]*))?— — —\]/g, '<gap reason="lost" quantity="$1" ' + 'unit="character" precision="low"/>'); //[— — — —ca.x-y— — — —] text = text.replace(/\[— — — —ca\.([1-9][0-9]*)((-)([1-9][0-9]*))?— — — —\]/g, '<gap reason="lost" quantity="$1" ' + 'unit="character" precision="low"/>'); //[—ca. x— ] text = text.replace(/\[(-|–\s?){1,20}ca\.(\s?)([1-9][0-9]*)?(\s?)(-|–\s?){1,20}\]/g, '<gap reason="lost" quantity="$3" ' + 'unit="character" precision="low"/>'); //Line lost of unknown extent ; ------? text = text.replace(/\------\?/g, '<gap reason="lost" extent="unknown" ' + 'unit="line"><certainty match=".." locus="name"/></gap>'); //Line lost of unknown extent ; [------?] text = text.replace(/\[\------\?\]/g, '<gap reason="lost" extent="unknown" ' + 'unit="line"><certainty match=".." locus="name"/></gap>'); //Line lost of unknown extent ; [------?] text = text.replace(/\[\---\?\]/g, '<gap reason="lost" extent="unknown" ' + 'unit="line"><certainty match=".." locus="name"/></gap>'); //beginning lost text = text.replace(/\[(-|–|\—\s?){1,20}([^\x00-\x7F]*[aA-zZ]*)\]/g, '<gap reason="lost" extent="unknown" unit="character"/>'); //Beginning of line lost, unknown extent ; with restition of word at end [------word] //[- - - - - - - - - - γυμνα]- text = text.replace(/\[(-|–|\—\s?){1,20}([^\x00-\x7F]*[aA-zZ]*)\]/g, '<gap reason="lost" extent="unknown" ' + 'unit="character"/><supplied reason="lost">$2</supplied>'); //Beginning of line lost, unknown extent ; with RASURA of word at end [------word] //[- - - - - - - - - - γυμνα]- text = text.replace(/(?:⟦|〚)(-|–|\—\s?){1,20}([^\x00-\x7F]*[aA-zZ]*)(?:⟧|〛)/g, '<gap reason="lost" extent="unknown" ' + 'unit="character"/><del rend="erasure">$2</supplied>'); //End of line lost, unknown extent ; with restition of word at beginning [word ---] text = text.replace( /* /\[(?!(\u2013|\u2014))([^\x00-\x7F]*[aA-zZ]*)((\s?)(\u2013|\u2014)\s?){1,20}\]/g,*/ /* /\[(?!([\-\–\—]))([^\x00-\x7F]*[aA-zZ]*)((\s?)([\-\—\–])\s?){1,20}\]/g, //==>before 31/03/2020 and attempt to match [wor word - - -]*/ /\[(?!([\-\–\—]))(((?!([\-\–\—\[\]]))[^\x00-\x7F]*[aA-zZ]*(\s?)){1,10})(([\-\—\–])\s?){1,20}\]/g, '<supplied reason="lost">$2</supplied><gap reason="lost" extent="unknown" ' + 'unit="character"/>'); //End of line lost, unknown extent ; ---] text = text.replace( /(([\-\—\–])\s?){1,20}\]/g, '<gap reason="lost" extent="unknown" ' + 'unit="character"/>'); //Cleaning <expan><abbr>[ text = text.replace(/<expan><abbr>\[/g, '<supplied reason="lost"><expan><abbr>'); //CLeaning </expan> </supplied>< text = text.replace(/<\/expan> <\/supplied></g, '</expan></supplied> <'); //Cleaning <supplied reason="lost"><expan><abbr>TEXT[ text = text.replace(/<supplied reason=\"lost\"><expan><abbr>([^\x00-\x7F]*?[aA-zZ]*?)\]/g, '<expan><abbr><supplied reason="lost">$1</supplied>'); //Cleaning <expan><abbr></abbr><ex> text = text.replace(/<expan><abbr><\/abbr><ex>/g, '<expan><ex>') //Cleaning restitutions not dealt with by previous regex //text + ---- in lacuna const regexSuppliedClean = /\[/g; const substSuppliedClean = '<supplied reason="lost">'; text = text.replace(regexSuppliedClean, substSuppliedClean); const regexSuppliedCleanClose = /\]/g; const substSuppliedCleanClose = '</supplied>'; text = text.replace(regexSuppliedCleanClose, substSuppliedCleanClose); //Cleaning </ex></supplied></expan> text = text.replace(/<\/ex><\/supplied><\/expan>/g, '</ex></expan></supplied>'); /*//Cleaning <expan><abbr>gt</supplied>gt</abbr> text = text.replace(/<expan><abbr>gt<\/supplied>gt<\/abbr>/g, , '<expan><abbr><supplied reason="lost">$1</supplied>gt</abbr>'); */ // CLEANING - - - </supplied> text = text.replace(/((\s?(\-|\—|\–)\s?){1,20})<\/supplied>/g, '</supplied><gap reason="lost" extent="unknown" unit="character"/>') text = text.replace(/((\s?(\-|\—|\–)\s?){1,20})<\/supplied>/g, '</supplied><gap reason="lost" extent="unknown" unit="character"/>') //CLEAING <supplied reason="lost">- - - text = text.replace(/<supplied reason=\"lost\">((\s?(\-|\—|\–)\s?){1,20})/g, '<gap reason="lost" extent="unknown" unit="character"/><supplied reason="lost">') //Cleaning: <supplied reason="lost"></supplied223><gapzz reason="lost" extent="unknown" unit="character"/><supplied224 reason="lost"></supplied> text = text.replace(/<supplied reason=\"lost\"><\/supplied><gap reason=\"lost\" extent=\"unknown\" unit=\"character\"\/><supplied reason=\"lost\"><\/supplied>/g , '</supplied><gap reason="lost" extent="unknown" unit="character"/><supplied reason="lost">'); //CLEANING <supplied reason="lost"> </supplied> text = text.replace(/<supplied reason=\"lost\"> <\/supplied>/g, ''); //CLEANING <del rend="erasure">\s?</supplied> text = text.replace(/<del rend=\"erasure\">\s?<\/del>/g, ''); //CLEANING </supplied>\s?</supplied> text = text.replace(/<\/supplied>\s?<\/supplied>/g, '</supplied>'); //CLEANING <lb /></supplied><gap text = text.replace(/\/><\/supplied><gap/g, '/><gap'); //Supplied: [szs - - - sss] text = text.replace(/\[(?!([\-\–\—]))((?:\s?(?:(?!(?:[\-\–\—\[\]]))[^\x00-\x7F]*[aA-zZ](?!\s)*)){1,10})(?:(?:\s?[\-\—\–])\s?){1,20}((?:(?!([\-\–\—\[\]]))[^\x00-\x7F]*[aA-zZ]*))\]/g, '<supplied reason="lost">$2</supplied><gap reason="lost" extent="unknown" unit="character"/><supplied reason="lost">$3</supplied>'); //Cleaning not processed - - - in middle lacuna text = text.replace( /(\s?([\-\—\–])\s?){1,20}/g, '</supplied><gap reason="lost" extent="unknown" ' + 'unit="character"/><supplied reason="lost">'); //Supplied with ] in an abbreviation text = text.replace(/\[(.[^\[]*)(\s)([^\x00-\x7F]*[aA-zZ]*)\]([^\x00-\x7F]*[aA-zZ]*)\(([^\x00-\x7F]*[aA-zZ]*)\)/g, '<supplied reason="lost">$1</supplied><expan><abbr><supplied reason="lost">$3</supplied>$4</abbr><ex>$5</ex></expan>'); /*//Equivalent to previous but on ending text = text.replace(/\[([^\x00-\x7F]*[aA-zZ]*)\s?(-|–\s?){1,20}\]/g, '<supplied reason="lost">$1</supplied><gap reason="lost" extent="unknown" ' + 'unit="character"/>'); */ //illegible charactes +++ const regexIllegibleCharacter = /([+])+/g; text = text.replace(regexIllegibleCharacter, function (match) { console.log('Ici match:' + match.length); return '<gap reason="illegible" quantity="' + match.length + '" unit="character"/>'; }); //gap charachter with dot const regexGapCharacter = /\[(․{1,20})\]/g; text = text.replace(regexGapCharacter, function (match) { console.log('Ici match:' + match.length); const length = match.length - 2; return '<gap reason="illegible" quantity="' + length + '" unit="character"/>'; }); /* CLEANING opening supplied followed by GAP*/ text = text.replace(/<supplied reason=\"lost\"> <gap/g, ' <gap'); //Hedera as hed. const regexHed = /(hed\.)̣/gi; const substHed = '<g type="hedera"></g>'; text = text.replace(regexHed, substHed); //vac const regexVac = /vac\./gi; const substVac = '<space extent="unknown" unit="character"/>'; text = text.replace(regexVac, substVac); /* ***************************** * superfluous * *****************************/ const regexSuperfluous = /\{([^\x00-\x7F]*[aA-zZ]*)\}/g; const substSuperfluous = '<surplus>$1</surplus>'; text = text.replace(regexSuperfluous, substSuperfluous); /* ******************************* * Erased * ******************************* */ /* 〚 U+301A and U+301B*/ regex = /(〚)(([^\x00-\x7F]*[aA-zZ]*)([\s\,\.]([^\x00-\x7F]*[aA-zZ]*))*)(〛)/gm; subst = '<del rend="erasure">$2</del>'; text = text.replace(regex, subst); /*With ⟦ U+27E6 U+27E7*/ regex = /(⟦)(([^\x00-\x7F]*[aA-zZ]*)([\s\,\.]([^\x00-\x7F]*[aA-zZ]*))*)(⟧)/gm; subst = '<del rend="erasure">$2</del>'; text = text.replace(regex, subst); regex = /(\[){2}(([^\x00-\x7F]*[aA-zZ]*)([\s\,\.]([^\x00-\x7F]*[aA-zZ]*))*)(\]){2}/gm; subst = '<del rend="erasure">$2</del>'; text = text.replace(regex, subst); /* ***************************** * Restitutions * *****************************/ //restituted text /* var regexTextInLacuna = /(\[)(\w*\s?\w*)(])/g;*/ const regexTextInLacuna = /(\[)(([^\x00-\x7F]*[aA-zZ]*)([\s\,\.]([^\x00-\x7F]*[aA-zZ]*))*)(\])/gm; const substTextInLacuna = '<supplied reason="lost">$2</supplied>'; text = text.replace(regexTextInLacuna, substTextInLacuna); regex = new RegExp('\u{61}', 'u'); //text + ---- in lacuna const regexTextandUnkInLacuna = /(\[)([^\x00-\x7F]*[aA-zZ]*\s?[^\x00-\x7F]*[aA-zZ]*)(---)?(\])/g; const substTextandUnkInLacuna = '<supplied reason="lost">$2</supplied><gap reason="lost" />'; text = text.replace(regexTextandUnkInLacuna, substTextandUnkInLacuna); //text = text.replace('extent=\"8\" unit=\"letter\"', 'class="gap8letters"'); //Dotted characters const regexDotted = /([^\x00-\x7F]?[aA-zZ]?)̣/g; const substDotted = '<unclear>$1</unclear>'; text = text.replace(regexDotted, substDotted); //Cleaning consecutive unclear const regexUnclearClean = /(\<\/unclear\>\<unclear\>)/g; const substUnclearClean = ''; text = text.replace(regexUnclearClean, substUnclearClean); /* //Cleaning supplied ending with ? — —] var regexSuppliedCleanClose2 = /(\? — —\])/g; var substSuppliedCleanClose2 = '</supplied>'; var text = text.replace(regexSuppliedCleanClose2, substSuppliedCleanClose2); */ //Cleaning <gap reason="lost" atLeast="5" atMost="7" unit="character"/><expan><abbr>li</supplied> text = text.replace(/(<gap reason=\"lost\" atLeast=\"[0-9]*\" atMost=\"[0-9]\" unit=\"character\"\/>)<expan><abbr>((?:[^\x00-\x7F]*?[aA-zZ]*?)*)<\/supplied>/g, '$1<expan><abbr><supplied reason="lost">$2</supplied>'); //Cleaning <gap reason="lost" atLeast="5" atMost="7" unit="character"/></supplied> text = text.replace(/(<gap reason=\"lost\" atLeast=\"[0-9]*\" atMost=\"[0-9]\" unit=\"character\"\/>)<\/supplied>/g, '$1'); //Cleaning <gap reason="lost" quantity="5" unit="character" precision="low"/><expan><abbr>li</supplied> text = text.replace(/(<gap reason=\"lost\" atLeast=\"[0-9]*\" atMost=\"[0-9]\" unit=\"character\"\/>)<expan><abbr>((?:[^\x00-\x7F]*?[aA-zZ]*?)*)<\/supplied>/g, '$1<expan><abbr><supplied reason="lost">$2</supplied>'); //Cleaning <gap reason="lost" quantity="5" atMost="7" unit="character" precision="low"/></supplied> text = text.replace(/(<gap reason=\"lost\" quantity=\"[0-9]*\" unit=\"character\" precision=\"low\"\/>)<\/supplied>/g, '$1'); //Cleaning lb not preceded by a carraige text = text.replace(/(\/\>)\s(\<lb n=\"[0-9]*\"\/\>)/g, "$1\n$2") //Cleaning not full line in lacuna text = text.replace(/unit=\"line\"\/>\s(\w)/g, 'unit="line"/>$1'); //∙ text = text.replace(/ ?∙ ?/g, ' <g type="interpunct"></g> '); /* text = text.replace(/ ?❦ ?/g, '<g type="hedera"></g>');*/ text = text.replace(/ ?𐆖 ?/g, ' <g type="denarius"/> '); text = text.replace(/❦/g, ' <g type="hedera"></g> '); //Cleaning double space text = text.replace(/\s\s/g, ' '); /* Centered WORDS*/ /*TODO: check if space after lb*/ // var text = text.replace(/<lb n= {2,99}/g, ""); text = text.replace(/ {2,99}/g, ""); /* console.log("Converted text for preview: " + text);*/ return text; };