From c1d12fb739e09be5824abfc994ca5b9c54347658 Mon Sep 17 00:00:00 2001 From: Georgy Litvinov Date: Mon, 13 Sep 2021 19:12:25 +0200 Subject: [PATCH] fix: regexps for requent mistakes --- Redaction/Clean.xba | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/Redaction/Clean.xba b/Redaction/Clean.xba index 23c0318..eff17be 100644 --- a/Redaction/Clean.xba +++ b/Redaction/Clean.xba @@ -1,6 +1,6 @@ -Sub mark88 +Sub mark90 End Sub @@ -329,12 +329,18 @@ Private Sub unicodeSymbolsConversion 'Extended latin-1 0080—00FF 'Cyrillic unicode block range \u0400-\u04FF 'Basic Latin \u0020-\u007E - 'Combining diacritical marks 0301 0304 0323 032e 0331 035f + 'Combining diacritical marks 0301 0304 0303 0323 032e 0331 035f + combiningDiacritic_Astra = "\u0301\u0303\u0304\u0323\u032e\u0331\u0341\u035f" + Dim extendedLatinA_Astra As String + extendedLatinA_Astra = "\u1e15\u1e17\u1e53\u0129\u0169" + ' + ' + ' 'General Punctuation \u2000-\u206f 'Latin Extended A \u0100-\u017f '\u02bb Modifier Letter Turned Comma is in IPH Astra ' unicodeConversionEverywhere("[\u0020-\u007F]+",RAtts) - unicodeConversionEverywhere("[\u0020-\u007f\u0080-\u00ff\u0400-\u04ff\u2000-\u206f\u2100-\u214f\u0301\u0304\u0323\u032e\u0331\u0341\u035f\u02bb\u0100-\u017f]+",RAtts) + unicodeConversionEverywhere("[\u0020-\u007f\u0080-\u00ff\u0400-\u04ff\u2000-\u206f\u2100-\u214f\u02bb\u0100-\u017f" & combiningDiacritic_Astra & extendedLatinA_Astra &"]+",RAtts) 'Arabic Scheherazade 'Arabic Presentation Forms-A fb50-fdff 'Arabic Presentation Forms-B fe70-feff @@ -459,15 +465,24 @@ Sub removeAllFields() field = fieldEnum.nextElement() field.dispose() Wend -End sub +End Sub + +Public Const RX_Greek_letters = "\u0388-\u03ce" +Public Const RX_Latin_up_alphabet = "\u0041-\u005a" +Public Const RX_Latin_low_alphabet = "\u0061-\u007a" +Public Const RX_Cyrillic_alphabet = "\u0410-\u044f" +Public Const RX_Comma = "\u002c" +Public Const RX_Digits = "\u0030-\u0039" +Public Const RX_Roman_numbers = "MDCLXVI" +Public Const RX_Letters_Dash = "[" & RX_Latin_up_alphabet & RX_Latin_low_alphabet & RX_Cyrillic_alphabet & RX_Greek_letters & "]" +Public Const RX_Letters = "[" & RX_Latin_up_alphabet & RX_Latin_low_alphabet & RX_Cyrillic_alphabet & RX_Greek_letters & "]" Private Sub fixFrequentMistakes Dim config As Object config = initRedactionConfiguration() Dim NBSP As String Dim space As String - Dim latinPlusCyrillicLettersRegExp As String - latinPlusCyrillicLettersRegExp = "[\u0041-\u005a\u0061-\u007a\u0410-\u044f]" + NBSP = " " space = " " 'Не должно быть символов табуляции @@ -484,19 +499,21 @@ Private Sub fixFrequentMistakes AskAndReplace("[:space:]+(?=[\.,;:?!\)\]\}»¡¿”’])","") 'Не должно быть пробелов после скобок [({ и кавычек «„ AskAndReplace("(?<=[\(\[\{«„])[:space:]","") - 'Между буквами среднее тире должно обрамляться пробелами - AskAndReplace("(?<=" & latinPlusCyrillicLettersRegExp & ")–(?=" & latinPlusCyrillicLettersRegExp & ")",NBSP & "–" & NBSP) - 'Между буквами дефис-минус, цифровое тире и длинное тире заменяется на среднее тире - AskAndReplace("(?<=" & latinPlusCyrillicLettersRegExp & "[:space:])[-‒—−](?=[:space:]" & latinPlusCyrillicLettersRegExp & ")","–") + 'Между буквами среднее или длинное тире должно быть замененено на среднее и обрамлено пробелами + AskAndReplace("(?<=" & RX_Letters_Dash & ")[—–]+(?=.)",NBSP & "–" & NBSP) + AskAndReplace("(?<=.)[—–]+(?=" & RX_Letters_Dash & ")",NBSP & "–" & NBSP) + 'Между буквами дефисы-минусы, цифровые тире, средние тире и длинные тире заменяются на одно среднее тире + AskAndReplace("(?<=" & RX_Letters_Dash & "[:space:])[-‒—−–]+(?=[:space:].)","–") + AskAndReplace("(?<=.[:space:])[-‒—−–]+(?=[:space:]" & RX_Letters_Dash & ")","–") 'Между двумя цифрами и тире не долнжо быть пробелов. А также тире должно быть цифровым. 'Также проверяем, что перед искомым тире нет DOI '''''AskAndReplace("(?<!DOI[0-9. /XVI:-‒–—−-]{1,50})(?<=[:digit:])(?:[:space:])?[-‒–—−](?:[:space:])?(?=[:digit:])","‒") 'Между двумя римскими цифрами и тире между ними не долнжо быть пробелов. А также тире должно быть средним - AskAndReplace("(?<=[MDCLXVI])(?:[:space:])?[-‒–—−](?:[:space:])?(?=[MDCLXVI])","–") + AskAndReplace("(?<=[" & RX_Roman_numbers & "])(?:[:space:])?[-‒–—−]+(?:[:space:])?(?=[" & RX_Roman_numbers & "])","–") 'Между буквой и угловой открывающейся скобкой должен быть пробел - AskAndReplace("(?<=" & latinPlusCyrillicLettersRegExp & ")<(?=…>)",space & "<") + AskAndReplace("(?<=" & RX_Letters & ")<(?=…>)",space & "<") 'Между угловой закрывающейся скобкой и буквой должен быть пробел - AskAndReplace("(?<=<…)>(?=" & latinPlusCyrillicLettersRegExp & ")",">" & space) + AskAndReplace("(?<=<…)>(?=" & RX_Letters & ")",">" & space) If config.getPropertyValue("fixes_russian_iph") = "true" Then 'между N. Y. не должно быть пробела