Szöveges dokumentumok szerkesztése
Az előző részek már leírták a szöveges dokumentumok szerkesztésének számos módját, főleg a com.sun.star.text.TextPortion és a com.sun.star.text.Paragraph szolgáltatást, amelyek hozzáférést biztosítanak a bekezdésrészekhez, illetve a bekezdésekhez. Ezek a szolgáltatások olyankor megfelelőek, ha a szöveget egy menetben, egy ciklussal akarjuk szerkeszteni. Viszont ez nem minden helyzetben elegendő. Az Apache OpenOffice tartalmaz egy com.sun.star.text.TextCursor szolgáltatást a bonyolultabb feladatok elvégzéséhez, beleértve a dokumentumokban visszafelé történő navigálást és a TextPortions helyett szavakon és mondatokon alapuló navigálást.
A TextCursor
A TextCursor az Apache OpenOffice API-ban hasonló, mint az Apache OpenOffice-dokumentumban használt látható kurzor. Egy adott pontot jelöl a szöveges dokumentumban, és különböző irányokban mozgatható a megfelelő parancsok használatával. Az Apache OpenOffice Basic TextCursor objektumát nem szabad összetéveszteni a látható kurzorral. Ez két különböző dolog.
Például az Apache OpenOffice TextCursor objektuma olyan metódusokat biztosít a szövegben történő navigáláshoz és a szöveg módosításához, amelyek a VBA Range objektumában találhatók meg (például MoveStart, MoveEnd, InsertBefore és InsertAfter). Az Apache OpenOffice TextCursor objektumának fenti VBA-függvényeknek megfelelő függvényei a következő részekben kerülnek ismertetésre.
Az Apache OpenOffice Basic TextCursor objektuma független a szöveges dokumentumban látható kurzortól. A TextCursor objektum programvezérelt pozíciómódosítása nincs semmilyen hatással a látható kurzorra. Számos TextCursor objektum megnyitható ugyanabban a dokumentumban, és használható különböző pozíciókban, amelyek függetlenek egymástól.
A TextCursor objektumot a createTextCursor metódussal lehet létrehozni:
Dim Doc As Object
Dim Cursor As Object
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor()
Az így létrehozott Cursor objektum támogatja a com.sun.star.text.TextCursor szolgáltatást, amely számos metódust biztosít a szöveges dokumentumokban történő navigáláshoz. A következő példa először balra mozgatja tíz karakterrel a TextCursor-t, majd három karakterrel jobbra.
Cursor.goLeft(10, False)
Cursor.goRight(3, False)
A TextCursor kijelölhet egy teljes területet is. Ez ahhoz hasonló, mint amikor kijelölünk egy részt az egérrel. A False paraméter az előző függvényben azt adja meg, hogy ki legyen-e jelölve a kurzor által bejárt terület. Például a TextCursor a
Cursor.goLeft(10, False)
Cursor.goRight(3, True)
kódban először tíz karaktert mozog jobbra kijelölés nélkül, majd három karaktert vissza, amelyeket ki is jelöl. Így a TextCursor által kijelölt terület a hetedik karakter után kezdődik a szövegben, és a tizedik karakter után ér véget.
Az alábbiakban láthatók a com.sun.star.text.TextCursor szolgáltatás főbb metódusai, amelyek a navigációra szolgálnak:
- goLeft (Karakterszám, Kijelölés)
- balra lép Karakterszám karaktert.
- goRight (Karakterszám, Kijelölés)
- balra lép Karakterszám karaktert.
- gotoStart (Kijelölés)
- a szöveges dokumentum elejére ugrik.
- gotoEnd (Kijelölés)
- a szöveges dokumentum végére ugrik.
- gotoRange (TextRange, Kijelölés)
- a megadott TextRange objektumra ugrik.
- gotoStartOfWord (Kijelölés)
- az aktuális szó elejére ugrik.
- gotoEndOfWord (Kijelölés)
- az aktuális szó végére ugrik.
- gotoNextWord (Kijelölés)
- a következő szó elejére ugrik.
- gotoPreviousWord (Kijelölés)
- az előző szó elejére ugrik.
- isStartOfWord ()
- True (igaz) értéket ad vissza, ha a TextCursor egy szó elején áll.
- isEndOfWord ()
- True (igaz) értéket ad vissza, ha a TextCursor egy szó végén áll.
- gotoStartOfSentence (Kijelölés)
- az aktuális mondat elejére ugrik.
- gotoEndOfSentence (Kijelölés)
- az aktuális mondat végére ugrik.
- gotoNextSentence (Kijelölés)
- a következő mondat elejére ugrik.
- gotoPreviousSentence (Kijelölés)
- az előző mondat elejére ugrik.
- isStartOfSentence ()
- True (igaz) értéket ad vissza, ha a TextCursor egy mondat elején áll.
- isEndOfSentence ()
- True (igaz) értéket ad vissza, ha a TextCursor egy mondat végén áll.
- gotoStartOfParagraph (Kijelölés)
- az aktuális bekezdés elejére ugrik.
- gotoEndOfParagraph (Kijelölés)
- az aktuális bekezdés végére ugrik.
- gotoNextParagraph (Kijelölés)
- a következő bekezdés elejére ugrik.
- gotoPreviousParagraph (Kijelölés)
- az előző bekezdés elejére ugrik.
- isStartOfParagraph ()
- True (igaz) értéket ad vissza, ha a TextCursor egy bekezdés elején áll.
- isEndOfParagraph ()
- True (igaz) értéket ad vissza, ha a TextCursor egy bekezdés végén áll.
A szöveget a program a mondatjelek alapján tagolja mondatokká. Például a pontot a mondat végeként értelmezi a program.
A Kijelölés paraméter egy logikai érték, amely megadja, hogy a kurzor által bejárt területet ki kell-e jelölni. Ezenfelül minden navigálási metódus visszaad egy logikai paramétert, amely azt jelzi, hogy a navigálás sikeres volt-e, vagy a kevés szöveg miatt sikertelen.
A következő lista az olyan metódusokat sorolja fel, amelyekkel a TextCursor használatával a kijelölt részek szerkeszthetők, és amelyek támogatják a com.sun.star.text.TextCursor szolgáltatást:
- collapseToStart ()
- visszavonja a kijelölést, és a TextCursor-t az előzőleg kijelölt terület elejére mozgatja.
- collapseToEnd ()
- visszavonja a kijelölést, és a TextCursor-t az előzőleg kijelölt terület végére mozgatja.
- isCollapsed ()
- True (igaz) értéked ad vissza, ha a TextCursor nem jelölt ki egy területet sem.
Szöveg formázása a TextCursor-ral
A com.sun.star.text.TextCursor szolgáltatás támogatja az összes karakter- és bekezdéstulajdonságot, amelyek már ismertetve voltak a fejezet elején.
A következő példa bemutatja, ezek hogyan használhatók a TextCursor-ral együtt. A program végiglépdel egy teljes dokumentumon, és minden mondat első szavát félkövérré formázza.
Dim Doc As Object
Dim Cursor As Object
Dim Proceed As Boolean
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor
Do
Cursor.gotoEndOfWord(True)
Cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
Proceed = Cursor.gotoNextSentence(False)
Cursor.gotoNextWord(False)
Loop While Proceed
A példaprogram először létrehoz egy dokumentumobjektumot a megnyitott szöveg számára. Ezután végiglépdel a teljes szövegen mondatról mondatra, kijelöli az első szavakat és félkövérré formázza azokat.
Szöveg tartalmának beolvasása és módosítása
Ha a TextCursor kijelölt területet tartalmaz, akkor ez a szöveg elérhető a TextCurson objektum String tulajdonságán keresztül. A következő példa a String tulajdonságot használja, hogy megjelenítse a mondatok első szavát egy üzenetablakban:
Dim Doc As Object
Dim Cursor As Object
Dim Proceed As Boolean
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor
Do
Cursor.gotoEndOfWord(True)
MsgBox Cursor.String
Proceed = Cursor.gotoNextSentence(False)
Cursor.gotoNextWord(False)
Loop While Proceed
A mondatok első szava ugyanígy módosítható a String tulajdonság használatával:
Dim Doc As Object
Dim Cursor As Object
Dim Proceed As Boolean
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor
Do
Cursor.gotoEndOfWord(True)
Cursor.String = "Helló"
Proceed = Cursor.gotoNextSentence(False)
Cursor.gotoNextWord(False)
Loop While Proceed
Ha a TextCursor kijelölt területet tartalmaz, a String tulajdonság lecseréli azt egy új szöveggel. Ha nincs kijelölve semmi, akkor a szöveg a TextCursor aktuális pozíciójában lesz beszúrva.
Vezérlőkódok beszúrása
Néha nem a dokumentum szövegét kell módosítani, hanem a struktúráját. Az Apache OpenOffice ehhez vezérlőkódokat biztosít. Ezeket a szövegbe lehet beszúrni, és módosítják annak struktúráját. A vezérlőkódok a com.sun.star.text.ControlCharacter állandócsoportban vannak definiálva. A következő vezérlőkódok állnak rendelkezésre az Apache OpenOffice-ban:
- PARAGRAPH_BREAK
- bekezdéstörés
- LINE_BREAK
- sortörés a bekezdésen belül.
- SOFT_HYPHEN
- lehetséges elválasztási pont
- HARD_HYPHEN
- kötelező elválasztási pont.
- HARD_SPACE
- védett szóköz, amely nem lesz széthúzva, sem összenyomva a sorkizárt szövegben.
A vezérlőkódok beszúrásához nem csak a kurzorra van szükség, hanem a hozzá tartozó dokumentumobjektumokra. A következő példa beszúr egy bekezdést a szöveg 20. karaktere után:
Dim Doc As Object
Dim Cursor As Object
Dim Proceed As Boolean
Doc = StarDesktop.CurrentComponent
Cursor = Doc.Text.createTextCursor
Cursor.goRight(20, False)
Doc.Text.insertControlCharacter(Cursor, _
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
A False (hamis) paraméter az insertControlCharacter metódus meghívásánál biztosítja, hogy a TextCursor által jelenleg kijelölt terület kijelölve maradjon a beszúrás után. Ha a True (igaz) paramétert adjuk át, akkor az insertControlCharacter lecseréli az aktuális szöveget.
Szövegrészek keresése
Sokszor előfordul, hogy egy adott szövegre kell rákeresni, és azt a szöveget szerkeszteni. Minden Apache OpenOffice-dokumentum biztosít egy speciális felületet erre a célra, amely a következőképpen működik: Keresés előtt létre kell hozni egy SearchDescriptor objektumot. Ez adja meg, mit keressen az Apache OpenOffice a dokumentumban. A SearchDescriptor egy olyan objektum, amely támogatja a com.sun.star.util.SearchDescriptor szolgáltatást, és a dokumentum createSearchDescriptor metódusával hozható létre:
Dim SearchDesc As Object
SearchDesc = Doc.createSearchDescriptor
Ha létrehoztuk a SearchDescriptor objektumot, akkor meg kell adni a keresendő szöveget:
SearchDesc.searchString="bármilyen szöveg"
A funkcióját tekintve a SearchDescriptor leginkább az Apache OpenOffice keresési párbeszédablakára hasonlít. A keresési ablakhoz hasonlóan a SearchDescriptor objektumnál is megadhatók a keresési feltételek.
A com.sun.star.util.SearchDescriptor szolgáltatás által biztosított tulajdonságok:
- SearchBackwards (logikai érték)
- visszafelé keres a szövegben.
- SearchCaseSensitive (logikai érték)
- megkülönbözteti a kis- és nagybetűket keresés közben.
- SearchRegularExpression (logikai érték)
- a keresendő szöveget reguláris kifejezésként kezeli.
- SearchStyles (logikai érték)
- megkeresi a szövegben a megadott bekezdéssablont.
- SearchWords (logikai érték)
- csak teljes szavakat keres.
Az Apache OpenOffice SearchSimilarity (vagy más néven „hasonlók keresése”) funkció is rendelkezésre áll az Apache OpenOffice programban. Ezzel a funkcióval az Apache OpenOffice olyan kifejezésre keres, amely hasonló, de nem pont azonos a keresési kifejezéssel. A hozzáadott, törölt és módosított karakterek száma a ezekben a kifejezésekben egyenként megadható. Az alábbiakban láthatók a com.sun.star.util.SearchDescriptor szolgáltatás ide tartozó tulajdonságai:
- SearchSimilarity (logikai érték)
- hasonló szavak keresése.
- SearchSimilarityAdd (rövid egész szám)
- karakterek száma, amelyek hozzáadhatók hasonló szavak keresésénél.
- SearchSimilarityExchange (rövid egész szám)
- karakterek száma, amelyek lecserélhetők hasonló szavak keresésénél.
- SearchSimilarityRemove (rövid egész szám)
- karakterek száma, amelyek eltávolíthatók hasonló szavak keresésénél.
- SearchSimilarityRelax (logikai érték)
- egyszerre vesz figyelembe minden eltérési szabályt hasonló szavak keresésénél.
Amint a SearchDescriptor megfelelően be van állítva, alkalmazható a következő dokumentumon. Az Apache OpenOffice-dokumentumok biztosítanak egy findFirst és egy findNext metódust ebből a célból:
Found = Doc.findFirst (SearchDesc)
Do While Found
' Keresési eredmények szerkesztése...
Found = Doc.findNext( Found.End, Search)
Loop
Ez a példaprogram egy ciklussal megkeres minden egyezést, és visszaad egy TextRange objektumot, amely a megtalált szövegre hivatkozik.
Példa: Hasonlóak keresése
A következő példa megkeresi a szövegben a „kutya” szót, és a találatokat félkövérre formázza. A program hasonló szavakat keres, ezért nem csak a „kutya” szót találja meg, hanem a „kutyák” és a „kutyus” szót is. A megtalált kifejezések két karakterrel térhetnek el a keresett kifejezéstől:
Dim SearchDesc As Object
Dim Doc As Object
Doc = StarDesktop.CurrentComponent
SearchDesc = Doc.createSearchDescriptor
SearchDesc.SearchString="kutya"
SearchDesc.SearchSimilarity = True
SearchDesc.SearchSimilarityAdd = 2
SearchDesc.SearchSimilarityExchange = 2
SearchDesc.SearchSimilarityRemove = 2
SearchDesc.SearchSimilarityRelax = False
Found = Doc.findFirst (SearchDesc)
Do While Found
Found.CharWeight = com.sun.star.awt.FontWeight.BOLD
Found = Doc.findNext( Found.End, Search)
Loop
Ahogy a régi Apache OpenOffice API-ban is, az új API-ban is a dokumentumobjektummal lehet a keresést és cserét végrehajtani. Míg előzőleg volt egy SearchSettings nevű objektum, főleg a keresési feltételek megadásához, addig az új objektumban a kereséseket a SearchDescriptor vagy a ReplaceDescriptor objektummal lehet végrehajtani az automatizált szövegcserénél. Ezek az objektumok nem csak a keresési lehetőségeket fedik le, hanem az aktuális szöveg keresését is, és amennyiben szükséges, a szöveg lecserélését is. A leíróobjektumokat a dokumentumobjektum használatával lehet létrehozni, ezután be kell állítani a megfelelő értékeiket, majd visszakerülnek paraméter formájában a dokumentumobjektumhoz a kereséshez.
Szövegrészek lecserélése
Akárcsak a keresési funkció, az Apache OpenOffice cserefunkciója is elérhető az Apache OpenOffice Basicben. A program a két funkciót azonosan kezeli. A cserénél is először létre kell hozni egy speciális objektumot, amely tartalmazza a megfelelő paramétereket. Ez az objektum a ReplaceDescriptor nevű objektum, amely támogatja a com.sun.star.util.ReplaceDescriptor szolgáltatást. A SearchDescriptor összes tulajdonsága, amelyet az előző bekezdésbe láthattunk, támogatott ReplaceDescriptor objektumban is. Például a cserénél a kis- és nagybetűk megkülönböztetését szintén ki és be lehet kapcsolni, és hasonló szavak keresése is végrehajtható.
A következő példa bemutatja a ReplaceDescriptors használatát egy Apache OpenOffice-dokumentumon belüli keresésnél.
Dim I As Long
Dim Doc As Object
Dim Replace As Object
Dim Nevek(5) As String
Dim Becenevek(5) As String
Nevek() = Array("András", "Bernadett", "Diána", "Márta", _
"Miklós", "Tamás")
Becenevek() = Array("Bandi", "Betti", "Dia", "Márti", _
"Miki", "Tomi")
Doc = StarDesktop.CurrentComponent
Replace = Doc.createReplaceDescriptor
For I = 0 To 5
Replace.SearchString = Nevek(I)
Replace.ReplaceString = Becenevek(I)
Doc.replaceAll(Replace)
Next I
A keresendő és cserélendő kifejezéseket a ReplaceDescriptors objektum SearchString és ReplaceString tulajdonságával lehet beállítani. A tényleges cserét végül a dokumentumobjektum replaceAll metódusával lehet végrehajtani, amely lecseréli a keresési kifejezés minden előfordulását.
Példa: szöveg keresése és cseréje reguláris kifejezésekkel
Az Apache OpenOffice cserefunkciója különösen hatékony tud lenni, ha reguláris kifejezésekkel használjuk. Ezekkel a kifejezésekkel rögzített érték helyett változó kifejezésekre kereshetünk, amelyek tartalmazhatnak helyettesítő karaktereket és speciális karaktereket.
Az Apache OpenOffice által támogatott reguláris kifejezések részletes leírása az Apache OpenOffice online súgójában található meg. Az alábbiakban láthatunk néhány példát:
- A keresési kifejezésen belül a pont bármilyen karaktert helyettesít. A m.tat kifejezés ezért lehet mutat és matat is.
- A ^ karakter a bekezdés elejét jelöli. A Miklós név minden előfordulása, amely a bekezdés elején található, megkereshető a ^Miklós kifejezéssel.
- A $ karakter a bekezdés végét jelöli. A Miklós név minden előfordulása, amely a bekezdés végén található, megkereshető a Miklós$ kifejezéssel.
- A * karakter azt jelzi, hogy az előtte álló karakter akárhányszor szerepelhet. Kombinálható a ponttal is, amely bármilyen karaktert helyettesít. A na.*i kifejezés megtalálja a napi és a nappali szót is.
A következő példa bemutatja, hogyan távolítható az összes üres sor egy szöveges dokumentumból a ^$ reguláris kifejezés használatával:
Dim Doc As Object
Dim Replace As Object
Dim I As Long
Doc = StarDesktop.CurrentComponent
Replace = Doc.createReplaceDescriptor
Replace.SearchRegularExpression = True
Replace.SearchString = "^$"
Replace.ReplaceString = ""
Doc.replaceAll(Replace)
Content on this page is licensed under the Public Documentation License (PDL). |