Tekstdocumenten bewerken

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


In het vorige gedeelte is al een groot scala aan opties besproken voor het bewerken van tekstdocumenten, geconcentreerd op de services com.sun.star.text.TextPortion en com.sun.star.text.Paragraph, welke toegang verlenen tot zowel de alinea's als de alinea-gedeelten. Deze services zijn nuttig voor toepassingen waarin de inhoud van een tekst moet worden bewerkt in één doorloop via een lus. Dit is echter voor veel problemen niet voldoende. Apache OpenOffice verschaft de service com.sun.star.text.TextCursor voor meer gecompliceerde taken, inclusief achterwaartse navigatie binnen een document of navigatie gebaseerd op zinnen en woorden in plaats van op TekstDelen.

De TextCursor

Een TextCursor in de API van Apache OpenOffice is te vergelijken met de zichtbare cursor die wordt gebruikt in een document van Apache OpenOffice. Het markeert een bepaald punt binnen een tekst en waar vandaan kan worden genavigeerd in diverse richtingen met behulp van opdrachten. De beschikbare objecten TextCursor in Apache OpenOffice BASIC moeten echter niet verward worden met de zichtbare cursor. Dit zijn twee heel verschillende dingen.

Documentation note.png VBA : Terminologie verschilt van die in VBA gebruikt wordt: In termen van bereik van functie kan het object Range van VBA worden vergeleken met het object TextCursor in Apache OpenOffice en niet – zoals de naam misschien suggereert– met het object Range in Apache OpenOffice.


Het object TextCursor in Apache OpenOffice, bijvoorbeeld, verschaft methoden om te navigeren en wijzigen van tekst die zijn opgenomen in het object Range in VBA (bijvoorbeeld, MoveStart, MoveEnd, InsertBefore, InsertAfter). De corresponderende onderdelen van het TextCursor object in Apache OpenOffice worden beschreven in het volgende gedeelte.

Navigeren binnen een tekst

Het object TextCursor in Apache OpenOffice BASIC werkt onafhankelijk van de zichtbare cursor in een tekstdocument. Een programma-gecontroleerde positie-verandering van een object TextCursor heeft geen enkel effect op de zichtbare cursor. Diverse objecten TextCursor kunnen zelfs geopend zijn voor hetzelfde document en gebruikt op verschillende posities, welke onafhankelijk van elkaar zijn.

Een object TextCursor wordt gemaakt met behulp van de aanroep createTextCursor:

Dim Doc As Object
Dim Cursor As Object
 
Doc = ThisComponent
Cursor = Doc.Text.createTextCursor()

Het op deze manier gemaakte object Cursor ondersteunt de service com.sun.star.text.TextCursor, welke op zijn beurt een groot scala aan methoden voor het navigeren binnen tekstdocumenten verschaft. Het volgende voorbeeld verplaatst eerst de TextCursor tien tekens naar links en dan drie tekens naar rechts:

Cursor.goLeft(10, False)
Cursor.goRight(3, False)

Een TextCursor kan een compleet gebied accentueren. Dit kan worden vergeleken met het accentueren van een punt in de tekst, met behulp van de muis. De parameter False in de vorige aanroep van de functie specificeert of het gebied waar de cursor zich over verplaatst, wordt geaccentueerd. Bijvoorbeeld, de TextCursor in het volgende voorbeeld

Cursor.goRight(10, False)
Cursor.goLeft(3, True)

verplaatst eerst tien tekens naar links zonder accentuering en gaat dan drie tekens terug en accentueert dat. Het geaccentueerde gebied door de TextCursor begint daarom na het zevende teken in de tekst en eindigt na het tiende teken.

Hier zijn de centrale methoden die de service com.sun.star.text.TextCursor verschaft voor navigatie:

