AweGen vorige pagina
Dit is de uitlegsite van AweGen.
Copyright H. Fluks
volgende pagina
AweGen
Input-files
Namen van velden
%-opdrachten
#-opdrachten
Expressies
Log-meldingen
Voorbeeld-input
   awegen.bat
   Config-file
   Header/footer-file
   Tree-file
   Layout-file
   Layout-file (library)
   Database-file
Datamodel
! UITLEGDB.TXT
!
!===========================================================================
#code hf_index
#naam AweGen
#binary slide01.jpg
#tekst
Welkom op de uitleg-site van het programma %awegen.<br/>
Als je hier voor het eerst komt, is de slide show wellicht handig.<br/>
Maak je keuze in het menu links!
!
#code hf_nietmee02 ^#binary slide02.jpg
#code hf_nietmee04 ^#binary slide04.jpg
#code hf_nietmee05 ^#binary slide05.jpg
#code hf_nietmee06 ^#binary slide06.jpg
#code hf_nietmee07 ^#binary slide07.jpg
#code hf_nietmee08 ^#binary slide08.jpg
#code hf_nietmee09 ^#binary slide09.jpg
#code hf_nietmee11 ^#binary slide11.jpg
#code hf_nietmee12 ^#binary slide12.jpg
!===========================================================================
#code hf_inleiding
#naam Inleiding
#binary slide03.jpg
#tekst
<br/><br/>
<b><font size="+1">%awegen</font></b><br/><br/>
!
Deze website beschrijft de werking van het programma %awegen. Met dit programma kun je een website genereren uit een verzameling tekstuele invoerfiles.
<p>
<b><font size="+1">Output</font></b><br/><br/>
!
Als <b>output</b> levert %awegen een website op, dat is een verzameling webpagina's.
<p>
Iedere %link(hf_b_webpage,,webpagina) bevat een standaard-header, 1 of meer secties, en een standaard-footer.
<p>
Een %link(hf_b_section,,sectie) bestaat uit 1 of meer %link(hf_b_item,,items), dat zijn %link(hf_b_record,,records) uit
de invoer die in een bepaalde %link(hf_b_layout,,layout) zijn afgedrukt.
<p>
<b><font size="+1">Input</font></b><br/><br/>
!
Als <b>input</b> heeft %awegen een aantal %link(hf_input,,input-files) nodig.<br/>
In deze files staan de %link(hf_b_record,,records) gedefinieerd met hun %link(hf_b_field,,velden), maar ook welke
records in welke output terecht moet komen, en in welke %link(hf_b_layout,,layout).
<p>
<b><font size="+1">Leeswijzer</font></b><br/><br/>
!
Voordat je de rest van de site leest, is het misschien handig om even de %link(hf_notaties,,notatie-pagina) te lezen, en
de %link(hf_begrippen,,begrippenlijst) door te nemen.
<p>
<b><font size="+1">Tot slot</font></b><br/><br/>
!
O ja, en je roept %awegen als volgt aan:
<pre>
   awegen.exe <i>c:\dir\awegen.cfg</i>
</pre>
Waarbij "c:\dir\awegen.cfg" de naam is van een config-file. Het is handig om bovenstaande regel in een batchfile te zetten.
<p>
Tenslotte: deze website beschrijft alleen %awegen versie 5.0 en hoger.
!
!===========================================================================
#code hf_notaties
#naam Notaties op deze site
#tekst
<b><font size="+1">Lettertype</font></b><br/><br/>
!
Op diverse plaatsen verklaar ik de %link(hf_b_syntax,,syntax) van een bepaalde opdracht voor %awegen, of ik geef voorbeelden van hoe je iets kunt gebruiken.
<p>
In deze gevallen is het lettertype altijd als volgt:
<pre>
  Dit is een voorbeeld
