Список слов с ошибками

Автор Albran, 26 декабря 2022, 13:30

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

Albran

Добрый день друзья!
Я новичок в LibreOffice и задумался о переходе на LibreOffice с MS, но для этого надо макросы с VBA переписывать, что утомительно и хотелось бы оценить целесобразность.
Вобщем для примера нужно получить Список слов с ошибками на русском языке из документа .docx или .odt.
В MS Word это макрос в несколько строк:
Dim vWord$, strTxt$, i&
Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To ActiveDocument.Range.SpellingErrors.Count
    vWord = ActiveDocument.SpellingErrors(i).text
    dic.Item(vWord) = dic.Item(vWord) + 1
Next i
strTxt = Join(dic.Keys, vbNewLine)
Но в LibreOffice мой полуфабрикат распух до безобразия и еще надо допиливать.
Sub Corrector(Event)
Dim oDoc As Object, strTxt$
   oDoc = ThisComponent
   strTxt = collectWords(oDoc)
End Sub

Function collectWords(oDoc As Object) As String
Dim oLocale As New com.sun.star.lang.Locale
Dim aEmpty(0) As New com.sun.star.beans.PropertyValue
Dim words() as string, oCursor As Object, SpellC As Object, vWord$, strTxt$
   oLocale.Language = "ru" : oLocale.Country = "RU"
   SpellC = createUnoService("com.sun.star.linguistic2.SpellChecker")
   oCursor = oDoc.Text.CreateTextCursor()
  oCursor.gotoStart(False)
  Do
oCursor.gotoEndOfWord(True)
vWord = Trim(oCursor.String)
if Len(vWord) > 1 Then
   If SpellC.isValid(vWord, oLocale, aEmpty()) = False Then
      strTxt = strTxt & chr(13) & vWord
   end if 
end if
  Loop While oCursor.gotoNextWord(False)
  collectWords = strTxt
End Function
Может можно проще сделать? И есть ли в LibreOffice аналоги коллекций и словарей VBA и оператора "Like"?
Или может есть готовое расширение или Python скрипт?

mikekaganski

https://forum.openoffice.org/en/forum/viewtopic.php?p=75401&sid=348a2c5ec187c28ae094ad1d5a428903#p75401

В тамошнем скрипте единственное, чего не хватает - так это инициализации sListaPalabras в пустую строку перед циклом, где эта переменная наполняется.

Насколько я понимаю, Вы его и взяли за основу?
С уважением,
Михаил Каганский

Albran

Цитата: mikekaganski от 26 декабря 2022, 14:02https://forum.openoffice.org/en/forum/viewtopic.php?p=75401&sid=348a2c5ec187c28ae094ad1d5a428903#p75401
Насколько я понимаю, Вы его и взяли за основу?
Нет, я с инета взял за основу какой-то макрос перехода по словам (gotoNextWord) плюс в расширении Linguist посмотрел как делается проверка на ошибки. Жаль русский это расширение не поддерживает.
Спасибо за ссылку, там даже вариант со словарем есть, почти идеально.
Вот только LibreOffice еще кучу символов типа -." и т.п. добавляет к "словам". В VBA легко отфильтровать:
If Left(vWord, 1) Like "[!A-Za-zА-яЁё]" Then
А как в LibreOffice? Черт почему такой полезный оператор не включили? :(

sokol92

Цитата: Albran от 26 декабря 2022, 15:05Черт почему такой полезный оператор не включили
Включили, только забыли об этом упомянуть в документации.  :)
Поставьте в начале модуля "Option Compatible" или "Option VBASupport 1" и пользуйтесь.
Оператор Like реализован в LO, насколько я понимаю, с помощью регулярных выражений. Можно и напрямую использовать регулярные выражения.
Владимир.

Albran

Цитата: sokol92 от 26 декабря 2022, 15:22Включили, только забыли об этом упомянуть в документации.  :)
Поставьте в начале модуля "Option Compatible" или "Option VBASupport 1" и пользуйтесь.
Оператор Like реализован в LO, насколько я понимаю, с помощью регулярных выражений. Можно и напрямую использовать регулярные выражения.
Спасибо за подсказку, а то русскоязычной документации мало, да и я только начал изучать. А регулярные выражения имеете ввиду "vbscript.RegExp" из VB?

sokol92

#5
О сопоставлении словарей в LibreOffice и Microsoft Office см. здесь.

Регулярные выражения в LibreOffice включают, в том числе, поддержку юникода, чего нельзя сказать про упомянутый Вами объект "Vbscript.RegExp".

С документацией на русском языке, действительно, проблемы, несмотря на героические усилия коллеги @kompilainenn.  :)
Владимир.

eeigor

Владимир, оператор Like, вроде, поддерживается без всяких опций совместимости – как родной...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Albran

