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

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

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

mikekaganski

Цитата: Albran от 27 декабря 2022, 17:05А в чем проблема с кодом:

Ваш код создаёт объект коллекцию, проверяет, есть ли в нём (пустом) элемент с заданным ключом, и при отсутствии (естественно) добавляет туда один элемент.

Если Вы имели ввиду какой-то расширенный код, покажите его.
С уважением,
Михаил Каганский

Albran

#16
Цитата: mikekaganski от 27 декабря 2022, 17:26Ваш код создаёт объект коллекцию, проверяет, есть ли в нём (пустом) элемент с заданным ключом, и при отсутствии (естественно) добавляет туда один элемент.
Если Вы имели ввиду какой-то расширенный код, покажите его.
Код из 1-го поста. Вот полностью:
Option Explicit
Option VBASupport 1
Sub Corrector()
Dim oLocale As New com.sun.star.lang.Locale
Dim aEmpty(0) As New com.sun.star.beans.PropertyValue
Dim oDoc As Object, oCursor, oCursorS, wd, SpellC, vWord$, strTxt$
Dim UP As New Collection, fl(1)
   oDoc = ThisComponent
   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
        oCursorS = oDoc.Text.createTextCursorByRange(oCursor.Start)
        oCursorS.gotoEndOfSentence (True)
          If KeyExists(UP, vWord) = False Then
            fl(0) = vWord: fl(1) = oCursorS.String
            UP.Add Item:=fl, Key:=vWord
          End If
      end if
    end if
  Loop While oCursor.gotoNextWord(False)
  For Each wd In UP
    Print wd(0)
  Next wd
End Sub

Function KeyExists(coll As Collection, key) As Boolean
    On Error GoTo ErrExit
    coll.Item key
    KeyExists = True
ErrExit:
End Function
Должна быть коллекция уникальных слов с ошибками в документе (Key:=слово, Item:=предложение), но когда для примера  циклом прогоняю.
For Each wd In UP
  Print wd(0)
Next wd
В коллекции 1 единственное слово.

mikekaganski

#17
Вы добавляете один и тот же объект fl() в коллекцию, и меняете его элементы. В коллекции хранятся ссылки на один и тот же объект.

Sub Corrector()
Dim oLocale As New com.sun.star.lang.Locale
Dim aEmpty(0) As New com.sun.star.beans.PropertyValue
Dim oDoc As Object, oCursor, oCursorS, wd, SpellC, vWord$, strTxt$
Dim UP As New Collection
  oDoc = ThisComponent
  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
        oCursorS = oDoc.Text.createTextCursorByRange(oCursor.Start)
        oCursorS.gotoEndOfSentence (True)
        AddWord UP, vWord, oCursorS.String
      end if
    end if
  Loop While oCursor.gotoNextWord(False)
  For Each wd In UP
    Print wd(0)
  Next wd
End Sub

Sub AddWord(coll As Collection, vWord, sString)
    On Error GoTo ErrExit
    Dim fl(1)
    fl(0) = vWord: fl(1) = sString
    coll.Add Item:=fl, Key:=vWord
ErrExit:
End Function

И это поведение в режиме VBASupport - это баг. По крайней мере в этом режиме LibreOffice Basic должен вести себя как VBA, в т.ч. в части семантики "по ссылке"/"по значению".
С уважением,
Михаил Каганский

sokol92

Одно из главных отличий LO Basic от VBA - реализация обработки массивов.

В VBA при копировании (присвоении) массивов создается новый массив, в который переносятся все элементы исходного массива.

В LO Basic при копировании массива копируется ссылка на массив (об этом подробно пишет А.Питоньяк).
Sub Test()
  Dim arr1(0), arr2
  arr2=arr1
  arr1(0)=1
  Msgbox arr2(0)
End Sub
В результате работы макроса в LO Basic будет выдано сообщение "1".
В VBA, естественно, будет пустое сообщение.
Владимир.

Albran

Цитата: mikekaganski от 27 декабря 2022, 19:18Вы добавляете один и тот же объект fl() в коллекцию, и меняете его элементы. В коллекции хранятся ссылки на один и тот же объект.
И это поведение в режиме VBASupport - это баг. По крайней мере в этом режиме LibreOffice Basic должен вести себя как VBA, в т.ч. в части семантики "по ссылке"/"по значению".
Спасибо что заметили, а то гадал бы. Эх, почему бы разработчикам с самого начала не озаботиться совместимостью с VB, а не городить свой велосипед... :-\
Еще может кто поделится кодом для быстрой сортировки массива?

mikekaganski

#20
Цитата: Albran от 27 декабря 2022, 20:28Эх, почему бы разработчикам с самого начала не озаботиться совместимостью с VB

Совместимость с VB в StarBasic вообще не нужна. А вот совместимостью с VBA разработчики "озаботились" очень давно: Option Compatible появился в OOo с 2004.

Цитата: Albran от 27 декабря 2022, 20:28а не городить свой велосипед

Ну а это вообще странное предложение. StarWriter появился в 1985, когда VBA ещё не было (появился в 1993); в 1999 (когда стартовал OOo) Microsoft вовсе не горел желанием публиковать спецификации чего бы то ни было во благо конкурирующих продуктов (даже сейчас, когда документации от MS стало несравнимо больше, огромная часть реального поведения VBA не описана в имеющейся спецификации, и всё так же определяется методом проб и ошибок). Как Вы представляете себе автоматизацию кросс-платформенного офисного пакета (конкурента MS Office) без "своего велосипеда"? Ждать, когда у MS проснётся желание открывать и публиковать? (и разрешать! - вспомните, как они специально оговаривали недопустимость использования Office UI в конкурирующих продуктах.)

