Успешная ёфикация большого текста

Автор tadaoyamaguchi, 21 июля 2023, 19:09

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

tadaoyamaguchi

Приветствую всех участников!

ЗАДАЧА: Успешная ёфикация большого текста. Текст сложно отформатирован (стили, сноски, колонтитулы, всякое такое), поэтому необходимо ёфицировать его не выходя из LibreOffice Writer. Внешние программы ломают форматирование.
Понял, что существуют какие-то расширения для этой цели, но не смог разобраться.
Может ли кто-то из разбирающихся объяснить, что сделать в режиме "открыть это, скачать то, установить сюда, нажать вот тут" ?

Огромное спасибо


Недавно пользуюсь LibreOffice, только что зарегистрировался здесь на форуме и понимаю, что знаю про LibreOffice меньше любого из вас. Поэтому сразу прошу прощения, если вопрос покажется примитивным или глупым. Я пытался найти здесь ответ на него, но не нашёл.


sokol92

Спасибо и Вам за новое для меня слово!
Я думаю, Вы обратились по адресу, ждите ответа.  :)
Владимир.

tadaoyamaguchi

Спасибо, Владимир. Но что-то пока тишина... Неужели придётся ставить MSOffice

gabix

#3
Цитата: tadaoyamaguchi от 23 июля 2023, 18:41Неужели придётся ставить MSOffice

Вы там видели ёфикацию? Где?

Посмотрите OOoFBTools, там есть. К сожалению, последняя версия LO, в которой у меня работает это замечательное расширение, — 6.3.4.

Ну и нелишне помнить, что 100%-но достоверная ёфикация невозможна в принципе из-за наличия множества пар типа все-всё, совершенный-совершённый, передохнем-передохнём и пр.

tadaoyamaguchi

Цитата: gabix от 23 июля 2023, 19:40
Цитата: tadaoyamaguchi от 23 июля 2023, 18:41Неужели придётся ставить MSOffice

Вы там видели ёфикацию? Где?
...
Ну и нелишне помнить, что 100%-но достоверная ёфикация невозможна в принципе из-за наличия множества пар типа все-всё, совершенный-совершённый, передохнем-передохнём и пр.


Для word есть макрос, но он оказался неполноценным, ёфицирует только спорные случаи (все - всё).

Полноценный ёфикатор есть только для txt rtf,  я на него и рассчитывал, но он убил все стили текста. А у меня документ большой, книга. Если бы я раньше подумал и начал с ёфикации...

И да, полноценным я считаю макрос или программу, который ёжика исправит сам, а все-всё спросит у меня

kompilainenn

Для ЛибреОфис был вроде словарь специальный с ё. Поищите здесь на форуме
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

sokol92

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

mikekaganski

Цитата: tadaoyamaguchi от 23 июля 2023, 20:55Полноценный ёфикатор есть только для txt rtf

Ссылка бы не помешала ;)
С уважением,
Михаил Каганский

tadaoyamaguchi


sokol92

Посмотрел указанную ссылку и скачал проект из github.
В составе проекта имеется словарь yox.dat, который последний раз обновлялся 23.07.2023.
Словарь содержит около 140 000 (!) слов (включая имена собственные) с буквой "ё" двух видов: имеющие "тёзку" с буквой "е" и не имеющие.
Можно написать макрос, который меняет слова, не имеющие "тёзку", и помечает слова, имеющие "тёзку" каким-либо образом для последующего ручного просмотра и принятия решения о замене.
Я очень поверхностно знаком с Writer'oм (опыт работы с Calc значительно больше), так что не знаю, как лучше пометить слова.
Владимир.

mikekaganski

Насколько я понимаю, в первом приближении нужен макрос, который бы использовал файлы yox.dat и yo_regexpr.dat (простой текст в кодировке Windows-1251) для поиска и замены в тексте. А потом уж можно было бы посмотреть на дополнительный интерактив в коде на Паскале на гитхабе.

