karpo518
|
Добрый день. Столкнулся с проблемой распознавания жирного текста в текстовом документе. 1.Накидал тестовый пример, в котором показывается, что нашлось в документе. 2. Выделяю в текстовом документе несколько символов подсветкой (CharBackColor). 3. Ищу по этому параметру и нахожу нужные символы. Но если я выделяю несколько символов жирным шрифтом и ищу по CharWeight: com.sun.star.awt.CharWeight.BOLD, то в качестве результата получаю весь абзац, в котором есть символы, выделенные жирным шрифтом. Как мне найти конкретные символы? Это какой-то глюк API?
|
|
« Последнее редактирование: 24 Май 2017, 16:17 от karpo518 »
|
Записан
|
Linux Mint 18 (64 bit), LibreOffice 5.1.6.2
|
|
|
rami
|
... ищу по CharWeight: com.sun.star.awt.CharWeight.BOLD ... Почему не com.sun.star.awt.FontWeight.BOLD ?
|
|
|
Записан
|
|
|
|
karpo518
|
rami, спасибо за ответ. Извиняюсь, набирал по памяти. В коде используется так: from com.sun.star.awt import FontWeight from com.sun.star.beans import PropertyValue .... SrchAttributes = [] prop = PropertyValue() prop.Name = 'CharWeight' prop.Value = FontWeight.BOLD SrchAttributes.append(prop) oSearch.setSearchAttributes(SrchAttributes) Так что проблема вероятно не в этом. Поиск работает, но именно поэтому свойству ищет некорректно
|
|
« Последнее редактирование: 24 Май 2017, 17:10 от karpo518 »
|
Записан
|
Linux Mint 18 (64 bit), LibreOffice 5.1.6.2
|
|
|
rami
|
Во первых, с самого начала нужно было указать что это не Basic.
Во вторых, было бы не плохо получить цельный код, а не "заплатки от Тришкиного кафтана". Чтобы можно было быстро запустить и поправить ошибки, а не догадываться что скрывается за многоточием... и пробелами
Вместо: from com.sun.star.awt import FontWeight
Нужно: from com.sun.star.awt.FontWeight import BOLD и сделать соответствующие изменения далее
|
|
« Последнее редактирование: 24 Май 2017, 17:42 от rami »
|
Записан
|
|
|
|
karpo518
|
Во первых, с самого начала нужно было указать что это не Basic. Приведенный фрагмент написан на Python, но проблема не связана с языком и повторяется на basic. Во вторых, было бы не плохо получить цельный код, а не "заплатки от Тришкиного кафтана". Чтобы можно было быстро запустить и поправить ошибки, а не догадываться что скрывается за многоточием... и пробелами Написал тестовый макрос на basic, воспроизводящий проблему. Проблема возникает не всегда, поэтому прикладываю также документ. Прошу обратить внимание на последний фрагмент, выделенный жирным шрифтом в файле. Sub TestSearch() Dim oSearch, oFound, oString Dim SrchAttributes(0) As New com.sun.star.beans.PropertyValue oSearch = ThisComponent.createSearchDescriptor() With oSearch .SearchString = oSearchString .SearchCaseSensitive = False .SearchRegularExpression=True .searchStyles=True .searchWords=False End With SrchAttributes(0).Name = "CharWeight"
SrchAttributes(0).Value = com.sun.star.awt.FontWeight.BOLD oSearch.SetSearchAttributes(SrchAttributes()) oFound = ThisComponent.findFirst(oSearch) Do Until IsNull(oFound) oString = oFound.getString() msgBox(oString) oFound = ThisComponent.findNext(oFound.End, oSearch) Loop End Sub
Скачал свой же файл с форума и протестировал повторно. Теперь второй выделенный фрагмент вообще не распознается, а третий определяется неточно
|
|
« Последнее редактирование: 25 Май 2017, 11:14 от karpo518 »
|
Записан
|
Linux Mint 18 (64 bit), LibreOffice 5.1.6.2
|
|
|
economist
|
А можно узнать для чего это всё? Есть куча способов находить отличия в тексте, если использовать поля, теги, невидимые символы, поля слияния, и прочее-прочее. Питоном можно обрабатывать такие файлы даже через COM-модель (под Windows) и очень быстро.
|
|
|
Записан
|
Руб. за сто, что Питоньяк Любит водку и коньяк! Потому что мне, без оных, - Не понять его никак...
|
|
|
karpo518
|
economist, это требуется в рамках разработки инструмента для разметки текста в формате html. Соответственно, выделения жирным должны быть размечены в тегах <span style="font-weight:bold"></span>. Ранее текст просто копировался в браузерный визуальный редактор текста и корректно распознавался, но были выявлены случаи, когда форматирование вообще не попадает в буфер обмена.
|
|
« Последнее редактирование: 25 Май 2017, 11:57 от karpo518 »
|
Записан
|
Linux Mint 18 (64 bit), LibreOffice 5.1.6.2
|
|
|
rami
|
Наверно, так: Sub TestSearch() Dim oSearch, oFound, oString Dim SrchAttributes(0) As New com.sun.star.beans.PropertyValue oSearch = ThisComponent.createSearchDescriptor() With oSearch .SearchString = ".*" 'ищем во всём тексте документа ' .SearchString = oSearchString 'откуда взялся "oSearchString" ??? .SearchCaseSensitive = False .SearchRegularExpression=True .searchStyles=False 'ищем не стили, а атрибут "BOLD" .searchWords=False End With SrchAttributes(0).Name = "CharWeight" SrchAttributes(0).Value = com.sun.star.awt.FontWeight.BOLD oSearch.SetSearchAttributes(SrchAttributes()) oFound = ThisComponent.findFirst(oSearch) Do Until IsNull(oFound) oString = oFound.getString() msgBox(oString) oFound = ThisComponent.findNext(oFound.End, oSearch) Loop End Sub
|
|
|
Записан
|
|
|
|
economist
|
karpo518 - в LibreOffice есть штатное расширение - Wiki Publisher - она делает mediawiki разметку именно так, как вы хотите. Списки, врезки, изображения, ссылки - всё-то тот парсер знает и умеет. Публикуете себе на сервер, дропаете статью в plaintext... Останется только заменить теги разметки на html.
Также есть это же - как внешнее расширение для OpenOffice.
|
|
|
Записан
|
Руб. за сто, что Питоньяк Любит водку и коньяк! Потому что мне, без оных, - Не понять его никак...
|
|
|
karpo518
|
Наверно, так: Спасибо, внёс указанные вами корректировки. Теперь точно определяются 2-ое и 3-е вхождения, но заголовок не распознался. В чём проблема? Как находить и его? karpo518 - в LibreOffice есть штатное расширение - Wiki Publisher - она делает mediawiki разметку именно так, как вы хотите. Списки, врезки, изображения, ссылки - всё-то тот парсер знает и умеет. Публикуете себе на сервер, дропаете статью в plaintext... Останется только заменить теги разметки на html.
Также есть это же - как внешнее расширение для OpenOffice.
Посмотрел. Форматирование выполняется через экспорт. Это слишком сложный путь. В моем решении можно выделить текст, нажать одну кнопочку и скопировать готовый код для публикации на сайте.
|
|
|
Записан
|
Linux Mint 18 (64 bit), LibreOffice 5.1.6.2
|
|
|
rami
|
Теперь точно определяются 2-ое и 3-е вхождения, но заголовок не распознался. В чём проблема? Как находить и его? Тогда перепишите указанный кусок: With oSearch .SearchString = ".+" 'ищем во всём тексте документа .SearchCaseSensitive = False .SearchRegularExpression=True .searchStyles=True 'ищем не стили, а атрибут "BOLD", но если нужное нам находится в стилях, ставим True .ValueSearch=False End With
|
|
|
Записан
|
|
|
|
karpo518
|
Тогда перепишите указанный кусок: Ясно. Мою проблему такой костыль решает, но по факту выходит, что поиск по стилям работает некорректно. Спасибо, ramiДополнительный вопрос по поиску. Как эффективно искать ссылки в тексте? С помощью searchdescriptor это должно выглядеть как HyperLinkURL != "", но, как я понял, в фильтре нельзя задать условие "атрибут не равен значению". Как в этом случае поступить?
|
|
|
Записан
|
Linux Mint 18 (64 bit), LibreOffice 5.1.6.2
|
|
|
rami
|
Ясно. Мою проблему такой костыль решает, но по факту выходит, что поиск по стилям работает некорректно. Что за "костыль"? и почему "поиск по стилям работает некорректно"? Параметров поиска много, кроме того имеет значение и их сочетание, очень легко неправильно прописать параметры. С помощью searchdescriptor это должно выглядеть как HyperLinkURL != "", но, как я понял, в фильтре нельзя задать условие "атрибут не равен значению". Как в этом случае поступить? Не равно: HyperLinkURL <> "" (HyperLinkURL не равен пустой строке)
|
|
|
Записан
|
|
|
|
karpo518
|
Что за "костыль"? и почему "поиск по стилям работает некорректно"? Пример кода, который я прикладывал, должен был найти 3 вхождения текста, который выделен жирным. Первое и второе вхождение он находил без ошибок, а третье распознавал не правильно. Вместо выделенного текста распознавался весь параграф. Вы же сами видели). Ваше замечание "'откуда взялся "oSearchString"  " тоже не повлияло на результат. Не равно: HyperLinkURL <> "" (HyperLinkURL не равен пустой строке) Я понимаю, как проверить, является ли строка ссылкой. Вопрос в том, как в документе найти все ссылки(желательно через createSearchDescriptor)
|
|
|
Записан
|
Linux Mint 18 (64 bit), LibreOffice 5.1.6.2
|
|
|
rami
|
Пример кода, который я прикладывал, должен был найти 3 вхождения текста, который выделен жирным. Первое и второе вхождение он находил без ошибок, а третье распознавал не правильно. Вместо выделенного текста распознавался весь параграф. Вы же сами видели). Если параметры правильные, то должен, а если не правильные, то не должен. Я не вижу каких-нибудь глюков в поиске. Ваше замечание "'откуда взялся "oSearchString"  " тоже не повлияло на результат. Каждая переменная должна где-нибудь определяться, в приведённом вами макросе она нигде не определена. У вас она скорей всего определяется в другом месте, а у меня ругается, что "переменная не определена", у меня ведь нет доступа к вашим другим макросам. Вопрос в том, как в документе найти все ссылки(желательно через createSearchDescriptor) Нужно смотреть чем ссылка отличается от всех остальных и искать её по этим параметрам, возможно понадобится новый дескриптор поиска.
|
|
|
Записан
|
|
|
|
|