Index: compile_rules_js_convert.py ================================================================== --- compile_rules_js_convert.py +++ compile_rules_js_convert.py @@ -44,16 +44,16 @@ 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('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("(?TRY: " + sRuleId); + 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 ] @@ -604,11 +604,11 @@ 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: ${sRuleId} ${sLineId}: ${this.dError[nErrorStart]}`); + console.log(" NEW_ERROR: ", this.dError[nErrorStart]); } } } } else if (cActionType == "~") { @@ -616,25 +616,24 @@ 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: ${sRuleId} ${sLineId}`); - console.log(` [${this.lToken[nTokenStart]["sValue"]}:${this.lToken[nTokenEnd]["sValue"]}] > ${sWhat}`); + 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: ${sRuleId} ${sLineId} (${sWhat}) ${this.lToken[nTokenOffset+1]["sValue"]}:${this.lToken[nLastToken]["sValue"]}`); + 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: ${sRuleId} ${sLineId}`); + console.log(" COND_OK"); } } else if (cActionType == "/") { // Tag let nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0]; @@ -645,12 +644,11 @@ } else { this.lToken[i]["tags"] = new Set(sWhat.split("|")); } } if (bDebug) { - console.log(` TAG: ${sRuleId} ${sLineId}`); - console.log(` ${sWhat} > ${this.lToken[nTokenStart]["sValue"]} : ${this.lToken[nTokenEnd]["sValue"]}`); + 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])]); @@ -657,14 +655,14 @@ } } else if (cActionType == "%") { // immunity if (bDebug) { - console.log(" IMMUNITY:\n " + _rules_graph.dRule[sRuleId]); + console.log(" IMMUNITY: " + _rules_graph.dRule[sRuleId]); } - nTokenStart = (eAct[0] > 0) ? nTokenOffset + eAct[0] : nLastToken + eAct[0]; - nTokenEnd = (eAct[1] > 0) ? nTokenOffset + eAct[1] : nLastToken + eAct[1]; + 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); @@ -682,11 +680,11 @@ console.log("# error: unknown action at " + sLineId); } } else if (cActionType == ">") { if (bDebug) { - console.log(` COND_BREAK: ${sRuleId} ${sLineId}`); + console.log(" COND_BREAK"); } break; } } } @@ -913,12 +911,12 @@ if (bDebug) { console.log(dToken["sValue"] + " -> " + dToken["sNewValue"]); } dToken["sRealValue"] = dToken["sValue"]; dToken["sValue"] = dToken["sNewValue"]; - nDiffLen = dToken["sRealValue"].length - dToken["sNewValue"].length; - sNewRepl = (nDiffLen >= 0) ? dToken["sNewValue"] + " ".repeat(nDiffLen) : dToken["sNewValue"].slice(0, dToken["sRealValue"].length); + 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 { @@ -944,10 +942,28 @@ 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 @@ -991,37 +1007,38 @@ return null; } return [m.index, m[1]]; } -function look (s, zPattern, zNegPattern=null) { - // seek zPattern in s (before/after/fulltext), if antipattern zNegPattern not in s +function look (s, sPattern, sNegPattern=null) { + // seek sPattern in s (before/after/fulltext), if antipattern sNegPattern not in s try { - if (zNegPattern && zNegPattern.test(s)) { + if (sNegPattern && re.search(sNegPattern, s)) { return false; } - return zPattern.test(s); + return re.search(sPattern, s); } catch (e) { console.error(e); } return false; } -function look_chk1 (dDA, s, nOffset, zPattern, sPatternGroup1, sNegPatternGroup1=null) { - // returns True if s has pattern zPattern and m.group(1) has pattern sPatternGroup1 +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 morphex(dDA, [nPos, sWord], sPatternGroup1, sNegPatternGroup1); + return morph(dTokenPos, [nPos, sWord], sPatternGroup1, sNegPatternGroup1); } - return morph(dDA, [nPos, sWord], sPatternGroup1, false); + return morph(dTokenPos, [nPos, sWord], sPatternGroup1, false); } catch (e) { console.error(e); return false; } @@ -1214,21 +1231,21 @@ } return bResult; } function g_tag_before (dToken, dTags, sTag) { - if (dTags.has(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)) { + if (!dTags.has(sTag)) { return false; } if (dToken["i"] < dTags.get(sTag)[1]) { return true; }