goLeft (Aantal, Uitgebreid)
springt Aantal tekens naar links.
goRight (Aantal, Uitgebreid)
springt Aantal tekens naar rechts.
gotoStart (Uitgebreid)
springt naar het begin van het tekstdocument.
gotoEnd (Uitgebreid)
springt naar het einde van het tekstdocument.
gotoRange (TekstBereik, Uitgebreid)
springt naar het opgegeven object TekstBereik.
gotoStartOfWord (Uitgebreid)
springt naar het begin van het huidige woord.
gotoEndOfWord (Uitgebreid)
springt naar het einde van het huidige woord.
gotoNextWord (Uitgebreid)
springt naar het begin van het volgende woord.
gotoPreviousWord (Uitgebreid)
springt naar het begin van het vorige woord.
isStartOfWord ()
geeft True terug als de TextCursor aan het begin van een woord staat.
isEndOfWord ()
geeft True terug als de TextCursor aan het einde van een woord staat.
gotoStartOfSentence (Uitgebreid)
springt naar het begin van de huidige zin.
gotoEndOfSentence (Uitgebreid)
springt naar het einde van de huidige zin.
gotoNextSentence (Uitgebreid)
springt naar het begin van de volgende zin.
gotoPreviousSentence (Uitgebreid)
springt naar het begin van de vorige zin.
isStartOfSentence ()
geeft True terug als de TextCursor aan het begin van een zin staat.
isEndOfSentence ()
geeft True als de TextCursor aan het einde van een zin staat.
gotoStartOfParagraph (Uitgebreid)
springt naar het begin van de huidige alinea.
gotoEndOfParagraph (Uitgebreid)
springt naar het einde van de huidige alinea.
gotoNextParagraph (Uitgebreid)
springt naar het begin van de volgende alinea.
gotoPreviousParagraph (Uitgebreid)
springt naar het begin van de vorige alinea.
isStartOfParagraph ()
geeft True terug als de TextCursor aan het begin van een alinea staat.
isEndOfParagraph ()
geeft True terug als de TextCursor aan het einde van een alinea staat.

De tekst wordt onderverdeeld in zinnen op basis van de symbolen voor zinnen. Punten worden bijvoorbeeld geïnterpreteerd als symbolen die het einde van zinnen aanduiden. (In het Engels, ten minste, moeten zij worden gevolgd door een spatie, tab of return om dit te laten werken.)

De parameter Expand is een Booleaanse waarde die specificeert of het gebied dat wordt gepasseerd tijdens het navigeren moet worden geaccentueerd. Alle methoden voor navigatie geven verder een parameter met Booleaanse waarde weer die aangeeft of de navigatie succesvol was of dat de actie werd beëindigd door gebrek aan tekst. Het volgende is een lijst van verschillende methoden voor het bewerken van geaccentueerde gebieden met behulp van een TextCursor en die tevens de service com.sun.star.text.TextCursor ondersteunen:

collapseToStart ()
herstelt het accentueren en plaatst de TextCursor aan het begin van het eerder geaccentueerde gebied.
collapseToEnd ()
herstelt het accentueren en plaatst de TextCursor aan het einde van het eerder geaccentueerde gebied.
isCollapsed ()
geeft True terug als de TextCursor momenteel geen accentuering bevat.

Opmaken van Tekst met TextCursor

De service com.sun.star.text.TextCursor ondersteunt alle teken- en alinea-eigenschappen die werden gepresenteerd aan het begin van dit hoofdstuk.

Het volgende voorbeeld toont hoe deze kunnen worden gebruikt in samenwerking met een TextCursor. Het gaat door een compleet document en maakt het eerste woord van elke zin op als type Vet.

Dim Doc As Object   
Dim Cursor As Object
Dim Doorgaan As Boolean
 
Doc = ThisComponent
Cursor = Doc.Text.createTextCursor
 
Do 
  Cursor.gotoEndOfWord(True)
  Cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD
  Doorgaan = Cursor.gotoNextSentence(False)
  Cursor.gotoNextWord(False)
Loop While Doorgaan

Het voorbeeld maakt eerst een documentobject voor de tekst die zojuist geopend werd. Dan doorloopt het de gehele tekst, zin na zin, en accentueert elk eerste woord en maakt dat op in Vet.

Terugvinden en wijzigen van de inhoud van tekst

Als een TextCursor een geaccentueerd gebied bevat, dan is deze tekst beschikbaar door middel van de eigenschap String van het object TextCursor. Het volgende voorbeeld gebruikt de eigenschap String om het eerste woord van een zin in een berichtenvenster weer te geven:

Dim Doc As Object   
Dim Cursor As Object
Dim Doorgaan As Boolean
 
Doc = ThisComponent
Cursor = Doc.Text.createTextCursor
 
Do 
  Cursor.gotoEndOfWord(True)
  MsgBox Cursor.String
  Doorgaan = Cursor.gotoNextSentence(False)
  Cursor.gotoNextWord(False)
