Strona 1 z 1

[SOLVED] Jak wyszukać coś w dokumencie? (makro)

: czw kwie 04, 2013 12:01 pm
autor: JackK
Cześć.
Dziś pierwszy raz muszę coś zrobić w OpenOffice. Muszę napisać makro, które sprawdza, czy w tekście odpowiednie znaczniki są poprawnie wpisane (zamykają się w dobrej kolejności).
Nie wiem jednak nawet, jak zacząć. Na początek przydałoby się wiedzieć, jak:
- w zmiennej uzyskać treść dokumentu
- wyszukać ciąg z wykorzystaniem wyr. regularnego
Ogólnie: jestem zielony w temacie.

Przykład dokumentu:
<${{m1}}>tu coś jest
<${{m2}}>i tu także</${{m2}}>
</${{m1}}>
Muszę zrobić makro, które sprawdzi, czy wszystkie znaczniki są zamknięte i nie zachodzą na siebie. Jeśli jest błąd, to kursor na się znaleźć na błędnej pozycji.

Proszę o pomoc,
Jacek

Re: Jak wyszukać coś w dokumencie? (makro)

: czw kwie 04, 2013 1:17 pm
autor: JackK
Na razie mam takie coś:

Kod: Zaznacz cały

'*****  BASIC  *****
Dim el_1kl	As String
Dim oDoc 	As Object

Sub jk_check_openclose
	el_1kl = "<\$\{([^>]+)\}>"
	Dim oReplace As Object
	Dim SrchAttributes(0) As New com.sun.star.beans.PropertyValue
	oDoc = ThisComponent
	oReplace = oDoc.createReplaceDescriptor
	oReplace.SearchString = el_1kl
	oReplace.ReplaceString = "&"
	oReplace.SearchRegularExpression = True 'Use regular expressions
	oReplace.searchAll = False
	oDoc.replaceAll(oReplace)
End Sub
Gdzie mogę znaleźć wynik tego wyszukiwania? Każdy ze znalezionych przez wyrażenie regularce ciąg chciałbym umieścić w tablicy. Jak to zrobić?

----------------
edit

Już mam znalezioną wartość.
Inne pytanie: jak ze zmiennej tekstowej usunąć jakiś fragment wybrany wyrażeniem regularnym?

Re: Jak wyszukać coś w dokumencie? (makro)

: czw kwie 04, 2013 7:25 pm
autor: Jan_J
???
Pisanie analizatora znakowania (albo jego części) w UNO to jakiś masochzim. Są do tego lepsze narzędzia.
A i całe zadanie nie jest dla zielonych. Trzeba coś wiedzieć i o programowaniu, i o wyrażenach regularnych.
Czy naprawdę musisz robić to makrem w OpenOffice?

Re: Jak wyszukać coś w dokumencie? (makro)

: pt kwie 05, 2013 9:38 am
autor: JackK
Dzięki za odpowiedź, Janie.
Sporo już mam. Znajduje mi ciągi i ładuje to tablicy. Jestem w stanie określić, który tag jest źle zamknięty.
Teraz potrzebuję ustawić kursor w miejscu, gdzie jest błąd. Mam:

Kod: Zaznacz cały

Dim oDoc 	As Object
Dim oText 	As Object
Dim oSearch As Object
Dim ser		As String
Dim iPos	As Integer

Sub jk_check_openclose
	oDoc = ThisComponent
	oText = ThisComponent.getText()
	ser = "</?\$\{([^>]+)\}>"

	oSearch = oDoc.createSearchDescriptor
	oSearch.SearchString = ser
	oSearch.SearchRegularExpression = True
	oSearch.searchAll = False

	arr = Array()
	arrsize = -1
	fnd = oDoc.findFirst(oSearch)
	do while not IsNull(fnd)
		f$ = fnd.getString()		' znaleziony string
		MsgBox f$ + "  arrsize=" + arrsize
		iPos = InStr(f$, "/")
		if iPos > 0 then
			if arr(arrsize) = Mid(f$, 1,iPos-1) + Mid(f$, iPos+1, 99) then
				arrsize = arrsize - 1
				if arrsize >= 0 then
					redim preserve arr(arrsize)	' usuń ostatnią wartość z tablicy
				else
					redim arr()
				endif
			else
				MsgBox "Błąd! Nie zamknięte " + arr(arrsize)

			' COŚ TAKIEGO ZNALAZŁEM W NECIE, ALE NIE WIEM, JAK TO DOSTOSOWAĆ DO MEGO PRZYKŁADU
			' POZYCJĘ, NA JAKIEJ POWINIEN USTAWIĆ SIĘ KURSOR MAM W fnt.Start (jeśli dobrze rozumiem)
			'oCursor = thisComponent.getText.createTextCursor
			'or
			'oText = thisComponent.getText
			'oCursor = oText.createTextCursorByRange(oText.getStart)

				exit do
			endif
		else
			arrsize = arrsize + 1
			redim preserve arr(arrsize)	' rozszerz tablicę pozostawiając poprzednią zawartość
			arr(arrsize) = f$			' na ostatniej pozycji dodaj znaleziony string
		endif
		fnd = oDoc.findNext(fnd.End, oSearch)	' znajdź następny string
	loop
End Sub
Jak ustawić ten kursor?

Re: Jak wyszukać coś w dokumencie? (makro)

: pt kwie 05, 2013 2:43 pm
autor: JackK
Zrobiłem zaznaczenie przy pomocy:

Kod: Zaznacz cały

oView = ThisComponent.getCurrentController()
oView.select(fnd)
i to mi wystarczy.