Ага - sokol92 уже думает в этом направлении...
С уважением,
Михаил Каганский

sokol92

Добрый день, Михаил! Файл yo_regexpr.dat совсем небольшой и его обработку вполне можно отложить на будущее.
Никогда не писал на Паскале, но для текста в 4500 строк нужны веские причины (если только он не сгенерирован роботом).
Владимир.

mikekaganski

#12
Цитата: sokol92 от 24 июля 2023, 18:58для текста в 4500 строк нужны веские причины

В Main.pas всё подряд: и код для кнопочек на панели, и код для логики. Так что самое страшное - отделить зёрна от плевел :)

TMainForm.CheckWordEx -> TMainForm.CheckWord -> TMainForm.SelectWord

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

sokol92

#13
Я логику вижу так (в текст на Паскале не смотрел  :) ).
' --------------------------------------------------------------------------------------------------
' lang:ru
' Создает и возвращает объект словаря.
' Параметр dicPath задает полный путь к файлу yox.dat (формат OC или URL-формат).
' Ключ словаря - слово в нижнем регистре c замененным ё на е.
Function CreateMap(ByVal dicPath As String) As Object
  Dim oMap
  Dim oStream As Object, oTextStream As Object, arr, i As Long, v
  oMap = com.sun.star.container.EnumerableMap.create("string", "any")
  oTextStream = CreateUnoService("com.sun.star.io.TextInputStream")
  oStream = SFA.openFileRead(ConvertToUrl(dicPath))
  oTextStream.setInputStream oStream
  oTextStream.setEncoding "windows-1251"
  arr=Split(oTextStream.readString(Array(), false), Chr(10))
  oTextStream.closeInput
 
  For Each v In arr
    v=Replace(v, Chr(13), "")  
    If left(v, 1)<>"#" And len(v)>0 Then
      oMap.put Replace(Replace(LCase(v), "ё", "е"), "?", ""), v
    End If
  Next v   
  CreateMap=oMap
End Function

' --------------------------------------------------------------------------------------------------
' lang:ru
' Ё-фицирует слово word на основе словаря oMap.
' Возвращает пустое значение, если слово не требует замены; "?", если нужно ручное определение;
' иначе - замененное слово. 
Function WordRep(ByVal word As String, Byval oMap As Object) As String
  Dim s As String, s2 As String, s3 as String, i As Long
 
  s=Lcase(word)
  If Instr(1, s, "е")>0 And Instr(1, s, "ё")=0 Then
    If oMap.containsKey(s) Then
      s2=oMap.get(s)
      ' Если словарное слово начинается с заглавной буквы, то и заменяемое должно начинаться с заглавной.
      If Ucase(Left(s2, 1))<> Left(s2, 1) Or Ucase(Left(s, 1))<> Left(s, 1) Then
        If Right(s2, 1)="?" Then
           WordRep="?"
        Else
           i=Instr(1, Lcase(s2), "ё")
           If i>0 Then
             s3=Mid(word, i, 1)
             WordRep=Left(word, i-1) & IIf(s3="Е", "Ё", "ё") & Right(word, Len(word)-i)
           End If
        End If
      End If
    End If
  End If        
End Function

' --------------------------------------------------------------------------------------------------
' проверка ё-фикации.
' Заполнение словаря занимает несколько секунд.
Sub Test
 Dim oMap As Object, v, res As String
 oMap=CreateMap("C:\Temp\yox.dat")
 For Each v In Split("Ель на ежика похожа Еж в иголках елка тоже все", " ")
   res=res & v & " " & WordRep(v, oMap) & Chr(10)
 Next v
 Msgbox res
End Sub
Владимир.

sokol92

Может быть, для тех случаев, когда требуется решение ё-фикатора (пока человека  :) ) о замене, создавать Bookmark c каким-либо префиксом имен?
Владимир.