Loop While Doorgaan

Het eerste woord van elke zin kan op dezelfde manier worden gewijzigd met behulp van de eigenschap String:

Dim Doc As Object   
Dim Cursor As Object
Dim Doorgaan As Boolean
 
Doc = ThisComponent
Cursor = Doc.Text.createTextCursor
 
Do 
  Cursor.gotoEndOfWord(True)
  Cursor.String = "Oeps"
  Proceed = Cursor.gotoNextSentence(False)
  Cursor.gotoNextWord(False)
Loop While Doorgaan

Als de TextCursor een geaccentueerd gebied bevat, vervangt een toewijzing aan de eigenschap String hierdoor de oude tekst. Als er geen geaccentueerd gebied is, wordt de tekst ingevoegd op de huidige positie van TextCursor.

Invoegen van codes voor beheer

In sommige situaties is het niet de echte tekst, maar meer de structuur die aangepast moet worden. Apache OpenOffice verschaft voor dit doel codes voor beheer. Deze worden ingevoegd in de tekst en beïnvloeden diens structuur. De codes voor beheer worden gedefinieerd in de groep van constanten com.sun.star.text.ControlCharacter. De volgende codes voor beheer zijn beschikbaar in Apache OpenOffice:

PARAGRAPH_BREAK
alineaeinde.
LINE_BREAK
regeleinde binnen een alinea.
SOFT_HYPHEN
mogelijk punt voor afbreken van woord.
HARD_HYPHEN
verplicht punt voor afbreken van woord.
HARD_SPACE
beveiligde spatie die niet wordt uitgestrekt of gecomprimeerd in uitgevulde tekst.

U heeft niet alleen de cursor, maar ook de geassocieerde tekst-objecten nodig om codes voor beheer in te kunnen voegen. Het volgende voorbeeld voegt een alinea in na het 20e teken van een tekst:

Dim Doc As Object   
Dim Cursor As Object
Dim Doorgaan As Boolean
 
Doc = ThisComponent
Cursor = Doc.Text.createTextCursor
Cursor.goRight(20, False)
Doc.Text.insertControlCharacter(Cursor, _
    com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)

De parameter False in de aanroep van de methode insertControlCharacter zorgt er voor dat het huidige door de TextCursor geaccentueerde gebied blijft behouden na het invoegen. Als hier de parameter True wordt gebruikt, dan vervangt insertControlCharacter de huidige tekst.

Zoeken naar gedeelten van de tekst

In veel gevallen is het zo dat een tekst moet worden doorzocht naar een bepaalde term om op dat bepaalde punt te worden bewerkt. Alle documenten van Apache OpenOfficeverschaffen een speciale interface voor dat doel en deze interface functioneert altijd overeenkomstig hetzelfde principe: Voordat een zoekactie, die gewoonlijk wordt aangeduid als SearchDescriptor kan plaatsvinden, moet die eerst worden gemaakt. Deze definieert waarnaar Apache OpenOffice moet zoeken in een document. Een SearchDescriptor is een object dat de service com.sun.star.util.SearchDescriptor ondersteund en kan worden gemaakt door middel van de methode createSearchDescriptor van een document:

Dim SearchDesc As Object
SearchDesc = Doc.createSearchDescriptor

Als de SearchDescriptor eenmaal is gemaakt, ontvangt het de tekst die moet worden doorzocht:

SearchDesc.searchString="elke tekst"

Met betrekking tot zijn functie kan de SearchDescriptor het best worden vergeleken met het dialoogvenster Zoeken uit Apache OpenOffice. Op eenzelfde manier als in het venster Zoeken, kunnen de instellingen voor de zoekactie worden ingesteld in het object SearchDescriptor.

De eigenschappen worden verschaft door de service com.sun.star.util.SearchDescriptor:

SearchBackwards (Boolean)
zoekt achterwaarts dor de tekst in plaats van naar voren.
SearchCaseSensitive (Boolean)
houdt rekening met hoofd- en kleine letters tijdens het zoeken.
SearchRegularExpression (Boolean)
behandelt de zoekuitdrukking als een reguliere uitdrukking.
SearchStyles (Boolean)
zoekt door de tekst naar het gespecificeerde alineaopmaakprofiel.
SearchWords (Boolean)
zoekt alleen naar hele woorden.