Цитата: eeigor от 26 декабря 2022, 18:28оператор Like, вроде, поддерживается без всяких опций совместимости – как родной...
Нет не поддерживает, я проверял.
А нет книги (документации) по сопоставлению VB и LibreOffice Basic?

sokol92

Есть книга А.Питоньяка OOME_4_0.odt. Эту книгу, как классику, можно читать и перечитывать много раз (с разным уровнем понимания).
Владимир.

Albran

#9
Цитата: sokol92 от 26 декабря 2022, 19:48Есть книга А.Питоньяка OOME_4_0.odt. Эту книгу, как классику, можно читать и перечитывать много раз (с разным уровнем понимания).
Спасибо.
И еще вопрос: для сервиса "com.sun.star.linguistic2.SpellChecker" как можно получить список исправлений для слова? (Те что по правой кнопке мыши на ошибке показываются)
У Pitonyakа нашел код для записи текстового файла:
oSimpleFileAccess = createUNOService ("com.sun.star.ucb.SimpleFileAccess")
 oOutputStream = createUNOService ("com.sun.star.io.TextOutputStream")
oOutputStream.setOutputStream(oSimpleFileAccess.openFileWrite(fileN))
 oOutputStream.writeString(strTxt)
 oOutputStream.closeOutput()
И написано "Вы можете установить кодировку текста, используя метод setEncoding()." Но что-то мне не удалось сохранить файл в кодировке отличной от utf-8. Как это делается?

sokol92

Цитата: Albran от 26 декабря 2022, 20:47как можно получить список исправлений для слова
Следует использовать другой метод указанного Вами сервиса - spell (сам не тестировал).

Цитата: Albran от 26 декабря 2022, 20:47мне не удалось сохранить файл в кодировке отличной от utf-8
Давайте вместе попробуем. Для Windows:
Option Explicit
Sub TestEncoding
  Dim oSimpleFileAccess, oOutputStream
  oSimpleFileAccess = createUNOService ("com.sun.star.ucb.SimpleFileAccess")
  oOutputStream = createUNOService ("com.sun.star.io.TextOutputStream")
  With oOutputStream
    .setEncoding "windows-1251"
    .setOutputStream oSimpleFileAccess.openFileWrite(ConvertToUrl("C:\temp\TestEncoding.txt"))
    .writeString("Тест кодировки")
    .closeOutput()
  End With
 End Sub
Владимир.

Albran

Цитата: sokol92 от 27 декабря 2022, 13:24Давайте вместе попробуем. Для Windows:
Спасибо, я неправильно "ANSI" писал. :) Но почему не кодирует "UTF-16LE" или "UTF-16"?
Со spell надо разбираться...
А вообще в редакторе как-то можно посмотреть методы и свойства сервиса (объекта)?

sokol92

Цитата: Albran от 27 декабря 2022, 14:09в редакторе как-то можно посмотреть методы и свойства сервиса (объекта)?
В редакторе можно посмотреть свойства в Runtime, установив курсор на переменную и нажав F7.
В последних версиях LO появился пункт меню Сервис / Инструменты разработки.

И, главное - есть гениальное расширение MRI автора @Hanya (Япония). Не пожалейте времени на изучение возможностей этой программы! Она умеет не только читать, но и писать на разных языках...
Владимир.

mikekaganski

Цитата: Albran от 27 декабря 2022, 14:09почему не кодирует "UTF-16LE" или "UTF-16"?

Потому что посчитали это нецелесообразным. Есть ли реальная задача, где требуется UTF-16, и где нельзя использовать UTF-8?
С уважением,
Михаил Каганский

Albran

#14
Цитата: mikekaganski от 27 декабря 2022, 15:06Потому что посчитали это нецелесообразным. Есть ли реальная задача, где требуется UTF-16, и где нельзя использовать UTF-8?
Особой нужды нет, но в VBA FSO.CreateTextFile создает или UTF-16 или ANSI. Так что может понадобиться для совместимости. Впрочем с Option VBASupport 1 можно VBA запускать.
Что-то у меня по F7 ничего нет. Может это официальная портативная версия урезанная? Да и глючит что-то.
А в чем проблема с кодом:
Dim UP As New Collection, fl(1)
If KeyExists(UP, vWord) = False Then
  fl(0) = vWord: fl(1) = oCursorS.String
  UP.Add Item:=fl, Key:=vWord
End If

Function KeyExists(coll As Collection, key) As Boolean
    On Error GoTo ErrExit
    coll.Item key
    KeyExists = True
ErrExit:
End Function
В коллекции только 1 последнее значение, вместо списка всех слов.
С помощью EnumerableMap это можно сделать?
Где бы почитать про реализацию коллекций и словарей в LO Basic...