Замена символов в выделенном фрагменте текста - макрос

Автор snik100, 16 декабря 2021, 14:51

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

snik100


eeigor

#31
Да. Конец абзаца ($) будет заменён на запятую с пробелом после (, ), как в Вашем примере.
Файл прилагается.
Ubuntu 18.04 LTS • LibreOffice 7.4.3.2 Community

snik100


snik100

#33
Очень благодарен. Еще вопрос, если можно.
На некоторых компьютерах текст, копируемый в документ для преобразования, имеет знаки табуляции, которые нужно убрать (или заменить на ничего).
Попытался реализовать это путем дублирования вышеуказанной процедуры с другим названием и выполнением ее в виде
ЦитироватьSub TestReplaceAllInSelection()
   Call ReplaceAllInSelection("$", ", ", True)
   Call ReplaceAllInSelection2("тут табуляция", "", True)
End Sub
Но работает только на LibreOffice 7 (под win10), а на этих некоторых компьютерах с Linux и с установленной 5-й версией почему-то не работает. Возможно есть более простой способ замены или удаления табуляции одновременно с расстановкой запятых в выделенном фрагменте.

snik100

Цитата: eeigor от 16 декабря 2021, 22:52Вот только при записи макроса флагам SearchItem.SearchFlags было присвоено другое значение: Value = 6144
Кстати вот этого не увидел

mikekaganski

Цитата: snik100 от 17 декабря 2021, 09:56
Цитата: eeigor от 16 декабря 2021, 22:52Вот только при записи макроса флагам SearchItem.SearchFlags было присвоено другое значение: Value = 6144
Кстати вот этого не увидел

И это не принципиально. 2048 + 4096 = 6144; 2048 (0x0800) - это флаг REG_NOT_BEGINOFLINE, которым злоупотребляют в значении "только выделенное". 4096 (0x1000) - это REG_NOT_ENDOFLINE, который устанавливается (но не проверяется) для того же самого. Функционально важен только один - первый.
С уважением,
Михаил Каганский

mikekaganski

Цитата: sokol92 от 16 декабря 2021, 19:16Пока UNO-методы не доработаны, приходится пользоваться "Диспетчером".

Это задумано, но недоработано начиная с давних времён. Но я бы сказал, что лучше бы добавить интерфейс поиска/замены в объект-текст (который можно получить для произвольного диапазона), или в объект-курсор. Это было бы логичнее и гибче (не зависело бы от физического выделения).
С уважением,
Михаил Каганский

snik100

Если можно, подскажите, пожалуйста, по параллельному удалению знаков табуляции. Спасибо!

mikekaganski

Цитата: snik100 от 17 декабря 2021, 09:40
На некоторых компьютерах текст, копируемый в документ для преобразования, имеет знаки табуляции, которые нужно убрать (или заменить на ничего).
Попытался реализовать это путем дублирования вышеуказанной процедуры с другим названием и выполнением ее в виде
ЦитироватьSub TestReplaceAllInSelection()
   Call ReplaceAllInSelection("$", ", ", True)
   Call ReplaceAllInSelection2("тут табуляция", "", True)
End Sub
Но работает только на LibreOffice 7 (под win10), а на этих некоторых компьютерах с Linux и с установленной 5-й версией почему-то не работает. Возможно есть более простой способ замены или удаления табуляции одновременно с расстановкой запятых в выделенном фрагменте.