De functie SearchSimilarity (of “vage overeenkomst”) van Apache OpenOffice is ook beschikbaar in Apache OpenOffice BASIC. Met deze functie, zoekt Apache OpenOffice naar een uitdrukking die overeenkomt, maar niet geheel gelijk is aan de zoek-uitdrukking. Het aantal toegevoegde, weggelaten of aangepaste tekens voor deze uitdrukking kan individueel worden gedefinieerd. Hier zijn de geassocieerde eigenschappen van de service com.sun.star.util.SearchDescriptor:

SearchSimilarity (Boolean)
voert een zoekactie naar overeenkomsten uit.
SearchSimilarityAdd (Short)
aantal tekens dat mag worden toegevoegd voor een zoekactie op overeenkomsten.
SearchSimilarityExchange (Short)
aantal tekens dat mag worden vervangen als deel van een zoekactie op overeenkomsten.
SearchSimilarityRemove (Short)
aantal tekens dat mag worden verwijderd als deel van een zoekactie op overeenkomsten.
SearchSimilarityRelax (Boolean)
houdt gelijktijdig rekening met alle afwijkende regels voor de zoekuitdrukking.

Als de SearchDescriptor eenmaal is voorbereid zoals gewenst, kan hij worden toegepast op het tekstdocument. De documenten van Apache OpenOffice verschaffen de methoden findFirst en findNext voor dit doel:

Gevonden = Doc.findFirst (SearchDesc)
 
Do Until IsNull(Gevonden)
  ' Bewerk de resultaten van de zoekactie...
  Gevonden = Doc.findNext(Gevonden.End, SearchDesc)
Loop

Het voorbeeld vindt alle overeenkomsten in een lus en geeft een object TextRange weer, dat refereert aan de gevonden passage in de tekst.

Voorbeeld: zoekactie naar overeenkomsten

Dit voorbeeld toont hoe een tekst kan worden doorzocht naar het woord “verandering” en het resultaat opgemaakt als type Vet. Een zoekactie naar overeenkomsten wordt gebruikt zodat niet alleen het woord “verandering”, maar ook de meervoudsvorm "veranderingen" en vervoegingen zoals "verandering's" worden gevonden. De gevonden uitdrukkingen verschillen tot maximaal twee letters van de zoek-uitdrukking:

Dim SearchDesc As Object
Dim Doc As Object
 
Doc = ThisComponent
SearchDesc = Doc.createSearchDescriptor
SearchDesc.SearchString="verandering"
SearchDesc.SearchSimilarity = True
SearchDesc.SearchSimilarityAdd = 2
SearchDesc.SearchSimilarityExchange = 2
SearchDesc.SearchSimilarityRemove = 2
SearchDesc.SearchSimilarityRelax = False
Found = Doc.findFirst (SearchDesc)
 
Do Until IsNull(Gevonden)
  Gevonden.CharWeight = com.sun.star.awt.FontWeight.BOLD
  Gevonden = Doc.findNext(Gevonden.End, SearchDesc)
Loop
Documentation note.png VBA : Het basisidee van Zoeken & Vervangen in Apache OpenOffice is vergelijkbaar met die welke wordt gebruikt in VBA. Beide interfaces verschaffen u een object, waardoor de eigenschappen voor zoeken en vervangen kunnen worden gedefinieerd. Dit object wordt dan toegepast op het gewenste tekstgebied om de actie uit te voeren. Waar het verantwoordelijke hulp-object in VBA kan worden benaderd door de eigenschap Find van het object Range, in Apache OpenOffice BASIC wordt het gemaakt door de aanroep createSearchDescriptor of createReplaceDescriptor van het document-object. Zelfs de beschikbare zoek-eigenschappen en methoden verschillen.


Zoals in de oude API van Apache OpenOffice wordt zoeken en vervangen van tekst in de nieuwe API ook uitgevoerd met behulp van het documentobject. Waar er eerder een object, genaamd SearchSettings, was, speciaal voor het definiëren van de zoekopties, worden in het nieuwe object zoekacties nu uitgevoerd met behulp van een object SearchDescriptor of ReplaceDescriptor voor automatische vervanging van tekst. Deze objecten hebben niet alleen betrekking op de opties, maar ook de huidige zoektekst en, indien nodig, de vervanging van de geassocieerde tekst. De objecten Descriptor worden gemaakt met behulp van het documentobject, gecompleteerd overeenkomstig de relevante verzoeken en dan terug getransporteerd naar het document-object als parameters voor de zoekmethoden.

