Szöveges dokumentumok szerkesztése

From Apache OpenOffice Wiki
Jump to: navigation, search
Book.png


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 OpenOffice.org 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 OpenOffice.org API-ban hasonló, mint az OpenOffice.org-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 OpenOffice.org Basic TextCursor objektumát nem szabad összetéveszteni a látható kurzorral. Ez két különböző dolog.

Documentation note.png A VBA-ban használt terminológiától való eltérések: A működését tekintve a VBA Range objektumához az OpenOffice.org TextCursor objektuma hasonlítható, és nem – bár a neve ezt sugallja – az OpenOffice.org Range objektuma.

Például az OpenOffice.org 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 OpenOffice.org TextCursor objektumának fenti VBA-függvényeknek megfelelő függvényei a következő részekben kerülnek ismertetésre.

Navigálás a szövegben

Az OpenOffice.org 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 OpenOffice.org 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 OpenOffice.org-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 OpenOffice.org-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 OpenOffice.org 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 OpenOffice.org 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 OpenOffice.org SearchSimilarity (vagy más néven „hasonlók keresése”) funkció is rendelkezésre áll az OpenOffice.org programban. Ezzel a funkcióval az OpenOffice.org 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 OpenOffice.org-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
Documentation note.png Az OpenOffice.org programban használt keresés alapjai hasonlóak a VBA-ban használt keresésével. Mindkét felület rendelkezésre bocsát egy objektumot, amelyen keresztül megadhatók a keresési és cserélési feltételek. Ezután ezt az objektumot lehet a kívánt szövegterületen alkalmazni a keresés végrehajtásához. De amíg a VBA-ban a szükséges külső objektumot a Range objektum Find metódusán keresztül lehet elérni, addig az OpenOffice.org programban a dokumentumobjektum createSearchDescriptor vagy createReplaceDescriptor metódusával lehet létrehozni azt. A keresési feltételek és metódusok is különbözőek.

Ahogy a régi OpenOffice.org 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 OpenOffice.org cserefunkciója is elérhető az OpenOffice.org 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 OpenOffice.org-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 OpenOffice.org 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 OpenOffice.org által támogatott reguláris kifejezések részletes leírása az OpenOffice.org 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).
Personal tools