Во-первых, в этом сообщении Вы не указываете конкретно, каким кодом Вы пользуетесь (я вижу в своём магическом кристалле, что это код из #31).
Во-вторых, не очень понятно, зачем нужно дублировать функцию - если я правильно угадал источник, то там (а) уже есть функция ReplaceAllInSelection2 с другой сигнатурой, и (б) первая функция готова обрабатывать любые Ваши аргументы.
В-третьих, нет документа, на котором оно не работает.
И в-четвёртых, "тут табуляция" выглядит ... скажем так, подозрительно. Что там? результат нажатия клавиши Tab? регулярное выражение \t? Или и вправду текст "тут табуляция"?

А вообще оно должно работать и на версии 5, и раньше, и на всех платформах. Так что без прояснения деталей вряд ли можно что-то посоветовать.
С уважением,
Михаил Каганский

snik100

Sub ReplaceAllInSelection(sSearch$, sReplace$, Optional SearchRegularExpression)
Dim document As Object, dispatcher As Object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim nAlgorithmType2%  '1=ABSOLUTE|2=REGEXP|3=APPROXIMATE|4=WILDCARD
nAlgorithmType2 = com.sun.star.util.SearchAlgorithms2.ABSOLUTE

If IsMissing(SearchRegularExpression) Then SearchRegularExpression = False
If SearchRegularExpression Then
nAlgorithmType2 = com.sun.star.util.SearchAlgorithms2.REGEXP
End If

Dim args(4) As New com.sun.star.beans.PropertyValue
args(0).Name = "SearchItem.SearchString"
args(0).Value = sSearch
args(1).Name = "SearchItem.ReplaceString"
args(1).Value = sReplace
args(2).Name = "SearchItem.SearchFlags"
args(2).Value = 2048  'search only the selected text ranges
args(3).Name = "SearchItem.Command"
args(3).Value = 3  'replace all the occurrences
args(4).Name = "SearchItem.AlgorithmType2"
args(4).Value = nAlgorithmType2

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args())
End Sub

Sub LAB_V()
Call ReplaceAllInSelection("$", ", ", True)
Call ReplaceAllInSelection("\t", "", True)
End Sub

Вот в таком виде табуляцию не убирает.

Пример текста
1
2
3
4
   1
   2
   3
   4

преобразуется в    1, 2, 3, 4,    1,    2,    3,    4,


snik100

Call ReplaceAllInSelection(" ", "", True)
С результатом нажатия клавиши Tab заменяет в виде 1, 2, 3, 4, 1, 2, 3, 4, . Как минимум на 7-й версии, на 5-й пока не пробовал.

mikekaganski

Тут дело в выделении. На пятой версии после выполнения замены выделение сбрасывается. Поэтому второй команде негде заменять "в выделенном".
С уважением,
Михаил Каганский

snik100

Цитата: mikekaganski от 17 декабря 2021, 12:27
Тут дело в выделении. На пятой версии после выполнения замены выделение сбрасывается. Поэтому второй команде негде заменять "в выделенном".
Понял, спасибо! Решил проблему двумя действиями, сначала убираем табуляции, потом заменяем переводы строк на запятые. Или наоборот.

sokol92

Кажется, поймал баг(?), который со вчерашнего вечера не давал мне покоя.

1. Стартуем новый экземпляр LO
2. В новый текстовый документ вставляем текст с переводами строк (любой из указанных в примерах выше). Выделяем этот текст.
3. Выполняем наш макрос (уже его выучили наизусть):

Sub ReplaceAllInSelection3()
  Dim document As Object, dispatcher As Object
  document = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
 
  Dim args(4) As New com.sun.star.beans.PropertyValue
  args(0).Name = "SearchItem.SearchString"
  args(0).Value = "$"
  args(1).Name = "SearchItem.ReplaceString"
  args(1).Value = ", "
  args(2).Name = "SearchItem.SearchFlags"
  args(2).Value = 2048 ' <= Здесь задаётся замена в выделении!
  args(3).Name = "SearchItem.Command"
  args(3).Value = 3
  args(4).Name = "SearchItem.AlgorithmType2"
  args(4).Value = 0
  dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args())
End Sub


Выделенный текст не меняется - правильно, поскольку SearchItem.AlgorithmType2 указан неправильно.

Теперь меняем в макросе значение SearchItem.AlgorithmType2 на правильное значение 2 и вновь выпоняем макрос. Замены текста нет.

Вчера у меня с одним и тем же макросом текст то изменялся, то нет.

Win 10, LO 7.2.3.2.
Владимир.