Vervangen van gedeelten van de tekst

Net als met de functie Zoeken, is ook de functie Vervangen van Apache OpenOffice beschikbaar in Apache OpenOffice BASIC. De twee functies worden identiek afgehandeld. Een speciaal object dat de parameters opneemt voor de actie is ook eerst nodig vóór de vervangings-actie. Het wordt een ReplaceDescriptor genoemd en ondersteunt de service com.sun.star.util.ReplaceDescriptor. Al de eigenschappen van de SearchDescriptor die werden beschreven in de voorgaande alinea worden ook ondersteund door de ReplaceDescriptor. Bijvoorbeeld: gedurende een actie Vervangen kan de gevoeligheid voor Hoofd-/kleine letters worden geactiveerd en gedeactiveerd en kunnen zoekacties naar overeenkomsten worden uitgevoerd. Het volgende voorbeeld demonstreert het gebruik van ReplaceDescriptors voor een zoekactie binnen een document van Apache OpenOffice.

Dim I As Long
Dim Doc As Object
Dim Vervangen As Object
Dim BritseWoorden(5) As String
Dim USAWoorden(5) As String
 
BritseWoorden() = Array("colour", "neighbour", "centre", "behaviour", _
   "metre", "through")
USAWoorden() = Array("color", "neighbor", "center", "behavior", _
   "meter", "thru")
 
Doc = ThisComponent
Vervangen = Doc.createReplaceDescriptor
 
For I = 0 To 5
  Vervangen.SearchString = BritseWoorden(I)
  Vervangen.ReplaceString = USAWoorden(I)
  Doc.replaceAll(Vervangen)
Next I

De uitdrukkingen voor Zoeken & Vervangen worden ingesteld met behulp van de eigenschappen SearchString en ReplaceString van de ReplaceDescriptors. Het echte vervangingsproces wordt uiteindelijk doorgevoerd met behulp van de methode replaceAll van het documentobject, dat alle voorkomende zoekuitdrukkingen vervangt.

Voorbeeld: zoeken en vervangen van tekst met reguliere uitdrikkingen

De functie Vervangen van Apache OpenOffice is in het bijzonder effectief indien gebruikt in samenhang met de reguliere uitdrukkingen. Deze verschaffen de mogelijkheid om een variabele zoek-uitdrukking te definiëren met jokertekens (plaatsvervangers) en speciale tekens in plaats van een vaste waarde.

De reguliere expressies ondersteunt door Apache OpenOffice worden in detail beschreven in het gedeelte van de online Help voor Apache OpenOffice. Hier zijn een paar voorbeelden:

  • Een punt binnen een zoekuitdrukking staat voor elk teken. De zoekuitdrukking sh.rt kan derhalve zowel staan voor shirt als voor short.
  • Het teken ^ markeert het begin van een alinea. Alle keren dat de naam Peter voorkomt aan het begin van een alinea kunnen daarom worden gevonden met behulp van de zoekuitdrukking ^Peter.
  • Het teken $ markeert een einde van een alinea. Alle keren dat de naam Peter voorkomt aan het einde van een alinea kunnen daarom worden gevonden met behulp van de zoekuitdrukking Peter$.
  • Een * geeft aan dat het voorafgaande teken een onbepaald aantal keren mag voorkomen. Het kan worden gecombineerd met de punt als een plaatsvervanger voor elk teken. De uitdrukking temper.*e, kan dus, bijvoorbeeld, de uitdrukkingen temperance en temperature betekenen.

Het volgende voorbeeld toont hoe alle lege regels in een tekstdocument kunnen worden verwijderd met behulp van de reguliere uitdrukking ^$:

Dim Doc As Object
Dim Vervangen As Object
Dim I As Long
 
Doc = ThisComponent
Vervangen = Doc.createReplaceDescriptor
Vervangen.SearchRegularExpression = True
Vervangen.SearchString = "^$"
Vervangen.ReplaceString = ""
 
Doc.replaceAll(Vervangen)


Content on this page is licensed under the Public Documentation License (PDL).
Personal tools