// Скрипт «Поиск по набору регэкспов» для редактора Fiction Book Editor (FBE). // Версия 5.2 // Автор Sclex, набор RegExp-ов - TaKir, Sclex, 13.07.2026 // 30 января 2023 года исправлены недочеты поисковых команд, на которые (недочеты) указал пользователь stokber // 06 апреля 2023 года исправлены недочеты поисковых команд, на которые (недочеты) указал пользователь stokber // На 20.11.2019 собрано 397 поисковых строк, из них рабочих - 387, макросов - 7 штук. // заремленных поисковых строк - 10 штук (из-за частых лишних срабатываний.) // _________________________________________________________________________ // _________________________________________________________________________ // ВАЖНО!!! // Перед запуском данного скрипта лучше обработать текст скриптами "Генеральная уборка", "Латиница в кириллице" // Тогда будет гораздо меньше лишних срабатываний. // Скрипту удобнее назначить горячую клавишу F2 (меню: Сервис-Настройки-Клавиши-Скрипты-Поиск по набору регэкспов, // присвоить клавишу F2) // Если вы при верстке пользуетесь "закладками" типа вставок наподобие zzz или _zzz_ или yyyyy или xxxxxxx (латиницей) // в определенных местах, чтобы потом вернуться к тексту в этом месте и отформатировать его или вставить картинку, // заголовок и пр., то скрипт найдет такие закладки в тексте книги и поможет не забыть про них. // _________________________________________________________________________ function Run() { function init() { // ТУТ НАДО НАСТРОИТЬ СПИСОК МАКРОСОВ // addMacros("<имя>","регэксп"); // Допустимые символы в имени: от "a" до "я", от "a" до "z", и символы "/","?","-","_" // В регэкспе можно использовать макросы, определенные до этого. // ТУТ НАДО НАСТРОИТЬ СПИСОК РЕГЭКСПОВ // Каждый регэксп настраивается строкой такого формата: // addRegExp("регэксп","ключи","описание","в каких тегах искать","лимит для просмотра назад"); // Слеши \ в регэкспе надо удвоить // Если регэксп содержит прямые кавычки, перед ними надо поставить слеш: \" // (этот слеш перед кавычкой не надо удваивать) // "Ключ" (пока) поддерживается только один: // i – поиск без учета регистра (case Insensitive) // По умолчанию поиск происходит с учетом регистра // "Описание" – это текст, который выведется в строке статуса, когда // по регэкспу будет что-то найдено // "В каких тегах искать" – параметр должен содержать сочетания // "плюс или минус, потом имя элемента", разделенные пробелом. // К примеру, если этот параметр имеет значение "+poem -stanza +title", // то скрипт будет искать по регэкспу только в абзацах P, // вложенных в и в , но при этом не вложенных в <stanza>. // Указывать имена инлайн-тегов не разрешено. // "Лимит для просмотра назад" – устанавливает максимальную длину подстроки, // которая может быть найдена конструкцией (?<= ...) или (?= ...) данного // регэкспа. Чем меньше значение данного параметра, тем быстрее будет // выполняться поиск. Чтобы искать без ограничения длины (самый медленный поиск), // можно прописать значение 0 или undefined, или вообще не задавать параметр. // Пример: // addRegExp("\\d-\\d","","Найдено: две цифры с дефисом между ними."); // addRegExp("\"","","Найдено: прямая кавычка."); // tagRegExp("(?<![а-яё])пего(?![а-яё])","i","Найдено: слово \"пего\" (\"него\" с опечаткой)."); // Если надо, чтобы найденный текст не выделялся, а просто курсор стал // в позицию перед этим найденным текстом, используйте конструкцию (?= ... ) // addRegExp("(?=\")","","Найдено: прямая кавычка."); // Конструкции look behind, т.е. (?<! ...) и (?<= ...) разрешены только // только в начале регэкспа и проверяются независимо от остальной части // регэкспа. То есть (?<=а)б|в найдет не "б, перед которым а" либо "в", // а "{б или в}, перед которым а". // addRegExp("","i","Задайте список регэкспов, отредактировав скрипт в текстовом редакторе (кодировка UTF-8). Инструкция – в скрипте."); // Когда будете задавать свои регэкспы, сотрите или закомментируйте предыдущую строку. // tagRegExp("(?<=[а-яё])<strong>[а-яё]+?</strong>","i","Найдено: курсив в слове."); // tagRegExp("<strong>[а-яё]+?</strong>(?=[а-яё])","i","Найдено: курсив в слове."); // Команда tagRegExp с аналогичным форматом ищет текст с учетом тегов. // В регэкспах команды tagRegExp можно использовать макросы (см. выше). // Например: можно определить макрос строкой // addMacros("<открывающий-emphasis-или-strong>","<emphasis>|<strong>"); // И потом использовать его: // tagRegExp("а<открывающий-emphasis-или-strong>б","i","Найдено: аб."); // Работают предопределенные макросы <emphasis>, </emphasis>, <strong>, </strong>, // <sup>, </sup>, <sub>, </sub>, <strikethrough>, </strikethrough>, // <code>, </code>, <любые-теги> // -------------начало блока TaKir - регэкспы (TaKir, 20.11.2019)--------------- // _________________________________________________________________________ // I. Общий поиск ошибок в тексте // _________________________________________________________________________ // _._._._._._._._._._._._._._._._._._._._._._._._ // 1) Поиск "подозрительных" знаков препинания, мусора после скана, некорректных символов: // _._._._._._._._._._._._._._._._._._._._._._._._ // _._._._._._._._._._._._._._._._._._._._._._._._ // !!Эта секция про макросы должна быть в начале, для корректной работы. // _._._._._._._._._._._._._._._._._._._._._._._._ addMacros("<откр-закр-em-str>","<emphasis>|</emphasis>|<strong>|</strong>"); addMacros("<тэги-кроме-IMG-и-закр-A>","(<(?!IMG)(?!/A\>)/?[A-Za-z]+[^\>]*>)*"); addMacros("<впереди-нет-закр-A>","(?![^\<\>]*(<(?!A[ \>])/?[A-Za-z]+(/s+[^\>]+)?\>)*[^\<\>]*</A>)"); addMacros("<мы-не-внутри-тэга>","(^|\>)[^\<]*"); addMacros("<впереди-закр-тэги-но-не-A>","(</?(?!A>)[A-Za-z]+(/s+[^>]+)?>)*"); addMacros("<пустота-теги-или-ничего>","([\\x20\\xA0]|<(?!IMG)(?!/A\>)/?[A-Za-z]+[^\>]*>)*"); addMacros("<сокращения>","(т<тэги-кроме-IMG-и-закр-A>\\.<пустота-теги-или-ничего>д|т<тэги-кроме-IMG-и-закр-A>\\.<пустота-теги-или-ничего>п|т<тэги-кроме-IMG-и-закр-A>\\.<пустота-теги-или-ничего>к|т<тэги-кроме-IMG-и-закр-A>\\.<пустота-теги-или-ничего>е|т<тэги-кроме-IMG-и-закр-A>\\.<пустота-теги-или-ничего>о|т<тэги-кроме-IMG-и-закр-A>\\.<пустота-теги-или-ничего>ч|Р<тэги-кроме-IMG-и-закр-A>\\.<пустота-теги-или-ничего>Х|т<тэги-кроме-IMG-и-закр-A>ы<тэги-кроме-IMG-и-закр-A>с<тэги-кроме-IMG-и-закр-A>|м<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>н<тэги-кроме-IMG-и-закр-A>|ч<тэги-кроме-IMG-и-закр-A>е<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>|э<тэги-кроме-IMG-и-закр-A>к<тэги-кроме-IMG-и-закр-A>з<тэги-кроме-IMG-и-закр-A>|р<тэги-кроме-IMG-и-закр-A>у<тэги-кроме-IMG-и-закр-A>б<тэги-кроме-IMG-и-закр-A>|к<тэги-кроме-IMG-и-закр-A>о<тэги-кроме-IMG-и-закр-A>п<тэги-кроме-IMG-и-закр-A>|н<тэги-кроме-IMG-и-закр-A>е<тэги-кроме-IMG-и-закр-A>м<тэги-кроме-IMG-и-закр-A>|и<тэги-кроме-IMG-и-закр-A>с<тэги-кроме-IMG-и-закр-A>п<тэги-кроме-IMG-и-закр-A>|л<тэги-кроме-IMG-и-закр-A>а<тэги-кроме-IMG-и-закр-A>т<тэги-кроме-IMG-и-закр-A>|а<тэги-кроме-IMG-и-закр-A>в<тэги-кроме-IMG-и-закр-A>т<тэги-кроме-IMG-и-закр-A>|р<тэги-кроме-IMG-и-закр-A>е<тэги-кроме-IMG-и-закр-A>д<тэги-кроме-IMG-и-закр-A>|о<тэги-кроме-IMG-и-закр-A>б<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>|ц<тэги-кроме-IMG-и-закр-A>и<тэги-кроме-IMG-и-закр-A>т<тэги-кроме-IMG-и-закр-A>|р<тэги-кроме-IMG-и-закр-A>у<тэги-кроме-IMG-и-закр-A>к<тэги-кроме-IMG-и-закр-A>|м<тэги-кроме-IMG-и-закр-A>и<тэги-кроме-IMG-и-закр-A>н<тэги-кроме-IMG-и-закр-A>|с<тэги-кроме-IMG-и-закр-A>е<тэги-кроме-IMG-и-закр-A>к<тэги-кроме-IMG-и-закр-A>|с<тэги-кроме-IMG-и-закр-A>т<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|м<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>д<тэги-кроме-IMG-и-закр-A>|т<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>н<тэги-кроме-IMG-и-закр-A>|с<тэги-кроме-IMG-и-закр-A>о<тэги-кроме-IMG-и-закр-A>к<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|д<тэги-кроме-IMG-и-закр-A>о<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>|п<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>о<тэги-кроме-IMG-и-закр-A>ч<тэги-кроме-IMG-и-закр-A>|а<тэги-кроме-IMG-и-закр-A>н<тэги-кроме-IMG-и-закр-A>г<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>|п<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>и<тэги-кроме-IMG-и-закр-A>м<тэги-кроме-IMG-и-закр-A>|п<тэги-кроме-IMG-и-закр-A>е<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>е<тэги-кроме-IMG-и-закр-A>в<тэги-кроме-IMG-и-закр-A>|в<тэги-кроме-IMG-и-закр-A>в<тэги-кроме-IMG-и-закр-A>|д<тэги-кроме-IMG-и-закр-A>е<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|г<тэги-кроме-IMG-и-закр-A>о<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|г<тэги-кроме-IMG-и-закр-A>г<тэги-кроме-IMG-и-закр-A>|д<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|п<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|г<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|с<тэги-кроме-IMG-и-закр-A>м<тэги-кроме-IMG-и-закр-A>|с<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|ф<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|м<тэги-кроме-IMG-и-закр-A>м<тэги-кроме-IMG-и-закр-A>|к<тэги-кроме-IMG-и-закр-A>г<тэги-кроме-IMG-и-закр-A>|у<тэги-кроме-IMG-и-закр-A>л<тэги-кроме-IMG-и-закр-A>|с<тэги-кроме-IMG-и-закр-A>т<тэги-кроме-IMG-и-закр-A>|г<тэги-кроме-IMG-и-закр-A>|в<тэги-кроме-IMG-и-закр-A>|П<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>и<тэги-кроме-IMG-и-закр-A>м<тэги-кроме-IMG-и-закр-A>|П<тэги-кроме-IMG-и-закр-A>е<тэги-кроме-IMG-и-закр-A>р<тэги-кроме-IMG-и-закр-A>|С<тэги-кроме-IMG-и-закр-A>м<тэги-кроме-IMG-и-закр-A>|н<тэги-кроме-IMG-и-закр-A>\\.<пустота-теги-или-ничего>э)"); // addRegExp("[_x_]{3,}","i","Найдено: Внимание! Возможно, тут закладка верстальщика для вставки картинки, цитаты и проч. "); // addRegExp("[_y_]{3,}","i","Найдено: Внимание! Возможно, тут закладка верстальщика для вставки картинки, цитаты и проч. "); // addRegExp("[_z_]{3,}","i","Найдено: Внимание! Возможно, тут закладка верстальщика для вставки картинки, цитаты и проч. "); tagRegExp("(?<=<мы-не-внутри-тэга>)([^\»….,:;!\?]|[—–,-])<впереди-закр-тэги-но-не-A>$","","Найдено: концы строк без точек","-title -subtitle -stanza -poem -epigraph"); tagRegExp("(?<=<мы-не-внутри-тэга>)(?<!(^|[^а-яёА-ЯЁ])<сокращения>)<тэги-кроме-IMG-и-закр-A>[.\\]!\?]<тэги-кроме-IMG-и-закр-A>([\\x20\\xA0]+<тэги-кроме-IMG-и-закр-A>)*[а-яё]<тэги-кроме-IMG-и-закр-A>(?!\\.)<впереди-нет-закр-A>","","Найдено: маленькая буква вместо заглавной после знаков препинания"); tagRegExp("(?<=<мы-не-внутри-тэга>)(&|[/\\\\>|<{_}^~›´`@$•■♦•·®™\[])<впереди-нет-закр-A>","","Найдено: мусор после скана"); tagRegExp("(?<=(^|\>)[^\<]*)([^\»….,:;!\?]|[—–,-])(</?(?!A\>)[A-Za-z]+(/s+[^>]+)?>)*$","","Найдено: концы строк без точек","-title -subtitle -stanza -poem -epigraph"); tagRegExp("(?<=(^|\>)[^\<]*)([—–-])(</?(?!A\>)[A-Za-z]+(/s+[^>]+)?>)*$","","Найдено: подозрительные концы строк в стихах","-title -subtitle -epigraph"); tagRegExp("[-\\x20\\xA0][»….,:;!\\?—–][0-9]","","Найдено: возможно, лишние знаки препинания перед цифрой или лишний пробел"); // Ищем все, кроме разрешенных букв, цифр и знаков препинания // \u0400-\u04FF - кириллический диапазон Юникод символов // \u0020-\u007F - латинский диапазон Юникод символов // \u0100-\u017F - расширенный латинский диапазон Юникод символов (Latin Extended-A) // \u0180-\u024F - расширенный латинский диапазон Юникод символов (Latin Extended-B) // \u00A0-\u00FF - диапазон Юникод символов (Latin-1 Supplement) // \u0370-\u03FF - греческий диапазон Юникод символов // \u2200-\u22FF - математический диапазон Юникод символов // \u2150-\u218F - дроби диапазон Юникод символов addRegExp("[^\\u0400-\\u04FF\\u0020-\\u007F\\u0100-\\u017F\\u0180-\\u024F\\u00A0-\\u00FF\\u0370-\\u03FF\\u2200-\\u22FF\\u2150-\\u218F\\x20\\xA0„“–\…—№-]","","Найдено: Странные нетекстовые символы"); addRegExp("(?<!о)['](?!кей)[а-яА-ЯёЁ]","","Найдено: мусор после скана"); // addRegExp("['][а-яА-ЯёЁ]","","Найдено: мусор после скана"); addRegExp("(?!о'кей)[а-яА-ЯёЁ][']","","Найдено: мусор после скана"); // addRegExp("[а-яА-ЯёЁ][']","","Найдено: мусор после скана"); addRegExp("[\\x20\\xA0][']","","Найдено: мусор после скана"); addRegExp("['][\\x20\\xA0]","","Найдено: мусор после скана"); addRegExp("[а-яА-ЯёЁ][@][а-яА-ЯёЁ]","","Найдено: мусор после скана"); addRegExp("[*]","","Найдено: звездочки в тексте, возможно сноски, но не сабтайтлы","-subtitle"); addRegExp("\\d-\\d","","Найдено: две цифры с дефисом между ними.") addRegExp("-[\\x20\\xA0]","","Найдено: неправильные дефисы-тире"); addRegExp("[\\x20\\xA0]-","","Найдено: неправильные дефисы-тире"); addRegExp("[\\.]-","","Найдено: неправильные дефисы-тире"); addRegExp("^[\]».,:;!\?-]","","Найдено: знаки препинания в начале строки"); addRegExp("[A-Za-zА-яЁё][—]","i","Найдено: прилипшее тире в конце и середине слова"); addRegExp("[—][A-Za-zА-яЁё]","i","Найдено: прилипшее тире в начале и середине слова"); addRegExp("[A-Za-zА-яЁё][(][A-Za-zА-яЁё]","","Найдено: смесь букв и скобок"); addRegExp("[A-Za-zА-яЁё][)][A-Za-zА-яЁё]","","Найдено: смесь букв и скобок"); addRegExp("[A-Za-zА-яЁё][!][A-Za-zА-яЁё]","","Найдено: смесь букв и восклицательный знак"); addRegExp("[A-Za-zА-яЁё][?][A-Za-zА-яЁё]","","Найдено: смесь букв и вопросительный знак"); addRegExp("[A-Za-zА-яЁё][A-Za-zА-яЁё][.][A-Za-zА-яЁё]","","Найдено: смесь букв и точка"); addRegExp("[A-Za-zА-яЁё][.][A-Za-zА-яЁё][A-Za-zА-яЁё]","","Найдено: смесь букв и точка"); addRegExp("[A-Za-zА-яЁё][,][A-Za-zА-яЁё]","","Найдено: смесь букв и запятая"); addRegExp("[A-Za-zА-яЁё][:][A-Za-zА-яЁё]","","Найдено: смесь букв и двоеточие"); addRegExp("[A-Za-zА-яЁё][;][A-Za-zА-яЁё]","","Найдено: смесь букв и точка с запятой"); addRegExp("[A-Za-zА-яЁё][—][A-Za-zА-яЁё]","","Найдено: смесь букв и длинное тире"); addRegExp("[A-Za-zА-яЁё][–][A-Za-zА-яЁё]","","Найдено: смесь букв и короткое тире"); addRegExp("[A-Za-zА-яЁё][—]","","Найдено: смесь букв и длинное тире"); addRegExp("[A-Za-zА-яЁё][–]","","Найдено: смесь букв и короткое тире"); addRegExp("[—][A-Za-zА-яЁё]","","Найдено: смесь букв и длинное тире"); addRegExp("[–][A-Za-zА-яЁё]","","Найдено: смесь букв и короткое тире"); addRegExp("[0-9][-\\x20\\xA0][»….,:;!\\?—–][0-9]","","Найдено: возможно, лишние знаки препинания перед цифрой или лишний пробел"); addRegExp("[0-9][\\x20\\xA0][0-9]","","Найдено: возможно, лишний пробел перед цифрой"); addRegExp("(?!т\.\s*[дпеок]\.)[a-zа-яё][»…\\.,:;!\\[\\]?«—)(\"][a-zа-яё]","","Найдено: смесь букв и знаков препинания"); addRegExp("^[-\\]».,:;!\\?[\\]·)(]","","Найдено: знаки препинания в начале абзаца"); addRegExp("^[a-zа-яё]","","Найдено: маленькие буквы в начале строки","-stanza -poem -epigraph"); addRegExp("^[\\d][A-Za-zА-яЁё]","","Найдено: цифры в начале строки","-title -subtitle"); addRegExp("^[…][\\x20\\xA0][A-Za-zА-яЁё]","i","Найдено: многоточие и пробел в начале абзаца"); addRegExp("[!?.,:;—–-][…]","i","Найдено: многоточие после знаков препинания"); addRegExp("[a-zа-яё][.][.]","","Найдено: двоеточие вместо многоточия"); addRegExp("[-A-Za-zА-яЁё!?»][\\x20\\xA0][…]","i","Найдено: пробел перед многоточием"); addRegExp("[A-Za-zА-яЁё»][…][A-Za-zА-яЁё«]","i","Найдено: прилипшее многоточие"); addRegExp("[…][-!?]","i","Найдено: знаки препинания после многоточия"); addRegExp("[\\x20\\xA0][\\.,:;!?][A-Za-zА-яЁё]","i","пробел перед знаком препинания"); addRegExp("[»!?\\.,:;-][—–]","", "Найдено: пропущен пробел перед тире"); addRegExp("[\\x20\\xA0][»”’]","i","Найдено: пробел перед закрывающей кавычкой"); addRegExp("[a-zа-яё\\d][.][.]","i","Найдено: две точки, возможно ошибка"); addRegExp("[а-яёa-z][\\x20\\xA0]—[\\x20\\xA0][A-ZА-ЯЁ]","","Найдено: возможно, пропущена точка в диалоге"); addRegExp(",\\xA0— [A-ZА-ЯЁ]","","Найдено: возможно, запятая вместо точки в диалоге"); addRegExp("[,][\\x20\\xA0][—][\\x20\\xA0][A-ZА-ЯЁ]","","Проверка знака препинания или заглавной буквы"); addRegExp("(?<![а-яёa-z])-–(?![а-яёa-z])","i","Найдено: дефис+короткое тире, возможно, что-то лишнее"); addRegExp("(?<![а-яёa-z])–-(?![а-яёa-z])","i","Найдено: короткое тире+дефис, возможно, что-то лишнее"); addRegExp("(?<![а-яёa-z])––(?![а-яёa-z])","i","Найдено: два коротких тире, возможно, что-то лишнее"); addRegExp("(?<![а-яёa-z])-—(?![а-яёa-z])","i","Найдено: дефис+длинное тире, возможно, что-то лишнее"); addRegExp("(?<![а-яёa-z])—-(?![а-яёa-z])","i","Найдено: длинное тире+дефис, возможно, что-то лишнее"); addRegExp("(?<![а-яёa-z])——(?![а-яёa-z])","i","Найдено: два длинных тире, возможно, что-то лишнее"); addRegExp("(?<![а-яёa-z])–[\\x20\\xA0],(?![а-яёa-z])","i","Найдено: короткое тире+запятая, возможно, что-то лишнее"); addRegExp("(?<![а-яёa-z])–[\\x20\\xA0]\\.(?![а-яёa-z])","i","Найдено: короткое тире+точка, возможно, что-то лишнее"); addRegExp("[a-zа-яё][A-ZА-ЯЁ]","","Найдено: смесь регистров"); addRegExp("[A-ZА-ЯЁ][A-ZА-ЯЁ][a-zа-яё]","","Найдено: смесь регистров"); addRegExp("[^A-Z][…,:;!?—–][,]","i","Найдено: возможно, ошибка синтаксиса"); addRegExp("[,][….,:;!?]","i","Найдено: возможно, ошибка синтаксиса"); addRegExp("[….,:;!?—–][\\x20\\xA0][,]","i","Найдено: возможно, ошибка синтаксиса"); addRegExp("[….,:;!?—–][\\x20\\xA0][.]","i","Найдено: возможно, ошибка синтаксиса"); addRegExp("[,][\\x20\\xA0][….,:;!?]","i","Найдено: возможно, ошибка синтаксиса"); addRegExp("[.][\\x20\\xA0][….,:;!?]","i","Найдено: возможно, ошибка синтаксиса"); addRegExp("[….,:;!?][\\x20\\xA0][….,:;!?]","i","Найдено: возможно, ошибка синтаксиса"); addRegExp("([a-zа-яё]-[a-zа-яё]*?-[a-zа-яё])","i","Найдено: слово с двумя дефисами)."); addRegExp("[A-Za-zА-яЁё][»…\\.\?«)(\"”“][0-9]","i","Найдено: Подозрение на пропущенную сноску"); addRegExp("(?<!(^|[^а-яёa-z])и[\\x20\\xA0]+)т\\.[\\x20\\xA0]*[дп]\\.","i","Найдено: \"т.п.\" или \"т.д.\" без предшествующего \"и\"."); addRegExp("[a-zа-яё]{2,}[\\x20\\xA0]что[\\x20\\xA0]","i","Найдено: союз \"что\" без запятой"); // addRegExp("[а-яё] — [а-яё]","","Найдено: возможно, нужен дефис без пробелов"); // _._._._._._._._._._._._._._._._._._._._._._._._ // 2) Поиск смеси латиницы и кириллицы в тексте: // _._._._._._._._._._._._._._._._._._._._._._._._ addRegExp("[a-zA-Z][а-яА-ЯёЁ]","","Найдено: смесь латиницы с кириллицей"); addRegExp("[а-яА-ЯёЁ][a-zA-Z]","","Найдено: смесь кириллицы и латиницы"); addRegExp("[a-zA-Z]{1}[\\x20\\xA0][а-яА-ЯёЁ]{1,}[\\x20\\xA0][a-zA-Z]","","Найдено: кириллица среди латиницы"); addRegExp("[a-zA-Z]{1}[….,:;!?][\\x20\\xA0][а-яА-ЯёЁ]{1,}[\\x20\\xA0][a-zA-Z]","","Найдено: кириллица среди латиницы"); addRegExp("[a-zA-Z]{1}[\\x20\\xA0][а-яА-ЯёЁ]{1,}[….,:;!?][….,:;!?][\\x20\\xA0][a-zA-Z]","","Найдено: кириллица среди латиницы"); addRegExp("[\\x20\\xA0][c][\\x20\\xA0]","i","Найдено: латинская \"c\" вместо русской \"с\" в предлоге"); addRegExp("[\\x20\\xA0][y][\\x20\\xA0][^a-zA-Z]","i","Найдено: латинская \"y\" вместо русской \"у\" в предлоге"); addRegExp("[\\x20\\xA0][o][\\x20\\xA0]","i","Найдено: латинская \"o\" вместо русской \"о\" в предлоге"); addRegExp("[\\x20\\xA0][a][\\x20\\xA0][^a-zA-Z]","i","Найдено: латинская \"a\" вместо русской \"а\" в союзе"); addRegExp("[\\x20\\xA0],[a][\\x20\\xA0][^a-zA-Z]","i","Найдено: латинская \"a\" вместо русской \"а\" в союзе"); addRegExp("[а-я][\\x20\\xA0]on[\\x20\\xA0][а-я]","","Найдено: \"on\" латиницей, вероятно русское \"он\" или \"оп\""); addRegExp("[а-я][\\x20\\xA0]no[\\x20\\xA0][а-я]","","Найдено: \"no\" латиницей, вероятно русское \"по\" или \"но\""); // _._._._._._._._._._._._._._._._._._._._._._._._ // 3) Поиск "подозрительных" цифр в тексте: // _._._._._._._._._._._._._._._._._._._._._._._._ addRegExp("[\\x20\\xA0][З][\\x20\\xA0]","i","Найдено: буква З вместо цифры 3"); addRegExp("[з][,][0-9]","i","Найдено: буква з вместо цифры 3 в числах до запятой"); addRegExp("[0-9][,][з]","i","Найдено: буква З вместо цифры 3 в числах после запятой"); addRegExp("^[З][)]","i","Найдено: буква З вместо цифры 3 в списке"); addRegExp("^[З][\\x20\\xA0]","i","Найдено: буква З вместо цифры 3 в начале строки"); addRegExp("[A-Za-zА-яЁё][0-9]","","Найдено: смесь букв и цифр"); addRegExp("[0-9][A-Za-zА-яЁё]","","Найдено: смесь цифр и букв"); addRegExp("[0-9][»…\\.,:;!\\?—–][A-Za-zА-яЁё]","","Найдено: знаки препинания между цифрами и буквами без пробела"); addRegExp("[A-Za-zА-яЁё][»…\\.,:;!\\?—–-][0-9]","","Найдено: знаки препинания между буквами и цифрами без пробела"); addRegExp("[\\x20\\xA0][0][\\x20\\xA0]","i","Найдено: цифра 0 вместо буквы о в пробелах"); addRegExp("[0-9][\\x20\\xA0][ОOоo]{1,}[\\.,:;!\\?\\x20\\xA0]","","Найдено: буква О (рус или лат) вместо цифры 0"); addRegExp("[0-9],[\\x20\\xA0][ОOоo]{1,}[\\.,:;!\\?\\x20\\xA0]","","Найдено: буква О (рус или лат) вместо цифры 0"); // _._._._._._._._._._._._._._._._._._._._._._._._ // 4) Поиск "подозрительных" предлогов, союзов: // _._._._._._._._._._._._._._._._._._._._._._._._ addRegExp("([бвгджзйклмнпрстфхцчшщъь]й)","i","Найдено: согласная и буква й подряд"); addRegExp("([\\x20\\xA0]й[бвгджзйклмнпрстфхцчшщъь])","i","Найдено: буква й и согласная подряд в начале слова"); addRegExp("[а-тф-яё][\\x20\\xA0]а[\\x20\\xA0]","i","Найдено: -а- после слова без запятой и в обрамлении пробелов, ошибка или нужно -в-"); addRegExp("[а-яё],[\\x20\\xA0]ко[\\x20\\xA0]","i","Найдено: ,-ко- после слова и в обрамлении пробелов, скорее всего, нужно -но-"); addRegExp("[а-яё][\\x20\\xA0]но[\\x20\\xA0]","i","Найдено: -но- после слова и в обрамлении пробелов, ошибка или нужно -по-"); addRegExp("[\\x20\\xA0][бгдеёзйлмнпртфхцчшщъыьэю][\\x20\\xA0]","i","Найдено: одиночная согласная в пробелах"); addRegExp("[\\x20\\xA0][бгдеёзйлмнпртфхцчшщъыьэю],[\\x20\\xA0]","i","Найдено: одиночная согласная с запятой в пробелах"); addRegExp("(?<![а-яё])[бвджзйклмнпрстфхцчшщъ]{2,}(?![а-яё])","","Найдено: слово из 2 или более согласных типа ст вместо от."); //addRegExp("(?<![а-яё])[бвгджзйклмнпрстфхцчшщъ]{3,}(?![а-яё])","","Найдено: предлог из 3 согласных типа чтб вместо что."); //addRegExp("(?<![а-яё])[бвгджзйклмнпрстфхцчшщъ]{4,}(?![а-яё])","","Найдено: слово из 4 и более согласных подряд."); addRegExp("(?<![а-яё])[аеёиоуэюя]{3,}(?![а-яё])","","Найдено: слово из 3 и более гласных подряд."); addRegExp("([а-я»,:;][\\x20\\xA0][А-ЯЁ]{1,2}[\\x20\\xA0])","","Найдено: заглавная буква вместо строчной в союзе или предлоге","-title -subtitle"); // _._._._._._._._._._._._._._._._._._._._._._._._ // 5) Поиск "подозрительного" форматирования (жирность, курсив, индексы): // _._._._._._._._._._._._._._._._._._._._._._._._ tagRegExp("([а-яёa-z]<откр-закр-em-str>*)*?[а-яёa-z]<откр-закр-em-str>*?(<emphasis><strong>|<strong><emphasis>|</strong></emphasis>|</emphasis></strong>)<откр-закр-em-str>*([а-яёa-z]<откр-закр-em-str>*)+","i","Найдено: курсивность части слова."); tagRegExp("([а-яёa-z]<откр-закр-em-str>*)*?[а-яёa-z]<откр-закр-em-str>*(<emphasis>|</emphasis>)<откр-закр-em-str>*([а-яёa-z]<откр-закр-em-str>*)+","i","Найдено: курсивность части слова."); tagRegExp("[а-яёa-z]<emphasis>[а-яёa-z]+?</emphasis>|<emphasis>[а-яёa-z]+?</emphasis>[а-яёa-z]","i","Найдено: курсивность в слове."); tagRegExp("[а-яёa-z]<strong>[а-яёa-z]+?</strong>|<strong>[а-яёa-z]+?</strong>[а-яёa-z]","i","Найдено: жирность в слове."); tagRegExp("[а-яёa-z]<sup>[а-яёa-z]+?</sup>|<sup>[а-яёa-z]+?</sup>[а-яёa-z]","i","Найдено: Найдено: верхний индекс."); tagRegExp("[а-яёa-z]<sub>[а-яёa-z]+?</sub>|<sub>[а-яёa-z]+?</sub>[а-яёa-z]","i","Найдено: нижний индекс."); //tagRegExp("(?<=<sup>((?!</sup>).)*)(?<=<strong>((?!</strong>).)*)[а-яё]+","i","Найдено: верхний или нижний индекс, сделанный жирностью и/или курсивом.",""); //tagRegExp("(?<=<sub>((?!</sub>).)*)(?<=<strong>((?!</strong>).)*)[а-яё]+","i","Найдено: верхний или нижний индекс, сделанный жирностью и/или курсивом.",""); //tagRegExp("(?<=<sup>((?!</sup>).)*)(?<=<emphasis>((?!</emphasis>).)*)[а-яё]+","i","Найдено: верхний или нижний индекс, сделанный жирностью и/или курсивом.",""); //tagRegExp("(?<=<sub>((?!</sub>).)*)(?<=<emphasis>((?!</emphasis>).)*)[а-яё]+","i","Найдено: верхний или нижний индекс, сделанный жирностью и/или курсивом.",""); tagRegExp("<emphasis><strong>[а-яёa-z]+?</strong></emphasis>[а-яёa-z]|[а-яёa-z]<emphasis><strong>[а-яёa-z]+?</strong></emphasis>","","Найдено: жирность и курсивность в слове."); tagRegExp("<strong><emphasis>[а-яёa-z]+?</emphasis></strong>[а-яёa-z]|[а-яёa-z]<strong><emphasis>[а-яёa-z]+?</emphasis></strong>","","Найдено: курсивность и жирность в слове."); tagRegExp("<strong>[A-Za-zА-яЁё]{1,2}</strong>","i","Найдено: жирность одной-двух букв (предлог, союз, местоимение)."); tagRegExp("<emphasis>[A-Za-zА-яЁё]{1,2}</emphasis>","i","Найдено: курсивность одной-двух букв (предлог, союз, местоимение)."); // _________________________________________________________________________ // II. Поиск конкретных типичных ошибок распознавания, опечаток // _________________________________________________________________________ // _._._._._._._._._._._._._._._._._._._._._._._._ // 6) Поиск "подозрительных" слов // _._._._._._._._._._._._._._._._._._._._._._._._ addRegExp("(?<![а-яё])тайме(?![а-яё])","i","Найдено: слово \"тайме\" (\"таймс\" с опечаткой)."); addRegExp("(?<![а-яё])пего(?![а-яё])","i","Найдено: слово \"пего\" (\"него\" с опечаткой)."); addRegExp("(?<![а-яё])ею(?![а-яё])","i","Найдено: слово \"ею\" (\"его\" с опечаткой)."); addRegExp("(?<![а-яё])оп(?![а-яё])","i","Найдено: слово \"оп\" (\"он\" с опечаткой)."); addRegExp("(?<![а-яё])опи(?![а-яё])","i","Найдено: слово \"опи\" (\"они\" с опечаткой)."); addRegExp("(?<![а-яё])пи(?![а-яё])","i","Найдено: слово \"пи\" (\"ни\" с опечаткой)."); addRegExp("(?<![а-яё])па(?![а-яё])","i","Найдено: слово \"па\" (\"на\" с опечаткой)."); addRegExp("(?<![а-яё])ва(?![а-яё])","i","Найдено: слово \"ва\" (\"за\" с опечаткой)."); addRegExp("(?<![а-яё])пе(?![а-яё])","i","Найдено: слово \"пе\" (\"не\" с опечаткой)."); addRegExp("(?<![а-яё])пее(?![а-яё])","i","Найдено: слово \"пее\" (\"нее\" с опечаткой)."); addRegExp("(?<![а-яё])опа(?![а-яё])","i","Найдено: слово \"опа\" (\"она\" с опечаткой)."); addRegExp("(?<![а-яё])кго(?![а-яё])","i","Найдено: слово \"кго\" (\"кто\" с опечаткой)."); addRegExp("(?<![а-яё])пет(?![а-яё])","i","Найдено: слово \"пет\" (\"нет\" с опечаткой)."); addRegExp("(?<![а-яё])ив(?![а-яё])","i","Найдено: слово \"ив\" (\"и в\" с опечаткой)."); addRegExp("(?<![а-яё])ас(?![а-яё])","i","Найдено: слово \"ас\" (\"а с\" с опечаткой)."); addRegExp("(?<![а-яё])нуда(?![а-яё])","i","Найдено: слово \"нуда\" (\"ну да\" с опечаткой)."); addRegExp("(?<![а-яё])чго(?![а-яё])","i","Найдено: слово \"чго\" (\"что\" с опечаткой)."); addRegExp("(?<![а-яё])иа(?![а-яё])","i","Найдено: слово \"иа\" (\"на\" с опечаткой)."); addRegExp("(?<![а-яё])ие(?![а-яё])","i","Найдено: слово \"ие\" (\"не\" с опечаткой)."); addRegExp("(?<![а-яё])ке(?![а-яё])","i","Найдено: слово \"ке\" (\"не\" с опечаткой)."); addRegExp("(?<![а-яё])сн(?![а-яё])","i","Найдено: слово \"сн\" (\"он\" с опечаткой)."); addRegExp("(?<![а-яё])ге(?![а-яё])","i","Найдено: слово \"ге\" (\"те\" с опечаткой)."); addRegExp("(?<![а-яё])ис(?![а-яё])","i","Найдено: слово \"ис\" (\"и с\" с опечаткой)."); addRegExp("(?<![а-яё])ве(?![а-яё])","i","Найдено: слово \"ве\" (\"не\" с опечаткой)."); addRegExp("(?<![а-яё])гы(?![а-яё])","i","Найдено: слово \"гы\" (\"ты\" с опечаткой)."); addRegExp("(?<![а-яё])ио(?![а-яё])","i","Найдено: слово \"ио\" (\"по\" с опечаткой)."); addRegExp("(?<![а-яё])ля(?![а-яё])","i","Найдено: слово \"ля\" (\"ли\" с опечаткой)."); addRegExp("(?<![а-яё])нс(?![а-яё])","i","Найдено: слово \"нс\" (\"не\" с опечаткой)."); addRegExp("(?<![а-яё])ои(?![а-яё])","i","Найдено: слово \"ои\" (\"он\" с опечаткой)."); addRegExp("(?<![а-яё])се(?![а-яё])","i","Найдено: слово \"се\" (\"ее\" с опечаткой)."); addRegExp("(?<![а-яё])тб(?![а-яё])","i","Найдено: слово \"тб\" (\"то\" с опечаткой)."); addRegExp("(?<![а-яё])че(?![а-яё])","i","Найдено: слово \"че\" (\"не\" с опечаткой)."); addRegExp("(?<![а-яё])вое(?![а-яё])","i","Найдено: слово \"вое\" (\"все\" с опечаткой)."); addRegExp("(?<![а-яё])вее(?![а-яё])","i","Найдено: слово \"вее\" (\"все\" с опечаткой)."); addRegExp("(?<![а-яё])вос(?![а-яё])","i","Найдено: слово \"вос\" (\"все\" с опечаткой)."); addRegExp("(?<![а-яё])вес(?![а-яё])","i","Найдено: слово \"вес\" (\"все\" с опечаткой)."); addRegExp("(?<![а-яё])гав(?![а-яё])","i","Найдено: слово \"гав\" (\"газ или таз\" с опечаткой)."); addRegExp("(?<![а-яё])гак(?![а-яё])","i","Найдено: слово \"гак\" (\"так\" с опечаткой)."); addRegExp("(?<![а-яё])гам(?![а-яё])","i","Найдено: слово \"гам\" (\"там\" с опечаткой)."); addRegExp("(?<![а-яё])гот(?![а-яё])","i","Найдено: слово \"гот\" (\"тот\" с опечаткой)."); addRegExp("(?<![а-яё])гут(?![а-яё])","i","Найдено: слово \"гут\" (\"тут\" с опечаткой)."); addRegExp("(?<![а-яё])дпи(?![а-яё])","i","Найдено: слово \"дпи\" (\"дни\" с опечаткой)."); addRegExp("(?<![а-яё])дтя(?![а-яё])","i","Найдено: слово \"дтя\" (\"для\" с опечаткой)."); addRegExp("(?<![а-яё])еот(?![а-яё])","i","Найдено: слово \"етот\" (\"вот\" с опечаткой)."); addRegExp("(?<![а-яё])есе(?![а-яё])","i","Найдено: слово \"есе\" (\"все\" с опечаткой)."); addRegExp("(?<![а-яё])еше(?![а-яё])","i","Найдено: слово \"еше\" (\"еще\" с опечаткой)."); addRegExp("(?<![а-яё])зсе(?![а-яё])","i","Найдено: слово \"зсе\" (\"все\" с опечаткой)."); addRegExp("(?<![а-яё])иди(?![а-яё])","i","Найдено: слово \"иди\" (\"или\" с опечаткой)."); addRegExp("(?<![а-яё])иод(?![а-яё])","i","Найдено: слово \"иод\" (\"под\" с опечаткой)."); addRegExp("(?<![а-яё])иол(?![а-яё])","i","Найдено: слово \"иол\" (\"пол\" с опечаткой)."); addRegExp("(?<![а-яё])лег(?![а-яё])","i","Найдено: слово \"лег\" (\"лет\" с опечаткой)."); addRegExp("(?<![а-яё])лее(?![а-яё])","i","Найдено: слово \"лее\" (\"же\" с опечаткой)."); addRegExp("(?<![а-яё])нес(?![а-яё])","i","Найдено: слово \"нес\" (\"нее\" с опечаткой)."); addRegExp("(?<![а-яё])неф(?![а-яё])","i","Найдено: слово \"неф\" (\"негр\" с опечаткой)."); addRegExp("(?<![а-яё])нот(?![а-яё])","i","Найдено: слово \"нот\" (\"пот\" с опечаткой)."); addRegExp("(?<![а-яё])нсе(?![а-яё])","i","Найдено: слово \"нсе\" (\"нее или все\" с опечаткой)."); addRegExp("(?<![а-яё])пас(?![а-яё])","i","Найдено: слово \"пас\" (\"нас\" с опечаткой)."); addRegExp("(?<![а-яё])паш(?![а-яё])","i","Найдено: слово \"паш\" (\"наш\" с опечаткой)."); addRegExp("(?<![а-яё])пей(?![а-яё])","i","Найдено: слово \"пей\" (\"ней\" с опечаткой)."); addRegExp("(?<![а-яё])псе(?![а-яё])","i","Найдено: слово \"псе\" (\"все\" с опечаткой)."); addRegExp("(?<![а-яё])пуги(?![а-яё])","i","Найдено: слово \"пуги\" (\"пути\" с опечаткой)."); addRegExp("(?<![а-яё])пули(?![а-яё])","i","Найдено: слово \"пули\" (\"пути\" с опечаткой)."); addRegExp("(?<![а-яё])тог(?![а-яё])","i","Найдено: слово \"тог\" (\"тот\" с опечаткой)."); addRegExp("(?<![а-яё])тою(?![а-яё])","i","Найдено: слово \"тою\" (\"того\" с опечаткой)."); addRegExp("(?<![а-яё])туг(?![а-яё])","i","Найдено: слово \"туг\" (\"тут\" с опечаткой)."); addRegExp("(?<![а-яё])узе(?![а-яё])","i","Найдено: слово \"узе\" (\"уж\" с опечаткой)."); addRegExp("(?<![а-яё])чтб(?![а-яё])","i","Найдено: слово \"чтб\" (\"что\" с опечаткой)."); addRegExp("(?<![а-яё])ши(?![а-яё])","i","Найдено: слово \"ши\" (\"или\" с опечаткой)."); addRegExp("(?<![а-яё])щей(?![а-яё])","i","Найдено: слово \"щей\" (\"шеи\" с опечаткой)."); addRegExp("(?<![а-яё])ьсе(?![а-яё])","i","Найдено: слово \"ьсе\" (\"все\" с опечаткой)."); addRegExp("(?<![а-яё])эго(?![а-яё])","i","Найдено: слово \"эго\" (\"это\" с опечаткой)."); addRegExp("(?<![а-яё])вамп(?![а-яё])","i","Найдено: слово \"вамп\" (\"вами\" с опечаткой)."); addRegExp("(?<![а-яё])веши(?![а-яё])","i","Найдено: слово \"веши\" (\"вещи\" с опечаткой)."); addRegExp("(?<![а-яё])втот(?![а-яё])","i","Найдено: слово \"втот\" (\"этот или в тот\" с опечаткой)."); addRegExp("(?<![а-яё])гобой(?![а-яё])","i","Найдено: слово \"гобой\" (\"тобой\" с опечаткой)."); addRegExp("(?<![а-яё])гоже(?![а-яё])","i","Найдено: слово \"гоже\" (\"тоже\" с опечаткой)."); addRegExp("(?<![а-яё])дпей(?![а-яё])","i","Найдено: слово \"дпей\" (\"дней\" с опечаткой)."); addRegExp("(?<![а-яё])конда(?![а-яё])","i","Найдено: слово \"конда\" (\"конца\" с опечаткой)."); addRegExp("(?<![а-яё])нища(?![а-яё])","i","Найдено: слово \"нища\" (\"пища\" с опечаткой)."); addRegExp("(?<![а-яё])отда(?![а-яё])","i","Найдено: слово \"отда\" (\"отца\" с опечаткой)."); addRegExp("(?<![а-яё])паша(?![а-яё])","i","Найдено: слово \"паша\" (\"наша\" с опечаткой)."); addRegExp("(?<![а-яё])своп(?![а-яё])","i","Найдено: слово \"своп\" (\"свои\" с опечаткой)."); addRegExp("(?<![а-яё])фазу(?![а-яё])","i","Найдено: слово \"фазу\" (\"сразу\" с опечаткой)."); addRegExp("(?<![а-яё])фуппа(?![а-яё])","i","Найдено: слово \"фуппа\" (\"группа\" с опечаткой)."); addRegExp("(?<![а-яё])лидами(?![а-яё])","i","Найдено: слово \"лидами\" (\"лицами\" с опечаткой)."); addRegExp("(?<![а-яё])пашего(?![а-яё])","i","Найдено: слово \"пашего\" (\"нашего\" с опечаткой)."); addRegExp("(?<![а-яё])пашему(?![а-яё])","i","Найдено: слово \"пашему\" (\"нашему\" с опечаткой)."); addRegExp("(?<![а-яё])пашим(?![а-яё])","i","Найдено: слово \"пашим\" (\"нашим\" с опечаткой)."); addRegExp("(?<![а-яё])попятно(?![а-яё])","i","Найдено: слово \"попятно\" (\"понятно\" с опечаткой)."); addRegExp("(?<![а-яё])совеем(?![а-яё])","i","Найдено: слово \"совеем\" (\"совсем\" с опечаткой)."); addRegExp("(?<![а-яё])уильяме(?![а-яё])","i","Найдено: слово \"уильяме\" (\"уильямс\" с опечаткой)."); addRegExp("(?<![а-яё])юнкере(?![а-яё])","i","Найдено: слово \"юнкере\" (\"юнкерс\" с опечаткой)."); addRegExp("(?<![а-яё])абраме(?![а-яё])","i","Найдено: слово \"абраме\" (\"абрамс\" с опечаткой)."); addRegExp("(?<![а-яё])аза(?![а-яё])","i","Найдено: слово \"аза\" (\"а за\" с опечаткой)."); addRegExp("(?<![а-яё])атак(?![а-яё])","i","Найдено: слово \"атак\" (\"а так\" с опечаткой)."); addRegExp("(?<![а-яё])атакой(?![а-яё])","i","Найдено: слово \"атакой\" (\"а такой\" с опечаткой)."); addRegExp("(?<![а-яё])ато(?![а-яё])","i","Найдено: слово \"ато\" (\"а то\" с опечаткой)."); addRegExp("(?<![а-яё])аты(?![а-яё])","i","Найдено: слово \"аты\" (\"а ты\" с опечаткой)."); addRegExp("(?<![а-яё])женам(?![а-яё])","i","Найдено: слово \"женам\" (\"же нам\" возможно, опечатка)."); addRegExp("(?<![а-яё])ивам(?![а-яё])","i","Найдено: слово \"ивам\" (\"и вам\" с опечаткой)."); addRegExp("(?<![а-яё])итак(?![а-яё])","i","Найдено: слово \"итак\" (\возможно, \"и так\" с опечаткой)."); addRegExp("(?<![а-яё])ито(?![а-яё])","i","Найдено: слово \"ито\" (\"и то\" с опечаткой)."); addRegExp("(?<![а-яё])ия(?![а-яё])","i","Найдено: слово \"ия\" (\"и я\" с опечаткой)."); addRegExp("(?<![а-яё])мыс(?![а-яё])","i","Найдено: слово \"мыс\" (\"мы с\" с опечаткой)."); addRegExp("(?<![а-яё])насей(?![а-яё])","i","Найдено: слово \"насей\" (\"нас ей\" с опечаткой)."); addRegExp("(?<![а-яё])нос(?![а-яё])","i","Найдено: слово \"нос\" (\"но с\" возможно, опечатка)."); addRegExp("(?<![а-яё])нотам(?![а-яё])","i","Найдено: слово \"нотам\" (\"но там\" с опечаткой)."); addRegExp("(?<![а-яё])ноты(?![а-яё])","i","Найдено: слово \"ноты\" (\"но ты\" с опечаткой)."); addRegExp("(?<![а-яё])ноя(?![а-яё])","i","Найдено: слово \"ноя\" (\"но я\" с опечаткой)."); addRegExp("(?<![а-яё])ода(?![а-яё])","i","Найдено: слово \"ода\" (\"о да\" с опечаткой)."); addRegExp("(?<![а-яё])утех(?![а-яё])","i","Найдено: слово \"утех\" (\"у тех\" возможно, опечатка)."); addRegExp("(?<![а-яё])ухты(?![а-яё])","i","Найдено: слово \"ухты\" (\"ух ты\" с опечаткой)."); addRegExp("(?<![а-яё])яв(?![а-яё])","i","Найдено: слово \"яв\" (\"я в\" с опечаткой)."); addRegExp("(?<![а-яё])як(?![а-яё])","i","Найдено: слово \"як\" (\"я к\" с опечаткой)."); addRegExp("(?<![а-яё])яс(?![а-яё])","i","Найдено: слово \"яс\" (\"я с\" с опечаткой)."); addRegExp("(?<![а-яё])оказать(?![а-яё])","i","Найдено: слово \"оказать\" (\"сказать\" с опечаткой)."); addRegExp("(?<![а-яё])опросить(?![а-яё])","i","Найдено: слово \"опросить\" (\"спросить\" с опечаткой)."); addRegExp("(?<![а-яё])зада(?![а-яё])","i","Найдено: слово \"зада\" (\"зала\" с опечаткой)."); addRegExp("(?<![а-яё])задом(?![а-яё])","i","Найдено: слово \"задом\" (\"залом\" с опечаткой)."); addRegExp("(?<![а-яё])заду(?![а-яё])","i","Найдено: слово \"заду\" (\"залу\" с опечаткой)."); addRegExp("(?<![а-яё])пюре(?![а-яё])","i","Найдено: слово \"пюре\" (\"мире\" с опечаткой)."); addRegExp("(?<![а-яё])слона(?![а-яё])","i","Найдено: слово \"слона\" (\"слова\" с опечаткой)."); addRegExp("(?<![а-яё])слон(?![а-яё])","i","Найдено: слово \"слон\" (\"слов\" с опечаткой)."); addRegExp("(?<![а-яё])деде(?![а-яё])","i","Найдено: слово \"деде\" (\"деле\" с опечаткой)."); addRegExp("(?<![а-яё])люден(?![а-яё])","i","Найдено: слово \"люден\" (\"людей\" с опечаткой)."); addRegExp("(?<![а-яё])коми(?![а-яё])","i","Найдено: слово \"коми\" (\"комп\" с опечаткой)."); addRegExp("(?<![а-яё])рог(?![а-яё])","i","Найдено: слово \"рог\" (\"рот\" с опечаткой)."); addRegExp("(?<![а-яё])валет(?![а-яё])","i","Найдено: слово \"валет\" (\"балет\" с опечаткой)."); addRegExp("(?<![а-яё])фация(?![а-яё])","i","Найдено: слово \"фация\" (\"грация\" с опечаткой)."); addRegExp("(?<![а-яё])чю(?![а-яё])","i","Найдено: слово \"чю\" (\"что\" с опечаткой)."); addRegExp("(?<![а-яё])полста(?![а-яё])","i","Найдено: слово \"полста\" (\"полета\" с опечаткой)."); addRegExp("(?<![a-zа-яё])JI(?![a-zа-яё])","i","Найдено: \"JI\" (\"Л\" с опечаткой)."); addRegExp("(?<![а-яё])копчик(?![а-яё])","i","Найдено: слово \"копчик\" (\"кончик\" с опечаткой)."); addRegExp("(?<![а-яё])слома(?![а-яё])","i","Найдено: слово \"слома\" (\"слова\" с опечаткой)."); addRegExp("(?<![а-яё])Лабрадор","","Найдено: слово \"Лабрадор\" (возможно, неправильный регистр)."); addRegExp("(?<![а-яё])полета(?![а-яё])","i","Найдено: слово \"полета\" (\"полста\" с опечаткой)."); addRegExp("(?<![а-яё])булок(?![а-яё])","i", "Найдено: слово \"булок\" (\"будок\" с опечаткой)."); addRegExp("(?<![а-яё])будок(?![а-яё])","i", "Найдено: слово \"будок\" (\"булок\" с опечаткой)."); addRegExp("(?<![а-яё])нор(?![а-яё])","i","Найдено: слово \"нор\" (\"пор\" с опечаткой)."); addRegExp("[\\x20\\xA0]го[\\x20\\xA0]","i","Найдено: слово \"го\" (\"то\" с опечаткой)."); addRegExp(",[\\x20\\xA0]го[\\x20\\xA0]","i","Найдено: слово \"го\" (\"то\" с опечаткой)."); addRegExp("([\\.!\\?][\\x20\\xA0])II(?![а-яё])","i", "Найдено: слово \"II\" (\"И\" с опечаткой)","-title -subtitle"); // addRegExp("(?<![а-яё])рот(?![а-яё])","i","Найдено: слово \"рот\" (\"рог\" с опечаткой)."); // addRegExp("(?<![а-яё])пищу(?![а-яё])","i","Найдено: слово \"пищу\" (\"пишу\" с опечаткой)."); // addRegExp("(?<![а-яё])яиц(?![а-яё])","i","Найдено: слово \"яиц\" (\"лиц\" с опечаткой)."); // _._._._._._._._._._._._._._._._._._._._._._._._ // 7) Поиск пропущенных дефисов (что-то, где-либо, юго-запад и подобные) // _._._._._._._._._._._._._._._._._._._._._._._._ addRegExp("([A-Za-zА-яЁё]либо)","i","Найдено: возможно, пропущенный дефис"); addRegExp("([A-Za-zА-яЁё]нибудь)","i","Найдено: возможно, пропущенный дефис"); addRegExp("([\\s]нибудь)","i","Найдено: возможно, пропущенный дефис"); addRegExp("( кое[A-Za-zА-яЁё]{3,})","i","Найдено: возможно, пропущенный дефис"); addRegExp("^кое[A-Za-zА-яЁё]{3,}","i","Найдено: возможно, пропущенный дефис"); addRegExp("(?<!ме|инког)(нито )","i","Найдено: Найдено: возможно, пропущенный дефис)."); addRegExp("[аеийоуя]{3,} то[ ]","","Найдено: возможно, пропущенный дефис"); addRegExp("[аеийоуя]{3,} то[….,:;!?]","","Найдено: возможно, пропущенный дефис"); addRegExp("(северо(запад))","i","Найдено: возможно, пропущенный дефис"); addRegExp("(северо(вост))","i","Найдено: возможно, пропущенный дефис"); addRegExp("(юго(запад))","i","Найдено: возможно, пропущенный дефис"); addRegExp("(юго(вост))","i","Найдено: возможно, пропущенный дефис"); addRegExp("(?<![а-яё])чтото(?![а-яё])","i","Найдено: слово \"чтото\" (\"что-то\" без дефиса)."); addRegExp("(?<![а-яё])ктото(?![а-яё])","i","Найдено: слово \"ктото\" (\"кто-то\" без дефиса)."); addRegExp("(?<![а-яё])гдето(?![а-яё])","i","Найдено: слово \"гдето\" (\"где-то\" без дефиса)."); addRegExp("(?<![а-яё])чемто(?![а-яё])","i","Найдено: слово \"чемто\" (\"чем-то\" без дефиса)."); addRegExp("(?<![а-яё])кемто(?![а-яё])","i","Найдено: слово \"кемто\" (\"кем-то\" без дефиса)."); addRegExp("(?<![а-яё])както(?![а-яё])","i","Найдено: слово \"както\" (\"как-то\" без дефиса)."); addRegExp("(?<![а-яё])когдато(?![а-яё])","i","Найдено: слово \"когдато\" (\"когда-то\" без дефиса)."); addRegExp("(?<![а-яё])какогото(?![а-яё])","i","Найдено: слово \"какогото\" (\"какого-то\" без дефиса)."); addRegExp("(?<![а-яё])какойто(?![а-яё])","i","Найдено: слово \"какойто\" (\"какой-то\" без дефиса)."); addRegExp("(?<![а-яё])какаято(?![а-яё])","i","Найдено: слово \"какаято\" (\"какая-то\" без дефиса)."); addRegExp("(?<![а-яё])какуюто(?![а-яё])","i","Найдено: слово \"какуюто\" (\"какую-то\" без дефиса)."); addRegExp("(?<![а-яё])какихто(?![а-яё])","i","Найдено: слово \"какихто\" (\"каких-то\" без дефиса)."); addRegExp("(?<![а-яё])какимто(?![а-яё])","i","Найдено: слово \"какимто\" (\"каким-то\" без дефиса)."); addRegExp("(?<![а-яё])какимито(?![а-яё])","i","Найдено: слово \"какимито\" (\"какими-то\" без дефиса)."); addRegExp("(?<![а-яё])самто(?![а-яё])","i","Найдено: слово \"самто\" (\"сам-то\" без дефиса)."); addRegExp("(?<![а-яё])самито(?![а-яё])","i","Найдено: слово \"самито\" (\"сами-то\" без дефиса)."); addRegExp("(?<![а-яё])всетаки(?![а-яё])","i","Найдено: слово \"всетаки\" (\"все-таки\" без дефиса)."); addRegExp("(?<![а-яё])изза(?![а-яё])","i","Найдено: слово \"изза\" (\"из-за\" без дефиса)."); addRegExp("(?<![а-яё])изпод(?![а-яё])","i","Найдено: слово \"изпод\" (\"из-под\" без дефиса)."); addRegExp("(?<![а-яё])елееле(?![а-яё])","i","Найдено: слово \"елееле\" (\"еле-еле\" без дефиса)."); addRegExp("(?<![а-яё])чутьчуть(?![а-яё])","i","Найдено: слово \"чутьчуть\" (\"чуть-чуть\" без дефиса)."); addRegExp("(?<![а-яё])давнымдавно(?![а-яё])","i","Найдено: слово \"давнымдавно\" (\"давным-давно\" без дефиса)."); addRegExp("(?<![а-яё])маломальски(?![а-яё])","i","Найдено: слово \"маломальски\" (\"мало-мальски\" без дефиса)."); addRegExp("(?<![а-яё])малопомалу(?![а-яё])","i","Найдено: слово \"малопомалу\" (\"мало-помалу\" без дефиса)."); addRegExp("(?<![а-яё])какни(?![а-яё])","i","Найдено: слово \"какни\" (\"как-ни-\" без дефиса)."); addRegExp("(?<![а-яё])волейневолей(?![а-яё])","i","Найдено: слово \"волейневолей\" (\"волей-неволей\" без дефиса)."); addRegExp("(?<![а-яё])крепконакрепко(?![а-яё])","i","Найдено: слово \"крепконакрепко\" (\"крепко-накрепко\" без дефиса)."); addRegExp("(?<![а-яё])какникак(?![а-яё])","i","Найдено: слово \"какникак\" (\"как-никак\" без дефиса)."); addRegExp("(?<![а-яё])одинединственный(?![а-яё])","i","Найдено: слово \"одинединственный\" (\"один-единственный\" без дефиса)."); addRegExp("(?<![а-яё])нежданнонегаданно(?![а-яё])","i","Найдено: слово \"нежданнонегаданно\" (\"нежданно-негаданно\" без дефиса)."); addRegExp("(?<![а-яё])тихомирно(?![а-яё])","i","Найдено: слово \"тихомирно\" (\"тихо-мирно\" без дефиса)."); addRegExp("(?<![а-яё])вопервых(?![а-яё])","i","Найдено: слово \"вопервых\" (\"во-первых\" без дефиса)."); addRegExp("(?<![а-яё])вовторых(?![а-яё])","i","Найдено: слово \"вовторых\" (\"во-вторых\" без дефиса)."); addRegExp("(?<![а-яё])втретьих(?![а-яё])","i","Найдено: слово \"втретьих\" (\"в-третьих\" без дефиса)."); addRegExp("(?<![а-яё])попрежнему(?![а-яё])","i","Найдено: слово \"попрежнему\" (\"по-прежнему\" без дефиса)."); addRegExp("(?<![а-яё])повидимому(?![а-яё])","i","Найдено: слово \"повидимому\" (\"по-видимому\" без дефиса)."); addRegExp("(?<![а-яё])помоему(?![а-яё])","i","Найдено: слово \"помоему\" (\"по-моему\" без дефиса)."); addRegExp("(?<![а-яё])потвоему(?![а-яё])","i","Найдено: слово \"потвоему\" (\"по-твоему\" без дефиса)."); addRegExp("(?<![а-яё])посвоему(?![а-яё])","i","Найдено: слово \"посвоему\" (\"по-своему\" без дефиса)."); addRegExp("(?<![а-яё])понашему(?![а-яё])","i","Найдено: слово \"понашему\" (\"по-нашему\" без дефиса)."); addRegExp("(?<![а-яё])побратски(?![а-яё])","i","Найдено: слово \"побратски\" (\"по-братски\" без дефиса)."); addRegExp("(?<![а-яё])порусски(?![а-яё])","i","Найдено: слово \"порусски\" (\"по-русски\" без дефиса)."); addRegExp("(?<![а-яё])поанглийски(?![а-яё])","i","Найдено: слово \"поанглийски\" (\"по-английски\" без дефиса)."); addRegExp("(?<![а-яё])понемецки(?![а-яё])","i","Найдено: слово \"понемецки\" (\"по-немецки\" без дефиса)."); addRegExp("(?<![а-яё])пофранцузски(?![а-яё])","i","Найдено: слово \"пофранцузски\" (\"по-французски\" без дефиса)."); addRegExp("(?<![а-яё])покитайски(?![а-яё])","i","Найдено: слово \"покитайски\" (\"по-китайски\" без дефиса)."); addRegExp("(?<![а-яё])поновому(?![а-яё])","i","Найдено: слово \"поновому\" (\"по-новому\" без дефиса)."); addRegExp("(?<![а-яё])постарому(?![а-яё])","i","Найдено: слово \"постарому\" (\"по-старому\" без дефиса)."); addRegExp("(?<![а-яё])похорошему(?![а-яё])","i","Найдено: слово \"похорошему\" (\"по-хорошему\" без дефиса)."); addRegExp("(?<![а-яё])поплохому(?![а-яё])","i","Найдено: слово \"поплохому\" (\"по-плохому\" без дефиса)."); addRegExp("(?<![а-яё])поумному(?![а-яё])","i","Найдено: слово \"поумному\" (\"по-умному\" без дефиса)."); addRegExp("(?<![а-яё])поразному(?![а-яё])","i","Найдено: слово \"поразному\" (\"по-разному\" без дефиса)."); addRegExp("(?<![а-яё])подетски(?![а-яё])","i","Найдено: слово \"подетски\" (\"по-детски\" без дефиса)."); addRegExp("(?<![а-яё])повзрослому(?![а-яё])","i","Найдено: слово \"повзрослому\" (\"по-взрослому\" без дефиса)."); addRegExp("[а-яё]{3,}[\\x20\\xA0]то[\\x20\\xA0]","i","Найдено: возможно, нужен дефис перед -то-, или запятая после то"); addRegExp("(?<![а-яё])шурымуры(?![а-яё])","i","Найдено: слово \"шурымуры\" (\"шуры-муры\" без дефиса)."); addRegExp("(?<![а-яё])хухрымухры(?![а-яё])","i","Найдено: слово \"хухрымухры\" (\"хухры-мухры\" без дефиса)."); // _._._._._._._._._._._._._._._._._._._._._._._._ // 8) Поиск "подозрительных" частей слова // _._._._._._._._._._._._._._._._._._._._._._._._ addRegExp("(?<!в)(ыи)","i","Найдено: часть слова \"ыи \" (\"ый или ьш \" с опечаткой)."); addRegExp("(гц)","i","Найдено: часть слова \"гц\" (\"щ\" с опечаткой)."); addRegExp("(иия)","i","Найдено: часть слова \"иия\" (\"ния\" с опечаткой)."); addRegExp("(йя)","i","Найдено: часть слова \"йя\" (\"ия\" с опечаткой)."); addRegExp("(тг)","i","Найдено: часть слова \"тг\" (\"тт\" с опечаткой)."); addRegExp("(фанат)","i","Найдено: часть слова \" фанат\" (\" гранат\" с опечаткой)."); addRegExp("(фоб)","i","Найдено: часть слова \" фоб\" (\" гроб\" с опечаткой)."); addRegExp("(фупп)","i","Найдено: часть слова \"фупп\" (\"групп\" с опечаткой)."); addRegExp("(хц)","i","Найдено: часть слова \"хц\" (\"щ\" с опечаткой)."); addRegExp("(ыо)","i","Найдено: часть слова \"ыо\" (\"ью\" с опечаткой)."); addRegExp("(ыцик)","i","Найдено: часть слова \"ыцик\" (\"ьщик\" с опечаткой)."); addRegExp("(ьгг)","i","Найдено: часть слова \"ьгг\" (\"ыт\" с опечаткой)."); addRegExp("(яи)[а-м,о-х,ш-я]","i","Найдено: часть слова \"яи\" (\"ян\" с опечаткой)."); // addRegExp("(яйц)","i","Найдено: часть слова \"яйц\" (\"лиц\" с опечаткой)."); addRegExp("(стенно)","i","Найдено: часть слова \"стенно\" (\"степно\" с опечаткой)."); addRegExp("(смят)","i","Найдено: часть слова \"смят\" (\"свят\" с опечаткой)."); addRegExp("(кругизн)","i","Найдено: часть слова \"кругизн\" (\"крутизн\" с опечаткой)."); addRegExp("(насолен)","i","Найдено: часть слова \"насолен\" (\"населен\" с опечаткой)."); addRegExp("[пк]н[^а-яёa-z]","i","Найдено: часть слова \"пн/кн\" вместо пи/ки в конце слова"); addRegExp("[^а-яёa-z][пк]н[бвгджзйклмнпрстфхцчшщъь]","i","Найдено: часть слова \"пн/кн\" вместо пи/ки в начале слова с согласной после"); addRegExp("(поддерев)","i","Найдено: часть слова \"поддерев\" (\"под дерев\" без пробела)."); addRegExp("(копчик)","i","Найдено: часть слова \"копчик\" (\"кончик\" с опечаткой)."); addRegExp("(?<!юве)(лирн)","i","Найдено: часть слова \"лирн \" (\"мирн\" с опечаткой)."); addRegExp("(титр)","i","Найдено: часть слова \"титр\" (\"тигр\" с опечаткой)."); addRegExp("([\\x20\\xA0](булк)[а-яё]{1,})","","Найдено: часть слова \"булк\" (\"будк\" с опечаткой)."); addRegExp("([\\x20\\xA0](будк)[а-яё]{1,})","","Найдено: часть слова \"будк\" (\"булк\" с опечаткой)."); addRegExp("[а-яё]гг[а-яё]","i","Найдено: часть слова \"гг\" (\"гт\" с опечаткой)."); // Эти варианты скрипт находит слишком часто, но если надо использовать, то необходимо убрать // в начале этих строк // addRegExp("([\\x20\\xA0]оказа)","i","Найдено: часть слова \"оказал\" (\"сказа-л,-ть\" с опечаткой)."); // addRegExp("([\\x20\\xA0]опроси)","i","Найдено: часть слова \"опросил\" (\"спроси-л,-ть\" с опечаткой)."); // addRegExp("(ын)","i","Найдено: часть слова \"ын\" (\"ьш\" с опечаткой)."); // addRegExp("(ып)","i","Найдено: часть слова \"ып\" (\"ьш\" с опечаткой)."); // addRegExp("(дц)","i","Найдено: часть слова \"дц\" (\"дд\" с опечаткой)."); // addRegExp("(фа)","i","Найдено: часть слова \"фа\" (\"гра\" с опечаткой)."); // addRegExp("(ыш)","i","Найдено: часть слова \"ыш\" (\"ьни или ьш\" с опечаткой?)."); // addRegExp("(фя)","i","Найдено: часть слова \"фя\" (\"тря\" с опечаткой)."); // addRegExp("(винн)","i","Найдено: часть слова \"винн\" (\"минн\" с опечаткой)."); // -------------конец блока TaKir - регэкспы (20.11.2019):--------------- } function scrollIfItNeeds() { var selection = document.selection; if (selection) { var range = selection.createRange(); var rect = range.getBoundingClientRect(); // Проверяем, находится ли выделение менее чем в 20 пикселях от нижнего края окна if (document.documentElement.clientHeight - rect.bottom < 20) { // Прокручиваем документ на 50 пикселей вниз window.scrollBy(0, 50); } } } try { var nbspChar=window.external.GetNBSP(); var nbspEntity; if (nbspChar.charCodeAt(0)==160) nbspEntity=" "; else nbspEntity=nbspChar;} catch(e) { var nbspChar=String.fromCharCode(160); var nbspEntity=" ";} var sel=document.selection; if (sel.type!="None" && sel.type!="Text") { MsgBox("Не обрабатываемый тип выделения: sel.type"); return; } try { var nbspChar=window.external.GetNBSP(); var nbspEntity; if (nbspChar.charCodeAt(0)==160) nbspEntity=" "; else nbspEntity=nbspChar;} catch(e) { var nbspChar=String.fromCharCode(160); var nbspEntity=" ";} var sel=document.selection; if (sel.type!="None" && sel.type!="Text") { MsgBox("Не обрабатываемый тип выделения: sel.type"); return; } var regExps=[]; var itsTagRegExp=[]; var lookBehinds=[]; var descs=[]; var positive=[]; var tagCond=[]; var macroses={}; var lookBehLimit=[]; var regExpCnt=0; var re,inTags,ss,tagFlag,s_len,rslt,ff,offset; var level,ch,begin,lookBeh,lookBehCnt,ii,limit,rslt_; var errorList=""; var checkTagStrRE=new RegExp("^(([-+](section|body|epigraph|cite|poem|stanza|title|subtitle|text-author))([ \t]+?[-+](section|body|epigraph|cite|poem|stanza|title|subtitle|text-author))*?|^$)$","i"); var findTagRE=new RegExp("(^| )([-+])(section|body|epigraph|cite|poem|stanza|title|subtitle|text-author)(?= |$)","ig"); var find_xA0=new RegExp("((\\\\)+?)xA0","ig"); function replaceMacroses(full_match, brackets1, offset_of_match, string_we_search_in) { if (macroses[full_match.toLowerCase()]) return macroses[full_match.toLowerCase()]; else return full_match; } function replaceA0(full_match, brackets1, offset_of_match, string_we_search_in) { if (brackets1.length%2==1) return nbspChar; else return full_match; } function addRegExp(re_,keys,desc,inWhatTags,beforeLimit) { try { ii=0; lookBeh=[]; lookBehCnt=0; posit=[]; while (re_.substr(ii,4)=="(?<=" || re_.substr(ii,4)=="(?<!") { level=1; begin=ii; ii+=4; while (ii<re_.length && level!=0) { ch=re_.charAt(ii); if (ch=="(") level++; if (ch==")") level--; if (ch=="\\") ii+=2; else ii++; } lookBeh[lookBehCnt]=new RegExp(re_.substring(begin+4,ii-1).replace(/ /g,nbspChar).replace(find_xA0,replaceA0),"g"+(keys?keys:"")); posit[lookBehCnt]=re_.substr(begin,4)=="(?<="; lookBehCnt++; } re=new RegExp(re_.substr(ii).replace(/ /g,nbspChar).replace(find_xA0,replaceA0),"g"+(keys?keys:"")); if (inWhatTags && inWhatTags.search(checkTagStrRE)<0) throw(true); } catch(e) { errorList+=(errorList==""?"":"\n")+" addRegExp(\""+re_+"\",\""+keys+"\",\""+desc+"\",\""+inWhatTags+"\""; return; } regExpCnt++; regExps[regExpCnt]=re; itsTagRegExp[regExpCnt]=false; if (desc!=undefined && desc!="") descs[regExpCnt]=desc; if (lookBehCnt!=0) { lookBehinds[regExpCnt]=lookBeh; positive[regExpCnt]=posit; } else lookBehinds[regExpCnt]=null; if (inWhatTags) tagCond[regExpCnt]=inWhatTags; if (beforeLimit && typeof(beforeLimit)=="number" && beforeLimit!=0) lookBehLimit[regExpCnt]=beforeLimit; } function tagRegExp(re_,keys,desc,inWhatTags,beforeLimit) { try { var ii=0; lookBeh=[]; lookBehCnt=0; posit=[]; while (re_.substr(ii,4)=="(?<=" || re_.substr(ii,4)=="(?<!") { level=1; begin=ii; ii+=4; while (ii<re_.length && level!=0) { ch=re_.charAt(ii); if (ch=="(") level++; if (ch==")") level--; if (ch=="\\") ii+=2; else ii++; } lookBeh[lookBehCnt]=new RegExp(re_.substring(begin+4,ii-1).replace(/ /g,nbspChar).replace(find_xA0,replaceA0).replace(macrosNameRE_2,replaceMacroses),"g"+(keys?keys:"")); posit[lookBehCnt]=re_.substr(begin,4)=="(?<="; lookBehCnt++; } re=new RegExp(re_.substr(ii).replace(/ /g,nbspChar).replace(find_xA0,replaceA0).replace(macrosNameRE_2,replaceMacroses),"g"+(keys?keys:"")); if (inWhatTags && inWhatTags.search(checkTagStrRE)<0) throw(true); } catch(e) { errorList+=(errorList==""?"":"\n")+" tagRegExp(\""+re_+"\",\""+keys+"\",\""+desc+"\",\""+inWhatTags+"\""; return; } regExpCnt++; regExps[regExpCnt]=re; itsTagRegExp[regExpCnt]=true; if (desc!=undefined && desc!="") descs[regExpCnt]=desc; if (lookBehCnt!=0) { lookBehinds[regExpCnt]=lookBeh; positive[regExpCnt]=posit; } else lookBehinds[regExpCnt]=null; if (inWhatTags) tagCond[regExpCnt]=inWhatTags; if (beforeLimit && typeof(beforeLimit)=="number") lookBehLimit[regExpCnt]=beforeLimit; } function cmpFounds(a,b) { return a["pos"]-b["pos"]; } function getTags(el) { inTags={}; inTags["section"]=false; inTags["body"]=false; inTags["epigraph"]=false; inTags["cite"]=false; inTags["poem"]=false; inTags["stanza"]=false; inTags["title"]=false; if (el.className=="subtitle") inTags["subtitle"]=true; else inTags["subtitle"]=false; if (el.className=="text-author") inTags["text-author"]=true; else inTags["text-author"]=false; el3=el; while (el3 && el3.nodeName!="BODY") { if (el3.nodeName=="DIV") switch(el3.className) { case "section": { inTags["section"]=true; break; } case "body": { inTags["body"]=true; break; } case "epigraph": { inTags["epigraph"]=true; break; } case "cite": { inTags["cite"]=true; break; } case "poem": { inTags["poem"]=true; break; } case "stanza": { inTags["stanza"]=true; break; } case "title": { inTags["title"]=true; break; } } el3=el3.parentNode; } } function checkOneTag(full_match, brackets1, brackets2, brackets3, offset_of_match, string_we_search_in) { if (inTags[brackets3]!=(brackets2=="+")) tagFlag=false; return full_match; } function checkAreWeInRightTags(reNum) { tagFlag=true; ss=tagCond[reNum]; if (ss) ss.replace(findTagRE,checkOneTag); return tagFlag; } function checkLookBehs(reNum,s,pos) { if (!lookBehinds[reNum]) return true; limit=lookBehLimit[reNum]; if (!limit) { s=s.substr(0,pos); } else { offset=pos-limit; s=s.substring(offset>=0?offset:0, pos); } s_len=s.length; for (ff=0; ff<lookBehinds[reNum].length; ff++) { lookBehinds[reNum][ff].lastIndex=0; rslt_=lookBehinds[reNum][ff].exec(s); while (rslt_ && rslt_.index+rslt_[0].length!=s_len) { rslt_=lookBehinds[reNum][ff].exec(s); } if (positive[reNum][ff]) { if (!rslt_ || rslt_.index+rslt_[0].length!=s_len) return false; } else { if (rslt_ && rslt_.index+rslt_[0].length==s_len) return false; } } return true; } function addMacros(macrosName,macrosRE) { if (macrosName.search(macrosNameRE)<0) errorList+=(errorList==""?"":"\n")+"addMacros(\""+macrosName+"\",\""+macrosRE+"\"); //неверное имя макроса" macrosRE_=macrosRE.replace(macrosNameRE_2,replaceMacroses); try { re=new RegExp("("+macrosRE_.replace(/ /g,nbspChar).replace(find_xA0,replaceA0)+")","g"); } catch(e) { errorList+=(errorList==""?"":"\n")+"addMacros(\""+macrosName+"\",\""+macrosRE+"\"); // ошибка при компиляции регэкспа"; return; } macroses[macrosName.toLowerCase()]="("+macrosRE_.replace(/ /g,nbspChar).replace(find_xA0,replaceA0)+")"; } for (i in macroses) delete macroses[i]; var macrosNameRE=/^<[-а-яёa-z_?\/]+>$/i; var macrosNameRE_2=/<[-а-яёa-z_?\/]+>/ig; addMacros("<emphasis>","<[Ee][Mm]>"); addMacros("<strong>","<([Ss][Tt][Rr][Oo][Nn][Gg]|[Bb])(?![a-z])[^>]*?>"); addMacros("<sup>","<[Ss][Uu][Pp](?![a-z])[^>]*?>"); addMacros("<sub>","<[Ss][Uu][Bb](?![a-z])[^>]*?>"); addMacros("<strikethrough>","<[Ss][Tt][Rr][Ii][Kk][Ee](?![a-z])[^>]*?>"); addMacros("<code>","<[Ss][Pp][Aa][Nn](?![a-z])[^>]*?\\b[Cc][Ll][Aa][Ss][Ss]=[\"']?[Cc][Oo][Dd][Ee](?![a-z])[\"']?[^>]*?>"); addMacros("</emphasis>","</([Ee][Mm]|[Ii])>"); addMacros("</strong>","</([Ss][Tt][Rr][Oo][Nn][Gg]|[Bb])>"); addMacros("</sup>","</[Ss][Uu][Pp]>"); addMacros("</sub>","</[Ss][Uu][Bb]>"); addMacros("</strikethrough>","</[Ss][Tt][Rr][Ii][Kk][Ee]>"); addMacros("</code>","</[Ss][Pp][Aa][Nn]>"); addMacros("<любые-теги>","(</?[^>]*?>)*?"); init(); if (errorList!="") { alert("Ошибки при компиляции регэкспов, заданных в таких строках:\n\n"+errorList+"\n\nПожалуйста, поправьте ошибки, прежде чем использовать скрипт."); return; } var fbwBody,tmpNode,s1WithTagsRemoved,s2WithTagsRemoved,minPos,minHtmlPos,currPos,i,rslt,foundLen; var tr,tr2,el,el2,el3,myIndex,s,s_html,s1_len,ignoreNullPosition,desc,rslt,newPos,re,macrosRE; var k,flag1,rslt_replaced,founds,foundsCnt; var removeTagsRE=new RegExp("<(?!IMG\\b).*?(>|$)","ig"); var removeTagsRE_=""; var imgTagRE=new RegExp("<IMG\\b.*?>","ig"); var imgTagRE_="~~~"; var ampRE=new RegExp("&","g"); var ampRE_="&"; var ltRE=new RegExp("<","g"); var ltRE_="<"; var gtRE=new RegExp(">","g"); var gtRE_=">"; var shyRE=new RegExp("­","g"); var shyRE_=String.fromCharCode(173); var nbspRE=new RegExp(" ","g"); var nbspRE_=" "; var pNode,foundPos,foundLen; var s_len; var foundMatch=false; //var log=""; //var iterations2=0; /*var arr=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];*/ function searchNext() { var savedIndex; ignoreNullPosition=false; //tr.compareEndPoints("StartToEnd",tr)==0; el=ptr; s=el.innerHTML.replace(removeTagsRE,removeTagsRE_).replace(imgTagRE,imgTagRE_).replace(shyRE,shyRE_).replace(ltRE,ltRE_).replace(gtRE,gtRE_).replace(nbspRE,nbspRE_).replace(ampRE,ampRE_); s_len=s.length; //log+="Входим в searchNext. s1_len: "+s1_len+" s_len: "+s_len+"\n\n"; tr.moveToElementText(el); tr.move("character",s1_len); //tr.select(); //alert("s1_len: "+s1_len); tr2=tr.duplicate(); tr2.moveToElementText(el); tr2.setEndPoint("EndToEnd",tr); //tr2.select(); //alert("После команды tr2.select();"); s1_len=tr2.text.length; var s1=tr2.htmlText.replace(/\s{2,}/g," "); var s1_len2=s1.length; var s2=el.innerHTML; var k1=s1.search(/(<\/[^<>]+>)+$/); if (k1==-1) s1_html_len=s1_len2; else { while (k1<s1_len2 && s1.charAt(k1)==s2.charAt(k1)) k1++; s1_html_len=k1; } s_html=ptr.innerHTML; while (el && el!=fbwBody) { if (el.nodeName=="P" && (s1_len<s_len || s_len==0)) { founds=[]; foundsCnt=0; minPos=-1; for (i=1;i<=regExpCnt;i++) { getTags(el); if (checkAreWeInRightTags(i)) { if (itsTagRegExp[i]==false) { //rslt=regExps[i].exec(s); regExps[i].lastIndex=s1_len+(ignoreNullPosition?1:0); savedIndex=s1_len+(ignoreNullPosition?1:0); //alert("s1_len+(ignoreNullPosition?1:0): "+(s1_len+(ignoreNullPosition?1:0))); rslt=regExps[i].exec(s); while (rslt && !checkLookBehs(i, s, rslt.index, false)) { savedIndex++; if (rslt.index>savedIndex) savedIndex=rslt.index; regExps[i].lastIndex=savedIndex; rslt=regExps[i].exec(s); } if (rslt) { //alert("rslt.index: "+rslt.index); founds[foundsCnt]={"pos":rslt.index, "len":rslt[0].length, "re":i}; foundsCnt++; //if (ignoreNullPosition ? minPos==s1_len+1 : minPos==s1_len) break; } } else { //its tagRegExp[i]==true, т.е. в этой ветке ищем по теговым регэкспам flag1=true; regExps[i].lastIndex=s1_html_len; rslt=regExps[i].exec(s_html); savedIndex=s1_html_len+(ignoreNullPosition?1:0); while (rslt && flag1) { if (rslt.index>savedIndex) savedIndex=rslt.index; regExps[i].lastIndex=savedIndex; savedIndex++; rslt=regExps[i].exec(s_html); flag1=false; if (rslt) { newPos=s_html.substr(0,rslt.index).replace(removeTagsRE,removeTagsRE_).replace(imgTagRE,imgTagRE_).replace(shyRE,shyRE_).replace(ltRE,ltRE_).replace(gtRE,gtRE_).replace(nbspRE,nbspRE_).replace(ampRE,ampRE_).length; rslt_replaced=rslt[0].replace(removeTagsRE,removeTagsRE_).replace(imgTagRE,imgTagRE_).replace(shyRE,shyRE_).replace(ltRE,ltRE_).replace(gtRE,gtRE_).replace(nbspRE,nbspRE_).replace(ampRE,ampRE_); if (ignoreNullPosition ? minPos==s1_html_len+1 : minPos==s1_html_len) break; if (rslt_replaced.length==0 || (rslt_replaced.length!=0 && rslt_replaced[0]!="<")) { k=regExps[i].lastIndex; while (k<s_html.length && s_html.charAt(k)!=">" && s_html.charAt(k)!="<") k++; //alert("k после цикла: "+k+"\n\ns_html[k]: "+s_html.charAt(k)); if (k<s_html.length && s_html.charAt(k)==">") { regExps[i].lastIndex=k+1; //alert("regExps[i].lastIndex: "+regExps[i].lastIndex); flag1=true; } } if (!flag1) { if (!checkLookBehs(i, s_html, rslt.index, true)) flag1=true; else /*if (newPos>s1_len)*/ { founds[foundsCnt]={"pos":newPos, "len":rslt_replaced.length, "re":i}; foundsCnt++; } } } // if } // while (flag1) } // else } //if (checkAreWeInRightTags) } // for (i=1;i<=regExpCnt;i++) //if (founds.length>0) log+="founds: "+founds+"\n"+founds[0].pos+" "+founds[0].len+" "+founds[0].re+"\n\n"; founds.sort(cmpFounds); //if (founds.length>0) log+="founds после сортировки: "+founds+"\n"+founds[0].pos+" "+founds[0].len+" "+founds[0].re+"\n\n"; var currFound=0; while (currFound<foundsCnt) { i=founds[currFound]["re"]; //if (currFound==0) log+="founds[currFound].pos: "+founds[currFound].pos+" founds[currFound]['len']:"+founds[currFound]["len"]+" s1_len: "+s1_len+"\n\n"; if (!(ignoreNullPosition && founds[currFound].pos==s1_len)) { //log+="Вошли в проверку.\n\n"; var desc=descs[i]; if (desc!=undefined && desc!="") try { window.external.SetStatusBarText(desc); } catch(e) {} ptr=el; foundPos=founds[currFound]["pos"]; foundLen=founds[currFound]["len"]; s1_len=founds[currFound]["pos"]+founds[currFound]["len"]; //log+="s1_len - новое значение: "+s1_len+"\n\n"; //log+="Перед проверкой desc. "+desc+" "+desc.indexOf("Пропустить")+"\n\n"; //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ // пропускаем исключения... if (desc.indexOf("Пропустить") == 0) return true; // (stokber) foundMatch=true; return false; //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ } currFound++; } ignoreNullPosition=false; } if (el && el.firstChild && el.nodeName!="P") el=el.firstChild; else { while (el && el.nextSibling==null) el=el.parentNode; if (el) el=el.nextSibling; } while (el && el!=fbwBody && el.nodeName!="P") if (el && el.firstChild && el.nodeName!="P") el=el.firstChild; else { while (el && el!=fbwBody && el.nextSibling==null) el=el.parentNode; if (el && el!=fbwBody) el=el.nextSibling; } if (el && el.nodeName=="P") { s=el.innerHTML.replace(removeTagsRE,removeTagsRE_).replace(imgTagRE,imgTagRE_).replace(shyRE,shyRE_).replace(ltRE,ltRE_).replace(gtRE,gtRE_).replace(nbspRE,nbspRE_).replace(ampRE,ampRE_); s1_len=0; s_html=el.innerHTML; s1_html_len=0; } } // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ window.external.SetStatusBarText("Поиск завершен!"); // (stokber) // ++++++++++++++++++++++++++++++++++++++++++++++++++++++ MsgBox("От позиции курсора до конца документа ничего не найдено."); } fbwBody=document.getElementById("fbw_body"); tr=sel.createRange(); tr.collapse(false); el=tr.parentElement(); el2=el; while (el2 && el2.nodeName!="BODY" && el2.nodeName!="P") el2=el2.parentNode; ptr=el2; if (el2.nodeName=="P") { tr2=document.body.createTextRange(); tr2.moveToElementText(el2); tr2.setEndPoint("EndToEnd",tr); s1_len=tr2.text.length; } while (searchNext()) ; if (foundMatch) { tr=document.body.createTextRange(); tr.moveToElementText(ptr); tr.move("character",foundPos); tr2=tr.duplicate(); tr2.move("character",foundLen); tr.setEndPoint("EndToStart",tr2); if (foundLen==0 && tr.move("character",1)==1) tr.move("character",-1); tr.select(); scrollIfItNeeds(); } //clipboardData.setData("Text",log); //var s=""; //for (var i=0; i<arr.length; i++) //s+=arr[i]+"."+regExps[i]+"\n"; //MsgBox(s); }