Цитата: Albran от 27 декабря 2022, 20:28может кто поделится кодом для быстрой сортировки массива?

Посмотрите в коде этого расширения.
С уважением,
Михаил Каганский

Albran

#21
Цитата: mikekaganski от 28 декабря 2022, 10:10Совместимость с VB в StarBasic вообще не нужна. А вот совместимостью с VBA разработчики "озаботились" очень давно: Option Compatible появился в OOo с 2004.
Ну как не нужна, у них даже оператора Like не было. Т.е. с самого начало разработчики изобретали свой кривоватый велосипед (все баги вылезающие после режимов совместимости говорят о многом), вместо того чтобы взять за основу старый добрый VB с хорошо известными багами и уже на его основе потом пилить совместимость с VBA. Хотя возможно какая-то проблема с лицензированием VB. VBA то понятно закрытый MS. Но раз они режим совместимости запилили то можно это было обойти. И режим совместимости не включенный с самого начала в код выглядит как костыли. И естественно багов будет много. Хотя сильная сторона LibreOffice все равно не StarBasic. Впрочем это дела минувших дней и офтоп.;D
Пока что и у LibreOffice и у MS Office есть свои достоинства и недостатки. И возможно какие-то задачи придется решать с помощью LibreOffice, а какие-то с помощью MS Office, что далеко не идеально.
А есть на форуме люди участвующие в разработке или темы в которых «хотелки» можно скидывать? Например, невозможность setEncoding «utf-16LE» формата. Тот же пользовательский словарь MS CUSTOM.DIC не создать без режима совместимости.
Цитата: mikekaganski от 28 декабря 2022, 10:10Посмотрите в коде этого расширения.
Спасибо.
Ладно, чтобы совсем не было оффтопом сообщение, вот код макроса получения списка слов с ошибками, с вариантами исправления и предложениями где ошибки встречаются.
Был бы рад (если в образовательных целях) гуру подправили бы код без режима Option VBASupport 1 и Option Compatible на чистом  StarBasic
Option Explicit
'Option VBASupport 1

Sub Corrector() 'Collect words from the current text document and return them.
Dim aLocale As New com.sun.star.lang.Locale
Dim emptyArgs(0) As New com.sun.star.beans.PropertyValue
Dim stFolder$, file1$, st$, regst$, vWord$, strTxt$, j&, i&, n&
Dim oDoc As Object, arr(), wd, swd, SpellSuggs, oCursor, oCursorS, vSpeller
Dim Low As New Collection
    oDoc = ThisComponent  ' Получить активный документ
    stFolder = "C:\Temp\"
    aLocale.Language = "ru": aLocale.Country = "RU"
    vSpeller = createUnoService("com.sun.star.linguistic2.SpellChecker")
    oCursor = oDoc.Text.CreateTextCursor()
    oCursor.gotoStart(False)
  Do
    oCursor.gotoEndOfWord(True)
    vWord = Trim(oCursor.String)
    If Left(vWord, 1) Like "[!A-Za-zА-яЁё]" Then vWord = Trim(Mid(vWord, 2))
    If Right(vWord, 1) Like "[!A-Za-zА-яЁё]" Then vWord = Trim(Mid(vWord, 1, Len(vWord) - 1))
    if Len(vWord) > 1 Then
      If vSpeller.isValid(vWord, aLocale, emptyArgs()) = False Then
        oCursorS = oDoc.Text.createTextCursorByRange(oCursor.Start)
        oCursorS.gotoStartOfSentence(False)
        oCursorS.gotoEndOfSentence(True)
          If vWord Like "[а-яё]*" Then
            collAdd Low, vWord, oCursorS.String
          End If
      end if
    end if
  Loop While oCursor.gotoNextWord(False)
    If Low.Count > 0 Then
      file1 = stFolder & "vFindRE.txt"
      ReDim arr(1 To Low.Count): i = 1
      For Each wd In Low '0-ключи, 1-Items
        regst = "<" & wd(0) & ">": st = vbNullString
        SpellSuggs = vSpeller.spell(wd(0), aLocale, emptyArgs()).Alternatives
        If UBound(SpellSuggs) >= 0 Then
          For Each swd In SpellSuggs
            st = st & "=" & swd
          Next swd
        End If
        arr(i) = regst & st & "=" & wd(1): i = i + 1
      Next wd
      Call saveFile(Join(arr, vbNewLine), file1): Erase arr
    End If
End Sub

Sub collAdd(coll As Collection, vWord$, sStr$)
    On Error GoTo ErrExit
    Dim fl(1)
    fl(0) = vWord: fl(1) = sStr
    coll.Add Item:=fl, Key:=vWord
ErrExit:
End Sub

sub saveFile(strTxt$, fileN$)
  Dim oSimpleFileAccess, oOutputStream
  oSimpleFileAccess = createUNOService ("com.sun.star.ucb.SimpleFileAccess")
  oOutputStream = createUNOService ("com.sun.star.io.TextOutputStream")
  With oOutputStream
    .setEncoding "windows-1251" 'нужен utf-16LE format
    .setOutputStream oSimpleFileAccess.openFileWrite(ConvertToUrl(fileN))
    .writeString(strTxt)
    .closeOutput()
  End With
end sub

mikekaganski

#22
Цитата: Albran от 28 декабря 2022, 16:55вместо того чтобы взять за основу старый добрый VB

Точно же! Ведь VB - давнишний кросс-платформенный проект с открытым кодом, как я мог забыть...

Цитата: Albran от 28 декабря 2022, 16:55темы в которых «хотелки» можно скидывать

https://www.libreoffice.org/get-help/feedback/
С уважением,
Михаил Каганский

sokol92

Владимир.