Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Table of Contents

Find en Replace

Zelf heb ik deze veelvuldig gebruikt, erg handig als je een groot aantal pagina's hebt waarvoor hetzelfde stuk tekst moet vervangen voor iets anders (of verwijderen). Dit kan op 2 manieren. 

...

Ik heb manier 2 een aantal keer gebruikt om de functie en attribute beschrijvingen (80% van de wiki) van quick link bars te voorzien. In een bestand genaamd 'qlb_findReplaceQuickLink.txt' staat het volgende script: 

-a modifyPage --space "@space@" --title "@title@" --content "" --findReplaceRegex "(Quick).*?(links).*?(Function overview).*?(Attribute overview).*?(Constants overview).*?(Dimensions overview): " --noConvert
-a modifyPage --space "@space@" --title "@title@" --content "" --content2 "<links>" --noConvert

...

Dit script is te gebruiken voor vergelijkbare acties, alleen de title, space en regex moeten veranderd worden. Gebruik deze gigantisch handige webtool als je, net als ik, geen held  bent met regexgeen regexheld bent! Dit genereerd een regex die een opgegeven string matched. Houd er wel rekening mee dat dit geen 100% waterdichte methode is, er zijn verschillende soorten regex en het kan anders uitpakken dan gewenst. Let in elk geval op de volgende dingen in de CLI:

  • Als je op Windows zit en je wilt bijvoorbeeld $1 gebruiken om een replacement te doen, NIET de $ escapen. Als je op Unix zit, WEL de $ escapen. Zie dit topic: Using string replacement with CLI
  • Whitespace karakter (\s+) lijkt niet te werken, spatie ( ) lijkt wel te werken.
  • De meeste leestekens moeten escaped worden. Bijvoorbeeld de < en > moeten escaped worden. Dit geld alleen voor het linkerlid van de findReplaceRegex, want het rechterlid wordt al als string geintepreteerd!
Gebruik deze tool om je regex te testen. Let er wel op dat in sommige gevallen bepaalde karakters al dan niet escaped moeten worden

Voorbeeld Regex

Omdat we allemaal weten dat, zelfs met een keihandige tool als degene hierboven, het een gedoe is om een specifieke regex te maken ga ik in dit onderdeel een aantal regex neerzetten die ik heb gebruikt, met uitleg, zodat iedereen die bezig gaat met de CLI en vergelijkbare taken moet uitvoeren zoals ik bij de Quaestor documentatie in elk geval op dat vlak tijd kan besparen. Ik zal alle regex zo proberen uit te leggen dat iemand met beperkte kennis van regex er mee uit de voeten zou moeten kunnen.

Waarschuwing: de regex hier zijn niet uitgebreid getest. Gebruik deze alleen voor het opstellen van eigen regex, en test altijd in een apart artikel!

Attribute match regex

(?!@title@)(((@)+([A-Z0-9]*[_]*)+([\s+]?[\n]?)+))

Dit matched strings beginnend beginnende met @ met alleen maar hoofdletters of cijfers, al dan niet eindigend met een spatie of newline. Dit is gebruikt voor het toevoegen van links aan attributes. Dit matched @EEN_ATTRIBUUT en @EEN_ANDERE_ATTRIBUUT enzovoorts,  maar bijvoorbeeld niet @een_attribuut of @een_ATTRIBUUT

...

-a getPageSource --space "QUAESTOR" --title "Attributes" --file temp-page-source.txt
-a storePage --space "QUAESTOR" --title "Attributes" --file temp-page-source.txt --content "" --findReplaceRegex "(?!@title@)(((@)+([A-Z0-9]*[_]*)+([\s+]?[\n]?)+)):<a class="confluence-link" href=/display/QUAESTOR/$0>$0</a>" --noConvert

De match $0 wordt gebruikt om de links op te stellen. De artikels waarnaar gelinked moest worden hadden in dit geval dezelfde naam als hetgene wat ik wilde matchen. Houd dat in het achterhoofd als je deze regex wilt gebruiken voor een vergelijkbare taak. 

Probleem met deze aanpak

Tijdens het maken van deze regular expression en CLI script kwam een probleem naar voren, na het aanpassen van de links met het script veranderden de links automatisch als de pagina daarna weer werd aangepast. Een link /display/QUAESTOR/@LOCAL werd bijvoorbeeld veranderd in mce_host/display/QUAESTOR/@LOCAL. Het lijkt er op dat bij het opnieuw opslaan van de links de gegenereerde HTML van de links verkeerd wordt geintepreteerd. Een mogelijke oplossing was het toevoegen van http://mods.marin.nl/ aan de rest van de link, maar hierdoor werkte het script niet meer. Dit probleem staat in dit topic beschreven, alleen is er geen oplossing gevonden. Wel is hier gemakkelijk een hack voor te schrijven, want alleen de mce_host moet veranderd worden. Een modifyPage actie met --findReplace "mce_host:mods.marin.nl" werkt prima. 

Uitleg

Deze regex heeft in feite 3 bestaat uit 4 delen:

  • (?!@title@) geeft aan dat de match niet de title van het artikel mag zijn. De attributen met dezelfde naam als het artikel hoeven namelijk niet naar hetzelfde artikel gelinked te worden.

  • (@)+ geeft aan dat de match moet beginnen met een @, de + geeft aan dat er minimaal 1 moet inzitten. Dit zorgt er dus voor dat alleen de strings beginnende met @ worden gematched
  • ([A-Z0-9]*[_]*)+ geeft aan dat de match een minimaal 1 karaktergroep bevat waarin hoofdletters, cijfers en underscores kunnen voorkomen. de + geeft aan dat er 1 of meer van deze karaktergroep in de match moet voorkomen.

    • [A-Z0-9]* geeft aan dat er 0 of meer hoofdletters of cijfers in een karaktergroep moet zitten.
    • [_]* geeft aan dat er minimaal 0 of meer underscores in een karaktergroep moet zitten.  

 

 

 

 

  • ([\s+]?[\n]?) geeft aan dat de match aan het einde een spatie en newline KAN bevatten, maar dat hoeft niet. 

Problemen en Bugs

Aangezien de CLI een systeem in aanbouw is is het niet uitgesloten dat het volledig bug vrij is. In dit onderdeel zet ik de bugs en problemen neer die ik ben tegengekomen met daarbij mogelijke workarounds.

  • Regex quantifiers

Er lijkt een probleem te zijn met het gebruik van quantifiers in regex, De quantifiers * + en ? werken allemaal prima, maar zodra je {n}, {n,} of {n,n} gaat gebruiken werkt het ineens niet meer.