Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
94
Добавлен:
11.05.2015
Размер:
616.76 Кб
Скачать
      1. Поиск в выделенном тексте

Хитрость поиска только в выделенном тексте в том, чтобы понять, что курсор может использоваться в процедуре findNext. Можно затем проверить конец найденного текста, не зашел ли поиск за пределы выделенного текста. Это также позволит начать поиск с любого положения курсора. Метод findFirst не обязателен, если уже есть объект курсора, который описывает позицию, с которой начинается поиск процедурой findNext. Следующий макрос использует рамки моего выделенного текста и содержит некоторые улучшения, предложенные Bernard Marcelly. См. также:

http://api.openoffice.org/docs/common/ref/com/sun/star/text/XTextRangeCompare.html

Листинг 7.14.2.1:Поиск в выделенном тексте

'******************************************************************

'Author: Andrew Pitonyak

'email: andrew@pitonyak.org

Sub SearchSelectedText

Dim oCurs(), i%

If Not CreateSelectedTextIterator(ThisComponent, _

"Search text in the entire document?", oCurs()) Then Exit Sub

For i% = LBound(oCurs()) To UBound(oCurs())

SearchSelectedWorker(oCurs(i%, 0), oCurs(i%, 1), ThisComponent)

Next i%

End Sub

'******************************************************************

'Author: Andrew Pitonyak

'email: andrew@pitonyak.org

Sub SearchSelectedWorker(oLCurs, oRCurs, oDoc)

If IsNull(oLCurs) Or IsNull(oRCurs) Or IsNull(oDoc) Then Exit Sub

If oDoc.Text.compareRegionEnds(oLCurs, oRCurs) <= 0 Then Exit Sub

oLCurs.goRight(0, False)

Dim vDescriptor, vFound

vDescriptor = oDoc.createSearchDescriptor()

With vDescriptor

.SearchString = "Paragraph"

.SearchCaseSensitive = False

End With

' Нет причин выполнять findFirst.

vFound = oDoc.findNext(oLCurs, vDescriptor)

REM Would you kill for short-circuit evaluation?

Do While Not IsNull(vFound)

REM If Not vFound.hasElements() Then Exit Do

'See if we searched past the end

'Not really safe because this assumes that vFound и oRCurs

'are in the same text object (warning).

If -1 = oDoc.Text.compareRegionEnds(vFound, oRCurs) Then Exit Do

Print vFound.getString()

vFound = ThisComponent.findNext( vFound.End, vDescriptor)

Loop

End Sub

      1. Сложный поиск и замена

Листинг 7.14.3.1:Удалить (текст) между двумя разделителями с помощью поиска и замены.

'Deleting text between two delimiters is actually very easy

Sub deleteTextBetweenDlimiters

Dim vOpenSearch, vCloseSearch 'Open и Close descriptors

Dim vOpenFound, vCloseFound 'Open и Close find objects

Dim oDoc

oDoc = ThisComponent

' Создать дескрипторы для документа, в котором возможен поиск.

vOpenSearch = oDoc.createSearchDescriptor()

vCloseSearch = oDoc.createSearchDescriptor()

' Задать текст, который нужно искать, и др.

vOpenSearch.SearchString = "["

vCloseSearch.SearchString = "]"

' Найти первый открывающий разделитель

vOpenFound = oDoc.findFirst(vOpenSearch)

Do While Not IsNull(vOpenFound)

'Поиск закрывающего разделителья, начиная с найденного открывающего

vCloseFound = oDoc.findNext( vOpenFound.End, vCloseSearch)

If IsNull(vCloseFound) Then

Print "Найден открывающий разделитель без закрывающего!"

Exit Do

Else

' Очистить открыающий разделитель, если это еще не сделано,

' затем завершить обработку текста внутри разделителей

vOpenFound.setString("")

' Выделить текст внутри разделителей

vOpenFound.gotoRange(vCloseFound, True)

Print "Found " & vOpenFound.getString()

' очистить текст между разделителями

vOpenFound.setString("")

' Очистить закрывающий разделитель

vCloseFound.setString("")

' Действительно ли нужно удалить ВСЕ пробелы?

' Если да, то это делается здесь!

If vCloseFound.goRight(1, True) Then

If vCloseFound.getString() = " " Then

vCloseFound.setString("")

End If

End If

vOpenFound = oDoc.findNext( vOpenFound.End, vOpenSearch)

End If

Loop

End Sub

Соседние файлы в папке ooo