7. Brocade Template Systeem

7.1. Wat is een template systeem ?

Een template systeem is een handige manier om stukken output tekst (de doeltekst) van een computerprogramma te genereren. In plaats van elk karakter door de software te laten aanmaken, wordt gebruik gemaakt van een sjabloon (brontekst) dat al zo goed mogelijk de doeltekst benadert.

De software beperkt er zich verder toe om de variabele delen (de placeholders) aan te bieden aan het template system dat dan de placeholders op passende wijze invult.

Het template systeem kan echter nog verder gaan: geheel volgende principes van MVC (model-view-controller principe) kan het template systeem een aantal elementen isoleren die eerder thuis horen in view dan in model.

Daartoe gebruikt het template systeem het concept van modifiers: deze zijn aanwijzingen hoe er met de placeholders - de data in het algemeen - moet worden omgegaan.

Een voorbeeld om dit te illustreren. dead is een placeholder, date is een modifier.

Whitney Elizabeth Houston stierf op ${dead | date}

Heeft de placeholder dead de waarde 20120211 (ISO notatie), dan zal dit in België worden getoond als:

Whitney Elizabeth Houston stierf op 22.02.2012

In Zuid-Africa staat er:

Whitney Elizabeth Houston stierf op 2012-02-22

Dit betekent nog dat een template systeem het ontwikkelproces transparanter maakt: de code wordt niet meer ‘bezoedeld’ door allerlei data manipulaties die niets te maken hebben met de logica van het probleem maar die gewoon bedoeld zijn om de display (het HTML gedeelte) in orde te krijgen.

In het werken met een template zijn er 2 momenten belangrijk:

  1. Het ogenblik dat de template wordt opgesteld.
  2. Het moment dat de template wordt toegepast.

Het verschil is essentieel: op het eerste tijdstip weet de ontwerper wel degelijk welke placeholders er aan de orde gaan zijn. Hij kent echter de preciese waarden nog niet. Deze worden door de software aangereikt op het ogenblik dat de template gaat worden gebruikt.

Het ogenblik van ontwerp is nog voor een andere reden belangrijk: de brontekst kan dan worden omgezet in een computer-efficiënte vorm (het compileren van de template).

Notitie

Hoewel er faciliteiten voorzien zijn voor het compileren is het aan te raden om niet te compileren. Deze, wat merkwaardige uitspraak, wordt verklaard door het ingebouwde caching-systeem dat er voor zorgt dat de templates on-the-fly worden gecompileerd.

7.2. Werkmodes in BTS

Het Brocade Template System (BTS) kan worden gebruikt in drie verschillende werkmodes:

In xfile-mode staat elke placeholder voor precies 1 waarde en deze waarde kan ook voortdurend worden hergebruikt. M.a.w. een placeholder staat voor een vaste waarde. In xfile mode gedraagt BTS zich als een heuse programmeertaal: zo zijn er diverse controle faciliteiten. De brontekst kan complex zijn en zelf gebruik maken van andere sjablonen (vergelijk met subroutines). xfile-mode wordt gebruikt in het ontwikkelproces: de formats in de x-files zijn templates, de m-files reiken de placeholders aan.

In meta-mode ligt de complexiteit niet zozeer bij het sjabloon. In meta-mode schittert BTS vooral in het gebruik van de placeholders. Deze mogen multiple van aard zijn en BTS voorziet in allerlei faciliteiten om hiermee om te gaan (m.a.w. de placeholders staan voor verschillende waarden, elke waarde wordt slechts éénmaal gebruikt). In deze mode worden templates gebruikt om een specifieke display te realiseren. Voorbeelden hiervan zijn het tonen van gegevens uit objecten en archieven. In Brocade werd daar tot nu toe een adhoc oplossing voor gebruikt: met BTS bieden we een krachtig, uniform systeem aan.

Tenslotte is er ook de auto-mode. Deze mode wordt bepaald door de placeholders. auto-mode gedraagt zich zoals xfile-mode tenzij er een sleutel is met meerdere waarden (of die wordt klaargezet voor meerdere waarden). In dat geval gedraagt de template zich in meta-mode.

Ietwat kort door de bocht kunen we stellen:

  • Complexe sjablonen werken in xfile-mode: het zijn vooral ontwikkelaars die hier mee werken.
  • Complexe placeholders werken in meta-mode: het zijn vooral beheerders van meta-informatie die hiermee aan de slag gaan.

Notitie

Deze mode, waarin een template wordt gebruikt, kan expliciet worden bepaald bij het uitvoeren van de template.

7.3. S-expressions

Aan de basis van templates luggen S-expressions.

Een S-expression is een eenvoudige boomstructuur die sequentieel kan worden voorgesteld in een geneste structuur met behulp van 2 delimiters { en }: de start delimiter { voegt een niveau toe aan de boomstructuur, de overeenkomende } sluit dit niveau af.

Een voorbeeld om dit toe te lichten:

A{B{C}{D{E}}}F

is de sequentiele representatie van:

  • A

  • {B{C}{D{E}}}

    • B

    • {C}

      • C
    • {D{E}}

      • D

      • {E}

        • E
  • F

De diepte van de S-expressie kan worden berekend als volgt: start met 0, scan van links naar rechts, increment als je een { vindt, decrement als je een } vindt. Het eindresultaat is de diepte.

Een subexpressie is elke deelstring die begint met { en eindigt met zijn corresponderende }. Een subexpressie is ook een S-expressie.

Elke subexpressie kan een parent hebben: beschouw de verzameling van alle subexpressies die ook de { van onze subexpressie bevatten maar wel verschillend zijn van onze subexpressie. Is deze verzameling niet leeg, dan is er een parent. Het is de kortste string uit deze verzameling.

7.4. Templates

Een template is een S-expressie met als delimiters { en } en karakters uit de Brocade karakterset. Dit betekent nog dat alle karakters geldige ISO-Latin-1 karakters zijn. Van zodra er een karakter opduikt dat niet ISO-Latin-1 is, dan is ook de template ongeldig en is het resultaat onvoorspelbaar.

De woorden ‘sjabloon’ en ‘template’ zijn synoniemen en worden in deze tekst door elkaar gebruikt.

Placeholders kunnen ondermeer worden ingeleid door ${ en eindigen met }. BTS heeft geen probleem met het dubbel gebruik van { en }.

Ook placeholders kunnen een parent hebben: het is de kortste subexpressie die de placeholder omvat.

In xfile mode is de diepte onbeperkt, in meta-mode is de diepte maximaal 1.

Elke subexpressie kan worden voorzien van modifiers.

Deze werken net zoals bij placeholders (zie verder):

  • Ze worden ingeleid door | en strekken zich uit tot de laatste }
  • Ze vormen een ketting van instructies die de reeds berekende waarde (de input) transformeren.
  • ze kunnen - net zoals bij placeholders - worden gebruikt om de parent van de subexpressie te vernietigen.

7.5. Speciale karakters in een template

In een template hebben sommige karakters een speciale betekenis.

