Глюк при поиске через createSearchDescriptor

Автор karpo518, 24 мая 2017, 15:52

0 Пользователи и 1 гость просматривают эту тему.

karpo518

Добрый день. Столкнулся с проблемой распознавания жирного текста в текстовом документе.
1.Накидал тестовый пример, в котором показывается, что нашлось в документе.
2. Выделяю в текстовом документе несколько символов подсветкой (CharBackColor).
3. Ищу по этому параметру и нахожу нужные символы.
Но если я выделяю несколько символов жирным шрифтом и ищу по CharWeight: com.sun.star.awt.CharWeight.BOLD, то в качестве результата получаю весь абзац, в котором есть символы, выделенные жирным шрифтом. Как мне найти конкретные символы? Это какой-то глюк API?
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от 24 мая 2017, 13:52... ищу по CharWeight: com.sun.star.awt.CharWeight.BOLD ...
Почему не com.sun.star.awt.FontWeight.BOLD ?

karpo518

#2
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)


Так что проблема вероятно не в этом. Поиск работает, но именно поэтому свойству ищет некорректно

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

#3
Во первых, с самого начала нужно было указать что это не Basic.

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


Вместо: from com.sun.star.awt import FontWeight

Нужно: from com.sun.star.awt.FontWeight import BOLD и сделать соответствующие изменения далее

karpo518

#4
ЦитироватьВо первых, с самого начала нужно было указать что это не 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


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


Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

economist

А можно узнать для чего это всё? Есть куча способов находить отличия в тексте, если использовать поля, теги, невидимые символы, поля слияния, и прочее-прочее. Питоном можно обрабатывать такие файлы даже через COM-модель (под Windows) и очень быстро.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

karpo518

#6
economist, это требуется в рамках разработки инструмента для разметки текста в формате html. Соответственно, выделения жирным должны быть размечены в тегах <span style="font-weight:bold"></span>. Ранее текст просто копировался в браузерный визуальный редактор текста  и корректно распознавался, но были выявлены случаи, когда форматирование вообще не попадает в буфер обмена.
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

Цитата: rami от 25 мая 2017, 12:08Наверно, так:

Спасибо, внёс указанные вами корректировки. Теперь точно определяются 2-ое и 3-е вхождения, но заголовок не распознался. В чём проблема? Как находить и его?

Цитата: economist от 25 мая 2017, 14:37
karpo518 - в LibreOffice есть штатное расширение - Wiki Publisher - она
делает mediawiki разметку именно так, как вы хотите. Списки, врезки, изображения, ссылки  - всё-то тот парсер знает и умеет. Публикуете себе на сервер, дропаете статью в plaintext...
Останется только заменить теги разметки на html.

Также есть это же - как внешнее расширение для OpenOffice.

Посмотрел. Форматирование выполняется через экспорт. Это слишком сложный путь. В моем решении можно выделить текст, нажать одну кнопочку и скопировать готовый код для публикации на сайте.
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от 25 мая 2017, 13:04Теперь точно определяются 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

Цитата: karpo518 от 26 мая 2017, 07:56Ясно. Мою проблему такой костыль решает, но по факту выходит, что поиск по стилям работает некорректно.
Что за "костыль"? и почему "поиск по стилям работает некорректно"? Параметров поиска много, кроме того имеет значение и их сочетание, очень легко неправильно прописать параметры.

Цитата: karpo518 от 26 мая 2017, 07:56С помощью searchdescriptor это должно выглядеть как HyperLinkURL != "", но, как я понял, в фильтре нельзя задать условие "атрибут не равен значению". Как в этом случае поступить?
Не равно: HyperLinkURL <> "" (HyperLinkURL не равен пустой строке)

karpo518

ЦитироватьЧто за "костыль"? и почему "поиск по стилям работает некорректно"?
Пример кода, который я прикладывал, должен был найти 3 вхождения текста, который выделен жирным. Первое и второе вхождение он находил без ошибок, а третье распознавал не правильно. Вместо выделенного текста распознавался весь параграф. Вы же сами видели). Ваше замечание "'откуда взялся "oSearchString" ???" тоже не повлияло на результат.

ЦитироватьНе равно: HyperLinkURL <> "" (HyperLinkURL не равен пустой строке)

Я понимаю, как проверить, является ли строка ссылкой. Вопрос в том, как в документе найти все ссылки(желательно через createSearchDescriptor)
Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2

rami

Цитата: karpo518 от 26 мая 2017, 08:59Пример кода, который я прикладывал, должен был найти 3 вхождения текста, который выделен жирным. Первое и второе вхождение он находил без ошибок, а третье распознавал не правильно. Вместо выделенного текста распознавался весь параграф. Вы же сами видели).
Если параметры правильные, то должен, а если не правильные, то не должен. Я не вижу каких-нибудь глюков в поиске.

Цитата: karpo518 от 26 мая 2017, 08:59Ваше замечание "'откуда взялся "oSearchString" ???" тоже не повлияло на результат.
Каждая переменная должна где-нибудь определяться, в приведённом вами макросе она нигде не определена. У вас она скорей всего определяется в другом месте, а у меня ругается, что "переменная не определена", у меня ведь нет доступа к вашим другим макросам.

Цитата: karpo518 от 26 мая 2017, 08:59Вопрос в том, как в документе найти все ссылки(желательно через createSearchDescriptor)
Нужно смотреть чем ссылка отличается от всех остальных и искать её по этим параметрам, возможно понадобится новый дескриптор поиска.