Overview
Comment: | [core][build][js] fix several issues, better debugging information, create RegExp at runtime instead of preprocessing them at build |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | core | build | rg |
Files: | files | file ages | folders |
SHA3-256: |
50bef581caf2f488dab21fbc89c61ebc |
User & Date: | olr on 2018-09-12 09:46:12 |
Other Links: | branch diff | manifest | tags |
Context
2018-09-12
| ||
09:49 | [core][js] small code cleaning check-in: 05090f91ec user: olr tags: core, rg | |
09:46 | [core][build][js] fix several issues, better debugging information, create RegExp at runtime instead of preprocessing them at build check-in: 50bef581ca user: olr tags: core, build, rg | |
09:44 | [core][py] gc engine: better debugging information check-in: ba6939effa user: olr tags: core, rg | |
Changes
Modified compile_rules_js_convert.py from [9c357794f2] to [1d2fbc189c].
︙ | ︙ | |||
42 43 44 45 46 47 48 | sCode = sCode.replace(".strip", ".gl_trim") sCode = sCode.replace(".lstrip", ".gl_trimLeft") sCode = sCode.replace(".rstrip", ".gl_trimRight") sCode = sCode.replace('.replace("."', r".replace(/\./g") sCode = sCode.replace('.replace("..."', r".replace(/\.\.\./g") sCode = re.sub(r'.replace\("([^"]+)" ?,', ".replace(/\\1/g,", sCode) # regex | | | | | | | | 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | sCode = sCode.replace(".strip", ".gl_trim") sCode = sCode.replace(".lstrip", ".gl_trimLeft") sCode = sCode.replace(".rstrip", ".gl_trimRight") sCode = sCode.replace('.replace("."', r".replace(/\./g") sCode = sCode.replace('.replace("..."', r".replace(/\.\.\./g") sCode = re.sub(r'.replace\("([^"]+)" ?,', ".replace(/\\1/g,", sCode) # regex #sCode = re.sub('re.search\\("([^"]+)", *(m.group\\(\\d\\))\\)', "(\\2.search(/\\1/) >= 0)", sCode) #sCode = re.sub(".search\\(/\\(\\?i\\)([^/]+)/\\) >= 0\\)", ".search(/\\1/i) >= 0)", sCode) #sCode = re.sub('(look\\(sx?[][.a-z:()]*), "\\(\\?i\\)([^"]+)"', "\\1, /\\2/i", sCode) #sCode = re.sub('(look\\(sx?[][.a-z:()]*), "([^"]+)"', "\\1, /\\2/", sCode) #sCode = re.sub('(look_chk1\\(dDA, sx?[][.a-z:()]*, [0-9a-z.()]+), "\\(\\?i\\)([^"]+)"', "\\1, /\\2/i", sCode) #sCode = re.sub('(look_chk1\\(dDA, sx?[][.a-z:()]*, [0-9a-z.()]+), "([^"]+)"', "\\1, /\\2/i", sCode) sCode = re.sub('m\\.group\\((\\d+)\\) +in +(a[a-zA-Z]+)', "\\2.has(m[\\1])", sCode) sCode = sCode.replace("(?<!-)", "") # todo # slices sCode = sCode.replace("[:m.start()]", ".slice(0,m.index)") sCode = sCode.replace("[m.end():]", ".slice(m.end[0])") sCode = sCode.replace("[m.start():m.end()]", ".slice(m.index, m.end[0])") sCode = sCode.replace('[lToken[nLastToken]["nEnd"]:]', '.slice(lToken[nLastToken]["nEnd"])') |
︙ | ︙ |
Modified gc_core/js/lang_core/gc_engine.js from [f31744b125] to [fb072c0f7f].
︙ | ︙ | |||
578 579 580 581 582 583 584 | // execute actions found in the DARG let bChange = false; for (let [sLineId, nextNodeKey] of Object.entries(dNode)) { let bCondMemo = null; for (let sRuleId of dGraph[nextNodeKey]) { try { if (bDebug) { | | | 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 | // execute actions found in the DARG let bChange = false; for (let [sLineId, nextNodeKey] of Object.entries(dNode)) { let bCondMemo = null; for (let sRuleId of dGraph[nextNodeKey]) { try { if (bDebug) { console.log(" >TRY: " + sRuleId + " " + sLineId); } let [sOption, sFuncCond, cActionType, sWhat, ...eAct] = gc_rules_graph.dRule[sRuleId]; // Suggestion [ option, condition, "-", replacement/suggestion/action, iTokenStart, iTokenEnd, cStartLimit, cEndLimit, bCaseSvty, nPriority, sMessage, sURL ] // TextProcessor [ option, condition, "~", replacement/suggestion/action, iTokenStart, iTokenEnd, bCaseSvty ] // Disambiguator [ option, condition, "=", replacement/suggestion/action ] // Tag [ option, condition, "/", replacement/suggestion/action, iTokenStart, iTokenEnd ] // Immunity [ option, condition, "%", "", iTokenStart, iTokenEnd ] |
︙ | ︙ | |||
602 603 604 605 606 607 608 | let nTokenErrorEnd = (iTokenEnd > 0) ? nTokenOffset + iTokenEnd : nLastToken + iTokenEnd; let nErrorStart = this.nOffsetWithinParagraph + ((cStartLimit == "<") ? this.lToken[nTokenErrorStart]["nStart"] : this.lToken[nTokenErrorStart]["nEnd"]); let nErrorEnd = this.nOffsetWithinParagraph + ((cEndLimit == ">") ? this.lToken[nTokenErrorEnd]["nEnd"] : this.lToken[nTokenErrorEnd]["nStart"]); if (!this.dError.has(nErrorStart) || nPriority > this.dErrorPriority.get(nErrorStart, -1)) { this.dError[nErrorStart] = this._createErrorFromTokens(sWhat, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty, sMessage, sURL, bShowRuleId, sOption, bContext); this.dErrorPriority[nErrorStart] = nPriority; if (bDebug) { | | < | | | | < | | | | 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 | let nTokenErrorEnd = (iTokenEnd > 0) ? nTokenOffset + iTokenEnd : nLastToken + iTokenEnd; let nErrorStart = this.nOffsetWithinParagraph + ((cStartLimit == "<") ? this.lToken[nTokenErrorStart]["nStart"] : this.lToken[nTokenErrorStart]["nEnd"]); let nErrorEnd = this.nOffsetWithinParagraph + ((cEndLimit == ">") ? this.lToken[nTokenErrorEnd]["nEnd"] : this.lToken[nTokenErrorEnd]["nStart"]); if (!this.dError.has(nErrorStart) || nPriority > this.dErrorPriority.get(nErrorStart, -1)) { this.dError[nErrorStart] = this._createErrorFromTokens(sWhat, nTokenOffset, nLastToken, nTokenErrorStart, nErrorStart, nErrorEnd, sLineId, sRuleId, bCaseSvty, sMessage, sURL, bShowRuleId, sOption, bContext); this.dErrorPriority[nErrorStart] = nPriority; if (bDebug) { console.log(" NEW_ERROR: ", this.dError[nErrorStart]); } } } } else if (cActionType == "~") { // text processor let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0]; let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1]; this._tagAndPrepareTokenForRewriting(sWhat, nTokenStart, nTokenEnd, nTokenOffset, nLastToken, eAct[2], bDebug); bChange = true; if (bDebug) { console.log(` TEXT_PROCESSOR: [${this.lToken[nTokenStart]["sValue"]}:${this.lToken[nTokenEnd]["sValue"]}] > ${sWhat}`); } } else if (cActionType == "=") { // disambiguation oEvalFunc[sWhat](this.lToken, nTokenOffset, nLastToken); if (bDebug) { console.log(` DISAMBIGUATOR: (${sWhat}) [${this.lToken[nTokenOffset+1]["sValue"]}:${this.lToken[nLastToken]["sValue"]}]`); } } else if (cActionType == ">") { // we do nothing, this test is just a condition to apply all following actions if (bDebug) { console.log(" COND_OK"); } } else if (cActionType == "/") { // Tag let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0]; let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1]; for (let i = nTokenStart; i <= nTokenEnd; i++) { if (this.lToken[i].hasOwnProperty("tags")) { this.lToken[i]["tags"].add(...sWhat.split("|")) } else { this.lToken[i]["tags"] = new Set(sWhat.split("|")); } } if (bDebug) { console.log(` TAG: ${sWhat} > [${this.lToken[nTokenStart]["sValue"]}:${this.lToken[nTokenEnd]["sValue"]}]`); } if (!this.dTags.has(sWhat)) { this.dTags.set(sWhat, [nTokenStart, nTokenStart]); } else { this.dTags.set(sWhat, [Math.min(nTokenStart, this.dTags.get(sWhat)[0]), Math.max(nTokenEnd, this.dTags.get(sWhat)[1])]); } } else if (cActionType == "%") { // immunity if (bDebug) { console.log(" IMMUNITY: " + _rules_graph.dRule[sRuleId]); } let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0]; let nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1]; if (nTokenEnd - nTokenStart == 0) { this.lToken[nTokenStart]["bImmune"] = true; let nErrorStart = this.nOffsetWithinParagraph + this.lToken[nTokenStart]["nStart"]; if (this.dError.has(nErrorStart)) { this.dError.delete(nErrorStart); } } else { |
︙ | ︙ | |||
680 681 682 683 684 685 686 | } } else { console.log("# error: unknown action at " + sLineId); } } else if (cActionType == ">") { if (bDebug) { | | | 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 | } } else { console.log("# error: unknown action at " + sLineId); } } else if (cActionType == ">") { if (bDebug) { console.log(" COND_BREAK"); } break; } } } catch (e) { console.log("Error: ", sLineId, sRuleId, this.sSentence); |
︙ | ︙ | |||
911 912 913 914 915 916 917 | if (dToken.hasOwnProperty("sNewValue")) { // rewrite token and sentence if (bDebug) { console.log(dToken["sValue"] + " -> " + dToken["sNewValue"]); } dToken["sRealValue"] = dToken["sValue"]; dToken["sValue"] = dToken["sNewValue"]; | | | | 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 | if (dToken.hasOwnProperty("sNewValue")) { // rewrite token and sentence if (bDebug) { console.log(dToken["sValue"] + " -> " + dToken["sNewValue"]); } dToken["sRealValue"] = dToken["sValue"]; dToken["sValue"] = dToken["sNewValue"]; let nDiffLen = dToken["sRealValue"].length - dToken["sNewValue"].length; let sNewRepl = (nDiffLen >= 0) ? dToken["sNewValue"] + " ".repeat(nDiffLen) : dToken["sNewValue"].slice(0, dToken["sRealValue"].length); this.sSentence = this.sSentence.slice(0,dToken["nStart"]) + sNewRepl + this.sSentence.slice(dToken["nEnd"]); delete dToken["sNewValue"]; } } else { try { this.dTokenPos.delete(dToken["nStart"]); |
︙ | ︙ | |||
942 943 944 945 946 947 948 949 950 951 952 953 954 955 | //////// Common functions function option (sOpt) { // return true if option sOpt is active return _dOptions.get(sOpt); } //////// functions to get text outside pattern scope // warning: check compile_rules.py to understand how it works function nextword (s, iStart, n) { | > > > > > > > > > > > > > > > > > > | 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 | //////// Common functions function option (sOpt) { // return true if option sOpt is active return _dOptions.get(sOpt); } var re = { search: function (sRegex, sText) { if (sRegex.startsWith("(?i)")) { return sText.search(new RegExp(sRegex.slice(4), "i")) !== -1; } else { return sText.search(sRegex) !== -1; } }, createRegExp: function (sRegex) { if (sRegex.startsWith("(?i)")) { return new RegExp(sRegex.slice(4), "i"); } else { return new RegExp(sRegex); } } } //////// functions to get text outside pattern scope // warning: check compile_rules.py to understand how it works function nextword (s, iStart, n) { |
︙ | ︙ | |||
989 990 991 992 993 994 995 | let m = _zPrevWord.exec(s.slice(0, iEnd)); if (!m) { return null; } return [m.index, m[1]]; } | | | | | | | > | | | 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 | let m = _zPrevWord.exec(s.slice(0, iEnd)); if (!m) { return null; } return [m.index, m[1]]; } function look (s, sPattern, sNegPattern=null) { // seek sPattern in s (before/after/fulltext), if antipattern sNegPattern not in s try { if (sNegPattern && re.search(sNegPattern, s)) { return false; } return re.search(sPattern, s); } catch (e) { console.error(e); } return false; } function look_chk1 (dTokenPos, s, nOffset, sPattern, sPatternGroup1, sNegPatternGroup1="") { // returns True if s has pattern sPattern and m.group(1) has pattern sPatternGroup1 let zPattern = createRegExp(sPattern); let m = zPattern.gl_exec2(s, null); if (!m) { return false; } try { let sWord = m[1]; let nPos = m.start[1] + nOffset; if (sNegPatternGroup1) { return morph(dTokenPos, [nPos, sWord], sPatternGroup1, sNegPatternGroup1); } return morph(dTokenPos, [nPos, sWord], sPatternGroup1, false); } catch (e) { console.error(e); return false; } } |
︙ | ︙ | |||
1212 1213 1214 1215 1216 1217 1218 | if (bResult && bSetMorph) { dToken1["lMorph"] = lMorph; } return bResult; } function g_tag_before (dToken, dTags, sTag) { | | | | 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 | if (bResult && bSetMorph) { dToken1["lMorph"] = lMorph; } return bResult; } function g_tag_before (dToken, dTags, sTag) { if (!dTags.has(sTag)) { return false; } if (dToken["i"] > dTags.get(sTag)[0]) { return true; } return false; } function g_tag_after (dToken, dTags, sTag) { if (!dTags.has(sTag)) { return false; } if (dToken["i"] < dTags.get(sTag)[1]) { return true; } return false; } |
︙ | ︙ |