Een overzicht:

  • { kan worden gebruikt om een subexpressie in te leiden, of, in de combinatie ${ om een placeholder te beginnen.
  • } kan worden gebruikt om een subexpressie of een placeholder af te sluiten
  • $ leidt de naam van een placeholder in. Deze placeholders kunnen zowel statisch als dynamisch zijn.
  • % leidt een eenvoudige placeholdernaam in.
  • \ is het escape karakter: door speciale karakters te prefixen met \ verliezen deze hun speciale betekenis.
  • | leidt een modifier in
  • @ leidt de naam in van een andere template
  • # in meta mode staat voor de index van de controlerende placeholder.
  • ! markeert een placeholder of subexpressie als _controlerend_ (kan de paent vernietigen)
  • ~ staat voor het negatie symbool in logische uitdrukkingen
  • . staat voor het verbindingskarakter tussen namespace en tekstfragment
  • ? eindigt een testpatroon.

Een eenvoudig voorbeeld:

Dat boek kost 34\$

7.6. BTS invoceren in Brocade

Het werken met templates in Brocade wordt herleid tot het werken met een macro:

macro tplResolve($result, $template, $keys=MAfkeys, $lg="", $mode="auto", $defmods="", $store="", $undef=0, $id=""):
    '''
    $editfile: /universe/stdlib/template.d
    $synopsis:  Vul een template met de placeholders
    $result: Resultaat
    $template: template in string vorm of in gecompileerde vorm
               Dit kan dus zowel een string als een array zijn.
               Indien de subscript ".tpl" NIET bestaat, dan gaat de macro er van uit
               dat het om een niet gecompileerde template gaat en wordt de string
               eerst nog gecompileerd.
    $keys: Array met de sleutels.
           De eerste subscript is steeds een sleutel.
           In xfile-mode:
              de waarde voor de sleutel staat in het rechterlid
           In meta-mode:
              heeft een sleutel slechts 1 waarde, dan mag deze in het rechterlid staan
              heeft een sleutel meerdere waarden, dan bestaat er een 2e subscript,
              de waarde staat nog steeds in het rechterlid.
           OPGELET!
              Indien er een sleutel "__templateng__" bestaat,
              dan wordt m4_template uitgevoerd!
    $lg: Taal (N | E | D | F | U)
    $mode: xfile | meta | auto
    $defmods: default modfiers voor de dynamische variabelen
    $store: global reference. Verwijst naar @formats in xfile mode
    $undef: 1 (enkel de sleutels worden bekeken, ontbrekende waarden worden op leeg gezet)
    $id: Identificatie van de template
    $example: m4_tplResolve(RDresult, "$street{ $nr}{ $bus}{ $city}", RAadres)
    '''

    «k MAfkeys s $result=$$%Build^uststmpl(.$template,$lg,.$keys,$mode,$defmods,$store,$undef,$id)»

Een voorbeeld in M code:

GT.M>s RAkeys("money")=12

GT.M>r Template
Dat boek kost $money\$
GT.M>m4_tplResolve(RDresult, Template, RAkeys)

GT.M>w RDresult
Dat boek kost 12$
GT.M>

7.7. Placeholders

Placeholders vormen, samen met het sjabloon, het belangrijkste onderdeel van de template: ze zijn verantwoordelijk voor het dynamische element van het BTS (Brocade Template System).

Een placeholder bestaat uit 2 elementen:

  • een naam
  • waarde(n)

De naam vinden we terug in het sjabloon en wordt uiteindelijk vervangen door de waarde(n).

Placeholders beginnen steeds met één van de volgende karakters $, % of @.

Er bestaan 5 soorten placeholders. Deze worden herkend door de context waarin ze worden gebruikt. In de volgende opsommingen wordt er veelvuldig gebruik gemaakt van het concept modifier. Dit zijn eenvoudige transformaties op de waarde. Later wordt dit concept uitvoerig behandeld.

  1. Placeholders die beginnen met een % hebben de eenvoudigste structuur: de naam van de placeholder wordt gevormd door alle aansluitende karakters in [a-zA-Z0-9]. Dit zijn steeds dynamische placeholders: hun waarden zijn pas gekend op het ogenblik dat het sjabloon wordt toegepast en niet op het ogenblik van compilatie. % wordt enkel in x-file mode gebruikt. Het is handig gebruiken in subscripts. Modifiers (zie verder) zijn niet mogelijk.

    Een voorbeeld:

    De auteur heet %author, zijn web pagina is %url
    
  2. Placeholders die beginnen met een $. of ${.. Dit zijn codes die verwijzen naar een term uit een l-file. De placeholder kan dus tijdens compile-time/evocatie-time worden vervangen in de passende taal. Het begin-punt wordt vanzelfsprekend weggelaten. Als de placeholder begint met $., dan slorpt deze alle karakters op uit [a-zA-Z0-9_]. Begint hij met ${., dan eindigt hij bij de corresponderende }.

    Voorbeelden:

    $.title
    
    ${.title and author}
    
  3. Placeholders die beginnen met $ of ${ en middenin een . bevatten. Het gedeelte voor de ‘.’ wordt gezien als een namespace, het gedeelte achter het ‘.’ wordt geïnterpreteerd als een tekstfragment binnen deze namespace. Ook in dit geval kan de placeholder tijdens compile-time worden vervangen in de passende taal.

    Voorbeelden:

    $lh.iconografie
    
    ${lh.icongrafie | xml}
    
  4. Placeholders die met $ of ${ beginnen, maar geen . bevatten. De waarde voor deze placeholders wordt bepaald tijdens de evocatie van de template. Deze waarde kan NIET worden ingevuld tijdens de compile-time. We noemen deze dan ook dynamische placeholders. Als de placeholder begint met $, dan slorpt deze alle karakters op uit [a-zA-Z0-9_]. Begint hij met ${, dan eindigt hij bij de corresponderende }.

  5. Placeholders die beginnen met een @. Dit is enkel van toepassing in xfile-mode: de placeholder is de identifier voor een andere template. Deze wordt berekend (met dezelfde sleutels) en de placeholder wordt dan vervangen door deze waarde. Merk op: de delimiter @ is onderdeel van de naam! (dit in tegenstelling met $ en ${).

In de eerste vier gevallen worden placeholders steeds voorafgegaan door een %, $ of door ${. Worden ze voorafgegaan door een $ dan eindigen hun namen met het laatste karakter dat behoort tot a-z, A-Z, 0-9 of _, .. In xfile-mode komt daar ook nog % en ? bij.

Een placeholder laten voorafgaan door ${ heeft 3 voordelen:

  1. Placeholders hoeven dan niet te eindigen met een karakter zoals zonet gespecificeerd: de placeholder strekt zich uit tot het eerste speciaal karakter (| of }).
  2. Placeholders hoeven niet alle zonet gespecificeerde karakters op te slorpen.
  3. Placeholders kunnen dan hun eigen modifiers hebben (zie de paragraaf over modifiers)

Placeholdernamen worden steeds whitespace gestript (zowel links als rechts).

Voorbeelden:

Een $var in een template

Een ${ var } in een template

Een ${var | lower} in een template

Het boek kost ${price}EUR

${.selecteer nummertype}

${lhisad.aantekening | capitalize}

${FDdata_name_%nr_fn}

@first?opentable

@closetable

Ook placeholders kunnen binnen een template een parent hebben: het is de kortste subexpressie die de placeholder omvat.

7.8. Gecontroleerde subexpressies

Subexpressies en dynamische placeholders kunnen hun parent controleren. Dit betekent dat ze een vernietigende werking hebben op de parent: is de placeholder of de subexpressie leeg, dan wordt ook de parent leeg.

In meta mode wordt elke subexpressie, die een dynamische placeholder bevat, gecontroleerd:

  • staat er slechts 1 dynamische placeholder in de subexpressie, dan controleert deze meteen de subexpressie
  • staan er meerdere dynamische placeholders, dan is dit de eerste ofwel de laatste waarvan de naam eindigt op een !.

In xfile mode moeten dynamische placeholders expliciet met een ! worden gekenmerkt opdat ze controlerend zouden zijn. Ook subexpressies kunnen hun parent controleren (met behulp van de ! modifier)

7.9. Vervangen van placeholders

Statische placeholders worden tijdens compile time vervangen.

Dynamische placeholders worden tijdens het toepassen van de template vervangen.

In xfile mode is dit het eenvoudigst: de waarde wordt berekend (zie de werking van de evaluator) en ingevoegd in de subexpressie. Soms zijn er neveneffecten (zoals bij toepassing van de !, exec, key ... modifiers)

In meta mode is de situatie een stuk complexer: BTS wil inspelen op de meervoudige waarden voor de placeholder naam.

Om dit uit te leggen, definiëren we de sleutelset als de array die de placeholdernaam verbindt met de waarde. Aangezien er meerdere waarden voor 1 placeholdernaam toegelaten zijn, kan de sleutelset 2 niveau’s van subscripts bevatten:

  • het eerste niveau is de placeholdernaam
  • het tweede niveau is gesorteerd, en levert in volgorde de waarden op in het rechterlid: vb. PAkeys(“fn”,1)=”Philips”,PAkeys(“fn”,2)=”Corthouts”. Is er geen 2e niveau, dan wordt dit automatisch gecreëerd: PAkeys(“fn”)=”Philips” wordt PAkeys(“fn”,1)=”Philips”

Hoe deze sleutels worden gebruikt in meta-mode is vrij complex maar biedt de mogelijkheid om geavanceerde templates uit te bouwen met multiple waarden per placeholder.

  • Zijn er evenveel placeholders met dezelfde naam in de template als er ingangen in de sleutelset zijn, dan worden deze 1-op-1 (van links naar rechts) vervangen.

    GT.M>k RAkeys
    
    GT.M>s RAkeys("fn",1)="Philips"
    
    GT.M>s RAkeys("fn",2)="Corthouts"
    
    GT.M>r Template
    $fn{ en $fn}
    GT.M>m4_tplResolve(result, Template, RAkeys, mode="meta")
    
    GT.M>w result
    Philips en Corthouts
    GT.M>
    
  • Zijn er in de template meer controlerende placeholders met dezelfde naam dan dat er ingangen zijn in de sleutelset, dan worden een aantal gecontroleerde gebieden geschrapt. Het systeem volgt het volgende patroon:

    • Bestaat er geen waarden in de sleutelset voor de placeholder, dan wordt een fout gegenereerd.

      GT.M>k RAkeys
      
      GT.M>r Template
      $fn{ en $fn}
      GT.M>m4_tplResolve(result, Template, RAkeys, mode="meta")
      
      ,M6,Z150373850, ( Undefined local variable)
      GT.M>
      
    • Bestaat er slechts 1 waarde voor de placeholder, dan worden alle gecontroleerde gebieden - behalve de eerste - geschrapt.

      GT.M>k RAkeys
      
      GT.M>s RAkeys("fn",1)="Philips"
      
      GT.M>r Template
      $fn{ en $fn}
      GT.M>m4_tplResolve(result, Template, RAkeys, mode="meta")
      
      GT.M>w result
      Philips
      GT.M>
      
    • In het andere geval: het eerste en het laatste gecontroleerde gebied blijven zeker bestaan. Vertrekkende van het voorlaatste gecontroleerd gebied en terugkerend, worden alle gecontroleerde gebieden geschrapt totdat er evenveel sleutels als placeholders zijn.

      GT.M>k RAkeys
      
      GT.M>s RAkeys("fn",1)="Philips"
      
      GT.M>s RAkeys("fn",2)="Corthouts"
      
      GT.M>r Template
      $fn{, $fn}{ en $fn}
      GT.M>m4_tplResolve(result, Template, RAkeys, mode="meta")
      
      GT.M>w result
      Philips en Corthouts
      GT.M>
      
  • Zijn er in de template minder controlerende placeholders dan dat er sleutels zijn, dan wordt de template aangevuld totdat er precies evenveel zijn. Dit gaat op de volgende wijze:

    • Is er slechts 1 gecontroleerd gebied met die placeholder, het gecontroleerd gebied wordt gekloond en zoveel keer ingevoegd net na dit gebied totdat er evenveel sleutels als placeholders zijn.

      GT.M>k RAkeys
      
      GT.M>s RAkeys("fn",1)="Philips"
      
      GT.M>s RAkeys("fn",2)="Corthouts"
      
      GT.M>r Template
      $fn
      GT.M>m4_tplResolve(result, Template, RAkeys, mode="meta")
      
      GT.M>w result
      PhilipsCorthouts
      GT.M>
      
    • Zijn er 2 gecontroleerd gebieden met die placeholder, het eerste gecontroleerd gebied wordt gekloond en zoveel keer ingevoegd net na dit eerste gebied totdat er evenveel sleutels als placeholders zijn.

      GT.M>k RAkeys
      
      GT.M>s RAkeys("fn",1)="Philips"
      
      GT.M>s RAkeys("fn",2)="Corthouts"
      
      GT.M>s RAkeys("fn",3)="Geybels"
      
      GT.M>r Template
      $fn{, $fn}
      GT.M>m4_tplResolve(result, Template, RAkeys, mode="meta")
      
      GT.M>w result
      Philips, Corthouts, Geybels
      GT.M>
      
    • Zijn er meer dan 2 gecontroleerd gebieden met die placeholder, het voorlaatste gecontroleerd gebied wordt gekloond en zoveel keer ingevoegd net na dit gebied totdat er evenveel sleutels als placeholders zijn.

      GT.M>k RAkeys
      
      GT.M>s RAkeys("fn",1)="Philips"
      
      GT.M>s RAkeys("fn",2)="Corthouts"
      
      GT.M>s RAkeys("fn",3)="Geybels"
      
      GT.M>s RAkeys("fn",4)="Jeurissen"
      
      GT.M>r Template
      $fn{, $fn}{ en $fn}
      GT.M>m4_tplResolve(result, Template, RAkeys, mode="meta")
      
      GT.M>w result
      Philips, Corthouts, Geybels en Jeurissen
      GT.M>
      

Illustreren we ook nog eens het gebruik van auto mode:

GT.M>k RAkeys

GT.M>s RAkeys("fn")="Philips"

GT.M>r Template
$fn{, $fn}{ en $fn}
GT.M>m4_tplResolve(result, Template, RAkeys, mode="auto")

GT.M>w result
Philips, Philips en Philips
GT.M>

GT.M>k RAkeys

GT.M>s RAkeys("fn",1)="Philips"

GT.M>m4_tplResolve(result, Template, RAkeys, mode="auto")

GT.M>w result
Philips
GT.M>

7.10. Modifiers

Modifiers kunnen worden geassocieerd met:

  • een placeholder (dynamisch of statisch)
  • een subexpressie

Modifiers worden steeds voorafgegeaan door een |. Ze passen de reeds berekende waarde aan volgens een algoritme (bepaald door de aard van de modifier). Modifiers kunnen ook worden geketend: de waarde wordt bij elke stap aangepast.

GT.M>k RAkeys

GT.M>s RAkeys("date")=$H

GT.M>r Template
Datum van vandaag is ${date|date}
GT.M>m4_tplResolve(result, Template, RAkeys, mode="meta")

GT.M>w result
Datum van vandaag is 10.09.2012
GT.M>

modifiers worden verder in meer detail behandeld.

7.11. Booleaanse waarden

Een booleaanse waarde ontstaat steeds door het evalueren van een string in een booleaanse context. Het verschil met de gewone evaluatie is dat als de string 0 of leeg is, dit wordt herleid tot 0 (false). In alle andere gevallen is het resultaat 1 (true).

7.12. Evaluator

De evaluator is het mechanisme dat een gegeven string omzet in een waarde. Het goed begrijpen van de evaluator is cruciaal voor het correct en efficiënt gebruiken van het Brocade Template System. De evaluator wordt vooral ingezet bij het werken van modifiers maar kan ook elders optreden.

De evaluator werkt met de volgende gegevens:

  1. Naam van de string die wordt geëvalueerd
  2. sleutelset die strings (symbolen) omzet in waarden. Deze collectie draagt ook de naam keys en wordt gespecificeerd bij het activeren van de template macro.
  3. Template sleutelset die strings (symbolen) omzet in nieuwe templates. Deze wordt gespecificeerd bij het activeren van de template macro. In xfile mode is dit typisch de collectie van de andere formats uit dezelfde routine.
  4. Booleaanse vlag: interpreteer als boolean (default: 0). Als de booleaanse vlag aanstaat, dan bevindt het systeem zich in booleaanse context. Deze waarde wordt gespecificeerd naargelang de situatie.
  5. Undef vlag: indien deze op 1 staat, dan worden namen die worden gezocht in de M omgeving steeds op leeg gezet. Deze vlag wordt gespecificeerd bij het activeren van de template macro. Default staat deze op 0.
  6. Lijst met sekwentieel uit te voeren modifiers.

Het berekenen van de definitieve waarde gebeurt in drie stappen:

  1. Berekening van de eerste waarde: met booleaanse vlag of modifiers wordt geen rekening gehouden
  2. Toepassing van de booleaanse vlag
  3. Toepassing van de modifiers

7.12.1. Stap 1: Berekening van de eerste waarde van de string

Op basis van de syntax van de string wordt de eerste waarde berekend. De volgorde van de volgende paragrafen is belangrijk.

7.12.1.1. Het symbool start met ~

~ wordt verwijderd en de rest van de string wordt terug aan de evaluator onderworpen in een booleaanse context.

Voorbeeld:

GT.M>k RAkeys

GT.M>s RAkeys("date")=$H

GT.M>r Template
{Geblokkeerd op ${date|date} | rm:~date}{Niet geblokkeerd|rm:date}
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
Geblokkeerd op 10.09.2012
GT.M>

7.12.1.2. Het symbool is numeriek

Het symbool evalueert tot zichzelf en dit getal wordt teruggeven.

Voorbeeld:

GT.M>r Template
{Hello World | truncch=10}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Hello W...
GT.M>

7.12.1.3. Het symbool staat tussen

Van deze string wordt de eerste en de laatste verwijderd. Dit resultaat wordt teruggegeven. Merk nog op dat binnenin de string eventuele NIET worden verdubbeld of ge-escaped.

Voorbeeld:

GT.M>s RAkeys("name")=""

GT.M>r Template
My name is ${name|def:"nobody"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
My name is nobody
GT.M>

7.12.1.4. Het symbool bevat ?

Dit wordt gebruikt om te kiezen tussen verschillende templates.

Het stuk voor de ? - met verwijdering van eventuele prefix @ - wordt in een booleaanse context aan de evaluator onderworpen. Indien dit resultaat true is, dan wordt de string geëvalueerd (met eventuele toevoeging van de @ prefix). Indien false, dan is het resultaat leeg.

{@first?tableopen}{@tablerow}{@last?tableclose}

7.12.1.5. Het symbool is _

Dit is een automatisch increment. Een gegeven lokale variabele (die bestaat zolang het M process bestaat) wordt geïncrementeerd en de waarde wordt teruggegeven. Deze techniek is zeer bruikbaar bij het genereren van automatische identifiers voor HTML elementen: deze moeten immers uniek zijn.

GT.M>r Template
{_ | eval}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
1
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
2
GT.M>

7.12.1.6. Het symbool is @, @1, @2

@ staat voor de identifier van de template. In xfile mode is de naam van de template routine^format. @1 staat voor het gedeelte voor ^, @2 staat voor het gedeelte erna.

7.12.1.7. Het symbool start met @

Het symbool leidt tot een andere template waarvan de waarde wordt berekend met - op de booleaanse vlag na - dezelfde parameters als bij het evalueren van de actuele template. De booleaanse vlag wordt bij de tussenberekening op 0 gezet.

De template zelf wordt opgehaald in de Template Keyset.

7.12.1.8. Het symbool behoort tot de keyset van waarden

Deze waarde wordt teruggegeven.

7.12.1.9. Waarden uit de cache

Symbolen die beginnen met U en geen _ bevatten, worden in een cache opgenomen. Die cache wordt opgebouwd in de loop van het M process. Behoort de string tot de cache, dan wordt het resultaat uit deze cache teruggeven.

7.12.1.10. Invloed van undef flag

Staat de undef flag, dan wordt leeg teruggegeven. Anders wordt de string opgezocht in de M omgeving. Begint de string met U, dan wordt hij samen met zijn waarde in de cache gestopt.

GT.M>k RAkeys

GT.M>r Template
My name is $name
GT.M>m4_tplResolve(result, Template, RAkeys)

,M6,Z150373850, ( Undefined local variable)
GT.M>

GT.M>m4_tplResolve(result, Template, RAkeys, undef=1)

GT.M>w result
My name is
GT.M>

7.12.2. Stap 2: Toepassing van de booleaanse vlag

Staat de booleaanse vlag af, dan keert stap 2 terug met de waarde van stap 1. Staat de booleaanse vlag aan, dan wordt op basis van het resultaat van stap 1 de waarden true of false berekend. Is het resultaat van stap 1 ofwel 0 ofwel de lege string dan wordt de waarde uit stap 2 false. In alle andere gevallen is de waarde true.

Begon de string met ~, dan wordt er negatie toegepast: true wordt false en false wordt true.

7.12.3. Stap 3: Toepassing van de modifiers.

De modifiers is een sequentiële lijst. De eerste modifier wordt toegepast op het resultaat van stap 2. Deze waarde wordt dan doorgegeven aan de volgende modifier, etc.

7.13. Modifiers

Modifiers op een string of variabele vormen een ketting van transformaties: de originele waarde is de input van de eerste modifier. De output van deze modifier vormt dan weer de input van de volgende.

Modifiers kunnen ook neveneffecten hebben: zo kunnen ze bijvoorbeeld nieuwe sleutels steken in de Waarden Key/Value Stores.

7.13.1. Opstellen van de lijst van modifiers

De sequentiële lijst van modifiers voor een gegeven string wordt op basis van syntax opgesteld. Een modifier wordt ingeleid door het | symbool en reikt tot ofwel het einde van de string, ofwel tot het } symbool, ofwel tot het volgende | symbool.

Het eerste symbool | is wat speciaal. De whitespace vóór | wordt bijgehouden. Met behulp van de wspace modifier kan dan deze whitespace worden gebruikt. Voor alle volgende | is de whitespace, voorafgaand of volgend, onbelangrijk.

Modifiers bestaan essentieel uit 2 delen. Het eerste deel is de naam van de modifier, het tweede deel is het argument. Naam en argument worden van elkaar gescheiden door : of = (wat er eerst komt). Staan geen van beide karakters in de modifier dan is het argument leeg en neemt de naam de ganse modifier in. Idien het argument niet leeg is, dan gaat het argument praktisch in alle gevallen door de evaluator vooraleer het wordt gebruikt. (Bekijk de details per modifiers)

In het geval van de substr modifier is de naam van de modifier optioneel.

Zowel naam als argument worden gestript (beginnende en eindigende whitespace is onbelangrijk). De hoofdletters in naam worden omgezet in kleine letters. Slechts de eerste 7 letters van de naam zijn beduidend. De functie van de modifier ligt op voorhand vast en vormen integraal onderdeel van het systeem.

Het argument kan worden gebruikt om de werking van de modifier te specificeren. Dit argument kan een eigen structuur hebben.

Bij het activeren van de template macro kan ook een string met default modifiers worden gespecificeerd. De modifiers van een variabele worden steeds aangevuld met deze default modifiers.

7.13.2. Overzicht van de modifiers

In dit overzicht gebruiken we steeds input voor de waarde die de modifier bereikt. output is dan de berekende waarde.

7.13.2.1. Modifiers in verband met Brocade objecten

7.13.2.1.1. copy

De input (in Brocade karakterset) wordt omgevormd tot een Brocade copy element.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{c:lvd:12376 | copy}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<img onmouseover="this.src='/brocade/layout/ws_lookup2.gif'" onmouseout="this.sr
c='/brocade/layout/ws_lookup1.gif'" style='vertical-align:top' border='0' src='/
brocade/layout/ws_lookup1.gif' onclick="return WORKSPACE.insertClipBoard('c:lvd:
12376');" alt='copy' />
GT.M>
7.13.2.1.2. date

Deze modifier vormt de input om naar een datum aanduiding. De modifier kan zowel een datum aanduiding als een datum span verwerken.

De input moet een $H formaat zijn of de gedaante van een span hebben (+$H_,:+$H_,). De omvorming wordt gestuurd door de registry waarde `lc-date.

Indien het argument verschillend van leeg is, wordt het geëvalueerd.

Bij een datum moet het result hiervan zijn: leeg | h | m | s | w zijn. Dit argument geeft aan op welk niveau de omvorming werkt:

  • indien leeg: op dag niveau
  • h: op uur niveau
  • m: op minuut niveau
  • s: op second niveau
  • w: weekdag aanduiding

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{62607,39052 | date:"s"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
30.05.2012 10:50:52
GT.M>

Bij een datumspan moet het result de delimiter zijn tussen de datum aanduidingen. Is dit resultaat leeg, dan wordt hiervoor het Unicode karakter ndash (U+2012) gebruikt: dit is het aangewezen karakter.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{62607,:62610, | date:" - "}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
30.05.2012 - 02.06.2012
GT.M>
7.13.2.1.3. dati

Deze modifier vormt de input om naar een datum of naar een tijdsaanduiding. De modifier kan zowel datum aanduidingen als tijdsaanduidingen

De input moet een $H formaat zijn of van de gedaante $H,. De omvorming wordt gestuurd door de registry waarde lc-date.

Naargelang de vorm van de input wordt de verdere verwerking gedaan door date of time

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{62607,39052 | dati}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
30.05.2012 10:50:52
GT.M>
GT.M>r Template
{62607, | dati}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
30.05.2012
GT.M>

Bij een datumspan moet het result de delimiter zijn tussen de datum aanduidingen. Is dit resultaat leeg, dan wordt hiervoor het Unicode karakter ndash (U+2012) gebruikt: dit is het aangewezen karakter.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{62607,:62610, | date:" - "}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
30.05.2012 - 02.06.2012
GT.M>
7.13.2.1.4. counter

Deze modifier interpreteert de input als een teller. Telkens als deze template wordt geëvalueerd, wordt deze teller verhoogd.

Indien het argument een numerieke waarde heeft, dan wordt dit als initiële waarde voor de teller gebruikt.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
een twee {tpl:mycntid|counter:3}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
een twee 4
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
een twee 5
GT.M>
7.13.2.1.5. dloi

Deze modifier creëert een hyperlink naar een d-loi. Deze hyperlink start steeds in een blanco scherm. De tekst in de hyperlink wordt bepaald door het argument:

  • heeft de d-loi een titel verschillende van leeg, dan wordt deze titel de tekst
  • zoniet, dan wordt het argument geinterpreteerd als een tekstfragment in een namespace
  • bestaat dit tekstfragment niet, of is het leeg, dan wordt de tekst gelijk gesteld aan de URL van de d-loi.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{d:artesis:3 | dloi}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<a target="_blank" href="/docman/docstore/298796/gebruik_artesis.pdf">/docman/do
cstore/298796/gebruik_artesis.pdf</a>
GT.M>
7.13.2.1.6. lang

Deze modifier vormt een dialoogtaal op naar een 3-letterige taalcode.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{N | lang}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
dut
GT.M>
7.13.2.1.7. saymeta

Deze modifier vervangt een meta loi (mt-loi) door zijn verwoording

Het eventuele argument wordt geëvalueerd en dient als hint voor het type.

Voorbeeld:

GT.M>r Template
{mt:colsys:ehc | saymeta}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Collectiebeschrijvingen voor EHC
GT.M>

GT.M>r Template
{ehc | saymeta:"colsys"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Collectiebeschrijvingen voor EHC
GT.M>
7.13.2.1.8. scopemeta

Deze modifier vervangt een meta loi (mt-loi) door zijn scope

Het eventuele argument wordt geëvalueerd en dient als hint voor het type.

Voorbeeld:

GT.M>r Template
{mt:colsys:ehc | scopemeta}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
In dit bestand worden de collecties die de Erfgoedbibliotheek Hendrik Conscience
verwerft uit schenking, ruil en depot in zijn algemeenheid beschreven.
GT.M>

GT.M>r Template
{ehc | scopemeta:"colsys"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
In dit bestand worden de collecties die de Erfgoedbibliotheek Hendrik Conscience
verwerft uit schenking, ruil en depot in zijn algemeenheid beschreven.
GT.M>
7.13.2.1.9. loiview

Deze modifier verwoordt een loi naar een (loi-)specifieke verwoording.

Het eventuele argument wordt geëvalueerd en dient als hint voor de verwoording.

Voorbeeld:

GT.M>r Template
{o:lvd:523417 | loiview}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
a03036712544b
GT.M>
7.13.2.1.10. lookup

Deze modifier creeert een Brocade lookup object. De input is de target van het lookup object: het HTML element dat de gevonden waarde gaat ontvangen.

Het argument kan uit 2 componenten bestaan, deze worden door een spatie gescheiden.

De eerste component is de identifier van het lookup object. De tweede component is de eventuele extra waarde. Deze wordt - in tegenstelling tot de identifier - wel onderworpen aan de evaluator.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{FDsid_tree | lookup=isadviewone}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<a href="#" onmouseover="LOOKUP.dropdownmenu(this, event, 'lookupmenu1','FDsid_t
ree','isadviewone');"><span class="lookup">&#160;</span></a>
GT.M>
7.13.2.1.11. num

Als de input een getal is in databank notatie (vb. 12.3), wordt deze omgevormd naar de lokale representatie.

Als het argument bestaat dan geeft het - na evaluatie - het aantal cijfers na de komma aan (default = 2). Is dit argument echter negatief, dan wordt het decimale scheidingsteken weggewerkt (op voorwaarde dat het getal zelf niet verandert)

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{62607.39052 | num=3}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
62.607,391
GT.M>

GT.M>s RAkeys("len")=4

GT.M>r Template
{62607.39052 | num=len}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
62.607,3905
GT.M>
7.13.2.1.12. registry

Verwerkt de input als een registry waarde.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{m-web-exe | registry}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
/usr/bin/mweb
GT.M>
7.13.2.1.13. textfragment

Maakt een hyperlink naar een Brocade toepassing dat een tekstfragment editeert.

Voorbeeld:

GT.M>

GT.M>r Template
{metaColsys.autype | textfragment: "edit"}
GT.M>

GT.M>m4_tplResolve(result, Template)

GT.M>w result
<a title="metaColsys.autype" target="_blank" href="/menu/textedit/metaColsys.autype">Geassocieerd met een authoritycode?</a>
GT.M>

Het argument wordt geëvalueerd en kan een view of edit (default waarde) opleveren:

  • edit: de verwoordingen kunnen worden aangepast
  • view: de verwoordingen kunnen worden bekeken.
7.13.2.1.14. staff

Vormt een Brocade userid om tot een hyperlink naar het mail adres van de gebruiker. De naam van de gebruiker wordt volledig ingevuld.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{rphilips | staff}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<a href="mailto:richard.philips@ua.ac.be">Richard Philips</a>
GT.M>
7.13.2.1.15. time

Deze modifier vormt de input om naar een tijd aanduiding. De input moet een $H formaat zijn. De omvorming wordt gestuurd door de registry waarde lc-date.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{62607,39052|time}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
30.05.2012 10:50:52
GT.M>
7.13.2.1.16. toc

Vervangt de taal onafhankelijke codes

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{<CON>|toc}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Convoluut
GT.M>
7.13.2.1.17. urlapplication

Deze modifier creeert een link naar een Brocade applicatie.

De input is de tekst onder de hyperlink.

Het argument kan uit 2 componenten bestaan, deze worden door een spatie gescheiden.

De eerste component is de roepcode in de Brocade menu van de toepassing. De tweede component is de eventuele extra waarde. Deze wordt - in tegenstelling tot de identifier - wel onderworpen aan de evaluator.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{De Witte | urlapplication=bibrec "c:lvd:218319"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<a class="workspace-application-text" href="#" onclick="return WORKSPACE.urlAppl
ication('bibrec', 'c:lvd:218319')">De Witte</a>
GT.M>

7.13.2.2. Modifiers in verband met HTML generatie

7.13.2.2.1. anchor

Deze modifier produceert een automatisch anker. De name (en id) van het anchorelement wordt gegenereerd. De prefix van name (en id) komen uit het argument (dat niet wordt onderworpen aan de evaluator). De input staat in een attribuut data-title.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{werkplan | anchor}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<a id='anchorzhere1' name='anchorzhere1' data-title='werkplan'></a>
GT.M>
7.13.2.2.2. context

Deze modifier wordt gebruikt bij het definieren van een context-menu in HTML. De input is de naam van het context-menu

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
<tr valign="top" {info|context}>...</tr>
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<tr valign="top" oncontextmenu='return WORKSPACE.contextmenu(event,this,"info")'>...</tr>
GT.M>
7.13.2.2.3. div

Plaats de input tussen een HTML DIV. Als het argument niet leeg is, dan wordt het geëvalueerd en wordt het als een class of style attribuut in het element gevoegd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{hello world | div: "myclass"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<div class='myclass'>hello world</div>
GT.M>
7.13.2.2.4. href

Vormt de input om tot een hyperlink. Het argument kan 2 delen bevatten (gescheiden door een spatie). Het eerste gedeelte is de target URL, het optionele tweede gedeelte is de naam van de window waarin de target URL moet worden getoond.

De target URL wordt geëvalueerd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Het World Wide Web Consortium | href="http://w3c.org" _blank}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<a href='http://w3c.org' target='_blank'>Het World Wide Web Consortium</a>
GT.M>
7.13.2.2.5. id

Transformeert de input naar een id attribuut

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{World | id}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
id="World"
GT.M>
7.13.2.2.6. idname

Transformeert de input naar een id en name attribuut

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{World | idname}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
name="World" id="World"
GT.M>
7.13.2.2.7. markdown

De input wordt omgezet in markdown. Het resultaat bevat HTML elementen.

Is het argument leeg, dan wordt dit op 1 gezet. Het argument wordt verder in een booleaanse context geëvalueerd. Indien true, dan wordt een omringende <p> ... </p> verwijderd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{*voorbeeld* | markdown}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<script type='text/javascript'>document.write(unpmarked('*voorbeeld*'));</script>
GT.M>
7.13.2.2.9. name

Transformeert de input naar een name attribuut

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{World | name}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
name="World"
GT.M>
7.13.2.2.10. nbsp

Vervangt in de input alle spaties door een nonbreakable space.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello World | nbsp}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Hello&#160;World
GT.M>
7.13.2.2.11. rss

Vervangt de input door een link naar een RSS feed. De extra argumenten zijn deze van urlize.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{/docman/rssfeeds/08e321/urphilips.xml | rss}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<a href="/docman/rssfeeds/08e321/urphilips.xml" target="rssscreen"><img src="/brocade/layout/rss-icon.gif" border="0"></a>
GT.M>
7.13.2.2.12. span

Plaats de input tussen een HTML SPAN. Als het argument niet leeg is, dan wordt het geëvalueerd en wordt het als een class of style attribuut in het element gevoegd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello World | span="font-size: small"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<span style='font-size: small'>Hello World</span>
GT.M>
7.13.2.2.13. td

Plaats de input tussen een HTML TD. Als het argument niet leeg is, dan wordt het geëvalueerd en wordt het als een class of style attribuut in het element gevoegd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello World | td="font-size: small"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<td style='font-size: small'>Hello World</td>
GT.M>
7.13.2.2.14. unicode

Markeer de Unicodekarakters met een codepunt groter dan 255. Dit gebeurt met het toekennen van een CSS klasse (workspace-unichar) en is dus enkel van toepassing op HTML code.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{<p>«03B1» en «03C9»</p> | unicode}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<p><span class='workspace-unichar' title='U+03B1: GREEK SMALL LETTER ALPHA'>
&#x03B1;</span> en <span class='workspace-unichar'
title='U+03C9: GREEK SMALL LETTER OMEGA'>&#x03C9;</span></p>
GT.M>
7.13.2.2.15. url

Codeert de input volgens het url schema: het resultaat is meteen XML en javascript veilig.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello World | url}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Hello%20World
GT.M>
7.13.2.2.16. urlize

Maakt van de input een hyperlink (opstart in een ander scherm). Het argument gaat naar de evaluator. Is het argument leeg, dan is zowel de target van de hyperlink als de inhoud gelijk aan input. Anders wordt het argument geëvalueerd. Is het gelijk aan docman, dan wordt een docman URL aangemaakt:

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{/pictogram/bcb93e/google.jpg | urlize="docman"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<a href="/docman/pictogram/bcb93e/google.jpg" target="_blank">/pictogram/bcb93e/google.jpg</a>
GT.M>

7.13.2.3. Modifiers in verband met string manipulaties

7.13.2.3.1. capital

Enkel de eerste letter wordt omgezet in hoofdletter

Het argument speelt geen rol.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{julius caesar| capital}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Julius caesar
GT.M>
7.13.2.3.2. center

Evalueert het argument en centreert de output (vg. met de gelijknamige python functie)

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello World | center=20}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
     Hello World
GT.M>
7.13.2.3.3. chr

De output komt tot stand door op de input de mumps $C functie toe te passen.

Argumenten zijn onbelangrijk.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{65 | chr}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
A
GT.M>
7.13.2.3.4. cutchar

Het argument wordt geëvalueerd en de karakters uit dit resultaat worden verwijderd uit de input

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello | cutchar="lo"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
He
GT.M>
7.13.2.3.5. cutword

Het argument wordt geëvalueerd en alle voorkomen van dit resultaat wordt verwijderd uit de input

Voorbeeld:

GT.M>r Template
{waar kwam ik aan | cutword="wa"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
ar km ik aan
GT.M>
7.13.2.3.6. dict

Transformeert de input door deze op te zoeken in een dict. De dict wordt gespecificeerd in het argument (dat eerst wordt geëvalueerd). De vorm van de dict is sleutel:waarde sleutel:waarde .... Staat de input niet als sleutel vermeld, dan is het resultaat leeg.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{off | dict="on:enable off:disable"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
disable
GT.M>
7.13.2.3.7. empty

Zet de output op leeg op voorwaarde dat de input enkel bestaat uit de karakters zoals gespecificeerd in het argument (dat door de evaluator gaat). Is het argument leeg, dan wordt de test uitgevoerd op basis van de whitespace karakters.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{abcd | empty="abc"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
abcd
GT.M>
7.13.2.3.8. enc

Deze modifier codeert de input volgens het schema vastgelegt in het argument - na evaluatie.

Mogelijke coderingen zijn: url | js | py | xml | xmlr | xmlb | utf8 | hex | HEX | lutf8

In BTS zijn alle coderingen expliciet.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{c:lvd:1278681 | enc="url"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
c%3Alvd%3A1278681
GT.M>
7.13.2.3.9. eval

Deze modifier verwerkt input alsof het de naam van een placeholder was.

Voorbeeld:

GT.M>k RAkeys

GT.M>s UDses=89786766

GT.M>r Template
{UDses | eval}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
89786766
GT.M>
7.13.2.3.10. exec

Deze modifier is vooral belangrijk voor zijn neveneffect: het uitvoeren van een M string.

Indien het argument ontbreekt of het evalueert tot true in Boolaanse context, dan wordt de input omgezet naar de lege string.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{s ^Z=\$H | exec}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w ^Z
62712,59412
GT.M>
7.13.2.3.11. hex

Codeert de input volgens het hex schema: elk karakter word vervangen door zijn hexadecimale waarde (kleine letters)

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Ik zeg: "Hallo" | hex}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
496b207a65673a202248616c6c6f22
GT.M>
7.13.2.3.12. int

Trunceert de input als een integer

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{3.6 | int}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
3
GT.M>
7.13.2.3.13. js

Codeert de input volgens het js schema: het resultaat is meteen XML en javascript veilig.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Ik zeg: "Hallo" | js}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Ik zeg: \u0022Hallo\u0022
GT.M>
7.13.2.3.14. json

Interpreteert de input als een referentie naar een M structuur en serialiseert deze naar JSON.

Voorbeeld:

GT.M>k RAkeys

GT.M>m4_getCatIsbdTitles(RAti, "c:irua:9")

GT.M>zwr RAti
RAti(1,"ac")=0
RAti(1,"ap")=1
RAti(1,"ex")=""
RAti(1,"lg")="eng"
RAti(1,"pr")="oip"
RAti(1,"so")=""
RAti(1,"ti")="Cineradiographic analysis of the pharyngeal jaw movements"
RAti(1,"ty")="h"

GT.M>r Template
{RAti|json}

GT.M>m4_tplResolve(result, template, RAkeys)

GT.M>w result
{"1":{"ac":"0","ap":"1","ex":"","lg":"eng","pr":"oip","so":"","ti":"Cineradiogra
phic analysis of the pharyngeal jaw movements","ty":"h"}}
7.13.2.3.15. ljust

Evalueert het argument en links aligneert de output (vg. met de gelijknamige python functie)

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello World | ljust=20}Tot hier en niet verder
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Hello World         Tot hier en niet verder
GT.M>
7.13.2.3.16. lower

De karakters worden in kleine letters omgezet.

Het argument speelt geen rol.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{ÉLÈVE | lower}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
élève
GT.M>
7.13.2.3.17. lstrip

De input wordt aan de corresponderende python functie onderworpen. Is het argument leeg, dan wordt de whitespace aan het begin verwijderd. Is het argument niet leeg, dan wordt het aan de evaluator onderworpen. Deze karakters aan het begin uit dit resultaat worden dan verwijderd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{ abc | lstrip}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
abc
GT.M>
7.13.2.3.18. ord

De output komt tot stand door op de input de $A functie toe te passen.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{A | ord}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
65
GT.M>
7.13.2.3.19. pbytes

De output komt tot stand door de input te prefixen met een string die wordt berekend aan de hand van het argument:

  • Is het argument leeg, dan wordt de prefix CRLF
  • Het argument wordt geëvalueerd en wordt een string van getallen gescheiden door een ,. Daar wordt - in M jargon - een $C van genomen en dit is dan de prefix.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{A | pbytes="33,34"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
!"A
GT.M>
7.13.2.3.20. piece

Dit is het equivalent van de Mumps $P. Vooreerst wordt de delimiter berekend. Dit is het gedeelte van het argument dat staat voor het eerste [ karakter. Is de delimiter leeg, dan wordt hij gelijkgesteld aan de spatie. De slice zelf wordt bepaald volgens de python traditie (zie ook: substr).

Begin en einde van de slice worden aan de evaluator onderworpen.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{A^b^c^D | piece: ^[1:-1]}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
b^c
GT.M>
7.13.2.3.21. py

Codeert de input volgens het py schema: het resultaat kan tussen zowel als worden geplaatst.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Ik zeg: "Hallo" | py}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Ik zeg: \x22Hallo\x22
GT.M>
7.13.2.3.22. rjust

Evalueert het argument en rechts aligneert de output (vg. met de gelijknamige python functie)

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
Vanaf hier:{Hello World | rjust=20}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Vanaf hier:         Hello World
GT.M>
7.13.2.3.23. rjust

Evalueert het argument en rond de input af op zoveel cijfers na de komma.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{3.674 | round:2}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
3.67
GT.M>
7.13.2.3.24. rstrip

De input wordt aan de corresponderende python functie onderworpen. Is het argument leeg, dan wordt de whitespace aan het einde verwijderd. Is het argument niet leeg, dan wordt het aan de evaluator onderworpen. Deze karakters aan het einde uit dit resultaat worden dan verwijderd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{abcd | strip="d"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
abc
GT.M>
7.13.2.3.25. sbytes

De output komt tot stand door de input te suffixen met een string die wordt berekend aan de hand van het argument:

  • Is het argument leeg, dan wordt de suffix CRLF
  • Het argument wordt geëvalueerd en wordt een string van getallen gescheiden door een ,. Daar wordt - in M jargon - een $C van genomen en dit is dan de suffix.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{A | sbytes="33,34"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
A!"
GT.M>
7.13.2.3.26. strip

De input wordt aan de corresponderende python functie onderworpen. Is het argument leeg, dan wordt de whitespace aan het begin en einde verwijderd. Is het argument niet leeg, dan wordt het aan de evaluator onderworpen. Deze karakters aan begin en einde uit dit resultaat worden dan verwijderd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{ abc | strip}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
abc
GT.M>
7.13.2.3.27. substr

Dit is het equivalent van python string slicing. Het slicing interval staat in het argument. Begin en eventueel einde worden aan de evaluator onderworpen. De naam substr samen met de inleidende delimiter (: of =) mag weggelaten worden.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Verwijder uppercasE | [1:-1]}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
erwijder uppercas
GT.M>
7.13.2.3.28. truncch

Het argument wordt geëvalueerd en indien de lengte van de input groter is dan dit argument, dan wordt dit getrunceerd en aangevuld met ....

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello World | truncch=10}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Hello W...
GT.M>
7.13.2.3.29. truncwo

Het argument wordt geëvalueerd en indien de lengte van de input groter is dan dit argument, dan wordt dit getrunceerd na een volledig woord en aangevuld met ....

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Hello World | truncwo=10}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Hello...
GT.M>
7.13.2.3.30. untag

Vervangt in de input alle XML elementen door hun inhoud

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{<b>Hello World</b> | untag}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Hello World
GT.M>
7.13.2.3.31. upper

De karakters worden in grote letters omgezet.

Het argument speelt geen rol.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{A bC | upper}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
A BC
GT.M>
7.13.2.3.32. xml

Codeert de input volgens het xml schema.

Zet input - in Brocade karakterset - string om in een XML veilige string. Het resultaat kan zowel in attributen als in PCDATA worden geplaatst.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Ik zeg: "Hallo & Vaarwel" | xml}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Ik zeg: &#x22;Hallo &#x26; Vaarwel&#x22;
GT.M>
7.13.2.3.33. xmlb

Codeert de input volgens het xmlb schema.

Zet input - in Brocade karakterset - string om in een string waarbij de karakters & < > " ' worden omgezet in decimale entiteiten.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Ik zeg: "Eén & Twee" | xmlb}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Ik zeg: &#34;Eén &#x26; Twee&#34;
GT.M>
7.13.2.3.34. xmlr

Codeert de input volgens het xmlr schema.

Zet input - in Brocade karakterset - string om in een XML veilige string. Het resultaat kan zowel in attributen als in PCDATA worden geplaatst.

< en & worden niet omgezet.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Ik zeg: "Hallo & Vaarwel" | xmlr}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Ik zeg: &#x22;Hallo & Vaarwel&#x22;
GT.M>

7.13.2.4. Modifiers in verband met de template constructie

7.13.2.4.1. !

Deze modifier controleert de parent: is de input leeg, dan wordt ook de parent op leeg gezet.

Voorbeeld:

GT.M>k RAkeys

GT.M>s RAkeys("leeg")=""

GT.M>r Template
{A {B ${leeg|!}}}
GT.M>

GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
A
GT.M>
7.13.2.4.2. def

Indien de input van de modifier leeg is, dan wordt deze vervangen door het argument van de modifier. Dit argument wordt - indien het verschillend is van leeg - eerst onderworpen aan de evaluator.

Voorbeeld:

GT.M>k RAkeys

GT.M>s RAkeys("leeg")=""

GT.M>r Template
${leeg | def="?"}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
?
GT.M>
7.13.2.4.3. get

Deze modifier heeft enkel zin in xfile mode.

Als het argument leeg is, of Booleaans evalueert to true, dan wordt de undef-vlag op true gezet, in het andere geval wordt de vlag op false gezet. Dit wil zeggen dat symbolen enkel worden afgecheckt tegen de sleutelset. Is het symbool niet aanwezig, dan wordt hij op leeg gezet.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
A${|get}${var}B
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

,M6,Z150373850, ( Undefined local variable)
GT.M>r Template
A{|get}${var}B
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
AB
GT.M>
7.13.2.4.4. if

BTS kan werken met een systeem van vlaggen. Deze vlaggen gaan nauw samen met het leeg zijn van de input. De vlaggen zelf worden gemanipuleerd met behulp van set, nset, unset, nunset.

Met if kan de waarde van input naar leeg worden getransformeerd op basis van deze vlaggen. if werkt enkel met een niet-leeg argument. Dit argument moet een uitdrukking zijn die wordt opgebouwd met cijfers, vlaggen en de operatoren ~ (negatie), + (or) en * (and). Indien het resultaat true (=verschillend van 0) wordt de input getransformeerd naar leeg.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{aaaaa | empty="a" | set=vowel}{A {B | if=~vowel}}
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
A B
GT.M>
7.13.2.4.5. key

Deze modifier laat toe om de keyset van waarden uit te breiden met een nieuwe sleutel. Het argument is de naam van de nieuwe sleutel (wordt niet door de evaluator gehaald) en input is zijn waarde. Deze modifier werkt enkel in xfile-mode.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Stephen King | key=author} schrijft. ${author | piece=[0]} houdt van griezelen.
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
Stephen King schrijft. Stephen houdt van griezelen.
GT.M>
7.13.2.4.6. keyonce

Deze modifier werkt zoals key. De keyset van waarden wordt echter enkel aangepast indien de sleutel nog niet bestaat.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{Stephen | keyonce=author} en {Peter | keyonce=author}. Ik verkies $author
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
Stephen en Peter. Ik verkies Stephen
GT.M>
7.13.2.4.7. log

Deze modifier kan worden gebruikt om de logging faciliteit aan te sturen. Dit is bedoeld als een instrument voor ontwikkelaars. Logging gebeurt indien er een logging global wordt gedefinieerd. Vanaf dat moment wordt elke geëvalueerde string samen met zijn waarde in deze logging global gestopt.

De log modifier kan worden gebruikt om de logging global te manipuleren:

  • is het argument leeg is (of evalueert tot leeg), dan stopt de logging
  • evalueert het argument tot 1, dan wordt de logging global gelijkgesteld aan ^ZTR(“tpl”,”routine^format”)
  • in alle andere gevallen evalueert het argument tot de logging global zelf

De logging global wordt dan ook geinitialiseerd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{|log=1}
GT.M>
7.13.2.4.8. nif

BTS kan werken met een systeem van vlaggen. Deze vlaggen gaan nauw samen met het leeg zijn van de input. De vlaggen zelf worden gemanipuleerd met behulp van set, nset, unset, nunset.

Met nif kan de waarde van input naar leeg worden getransformeerd op basis van deze vlaggen. nif werkt enkel met een niet-leeg argument. Dit argument moet een uitdrukking zijn die wordt opgebouwd met cijfers, vlaggen en de operatoren ~ (negatie), + (or) en * (and). Indien het resultaat false (= 0) wordt de input getransformeerd naar leeg.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{aaaaa | empty="a" | set=vowel}{A {B | nif=~vowel}}
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
A
GT.M>
7.13.2.4.9. nset

BTS kan werken met een systeem van vlaggen. Deze vlaggen gaan nauw samen met het leeg zijn van de input.

nset werkt onder 2 voorwaarden:

  • de input is niet leeg
  • het argument is niet leeg. Dit argument wordt niet geëvalueerd. Het is de naam van de vlag en deze vlag wordt gezet.

Voorbeeld:

 GT.M>k RAkeys

GT.M>r Template
{aaaaa | empty="a" | nset=vowel}{A {B | nif=~vowel}}
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
A B
GT.M>
7.13.2.4.10. nunset

BTS kan werken met een systeem van vlaggen. Deze vlaggen gaan nauw samen met het leeg zijn van de input.

nunset werkt indien de input niet leeg is. Is het argument leeg, dan worden alle vlaggen vernietigd. Is het argument niet leeg, dan wordt dit argument beschouwd als de naam van een vlag en deze vlag wordt vernietigd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{aaaaa | empty="a" | nunset=vowel}{A {B | nif=~vowel}
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
A B
GT.M>
7.13.2.4.11. rm

Deze modifier is destructief: hij zet de input op leeg indien aan een voorwaarde wordt voldaan.

Er doen zich de volgende situaties voor:

  • Zonder argument, wordt de output leeg
  • Het argument bevat geen spatie: het argument wordt geëvalueerd in een Booleaans context. Indien deze waar is, dan is de output leeg.
  • Bevat het argument wel een spatie, dan wordt het gedeelte na de spatie geëvalueerd. We noemen dit de context
  • Het argument start met ip : de context wordt geinterpreteerd als een rij van werkstations (gescheiden door een ”,”). Indien het huidige IP nummer tot een werkstation behoort, dan wordt de waarde op leeg gezet.
  • Het argument start met desktop : de context wordt beschouwd als een rij (gescheiden door ‘,’) van wildcards op desktops. Indien de huidige desktop overeenkomt met een patroon, dan wordt de waarde op leeg gezet.
  • Het argument start met slot : de context wordt beschouwd als een rij (gescheiden door ‘,’) van toegangssloten. Indien de huidige UDuser onder een toegangsslot valt, dan wordt de waarde op leeg gezet.
  • Het argument start met workstation : de context wordt beschouwd als een rij (gescheiden door ‘,’) van van wildcards op een werkstation. Indien het huidige werkstation overeenkomt met een patroon, dan wordt de waarde op leeg gezet.
  • Het argument start met pattern : de context wordt beschouwd als een rij (gescheiden door ‘,’) van patronen. Indien de input een van deze patronen matched, dan wordt de waarde op leeg gezet. (Gebruik lpattern , resp. upattern als je de waarde eerst wil lowercase (resp. uppercase) zetten)
  • Het argument start met array : de context wordt geinterpreteerd als een array in de M omgeving. Indien de input in de array zit, dan wordt deze op leeg gezet. (Gebruik larray , resp. uarray als je de waarde eerst wil lowercase (resp. uppercase) zetten)

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
A{Hello World | rm}B
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
AB
GT.M>

GT.M>s UDwks="UA-ANET"

GT.M>k RAkeys

GT.M>r Template
A{Hello World | rm:workstation "UA*"}B
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
AB
GT.M>

GT.M>s UDwks="UH-BEEK"

GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
AHello WorldB
GT.M>
7.13.2.4.12. rmwith

Werkt analoog aan rm, het argument echter wordt opgesplitst in 2 delen gescheiden door een spatie. Het eerste deel wordt geëvalueerd en de testen worden op dit gedeelte uitgevoerd. (Het tweede gedeelte wordt dan als argument gebruikt)

Voorbeeld:

GT.M>s UDwks="UA-ANET"

GT.M>k RAkeys

GT.M>r Template
A{Hello World | rmwith:UDwks pattern "UA*"}B
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
AB
GT.M>
7.13.2.4.13. set

BTS kan werken met een systeem van vlaggen. Deze vlaggen gaan nauw samen met het leeg zijn van de input.

set werkt onder 2 voorwaarden:

  • de input is leeg
  • het argument is niet leeg. Dit argument wordt niet geëvalueerd. Het is de naam van de vlag en deze vlag wordt gezet.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{aab | empty="a" | set=vlag}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
aab
GT.M>
7.13.2.4.14. sharp

Deze modifier wordt enkel gebruikt in meta mode.

In meta-mode kunnen sleutels verschillende waarden hebben. De sharp modifier is een formule op de index van deze waarde. Het symbool # wordt dan vervangen door de berekende waarde.

Voorbeeld:

GT.M>k RAkeys

GT.M>s RAkeys("author",1)="Stephen"

GT.M>s RAkeys("author",2)="Peter"

GT.M>r Template
{<span style="font-size:#pt">$author</span> | sharp=10+(2*#)}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
<span style="font-size:12pt">Stephen</span><span style="font-size:14pt">Peter</span>
GT.M>
7.13.2.4.15. stay

stay is het omgekeerde van rm: zie de documentatie bij rm

7.13.2.4.16. staywith

staywith is het omgekeerde van rmwith: zie de documentatie bij rmwith

7.13.2.4.17. stop

Deze modifier stopt de verwerking van de modifiers. Bestaat er een argument, dan wordt dit geëvalueerd in een Booleaanse context. Indien dit resultaat true is of er geen argument bestaat, dan stopt de ketting van modifiers.

Voorbeeld:

GT.M>k RAkeys

GT.M>s RAkeys("lower")=0

GT.M>r Template
{HELLO WORLD | stop:~lower | lower}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
HELLO WORLD
GT.M>s RAkeys("lower")=1

GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
hello world
GT.M>
7.13.2.4.18. template

De input wordt behandeld als een template in xfile mode. De template werkt met dezelfde parameters als de actuele template. Met andere woorden: de template roept een andere template op om een deelresultaat te krijgen.

Voorbeeld:

GT.M>k RAkeys

GT.M>s RAkeys("sign")="$"

GT.M>s RAkeys("hello")="world"

GT.M>r Template
{$sign{hello}|template}
GT.M>m4_tplResolve(result, Template, RAkeys, mode="xfile")

GT.M>w result
world
GT.M>
7.13.2.4.19. scope

Behandelt de input als een tekstfragment en berekent de scope van dit tekstfragment.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
{metaTgvocab.titlemetaTgvocabGeneral | scope}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
De eigenschappen van de diverse termen
GT.M>
7.13.2.4.20. text

Behandelt de input als een tekstfragment. Alle spelregels (namespace.textcode) worden gehanteerd. Ontbreekt een ‘.’ dan wordt het automatisch geprefixed.

Indien het argument bestaat, dan wordt het geëvalueerd en wordt het de defaultwaarde.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
$.ja
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Ja
GT.M>

GT.M>r Template
{ja | text}
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Ja
GT.M>
7.13.2.4.21. unset

BTS kan werken met een systeem van vlaggen. Deze vlaggen gaan nauw samen met het leeg zijn van de input.

unset werkt indien de input leeg is. Is het argument leeg, dan worden alle vlaggen vernietigd. Is het argument niet leeg, dan wordt dit argument beschouwd als de naam van een vlag en deze vlag wordt vernietigd.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
A{aaaaa | empty="a" | unset=vlag}B
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
AB
GT.M>
7.13.2.4.22. value

Dit is een andere naam voor eval

7.13.2.4.23. wspace

De whitespace die staat voor het eerste | symbool uit de lijst met de modifiers wordt bewaard. Deze modifier gaat de whitespace toevoegen (append) aan de input.

Voorbeeld:

GT.M>k RAkeys

GT.M>r Template
A{hello  | wspace}B
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
Ahello  B
GT.M>r Template
A{hello  |}B
GT.M>m4_tplResolve(result, Template, RAkeys)

GT.M>w result
AhelloB
GT.M>

7.14. Gebruik van BTS in software ontwikkeling

BTS kan ook worden gebruikt in x-files.

Op dit ogenblik kunnen formats worden beschouwd als een template: de naam van de format moet dan wel beginnen met een $. In de format mogen geen x4_ constructies worden gebruikt

Hou rekening met de escape afspraken.

7.15. Testen van templates

Er is in Brocade een faciliteit voorzien om templates te testen.Je moet wel eerst ingelogd zijn om hiermee te kunnen werken.