</pre>
Als je dingen niet letterlijk moet gebruiken, staan ze schuin gedrukt, dus bijvoorbeeld
<pre>
  %%eval(#<i>mijnveldnaam</i>)
</pre>
In dit voorbeeld bedoel ik dat je voor "#mijnveldnaam" zelf iets kan kiezen, terwijl je "eval" (en de diverse leestekens) letterlijk moet gebruiken.
<hr>
<b><font size="+1">Parameters</font></b><br/><br/>
!
Diverse opdrachten (dingen die beginnen met een %%) hebben extra informatie nodig. Die extra informatie noem ik "parameters".
<p>
Soms kun je voor de eigenlijke parameter een naampje zetten. Dit leest wat makkelijker. Bijvoorbeeld:
<pre>
%%pagetree(level=<i>3</i>,layout=##<i>l_tree4</i>)
</pre>
Dit is <b>altijd</b> hetzelfde als
<pre>
%%pagetree(<i>3,l_tree4</i>)
</pre>
<p>
Dus de extra naampjes "level=" en "layout=" hebben geen invloed op de werking.
<p>
Parameters moeten altijd in de goede volgorde staan, en allemaal aanwezig zijn. Dus de volgende dingen zijn ongeldig:
<pre>
%%pagetree(layout=##<i>l_tree4</i>,level=<i>3</i>)
%%pagetree(level=<i>3</i>)
</pre>
!===========================================================================
!       BEGRIPPEN
!===========================================================================
#code hf_begrippen
#naam Begrippen
#tekst
Deze pagina bevat een lijst met begrippen die overal op deze uitleg-site gebruikt worden.<br/>
De diverse soorten %link(hf_input,,input-files) worden hier niet genoemd.
!
!---------------------------------------------------------------------------
#code hf_b_field
#begripnaam field
#begripuitleg (of: <b>veld</b>) 1 elementair stukje gegevens. Een field duid je aan met zijn naam (datgene wat achter het # staat).
!---------------------------------------------------------------------------
#code hf_b_record
#begripnaam record
#begripuitleg Een verzameling %link(hf_b_field,,velden), bij elkaar gedefinieerd in een inputfile. Een record duid je aan met zijn #code-veld.
!---------------------------------------------------------------------------
#code hf_b_item
#begripnaam item
#begripuitleg
Een %link(hf_b_record,,record) in een bepaalde %link(hf_b_layout,,layout), zoals die terechtkomt in de output.
Een item duid je aan met het #code-veld van het bijbehorende record plus de naam van de layout.
<br/>
Een record kan dus meer dan 1 item hebben. Een %link(hf_perc_link,,%%link) is altijd naar een item,
want je moet niet alleen de #code van het record opgeven, maar ook de naam van de layout.
!---------------------------------------------------------------------------
#code hf_b_syntax
#begripnaam syntax
#begripuitleg Een syntax is een soort spelling-regel voor de input van %awegen.
!---------------------------------------------------------------------------
#code hf_b_layout
#begripnaam layout
#begripuitleg
Een beschrijving van hoe een %link(hf_b_item,,item) er in een uitvoerfile uit moet gaan zien.
Een layout heeft een naam (de tekst achter ## in een %link(hf_layoutfile,,layout-file), of "##default" als er geen ##-regel was).<br/>
Ieder item heeft 1 layout. Voor het maken van een link naar een item heb je de code van het %link(hf_b_record,,record) nodig, plus de naam van de layout.
!---------------------------------------------------------------------------
#code hf_b_fieldlayout
#begripnaam fieldlayout
#begripuitleg
Een deel van een %link(hf_b_layout,,layout) dat beschrijft hoe 1 %link(hf_b_field,,veld) van een record afgedrukt moet worden.
Een fieldlayout definieer je in een %link(hf_layoutfile,,layout-file).
!---------------------------------------------------------------------------
#code hf_b_section
#begripnaam section
#begripuitleg
Een deel van een %link(hf_b_webpage,,webpagina). Een section bevat 1 of meer %link(hf_b_item,,items).
!---------------------------------------------------------------------------
#code hf_b_webpage
#begripnaam webpage
#begripuitleg Een HTML-pagina die door %awegen is gegenereerd. Een webpage bevat een header, 1 of meer %link(hf_b_section,,secties), en een footer.
!===========================================================================
!       INPUT-FILES
!===========================================================================
#code hf_input
#naam Input-files
#binary slide13.jpg
#tekst
Voor <b>alle</b> input-files geldt: regels die beginnen met ! worden genegeerd.
<p>
Voor de %link(hf_treefile,,tree-file) en de %link(hf_databasefile,,database-files) geldt bovendien dat de tekens ^%hash ergens op een regel
precies hetzelfde betekent als een # op een nieuwe regel. Dus deze tekst:
<pre>
  #code x ^%hashnaam y ^%hashleeftijd z
</pre>
heeft precies hetzelfde effect als:
<pre>
  #code x
  #naam y
  #leeftijd z
</pre>
<p>
In de subpagina's heb ik het over diverse soorten input-files. Om verwarring te voorkomen noem ik ze overal hetzelfde (en ik gebruik expres geen echte filenamen).
<p>
Voor een voorbeeld van <b>echte</b> input-files kun je %link(hf_voorbeeldinput,,hier) kijken.
!===========================================================================
#code hf_configfile
#naam Config-file
#tekst
Deze file bevat o.a. informatie over welke andere input-files er bestaan.
<p>
Er moet precies 1 %link(hf_conf_4tree,,tree-regel) zijn. Van de andere kunnen er meer zijn.
<p>
Er kunnen de volgende soorten regels in deze file staan:
! handleOneParameterLine()
!
!---------------------------------------------------------------------------
#code hf_conf_1parameter
#naam parameter
#meernaam algemene instellingen
#tekst
<ul>
! awegen.cpp
<li><code>parameter,verbose,true</code><br/>
   laat %awegen veel informatie in de logfile schrijven, dan kun je beter nagaan wat-ie gedaan heeft.<br/>
   In normale gevallen schrijft %awegen nooit meer dan 10000 regels in de logfile. Maar als verbose op true staat, geldt deze begrenzing niet!<br/><br/>
<li><code>parameter,bookmarkfirstonpage,true</code><br/>
   zorgt ervoor dat het eerste item op een pagina ook een eigen adres (&lt;a name...&gt;) krijgt. Standaard is het adres van de pagina tevens het adres van het eerste item.<br/><br/>
<li><code>parameter,onlylogging,true</code><br/>laat %awegen alleen de logfile schrijven, dus geen andere files.
Dit kun je gebruiken om snel(ler) te kijken of er iets fout is.<br/><br/>
<li><code>parameter,logunused,no</code><br/>Normaal logt %awegen de ongebruikte records en layouts e.d. Met deze parameter kun je dat uitzetten.<br/><br/>
<li><code>parameter,inputdir,<i>pdirnaam</i></code>
<li><code>parameter,outputdir,<i>pdirnaam</i></code><br/>deze 2 spreken voor zich.<br/><br/>
<li><code>parameter,generateextoutputfile,true</code><br/>
   als deze op "true" staat, wordt er voor iedere externe inputfile een outputfile gemaakt met daarin de externe codes, plus de URL's van je
   eigen site. Deze files hebben de extensie <code>.OUT</code>. De files kunnen gebruikt worden als een andere site, bijvoorbeeld
   COA, automatische links wil maken naar je eigen site.<br/><br/>
<li><code>parameter,generatebinariesoutputfile,true</code><br/>
  als deze op "true" staat, genereert %awegen een csv-file met daarin informatie over alle binaire files die het programma kon vinden.<br/>
  Deze file kan een volgende keer ingelezen worden, zodat niet alle binaries zelf gelezen hoeven te worden. Dat gaat stukken sneller.
!@@@@@ MEER INFO OVER generatebinariesoutputfile (aparte pagina?)
<li><code>parameter,generateanalysis,<i>codestart</i></code><br/>
  Genereer een analyse-file (dataanalysis.OUT) met daarin een overzicht hoeveel records er zijn met <i>codestart</i> en welke velden
  door deze records gebruikt worden.<br/>
  Als voorbeeld een van mijn websites. Als ik in de CFG-file dit toevoeg:
<pre>
parameter,      generateanalysis, p
parameter,      generateanalysis, q
parameter,      generateanalysis, r
parameter,      generateanalysis, s
parameter,      generateanalysis, w
parameter,      generateanalysis, gem
parameter,      generateanalysis, logo
parameter,      generateanalysis, index
</pre>
ziet de file dataanalysis.OUT er als volgt uit:
<pre>
DATA ANALYSIS



RECORDS WITH DEF-FILE plaatsen.def

Total number of records is 6149
Field                               p      q      r      s      w    gem   logo  index   (..)
 #alsoref@                          -      -      -      -      -      -      -      -      1
 #bagnaam                          82      -      -      -      -      -      -      -      -
 #bagnummer                      2502      -      -      -      -      -      -      -      -
 #bijplaats                         6   1106    561      -    678      -      -      -      -
 #binary                            -      -      -      -      -      -     15      2     20
 #carnaval                        132     13      -      -      -      -      -      -      1
 #cat                            2502   1678    727     12    678      -      -      -      -
 #cattekst                         47      2      -      5      -      -      -      -      -
 #code                           2502   1678    727     12    678    466     15      2     69
 #datum                             -      -      -      -      -      -      -      -      2
 #deels                            79     48     45      -      2      -      -      -      -
 #deels@                            4     10      4      -      -      -      -      -      -
 #eiland                           26     13      2      7     10      -      -      -      -
 #fotograaf                         -      -      -      -      -      -      -      -      1
 #geeneigenfoto                    19     10     12      1      -      -      -      -      -
 #geenfoto                          3      1    231      6     24      -      -      -      -
 #gemeente                       2502   1678    727     12    678      -      -      -      -
 #gidslink                       2443    211     22      2      1    449      -      -      -
 #land                              -      -      -      -      -      -      -      -      3
 #logonietgebruiken                 -      -      -      -      -      -     10      -      -
 #mainref                           -      -      -      -      -      -      -      -      2
 #naam                           2502   1678    727     12    678    466      -      -     40
 #nummer                            -      -      -      -      -      -      -      -      1
 #ook                             342     87      -      1      1      -      -      -      1
 #pagina                          135    503    125      -    110      -      -      -      -
 #postc                          2502      -      -      -      -      -      -      -      -
 #postcodenaam                    192      -      -      -      -      -      -      -      -
 #prov                              -      -      -      -      -    466      -      -      -
 #reb                              44      1      -      -      -      -      -      -      -
 #route                             -      -      -      -      -      -      -      -      1
 #tekst                             -      -      -      -      -      -      -      -      1
 #tiental                           -      -      -      -      -      -      -      -      1
 #topo                           2502   1678    727     12    678      -      -      -      -
 #toponaam                          8     31      2      -     15      -      -      -      1
 #totpostc                        662      -      -      -      -      -      -      -      -
 #volgorde                          -      -      -      -      -      -     15      -      -
 #vrijetekst                        -      -      -      -      -      -      -      1     18
 #ziegem@                           -      -      -      -      -     90      -      -      -
 #ziegemtekst                       -      -      -      -      -     83      -      -      -
Subrecord 0: foto
-#binary                         8190   3175    654     13    853    152      -      -      -
-#datum                          8172   3164    651     13    853    151      -      -      -
-#foto2keer                        17     10      1      -      6      3      -      -      -
-#fotograaf                        53     43     34      1      2      -      -      -      -
-#subrecord                      8190   3175    654     13    853    152      -      -      -
-#tekst                           349    337     84      -     56      4      -      -      -
-#type                           8188   3175    654     13    853    151      -      -      -


RECORDS WITH DEF-FILE algwegen.def

Total number of records is 0
Field                         
</pre>
</ul>
!---------------------------------------------------------------------------
#code hf_conf_2externalinput
#naam externalinput
#meernaam geeft aan welke externe files er zijn (input)
#tekst
Een externe file is een file met records die gekoppeld kunnen worden aan
records uit je eigen database. Bijvoorbeeld een Inducks-file.
<ul>
<li><code>externalinput,<i>pfilenaam</i>,<i>pkeynaam</i></code><br/>
   pkeynaam = de naam van het veld dat een record in de externe database uniek definieert.<br/>Zeg maar de "#code" van het externe record.<br/><br/>
<li><code>externalinput,<i>pfilenaam</i>,<i>pkeynaam</i>,checkif(<i>expression</i>)</code><br/>
   zelfde als bovenstaande, maar "<code>checkif(<i>expression</i>)</code>" geeft aan dat je logmeldingen wil hebben als
   je externe records niet gebruikt die aan de expressie voldoen.
</ul>
!
!---------------------------------------------------------------------------
#code hf_conf_3database
#naam database
#meernaam geeft aan in welke %link(hf_databasefile,,database-files) de eigen %link(hf_b_record,,records) staan (input)
#tekst
<ul>
<li><code>database,<i>pfilenaam</i>,<i>playoutfilenaam</i></code><br/>
   pfilenaam = van de eigen database-file<br/>
   playoutfilenaam = de filenaam van de bijbehorende %link(hf_layoutfile,,layout-file).<br/>
   Iedere database-file heeft zijn eigen layouts. 2 databases kunnen wel dezelfde layout-file gebruiken.<br/><br/>

<li><code>database,<i>pfilenaam</i>,<i>playoutfilenaam1</i>,<i>playoutfilenaam2</i></code><br/>
   hetzelfde, maar nu met 2 layout-files. Hiermee kun je "layout libraries" maken die door meerdere layoutfiles gebruikt worden (d.m.v. %link(hf_perc_uselayout,,#naam)).<br/><br/>

<li><code>database,<i>pfilenaam</i>,<i>playoutfilenaam</i>,csv</code><br/>
   De database is in CSV-formaat, met op de eerste regel de veldnamen.<br/>
   De #codes van de records worden door %awegen bepaald.
</ul>
!
!---------------------------------------------------------------------------
#code hf_conf_4tree
#naam tree
#meernaam geeft aan in welke %link(hf_treefile,,tree-file) de definitie van de %link(hf_b_webpage,,webpagina's) staat (output)
#tekst
<ul>
<li><code>tree,<i>pfilenaam</i>,<i>pdeffilenaam</i></code><br/>
   pfilenaam = naam van de %link(hf_treefile,,tree-file) waar de website-structuur in staat<br/>
   pdeffilenaam = naam van de %link(hf_headerfooterfile,,header-footer-file) waar de layout van de standaard headers e.d. in staat.
</ul>
<p>
Er moet precies 1 %link(hf_conf_4tree,,tree-regel) zijn.
<p>
De tree-regel moet komen <b>na</b> alle %link(hf_conf_3database,,database-regels).
!
!---------------------------------------------------------------------------
#code hf_conf_5binaries
#naam binaries
#meernaam geeft aan welke binaries gebruikt kunnen worden (input)
#tekst
Het programma %awegen kan controleren of binaries (plaatjes en andere files) echt bestaan.
En of er files in een van die directory's staan die niet op de webpagina's gebruikt worden.<br/>
Bovendien kan het bij JPEG-files de hoogte en breedte van het plaatje uit de file lezen.<br/>
Net als bij external files wordt het veld #binary in de %link(hf_databasefile,,database-file) gebruikt om een database-record aan een binary te koppelen.
<ul>
<li><code>binaries,<i>premotedirectory</i>,<i>plocaldirectory</i></code><br/>
   premotedirectory = de directory die gebruikt moet worden in de HTML-code.<br/>
   plocaldirectory = het volledige pad van de directory waarop de binaries staan.<br/>
   De directory moet op je harde schijf staan, want tijdens het draaien van %awegen is er misschien geen toegang tot internet.<br/>
   De subdirectory's van deze directory worden niet meegenomen.<br/><br/>
<li><code>binaries,<i>premotedirectory</i>,<i>plocaldirectory</i>,check</code><br/>
   zelfde als bovenstaande, maar "<code>check</code>" geeft aan dat je een logmelding wil hebben als je een file niet gebruikt.
</ul>
!
!---------------------------------------------------------------------------
#code hf_conf_6setglobal
#naam setglobal
#meernaam zet een globale variabele
#tekst
<ul>
<li><code>setglobal,<i>pnaam</i>,<i>pwaarde</i></code><br/>
   Zie ook %link(hf_perc_set,,%%set).<p>
</ul>
Een setglobal-regel moet komen <b>voor</b> alle %link(hf_conf_3database,,database-regels)!
!
!===========================================================================
#code hf_headerfooterfile
#naam Header/footer-file
#tekst
Deze file definieert de %link(hf_b_layout,,layout) van de headers en footers van alle %link(hf_b_webpage,,webpagina's).
<p>
De file ziet er hetzelfde uit als een %link(hf_layoutfile,,layout-file). Het moet minimaal 2 layouts bevatten:
<p>
<pre>
   ##header
   ##footer
</pre>
<p>
En verder eventuele andere layouts die in de %link(hf_treefile,,tree-file) gebruikt worden in de velden
<code>#headerlayout</code> en <code>#footerlayout</code>.
<p>
Tenslotte moet deze file ook layouts bevatten die gebruikt worden in %link(hf_perc_pagetree,,%%pagetree-opdrachten).
!===========================================================================
#code hf_treefile
#naam Tree-file
#binary slide16.jpg
#tekst
Deze file bevat de namen van alle %link(hf_b_webpage,,webpagina's) (HTML), en welke %link(hf_b_item,,items) daarin opgenomen moeten worden.
Verder geeft de file de structuur van de website weer.
<p>
De volgorde van de webpagina-definities is van belang: deze wordt gebruikt in <code>%%pagelink(%%next,...)</code> en <code>%%pagelink(%%prev,...)</code>.<br/>
Zie %link(hf_perc_pagelink,,%%pagelink).
<p>
De %link(hf_b_syntax,,syntax) van deze file lijkt veel op die van een %link(hf_databasefile,,database-file). Let op een belangrijk verschil:
in de tree-file moet <b>iedere</b> regel met een # beginnen (of met een uitroepteken). Dat kan ook makkelijk, want je hebt nooit meer dan 1 regel per "veld" nodig.
<br/>
Ook zijn in de tree-file geen %link(hf_percopdrachten,,%%-opdrachten) mogelijk.
<p>
In de file kun je op 2 manieren %link(hf_b_webpage,,webpagina's) definiëren.
In de %link(hf_treefilenormaal,,normale gevallen) definieer je een webpagina met een aantal eigenschappen, en daarin 1 of meer
%link(hf_b_section,,secties) met per sectie 1 of meer items.
<br/>
Er is ook de mogelijkheid om in 1 keer een %link(hf_treefilegroep,,groep webpagina's) te definiëren, namelijk 1 webpagina per record.
<p>
Iedere webpagina-definitie begint met
<pre>
   #code <i>xxx</i>
</pre>
<p>
Daarna komen de andere velden, in de vorm
<pre>
   #<i>veldnaam waarde</i>
</pre>
<p>
Een webpagina-definitie kan %link(hf_b_section,,secties) bevatten. Dit wordt aangegeven als volgt:
<pre>
   #-section
   #-<i>veldnaam waarde</i>
   #-<i>veldnaam2 waarde</i>
</pre>
<p>
Alle velden die met #- beginnen horen bij de erboven gedefinieerde sectie.
<p>
Welke velden je kunt (of moet) definiëren hangt ervan af of je een %link(hf_treefilenormaal,,normale definitie) of een
%link(hf_treefilegroep,,groepsdefitie) maakt.
!
<hr>
Webpagina's hebben 2 soorten eigenschappen: eigenschappen die je in de tree-file aangeeft (zoals <code>page.#title, page.#longtitle</code>)
en eigenschappen die %awegen bepaalt (zoals <code>page.#date, page.#generator</code>).
De meeste eigenschappen kun je zelf ook opvragen, bijvoorbeeld met een <code>%%eval</code>-opdracht.
Zie %link(hf_veldnamen,,de pagina over veldnamen) voor de mogelijkheden.
!===========================================================================
#code hf_treefilenormaal
#naam Normale webpagina-definitie
#tekst
Bij een <b>normale</b> webpagina-definitie heb je de volgende velden:
<table border="1">
<tr><td><code>#code</code></td><td>
    de filenaam van de webpagina, zónder ".html" of andere extensie.</td></tr>
<tr><td><code>#title</code></td><td>
    de titel van de pagina, in headers e.d.</td></tr>
<tr><td><code>#directoryname</code></td><td>
    de naam van een subdirectory waar de file moet komen te staan.
    Als je geen <code>#directoryname</code> definieert, wordt de webpagina niet in een subdirectory geplaatst.<br/>
    Sub-subdirectory's zijn niet mogelijk.</td></tr>
<tr><td><code>#extension</code></td><td>
    de extensie van de filenaam (zonder punt).
    Standaard is dit html, dus je hoeft hier alleen iets op te geven als je iets anders wilt.</td></tr>
<tr><td><code>#longtitle</code></td><td>
    een langere titel. Je kunt deze met <code>%%eval</code>(<code>page.#longtitle</code>) opvragen.
    Zie %link(hf_veldnamen,,de uitleg over velden).
    Als je geen <code>#longtitle</code> definieert, neemt %awegen automatisch de title.</td></tr>
<tr><td><code>#parent</code></td><td>
    de <code>#code</code> van de "parent"-pagina in de pagina-boomstructuur.</td></tr>
<tr><td><code>#hide</code></td><td>
    als dit veld een waarde heeft (bijv. "true"), dan wordt de pagina <b>niet</b> afgedrukt.
    Ook worden er nergens links naar die webpagina gemaakt.</td></tr>
<tr><td><code>#linkallowedfromoutside</code></td><td>
    Dit veld is alleen zinvol bij "root"-pagina's, dus pagina's die geen <code>#parent</code> hebben.
    Als dit veld een waarde heeft (bijv. "true"), mogen er links naar deze pagina en alle onderliggende pagina's zijn van "buiten".
    Als <code>#linkallowedfromoutside</code> niet is opgegeven, geeft %awegen een foutmelding als er een link van "buiten" deze tak van de boom komt.</td></tr>
<tr><td><code>#headerlayout</code></td><td>
    de naam van de %link(hf_b_layout,,layout) die gebruikt moet worden voor de header van deze webpagina.
    Deze layouts staan gedefinieerd in de %link(hf_headerfooterfile,,header-footer-file).
    Als je geen <code>#headerlayout</code> definieert, neemt %awegen als headerlayout <code>##header</code>.</td></tr>
<tr><td><code>#footerlayout</code></td><td>
    de naam van de %link(hf_b_layout,,layout) die gebruikt moet worden voor de footer van deze webpagina.
    Deze layouts staan gedefinieerd in de %link(hf_headerfooterfile,,header-footer-file).
    Als je geen <code>#footerlayout</code> definieert, neemt %awegen als footerlayout <code>##footer</code>.</td></tr>
</table>
<p>
Binnen een webpagina heb je 1 of meer secties. Er zijn 2 soorten secties: secties die een verzameling items (records) bevatten, en secties die de inhoud van een
%link(hf_copyfile,,copy-file) bevatten.
<p>
Per %link(hf_b_section,,sectie) zijn er de volgende velden:
<table border="1">
<tr><td><nobr><code>#-layoutname</code></nobr></td><td>
    de %link(hf_b_layout,,layout) waarin alle records van de sectie moeten worden afgedrukt</td></tr>
<tr><td><nobr><code>#-summlayout</code></nobr></td><td>
    de %link(hf_b_layout,,layout) waarin alle records moeten worden afgedrukt in een aparte Summary-sectie, bovenaan de eigenlijke sectie.<br/>
    Deze summary-sectie heeft <code>#-nobookmarks true</code> en dezelfde <code>#-expression</code> en <code>#-sortfield</code> als de eigenlijke sectie.</td></tr>
<tr><td><nobr><code>#-summlayout2</code></nobr></td><td>
    Idem, voor als er nog een sectie tussen summlayout en de eigenlijk sectie moet zijn.</td></tr>
<tr><td><nobr><code>#-expression</code></nobr></td><td>
    records die voldoen aan de expressie worden in de sectie afgedrukt.</td></tr>
<tr><td><nobr><code>#-sortfield</code></nobr></td><td>
    de records in de sectie worden gesorteerd op dit veld (records die dit veld niet hebben doen alnog niet mee!).<br/>
    Als het sortfield niet #code is, wordt #code gebruikt als <i>tweede</i> veld om te sorteren.<br/>
    Als je geen sortfield opgeeft, wordt er gesorteerd op #code.</td></tr>
<tr><td><nobr><code>#-nobookmarks</code></nobr></td><td>
    als dit veld bestaat (en bijvoorbeeld "true" is), worden er geen bookmarks (<code>&lt;a name=".."&gt;</code>)
    gemaakt. Dat betekent dus dat er niet naar de items in deze sectie gelinkt kan worden!</td></tr>
<tr><td><nobr><code>#-literal</code></nobr></td><td>
    de tekst die achter &quot;literal&quot; staat wordt letterlijk afgedrukt.</td></tr>
</table>
<p>
Of, in het geval van een copy-file, de volgende velden:
<table border="1">
<tr><td><nobr><code>#-filename</code></nobr></td><td>
    de naam van een file waarvan de inhoud in de sectie gekopieerd moet worden.</td></tr>
<tr><td><nobr><code>#-copyfileliterally</code></nobr></td><td>
    als dit veld een waarde heeft (bijv. "true"), wordt de inhoud van de file letterlijk gekopieerd.
    Dat wil zeggen dat er geen %%-opdrachten e.d. worden uitgevoerd, en ook de HTML-tags worden letterlijk afgedrukt.
    Zie %link(hf_voorbeeldinput,,deze pagina's) voor een voorbeeld.</td></tr>
</table>
!===========================================================================
#code hf_treefilegroep
#naam Groeps-webpagina-definitie
#tekst
Bij een <b>groeps-</b>webpagina-definitie kun je <b>geen</b> <code>#-section</code>s definiëren.
Voor ieder record wordt door %awegen automatisch 1 webpagina gemaakt, met daarin 1 sectie, en binnen die sectie 1 item.
<p>
Je hebt de volgende velden:
<table border="1">
<tr><td><code>#code</code></td><td>het begin van de filenaam van de webpagina's. %awegen plakt hierachter de code van het record plus ".html".
<tr><td><code>#onepageperrecord</code></td><td>als dit veld een waarde heeft (bijv. "true"), geeft dit aan dat het om een groeps-definitie gaat.
<tr><td><code>#expression</code></td><td>records die voldoen aan de expressie krijgen ieder een eigen webpagina.
<tr><td><code>#fieldfortitle</code></td><td>de naam van het veld van het record dat dient als titel van de pagina, in headers e.d.
<tr><td><code>#layoutname</code></td><td>de %link(hf_b_layout,,layout) waarin ieder record in die ene sectie op zijn eigen pagina moet worden afgedrukt.
<tr><td><code>#parent</code></td><td>zie de %link(hf_treefilenormaal,,normale definitie).
<tr><td><code>#headerlayout</code></td><td>zie de %link(hf_treefilenormaal,,normale definitie).
<tr><td><code>#footerlayout</code></td><td>zie de %link(hf_treefilenormaal,,normale definitie).
<tr><td><code>#directoryname</code></td><td>zie de %link(hf_treefilenormaal,,normale definitie).
</table>
<p>
Alle gegenereerde webpagina's krijgen dezelfde <code>parent</code>, <code>directoryname</code>, <code>headerlayout</code> en <code>footerlayout</code>.
<p>
In het geval van groeps-definitie zijn <code>#longtitle</code>, <code>#extension</code>, <code>#hide</code> en <code>#linkallowedfromoutside</code> niet mogelijk.
!
!===========================================================================
#code hf_layoutfile
#naam Layout-file
#binary slide14.jpg
#tekst
!
Een layout-file bevat 1 of meer %link(hf_b_layout,,layouts). Een layout begint met
<pre>
   ##<i>layoutnaam</i>
</pre>
en eindigt bij de volgende layout (of het eind van de file).
<p>
Een layout bestaat uit 1 of meer %link(hf_b_fieldlayout,,fieldlayouts). Een fieldlayout heeft de vorm
<pre>
   #<i>naam
   inhoud
   inhoud</i>
</pre>
<p>
Dit geeft aan dat de inhoud wordt afgedrukt (in de HTML wordt gezet) voor alle velden van het record die de juiste naam hebben.
De inhoud tot de volgende # of ## hoort bij de fieldlayout.
<p>
In plaats van #naam kun je ook #-naam gebruiken. Hiermee suggereer je dat je het hebt over een veld dat alleen in een subrecord mag voorkomen.
%awegen doet echter niets met deze extra informatie.
<p>
Binnen de inhoud van een fieldlayout kun je met %link(hf_percopdrachten,,%%-opdrachten) speciale dingen laten afdrukken.
<p>
Er zijn nog speciale gevallen, zoals <code>#if</code> en <code>#always</code>. Zie de uitlegpagina's over %link(hf_hekopdrachten,,%hash-opdrachten).
!
!===========================================================================
#code hf_databasefile
#naam Database-file
#binary slide15.jpg
#tekst
Deze file bevat de eigenlijke database. Of een onderdeel ervan. Ieder record uit de database begint met
<pre>
   #code <i>xxx</i>
</pre>
Daarna komen de andere
velden, in de vorm
<pre>
   #<i>veldnaam waarde</i>
</pre>
of
<pre>
   #<i>veldnaam
   waarde
   en dit hoort ook nog bij het veld</i>
</pre>
<p>
of
<pre>
   #<i>veldnaam</i>@<i> waarde</i>
</pre>
<p>
De inhoud van een veld kan %link(hf_percopdrachten,,%%-opdrachten) bevatten, bijvoorbeeld <code>%%link</code>.
<p>
Een record kan <b>subrecords</b> bevatten. Dit wordt aangegeven als volgt:
<pre>
   #-subrecord <i>naamvanhetsubrecordtype</i>
   #-<i>veldnaam waarde</i>
   #-<i>veldnaam2 waarde</i>
</pre>
<p>
Alle velden die met <code>#-</code> beginnen horen bij het erboven gedefinieerde subrecord.
<p>
Een subrecord krijgt automatisch een <code>#code</code> van %awegen. Hierbij zorgen we ervoor dat de subrecords net zo gesorteerd blijven als in de input
(de database-file).
<p>
Een veld van een subrecord is ook automatisch een veld van het omvattende record ("superrecord").
Dat wil zeggen, het kan in %link(hf_perc_field,,%%field-opdrachten) gebruikt worden.
<p>
Bij veldnamen van subrecords kun je geen @s gebruiken.
<p>
Ieder veld moet uniek zijn (d.w.z. mag per record of subrecord maar 1 keer voorkomen), behalve als de veldnaam gevolgd wordt door een @.
Dus de volgende mogelijkheid is fout:
<pre>
   #<i>mijnveld mijnwaarde</i>
   #<i>mijnveld nogeenwaarde</i>
</pre>
<p>
Maar goed is:
<pre>
   #<i>mijnveld</i>@ <i>mijnwaarde</i>
   #<i>mijnveld</i>@ <i>nogeenwaarde</i>
</pre>
<p>
%awegen zorgt ervoor dat velden die dezelfde naam hebben in dezelfde volgorde worden afgedrukt als dat ze in de invoer staan.
<hr>
<b>#external</b>
<p>
Een bijzonder veld is:
<pre>
   #external
</pre>
De inhoud van dit veld geeft aan welk record uit een %link(hf_conf_2externalinput,,externe file) bij dit record hoort.
<p>
Bijvoorbeeld, als de %link(hf_configfile,,config-file) de volgende regel bevat:
<pre>
   externalinput,<i>stories.ins</i>,<i>storycode</i>
</pre>
En de database-file bevat het volgende:
<pre>
   #code <i>wdc31</i>
   #external <i>W WDC  31-01</i>
</pre>
<p>
Dan wordt uit de %link(hf_conf_2externalinput,,externe file) "stories.ins" een record gezocht waarbij het veld "storycode" de waarde "W WDC  31-01" heeft.
Alle velden van dit record zijn nu te benaderen als "externe velden" van "wdc31" in onze eigen database. Bijvoorbeeld <code>external.#storycode</code>.
<p>
%awegen geeft een logmelding als het externe record niet bestaat in de externe database.
<hr>
<b>#binary</b>
<p>
Een bijzonder veld is:
<pre>
   #binary
</pre>
De inhoud van dit veld geeft aan welke binary uit een %link(hf_conf_5binaries,,binaries-directory) bij dit record hoort.
<p>
Als de filenaam geen extensie heeft, neemt %awegen aan dat het <code>.jpg</code> moet zijn.
<p>
%awegen geeft een logmelding als det binary niet bestaat in een van de opgegeven binary-directory's.
!
!===========================================================================
#code hf_copyfile
#naam Copy-file
#tekst
In de %link(hf_treefile,,tree-file) kun je opgeven dat de inhoud van een file gekopieerd moet worden.
De header- en footer-secties worden eromheen gezet. Ook worden bepaalde %link(hf_percopdrachten,,%%-opdrachten) uitgevoerd.
!===========================================================================
!       VELDNAMEN
!===========================================================================
#code hf_veldnamen
#naam Veldnamen
#tekst
Op diverse plekken kun je de naam van een veld opgeven.
Bijvoorbeeld in een %link(hf_perc_field,,%%field), %link(hf_perc_field,,%%eval) of in een %link(hf_expressies,,expressie).
<p>
Veldnamen zien er bijvoorbeeld zo uit:
<pre>
    #date
    #date.neddate
    page.#date
    page.#date.neddate
</pre>
In het meest ingewikkelde geval bestaat de veldnaam uit 3 delen:
<ul>
<li>Prefix: <code>page</code>, <code>input</code>, <code>global</code> enz.
<li>De eigenlijke naam (begint altijd met een #)
<li>Postfix: <code>plussed</code>, <code>upper</code>, <code>neddate</code> enz.
</ul>
Maar prefix en postfix kunnen dus ook ontbreken.
<p>
Op de volgende pagina's staan overzichten van mogelijke pre- en postfixes.
!
!---------------------------------------------------------------------------
#code hf_veldnamenprefix
#naam Prefixes
#tekst
Afhankelijk van het prefix zijn bepaalde veldnamen mogelijk. De volgende tabel geeft een overzicht.
<table border="1">
<tr><td><i><b>Prefix</b></i></td><td><i><b>Naam</b></i></td><td><i><b>Omschrijving</b></i></td></tr>
!
<tr><td>(geen)</td><td>#<i>naam</i></td><td>
    de naam van een veld van het record (zoals dat in de %link(hf_databasefile,,database-file) achter een # staat. Voorbeeld: "#code")</td></tr>
!
<tr><td rowspan="2">item.</td><td>#sequencenumber</td><td>
    het volgnummer van het %link(hf_b_item,,item) binnen een %link(hf_b_section,,sectie).</td></tr>
<tr><td>#lastprinted</td><td>
    "true" als het item de laatste is binnen een sectie op de pagina, anders "false"</td></tr>
!
<tr><td rowspan="10">page.</td><td>#title</td><td>
    de titel van de huidige pagina, zoals aangegeven in het %link(hf_treefilenormaal,,%hashtitle-veld in de tree-file)</td></tr>
<tr><td>#longtitle</td><td>
    de lange titel (longtitle) van de huidige pagina, zoals aangegeven in het %link(hf_treefilenormaal,,%hashlongtitle-veld in de tree-file).</td></tr>
<tr><td>#directoryname</td><td>
    de (sub)directory waar de HTML-file komt te staan. Dit is wat je hebt opgegeven met een <code>#directory</code> in de %link(hf_treefile,,tree-file).</td></tr>
<tr><td>#levelstoreachnext</td><td rowspan="2">
    het aantal levels dat moet worden doorlopen in de pagina-boom om de volgende/vorige pagina te bereiken. Dit kun je gebruiken
    om een "next page"-link alleen neer te zetten als je binnen een bepaalde tak van de boom blijft.</td></tr>
<tr><td>#levelstoreachprev</td></tr>
<tr><td>#level</td><td>
    het level van de huidige pagina.<br/>
    Dit veld wordt als volgt bepaald:<br/>
    Webpagina's die geen parent hebben, hebben page.#level = 0.<br/>
    Webpagina's die een parent hebben met page.#level = 0, hebben zelf page.#level = 1.<br/>
    Webpagina's die een parent hebben met page.#level = 1, hebben zelf page.#level = 2.<br/>
    Enzovoort.<br/></td></tr>
<tr><td>#generator</td><td>
    "AweGen" plus zijn versienummer (is gelijk voor alle pagina's)</td></tr>
<tr><td>#filename</td><td>
    De naam van de webpagina-file.</td></tr>
<tr><td>#date</td><td>
    de aanmaakdatum van de huidige pagina (is gelijk voor alle pagina's).<br/>
    Deze datum kun je in het gewenste formaat gebruiken, dus bijvoorbeeld <code>page.#date.usadate</code> en <code>page.#date.neddate</code> (zie hieronder).</td></tr>
<tr><td>xxx</td><td>
    pagina-veld "xxx", zie %link(hf_perc_set,,%%set).</td></tr>
!
<tr><td rowspan="2">input.<td>#sourcelinenumber</td><td>
    Kan handig zijn bij het debuggen.</td></tr>
<tr><td>#sourcefilename</td><td>
    Kan handig zijn bij het debuggen.</td></tr>
!
<tr><td rowspan="5">binary.</td><td>#height</td><td rowspan="2">
    De hoogte en breedte van een JPEG-plaatje, als %awegen die uit de binaire file heeft kunnen lezen.</td></tr>
<tr><td>#width</td></tr>
<tr><td>#creationdate</td><td>
    De aanmaakdatum van een JPEG-plaatje (foto), als %awegen die uit de binaire file heeft kunnen lezen.</td></tr>
<tr><td>#localdirectory</td><td>
    De locale directory van een plaatje. Dit heb je opgegeven op de <code>binaries</code>-regel in de %link(hf_configfile,,config-file).
    Omdat er meerdere directory's met binaries kunnen zijn, kun je met dit veld bekijken in welke van de mogelijke directory's hij staat.</td></tr>
<tr><td>#realdirectory</td><td>
    De (sub)directory die in de HTML gebruikt wordt bij verwijzingen naar een binary.
    Dit heb je opgegeven op de <code>binaries</code>-regel in de %link(hf_configfile,,config-file).</td></tr>
!
<tr><td>external.</td><td>#xxx</td><td>
    de naam van een "external"-veld van het record (bijvoorbeeld "#storycode").
    Voorwaarde is dat het record gekoppeld moet zijn aan een extern record (met #external in de %link(hf_databasefile,,database-file)).</td></tr>
<tr><td>global.</td><td>xxx</td><td>
    globale variabele "xxx", zie %link(hf_perc_set,,%%set).</td></tr>
<tr><td>superrecord.</td><td>#xxx</td><td>
    veld "#xxx" van het super-record (als het record zelf een subrecord is)</td></tr>
!
<tr><td rowspan="5">node.</td><td>#chosen</td><td rowspan="5">
    Deze 5 kunnen in layouts staan die door een %link(hf_perc_pagetree,,%%pagetree) gebruikt worden. Die de uitleg aldaar.</td></tr>
<tr><td>#nexttochosen</td></tr>
<tr><td>#self</td></tr>
<tr><td>#levelintree</td></tr>
<tr><td>#rootfilename</td></tr>
</table>
!
!---------------------------------------------------------------------------
#code hf_veldnamenpostfix
#naam Postfixes
#tekst
De volgende postfixes zijn mogelijk:
<table border="1">
<tr><td>.plussed</td><td colspan="2">
    vervangt spaties door "+". Dit kun je gebruiken bij links naar externe websites zoals COA.</td></tr>
<tr><td>.upper</td><td colspan="2">
    zet alle letters om in hoofdletters. HTML-codes zoals &amp;auml; worden &amp;Auml; en dus niet &amp;AUML; (dat is namelijk geen standaard-HTML).</td></tr>
<tr><td>.integer</td><td colspan="2">
    verwijdert voorloopnullen in getallen ("004" wordt "4").</td></tr>
<tr><td>.csv</td><td colspan="2">
    vervangt double quotes (") door "" en vervangt newlines door \n. Dit kun je gebruiken als de waarde in een CSV-file komt te staan.</td></tr>
<tr><td>.squotesc</td><td colspan="2">
    vervangt single quotes door "\'" en haalt newlines weg. Dit kun je gebruiken als de waarde zelf tussen '' moet komen te staan (bijvoorbeeld in javascript).</td></tr>
<tr><td>.usadate</td><td>
    zet het veld om naar een Amerikaanse datum, dus bijvoorbeeld "January 3, 2004".
    </td><td rowspan="5">Deze functies beschouwen het veld als een datumveld in het formaat JJJJ-MM-DD.</td></tr>
<tr><td>.neddate</td><td>
    zet het veld om naar een Nederlandse datum, dus bijvoorbeeld "3 januari 2004".</td></tr>
<tr><td>.yyyymm</td><td>
    zet het veld om naar 4-cijferig jaartal + '-' + maand, dus bijvoorbeeld "2004-01".</td></tr>
<tr><td>.usaweekday</td><td>
    bepaal de dag van de week in het Engels. Dit is een van de volgende:<br/>
    Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday. (Let op: de dagen beginnen met een hoofdletter.)</td></tr>
<tr><td>.nedweekday</td><td>
    bepaal de dag van de week in het Nederlands. Dit is een van de volgende:<br/>
    maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag, zondag. (Let op: alles in kleine letter.)</td></tr>
<tr><td>.num</td><td colspan="2">
    dit geeft niet aan hoe de waarde afgedrukt moet worden, maar hoe %awegen de waarde moet interpreteren bij het vergelijken en optellen.<br/>
    Dat kan namelijk alfabetich of numeriek. Zie %link(hf_perc_add,,%%add) en %link(hf_expressies,,expressies).</td></tr>
</table>
!
!===========================================================================
!       PERC-OPDRACHTEN
!===========================================================================
#code hf_percopdrachten
#naam %%-opdrachten
#tekst
Op diverse plekken kun je met %%-opdrachten speciale dingen laten afdrukken. Als je een echt %%-teken wil afdrukken moet je daarom %%%% gebruiken.
<p>
Je kunt %%-opdrachten gebruiken in:
<ul>
<li>%link(hf_b_fieldlayout,,fieldlayouts) in een %link(hf_layoutfile,,layout-file);
<li>de inhoud van een %link(hf_b_field,,veld) in een %link(hf_databasefile,,database-file);
<li>de inhoud van een %link(hf_copyfile,,copy-file);
<li>de layout van een header/footer in de %link(hf_headerfooterfile,,header-footer-file).
</ul>
<p>
%awegen logt het altijd als een %%-opdracht niet kan worden uitgevoerd. Het kan dus nooit kwaad om het te proberen.
<p>
In het menu links staat een alfabetische lijst van %%-opdrachten, behalve de volgende.
<p>
Een aantal %%-opdrachten zijn bedoeld om een bijzonder teken te kunnen gebruiken op een plek waar dat normaal niet kan.
Bijvoorbeeld als je een haakje-sluiten wilt gebruiken <i>binnen</i> een tekst die tussen haakjes moet staan.
Het gaat om de volgende:
<table border="1">
<tr><td><b>Letterteken:</b></td><td><b>Opdracht:</b></td></tr>
<tr><td>%%                 </td><td><code>%%%%</code></td></tr>
<tr><td>%braceleft         </td><td><code>%%braceleft</code></td></tr>
<tr><td>%braceright        </td><td><code>%%braceright</code></td></tr>
<tr><td>%comma             </td><td><code>%%comma</code></td></tr>
<tr><td>%hash              </td><td><code>%%hash</code></td></tr>
</table>
<p>
Soms kan er binnen de haakjes van een %%-opdracht weer iets staan dat begint met een %%, bijvoorbeeld in %link(hf_perc_link,,%%link).
Dat zijn dus geen echte %%-opdrachten:
<table border="1">
! eParamSelf
<tr><td><code>%%self</code></td><td>Slaat op het record zelf</td></tr>
! eParamPrev
<tr><td><code>%%prev</code></td><td>Slaat op het vorige item of de vorige pagina</td></tr>
! eParamNext
<tr><td><code>%%next</code></td><td>Slaat op het volgende item of de volgende pagina</td></tr>
! eParamSuper
<tr><td><code>%%super</code></td><td>Slaat op het "super"-record van een subrecord. Zie %link(hf_perc_record,,%%record).</td></tr>
! eParamRest
<tr><td><code>%%rest</code></td><td>Zie %link(hf_perc_f,,#naam)</td></tr>
</table>
!
!---------------------------------------------------------------------------
! ePercAweGen
#code hf_perc_awegen        ^#naam %%awegen     ^#syntax %%awegen     ^#tekst Print het logo van %awegen.
!---------------------------------------------------------------------------
! ePercNoUsageCheck
#code hf_perc_nousagecheck  ^#naam %%nousagecheck ^#syntax %%nousagecheck  ^#tekst Geef geen logmelding als dit item in de %link(hf_layoutfile,,layout-file) nooit gebruikt wordt.
!---------------------------------------------------------------------------
! ePercVal
#code hf_perc_val           ^#naam %%val        ^#syntax %%val
#tekst
   Print de waarde van het huidige veld.
<p>
   Merk op dat deze waarde zelf ook weer %%-opdrachten kan bevatten. Dit kan dus een "onbeperkt" aantal
   niveaus diep gaan. (Als het aantal niveaus heel erg veel wordt, geeft %awegen een logmelding.)
! eParamVal
<p>
   %%val kan ook in bepaalde andere %%-opdrachten tussen de haakjes voorkomen, bijvoorbeeld in %link(hf_perc_link,,%%link).
!---------------------------------------------------------------------------
! ePercNoVal
#code hf_perc_noval         ^#naam %%noval      ^#syntax %%noval
#tekst
   Print de waarde van het huidige veld <b>niet</b>. Maar sla wel op dat het veld gebruikt is. Op die manier voorkom je dat er een foutmelding
   in de logfile komt voor velden waarvan de inhoud niet relevant is.
<p>
   Een veld hoeft niet zichtbaar op een webpagina te staan om als "gebruikt" aangemerkt te worden.
   Ook als het bijvoorbeeld in een %link(hf_perc_link,,%%link) staat, is het gebruikt.
!---------------------------------------------------------------------------
! ePercRawVal
#code hf_perc_rawval        ^#naam %%rawval     ^#syntax %%rawval
#tekst Print de waarde van het huidige veld zo letterlijk mogelijk. Dus %%-opdrachten binnen het veld worden letterlijk overgenomen.
!---------------------------------------------------------------------------
! ePercDiffCheck
#code hf_perc_diffcheck     ^#naam %%diffcheck  ^#syntax %%diffcheck
#tekst Dit heft een eventuele %link(hf_perc_nodiffcheck,,%%nodiffcheck) op. Zie verder de uitleg aldaar.
!---------------------------------------------------------------------------
! ePercNoDiffCheck
#code hf_perc_nodiffcheck   ^#naam %%nodiffcheck^#syntax %%nodiffcheck
#tekst
   Bij iedere output-file kijkt %awegen of er al een file bestaat en zo ja, of de inhoud
   van die file identiek is, afgezien van teksten tussen <code>%%nodiffcheck</code>
   en <code>%%diffcheck</code>. Identieke outputfiles worden niet opnieuw weggeschreven. Je kunt dus aan de filedatum zien welke files
   veranderd zijn na het draaien van %awegen. Dat kan handig zijn bij het uploaden van je website.
<p>
   Vanaf dit punt controleert %awegen NIET of de output verschilt van eventuele al bestaande output (van een vorige %awegen-run).
   Je gebruikt <code>%%nodiffcheck</code> en <code>%%diffcheck</code> met name om een generatiedatum niet in de controle te betrekken. Bijvoorbeeld:
<pre>
      %%nodiffcheck(Deze pagina is gegenereerd door %%eval(page.#generator)
      op %%eval(page.#date))%%diffcheck
</pre>
  De tekst tussen <code>%%nodiffcheck</code> en <code>%%diffcheck</code> moet altijd even lang zijn! Dus een datumveld werkt hier
  alleen als de layout van de datum altijd even lang is (en dus niet met bijv. <code>.neddate</code>, omdat de namen
  van de maanden van lengte verschillen).
!---------------------------------------------------------------------------
! ePercNoBreak
#code hf_perc_nobreak       ^#naam %%nobreak    ^#syntax %%nobreak
#tekst
   Print <b>geen</b> regelovergang.<br/>
   Normaal gebeurt dat wel, omdat er een regelovergang in de invoerfile staat.<br/>
   Er is een uitzondering: als er een %%-opdracht met () is aan het eind van een regel, dan wordt er geen regelovergang geprint.<br/>
   Dus bijvoorbeeld na een <code>%%eval(...)</code> aan het eind van een regel is nooit een <code>%%nobreak</code> nodig.<br/>
   Een uitzondering op deze uitzondering is %link(hf_perc_f,,#naam).
<p>
   Een <code>%%nobreak</code> werkt alleen als hij aan het eind van een regel staat!
!---------------------------------------------------------------------------
! ePercNop
#code hf_perc_nop           ^#naam %%nop        ^#syntax %%nop
#tekst
   Print <b>helemaal niets</b>.
<p>
   Dit is handig als je in de output een # of ! aan het begin van een regel wilt hebben. Je laat de regel dan beginnen met <code>%%nop</code>
   zodat de # of ! in de input niet meer aan het begin van een regel staan, maar in de output wel!
!---------------------------------------------------------------------------
! ePercLink
#code hf_perc_link          ^#naam %%link
#syntax@ %%link(<i>pcode,##playout,ptekst</i>)
#syntax@ %%link(<i>pcode,##playout,#pveld</i>)
#syntax@ %%link(<i>pcode,##pdoellayout,##plinklayout</i>)
#tekst
   Print voor record met code pcode een link naar de plek waar hij afgedrukt wordt in layout ##playout.
   In de link komt de tekst ptekst te staan, of de inhoud van #pveld (van record pcode), of het record pcode in de layout ##plinklayout.
   Dus bijvoorbeeld:
<pre>
      &lt;a href="<i>pagevanpcode</i>#<i>playout</i>"&gt;<i>ptekst</i>&lt;/A&gt;
</pre>
<p>
   Als blijkt dat een link naar het item zelf wijst (op dezelfde plek op dezelfde pagina) wordt hij niet als echte link afgedrukt.
<p>
   pcode kan de volgende bijzondere waarden hebben:
   <ul>
   <li><code>%%val</code>: print een link naar het item waarvan de naam in het huidige veld staat.
   <li><code>%%self</code>: print een link naar het record zelf (mogelijk in een andere layout).
   <li><code>%%prev</code>: print een link naar het vorige item in dezelfde sectie.
   <li><code>%%next</code>: print een link naar het volgende item in dezelfde sectie.
   </ul>
<p>
   Als je wilt linken naar de ##default-layout, dan kun je de tekst <code##default</code> weglaten, maar wel 2 komma's achter elkaar zetten.
   Dus bijvoorbeeld:
<pre>
      %%link(<i>pcode,,ptekst</i>)
</pre>
!---------------------------------------------------------------------------
! ePercLinkTarget
#code hf_perc_linktarget    ^#naam %%linktarget
#syntax@ %%linktarget(<i>#pcode,##playout</i>)
#syntax@ %%linktarget(%%val,<i>##playout</i>)
#syntax@ %%linktarget(%%self,<i>##playout</i>)
#tekst
   Print voor record met code #pcode het "target" van een link naar de plek waar hij afgedrukt wordt in layout ##playout. Dat wil zeggen:
<pre>
      <i>pagevanpcode</i>#<i>playout</i>
</pre>
   De layout bevat niet de ## die normaal onderdeel van de naam zijn, omdat HTML-links een # anders interpreteren.
<p>
   Deze %%-opdracht kun je gebruiken als je op een andere manier wilt linken dan met de standaard <code>&lt;a href="..."&gt;...&lt;/a&gt;</code>.
   Bijvoorbeeld met een button.
<p>
   pcode kan de volgende bijzondere waarden hebben:
   <ul>
   <li><code>%%val</code>: print een link naar het item waarvan de naam in het huidige veld staat.
   <li><code>%%self</code>: print een link naar het record zelf (mogelijk in een andere layout).
   </ul>
<p>
   Als je wilt linken naar de ##default-layout, dan kun je de tekst <code##default</code> weglaten, maar wel de komma gebruiken.
   Dus bijvoorbeeld:
<pre>
      %%linktarget(<i>pcode,</i>)
</pre>
!---------------------------------------------------------------------------
! ePercNoLink
#code hf_perc_nolink            ^#naam %%nolink
#syntax@ %%nolink(<i>pcode,##playout,ptekst</i>)
#syntax@ %%nolink(<i>pcode,##playout,#pveld</i>)
#syntax@ %%nolink(<i>pcode,##pdoellayout,##plinklayout</i>)
#tekst
Print geen link, maar controleer wel of de link geldig is, en print ptekst (of de inhoud van #pveld, of het record in layout ##plinklayout).
<p>
Zie %link(hf_perc_link,,#naam).
!---------------------------------------------------------------------------
! ePerc
#code hf_perc_f                 ^#naam %%f
#syntax@ %%f(<i>#pveld</i>)
#syntax@ %%f(%%rest)
#tekst
   Print de inhoud van %link(hf_b_field,,veld) #pveld van het huidige %link(hf_b_record,,record).
   Inclusief eventuele commentaarregels. De inhoud wordt niet ge&iuml;nterpreteerd, dus %%-opdrachten blijven gewoon staan.
<p>
   Deze opdracht kun je gebruiken bij het maken van een kopie van je input-files.
<p>
   Als enige %%-opdracht met haakjes wordt er na het haakje sluiten WEL een regelovergang gebruikt. Tenzij je %link(hf_perc_nobreak,,#naam) gebruikt.
<p>
   Als je %%f(%%rest) gebruikt, worden alle velden afgedrukt die tot nu toe nog niet met een %%f-opdracht genoemd waren.
   Daarbij wordt eerst de veldnaam (met een #) afgedrukt en daarna op een nieuwe regel de veld-inhoud.
   (Als het record een subrecord is, wordt de veldnaam met #- afgedrukt en de veld-inhoud op dezelfde regel.)
<p>
   Let op: met %%f(%%rest) worden NIET de ongebruikte subrecords afgedrukt.
<p>
   %%f(%%rest) MOET aan het begin van een regel staan!
!---------------------------------------------------------------------------
! ePercEval
#code hf_perc_eval             ^#naam %%eval
#syntax@ %%eval(<i>pexpressie</i>)
#tekst
   Evalueert de expressie <i>pexpressie</i> en print het resultaat.
<p>
   Met %%eval kun je ook een aantal %link(hf_veldnamen,,eigenschappen van de webpagina) afdrukken.
!---------------------------------------------------------------------------
! ePercField
#code hf_perc_field             ^#naam %%field
#syntax@ %%field(<i>pcode,#pveld</i>)
#syntax@ %%field(%%val,<i>#pveld</i>)
#tekst
   Print de inhoud van %link(hf_b_field,,veld) #pveld van het %link(hf_b_record,,record) met als #code pcode.
<p>
   pcode kan de volgende bijzondere waarde hebben:
   <ul>
   <li><code>%%val</code>: print het veld waarvan de naam in het huidige veld staat.
   </ul>
!---------------------------------------------------------------------------
! ePercPageLink
#code hf_perc_pagelink          ^#naam %%pagelink
#syntax@ %%pagelink(<i>pfilenaam,ptekst</i>)
#syntax@ %%pagelink(<i>pfilenaam,#pveld</i>)
#tekst
   Zet in de output:
<pre>
      &lt;a href="<i>pfilenaam</i>"&gt;<i>ptekst</i>&lt;/A&gt;
</pre>
   (Of in plaats van ptekst de inhoud van #pveld, bijvoorbeeld #title).<br/>
<p>
   Met als extraatje dat %awegen controleert of de pagina wel bestaat (op de eigen site). Bovendien wordt gekeken of de link op de pagina zelf staat. Als dat
   zo is, wordt geen <code>a-href</code>-gedoe afgedrukt.
<p>
   pfilenaam mag niet eindigen met ".html" (dat zet %awegen er zelf achter).
<p>
   pfilenaam kan de volgende bijzondere waarden hebben:
   <ul>
   <li><code>%%val</code>: print een link naar de pagina waarvan de naam in het huidige veld staat.
   <li><code>%%self</code>: print een link naar de (top van de) eigen webpagina.
   <li><code>%%prev</code>: print een link naar de vorige pagina.
   <li><code>%%next</code>: print een link naar de volgende pagina.
   </ul>
!---------------------------------------------------------------------------
! ePercPageTree
#code hf_perc_pagetree          ^#naam %%pagetree           ^#syntax %%pagetree(level=<i>plevel</i>,layout=##<i>playout</i>)
#tekst
   Print alle webpagina's op level plevel, in layout ##playout.
<p>
   plevel is een cijfer van 0 t/m 9, of een "*". Een "*" betekent: neem alle levels.
<p>
   ##playout moet gedefinieerd zijn in de %link(hf_headerfooterfile,,header-footer-file).
   <br/>
   Daar kunnen een aantal speciale velden gebruikt worden (met <code>%%eval</code> of in een <code>#if</code>/<code>#ifnot</code>).
   Deze velden hebben allemaal de waarde "true" of "false":
<p>
<table border="1">
<tr><td><code>node.#chosen</code></td><td>"true" als de pagina een voorouder (in de boom) is van de huidige pagina
    (dus de <code>#parent</code> is, of de <code>#parent</code> van de <code>#parent</code>, enz.)</td></tr>
<tr><td><code>node.#nexttochosen</code></td><td>
    "true" als de pagina een broertje is van de huidige pagina (dus als beide pagina's dezelfde <code>#parent</code> hebben.)</td></tr>
<tr><td><code>node.#self</code></td><td>"true" als de pagina de huidige pagina is</td></tr>
<tr><td><code>node.#levelintree</code></td><td>het level in de boom</td></tr>
<tr><td><code>node.#rootfilename</code></td><td>de (file)naam van de "wortel" in de boom</td></tr>
</table>
<p>
   Ik gebruik <code>%%pagetree</code> om de ingewikkelde boomstructuur in de standaard-header en footer wat makkelijker te kunnen editen.
   Maar misschien is het ook op andere plekken nuttig.
!---------------------------------------------------------------------------
! ePercStdPageTree
#code hf_perc_stdpagetree        ^#naam %%stdpagetree        ^#syntax %%stdpagetree(1)
#tekst
   Print alle webpagina's in standaardlayout nummer 1.<br/>
   Op dit moment is er maar 1 standaardlayout. Dat is (niet toevallig) de layout die wordt gebruikt op de website waar je nu naar kijkt.
!---------------------------------------------------------------------------
! ePercError
#code hf_perc_error             ^#naam %%error
#syntax@ %%error(<i>ptekst</i>)
#syntax@ %%error(<i>#pveld</i>)
#tekst
   De tekst ptekst (of de inhoud van pveld) wordt in de logfile als foutmelding afgedrukt. Dit is handig als je een veld alleen bepaalde waarden wil laten hebben.
   Je zet bijvoorbeeld in een %link(hf_layoutfile,,layout-file):
<pre>
   #if(#<i>gepensioneerd</i>=<i>ja</i>)
   <i>De persoon is inmiddels met pensioen.</i>
   #if(#<i>gepensioneerd</i>=<i>nee</i>)
   <i>De persoon is nog niet met pensioen.</i>
   #if(#<i>gepensioneerd</i>!=)&(#<i>gepensioneerd</i>!=<i>ja</i>)&(#<i>gepensioneerd</i>!=<i>nee</i>)
   %%error(<i>Veld gepensioneerd mag alleen ja of nee bevatten!</i>)
   %%error(#<i>gepensioneerd</i>)
</pre>
   of bijvoorbeeld als je wil dat een veld altijd bestaat:
<pre>
   #if(#<i>gepensioneerd</i>=)
   %%error(<i>Veld gepensioneerd moet bestaan!</i>)
</pre>
!---------------------------------------------------------------------------
! ePercSet
#code hf_perc_set         ^#naam %%set
#syntax@ %%set(global.<i>pnaam,pwaarde</i>)
#syntax@ %%set(page.<i>pnaam,pwaarde</i>)
#tekst
   Je kunt je eigen stukjes geheugen definiëren, en daar teksten inzetten en uithalen. Dit is handig, bijvoorbeeld als je een koptekst
   wilt definiëren, maar op een heel andere plek wil besluiten of je die koptekst ook echt gebruikt.
<p>
   Een waarde kan globaal (global) beschikbaar blijven, of op iedere pagina anders zijn (page).
<p>
   pwaarde kan ook %%val zijn.
<p>
   Testen op de waarde van een variabele kan bijvoorbeeld in een expressie:
<pre>
      #ifnot(global.<i>g_kop</i>=)
</pre>
   en de waarde afdrukken kan bijvoorbeeld met:
<pre>
      %%eval(global.<i>g_kop</i>)
</pre>
<p>
   %%set zet de tekst "pwaarde" in de variabele 'global.pnaam' of 'page.pnaam'.
<p>
   Zie ook %link(hf_perc_add,,#naam).<p>
!---------------------------------------------------------------------------
! ePercAdd
#code hf_perc_add    ^#naam %%add
#syntax@ %%add(global.<i>pnaam,pwaarde</i>)
#syntax@ %%add(global.<i>pnaam</i>.num,<i>pwaarde</i>)
#syntax@ %%add(page.<i>pnaam,pwaarde</i>)
#syntax@ %%add(page.<i>pnaam</i>.num,<i>pwaarde</i>)
#tekst
   Voegt de tekst of het getal "pwaarde" toe aan de variabele 'global.pnaam' (of 'page.pnaam').
   Als er achter pnaam .num staat, worden er getallen bij elkaar opgeteld. Zo niet, dan worden er teksten achter elkaar geplakt.
   Hierbij gaan we ervan uit dat de variabele 'pnaam' een getal bevat.
   Als dit niet zo is, wordt uitgegaan van 0 (nul). Hetzelfde geldt voor 'pwaarde': als dat geen getal is, wordt het getal 0 opgeteld.
<p>
   Het verschil tussen .num en zonder .num is dus dat de variabelen als getallen worden beschouwd. Voorbeeld:
<pre>
    %%set(global.voorbeeld,1)
    %%add(global.voorbeeld,4)
    %%set(global.tweedevoorbeeld,1)
    %%add(global.tweedevoorbeeld.num,4)
</pre>
<p>
    de variabele global.voorbeeld is nu "14", global.tweedevoorbeeld is "5".
!---------------------------------------------------------------------------
! ePercDumpGlobals
#code hf_perc_dumpglobals    ^#naam %%dumpglobals
#tekst
   Laat een overzicht in de logfile zien van alle velden zie met %link(hf_perc_set,,%%set) en/og %link(hf_perc_add,,%%add) gevuld zijn.
   Dit kan handig zijn bij het zoeken naar fouten.
!---------------------------------------------------------------------------
! ePercSelection
#code hf_perc_selection         ^#naam %%selection
#syntax@ %%selection(codestart=<i>pcodestart</i>,referringfield=#<i>pveld1</i>,layout=##<i>playout</i>,sortfield=#<i>pveld2</i>)
#syntax@ %%selection(codestart=<i>pcodestart</i>,referringfield=*,layout=##<i>playout</i>,sortfield=#<i>pveld2</i>)
#tekst
   De eerste mogelijkheid print alle records:
   <ul>
   <li>waarvan het #code-veld begint met 'pcodestart';
   <li>die een veld hebben dat '#pveld1' heet en waarin mijn code staat;
   <li>in de layout ##playout;
   <li>waarbij het veld '#pveld2' bestaat;
   <li>gesorteerd op '#pveld2'.
   </ul>
   De tweede mogelijkheid (met "*") print alle records:
   <ul>
   <li>waarvan het #code-veld begint met 'pcodestart';
   <li>die een veld hebben waarin mijn #code staat (dit mag ieder veld zijn);
   <li>in de layout ##playout;
   <li>waarbij het veld '#pveld2' bestaat;
   <li>gesorteerd op '#pveld2'.
   </ul>
<p>
   Over de sortering: als het sortfield niet #code is, wordt #code gebruikt als <i>tweede</i> veld om te sorteren.
!@@@ hash keys in linklist or sorting Âêé etc.
!---------------------------------------------------------------------------
! ePercXSelection
#code hf_perc_xselection        ^#naam %%xselection     ^#syntax %%xselection(codestart=<i>pcodestart</i>,layout=##<i>playout</i>,sortfield=#<i>pveld2</i>)
#tekst
   Print alle records:
   <ul>
   <li>waarvan het #code-veld begint met 'pcodestart';
   <li>die <b>ergens</b> in een veld een #code hebben staan van een record dat ergens in een veld <b>mijn</b> #code heeft staan.
   <li>in de layout ##playout;
   <li>waarbij het veld '#pveld2' bestaat;
   <li>gesorteerd op '#pveld2'.
   </ul>
<p>
   Het verschil met %link(hf_perc_selection,,%%selection)(pcodestart,*,##playout,#pveld2) is dus dat er nog een record tussenzit!
!@@ nog steeds ingewikkeld...
!---------------------------------------------------------------------------
! ePercRecord
#code hf_perc_record            ^#naam %%record         ^#syntax %%record(<i>pcode</i>,##<i>playout</i>)
#tekst
Print een record in ##playout.
<p>
   pcode kan de volgende bijzondere waarden hebben:
   <ul>
   <li><code>%%val</code>: print het huidige record (maar mogelijkerwijs in een andere layout).
   <li><code>%%super</code>: print het super-record. Dit werkt alleen als het huidige record een subrecord is.
   </ul>
<p>
Als je het record zelf in een andere layout wil afdrukken, kun je ook %link(hf_perc_uselayout,,#naam) gebruiken.
!---------------------------------------------------------------------------
! ePercUseLayout
#code hf_perc_uselayout         ^#naam %%uselayout     ^#syntax %%uselayout(##<i>playout</i>)
#tekst Print het record in ##playout. Dit is handig als je gemeenschappelijke dingen van 2 layouts in 1 gezamenlijke layout wilt hebben.
!---------------------------------------------------------------------------
! ePercToRoot
#code hf_perc_toroot            ^#naam %%toroot        ^#syntax %%toroot
#tekst
    Print:<br/>
    "../" als de webpagina in een subdirectory staat en<br/>
    niets als de webpagina NIET in een subdirectory staat.
<p>
    Dit kun je bijvoorbeeld gebruiken voor een <code>&lt;IMG...&gt;</code> opdracht: als je in een standaardheader een plaatje wil gebruiken,
    kun je zoiets opgeven:
<pre>
    &lt;img src="%%torootbin/main.gif"&gt;
</pre>
    Je hoeft je dan geen zorgen te maken of een webpagina in de hoofddirectory staat of in een subdirectory, want in beide gevallen
    is het pad naar het plaatje (<code>bin/main.gif</code> of <code>../bin/main.gif</code>) correct.
<p>
    In het voorbeeld lijkt het of er <code>%%torootbin</code> staat. Maar dit zijn 2 verschillende dingen die direct achter elkaar staan:
    <code>%%toroot</code> (de %%-opdracht) en <code>bin</code> (de subdirectory van het plaatje).
!---------------------------------------------------------------------------
! ePercMakeGlobalPerc, ePercNoRealOutput, ePercRealOutput @@ undocumented features
!---------------------------------------------------------------------------
! ePercSubrecords
#code hf_perc_subrecords        ^#naam %%subrecords ^#syntax %%subrecords(subname=<i>psubnaam</i>,layout=<i>##playout</i>,sortfield=<i>#psortfield</i>)
#tekst
   Print alle subrecords van het huidige record van het type 'psubnaam', in de %link(hf_b_layout,,layout) '##playout'.
   Sorteer daarbij de subrecords op '#psortfield'.
<p>
   #psortfield kan ook '#code' zijn, want %awegen geeft alle subrecords een unieke code. De sortering op #code is hetzelfde als
   hoe ze in de %link(hf_databasefile,,database-file) staan.
<p>
   De subname (psubnaam) kan ook '*' zijn: dan worden alle subrecords meegenomen.
<p>
   Als van een record het veld '#psortfield' niet bestaat, wordt het record <b>niet</b> geprint!
!===========================================================================
!       HEK-OPDRACHTEN
!===========================================================================
#code hf_hekopdrachten
#naam #-opdrachten
#tekst
In diverse files kun je een regel laten beginnen met een #. Zo'n regel heeft dan voor %awegen een speciale betekenis. Welke betekenis precies, dat
hangt af van de %link(hf_input,,input-file) waar de #-opdracht in staat.
<p>
Mogelijkheden in een %link(hf_databasefile,,database-file):
<table border="1">
<tr><td><code>#code <i>pcode</i></code>              </td><td>het begin van een nieuw record "pcode"</td></tr>
<tr><td><code>#<i>veldnaam</i></code>                </td><td>het begin van een nieuw veld "pveldnaam"</td></tr>
<tr><td><code>#<i>veldnaam</i>@</code>               </td><td>het begin van een nieuw veld "pveldnaam", waarbij het record meer dan 1 veld met die naam kan hebben.</td></tr>
<tr><td><code>#-subrecord <i>subrecordtype</i></code></td><td>het begin van een subrecord</td></tr>
<tr><td><code>#-<i>subrecordveldnaam</i></code>      </td><td>het begin van een veld binnen een subrecord</td></tr>
</table>
<p>
Mogelijkheden in de %link(hf_treefile,,tree-file):
<table border="1">
<tr><td><code>#code <i>paginanaam</i></code></td><td>het begin van een nieuwe pagina-definitie</td></tr>
<tr><td><code>#<i>paginaveld</i></code>     </td><td>een nieuw veld van de pagina-definitie</td></tr>
<tr><td><code>#-section</code>              </td><td>het begin van een sectie op de pagina-definitie</td></tr>
<tr><td><code>#-<i>sectieveld</i></code>    </td><td>een veld van een sectie</td></tr>
</table>
<p>
Mogelijkheden in een %link(hf_layoutfile,,layout-file) en een %link(hf_headerfooterfile,,header-footer-file):
<table border="1">
<tr><td><code>##<i>layoutnaam</i></code>      </td><td>het begin van een layout</td></tr>
<tr><td><code>#always</code>                  </td><td>het begin van een deel dat voor ieder record altijd afgedrukt moet worden.</td></tr>
<tr><td><nobr><code>#if(<i>expressie</i>)</code></nobr>    </td><td>het begin van een deel dat afgedrukt moet worden als "expressie" waar is. Zie de %link(hf_expressies,,pagina over expressies).</td></tr>
<tr><td><nobr><code>#ifnot(<i>expressie</i>)</code></nobr> </td><td>het begin van een deel dat afgedrukt moet worden als "expressie" NIET waar is.</td></tr>
<tr><td><code>#<i>veldnaam</i></code>         </td><td>
    het begin van een fieldlayout: een deel dat afgedrukt moet worden voor ieder veld van dit record dat de naam "veldnaam" heeft.
    Dat kunnen er 0, 1 of meer dan 1 zijn. (Bij meer dan 1 gebruik je <code><i>veldnaam@</i></code> in de database-file.)</td></tr>
<tr><td><code>#-<i>veldnaam</i></code>        </td><td>het begin van een fieldlayout, dus precies hetzelfde als de vorige regel.</td></tr>
</table>
!===========================================================================
!       EXPRESSIES
!===========================================================================
#code hf_expressies
#naam Expressies
#binary slide10.jpg
#tekst
Op diverse plekken komt het begrip "expressie" terug. Een expressie is een bewering over records of velden. Een expressie is <b>waar</b> (true) of <b>onwaar</b>
(false), en afhankelijk daarvan gaat %awegen bepaalde dingen wel of niet doen.
<p>
Expressies worden gebruikt in:
<ul>
<li>De selectie van items voor een sectie op een webpagina in de %link(hf_treefile,,tree-file);
<li>De <code>#if(...)</code> en <code>#ifnot(...)</code>-opdrachten
</ul>
<p>
Een expressie begint altijd met een "(" en eindigt met een ")".
<p>
<b><font size="+2">Mogelijke expressies</font></b><br/><br/>
!
Mogelijke expressies zijn:
<pre>
   (#X=Y)    veld #X is gelijk aan Y
   (#X!=Y)   veld #X is ongelijk aan Y
   (#X&lt;Y)    veld #X is alfabetisch kleiner dan Y (bijvoorbeeld 10 &lt; 5)
   (#X&lt;=Y)   veld #X is alfabetisch kleiner dan of gelijk aan Y
   (#X&gt;Y)    veld #X is alfabetisch groter dan Y
   (#X&gt;=Y)   veld #X is alfabetisch groter dan of gelijk aan Y
   (#X.num&lt;Y)   veld #X is numeriek kleiner dan Y (bijvoorbeeld 5.num &lt; 10)
   (#X.num&lt;=Y)  veld #X is numeriek kleiner dan of gelijk aan Y
   (#X.num&gt;Y)   veld #X is numeriek groter dan Y
   (#X.num&gt;=Y)  veld #X is numeriek groter dan of gelijk aan Y
   (#X~Y)    veld #X begint met Y
   (#X!~Y)   veld #X begint niet met Y
   (#X~~Y)   veld #X bevat Y
   (#X*Y)    er bestaat een veld waarvan de naam begint met X en de waarde met Y
   (#X!*Y)   er bestaat geen veld waarvan de naam begint met X en de waarde met Y
</pre>
<p>
   Als een veld niet bestaat, is dit hetzelfde als dat het veld leeg is. Dus bijvoorbeeld: de expressie <code>(#X=)</code> is waar
   als veld #X <i>niet</i> bestaat, terwijl de expressie <code>(#X>)</code> waar is als veld #X <i>wel</i> bestaat
   (want als het veld bestaat is het groter dan een lege string).
<p>
   Met "kleiner" en "groter" bedoel ik zoals in een woordenboek: "aardvark" is kleiner dan "beer".
<p>
   "#X" is de naam van een veld uit het huidige record, of een eigenschap van de huidige pagina (zoals <code>page.#name</code>, zie
   %link(hf_veldnamen,,de pagina over namen van velden)).
<p>
   "Y" is een waarde. Of, als het begint met een # ("<code>#<i>naam</i></code>"), de naam van een veld van het huidige record.
<p>
<b><font size="+2">Voorbeelden</font></b><br/>
!
<pre>
   (external.#storycode=W WDC 123-01)
   (external.#storycode~W WDC)
   (#componist=Boudewijn de Groot)
   (page.#level&gt;=3)
   (item.#sequencenumber=1)
   (#repr*)
   (#tekst!=#componist)
</pre>
<p>
   De expressie <code>(#X*Y)</code> kun je bijvoorbeeld gebruiken als je velden met @s gebruikt. Als je bijvoorbeeld 2 velden "#appearing@" hebt,
   dan kun je met <code>(#appearing*)</code> testen of ze bestaan.
   <br/>
   En dan betekent <code>(#appearing*US)</code> dat tenmiste een van de "#appearing@" velden een waarde heeft die begint met "US".
<p>
   Let op: bij de expressies <code>(#X*Y)</code> en <code>(#X!*Y)</code> kun je <b>geen</b> externe velden gebruiken.
   Dus zoiets als <code>(external.#storycode*)</code> is niet mogelijk. Dit heeft ook niet veel zin, want externe velden hebben nooit een @ achter hun naam.
<p>
<b><font size="+2">Combinaties van expressies</font></b><br/>
!
Een expressie kan een logische combinatie zijn van (sub-)expressie(s):
<pre>
   (A)&(B)     A is waar én B is waar
   (A)|(B)     A is waar of B is waar, of allebei
   (!(A))      A is niet waar
</pre>
<p>
   (Er is geen symbool voor "A is waar of B is waar, maar <b>niet</b> allebei". Dit is wat je in normaal Nederlands meestal bedoelt met "of". Maar in
   %awegen kunnen we in dit geval best zonder normaal Nederlands...)
<p>
   Voorbeelden:
<pre>
   (#tekst=Lennaert Nijgh)&(#componist=Boudewijn de Groot)
   (#tekst!=Lennaert Nijgh)|(#componist!=Boudewijn de Groot)
   (#storycode!~W WDC)&(#storycode!~W US)&(#storycode!~W OS)
</pre>
!===========================================================================
#code hf_logmeldingen
#naam Logmeldingen
#tekst
%awegen maakt een logfile aan, die "awegen.log" heet. Hierin staan meldingen over dingen die fout zijn, of op zijn minst raar.
<p>
Bij iedere melding staat grofweg aangegeven waar de fout optreedt. Ik hoop dat de meldingen voor zich spreken, als je deze website hebt doorgekeken.
<p>
Een bijzonder soort logmeldingen vergt misschien wat nadere uitleg: er wordt op diverse plaatsen getest of iets gebruikt ("<b>used</b>") wordt.
Met "used" bedoel ik dat de inhoud echt in een outputfile terechtkomt,
dat de inhoud in een link gebruikt wordt,
of dat je expliciet hebt aangegeven dat dat niet moet gebeuren (met %link(hf_perc_noval,,#naam) of %link(hf_perc_nousagecheck,,#naam)).
<p>
Als de waarde van een veld alleen gebruikt wordt in een expressie (#if e.d.), is het veld nog niet "used".
<p>
Van <b>Externe</b> records wordt alleen gecheckt of er naar het record verwezen wordt vanuit een "eigen" record (via het <code>#external</code>-veld).
Dus niet ieder afzonderlijk extern veld wordt gecheckt. Want dan zou je verplicht zijn om <b>alle</b> velden die je uit de externe database krijgt ook
echt te gebruiken...
!===========================================================================
#code hf_voorbeeldinput
#naam Voorbeeld-input
#tekst
In dit deel van deze uitleg-website staan alle %link(hf_input,,input-files) die gebruikt zijn om deze uitleg-website te maken.
Ze zijn namelijk ook zelf met %awegen gemaakt!
<p>
Ik gebruik deze uitleg-website eigenlijk voor 3 dingen:
<ul>
<li>Om dingen uit te leggen;
<li>Als voorbeeld hoe de dingen werken;
<li>Om het programma %awegen te testen.
</ul>
!===========================================================================
#code hf_datamodel
#naam Datamodel
#tekst
In deze uitleg-site gebruik ik begrippen zoals %link(hf_b_fieldlayout,,fieldlayout) en %link(hf_b_item,,item).
Onderstaand plaatje poogt de verbanden hiertussen aan te geven.
<p>
Het plaatje snappen is niet echt nodig; ik heb het vooral voor mezelf hier neergezet, en voor wie er verder in geïnteresseerd mocht zijn.
<p>
<code>A --* B</code> betekent: elke A heeft nul of meer B.
<p>
<pre>
   WebSite                         DBList                ExternalRecordList  BinaryRecordList
     |                            /     \                      |                  |
     |                           /       \       __            |                  |
     |    __                    *         *     *  |           |                  |
     *   *  |             LayoutFile     DBRecord__/           *                  *
   WebPage__/                   |         |  | \\________ExternalRecord     BinaryRecord
     |   |                      |         |  |  \_____________________________/
     |   |                      |         |  *
     |   |                      *         |  DBField
     *   |                (Record)Layout  |
 Section |    _____________/    |         |
         |   /                  *         |
         |  /               FieldLayout   |
         | |                    |         |
         | |                    *         |
         | |                 DBQuery      |
         * *                             /
        Item *--------------------------/
</pre>
!===========================================================================
(Deze pagina is gegenereerd door AweGen 5.10 op 2018-01-02)