Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » GoldenDict (Часть 1)

Модерирует : gyra, Maz

Maz (23-02-2017 11:53): GoldenDict (Часть 2)  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249

   

slech



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору




 
Актуальная версия 1.5.0:
Windоws RC2-36 Qt 4.8.6 или Qt 5.6.2, последний EXE-файл: goldendict-1.5.0-RC2-50-g2fe314a(EXE only).7z.
Плагин dsengine.dll для Qt 5.6-based версии на Windows XP: dsengine_5.6.1_for_XP.7z
MacOSX RC2-36 (Qt 562) (рекомендуется для Mavericks & Yosemite); RC 483 (Qt 532) (рекомендуется для Mountain Lion); RC 425 (Qt 486)
 
GoldenDict — новая словарная программа, обладающая следующими особенностями:  
 
  • Графический интерфейс на основе табов, для создания которого использована библиотека Qt;
  • Интеграция с html-движком WebKit для корректного представления материалов в html-формате;
  • Поддержка подключения словарей в форматах: Babylon (.BGL), StarDict (.ifo/.dict./.idx/.syn), Dictd (.index/.dict(.dz)), ABBYY Lingvo (.dsl тексты и аудиоматериалы .lsa/.dat, .lsd - только в Android), XDXF, AARD, MDX/MDD, EPWING;
  • Система морфологии, которая находит основы слов при поиске, улучшая его результаты, а также дает рекомендации по правильному написанию слов. Используются обычные словари Hunspell/Myspell;
  • Поддержка индексации звуковых файлов в директориях, формируя из них словари аудио-произношений;
  • Поддержка отправки запросов в Wikipedia, Wiktionary и другие MediaWiki сайты;
  • Режим работы в роли глобальной для всего десктопа всплывающей подсказки, позволяющий выводить информацию для выделенного или помещенного в буфер обмена слова из любого текста внешней программы;
  • Для загрузки доступна версия, имеющая в комплекте набор англо-русско-английских словарей, словарей морфологии и примеры произношения слов на английском языке.  
     
    Программа позиционируется как функциональная замена StarDict, поддерживающая большее количество форматов файлов и более качественное их отображение. Программа умышленно не вводит собственного формата файлов, ставя вместо этого задачу наиболее полно поддержать все популярные существующие.
     
    Официальные Early Access билды для Windоws :: для MacOSX :: для Linux.
    Официальные Development билды для Windоws.
    Официальный форум поддержки GoldenDict.
    Официальный баг-трэкер.
     
    Параллельные топики:
    GoldenDict - New Level - Разработка новых форматов словарей для GD: DSLGD, HTMLGD; подключение речевых движков; режим закладок; варианты полнотекстового поиска.
     
    Как сжимать словари в формат .dz для использования в GoldenDict :: DictZip 1.12.1 (latest) :: Оболочка DictUI
     
    Ссылки на готовые сборки
     
    Ссылки на словари для GoldenDict

  • Всего записей: 4893 | Зарегистр. 10-11-2004 | Отправлено: 11:34 26-04-2009 | Исправлено: Maz, 11:48 23-02-2017
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Просмотрел код функции filterResource и сделал кое-какие правки (срок хранения месяц).

    Красиво, но не работает.

    Цитата:
    Изменил основную регулярку allLinksRe, иначе, inlineScriptRe могла бы не захватить тег.

    В таком варианте не захватывается само имя тега, в результате чего дальнейшей обработки просто не происходит.

    Цитата:
    Перетрусил, также остальные регулярки.

    Убирание "\\b" из конструкций типа "\\bhref\\b" приводит к тому, что не обрабатываются теги, в которых всё записано без пробелов. А такие попадаются.
    И я не очень понимаю, что делает "\\2" в "(?!\\2|\\b(?:bres|https?)://|data". Потому как в таком виде оно не работает.
    inlineScriptRe, кстати, тоже надо корректировать, он у меня написан неправильно.

    Цитата:
    Гляньте, как я изменил секцию замен для "link" - сначала stylesRe и если не находится, тогда stylesRe2. Правда, не знаю, правильно ли это в плане синтаксиса.

    Неправильно. К тому же, QRegExp в replace() передаётся по константной ссылке. Если попросту, на выходе никаких захваченных строк в нём не появится.
     
    И вообще, перфекционизм тоже хорош в меру.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 18:44 12-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62

    Цитата:
    В таком варианте не захватывается само имя тега, в результате чего дальнейшей обработки просто не происходит.  

    Я сейчас с планшета — отвечать не очень удобно, но попробую.
    Почему не захватывает ся? Все регулярки тестировал на реальных стрингах. Диалект C++.  Конечно, qt не имеет многих плюшек, но элементарней синтаксиса уже быть не может.
    Обратили ли вы внимание, что номер группы, который записывается в переменую linkType изменился на 1? Может, вы тестировали с 2, как раньше?

    Цитата:
    Убирание "\\b" из конструкций типа "\\bhref\\b" приводит к тому, что не обрабатываются теги, в которых всё записано без пробелов.  

    Там везде спереди отбивка с \s, которая обязательна. Если её нет, то это не валидный код. Перед атрибутом всегда есть пробел. А после атрибута я оставил = через \s*,  Что тоже выполняет роль отбивки. \b в таком раскладе излишний.
    Цитата:
    И я не очень понимаю, что делает "\\2" в "(?!\\2|\\b(?:bres|https?)://|data"

    2-я группа — кавычка, открывающая значение атрибута. Т.е. после открытия кавычки впереди не должно быть такой же кавычки, но может быть другая, одинарная, например, которая уже является частью значения атрибута.

    Цитата:
    inlineScriptRe, кстати, тоже надо корректировать, он у меня написан неправильно.  

    Согласен, в теге могут быть другие атрибуты, исключая src. Регулярка не проблема, позже напишу.
     
    Добавлено:

    Цитата:
    Неправильно. К тому же, QRegExp в replace() передаётся по константной ссылке.  

    Я бы удивился, если б было правильно )) Я просто хотел дать понять, что вторая регулярка должна отрабатывать только если первая не нашла совпадения. Как это реализовать программно — я не знаю.
     
    Добавлено:
    З.ы. И ещё, игнорирование пробела перед href может привести к тому, что конструкцией "\\bhref\\b" могут захватываться такие вещи как data-href= , что не есть правильно.

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 19:22 12-11-2016 | Исправлено: Romul81, 19:24 12-11-2016
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Обратили ли вы внимание, что номер группы, который записывается в переменую linkType изменился на 1? Может, вы тестировали с 2, как раньше?

    Да,  действительно, это я упустил.

    Цитата:
    Там везде спереди отбивка с \s, которая обязательна. Если её нет, то это не валидный код. Перед атрибутом всегда есть пробел.

    Оказывается, не всегда ("Collins English Dictionary and Thesaurus, 2015.mdx", к примеру, если что). Код, может, и не валидный, но в исходном варианте работает, а в новом нет. Почему и надо тестировать всё на реальных словарях.

    Цитата:
    2-я группа — кавычка, открывающая значение атрибута. Т.е. после открытия кавычки впереди не должно быть такой же кавычки, но может быть другая, одинарная, например, которая уже является частью значения атрибута.

    Тем не менее, в таком виде не работает. Без "\\2|" работает.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 19:48 12-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62

    Цитата:
    Оказывается, не всегда ("Collins English Dictionary and Thesaurus, 2015.mdx", к примеру, если что).

    OK. Посмотрел код - понял в чём проблема. Тогда в моих регулярках конструкцию типа "(?:(?!\\shref\\s*=)[^>])*\\shref\\s*=" надо заменить на "(?:(?![\\s\"']href\\s*=)[^>])*[\\s\"']href\\s*=". Если надо привести полные регулярки - маякните.

    Цитата:
    Тем не менее, в таком виде не работает. Без "\\2|" работает.

    Странно... Можете привести конкретный стринг, на котором не работает? К примеру для стилей регулярки будут такими:
    stylesRe:

    Код:
    "(<\\s*link(?=\\s)(?:(?![\\s\"']href\\s*=)[^>])*[\\s\"']href\\s*=\\s*([\"']))(?!\\2|\\b(?:bres|https?)://|data:)(?:file://)?[\\x00-\\x1f\\x7f\\s]*/?([^\"'>]*)"

    stylesRe2:

    Код:
    "(<\\s*link(?=\\s)(?:(?![\\s\"']href\\s*=)[^>])*[\\s\"']href\\s*=)\\s*(?![\\s\"']|\\b(?:bres|https?)://|data:)(?:file://)?[\\x00-\\x1f\\x7f]*/?([^\\s>]+)"

     
    Добавлено:
    З.Ы. inlineScriptRe:

    Код:
    "<\\s*script(?:(?=\\s)(?:(?![\\s\"']src\\s*=)[^>])+|\\s*)>"

    Жадный (setMinimal( false )).

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 21:52 12-11-2016 | Исправлено: Romul81, 21:52 12-11-2016
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Если надо привести полные регулярки - маякните.

    Да, лучше киньте ещё раз все регулярки в (предварительно) окончательном виде. А то, я смотрю, у вас и "(?=\\2)" в конце из регулярки для стилей куда-то испарилось.

    Цитата:
    Можете привести конкретный стринг, на котором не работает?

    Любой тег берите, не ошибётесь. Возможно, тут какие-то нюансы реализации в QRegExp.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 00:02 13-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    Вот, вроде бы вымучил.  

    Цитата:
    А то, я смотрю, у вас и "(?=\\2)" в конце из регулярки для стилей куда-то испарилось.  
    На самом деле этот лукап не обязателен, т.к. если код валидный, то разницы при захвате никакой. Он меняет поведение только в случае, если в коде ошибки (незакрытое значение атрибута, или закрытое отличающейся кавычкой). С этим лукапом захват произойдёт только на кавычке (аналогичной открывающей) в рамках одного тега. Если кавычки нет, то и захвата и изменения не будет. Без лукапа будет захвачено всё до > и будет произведена замена. Оставлять ли лукап - смотрите сами.
     

    Цитата:
    Возможно, тут какие-то нюансы реализации в QRegExp.

    В принципе, можно и без захвата кавычки в группу, но будет менее надёжно. Qt позволяет ставить backreference в negative look-ahead. Единственный нюанс может быть связан с порядком нумерации групп. В документации по этому поводу ничего не сказано, поэтому я вывел вторую группу из первой. На всякий случай. Зачем нужен весь этот огород? Давайте разберём конкретный пример. Выражение, захватывающее ссылку на аудио:

    Код:
    (<\s*(?:a|area)(?=\s)(?:(?![\s"']href\s*=)[^>])*[\s"']href\s*=)\s*(["'])sound://((?:(?!\2)[^>])*)(?=\2)

    Если б у нас был гарантированно простой стринг, то тогда можно было бы не заморачиваться и искать ресурс по [^"']*. А если у нас такое?

    Код:
    <a href="sound://o'connor.spx">

    Файловая система Windows допускает использование одинарной кавычки в названиях файлов. Но не двойной. Как и URI, согласно RFC 3986. Здесь у приведённой регулярки захват происходит корректно.
    Плюс, регулярка способна корректно отработать и стринг с одинарной кавычкой как обрамлением свойства атрибута:

    Код:
    <a href='sound://o_connor.spx'>

    А такой вариант уже не является валидным, хотя захват и произойдёт на второй кавычке:

    Код:
    <a href='sound://o'connor.spx'>

    В общем, думаю, мысль понятна. В других регулярках логика та же.
     
    По коду. Обратите внимание, что из-за изменений в нумерации групп, в заменах произошли изменения.
    Регулярки для script и img были сведены в одну - srcRe и srcRe2. Гляньте, всё ли правильно в секции замен.
    Из-за того, что регулярки стали более точными и комплексными, очевидно, что они требуют больше вычислительного времени. Поэтому, всё-таки, рассмотрите пожалуйста возможность запускать их только при ненахождении совпадения предыдущей (касается всех сгруппированных .replace).
     
    И ещё вопрос. Так ли нужны эти getId(), если id был уже записан в переменную?

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 04:23 13-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ещё предложения.  
     
    1. Заменить QString linkType = allLinksRe.cap( 1 ) на QString linkType = allLinksRe.cap( 1 ).toLower() и убрать .toLower() из всех сравнений.
    2. В строке 73 if( inlineScriptRe.exactMatch( linkTxt ) ) заменить на if( linkType.compare( "script" ) == 0 && inlineScriptRe.exactMatch( linkTxt ) )

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 14:49 13-11-2016
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Qt позволяет ставить backreference в negative look-ahead.

    Позволяет. Но вот такое выражение не работает:

    Код:
    (<\\s*(?:img|script)(?=\\s)(?:(?![\\s\"']src\\s*=)[^>])*[\\s\"']src\\s*=)\\s*([\"'])(?!\\2|\\s*\\b(?:bres|https?)://|\\s*data:)(?:file://)?[\\x00-\\x1f\\x7f]*/?((?:(?!\\2)[^>])*)(?=\\2)

    А вот такое работает:

    Код:
    (<\\s*(?:img|script)(?=\\s)(?:(?![\\s\"']src\\s*=)[^>])*[\\s\"']src\\s*=)\\s*([\"'])(?:(?!\\2)(?!\\s*\\b(?:bres|https?)://|\\s*data:))?(?:file://)?[\\x00-\\x1f\\x7f]*/?((?:(?!\\2)[^>])*)(?=\\2)

    В чём тут принципиальная разница?

    Цитата:
    И ещё вопрос. Так ли нужны эти getId(), если id был уже записан в переменную?

    Тяжкое наследие прошлого. :) Типы разные. addAudioLink() работает с std::string, который и возвращает getId(), а id - это QString.
     
     
    Добавлено:

    Цитата:
    Ещё предложения.

    Уже сделал, просто пока не выкладывал. И ещё в одном месте ляп поправил. Добьём до конца - выложу.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 15:21 13-11-2016 | Исправлено: Abs62, 15:24 13-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62

    Цитата:
    В чём тут принципиальная разница?  

    Разница в том, что даже если подвыражение (?:(?!\\2)(?!\\s*\\b(?:bres|https?)://|\\s*data:))? не отрабатывает (а оно не отрабатывает), то благодаря "?" движок этот кусок просто игнорирует.
    В любом случае, выражение в этом виде не подходит потому что отфлиьтровки по (?:bres|https?) не происходит.
     
    В общем, во избежание всех этих сложностей с реализацией QRegExp предлагаю вообще отказаться от \2 в этом лукапе. Проверка на наличие нужной кавычки у нас происходит здесь: ((?:(?!\\2)[^>])*) . Таким образом, окончательное выражение будет:

    Код:
    "(<\\s*(?:img|script)(?=\\s)(?:(?![\\s\"']src\\s*=)[^>])*[\\s\"']src\\s*=)\\s*([\"'])(?!\\s*\\b(?:bres|https?)://|\\s*data:)(?:file://)?[\\x00-\\x1f\\x7f]*/?((?:(?!\\2)[^>])*)(?=\\2)"

    Остальные по образу и подобию.

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 16:12 13-11-2016 | Исправлено: Romul81, 16:12 13-11-2016
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    В общем, во избежание всех этих сложностей с реализацией QRegExp предлагаю вообще отказаться от \2 в этом лукапе.

    Ладушки. Тогда пробуйте - GoldenDict-test2.7z. Код там же, где и раньше.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 17:04 13-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
     Спасибо! Как проштудирую — отпишу.

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 17:13 13-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Заметил ошибку. wordCrossLink надо переделывать. Ведь у нас может т быть одинарная кавычка в заголовке, не так ли? Кстати, а что происходит когда в заголовке/ссылке присутствует двойная кавычка? Преобразовывается в html-сущность? На каком этапе?
     
    Также, надо определиться, допускаем ли мы обрамление одинарной кавычкой значения атрибутов, характерные только для формата (entry, sound). На данный момент определенности нет.
     
    По самому алгоритму. При имеющейся сейчас программной логике у нас происходят избыточные проверки, и регулярки можно существенно упростить без риска захватить что-то ненужное по типу anchorLinkRe2. Например, из srcRe можно вообще выбросить <\\s*(?:img|script)(?=\\s)(?:(?![\\s\"']src\\s*=)[^>])* и оставить только

    Код:
    ([\\s\"']src\\s*=)\\s*([\"'])(?!\\s*\\b(?:bres|https?)://|\\s*data:)(?:file://)?[\\x00-\\x1f\\x7f]*/?((?:(?!\\2)[^>])*)(?=\\2)

     
    Как считаете?

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 19:46 13-11-2016
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Заметил ошибку. wordCrossLink надо переделывать. Ведь у нас может т быть одинарная кавычка в заголовке, не так ли? Кстати, а что происходит когда в заголовке/ссылке присутствует двойная кавычка? Преобразовывается в html-сущность? На каком этапе?

    По идее тут должны работать обычные правила для атрибута "href". Кросс-линк ведь и оформляется как "<a href="entry://key#section">key</a>".

    Цитата:
    По самому алгоритму. При имеющейся сейчас программной логике у нас происходят избыточные проверки, и регулярки можно существенно упростить без риска захватить что-то ненужное по типу anchorLinkRe2. Например, из srcRe можно вообще выбросить <\\s*(?:img|script)(?=\\s)(?:(?![\\s\"']src\\s*=)[^>])* и оставить только

    Резонно.


    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 21:19 13-11-2016 | Исправлено: Abs62, 21:20 13-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
     
    Новый вариант.  
    Изменения.
    - Переработаны все регулярки. Все выражения кроме allLinksRe, inlineScriptRe и closeScriptTagRe заточены только на атрибуты, без типа тега. Добавлен фильтр для ftp и javascript. Добавлена точка (может быть несколько) перед факультативным слэшем в URL (будет "съедаться").
    - wordCrossLink теперь понимает два типа кавычек (обратите внимание, что группы в заменах изменились.
    - anchorLinkRe разделёно на anchorIdRe и anchorIdRe2 (с кавычками и без соответственно).
    - anchorLinkRe2 переименовано в anchorLinkRe
     
    Обратите, также, внимание на на первое объявление int pos = anchorIdRe.indexIn( linkTxt ) и ниже. Пытался прикрутить if else для anchorIdRe и anchorIdRe2 - скорее всего ошибка в синтаксисе.
     
    Можно ещё больше оптимизировать, объединив stylesRe и srcRe (и вторые так же). Они отличаются только названиями атрибутов. Но для этого нужно менять программную логику - я не осилю.

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 04:52 14-11-2016
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Новый вариант.

    Со старыми и новыми граблями.
    wordCrossLink не работает. Старые грабли с "(?!\\2)". Ну не работает нормально такая конструкция. (?!) отдельно работает, \\2 тоже, а вместе - нет. Давайте из этого и исходить. Вот такая вот конструкция

    Код:
    ([\\s\"']href\\s*=)\\s*([\"'])entry://([^>#]*)(#?[^>]*)(\\2)

    для wordCrossLink вполне себе работает. С урезанной жадностью.
     
    audioRe трогать не стоит. Функция addAudioLink() вставляет скрипт перед тегом, а значит, регулярка должна захватывать тег с самого начала, а не только ссылку в нём.
     
    anchorIdRe не работает аналогично wordCrossLink. Но тут-то, собственно, закрывающая кавычка нам и не нужна. Нам же надо просто впендюрить модификатор, uniquePrefix, сразу после открывающей.

    Цитата:
    Можно ещё больше оптимизировать, объединив stylesRe и srcRe (и вторые так же). Они отличаются только названиями атрибутов.

    А смысл? Перфекционизм тоже хорош в меру.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 13:46 14-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    Хорошо. Все замечания понял.  

    Цитата:
    Старые грабли с "(?!\\2)". Ну не работает нормально такая конструкция.

    Очень жаль. Это очень ограничивает гибкость. Первый раз сталкиваюсь с таким. Практически везде она работает без проблем.

    Цитата:
    Вот такая вот конструкция для wordCrossLink вполне себе работает. С урезанной жадностью.  

    Нормально. Тогда давайте её и использовать. Хотя здесь присутствует неоднозначность разделения групп. Лучше тогда уж:

    Код:
    ([\\s\"']href\\s*=)\\s*([\"'])entry://([^>#]*)((?:#[^>]*)?)(\\2)

    audioRe и anchorIdRe - ОК.

    Цитата:
    А смысл? Перфекционизм тоже хорош в меру.

    Да, действительно, это ни к чему. На производительности ни коим образом не отразится.
    Ближе к ночи отпишу.

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 14:31 14-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
     
    Что-то непонятное. Гляньте пожалуйста, предыдущий вариант (от 13-го) audioRe работает?

    Код:
    (<\s*(?:a|area)(?=\s)(?:(?![\s"']href\s*=)[^>])*[\s"']href\s*=)\s*(["'])sound://((?:(?!\2)[^>])*)(?=\2)

    Если да, то у меня нет логического объяснения почему ((?:(?!\\2)[^>])*)(?=\\2) в одних местах работает, а в других нет.
    ..Может попробовать QRegExp::RegExp2?

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 23:07 14-11-2016
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Что-то непонятное. Гляньте пожалуйста, предыдущий вариант (от 13-го) audioRe работает?

    Нет, в том месте как надо тоже не работает. Часть с (?!\\2) ничего не захватывает. Для вставки префикса ссылки хватает и без неё, но скрипт формируется криво.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 23:21 14-11-2016
    Romul81



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Abs62
    Просто для того, чтоб окончательно прояснить. Позитивный вариант тоже не работает?
    (?=\\2)
     
    P.S. Это важно потому как если эту кавычку захватывать без лукапа, то тогда её нужно вставлять в заменах.
     
    Добавлено:
    P.P.S. Если мы хотим поддерживать оба типа кавычек и при этом допускать одинарную кавычку в качестве значения атрибута, то в рамках QRegExp дополнительные проверки нужно прописывать программно - pos +  каскады if else.
     
    P.P.P.S. Reasons to abandon (and replace) QRegExp in your Qt project
    Как на счёт QRegularExpression ? Почти полная поддержка Perl-синтаксиса. И по скорости быстрее...
    Но переписывать много, это да...

    Всего записей: 1326 | Зарегистр. 03-03-2008 | Отправлено: 23:27 14-11-2016 | Исправлено: Romul81, 00:15 15-11-2016
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Romul81

    Цитата:
    Просто для того, чтоб окончательно прояснить. Позитивный вариант тоже не работает?

    Тоже.

    Цитата:
    Это важно потому как если эту кавычку захватывать без лукапа, то тогда её нужно вставлять в заменах.

    Разумеется.

    Цитата:
    Если мы хотим поддерживать оба типа кавычек и при этом допускать одинарную кавычку в качестве значения атрибута, то в рамках QRegExp дополнительные проверки нужно прописывать программно - pos +  каскады if else.

    В смысле атрибут с одинарной кавычкой внутри в одинарных кавычках? А так кто-то делает?

    Цитата:
    Как на счёт QRegularExpression ? Почти полная поддержка Perl-синтаксиса. И по скорости быстрее...
    Но переписывать много, это да...

    И переписывать много, и появился он только в Qt 5, а нарушать обратную совместимость без особой нужды не стоит.

    ----------
    0 программистов ругал сердитый шеф
    Потом уволил одного, и стало их FF

    Всего записей: 6077 | Зарегистр. 22-10-2005 | Отправлено: 00:27 15-11-2016
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249

    Компьютерный форум Ru.Board » Компьютеры » Программы » GoldenDict (Часть 1)
    Maz (23-02-2017 11:53): GoldenDict (Часть 2)


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru