Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

20 Ноябрь 2017, 23:44 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 »   Вниз
  Печать  
Автор Тема: Глюк при поиске через createSearchDescriptor  (Прочитано 1392 раз)
0 Пользователей и 1 Гость смотрят эту тему.
karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Стартовое сообщение: 24 Май 2017, 15:52 »

Добрый день. Столкнулся с проблемой распознавания жирного текста в текстовом документе.
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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 291


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #1: 24 Май 2017, 16:51 »

... ищу по CharWeight: com.sun.star.awt.CharWeight.BOLD ...
Почему не com.sun.star.awt.FontWeight.BOLD ?
Записан

karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #2: 24 Май 2017, 17:08 »

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
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 291


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #3: 24 Май 2017, 17:28 »

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

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


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

Нужно: from com.sun.star.awt.FontWeight import BOLD и сделать соответствующие изменения далее
« Последнее редактирование: 24 Май 2017, 17:42 от rami » Записан

karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #4: 25 Май 2017, 11:08 »

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

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



* Тест.doc (23 Кб - загружено 6 раз.)
« Последнее редактирование: 25 Май 2017, 11:14 от karpo518 » Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
economist
Ветеран
*****
Offline Offline

Сообщений: 739


« Ответ #5: 25 Май 2017, 11:42 »

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #6: 25 Май 2017, 11:50 »

economist, это требуется в рамках разработки инструмента для разметки текста в формате html. Соответственно, выделения жирным должны быть размечены в тегах <span style="font-weight:bold"></span>. Ранее текст просто копировался в браузерный визуальный редактор текста  и корректно распознавался, но были выявлены случаи, когда форматирование вообще не попадает в буфер обмена.
« Последнее редактирование: 25 Май 2017, 11:57 от karpo518 » Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 291


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #7: 25 Май 2017, 14:08 »

Наверно, так:
Код:
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
Ветеран
*****
Offline Offline

Сообщений: 739


« Ответ #8: 25 Май 2017, 14:37 »

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

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

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...
karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #9: 25 Май 2017, 15:04 »

Наверно, так:

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

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

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

Посмотрел. Форматирование выполняется через экспорт. Это слишком сложный путь. В моем решении можно выделить текст, нажать одну кнопочку и скопировать готовый код для публикации на сайте.
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 291


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #10: 25 Май 2017, 15:38 »

Теперь точно определяются 2-ое и 3-е вхождения, но заголовок не распознался. В чём проблема? Как находить и его?
Тогда перепишите указанный кусок:
Код:
With oSearch
.SearchString = ".+"   'ищем во всём тексте документа
.SearchCaseSensitive = False
.SearchRegularExpression=True
.searchStyles=True     'ищем не стили, а атрибут "BOLD", но если нужное нам находится в стилях, ставим True
.ValueSearch=False
End With
Записан

karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #11: 26 Май 2017, 09:56 »

Цитата:
Тогда перепишите указанный кусок:

Ясно. Мою проблему такой костыль решает, но по факту выходит, что поиск по стилям работает некорректно. Спасибо, rami

Дополнительный вопрос по поиску. Как эффективно искать ссылки в тексте? С помощью searchdescriptor это должно выглядеть как HyperLinkURL != "", но, как я понял, в фильтре нельзя задать условие "атрибут не равен значению". Как в этом случае поступить?
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 291


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #12: 26 Май 2017, 10:13 »

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

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

karpo518
Пользователь
**
Offline Offline

Сообщений: 51


« Ответ #13: 26 Май 2017, 10:59 »

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

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

Я понимаю, как проверить, является ли строка ссылкой. Вопрос в том, как в документе найти все ссылки(желательно через createSearchDescriptor)
Записан

Linux Mint 18 (64 bit),  LibreOffice 5.1.6.2
rami
Гуру
*******
Offline Offline

Пол: Мужской
Сообщений: 2 291


MacBook Pro, LibreOffice и Apache OpenOffice


« Ответ #14: 26 Май 2017, 11:55 »

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

Ваше замечание "'откуда взялся "oSearchString" Непонимающий" тоже не повлияло на результат.
Каждая переменная должна где-нибудь определяться, в приведённом вами макросе она нигде не определена. У вас она скорей всего определяется в другом месте, а у меня ругается, что "переменная не определена", у меня ведь нет доступа к вашим другим макросам.

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

Страниц: 1 2 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!