Wikibooks
nlwikibooks
https://nl.wikibooks.org/wiki/Hoofdpagina
MediaWiki 1.47.0-wmf.3
first-letter
Media
Speciaal
Overleg
Gebruiker
Overleg gebruiker
Wikibooks
Overleg Wikibooks
Bestand
Overleg bestand
MediaWiki
Overleg MediaWiki
Sjabloon
Overleg sjabloon
Help
Overleg help
Categorie
Overleg categorie
Transwiki
Overleg transwiki
Wikijunior
Overleg Wikijunior
TimedText
TimedText talk
Module
Overleg module
Event
Event talk
Kookboek/Receptsjabloon
0
147
428018
398679
2026-05-19T17:03:55Z
Erik Baas
2193
lf
428018
wikitext
text/x-wiki
Dit is een aanbevolen sjabloon voor recepten die naar het kookboek worden verstuurd. Merk a.u.b. op dat dit slechts een richtlijn is. Voel je vrij om meer paragrafen toe te voegen of er een paar weg te laten (het recept moet wel nuttig blijven).
Het vijfpuntensysteem wordt gebruikt om de moeilijkheidsgraad van een recept aan te geven. Denk aan de volgende beschrijvingen bij het toekennen van een score.
*[[Afbeelding:1o5dots.svg|Zeer makkelijk]] - Zeer makkelijk
<!--Was voorheen 'Je kan water koken, toch?', maar veranderd naar 'zeer makkelijk' om een eenduidige rangschikking van de moeilijkheidsgraad te krijgen.-->
*[[Afbeelding:2o5dots.svg|Redelijk makkelijk]] - Redelijk makkelijk
*[[Afbeelding:3o5dots.svg|Gemiddelde moeilijkheid]] - Gemiddelde moeilijkheid
*[[Afbeelding:4o5dots.svg|Redelijk moeilijk]] - Redelijk moeilijk
*[[Afbeelding:5o5dots.svg|Zeer moeilijk]] - Zeer moeilijk
<!--Was voorheen 'Ben je de ''Iron Chef''? (een kookprogramma)', maar veranderd naar 'zeer moeilijk' om een eenduidige rangschikking van de moeilijkheidsgraad te krijgen.-->
Deze afbeeldingspagina's zijn handig, want als je erop klikt, zie je een lijst van recepten van die moeilijkheidsgraad.
<!--Hier is een lijstje van voorbeeldrecepten die het sjabloon gebruiken.
*[[Cookbook:Beef and Barley Stew|Beef and Barley Stew]]
*[[Cookbook:Chocolate Mousse|Chocolate Mousse]]
*[[Cookbook:Tarbes Salad|Tarbes Salad]]-->
===Sjabloon voor receptinzending===
Zie [[Sjabloon:Infobox recept]] voor de tabel<br>
Welke keuken | Soort gerecht | [[Kookboek/Recepten|Receptenindex]]
{| width="200px" border="2" cellpadding="4" cellspacing="1" align="right" bgcolor="#f0f8ff" style="margin-left:1em; margin-bottom:1em;"
!align="center" colspan="2"|Overzicht
|-align-"center"
|-
||Categorie:
||
|-
||Aantal porties:
||
|-
||Energie:
|| kcal/ kJ
|-
||Tijd:
||
|-
||Moeilijkheidsgraad:
|align="center"|[[Afbeelding:5o5dots.svg]]
|}
<pre>*/ (Tekst tussen */ en /* dient in het recept verwijderd te worden.)
Een korte beschrijving van het recept zou hier moeten
staan; iets tussen één zin en een paragraaf of twee is
goed. Beschrijf wie het gerecht gebruikt en hoe, alsook
alles wat er normaal samen mee wordt bereid. Verhalen
het ontstaan van het recept of andere anekdotes zijn welkom.
Een foto van het gerecht, als het klaar is, is behulpzaam
en zou in dit deel moeten staan, bij voorkeur in de tabel achter "Afbeelding".
/*
</pre>
==Ingrediënten==
*1 kopje (240 ml) ingr. 1
*1 eetlepel (15 ml) ingr. 2
*etc.
*/ De ingrediënten zouden opgesomd moeten worden in
de volgorde waarin ze in het bereidingswijze gebruikt
worden. Voeg hier geen optionele ingrediënten of
vervangers toe, maar in de paragraaf Opmerkingen,
tips en variaties. Vermijd liever eenheden als kopje,
en eetlepel, of als je dat wel doet, vermeld altijd
ook het aantal milliliter of gram. /*
==Bereidingswijze==
#Stap een
#Stap twee
#etc.
*/ Foto's van de uitvoering van de bereidingswijze
zouden in thumb-formaat moeten zijn, zodat een onderschrift
aangeeft welke stap uitgevoerd wordt. /*
==Opmerkingen, tips en variaties==
*Opmerking 1
*Tip 1
*Variatie 1
*etc.
*/ Dit gedeelte kan worden gebruikt voor aanvullende
informatie die niet past in andere delen van het recept. /*
==Waarschuwingen==
*Waarschuwing 1
*Waarschuwing 2
*etc.
*/ Hier dingen als bewaarinformatie ("nuttigen binnen
24 uur") of waarschuwingen voor ingrediënten ("dit gerecht
bevat rauwe eieren") e.d. /*
[[Categorie:Kookboek|Receptsjabloon]]
[[Categorie:Sjablonen kookboek|Receptsjabloon]]
a0yln40z9od4rhlum9xtgfkk3v6hvjx
Hoofdpagina
0
1820
428013
422130
2026-05-19T12:55:34Z
Erik Baas
2193
{{nowrap}}
428013
wikitext
text/x-wiki
<!--
*****************************************************
* LEES DIT EERST !!!
* Via dit vak kunt u de inhoud van de hoofdpagina van Wikibooks NL
* aanpassen. Misbruik van deze mogelijkheid door het vandaliseren van deze
* pagina zal tot gevolg hebben dat u DIRECT de toegang tot Wikibooks NL
* ontnomen zal worden via het blokkeren van uw IP-adres.
******************************************************
* JE BOEK OP HET LINKER DEEL VAN DE PAGINA KRIJGEN.
* Om je boek op het rechter deel van de pagina te krijgen moet
* je de informatie in de infobox (zie Wikibooks:Infobox) van je
* boek aanpassen. Enkel boeken met een voortgang van 75% of 100%
* komen op het linker deel te staan.
*
* Als je infobox aangepast is, dan met de hand het betreffende sjabloon
* dat onderdeel is van de hoofdpagina aanpassen zodat het boek daar verschijnt.
******************************************************
-->__NOTOC__ __NOEDITSECTION__
<templatestyles src="style.css" />
<div class="center" style="font-size: 21px; font-weight: bolder;">[[Wikibooks: Welkom|<span style="color: black;">Welkom op</span> <span style="color: #0b2645;">WIKI</span><span style="color: #0a4e98;">BOOKS</span>!]]</div>
<!-- KOP -->
{| class="smaller-on-mobile" width="100%" style="margin-top: 1.3em; background-color: rgb(253, 252, 248); color: black; border: 2px solid rgb(95, 150, 211);padding: 0.3em;-moz-border-radius: 10px;"
| style="font-size: 105%; padding: 5px 10px;" | Wikibooks is een gemeenschapsproject om lezers kosteloos teksten met [[Wikibooks: Vrije inhoud|vrije inhoud]] ter beschikking te stellen. Bijvoorbeeld '''leerboeken''' en ander lesmateriaal maar ook '''algemene informatieve teksten''' (geen reclame) in '''boekvorm'''. {{Niet afdrukken inline|Zie onze [[Wikibooks: Missie, visie en uitgangspunten|missie en visie]].}}<br>
Op dit moment zijn er '''{{Aantal hoofdstukken}}''' hoofdstukken aanwezig in '''{{PAGESINCATEGORY:Boek|pages}}''' [[:Categorie:Boek|boeken]] en {{Nowrap|'''{{Pagina's in naamruimte|104}}''' hoofdstukken}} in '''{{Aantal Wikijuniorboeken}}''' [[:Categorie:Boeken in Wikijunior|Wikijunior-boeken]] (waaraan soms nog wordt gewerkt). U kunt elk hoofdstuk uitbreiden of aanpassen, en wordt daartoe van harte uitgenodigd. ''Zolang uw wijzigingen constructief zijn, kunt u niets mis doen''.<br>
<!-- * [https://pageviews.wmcloud.org/topviews/?project=nl.wikibooks.org&platform=all-access&date=last-month&excludes= Meest geraadpleegde pagina's van Wikibooks in de vorige maand] -->
|}
<div style="margin-bottom: 1em; text-align: center; font-weight: bold;">
{{Nowrap|[[Wikibooks:Gewenste hoofdstukken en boeken|Gewenste artikelen]]}} -
{{Nowrap|[[Wikibooks:Waarom meehelpen|Waarom zou ik meehelpen]]}} -
[[Wikibooks:Instructies|Instructies]] -
[[Wikibooks:Wiki Standaard Boeknummer|WSBN]] -
{{Nowrap|[[Wikibooks:Zandbak|Oefenen in de zandbak]]}} -
[[:Categorie:Help|Helppagina's]] -
{{Nowrap|[[Wikibooks:Lerarenkamer|Vraag om hulp]]}}
</div>
<!-- DAGMENU VOLLE BREEDTE -->
<div class="center">[[Bestand:P_Food.png|30px]]<span style="font-size: large; margin-left: 5px;">'''[[Kookboek|Dagmenu uit het kookboek]]'''</span></div>
<br style="clear: both;">
<!-- TWEE KOLOMMEN -->
<!-- LINKERKOLOM: VOLTOOIDE BOEKEN -->
{| cellpadding="0" cellspacing="0" style="width: 100%; border: none; padding: 0px;"
|-
|style="width: 66%; border: 1px solid #CCF7CC; background: #EEFFEE; color: black; padding: 0.3em; -moz-border-radius: 10px;" valign=top|
{|width="100%" cellspacing="0" cellpadding="5" style="background: transparent; color: black;"
|-
|<div class="center">[[Bestand:P_Psychology2.png|30px]]<span style="font-size: large; margin-left: 5px;">'''[[: Categorie:Boek|Catalogus Wikiboeken]]'''</span></div>
<!---------------------------------------------->
|-
|style="font-size: 95%" |{{Exacte wetenschap}}
<!---------------------------------------------->
|-
|style="font-size: 95%;border-top: 1px dashed #6A5ACD"|
{{Technologie}}
<!---------------------------------------------->
|-
|style="font-size: 95%;border-top: 1px dashed #6A5ACD"|
{{Multimediale wetenschappen}}
<!---------------------------------------------->
|-
|style="font-size: 95%;border-top: 1px dashed #6A5ACD"|
{{Taal- en letterkunde}}
<!---------------------------------------------->
|-
|style="font-size: 95%;border-top: 1px dashed #6A5ACD"|
{{Geschiedenis}}
<!---------------------------------------------->
|-
|style="font-size: 95%;border-top: 1px dashed #6A5ACD"|
{{Samenleving}}
<!---------------------------------------------->
|-
|-
|style="font-size: 95%;border-top: 1px dashed #6A5ACD"|
{{Levensbeschouwing}}
<!---------------------------------------------->
|-
|style="font-size: 95%;border-top: 1px dashed #6A5ACD"|
{{Expressie}}
<!---------------------------------------------->
|-
|style="font-size: 95%;border-top: 1px dashed #6A5ACD"|
{{Diversen}}
<!---------------------------------------------->
|}
| <!-- ruimte tussen kolommen -->
<!-- BEGIN RECHTERKOLOM, ONVOLTOOIDE BOEKEN -->
|style="border: 1px solid #CCF7CC; background: #EEFFEE; color: black; padding: 0.3em; -moz-border-radius: 10px;" valign=top|
<!-- | width="48%" valign="top" style="border: 1px solid #DDDDF7; background: #F7F7FF; color: black; padding: 0.3em; -moz-border-radius: 10px"| -->
{|width="100%" cellspacing="0" cellpadding="5" style="background: transparent; color: black;"
|-
|<div class="center">[[Bestand:P_writing.svg|30px]]<span style="font-size: large; margin-left: 5px;">'''[[:Categorie:Wikibooks:Beginnetje|Catalogus Gestarte Wikiboeken]]'''</span></div>
|-
|style="font-size: 95%;"|
{{Werkboek van de maand}}
<!---------------------------------------------->
|-
|style="font-size: 95%; border-top: 1px dashed #6A5ACD"|
{{Gestarte boeken}}
<!---------------------------------------------->
|-
|style="font-size: 95%;border-top: 1px solid silver"|
[[Afbeelding:Nuvola apps package toys.png|left|50px]]
{{Wikibooks:Junior boeken}}
|} <!-- EINDE RECHTERKOLOM -->
|} <!-- EINDE INDELING RECHTERKOLOM -->
<!-- ZUSTERPROJECTEN -->
{{Zusterprojecten}}
<div style="width: 96%; margin: 1em auto 7px auto; background-color: rgb(253, 252, 248); color: black; border: 2px solid rgb(95, 150, 211); padding: 1em 0.3em; -moz-border-radius: 10px; text-align: center; font-weight: bold;">
<!-- PORTAAL -->
[[Wikibooks:Portaal]]
- [[m:Wikibooks/Table/nl|Lijst van alle 77 <!-- dd. 23 januari 2026--> taalversies van Wikibooks internationaal]]<!--
- [[m:How to start a new Wikibooks portal|Start een Wikibooks-portaal in een andere taal]] -->
</div>
[[Categorie:Wikibooks]]
jh3lf2cic7y8jc710019bgwva65wccd
Programmeren in ASP.NET/Server
0
3424
428229
425772
2026-05-20T06:33:34Z
Erik Baas
2193
lf
428229
wikitext
text/x-wiki
{{Index Programmeren in ASP.NET}}
Normaal gezien staat de ASP.NET-server op het Internet, terwijl de gebruiker thuis of op kantoor de pagina's bekijkt (de client).
Als je ASP.NET-pagina's maakt, kan je die alleen bekijken als ze eerst door een server verwerkt worden. Als je ze rechtstreeks als bestand opent vanaf je eigen harde schijf wordt de ASP.NET code niet uitgevoerd, en krijg je dus een heel ander resultaat.
Als ASP.NET-programmeur kan je je eigen pc als server gebruiken, maar tegelijk ook als client om de pagina's te bekijken.
==Vereisten==
Om ASP.NET te kunnen draaien als server heb je twee dingen nodig:
#Internet Information Server (IIS). Dit is de webserver die bij Windows hoort. Dat betekent dat je HTML-pagina's kan laten bekijken door anderen, via de browser. IIS wordt meegeleverd op de CD-ROM van Windows 2000, en Windows XP Professional Edition. Je kunt IIS ook op Windows NT 4.0 installeren met het apart te downloaden Option Pack.
#Het .NET framework. Hiermee krijg je ook ondersteuning voor ASP.NET-pagina's. Op Windows 2003 is dit framework al standaard geïnstalleerd. Op Windows NT 4.0, 2000 of XP moet je het nog apart toevoegen, maar het kan ook zijn dat het al geïnstalleerd werd als onderdeel van andere toepassingen. Afhankelijk van wat je provider aanbiedt, moet je versie 1.1 of versie 2.0 installeren.
Op een computer die niet als server hoeft te dienen (bijvoorbeeld de computer waarop je je pagina's uittest) is IIS niet echt nodig. Je kan ook de kleine Cassini-server gebruiken, die ingebouwd zit in Visual Web Developer. Sommige zaken, zoals beveiliging, werken in Cassini een beetje anders, zodat je daarmee niet altijd alles kan testen.
Opmerkingen:
#IIS kan normaal gezien niet op Windows XP Home Edition geïnstalleerd worden. Op het internet zijn wel tips te vinden om dit te omzeilen.
#IIS heeft veel configuratiemogelijkheden. Dit is zo omvangrijk dat je daar een heel boek aan kunt besteden.
#Als je eerst het .NET framework installeert en daarna IIS, dan wordt het onderdeel ASP.NET niet geïnstalleerd. Deze moet je dan handmatig registreren met de tool aspnet_regiis, welke geïnstalleerd is met het .NET framework. De opdrachtregel luidt: "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i"
De installatiestappen voor de verschillende Windows versies worden hieronder besproken. Na het installeren kun je het beste nog even testen of de installatie goed werkt.
==IIS installeren==
We maken een onderscheid tussen de verschillende Windows-platforms.
===Windows NT 4.0 Workstation ===
*Log aan met beheerdersrechten.
*Ga naar de bestanden van NT 4.0 Option Pack en zoek de map x86/Win.WKS. Start setup.exe.
*Klik bij het openingsscherm op Next en kies in het volgende scherm voor Typical installatie.
*Kies de map waarin de website bestanden (HTML en ASP) moeten komen te staan. Standaard is dit C:\Inetpub\wwwroot en we raden aan dit zo te houden. Klik op Next.
*Herstart de computer na installatie (indien nodig).
===Windows NT 4.0 Server ===
*Log aan met beheerdersrechten.
*Ga naar de bestanden van NT 4.0 Option Pack en zoek de map x86/Win.SRV. Start setup.exe.
*Klik bij het openingsscherm op Next en kies in het volgende scherm voor Typical installatie.
*Kies de map waarin de website bestanden (HTML en ASP) moeten komen te staan. Standaard is dit C:\Inetpub\wwwroot en het is aan te raden dit zo te houden.
*Kies eventueel ook een map voor de FTP Service. Het is aan te raden deze niet te veranderen, die geldt ook voor het Application Installation Point. Klik op Next.
*Kies de map voor de SMTP Service. Standaard is dit C:\Inetpub\Mailroot. Wij raden aan dit zo te houden. Klik op Next.
*Herstart de computer na installatie (indien nodig).
===Windows 2000 Professional en Windows XP Professional ===
*Log aan met beheerdersrechten.
*Open "Add/Remove Programs" in het Control Panel.
*Kies in de linker balk voor "Add/Remove Windows Components".
*Vink Internet Information Services (IIS) aan en klik op Next.
*Kies de map waarin de website bestanden (HTML en ASP) moeten komen te staan. Standaard is dit C:\Inetpub\wwwroot en het is aan te raden dit zo te houden.
===Windows 2000 Server===
*Log aan met beheerdersrechten.
*Open "Add/Remove Programs" in het Control Panel.
*Kies in de linker balk voor "Add/Remove Windows Components".
*Vink Internet Information Services (IIS) aan en klik op Next.
*Kies de map waarin de website bestanden (HTML en ASP) moeten komen te staan. Standaard is dit C:\Inetpub\wwwroot en het is best dit zo te houden.
===Windows XP Home===
*Microsoft heeft geen ondersteuning voorzien voor IIS op Windows XP Home.
*Met een beetje prutswerk kan je het wel installeren, zie bijvoorbeeld: https://www.15seconds.com/issue/020118.htm.
*Je hebt een cd nodig van Windows 2000 Advanced Server.
===Windows Vista===
Windows Vista (uitgezonderd de Home Basic-versie) bevat IIS 7.0.
* Log aan met beheerdersrechten
* Open Control Panel - Programs - Turn Windows features on or off.
* Vink Internet Infomation Services aan en klik op OK.
==De installatie testen==
*Ga naar Control Panel, Administrative Tools, Internet Information Services.
*Controleer of de www-service actief is. Dubbelklik op de servernaam, en klik dan op "Web sites". In het rechterframe moet de Default Web Site de Running-state hebben. Zoniet, kies op de Default Web Site het snelmenu en selecteer start.
*Bekijk je eigen web in Internet Explorer door het volgende adres in te tikken: "127.0.0.1" of "localhost". Je krijgt een pagina "Under construction"
*Op de schijf waar Windows op staat (gewoonlijk c:) is nu een folder INetPub toegevoegd met de volgende subfolders: Adminscripts, ftproot, iissamples, mailroot, Scripts, webpub, en wwwroot.
==Startpagina instellen==
Als je de URL van een server intikt (bv. nl.wikipedia.org) krijg je meestal een bepaalde pagina te zien. Je kan op je webserver instellen welke pagina dat is.
Standaard kiest IIS voor een pagina "default.htm", maar de meeste sites gebruiken "index.htm" of "index.html". Afhankelijk van je eigen keuze kan je dit instellen:
*Control Panel – Administrative Tools – Internet Information Services
*Blader naar "Default Web Site"
*Kies Action – Properties in het menu
*Kies de klep "Document"
*Voeg bij "Enable Default Document" de naam van de startpagina toe (bv. index.htm), en gebruik de knoppen om die bovenaan in de lijst te brengen.
*Kopieer je eigen pagina (bijvoorbeeld index.htm) naar x:\INetPub\wwwroot (x: is de schijf waar Windows geïnstalleerd staat, meestal c:).
*Controle: bekijk je eigen web in Internet Explorer door het volgende adres in te tikken: "127.0.0.1" of "localhost"
==Testen of ASP werkt op je server==
ASP (de voorloper van ASP.NET) zou nu al moeten werken. ASP.NET werkt pas als je het dotNET framework installeert (zie volgende paragraaf).
*Maak in de map C:\Inetpub\wwwroot (of de map die je hebt opgegeven bij installatie) een tekstbestand test.asp en gebruik bijvoorbeeld Notepad om daarin de volgende code te zetten:
<syntaxhighlight lang=html4strict>
<html>
<head></head>
<body>
<%=Now%>
</body>
</html>
</syntaxhighlight>
*Open je browser en typ in: https://localhost/test.asp
*Als het goed is zie je de datum en tijd weergegeven in de opgevraagde pagina. ASP werkt!
Let op het verschil:
{| class="wikitable"
|-
|als je het bestand opent als||gebeurt er dit:
|-
|https://localhost/test.asp||Het bestand wordt door de ASP-server verwerkt, en je krijgt de datum te zien
|-
|c:\iNetPub\wwwroot\test.asp||de ASP-server wordt niet gebruikt, en je krijg een deel van de code te zien!
|}
Het is nochtans hetzelfde bestand!
==Installatie ASP.NET==
Je hebt nu een webserver die ASP-pagina's kan verwerken, maar nog geen ASP.NET (wel in Windows 2003). Dat moet je nog installeren, hetgeen heel simpel is.
Hiervoor moet je minstens de .NET redistributable (23 MB) downloaden, bijvoorbeeld van https://www.asp.net/download.aspx (gratis).
Dubbelklik op het gedownloade bestand dotnetredist.exe en volg de instructies.
Als je Windows XP hebt met SP1 of hoger, of Windows 2003, dan is het .NET Framework al geïnstalleerd. Als je echter eerder geen IIS installeerde, kan het zijn dat ASP.NET nog niet geïnstalleerd is. In dat geval moet je de .NET redistributable gewoon nog eens installeren.
Na de installatie moet je ook het laatste Service Pack installeren. Dit is een programma dat recent ontdekte fouten, bugs en beveiligingsproblemen herstelt in de originele versie. Je kan het laatste service pack het snelst installeren via https://windowsupdate.microsoft.com.
Als je zonder probleem door de installatie geraakt bent, kan je beginnen programmeren met .NET. Heb je gemerkt dat je niet eens moet herstarten?
Als je pc aan alle voorwaarden voor .NET voldoet, is de installatie van het .NET Framework meestal probleemloos.
{{Bladeren2
|Boek=Programmeren in ASP.NET
|vorige=Benodigdheden
|huidige=Server
|volgende=Eerste pagina
}}
{{Sub}}
6q7jqrhm4k83ee7vp6cvlvbl0wt3iem
Sjabloon:Werkboek van de maand
10
6444
428014
400505
2026-05-19T13:00:10Z
Erik Baas
2193
{{Nowrap
428014
wikitext
text/x-wiki
<span style="font-size: large;">'''[[Wikibooks:Gewenste hoofdstukken en boeken|We hebben hulp nodig!]]'''</span>
<imagemap>Bestand:International_draughts.jpg|150px|right
default [[Duits]]
desc none</imagemap>
{{Nowrap|Wie wil aan het wikiboek}} [[Dammen|'''Dammen''']] werken? Graag uw verbetering van spelfouten, aanvulling van ontbrekende informatie of een mooiere opmaak; alvast bedankt!
<span style="font-size: large;">'''[[Wikibooks:Wachtruimte|Wachtruimte]]'''</span>. Hier staan boeken waar langere tijd niet aan is gewerkt. Kunt u ze verbeteren?
<noinclude>[[Categorie:Sjablonen hoofdpagina]]</noinclude>
ls1js455sfpsoe7qrls06xdq89i4vfy
428015
428014
2026-05-19T13:00:52Z
Erik Baas
2193
428015
wikitext
text/x-wiki
<span style="font-size: large;">'''[[Wikibooks:Gewenste hoofdstukken en boeken|We hebben hulp nodig!]]'''</span>
<imagemap>Bestand:International_draughts.jpg|150px|right
default [[Duits]]
desc none</imagemap>
{{Nowrap|Wie wil}} aan het wikiboek [[Dammen|'''Dammen''']] werken? Graag uw verbetering van spelfouten, aanvulling van ontbrekende informatie of een mooiere opmaak; alvast bedankt!
<span style="font-size: large;">'''[[Wikibooks:Wachtruimte|Wachtruimte]]'''</span>. Hier staan boeken waar langere tijd niet aan is gewerkt. Kunt u ze verbeteren?
<noinclude>[[Categorie:Sjablonen hoofdpagina]]</noinclude>
35kflp1d12idry9h46perhjhjd0vmvq
Programmeren in TI-Basic/Inleiding
0
9985
428174
422145
2026-05-20T05:37:02Z
Erik Baas
2193
lf
428174
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Om te [[leren]] te programmeren in TI-Basic heb je alleen een TI grafische rekenmachine nodig. Een USB-kabeltje of een serieel kabeltje is handig, dan kan je de programma's die je maakt overzetten naar andere rekenmachines.
{| {{Wikitable}}
|-
| [[Afbeelding:TI-84_Plus_Silver_Edition.JPG|300px]]
|-
| De TI-84+ SE
|}
{{Bladeren2
|Boek=Programmeren in TI-Basic
|huidige=Inleiding
|volgende=Overzicht
}}
{{Sub}}
jcz4g9ugxlklkv7gbyxvrsyuox5qteq
Programmeren in TI-Basic/Overzicht
0
9986
428175
422146
2026-05-20T05:37:29Z
Erik Baas
2193
lf
428175
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Omdat niet alles even duidelijk is wordt hier uitgelegd hoe je kan beginnen met programmeren op je TI grafische rekenmachine.
=== Een nieuw programma maken ===
Als je je rekenmachine opstart kom je in een leeg scherm terecht. Als je dan drukt op de PRGM knop zie je een nieuw scherm.<br>
[[Bestand:TI84_PRGM-EXEC.jpg|192px|Het program menu.]]
EXEC komt van het woord ' execute ' en betekent in het Nederlands ' voer uit ' . We zien het terug in de uitdrukking ' executie ' wat oorspronkelijk ' uitvoering van het vonnis van de rechtbank ' betekende.
Alleen de uitvoering van een (dood)-vonnis blijft nog over. Met deze keuze kan je dus reeds bestaande programma's laten uitvoeren.
EDIT bestaat op zich en betekent ' laat zien ' of ' geef uit '. Met deze optie kan je ' oudere ' programma's terug ' laten zien ' en eventueel aanpassen. Normaal zijn er momenteel géén progamma's om uit te voeren of om te laten zien.
NEW betekent 'nieuw ' en daar zijn we natuurlijk aan toe.
Selecteer nu NEW en kies de 1:Create New optie.
[[Bestand:TI84_PRGM-NEW-1.jpg|192px|Het nieuw programma menu.]]
Voer hier de naam van je programma in en druk op enter.
[[Bestand:TI84 PRGM-MAKE-TEST 1.jpg|192px|De Program editor.]]
Gefeliciteerd, je hebt nu een nieuw programma gemaakt!
=== Functies invoegen ===
Om een programma te kunnen maken moet je functies gebruiken. Om bijvoorbeeld Invoer of Uitvoer functies in te kunnen voegen druk je op PRGM terwijl je in de Program Editor zit.
<table border=1>
<tr>
<td>
[[Afbeelding:TI-84 - PRGR-menu.jpg]]
</td>
</tr>
<tr>
<td>
<sup>PRGM menu in de Program editor.</sup>
</td>
</tr>
</table>
CTL is afkomstig van ' ConTroLe ' en zal ons in staat stellen het programma te ' sturen ', te ' controleren '. Later worden alle mogelijkheden uitgelegd.
Om Invoer- of Uitvoerfuncties te selecteren, selecteer je I/O. Dit is afkomstig van ' Input/Output ', de Engelse termen voor ' invoer/uitvoer '. Eigenaardig lijkt de aanwezigheid van EXECute in dit menu. Deze ' EXEC ' stelt ons in staat het programma snel te testen tijdens de ontwikkeling ervan.
<table border=1>
<tr>
<td>
[[Afbeelding:TI-84 - PRGR-menu2.jpg]]
</td>
</tr>
<tr>
<td>
<sup>Het PRGM:I/O menu in de Program Editor</sup>
</td>
</tr>
</table>
Als je nu Disp selecteert en op enter drukt zie je het Disp commando in de Program editor staan op de eerste lijn. DISP is afkomstig van ' DISPlay ' en slaat op kleine schermpjes van rekentoestellen e.d.
Hier betekent het ' laat zien op het display ', of ' druk af '.
<pre>
PROGRAM:TEST
:Disp
</pre>
Als je nu iets achter de Disp zet, bijvoorbeeld 10 dan zal het programma variabele 10 tonen als je hem start. Als je tekst wilt weergeven, moet deze tussen aanhalingstekens worden gezet. Deze vind je onder Alpha>+. Automatisch denken we aan ALFAbet, nochtans staat het eerder voor ' alfanumeriek ', en zijn alle letters en tekens toegelaten tussen de aanhalingstekens, zo ook iets als " àç!è§(' ".
<pre>
PROGRAM:TEST
:Disp 10
</pre>
<pre>
PROGRAM:TEST
:Disp "TEKST"
</pre>
Om uit de program editor te gaan druk je eerst op 2ND. Je ziet nu een ↑ op de plek van je cursor zien knipperen. Als je daarna op MODE(QUIT) drukt, dan ga je uit de program editor. QUIT betekent namelijk ' verlaat deze omgeving ' . Je zit dan weer op het lege scherm. Als je nu nog een keer op PRGM klikt zie je dit:
<pre>
EXEC EDIT NEW
1:TEST
</pre>
Selecteer TEST en druk op enter. Je zie nu prgmTEST op je scherm staan, druk op enter om het programma te starten. Je ziet nu wat het programma doet:
<pre>
prgmTEST
10
Done
</pre>
Als je een bepaalde functie niet meer kan vinden, kijk dan in de catalogus, 2ND:0(CATALOG)
<pre>
CATALOG
»abs(
and
angle(
ANOVA(
Ans
Archive
Asm(
</pre>
{{Sub}}
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Inleiding
|huidige=Overzicht
|volgende=Hello World!
}}
31g4iszdrb9ipylwdkfv22ss7n0n1z8
Programmeren in TI-Basic/Hello World!
0
9987
428176
422153
2026-05-20T05:37:33Z
Erik Baas
2193
lf
428176
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}In dit hoofdstuk gaan we een klein programmaatje maken. Om dit te kunnen moet je de volgende hoofdstukken gelezen hebben:
*[[Programmeren in TI-Basic/Overzicht|Overzicht]]
== Hello World! ==
In het vorige hoofdstuk heb je gezien dat je getallen kan weergeven op het scherm met Disp. Dit kan niet alleen met getallen, maar ook met stukken tekst die strings genoemd worden. Een string begint altijd met een ". Hij hoeft daar niet per se mee te eindigen, want in TI-Basic hoef je haakjes en quotes niet af te sluiten aan het einde van de regel. Doe dit altijd, dit bespaart bij grote programma's al vaak heel veel ruimte. Je kan het programma van het vorige hoofdstuk dus veranderen zodat hij in plaats van 10, "HELLO WORLD!" zegt. Het uitroepteken kan je vinden onder het MATH→PRB menu. Om je vorige programma weer aan te passen, druk je weer op de PRGM knop en selecteert dit keer niet NEW, maar EDIT. Hier zie je je TEST-programma dat je kan selecteren. Als je nu op enter drukt, kom je weer in de program editor.
<pre>
PROGRAM:TEST
:Disp "HELLO WORLD!
</pre>
Als je dit programma nu uitvoert, zie je HELLO WORLD! en daar na ''Done'' ("Klaar"). Maar we hebben helemaal nooit gevraagd om Done te laten zien. Dit komt omdat als het programma afgelopen is de rekenmachine ''Done'' toont tenzij je daar iets aan doet. Er zijn twee manieren om de Done weg te halen.
=== Done weghalen ===
De eerste manier is door <code>Output(1,1,"</code> te gebruiken of <code>Output(1,1,"Jouwtext</code> Op die manier wordt of de lege string of Jouwtext over de plek waar done zou komen te staan. Een betere versie van het programma zou dus zijn:
<pre>
PROGRAM:TEST
:Output(1,1,"HELLO WORLD!"
</pre>
Het resultaat dat je nu krijgt is al beter:
<pre>
HELLO WORLD!
</pre>
De tweede manier om Done weg te halen is door aan het einde van het programma <code>"</code> of <code>"Jouwtext</code> neer te zetten. Je kan hier in plaats van een string ook een getal of lijst neerzetten. In plaats van Done zet de rekenmachine de waarde van Ans neer op de plek waar hij Done neer zou zetten. Het nadeel van dit is wel dat Ans wordt aangepast. Een nog beter, kleinere versie van ons programma zou dus zijn:
<pre>
PROGRAM:TEST
:"HELLO WORLD!"
</pre>
Het verschil tussen de programma's kan je zien aan de grootte ervan. Hieronder staan de versies en de groottes van de programma's:
{| class="wikitable"
|-
! Versie
! Grootte (B)
|-
| 2
| 31
|-
| 3
| 26
|}
Dit is dus al een verschil van 5 bytes. Als je dit een stuk of 100 keer kan doen bespaar je bijna een halve KB. Dit zorgt er ook voor dat je programma sneller draait, doordat de rekenmachine minder heeft om te berekenen.
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Overzicht
|huidige=Hello World!
|volgende=Variabelen
}}
{{Sub}}
rqwwlw6hr8bdtp8b59mrpm7gg7rbjsv
Programmeren in TI-Basic/Menus
0
9993
428177
422154
2026-05-20T05:37:33Z
Erik Baas
2193
lf
428177
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Het is mogelijk menu's in de programma's gemaakt met TI Basic te steken. Menu's worden ingevoerd als volgt:
<pre>
Menu("Menunaam","optie1",[labelnummer],"optie2",[labelnummer])
</pre>
bij [labelnummer] hoef je alleen het cijfer van het label in te voeren.
Wanneer dit aangeroepen wordt, verschijnt op het scherm:
<pre>
Menunaam
1:optie1
2:optie2
</pre>
Wanneer je "1" ingeeft of met de pijltjes naar de eerste optie gaat en dan enter drukt, gaat het programma verder vanaf "label1". Zorg ervoor dat dit label gedefinieerd is, anders crasht het programma.
Het scherm is 16 karakters breed en 8 diep. Daarom kan de titel van het menu 16 karakters lang zijn, elke optie 14 karakters, en zijn er 7 maximaal keuzemogelijkheden.
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Toetsen
|huidige=Menu's
|volgende=Andere CTL-commando's
}}
{{Sub}}
03iozyfdkkca9v7jyldpwccqj73fyuq
Programmeren in TI-Basic/Variabelen
0
9996
428179
422147
2026-05-20T05:37:36Z
Erik Baas
2193
lf
428179
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Om een programma te maken heb je vaak getallen of strings nodig die je kan opslaan. Anders heb je alleen maar een soort filmpje dat wordt afgespeeld en nooit anders is. Als je bijvoorbeeld een programmatje wilt maken dat een getal tot de derde macht verheft, het plus 10 doet en het dan weer tot de derde macht worteltrekt, dan heb je variablen nodig. Je hebt 3 soorten basisvariablen: getallen variablen (Reals) (A-Z & θ), strings (Str0 - Str9) en lijsten(ι1 - ι6 & custom lijsten).
=== Reals ===
We beginnen met reals. Om een getal in een variable te zetten gebruik je het → tekentje. Je kan het → tekentje krijgen door op STO> te drukken. De syntax om een getal in een variable te zetten is dit:
<pre>
:getal→variable
</pre>
Een voorbeeld:
<pre>
:18→A
</pre>
Dit slaat 18 op in A. Reals kunnen van -9,9999.10<sup>99</sup> tot 9,9999.10<sup>99</sup> gaan.
=== Strings ===
Ook strings kan je opslaan op je rekenmachine. De syntax hiervoor is bijna hetzelfde als bij een real:
<pre>
:"string"→Str# (De letters 'string' worden opgeslagen in str#)
</pre>
De strings staan onder: VARS:VARS:String.
=== Lijsten ===
Reals en Strings worden door alle programmas gebruikt op de rekenmachine. Als je bijvoorbeeld een highscore opslaat in het ene programmatje in variable A, en een andere programma zet in variable A een waarde van -10, dan heb je plotseling een highscore van -10 in het ene programmatje staan. Om dit op te lossen heb je lijsten. Lijsten heb je in 2 soorten, de vaste rekenmachine lijsten (ι1 tot ι6) en de lijsten die je zelf een naam kan geven. In een lijst kunnen alleen reals worden gezet. Getallen in een lijst zetten is moeilijker dan getallen in een Real zetten. Om in de lijst te kunnen schrijven of lezen moet je hem eerst opstarten. Dit doe je zo: (De eerste ι in een lijstnaam is een speciale ι en niet de L op je toetsenbord. Je kan de speciale ι vinden in: LIST:OPS)
Allereerst moet je zorgen dat de lijst bestaat. Dit doe je met de optie SetUpEditor uit het STAT/EDIT-menu. Wanneer hier niets achter wordt gezet, worden de lijsten ι1 tot ι6 terug gezet. Met iets erachter wordt de custom-lijst aangemaakt.
<pre>
:PROGRAM:TEST
:SetUpEditor
(hier zijn de lijsten ι1 t/m ι6 weer zichtbaar)
:SetUpEditor ιLijstA,ιLijstB
(LijstA en LijstB worden aangemaakt. Nu kun je ze gebruiken met de rest van je programma.)
</pre>
Een andere manier is, om de lijst van een aantal regels te voorzien.
<pre>
:aantal regels→dim(ιLijstnaam
</pre>
Nadat je dit gedaan hebt kan je lezen en schrijven door een gedeelte van een lijst als een Real te zien:
<pre>
:ιLijstnaam(plek
</pre>
Lezen en schrijven kan dus bijvoorbeeld zo:
<pre>
PROGRAM:TEST
:10→dim(ιTEST
:18→ιTEST(4
:ιTEST(2→A
:Disp ιTEST(4
</pre>
Dit is niet de enige manier hoe je lijsten kan maken. Je kan ook de waardes op volgorde zetten zoals dit:
<pre>
:{4,19,2,18}→ιTEST
</pre>
Lijsten beginnen bij getal 1 en kunnen maximaal 999 getallen hebben. Je kan wel bijna een oneindig aantal lijsten hebben, dus dat is op zich geen probleem. Je kan alle MATH functies gewoon gebruiken op lijsten. De functie wordt dan op alle getallen uitgevoerd en je krijgt een nieuwe lijst die je dan weer kan opslaan. Als je bijvoorbeeld een lijst kwadradeert worden alle elementen in die lijst gekwadrateerd.
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Hello World!
|huidige=Basis Variablen
|volgende=Output
}}
{{Sub}}
3u6nrak60b2djnyfw489jv0opawgevc
Programmeren in TI-Basic/Output
0
10001
428178
422149
2026-05-20T05:37:34Z
Erik Baas
2193
lf
428178
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Als je een programma schrijft wil je dat het programma uiteindelijk het resultaat laat zien. Om dat te doen heb je een paar functies die staan onder PRGM:I/O in de program editor.
=== Disp ===
<code>Disp</code> gebruik je om een nieuwe regel vrij te maken en daar iets op te zetten. Als het scherm vol zit wordt de bovenste regel weggehaald en een nieuwe regel onderaan bijgezet. Getallen worden rechts van het scherm uitgelijnd en de rest is links uitgelijnd. De syntax is:
<pre>
:Disp waarde
</pre>
Om een lege regel te maken gebruik je deze regel:
<pre>
:Disp "
</pre>
=== Output ===
<code>Output</code> wordt gebruikt om waardes op een bepaalde plek op het scherm te zetten. Dit wordt vaak gebruikt in combinatie met <code>Disp</code> om eerst een lege regel te maken en er dan dingen op te zetten. <code>Output</code> overschrijft alles wat er onder de output komt. De syntax is:
<pre>
:Output(y,x,waarde
</pre>
Je kan ook een string op als waarde ingeven.
Je geeft aan waar de eerste letter komt, en de rest van het woord wordt erachter geplaatst:
<pre>
:Output(y,x,"Tekst
</pre>
Het scherm van je rekenmachine is 16 karakters breed, en 8 diep. Je kan dus maximaal <code>Output(8,16,X)</code> uitvoeren, anders krijg je een foutmelding. Als een string langer is dan het scherm wijd, dan wordt de string verder geschreven op de regel eronder, hiermee kan je snel een heel scherm volzetten met 1 commando.
=== ClrHome ===
<code>ClrHome</code> wordt gebruikt om het hele scherm leeg te halen. Dit wordt vaak gedaan aan het begin en aan het einde van een programma zodat er niet dingen achterblijven op het scherm. De syntax is:
<pre>
:ClrHome
</pre>
=== Pause ===
Pause is een aparte functie, hij staat ook niet in de I/O-lijst maar in de CTL-lijst. Hij zet namelijk je programma op pauze tot de gebruiker op de enter toets drukt. De syntax hiervoor is:
<pre>
:Pause
</pre>
Je kan er ook waardes mee laten zien waar mensen dan in kunnen scrollen als ze te lang zijn. Dit doe je zo:
<pre>
:Pause waarde
</pre>
Waarde kan ook een variabele zijn.
{{Sub}}
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Variabelen
|huidige=Output
|volgende=Invoer
}}
pftiku5a4hwujykwb8a16mmc7enmhgc
Programmeren in TI-Basic/Invoer
0
10006
428180
422148
2026-05-20T05:37:37Z
Erik Baas
2193
lf
428180
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Invoer is erg belangrijk als je een programma gaat maken. Je hebt hiervoor een paar mogelijkheden: <code>Input</code> en <code>Prompt</code>. De meeste programma's gebruiken Input. In dit voorbeeld gaan we een programma maken dat je leeftijd uitrekent als je je geboortedatum invoert.
Als je begint met het maken van een programma, moet je goed uitzoeken wat je precies gaat maken en hoe je dat dan gaat doen. We willen dus een programma maken dat je leeftijd berekent als je je geboortejaar invoert. Dat kunnen we doen door deze formule te gebruiken: <code>huidige jaar - geboortejaar = leeftijd</code>. We kunnen nu dus beginnen.
===Input===
<code>Input</code> kan op meerdere manieren worden gebruikt. De eerste manier is:
<pre>
:Input vraag,variabele
of
:Input variabele
</pre>
Bij de eerste wordt vraag weergegeven, bij de tweede wordt een vraagteken weergegeven.
De tweede manier is:
<pre>
:Input
</pre>
De tweede manier gaat naar het graphscreen en laat een cursor zien. Als je op Enter drukt wordt de plek van de cursor in X en Y gezet. We gebruiken nu de eerste manier:
<pre>
:PROGRAM:LEEFTIJD
:Disp "WAT IS JE
:Input "GEBOORTEDATUM:",A
</pre>
We zetten nu dus de geboortedatum in variabele A, hetzelfde als we bijvoorbeeld <code>18→A</code> zouden doen. Nu kunnen we iets met de geboortedatum doen, we halen het geboortejaar van het huidige jaar af.
<pre>
:PROGRAM:LEEFTIJD
:Input "UW GEBOORTEJAAR?",A
:2014-A→A
</pre>
Nu we het aantal jaren in A hebben gezet moeten we het nog laten zien:
<pre>
:PROGRAM:LEEFTIJD
:ClrHome
:Input "UW GEBOORTEJAAR?",A
:2014-A→A
:Disp "JE BENT:
:Output(3,10,A
:Disp "JAAR OUD
</pre>
Je programma is nu af en zal nu ongeveer iets als dit laten zien:
<pre>
UW GEBOORTEJAAR?
1981
JE BENT: 32
JAAR OUD
Done
</pre>
=== Prompt ===
Een andere manier van invoer is het <code>Prompt</code> commando. Hiermee kan je snel veel variablen vragen. De syntax is:
<pre>
:Prompt A,B,...,E
</pre>
Het zal voor alle variablen vragen wat voor waarde ze moeten hebben. Het is erg snel en klein, maar het ziet er vaak niet goed uit en daarom wordt Input vaker gebruikt. Een voorbeeld hoe Prompt wordt gevraagd:
<pre>
A=?5
B=?6
C=?9
D=?87
E=?7
</pre>
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Output
|huidige=Invoer
|volgende=Controlestructuren
}}
{{Sub}}
9gel29x7xlt54aj5a7slzfdcvvtfl3g
Programmeren in TI-Basic/Controlestructuren
0
10007
428184
422150
2026-05-20T05:37:39Z
Erik Baas
2193
lf
428184
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Als je programmeert dan moet je dingen controleren. Als je bijvoorbeeld een wachtwoordprogrammaatje maakt, dan moet je controleren of het wachtwoord goed is. Als je wilt dat mensen het wachtwoord meerdere keren kunnen invoeren heb je herhalingen nodig, zogenoemde loops. In dit hoofdstuk gaan we een programmaatje maken dat een text laat zien als je het wachtwoord hebt ingevoerd. Je moet het wachtwoord ook kunnen veranderen in het programma. Het wachtwoord zullen we opslaan in een lijst. We beginnen dus met het laden van de lijst.
<pre>
PROGRAM:PASS
:1→dim(LPASS
:Input "WACHTWOORD:",A
</pre>
=== If ===
Het if commando wordt gebruikt om te kijken of dingen waar zijn, hiervoor gebruik je de TEST tekens: =, ≠, >, ≥, <, ≤. Dit is de syntax:
<pre>
:If waarde van 1 of 0
:commando om uit te voeren
</pre>
of
<pre>
:If waarde van 1 of 0
:Then
:commando
:commando
:End
</pre>
of
<pre>
:If waarde van 1 of 0
:Then
:commando
:commando
:Else
:commando
:commando
:End
</pre>
Als er geen Then na een If komt, wordt alleen het commando achter de If uitgevoerd als de waarde 1 is. Als er een Then na de If komt wordt alles van de Then tot de End of Else uitgevoerd als de waarde 1 is. Als er een Else na Then komt, dan wordt alles na de Else en tot de End uitgevoerd als de waarde 0 is. Een voorbeeld:
<pre>
:Input A
:If A=2
:Then
:Disp "A = 2
:Else
:Disp "A ≠ 2
:End
</pre>
Als A=2, dan wordt het eerste uitgevoerd, als A≠2, dan wordt alles van else tot end uitgevoerd.
=== TEST ===
Hieronder staat een beschrijving van de tekens.
==== = ====
Dit kijkt of twee waardes hetzelfde zijn.<br>
<code>2 = 2</code>
==== ≠ ====
Dit kijkt of twee waardes niet hetzelfde zijn.<br>
<code>2 ≠ 3</code>
==== > ====
Dit kijkt of de eerste waarde groter is dan de tweede waarde.<br>
<code>2 > 1</code>
==== ≥ ====
Dit kijkt of de eerste waarde groter of gelijk is aan de tweede waarde.<br>
<code>2 ≥ 1</code><br>
<code>2 ≥ 2</code>
==== < ====
Dit kijkt of de eerste waarde kleiner is dan de tweede waarde.<br>
<code>2 < 3</code>
==== ≤ ====
Dit kijkt of de eerste waarde kleiner of gelijk is aan de tweede waarde.<br>
<code>2 ≤ 3</code><br>
<code>2 ≤ 2</code>
We kunnen nu verder met ons programma omdat we nu kunnen kijken of het wachtwoord dat de gebruiker heeft ingevoerd klopt met wat er in de lijst staat.
<pre>
PROGRAM:PASS
:1→dim(LPASS
:Input "WACHTWOORD:",A
:If A≠LPASS(1
:Then
:Disp "FOUT WACHTWOORD."
:Return
:End
:Disp "GEFELICITEERD!"
</pre>
=== Stop ===
Stop wordt gebruikt om het programma te stoppen. Het programma gaat niet terug naar het programma waarmee het is gestart, maar stopt helemaal.
=== Return ===
Return is de beste manier om een programma te stoppen. Het programma waarmee jouw programma is gestart gaat dan gewoon verder met waar het mee bezig was. Dit wordt ook vaak gebruikt bij routines (subprogramma's).
Het programma controleert nu of het wachtwoord goed is, maar doet er verder nog niets mee, het wachtwoord is altijd 0. We moeten nu nog iets maken waarmee je het wachtwoord kan veranderen. Dit kunnen we weer doen met een Input en een If.
<pre>
PROGRAM:PASS
:1→dim(LPASS
:Input "WACHTWOORD:",A
:If A≠LPASS(1
:Then
:Disp "FOUT WACHTWOORD.
:Return
:End
:Disp "GEFELICITEERD!
:Disp "WACHTWOORD VERANDEREN?
:Input "1 = JA: ",B
:If B
:Then
:Input "NIEUW WACHTWOORD:",C
:C→LPASS(1
:Disp "W8W VERANDERD
:End
</pre>
=== Loops ===
Als iemand een verkeerd wachtwoord heeft ingevoerd, dan wil je dat hij het wachtwoord opnieuw moet invoeren tot hij het goede wachtwoord heeft. Dit kan je doen met een loop. Hieronder staan de manieren om te loopen.
==== While ====
De While loop lijkt een beetje op de If. Als de waarde 1 is dan blijft hij lopen, zo niet, dan slaat hij het over en gaat verder in het programma. De syntax van het While commando is:
<pre>
:While waarde
:commandos
:commandos
:End
</pre>
Zo kun je het programma dus aanpassen zodat hij blijft lopen tot hij het goede wachtwoord heeft:
<pre>
PROGRAM:PASS
:1→dim(LPASS
:DelVar A
:Input "WACHTWOORD:",A
:While A≠LPASS(1
:Disp "FOUT WACHTWOORD.
:Input "WACHTWOORD:",A
:End
:Disp "GEFELICITEERD!
:Disp "W8W VERANDEREN?
:Input "1 = JA: ",B
:If B
:Then
:Input "NIEUW W8W:",C
:C→LPASS(1
:Disp "W8W VERANDERD
:End
</pre>
==== Repeat ====
Repeat is eigenlijk het omgekeerde van While, hij blijft loopen tot de waarde 1 is. Hij gaat dus verder bij 0. Een Repeat loop wordt ook pas bij de end gecontroleerd en dus wordt het ook minstens 1 keer uitgevoerd. Een versie van ons programma met Repeat zou dus zijn:
<pre>
PROGRAM:PASS
:1→dim(LPASS
:Input "WACHTWOORD:",A
:Repeat A=LPASS(1
:Disp "FOUT WACHTWOORD.
:Input "WACHTWOORD:",A
:End
:Disp "GEFELICITEERD!
:Disp "W8W VERANDEREN?
:Input "1 = JA: ",B
:If B
:Then
:Input "NIEUW W8W:",C
:C→LPASS(1
:Disp "W8W VERANDERD
:End
</pre>
==== For ====
For is een aparte manier van loopen. Hij loopt namelijk maar een paar keer. Je voert een variable in en stelt in van waar tot waar hij moet tellen. De syntax is:
<pre>
:For(variable,van,tot,stapgrootte (als je niets invult wordt de waarde 1)
:commandos
:commandos
:End
</pre>
Zo kun je er dus voor zorgen dat je het wachtwoord maar een paar keer in kan voeren. Dit is veel beter, omdat het programma daarna weer kan stoppen. De nieuwe versie van het programma wordt dan:
<pre>
PROGRAM:PASS
:1→dim(LPASS
:For(Z,1,5 (Het prgmtje kan vijf keer herhalen)
:Input "WACHTWOORD:",A (het prgmtje vraagt naar je wachtwoord)
:If A≠LPASS(1 (is deze niet gelijk aan het opgegeven wachtwoord?)
:Then
:Disp "FOUT WACHTWOORD. (Als de stelling waar is (ww fout) voert de TI dit uit)
:Else (Anders... is het wachtwoord wel goed, dus voert hij deze uit)
:Disp "GEFELICITEERD! (dit wordt dus niet uitgevoerd als de stelling goed is)
:Disp "W8W VERANDEREN? (dan gaat het prgmtje door naar end )
:Input "1 = JA: ",B
:If B (Boolean methode. Als waar = 1, als niet waar = 0.)
:Then
:Input "NIEUW W8W:",C (wachtwoord wordt ingevoerd (in cijfers))
:C→LPASS(1 (wordt opgeslagen in een lijst (ook in cijfers))
:Disp "W8W VERANDERD
:End (Het stuk van ww veranderen wordt hier afgesloten)
:Stop (Sluit het prgmtje af (alleen als het ww goed was))
:End (Else tot End wordt afgesloten)
:End (De For() loop wordt hier afgesloten. Na 5x gaat het prgmtje niet terug)
Opmerking: De waarde van Z wordt steeds veranderd.
</pre>
=== Labels ===
Als je het wachtwoord hebt veranderd wil je dat ze het nieuwe wachtwoord meteen uitproberen. Dit kan je doen door naar een bepaalde plek in het programma te springen met een functie. Deze functie heet Goto. Voordat je een Goto gebruikt moet je eerst een Lbl in je programma hebben gezet. Gebruik labels zo min mogelijk, ze zijn langzaam en je hebt kans op fouten. Probeer dus zo veel mogelijk loops te gebruiken. De enige plek waar je labels zonder veel problemen kunt gebruiken zijn bij menus.
==== Lbl ====
De Lbl functie doet op zich niets, het geeft alleen een plek in het programma weer. Goto kan alleen naar die labels springen. Labels hebben een naam die maximaal 2 tekens kan zijn en alleen de letters + θ en getallen. De syntax is:
<pre>
:Lbl naam
</pre>
==== Goto ====
De Goto functie kan naar labels springen in het programma. Doe dit alleen niet tijdens loops, alleen als je er zeker van bent dat er geen End meer achter komt, bijvoorbeeld bij het einde van het programma. Anders heb je kans dat hij weer terugspringt naar de loop. De syntax is:
<pre>
:Goto label
</pre>
Als we een programma willen hebben die na het veranderen van het wachtwoord weer terugspringt naar het begin kunnen we het zo doen:
<pre>
PROGRAM:PASS
:1→dim(LPASS
:Lbl ST
:DelVar A
:Repeat A=LPASS(1
:Disp "FOUT WACHTWOORD.
:Input "WACHTWOORD:",A
:End
:Disp "GEFELICITEERD!
:Disp "W8W VERANDEREN?
:Input "1 = JA: ",B
:If B
:Then
:Input "NIEUW W8W:",C
:C→LPASS(1
:Disp "W8W VERANDERD
:Goto ST
:End
</pre>
{{Sub}}
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Invoer
|huidige=Controle structuren
|volgende=Toetsen
}}
o8z898bvunq67pg9ziccqt5d6t4ijp0
Programmeren in TI-Basic/Andere CTL-commando's
0
10293
428181
424389
2026-05-20T05:37:37Z
Erik Baas
2193
lf
428181
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Dit gedeelte gaat over de CTL-commando's die nog niet eerder zijn behandeld. Je vind het CTL-menu terug als je een programma aan het bewerken bent en drukt op: <code>prgm>CTL</code>
Het CTL-menu ziet er als volgt uit:
<pre>
[CTL] I/O EXEC
1:If
2:Then
3:Else
4:For(
5:While
6:Repeat
7:End
8:Pause
9:Lbl
0:Goto
A:IS>(
B:DS<(
C:Menu(
D:prgm
E:Return
F:Stop
G:Delvar
H:Graphstyle(
I:OpenLib(
J:ExecLib
</pre>
In dit artikel ga ik met u de verschillende functies van boven naar beneden af. If, then, else, end, lbl, menu, goto (en stop) zijn al eerder behandeld. Voor informatie over deze functies moet je naar een eerder artikel in dit boek gaan.
== For( ==
We beginnen bij ''For(''. Met deze functie kun je een variabele met een bepaalde stapgrote laten toenemen, totdat een waarde wordt bereikt. Dit gebeurt altijd volgens de volgende formule:
<pre>
:For(Variabele,beginwaarde,eindwaarde,stapgrootte
:Opdrachten
:End
</pre>
De variabele die je geeft, moet altijd een reële variabele zijn. Dit wil zeggen dat dit een letter van A t/m Z of Ø moet zijn. Vervolgens komt de beginwaarde. De TI begint hier met tellen totdat de eindwaarde wordt bereikt. De stapgrootte is niet verplicht. De TI telt steeds de stapgrootte op bij het de variabele. Als er geen stapgrootte is ingesteld, wordt er standaard '1' bij opgeteld. Na het optellen worden de opdrachten uitgevoerd die tussen For( en de bijbehorende End staan. Het volgende programmaatje laat zien wat je er bijvoorbeeld mee kan doen.
<pre>
PROGRAM:TEST
:For(A,1,10
:Disp A (getallen 1 t/m 10)
:End
:For(B,1,20,2
:Disp B (oneven getallen van 1 t/m 20)
:End
</pre>
== While en Repeat ==
De while-functie (''While '') is een functie volgens de volgende formule opgebouwd. Ook de repeat-functie (''Repeat '') zal ik hier behandelen. Qua formule verschilt alleen het woordje While/Repeat.
<pre>
:While waar(1) (een booleaanse vergelijking, bijv. A=0, kan worden gebruikt. Als de gelijkheid waar is, worden
:opdracht 1 de opdrachten 1&2 uitgevoerd, anders niet.)
:opdracht 2
:End
</pre>
While en Repeat zijn lussen. Dit wil zeggen dat de opdrachten tussen While/Repeat en End herhaalt blijven worden, totdat de waarde achter While/Repeat "0" of "niet waar" is. Het verschil tussen While en Repeat zit in een klein detail. Als een programmaatje bij While komt en de waarde is niet waar, slaat het programmaatje de volledige While-loop over. Bij repeat wordt alles uitgevoerd, totdat het programmaatje bij End komt. Dan wordt er pas gekeken of de waarde waar is. Wanneer deze waarde waar is, wordt de loop herhaald, en anders gaat het programmaatje verder.
== Pause ==
Pause is met Menu( en '''?<!--WAT IS DEZE?-->''' de enige die een programma stil kan zetten, zonder dat het programmaatje stopt. De gebruiker kan hierdoor bijvoorbeeld een tekst makkelijker lezen. Net zoals met de rest van dit artikel even een formule.
<pre>
:opdracht 1
:Pause
:opdracht 2
:Pause "TEXT
</pre>
Achter pause kan ook een tekst worden geplaatst (voorafgegaan door een "). De tekst wordt dan weergegeven op het basisscherm. Dit is vooral handig bij grote matrices of lijsten, omdat (in tegenstelling tot het commando "Disp" of "Output") de gebruiker met pijltjes door de matrix/lijst kan bladeren. Ook is Pause handig om, als het programmaatje te snel is, een gebruiker ervan iets te laten lezen.
== IS>( en DS<( ==
Wil iemand met tijd dit even controleren? De informatie kan wel eens iets anders zijn dan moet.
IS>( en DS<( zijn functies die of één bij een variabele optellen, of ervan aftrekken. Daarna kijken ze of de opgegeven waarde niet is overschreden. Formula...
<pre>
:IS>(variabele,CheckGetal
:opdracht 1
:opdracht 2
:DS<(variabele,CheckGetal
:opdracht 3
:opdracht 4
</pre>
Bij IS>( geldt: Als de variabele groter dan het CheckGetal is, wordt de regel er na niet uitgevoerd.
Bij DS<( geldt: Als de variabele kleiner dan het CheckGetal is, wordt de regel er na niet uitgevoerd.
In het programma hierboven worden opdracht 2 en 4 sowieso uitgevoerd!
Een variabele is (mocht je dit nog steeds niet weten) een letter of string. Met IS en DS kunnen alleen real variabelen worden ingevuld (A t/m Z en Ø). Het programma voert de opdracht na IS of DS alleen uit als het CheckGetal niet overschreden is <!--Toch????-->. Zie eenvoudig wat er gebeurt met het volgende programmaatje.
<pre>
PROGRAM:TEST
:Input "1 meer dan ?",A
:IS>(A,10
:Disp A (wordt alleen weergegeven als het getal minder is dan 10
:Input "1 minder dan ?",A
:DS<(A,10
:Disp A (wordt alleen weergegeven als het getal meer is dan 10
</pre>
== prgm en Return ==
Deze functie is om een programma te starten. Hierdoor is het mogelijk om programma's te starten vanuit een ander programmaatje. Programmaatjes kunnen zo dus andere programmaatjes laten starten en grote programmaatjes kunnen zo makkelijker worden verdeeld in kleinere delen. Dit is vooral handig omdat het flash geheugen (archive in de plus uitvoeringen) in kleinere delen is opgesplitst.
Communicatie tussen programmaatjes kan bijvoorbeeld zo worden bereikt.
<pre>
PROGRAM:TEST
:1→A
:Menu("Maak uw keuze","keuze1",A,"keuze2",B,"keuze3",C,"STOP",D
:Lbl A
:Disp K
:1:prgmTEST1 Wordt 1 of prgmTEST1 in Ans gestopt???
:Lbl B
:Disp L
:2:prgmTEST1
:Lbl C
:Disp M
:3:prgmTEST1
:Lbl D:Stop
PROGRAM:TEST1
:If Ans=1:Then
:Disp "Keuze 1
:1+K→K
:End
:If Ans=2:Then
:Disp "Keuze 2
:1+L→L
:End
:If Ans=3:Then Voer deze programmaatjes in, om er mee te oefenen.
:Disp "Keuze 3 De mogelijkheden worden vanzelf duidelijk.
:1+M→M
:End
:prgmTEST
</pre>
Return kan gebruikt worden om terug te keren naar het hoofdprogramma. Wanneer dit commando wordt uitgevoerd in het hoofdprogramma wordt het programma gestopt. Vaak terugkerende loops in verschillende programma's kunnen zo worden uitgevoerd in één programma.
== Delvar ==
Zoals de naam al zegt, Del(ete) hij een var(iabele). Met behulp van deze functie kunnen in een programma variabelen worden gewist. Dit kan handig zijn om ruimte vrij te maken, of om gegevens te verwijderen die niet bedoeld zijn om te bewaren. Een extraatje die er bij gevoegd is, is dat Delvar + variabele achter elkaar kan worden gebruikt, zonder een scheidingsteken ('':'').
<pre>
Delvar ADelvar BDelvar CDelvar D De variabelen A t/m D worden verwijderd
</pre>
na Delvar kun je ook een andere commando gebruiken, zoals clrhome
<pre>
Delvar ADelvar BClrHome De variabelen A en B worden verwijderd en het homescreen wordt leeggemaakt
</pre>
== Graphstyle ==
De functie Graphstyle is om de grafieken in het schermpje ''Y='' van een andere manier van tekenen te voorzien. De formule...
<pre>
Graphstyle(Functie#,tekenmanier
</pre>
Met functie wordt Y<sub>1</sub> <sup>t</sup>/<sub>m</sub> Y<sub>0</sub> bedoeld. In graphscreen wordt uitgelegd hoe je deze functies kan opstellen.<br>
De tekenmanieren zijn: stippellijn, gewone lijn, dikke lijn, schaduw boven, schaduw onder en de twee aangeefsymbolen.
== Openlib( en Execlib ==
Op de GR kunnen ook externe dingen als een muis en een toetsenbord aangesloten worden, door middel van een usb/IO-poort. Met Openlib (en Execlib wordt het mogelijk gemaakt om aangesloten apparaten ook echt te gebruiken.
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Menus
|huidige=Andere CTL Commandos
|volgende=Het graphscreen
}}
{{Sub}}
ce5hqpp9gb7icnog6tm803zval41o55
Programmeren in TI-Basic/Het graphscreen
0
10294
428183
422157
2026-05-20T05:37:38Z
Erik Baas
2193
lf
428183
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Je rekenmachine heeft ook een mogelijkheid om tekeningen te maken op het scherm. Een van de mogelijkheden om iets te tekenen op het scherm zijn formules.
=== Formules ===
Formules voer je normaal in via het Y= knopje. Je krijgt dan zo'n scherm:
<pre>
Plot1 Plot2 Plot3
\Y1=
\Y2=
\Y3=
\Y4=
\Y5=
\Y6=
\Y7=
</pre>
Je kan hier formules invoeren die dan worden getoont op het scherm. Bij een TI-Basic programmatje gaat dat anders. Formules werken bij TI-Basic als variabelen. Ze staan onder: <code>VARS:Y-Vars:1:Function</code>. Om bijvoorbeeld 4X^3+5X in de eerste Y waarde te zetten gebruik je deze code:
<pre>
:"4X^3+5X"→Y1
</pre>
Als je hierna de code <code>DispGraph</code> gebruikt zal de functie worden getoond op het graphscreen.
Dit werkt alleen als de Functions mode is ingeschakelt in het mode menu en de formules aan staan bij <code>VARS:Y-VARS:4:On/Off</code>.
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Andere CTL-commando's
|huidige=Het graphscreen
|volgende=Tekenfuncties
}}
{{Sub}}
5fcma1deq55wzyrji2di1gwmqzqipog
Programmeren in TI-Basic/Tekenfuncties
0
10302
428185
422158
2026-05-20T05:37:40Z
Erik Baas
2193
lf
428185
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Behalve formules kunnen op het graphscreen ook vormen worden getekend.
=== Functies ===
Hieronder staat een lijstje van alle draw commandos:
==== ClrDraw ====
<pre>
:ClrDraw
</pre>
ClrDraw is ongeveer hetzelfde als ClrHome, het maakt het graphscreen leeg en hertekent de formules.
==== Line( ====
<pre>
:Line(X1,Y1,X2,Y2
</pre>
Deze functie tekent een lijn van punt (X1,Y1) naar punt (X2,Y2).
<pre>
:Line(X1,Y1,X2,Y2,0
</pre>
Hetzelfde, maar dan een witte lijn (d.w.z. alle zwarte pixels op deze lijn worden wit gemaakt, alle witte pixels blijven wit).
==== Horizontal ====
<pre>
:Horizontal Y
</pre>
Dit tekent een horizontale lijn op Y.
==== Vertical ====
<pre>
:Vertical X
</pre>
Dit tekent een verticale lijn op X.
==== Tangent( ====
<pre>
:Tangent(Grafiek,waarde
</pre>
Deze functie tekent een raaklijn aan de grafiek.
==== DrawF ====
<pre>
:DrawF Grafiek
</pre>
Tekent de grafiek Grafiek op het graphscreen.
==== Shade( ====
<pre>
:Shade(Grafiek1,Grafiek2
</pre>
Deze functie kleurt de ruimte in tussen Grafiek1 en Grafiek2. Zorg ervoor dat Grafiek1 zich boven Grafiek2 bevindt, anders wordt er niets gekleurd.
<pre>
:Shade(Grafiek1,Grafiek2,xMin,xMax
</pre>
Doet hetzelfde, maar kleurt alleen tussen xMin en xMax.
==== DrawInv ====
<pre>
:DrawInv Grafiek
</pre>
Tekent de grafiek Grafiek omgekeerd (X = Y, Y = X).
==== Circle( ====
<pre>
:Circle (X,Y,Radius
</pre>
Dit tekent een cirkel met als middenpunt (X,Y) en een radius van Radius.
==== Text( ====
<pre>
:Text(X,Y,text[,text[,...,text]]
:Text(-1,X,Y,text[,text[,...,text]]
</pre>
Hiermee kan je text op het graphscreen zetten. Je kan meerdere variablen en strings tegelijk op het graphscreen zetten. Als het eerste argument -1 is, dan wordt de text even groot als op het basisscherm neergezet.
{{Sub}}
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Het graphscreen
|huidige=Drawing functies
|volgende=Pixels en punten
}}
31zc5c2fwavrev623dpb0zprp8kwaja
Programmeren in TI-Basic/Pixels en punten
0
10347
428186
422159
2026-05-20T05:37:41Z
Erik Baas
2193
lf
428186
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Pixels en punten zijn nauw verbonden met het graphscreen. Het lcd-scherm is '''95 pixels breed en 63 pixels hoog'''. Het menu waar we het in dit hoofdstuk over hebben is het DRAW:POINTS-menu.
<pre>
DRAW [POINTS] STO
1:Pt-ON(
2:Pt-Off(
3:Pt-Change(
4:Pxl-On(
5:Pxl-Off(
6:Pxl-Change(
7:pxl-Test(
</pre>
== Punten ==
De eerste drie functies uit dit menu, <code>Pt-ON( , Pt-Off( , Pt-Change(</code> , zijn de functies die bij punten horen. Punten worden gekenmerkt doordat ze een X en een Y-coordinaat hebben die gerelateerd is aan de X-min, X-max, Y-min en Y-max waardes.
Met <code>Pt-ON(X,Y</code> zet je het punt aan met deze X en Y coordinaat, of deze nou binnen of buiten het zichtbare scherm zit.
Met <code>Pt-Off(X,Y</code> zet je het punt uit met X en Y-coordinaat.
Met <code>Pt-Change(X,Y</code> verander het punt met X en Y-coordinaat naar 'uit' als deze aan staat, of naar 'aan' als deze uit staat.
We nemen als voorbeeld:
<pre>
PROGRAM:TEST
:ZStandard (-10,10)x(-10,10)
:For(A,1,10
:For(B,1,10
:Pt-ON(A,B (De pixels in het vierkant rechtsboven worden aangezet)
:End:End
:Pause (Geniet er even van en druk op enter)
:For(A,3,5
:For(B,4,6
:Pt-Off(A,B (Een kleiner vierkant wordt uitgezet)
:End:End
:Pause (geniet met mate....)
:For(A,1,15
:For(B,1,15 (om te bewijzen dat ook buiten het scherm verder gegaan wordt...)
:Pt-Change(A,B (het volledige vierkant wordt veranderd naar het tegenovergestelde)
:End:End
:Pause (relax)
:16→Xmax:16→Ymax (zie het resultaat...)
</pre>
== Pixels ==
Hier wordt de afstand tussen van de linkerkant cq. bovenkant van het scherm bekeken. Waar Pt-On(10,10 nog het pixeltje was helemaal rechtsbovenaan, is Pxl-On(10,10 het pixeltje 10 van links en 10 van boven. De functies werken hetzelfde. Er is met pxl-test wel een nieuwe functie bijgekomen en die zal ik nog even toelichten. Voor een demonstratie van Pxl-On, Pxl-Off en Pxl-Change gebruik Program:TEST met pxl in plaats van pt.
=== pxl-Test ===
Deze functie controleert of de pixel op het scherm, die gegeven is door de X- en Y-coördinaten die je meegeeft aan de functie, zwart of wit is. Als de pixel wit is, geeft de functie 0 terug, anders geeft deze 1 terug.
Dit is een erg handige functie, vooral bij het maken van spellen.
Voorbeeld
<pre>:If pxl-Test(0,0):Then
:Text(10,0,"Pixel linksboven is aan")
:Else
:Text(10,0,"Pixel linksboven is uit")
:End</pre>
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Tekenfuncties
|huidige=Pixels en Punten
|volgende=Routines
}}
{{Sub}}
l93ddxojgjrpzmto2j3vp5ad7671xzh
Programmeren in TI-Basic/Routines
0
10581
428182
422160
2026-05-20T05:37:38Z
Erik Baas
2193
lf
428182
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Soms is het handig om een stuk code te groeperen omdat je het bijvoorbeeld ook in een ander programma gebruikt, of omdat je het erg vaak gebruikt in hetzelfde programma. In andere programmeertalen heten dat functies. TI-Basic heeft die mogelijkheid niet; wat TI-Basic wel kan is andere programma's starten. Als je dus de code in een ander programma zet, is het mogelijk om deze uit te voeren vanuit je hoofdprogramma.
== Routines ==
Om te laten zien hoe je routines gebruikt gaan we twee programmaatjes maken, één dat uitrekent wat het X-de priemgetal is, en één dat controleert of een ingegeven getal een priemgetal is. We zullen dus bij elk programma moeten kijken of een bepaald getal een priemgetal is. We beginnen met het maken van het programma dat kijkt of een getal dat je invoert een priemgetal is.
<pre>
PRGM:CHKPRM
:Input "NUMMER: ",D
:DelVar B
:For(E,2,√(D
:If fPart(D/E)=0
:1→B
:End
:If B=1
:Disp "GEEN PRIEMGETAL
:Else
:Disp "WEL PRIEMGETAL
:End
</pre>
Het tweede programma zou dan zijn:
<pre>
:PRGM:NRPRM
:Input "NUMMER: ",A
:DelVar D
:For(C,0,A
:DelVar F
:Repeat F
:D+1→D
:DelVar B
:For(E,2,√(D
:If fPart(D/E)=0
:1→B
:End
:If B=0
:1→F
:End
:End
:Disp D
</pre>
In deze twee programma's gebruik je precies dezelfde code, je kan dit dus veel efficiënter maken door dit stuk code apart te zetten:
<pre>
:DelVar B
:For(E,2,√(D
:If fPart(D/E)=0
:1→B
:End
</pre>
Bij TI-Basic doe je dat door de code in een nieuw programma te zetten.
<pre>
PRGM:PRMSUB
:DelVar B
:For(E,2,√(D
:If fPart(D/E)=0
:1→B
:End
:Return De return zorgt ervoor dat het programma niet stopt, maar teruggaat naar het vorige programma.
</pre>
<!-- Volgens mij is die return niet nodig, ook als je in een subprogramma zit... -->
Onze nieuwe programma's worden dan:
<pre>
PRGM:CHKPRM
:Input "NUMMER: ",D
:prgmPRMSUB
:If B
:Disp "GEEN PRIEMGETAL
:Else
:Disp "WEL PRIEMGETAL
:End
</pre>
<pre>
:PRGM:NRPRM
:Input "NUMMER: ",A
:DelVar D
:For(C,0,A
:DelVar F
:Repeat F
:D+1→D
:prgmPRMSUB
:If B=0
:1→F
:End
:End
:Disp D
</pre>
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Pixels en punten
|huidige=Routines
|volgende=Optimalisatie
}}
{{Sub}}
ixkhiltvzw1vs7hysp0qrbw8047i2x4
Programmeren in REXX/Bevelen, deel 1
0
11321
428203
425890
2026-05-20T06:09:14Z
Erik Baas
2193
lf
428203
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
Dit hoofdstuk geeft meer uitleg bij een eerste reeks veel gebruikte REXX bevelen.
<hr>
=SAY=
'''say''' ''parameter''
We beginnen met het eenvoudigste bevel, namelijk '''say'''.
De instructie zal alles wat als ''parameter'' is meegegeven, na interpretatie, op het scherm afdrukken.
De parameter kan zijn opgebouwd uit constanten, variabelen of een combinatie ervan.
In dit voorbeeld hebben we zelfs een Carriage Return en Line Feed (kortweg CrLf) toegevoegd om het afdrukken op 2 regels te laten geschieden:
/* Voorbeeld voor SAY */
crlf='0D0A'x
say 'Hallo !'crlf'Tot ziens !'
De zinnen «Hallo !» en «Tot ziens !» komen onder elkaar op het scherm te staan.
<hr>
=EXIT=
Het '''exit''' bevel beëindigd het programma. Er kan desgevallend een geheel getal als parameter worden meegegeven. Dit getal stelt dan de returncode van het programma voor.
Zonder parameter is de returncode steeds nul (0). Deze returncode kan opgepikt worden door de oproeper. Windows maakt er spijtig genoeg geen gebruik van en toont de returncode niet.
<hr>
=DO=
Een '''DO''' bevel duidt het begin aan van een reeks samenhorende statements. De reeks moet worden afgesloten door een '''END''' bevel.
<br>Men noemt dit een '''DO-blok'''.
DO-blokken kunnen andere DO-blokken bevatten (genest zijn).
Het is een goede gewoonte om de statements binnen het blok te laten inspringen om de leesbaarheid te vergroten.
==Fundamentele vorm==
De meest fundamentele vorm dient uitsluitend om statements logisch bij elkaar te houden:
'''do'''
say 'Hello'
say 'Goodbye'
'''end'''
Deze constructie komt men veel tegen in combinatie met bv. het '''if''' bevel dat we wat verder zullen leren gebruiken.
if 7>5 then '''do'''
say 'Hello' ; say 'Goodbye'
'''end'''
Merk ook op dat het aligneren van "do" en "end" de leesbaarheid bevorderen. We zijn soms ook voorstander van volgende schrijfwijze:
if 7>5 then '''do'''
say 'Hello' ; say 'Goodbye'
'''end'''
Ze heeft het voordeel compacter te zijn (smallere marges), en wij beschouwen het als zijnde een ''IF-blok''.
==Itereren==
Een '''DO-blok''' kan ook dienen om de reeks statements een aantal maal te laten uitvoeren. In zijn meest eenvoudige
vorm bepaalt een parameter het aantal ''iteraties'' dat moet worden uitgevoerd:
'''do''' 7 ; say 'Hello' ; '''end'''
Het aantal iteraties kan ook aangegeven worden via een variabele. Het moge duidelijk zijn dat de waarde van de variabele een geheel getal moet zijn, anders zal men een REXX fout krijgen ''(Code 26: Invalid whole number)''.
a=7
'''do''' a ; say 'Hello' ; '''end'''
We kunnen ook een variabele opgeven die dan de teller van de lus wordt. Deze teller kan desgevallend binnen de lus gebruikt worden. We bepalen daarbij ook een begin- en eindwaarde.
a=1
'''do''' ''i'' = 1 '''to''' 10 /* bereken 10 faculteit */
a = a * i
'''end'''
Deze lus zal 10 maal doorlopen worden, waarbij de variabele ''i'' respectievelijk de waarde 1, 2, 3, ... 10 zal bevatten. Het resultaat van deze lus is dat we 10! (faculteit)
hebben berekend.
Een alternatieve schrijfwijze bekomt men met het '''for''' sleutelwoord. Dit is dan ook gelijkwaardig aan vorige voorbeeld:
a=1
'''do''' ''i'' = 1 '''for''' 10 /* bereken 10 faculteit */
a = a * i
'''end'''
Bijkomend kunnen we een stapwaarde opgeven waarmee de teller bij elke iteratie moet worden verhoogd. Zonder dat is de stap natuurlijk altijd 1.
a=1
'''do''' ''i''=2 '''to''' 10 '''by''' 2
a=a*i /* we berekenen 2 * 4 * 6 * 8 * 10 */
'''end'''
Deze stapwaarde kan ook negatief zijn, maar dan moet men van een groot getal naar een klein getal itereren, anders zal men de lus nooit meer verlaten.
a=1
'''do''' ''i''=10 '''to''' 2 '''by''' -2
a=a*i /* we berekenen 10 * 8 * 6 * 4 * 2 */
'''end'''
==Eindeloze lussen==
Met '''do forever''' geven we aan dat er oneindig lang geïtereerd moet worden. Uiteraard kan dat nooit de bedoeling zijn. We zullen dus op een bepaald ogenblik uit de lus moeten springen. Dit kan bereikt worden door het bevel '''leave''' te gebruiken. Meestal zal dit gebeuren na het testen van een voorwaarde, zoals in dit voorbeeld:
a=2
'''do''' '''forever'''
a=a*a /* berekenen van de machten van 2 */
if a>256 then '''leave''' /* maar stoppen als we voorbij 256 komen */
'''end'''
==Iteratiestappen overslaan==
We kunnen naar een volgende iteratie gaan (en dus een gedeelte van de lus niet behandelen) mits gebruik van het '''iterate''' bevel. In het volgende voorbeeld lijsten we alle machten van 2 tussen 1 en 10, maar niet de 5-de macht.
'''do''' ''i'' = 1 to 10
say i
if i=5 then '''iterate'''
say 2**i
'''end'''
Iets gelijkaardigs zou kunnen bekomen worden door de lus-variabele i te manipuleren, doch dit houdt gevaren in en maakt het programma minder leesbaar.
==Geneste lussen==
'''do''' ''i'' = 1 to 10
'''do''' ''j'' = 1 to 2
say i*j
'''end''' j
'''end''' i
Merk op dat we de lusvariabele kunnen opgeven bij het '''end''' bevel. Dit verhoogt zeker de leesbaarheid indien er veel programmalijnen in de lus zitten. De laatst begonnen lus moet natuurlijk eerst sluiten. We kunnen de lussen niet "kruisen".
==Conditionele lussen==
We kunnen ook blijven itereren ''tot'' aan een bepaalde voorwaarde is voldaan. Dit doen we met een '''do until''' bevel.
a=1
'''do until''' a>5
say a ; a=a+1
'''end'''
Wanneer a een waarde groter dan 5 behaalt verlaten we de lus. Deze voorwaarde wordt telkens aan het einde van de lus getest, en de lus wordt dus minstens éénmaal uitgevoerd.
<br>Willen we echter de test uitvoeren aan het begin van de lus, dan gebruiken we het bevel '''do while'''.
'''do while''' a<6
say a ; a=a+1
'''end'''
Deze lus geeft hetzelfde resultaat als die met "do until".
{{Bericht
|bericht=De lusvariabele wordt telkens aan het einde van de lus (of bij een '''iterate''' bevel) verhoogd met de stap. Bij het terugkeren naar het '''do''' bevel is de waarde dus op een bepaald moment groter geworden dan de eindwaarde en stopt de iteratie. Willen we m.a.w. na de lus vertellen hoeveel maal de lus doorlopen werd, dan moeten we terug een stap aftrekken.
|type=nb}}
<hr>
=IF=
De '''IF''' constructie wordt gebruikt om voorwaardelijk te programmeren:
'''if''' ''test'' '''then'''
'''do'''
''statements indien test waar''
'''end'''
'''else'''
'''do'''
''statements indien test onwaar''
'''end'''
Ditzelfde kunnen we op een meer compacte manier schrijven, waardoor het geheel van de constructie gemakkelijker te overzien is op eenzelfde schermhoogte, zeker als er veel statements in de blokken zitten:
'''if''' ''test'' '''then''' '''do'''
''statements indien test waar''
'''end'''
'''else''' '''do'''
''statements indien test onwaar''
'''end'''
We hebben dit al een '''IF-blok''' genoemd, naar analogie met het DO-blok.
Het gedeelte '''else''' is niet verplicht als het niet nodig is.
Indien slechts één statement moet worden uitgevoerd is een DO-blok ook niet nodig:
'''if''' a//7=0 '''then'''
say a 'is deelbaar door 7'
'''else'''
say a 'is niet deelbaar door 7'
Of, met compacte schrijfwijze
'''if''' a//7=0 '''then''' say a 'is deelbaar door 7'
'''else''' say a 'is niet deelbaar door 7'
Condities kunnen complexe vormen aannemen door gebruik van '''&''' (en) en '''|''' (of). Dit is een voorbeeld:
vandaag=date('Weekday')
'''if''' vandaag='Sunday' | vandaag='Saturday' then say 'Het is weekend !!!'
De voorwaarde die in het '''if''' bevel wordt getest moet resulteren in «'''1'''» als het resultaat waar is, en «'''0'''» als het onwaar is. Gelet daarop kunnen we ook iets schrijven in de aard van:
'''if''' 1 '''then''' say 'Het is waar!' ; '''else''' say 'Het is niet waar!'
Merk tenslotte op dat '''else''' een aparte instructie moet zijn, reden waarom hier het scheidingsteken ; is gebruikt.
Ook '''if'''-blokken kunnen genest zijn. Daarbij moet men opletten dat de logica gerespecteerd wordt:
'''if''' voorwaarde1 '''then'''
'''if''' voorwaarde2 '''then''' statement
'''else''' statement
'''else''' statement
<p id="NOP">Stel dat voor het binnenste IF-blok geen '''else''' nodig is, dan moeten we er toch één schrijven omdat anders de andere '''else''' zou worden gebruikt. Als statement gebruikt men dan het bevel '''NOP''' wat een afkorting is voor '''N'''o '''OP'''eration, "niets doen".</p>
<hr>
=SELECT=
Met een '''IF''' kunnen we slechts twee gevallen (waar/onwaar) testen. Indien we meer dan 2 mogelijke uitkomsten kan verwachten gebruiken we liever een '''SELECT-blok''' dan een reeks geneste '''IF''' bevelen.
'''select'''
'''when''' ''voorwaarde_1'' '''then''' ''statement''
'''when''' ''voorwaarde_2'' '''then''' '''do'''
''statements''
'''end'''
'''otherwise''' /* voor alle andere gevallen */
''statements'' of '''NOP'''
'''end'''
<br>'''Otherwise''' is niet strikt nodig, maar men moet natuurlijk opletten dat alle mogelijkheden behandeld worden. '''Otherwise''' vangt de onverwachte gevallen mooi op.
Indien een '''when''' meerdere instructies nodig heeft moet men natuurlijk een DO-blok gebruiken. '''Otherwise''' bevat een impliciet DO-blok, dus alle instructies tussen '''otherwise''' en '''end''' horen automatisch logisch samen.
<hr>
<!------------------------------------------------------->
=PARSE=
Het '''PARSE''' bevel is uitermate krachtig. Het combineert een aantal nuttige bewerkingen om strings op te splitsen.
<br>De algemene syntaxis is:
'''parse''' '''[upper]''' ''bron sjabloon''
Hierbij wordt de ''bron'' opengebroken volgens wat is opgegeven in het ''sjabloon'' (''template'' in het Engels). Het Engels werkwoord '''to parse''' betekent ''ontleden, analyseren''. Het Van Dale woordenboek vermeldt zelfs ''parseren'' als een bestaand Nederlands woord. Maar het is misschien gemakkelijker te onthouden dat parse iets zal "opsplitsen in '''par'''tje'''s'''".
<br>De ''bron'' wordt opgegeven als <u>een combinatie van een codewoord en parameters</u>.
<br>Het ''sjabloon'' is in zijn eenvoudigste vorm een reeks namen van variabelen.
In zijn eenvoudigste vorm behelst het opsplitsen dus een bewerking waarbij woorden uit de bron aan de respectievelijke variabelen van het sjabloon worden geässigneerd. Indien het optioneel codewoord '''upper''' is toegevoegd zal de ''bron'' tevens naar hoofdletters worden vertaald alvorens in de variabelen terecht te komen. Maar door meer complexe sjablonen te gebruiken kan men het opsplitsen intelligenter maken. We leren daar later meer over in het hoofdstuk [[Programmeren in REXX/Parse in detail|Parse in Detail]].
Laten we nu bekijken welke soorten bronnen mogelijk zijn.
==Parse bronnen==
===ARG : argumenten ophalen===
'''parse''' <span style="color:blue">'''arg'''</span> ''sjabloon''
De bron verwijst hier naar de parameters (ofte argumenten) die men bij het oproepen van het programma of subroutine heeft meegegeven. Stel dat we volgend programma oproepen
met de argumenten <span style="color:red;">Jan Klaas</span>,
/* Programma behandelt parameters */
'''parse arg''' ''voornaam familienaam''
'''say''' "De voornaam van" familienaam "is" voornaam
'''exit'''
dan mogen we terecht verwachten de zin «De voornaam van Klaas is Jan» op het scherm te zien verschijnen. Indien ook nog het codewoord '''upper''' zou zijn toegevoegd, dan bekwamen we «De voornaam van KLAAS is JAN».
<div id="ARG">Het bevel '''ARG''' is een verkorte vorm voor '''parse upper arg'''. We verkiezen dit niet te gebruiken omdat het niet duidelijk de aandacht trekt op het feit dat alles naar hoofdletters zal worden vertaald.</div>
===LINEIN : lezen van toetsenbord===
Met '''linein''' wordt het toetsenbord de bron. Het programma zal daarbij wachten tot de gebruiker de ''enter''-toets heeft gebruikt, al dan niet na intikken van data. De ingevoerde data worden dan door het sjabloon opgesplitst.
'''parse''' <span style="color:blue">'''linein'''</span> ''sjabloon''
Bijvoorbeeld:
'''parse linein''' gegevens
say 'Je hebt "'gegevens'" ingetikt.'
===PULL : lezen van de programmabuffer===
In de programmabuffer ofte stack kunnen tekstregels aanwezig zijn. Deze werden er bijvoorbeeld worden aan toegevoegd met de bevelen '''PUSH''' of '''QUEUE''' (meer details hierover in het hoofdstuk [[Programmeren in REXX/Bevelen,_deel_2#Werken met de programmabuffer of stack|Werken met de programmabuffer]]).
<br>Indien de stack leeg is gaat het programma wachten op gegevens ingebracht op het klavier (en is het dus equivalent aan het gebruik van '''linein''' als bron).
'''parse pull''' input
say 'De eerste lijn van de programmabuffer bevatte "'input'"'
<div id="PULL">Het bevel '''PULL''' is een verkorte vorm voor '''parse upper pull'''.</div>
===VALUE : opsplitsen van een uitdrukking===
'''parse''' <span style="color:blue">'''value'''</span> ''een_uitdrukking'' <span style="color:green">'''with'''</span> sjabloon
Een uitdrukking bestaan uit constanten, variabelen en/of functies. Daar de uitdrukking kan resulteren in een zin bestaande uit verschillende woorden, is in deze vorm het sleutelwoord '''with''' verplicht om de bron van het sjabloon te scheiden. Als we dit uitvoeren,
'''parse value''' "123-4567890-22" '''with''' bank '-' kaartnummer '-' controle
say "De kaart met nummer" kaartnummer "werd uitgegeven bij bank" bank"."
dan krijgen we «De kaart met nummer 4567890 werd uitgegeven bij bank 123.». Hier hebben we de bron niet gesplitst waar er spaties voorkomen, maar wel waar er streepjes zijn.
'''parse value''' "Dit is een lange zin" '''with''' woord1 woord2 rest
Nu zal de variabele ''rest'' de woorden «een lange zin» bevatten, want er zijn niet genoeg variabelen in het sjabloon om alle woorden van de bron op te nemen. De laatste variabele krijgt dus hetgeen overblijft in de bron.
Hoe we dat eventueel anders kunnen oplossen leren we straks bij de bespreking van de verschillende soorten sjablonen.
===VAR : de waarde van een variabele opsplitsen===
'''parse''' <span style="color:blue">'''var'''</span> ''variabele'' ''sjabloon''
Als bron geven we nu de naam van een variabele op.
a="Dit is een tekst."
'''parse var''' a woord1 woord2 woord3
say 'Het tweede woord van "'a'" is "'woord2'"'
say 'Het derde woord is echter "'woord3'"'
Dit zal het volgende op het scherm afdrukken
Het tweede woord van "Dit is een tekst." is "is"
Het derde woord is echter "een tekst."
Nu nog een paar speciale bronnen voor het '''parse''' bevel:
===SOURCE : programma karakteristieken ophalen===
Door '''source''' als bron op te geven, vragen we meer informatie op over het programma zelf.
'''parse''' <span style="color:blue">'''source'''</span> ''sjabloon''
Al naargelang het besturingssysteem kan men andere antwoorden krijgen. Doch normaal mogen we als eerste drie woorden de volgende verwachten:
#de naam van het besturingssysteem;
#een aanduiding van hoe ons programma werd opgeroepen (COMMAND, SUBROUTINE of FUNCTION, later meer hierover);
#de naam en het volledige pad van ons programma.
'''parse source''' systeem oproeping programma
say 'Het programma in uitvoering is:' programma
say 'Het werd opgeroepen als:' oproeping
say 'Het draait onder controle van:' systeem
Op een Windows systeem zou dit het volgende kunnen geven:
Het programma in uitvoering is: C:\Program Files\mijnrexxprogramma.rex
Het werd opgeroepen als: COMMAND
Het draait onder controle van: WindowsNT
===VERSION : versienummer van REXX===
'''parse''' <span style="color:blue">'''version'''</span> ''versie''
assigneert de versie van REXX (bv. «REXX-ooRexx_3.1(MT) 6.01 20 Apr 2007») aan de variabele ''versie''. Nuttig om bijvoorbeeld na te gaan of een bepaalde functie in deze versie van REXX kan gebruikt worden.
==Sjabloonvormen==
Tot nu toe hebben we meestal aangenomen dat het ''sjabloon'' uit een rij tokens (variabelen) bestaat. De woorden uit de bron worden daarbij één voor één aan de variabelen toegekend. Hierbij speelt het aantal spaties tussen de woorden van de bron geen belang.
Een sjabloon kan echter complexere vormen aannemen en begrenzers bevatten. Deze begrenzers kunnen constanten, kolomnummers of indirecte kolomnummers zijn.
<br>Hier een voorbeeld met een constante begrenzer:
myVar = "Smith, John"
parse var MyVar LastName "," FirstName
say "First name is:" firstName
say "Last name is:" lastName
Hierbij duidt de constante <span style="color:red">","</span> aan waar er moet worden gesplitst. De begrenzer zelf verdwijnt daarbij. Dit levert dus:
First name is: John
Last name is: Smith
Merk op dat de spatie die in de bron net voor "John" staat ook blijft bestaan in de variabele ''firstname'' ! Als we constante begrenzers gebruiken worden extra spaties niet langer gereduceerd tot één enkele ! We kunnen zeggen dat we zijn overgestapt van "zoeken naar één of meer spaties" op "zoeken naar de expliciet opgegeven constante".
In het laatste statement hebben we een dubbele spatie vóór de variabele ''lastname'' geplaatst, omdat het mooi aligneert met het statement erboven. Doch hier blijft uiteindelijk slechts één spatie over, want het aantal spaties tussen de woorden van een statement heeft geen belang, dat leerden we vroeger al.
En nu een eenvoudig voorbeeld waarin we kolombegrenzers gebruiken:
myVar = "WSBN nl-3-34-343-00010"
parse var MyVar 6 Taal 8 9 HoofdRubriek 10 18 VolgNummer
say "De taal van het Wikibook is:" Taal
say "De hoofdrubriek is :" HoofdRubriek
say "en het volgnummer is :" VolgNummer
met als resultaat:
De taal van het Wikibook is: nl
De hoofdrubriek is : 3
en het volgnummer is : 00010
Het parse bevel zal eerst de karakters vanaf positie 6 tot en met 7 in variabele ''Taal'' plaatsen. Het karakter op positie 8 wordt verwaarloosd.
Positie 9 gaat naar ''HoofdRubriek'', posities 10 t.e.m. 17 vallen weg en tenslotte gaat alles vanaf positie 18 naar variabele ''VolgNumber''.
{{Bericht
|titel=Naamgeving van variabelen
|bericht=Iedereen begrijpt wel dat cryptische namen voor variabelen (''xyz17'') de leesbaarheid niet bevorderen. Beter is het een naam te kiezen die de verwachte inhoud ervan beschrijft, zoals ons ''VolgNummer''.
Voor REXX worden alle karakters hoofdletters, maar wij hebben de mogelijkheid onze namen meer leesbaarheid te geven door met combinaties van hoofd- en kleine letters te werken. Een alternatieve schrijfwijze die men ook dikwijls gebruikt is ''volg_nummer''.
|type=nb}}
In het hoofdstuk [[Programmeren in REXX/Parse_in_detail|Parse in meer detail]] zullen we dus nog uitgebreid terugkomen op dit belangrijk en krachtig bevel.
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Fundamenten
|huidige =Bevelen, deel 1
|volgende=Functies deel 1}}
{{Sub}}
p5zouhoed1s77pj962vzq6pmpu77xv2
Programmeren in REXX/Voorbeeldprogramma's
0
11324
428204
425906
2026-05-20T06:09:44Z
Erik Baas
2193
lf
428204
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
==Maximum van twee getallen==
{{Code| | Taal= REXX | Titel= Maximum.rex | Code= <pre>
/* Maximum berekenen */
ok=0
do while \ok
say "Geef me twee getallen gescheiden door een komma"
parse pull a ',' b
if a<>"" & b<>"" & datatype(a,'N') & datatype(b,'N') then ok=1
end
say max(a,b) "is het grootste van" a "en" b
exit 0
</pre> }}
We gebruikten gauw even '''[[Programmeren in REXX/Voor_je_begint#Opdrachtprompt en RexxTry|RexxTry]]''' om na te gaan of een nullstring als numeriek beschouwd wordt. Dit is een kleine moeite, en toont hoe nuttig RexxTry wel kan zijn:
C:\Users\Dmitri>'''rexxtry'''
REXX-ooRexx_4.1.0(MT) 6.03 5 Dec 2010
rexxtry.rex lets you interactively try REXX statements.
Each string is executed when you hit Enter.
Enter 'call tell' for a description of the features.
Go on - try a few... Enter 'exit' to end.
'''a=""'''
'''say datatype(a,'N')'''
0
........................................... rexxtry.rex on WindowsNT
Uit deze test concluderen we dat een nullstring niet numeriek is, en de test in het programma kan dus vereenvoudigd worden tot:
if datatype(a,'N') & datatype(b,'N') then ok=1
Het programma is daarmee iets korter en meer leesbaar.
<!------------------------------------------------------------------------>
==Waardeconversie==
{{Code| | Taal= REXX | Titel= conversies.rex | Code= <pre>
/* conversies.rex */
ok=0
do while \ok
say "Geef een waarde die moet worden omgezet"
parse pull waarde
if waarde<>"" then ok=1
end
/* Indien 1 enkel teken: omzetting (met ASCII tabel) */
if length(waarde)=1 then do
say '['waarde'] ASCII -> Decimaal = ' c2d(waarde)
say '['waarde'] ASCII -> Hexadecimaal = ' c2x(waarde)
end
/* Indien numeriek getal */
if datatype(waarde,'N') then do
say '['waarde'] Decimaal -> ASCII = ' d2C(waarde)
say '['waarde'] Decimaal -> Hexadecimaal = ' d2x(waarde)
end
/* indien hexadecimaal getal */
if datatype(waarde,'X') then do
say '['waarde'] Hexadecimaal -> ASCII = ' x2C(waarde)
say '['waarde'] Hexadecimaal -> Decimaal = ' x2d(waarde)
end
exit
</pre> }}
Dit programmaatje bevat een beginnersfout. Er wordt namelijk getest met '''datatype(...,'N')''' om te zien of het een getal betreft. Doch '''D2C''' kan enkel met gehele getallen overweg. De test had daarom
if datatype(waarde,'W') then do
moeten zijn, om na te gaan of het een geheel getal betrof.
<!----------------------------------------------------------->
==Antwoordvalidatie==
Wachten op een geldig antwoord.
{{Code| | Taal= REXX | Titel= koffievraag.rex | Code= <pre>
/* Koffievraag.rex */
do while verify(koffie,"JNS")
say "Wil je koffie ? (Ja/Nee of Stop)"
parse upper pull 1 koffie 2
select
when koffie="J" then say "OK, ik ga er een halen voor jou"
when koffie="N" then say "Nou, een andere keer dan"
otherwise nop
end
end
exit
</pre> }}
Ook dit programmaatje bevat een aantal beginnersfouten:
*De gebruiker zal niet begrijpen waarom zijn antwoord niet aanvaard wordt als hij '''" Ja"''' intikt (dus met een spatie voor de "Ja"). Men kan dit oplossen door te schrijven:
parse upper pull koffie . ; koffie=left(koffie,1)
*Verify geeft geen binair antwoord. In dit geval zal je toch 0 of 1 krijgen omdat koffie maar 1 karakter lang is. Maar, men mag deze techniek zeker niet veralgemenen. Stel eens dat ook ''K'' een goed antwoord zou zijn, en er dus een '''do while verify(koffie,"JNSK")''' geschreven staat... dan kan het antwoord iets anders dan 0 of 1 worden en hebben we een uitvoeringsfout. Door er een '''do until''' van te maken, en er een vergelijking van te maken, vermijden we dat gevaar:
do until verify(koffie,"JNS")=0
Een andere overweging die je als programmeur moet maken is of je "Jazeker" of "Juli en augustus" ook als geldig antwoord wil aanzien. Een strengere schrijfwijze is daarom:
parse upper pull koffie .
select
when abbrev('JA',koffie,1) then say "OK, ik ga er een halen voor jou"
when abbrev("NEE",koffie,1) then say "Nou, een andere keer dan"
when abbrev('STOP',koffie,1) then leave
otherwise say 'Sorry, ik versta uw antwoord "'koffie'" niet'
end
Nu zullen enkel "Ja", "Nee" of "Stop" valabele antwoorden zijn (kijk er eventueel [[Programmeren in REXX/Functies_deel_1#ABBREV - geldige afkorting|Abbrev]] nog eens op na).
<!------------------------------------------------------->
==Gebruik van subroutines==
{{Code| | Taal= REXX | Titel= oppervlakte_donut.rex | Code= <pre>
/* Oppervlakte_donut.rex */
do until ok
say 'Geef de grote en kleine straal van de donut'
parse pull r1 r2 .
OK=(datatype(r1,"N") & datatype(r2,"N"))
end
say "De oppervlakte van de donut is" area(r1) - area(r2)
exit
area: procedure
parse arg straal .
return 3.14 * straal**2
</pre> }}
Een '''do until''' voert de lus altijd minstens éénmaal uit. De variabele ''ok'' moet dus ook niet geïnitialiseerd worden vóór de lus begint, de waarde wordt toch pas aan het eind van de lus getest, en dan hebben we er wel een logische waarde 0 of 1 aan gegeven.
Een probleempje hier is dat de gebruiker absoluut verplicht is om 2 waarden in te geven, anders stopt het programma nooit, tenzij hij/zij weet dat je kan afbreken met een Ctrl-Break of Ctrl-C combinatie.
<!-------------------------------------------------------->
==Tekstweergave==
{{Code| | Taal= REXX | Titel= titel.rex | Code= <pre>
/* Een kadertje met de titel maken */
parse arg titel /* Titel ophalen */
parse value 60 4 '*', /* initialiseren */
with breedte rand symbool .
binnen=breedte-rand /* breedte tekst */
say copies(symbool,breedte) /* bovenlijn kadertje */
do while length(titel)>binnen
deel=left(titel,binnen) /* analyse deel titel */
blank=lastpos(' ',deel) /* waar laatste blank */
if blank=0 then blank=binnen /* geen blank gevonden */
parse var titel deel =(blank) titel /* opeten */
say symbool center(deel,binnen) symbool /* drukken */
end
say symbool center(titel,binnen) symbool /* rest */
say copies(symbool,breedte) /* onderlijn kadertje */
exit
</pre> }}
De test '''if blank=0''' is nodig, want het kan zijn dat in het deel dat we behandelen geen spatie voorkomt. Dan kunnen we niet anders dan brutaal splitsen op die plaats. Mooi is het dan misschien niet, maar als de kader enige breedte heeft zal dit toch niet zo gauw voorkomen.
==Gebruik van een stem==
{{Code| | Taal= REXX | Titel= stad.rex | Code= <pre>
/******************** stad.rex *********************/
stad. = "onbekend" /* Standaardwaarde zetten */
stad.1000="Brussel"
stad.2000="Antwerpen"
stad.3500="Hasselt"
stad.8000="Brugge"
stad.9000="Gent"
do while code<>""
say 'Geef een postcode (4 cijfers), of blank om te eindigen'
parse pull code
if stad.code \= stad. then
say "U woont in" stad.postcode "!"
else say "De postcode is" stad.
end
exit
</pre> }}
Dit kan ook omgekeerd:
{{Code| | Taal= REXX | Titel= postcode.rex | Code= <pre>
/* postcode.rex */
postcode. = ""
postcode.Brussel=1000
postcode.Antwerpen=2000
postcode.Hasselt=3500
postcode.Brugge=8000
postcode.Gent=9000
do while stad<>""
say 'Geef de naam van uw stad, of blank om te eindigen'
parse pull stad
if postcode.code \= "" then
say "U woont in" postcode.stad "!"
else say "De postcode is onbekend."
end
exit
</pre> }}
==Woorden tellen in een tekstbestand==
{{Code| | Taal= REXX | Titel= woordteller.rex | Code= <pre>
/* Programma dat de frequentie van woorden in een txt */
/* bestand zal tellen. */
parse arg bestand
w.=0 /* Initialisatie van woordteller */
wrdn="" /* verschillende woorden */
if SysIsFile(bestand) then do
call stream bestand,'Command','OPEN READ' /* Open */
inhoud=charin(bestand,1,chars(bestand)) /* Lees */
call stream bestand,'Command','CLOSE' /* Sluit */
inhoud=strip(inhoud,'Trailing','1A'x) /* Strip eof */
startp=1 /* start voor zoeken CrLf */
do i=1 by 1 /* continu lus... */
p=pos('0D0A'x,inhoud,startp) /* pos van CrLf */
if p>0 then
call verwerklijn substr(inhoud,startp,p-startp)
else do /* verwerk laatste lijn */
call verwerklijn substr(inhoud,startp)
leave /* alles verwerkt */
end
startp=p+2 /* volgende start na de CrLf */
end
say 'Er zijn' words(wrdn) 'verschillende woorden.'
say 'Daarvan komen volgende meermaals voor:'
do while wrdn<>"" /* voor alle gevonden woorden */
parse var wrdn woord wrdn
if w.woord>1 then say format(w.woord,3,0) 'x' woord
end
call exit 0,'Einde verwerking'
end
else call exit 28,'Het bestand "'bestand'" bestaat niet'
/******************** Subroutines *********************/
VERWERKLIJN: procedure expose w. wrdn /*Woorden tellen*/
parse upper arg lijn
if length(lijn)=0 then return
/* we veranderen leestekens en tab karakters in spaties */
lijn=translate(lijn,"","!""'.,;:/\=+-()[]{}%$€#*"||"09"x)
do while lijn<>""
parse var lijn woord lijn /* lijn opeten */
w.woord=w.woord+1 /* teller van woord +1 */
if w.woord=1 then /* nieuw woord gevonden */
wrdn=wrdn woord
end
return
EXIT: /* Algemene exit-routine */
parse source . oproepvorm myname
a=lastpos('\',myname)
parse var myname +(a) myname '.'
do i=2 to arg()
say myname':' arg(i)
end
if oproepvorm='COMMAND' then
if arg(1)<>"" & arg(1)<>0 then say myname': Foutcode='arg(1)
exit arg(1)
</pre>}}
Bij het herlezen van dit programma ontdekken we nog een schoonheidsfoutje: in de ''verwerklijn'' routine schrijven we
if length(lijn)=0 then return
Dit is overkill, '''if lijn="" then return''' is meer dan voldoende. Het oproepen van een functie is altijd kostelijk.
==Uitgebreide DIR dank zij SysFileTree==
{{Code| | Taal= REXX | Titel= filetree.rex | Code= <pre>
/* D.m.v. de functie SysFileTree, bestanden lijsten */
/* Formaat: FILETREE [opties] bestands-selectie */
/* De meeste opties komen overeen met die van SysFileTree */
/* Optie /N vraagt om enkel naam.ext te geven, dus zonder pad */
/* Optie /O vraagt om datum, grootte en atributen niet te tonen */
/* Optie /S vraagt ook in onderliggende mappen te zoeken */
/* Optie /F vraagt om enkel bestanden en geen mappen te tonen */
/* Optie /D vraagt enkel de mappen te lijsten */
/* Optie /A+x of /A-x vraagt bestanden te lijsten met bepaalde atribu- */
/* ten aan of af. Vb. /A+S lijst systeembestanden */
/* Optie /SORT [Date | Size | Name [Asc | Desc] sorteert op datum, */
/* grootte of naam, in oplopende (Ascending) of Dalende order */
signal on Novalue
parse value 0 0 with Omit EnkelNaam . '' fsel StripPath AttrFlags sort
fselFlags='L' /* Standaard optie voor bestandsselectie */
parse arg args /* argumenten ophalen */
/* Als geen parameter of ? of /H, toon dan inleidende commentaartekst */
if args='' | args='?' | translate(args)='/H' then do
do i=1 until left(sourceline(i+1),2)<>'/*'
parse value sourceline(i) with 3 t '*/' ; say t
end
exit
end
/* Parameters analyseren en opties eruithalen... */
do while args<>''
if left(strip(args,'L'),1)='/' then do /* Als woord begint met / */
parse var args flag args /* het woord opeten */
flag=translate(flag) /* naar hoofdletter */
select
when flag='/N' then EnkelNaam=1
when flag='/O' then do
FselFlags=FselFlags||'O'
Omit=1
end
when flag='/L' then FselFlags=FselFlags||'L'
when flag='/D' then FselFlags=FselFlags||'D'
when flag='/F' then FselFlags=FselFlags||'F'
when flag='/S' then FselFlags=FselFlags||'S'
when left(flag,2)='/A' then call AttrFlag
when flag='/SORT' then call SortFlag
Otherwise call ErrExit 5,'Ongeldige optie "'flag'"'
end
end
else parse var args fsel '' args
end
if fsel='' then call ErrExit 5,'Geen selectiecriterium gegeven'
/* Met /O en /SORT DATE of SIZE kunnen we niet verder */
if Omit then
if sort='DATE' | sort='SIZE' then
call ErrExit 77,'Om te kunnen sorteren op' sort 'mag geen /O opgegeven worden.'
/* We kunnen SysFileTree nu oproepen, resultaat in stem f. */
call SysFileTree fsel,'F.',FselFlags,attrFlags
if f.0=0 | result<>0 then
call ErrExit 28,'Geen bestanden gevonden voor' fsel
/* Nu verzorgen we de output */
if EnkelNaam then /* pad afstrippen als enkel naam nodig */
if Omit then do i=1 to f.0
p=lastpos('\',f.i) ; f.i=substr(f.i,p+1)
end i; else do i=1 to f.0
p=lastpos('\',f.i)
f.i=left(f.i,40) || substr(f.i,p+1)
end
/* Als sorteren nodig is, subroutine */
if sort<>'' then call SortResultaat
/* Afdrukken op scherm */
do i=1 to f.0
say f.i
end
call exit 0,'Einde verwerking'
/*-----------------------------------------------------------------*/
AttrFlag: /* /A attributen analyseren */
/*-----------------------------------------------------------------*/
parse var flag 3 PlusMin 4 flags
if PlusMin<>'-' & PlusMin<>'+' then
call ErrExit 6,'/A formaat fout: we verwachten een + of - iplv' plusMin,,
'Formaat: /A+xy of /A-xy, voorbeeld: /A-SD /A+R'
if Verify(flags,'ADRHS')<>0
then call ErrExit 6,'/A formaat fout: we verwachten karakters A,D,H,R of S iplv' fl,,
'Formaat: /A+xy of /A-xy, voorbeeld: /A-SD /A+R'
do while flags<>'' /* We bouwen Zattribuut parameter voor SysFileTree op */
parse var flags fl 2 flags
fl=translate(fl,'12345','ADHRS') /* Positie van de attribuut ligt vast */
attrFlags=overlay(PlusMin,attrFlags,fl) /* Zetten op zijn plaats */
attrFlags=translate(left(attrFlags,5),'*',' ') /* Rest op * */
end
return
/*-----------------------------------------------------------------*/
SortFlag: /* /SORT attributen analyseren */
/*-----------------------------------------------------------------*/
Sort='NAME' ; SortHoe='A' /* Standaard oplopend op naam sorteren */
w1=translate(word(args,1))
Select
when abbrev('DATE',w1,1) then sort='DATE'
when abbrev('SIZE',w1,1) then sort='SIZE'
when abbrev('NAME',w1,1) then sort='NAME'
Otherwise return
end
parse var args . args
w1=translate(word(args,1))
Select
when abbrev('ASCENDING',w1,1) then SortHoe='A'
when abbrev('DESCENDING',w1,1) then SortHoe='D'
Otherwise return
end
parse var args . args
return
/*-----------------------------------------------------------------*/
SortResultaat: /* Resultaat sorteren volgens aanvraag */
/*-----------------------------------------------------------------*/
/* Het formaat van één stem-element is...
2011-12-13 09:38:00 2145386496 A-H-S C:\pagefile.sys
1...+....1....+....2....+....3....+....4....+....5....+....6 */
Select
when sort='DATE' then SortCols=1 19
when sort='SIZE' then SortCols=21 31
when sort='NAME' & \ommit then SortCols=41
otherwise SortCols=1 /* Enkel naam in output */
end
call SysStemSort 'F.',SortHoe,'I',1,F.0,word(SortCols,1),word(SortCols,2)
return
/*-----------------------------------------------------------------*/
NOVALUE: /* Als REXX een niet geinitialiseerde variabele vindt... */
/*-----------------------------------------------------------------*/
parse upper source . how myname '' undefvar
myname=filespec('N',myname)
undefvar= 'CONDITION'('D')
call errexit 99,'REXX probleem in' myname 'op lijn' sigl,
'variabele' undefvar 'is niet gedefinieerd.'
/*-----------------------------------------------------------------*/
ERREXIT: EXIT: /* Algemene exit routine */
/*-----------------------------------------------------------------*/
parse upper source . . myname
myname=filespec('N',myname)
do i=2 to arg() /* toon foutberichten als er zijn */
say myname':' arg(i)
end
exit arg(1)
</pre>}}
Dit is een voorbeeld bij uitvoering:
C:\>'''rexx d:\RexxProgrammas\FileTree /n d:\RexxProgrammas\r*.rex'''
2008-04-29 17:54:36 3217 A---- Rawdates.rex
2008-05-19 14:46:48 1697 A---- renumfiles.rex
2011-11-30 17:52:45 2498 A---- rexdates.rex
2011-11-19 08:49:56 815 A---- rextimes.rex
1999-12-02 20:46:20 12216 A---- Rexxtry.rex
2011-02-16 10:09:05 109 A---- RxVersie.rex
SYSFTREEN.REX: Einde verwerking
==Berekenen van priemgetallen, volledige versie==
{{Code| | Taal= REXX | Titel= priemgetallen.rex | Code= <pre>
/********************************************************************/
/* Programma berekent een reeks priemgetallen. */
/* Vroeger berekende getallen zitten in priem.lst (10 per lijn) */
/* Het programma zal: */
/* - priem.lst lezen en de getallen in priem. lijst zetten */
/* - het zoekt nieuwe priemgetallen vanaf laatst gevonden */
/* - 1000 nieuwe getallen worden gezocht. */
/* - getallen worden toegevoegd in de priem.lst */
/********************************************************************/
numeric digits 15 /* we voorzien grote getallen */
/********************************************************************/
/* Stap 1: We lezen priem.lst die in zelfde map als pgm staat */
/********************************************************************/
parse source . . mezelf /* bepalen ons pad... */
priembestand=filespec('D',mezelf)||filespec('P',mezelf)'priem.lst'
tempbestand=priembestand".tmp" /* Tijdelijk werkbestand */
call SysFileDelete tempbestand /* Oude versie uitvagen */
if SysIsFile(priembestand) then do /* Als bestand is gevonden... */
call time 'Reset' /* starten chronometer */
say 'Stap 1 : We lezen' priembestand
rc=SysFileCopy(priembestand,tempbestand) /* reservecopie maken */
if rc\=0 then call exit rc,"Maken van reservecopie mislukt"
call stream priembestand,'C','OPEN READ' /* Open bestand */
oudepriem=charin(priembestand,1,chars(priembestand)) /* lezen */
call stream priembestand,'C','CLOSE' /* Sluiten bestand */
oudepriem=strip(oudepriem,'T','1A'x) /* strippen eof controle */
priem.0=0
startp=1 /* start voor zoeken CrLf */
do i=1 by 1 /* continue lus... */
p=pos('0D0A'x,oudepriem,startp) /* pos van volgende CrLf */
if p>0 then /* als een is gevonden */
call verwerklijn substr(oudepriem,startp,p-startp)
else do /* verwerk laatste lijn */
call verwerklijn substr(oudepriem,startp)
leave /* alles verwerkt */
end
startp=p+2 /* spring over gevonden CrLf */
end
z=priem.0 ; start=priem.z+2 /* we beginnen na laast gekende */
say ' Lezen nam' format(time('R'),,3) 'seconden in beslag'
end
else do
say 'Priem.lst bestaat nog niet, we maken een eerste reeks aan'
parse value 1 2 3 with priem.0 priem.1 start
end
/********************************************************************/
/* Stap 2: We kunnen nu nieuwe priemgetallen zoeken */
/********************************************************************/
say 'Stap 2 : Opzoeken van 1000 nieuwe priemgetallen, even geduld...'
nieuwe=0 /* teller van nieuwe priemgetallen */
do i=start by 2 /* lus vanaf start per 2 */
do j=2 to z /* lus over al gevonden priemgetallen */
if i<priem.j**2 then leave j /* >priem**2 ? ==> verlaat lus j */
if i//priem.j=0 then iterate i /* rest i/priem=0 ? volgende */
end j /* einde van lus j */
nieuwe=nieuwe+1 /* 1 bij nieuwe priemgetallenteller */
parse value 1+priem.0 i with z . 1 priem.0 priem.z /* stockeren */
if nieuwe=1000 then leave i /* We hebben er 1000 gevonden */
end i /* einde van lus i */
say ' Opzoeken duurde' format(time('R'),,3) 'seconden.'
/********************************************************************/
/* Stap 3: Wegschrijven van de nieuwe priemgetallen in priem.lst */
/********************************************************************/
say 'Stap 3 : We schrijven de resultaten weg'
call stream priembestand,'C','OPEN WRITE APPEND' /* Openen bestand */
veldbreedte=min(length(priem.z),digits()+1)+1 /* afdrukbreedte */
do i=priem.0-999 to priem.0 by 10 /* 10 per regel wegschrijven */
lijn='' /* Start met blanco lijn */
do j=i to i+9 /* regel opbouwen */
lijn=lijn||format(priem.j,veldbreedte)
end
call lineout priembestand,lijn /* Wegschrijven regel */
end i
rc=stream(priembestand,'Command','Close') /* Sluiten bestand */
if rc="READY:" then do
call SysFileDelete tempbestand
say ' Wegschrijven duurde' format(time('R'),,3) 'seconden.'
call exit 0,'Einde van het programma.'
end; else call exit 28,'Wegschrijven van priemgetallen mislukt',,
'Foutcode was='rc,,
'Oude versie is bewaard in' tempbestand
/**************************** subroutines ***************************/
VERWERKLIJN: procedure expose priem.
parse arg lijn
do while lijn<>''
parse var lijn priem lijn
parse value 1+priem.0 priem with z . 1 priem.0 priem.z
end
return
EXIT: /* Algemene exit-routine */
parse source . oproepvorm myname
a=lastpos('\',myname)
parse var myname +(a) myname '.'
do i=2 to arg()
say myname':' arg(i)
end
if oproepvorm='COMMAND' then
if arg(1)<>"" & arg(1)<>0 then say myname': Foutcode='arg(1)
exit arg(1)
</pre>}}
==Zie ook==
*[[Basiskennis informatica/Codering/ASCII-tabel|ASCII-tabel]]
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Een beetje OORexx
|huidige =Voorbeeldprogramma's
|volgende=}}
{{Sub}}
ot97eepa1bas8lnwitzpb758iohnn94
Programmeren in TI-Basic/Optimalisatie
0
11513
428187
422163
2026-05-20T05:37:44Z
Erik Baas
2193
lf
428187
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Om programmaatjes sneller te laten gaan of kleiner te maken moet je optimalisatie gebruiken. Dit kan je op een paar manieren doen.
=== Haakjes ===
Een simpele manier om te optimaliseren is om haakjes weg te laten aan het eind van de regel.
<pre>
10(B+3)→A
</pre>
wordt dus:
<pre>
10(B+3→A
</pre>
=== Controlestructuren ===
Een andere goede tip is om de [[../Controlestructuren|controlestructuren]] volledig te gebruiken. Gebruik bijvoorbeeld in plaats van meerdere ifs de else functie waar mogelijk. In plaats van labels kan je het beste loops gebruiken, die zijn sneller.
Verder is het ook handig om de code zo kort mogelijk te schrijven.
== Aanroepen van variabelen ==
Een aanroep van een variabele A t/m Z gaat sneller dan een aanroep van bijvoorbeeld een lijst. Dus gebruik bijvoorbeeld niet
<pre>
:L1(1→A
:L1(1→B
:L1(1→C
:L1(1→D
</pre>
maar
<pre>
:L1(1→A
:A→B
:A→C
:A→D
</pre>
== Gebruik de logische operatoren ==
Je kunt vaak handig gebruik maken van de logische operatoren zoals =, ≠, ≤, ≥ enzovoorts. Dat kan namelijk ook buiten een if-constructie.
Zie de volgende code:
<pre>:If K=24
:X-1→X</pre>
Dit kan vervangen worden door:
<pre>X-(K=24→X</pre>
Er zijn dan 2 bytes bespaard en je bespaart een if-constructie waardoor het programma duidelijker wordt.
{{Sub}}
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Routines
|huidige=Optimalisatie
|volgende=Programmeertips
}}
8z1oddhu84z4d7p6wn5p0ilz37b7wwj
Kookboek/Bruinebonensoep
0
11922
428021
398519
2026-05-20T05:16:37Z
Erik Baas
2193
lf
428021
wikitext
text/x-wiki
{{Infobox recept
| Bruinebonensoep
| Afbeelding = [[Bestand:Guernsey Bean Jar.jpg|300px]]
| Naam = Kookboek/Bruinebonensoep
| Categorie = Soeprecept
| Porties = Ca. 3,5 liter
| Energie =
| Tijd = 2 uur + 24 uur weken
| Stippen = 2
}}
[[Kookboek/Nederlandse keuken|Nederlandse keuken]] | [[Kookboek/Soep|Soep]] | [[Kookboek/Recepten|Receptenindex]]
Een magere versie, met rund- in plaats van varkensvlees.
==Ingrediënten==
*400 gr {{Kb|bruine bonen}}
*250 gr {{Kb|p=rundvlees|soepvlees}} (rund)
*2 grote {{Kb|p=ui|uien}}
*1 dunne {{Kb|prei}}
*1 {{Kb|aardappel}}
*1 kleine {{Kb|p=wortel|winterwortel}}
*1 flinke dessertlepel [[Kookboek/Kerrie|kerriepoeder]]
*{{Kb|Kruidnagel}}
*[[Kookboek/Laurier|Laurier]]
*[[Kookboek/Peper|Peper]]
*[[Kookboek/Zout|Zout]]
*{{Kb|p=bouillon|Bouillonblokjes}}
==Bereidingswijze==
#Zet minimaal 24 uur van te voren de bonen met ongeveer 2 liter water in de week.
#Maak van het soepvlees, 1 ui, een paar kruidnagels, wat laurier, en het donkergroene deel van de prei een bouillon; zorg ervoor dat het vlees niet helemaal uit elkaar valt zodat het nog in stukjes gesneden kan worden.
#Vul het weekwater van de bonen met de bouillon aan tot ongeveer 3 à 3,5 liter en breng de bonen aan kook.
#Snij de andere ui in stukjes en fruit deze met het kerriepoeder in een scheutje olijfolie glazig.
#Verdeel de prei in ringen van een cm.
#Maak blokjes van de aardappel en wortel.
#Voeg na ruim een uur koken de gefruite ui, preiringen, winterwortel, en aardappel aan de soep toe, en laat deze koken tot alles gaar en zacht is.
#Snij het soepvlees in stukjes en voeg deze op het laatst toe
#Breng de soep op smaak met peper, zout en wat bouillonblokjes.
==Tips==
#Als je de soep smeuïger wilt hebben, kun je tegen het eind van de kooktijd een deel van de bonen door een (roer)zeef wrijven, en weer aan de soep toevoegen.
== Varianten ==
* Om een minder waterige soep te krijgen: (@punt 3:) giet de bonen na het weken af en bewaar het weekwater; gebruik voor de soep alleen 1½ liter bouillon, en voeg pas wat water toe als de ingrediënten niet meer helemaal onder water staan.
* Voeg op het laatst een bosje fijngesneden peterselie of bladselderij toe, of van elk een half bosje.
* Voeg toe voor een Indonesisch tintje (voor 1½ liter soep):
** (@punt 4:) 40 g [[Kookboek/Nasikruiden|nasikruiden]] (10 minuten in heet water laten weken) en 4 teentjes fijngeperste knoflook, tezamen toevoegen bij het fruiten van de ui.
** (@punt 7) Bamigroenten, zoals witte kool, (meer) prei, (meer) wortel, bloemkool, knolselderij of bleekselderij en {{Kb|taugé}}; taugé pas de laatste minuut toevoegen, de andere extra groenten tegelijk met de andere groenten even fruiten (alles schoongemaakt en in stukken gesneden; 15-20 minuten voordat de soep klaar is)
** 1 eetlepel sambal oelek of een zeer fijn gesneden stukje rode peper; en 2 eetlepels sojasaus of ketjap; de peper moet meekoken, sambal en ketjap kunnen op het laatst worden toegevoegd.
* Met [[Kookboek/Soepbal|balletjes]] gehakt in plaats van soepvlees, desgewenst gemengd met 2 eetlepels geraspte {{Kb|kokos}} en/of 1 eetlepel [[Kookboek/Nasikruiden|nasikruiden]].
* Voor een vleugje zoet: voeg op het allerlaatst (bij punt 9) 4 eetlepels [[Kookboek/Mangochutney|mangochutney]] of een andere chutney toe, een in stukjes gesneden banaan, twee schijven in stukjes gesneden ananas en/of het sap van 1 sinaasappel.
{{Navigatie recepten}}
[[Categorie:Soeprecept|Bruinebonensoep]]
[[Categorie:Nederlandse keuken|Bruinebonensoep]]
[[Categorie:Peulvruchtrecept|Bruine bonen]]
{{Sub}}
myp43a7va7q6cs13u29o6bxhbj8nyn6
Kookboek/Bloemkool met witte saus
0
11925
428023
402696
2026-05-20T05:19:13Z
Erik Baas
2193
lf
428023
wikitext
text/x-wiki
{{Infobox recept
| Naam = Kookboek/Bloemkool met witte saus
| Afbeelding= [[Bestand:Cavolfiore in besciamella.piatto.JPG|300px]]
| Onderschrift = Bloemkool overgoten met witte saus
| Categorie = Groentenrecept
| Porties = 4
| Energie =
| Tijd = 35 min
| Stippen = 2
}}
[[Kookboek/Groenten|Groenten]] | [[Kookboek/Recepten|Receptenindex]]
==Ingrediënten==
*1 {{Kb|bloemkool}}
Voor de ''bechamelsaus:''
*0.5 Ltr {{Kb|melk}}
*35 g boter
*30 g bloem
*nootmuskaat
*Witte peper
*zout
==Bereidingswijze==
#Het blad van de kool halen, en de kool om insecten te verwijderen, even in ruim water met zout laten staan
#In een ruime pan (de bloemkool moet er in zijn geheel inpassen) water met wat zout aan de kook brengen, en de bloemkool hierin nét gaar koken.
#de melk aan de kook brengen.
#Terwijl de bloemkool kookt, van de boter en de bloem een [[Kookboek/Roux|roux]] maken,(de boter smelten, vermengen met de bloem, en zonder het te laten kleuren even door laten koken)
#De roux iets af laten koelen, en vermengen met de hete niet meer kokende melk.
#Met een garde dit mengsel tot een gladde saus roeren op smaak brengen met peper en zout en even zachtjes door laten koken.
#als de kool nét gaar is, deze afgieten, en in een groenteschaal doen.
#de bechamelsaus over de bloemkool verdelen, en bestrooien met wat nootmuskaat.
==Tips==
* Bloemkool met bechamelsaus smaakt heel lekker met een romige aardappelpuree en een {{Kb|gehaktbal}}.
* Variant: roer er 50 g geraspte kaas naar keuze doorheen en maak er kaassaus van.
{{Navigatie recepten}}
[[Categorie:Groentenrecept|Bloemkool met witte saus]]
[[Categorie:Saus|Bloemkool]]
{{Sub}}
i5agbnyyyluu5ivenr9qryidq3f2bbo
Kookboek/Fudge
0
12021
428024
397125
2026-05-20T05:20:27Z
Erik Baas
2193
lf
428024
wikitext
text/x-wiki
{{Infobox recept| Fudge
| Naam = Fudge
| Afbeelding = [[Bestand:Easy Fudge on a Black Plate.jpg|300px]]
| Categorie = Snoep
| Porties = ongeveer 30 stuks
| Energie =
| Tijd = ongeveer 45 minuten, zonder afkoeling
| Stippen = 2
}}
Heerlijke originele Engelse fudge
==Ingrediënten==
*350 g fijne {{Kb|p=Suiker|kristalsuiker}}
*400 g gezoete, gecondenseerde {{Kb|melk}}
*100 g {{Kb|boter}}
*Smaakmaker naar keuze: [[Kookboek/Vanille|vanillepeul]], {{Kb|p=Rum|rum(aroma)}}, {{Kb|p=Rozijn|rozijnen}}, {{Kb|p=noot|noten}} ...
==Bereidingswijze==
#Doe de melk, suiker en boter in een pan met dikke bodem, zodat de warmte zich gelijkmatig kan verspreiden.
#Als de massa homogeen is en door en door warm, het vuur wat temperen en ongeveer 20 minuten laten pruttelen. De massa kleurt lichtbruin.
#Als de suikerthermometer 115° Celsius aangeeft, is het klaar. Als u geen thermometer heeft, kunt een druppel van de massa in een glas water laten vallen. Als het een halfharde toffee wordt, is de fudge klaar.
#Neem de pan van het vuur en blijf constant roeren. Blijf roeren totdat de glans verdwijnt.
#Giet de massa op een plaat met bakpapier bedekt (nu is het moment om smaakmakers toe te voegen) of in toffeeregels. Pas op, zeer heet!
#Als de fudge enigszins is afgekoeld, in gelijke stukjes snijden.
{{Navigatie recepten}}
[[Categorie:Snoep|{{SUBPAGENAME}}]]
{{Sub}}
p6kaje6xak0k5nvn8l8gjzq7yxjuuz8
Kookboek/Crème au beurre-taart
0
12229
428025
395254
2026-05-20T05:20:27Z
Erik Baas
2193
lf
428025
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Crème au beurre-taart
| Categorie = Cake, gebak en taart
| Porties = 6 - 8
| Energie =
| Tijd = 45 min
| Stippen = 2
}}
[[Bestand:Buttercreme in einer Glasschüssel-8493.jpg|thumb|Botercrème]]
== Ingrediënten ==
* 200 gram ongezouten {{Kb|boter}}
* 100 gram erg fijne {{Kb|suiker}}
* 5 {{Kb|ei|eieren}}
* {{Kb|p=koffie|oploskoffie}}
* 1 pak {{Kb|p=biscuit|petit beurre-biscuit}}
* afwerking:
:* chocoladen koffie-bonen, M&M's crisps
:* of hagelslag of chocolade-krullen
:* of amandelschilfers
== Benodigdheden ==
* Mixer met staafkloppers
* grote kom
* spatel
* diep bord
* plank om de taart op te leggen
* aluminiumfolie (voor over de plank)
== Bereiding ==
* Maak een kopje oploskoffie en laat deze afkoelen
* Zorg dat de boter zacht en kneedbaar is, dus op kamertemperatuur
* Voeg de suiker bij de boter en klop met de mixer tot het geheel een brij vormt
* Scheid de eieren en voeg de 5 eierdooiers bij de boter-suikermassa. (de eiwitten zijn niet nodig voor dit gerecht)
* Klop de massa smeuïg met de mixer. Het volume van de brij neemt toe door de eierdooiers en maakt de crème au beurre luchtiger.
* Voeg naar smaak 1 à 2 eetlepels oploskoffie toe aan de massa en mix tot het poeder in de massa zit. Proef of er voldoende mokka (koffie)-smaak in de crème au beurre zit. Een teveel aan oploskoffie kan een bittere smaak nalaten. Fijnere mokka-oploskoffie geeft een zachtere smaak.
* Giet de gekoelde koffie in een diep bord en week de petit beurre-koekjes erin. De eerste laag wordt slechts aan 1 kant geweekt, zodat de koek niet aan de plank kleeft.
* Schik de eerste laag koekjes in een vierkant of rechthoek.
* Besmeer met behulp van een spatel de koekjes met een laag crème au beurre. Deze laag mag even dik zijn als de koekjes zelf.
* Leg de volgende laag geweekte koekjes en bestrijk opnieuw met een laag crème au beurre. Een maagvullende koek bevat 4 tot 5 laagjes koek. Een lichtere versie kan met 3 laagjes koek.
* Bestrijk de bovenste laag koekjes met crème au beurre en bestrijk eveneens de zijkanten van de taart met een laag crème au beurre.
* Werk af door de zijkanten te bezetten met chocoladen koffiebonen of hagelslag
* Strooi boven op de taart de luchtige M&M's crips of kies voor een andere luchtige afwerking zoals amandelschilfers of chocoladekrullen
== Variaties ==
* Een eetlepel Grand Marnier toevoegen
* Door gemalen amandelen door de crème au beurre massa te mengen, wordt de taart lichter en knapperig.
* Een eierloze crème au beurre is te maken door 250 gram boter te mengen met 250 gram bloemsuiker en enkele eetlepels opgeloste koffie. Deze crème au beurre is veel zwaarder. Men kan de beide soorten afwisselen indien men een erg grote taart wenst te maken.
* In plaats van oploskoffie kunnen de koekjes ook geweekt worden in een oplosbare café glacé (een koud bereide koffie op basis van melk, als oploskoffie te koop in de supermarkt)
* Door de crème au beurre in een slagroomzak te doen, kan de taart afgewerkt worden met mooie toefjes crème au beurre.
{{Navigatie recepten}}
[[Categorie:Taart|Crème au beurre-taart]]
[[Categorie:Zuivelrecept|Crème]]
{{Sub}}
9js75zr7r12cnbxizw6fi04bzgjptpe
Kookboek/Peertjes met aardappelkoekjes en biefstuk
0
12299
428026
409467
2026-05-20T05:20:30Z
Erik Baas
2193
lf
428026
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Peertjes met aardappelkoekjes en biefstuk
| Categorie =
| Porties = 6
| Energie =
| Tijd = 3 uur
| Stippen = 3
}}
==Ingrediënten==
;Voor de peertjes:
*1,5 kg {{Kb|p=peer|peertjes}} (Gieser Wildeman)
*0,5 L {{Kb|druivensap}}
*1 {{Kb|p=kaneel|kaneelstokje}}
*1 {{Kb|citroen}}, bij voorkeur onbespoten
*{{Kb|basterdsuiker}}
;Voor de aardappelkoekjes:
*200 g {{Kb|p=aardappel|aardappels}}
*Aardappelpuree voor vier personen (van ruim 1 kg aardappelen)
*Scheutje room
*Scheutje olijfolie
*15g {{Kb|bieslook}}
*bloem
;{{Kb|p=rundvlees|Biefstuk}} voor zes personen
==Bereiding peertjes==
# Schil de peertjes en snij ze in vieren. Snij het klokhuis eruit.
# Doe 300 ml druivensap en 300 ml water in een pan, en voeg de peertjes toe. Breng het geheel aan de kook, en voeg het kaneelstokje en een kwart citroen (met schil, dus schoongeboend) toe. Kook het geheel voor ongeveer 2,5 uur op laag vuur. Als de peertjes dreigen droog te koken, voeg dan nog wat druivensap toe. Roer enkele malen voorzichting in de pan, om de peren een gelijke smaak en kleur te geven.
# Verwijder na het koken de citroenschil en het kaneelstokje.
# Dien de peertjes met het vocht op. Eventueel ervoor kan gekozen worden het vocht aan te dikken met enkele theelepels maizena opgelost in een beetje melk.
==Bereiding aardappelkoekjes==
# Kook 200 g liefst kruimige aardappels tot deze geheel gaar zijn.
# Maak bovendien een aardappelpuree voor vier personen.
# Prak de aardappels fijn, en meng deze met de puree. Voeg een scheutje room, een scheutje olijfolie en peper en zout naar smaak toe. Meng het geheel tot een egale massa.
# Snij de bieslook fijn, en voeg deze toe.
# Meng drie eieren door het mengsel, en voeg bloem toe tot het een egale, redelijk stevige massa is.
# Maak schijven (koekjes) met ongeveer een doorsnede van vier à vijf cm, en zorg ervoor dat de koekjes niet te dik zijn. Bak de koekjes in hete olijfolie in een hapjespan.
==Bereiding biefstuk==
Zie recept voor [[Kookboek/Biefstuk|Biefstuk]]. Kruid de biefstuk naar smaak. Bak de biefstuk in een braadpan op smaak. De duur van het bakken is afhankelijk van het soort biefstuk en de gewenste doorbakkenheid.
==Variaties==
* Vervang de druivensap door bessensap, wijn of port.
* De aardappelkoekjes kunnen eventueel ook gefrituurd worden of in de oven worden gebakken. In de oven kan eventueel gekozen worden voor vormpjes.
* De biefstuk kan vervangen worden door allerlei vleessoorten, bijvoorbeeld rollade of fricandeau.
{{Navigatie recepten}}
[[Categorie:Aardappelrecept]]
[[Categorie:Vleesrecept]]
{{Sub}}
mruconjg5oqwy4h4cyuqc1qhggr0g93
Kookboek/Crème brûlée
0
12863
428029
402847
2026-05-20T05:20:34Z
Erik Baas
2193
lf
428029
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding = [[Afbeelding:Creme brulee.jpg|300px|]]
| Categorie = Dessert
| Porties = 4 (4 bakjes)
| Energie =
| Tijd = 20 minuten + 3 uur koelkast.
| Stippen = 3
}}
[[Kookboek/Nagerecht|Nagerecht]] | [[Kookboek/Recepten|Receptenindex]]
'''Crème brûlée''', niet te verwarren met [[Kookboek/Catalaanse crème|Catalaanse crème]], is een toetje op basis van {{Kb|custard}}. Crème brûlée wordt "gebakken" in de oven, daarna in de koelkast gezet, Catalaanse crème wordt gekookt en daarna in de koelkast gezet. Als je het minder calorieën wilt laten bevatten, kun je een deel van de room vervangen door volle melk. Het is eenvoudig te bereiden, en kinderen vinden het bovendien prachtig om te maken!
==Ingrediënten==
* 4 {{Kb|p=ei|eierdooiers}}
* 15 gram {{Kb|suiker}}
* half {{Kb|p=vanille|vanillestokje}}
* 200 ml {{Kb|p=Room|gezoete room}}
* ongeveer 20 gram {{Kb|p=suiker|rietsuiker}} voor de krokante bovenlaag
== Keukengereedschap ==
* (kleine) kookpan of steelpan
* oven
* koksbrander
* vergiet
* 4 ovenbestendige dessertbakjes
* ovenschaal
==Bereiding==
#Snijd het vanillestokje in de lengte open
#Breng de room met het vanillestokje en de suiker tegen de kook aan.
#Verwarm de oven op 180°C
#Meng de room met de eierdooiers, een klein beetje...zodat de eismaak niet overheerst.
#Giet dan alles terug in de pan en laat weer rustig koken, zodat het gaat binden.
#Als er kookbellen gaan vormen zet gelijk het vuur uit.
#De storende kookbellen in de vulling kan je verwijderen door even de brander eroverheen te halen.
#Alles in de vergiet doen, om stollende resten te verwijderen
#Verdeel de room over vier bakjes
#Zet de bakjes in een ovenschaal, en zorg dat ze half onder water staan (au bain marie)
#Laat dit 20-25 minuten in de oven staan
#Drie uur laten opstijven in de koelkast
#Dun laagje rietsuiker op de crème strooien en met een gasbrander karamelliseren
#Direct serveren
In plaats van de suiker met een vlam te karamelliseren kan dat ook op de ouderwetse manier, met een speciaal ijzer.
{{Navigatie recepten}}
{{Wikipedia|Pagina=Crème brûlée|Naam=Crème brûlée}}
[[Categorie:Dessert|Crème brûlée]]
{{Sub}}
idl22goez7qskcqb4zjg8yelm5ilbw3
Kookboek/Pizza Flandria
0
12880
428027
410311
2026-05-20T05:20:32Z
Erik Baas
2193
lf
428027
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding = [[Bestand:Pizza Capricciosa on a wooden rustic table (49255425326).jpg|300px]]
| Categorie = Pizzarecept
| Porties = 2 pizza's
| Energie =
| Tijd = 120 minuten
| Stippen = 3
}}
Voor 4 à 6 personen
==Ingrediënten saus==
*'''De saus wordt beter een dag op voorhand gemaakt'''
*1 grote [[Kookboek/ui|ui]]
*2 grote [[Kookboek/tomaat|tomaten]]
*2 takjs verse [[Kookboek/basilicum|basilicum]]
*2 eetlepels gedroogde [[Kookboek/orgeano|oregano]]
*2 teentjes verse [[Kookboek/look|look]]
*2 takjes verse [[Kookboek/selder|selder]]
*1/2 theelepel gedroogde [[Kookboek/chilipeper|chilipeper]]
==Ingrediënten pizzabodem==
*3 dl. water
*500 g. [[Kookboek/Bloem|bloem]]
*30 g. verse [[Kookboek/Gist|gist]] (of een equivalente hoeveelheid gedroogde)
*3 eetlepels [[Kookboek/Olijfolie|olijfolie]]
*3 theelepels [[Kookboek/zout|zout]]
*2 eetlepels gedroogde [[Kookboek/orgeano|oregano]]
*1/2 theelepel gedroogde [[Kookboek/chilipeper|chilipeper]]
*1 takje verse [[Kookboek/basilicum|basilicum]]
==Ingrediënten beleg==
*2 grote [[Kookboek/Ui|uien]]
*1 staal [[Kookboek/Prei|prei]]
*3 teentjes verse [[Kookboek/Knoflook|look]]
*1 grote {{Kb|tomaat}}
*2 takjes verse {{Kb|basilicum}}
*2 takjes verse {{Kb|bladselderij}}
*2 eetlepels gedroogde {{Kb|oregano}}
*1/2 theelepel gedroogde [[Kookboek/Chilipeper|chilipeper]]
*6 plakken gekookte {{Kb|ham}}
*6 palkken gerookt {{Kb|spek}}
*8 plakken {{Kb|chorizo}}
*200 gram {{Kb|champignon|champignons}}
*150 gram gemalen {{Kb|mozzarella}}
==Voorwerpen==
*pan
*houten lepel
*oven
*scherp mes
*snijplank
*2 grote borden
==Bereiding saus==
*Snij de ui in stukjes
*Hak de basilicum & de selder fijn
*Pel de look en hak fijn
*Verhit de pan met een eetlepel olie
*Doe de look samen met de oregano, basilicum, selder en gedroogde chilipepers in de pan, laat ongeveer 1 minuut aanbakken, blijf roeren met houten lepel
*Voeg de gesneden ui toe, goed omroeren, 5 - 10 minuten laten sudderen, geregeld omroeren
*Snij de tomaat in kleine stukjes
*Voeg de tomaat toe
*Nog even laten gaar worden, daarna hert geheel fijnmixen en laten koud worden
*Één nacht in koelkast laten rusten
==Bereiding pizzabodem==
*Meng water met bloem, gist, zout en olie en kneed tot het deeg mooi glad en stevig is.
*Laat het deeg een uurtje rijzen
*Rol het deeg uit tot een dikte van ongeveer 3 mm
*Beleg het deeg met de saus en de ingrediënten
*Verwarm de oven tot 250°Celsius en bak de pizza ongeveer 10 minuten
{{Navigatie recepten}}
[[Categorie:Pizzarecept|Flandria]]
{{Sub}}
q5nm2npkudojw3qul2mhvs16rbnkd43
Kookboek/Quatre quart
0
12996
428028
395279
2026-05-20T05:20:33Z
Erik Baas
2193
lf
428028
wikitext
text/x-wiki
{{Infobox recept|Quatre Quart
| Afbeelding = [[Bestand:Quatre-quarts.jpg|300px]]
| Naam = Quatre Quart, vier-vierdencake
| Categorie = Cake, gebak en taart
| Porties = 6 mensen of meer
| Energie =
| Tijd = 10 min voorbereiden ong. 60 minuten in de oven staan
| Stippen = 1
}}
'''Quatre quart''' is een rechthoekige cake naar Frans recept. De betekenis van de naam ligt in het feit dat er van de vier basis-ingrediënten bloem, boter, suiker en eieren, precies evenveel benodigd is.
==Ingrediënten==
*4 grote {{Kb|p=ei|eieren}}
*250 gram {{Kb|suiker}}
*250 gram {{Kb|p=bakmeel|zelfrijzend bakmeel}}
*250 gram bak {{Kb|boter}}
Als optie uitgebreid met:
*zoete [[Kookboek/Cacao|cacao]] voor een chocoladecake
*1 zakje [[Kookboek/Vanillesuiker|vanillesuiker]] of vanille aroma (smaak) voor een vanillecake
==Benodigdheden==
*ovenschotel
*grote kom
*mixer
*maatbeker
*bakpapier/boterpapier
*pottenlikker
*oven
*lepel, vork, mes
==Bereiding==
#Verwarm de oven voor op 180°
#Meng de bloem en suiker tot één geheel
#Smelt de boter en giet ze bij het mengsel. Roer goed
#Scheid de eieren, voeg het eigeel bij het deeg. Roer goed
#Klop het eiwit stijf
#Voeg het eiwit bij het deeg. Roer goed
#Vet de ovenschotel in of leg er bakpapier op.
#Giet het mengsel in de ovenschotel, en laat hem een uurtje in de oven bakken.
#Prik er met een metalen pin in, als die er schoon uitkomt, is de cake klaar.
;voor extra effect:
#Eens het deeg klaar is, in twee gelijke delen verdelen.
#Voeg bij het ene deel de cacao naar smaak of kleur toe.
#Bij het in de schotel gieten afwisselen tussen de degen in een spiraal of in laagjes.
*bestrooi de cake met poedersuiker, over een vorm (bv. cijfer voor verjaardagen)
==Opdienen==
Warm of koud, in sneetjes of blokjes.
== Zie ook ==
* [[Kookboek/Cake]], een soortgelijke cake.
{{Navigatie recepten}}
[[Categorie:Cake|Quatre]]
[[Categorie:Franse keuken|Quatre]]
{{Sub}}
25rdahmgk8lonc9qaa60nepj9l4cx0p
Kookboek/Boeuf Bourguignon
0
13044
428031
403596
2026-05-20T05:22:04Z
Erik Baas
2193
lf
428031
wikitext
text/x-wiki
{{Infobox recept
|
| Afbeelding=[[Bestand:BurgundskeHovezi.jpg|300px]]
| Naam = Kookboek/Boeuf Bourguignon
| Categorie = Vleesrecept
| Porties = 4
| Energie =
| Tijd = Ruim 2 uur voorbereiding en circa 10 minuten afwerking
| Stippen = 3
}}
==Ingredienten (voor 4 personen)==
* 500 gram {{Kb|rundvlees|runderriblappen}}
* 100 gram {{Kb|p=spek|ontbijtspek }}
* 4 sjalotjes of 2 uien
* 75 gram {{Kb|boter}}
* 20 {{Kb|p=zilveruitje|zilveruitjes}}
* 1 klein blikje {{Kb|tomatenpuree}}
* 1 eetlepel bloem
* 2 dl rode {{Kb|wijn}}
* 2 dl {{Kb|bouillon}} (van een halve bouillontablet)
* peper, zout
* mespuntje tijm
* 1 laurierblad
* 250 gram {{Kb|p=champignon|champignons}}
* 1 eetlepel maizena
* 1 eetlepel fijngehakte peterselie
==Bereidingswijze==
Snij de riblappen in grote dobbelstenen en het ontbijtspek in blokjes of reepjes. Pel en snipper de sjalotjes of de uien.
Verhit in een braadpan de helft van de boter en bak hierin het spek gedurende 2 minuten. Neem het spek uit de pan, zet de warmtebron hoog en bak het rundvlees aan alle kanten bruin. Zet de warmtebron weer laag. Voeg de rest van de boter toe en bak de sjalotjes (of de gesnipperde uitjes) en de zilveruitjes mee. Roer de tomatenpuree door het vlees en daarna de bloem. Laat alles 1 minuut zachtjes bakken.
Giet de wijn en de bouillon erbij. Doe peper, zout, tijm, laurierblad en de gebakken spekjes in de pan. Laat het vlees met de deksel op de pan zachtjes 2 uur stoven.
Bak intussen de in plakjes gesneden champignons 2 minuten in een beetje boter en doe ze de laatste 10 minuten bij het vlees. Bind de saus eventueel met de maizena gemengd met koud water. Strooi peterselie over het gerecht.
== Varianten ==
* Snijd 300 g wortelen in stukjes en bak mee met de uien.
* Voeg een takje {{Kb|rozemarijn}} toe, tegelijk met de tijm, en haal het er vóór het opdienen weer uit.
{{Wikipedia|Pagina=Boeuf Bourguignon|Naam=Boeuf Bourguignon}}
{{Navigatie recepten}}
{{Sub}}
[[Categorie:Vleesrecept|Boeuf]]
[[Categorie:Franse keuken|Bœuf bourguignon]]
[[Categorie:Stoofpot|Boeuf]]
l9mebpvuy9iq7rovy8f1umsrlbvx4eq
Kookboek/Zeeuwse mosselen
0
13271
428033
393972
2026-05-20T05:22:07Z
Erik Baas
2193
lf
428033
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Mussels with fries Amsterdam.jpg|300px]]
| Categorie = Zeevrucht
| Porties =
| Energie =
| Tijd = 25 minuten
| Stippen = 3
}}
==Benodigdheden==
===Ingrediënten===
* 1 grote ui
* enkele wortelen of een winterwortel
* 1 stengel bleekselderij
* ½ prei
* peper
* 2 kg {{Kb|p=mossel|mosselen met schelp}}
* flesje oud bruin {{Kb|bier}}
===Keukengereedschap===
* Grote pan
==Bereidingswijze==
# Snijd de groenten in niet te kleine stukken.
# Kook bouillon van de groenten (ong. 10 min.).
# Was en test in de tussentijd de mosselen:
## Was de mosselen drie keer in een grote bak (zoals een schone afwasbak) of schone gootsteen met dop. Gooi schelpen die boven komen drijven weg, die kunnen slecht zijn. Gooi ook schelpen weg met barsten erin.
## Test mosselen door open mosselen even tegen elkaar te tikken; levende mosselen gaan dicht, die zijn goed. Mosselen die open blijven moeten worden weggegooid. Zit er een erg zware mossel tussen dan is dit waarschijnlijk een slib-mossel, die kun je beter ook weggooien, want zand op je bord is niet lekker.
# Voeg de gewassen mosselen toe aan de bouillon en voeg het bier en veel peper toe.
## Heb je geen oud bruin, dan kun je ook gewoon bier nemen en een schepje suiker toevoegen.
# Kook de mosselen op een hoog vuur in 3 a 4 minuten gaar. Halverwege de kooktijd even omschudden.
# Serveer het met stokbrood/toast, knoflookboter, een keuze uit andere [[Kookboek/Dipsaus|sausjes]] of wat je lekker vindt.
==Varianten==
* Vervang het bier door witte wijn.
* Mocht het je lukken om wat over te houden, dan kun je de overgebleven mosselen bakken in roomboter, zie [[Kookboek/Gebakken mosselen|Gebakken mosselen]].
{{Navigatie recepten}}
[[Categorie:Schelprecept|Mosselen]]
{{Sub}}
o6p74o7jogpb7jmrdy09most9gb4rf0
Kookboek/Brandnetelsoep
0
14337
428032
405290
2026-05-20T05:22:07Z
Erik Baas
2193
lf
428032
wikitext
text/x-wiki
{{Infobox recept
|Afbeelding= [[Afbeelding:St John Restaurant, Smithfield, London (3445306202).jpg|300px]]
|Naam=Brandnetelsoep
|Categorie=Soeprecept
|Porties=2 liter
|Energie=
|Tijd=
|Stippen=2
}}
'''Brandnetelsoep'''
==Ingrediënten==
Voor de basis van de soep:
*Voor 2 liter soep is 200 gram {{Kb|p=Brandnetel|brandnetelblad}} voldoende: een 8 liter emmertje voor de helft gevuld. Het plukken duurt een uurtje als je het efficiënt doet: ''gezeten op een krukje en met handschoenen.''
*een {{Kb|ui}}
*een of twee [[Kookboek/Knoflook|knoflookteentjes]]
''Dit is de basis voor brandnetelsoep.'' Wat er nu bijgedaan wordt is een kwestie van smaak. Steeds proeven dus!
*[[Kookboek/Peper|peper]] en [[Kookboek/Zout|zout]]
*{{Kb|maggikruid}}, [[Kookboek/Peterselie|peterselie]], {{Kb|salie}}, {{Kb|marjolein}}
*[[Kookboek/Nootmuskaat|nootmuskaat]] en/of {{Kb|koriander}}
*een paar lepels [[Kookboek/Olijfolie|olijfolie]]
*in kleine stukjes gesneden [[Kookboek/Aardappel|aardappel]]
*{{Kb|melk}} en/of {{Kb|room}}, of {{Kb|yoghurt}}
*[[Kookboek/Bloem|bloem]], om er een gebonden soepje van te maken
*{{Kb|croutons}} - snijd oud brood in stukjes en braad ze in boter
*plukjes{{Kb|kervel}} of [[Kookboek/Peterselie|peterselie]] voor het garneren
==Bereidingswijze==
#Snijd de bovenste 10 cm van de jonge brandnetelplant af met een schaar of snoeimes.
#Houd de brandneteltop boven het emmertje en knip de bladeren eraf: ''geen stengel, geen bloemen!'' De beste brandnetels groeien vlak bij huis en zijn niet groter dan 50-75 cm.
#Was de bladeren en stop ze in een grote pan met twee liter water.
#Voeg er twee 1-liter groentebouillontabletten aan toe.
#Kook, en pureer met een staafmixer. Er zullen altijd wat deeltjes zijn groter dan gewenst: ''zeef ze eruit met een grove zeef.''
#Fruit een grote fijngesneden ui, en voeg daar een of twee uitgeperste knoflookteentjes aan toe. Bij de soep doen.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Soeprecept|Brandnetelsoep]]
eqh4jpnfgwvaizpo205luwlg9nci3al
Kookboek/Marshmallow
0
14401
428040
400854
2026-05-20T05:22:13Z
Erik Baas
2193
lf
428040
wikitext
text/x-wiki
{{Infobox recept
|Naam=Marshmallow
|Afbeelding=[[Afbeelding:RoastingMarshmallow.jpg|300px|''Marhsmallow boven een kampvuur'']]
|Categorie=Barbecue
|Porties=1 persoon
|Energie=
|Tijd= 5 minuten
|Stippen=1
}}
[[Kookboek/Barbecuerecept|Barbecue]] | [[Kookboek/Recepten|Receptenindex]]<br>
Verwarm een spekkie (marshmallow) op een satéprikker boven de barbecue tot hij bruin wordt. Draai hem rond om gelijkmatig te bruinen.
Snel opeten, maar pas op: het kan zo heet zijn dat je je tong kan verbranden.
{{Navigatie recepten}}
[[Categorie:Snoep|Marshmallow]]
{{Sub}}
3en26dodnza2oey6z59bklmw26i41u2
Kookboek/Oer Nasi Goreng
0
14468
428030
394821
2026-05-20T05:22:03Z
Erik Baas
2193
lf
428030
wikitext
text/x-wiki
{{Infobox recept
| Oer nasi goreng
| Afbeelding = [[Bestand:Nasi goreng sari laut.jpg|300px]]
| Categorie = rijstrecept
| Naam = Oer nasi goreng
| Porties = 4
| Energie =
| Tijd =
| Stippen = 3
}}
Oer nasi goreng is een oorspronkelijk Indonesisch gerecht.
==Ingrediënten==
*400 g {{Kb|p=rijst|gekookte rijst}}, afgekoeld
*3 {{Kb|p=ei|eieren}}
*2 rode {{Kb|p=sjalot|sjalotten}}
*1 [[Kookboek/Knoflook|knoflook]]
*1/2 tl [[Kookboek/Peper|witte peper]]
*1 tl [[Kookboek/Trassie|trassie]]
*1 el [[Kookboek/Sambal|sambal oelek]]
*1 el [[Kookboek/Thaise vissaus|Thaise vissaus]]
*1 el [[Kookboek/Ketjap|ketjap manis]]
*1 bosje [[Kookboek/Selderie|selderie]]
*1 zakje [[Kookboek/Ui|gebakken uien]]
*1 el [[Kookboek/Olie|olie]] 2x
''* oorspronkelijk worden 3 [[Kookboek/Ombok|lomboks]] (bird eye chilli of rawit) samen met de knoflook en sjalotten gekneusd.''
'''Eventuele aanvullingen:'''
*gegrilde [[Kookboek/Kip|kippenbout]] pluizen
*of een handvol [[Kookboek/Garnaal|garnalen]]
==Bereiding==
#Snipper sjalotten en knoflook.
#Breek de eieren en roer ze stuk.
#Verhit de olie, roerbak de eieren in grove stukken gaar, haal ze uit de pan.
#Verhit opnieuw olie in de wok.
#Fruit hierna de sjalotten en knoflook totdat de sjalotten glazig zijn.
#Dan gaan witte peper, sambal en trassie erin. Meng ze goed, laat de massa dan op klein vuur gaar worden, de gekruide olie scheidt zich van de massa af.
#De eventuele toevoegingen kip of garnalen gaan er nu bij.
#De gekookte rijst gaat in de wok, weer goed mengen.
#Afmaken met de vissaus, ketjap en als laatste de roereieren.
'''Opdienen:'''<br>
Een bord met nasi goreng, strooi gesnipperde bladselderie en gebakken uien overheen. Klaar is dit oergerecht.
== Varianten ==
Bovenstaand gerecht is een basis recept, afhankelijk van smaak en gewoonte kan je verschillende dingen toevoegen:
* [[Kookboek/Nasikruiden]], tegelijk toevoegen met peper, sambal en trassie.
* NB Groenten worden nooit in het gerecht meegekookt!
* Bij het opdienen: saté, kroepoek, [[Kookboek/Atjar tjampoer|atjar]], gebakken kip, gebakken gamba's en/of uitgebakken ontbijtspek.
Eet smakelijk!!
{{Navigatie recepten}}
[[Categorie:Rijstrecept|Nasi goreng oer]]
[[Categorie:Indonesische keuken|Nasi goreng oer]]
{{Sub}}
plis2k4hadppzuwixe2epk3j1jx3l2b
Kookboek/Bami goreng
0
14530
428037
402662
2026-05-20T05:22:10Z
Erik Baas
2193
lf
428037
wikitext
text/x-wiki
{{Infobox recept| Bami Goreng
| Categorie = bamirecept
| Afbeelding = [[Bestand:Mie Goreng (Solok, Indonesia).jpg|300px]]
| Onderschrift = Bami Goreng (voorbeeld)
| Naam = Bami goreng
| Porties = 4 tot 6, afhankelijk van wat je er verder nog aan gerechten bijgeeft
| Energie =
| Tijd = Voorbereiding: 40 min, Afwerking: 20 min
| Stippen = 4
}}
==Ingrediënten==
*250 gr {{Kb|kipfilet}}, of mager varkensvlees (bijvoorbeeld {{Kb|ham}})
*600 gr {{Kb|mie}} (in Nederland wordt de platte variant gebruikt)
*2 {{Kb|p=ui|uien}}
*Een of twee tenen {{Kb|knoflook}}
*100 gr mager {{Kb|p=spek|rookspek}}, (aan een stukje)
*250 gr fijngesneden {{Kb|witte kool}}
*2 dunne {{Kb|p=prei|preitjes}}
*1 plak gekookte {{Kb|ham}} (c.a. 5mm dik)
*2 {{Kb|p=ei|eieren}}
*{{Kb|olijfolie}} (mag natuurlijk ook een andere olie zijn)
*{{Kb|p=ketjap|ketjap manis}}
*{{Kb|p=sambal|sambal goreng}}
*{{Kb|p=trassi|trassie}} (verkrijgbaar in de Indische toko)
*gemalen {{Kb|ketoembar}}
*een stukje verse {{Kb|gember}}, (toko) of gemberpoeder
*sap van één {{Kb|citroen}}
*verse {{Kb|peterselie}}
*verse {{Kb|bladselderij}}
*{{Kb|melk}} of {{Kb|room}}
==Bereiding==
Één dag van te voren:
#Kluts de eieren met zout, melk of room, en wat sambal en bak hier [[Kookboek/Omelet|omeletten]] van, rol ze op en laat ze afkoelen.
#Snij de kipfilet in kleine stukjes, en zet deze in een marinade van wat ketjap, sambal, citroensap, en olie.
#Bewaar deze voorbewerkte ingrediënten tot de volgende, dag afgedekt in de koelkast (schep de kip regelmatig om)
Op de dag zelf:
#Snij de prei in zeer dunne ringen, de ui in stukjes en de witte kool en omeletten in dunne reepjes
#Zet alle ingrediënten in schaaltjes klaar.
#Kook de bami beetgaar, en houdt hem warm (bijvoorbeeld in de oven, op de laagste stand).
#Doe wat olijfolie in een ruime pan, of grote wok. Verkruimel hierin een klein stukje trassi. Bak nu de kipfilet en rookspek, samen met wat zeer fijn gehakte gember, of gemberpoeder, wat gemalen koriander, en knoflook, op een hoog vuur aan (een wokbrander is perfect!), tot het wat begint te kleuren. Voeg daarna de witte kool, en wat later de uien toe en bak het geheel tot de ui en kool wat zachter zijn.
#Voeg nu eventueel nog wat ketjap (even doorroeren) en daarna de losgemaakte bami toe. Verwarm alles onder voortdurend omscheppen, tot het door en door heet is.
#Breng het op smaak met wat peper en zout en eventueel wat [[Kookboek/Ve-tsin|ve-tsin]] (Mononatriumglutamaat, E221, verkrijgbaar in de Toko)
#Meng er de omeletreepjes, de hamblokjes en als laatste de gesneden prei doorheen. Garneren met wat grof gehakte selderij en peterselie.
#Gloeiend heet serveren met bijvoorbeeld spiegelei, [[Kookboek/Kroepoek|kroepoek]], plakjes gekookte ham, [[Kookboek/Satésaus|satésaus]], met saté, en eventueel een Indonesisch groente, of vleesgerecht.
==Tips==
#Houdt de bami goreng afgedekt warm, in de oven (op de laagste stand)
#Een frisse salade met bijvoorbeeld komkommers en tomaat, of [[Kookboek/Atjar tjampoer|atjar]] smaakt er heerlijk bij
#Drankje: Wat dacht je van een witbiertje met een schijfje citroen!
#Als je visliefhebber bent kun je er ook nog wat garnalen, of stukjes gare witvis aan toevoegen.
# Zie ook [[Kookboek/Bami]] (eenvoudiger basis-recept).
==Trivia==
*Korianderblad wordt in de Indonesische keuken vrijwel niet gebruikt
*Gemalen korianderzaad heet in het Indonesisch "[[Kookboek/Ketoembar|ketoembar]]"
*Een uitgebreide Bami goreng, geserveerd met allerlei bijgerechten met vlees, vis, en groenten, wordt, bij "de Chinees" wel "[[Kookboek/Bami rames|Bami rames]]" genoemd, dit is overigens, net als de rijsttafel, een uitvinding van Nederlanders die vertoefden in het toenmalige Nederlands Indië.
*Het is ook een goed idee om de geraspte schil van de citroen in de satèsaus te verwerken.
{{Navigatie recepten}}
[[Categorie:Indonesische keuken|Bami goreng]]
{{Sub}}
kh1ji4gfo9p56m7wom13hblvlxk7tpq
Kookboek/Zomerse erwtensoep
0
14552
428035
393916
2026-05-20T05:22:08Z
Erik Baas
2193
lf
428035
wikitext
text/x-wiki
{{Infobox recept
|
| Categorie = Soeprecept
| Naam = Zomerse_erwtensoep
| Porties = 4
| Energie =
| Tijd = 2,5 uur
| Stippen = 3
}}
[[Kookboek/Nederlandse keuken|Nederlandse keuken]] | [[Kookboek/Soep|Soep]] | [[Kookboek/Recepten|Recepten]]
==Ingrediënten==
*250 g {{Kb|p=doperwt|spliterwten}}
*200 g verse {{Kb|p=doperwt|gedopte erwten}} (in de zomermaanden bij de groenteman verkrijgbaar).
*minimaal 200 g {{Kb|p=kip|kipfilet of kippenpoten}} (hoe meer hoe beter, b.v een hele kip)
*4 stengels {{Kb|bleekselderij}}
*1 grote {{Kb|ui}}
*1 blaadje [[Kookboek/Laurier|laurier]]
*2.5 l [[Kookboek/Water|water]]
*200 g {{Kb|prei}}
*een bosje {{Kb|bladselderij}}
*[[Kookboek/Bouillon|bouillonblokjes]]
*150 g mager {{Kb|p=spek|rookspek}}
*[[Kookboek/Crème fraîche|Crème fraîche]]
*[[Kookboek/Citroensap|Citroensap]]
==Bereidingswijze==
#Snij de bleekselderij en de ui in stukjes en de prei in ringen.
#Doe de spliterwten, rookspek (in dobbelsteentjes), het kippenvlees, bleekselderij, ui en het laurierblaadje in een pan met circa 2,5 liter water.
#Onder af en toe roeren zachtjes laten koken totdat de erwten bijna gaar zijn. Neem het vlees, zodra het gaar is, (na ongeveer een uur) uit de pan, laat het afkoelen, en snij het in kleine stukjes
#Voeg dan toe: de preiringetjes, bladselderij, bouillonblokje en de verse erwtjes.
#Nog circa vijftien à twintig minuten zachtjes laten koken onder af en toe roeren.
#Voeg vlak voor het opdienen een flinke lepel crème fraîche, het in stukjes gesneden gare kippenvlees, en wat citroensap toe.
#Breng de soep op smaak met wat peper en zout
==Opmerkingen, tips en variaties==
#Deze soep hoort duidelijk wat minder “dik” te zijn dan de winterse variant.
#Het citroensap, en de crème fraîche benadrukken het zomerse karakter van deze soep
#Serveer met krokant gebakken [[Kookboek/Stokbrood|stokbrood]], en {{Kb|kruidenboter}}
#inplaats van verse, kunnen ook diepvrieserwten worden gebruikt
#Een {{Kb|rookworst}} mag natuurlijk ook!
{{Navigatie recepten}}
[[Categorie:Nederlandse keuken|Zomerse erwtensoep]]
[[Categorie:Soeprecept|Zomerse erwtensoep]]
{{Sub}}
a7vrqs8xfyq7yzl69w8zj39x13aj15i
Kookboek/Fraises Wilhelmine
0
14580
428034
402454
2026-05-20T05:22:07Z
Erik Baas
2193
lf
428034
wikitext
text/x-wiki
{{Infobox recept
|Naam = Fraises Wilhelmine
|Categorie=Dessert
|Porties=
|Energie=
|Tijd=15 minuten
|Stippen=2}}
[[Kookboek/Nagerecht|Dessert]] | [[Kookboek/Recepten|Receptenindex]]
'''Fraises Wilhelmine''', of ''Aardbeien Wilhelmina'', is een [[Kookboek/Nagerecht|nagerecht]], ontwikkeld door Auguste Escoffier ter gelegenheid van een menu dat hij voor Koningin Wilhelmina samenstelde.
Het recept volgens Escoffier:
==Ingrediënten==
*{{Kb|p=Aardbei|Aardbeien}}
*{{Kb|Poedersuiker}}
*{{Kb|Sinaasappelsap}}
*{{Kb|Kirsch}}
*[[Kookboek/Crème Chantilly|Crème Chantilly]]
==Bereidingswijze==
#Mooie grote aardbeien macereren (marineren) met poedersuiker, sinaasappelsap en Kirsch.
#Dresseren in een timbaal en afzonderlijk crème Chantilly met vanille serveren.
Eet smakelijk!
{{Navigatie recepten}}
[[Categorie:Nederlandse keuken|Fraises Wilhelmine]]
[[Categorie:Dessert|Fraises Wilhelmine]]
[[Categorie:Fruitrecept|Fraises Wilhelmine]]
{{Sub}}
1mtxyk8ayuzirgi0wsuq9o8l6k0pfp8
Kookboek/Hangop
0
14582
428038
406681
2026-05-20T05:22:11Z
Erik Baas
2193
lf
428038
wikitext
text/x-wiki
[[Bestand:Hangop_zak.JPG|thumb|Hangop in een theedoek (uitlekken)]]
[[Bestand:Hangop_bord.jpg|thumb|Hangop met stoofperen]]
'''Hangop''' is een [[Kookboek/Melk|melkproduct]] dat vaak als [[Kookboek/Nagerecht|nagerecht]] wordt gegeten.
Hangop wordt bereid uit [[Kookboek/Karnemelk|karnemelk]] of {{Kb|yoghurt}}. Een andere variant gaat uit van half karnemelk, half zoetemelk, waarbij het zuur van de karnemelk de zoetemelk doet stremmen. De karnemelk (of yoghurt) wordt in een dunne doek (bijvoorbeeld een thee- of kaasdoek) opgehangen en na een aantal uren (soms wel een hele nacht) wachten terwijl de zwaartekracht zijn werk doet, kan de hangop uit de doek geschept worden. Het vocht dat door de doek lekt wordt ''goor nat'' genoemd, maar is ondanks deze benaming goed drinkbaar.
'''Alternatieve methode'''<br>
Voor één portie: Gebruik een ouderwetse koffiefilter-houder of keukentrechter en zet die op een lege, grote glazen pot zonder deksel (zoals een grote mayonaisepot of weckpot). Plaats in de koffiefilter-houder/trechter twee papieren koffiefilters over elkaar (bij één gaat het filter scheuren). Giet daarin yoghurt tot aan de rand. Als er geen vocht meer in de pot druppelt, is de hangop klaar.
== Toepassingen ==
* Hangop wordt vaak gegeten met {{Kb|p=basterdsuiker|bruine suiker}} en {{Kb|beschuit}}.
* Hangop is ook een goede basis voor het ontbijt, bijvoorbeeld met muesli of granola, vers fruit en noten.
==Externe link==
*[https://www.internetkookboek.nl/recepten/hangop Hangoprecept]
{{Navigatie recepten}}
[[Categorie:Zuiveldessert|Hangop]]
[[Categorie:Yoghurtrecept|Hangop]]
{{Sub}}
6xmq5u4tydpqazdnxt8lowm7tb2owhy
Kookboek/Hemelse modder
0
14586
428036
404778
2026-05-20T05:22:10Z
Erik Baas
2193
lf
428036
wikitext
text/x-wiki
{{Infobox recept
| Naam = Hemelse modder
| Categorie = Dessert
| Porties = 4
| Energie =
| Tijd =
| Stippen =
}}
'''Hemelse modder''' is een Nederlands nagerecht met een intrigerende naam, werkelijk een Chocolademousse die de naam hemels waard is.
== Ingrediënten ==
*100 gram {{Kb|p=chocolade|bittere chocolade}},
*30 gram {{Kb|boter}},
*15 ml water,
*20 gram {{Kb|suiker}},
*2 {{Kb|p=ei|eieren}} gesplitst
==Bereiding==
#Breek de chocolade in een steelpannetje en plaats dit in een pan met kokend water. ([[Kookboek/Au bain-marie|au bain-marie]])
#Voeg een lepel water toe terwijl de chocolade smelt.
#Roer de boter met suiker tot room.
#Voeg één voor één de eierdooiers toe.
#Klop de eiwitten zeer stijf op, voeg er een mespuntje zout aan toe.
#Roer de weke chocolade door het botermengsel en leg dit mengsel op de stijve eiwitten.
#Schep dit alles luchtig door elkaar.
Dien dit toetje op in glazen bakjes of in platte coupes, eventueel gegarneerd met een toefje [[Kookboek/Slagroom|slagroom]].
{{Navigatie recepten}}
[[Categorie:Dessert|Hemelse modder]]
[[Categorie:Nederlandse keuken|Hemelse modder]]
[[Categorie:Chocoladerecept|Hemelse modder]]
{{Sub}}
t30aogst941mzwiz3juhnlxlv2o94db
Kookboek/Mojito
0
14627
428039
395184
2026-05-20T05:22:11Z
Erik Baas
2193
lf
428039
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding=[[Afbeelding:15-09-26-RalfR-WLC-0067.jpg|200px|Een glas Mojito]]
| Naam = Kookboek/Mojito
| Categorie = Drank
| Porties = 1
| Energie =
| Tijd = 5 minuten
| Stippen = 1
}}
De '''Mojito''' is een Cubaanse drank van rum, limoensap, rietsuiker, spuitwater, angosturabitter en munt met veel ijs.
== Ingrediënten ==
* 5 cl {{Kb|p=rum|witte rum}}
* 1/2 {{Kb|limoen}} in partjes
* 3 theelepels {{Kb|p=suiker|rietsuiker}}
* 3 takjes verse {{Kb|munt}}
* veel ijs (crushed ice)
* sodawater
*Het is ook erg lekker om eventueel nog wat fruit toe te voegen maar dat is jouw eigen keus
== Benodigdheden ==
* groot (longdrink)glas
* Muddler speciaalgereedschap, ook wel 'bastonete' of 'pilão' genoemd om de citrus te vijzelen
* rietjes
* roerstaafjes
== Bereiding ==
#Doe de rietsuiker in het glas en knijp de helft van de limoen uit in het glas, doe de rest van de limoen in het glas en muddle (stamp) dit goed zodat het sap en de olie uit de limoen vrijkomen.
#Roer de suiker en limoensap goed door elkaar.
#Doe hierna de munt in je glas en muddle dit voorzichtig (je wilt de blaadjes zo heel mogelijk houden, maar wel alle olie eruit krijgen).
#Schenk hierna de rum in het glas en roer alle ingrediënten goed door elkaar.
#Vul het glas tot de rand met je geschaafde ijs en spuitwater.
#Roer dit nogmaals goed door en garneer het drankje met een roerstaafje, twee rietjes, twee blaadjes munt en eventueel een stukje fruit.
==Tips==
De truc voor een goede mojito is dat alle ingrediënten goed zijn gemengd, dus is het heel belangrijk om tussentijds en zeker aan het einde het geheel goed door te roeren.<br>
Opgepast: Wanneer je te veel munt gebruikt, gaat je mojito er te hard naar smaken en is hij bijna niet te drinken. Denk er dus aan dat munt sterk is en gebruik het met mate.
{{Bron|bronvermelding=
*Recept oorspronkelijk toegevoegd op de Nederlandstalige Wikipedia door {{Wp|Gebruiker:Altered statesman|Altered statesman}}
}}
{{Wikipedia|Naam=Mojito|Pagina=Mojito}}
{{Navigatie recepten}}
[[Categorie:Cocktail|Mojito]]
{{Sub}}
7m9adbqgxgxxe7uhyplvu5s11ux4bo4
Programmeren in TI-Basic/Programmeertips
0
14767
428188
422156
2026-05-20T05:37:47Z
Erik Baas
2193
lf
428188
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Hieronder een aantal programmeertips.
== Programma's kopiëren ==
Soms is het handig om programma's te kopiëren en onder een andere naam op te slaan.<br>
'''1.''' Maak een nieuw programma aan<br>
'''2.''' Druk op 2nd-STO<br>
'''3.''' Druk op PRGM en ga naar rechts naar EXEC<br>
'''4.''' Ga naar het te kopiëren programma, druk op Enter<br>
'''5.''' Druk nogmaals op Enter en het te kopiëren programma wordt geplakt in het nieuwe programma<br>
Op deze manier is het ook mogelijk om sjablonen te maken, bijvoorbeeld stukjes code die je vaak gebruikt. Met deze procedure kun je ze dan invoegen in je programma.
== Zelfgemaakte methodes gebruiken ==
Vaak heb je bij een programma meerdere keren dezelfde code nodig. Het is niet zo handig als je deze telkens opnieuw moet typen. Je kunt er natuurlijk voor kiezen om dan dat stukje code in een ander programma te zetten en vervolgens te kopiëren, maar er is een handigere manier. Hiermee wordt er ook een stuk minder bytes verbruikt.
Bij deze manier gebruik je de regels code uit een ander programma. Dus niet door de code te kopiëren, maar door te ''verwijzen'' naar het andere programma. Het idee ziet er zo uit:
(Ik ga uit van een spel)
<pre>
//code van het begin van het spel.
//pause_menu
//tekst laten verschijnen op een bepaalde manier
//gebeurt met behulp van een '''ander programma'''.
//dat programma is klaar.
//gaat weer verder met het spel
</pre>
Onder het kopje [[Programmeren in TI-Basic/Veelgebruikte codes]] op de hoofdpagina vind je onderaan een voorbeeld hiervan.
== If-statement inkorten ==
Een if-statement kan vaak korter, en dus sneller.<br>
Gebruik ipv.<br>
'''-''' If A=2<br>
'''-''' A+1 --> A<br>
Het volgende<br>
'''-''' A+(A=2) --> A<br>
(A=2) is gelijk aan 1 ("waar") of 0 ("onwaar" )
== Dubbele commando's ==
als je aan het programmeren bent kan het zijn dat je korte commando's steeds weer op een andere regel moet plaatsen.
hiervoor is een handige tip:
als je een : gebruikt buiten tekst of code om wordt het gerekend als ENTER;
bijvoorbeeld:
<pre>
:ClrHome:Disp "tekst" (scherm legen en tekst weergeven in 1 regel)
:Input C:While C=0 (waarde invullen en tegelijker tijd verwerken)
:Disp:Disp:Disp:Disp (4x een regel wit)
:if A=13:Then (dit is de handigste; een If-statement met direct een Then erachter.)
</pre>
Let op: dit spaart geen ruimte maar is handig als je snel dingen wil opzoeken of als je minder regels wilt te hoeven overslaan als je een script bewerkt
{{Sub}}
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Optimalisatie
|huidige=Programmeer tips
|volgende=Linkpoort
}}
9nnskuufhx6rfwnkp0jv7ie9xq6j356
Kookboek/Dobos-taart
0
14769
428047
402452
2026-05-20T05:22:16Z
Erik Baas
2193
lf
428047
wikitext
text/x-wiki
{{Infobox recept
|Naam=Dobos-taart
|Afbeelding=[[Afbeelding:Dobostaart.jpg|300px|Dobos-taart]]
|Categorie=Cake, gebak en taart
|Porties=12 stukken
|Energie=
|Tijd=
|Stippen=4
}}
[[Afbeelding:DobosCake.jpg|thumb|right|300px|Dobos-taartpunt]]
[[Kookboek/Cake, gebak en taart|Cake, gebak en taart]] | [[Kookboek/Recepten|Receptenindex]]
==Ingrediënten==
;Deeg
*150 gram {{Kb|bloem}} (gezeefd)
*175 gram {{Kb|poedersuiker}}
*6 grote {{Kb|p=ei|eieren}} (gescheiden en op kamertemperatuur)
*merg van één {{Kb|p=vanille|vanillestokje}}
*snufje [[Kookboek/Zout|zout]]
;Chocolade-botercrème
*100 gram pure {{Kb|chocolade}} (in stukjes)
*350 gram koude {{Kb|boter}} of {{Kb|margarine}}
*2 eetlepels {{Kb|p=cacao|cacaopoeder}}
*175 gram poedersuiker
*merg van één vanillestokje
;Karamelglazuur
*1 theelepel boter
*150 gram {{Kb|suiker}}
*2 eetlepels vers {{Kb|citroen|citroensap]]
;Garnering
*60 gram gehakte {{Kb|p=hazelnoot|hazelnoten}} (geroosterd)
*12 hele hazelnoten (geroosterd en ontveld)
===Materialen===
*Springvorm
*Bakpapier
*Mixer
*[[Kookboek/Spatel|Spatel]]
==Bereidingswijze==
De oven voorverwarmen op 200°C. Zes stukken bakpapier voor een springvorm van 26 cm knippen. Voor het deeg de eidooiers, de helft van de poedersuiker en het vanillemerg in een middelgrote kom met een handmixer op de hoogste stand ongeveer drie minuten opkloppen, tot het mengsel licht en schuimig is. In een andere kom de eiwitten stijf kloppen en voorzichtig de rest van de poedersuiker toevoegen. Ongeveer 1/4 deel van het eiwit door het eigeel roeren. De rest van het eiwit zo door het eigeel spatelen, dat witte stukjes in de massa zichtbaar blijven. Bloem en zout mengen en in twee porties, gezeefd, door de massa spatelen.
Een bakblik bekleden met bakpapier en vullen met deeg. In totaal moeten zes lagen gebakken worden, dus moet ook 1/6 deel van het deeg voor één bakblik gebruikt worden. De bodem vijf minuten bakken op de bovenste stand in de oven. Tijdens het bakken de tweede bodem voorbereiden en alvast in de oven schuiven onder de eerste bodem. Wanneer de eerste bodem klaar is, de tweede bodem op de bovenste stand schuiven. De eerste bodem uit de springvorm halen en laten afkoelen. De springvorm afspoelen met koud water, zodat deze weer afgekoeld is. Zo nog vier bodems bakken.
Voor de chocolade-botercrème de chocolade au bain-marie smelten en licht laten afkoelen. De boter met een mixer schuimig kloppen en op de laatste stand de cacao en poedersuiker toevoegen. Tenslotte de gesmolten chocolade en het vanillemerg toevoegen.
Van de gebakken bodems de mooiste apart houden. De bodems één voor één met chocolade-botercrème bestrijken en steeds op elkaar leggen. De zijkant van de taart bestrijken met chocoladecrème en bekleden met gehakte hazelnoten. De taart laten opstijven in de koelkast. Een bakblik met boter bestrijken en de overgebleven bodem hierop leggen. De bodem in twaalf punten snijden.
Voor het karamelglazuur de boter in een kleine pan smelten, suiker en citroensap toevoegen en bij een matig vuur laten smelten tot de massa goud-geel is. De massa direct over de bodem gieten en met een ingevette spatel verdelen. De massa ongeveer 30 seconden laten drogen. Met een ingevet mes de 12 stukken "verdelen". Na één minuut wachten de punten los snijden en volledig laten afkoelen.
De hele hazelnoten verdelen per punt van de taart. De karamelpuntjes op de hazelnoten leggen. De taart nog twee uur afgedekt laten staan en gekoeld serveren.
{{Wikipedia|Pagina=Dobos-taart|Naam=Dobos-taart}}
{{Navigatie recepten}}
[[Categorie:Taart|Dobostaart]]
{{Sub}}
5a98a8sm8gyr6gbje05zzmifmruod3b
Kookboek/Chinese fondue
0
14795
428051
399164
2026-05-20T05:22:20Z
Erik Baas
2193
lf
428051
wikitext
text/x-wiki
{{Infobox recept
| Naam = Chinese Fondue
| Afbeelding= [[Bestand:Food 沙茶火鍋, 麒麟閣, 麒麟閣沙茶火鍋, 台北 (14816998650).jpg|300px]]
| Categorie = Chinese keuken
| Porties = 4 Personen
| Energie =
| Tijd =
| Stippen = 2
}}
De Chinese fondue is een bouillonfondue. De stukjes vlees, vis of groente garen in een sterke bouillon.
== Ingrediënten ==
*600 g {{Kb|p=vis|visfilet}} (2 of 3 soorten, vb. kabeljauw, heilbot, zeewolf, tarbot, zalm, tong, ...)
*12 grote {{Kb|scampi}} gepeld
*400 g {{Kb|kipfilet}}
*400 g {{Kb|p=kalfsvlees|kalfsfilet}}
*250 g {{Kb|p=soja|sojascheuten}}
*250 g {{Kb|Chinese kool}}
*250 g {{Kb|p=Oesterzwam|oesterzwammen}} (of andere paddenstoelen)
*1 bosje {{Kb|p=ui|lente-uitjes}}
*250 g {{Kb|mihoen}}
*[[Kookboek/Sla|sla]]
*1 {{Kb|p=ui|ajuin}}
*[[Kookboek/Peper|Peper]] en [[Kookboek/Zout|zout]]
*1,5 l {{Kb|p=bouillon|kippenbouillon}} (karkassen van kip, 1 wortel, 1 ajuin, 2 teentjes look, een stuk gember, chilipeper, oestersaus, een takje tijm, korianderzaadjes, maggikruid of selder)
*Eventueel een koffielepel [[Kookboek/Garnalenpasta|garnalenpasta]] om nog meer smaak in de bouillon te brengen.
*Enkele oosterse sausjes: [[Kookboek/Sojasaus|sojasaus]], [[Kookboek/Sambal|sambal oelek]], [[Kookboek/Zoetzure saus|zoetzure saus]], [[Kookboek/Kerriesaus|kerriesaus]], ...
== Bereidingswijze ==
#Maak de kippenbouillon door alle ingrediënten met 2 liter water gedurende 1½ uur te laten sudderen op een zacht vuurtje (deze mag licht pikant smaken). De bouillon zeven (eventueel de garnalen pasta toevoegen) en in een fonduepot doen of in een steelpannetje dat op een brandertje gezet wordt.
#De visfilet spoelen in koud water, droog deppen en in stukken snijden van ongeveer 3 cm. De kipfilet en kalfsfilet in plakjes snijden van ongeveer ½ cm dik.
#De sojascheuten spoelen, de Chinese kool in reepjes snijden en spoelen, de grote oesterzwammen ook in repen snijden (of de champignons in stukken), de lente-uitjes spoelen en in grove stukken snijden, de ajuin in ringen snijden.
#Spoel enkele bladen sla en leg deze open op een grote schaal (of 2 kleinere schalen, voor vlees en vis apart). Schik hierop de vis, scampi en het vlees in rijen naast mekaar en leg er de ringen ajuin bovenop. Dit net voor het opdienen bestrooien met wat peper en zout.
#De mihoen in kokend water laten weken, volgens de aanwijzingen op de verpakking. Laat uitlekken en in een kom doen. De mihoen warm houden op een schotelwarmer.
#Alle groenten in aparte schaaltjes doen en samen met de mihoen, het vlees, de vis, en de sausjes op tafel zetten.
#Als de bouillon in het fonduestel begint te pruttelen (niet hard laten koken) kan de maaltijd beginnen. Voorzie voor iedere persoon een schepnetje (of fonduevorkjes), waarin een stukje vis, vlees, oesterzwam, lente-ui, gedurende korte tijd in de bouillon gekookt worden.
#Ondertussen een handjevol sojascheuten en Chinese kool in de bouillon doen. Voorzie een lepel en vork of een tang om groenten te scheppen. Je kan eveneens een blaadje sla en een stuk ajuin in de bouillon meekoken.
Iedereen brengt sausjes op zijn bord naar eigen smaak.
== Serveersuggestie ==
Na de maaltijd wordt, volgens Chinese traditie, de bouillon in kommetjes verdeeld en uitgedronken
== Wijntip ==
Een droge witte wijn (vb. een Zuid-Afrikaanse Chénin Blanc of een Duitse Frankenwein)
{{Navigatie recepten}}
[[Categorie:Chinese keuken|Chinese fondue]]
[[Categorie:Vis- of zeevruchtrecept |Chinese fondue]]
[[Categorie:Vleesrecept|Chinese fondue]]
[[Categorie:Groentenrecept|Chinese fondue]]
{{Sub}}
5hloi4zkoodhvo7341xi417avv87r2s
Kookboek/Romige kerriesoep
0
14814
428042
404933
2026-05-20T05:22:14Z
Erik Baas
2193
lf
428042
wikitext
text/x-wiki
{{Infobox recept
|Naam=Romige Kerriesoep
|Afbeelding=[[Bestand:Curry soup with bread 2016.jpg|300px]]
|Categorie=Soeprecept
|Porties=4 personen
|Energie=
|Tijd=± 45 minuten
|Stippen=2
}}
[[Kookboek/Soep|Soep]] | [[Kookboek/Recepten|Receptenindex]]
==Ingrediënten==
*ongeveer 60gr [[Kookboek/Boter|boter]]
*circa 50 gr [[Kookboek/Bloem|bloem]]
*een ruime eetlepel {{Kb|p=kerrie|milde kerrie}}
*2 flinke {{Kb|p=ui|uien}}
*1 rode {{Kb|paprika}}
*200 gr {{Kb|p=kip|kipfilet}}
*{{Kb|p=laurier|laurierbladeren}}
*{{Kb|p=foelie|foelie (heel)}}
*{{Kb|kruidnagel}}
*{{Kb|p=bouillon|bouillonblokjes}}
*c.a. 25gr langkorrelige {{Kb|rijst}}
*500 ml [[Kookboek/Melk|volle melk]]
*Een klein scheutje {{Kb|p=ketjap|ketjap manis}}
*{{Kb|crème fraîche}}
*{{Kb|stokbrood}}
==Bereidingswijze==
# Zet de kipfilet met ongeveer 800 ml water, 1 ui laurier, foelie, 2 blokjes goudbouillon en een paar kruidnagels op een laag pitje, en laat het zachtjes trekken tot de kip net gaar is
# Neem de kip uit de pan, en zet hem tot gebruik in de koelkast.
# Zeef de bouillon, en kook hem in tot er nog ongeveer 500 ml van over is.
# Kook de rijst gaar.
# Was intussen de paprika en snijd deze in kleine stukjes
# Maak de resterende ui schoon, en snijd deze ook in kleine stukjes
# Smelt de boter, hier inde paprika, samen met de ui zacht laten bakken tot de ui glazig is.
# De kerrie toevoegen.
# Bloem toevoegen en onder voortdurend roeren een roux maken, deze zo min mogelijk laten kleuren, hierna dit mengsel wat af laten koelen
# Voeg er hierna de rijst, de (warme) melk, en de bouillon aan toe, en laat het ongeveer 10 minuten zachtjes doorkoken
# In stukjes gesneden kipfilet bijvoegen, en op smaak brengen met, peper zout, en eventueel wat ketjap.
# Bij het serveren een flinke schep crème fràiche aan elke kom toevoegen.
# serveren met warm stokbrood, en {{Kb|kruidenboter}}.
Eet smakelijk !
== Varianten ==
* Voeg een banaan en appel toe, beide in stukjes gesneden, en laat even meekoken.
{{Navigatie recepten}}
[[Categorie:Soeprecept|Kerriesoep]]
[[Categorie:Kiprecept|Kerriesoep]]
{{Sub}}
3jtloacw5lugfvozmazyuhqjb0y41zb
Kookboek/Koude chocoladetaart
0
15111
428041
402457
2026-05-20T05:22:14Z
Erik Baas
2193
lf
428041
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Koude chocolade taart
| Categorie = Cake, gebak en taart
| Porties =
| Energie =
| Tijd =
| Stippen =
}}
[[Kookboek/Cake, gebak en taart|Cake, gebak en taart]] | [[Kookboek/Recepten|Receptenindex]]
Chocoladetaart waarbij geen oven nodig is, maar grotendeels in de koelkast tot stand komt.
==Benodigdheden==
*1 groot {{Kb|ei}}
*250 gram {{Kb|p=boter|boter}} of plantaardige margarine
*7 à 8 volle eet lepels {{Kb|p=basterdsuiker|witte basterdsuiker}}
*2 afgestreken eet lepels {{Kb|p=cacao|cacaopoeder}}
*± 250 gram {{Kb|p=Koekjes|droge koekjes}}
*{{Kb|poedersuiker}}
==Bereidingswijze==
#Doe de witte basterdsuiker in een grote beslagschaal.
#Doe de cacao er bij evenals het ei en roer dit goed door.
#Smelt vervolgens de boter en voeg dit toe aan het beslag.
#Goed roeren.
#Breek/kruimel de koekjes tot kleine stukjes.
#Doe de koekjes bij het beslag en goed roeren zodat al de koekjes goed bruin zijn.
#Zet het vervolgens even in de koelkast en haal het er na ± 15 min uit.
#Doe het dan op een groot bord en maak er een krans van.
#Strooi er poedersuiker overheen.
#In de koelkast, en laten staan tot hij hard en koud is en je de cake goed kunt snijden.
==Bewaren==
* Aangezien er een rauw ei in het beslag zit, dat niet, zoals in andere taarten wordt verhit in de oven, is de bewaartermijn zeer kort.
{{Navigatie recepten}}
[[Categorie:Taart|Chocolade taart]]
{{Sub}}
fx794ie020ll9pv1gr2tltp9ioomgca
Kookboek/Zweedse gehaktballetjes
0
15222
428043
408377
2026-05-20T05:22:15Z
Erik Baas
2193
lf
428043
wikitext
text/x-wiki
{{Infobox recept
| Naam = Zweedse Gehaktballetjes
| Afbeelding=[[Afbeelding:1-Main4.jpg|300px]]
| Afb1Omschr = Zweedse Gehaktballetjes
| Categorie = Vleesrecept
| Porties = 4 personen
| Energie =
| Tijd =
| Stippen = 2
}}
Zweedse gehaktballetjes (Zweeds: Köttbullar) zijn kleine balletjes van rundergehakt met daarbij vaak geserveerd de bruine roomsaus en de cranberry compote. In Zweden is dit gerecht uitermate populair en is ook bij elke snackbar te krijgen.
== Benodigdheden ==
=== Het boodschappenlijstje ===
* ong. 500 gram {{Kb|gehakt}}
* {{Kb|paneermeel}}
* 1 gekookte {{Kb|aardappel}}
* 1 {{Kb|ui}}
* 1 {{Kb|ei}}
* 2.5 dl. {{Kb|room}}
* peterselie
* boter
* olijfolie
* Zweedse Kruiden Mix (engelwortel, zedoarewortel, alsem, manna, senna, theriac, distel, mirre, rabarberwortel, kamfer en saffraan <ref>[https://nl.pit-pit.com/products/zweedse-kruiden Zweedse kruiden van Pit-Pit.com]</ref>)
* Lyngonsylt (Cramberry Compote)
=== Keukengerei ===
* Braad- of koekenpan
* Schaal
* Spatel
* Vershoudfolie
* Grote kom
* Mes
* Eetlepel
== Bereidingswijze ==
* Verhit in de braad- of koekenpan een klontje boter. Snipper vervolgens de ui en fruit die in de boter glanzig.
* Als de ui klaar is doet u deze in een grote kom en doet u daar verder bij: het gehakt, de aardappel (geprakt), een flinke lepel paneermeel, 1/2 dl. room, het ei, de peterselie, een scheutje Zweedse Kruiden Mix, en wat peper en zout.
* Kneed al deze ingrediënten samen tot een goed gemengd stevig en egaal vleesdeeg.
* Maak van het vleesdeeg kleine balletjes met circa 3 centimeter doorsnede.
* Leg alle balletjes in een grote schaal en dek deze af met de vershoudfolie. Zet de balletjes ongeveer een kwartier in de koelkast, zodat het vlees zich goed kan hechten.
* verhit 1 eetlepel olijfolie en een klontje boter in de braad of koekenpan.
* Bak hierin alle balletjes bruin en gaar in zo'n 12-15 minuten. U moet wel de balletjes regelmatig draaien en af en toe wat jus er over heen gieten.
* Neem de balletjes uit de pan en houd deze goed warm.
* Giet het braadvet uit de pan. Roer het aanbaksel dat in de pan is achtergebleven los met de overgebleven 2 dl. room.
* Laat de roomsaus op een zacht vuurtje indikken.
* Leg de balletjes op een bord, en giet de saus over de balletjes heen, serveer de balletjes met wat lyngonsylt (Cranberry Compote) erbij.
''Smaklig Maltid'' (Smakelijk Eten)
== Bronnen en referenties ==
<references />
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Vleesrecept|Zweedse]]
[[Categorie:Snack|Zweedse]]
qajvb991nifzni4w5g39ugpw9vwdj0a
Programmeren in TI-Basic/Linkpoort
0
15252
428189
424388
2026-05-20T05:37:52Z
Erik Baas
2193
lf
428189
wikitext
text/x-wiki
{{Index Programmeren in TI-Basic}}Dit hoofdstuk gaat over de linkpoort(en) op een TI GR.
We maken allereerst onderscheid tussen een TI-83(+) en een TI-84 (+)(SE). De TI-83 heeft slechts één poort op de GR zitten. Dit is een I/O - poort, waar een snoer met jack-plug ingestoken moet worden. De TI-84 heeft daarnaast ook een kleine usb-poort.
== Algemeen ==
Allereerst een waarschuwing. Stel je bij het programmeren niet teveel voor van het gebruik van de volgende functies. Ze zijn net zo langzaam als wanneer je normaal gesproken via het <code>[2nd][link]</code> menu een variabele zou versturen. Daarnaast moet de andere rekenmachine in pauzestand stand staan. Dit kan bijvoorbeeld via <code>Pauze (var)</code> of <code>Input "TEKST",(var)</code>. Wanneer de andere rekenmachine niet gepauzeerd is gedurende de overdracht, kan het programmatje crashen, maar vaker gebeurt het dat de variabele niet verstuurd wordt. Omdat de gebruiker van de andere rekenmachine per definitie onberekenbaar is (en zomaar pauze weg kan drukken), kan je beter niet proberen via kabels gegevens versturen.
Onder de volgende kopjes bestuderen we de volgende functies:
* <code>Send(</code>
* <code>Get(</code>
* <code>GetCalc(</code>
== Aan de slag ==
Maar goed, je hebt een GR en wil via een programmaatje iets versturen naar een andere rekenmachine. Dit kan al niet... Hoewel de optie <code>Send(</code> doet vermoeden dat je een variabele kan versturen, kan alleen een CBL 2 of een CBR er mee overweg <ref>[https://education.ti.com/educationportal/sites/US/productDetail/us_cbl_cbr_83_84.html Applicatie] voor gebruik met deze twee 'sensoren'-systemen</ref>
De functie <code>Get(</code> heeft hetzelfde probleem. Ook hier kan je alleen gegevens ophalen van een CBL 2 of een CBR-systeem.
Het is alleen mogelijk om gegevens op te halen van een andere rekenmachine via de optie <code>GetCalc(</code>. Het gebruik van deze functie is vrij simpel. Door de functie aan te roepen met een variabele, zal de rekenmachine proberen die variabele van de anderen rekenmachine op te halen. Dit lukt alleen maar als de andere rekenmachine in de pauze-stand staat en blijft staan ([[#Algemeen|Zie hier]]). Wanneer de rekenmachine klaar is met het ophalen van de door jou gekozen variabele, zal deze doorgaan met het uitvoeren van de rest van de code.
:Gebruik: <code>GetCalc(var)</code>
'''TI 84+:''' Omdat de TI-84+ twee poorten heeft, kan deze ook gebruik maken van de port-flags. <code>GetCalc(var, portflag)</code> zal proberen var op te halen via portflag (opgegeven poort).
Er zijn dan drie mogelijkheden:
<br>0. Probeer var op te halen via de usb-poort, mits deze is aangesloten. Anders probeert de rekenmachine het nogmaals op de I/O-poort. (dit is de standaard portflag, dus maak je niet druk).
<br>1. Gebruik de usb-poort. Als deze niet is aangesloten, zal de variabele niet worden opgehaald.
<br>2. Gebruik de I/O-poort. Als deze niet is aangesloten, zal de variabele niet worden opgehaald.
Zodoende kan je dus ook twee of meer rekenmachines aansluiten via I/O en usb-poorten... Voor de programmeur wordt het dan wel erg lastig om alle dingen op een rijtje te zetten....
== Voorbeeld ==
Huh, wat, een voorbeeld? Dit spreekt toch voor zich? Nou goed dan, een klein voorbeeldje van een klein chat-programma (overigens zonder stopscript)
<pre>
PROGRAM:TALK
:""->Str1
:""->Str2
:""->Str3
:""->Str4
:Repeat max({A,A}={1,2 //Door 1 of 2 in te voeren, komt hier {1,0} of {0,1} uit (max = 1)
:Input "Calc num (1/2)",A
:End
:While A=1
:Input "C1:",Str1
:GetCalc(Str3
:If Str3 =/= Str4:Then //Als hetgene wat opgehaald is hetzelfde is als wat
:Str3 -> Str4 //wat er al stond, is het nutteloos dat weer te geven
:Disp("C2:",Str3
:End
:End //EINDE 1STE CALC
:While A=2
:Input "C2:",Str3
:GetCalc(Str1
:If Str1 =/= Str2:Then
:Str1 -> Str2
:Disp("C1:",Str1
:End
:End //EINDE 2DE CALC
:
:"BY SUMURAI8 //Deze code zal nooit worden uitgevoerd
</pre>
Merk bij dit voorbeeld op dat als je 2x iets snel na elkaar zegt, de kans HEEL groot is dat de ander je eerste tekst nooit zal zien. Een oplossing is om elke 30 seconde een spatie naar de ander te sturen...
== Referenties ==
<references/>
{{Bladeren2
|Boek=Programmeren in TI-Basic
|vorige=Programmeertips
|huidige=Link poort
|volgende=Veelgebruikte codes
}}
{{Sub}}
3e0gbljr4chv0nzjmzke2fpa5opxrma
Kookboek/Mandarijntaart
0
15379
428050
395325
2026-05-20T05:22:20Z
Erik Baas
2193
lf
428050
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Mandarijntaart
| Categorie = Cake, gebak en taart
| Porties = 6 tot 8 personen
| Energie =
| Tijd =
| Stippen =
}}
[[Kookboek/Cake, gebak en taart|Cake, gebak en taart]] | [[Kookboek/Recepten|Receptenindex]]
==Ingrediënten==
*1 pakje uitgerold kruimeldeeg
*2 bokalen mandarijntjes ( 350 g stuk )
*6 boudoir koekjes
*500 g {{Kb|mascarpone}}
*3 eieren
*100 g + 3 eetlepels suiker
*2 zakjes vanillesuiker
*40 g bloem
*1 à 2 eetlepels limoensap
*4 cm verse {{Kb|gember}}
==Voorbereiding==
*verkruimel de boudoirkoekjes
*rasp de ongepelde gember, druk door zeef zodat u 1 à 2 eetlepels sap bekomt
*laat de mandarijnpartjes uitlekken
==Bereidingswijze==
Schik het deeg in de bakvorm (diameter 30 cm, hoogte 4 cm). Prik er enkele keren in met een vork. Strooi er de verkruimelde boudoirkoekjes over.
Meng de mascarpone, de eieren, de bloem, 100 gram suiker, de vanillesuiker en het limoen- en gembersap goed dooreen.
Bedek het deeg met het mascarponemengsel. Verdeel er de mandarijnpartjes over.
Bak de taart in een voorverwarmde oven op 200 graden Celsius, controleer na 30 minuten of de taart al goed is uitgebakken. Prik daarvoor met een mes in de taart, als er niet veel blijft plakken aan het mes is de taart klaar. Zo niet, laat de taart dan nog 5 à 10 minuten langer in de oven bakken.
Strooi er vervolgens 2 à 3 eetlepels suiker over en laat nog 5 minuten kleuren. De mascarponecrème moet goed gestold zijn.
==Kooktip==
*Vervang de mandarijntjes door ananas
*Voor liefhebbers: parfumeer de mascarponecrème met 2 à 3 eetlepels Mandarin Napoleon
Smakelijk!!
{{Navigatie recepten}}
[[Categorie:Taart|Mandarijnt]]
{{Sub}}
o0c6blhhno51jhpyb59nmipv62iayv6
Kookboek/Gekookte spruitjes
0
15897
428049
410644
2026-05-20T05:22:18Z
Erik Baas
2193
lf
428049
wikitext
text/x-wiki
{{Infobox recept
|Naam=Gekookte spruitjes
|Afbeelding=[[Bestand:Spruitjes met nootmuskaat 2025.jpg|300px|Spruitjes als deel van een menu]]
|Onderschrift=Gekookte spruitjes met nootmuskaat
|Categorie=Groentenrecept
|Porties=4
|Energie=
|Tijd= 45 minuten
|Stippen=2
}}
[[Kookboek/Nederlandse keuken|Nederlandse keuken]] | [[Kookboek/Recepten|Receptenindex]]
==Ingrediënten==
* ongeveer 1 kg {{Kb|p=spruitkool|spruitjes}}
* [[Kookboek/Zout|zout]]
* eventueel [[Kookboek/Nootmuskaat|nootmuskaat]]
==Bereidingswijze==
*Spruitjes schoonmaken door de buitenste bladeren te verwijderen en een stukje van de stronk af te snijden
*Snij met het mes een kruisje boven in de stronk, dan is de kooktijd korter
*Spruitjes in de pan en doe er water bij tot de spruitjes net beginnen te drijven
*Doe er zout bij en breng ze aan de kook. Afhankelijk van de grootte zijn ze na 10 tot 15 minuten klaar.
*Bepaal de gaarheid door erin te prikken met een vork of er eentje uit te nemen en door te snijden.
==Variaties en tips==
*Spruitjes gaan goed samen met gekookte [[Kookboek/Aardappel|aardappelen]] of aardappelpuree, en met vlees of een [[Kookboek/Gebakken kaas|gebakken kaasplak]].
*Strooi nootmuskaat of [[Kookboek/Kruidenmengsel voor Hollandse groente|kruidenmengsel voor Hollandse groente]] over de spruitjes.
* Serveer spruitjes met bijvoorbeeld [[Kookboek/Mayonaise|mayonaise]].
* Schep geraspte kaas en/of ham in blokjes door de gekookte spruitjes.
* Serveer met een bloemkool-, kerrie- of kaassausje erover (zie [[Kookboek/Saus met roux#Varianten|Saus met roux]]).
* Serveer met ± 250 g gebakken champignons.
* Voor 500 g pittige spruitjes: Fruit 1 fijngeperst knoflookteentje in 2 eetlepels plantaardige olie (in een wok of hapjespan). Voeg 1 eetlepel sambal toe en 3 in ringetjes gesneden bosui, en laat die 1 minuutje meefruiten. Voeg dan de zojuist gekookte en afgegoten spruitjes toe, schep die 1 minuut op een hoog vuur om.
{{Sub}}
{{Navigatie recepten}}
{{Tuinkalender|Spruitkool|spruitkool}}
[[Categorie:Groentenrecept|Spruitjes]]
[[Categorie:Nederlandse keuken|Spruitjes]]
50du3b1qqbuc3mrn2fkalqstrk8j7yd
Kookboek/Spruitjes met spek en ui
0
15899
428046
405358
2026-05-20T05:22:16Z
Erik Baas
2193
lf
428046
wikitext
text/x-wiki
{{Infobox recept
|Naam=Spruitjes met spek en ui
|Afbeelding= [[Bestand:Brussels & Bacon.jpg|300px]]
|Categorie=Groentenrecept
|Porties=4
|Energie=
|Tijd= 45 tot 60 minuten
|Stippen=3
}}
[[Kookboek/Nederlandse keuken|Nederlandse keuken]] | [[Kookboek/Recepten|Receptenindex]]
==Ingrediënten==
* ongeveer 1 kg {{Kb|p=spruitkool|spruitjes}}
* 100 tot 200 g klein gesneden {{Kb|spek}}, zoals bijvoorbeeld ontbijtspek (reepjes of heel kleine dobbelsteentjes)
* een {{Kb|p=ui|uitje}}
* [[Kookboek/Boter|boter]]
==Bereidingswijze==
*Spruitjes schoonmaken door de buitenste bladeren te verwijderen en een stukje van de stronk afsnijden
*Spruitjes in de pan en doe er water bij tot de spruitjes net beginnen te drijven
*Doe er zout bij en breng aan de kook, kook ze 10 minuten
*Giet de spruitjes af
*Versnipper de ui en snijd het spek klein
*Smelt boter in een braadpan of wok
*Ui en spek licht aanbraden, goudgeel.
*Doe de spruitjes erbij en roer het door, eventueel nog wat nagaren.
Serveer met aardappelen en vlees of vegaproduct.
== Varianten ==
* Voeg 200 g {{Kb|p=feta|fetakaas}} toe op het eind, in blokjes gesneden. Dan is geen extra vlees nodig.
{{Tuinkalender|Spruitkool|spruitkool}}
{{Navigatie recepten}}
[[Categorie:Groentenrecept|Spruitjes met spek]]
[[Categorie:Nederlandse keuken|Spruitjes met spek]]
{{Sub}}
f6yshtwfxc5oclh4cv8rpmpaz9hofv5
Kookboek/Balsamico-vinaigrette
0
17832
428044
400963
2026-05-20T05:22:15Z
Erik Baas
2193
lf
428044
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/balsamico-vinaigrette
| Categorie = dressing
| Porties = 1
| Energie =
| Tijd = 5 minuten
| Stippen = 1
}}
==Ingrediënten==
* 3 eetlepels {{Kb|olijfolie}}
* 1 eetlepel balsamico-azijn
* 1 koffielepel honing
* peper en zout naar smaak
==Bereidingswijze==
Doe alle ingrediënten in een shaker en schud goed. Als je geen shaker hebt kan je het evengoed in een kommetje doen en kloppen met een vork of garde. Het resultaat is minder homogeen maar even lekker.
Lekker bij een slaatje met geitenkaas, appel en spek.
{{Navigatie recepten}}
[[Categorie:Saus|Balsamico-vinaigrette]]
{{Sub}}
q61mip5bnun5zb2ynupjie6ymkf6z77
Kookboek/Zopie
0
18026
428045
404968
2026-05-20T05:22:16Z
Erik Baas
2193
lf
428045
wikitext
text/x-wiki
{{Infobox recept
| Naam = Kookboek/Zopie
| Categorie = Drank
| Porties = 5
| Energie =
| Tijd = 30 minuten
| Stippen =
}}
[[Bestand:Ijstentjes op de Gouwzee bij Monnikendam PK-T-AW-4051, PK-T-AW-4050.tiff|thumb|292px|Koek-en-zopie op de Gouwzee bij Monnickendam (Nicolaas van der Waay, 1890)]]
[[Kookboek/Drank|Overzicht van beschreven drankrecepten]]<br>
<br>
'''Zopie''' is een alcoholhoudende warme drank die van oudsher tijdens het schaatsen wordt genuttigd. Bekend van de ''koek en zopie'' stalletjes op het ijs. Tegenwoordig worden onder de naam zopie ook andere warme dranken zoals chocolademelk (eventueel met rum), of erwtensoep aangeboden.
==Ingrediënten==
*1 liter {{Kb|p=bier|bokbier}}
*1 pijpje {{Kb|kaneel}}
*2 {{Kb|p=kruidnagel|kruidnagels}}
*2 plakjes [[Kookboek/Citroen|citroen]]
*125 gram bruine {{Kb|basterdsuiker}}
*2 {{Kb|p=ei|eieren}}
*1 dl {{Kb|rum}}
==Bereidingswijze==
Breng het bier aan de kook samen met het pijpje kaneel, kruidnagels en citroen. Laat het geheel dan ongeveer 20 minuten op een zeer zacht pitje doortrekken.<br>
Roer de suiker met de eieren los en bind hier het bier mee. Voeg op het laatst de rum toe.
Heet drinken!
{{Sub}}
{{Navigatie recepten}}
{{Wikipedia|Pagina=Koek-en-zopie|Naam=Koek-en-zopie}}
[[Categorie:Drank|Zopie]]
2jk5ks8vhykznz7it7ugx1cbwq276u0
Kookboek/Hete bliksem
0
18054
428048
408946
2026-05-20T05:22:16Z
Erik Baas
2193
lf
428048
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding = [[Bestand:Himmel-und-Erde-01.jpg|300px]]
| Onderschrift = Hete bliksem met gebraden worstjes
| Categorie =
| Porties = 4
| Energie =
| Tijd = ±45 min
| Stippen =
}}
== Ingrediënten ==
*1,5 kg {{Kb|p=aardappel|aardappelen}}
*500 gr zure {{Kb|p=appel|appelen}}
*250 gr zoete appelen
*125 gr magere {{Kb|p=spek|spekblokjes}}
*2 uien
*2 dl water
*evt azijn
== Bereidingswijze ==
*Schil de aardappelen, was ze en breng ze aan de kook in een pan met 2 dl water en wat zout. De appels [[Kookboek/Schillen|schillen]], in vieren delen en de klokhuizen verwijderen. Als de aardappelen 20 minuten hebben gekookt, leg je de appels er bovenop. Laat dit nog 10 minuten koken.
*Bak het spek uit. Maak de uien schoon, snijd ze in ringen en voeg ze bij het spek. Bak de uien goudgeel.
*Giet de aardappelen en appels af, vang het kookvocht op. Stamp de aardappelen en appels door elkaar. Giet er een scheutje van het kookvocht bij. Op smaak brengen met iets azijn.
*Leg de blokjes spek met de ringen ui er bovenop.
*Lekker met bloedworst, [[Kookboek/Braadworst|braadworst]] of baklever.
== Varianten ==
* Vervang het spek door blauwaderkaas en grofgehakte pecannoten.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Aardappelrecept|Hete bliksem]]
[[Categorie:Appelrecept|Hete bliksem]]
fsvea9v8h6z26sf9c5ikh5n72vxs7pe
Kookboek/Champignons als bijgerecht en groentegerecht
0
18195
428052
402760
2026-05-20T05:26:07Z
Erik Baas
2193
lf
428052
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Pieczarki duszone.jpg|300px]]
| Onderschrift =
| Categorie = Bijgerecht
| Porties = 8 (bijgerecht) / 4 (groentegerecht)
| Energie =
| Tijd = ± 25 minuten
| Stippen = 3
}}
==Ingrediënten==
* 1 kg {{Kb|p=champignon|champignons}} (of andere paddenstoelen)
* een kleine gesnipperde ui
* 40 gr {{Kb|boter}}
* 50 gr {{Kb|bloem}}
* c.a 150 ml {{Kb|bouillon}} (evt van een blokje)
* Een bekertje {{Kb|crème fraîche}}
* Fijngehakte verse (liefst Franse!) {{Kb|dragon}}
* Peper, Zout
* Nootmuskaat
==Bereidingswijze==
* Snij de paddenstoelen in vieren
* Fruit de fijngehakte ui aan in de boter
* Smoor de paddenstoelen met de ui in een paar minuten gaar
* Schep de ui en de paddenstoelen uit de pan
* Voeg de bloem aan de overgebleven boter toe (evt wat extra boter toevoegen) en maak er een [[Kookboek/Roux|roux]] van
* Blus het af met een scheutje bouillon en roer goed zodat er geen klontjes ontstaan
* Voeg de paddenstoelen, de fijngehakte dragon, en de créme fráiche aan het mengsel toe, en laat het nog even zachtjes doorkoken
* Breng het geheel op smaak met wat peper, zout, en nootmuskaat, en voeg voor de gewenste dikte e.v.t nog wat bouillon toe, of laat het wat inkoken.
==Toepassingen==
Serveer dit als bijgerecht bij wild, varkenshaas, of rood vlees, in combinatie met b.v. een frisse salade, gebakken aardappelen, frietjes of puree.
==Trivia==
* Veel aangeboden verse Dragon is Russische, deze smaakt eerder naar gras, dan naar dragon, liever niet gebruiken dus!
* Dragon combineert heel goed met paddenstoelen!
{{Navigatie recepten}}
[[Categorie:Bijgerecht|Champignons]]
[[Categorie:Groentenrecept|Champignons]]
{{Sub}}
jr2dfuemac5uwtypz22hpdwb9wd216i
Kookboek/Surinaamse nasi
0
18461
428056
401049
2026-05-20T05:26:11Z
Erik Baas
2193
lf
428056
wikitext
text/x-wiki
__NOTOC__
{{Infobox recept
|Naam=
|Afbeelding=[[Afbeelding:Nasi Goreng Trafasie.JPG|300px|Surinaamse nasi]]
|Categorie=Rijstrecept
|Porties=4 tot 5 personen
|Energie=
|Tijd=35 minuten<br>(aantal uren marineren)
|Stippen=3
}}
'''[[Kookboek/Surinaamse keuken|Surinaamse]] [[Kookboek/Nasi|nasi]] ''' (inheemse naam: ''Nasi Goreng Trafasie'') is met de komst van de Javanen uit Indonesië naar Suriname gebracht. Door het gebruik van specifieke Surinaamse kruiden en specerijen en door de invloeden van de andere Surinaamse bevolkingsgroepen is deze typische nasi ontwikkeld.
== Ingrediënten ==
* 3 {{Kb|p=ei|eieren}}
* 1 gesneden stengel {{Kb|prei}}
* 1 pot Surinaamse nasi, roerbakmix
* 400 gram {{Kb|p=rijst|Basmatirijst}}
* 500 gram {{Kb|p=kip|kipfilet}}
* [[Kookboek/Olie|zonnebloemolie]]
* 75 gram [[Kookboek/Julienne snijden|julienne]] {{Kb|wortel}}
* 1 pot Surinaamse marinade voor rode kip
* ½ - 1 theelepel Surinaamse {{Kb|trassi}} (garnalenpasta)
== Bereidingswijze ==
# Marineer 400 gram kipfilet volgens gebruiksaanwijzing op de verpakking. Het vlees kan ook een dag van tevoren worden gemarineerd.
# Bak de gemarineerde kipfilets tot ze gaar zijn. Let op: door de suiker in de marinade kan deze snel verbranden.
# Kook de rijst volgens de gebruiksaanwijzing op de verpakking.
# Roerbak de eieren enkele minuten in 3 eetlepels hete olie, daarna afscheppen.
# Verhit olie en bak 100 gram in blokjes gesneden kipfilet enkele minuten bakken tot het gaar is.
# Voeg de roerbak kruidenmix, trassi, juliennewortel en stukjes prei toe, en roerbak het geheel nog 5 minuten.
# Voeg de gekookte rijst toe, en het geheel 5 minuten opbakken onder voortdurend omscheppen
# De laatste minuut de eieren toevoegen en weer goed omscheppen.
== Serveertip ==
Serveren met gebakken banaan en zuurgoed. Schenk wat van de saus over het gerecht.
== Variatietip ==
Probeer deze nasi eens zonder de trassi voor een mildere smaak.
Varieer met andere Surinaamse marinades zoals marinade voor Hindoestaanse masalakip.
Voeg aan de overgebleven rode saus naar smaak boter, rum en peper toe; hierna het geheel, onder voortdurend roeren, enkele minuten opkoken.
{{Bron|bronvermelding=
* Dit recept is vrijgegeven onder de GFDL en CC-BY-SA. Het origineel kan op de website [https://www.surinaamseten.nl/showrec.php?IDREC=36 Surinaams Eten] gevonden worden.
}}
{{Navigatie recepten}}
[[Categorie:Surinaamse keuken|Surinaamse nasi]]
[[Categorie:Rijstrecept|Surinaamse nasi]]
{{Sub}}
nn5we7cl9j7tw99gy6wg7yvxu9wpphy
Kookboek/Muffins
0
19314
428057
395291
2026-05-20T05:26:11Z
Erik Baas
2193
lf
428057
wikitext
text/x-wiki
{{Infobox recept
|
| Afbeelding = [[Bestand:Chocolate Muffins (4671682706).jpg|300px]]
| Naam = Kookboek/muffins
| Categorie = dessert
| Porties = ? (6)
| Energie = 1
| Tijd = 20 min
| Stippen = 3
}}
== Benodigdheden ==
# 100 gr fondant of {{Kb|p=chocolade|melkchocolade}}
# 100 gr boter
# 4 {{Kb|p=ei|eieren}}
# 15 gr tafelsuiker
# 150 gr zelfrijzende{{Kb|bloem}}
# 60 gr {{Kb|p=cacao|cacaopoeder}}
==Bereiding==
# Verwarm de oven voor op 175°C.
# Laat de chocolade en boter au bain marie smelten.
# Roer de eieren, bloem, suiker en cacaopoeder om tot een egaal deegje. Voeg de gesmolten boter en chocolade toe en roer alles nogmaals goen om.
# Verdeel het deeg over de ramekins of muffin tray en plaats gedurende 17 minuten in de voorverwarmde oven.
# Haal uit en laat 10 minuten rusten voor ze uit hun vormpjes te halen.
== Extra ==
Bestuif ze met cacaopoeder, poedersuiker of napeer de muffins met gesmolten pure chocolade
{{Navigatie recepten}}
[[Categorie:Gebakje|Muffins]]
{{Sub}}
dw8krg5d1kfd9gg7kf990meai09l5o0
Kookboek/Hazelnootpasta
0
19354
428058
398867
2026-05-20T05:26:13Z
Erik Baas
2193
lf
428058
wikitext
text/x-wiki
{{Infobox recept
|Naam=Hazelnootpasta(pasta)
|Afbeelding=[[Bestand:Homemade nutella - chocolate and hazelnut cream (KETO, LCHF, Low Carb, Gluten free, FIT).jpg|300px]]
|Categorie=Broodbeleg
|Porties=± 500 gram
|Energie=
|Tijd=30 minuten
|Stippen=2
}}
[[Kookboek/Beleg|Belegrecepten]] | [[Kookboek/Recepten|Receptenindex]]
Hazelnootpasta is heerlijk om op de boterham te smeren! Door de pasta zelf te maken, kun je het recept naar eigen smaak aanpassen.
==Ingrediënten==
*200 g {{Kb|p=hazelnoot|hazelnoten}} (gebruik ''ongezouten'' noten!)
*200 g {{Kb|chocolade}}
*100 g {{Kb|boter}}
*1 blik {{Kb|gecondenseerde melk}}
==Bereidingswijze==
Maal de hazelnoten machinaal fijn, totdat de olie vrijkomt en er een pasta ontstaat.
Smelt de chocolade [[Kookboek/Au bain-marie|au bain-marie]], samen met de boter. Laat niet koken of verbranden! Meng van het vuur af de notenpasta en de gecondenseerde melk door de chocolade. Alles stevig mengen en in potje(s) gieten.
==Variaties==
In plaats van au bain-marie kun je ook met de magnetron werken op laag vermogen. Let op: de chocolade ziet er gesmolten precies hetzelfde uit als voorheen: pas als je erdoor roert, voel je dat het zacht geworden is.
Naar smaak kun je er natuurlijk ook wat suiker aan toe voegen.
== Zie ook ==
* [[Kookboek/Chocoladepasta]]
{{Navigatie recepten}}
[[Categorie:Zoet broodbeleg|Choco]]
[[Categorie:Chocoladerecept|Pasta]]
{{Sub}}
i4cnxrikj3j5rcfia37av9p3liyhmaw
Kookboek/Gemarineerde olijven
0
19368
428053
397127
2026-05-20T05:26:07Z
Erik Baas
2193
lf
428053
wikitext
text/x-wiki
[[Bestand:Tapa aceitunas.JPG|thumb|300px|Gemarineerde olijven]]
Dit is een recept voor pittig '''gemarineerde olijven''', een aperitiefhapje.
==Ingrediënten==
* 500g {{Kb|p=olijf|olijven}}, zwarte of groene
* {{Kb|olijfolie}} type virgem extra
* grof [[Kookboek/Zout|zeezout]]
* [[Kookboek/Peper|peper]] uit de molen
* 1 soeplepel {{Kb|oregano}}
* 4 teentjes {{Kb|knoflook}}
* 2 {{Kb|p=Laurier|laurierblaadjes}}
* 4 [[Kookboek/Pili pili|pili pili]] (chilipeper)
* mineraalwater
==Bereiding==
* Overgiet de olijven met een beetje mineraalwater en ruim met olijfolie tot ze onderstaan.
* Snij de knoflook in schijfjes en maal ruim peper erover.
* Voeg de oregano, de pili pili, het zeezout en de laurier toe.
* Meng alles en laat het een paar dagen intrekken.
{{Navigatie recepten}}
[[Categorie:Spaanse keuken|Gemarineerde olijven]]
[[Categorie:Italiaanse keuken|Gemarineerde olijven]]
[[Categorie:Griekse keuken|Gemarineerde olijven]]
[[Categorie:Tapasrecept|Gemarineerde olijven]]
{{Sub}}
e1vejqut188avizj0dpsm7506qehq2h
Kookboek/Ovenschotel van fusili en kaas
0
19634
428054
410864
2026-05-20T05:26:09Z
Erik Baas
2193
lf
428054
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Ovenschotel van fusilli en kaas
| Afbeelding = [[Bestand:Auflauf Kohlrabi Schinken01.jpg|300px]]
| Categorie = ovenschotel
| Porties = 4
| Energie =
| Tijd = 60 minuten
| Stippen =
}}
==Ingrediënten==
*250 gram {{Kb|p=pasta|fusili}} (of macaroni of een andere kleine pastasoort)
*150 gram {{Kb|p=ham|achterham}} (dikke plak, in blokjes gesneden)
*1 mini-blikje {{Kb|p=doperwt|doperwten}}
*1 eetlepel [[Kookboek/Bloem|bloem]]
*2 sneetjes witbrood, licht geroosterd, de korstjes eraf, in blokjes van 2 cm gesneden
*250 gram {{Kb|p=kaas|belegen Goudse of Pardanokaas, geraspt}}
*bakje {{Kb|p=champignon|champignons}}, schoon en in plakjes gesneden
*2 [[Kookboek/Sjalot|sjalotjes]] (gesnipperd)
*1 theelepel [[Kookboek/Chilipoeder|chilipoeder]]
*2 [[Kookboek/Ei|eierdooiers]]
*kwart liter [[Kookboek/Slagroom|ongeslagen slagroom]]
*50 gram [[Kookboek/Boter|boter]] of [[Kookboek/Margarine|margarine]] in blokjes
*1 eetlepel boter of margarine om de ovenschaal in te vetten
==Bereidingswijze==
# Macaroni al dente gaar koken.
# De doperwten afgieten.
# De champignons op hoog vuur in ca. 2 minuten aanzetten in een eetlepel olie of in een klontje boter, dan uit de pan nemen. Doe ze in een zeef of vergiet, zodat ze wat vocht kwijtraken.
# Pan schoonmaken, weer klontje (75 g) boter erin en de sjalotten (of een halve ui) even aanzetten, maar niet bruin laten worden. De eetlepel bloem erbij, en roeren. De room er in één keer bij kiepen en blijven roeren tot het een homogene massa wordt. In het begin ziet het er niet uit, maar het werkt wel, het wordt echt zonder klonten! Als je van iets meer zout houdt, meng je er hier een verkruimeld kippen- of groentebouillontablet bij. Vuur uit. En dan pas de twee eierdooiers erdoor. De eiwitten worden in dit recept niet gebruikt. Zonodig op smaak brengen met zout, peper en chilipoeder.
#Alle ingrediënten (behalve het brood) met de helft van de kaas mengen en in een grote, maar niet te diepe, en ingevette ovenschaal doen. Rest van de kaas erover verdelen. Daarop de broodblokjes verdelen. Verdeel de in klontjes gesneden boter tussen de broodblokjes.
===In de oven: ===
* Nog warme ingrediënten? Oven op 175 graden, 20-25 minuten.
* Uit de koelkast 150 graden, 45 minuten.
* De rest de volgende dag gebruiken? Kaas vervangen door nieuwe en weer in de oven volgens eerder schema.
{{Navigatie recepten}}
[[Categorie:Italiaanse keuken]]
[[Categorie:Pastarecept|Ovenschotel]]
[[Categorie:Ovenschotel|Fusili]]
{{Sub}}
e076f4ugdrno2l29bvratgy5drp94u6
Meten en onzekerheid/Onderzoek
0
20124
428219
409745
2026-05-20T06:11:44Z
Erik Baas
2193
lf
428219
wikitext
text/x-wiki
{{Meten en onzekerheid}}__NOTOC__
=1. Onderzoek=
Het onderwerp van dit boek is ''meten''. Meten is echter geen op zichzelf staande activiteit. Om meer inzicht en begrip te krijgen over het hoe, wat en waarom van ''meten'', moeten we begrijpen wat de rol van meten is in het totale onderzoeksproces.
Waarom doen we eigenlijk onderzoek? Onderzoek kan verschillende doelen dienen: van het verkrijgen van een fundamentele kennis over de natuurwetten tot het oplossen van alledaagse problemen. Hoewel het fundamentele onderzoek veel aandacht krijgt, juist omdat het tot algemeen toepasbare inzichten kan leiden, heeft het merendeel van de metingen die worden verricht allereerst een praktisch doel. Denk bijvoorbeeld aan {{Wp|meteorologie|meteorologische}} waarnemingen die direct worden gebruikt door de luchtvaart en landbouw en aan de {{Wp|landmeetkunde|landmetingen}} die worden gedaan om bij bouwwerken de juiste plaats, hoogte en afmetingen te bepalen. Soms kunnen echter dit soort waarnemingen ook worden gebruikt voor meer theoriegericht onderzoek. De specifieke methodologische vraagstukken die die samenhangen met theoriegericht onderzoek, zoals het vraagstuk van voldoende controle in de onderzoeksopzet, vallen echter buiten het bestek van dit boek. De geïnteresseerde lezer wordt hiervoor verwezen naar de bestaande literatuur over onderzoeksmethodologie.
In dit hoofdstuk gaan we eerst nader in op de vraag ''wat is onderzoek?'' in relatie tot de vraag ''wat is wetenschap?'' Vervolgens gaan we verder in op de vraag ''waarom doen we onderzoek?'' Op basis daarvan verkennen we de verschillen tussen soorten onderzoek en introduceren we een casus als voorbeeld. Ten slotte komen we kort terug op de vraag ''wat is meten?''
==Wat is onderzoek?==
Onderzoek is de zorgvuldige, systematische en geduldige studie van een bepaald kennisgebied, uitgevoerd om bepaalde feiten of principes te ontdekken of te grondvesten. <ref>Definitie volgens nl.wikipedia, zie [https://nl.wikipedia.org/w/index.php?title=Onderzoek&oldid=17865710] Auteurs: zie [https://nl.wikipedia.org/w/index.php?title=Onderzoek&limit=500&action=history]</ref> In dit hoofdstuk staat de vraag centraal wat ''praktijkgericht onderzoek'' nu precies inhoudt en wat nu de relatie is met ''wetenschappelijk onderzoek''. Daarom behandelt dit hoofdstuk een aantal indelingen in soorten onderzoek en wordt nader ingegaan op het methodisch werken dat één van de kenmerken is van wetenschappelijk onderzoek.
Eerst verkennen we de relatie tussen de begrippen ''onderzoek'' en ''wetenschap''.
===Wetenschappelijk onderzoek===
Het begrip {{Wp|onderzoek|onderzoek}} is nauw gerelateerd aan het begrip {{Wp|wetenschap|wetenschap}}. In boeken over onderzoeksmethodiek wordt eigenlijk altijd expliciet of impliciet uitgegaan van wetenschappelijk onderzoek. De mate waarin onderzoek volgens een doordacht stappenschema wordt opgezet en uitgevoerd, is dan ook één van de kenmerken van wetenschappelijk onderzoek. Toch bestaat er ook niet-wetenschappelijk onderzoek. Hoe onderscheidt wetenschappelijk onderzoek zich eigenlijk van ander onderzoek?
Volgens sommige definities van wetenschappelijk onderzoek mag alleen onderzoek dat leidt tot ''algemene'' kennis over de werkelijkheid wetenschappelijk genoemd worden (zie bijvoorbeeld Brinkman, 2006). Een dergelijke definitie zou echter veel historisch en toegepast geologisch onderzoek diskwalificeren als niet-wetenschappelijk, aangezien veel onderzoek in deze vakgebieden zich bezighoudt met de (geologische) geschiedenis van een specifiek gebied en een specifieke periode.
Een alternatief is om niet-wetenschappelijk onderzoek te onderscheiden van toegepast wetenschappelijk onderzoek door te kijken of de uitvoering ervan voldoet aan de eisen die de {{Wp|wetenschappelijke methode|wetenschappelijke methode}}. De ''wetenschappelijke methode'' is een systematische manier om kennis te vergaren. Zij is gebaseerd op {{Wp|perceptie|waarnemingen}}, {{Wp|meten|metingen}}, {{Wp|voorspelling (wetenschap)|voorspellingen}} en {{Wp|experiment|experimenten}}, welke worden gebruikt om vooraf vastgestelde hypothesen te {{Wp|verificatiebeginsel|verifiëren}} en {{Wp|falsifieerbaarheid|falsificeren}}.
Er zijn verschillende visies op wat de precieze kenmerken zijn van de wetenschappelijke methode. Over een aantal kenmerken is echter redelijke consensus in de literatuur. Wetenschappelijk onderzoek:
*is een min of meer systematische onderzoeksactiviteit met een duidelijk doel
*is meer dan alleen gegevens verzamelen, maar omvat ook het interpreteren van deze gegevens
*bouwt voort op eerdere op wetenschappelijke wijze vergaarde kennis
Wat nu precies wetenschap is en wat de basis is van de wetenschappelijke methode, wordt bestudeerd door de {{Wp|wetenschapsfilosofie|wetenschapsfilosofie}}.
===Uitwerking van de wetenschappelijke methode===
De wetenschappelijke methode houdt in dat de volgende stappen worden doorlopen bij het vergaren van kennis, in de vorm van {{Wp|wetenschappelijk bewijs|wetenschappelijk bewijs}}: <ref>Deze paragraaf is een bewerking van het lemma {{Wp|wetenschappelijke methode|wetenschappelijke methode}} op nl.wikipedia, versie [https://nl.wikipedia.org/w/index.php?title=Wetenschappelijke_methode&oldid=17923927]. Auteurs: Rob Hooft e.a., zie [https://nl.wikipedia.org/w/index.php?title=Wetenschappelijke_methode&action=history]</ref>
#'''Bestudeer''' het fenomeen dat je wilt beschrijven. Verzamel gegevens en doe metingen. De ''wetenschappelijke methode'' vereist hierbij dat iedereen die dat wil de hypothese zelf kan testen, en daarvoor is het noodzakelijk dat ook de waarnemingen, en de ''exacte manier'' waarop die waarnemingen zijn gedaan (en hoe ze kunnen worden herhaald) publiek bekend worden gemaakt.
#'''Denk''' na over je metingen, en verzin een {{Wp|hypothese|hypothese}} die de metingen en andere gegevens kan verklaren. In de ''denk''-stap gebruiken wetenschappers hun creativiteit om een verklaring te verzinnen voor de gemeten fenomenen. Deze verklaring (hypothese) moet echter op basis van onderzoek ontkracht kunnen worden.
#'''Voorspel''' op basis van de hypothese iets dat je nog niet eerder hebt gemeten. Als er geen enkele potentiële waarneming, experiment etc. kan worden verzonnen dat de hypothese kan ontkrachten, is de hypothese misschien ''waar'' maar in elk geval niet ''wetenschappelijk''. Hypothesen worden ook gezien als ''beter'' dan andere hypothesen als ze meer voorspellende kracht hebben, dat wil zeggen als er meer waarnemingen mee kunnen worden verklaard, en er dus meer waarnemingen mogelijk zijn die kunnen bewijzen dat de hypothese niet juist is.
#'''Test''' de voorspellingen door nieuwe metingen uit te voeren. Een goed wetenschappelijk onderzoek moet aan een aantal regels voldoen. Zo moet er zo min mogelijk vrijheid zijn in de interpretatie van de resultaten: vrijheid kan leiden tot ''zien wat men wil zien''. Bovendien is een goed experiment zo opgezet dat beïnvloeding door andere effecten wordt uitgesloten. Bijvoorbeeld bij het testen van de werking van een nieuw medicijn moet worden uitgesloten dat de aandacht die de patiënt van de arts krijgt of het {{Wp|placebo (middel)|placebo-effect}} invloed hebben op de resultaten. Idealiter moet het onderzoek zo beschreven worden dat eenieder die dat wil deze kan herhalen en dus kan controleren. Dit heet ''{{Wp|reproduceerbaarheid|reproduceerbaarheid}}''.
#'''Evalueer''' aan de hand van de meetresultaten of de hypothese juist kan zijn. Elke hypothese moet onmiddellijk worden verworpen als er betrouwbaar kan worden aangetoond dat hij niet altijd geldig is, hoe belangrijk of oud die theorie ook is. Door dit principe is alle wetenschappelijke kennis in beginsel voorlopig: er kan immers op elk moment een nieuwe meting gedaan worden die oude hypothesen omverwerpt. Vorm in zo'n geval een nieuwe hypothese.
Indien deze stappen voortdurend worden herhaald, vormen zij een steeds grotere basis van wetenschappelijk bewijs. De wetenschappelijke methode laat het toe om de stappen in sommige gevallen in een andere volgorde uit te voeren, maar in elk geval moeten alle stappen worden doorlopen. Theoretisch natuurkundigen bedenken soms eerst een totaal nieuwe theorie voordat ze bedenken wat ze willen bekijken; dit heet {{Wp|rationalisme|rationalisme}}, waarbij de hypothese aan het experiment voorafgaat. Het rationalisme staat in tegenstelling tot {{Wp|empirisme|empirisme}}, waarbij de waarnemingen of het experiment aan de hypothese voorafgaan.
===Voorbeeld: waardoor is de boom omgevallen?===
Op een ochtend blijkt dat een boom in je achtertuin is omgevallen die vorige avond nog rechtop stond. Je besluit te onderzoeken waardoor dit is gebeurd.
Een eerste stap is de keuze voor een voor de hand liggende hypothese, die vervolgens kan worden getoetst. Een mogelijke hypothese is ''Deze boom is getroffen door de bliksem''. Een alternatieve hypothese is dat een windstoot de boom heeft omgelegd. Een aanname bij deze hypothesen is dat er sprake is geweest van onweer, danwel weer met harde windstoten. Naast je eigen waarnemingen (wellicht ben je vannacht wakker geworden van onweer) kan deze aanname worden getoetst aan de hand van meteorologische waarnemingen. Ook de theorie dat de boom door olifanten is omgelegd heeft een dergelijke aanname, namelijk dat er afgelopen nacht olifanten in de buurt zijn geweest. Deze aanname ligt echter niet voor de hand als je niet midden in een wildpark met olifanten woont...
Deze voorbeelden hebben met elkaar gemeen dat er slechts één belangrijke aanname aan ten grondslag ligt, een aanname die bovendien ook goed toetsbaar is. Een andere mogelijke hypothese zou zijn dat de boom zou zijn omgelegd door reusachtige buitenaardse wezens die op bezoek kwamen. Deze theorie maakt een flink aantal aannamen onder andere over het bestaan van buitenaardse wezens, het feit dat ze interstellaire reizen kunnen maken, en het feit dat hun biologie het toestaat dat ze zo immens groot worden. Nadeel van een dergelijke hypothese is dat het grote aantal (en ook nog eens lastig te toetsen) aannamen deze onwerkbaar maakt. Bovendien voldoet deze niet aan het principe van ''{{Wp|Ockhams scheermes|Ockham's scheermes}}'' dat een eenvoudige hypothese (met weinig aannamen) die de feiten kan verklaren de voorkeur verdient boven een complexe hypothese ter verklaring van dezelfde feiten.
Stel dat we allereerst de bliksemhypothese gaan onderzoeken. Deze kan o.a. worden getoetst aan de hand van brandsporen op de boom en de registratie van een bliksemontlading op de bliksemradar van het KNMI. Metingen van rukwinden en afwezigheid van sporen van een bliksemontlading kunnen daarbij leiden tot het verwerpen van de bliksemhypothese, ten gunste van een nieuwe hypothese, namelijk dat de boom door een rukwind is omvergeblazen. Deze hypothese kun je weer verder testen door nadere voorspellingen te doen, bijvoorbeeld over de richting waarop de boom gevallen moet zijn.
==Waarom onderzoek?==
In de voorgaande paragraaf hebben we verkend wat onderzoek inhoudt. Er zijn veel verschillende redenen om een onderzoek te doen. Daarbij kunnen we onderscheid maken naar eigenlijke redenen - bijvoorbeeld onderzoek dat tot kennis moet leiden die helpt een goede keuze te maken uit alternatieven - en oneigenlijke motieven - bijvoorbeeld onderzoek dat bedoeld is om tijd te rekken of opinies te beïnvloeden.
De volgende casus (zie kader) is een voorbeeld van een legitiem motief voor onderzoek. Er is mogelijk sprake van een onwenselijke situatie, maar onderzoek is gewenst om duidelijkheid te krijgen over de omvang en mogelijke oorzaken van het probleem.
{|style="border:2px solid #000000;" width=825
|- style="color: inherit; background-color:#FFFFAA;"
|
[[bestand:Voetgangersoversteekplaats1.jpg|400px|right]]
'''Onderzoekscasus: voetgangersoversteekplaats'''
Toegepast onderzoek kent vele verschillende vormen. Om een eerste indruk te geven wordt hier een voorbeeldprobleem uitgewerkt dat zich leent voor toegepast onderzoek. Het voorbeeld is afkomstig uit de {{Wp|verkeerskunde|verkeerskunde}}.
Ergens in Nederland ligt een oversteekplaats voor voetgangers en fietsers in {{Wp|rijstrook|2*2-strooks}} {{Wp|gebiedsontsluitingsweg|gebiedsontsluitingsweg}}. De situatie is vergelijkbaar met de afbeelding hiernaast. De maximumsnelheid ter plaatse is 50 km/h, maar volgens bewoners wordt deze maximumsnelheid regelmatig overschreden.
Hoewel het laatste ernstige ongeval al weer enige jaren geleden is, is er toch twijfel over de verkeersveiligheid van deze oversteekvoorziening. In de eerste plaats is het volgens de {{Wp|Duurzaam Veilig|duurzaam veilig}} visie gewenst om de snelheden bij oversteekplaatsen te beperken tot 30 km/h. Bovendien zijn er klachten over de slechte roodlichtdiscipline van de auto's. Wellicht hangt dit samen met te hard rijden (niet meer kunnen stoppen voor oranje) of de afstelling van de verkeerslichten. Ook de roodlichtdiscipline van de overstekende voetgangers laat volgens automobilisten vaak te wensen over.
|}
===Verschillen in aanleiding en doel van onderzoek===
In het voorgaande voorbeeld is er sprake van een duidelijke praktijkaanleiding voor het doen van onderzoek. Het is toegepast onderzoek met een duidelijk praktisch doel. Het waarom van dit soort onderzoek verschilt sterk van bijvoorbeeld fundamenteel onderzoek naar hoe menselijk gedrag tot stand komt. Ookal kan dergelijk fundamenteel onderzoek uiteindelijk leiden tot inzichten die weer toepasbaar zijn op problemen als roodlichtnegatie, het is niet het uiteindelijke doel van fundamenteel onderzoek.
In de volgende sub-paragrafen verkennen we verder de tegenstellingen tussen ''fundamenteel'' en ''toegepast'' onderzoek en tussen ''theoriegericht'' en ''praktijkgericht onderzoek''. Op basis van de beschrijving van het laatstgenoemde onderscheid introduceren we het onderscheid tussen ''diagnosticerend'' en ''evaluerend'' onderzoek. Ten slotte staan we nog even stil bij het verschil tussen kwantitatief en kwalitatief onderzoek.
===Fundamenteel en toegepast onderzoek===
Het doel van onderzoek is het produceren van nieuwe kennis. Hierbij kan het gaan om 'nuttige' kennis - kennis die ten goede komt aan de mensheid, bijvoorbeeld door (kleine) praktische problemen op te lossen. Het kan echter ook gaan om kennis die in eerste instantie alleen tot doel heeft om de wereld om ons heen beter te begrijpen. Op basis van dit verschil in doel van onderzoeken wordt onderscheid gemaakt tussen fundamenteel onderzoek en toegepast onderzoek.
Wetenschappers op de algemene {{Wp|universiteit|universiteiten}} houden zich vooral bezig met ''fundamenteel'' wetenschappelijk onderzoek. {{Wp|Fundamentele wetenschap|Fundamentele wetenschap}} is het deel van iedere {{Wp|vakwetenschap|vakdiscipline}}, dat handelt over de grondbeginselen en basismechanismen van het specifieke vakgebied. Het is gericht op kennis omwille van de kennis, zonder dat een concreet nut of toepassing in het zicht hoeft te zijn. <ref>Definitie volgens nl.wikipedia, zie [https://nl.wikipedia.org/w/index.php?title=Fundamentele_wetenschap&oldid=15843585]. Auteurs: Marcel Douwe Dekker e.a., zie [https://nl.wikipedia.org/w/index.php?title=Fundamentele_wetenschap&action=history].</ref>
''Toegepast'' wetenschappelijk onderzoek is in tegenstelling tot fundamenteel wetenschappelijk onderzoek meer gericht op concrete toepasingen. De {{Wp|toegepaste wetenschap|Toegepaste wetenschappen}} omvatten de wetenschappelijke richtingen die als doel hebben een probleem op te lossen. <ref>Definitie volgens nl.wikipedia, zie [https://nl.wikipedia.org/w/index.php?title=Toegepaste_wetenschappen&oldid=10637261]. Auteurs: zie [https://nl.wikipedia.org/w/index.php?title=Toegepaste_wetenschappen&action=history]</ref> In Nederland houden onder andere de {{Wp|Technische universiteit|technische universiteiten}}, onderzoeksinstituten als {{Wp|Nederlandse Organisatie voor toegepast-natuurwetenschappelijk onderzoek|TNO}} en (in mindere mate) {{Wp|Hogeschool|hogescholen}} zich bezig met toegepast wetenschappelijk onderzoek. In Vlaanderen is ''toegepaste wetenschappen'' lange tijd min of meer als synoniem gebruikt voor de technische wetenschappen: de technische faculteiten van universiteiten heetten tot 2005 meestal ''Faculteit Toegepaste Wetenschappen''.
Toegepast onderzoek is echter een ruim begrip. Aan het ene uiteinde van het spectrum raakt het aan het fundamenteel wetenschappelijk onderzoek. Hierbij kun je onder andere denken aan {{Wp|materiaalkunde|materiaalkundig}} onderzoek naar de eigenschappen van bijvoorbeeld een nieuw type {{Wp|beton|beton}} versterkt met polymeervezels. Dergelijk onderzoek naar bijvoorbeeld de trek- en druksterkte van het materiaal bij verschillende temperaturen heeft vaak geen directe relatie met een specifieke toepassing, maar wordt wel degelijk uitgevoerd met het oog op concrete toepassing van het materiaal in de praktijk. Hierbij is het doel om algemeen toepasbare kennis te verkrijgen met betrekking tot het onderzochte materiaal.
Aan het andere uiteinde van het spectrum vind je toegepast onderzoek dat is gericht op een specifieke casus. Een voorbeeld hiervan is het onderzoeken van een constructie (bijvoorbeeld een brug) op verborgen gebreken. Dergelijk onderzoek heeft tot doel informatie te vergaren over één object, maar heeft niet de pretentie om iets te zeggen over alle bruggen van een bepaald type.
Verdere voorbeelden van algemeen toegepast onderzoek zijn:
*onderzoek naar de relatie tussen de vormgeving van wegen (strookbreedte, hellingspercentage, etc.) en de capaciteit van autosnelwegen;
*onderzoek naar de werkzaamheid en bijwerkingen van medicijnen.
Verdere voorbeelden van specifiek toegepast onderzoek zijn:
*geotechnisch onderzoek naar de draagkracht van de ondergrond van een geprojecteerde nieuwbouwwijk;
*verkeerskundig onderzoek naar de overlast van doorgaand (sluip)verkeer in een woonstraat;
*{{Wp|Patholoog-anatoom|pathologisch-anatomisch}} onderzoek naar de oorzaak van het overlijden van een deelnemer aan een farmaceutisch onderzoek.
===Theoriegericht en praktijkgericht onderzoek===
{{Afbeelding duo
|breedte=650px
|afbeelding1=Empirische cyclus globaal.svg
|breedte1=400px
|bijschrift1=Empirische cyclus volgens Van Eijck (1982), p.92-96. <ref>bron: https://commons.wikimedia.org; auteur: M.D. Dekker</ref>
|afbeelding2=Regulatieve cyclus.jpg
|breedte2=250px
|bijschrift2=Regulatieve cyclus
}}
Fundamenteel onderzoek is per definitie theoriegericht. Toegepast onderzoek kan eveneens een theoretisch karakter hebben, bijvoorbeeld als het tot doel heeft tot algemene inzichten te komen over een bepaald praktisch probleem, zoals het verklaren van de oorzaak van een nog onbegrepen ziekte. Toegepast onderzoek kan echter ook meer praktijkgericht zijn, dat wil zeggen meer gericht op het oplossen dan op het verklaren van een praktisch probleem. Een voorbeeld van praktijkgericht onderzoek is het diagnosticeren van een ziekte bij een individuele patiënt.
In de wetenschappelijke methode heeft toetsing van theoretische veronderstellingen, {{Wp|hypothese|hypothesen}} genaamd, een belangrijke plaats. Dit soort onderzoek wordt aangeduid als theoriegericht onderzoek (Christiaans ''et al.'' (2004)). In de empirische cyclus, die een centrale plaats inneemt in alle handboeken over onderzoeksmethodologie, staat het formuleren van hypothesen en het toetsen daarvan doormiddel van empirisch onderzoek centraal. Naast dit toetsend onderzoek kan ook beschrijvend of verkennend (exploratief) onderzoek deel uitmaken van de empirische cyclus.
Theoriegericht onderzoek kenmerkt zich ook door het gebruik van een ''{{Wp|conceptueel model|conceptueel model}}'' als uitgangspunt voor het onderzoek.
Het conceptueel model heeft een belangrijke rol in het onderzoeksdesign: het bepaalt niet alleen het theoretische uitgangspunt, maar ook welke controlevariabelen meegenomen moeten worden in het onderzoeksontwerp.
Praktijkonderzoek is een vorm van wetenschappelijk onderzoek, mits de onderzoeker de basisprincipes van de {{Wp|wetenschappelijke methode|wetenschappelijke methode}} aanhoudt. Praktijkonderzoek heeft als belangrijkste kenmerken dat het niet fundamenteel van aard is maar toepassingsgericht en dat het praktijkgericht is in plaats van theoriegericht.
Toepassingsgericht onderzoek kan theoriegericht zijn, maar het soort onderzoek dat in dit boek centraal staat - het soort onderzoek waarmee ''professional bachelors'' te maken krijgt, is meestal praktijkgericht. Praktijkgericht onderzoek kan niet goed worden begrepen aan de hand van de empirische cyclus. Als alternatief hiervoor is door Van Strien (1986) de ''regulatieve cylus'' voorgesteld. In de {{Wp|regulatieve cyclus|regulatieve cyclus}} staat niet theorievorming door toetsing van hypothesen centraal, maar de ondersteuning en evaluatie van beslissingen.
De regulatieve cyclus bestaat uit de volgende fasen: <ref>Dit gedeelte is een bewerking van het lemma {{Wp|regulatieve cyclus|regulatieve cyclus}} van nl.wikipedia. Auteurs: Jurek Woller e.a., zie [https://nl.wikipedia.org/w/index.php?title=Regulatieve_cyclus&action=history]</ref>
*Probleemstelling
*Diagnose (analyse van het probleem)
*Plan (ontwerp van de oplossing)
*Ingreep (implementatie van de gekozen oplossing)
*Evaluatie
'''Probleemstelling'''<br>
Eén of meerdere problemen van personen of organisaties vormen de basis van het onderzoek. Vanuit deze situatie moet toegewerkt worden naar een probleemstelling waar alle belanghebbenden achter staan. Dit kan een langdurig proces zijn, met de nodige meningsverschillen en onderhandeling. Blijft er een conflict onder de belanghebbenden bestaan over de probleemstelling, dan is de regulatieve cyclus niet geschikt. Er zal een andere methode gebruikt moeten worden om het probleem op te lossen. Is er wel een geschikte probleemstelling tot stand gekomen, dan de volgende fase ingegaan worden.
'''Diagnose'''<br>
Dit is de fase waar de probleemsituatie volledig wordt onderzocht en geprobeerd wordt de oorzaken boven water te krijgen. Kenmerkend voor de diagnose, is dat er een analyse van de van de uitgangssituatie wordt gemaakt. Dit is dus de bestaande toestand, zonder de toekomstige ingreep. Na de diagnose zouden alle oorzaken van het probleem duidelijk moeten zijn. Er kan dan een geschikt ontwerp gemaakt worden om dit probleem op te lossen.
'''Plan (of ontwerp)'''<br>
In deze fase wordt een plan gevormd waarin het doel en de middelen staan, om zo tot een verbeterde situatie te komen. In veel gevallen zal dit plan een (her)ontwerp zijn. Op basis van dit plan zal besloten worden of het daadwerkelijk ten uitvoer gebracht zal worden.
'''Interventie (of implementatie)'''<br>
Mocht het plan daadwerkelijk tot uitvoer gebracht worden, dan is er sprake van interventie. Kenmerkend voor deze fase is, dat er verschillende metingen zijn, waarmee de gang van zaken in de gaten wordt gehouden. Vaak wordt er gebruikgemaakt van een specifiek voor het daadwerkelijk uitvoeren van het ontwerp.
'''Evaluatie'''<br>
Tot slot is er de evaluatie fase, waar gekeken wordt of het initiële probleem is opgelost door de interventie. Daarbij wordt gekeken of het probleem effectief is aangepakt, ofwel of er voor een juiste oplossing is gekozen. Daarnaast wordt ook gekeken naar de efficiëntie van de oplossing: of deze niet te veel geld heeft gekost.
===Diagnosticerend en evaluerend onderzoek===
In de regulatieve cyclus komt op twee momenten onderzoek voor: bij het stellen van de ''diagnose'' en bij het ''evalueren'' van de resultaten van een ingreep. Het Belangrijke verschillen met de empirische cyclus zijn dat:
* het onderzoek is gericht op het nemen van beslissingen;
* het onderzoek niet generaliserend is, maar specifiek voor één situatie.
Het onderscheid tussen diagnostisch en evaluerend onderzoek bij praktijkgericht onderzoek heeft gelijkenissen met het onderscheid tussen beschrijvend en toetsend onderzoek dat wordt gemaakt bij theoriegericht onderzoek.
Bij beschrijvend en diagnostisch onderzoek staat de verwerving van informatie centraal. Dit kan kennis zijn over de toestand van het object van onderzoek in het verleden, in het heden of in de toekomst. Het verschil tussen beschrijvend en diagnostisch onderzoek zit in het doel. Beschrijvend onderzoek heeft de verwerving van nieuwe (algemene) kennis tot doel, terwijl diagnostisch onderzoek tot doel heeft om vast te stellen wat de aard, omvang en achtergrond is van (potentiële) problemen.
Essentieel element van de wetenschappelijke methode is dat beweringen altijd worden getoetst. Toetsend (theoriegericht) onderzoek heeft tot doel om uitspraken over de werkelijkheid ({{Wp|hypothese|hypothesen}}) te toetsen. Deze hypothesen zullen meestal betrekking hebben op het verband tussen twee of meer variabelen. Hoe een onderzoeker aan zo'n hypothese komt maakt eigenlijk niet zoveel uit: op basis van eerder onderzoek, intuïtie, modelstudie, etc.: het gaat er om dat de hypothese kritisch tegen het licht wordt gehouden.
Ook evaluerend (praktijkgericht) onderzoek heeft een min of meer toetsende functie. Hierbij gaat het echter om de vraag of de ingreep effectief geweest is en of de veronderstellingen die hebben geleid tot de keuze van de ingreep juist zijn gebleken. Hoewel algemeen toepasbare kennis niet het primaire doel is van praktijkgericht onderzoek, is het natuurlijk niet verkeerd als evaluerend onderzoek leidt tot nieuwe inzichten over de effectiviteit van een bepaald type ingreep.
===Kwantitatief en kwalitatief===
Het laatste onderscheid dat in dit hoofdstuk wordt behandeld is tussen kwantitatief en kwalitatief onderzoek. Hierbij is onderscheidend of het onderzoek tot doel heeft om kwalitatieve of kwantitatieve uitspraken te doen over het object van onderzoek.
In kwantitatief onderzoek wordt er altijd gemeten aan de werkelijkheid of een model van de werkelijkheid - of worden eerdere meetresultaten hergebruikt. Hierbij zijn de te meten variabelen en het te gebruiken meetinstrument vooraf vastgesteld. In kwalitatief onderzoek wordt ook wel 'gemeten' aan de werkelijkheid of aan een model van de werkelijkheid, zonder dat van te voren precies vast hoeft te staan welke variabelen worden gemeten. In plaats van kwantitatieve resultaten in de vorm van gemiddelden, aantallen e.d. levert kwalitatief onderzoek meestal informatie op in de vorm van een beschrijving. Een voorbeeld van kwalitatief onderzoek is het inventariseren van de beleving van, bijvoorbeeld, een winkelcentrum op basis van diepte-interviews.
Dit boek beperkt zich tot kwantitatief onderzoek. Uitgangspunt is dus steeds dat met behulp van goed gekozen meetinstrumenten (waaronder inbegrepen het gebruik van enquête- en observatieformulieren) resultaten worden verkregen die zich lenen voor kwantitatieve analyse.
{{Voetnoten}}
{{Bladeren2
|Boek=Meten en onzekerheid
|vorige=
|tekstvorige=
|huidige=1. Onderzoek
|volgende=Onderzoeksproces
|tekstvolgende=2. Het onderzoeksproces
}}
{{Sub}}
gpl0o5342z19ygsulrxdxqlue2xv5rl
Meten en onzekerheid
0
20147
428220
410002
2026-05-20T06:11:49Z
Erik Baas
2193
lf
428220
wikitext
text/x-wiki
__NOTOC__{{Niet afdrukken block|{{Bi}}}}{{Sjabloon:Meten en onzekerheid}}
==Meten is weten <ref>Deze bekende slagzin is waarschijnlijk afgeleid van het motto van het laboratorium van {{Wp|Heike Kamerlingh Onnes|Heike Kamerlingh Onnes}}: "Door meten tot weten"</ref>==
Meten is een essentieel onderdeel van kennisverwerving. Hoewel we gegeven allerlei aannames allerlei theorieën kunnen verzinnen over hoe de werkelijkheid in elkaar zit, zijn er metingen nodig om onze ideeën te toetsen. Daarbij kan blijken dat de inhoud en werking van de {{Wp|natuur (kosmos)|natuur}}, het {{Wp|gedrag|gedrag}} van mensen en de {{Wp|geschiedenis|geschiedenis}} van onze leefwereld toch net iets anders zijn dan eerder gedacht. Het verwerven van dit soort fundamentele kennis over de werkelijkheid waarin wij leven, kun je zien als het kerndoel van de {{Wp|wetenschap|wetenschap}}.
Maar zelfs al zouden we over alle benodigde fundamentele kennis beschikken om te weten hoe de wereld ontstaan is en aan welke wetten de natuur en de mens gehoorzaamt - dan nog hadden we metingen nodig in onze dagelijkse beroepspraktijk. Enkele voorbeelden:
* Een arts zal iedere patiënt afzonderlijk moeten onderzoeken om een goede {{Wp|diagnose|diagnose}} te stellen.
* Door {{Wp|steekproef|steekproefsgewijs}} de productie van (bijvoorbeeld) {{Wp|beton|betonspecie}} te controleren, test je of de samenstelling van het mengsel nog steeds voldoet.
* Bij een grote brand controleren milieukundigen of er schadelijke stoffen in de lucht of het water terecht zijn gekomen.
In al deze voorbeelden is het onvoldoende voor een professional om alleen af te gaan op zijn/haar medische, fysische en chemische achtergrondkennis. Het benodigde onderzoek zal daarbij niet leiden tot (fundamentele) wetenschappelijke kennis, maar tot toegepaste kennis. Dit soort kennis is onmisbaar in de praktijk van toegepast-wetenschappelijke beroepsbeoefenaars, zoals medici, ingenieurs en milieukundigen.
Meten is onmisbaar om kennis te verwerven over de afzonderlijke producten, personen, gebeurtenissen, locaties, etc., waarmee je als professional te maken hebt. Meten zorgt voor kennis en daarmee voor het verdwijnen van het omgekeerde van kennis: onzekerheid.
==...of toch niet?==
{|style="border:2px solid #000000;" width=825
|- style="color: inherit; background-color:#FFFFAA;"
|
===Sneller dan het licht? <ref>Dit voorbeeld is overgenomen van het artikel {{Wp|lichtsnelheid|lichtsnelheid}} op nl.wikipedia. Versie: zie [https://nl.wikipedia.org/w/index.php?title=Lichtsnelheid&oldid=29786961]; auteurs: zie [https://nl.wikipedia.org/w/index.php?title=Lichtsnelheid&action=history].</ref>===
Op 22 september 2011 werden de resultaten gepubliceerd van een experiment waarbij vanuit de {{Wp|Large Hadron Collider|Large Hadron Collider}} van het {{Wp|CERN|CERN}} in Zwitserland een {{Wp|neutrino|neutrinobundel}} werd afgevuurd op een doel 730 kilometer verderop in Gran Sasso (Italië). De metingen lijken erop te duiden dat de deeltjes een fractie sneller waren dan het licht. Nieuwe metingen op 18 november 2011 bevestigden dit resultaat.
Op 23 februari 2012 maakte CERN bekend dat bij deze experimenten een niet goed functionerende {{Wp|glasvezel|glasvezelverbinding}} tot een lagere uitkomst van de vluchttijd van de neutrino's geleid kan hebben. In juli 2012 werd bekend gemaakt dat na correctie van de meetresultaten de deeltjes toch in overeenstemming zijn met de snelheid van het licht. <ref> Bron:OPERA Collaboration (2012), Measurement of the neutrino velocity with the OPERA detector in the CNGS beam, Journal of High Energy Physics, Vol. 10, p. 93</ref>
|}
Het bovenstaande voorbeeld illustreert dat nooit alle onzekerheid weggenomen kan worden door metingen. Sterker nog, soms lijkt de onzekerheid alleen maar toe te nemen...
De onzekerheid bij metingen heeft te maken met een aantal verschillende vragen:
* Meet mijn instrument ook wat ik wil meten?
* Hoe nauwkeurig en betrouwbaar zijn mijn metingen?
* Hoe veel moet ik meten om ook een representatief beeld te hebben?
* Wat waren de veronderstellingen achter mijn metingen en wat betekent dit voor de interpretatie ervan?
* Etc.
Dit boek geeft handreikingen om dit soort vragen te kunnen beantwoorden.
==Doel van dit boek==
Dit boek is een inleiding voor aankomend en beginnend beroepsbeoefenaren in de toegepaste wetenschappen. Het doel is om de benodigde basiskennis te ontwikkelen om zelf op wetenschappelijk verantwoorde wijze toegepaste metingen op te kunnen zetten en de meetresultaten te interpreteren. Hierbij staat het omgaan met het aspect ''onzekerheid'' centraal.
De doelgroep van dit boek bestaat uit studenten en beginnend professionals in de toegepaste wetenschappen. In het bijzonder is het boek gericht op studenten op {{Wp|bachelor|bachelorniveau}} in de ingenieurswetenschappen, waaronder nadrukkelijk begrepen studenten aan het Hoger Beroepsonderwijs.
Dit boek onderscheidt zich op twee manieren van de meeste Nederlandstalige boeken over {{Wp|statistiek|statistiek}} en {{Wp|methodologie|methodologie}}:
* Het meten zelf staat centraal in plaats van het onderzoeksproces in bredere zin of de verwerking en interpretatie van meetgegevens in engere zin;
* De nadruk is op toegepast (natuur)wetenschappelijk onderzoek, terwijl de meeste huidige leerboeken vanuit het oogpunt van de sociale of economische wetenschappen zijn geschreven.
Gezien deze doelgroep focust dit boek zich op kwantitatief onderzoek. Kwalitatief onderzoek, zoals diepte-interviews, beschrijvende observaties e.d., komt hier alleen zijdelings aan bod.
==Ontwikkeling==
Dit wikiboek is nog in opbouw. Initiatiefnemer is [[Gebruiker:KKoolstra|K. Koolstra]], als docent verbonden aan de {{Wp|Hogeschool van Amsterdam|Hogeschool van Amsterdam}}, domein Techniek. Hulp bij dit project, van spellingcontrole tot actief meedenken en meeschrijven aan dit boek, is welkom.
{{Voetnoten}}
{{Bladeren2
|Boek=Meten en onzekerheid
|vorige=
|tekstvorige=
|huidige= Introductie
|volgende=Onderzoek
|tekstvolgende=1. Onderzoek
}}
[[Categorie:Toegepaste wetenschap]]
{{Boek}}
{{Fase|2}}
jd4938en8ycfwokn1pccsfz2c70xy9v
Kookboek/Caesarsalade
0
20191
428055
401382
2026-05-20T05:26:09Z
Erik Baas
2193
lf
428055
wikitext
text/x-wiki
== Ingrediënten ==
[[Bestand:Salad Caesar.jpg|thumb|right|280px|Caesarsalade]]
* 1 krop {{Kb|kropsla}}, niet te fijn geplukt.
* 1/4 kop extra-virgin {{Kb|olijfolie}}
* 2 zachtgekookte {{Kb|p=ei|eieren}}
* snuf zeezout
* gemalen zwarte peper
* wat rode wijnazijn
* 3 scheuten {{Kb|Worcestershiresauce}}
* [[Kookboek/Croutons#Varianten|knoflookcroutons]]
==Bereidingswijze==
Meng alle ingrediënten
{{Navigatie recepten}}
{{Sub}}
[[Categorie:Amerikaanse keuken|Caesarsalade]]
[[Categorie:Saladerecept|Caesarsalade]]
6jvwh5ke9aunruidnm9m6q4ulpzv4rp
Kookboek/Gehaktballetjes met ananas en paprika
0
20331
428060
400851
2026-05-20T05:26:14Z
Erik Baas
2193
lf
428060
wikitext
text/x-wiki
{{Infobox recept
| Naam = Gehaktballetjes met ananas en Paprika
(Thais recept)
| Categorie = Vleesrecept
| Porties = 3-4
| Energie =
| Tijd = 40-60 min<br>(vooral voorbereiding)
| Stippen = 4
}}
[[Kookboek/Recepten|Receptenindex]]
== Ingrediënten ==
* 5 teentjes {{Kb|knoflook}}
* ½ theelepel versgemalen zwarte {{Kb|peper}}
* 500 g {{Kb|p=gehakt|mager gehakt}}
* 1 kleine {{Kb|ananas}}
* ½ rode + ½ groene {{Kb|paprika}}
* 3 eetlepels {{Kb|vissaus}}
* 2 eetlepels {{Kb|p=Keukenazijn|rijstazijn}}
* 3 eetlepels {{Kb|p=Suiker|rietsuiker}}
* 1 theelepel {{Kb|maïzena}}
* plantaardige {{Kb|p=olijfolie|olie}}
* 2 grote koppen (mokken) {{Kb|rijst}} met 4 grote koppen water <span style="font-size: small;">(verhouding 1:2)</span>
== Voorbereiding ==
#Pel de knoflook en wrijf ze fijn met peper en zout in een [[Kookboek/Vijzel|vijzel]]. Meng dit in het gehakt en maak balletjes van ongeveer 2 cm.
#Snijd de ananas in reepjes en de paprika in blokjes.
# Meng de vissaus, rijstazijn, suiker en maïzena met 5 eetlepels water.
== Bereiding ==
#Verhit de olie in de wok. Bak hierin de balletjes ca. 3 minuten op matig vuur en giet daarna de overtollige olie af.
#Begin nu met het koken van de rijst, volgens de aanwijzingen op de verpakking.
#Voeg ananas en paprika toe in de wok en bak dit ca. 3 minuten op hoog vuur. Giet de saus erbij en breng snel, al roerend, aan de kook.
''Smakelijk !''
== Varianten ==
* Vervang de ananas door 1 groot blik ananasstukjes. Vang het sap op en gebruik dat voor een dessert met yoghurt.
{{Navigatie recepten}}
[[Categorie:Rijstrecept|Gehaktballetjes met ananas]]
[[Categorie:Vleesrecept|Gehaktballetjes met ananas]]
[[Categorie:Thaise keuken|Gehaktballetjes met ananas]]
{{Sub}}
9bhacovdcwa3ln3huv9lgxaltoq6wpz
Meten en onzekerheid/Onderzoeksproces
0
20710
428221
409788
2026-05-20T06:11:51Z
Erik Baas
2193
lf
428221
wikitext
text/x-wiki
{{Meten en onzekerheid}}__NOTOC__
=2. Het onderzoeksproces=
In het vorige hoofdstuk stonden we met name stil bij de vragen ''wat is onderzoek?'' en ''waarom doe je onderzoek?'' Dit hoofdstuk sluit hierop aan door in te gaan op de vraag ''hoe gaat een onderzoeker te werk''?
De werkwijze van de onderzoeker verschilt van onderzoek tot onderzoek. Dat geldt zowel voor de volgorde van de verschillende stappen als de uitvoering daarvan. Toch is het mogelijk om een ideaaltypisch stappenschema te beschrijven, waarbij we de in de natuurwetenschappen gebruikelijke werkwijze als leidraad hebben genomen: <ref>Dit stappenschema, inclusief uitleg, is een synthese van de handleiding ''[[wikiversity:en:Introduction to research|Introduction to research]]'' van en.wikiversity (versie: zie [https://en.wikiversity.org/w/index.php?title=Introduction_to_research&oldid=305159]; auteurs: zie [https://en.wikiversity.org/w/index.php?title=Introduction_to_research&action=history]) en het lemma {{Wp|de:Forschung|Forschung}} van de.wikipedia (versie: zie [https://de.wikipedia.org/w/index.php?title=Forschung&oldid=61727333]; auteurs: zie [https://de.wikipedia.org/w/index.php?title=Forschung&action=history])</ref>
*Verkenningsfase
*Keuze onderzoeksmethode
*Uitwerking van het onderzoeksdesign
*Uitvoering
*Analyse
*Rapportage
==Verkenningsfase==
Het onderzoeksproces start met het verkennen van de aanleiding, doel en randvoorwaarden voor het onderzoek. Onderdeel hiervan is het verkennen van de reeds beschikbare literatuur en andere informatie over het onderwerp.
===Aanleiding en startpunt voor het onderzoek===
De eerste stap van het onderzoekproces is het bepalen van de aanleiding van het onderzoek. Bij toegepast onderzoek is er altijd een (maatschappelijk) probleem, wens of vraag dat ten grondslag ligt aan het onderzoek. Daarbij is het van belang om je te realiseren wat het uitgangspunt is van het onderzoek. Heb je een idee over een mogelijke oplossing van het probleem en wil je dat idee verder uitwerken en toetsen? Of wil je juist weten in hoeverre het veronderstelde probleem echt een probleem is, hoe ernstig het is, wat de oorzaken zijn, ...?
Bij toegepast onderzoek ben je als onderzoeker zelden zelf ook 'probleemeigenaar'. Het is dus van belang om er achter te komen wat het probleem van de probleemeigenaar - vaak ook de opdrachtgever van het onderzoek - nu precies is. Bij relatief concrete vraagstukken zal de opdrachtgever het te onderzoeken probleem en het startpunt van het onderzoek goed kunnen omschrijven. Een gemeente moet bijvoorbeeld een 'watertoets' doen voor een nieuw ontworpen woonwijk, waarbij aangetoond moet worden dat de {{Wp|berging (water)|waterberging}} voldoende is. Als de gemeente deze toets laat uitvoeren door een gespecialiseerd ingenieursbureau, dan zal snel duidelijk zijn wat er onderzocht moet worden. Het komt echter ook voor dat de opdrachtgever met een relatief vage probleemstelling komt. In dat geval is het de taak van de onderzoeker om helder te krijgen wat nu precies het te onderzoeken probleem is.
Op basis van je analyse van de aanleiding en het startpunt van het onderzoek stel je de probleemstelling vast. Het formuleren van de ''probleemstelling'' betekent het onder woorden brengen van het te bestuderen praktijkprobleem en wat je op basis van het onderzoek hierover te weten wilt komen. De probleemstelling is het uitgangspunt voor de formulering van de doel- en vraagstelling van het onderzoek. De probleemstelling is over het algemeen beschrijvend en niet in een nader omschreven vorm (zoals de vraagvorm). Dit in tegenstelling tot de doel- en vraagstelling, welke beduidend compacter en qua omschrijving preciezer geformuleerd horen te zijn.
===Doel- en vraagstelling van het onderzoek===
Als je weet wat de context van je onderzoek is, is de volgende stap om het doel van het onderzoek goed te formuleren en vervolgens vast te stellen wat de vraag is waarop jouw onderzoek een antwoord moet gaan geven.
De manier waarop je de onderzoeksvraag formuleert is van belang om te bepalen wat voor soort onderzoek je gaan doen. Enkele voorbeelden van onderzoeksvragen zijn:
# Wat is de te verwachte economische schade in het Westland als gevolg van wateroverlast bij exceptionele regenval met een kans van één keer in de 100 jaar in het jaar 2015?
# In welke mate wordt de Jan Luykenstraat gebruikt als sluiproute voor doorgaand verkeer?
# Wat is het rendement van herbestemming van verouderde kantoorpanden met relatief veel leegstand in Amsterdam Zuidoost?
Deze vragen zijn allemaal te relateren aan een praktijkprobleem. Wat opvalt is dat er verschillende begrippen in worden gebruikt die wellicht nog verdere toelichting of afkadering nodig hebben, zoals 'exceptionele regenval', 'doorgaand verkeer' en 'relatief veel leegstand'. Deze begrippen hoeven nog niet in de vraagstelling zelf te worden aangescherpt, maar het zal wel nodig zijn om de gebruikte begrippen nader toe te lichten.
Het aanscherpen kan ook bestaan uit het formuleren van sub-vragen, waarop eerst antwoord moet worden gevonden om de hoofdvraag te kunnen beantwoorden. Bij het onderzoek naar economische schade in het Westland bij wateroverlast zijn mogelijke deelvragen:
*Wat voor bui (qua neerslagintensiteit en duur) komt overeen met een kans van één keer in de 100 jaar?
*Welke gebieden binnen het Westland lopen onder water bij een derglijke bui?
*Welke ruimtelijke en economische ontwikkelingen verwachten we in het Westland tot 2015?
*etc.
Wees bij het opstellen van de onderzoeksvraag wel realistisch in hoeverre het haalbaar is om binnen het gegeven (tijd)budget deze onderzoeksvraag te beantwoorden. In de casus van de oversteekplaats kan één van de subvragen zijn wat de oorzaken zijn van roodlichtnegatie bij de betreffende oversteekplaats. Het achterhalen van oorzaken vraagt echter over het algemeen een veel uitgebreider onderzoek dan een onderzoek dat enkel de omvang van het probleem in kaart brengt.
Een goede onderzoeksvraag voor (toegepast) wetenschappelijk onderzoek moet aan een aantal voorwaarden voldoen (zie Brinkman, 2006):
*heeft altijd een vraagvorm
*is concreet, scherp en ondubbelzinnig
*is objectief, vraagt geen oordelen of voorschriften
*is specifiek, vermijd daarom vragen met ''waarom'' en ''waardoor''
Ter controle of je onderzoeksvraag goed gekozen is, kun je je de volgende vragen stellen:
*Wat verwacht ik voor informatie te halen uit mijn onderzoek?
*Komt de onderzoeksvraag overeen met wat ik (of mijn opdrachtgevers) eigenlijk wil weten?
===Verkenning van de relevante literatuur en beschikbare informatie===
Soms zal het mogelijk zijn om de onderzoeksvraag te beantwoorden op basis van publicaties van eerder gedaan onderzoek (literatuurstudie) of door een nieuwe analyse van primaire bronnen, zoals reeds bestaande meetgegevens (bronnenonderzoek). Maar ook als je van plan bent eigen gegevens te verzamelen van het onderzoek, is het van belang om voldoende kennis te hebben van de bestaande {{Wp|literatuuronderzoek|wetenschappelijke literatuur}} en vakliteratuur op het betreffende gebied. Probeer te achterhalen wat de huidige stand van kennis is op het betreffende gebied. Als bijvoorbeeld het te onderzoeken probleem is hoe een nieuwe weg in een gebied met slappe (veen)bodems zo snel mogelijk kan worden aangelegd, dan zul je moeten nagaan in hoeverre er recent nieuwe aanlegmethoden zijn ontwikkeld waarvan je wellicht nog niet had gehoord, of dat onderzoeksresultaten bekend zijn geworden over nieuwe snellere aanlegmethoden. Het is overigens niet ongebruikelijk dat op basis van de verkenning het doel van het onderzoek en de onderzoeksvraag moet worden bijgesteld.
==Keuze van de onderzoeksmethode==
Een belangrijke beslissing is hoe het onderzoek aangepakt gaat worden. Een belangrijk aspect hierbij is wat de gegevensbasis wordt van het onderzoek. Wordt het onderzoek gebaseerd op bestaande meetgegevens of op zelf te verzamelen gegevens? Worden gegevens verkregen door mensen te ondervragen, door zelf te observeren, door metingen van meetapparatuur of door metingen aan een model? Daarbij kan een combinatie van onderzoeksmethoden ook interessant zijn.
Een onderzoek naar de potentiële vervoerwaarde van een nieuwe veerverbinding, om maar eens een voorbeeld te noemen, kan bijvoorbeeld op verschillende manieren worden verricht. Zo kan gekozen worden om gebruik te maken van een bestaand verkeersmodel, potentiële gebruikers te enquêteren, etc. Meestal wordt als voorbereiding op dergelijk onderzoek een uitgebreid onderzoeksvoorstel of meetplan geschreven.
Globaal kunnen we de volgende typen onderzoeksmethoden onderscheiden:
* {{Wp|literatuuronderzoek|literatuurstudie}}, {{Wp|primaire bron|bronnenonderzoek}}
* {{Wp|observatie|observatie}}, veldonderzoek
* {{Wp|experiment|(laboratorium)experimenten}}
* {{Wp|enquête (onderzoek)|enquêtes}}, {{Wp|interview|interviews}}
* {{Wp|model (wetenschap)|modelstudie}}, {{Wp|simulatie|simulatie}}
In het onderstaande kader staan twee voorbeelden van typen onderzoek die kunnen worden gebruikt om de casus m.b.t. de oversteekplaats aan een onderzoek te onderwerpen.
{|style="border:2px solid #000000;" width=825
|- style="color: inherit; background-color:#FFFFAA;"
|'''Uitwerking van de onderzoeksmethode voor de casus voetgangersoversteekplaats'''
Stel dat je de opdracht hebt gekeken om de verkeersveiligheid van deze oversteekplaats nader te onderzoeken. Over het algemeen geldt dat voor dergelijk toegepast onderzoek maar weinig budget beschikbaar is. Je zult je dus allereerst moeten afvragen hoe je met een beperkt budget qua tijd en geld toch zinvolle - en {{Wp|wetenschap|wetenschappelijk}} verantwoorde - uitspraken kunt doen over de verkeersveiligheid van de betreffende oversteekplaats.
Zowel wat betreft de te onderzoeken variabelen als het soort onderzoek zijn er verschillende aanpakken mogelijk.
''Bronnenonderzoek: statistieken over verkeersveiligheid''<br>
De kern van het probleem is de vermeende verkeersonveiligheid van de kruising. Hoewel er dus geen recente dodelijke ongevallen zijn gebeurd, zouden er wel andere ongevallen kunnen hebben plaatsgevonden, met verschillende mate van ernst. Met name de ernstiger soorten ongevallen vinden echter weinig plaats, waardoor de aantallen vaak te klein zijn om uitspraken te kunnen doen over één enkele kruising. Het onderzoeken van bestaande ongevallenregegistraties is een vorm van bronnenonderzoek.
'''Observatie-onderzoek: roodlichtnegatie''<br>
Een alternatief is om je te focussen op de vermeende problemen met roodlichtnegatie. Daarbij kun je je beperken tot het meten van het vóórkomen van roodlichtnegatie alleen, maar zou je ook kunnen proberen uit te vinden in hoeverre dit probleem samenhangt met de afstelling van de verkeerslichten, snelheid van het gemotoriseerd verkeer, etc. Op basis van dat onderzoek zou je vervolgens aanbevelingen kunnen doen om de veiligheid van de oversteekvoorziening te verbeteren. Onderzoek waarin eigen waarnemingen centraal staan wordt ook wel aangeduid als observatieonderzoek.
|}
===Literatuurstudie en bronnenonderzoek===
Bij de keuze van de onderzoeksmethode moet de onderzoeker zich allereerst afvragen of het nodig is om zelf metingen te verrichten, of dat de benodigde gegevens al ergens voorhanden zijn. Wellicht kan op basis van de bestaande wetenschappelijke literatuur (gepubliceerde onderzoeksresultaten), databanken e.d. de benodigde informatie verkregen worden. In de literatuur wordt dergelijk onderzoek ook wel onderzoek op basis van ''secundaire gegevens'' genoemd, dit in tegenstelling tot ''primaire gegevens'' die door de onderzoeker zelf verzameld zijn (zie Saunders ''et al.'', 2008).
Bij onderzoek op basis van bestaande gegevens en rapportages maken we onderscheid tussen bronnenonderzoek en literatuuronderzoek.
====Bronnenonderzoek====
Bronnenonderzoek omvat al het onderzoek dat wordt gebaseerd op reeds verzamelde (ruwe) data, zoals meetgegevens, archiefstukken, etc. Het zijn dus secundaire gegevens, maar idealiter gaat hierbij om {{Wp|primaire bron|primaire bronnen}}. Het begrip primaire bron komt uit de historische wetenschappen en wordt gebruikt om bronnen aan te duiden met gegevens uit 'eerste hand', zonder verdere bewerking of interpretatie door anderen. Hierbij kun je denken aan oude registers (zoals doopregisters) en officiële akten, maar ook aan pamfletten, memoires en zelfs niet-schriftelijke bronnen.
Het begrip ''primaire bron'' kunnen we ook toepassen op onderzoek naar hedendaagse problemen. Zo kan een onderzoek naar hedendaagse problemen gebruik maken van bijvoorbeeld de volgende soorten primaire bronnen:
*ruwe data van enquêtes;
*registers, inclusief archieven daarvan (politieregisters, bevolkingsregisters, etc.);
*metingen en tellingen ''in situ''.
Ruwe data van enquêtes kunnen soms verkregen worden van de onderzoeksinstituten die deze hebben uitgevoerd. Onder voorwaarden kunnen bijvoorbeeld onderzoekers gebruik maken van de ruwe (maar wel {{Wp|anonimiteit|geanonimiseerde}}) data van het door het {{Wp|Centraal Bureau voor de Statistiek|CBS}} uitgevoerde Mobiliteitsonderzoek Nederland.
Er zijn allerlei openbare registers waarvan gegevens gebruikt kunnen worden voor onderzoeksdoeleinden, mits gewaarborgd is dat de privacy van de betrokkenen niet wordt geschaad. Een voorbeeld is dat voor onderzoek naar verkeersveiligheid vaak politiegegevens worden gebruikt, aangezien uit de registraties van de politie de omstandigheden en toedracht van (ernstige) ongevallen is op te maken. Zie bijvoorbeeld het onderzoek van de {{Wp|Stichting Wetenschappelijk Onderzoek Verkeersveiligheid|SWOV}} naar de ongunstige ongevallencijfers van motorrijders (SWOV, 1996).
Allerlei verschijnselen worden continu ''in situ'' gemonitord. Zo houden weerstations vrijwel continu {{Wp|meteorologie|meteorologische}} gegevens bij, zijn er permanente telpunten en snelheidsmetingen op rijkswegen die de verkeersdrukte bijhouden, etc. Dit soort metingen kunnen een schat aan informatie bevatten voor onderzoekers.
====Literatuuronderzoek====
Naar heel veel problemen en fenomenen is reeds wetenschappelijk onderzoek gedaan. Kennis van eerder onderzoeken kan kosten en moeite besparen - bijvoorbeeld door het verrichten van een literatuurstudie waarbij je gebruik maakt van bestaande {{Wp|wetenschappelijke literatuur|publicaties}} kun je wellicht een duur en tijdrovend eigen onderzoek uitsparen. Een belangrijk aspect van wetenschap is dat het probeert voort te bouwen op eerder verworven kennis (waarbij deze kennis wel kritisch ter discussie gesteld moet kunnen blijven worden). Daarnaast kan het helpen bij het preciezer formuleren van de probleemstelling, het bepalen van de beste onderzoeksopzet, etc. Kennis van de vakliteratuur is dus een vereiste voor iedere onderzoeker. Aangezien het in de praktijk lastig (onmogelijk) is om al het mogelijk relevante onderzoek te kennen, zal het dus vaak nodig zijn om een literatuuronderzoek te doen om er achter te komen wat de huidige stand van kennis is omtrent het te onderzoeken probleem.
Stel bijvoorbeeld dat je voor een grote gemeente moet uitzoeken in hoeverre het zinvol is om de hygiëneregels voor het gebruik van de zwembaden aan te scherpen en welke maatregelen wel of niet zinvol zijn (verplicht dragen van badmutsen, verbod op lange zwembroeken, etc.). Je zou de maatregelen kunnen laten uitproberen om door middel van eigen metingen uiteindelijk de effectiviteit te bepalen, maar het is waarschijnlijk zinvoller om eerst uit te zoeken in hoeverren anderen al onderzoek hebben gepubliceerd hierover.
===Observatie en veldonderzoek===
Observatie-onderzoek is een verzamelbegrip voor soorten onderzoek die zijn gebaseerd op waarnemingen. Observatie-onderzoek is sterk {{Wp|empirie|empirisch}} van karakter: centraal staat de werkelijkheid zoals deze zich voordoet. In tegenstelling tot experimenten is er geen sprake van kunstmatig gecontroleerde omstandigheden, maar wordt {{Wp|gedrag|gedrag}} waargenomen zoals het zich voordoet in de praktijk. Gedrag bedoelen we hier in de breedste zin des woords: het kan gaan om menselijk gedrag, maar ook bijvoorbeeld om het mechanisch gedrag van een constructie (vervormingen e.d.).
Bij veel observatieonderzoek wordt tenminste voor een deel van de waarneming gebruik gemaakt van de eigen {{Wp|zintuig|zintuigelijke}} waarnemingen van de onderzoeker (en zijn/haar assistenten). Meestal gaat het hierbij om visuele waarneming: hetgeen je ziet. Varianten hierbij zijn het gebruik van andere zintuigen, zoals het gehoor, tast en smaak. Voorbeeld hiervan is de klassieke determinatiewijze van {{Wp|grond|grondsoorten}}, waarbij onder andere de eigen tastzin en het gehoor (knisperen) wordt gebruikt om een indicatie te krijgen van het {{Wp|zand|zand-}} en {{Wp|silt|siltgehalte}} van {{Wp|klei|kleiige}} gronden.
Observatieonderzoek dat buiten plaatsvindt wordt ook wel aangeduid als ''veldonderzoek'' of ''veldwerk''. Een voorbeeld hiervan is {{Wp|geologie|Geologisch}} veldwerk dat wordt verricht om
de {{Wp|geologisch tijdvak|geologische geschiedenis}} en de structuur van een gebied te begrijpen. De resultaten van dit veldwerk worden vervolgens 'binnen' verwerkt, bijvoorbeeld tot een{{Wp|geologische kaart|geologische kaart}}. Soms wordt het begrip veldondezoek ook echter ruimer gehanteerd dan alleen directe observatie en wordt ook {{Wp|enquête (onderzoek)|enquête-onderzoek}} op straat tot veldwerk gerekend.
===Experimenten===
[[Bestand:ScienceOlympiad.jpg|thumb|right|400px|Op de Nationale Wetenschap Olympiade in {{Wp|Houston|Houston}} (VS) in 2004 tonen scholieren hun kennis met enige experimenten]]
Het hierboven beschreven observatie-onderzoek heeft tot doel fenomenen waar te nemen zoals ze zich 'buiten' voordoen, zonder ingrijpen door de onderzoeker. Om {{Wp|hypothese|hypothesen}} aangaande het verband tussen variabelen te testen, of om twee oplossingsstrategieën te vergelijken op effectiviteit, is het juist wenselijk om zo veel mogelijk storende invloeden uit te sluiten, om zo zo zuiver mogelijke conclusies te kunnen trekken. Dit is vooral van belang voor fundamenteel wetenschappelijk onderzoek, maar kan ook van belang zijn in toepassingsgericht onderzoek, bijvoorbeeld naar de duurzaamheid van een materiaal onder invloed van bepaalde vormen van slijtage.
Observaties onder nauwkeurig omschreven omstandigheden worden vaak aangeduid als ''experiment'' of ook wel als ''proef''. Om de omstandigheden zo goed mogelijk te kunnen controleren en gebruik te kunnen maken van de best beschikbare meetaparatuur worden veel experimenten 'binnen' verricht in speciaal daarvoor ingerichte {{Wp|laboratorium|laboratoria}}. Denk hierbij bijvoorbeeld aan een materiaalkundig laboratorium met diverse proefopstellingen (zoals een {{Wp|buigproef|buigproef}}. Maar er zijn ook voorbeelden bekend van onderzoek naar het gedrag van voetgangers dat in een laboratoriumhal werd uitgevoerd om zo de mogelijkheden voor controle en observatie te maximaliseren. <ref>Onderstaande paragraaf is een bewerking van het lemma {{Wp|experiment|experiment}} van nl.wikipedia. Versie: [https://nl.wikipedia.org/w/index.php?title=Experiment&oldid=24422745]; auteurs: [https://nl.wikipedia.org/w/index.php?title=Experiment&action=history].</ref>
Experimenten worden gebruikt in zowel de {{Wp|natuurwetenschappen|natuurwetenschappen}} als ook in de {{Wp|sociale wetenschappen|sociale wetenschappen}}. Met hulp van experimenten onderzoeken bijvoorbeeld {{Wp|psychologie|psychologen}} theorieën over (verschillen in) het gedrag van mensen en medici theorieën over gezondheid en {{Wp|geneeskunde|geneeskunde}}.
====Experimenteel design====
Het ontwerp (''design'') van een experiment moet aan een aantal kwaliteitscriteria voldoen. Sommige ervan zijn ook gewenst of zelfs vereist voor andere soorten onderzoek. Experimenteel design kenmerkt zich echter door relatief strenge eisen aan het onderzoeksdesign. Zo moet het onderzoek reproduceerbaar zijn, dat wil zeggen elders met andere objecten kunnen worden herhaald om de resultaten te verifiëren. Dat betekent tevens dat alle waarnemingen systematisch moeten gebeuren en het meetresultaat kwantificeerbaar moet zijn. Bovendien vraagt dit om nauwgezette rapportage van de opzet en uitvoering van het experiment, bijvoorbeeld door alle stappen en bijzonderheden te registreren in een logboek.
In een experimentele design manipuleert de onderzoeker de {{Wp|onafhankelijke variabele|onafhankelijke variabelen}} door mogelijke invloedsfactoren (zoals bijvoorbeeld {{Wp|temperatuur|temperatuur}} bij onderzoek naar materiaalgedrag of menselijk gedrag) constant te houden op een vooraf vastgestelde waarde. Invloedsfactoren die niet te beïnvloeden zijn, zoals persoonskenmerken, onzuiverheden in het materiaal, etc., kunnen worden gecontroleerd door de proefpersonen of proefstukken via randomisering (toevallige toekenning) te verdelen over experimentele en controlegroepen.
Later in dit hoofdstuk wordt nog iets verder ingegaan op het onderzoeksdesign. Voor meer diepgaande informatie over het ontwerp van onderzoek kan de lezer echter beter terecht bij specifieke literatuur over onderzoeksmethodologie.
===Enquêtes en interviews===
Enquêtes en interviews zijn beide methoden van indirect onderzoek, waarbij niet direct wordt geoberveerd, maar via het stellen van vragen aan personen (''respondenten'') wordt geprobeerd informatie te krijgen over zaken waarover deze personen kennis hebben. Meestal gaat het hierbij ome het onderzoeken van het gedrag of de voorkeuren van de betreffende persoon.
In de onderzoeksliteratuur worden de termen {{Wp|enquête|enquête}} en {{Wp|interview|interview}} soms door elkaar gebruikt. Het onderscheid tussen interviewen en enquêteren is gradueel en hangt samen met de mate van gestructureerdheid van de vragenlijst en de noodzaak dat er een interviewer aanwezig moet zijn.
====Interview====
Een ''interview'' is vooral geschikt voor kwalitatief onderzoek en valt daarmee eigenlijk buiten het kader van dit boek. Een interview is min of meer systematisch, afhankelijk van de mate van voorstructurering door de interviewer (bijvoorbeeld in de vorm van een vooraf vaststaande lijst vragen waarvan niet wordt afgeweken). Een interview is vooral geschikt om (diepgaand) informatie te krijgen over de kennis, inzichten, motieven e.d. van een beperkt aantal personen.
====Enquête====
Bij kwantitatief onderzoek is het echter meestal gewenst om informatie te krijgen over een vooraf bepaald deel van de bevolking middels een (representatieve) {{Wp|steekproef|steekproef}}. <ref>Deze paragraaf is een bewerking van het lemma {{Wp|enquête|enquête}} van nl.wikipedia. Zie: [https://nl.wikipedia.org/w/index.php?title=Enqu%C3%AAte_(onderzoek)&oldid=24664665]; auteurs: [https://nl.wikipedia.org/w/index.php?title=Enqu%C3%AAte_(onderzoek)&action=history].</ref> Een ''enquête'' of ''bevraging'' is een manier van onderzoek doen, waarbij gebruik wordt gemaakt van een {{Wp|vragenlijst|vragenlijst}}, die aan meerdere personen wordt voorgelegd. Deze personen kunnen de hele doelgroep vormen, of zijn gehaald uit een representatieve steekproef. Het onderzoek kan gaan om zowel feiten als meningen (zoals bij een {{Wp|opiniepeiling|opiniepeiling}}). De uitslag van een enquête kan op zichzelf gehouden worden, maar dient meestal ter ondersteuning van andere gegevens.
====Wijze van enquêteren====
Een enquête kan bestaan uit open vragen, meerkeuzevragen of een combinatie van beiden. Bij kwantitatief onderzoek wordt met name van meerkeuzevragen gebruikgemaakt, terwijl in kwalitatief onderzoek open vragen zullen worden gebruikt. De klassieke manieren om een enquête te houden zijn met de komst van de Informatie- en Communicatie technologie aanzienlijk uitgebreid. Men onderscheidt onder meer:
* mondeling 'op straat'
* telefonisch
* schriftelijk (per post)
* via internet
* via SMS
===Modelstudie en simulatie===
Met name in praktijkonderzoek komen veel wat-als-vragen voor: wat zal er gebeuren als ik een bepaalde ingreep pleeg. Bij het evalueren van alternatieve ingrepen kan het wenselijk te zijn om via een modelstudie te komen tot een inschatting van de effecten. Stel dat de voorgestelde ingreep de bouw van een nieuwe verkeersbrug is. Er zouden dan verschillende modellen kunnen worden gebruikt om verschillende aspecten te onderzoeken:
*het onderzoeken van de visuele en esthetische aspecten van de brug op basis van een {{Wp|maquette|maquette}}.
*het onderzoeken van het effect van de plaatsing van de brugpijlers met behulp van een analytisch computermodel;
*het onderzoeken van de draagkracht van een brug met behulp van een 'schematisatie': een vereenvoudigd fysisch model;
*het onderzoeken van mogelijke knelpunten in de verkeersstroom met behulp van een computersimulatie.
Meer algemeen gesproken kunnen we onderscheid maken tussen: <ref>{{Wp|Charles West Churchman|C.W. Churchman}}, {{Wp|Russell Ackoff|R.L. Ackoff}} en L. Arnoff (1957), ''Introduction to Operations Research''</ref>
*iconische modellen;
*analoge modellen en
*symbolische modellen.
''Iconische modellen'' lijken op de werkelijkheid, maar maken gebruik van andere materialen of een andere schaal – ze worden bijvoorbeeld gebruikt om ontwerpideeën vast te leggen. Een voorbeeld is de maquette van de brug. ''Analoge modellen'' beschrijven specifieke eigenschappen van een idee of systeem door details te verwijderen en zich te concentreren op de kernelementen (door middel van {{Wp|Analogiebewijs|analogieën}}). Een voorbeeld is de schematisatie voor de constructieve berekening. Deze modellen pretenderen niet precies op de werkelijkheid te lijken maar zijn bedoeld om bepaalde functies te onderzoeken.
*''Symbolische modellen'' representeren ideeën met behulp van code (bijvoorbeeld cijfers, wiskundige {{Wp|vergelijking (wiskunde)|formules}} en {{Wp|logica|logische}} verbanden. Symbolische modellen zijn een abstractie van de werkelijkheid. Alle computermodellen, zowel analytische als simulaties, maken hiervan gebruik. Maar ook de constructieve berekeningen die worden gedaan na schematisatie maken in feite gebruik van symbolische modellen in de vorm van in een wiskundige relatie gegogen natuurkundige wetmatigheden.
====Computersimulatie====
In de praktijk wordt er bij modelstudie en simulatie voornamelijk gedoeld op computermodellen. Strikt gesproken is er een onderscheid tussen computermodellen die exacte analytische oplossingen geven en simulatiemodellen die vaak slechts één van meerdere mogelijke oplossingen of een benaderende oplossing geven. Dit onderscheid is echter hier niet zo van belang, wat hier staat over computersimulatie geldt in feite ook voor analytische computermodellen. <ref>Deze paragraaf is een synthese van het lemma {{Wp|simulatie|simulatie}} van nl.wikipedia. Zie: [https://nl.wikipedia.org/w/index.php?title=Simulatie&oldid=24848942]; auteurs: [https://nl.wikipedia.org/w/index.php?title=Simulatie&action=history]</ref>
Een ''computersimulatie'' is een nabootsing van de werkelijkheid met behulp van een (symbolisch)model dat is geïmplementeerd in een computer. Er zijn ook andere mogelijkheden voor simulatie (zoals het eerdergenoemde schaalmodel van een waterloop en berekeningen op papier), maar de meeste vakgebieden kennen modellen die zo uitgebreid of complex zijn dat simulaties zonder een krachtige computer eenvoudig niet mogelijk zouden zijn. Zo gebruikt de {{Wp|verkeerskunde|verkeerskunde}} computers voor modellen om de verkeersafwikkeling mee na te bootsen.
Simulatie wordt met name gebruikt om, vanuit een gegeven uitgangssituatie, te analysen hoe deze situatie verandert en zich ontwikkelt in de loop van de tijd. Hierbij is het mogelijk om verschillende alternatieven (bijvoorbeeld met en zonder ingreep) te vergelijken.
Voordelen van een simulatie zijn dat deze plaatsvindt in een gecontroleerde, welomschreven omgeving, en dat deze kan worden uitgevoerd zonder de werkelijkheid te beïnvloeden. De lessen die uit een simulatie worden geleerd kunnen vervolgens worden gebruikt om in de werkelijkheid verstandige beslissingen te nemen en fouten te vermijden.
==Uitwerking van het onderzoeksdesign==
Het onderzoeksdesign is - de naam zegt het al - het ontwerp van het onderzoek. Het onderzoeksdesign geeft onder andere antwoord op de vragen wat er wordt gemeten, waar er wordt gemeten en waaraan er wordt gemeten. Dit wordt ook wel de ''operationalisatie'' van het onderzoek genoemd.
===Routinematig onderzoek of nieuw onderzoeksdesign?===
[[Bestand:Slom2506.jpg|400px|thumb|{{Wp|Landmeetkunde|Land- en bouwmetingen}} worden meestal verricht volgens een gestandaardiseerde werkwijze. <ref>Bron: https://commons.wikimedia.org; auteur: PhY.</ref>]]
Het uitwerken van een onderzoeksdesign is een complexe zaak. In hoeverre er voor een onderzoek ook een nieuw onderzoeksdesign moet worden gemaakt, hangt echter af van de vraag in hoeverre er standaardisatie mogelijk is, gegeven het soort onderzoek. Hierbij geldt dat hoe minder 'standaard' het te onderzoeken probleem is, hoe meer werk er gaat zitten in het onderzoeksontwerp.
Voorbeelden van routinematig onderzoek zijn verschillende vormen van metingen 'buiten', zoals landmetingen, sonderingen e.d. en veel vormen van medische onderzoeken, zoals bloedonderzoek.
In geval van geotechnisch onderzoek naar de opbouw van de bodem op een bouwlocatie, dat o.a. tot doel heeft te bepalen hoe diep er moet worden geheid, is het bijvoorbeeld standaard om {{Wp|sondering (grondmechanica)|sonderingen}} te laten verrichten. Dit soort onderzoek wordt routinematig verricht door gespecialiseerde ingenieursbureaus en het zou onzinnig zijn om voor ieder project de werkwijze opnieuw ter discussie te stellen. In feite wordt er bij dergelijk onderzoek gebruik gemaakt van een gestandaardiseerd onderzoeksdesign.
Bij niet-routinematig onderzoek zul je als onderzoeker zelf in meer- of mindere mate moeten vaststellen hoe je het onderzoek gaat uitvoeren. Wel is het mogelijk - en vaak verstandig - om in dergelijke gevallen eerst uit te zoeken of er vergelijkbare onderzoeken eerder gedaan zijn en hoe die onderzoeken zijn opgezet.
{| style="border:2px solid #000000;" width=825
|- style="color: inherit; background-color:#FFFFAA;"
|'''Onderzoeksdesign voor de casus voetgangersoversteekplaats'''
Voor het onderzoek naar de de vermeende onveiligheid van een voetgangersoversteekplaats geldt niet dat een standaard onderzoeksdesign uit de kast kan worden getrokken. Het zal dus nodig zijn om een eigen onderzoeksontwerp te maken. De uitwerking van het onderzoeksdesign zal in dit geval resulteren in een gedetailleerd plan van aanpak van het onderzoek. Bij (technisch) observatie-onderzoek noemt met dit plan van aanpak meestal het ''meetplan''.
|}
===Omvang van het onderzoek===
Een eerste vraag bij de uitwerking van het onderzoeksdesign is de vraag over welke onderzoeksobjecten je uitspraken wilt kunnen doen. De onderzoeksobjecten waarop het onderzoek betrekking heeft, wordt in de statistiek aangeduid als de {{Wp|populatie (statistiek)|populatie}}. Stel bijvoorbeeld dat je uitspraken wilt doen over de problematiek van foutaansluitingen in een gemeente met een gescheiden {{Wp|riool|rioleringsstelsel}}. Je kunt ervoor kiezen om het onderzoek betrekking te laten hebben op de hele gemeente of zelfs een groter gebied, maar je kunt er ook voor kiezen om het onderzoek te beperken tot één enkele wijk, bijvoorbeeld omdat daar de grootste problemen worden verwacht, of omdat de gemeente pas op basis van de uitkomsten van één enkele wijk wil beslissen of een grootschaliger onderzoek nodig is.
===Operationalisatie van het onderzoek===
Een belangrijk product van de verkenningsfase is het formuleren van de onderzoeksvraag. Deze onderzoeksvraag moet vervolgens worden ''geoperationaliseerd'' in het onderzoeksdesign. Allereerst moet het onderzoeksobject en de onderzoeksvariabelen worden vastgelegd. Dit gebeurt op basis van de onderzoeksvragen. Vervolgens worden de onderzoeksvariabelen zodanig geoperationaliseerd, dat de onderzoeksvariabele ook echt meetbaar wordt. Hoe een variabele wordt geoperationaliseerd hangt echter samen met de gekozen onderzoeksmethodiek.
Een goede onderzoeksvraag maakt al direct duidelijk op wat voor ’’objecten’’ het onderzoek moet worden uitgevoerd. Het object van onderzoek is hetgeen of diegene waarop het onderzoek betrekking heeft.
Laten we nog eens kijken naar de eerder gegeven voorbeelden van onderzoeksvragen (niet-routinematig onderzoek):
# Wat is de te verwachte economische schade in het Westland als gevolg van wateroverlast bij exceptionele regenval met een kans van één keer in de 100 jaar in het jaar 2015?
# In welke mate wordt de Jan Luykenstraat gebruikt als sluiproute voor doorgaand verkeer?
# Wat is het rendement van herbestemming van verouderde kantoorpanden met relatief veel leegstand in Amsterdam Zuidoost.
Het onderzoeksobject van de eerste onderzoeksvraag is het Westland. Impliciet heeft het onderzoek daarbij betrekking op twee systemen, namelijk het watersysteem in het Westland en het economische systeem. Van de tweede onderzoek is het object de Jan Luykenstraat; meer specifiek het verkeer dat gebruik maakt van de Van Luykstraat. En tenslotte zijn verouderde kantoorpanden in Amsterdam Zuidoost het object van het derde onderzoek.
Ook de primair te onderzoeken onderzoeksvariabelen zullen meestal min of meer direct volgen uit de onderzoeksvragen. In het voorbeeld van de eerste onderzoeksvraag gaat het met name om ''economische schade'' en ''mate van wateroverlast''. Bij de tweede vraag zijn de onderzoeksvariabelen iets minder expliciet, maar zal het gaan om het ''verkeersvolume'' en het ''soort verkeer'' (doorgaand verkeer of bestemmingsverkeer). Bij de derde onderzoeksvraag zijn ''rendement'' en ''leegstand'' de twee kernvariabelen uit de onderzoeksvraag.
De operationalisatie van deze variabelen hangt nu af van de gekozen onderzoeksmethodiek. Stel bijvoorbeeld dat het onderzoek naar mogelijke wateroverlast in het Westland wordt gedaan met behulp van een modelstudie. De ''mate van wateroverlast'' zou dan geoperationaliseerd kunnen worden als het oppervlakte gebied, te onderscheiden naar functie, waar volgens het model bij de maatgevende bui een bepaalde minimum waterhoogte wordt bereikt die als overlastgevend wordt beschouwd. Ook het vaststelen van de te onderscheiden functies en de overlastgevende minimum waterhoogte hoort bij het operationaliseren van het onderzoek.
Hoe groot het verschil is tussen de algemene definitie van de variabele (''het begrip zoals bedoeld'') en de operationele definitie van de variabele (''het begrip zoals gemeten'') hangt sterk samen met het type onderzoeksvraag. Indien de vraagstelling betrekking heeft over concrete, direct meetbare fenomenen (zoals de mate van zettingen van een gebouw tijdens de bouw van een metrolijn, de grootte van het huishouden van een respondent, etc.), dan zal de operationalisatie relatief eenvoudig zijn. Soms bevat de vraagstelling echter complexe begrippen als de tevredenheid van werknemers, het gebruiksgemak van een apparaat e.d. - dergelijke variabelen zijn lastiger te operationaliseren.
Er is een duidelijke samenhang tussen de manier van operationaliseren van een variabelen en het gekozen type onderzoek. Stel bijvoorbeeld dat je onderzoek wilt doen naar het bedieningsgemak van een apparaat, bijvoorbeeld een navigatiesysteem. Je zou het bedieningsgemak kunnen bepalen aan de hand van een enquête onder gebruikers van het apparaat. In dat geval kun je 'bedieningsgemak' operationaliseren als een score (''helemaal eens'', ''meer eens dan oneens'', ''meer oneens dan eens'', ''geheel oneens'') op één of meerdere stellingen met betrekking tot het bedieningsgemak van het betreffende apparaat. Bij een observatie-onderzoek of een zou je bijvoorbeeld kunnen kijken per deeltaak naar de tijd die geobserveerde proefpersonen hiervoor nodig hebben.
===Uitwerking van het onderzoeksdesign===
De uitwerking van het onderzoeksdesign zal meestal voor uitvoering ervan worden overlegd met de opdrachtgever van het onderzoek - of tenminste intern met collegae c.q. begeleiders. Daarom is het wenselijk om de operationalisatie van het onderzoek altijd schriftelijk vast te leggen, dus ook onderzoek dat je doet in het kader van een (afstudeer)project op school of universiteit. Er worden verschillende namen gebruikt voor rapporten waarin het onderzoek is uitgewerkt tot op operationeel niveau - dat wil zeggen zodanig dat het plan voldoende detail heeft om op basis daarvan het onderzoek ook te kunnen uitvoeren. Met name voor observatie-onderzoek en experimenten met een meer natuurwetenschappelijk karakter wordt het begrip ''meetplan'' gebruikt. Aangezien dit begrip ook duidelijker dan bijvoorbeeld het alternatief ''onderzoeksopzet'' aangeeft dat het hier gaat op de uitwerking van het onderzoek tot operationeel niveau, wordt het eerste begrip hier gebruikt.
===Controle in het onderzoeksdesign===
Toegepast onderzoek kan in meer of mindere mate beschrijvend en toetsend van aard zijn. Bij beschrijvend onderzoek staat de verwerving van (nieuwe) kennis centraal. Dit kan kennis zijn over de toestand van het object van onderzoek in het verleden, in het heden of in de toekomst. Beschrijvend onderzoek maakt hiertoe gebruik van zowel empirische gegevens ('metingen') als theoretische verbanden. Toetsend onderzoek heeft tot doel om uitspraken over de werkelijkheid ({{Wp|hypothese|hypothesen}}) te toetsen aan de werkelijkheid. Deze hypothesen zullen meestal betrekking hebben op het verband tussen twee of meer variabelen. Hoe een onderzoeker aan zo'n hypothese komt maakt eigenlijk niet zoveel uit: op basis van eerder onderzoek, intuïtie, modelstudie, etc.: het gaat er om dat de hypothese kritisch tegen het licht wordt gehouden.
Bij toetsend onderzoek is het van belang dat goed wordt nagedacht over de controle in het onderzoeksdesign. Wat controle inhoudt, kan wellicht het beste worden uitgelegd aan de hand van een voorbeeld. Een docent vermoedt op basis van positieve ervaringen van een collega dat het instellen van een aanwezigheidsplicht bij zijn colleges zal leiden tot betere toetsresultaten. De opleiding denkt erover om aanwezigheidsplicht te gaan invoeren, maar wil voordat dat definitief wordt mogelijk gemaakt, eerst kritisch toetsen of aanwezigheidsplicht inderdaad positief zal werken op de resultaten. Een mogelijkheid is om de toetsresultaten van een cursus met aanwezigheidsplicht te vergelijken met die van een cursus zonder aanwezigheidsplicht. De vraag is echter dan in hoeverre de gemeten verschillen zijn toe te schrijven aan de aanwezigheidsplicht, of aan verschillen in de moeilijkheid van het vak, de kwaliteit van het onderwijs, de achtergrond van de studenten, de moeilijkheidsgraad van de toets, etc. Het kunnen uitsluiten van andere
verklarende problemen is het probleem van ''controle'' in het onderzoeksontwerp.
===Toetsing van het onderzoeksdesign===
Voordat het definitief wordt uitgevoerd, is een toetsing wenselijk op de volgende kernaspecten:
*Is je onderzoeksmethode wel {{Wp|validiteit|valide}}?
*Is je onderzoeksopzet wel ethisch verantwoord?
Maar ook op meer praktisch niveau is het verstandig om voor aanvang van het onderzoek het meetplan nog eens kritisch te bekijken. Het meetplan kun je aan de hand van de volgende vragen controleren:
* Is mijn meetopstelling relevant genoeg in het licht van mijn onderzoeksvragen?
* Heb ik de juiste meetinstrumenten gekozen om mijn onderzoeksvragen te kunnen beantwoorden? Zijn deze nauwkeurig, betrouwbaar, etc. genoeg?
* Zijn mijn meetinstrumenten {{Wp|validiteit|valide}} en zijn ze {{Wp|kalibreren|gekalibreerd}}?
* Is mijn meetplan realistisch qua tijdsplan? Is de volgorde van de activiteiten juist?
* Is mijn meetopstelling veilig? Heb ik de risico's voor de onderzoeker en de omgeving voldoende uitgesloten?
De eerste vier vragen hebben een relatie met het aspect ''validiteit'', terwijl de vijfde vraag mede te maken heeft met de ''ethiek'' van het onderzoek.
====Validiteit van het onderzoek====
Het onderzoeksontwerp is valide, wanneer het je in staat stelt op basis van je bevindingen juiste conclusies te trekken. Er zijn een aantal redenen waarom een onderzoeksontwerp niet-valide zou kunnen zijn. De onderzoeker kan bijvoorbeeld een meetinstrument kiezen dat iets anders meet dan bedoeld. Stel dat de meetapparatuur die je wilt gebruiken om zettingen aan belendende gebouwen naast een {{Wp|bouwkuip|bouwkuip}} te monitoren niet gevoelig genoeg is, dan kan het gebeuren dat optredende zettingen niet of te laat pas worden gesignaleerd. Is de meetapparatuur te gevoelig ingesteld, dan geeft dat vals alarm. Lastiger is het nog om validiteit te waarborgen in de sociale wetenschappen. Hoe toon je bijvoorbeeld aan dat de score op een bepaalde IQ-test inderdaad een betrouwbare afspiegeling is van de {{Wp|intelligentie|intelligentie}} van de onderzochte personen? Ook bij het gebruik van modellen (in plaats van metingen aan de werkelijkheid) is het uiteraard van belang of het gebruikte model wel een voldoende correcte afspiegeling van de werkelijkheid is. Bedenk hierbij dat iedere model een versimpeling is van de werkelijkheid. Een versimpeling die voor de ene vraagstelling prima is, kan voor de andere vraagstelling onverantwoord zijn.
====Onderzoeksethiek====
Onderzoek kan nuttige kennis opleveren, maar ondoordacht onderzoek kan ook schade berokkenen. Bij de opzet van het onderzoek moet je je derhalve goed afvragen of het wel {{Wp|ethiek|ethisch}} verantwoord is. Het leidende principe hierbij is dat je mensen geen schade mag berokkenen; dus kinderen in een schoolklas doelbewust langere tijd blootstellen aan bepaalde stressfactoren om te bekijken of dat hun schoolprestaties nadelig beïnvloedt kan wellicht interessante gegevens opleveren, maar is uit ethisch oogpunt slecht verdedigbaar. Maar sommige vraagstukken zijn lastiger. Mag je bijvoorbeeld nieuwe medicijnen, die reeds op volwassen proefpersonen zijn uitgeprobeerd, testen op (zieke) kinderen om de juiste dosering en de mate van optreden van bijwerkingen te bepalen? Mag je bij dit onderzoek een controlegroep instellen die een {{Wp|placebo|placebo}} (nepmedicijn) krijgt, om zo uit te kunnen sluiten dat gemeten werkzaamheid of bijwerkingen aan {{Wp|placebo-effect|placebo-effecten}} zijn toe te schijven?
==Uitwerking van het meetplan==
Als de onderzoeksopzet is uitgewerkt, zal meestal meten één van de activiteiten zijn die onderdeel is van het onderzoek. Kenmerkend voor de wetenschappelijke methode, ook bij praktijkonderzoek, is een goede voorbereiding van de metingen. Voordat je daadwerkelijk kunt beginnen met meten, moeten een aantal vragen worden beantwoord:
*Wat is het doel van de metingen? (''onderzoeksdoel'')
*Waaraan ga je meten? (''onderzoeksobject'')
*Wat ga je meten? (''onderzoeksvariabelen'')
*Waarmee ga je meten? (''meetinstrumentarium'')
*Wat is je ''meetopstelling''?
*Hoeveel metingen ga je verrichten? (''steekproefomvang'')
*Wanneer kun je wel/niet meten? (''randvoorwaarden'')
Deze keuzes worden vastgelegd in een ''meetplan''.
Het vastleggen van de aanleiding en doel van de metingen is reeds eerder aan bod gekomen in dit hoofdstuk. Ook het onderzoeksobject en de (operationalisatie van) onderzoeksvariabelen zijn daar reeds genoemd. In deze paragraaf gaan we verder met de vraag waarmee rekening moet worden gehouden bij de verdere uitwerking van de meetopzet (keuze meetinstrumenten, meetopstelling, steekproefomvang en randvoorwaarden) om te kunnen beantwoorden aan het doel van het onderzoek.
Verstandig omgaan met het beschikbare (tijds)budget voor onderzoek betekent dat:
*Het meetinstrument nauwkeurig en betrouwbaar genoeg is voor het gegeven doel.
*Het aantal metingen en het aantal meetpunten voldoende is voor een betrouwbaar beeld.
*De omvang van het onderzoek niet onnodig groot is gegeven het doel.
*Er een verstandige afweging wordt gemaakt tussen enerzijds kosten van inzet en anderzijds de kwaliteit van meetinstrumenten.
Met andere woorden: niemand is gebaat bij het moeten overdoen of aanvullen van metingen vanwege onvoldoende betrouwbare resultaten, maar ook is niemand gebaat bij het doen van een overdreven omvangrijk onderzoek, als dezelfde onderzoeksvraag met beduidend minder inzet van middelen ook prima beantwoord had kunnen worden.
==Uitvoering van het onderzoek==
Als het onderzoek goed is doordacht en voorbereid kan het ook daadwerkelijk worden uitgevoerd op basis van het onderzoeksvoorstel of meetplan. Er kunnen zich echter tussentijds omstandigheden voordoen, waardoor het onderzoek moet worden stopgezet. Denk hierbij aan weersomstandigheden die buitenmetingen belemmeren, of tussentijdse resultaten in een medisch onderzoek die vragen om tussentijds stoppen van het experiment. In een goed onderzoeksvoorstel of meetplan wordt echter ook vastgelegd onder welke omstandigheden het onderzoek kan plaatsvinden, wanneer onderzoeksresultaten tussentijds worden geëvalueerd en in wat voor situaties het onderzoek tussentijds moet worden gestopt.
Tijdens het onderzoek moeten de gegevens zorgvuldig worden gedocumenteerd. Observaties (aflezingen van meetinstrumenten, maar ook visuele registratie van gebeurtenissen) moeten zodanig worden opgeschreven dat er bij het verwerken van de gegevens er geen onduidelijkheden kunnen ontstaan. Onvolledige registraties, bijvoorbeeld wanneer wel het instrument is afgelezen, maar het tijdstip van aflezen onbekend, of wanneer enquêtes niet volledig zijn afgenomen door de telefonische enquêteur, maken de onderzoeksresultaten minder bruikbaar of zelfs onbruikbaar.
Aan het eind van het uitvoeren van het onderzoek evalueer je kort of het onderzoek volgens plan is verlopen. Op basis daarvan beslis je of de resultaten bruikbaar zijn, of dat er metingen moeten worden overgedaan.
==Analyse van de gegevens==
Een volgende stap is de verder analyse van de ruwe gegevens. De analyse en interpretatie van de gegevens kan qua tijdsbeslag de uitvoeringsfase van het onderzoek met een veelvoud overtreffen. Bij een goed gepland onderzoek zijn de toe te passen analysetechnieken reeds in het onderzoeksvoorstel vastgelegd. De uiteindelijke interpretatie van de onderzoeksresultaten, inclusief de uitkomsten van de (statistische) analyses, blijft echter mensenwerk. Het is raadzaam om in deze fase te overleggen met vakgenoten, om zo interpretatiefouten te voorkomen. Ook een goede kennis van de literatuur is hier van groot belang: zowel wat betreft de achterliggende theorie, als mogelijke tekortkomingen van de onderzoeksopzet en het juist gebruik van de analysetools vragen om een grondige kennis van bestaande theoretische en praktische inzichten.
Bij de analyse van kwantitatieve gegevens wordt meestal gebruik gemaakt van technieken uit de {{Wp|statistiek|statistiek}}. Hierbij wordt onderscheid gemaakt tussen beschrijvende statistiek en verklarende statistiek. <ref>De uitwerking hieronder is een bewerking van een gedeelte van het lemma {{Wp|statistiek|statistiek}} van nl.wikipedia (versie: zie [https://nl.wikipedia.org/w/index.php?title=Statistiek&oldid=18190671]; auteurs: {{Wp|gebruiker:Madyno|Madyno}} e.a., zie [https://nl.wikipedia.org/w/index.php?title=Statistiek&limit=500&action=history]</ref>
[[Bestand:MAD-Histogram01.png|400px|thumb|Een voorbeeld van het gebruik van beschrijvende statistiek ({{Wp|histogram|histogram}}) voor het representeren van meetgegevens <ref>bron: https://commons.wikimedia.org; auteur: Nijdam</ref>]]
De beschrijvende statistiek houdt zich in principe bezig met de beschrijving van bepaalde gegevens van een {{Wp|Populatie (statistiek)|populatie}}. Als voorbeeld kan men denken aan een {{Wp|volkstelling|volkstelling}}. De gegevens worden geordend en gereduceerd, indien gewenst tot relevante {{Wp|Kengetal (statistiek)|kengetal}}len. Voorbeelden hiervan zijn het {{Wp|gemiddelde|gemiddelde}} en de {{Wp|mediaan|mediaan}} als maten voor centrale tendentie en de {{Wp|standaarddeviatie|standaarddeviatie}} als maat voor spreiding. In overzichtelijke tabellen, grafieken en figuren worden ten slotte de gegevens gepresenteerd. Een belangrijk deel van het werk van het {{Wp|Centraal Bureau voor de Statistiek|Centraal Bureau voor de Statistiek}} betreft dit deelgebied.
Verklarende statistiek (ook wel inductieve statistiek of mathematische statistiek genoemd) tracht aan de hand van een steekproef informatie omtrent de gehele populatie te verkrijgen. Om allerlei redenen kan het ongewenst of onmogelijk zijn de hele populatie te onderzoeken. In plaats daarvan onderzoekt men een deel van de populatie: de steekproef. Men verkrijgt zo echter slechts beperkte informatie over de populatie. De inductieve statistiek geeft geschikte methoden en onderzoekt de kwaliteit daarvan. Bekende methoden zijn {{Wp|toets (statistiek)|toets}}en, {{Wp|schattingsmethode|schattingsmethoden}} en als combinatie van beide: {{Wp|betrouwbaarheidsinterval|betrouwbaarheidsintervallen}}.
Bij de afronding van de analyse kun je de volgende evaluerende vragen stellen:
* Zijn alle gegevens verwerkt en zijn de toegepaste analyses op de data goed gedocumenteerd, zodat analyses eventueel overgedaan kunnen worden ter controle?
* Zijn alle verzamelde gegevens gearchiveerd?
* Is de interpretatie van de gegevens coherent en voldoende doordacht (en bediscussieerd met collega's)?
==Rapportage van de onderzoeksresultaten==
De rapportage van de onderzoeksresultaten is een essentieel onderdeel van het onderzoeksproces. Deze rapportage kan hele verschillende vormen aannemen: van een korte rapportage van de meetresultaten voor intern gebruik tot een paper in een vakblad of wetenschappelijk tijdschrift of een {{Wp|proefschrift|proefschrift}}. Deze verschillende typen publicaties hebben echter een verschillend publiek.
Bij de keuze hoe je gaat rapporteren, zul je je dus allereerst moeten afvragen voor wie je schrijft. Denk hierbij o.a. aan:
* de opdrachtgever: intern of extern
* vakgenoten: collega-onderzoekers of gebruikers van je onderzoeksresultaten
* beleidsmakers
* algemeen geïnteresseerden
* etc.
Meestal zul je het onderzoek eerst intern rapporteren voor bespreking met collegae en de opdrachtgever. Soms zal echter ook een openbare publicatie worden overwogen. Dit is zeker gebruikelijk met universitair onderzoek, maar ook praktijkonderzoek wordt vaak gerapporteerd in vaktijdschriften en in congresbijdragen.
Een openbare publicatie, zoals een artikel in een vaktijdschrift, is alleen zinvol al aan een aantal voorwaarden is voldaan:
* Het onderzoek moet zodanig succesvol zijn dat er zinvolle conclusies uit zijn getrokken
* De inzichten uit het onderzoek moeten iets toevoegen aan de bestaande kennis. In de rapportage moet dus ook verwezen worden naar bestaande inzichten.
* Er mogen geen legale of contractuele bezwaren zijn tegen een openbare publicatie. De opdrachtgever van het onderzoek zal in ieder geval moeten instemmen.
{{Voetnoten}}
{{Bladeren2
|Boek=Meten en onzekerheid
|vorige=Onderzoek
|tekstvorige=1. Onderzoek
|huidige=2. Het onderzoeksproces
|volgende=Meten
|tekstvolgende=3. Meten
}}
{{Sub}}
8oh0t6ej8xs8qa0a9jncvtwer80gg05
Kookboek/Maïssoep
0
22188
428059
409202
2026-05-20T05:26:14Z
Erik Baas
2193
lf
428059
wikitext
text/x-wiki
{{Infobox recept
| Naam = Kookboek/Maïssoep
| Afbeelding = <!--
-->{{Afbeelding
|afbeelding = Corn soup.jpg
|helderheid = 120
|contrast = 110
|margin = 0
|onderschrift =
|grootte = 470
|clip-breedte = 300
|clip-hoogte = 250
|offset-x = 70
|offset-y = 200
|border = 0
}}
| Categorie = Soeprecept
| Porties = 4
| Energie =
| Tijd = drie kwartier
| Stippen = 1
}}
'''Maïssoep''' is een voorgerecht; met wat {{Kb|brood}} erbij kan het ook uitstekend als hoofdgerecht gebruikt worden.
== Ingrediënten ==
* 1 {{Kb|p=paprika|rode paprika}}
* 1/2 {{Kb|p=paprika|gele paprika}}
* 1 behoorlijke {{Kb|ui}}
* 2 tenen {{Kb|knoflook}}
* 1 theelepel {{Kb|p=kerrie|kerriepoeder}} (liefst kerrie Massala)
* 2 eetlepels {{Kb|bloem}}
* 1 liter {{Kb|melk}}
* 1 blik {{Kb|maïs}}
* 1 eetlepel {{Kb|boter}} of {{Kb|margarine}}
* {{Kb|bouillon}} (poeder/tablet)
* peper en zout
===Bereiding===
#Snijd de ui en paprika, pers de knoflook uit.
#Verwarm de boter/margarine en smoor hierin de ui en knoflook.
#Als deze glazig zijn: paprika en kerriepoeder erbij, weer een paar minuten verwarmen.
#Voeg dan de bloem toe en warm dit al roerend een paar minuten goed door.
#Giet er onder goed roeren bij gedeelten de melk bij tot een gebonden soep ontstaat.
#Voeg dan evt. nog wat water toe.
#Voeg, zodra het kookt, bouillon, zout en peper naar smaak toe, en de maïs.
#Laat nog een tijdje goed warm worden.
==Variatie==
* {{Kb|Broccoli}} of {{Kb|aubergine}} erbij (tegelijk met de maïs), en geraspte {{Kb|kaas}} erover.
* [https://4en5meiamsterdam.nl/hier-vind-je-het-recept-van-de-vrijheidssoep-2023/ Vrijheidssoep 2023]: Maïssoep met kokos en zoete aardappel
{{Navigatie recepten}}
[[Categorie:Voorgerecht|Maïssoep]]
[[Categorie:Soeprecept|Maïssoep]]
{{Sub}}
t6sy1qsx5komzabdq1rzaltc22olnse
Kookboek/Boerensandwich
0
22328
428069
394780
2026-05-20T05:26:22Z
Erik Baas
2193
lf
428069
wikitext
text/x-wiki
{{Infobox recept
|
|Afbeelding = [[Bestand:Bacon and egg sandwich.JPG|300px]]
|Naam=Boerensandwich
|Categorie=Broodrecept
|Porties=1
|Energie=
|Tijd=± 10 minuten
|Stippen=1
}}
'''Boerensandwich''' is een sandwich met gebakken ei en spek. Hij heet wel "boerensandwich", maar wordt niet per se door boeren gemaakt.
==Ingrediënten==
*2 of 3 sneetjes bruin brood
*1 of 2 eieren
*Sla
*Bacon of ontbijtspek
*Mayonaise
*Mosterd
*Zout
*Peper
*Boter
==Benodigdheden==
*Koekenpan
*Spatel
*Grill - Hoeft niet
==Bereidingswijze==
#Pak de koekenpan en zet deze op het vuur, doe er een beetje boter in en wacht tot deze bruin wordt
#Leg ondertussen de twee sneetjes brood onder de grill (hoeft niet maar is erg lekker, zo kun je ook oud brood wegwerken!)
#Doe het eitje of de twee eieren in de pan en de bacon ernaast. Voeg zout en peper naar smaak toe
#Bak deze tot zo gaar en een beetje knapperig zijn
#Snij ondertussen de sla
#Haal het brood onder de grill vandaan en doe aan één zijde mayonaise
#Leg de sla er op, vervolgens het eitje of de eitjes en hierna de bacon. Doe nog een beetje sla hierboven op en leg de andere sneetje hierbovenop.
==Bereidingstijd==
Ongeveer 10 minuten
==Opdientip==
Snij de sandwich schuin doormidden.
==Variaties==
*U kunt ook 3 sneetjes brood pakken en een nog dikkere sandwich te maken, ga hiervoor door na de eerste laag.
*U kunt ook champignons toevoegen.
*U kunt ook een omeletje maken met champignons en tomaten in plaats van het eitje.
*U kunt er ook nog een plakje kaas op leggen.
{{Navigatie recepten}}
[[Categorie:Broodrecept|Boerensandwich]]
[[Categorie:Eierrecept|Boerensandwich]]
[[Categorie:Lunchgerecht|Boerensandwich]]
{{Sub}}
mzae1l7hnyzimhfzm1jd37npolvsyyt
Wikijunior:Schaken voor beginners/Stukken en beginstelling
104
22780
428190
397189
2026-05-20T05:39:41Z
Erik Baas
2193
428190
wikitext
text/x-wiki
==Het schaakbord==
Het schaakbord bevat 64 hokjes, deze hokjes worden velden genoemd. Er zijn 32 witte en 32 zwarte velden. In de tekening hebben de zwarte velden de groene kleur gekregen, maar op een echt schaakbord zijn ze zwart. Als je achter een schaakbord zit moet het veld linksonder altijd '''zwart''' zijn, anders ligt het bord verkeerd.
Het schaakbord bestaat uit acht rijen en acht lijnen. De rijen lopen van horizontaal over het bord en de lijnen lopen van verticaal over het bord. In het begin staan alle pionnen van wit op dezelfde rij. Dit is de tweede rij gezien vanuit de wit-speler. Dit geldt ook voor de zwarte pionnen maar dan op de zevende rij gezien vanuit de wit-speler.
===Namen===
Alle rijen hebben een cijfer en alle lijnen hebben een letter. Zo hebben alle velden hun eigen naam. Dat is de letter van de lijn met het cijfer van de rij. Vanuit wit gezien is linksonder a1 en rechtsboven h8.
==De stukken en de beginstelling==
Dit is de beginstelling:
{{Schaakdiagram|=
8 |rd|nd|bd|qd|kd|bd|nd|rd| r8=
7 |pd|pd|pd|pd|pd|pd|pd|pd| r7=
6 | | | | | | | | | r6=
5 | | | | | | | | | r5=
4 | | | | | | | | | r4=
3 | | | | | | | | | r3=
2 |pl|pl|pl|pl|pl|pl|pl|pl| r2=
1 |rl|nl|bl|ql|kl|bl|nl|rl| r1=
a b c d e f g h
|}}
Je ziet dat behalve een rij met acht pionnen elke speler nog vijf andere verschillende stukken heeft:
* twee '''T'''orens: deze staan voor wit op a1 en h1 en voor zwart op a8 en h8
* twee '''P'''aarden: deze staan voor wit op b1 en g1 en voor zwart op b8 en g8
* twee '''L'''opers: deze staan voor wit op c1 en f1 en voor zwart op c8 en f8
* één '''D'''ame: deze staat voor wit op d1 en voor zwart op d8
* één '''K'''oning: deze staat voor wit op e1 en voor zwart op e8
Merk op dat de dames allebei op hun eigen kleur staan!
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=De basisregels
|tekstvorige=
|huidige=Het bord, de stukken en de beginstelling
|volgende=Verplaatsen van stukken
|tekstvolgende=
}}
{{Juniorsub}}
45cub4q43rvvlb8gda9fcrbrd7qmejw
Wikijunior:Schaken voor beginners/Verplaatsen van stukken
104
22783
428191
401491
2026-05-20T05:53:53Z
Erik Baas
2193
428191
wikitext
text/x-wiki
Elk stuk heeft een vaste manier van bewegen. Sommige stukken mogen meer dan andere, dat wil zeggen dat ze zich per beurt over meer velden dan andere mogen verplaatsen. Stukken mogen verder alleen naar een veld verplaatst worden dat:
*leeg is
*door een stuk van de tegenstander bezet is; het stuk van de tegenstander wordt dan van het schaakbord weggenomen. Dit noemen we slaan. In principe kan elk stuk elk ander stuk van de tegenpartij slaan.
Je mag dus nooit je eigen stukken slaan! Verder gelden er voor de koning nog een aantal beperkingen; hij mag zichzelf namelijk nooit "schaak" zetten.
== Koning ==
De koning mag per keer één veld opschuiven in horizontale, verticale of diagonale richting.
Verder is er nog een [[Wikijunior:Schaken voor beginners/Bijzondere zetten#Rokeren|bijzondere zet]] die ergens anders wordt uitgelegd.
{{Schaakdiagram|=
8 | | |xx| | |xx| | | r1=
7 | | | |xx| |xx| |xx| r2=
6 | | | | |xx|xx|xx| | r3=
5 | |nd|xx|xx|xx|ql|xx|xx| r4=
4 | | | | |xx|xx|xx| | r5=
3 | | | |rl| |xx| |xx| r6=
2 | | | | | |xx| | | r7=
1 | | | | | |xx| | | r8=
a b c d e f g h
|Kopregel=De mogelijke zetten voor de dame
|Voetregel=De witte dame kan het zwarte paard slaan
|Float=right
|30}}
== Dame ==
De dame mag zich één of meer velden verplaatsen in horizontale, verticale of diagonale richting. Maar de dame mag nooit over stukken heen springen, niet van de eigen kleur en ook niet over de andere kleur.
== Toren ==
De toren mag zich één of meer velden verplaatsen in horizontale of verticale richting. Ook voor de toren geldt dat die niet over andere stukken heen kan springen.
{{Schaakdiagram|=
8 | | | | | | | |xx| r1=
7 |xx| | | | | |xx| | r2=
6 | |xx| | | |xx| | | r3=
5 | | |xx| |xx| | | | r4=
4 | | | |bl| | | | | r5=
3 | | |xx| |xx| | | | r6=
2 | |rd| | | |nl| | | r7=
1 | | | | | | | | | r8=
a b c d e f g h
|Kopregel=De mogelijke zetten voor de loper
|Voetregel=De witte loper kan de zwarte toren slaan
|30}}
== Loper ==
De loper mag zich één of meer velden verplaatsen in diagonale richting, zolang hij daarbij niet springt over de eigen stukken of de stukken van de tegenstander.
Een loper die begint op een wit veld zal nooit op een zwart veld terecht kunnen komen en een loper op een zwart veld zal nooit uit kunnen komen op een wit veld.
<br>
{{Schaakdiagram|=
8 | | | | | | | | | r1=
7 | | | | | | | | | r2=
6 | |xx| |xx| | | | | r3=
5 |xx| | | |xx| | | | r4=
4 | | |nd| | | | | | r5=
3 |xx| | | |xx| | | | r6=
2 | |xx| |xx| | | | | r7=
1 | | | | | | | | | r8=
a b c d e f g h
|Kopregel=De mogelijke zetten voor het zwarte paard op c4
|Voetregel=Een paard kan maximaal acht verschillende zetten doen
|Float=right
|30}}
== Paard ==
Een paard verplaatst zich in de paardensprong. Een paardensprong bestaat uit een stap van twee velden horizontaal of verticaal en daarna één stap opzij. Een paard is het enige stuk dat wel over andere stukken heen mag springen.
<br>
{{Schaakdiagram|=
8 | | | | | | | | | r1=
7 | | | |xx|pd| | |pd| r2=
6 | | |pd|pl|xx| | |xx| r3=
5 | | |xx| | |xx| |xx| r4=
4 |xx| | | | |pl| | | r5=
3 |xx| | | | | | | | r6=
2 |pl| | | | | | | | r7=
1 | | | | | | | | | r8=
a b c d e f g h
|Voetregel=De zetten die een pion mag doen
|30}}
== Pion ==
De pion is het enige stuk dat niet achteruit mag. Een witte pion kan alleen maar naar boven lopen en een zwarte pion alleen naar beneden. Zolang de pion nog op de beginplaats staat (2e rij voor wit, 7e rij voor zwart) mag de pion twee stappen naar voren gaan. Staat de pion echter niet meer op de beginplaats dan mag deze alleen nog maar één stapje vooruit.<br>
Slaan is een bijzonder geval bij de pion. Alle andere stukken slaan ook volgens hoe ze lopen. De pion mag alleen maar schuin slaan. De witte pion op d6 mag nu bijvoorbeeld de pion op e7 slaan, het is niet verplicht, de pion mag ook gewoon een stapje naar voren zetten.<br>
Er zijn nog twee [[Wikijunior:Schaken voor beginners/Bijzondere zetten|speciale zetten]] die ergens anders worden uitgelegd.
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Stukken en beginstelling
|tekstvorige=Het bord, de stukken en de beginstelling
|huidige=Verplaatsen van stukken
|volgende=Winnen
|tekstvolgende=
}}
{{Juniorsub}}
7wwnq4gbait0yfg7oywfkidc7pszlxt
Kookboek/Spaghetti Bolognese
0
23163
428068
395585
2026-05-20T05:26:22Z
Erik Baas
2193
lf
428068
wikitext
text/x-wiki
{{Infobox recept
|
| Afbeelding = [[Bestand:Spaghetti bolognese at Allun Grilli.jpg|300px]]
| Categorie = Pastarecept
| Porties = 4
| Energie =
| Tijd = 20 minuten
| Stippen = 2
}}
*Snij drie flinke {{Kb|p=ui|uien}} fijn en bak deze in de pan tot ze glazig zijn.
*Doe er 300 gram {{Kb|gehakt}} bij en rul het met een vork. Voeg er peper, zout, 1 à 2 teentjes verse knoflook, 1 tl {{Kb|paprikapoeder}} en 1 tl oregano bij, vervolgens nog twee blikjes {{Kb|tomatenpuree}} en twee glazen water (of een blikje gepelde tomaten met een half glas water of 6 verse {{Kb|p=tomaat|tomaten}}.
*Snij 1 bakje {{Kb|p=champignon|champignons}} en 1 rode {{Kb|paprika}}.
*Verhit op een hoog vuur en blus af met een rode {{Kb|wijn}} (dezelfde als die je erbij drinkt). Nu de champignons en paprika erbij, goed blijven roeren en eventueel nog wat water erbij.
*Breng een grote pan water aan de kook met een blokje (pasta-)bouillon erin. Als het kookt de spaghetti erin.
*Af en toe een spaghettistreng eruit halen en proeven of hij gaar is. Niet te lang laten koken (hooguit 8 minuten, de precieze kooktijd hangt af van het soort spaghetti).
Serveren: losse spaghetti in schaal, de saus in een andere schaal. Wijntje erbij en smullen maar.
{{Navigatie recepten}}
[[Categorie:Pastarecept|Spaghetti bolognese]]
{{Sub}}
csj257cpa7nteqmt5lqtm8zc0tnj8r0
Kookboek/Witlof met kaas
0
23745
428063
406001
2026-05-20T05:26:18Z
Erik Baas
2193
lf
428063
wikitext
text/x-wiki
{{Infobox recept
| Naam =
|Afbeelding=[[Bestand:Witlof_met_kaas.jpg|300px]]
| Categorie = Groentenrecept
| Porties = 2-3
| Energie =
| Tijd = 30 minuten
| Stippen = 3
}}
==Ingrediënten==
Voor 2 à 3 personen
* 4 stronken {{Kb|witlof}}
* 6 middelgrote {{Kb|p=Aardappel|aardappelen}}
* 4 klontjes [[Kookboek/Boter|roomboter]]
* 8 plakken jong belegen {{Kb|kaas}}
* Een scheut zonnebloem- of olijf[[Kookboek/Olie en vet|olie]]
* [[Kookboek/Zout|Zout]]
==Voorwerpen==
* zeef
* pan
* koekenpan
==Bereidingswijze==
* Snij de pit uit de witlofstronken (bitter) en snij ze in de lengte doormidden.
* Kook in een bodem 5 minuten wat water met een snufje zout.
* Schil intussen de aardappelen, was ze en snijd ze in blokjes.
* Laat de witlof uitlekken in een zeef.
* Kook de aardappelen met een beetje zout 15 minuten gaar, in zoveel water dat ze net niet onder staan.
* Doe de halve witlofstronken in een koekenpan met olie en bak aan beide zijden lichtbruin.
* Leg op alle stronken een plak kaas en doe een deksel op de koekenpan om de kaas te laten smelten.
* Giet het water van de aardappelen en dien ze op met een klontje roomboter.
* Leg twee witlofhelften met de gesmolten kaas op het bord.
* Opdienen met een [[Kookboek/Saladerecept|salade]].
{{Navigatie recepten}}
{{Tuinkalender|Witlof|witlof}}
{{Wikipedia|Naam=Witlof|Pagina=Witlof}}
{{Commonscat|Food}}
[[Categorie:Groentenrecept|Witlof]]
[[Categorie:Vegetarisch recept|Witlof]]
{{Sub}}
8784d306n9iiyspumbo89rfl2c9efiz
Kookboek/Patatas bravas
0
24046
428065
398501
2026-05-20T05:26:19Z
Erik Baas
2193
lf
428065
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Patatas bravas (4550178779).jpg|300px]]
| Onderschrift =
| Categorie = Aardappelrecept
| Porties = 1
| Energie =
| Tijd = ± 15 minuten
| Stippen = 3
}}
'''Patatas bravas''' is een gerecht met aardappelen in een pittige tomatensaus. De aardappelen zijn in ongelijke vorm gesneden met een grootte van ongeveer 2 centimeter, en worden gefrituurd in olie. Vaak gaan de aardappelen vergezeld met een hete, pikante tomatensaus, de salsa brava, welke over de patatas bravas wordt gegoten en gezamenlijk heet wordt opgediend.
==Ingrediënten==
* 2 dl extra virgin {{Kb|olijfolie}}
* 1 voorgekookte {{Kb|aardappel}}; in kleine stukjes gesneden
* 1 snuifje zeezout
'''Voor de saus:'''
* 2 theelepels {{Kb|mosterd}}
* 6 druppels {{Kb|p=tabascosaus|Tabasco}}
* 500 ml {{Kb|tomatenpuree}}
==Bereiding==
*Warm olijfolie op in een frituurpan.
*Voeg er de stukjes aardappel aan toe en frituur ze voor ongeveer 5 minuten (tot ze goudbruin zijn).
*Laat het vet van de aardappelen afdruipen en strooi er daarna het zeezout over.
*Voeg de mosterd en de Tabasco toe aan de tomatenpuree en mix het geheel.
*Verspreid de warme saus over de aardappelen.
==Tips==
Indien je zelf geen tijd of zin hebt om aan de slag te gaan met bovenstaande gerechten, kun je uiteraard steeds beroep doen op een ervaren tapasspecialist. Zij zullen je bijstaan om van je tuinfeest een waar succes te maken.
{{Navigatie recepten}}
[[Categorie:Spaanse keuken|Patatas]]
[[Categorie:Tapasrecept|Patatas]]
[[Categorie:Aardappelrecept|Patatas]]
{{Sub}}
bv29hn6jc5p5fmfo10lid6lt9tiemgv
Kookboek/Yogonaise
0
24296
428073
394829
2026-05-20T05:26:24Z
Erik Baas
2193
lf
428073
wikitext
text/x-wiki
'''Yogonaise''' is een koude, witte [[Kookboek/Saus|saus]] op basis van [[Kookboek/Yoghurt|yoghurt]] en [[Kookboek/Mayonaise|mayonaise]].
==Gebruik==
De saus wordt gebruikt ter vervanging van de calorierijke mayonaise.
*1 el versbereide mayonaise = 144 kcal
*1 el magere yoghurt = 7,5 kcal
*4 el mayonaise = 4 x 144 = 576 kcal
*2 el mayonaise + 2 el yoghurt = ( 2 x 7.5 kcal ) + ( 2 x 144 kcal ) = 303 kcal
Als we de helft mayonaise door de helft yoghurt mengen krijgen we een lekkere en veel caloriearmere koude saus.
==Ingrediënten==
*1 tl {{Kb|p=mosterd|dijonmosterd}}
*1 {{Kb|p=ei|eierdooier}}
*15 cl {{Kb|p=olie|zonnebloem-, soya- of maïsolie}}
*15 cl {{Kb|p=yoghurt|magere yoghurt}}
*sap van een partje [[Kookboek/Citroen|citroen]]
==Bereiding==
*Zorg ervoor dat alle ingrediënten op kamertemperatuur zijn, ook de kom.
*Doe de eierdooier en het citroen in de kom.
*Roer er de mosterd door.
*Voeg peper en zout toe.
*Klop alles goed los met een garde en laat even rusten.
*Terwijl je met de garde goed roert, de olie straalsgewijs toevoegen.
*Dan de yoghurt er door roeren tot je een mooie gebonden saus krijgt.
*Eventueel verder op smaak brengen met peper en zout.
{{Navigatie recepten}}
[[Categorie:Yoghurtrecept|Yogo]]
{{Sub}}
tc80iz2fv0ydvcew3309dqxujybldsg
Kookboek/Pasta met zalm en rucola
0
24451
428061
395182
2026-05-20T05:26:15Z
Erik Baas
2193
lf
428061
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/pasta met zalm en rucola
| Afbeelding=[[Afbeelding:Pasta_met_zalm_en_rucola.jpg|300px|''Pasta met zalm en rucola'']]
| Categorie = pastarecept
| Porties = 4 personen
| Energie =
| Tijd = 25 min
| Stippen = 2
}}
==Ingrediënten==
* 300 gram {{Kb|p=Pasta|pasta}} (bijvoorbeeld anelli)
* 2 eetlepels {{Kb|p=Olijfolie|olijfolie}}
* 2 eetlepels {{Kb|p=Pijnboompitten|pijnboompitten}}
* 4 {{Kb|p=zalm|zalmmoten}}
* 250 g {{Kb|p=mascarpone|mascarpone}}
* 1 1/2 theelepel citroensap
* 100 gram {{Kb|p=rucola|rucola}}
* 2 eetlepels balsamico azijn
* {{Kb|p=Peper|peper}} en {{Kb|p=Zout|zout}}
==Bereidingswijze==
* kook de pasta volgens de algemene bereidingswijze beetgaar.
* rooster de pijnboompitten in een droge koekenpan lichtbruin
* bestrooi de zalmmoten aan beide kanten met wat zout en peper en rooster deze onder de grill of in een grillpan aan beide kanten bruin in ca. 8 minuten
* roer de mascarpone los en meng het met de citroensap
* hak de rucola grof en giet de pasta af
* schep over elke zalmmoot wat van het mascarpone-mengsel en meng de rucola en pijnboompitten door de pasta
* breng de pasta op smaak met peper, zout en de balsamico azijn, en serveer deze bij de zalmmoten
==Tip==
Om dit snel te bereiden kan diepvrieszalm worden gebruikt die snel in de magnetron kan worden bereid.
{{Navigatie recepten}}
[[Categorie:Pastarecept|Pasta_met_zalm_en_rucola]]
[[Categorie:Italiaanse keuken|Pasta_met_zalm_en_rucola]]
[[Categorie:Zalmrecept|Pasta]]
{{Sub}}
bwavjtpo9g2w8cqtksz3pz2tt15d2bw
Kookboek/Pasta met parmaham
0
24499
428064
406076
2026-05-20T05:26:19Z
Erik Baas
2193
lf
428064
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/pasta met parmaham
| Afbeelding = [[Bestand:Spaghetti Carbonara von Unico Tauberbischofsheim 3.jpg|300px]]
| Categorie = pastarecept
| Porties = 4
| Energie =
| Tijd = 15 min
| Stippen = 1
}}
Dit recept is afkomstig uit het ''Klein Italiaans Reiskookboek'' van Onno Kleyn.
== Ingrediënten ==
* 2 tenen {{Kb|p=Knoflook|knoflook}}
* scheutje {{Kb|p=Olijfolie|olijfolie}}
* 5 blaadjes {{Kb|p=Basilicum|basilicum}}, in stukjes gescheurd
* 1 gedroogd chilipepertje
* 50 gram ontpitte groene {{Kb|p=Olijf|olijven}}, grof gehakt
* 100 gram {{Kb|p=ham|parmaham}}, in reepjes
* 1/2 dl {{Kb|p=Slagroom|slagroom}}
* 400 gram {{Kb|spaghetti}}
* 50 gram geraspte {{Kb|p=Parmigiano|parmigiano reggiano}}
* {{Kb|p=Zout|zout}}
== Bereiding ==
* bak de knoflook zachtjes in een koekenpan in wat olie tot hij begint te kleuren
* draai het vuur uit en meng er de basilicum, het pepertje, de olijven, de ham en de room door
* kook de spaghetti in ruim kokend water met zout en giet ze af als ze nog ''al dente'' zijn (zeker niet gaar)
* bewaar een kopje kookwater
* meng de pasta in de koekenpan met de saus en het kookwater, zet het vuur weer hoog en hussel tot de saus voldoende ingedikt is. In die tijd heeft de pasta zich volgezogen met smaak
* bestrooi met de ''parmigiano'' en serveer meteen
== Varianten ==
* Geef vooraf [[Kookboek/Waldorfsalade|Waldorfsalade]] om het tot een volledige maaltijd te maken. OF
* Voeg 100 g extra ham + 150 g extra kaas toe voor voldoende eiwitten en geef vooraf [[Kookboek/Pompoensoep met appel]], een andere groentesoep of geef een flinke rauwkostsalade erbij voor een volledige maaltijd.
{{Navigatie recepten}}
[[Categorie:Pastarecept|Parmaham]]
{{Sub}}
g6xbvnlqb1b1nfobpzq7cvxoh4dnefy
Kookboek/Roze pasta
0
24504
428066
407656
2026-05-20T05:26:20Z
Erik Baas
2193
lf
428066
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/roze pasta
| Afbeelding = [[Bestand:Rotiniwithtomatosauce.jpg|300px]]
| Categorie = pastarecept
| Porties = 2
| Energie =
| Tijd = 15 min
| Stippen = 1
}}
Dit is een pasta met een roze saus. Het recept is uitgevonden door mevrouw Talamelli.
== ingrediënten ==
* 200 gram {{Kb|p=Pasta|pasta}}, zoals ''penne rigate'' die de saus goed kan opnemen
* blik gepelde {{Kb|p=Tomaat|tomaten}}
* bekertje {{Kb|p=Crème fraîche|crème fraîche}}
* 150 gram {{Kb|p=Gorgonzola|gorgonzola}}
* teentje {{Kb|p=Knoflook|knoflook}}
* scheutje {{Kb|p=Olijfolie|olijfolie}}
* een paar takjes {{Kb|p=Tijm|tijm}}
== bereidingswijze ==
* kook de pasta, en maak ondertussen de saus
* teentje knoflook pletten en in de olie bakken
* gepelde tomaten er bij doen en met een houten spatel in zo klein mogelijke stukjes maken
* doe de gorgonzola er bij en laat deze smelten
* doe de crème fraîche er bij (de saus krijgt nu een roze kleur)
* voeg blaadjes thijm toe naar smaak
* pasta afgieten en door de saus roeren
== variaties ==
* Als je er groente aan wilt toevoegen kun je voor je de tomaten er bij doet een in blokjes gesneden {{Kb|p=Courgette|courgette}} bij doen
* voor de hartige smaak kun je er gebakken magere {{Kb|p=Spek|spekblokjes}} bij doen
{{Navigatie recepten}}
[[Categorie:Pastarecept|Roze pasta]]
{{Sub}}
bo9pnso596oj1iizg3ko3tgj9x5hdz0
Wikijunior:Bus en trein/Strippenkaart
104
25131
428237
408283
2026-05-20T11:34:17Z
Erik Baas
2193
Erik Baas heeft de pagina [[Wikijunior:Bus en trein/Begrippen/Strippenkaart]] hernoemd naar [[Wikijunior:Bus en trein/Strippenkaart]] zonder een doorverwijzing achter te laten
312068
wikitext
text/x-wiki
De '''strippenkaart''' wordt in Nederland voornamelijk gebruikt voor het reizen met de bus, metro of de tram. Op enkele trajecten is de strippenkaart ook te gebruiken als treinkaartje. De strippenkaart kent verschillende uitvoeringen. Deze hebben te maken met het aantal strippen welke erop kan of het reizen met of zonder korting.
== Verschillende strippenkaarten ==
Je kunt een strippenkaart kopen met 2, 3, 8, 15 of 45 strippen. Strippenkaarten met 2, 3 of 8 strippen kun je alleen bij de chauffeur in de bus kopen. Deze zijn wel wat durder dan in de zogenaamde 'voorverkoop'. Hierover lees je later meer. Je bent dus voordeliger uit als je strippenkaarten met 15 of 45 strippen in de voorverkoop koopt.
De strippenkaart met 15 strippen erop is ook te koop met korting. Deze uitvoering kun je kopen wanneer
*Ouderen van 65 jaar en ouder met een geldig legitimatiebewijs of een 65+ pas
*Houders van een OV-studentenkaart (op sommige tijden)
*Kinderen van 4 tot 11 jaar
== Waar je een strippenkaart kunt kopen ==
Strippenkaarten kun je kopen bij
*Winkels op het station, zoals de Wizzl of de Albert Heijn to go
*Vestigingen van Kiosk op de perrons
*De buschauffeur
*Postkantoren
*Supermarkten zoals de Albert Heijn en de C1000
*Loketten van stads- en streekvervoer. Deze winkels komen voor in de grotere steden
*Andere winkels, zoals een boekwinkel en een sigarenhandelaar.
Winkels die strippenkaarten verkopen, herken je aan de sticker OV-shop bij de ingang.
{{juniorsub}}
szuw75f3qbk9cope0z772in9jh9azb6
Wikijunior:Bus en trein/OV-chipkaart
104
25134
428238
408281
2026-05-20T11:34:31Z
Erik Baas
2193
Erik Baas heeft de pagina [[Wikijunior:Bus en trein/Begrippen/OV-chipkaart]] hernoemd naar [[Wikijunior:Bus en trein/OV-chipkaart]] zonder een doorverwijzing achter te laten
310043
wikitext
text/x-wiki
De '''OV-chipkaart''' is een vervoersbewijs voor het openbaar vervoer dat in 2008 is gekomen. De daaropvolgende jaren is het langzaam ingevoerd in Nederland. Het begon in Rotterdam, daarna volgde Amsterdam en nu is hij bijna overal bruikbaar. Alleen in Groningen, een stukje Drenthe en Limburg is hij nog niet ingevoerd. Ook in regionale treinen kun je hem nog niet gebruiken.
Er zijn twee belangrijke soorten OV-chipkaarten:
==Soorten chipkaarten==
===De persoonlijke===
Op deze kaart staat je naam, geboortedatum, je geslacht (man of vrouw) en ook een foto. Deze kun je niet zomaar aan iemand uitlenen, want de prijzen van de reizen die die persoon maakt met jouw stripkaart, worden van jouw rekening afgeschreven.
Je kunt op de kaart speciale producten en voordelen laden. Een voorbeeld van een product is een abonnement en een voorbeeld van een voordeel is een leeftijdskorting.
Als je je kaart verliest of als iemand hem steelt, kun je hem blokkeren. Dan kan de dief niet meer met je chipkaart reizen. Dat is maar goed ook, want zo plundert hij je rekening!
Je kunt je reisgegevens op internet bekijken op de site [http://www.ov-chipkaart.nl/?home=1 www.ov-chipkaart.nl].
Nog een extra voordeel. Deze kaart kun je automatisch laten opladen. Dat wil zeggen dat je saldo vanzelf wordt aangevuld als er niet genoeg meer op je kaart staat. Op die manier kun je altijd blijven reizen met je chipkaart en hoef je niet steeds naar een oplaadpunt.
===De anonieme===
De tweede kaart is een anonieme, maar daar zitten een aantal nadelen aan. Zo kun je deze kaart níet laten blokkeren als je hem verliest of hij gestolen wordt.
Je kunt ook niet samen met iemand anders op deze kaart reizen. Iedereen heeft een eigen kaart nodig.
==Hoe kom ik eraan?==
Een persoonlijke chipkaart kun je aanvragen op [http://www.ov-chipkaart.nl/?home=1 www.ov-chipkaart.nl]. Als het goed is, kun je na ongeveer twee weken je chipkaart verwachten. Die krijg je dan per post.
Ook kun je een formulier ophalen bij de GVU Inlichtingenkiosk. Deze kun je vinden op het Stadsbusstation bij het centrale treinstation van Utrecht. Ook kun je terecht bij een mobiel marketingpunt. Als je wil kijken naar dit soort punten in jouw buurt, kun je kijken op de sites [http://www.gvu.nl www.gvu.nl], [http://www.connexxion.nl www.connexxion.nl] en [http://www.vooru.nl www.vooru.nl]. Dan krijg je een formulier, maar het zal waarschijnlijk langer dan 2 weken duren voor je de kaart hebt.
Let wel op: als je de kaart via internet aanvraagt, kun je direct het automatisch opladen inzetten. Als je de kaart via een formulier aanvraagt, kun je pas nádat je de kaart gekregen hebt, dit automatisch opladen apart aanvragen.
Een anonieme OV-chipkaart kun je kopen bij de kaartjesautomaten van de NS, de GVU Inlichtingenkiosk en bij bepaalde ophaalpunten. Die kun je vinden op [http://www.ov-chipkaart.nl/adresvinder www.ov-chipkaart.nl/adresvinder].
==Saldo op je chipkaart==
Als je kaart automatisch wordt opgeladen, heb je altijd voldoende saldo op je kaart. Als dit niet zo is, kun je hem laten opladen op een oplaadpunt. Er komen steeds meer van dit soort plekken in Nederland. Daar kun je ook bekijken hoeveel saldo er op je je kaart staat. Om te weten welke plekken er zijn, kun je kijken op [http://www.ov-chipkaart.nl/adresvinder www.ov-chipkaart.nl/adresvinder].
Je kunt ook via internet je saldo verhogen. Daarvoor kijk je op [http://www.ov-chipkaart.nl/?home=1 www.ov-chipkaart.nl]. Dat geldt als een bestelling en die kun je ophalen in de bussen op een ophaalpunt. Daar steek je je kaart in en dan volg je de instructies.
==Onvoldoende saldo==
Je moet minimaal 1 cent op je kaart hebben staan om te kunnen reizen. Als dat niet zo is, moet je direct je saldo verhogen! Anders kun je zolang niet reizen...
==In- en uitchecken==
Bij het in- en uitstappen moet je altijd even je OV-chipkaart voor de scanner houden. Als je de kaart bij het instappen voor de scanner houdt, check je in. Dan wordt het instaptarief van je kaart afgetrokken. Dat is 4 euro. Als je uitstapt, wordt bij het uitstappen de ritprijs uitgerekend en het resterende bedrag wordt terug op je kaart geteld.
Als je bijvoorbeeld drie kilometer reist, is de ritprijs 36 cent (1 kilometer is 12 cent). Verder heb je nog het basistarief van 78 cent. Totaal 1,14 euro. Als je dat aftrekt van de 4 euro, heb je 2,86 euro over en dat komt terug op je kaart.
Natuurlijk kun je een keer vergeten uit te checken. Dat is heel vervelend, want dan ben je de volle 4 euro kwijt. Als je meerdere malen vergeet uit te checken, wordt je kaart geblokkeerd. Je moet dan contact opnemen met de mensen van een van deze websites: [http://www.gvu.nl www.gvu.nl], [http://www.connexxion.nl www.connexxion.nl] en [http://www.vooru.nl www.vooru.nl].
==Treinreizen==
Je kunt met je OV-chipkaart ook met de trein reizen. Dan moet je wel eerst ''reizen op saldo'' aanvragen. Dit kan via [http://www.ns.nl www.ns.nl]. Of je kunt bellen met 0900-2021163. Dit kost wel 10 cent.
Daarna moet je je kaart activeren bij een kaartautomaat op het station of bij een NS-balie. Bij de scanner van de NS wordt het instaptarief van 20 euro afgeschreven. Als je een voordeelurenkaart hebt, is dit 10 euro.
{{juniorsub}}
lto7p25adps7bkq46qab3sjmb202kf9
Kookboek/Salade niçoise
0
25236
428074
410994
2026-05-20T05:26:24Z
Erik Baas
2193
lf
428074
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding = [[Bestand:Salad Nicoise - Flickr - WordRidden.jpg|300px]]
| Onderschrift =
| Categorie = Saladerecept
| Porties =
| Energie =
| Tijd =
| Stippen = 2
}}
'''Salade niçoise''' is een combinatie van vis, groente en ei. Het gerecht is genoemd naar de stad Nice in het zuiden van Frankrijk.
Er zijn allerlei varianten, die allemaal voor salades niçoise doorgaan. Een aantal ingrediënten is nochtans terug te vinden in alle versies. Daarnaast kan het recept worden uitgebreid met allerlei extra ingrediënten.
== Ingrediënten ==
Een salade niçoise bevat altijd:
*Rauwe groenten zoals komkommer, tomaten of paprika, afhankelijk van het seizoen
*{{Kb|Ansjovis}}
*Kleine donkere {{Kb|p=olijf|olijven}}
*{{Kb|Knoflook}}
*Gekookte {{Kb|p=ei|eieren}}
*{{Kb|p=ui|Uien}}
*{{Kb|Olijfolie}}
Afhankelijk van de streek en wat de kok wil kan de salade ook de volgende ingrediënten bevatten:
*Blikje {{Kb|tonijn}} naturel (uitgelekt en ontdaan van velletjes en graten), of {{Kb|p=garnaal|garnalen}}
*{{Kb|p=sperzieboon|Sperziebonen}} (gekookt of uit blik)
*Groene kruiden zoals {{Kb|peterselie}}, {{Kb|basilicum}}, {{Kb|dragon}}, {{Kb|bieslook}} en {{Kb|kervel}}
*{{Kb|Kappertjes}}
*{{Kb|Kropsla}}
*Gekookte nieuwe {{Kb|p=aardappel|aardappels}} (bij voorkeur nog in de schil)
*Gekookte {{Kb|witte bonen}}
*Rauwe jonge {{Kb|p=tuinboon|tuinbonen}} (in het seizoen)
*Rauwe jonge {{Kb|p=artisjok|artisjokken}} (in het seizoen)
*{{Kb|p=Tomaat|Tomaten}} (ontveld en gesneden)
== Bereidingswijze ==
*Wanneer gekookte aardappelen en groenten worden gebruikt: zorg ervoor dat ze beetgaar gekookt zijn – dus niet te zacht – en dat ze zijn afgekoeld tot ze lauwwarm zijn. De aardappelen moeten het langste koken, dus als er (sperzie-)bonen worden gebruikt, die later toevoegen.
*Wrijf de schaal in met een teentje knoflook.
*Kook de eieren tot ze bijna hard zijn. Laat ze afkoelen (in koud water gaat het het snelst), pel ze en snijd ze in partjes.
*Snijd de rauwe groenten in stukken.
*Meng groenten, aardappelen en tomaten met een vinaigrette van goede olijfolie en azijn, mosterd, peper en zout
*Schik alles op de schaal.
*Voeg de vis, gesneden eieren en olijven toe.
*Serveer met vers brood.
==Tips==
*Een salade niçoise wordt klaargemaakt op een schaal of bord, niet in de diepe slakom.
== Varianten ==
Er bestaat veel onenigheid over het juiste recept van de salade niçoise. De salade wordt aan de hele Côte d'Azur – en eigenlijk over de hele wereld – gegeten en veel streken en dorpen zelfs individuele families en koks hebben hun eigen versie. Sommigen vinden het een doodzonde om aardappels toe te voegen, terwijl anderen juist vinden dat een salade zonder aardappels geen salade niçoise kan zijn. Soms bevat de salade alleen rauwe groenten, ansjovis en olijven, terwijl ze ook zeer uitgebreid – en veel voedzamer – met bonen, aardappelen of zelfs rijst geserveerd kan worden.
Er is dus geen officieel recept. Salade niçoise is dan ook geen beschermde naam; iedere kok mag zelf weten hoe hij de salade klaarmaakt.
* Voor een volledige maaltijd, per persoon:
** ± 100 g tonijn en een half gekookt ei
** 200-250 g stukjes of plakjes afgekoelde aardappelen OF 80 g {{Kb|p=rijst|zilvervliesrijst}} (rauw gewogen, daarna gekookt en afgekoeld) OF volkorenbrood
** in totaal 200-250 g groenten.
Hieronder
* Een '''pan bagnat''' is een sandwich met daarin dezelfde ingrediënten als de salade niçoise.
{{Appendix|2=
*''Makkelijke maaltijd voor doordeweek, 365 Snelle En Simpele Gerechten Voor Drukke Dagen'', Reader's Digest, 2009, p. 186, {{ISBN|9064078521}}
}}
{{Sub}}
{{Wikipedia|Pagina=Salade niçoise|Naam=Salade niçoise}}
{{Commonscat|Niçoise salads}}
{{Navigatie recepten}}
[[Categorie:Saladerecept|Nicoise]]
[[Categorie:Franse keuken|Salade]]
[[Categorie:Tonijnrecept|Salade]]
5ygqpoxmcx9kxhs1zuvt8rabt7n2lzf
Kookboek/Schuimomelet
0
25239
428062
408199
2026-05-20T05:26:18Z
Erik Baas
2193
lf
428062
wikitext
text/x-wiki
[[Bestand:Omelet de la Mere Poulard.jpg|thumb|Schuimomelet zonder spek]]
Een schuimomelet (Frans: ''omelette soufflée'') is een schuimige en luchtige omelet met onder meer kaas.
==Ingrediënten==
*4 gesplitste {{Kb|p=ei|eieren}}
*50 gram geraspte kaas (oud)
*2 eetlepels fijngehakte peterselie
*2 eetlepels bouillon
*zout
*peper
*50 gram gesnipperde ontbijtspek
==Bereiding==
#Meng de geraspte kaas, peterselie en bouillon met het eigeel en voeg naar smaak zout en peper toe.
#Bak het ontbijtspek in een koekenpan.
#Klop het eiwit stijf, leg het eiwitmengsel erbovenop en schep het geheel door elkaar totdat het luchtig is.
#Doe het geheel in de koekenpan bij het spek, dek de pan af met een beboterde deksel en bak de omelet op laag vuur in ca. 10 minuten goudbruin aan de onderkant.
#Wacht totdat het eiermengsel aan de bovenkant is gestold; de omelet is dan gaar.
#Vouw de omelet dubbel in de pan en leg hem op een voorverwarmde schaal.
Als extra ingrediënt kan bijvoorbeeld tomaat worden toegevoegd.
{{Navigatie recepten}}
[[Categorie:Eierrecept|{{SUBPAGENAME}}]]
{{Sub}}
0kzftec0pq08jbnf7kyinit9ag6ng4k
Kookboek/Gevuld ei
0
25240
428067
410271
2026-05-20T05:26:22Z
Erik Baas
2193
lf
428067
wikitext
text/x-wiki
[[Bestand:Deviled Eggs - 3-23-08.jpg|thumb|200px|Schaal met gevulde eieren]]
Een gevuld ei wordt verkregen door uit een [[Kookboek/Ei|ei]] eerst de dooier te verwijderen, vervolgens te mengen met zout en peper en ten slotte samen met wat nieuwe ingrediënten weer aan het ei toe te voegen.
Gevulde eieren worden in de regel koud gegeten, bijvoorbeeld als onderdeel van een salade.
==Ingrediënten==
*{{Kb|ei}}
*boter
*zout
*peper
==Bereidingswijze==
#Kook het ei hard, laat het afkoelen, pel het en halveer het.
#Neem de dooier met een theelepel uit het ei en zeef de dooier of prak hem fijn.
#Meng de eierdooier met zout, peper en boter.
#Doe het mengsel in een spuitzak en spuit het in het halve ei.
Aan het gevulde ei kunnen nog allerlei dingen worden toegevoegd, zoals {{Kb|kappertjes}}, {{Kb|tomatenketchup}}, stukjes paprika, {{Kb|augurk}}, {{Kb|radijs}} en groene kruiden.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Eierrecept|{{SUBPAGENAME}}]]
cxok92a88kafoskwrljmzmqy7oskfht
Kookboek/Roerei
0
25242
428072
405592
2026-05-20T05:26:23Z
Erik Baas
2193
lf
428072
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding = [[Bestand:Eggerøre.jpg|300px]]
| Onderschrift = Roerei op brood
| Categorie = Eierrecept
| Porties = 3-6
| Energie =
| Tijd = minder dan 10 minuten
| Stippen = 2
}}
Een roerei is een luchtig losgeklopt en vervolgens gebakken ei. Roereieren worden meestal in bepaalde hoeveelheden geserveerd.
==Recept voor 6 roereieren==
===Ingrediënten===
*6 {{Kb|p=ei|eieren}}
*6 eetlepels {{Kb|melk}}
*zout
*peper
*30 gram {{Kb|boter}}
=== Bereiding ===
# Klop de eieren los met de melk, het zout en de peper.
# Smelt de boter in een koekenpan en voeg hier het mengsel aan toe. Laat het geheel op laag vuur stollen, roer er ondertussen met een vork doorheen.
# Serveer de roereieren op een voorverwarmde schaal en bijvoorbeeld met toast.
== Varianten ==
* Aan het mengsel kunnen worden toegevoegd:
** meer smaakmakers, bijvoorbeeld stukjes chilipeper, knoflook, keukenkruiden zoals dragon, majoraan, peterselie, oregano, rozemarijn, tijm, paprikapoeder en/of kerriepoeder;
** snel garende groenten, bijvoorbeeld stukjes/schijfjes/ringetjes bosui, paprika, champignons, courgette, ontpitte tomaat en/of prei.
* Overige mogelijke toevoegingen:
** gare garnalen;
** geraspte kaas: als de eieren nog niet gaar zijn, zodat de kaas kan smelten;
** stukjes ham of uitgebakken en verkruimeld (ontbijt-)spek: roer ze er op het laatst doorheen;
** tuinkruiden om er overheen te strooien: (verse) bieslook, basilicum, peterselie en/of kervel.
{{Wikipedia
|Pagina=Roerei
|Naam=Roerei
}}
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Eierrecept|Roerei]]
3g8ougb5wx6n4k6xuporeptkmqi5bxb
Kookboek/Gepocheerd ei
0
25249
428075
400259
2026-05-20T05:26:29Z
Erik Baas
2193
lf
428075
wikitext
text/x-wiki
[[Bestand:Poached eggs with moccha salt.jpg|thumb|250px|Gepocheerde eieren besprenkeld met [[Kookboek/Matcha|matcha]] en geserveerd op brood]]
Een gepocheerd ei is een zeer vers ei dat niet in de schaal is gekookt, maar eerst gebroken en vervolgens in bijna-kokend water gehouden. Eieren die al enkele weken oud zijn, zijn niet meer geschikt om te pocheren, omdat het eiwit dan niet goed meer stolt.
==Ingrediënten==
*{{Kb|ei}}
*zout (ca. 1 eetlepel)
*azijn (ca. 1 eetlepel)
==Bereidingswijze==
*Breek het ei in een kopje, laat het eiwit en de dooier vervolgens in een niet te ondiepe en wijde (steel)pan met daarin een ruime hoeveelheid bijna-kokend water glijden.
*Voeg zout en azijn toe.
*Vouw het eiwit, zodra het begint te stollen, met twee spatels om de dooier heen.
*Pocheer het ei 3 tot 4 minuten. Voor grote eieren is de pocheertijd iets langer.
*Neem het ei met een schuimspaan uit de pan.
Gepocheerde eieren maken meestal deel uit van een grotere maaltijd. Ze kunnen in combinatie met allerlei andere dingen worden geserveerd, zoals vis, rivierkreeft, tomaat, spinazie, kipsalade en toast.
{{Wikipedia|Pagina=Gepocheerd ei|Naam=Gepocheerd ei}}
{{Navigatie recepten}}
[[Categorie:Eierrecept|{{SUBPAGENAME}}]]
{{Sub}}
g14b99y7l0zgfqwdf6vf9omm8sfx0i8
Kookboek/Eierfondue
0
25252
428071
402634
2026-05-20T05:26:23Z
Erik Baas
2193
lf
428071
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding =
| Onderschrift =
| Categorie = Eierrecept
| Porties = 2-3
| Energie =
| Tijd = ±15 minuten
| Stippen = 2
}}
Eierfondue is een gerecht dat bestaat uit losgeklopte eieren waaraan onder meer boter, sterke drank en tomatenpuree zijn toegevoegd. Het kan worden geserveerd met bijvoorbeeld stokbrood, in boter gebakken oud witbrood of broodcroutons.
==Ingrediënten==
*4 {{Kb|p=ei|eieren}}
*2 eetlepels {{Kb|tomatenpuree}}
*2 eetlepels koffieroom
*1-2 eetlepels droge sherry of port
*25-50 gram {{Kb|boter}}
*50 gram geraspte oude {{Kb|kaas}}
*zout
*peper
*geraspte schil van een sinaasappel
==Bereidingswijze==
#Klop in een kom de eieren los en voeg zout en peper, tomatenpuree, sherry of port, koffieroom, geraspte kaas en een deel van de boter toe.
#Verwijder het wit van de sinaasappelschil en rasp de schil of snijd hem in zeer kleine stukjes.
#Smelt de overgebleven boter in een caquelon of aardewerken fonduepan en voeg het eiermengsel hieraan toe.
#Laat het geheel op laag vuur al roerend met een vork of garde vrijwel geheel stollen.
#Bestrooi de eierfondue vlak voor het opdienen met de sinaasappelschilrasp.
{{Navigatie recepten}}
{{Sub}}
[[Categorie:Eierrecept|Eierfondue]]
rr3m6mjb0lxd8ru6wvdyf6mtgqjazzr
Kookboek/Slemp
0
25276
428070
394810
2026-05-20T05:26:22Z
Erik Baas
2193
lf
428070
wikitext
text/x-wiki
[[Kookboek/Drank|Overzicht van beschreven drankrecepten]]<br>
<br>
'''Slemp''' - ook wel ''driekruidendrank'' genoemd - is een warme, kruidige melk voor koude dagen. Slemp wordt ook wel gedronken om braakneigingen te onderdrukken. In de Lage Landen was deze drank zeer populair voordat koffie en thee ervoor in de plaats kwamen.
==Ingrediënten==
*8 {{Kb|p=kruidnagel|kruidnagels}}
*stukje {{Kb|p=kaneel|pijpkaneel}}, lengte ca. 8 cm
*stukje {{Kb|foelie}}
*een paar {{Kb|p=saffraan|saffraandraadjes}}
*2 eetlepels theebladeren of 1 theezakje
*2 liter {{Kb|melk}}
*75 gram {{Kb|p=basterdsuiker|witte basterdsuiker}}
*3 eetlepels {{Kb|maïzena}}
==Bereidingswijze==
#Bind de kruidnagels, pijpkaneel, foelie, saffraan en theebladeren bijeen in een kaasdoekje of doe het bij elkaar in een thee-ei.
#Leg dit in de melk, warm het geheel langzaam op totdat het bijna kookt en laat het ongeveer een half uur trekken. Laat vervolgens nog 5 minuten doortrekken met het theezakje erin.
#Verwijder alle kruiden en breng de slemp op smaak met de suiker.
#Bind de slemp met behulp van de aangemaakte maïzena en schenk de slemp in voorverwarmde mokken.
{{Navigatie recepten}}
[[Categorie:Drank|Slemp]]
[[Categorie:Zuivelrecept|Slemp]]
{{Sub}}
hchd3tckr8lx4uhz9c5ej4pdf6tsgqz
Kookboek/Bisschopswijn
0
25278
428076
398255
2026-05-20T05:26:31Z
Erik Baas
2193
lf
428076
wikitext
text/x-wiki
[[Kookboek/Drank|Overzicht van beschreven drankrecepten]]<br>
<br>
{{Infobox recept
| Afbeelding = [[Bestand:Glühwein-Zubereitung.JPG|300px]]
| Naam = Bisschopswijn
| Categorie = Feestdagrecept
| Porties =
| Energie =
| Tijd = Circa 2 uur
| Stippen = 2
}}
'''Bisschopswijn''' of kortweg bisschop is opgewarmde rode wijn vermengd met kruiden en een sinaasappel. Deze wijn wordt vooral gedronken bij bepaalde feestelijke gelegenheden, zoals Sinterklaas en Oudjaar.
==Ingrediënten==
*1 onbespoten {{Kb|sinaasappel}}, bij voorkeur van biologische teelt
*7-10 {{Kb|p=kruidnagel|kruidnagels}}
*1 stukje {{Kb|p=kaneel|pijpkaneel}}
*3 dl bessenwijn
*3 dl {{Kb|rode wijn}}
*35 gram suiker
De hoeveelheden kunnen desgewenst naar verhouding worden vermeerderd.
==Bereiding==
# Was de sinaasappel goed.
# Steek de kruidnagels en de pijpkaneel in de sinaasappel.
# Meng alle ingrediënten behalve de suiker in een grote pan. Warm het geheel op een zeer laag vuur op tot circa 70 °C (bij hogere temperaturen verdampt de alcohol) en laat de bisschopswijn vervolgens 1 tot 2 uur op een laag vuur trekken, bijvoorbeeld op de sudderpit, en/of een [[Kookboek/Vlamverdeler|vlamverdeler]] tussen pan en pit of een theelichtje.
# Voeg op het laatst de suiker toe en roer die er goed doorheen, totdat die is opgelost.
# Serveer de wijn zo heet mogelijk, bij voorkeur in stevige theeglazen omdat te dunne glazen door de hitte kunnen barsten.
== Varianten ==
* Glühwein, waarbij de sinaasappel wordt vervangen door 1/2 schil van een citrusvrucht (sinaasappel, mandarijn, grapefruit of citroen), en er 10 g extra suiker en wat {{Kb|steranijs}} wordt toegevoegd. Voor de rest is het recept hetzelfde.
* Voeg een plakje gemberwortel aan de wijn toe.
{{Navigatie recepten}}
[[Categorie:Drank|{{SUBPAGENAME}}]]
[[Categorie:Feestdagrecept|{{SUBPAGENAME}}]]
{{Sub}}
gbnmkvl988yo67xur4tnl6yiavqhrxi
Kookboek/Yoghurtsoep
0
25309
428077
409249
2026-05-20T05:26:32Z
Erik Baas
2193
lf
428077
wikitext
text/x-wiki
{{Infobox recept
|
|Naam=Yoghurtsoep
|Afbeelding=[[Bestand:Another cacık.jpg|300px]]
|Categorie=Soeprecept
|Porties=4
|Energie= 104 kcal
|Tijd= Enkele uren
|Stippen=2
}}
Koude soep op basis van yoghurt, geraspte komkommer, knoflook en dille. Deze soep wordt vooral veel gegeten in Turkije.
==Ingrediënten==
* 2 {{Kb|p=komkommer|komkommers}}
* 500 ml {{Kb|yoghurt}}
* 1-2 uitgeperste teentjes knoflook
* 3 takjes verse {{Kb|dille}}
* zout
* peper
* ½-1 citroen
== Fotogalerij ingrediënten ==
<gallery widths="140" heights="140">
Cucumber from Denmark.jpg|Komkommer
Yogurt, Samoa, Yoggi original.JPG|Yoghurt
Knoflook 02.JPG|Knoflook
Pair of lemons.jpg|Citroenen
Starr 070906-8839 Anethum graveolens.jpg|Dille
</gallery>
== Keukenbenodigdheden ==
* Scherp mes
* Snijplank of rasp
* Knoflookpers
* Grote kom
* Voor bereidingswijze 2: Staafmixer of blender
==Bereidingswijzen==
Er zijn twee bereidingswijzen:<br>
1) met geraspte komkommer, zonder pureren<br>
2) met stukjes komkommer en pureren van de soep
Bereidingswijze 1 (zonder pureren):
# Rasp de komkommers.
# Maak een mengsel van de geraspte komkommers, yoghurt, knoflook en dille. Voeg naar smaak zout en peper toe.
# (Optioneel:) Om de yoghurtsoep nog frisser te laten smaken kan het sap en de geraspte schil van een citroen worden toegevoegd.
# Plaats de yoghurtsoep goed afgedekt gedurende enkele uren in de koelkast.
Bereidingswijze 2 (met pureren):<br>
# Snijd de komkommer in stukjes, bewaar echter wat voor de decoratie
# Meng de stukjes komkommer met de yoghurt
# Pers het knoflookteentje en doe dit bij het komkommer-yoghurtmengsel
# Pers de citroen uit en doe het sap van de citroen erbij
# Voeg zout en peper naar smaak erbij, en de dille van 2 takjes, echter gerist (dus niet de steel)
# Pureer de soep.
==Serveren==
* Serveren in soepkommen of soepborden.
* Leg er een dun plakje komkommer op.
* Wat geriste dille op de soep.
* Serveren met geroosterd brood erbij.
{{Navigatie recepten}}
[[Categorie:Soeprecept|Yoghurtsoep]]
[[Categorie:Yoghurtrecept|Yoghurtsoep]]
[[Categorie:Vegetarisch recept|Yoghurtsoep]]
{{Sub}}
ip2tujjmncm1n3u5l80mihzj4sqzjpi
Wikijunior:Schaken voor beginners/Winnen
104
25699
428192
375589
2026-05-20T05:53:57Z
Erik Baas
2193
428192
wikitext
text/x-wiki
Winnen doe je door de koning schaakmat te zetten. Schaakmat (vaak ook kortweg "mat" genoemd) betekent dat er:
# een vijandig stuk de koning kan slaan; en
# de koning geen kant meer op kan gaan zonder bij de volgende beurt geslagen te worden; en
# dat er geen stuk meer tussen de aanvaller en de koning kan worden geplaatst.<br>
Als alleen het eerste het geval is, zeggen we dat de koning "schaak" staat. Is het tweede en het derde het geval, maar niet het eerste, dan wordt dit "pat" genoemd. Bij pat is het spel ook afgelopen, maar dan zonder winnaar; het is een van de vormen van [[Wikijunior:Schaken voor beginners/Remise|remise]].
De verliezende speler legt de koning soms om als teken dat hij opgeeft. Het maakt bij winnen niet uit hoeveel stukken er van iemand geslagen zijn; het enige wat telt is de koning.
Bij winst krijgt de winnende speler 1 punt, de verliezende speler 0 punten. Is het remise, dan ontvangen beide spelers een halve punt.
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Verplaatsen van stukken
|tekstvorige=
|huidige=Winnen
|volgende=Remise
|tekstvolgende=
}}
{{Juniorsub}}
py205fee50yo1xbihl6445y7m9w8uou
Kookboek/Lasagnebladen
0
25790
428078
395568
2026-05-20T05:26:37Z
Erik Baas
2193
lf
428078
wikitext
text/x-wiki
[[Bestand:Lasagne Blätter01.jpg|thumb|Gedroogde lasagnebladen]]
Dit is het recept voor verse lasagnebladen.
==Benodigdheden==
* {{Kb|Bloem}}: 100 gram/persoon
* {{Kb|p=ei|Eieren}}: 1 per 100 gram bloem
* {{Kb|Olijfolie}}: eetlepel/ca. 300 gram
* zout
==Gereedschappen==
* Pastamachine of keukenrol
* Harde ondergrond
* Pan met grote diameter
* Spaan
== Bereiding ==
Voeg per 100 gram bloem één ei in een mengkom. Meng en kneed het geheel tot een stevige deeg. Voeg voor de smaak en wat extra "bite" een kleine hoeveelheid olijfolie toe tijdens het kneden. Als de deeg voldoende stevigheid heeft, kan het goed gekneed worden op een harde ondergrond, die voorzien is van een laagje bloem om verkleven te voorkomen.
Laat het deeg een half uur rusten. Zet een grote pan met veel water op het vuur en breng aan de kook met wat zout of (pasta-)bouillon. Kneed het deeg nogmaals goed. Pluk kleine brokjes deeg van de homp en rol deze met de pastamachine of keukenrol tot een dikte van circa 1 à 2 mm. Snij de pasta in strookjes van circa 15 cm en kook ze kort (3 minuten). Neem de gekookte bladen met een spaan uit het water en leg ze uit op een schoon doek om te drogen. De bladen zijn nu klaar om in een lasagnegerecht verwerkt te worden.
==Tips==
* Door toevoeging van een paar "kooltjes" diepvriesspinazie of {{Kb|tomatenpuree}} aan de deeg tijdens het kneden, kan een kleurtje toegevoegd worden.
* Het geeft nogal wat rommel in de keuken dus is het handig om direct een voorraadje te maken. Gebruik bijvoorbeeld 1 kg bloem voor meerdere malen lasagne.
* De bladen kunnen als ze droog zijn prima gestapeld en ingevroren worden.
==Zie ook==
*[[Kookboek/Lasagne]]
{{Navigatie recepten}}
[[Categorie:Italiaanse keuken|{{SUBPAGENAME}}]]
[[Categorie:Pastarecept|{{SUBPAGENAME}}]]
{{Sub}}
pn8kictis9w4fnoegf1amkwc5w1oe5x
Kookboek/Koolvis à la Suisse
0
26106
428080
400295
2026-05-20T05:27:46Z
Erik Baas
2193
lf
428080
wikitext
text/x-wiki
{{Infobox recept
| Naam = Kookboek/Koolvis à la Suisse
| Categorie = Vis- of zeevruchtrecept
| Porties = 4
| Energie =
| Tijd =
| Stippen = 1
}}
De koolvis wordt gestoofd in een hapjespan met groente en diverse smaakmakers.
== Ingrediënten ==
* 4 el [[Kookboek/Olijfolie|olijfolie]]
* 1 dl [[Kookboek/Sherry|droge sherry]]
* 1 el [[Kookboek/Peper|groene peperkorrels]]
* 2 el [[Kookboek/Paprika|groene paprika]], fijngesneden
* 6 [[Kookboek/Olijf|zwarte olijven]], fijngesneden
* 1 [[Kookboek/Tomaat|tomaat]], ontveld en in stukjes gesneden
* [[Kookboek/Prei|kleinere prei]], fijngesneden
* 1 teentje [[Kookboek/Knoflook|knoflook]], geperst
* [[Kookboek/Tijm|tijm]]
* [[Kookboek/Basilicum|basilicum]]
* 2 schijfjes [[Kookboek/Citroen|citroen]], in stukjes gesneden
* 4 {{Kb|p=koolvis|koolvisfilets}} (±200 gram per stuk)
* [[Kookboek/Zout|zout]]
== Bereidingswijze ==
* Doe alle ingrediënten behalve de vis in een hapjespan en verhit het geheel totdat het gaat bruisen.
* Leg de in moten gesneden en met zout bestrooide vis erbij en schep alles door elkaar.
* Laat op laag vuur ±10 minuten (met het deksel erop) gaar stoven.
== Serveren ==
Serveer met sla en stokbrood.
== Wijntip ==
Fendant.
== Bron ==
Damesblad, jaren '70
{{Navigatie recepten}}
{{Wikipedia|Pagina=Koolvis|Naam=koolvis}}
{{Commons|Category:Pollachius virens as food}}
{{Sub}}
[[Categorie:Vis- of zeevruchtrecept]]
qoe5ldjdqgw1ztkrg6k313c1wy02b0j
Kookboek/Chinese tomatensoep
0
26155
428087
409466
2026-05-20T05:27:54Z
Erik Baas
2193
lf
428087
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Tomato soup, Berlin (2014-05-05).jpg|300px]]
| Onderschrift =
| Categorie = Soeprecept
| Porties = 8
| Energie =
| Tijd = 25 minuten bereiden + 1,5 uur koken
| Stippen = 3
}}
Deze authentieke Chinese tomatensoep is een origineel recept afkomstig uit China. Laat de soep minstens 1 dag op smaak komen.
==Benodigheden==
*1 kleine ui
*2 teentjes knoflook
*250 g {{Kb|p=kip|kipfilet}}
*80 gr {{Kb|taugé}}
*{{Kb|olijfolie}} extra vierge
*80 gr {{Kb|tomatenpuree}}
*1 l water
*1 l {{Kb|tomatensap}}
*6 eetlepels {{Kb|p=suiker|kristalsuiker}}
*4 eetlepels {{Kb|ketjap}} manis
*2 eetlepels azijn
*1 theelepel sereh ({{Kb|citroengras}})
*1 theelepel {{Kb|p=gember|djahé}} (gemberpoeder)
*1 theelepel sambal oelek
*1 theelepel ve-tsin
*2 eetlepels {{Kb|maïzena}}
*2 nestjes mie
*100 g waterkastanjes (Verkrijgbaar bij Chinese toko en in Chinatown)
==Bereiding==
# Schil en snipper de ui. Pel en hak de knoflook. Snijd het vlees in blokjes. Was de taugé.
# Doe olie in een wok of wadjan en roerbak hierin de ui tot deze mooi glazig is geworden. Voeg het vlees toe en bak het even aan. Voeg tomatenpuree en knoflook toe. Blus het af met het water en laat het circa 1 uur op een laag vuur zachtjes pruttelen.
# Schep het vlees eruit met een schuimspaan en houdt het apart.
# Voeg het tomatensap toe en breng weer aan de kook.
# Doe in een schaaltje de suiker, ketjap, djahé, ve-tsin, sereh, sambal en azijn en roer er een mooi glad papje van. Voeg dit toe aan de bouillon.
# Doe maïzena in een kopje met wat water en roer hier een mooi glad papje van, voeg het toe an de bouillon. Roer goed om geen klontjes te krijgen.
# Breek de mienestjes in tweeën en voeg het toe.
# Voeg de waterkastanjes en de taugé toe. Laat het geheel circa 25 min. zachtjes doorkoken. Voeg het vlees weer toe.
===Variatie===
* Klop 3 eieren los met een beetje water, een scheutje ketjap en een mespunt sambal. Bak van het eimengsel een [[Kookboek/Omelet|omelet]]. Rol de omelet op en snijd hem in kleine reepjes. Verdeel de omeletreepjes over de borden en giet de soep eroverheen.
===Tip===
* Eet de soep niet te warm, lauw komt de zoete smaak beter tot zijn recht. Serveer de soep als voorgerecht bij een rijsttafel.
==Weetje==
Waterkastanjes zijn kleine, ronde, knapperige vruchten van een waterplant uit Zuidoost-Azië. Ze hebben een donkerbruine schil en een knapperige, wat zoete smaak. Ze zijn in blik (340 gr van Ma Ling) verkrijgbaar en soms ook vers. Ongebruikte waterkastanjes kunnen een paar dagen in een plastic bakje met water in de koelkast worden bewaard.
{{Navigatie recepten}}
[[Categorie:Chinese keuken|Tomatensoep]]
[[Categorie:Soeprecept|Tomatensoep]]
{{Sub}}
torpc7i97ugj7j7ygjjoif53lkaxcjj
Kookboek/Hongaarse Goulash (vegetarisch)
0
26299
428086
409231
2026-05-20T05:27:53Z
Erik Baas
2193
lf
428086
wikitext
text/x-wiki
{{Infobox recept
| Naam = Kookboek/Hongaarse Goulash (vegetarisch)
| Categorie = Vegetarisch recept
| Porties = 4
| Energie =
| Tijd = 15 min. voorbereiden<br>1 uur sudderen
| Stippen = 2
}}
==Boodschappenlijstje==
*1 doosje {{Kb|p=tofu|roerbaktofu}}
*2 grote uien
*3 teentjes knoflook
*2 rode {{Kb|p=paprika|paprika's}} of 1 rode en 1 gele
*4 flinke {{Kb|p=tomaat|tomaten}}
*250 gram {{Kb|p=sperzieboon|sperzieboontjes}}
*300 ml. groentebouillon (van een groentebouillontablet voldoet prima)
*1 theelepel {{Kb|chilipoeder}}
*1 theelepel tijm
*1 theelepel {{Kb|paprikapoeder}}
*snufje zout en peper
*2 eetlepels olijfolie
*Naar keuze [[Kookboek/Gekookte aardappel|aardappels]], [[Kookboek/Rijst|rijst]] of [[Kookboek/Polenta|polenta]]
==Materiaal==
*wok met deksel, of een flinke juspan met deksel
==Voorbereiding==
#paprika's schoonmaken en in reepjes snijden van zo'n 3 cm
#tomaten schoonmaken in in stukken snijden
#sperziebonen schoonmaken en breken
#uien snipperen
==Bereiding==
#De olijfolie in de wok verhitten, en als de olie heet is de tofu snel bakken
#Dan de gesnipperde uien toevoegen, en roerbakken tot de uien glazig zijn
#De knoflook persen en toevoegen; en dan de gesneden groentes (paprika, tomaat, sperziebonen)
#Het geheel een minuut of 5 roerbakken
#De bouillon en de kruiden toevoegen
#Het geheel aan de kook brengen, en vervolgens een uur op laag vuur laten sudderen, elk kwartier even roeren
#Zorg er bijtijds voor dat de aardappels, rijst of polenta bereid worden
==Serveren==
Serveer de rijst, de gekookte aardappelen (in grote stukken) of polenta met de goulash er over heen.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Vegetarisch recept|Hongaarse Goulash]]
[[Categorie:Groentenrecept|Hongaarse Goulash]]
[[Categorie:Stoofpot|Hongaarse Goulash]]
ajcwj0j3515o3bei7689v63sw9gt61q
Kookboek/Yoghurt met appelmoes en noten
0
26303
428083
412115
2026-05-20T05:27:49Z
Erik Baas
2193
lf
428083
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Yoghurt met appelmoes en noten
| Afbeelding = [[Bestand:Yoghurt met appelmoes en walnoten 2025.jpg|300px]]
| Onderschrift = Yoghurt met appelcompôte en walnoten
| Categorie = Dessert
| Porties =
| Energie =
| Tijd = 5 minuten
| Stippen = 1
}}
==Boodschappenlijstje==
*Halfvolle {{Kb|yoghurt}}
*Appelmoes of appelcompôte, bij voorkeur ongezoet
*Gemengde {{Kb|p=noot|noten}}, ongezouten
*{{Kb|Kaneel}}
==Bereiding==
Uiteraard kan het in een dessertbakje, maar een glas ziet er wat feestelijker uit. Neem in zo'n geval een niet al te smal glas, bijvoorbeeld een flink uit de kluiten gewassen wijnglas, of een whiskey-tumbler.
#vul het glas half met appelmoes of -compôte
#daarbovenop yoghurt
#niet te weinig gemengde noten
#beetje kaneel er overheen
Koel serveren, dit toetje kan prima vooraf worden gemaakt en in de koelkast bewaard.
{{Navigatie recepten}}
[[Categorie:Zuiveldessert|Yoghurt met appelmoes en noten]]
[[Categorie:Yoghurtrecept|Appelmoes]]
{{Sub}}
d1trhxplsh9rutpmg27noduyx2f2seb
Kookboek/Mousse voor zalmtartaar
0
26822
428079
398260
2026-05-20T05:27:45Z
Erik Baas
2193
lf
428079
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding =
| Onderschrift =
| Categorie = Saus
| Porties =
| Energie =
| Tijd =
| Stippen = 3
}}
Lekker bij een tartaar van zalm (2/3 verse zalm. 1/3 gerookte zalm, alles gehakt tot een tartaartje)
== Ingrediënten ==
* 200 ml gekoelde {{Kb|slagroom}}
* 5 à 9 cm {{Kb|wasabi}} geknepen uit een tube
* 4 eetlepels Kikkoman {{Kb|p=ketjap|sojasaus}}
* Zeer fijn gesneden {{Kb|rucola}}, aangemaakt met een beetje limoensap en zeezout (husselen!)
== Keukengereedschap ==
* Kidde: een slagroomspuit met gaspatroon
== Bereiding ==
* Roer de slagroom, wasabi en sojasaus in een kom totdat de wasabi is opgelost.
* Vul de kidde met het mengsel.
* Gebruik 1 gaspatroon.
* Schud kort en zet koud.
=== Serveren ===
* Leg de rucola op de bordjes.
* Maak de zalmtartartaartjes mooi op (mbv en ring van 7cm) en leg die op de rucola.
* Spuit met de kidde op elk tartaartje een flinke dot mousse.
* Serveer direct.
Enne, eet smakelijk!
{{Navigatie recepten}}
[[Categorie:Saus|Mousse]]
{{Sub}}
capxda0sp9kxz7187108gqshxvlbz5x
Kookboek/Surinaamse nasi goreng
0
27151
428085
406625
2026-05-20T05:27:50Z
Erik Baas
2193
lf
428085
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding = [[Bestand:Nasi goreng kampung ala resto populer.jpg|300px]]
| Onderschrift =
| Categorie = Rijstrecept
| Porties = ±4
| Energie =
| Tijd = dag tevoren: rijst koken; ± 45 minuten bereiding
| Stippen = 3
}}
== Ingrediënten ==
* Koude droog gekookte {{Kb|rijst}}, ca 400 gram
* 2 gesnipperde uien
* 2 dunne {{Kb|p=prei|preien}}, of paksoi, in stukjes
* 2 teentjes knoflook, fijngesnipperd
* 250 g in blokjes gesneden vlees of kip
* 1 stukje {{Kb|trassi}} (mespuntje)
* 2 bouillonblokjes, of zout
* 2 eetlepels ketjap (black soy)
* 1 theelepel gemberpoeder (of 1 stukje verse gember)
* 1 eetlepel tomatenketchup
* 2 eieren
* 2-3 eetlepels zonnebloemolie, of vet van uitgebakken gerookte spekblokjes
* naar smaak sambal, of liefst madame Jeanette pepersaus (toko)
== Bereiding ==
# In de watjan of braadpan het vlees gaarbakken.
# De uien fruiten, knoflook, trassi, sambal, ketjap en tomatenketchup toevoegen, evenals de prei of paksoi. Groente gaar laten worden.
# 2 losgeklopte eieren toevoegen en het geheel even meebakken, evenals de maggieblokjes.
# Tot slot de koude gekookte rijst beetje bij beetje erdoorheen mengen en warm maken (opbakken)
De nasi goreng is erg lekker met reepjes [[Kookboek/Omelet|omelet]], [[Kookboek/Atjar tjampoer|atjar]], schijfjes komkommer, tomaat en kroepoek.
== Varianten ==
* Voor een volledige maaltijd: voeg in totaal 800-1000 g groente toe of geef er een salade bij.
{{Navigatie recepten}}
[[Categorie:Rijstrecept|Nasi]]
[[Categorie:Surinaamse keuken|Nasi]]
{{Sub}}
atanmbgi82o17thfqpbngez93a8wo3g
Kookboek/Jachtschotel
0
27164
428082
402678
2026-05-20T05:27:48Z
Erik Baas
2193
lf
428082
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Jachtschotel
| Afbeelding = [[Bestand:Jachtschotel.jpg|300px]]
| Onderschrift = Jachtschotel (hier zonder ontbijtspek)
| Categorie = Vleesrecept
| Porties = 6
| Energie =
| Tijd = 30 minuten voorbereiden; >3 uur in de oven; <30 minuten eindbereiding
| Stippen = 3
}}
'''Jachtschotel''' bevat het woorddeel “jacht”. Wat voor een jacht hier oorspronkelijk mee bedoeld wordt is niet duidelijk.
Het kan duiden op het {{Wp|Jacht (activiteit)|jagen van wild}}. In dit gerecht kunnen namelijk allerlei [[Kookboek/Vlees|vleessoorten]] - en dus ook [[Kookboek/Wild|wild]] - verwerkt worden.
Ook kan er het {{Wp|Jacht (scheepstype)|zeegaande jacht}} mee worden bedoeld. Op de {{Wp|Koopvaardij|koopvaardij}} pleegt de bemanning, wanneer er “zo’n schotel” opgediend wordt, de opmerking te plaatsen: “De kok heeft zeker de vleeskamer weer eens aangeveegd”. Daarmee doelen zij op de verschillende soorten stukjes vlees dat door een laag paneermeel wordt bedekt.
Het gerecht kan inderdaad gezien worden als een soort restverwerking van vlees en andere nog aanwezige waren uit de provisiekamer of kelder. Daarnaast is het lang van te voren te bereiden. De jachtschotel kan geheel kant-en-klaar voorbereid meegenomen worden. Zo hoeft er voor die maaltijd op zee niet nog eens uitgebreid gekookt te worden. Na een jachtpartij op wild hoeft ook hier de schotel alleen nog maar de oven in.
== Ingrediënten ==
Jachtschotel voor 6 personen
* 800 gram {{Kb|vlees}}. Dit kan van alles zijn, bijvoorbeeld sukade-lappen, doorregen runderlappen, varkensvlees en/of wild in stukjes gesneden. Eventueel een stukje gevogelte.
* 50 g plakjes {{Kb|ontbijtspek}}.
* {{Kb|bloem}}
* 100 g [[Kookboek/Boter|roomboter]]
* 2 eetlepels [[Kookboek/Olie en vet|spekvet]]
* 3 grote in ringen gesneden {{Kb|p=ui|uien}}
* 5 geschilde en in plakjes gesneden {{Kb|appel}}. B.v. Elstar en/of Goudreinet
* 6-8 gekookte {{Kb|p=aardappel|aardappelen}}
* 3 {{Kb|p=kruidnagel|kruidnagels}}
* 2 [[Kookboek/Laurier|laurierbladeren]]
* [[Kookboek/Zout|Zeezout]]
* [[Kookboek/Bouillon|(Runder)bouillon]]
* Versgemalen [[Kookboek/Peper|zwarte peper]]
* 10 gekneusde {{Kb|p=jeneverbes|jeneverbessen}}
* 10-15 {{Kb|p=zilveruitje|zilveruitjes}} uit het zuur
* 2 dl {{Kb|rode wijn}}
* {{Kb|Aardappelpuree}}
* {{Kb|paneermeel}}
== Voorbereiding ==
# Het vlees in stukjes snijden en met bloem bestrooien.
# De helft van de boter en het spekvet heet laten worden; stukjes vlees hierin snel aan alle kanten goudbruin aanzetten; royaal afblussen met rode wijn. Nog wat bouillon erbij en op lage temperatuur in de oven laten garen, op ongeveer 80 graden Celsius. Dit kan zo wel 3 tot 5 uren duren.
# Ui licht fruiten met de appels.
# Voeg dan de kruidnagels, de laurierbladen, zout, royaal zwarte peper, de jeneverbessen en de zilveruitjes toe.
# Schep het vlees, de uien met appel en de gekookte aardappelen in lagen in een vuurvaste schotel of zware pan; Het geheel met een laagje aardappelpuree afdekken.
# Plakjes ontbijtspek bovenop leggen.
# Paneermeel er over strooien en hierop klontjes roomboter.
Indien de schotel voor de volgende dag is, deze laten afkoelen en in de koelkast afgedekt wegzetten.
== Bereidingswijze ==
Zet de schotel 20 á 30 minuten in een op 225 °C voorverwarmde oven tot de toplaag een goudbruin korstje heeft gekregen.
== Serveersuggesties ==
Serveren met:
* fijne, kleine sappige [[Kookboek/Gekookte spruitjes|spruitjes]] met [[Kookboek/Kastanje|kastanjes]]
* [[Kookboek/Zweedse rodekool|Zweedse rodekool]]
* [[Kookboek/Broccoli|Broccoli]] met [[Kookboek/Dilledressing|dilledressing]]
* eenvoudige [[Kookboek/Zuurkool|Zuurkool]], gekookt met alleen wat kruiden.
Aanbevolen alcoholosiche dranken:
* Een krachtige {{Wp|Rhônevallei (wijnstreek)|Rhône-wijn}}.
* Een pittige rode {{Wp|Wijnbouw in Italië|Italiaanse wijn}}.
* Een donkere (dubbel) {{Wp|Trappistenbier|Trappist}}.
{{Navigatie recepten}}
[[Categorie:Vleesrecept|Jachtschotel]]
[[Categorie:Ovenschotel|Jachtschotel]]
{{Sub}}
0h505gn7swbcpievnqjou39433ycwyj
Kookboek/Tim’s salade
0
27410
428084
401945
2026-05-20T05:27:49Z
Erik Baas
2193
lf
428084
wikitext
text/x-wiki
{{Infobox recept
| Naam = Kookboek/Tim’s salade
| Categorie = Vakantiegerecht
| Porties = 4
| Energie =
| Tijd = 20
| Stippen = 1
}}
'''Tim’s salade''' is een ooit uit nood geboren gerecht. Al denk je niets in huis aan eten te hebben, in keukenkastjes zijn vaak toch nog wel potjes en blikjes met het een en ander te vinden. Hier kun je vervolgens creatief mee aan de slag. Mocht je één belangrijk ingrediënt missen, dan kun je bijvoorbeeld even bij de buren aankloppen, of zoals in dit geval, vlak voor sluitingstijd naar een campingwinkeltje rennen voor een pakje rijst.
== Wat heb je nodig ==
=== Ingrediënten ===
* 4 kopjes rijst (rijst-builtjes zijn ook erg handig)
* zout
* 2 blikjes knak-of cocktail worstjes
* 1 pot geroosterde paprika’s
* 2 blikjes tonijn. Zowel blik-tonijn op water als op olie is geschikt. Op olie is wat smeuïger.
* peper
* 1 of 2 lepels mayonaise
=== Benodigdheden ===
* pan met water om in te koken
* lepel om mee te roeren
== Bereidingswijze ==
# Kook de rijst met wat zout.
# Als de rijst gaar is deze afgieten en laten afkoelen.
# Snijdt de worstjes en de geroosterde paprika’s in stukjes van 1 centimeter en voeg deze bij de rijst in de pan.
# De tonijn uit blik boven de pan uit elkaar plukken.
# Peper en mayonaise toevoegen. Het geheel nu voorzichtig omscheppen.
Als het geheel te droog lijkt, dan kan het vocht uit het blik van de tonijn eraan toegevoegd worden.
{{Navigatie recepten}}
[[Categorie:Vakantiegerecht|salade]]
{{Sub}}
qnyxdnztir6ik1tzdf7g4obq39vptda
Kookboek/Vakantiegerecht
0
27420
428081
395080
2026-05-20T05:27:46Z
Erik Baas
2193
lf
428081
wikitext
text/x-wiki
Hier vindt u vakantiegerechten die eenvoudig in de tent, caravan, boot of tijdens een fietsvakantie gemaakt kunnen worden. Het zijn ook nog eens gerechten met ingrediënten die makkelijk houdbaar zijn. Zoals bijvoorbeeld aardappelen en uien, maar ook waren uit blik, pot of fles. Soms bepaalde ingrediënten - bijvoorbeeld in vacuüm - die een dag buiten de koelkast houdbaar zijn.
<DynamicPageList>
category=Vakantiegerecht
mode=unordered
order=ascending
suppresserrors = true
ordermethod = sortkey
</DynamicPageList>
{{Navigatie recepten}}
[[Categorie:Recept|Vakantiegerecht]]
{{Sub}}
9wodnwynfzfxf1par94aoar41mdbzt4
Kookboek/Pasta champignons room
0
27971
428102
407929
2026-05-20T05:28:09Z
Erik Baas
2193
lf
428102
wikitext
text/x-wiki
{{Infobox recept
|
|Naam=Pasta met champignon-roomsaus
|Afbeelding=[[Bestand:Bonvicino (restaurant) - tagliatelles aux champignons.JPG|300px]]
|Onderschrift = Tagliatelle met champignons, maar zonder room
|Categorie=Pastarecept
|Porties=Twee
|Energie=
|Tijd=15 minuten
|Stippen=1
}}
==Ingrediënten==
*200 g {{Kb|p=pasta|tagliatelle}}
*60 g {{Kb|boter}}
*200 g {{Kb|p=champignon|champignons}}
*125 ml {{Kb|slagroom}}
*zout
*peper
*1 tl gedroogde oregano
*4 eetlepels geraspte Parmezaanse {{Kb|kaas}}
==Bereiding==
#Kook de tagliatelle net niet helemaal gaar. Volg de aanwijzingen op de verpakking, en laat de pasta uitlekken.
#Smelt de boter in een koekenpan. Voeg de uiterst dunne plakjes champignon toe en laat alles gedurende 3 minuten zachtjes bakken.
#Voeg de room toe en doe er naar smaak zout, peper en oregano bij.
#Laat het zachtjes binden, blijf rustig roeren.
#Doe de pasta in een voorverwarmde schaal. Laat de inhoud van de koekenpan erover glijden. Schep het geheel goed om.
#Strooi de geraspte kaas er vlak voor het opdienen over.
{{Navigatie recepten}}
[[Categorie:Vegetarisch recept|Pasta met champignon-roomsaus]]
[[Categorie:Pastarecept|Pasta met champignon-roomsaus]]
{{Sub}}
ckljqjfevx3y85se3x3suocdb1okkok
Kookboek/Bruine bonen met rijst
0
28521
428089
400846
2026-05-20T05:27:59Z
Erik Baas
2193
lf
428089
wikitext
text/x-wiki
{{Infobox recept| Bruine bonen met rijst
| Afbeelding = [[Bestand:Red Beans and Rice.jpg|300px|Bruine bonen met rijst]]
| Categorie = rijstrecept
| Naam = Bruine bonen met rijst
| Porties = 4
| Energie =
| Tijd =
| Stippen = 2
}}
==Ingrediënten==
*2 {{Kb|p=ui|uien}}
*125 g {{Kb|p=spek|spekjes}}
*250 g {{Kb|gehakt}}
*400 g {{Kb|groente|groentenpakket}}
*1 grote pot {{Kb|bruine bonen}}
*200 g {{Kb|rijst}}
==Bereiding==
*Ui snipperen en fruiten met een theelepel kerrie.
*Spekjes meebakken.
*Gehakt mee rulbakken.
*Groentenpakket mee roerbakken,
*ondertussen de rijst opzetten (met een bouillonblokje).
*Vlak voor de rijst gaar is, de bruine bonen mee verwarmen, en later de rijst erdoorheen roeren.
== Varianten ==
* BB met R (bruine bonen met rijst) is een Surinaams gerecht dat vele varianten kent. Het hier beschreven recept is er waarschijnlijk een van. Zie {{Wp|BB met R|BB met R in Wikipedia}} voor de beschrijving en een link naar een meer origineel recept.
* Voor een complete maaltijd: voeg 200-400 g extra groenten toe of geef er een rauwkostsalade bij.
{{Navigatie recepten}}
[[Categorie:Rijstrecept|Bruine bonen]]
[[Categorie:Peulvruchtrecept|Bruine bonen]]
{{Sub}}
dcspq57syxoj75vpy8mlaz1d50g4mxt
Programmeren in REXX/Fundamenten
0
28709
428205
425894
2026-05-20T06:10:36Z
Erik Baas
2193
lf
428205
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit hoofdstuk bespreken we de voornaamste karakteristieken van REXX, zoals zijn typische kenmerken, bouwstenen en syntaxis.
=Typische kenmerken=
Fundamenteel aan REXX is dat alle woorden binnen het programma intern als karakterreeks worden opgeslagen.
Het is enkel wanneer een numerieke bewerking verwacht wordt, dat er een interne conversie naar getallen zal gebeuren.
Het resultaat van de bewerking wordt weer een karakterreeks.
Dit heeft als voornaamste gevolg dat er geen declaraties moeten worden gemaakt voor variabelen, zoals in de meeste andere programmeertalen wel het geval is.
We zullen karakterreeksen vanaf nu meestal met de Engelse term '''string''' benoemen.
Vervolgens werkt REXX meestal als een ''{{Wp|interpreter|interpreter}}''.
Hiermee wordt bedoeld dat REXX het programma lijn voor lijn zal uitvoeren, en daarvoor telkens in twee stappen wordt gewerkt. De eerste stap is een interpretatie van de programmalijn en omzetting naar interne code (te vergelijken met een compilatie). De tweede stap is dan de eigenlijke uitvoering. Er zijn wel optimalisaties voorzien om niet telkens de eerste stap te moeten doen, bv. in geval van een lus.
Dit heeft als gevolg dat REXX het in uitvoeringssnelheid in de meeste gevallen niet kan winnen van gecompileerde programma's. Daartegenover staat echter dat de ontwikkeling van een werkend programma veelal heel wat sneller kan. De interpretatie-stap kan ook voordelen hebben, bijvoorbeeld bij het debuggen.
Op mainframe besturingssystemen ({{Wp|z/OS|z/OS}} en {{Wp|z/VM|z/VM}}) bestaan wel compilers voor REXX.
Door velen wordt REXX ten onrechte beschouwd als enkel een vervanger voor scripting (BAT-files). Dat was wel het eerste doel op mainframes. We zullen echter zien dat de taal volledig genoeg is om er ook alle andere klassieke programmeertaken mee te vervullen. Op de huidige snelle PC's (en zeker de mainframes) kan een tragere uitvoeringstijd een verwaarloosbare handicap zijn, en ruimschoots gecompenseerd worden door de snelheid van ontwikkeling. Zeker in die gevallen waar het programma slechts sporadisch of zelfs éénmalig moet worden uitgevoerd zal REXX een zeer interessant alternatief voor andere programmeertalen zijn.
Door de weinig complexe schrijfwijze, het gebruik van leesbare (Engelse) termen en het ontbreken van declaraties is het ook een uitgelezen programmeertaal voor minder geroutineerde of beginnende computergebruikers.
Lees [https://www.rexxla.org/rexxlang/mfc/rexxadv.html hier] wat Mike Cowlishaw, de "uitvinder" van REXX, als voor- en nadelen van zijn programmeertaal opsomt.
<!--------------------------------------------------->
=Bouwstenen=
Een REXX programma is opgebouwd uit een reeks zinnen die opgebouwd zijn uit:
*een of meer spaties, die genegeerd worden;
*een reeks "tokens" (zie verder);
*geen of een reeks spaties die ook genegeerd worden;
*een punt-komma dat de zin afsluit. Aan het eind van een lijn is deze optioneel.
Daarnaast kan het programma doorspekt zijn met commentaren (zie verder).
We zullen deze zinnen vanaf nu aanduiden met de "officiële" term '''statement'''. De statements worden één voor één geanalyseerd en uitgevoerd. De analyse gebeurt van links naar rechts. Dit laatste kan soms van groot belang zijn.
Merk op dat een regel in het bestand dat de broncode bevat uit meer dan één statement kan bestaan, mits ze gescheiden zijn door een punt-komma.
De term '''token''' staat voor de bouwstenen waarmee REXX statements zijn opgebouwd. De tokens kunnen gelijk welke lengte hebben, tenzij er limieten worden opgelegd door de implementatie. Het beschikbaar geheugen is anders de ultieme limiet. De soorten tokens zijn:
*constanten
*symbolen (instructies, functies of variabelen)
*getallen
*operatoren
*speciale syntactische tekens
*labels
Laten we al deze elementen nu in detail bekijken, te beginnen bij commentaren.
<!--------------------------------------------------->
==Commentaren==
Commentaren worden in REXX begrensd door een beginnende <span style="color:red">/*</span> en een eindigende <span style="color:red">*/</span>.
Commentaren kunnen over meerdere lijnen gaan en een commentaar kan een ander commentaar bevatten (geneste commentaren). Ze kunnen praktisch overal voorkomen, ook midden in een instructie. REXX zoekt naar die begin- en eindaanduidingen zonder rekening te houden met andere inhoud. Dus indien ergens in een constante van het programma één van die tekens voorkomt, kan het mislopen.
Op sommige systemen moet een REXX programma beginnen met een commentaar op de eerste positie, desnoods een ''leeg'' commentaar zoals in een volgend voorbeeld.
Andere implementaties of systemen vereisen dat niet. Toch blijft het een goede gewoonte om het programma te beginnen met een korte beschrijving,
eventueel aangevuld met de naam van de programmeur, een creatiedatum en de historiek van de veranderingen. Ook als het programma moet kunnen gebruikt worden op verschillende systemen is het veilig te starten met een commentaar in de eerste positie.
/* */
say "Hello" /* Dit zal Hello op het scherm zetten */
/* Deze lijnen zijn
/* écht waar ! */
allemaal commentaar */
if i=5 /* en alleen dan */ then say "Adieu"
<!--------------------------------------------------->
==Constanten==
Constanten zijn karakterreeksen die begrensd worden door enkelvoudige of dubbele aanhalingstekens (<span style="color:red">'</span> of <span style="color:red">"</span>).
<br>Uiteraard moeten begin- en eindteken van een constante hetzelfde zijn.
say "Nice weather, isn't it?"
definieert een constante (een zin). Omdat in de zin een apostrof nodig is, wordt de zin omgeven door de dubbele aanhalingstekens.
Een alternatieve oplossing bestaat erin om het apostrof-teken te ontdubbelen, dus:
say 'Nice weather, isn’’t it?'
Daar dit minder leesbaar is, gebruiken we deze oplossing enkel in die gevallen waar het niet anders kan, bijvoorbeeld omdat zowel apostrof als dubbel aanhalingsteken nodig is in de contante.
Een constante kan ook met hexadecimale of binaire notatie opgegeven worden:
'1de8'x "11110110"b
Hiermee kunnen bijvoorbeeld onleesbare controlekarakters gebruikt worden.
Constanten worden dus "letterlijk" genomen door het programma en zijn als dusdanig een element van een statement tijdens de uitvoering.
<!--------------------------------------------------->
==Getallen==
Een getal is een reeks cijfers, met eventueel een decimaal <u>punt</u> (geen komma dus!). Negatieve getallen worden voorafgegaan door een minteken. Exponentiële notatie kan ook worden gebruikt. Een enkele 0 voor het decimaal punt mag weggelaten worden.
Dit zijn allemaal geldige getallen:
17 98.07 -101 .14 12.2e6 73e-128 '-17.9' ' 11.22 '
De laatste 2 getallen (als een constante voorgesteld) zijn evengoed geldig, want we leerden al dat REXX alles opslaat als karakterreeksen tot eventueel blijkt dat er moet mee gerekend worden. Spaties worden uiteraard niet meegenomen in de berekeningen.
<!--------------------------------------------------->
==Symbolen==
Met symbolen bedoelen we ''woorden'' bestaande uit een reeks karakters.
Welke karakters kunnen gebruikt worden hangt af van het systeem waarop men werkt en van de codepages die gebruikt worden. Er is ook een verschil tussen ASCII (PC) en EBCDIC (mainframes).
Op z'n minst kunnen volgende karakters gebruikt worden:
A tot Z, a tot z, 0 tot 9, . (punt) en _ (liggend streepje)
Als een symbool niet met een cijfers of een punt begint, dan kan het een variabele voorstellen. Dit betekent dat men er een waarde kan aan toekennen d.m.v. een assignatie (variabele = uitdrukking).
Begint het symbool met een punt of een cijfer, dan is het een constant symbool. In die zin zijn getallen constante symbolen.
Dus, een symbool zal, al naargelang zijn plaats in het programma, beschouwd worden als een variabele of als een instructie (bevel, functie).
De initiële waarde van een token is gelijk aan zijn naam in hoofdletters. Dus zullen in
say a
beide woorden gezien worden als respectievelijk '''SAY''' en '''A'''. Het token '''SAY''' wordt door REXX daarna wel herkend als een bevel dat, wat erop volgt, op het scherm moet afdrukken. Het token '''A''' zal als variabele gezien worden vermits het niet tussen aanhalingstekens staat en niet met een cijfer of punt begint. Vermits in dit voorbeeld geen waarde werd toegekend blijft haar initiële waarde zolang "A". We zullen dus uiteindelijk die letter "A" op het scherm zien verschijnen.
{{Bericht
|titel=Hoofdletter-ongevoelig (Case-insensitive)
|bericht=Rexx maakt geen onderscheid tussen kleine letters en hoofdletters (Engels: case-insensitive). '''ABC''' verwijst dus naar hetzelfde token als '''abc''' of '''Abc'''. Constanten kunnen natuurlijk wél bestaan uit gemengde karakters ("Hello" is niet gelijk aan "HELLO").
|type=waarschuwing}}
In onderstaand voorbeeldje is het symbool "do" op de eerste regel tweemaal gebruikt. De eerste maal is het een bevel en de tweede maal een variabele.
do do=1 to 10
say do
end
Dit is een perfect geldig statement, doch omwille van de leesbaarheid, ten stelligste af te raden. Gebruik geen variabel-namen die overeenkomen met die van een instructie of functie.
Speciale vormen van symbolen zijn dus bevelen en functies:
<!--------------------------------------------------->
===Bevelen===
Deze zullen in meer detail beschreven in volgende hoofdstukken, maar de lijst ervan is zo beperkt dat we ze hier toch even kunnen opsommen: '''ADDRESS,'''
'''[[Programmeren in REXX/Bevelen,_deel_1#ARG|ARG]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#CALL|CALL]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#DO|DO]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#DROP|DROP]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#EXIT|EXIT]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#IF|IF]]''',
'''[[Programmeren in REXX/Nog_bevelen_en_functies#INTERPRET|INTERPRET]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#Iteratiestappen overslaan|ITERATE]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#Eindeloze lussen|LEAVE]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#NOP|NOP]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#NUMERIC|NUMERIC]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#PARSE|PARSE]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#PROCEDURE|PROCEDURE]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#PULL|PULL]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#PUSH|PUSH]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#QUEUE|QUEUE]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#RETURN|RETURN]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#SAY|SAY]]''',
'''[[Programmeren in REXX/Bevelen,_deel_1#SELECT|SELECT]]''',
'''[[Programmeren in REXX/Bevelen,_deel_2#SIGNAL|SIGNAL]]''' en
'''[[Programmeren in REXX/Debugging#TRACE|TRACE]]'''.
Van een aantal kan men nu al vermoeden waartoe ze zullen dienen. Soms gebruiken we hiervoor ook de term ''instructies'' zoals in het Engels ''instructions''. Verwar dit niet met een volledige programmalijn, die we een statement noemen, noch met een regel in het bronbestand, want dit kan meer dan één statement bevatten.
<!--------------------------------------------------->
===Functies===
Functies komen later uitgebreid aan bod. Hun algemene vorm is:
'''functienaam(parameter1,parameter2,...)'''
waarbij de parameters van elkaar gescheiden worden door komma's. De lijst van parameters moet aan de functienaam plakken, er mag geen spatie tussen geplaatst worden.
De lijst standaardfuncties is zeer groot. Ze hier opsommen zou ons nu te ver leiden. We komen de meeste ten gepaste tijde wel tegen.
Functies kunnen ook verschillen naargelang het besturingssysteem. Er bestaan tevens externe functiepakketten die kunnen worden toegevoegd aan de basisset.
We zullen ook leren hoe we zelf functies kunnen schrijven.
We geven toch een voorbeeldje van een (basis-)functie:
a="tekst"
say '''length'''('Dit is een' a)
Dit zijn de stappen die door de REXX interpreter worden uitgevoerd (herinner u, de interpretatie werkt van links naar rechts):
#het token "a" is niet gekend als bevel of functie, maar is wel een geldige naam voor een variabele;
#het gelijkheidsteken beveelt om een waarde toe te kennen aan de variabele (assignatie);
#de toegekende waarde is alles tot aan het einde van het statement (hier impliciet het einde van de zin). De variabele ''a'' krijgt dus de waarde "tekst"
#het token "say" wordt herkend als een bevel. Het moet alles wat volgt tot aan het einde van het statement op het scherm afdrukken;
#het token "length" wordt vervolgens herkend als een standaardfunctie die de lengte van zijn parameter moet opzoeken en teruggeven;
#het deel tussen haakjes is de eerste, en in dit geval enige parameter voor de functie. REXX ontdekt dat het een constante gevolgd door een variabele is. De variabele wordt door haar waarde vervangen, en de parameter voor de functie wordt uiteindelijk "Dit is een tekst";
#de functie '''length''' telt nu het aantal karakters en komt tot de waarde 16;
#het bevel '''say''' ziet dus nog enkel het getal 16 staan, en drukt dit op het scherm af.
<!--------------------------------------------------->
==Labels==
Labels (letterlijk: etiketten), zijn plaatsen naar waar een programma kan springen (met de bevelen [[Programmeren in REXX/Bevelen,_deel_2#SIGNAL|SIGNAL]] of
[[Programmeren in REXX/Bevelen,_deel_2#CALL|CALL]], of nog als begin van een interne functie).
Een label bestaat uit een token gevolgd door een dubbele punt.
signal MijnLabel /* We springen verder */
[instructies]
exit /* we verlaten het programma */
MijnLabel: /* Hier kunnen we naartoe springen */
[Andere instructies]
exit /* we verlaten het programma */
Ook voor labels geldt dat ze hoofdletter ongevoelig zijn, dus MijnLabel en MIJNLABEL zijn hetzelfde.
Het is zelfs mogelijk meerdere labels na elkaar te gebruiken, waarbij ze dan te beschouwen zijn als elkaars synoniem.
<!--------------------------------------------------->
==Leestekens==
===Vervolgteken===
De '''komma''' aan het eind van een tekstregel, geeft aan dat de instructie wordt vervolgd op de volgende lijn.
/* Gesplitste instructie */
Say "Dit is een"''','''
"tekst."
De komma zal na het samenvoegen van de lijnen vervangen worden door een spatie.
Merk ook op dat het voor commentaren over meerdere regels '''niet''' nodig is vervolgtekens te gebruiken.
===Scheidingsteken===
De '''puntkomma''' laat toe statements van elkaar te scheiden, zoals hier:
/* Meerdere instructies op één regel */
Say "Hello" ; say "Nice weather, isn't it?"
{{Bericht
|titel=Programma opbouw - statements.
|bericht=REXX interpreteert statement per statement. Een statement eindigt
* bij een scheidingsteken;
* bij het einde van een regel (line-end, een CrLf), tenzij een vervolgteken werd gebruikt. Zie {{Wp|Return_(toetsenbord)|hier}} voor uitleg over CrLf. Een scheidingsteken is dan niet vereist en wordt dus impliciet verondersteld;
* een impliciet scheidingsteken. REXX veronderstelt een scheidingsteken na THEN, ELSE en OTHERWISE.
|type=info}}
===Bewerkingstekens===
Hiermee bedoelen we o.a. de tekens die toelaten op te tellen of af te trekken. We hebben, in volgorde van voorrang bij uitvoering:
* '''Prefix \ + of -''' aan het begin van het woord betekenen ze respectievelijk '''NOT''', positief of negatief.
* '''**''' machtsverheffing (exponentiatie) [5 ** 2]
* '''* / % //''' vermenigvuldiging, deling, modulo en restdeling.
* '''+ -''' optellen en aftrekken
* '''||''' concatenatie - karakterreeksen aan elkaar plakken ["ABC" || "DEF" = "ABCDEF"]
* '''== \==''' strikt gelijk of ongelijk
* '''= \=''' gelijk of ongelijk
* '''> >= \>''' groter dan, groter of gelijk aan, niet groter dan
* '''< <= \<''' kleiner dan, kleiner of gelijk aan, niet kleiner dan
* '''>> >>= \>> << <<= \<<''' strikte vorm van voorgaande
* '''>< <> \=''' niet gelijk aan (op drie manieren geschreven)
* '''&''' logische en (AND)
* '''| &&''' logische of (OR) en exclusieve of (XOR)
Bij vergelijkingen wordt het kortste lid tot gelijke lengte van het langste lid gemaakt door er spaties aan toe te voegen alvorens de vergelijking aan te vatten. Bij de '''strikte''' vormen van vergelijkingen wordt deze verlenging niet toegepast.
Een machtsverheffing gaat dus voor op een vermenigvuldiging of een deling. Deze gaan dan weer voor op optelling en aftrekking, enz. Men kan de volgorde van berekening aanpassen door ronde haakjes te gebruiken.
'''''(3+4)*5''''' is dus niet hetzelfde als '''''3+4*5'''''.
Het resultaat van een vergelijking is 1 (waar) of 0 (onwaar). Bij logische bewerkingen mogen enkel 1 of 0 gebruikt worden.
Voorbeelden:
\1 /* «0» (niet 1) */
-7 * (4+3) /* «-49» */
-7*4 + 3 /* «-25» (volgorde belangrijk)*/
'ABC'=='ABC' /* «1» (= waar) */
'ABC'=='ABC ' /* «0» (= niet waar) */
'ABC'\='abc' /* «1» (= waar) */
(1 | 0) & 1 /* «1» (= waar) */
12 % 7 /* «1» (modulo) */
12 // 7 /* «5» (rest van deling) */
Concatenatie gaan we nu uitleggen.
<!--------------------------------------------------->
=Concatenatie=
De term '''concatenatie''' (met het bewerkingsteken ||) komt van het Engelse werkwoord '''to concatenate''' en betekent: aaneenkoppelen/-voegen/-ketenen. Er worden dus twee delen aan elkaar geklit. Maar dit vraagt toch om wat meer uitleg.
Het aantal spaties tussen tokens van statements heeft geen belang, ze zullen gereduceerd worden tot één spatie. (Verwar dit niet met spaties tussen woorden in een constante).
Ook de komma die gebruikt wordt om een instructie op een volgende regel verder te zetten zal vervangen worden door één enkele spatie.
Laten we nu even kijken naar volgende reeks statements:
x=1 ; y=2
say x y /* Toont «1 2» */
say x y /* Toont evenzeer «1 2» */
if x y = '1 2' then say 'OK' /* «OK» want dit is waar! */
say xy /* «XY», want xy niet opgevuld */
say x||y /* «12», want concatenatie */
if x||y=12 then say 'OK' /* «OK» want ook Waar! */
if x||,
y = 12 then say 'OK' /* «OK» want eveneens "Waar" */
Tot zover het wel of niet samenvoegen van variabelen. Maar bestudeer nu volgende voorbeelden aandachtig:
x=1 ; y=2
say x"\="y /* «1\=2» */
if x"\:"y then say 'OK' /* Syntax error ! */
if x"-"y = '1-2' then say 'OK'/* «OK» */
if x"-"y = 1-2 then say 'OK' /* Niets, want "1-2" is niet -1 */
We willen hiermee duidelijk maken dat een concatenatieteken niet nodig is wanneer variabelen aan constanten worden geplakt.
Maar willen we constanten aan constanten ketenen, dan is het concatenatieteken meestal wel nodig:
say "Dit is een zin""!" /* «Dit is een zin"!» */
say "Dit is een zin"||"!" /* «Dit is een zin!» */
say "Dit is een zin"'!' /* «Dit is een zin!» */
Bij het eerste voorbeeld wordt het dubbele aanhalingsteken door een enkel vervangen zoals we al hadden geleerd.
<!--------------------------------------------------->
=Speciale variabelen=
REXX kent 3 speciale variabelen:
# '''RC''', bevat de returncode van het laatst uitgevoerde commando dat door het besturingssyteem is uitgevoerd.
# '''RESULT''', bevat het resultaat van de laatst uitgevoerde functie.
# '''SIGL''', bevat het lijnnummer vanwaar men is gekomen met een '''signal''' of '''call''' bevel.
Deze variabelen zullen ten gepaste tijde meer uitleg krijgen.
<!--------------------------------------------------->
=Stems=
REXX kent een speciaal soort variabelen, namelijk '''stems'''. De term komt van het Engels en betekent in dit geval dat het variabelen zijn die dezelfde stam hebben. Ze laten o.a. toe om vectoren (arrays) en matrices te simuleren, maar ze zijn meer dan dat.
De stam van een '''stem''' bestaat uit een geldig token, gevolgd door een punt. Zo zijn "''jan.''" en "''p.''" geldige namen voor stems.
Zoals voor andere variabelen is de basiswaarde van een stem gelijk aan zijn naam in hoofdletters, hier dus "JAN." en "P.".
Een stem is enkel een impliciete definitie van een verzameling variabelen. Er zullen pas elementen in voorkomen indien we waarden toekennen aan '''samengestelde variabelen'''.
Een stem heeft geen voorgedefinieerde dimensie, er kunnen zoveel elementen aan toegevoegd worden als het geheugen van de computer toelaat.
<p id="SamVar">Een '''samengestelde variabele''' definieert dus een element van een stem. Ze is opgebouwd uit de stamnaam en een symbool dat na de punt is geplaatst. Dit tweede deel noemen we de staart (Engels: tail).
Zo zijn "jan.7", "jan.hello", "jan.i" en "jan.i.j" geldige elementen van de stem "jan.".</p>
jan.7 = 25
jan.hello = "Gisteren"
i=5 ; jan.i = 17
hello="Hello" ; jan.hello = "Goeiedag"
j=7 ; jan.i.j=12
Tijdens de uitvoering zal REXX de staart interpreteren. Hebben we een constante of een getal, dan hoeft geen verdere interpretatie. Dus, bij jan.7 is "JAN.7" de naam van het element van de stem "JAN.". Dit element krijgt in ons voorbeeld de waarde «27».
In het tweede statement stelt ''hello'' een geldige variabele voor. Vermits deze variabele geen waarde kreeg, is haar impliciete waarde "HELLO" en wordt "JAN.HELLO" een element van de stem "JAN.". Aan dit element wordt dan «Gisteren» toegewezen.
In het derde geval hebben we een variabele in de staart waarvan de waarde «5» is. Dus wordt het element "JAN.5" een waarde «17» toegekend.
Net zo zal na de toekenning van de waarde «Hello» aan de variabele ''hello'', het element "JAN.Hello" (let op de hoofd- en kleine letters), de waarde «Goeiedag» gaan bevatten.
Als we tenslotte bij de laatste regel komen, hebben beide i en j een waarde gekregen. Daarom leidt de assignatie dat het element "JAN.5.7" de waarde «12» krijgt. Op deze manier kan men een matrix met 2 (of meer) dimensies simuleren, doch voor REXX zijn het gewoon allemaal elementen van een stem.
Als een stem gebruikt wordt om een reeks elementen te bevatten, gebruikt men vaak numerieke staarten (jan.1, jan.2, ...). Er is dan een soort conventie dat het aantal elementen (de dimensie) van de aldus opgebouwde vector in het element "''stem.0''" wordt bijgehouden. Verplicht is dit niet, doch sommige programma's of functies volgen deze conventie om aan te geven hoeveel elementen ze als resultaat hebben terug gegeven.
Noteer dat een eenvoudige assignatie als
piet. = 'Onbekend'
álle elementen van de stem deze ''standaardwaarde'' toekent (ook zij die reeds een waarde hadden). Dus zullen zowel ''PIET.7'' als ''PIET.Morgen'' een waarde «Onbekend» hebben zolang er geen nieuwe waarde wordt gegeven.
Merk tenslotte op dat een samengestelde variabele er zeer complex kan uitzien:
a="Dit is een hele volzin"
jan.a=17
zal aan het element "''JAN.Dit is een hele volzin''" de waarde «17» toekennen. Dit geeft interessante mogelijkheden waar we later nog op zullen terugkomen.
<!---------------------------------------------------------->
=Programmabuffer ofte Stack=
Gegevens die ingevoerd worden vanuit externe bronnen - meestal het toetsenbord, maar ook andere programma's - kunnen in de zogenaamde '''stack''' of programmabuffer worden opgeslagen in afwachting van verwerking. Het is één van de manieren om gegevens uit te wisselen tussen programma's.
We kunnen deze buffer vergelijken met een stapel speelkaarten. Er kunnen kaarten onderaan of bovenaan worden toegevoegd, maar ze worden steeds van bovenaf terug weggenomen.
Worden de kaarten bovenaan bijgevoegd, dan zullen ze dus als eerste terug worden weggenomen en spreken we van '''LIFO''' (Last In, First Out). De laatst toegevoegde wordt als eerste terug weggenomen.
<br>Worden ze echter onderaan toegevoegd, dan zullen ze pas als laatste terug van de stapel worden genomen en spreken we van '''FIFO''' (First In, First Out). De kaarten kruipen als het waren van onder naar boven, waarbij de eerst toegevoegde eerst wordt weggenomen.
De bevelen die met de stack werken bespreken we in een volgend hoofdstuk.
{{Bericht
|titel=Besluit van dit hoofdstuk.
|bericht=In dit hoofdstuk leerden we over constanten, variabelen, bevelen en functies. We leerden de lees- en bewerkingstekens kennen. Ook hoe labels eruitzien en wat de stack eigenlijk is. De uitleg over stems mocht zeker niet ontbreken. Termen als token, assignatie en statement werden aangebracht.
Probeer deze nog eens voor de geest te halen zodat we ze als gekend mogen beschouwen bij het aanvatten van volgende hoofdstukken.}}
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Voor je begint
|huidige =Fundamenten
|volgende=Bevelen, deel 1}}
{{Sub}}
38yhmcn3zd7lmwjbnd8ncvb14h5xzfc
Programmeren in REXX/Voorbeeld1
0
28720
428209
425891
2026-05-20T06:10:40Z
Erik Baas
2193
lf
428209
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
Nu hebben we genoeg elementen om een eerste werkend REXX programma te bestuderen. Het zal de priemgetallen tussen 1 en 100 opzoeken.
Eigenlijk moeten we voor elk getal tussen 1 en 100 nagaan of het deelbaar is door een van de priemgetallen kleiner dan zichzelf.
Maar er zijn een aantal verbeteringen mogelijk aan deze werkwijze, waardoor het programma ettelijke malen sneller zal draaien.
* Priemgetallen zijn onpare getallen, met slechts één uitzondering, het getal 2. Pare getallen onderzoeken is dus al nodeloos. We gaan ervan uit dat we intuïtief al weten dat 2 een priemgetal is en dat testen we dus ook niet meer.
* Stel dat we moeten onderzoeken of 23 een priemgetal is. Priemgetallen kleiner dan 23 zijn (2,) 3, 5, 7, 11, 13 en 17. Ons getal 23 is geen veelvoud van 3. Maar moeten we nog testen of het een veelvoud van 5 is ? Een decimale deling door 5 geeft: 4.6. Dus, 23 is alvast niet geheel deelbaar door 5, en het resultaat is zelfs al kleiner dan 5. Er zal dus zeker geen ander nog groter priemgetal te vinden zijn dat een deler is van 23. Kortom, eens het kwadraat van een priemgetal groter is dan het te onderzoeken getal, weten we dat er geen delers meer zullen gevonden worden. Ons getal is dan zelf een priemgetal en de lus kan worden gestopt.
Laten we nu ons programma bestuderen.
==Code==
1 | /* Berekenen priemgetallen tussen 1 en 100 */
2 | start=3 /* De start van onze zoektocht */
3 | einde=100 /* Het einde van onze zoektocht*/
4 | priem.0=1 /* Definitie van stem en teller*/
5 | priem.1=2 /* Ons eerste priemgetal kennen we */
6 | z=1 /* onze priemgetallenteller */
7 | say priem.1 /* We tonen ons eerste priemgetal */
8 | do i=start to einde by 2 /* lus van start tot einde, per 2 */
9 | do j=2 to z /* lus over al gevonden priemgetallen */
10 | if i<priem.j**2 then leave j /* groter dan priem**2 ? ==> verlaat lus j */
11 | if i//priem.j=0 then iterate i /* als rest i/priem nul is, volgende zoeken */
12 | end j /* einde van lus j */
13 | z=z+1 /* 1 bij aan priemgetallenteller */
14 | priem.z=i /* toevoegen aan reeks */
15 | priem.0=z /* Element nul van stem aanpassen */
16 | say i /* we tonen het gevonden priemgetal */
17 | end i /* einde van lus i */
18 | say 'We hebben' z 'priemgetallen gevonden tussen' start 'en' einde
19 | exit /* einde van het programma */
In de eerste kolom hebben we lijnnummers gezet om naar te kunnen verwijzen. Ze maken geen deel uit van het programma.
==Bespreking==
'''Lijn 1''': alhoewel een REXX programma slechts op sommige platformen met een commentaar moet starten is het toch een goede gewoonte hier op z'n minst te schrijven wat het programma doet. Er kan ook een auteur, creatiedatum en zelfs historiek aan toegevoegd worden.
<br>'''Lijn 2''': we definiëren de variabele ''start'' en geven ze de waarde 3 (onze effectieve start na het "gekende" priemgetal 2).
<br>'''Lijn 3''': we definiëren de variabele ''einde'' en geven ze de waarde 100, omdat we ons nu willen beperken tot de priemgetallen tot 100.
<br>'''Lijn 4''': in één enkele operatie creëren we een stem, ''priem.'' genaamd, en geven aan het element ''priem.0'' de waarde 1. De conventie wil namelijk dat we in het "nulde" element van een stem (array) bijhouden hoeveel elementen er in de stem zitten, en op
'''Lijn 5''' vullen we nu net dat eerste element van de stem op, namelijk ons eerste priemgetal 2.
<br>'''Lijn 6''': we definiëren de variabele ''z'' die zal dienen om de index van onze stem te verhogen (en tevens het aantal gevonden priemgetallen).
<br>'''Lijn 7''': we mogen niet vergeten ons eerste priemgetal 2 ook op het scherm te tonen!
<br>'''Lijn 8''': nu starten we een lus. De variabele die als teller gebruikt wordt is '''i'''. De naam van deze variabele kan vrij gekozen worden, maar het is ietwat historisch dat variabelen i, j, k, l als eerste worden gekozen omdat in oorspronkelijke programmeertalen deze variabelen impliciet gehele getallen voorstelden. Een langere naam zou ook alleen meer schrijfwerk betekenen.
We gaan in de lus blijven vanaf onze '''start'''waarde (3) tot onze '''eind'''waarde (100). En om enkel de onpare getallen te onderzoeken maken we de stap 2 groot.
<br>'''Lijn 9''': binnen de eerste lus beginnen we nu een tweede lus. We gaan (dank zij lusteller '''j''') alle reeds gekende priemgetallen af. Vermits we enkel onpare getallen onderzoeken moeten we echter ons allereerste priemgetal 2 niet meenemen.
Merk hier op dat we de eerste maal een lus-definitie zullen hebben die resulteert in '''do j=2 to 1'''. Dit is helemaal OK voor REXX, en maakt dat de lus niet zal worden uitgevoerd.
<br>'''Lijn 10''': als nu blijkt dat het getal dat we onderzoeken (en dat in variabele i staat) kleiner is dan het kwadraat van het ''j-de'' priemgetal, dan kunnen we de j-lus verlaten, en hebben we een nieuw priemgetal gevonden.
<br>'''Lijn 11''': hier testen we of het te onderzoeken getal (i) deelbaar is door het ''j-de'' priemgetal. We testen dit door na te gaan of de restdeling op nul uitkomt. Indien zo, dan hebben we geen priemgetal en kunnen we onmiddellijk naar het volgende te onderzoeken getal gaan, dus de rest van de i-lus overslaan en terug naar lijn 8 springen.
<br>'''Lijn 12''' geeft het einde van de binnenste lus aan. Alhoewel niet nodig, is het een goede gewoonte de lusteller (j) als parameter mee te geven. Zeker bij heel lange lussen maakt het het foutonderzoek gemakkelijker.
<br>'''Lijn 13''': als we hier zijn terechtgekomen, dan hebben we een priemgetal gevonden. We verhogen onze teller, zodat we op
'''lijn 14''' ons nieuw priemgetal kunnen toevoegen aan het ''z-de'' element van onze stem.
<br>'''Lijn 15''': en vergeten ook niet ons element 0 aan te passen. We kunnen hiermee zelfs beter wachten tot na de i-lus, zo winnen we aan snelheid. Maar lees ook de
[[Programmeren in REXX/Voorbeeld1#Extra opmerkingen|opmerkingen]] hieronder.
<br>'''Lijn 16''': we tonen het gevonden priemgetal op het scherm en kunnen het volgende getal gaan onderzoeken.
<br>'''Lijn 18''': we hebben nu alle getallen van 1 tot 100 onderzocht. Zowel variabele ''z'' als ''stem.0'' bevatten het aantal gevonden priemgetallen, dus een kleine moeite om dat aan de gebruiker te melden.
<br>'''Lijn 19''': we beëindigen het programma. We geven geen returncode mee, dus die zal steeds 0 zijn. In dit eenvoudig programmaatje is die '''exit''' eigenlijk zelfs niet écht nodig, maar het blijft toch een goede gewoonte er een te schrijven. Op een PC zal die returncode trouwens enkel zin hebben indien ons programma door een ander programma is opgeroepen, in welk geval de returncode kan getest worden. Windows zelf doet niets met
de returncode van het programma.
==Extra opmerkingen==
De variabele '''start''' hebben we niet echt nodig. We kunnen op lijn 8 ook '''do i=3 to einde by 2''' schrijven. Maar we gaan dit programma later nog uitbreiden en dan zal die variabele van pas komen.
Het stem-element '''priem.0''' moeten we niet opvullen, zodat lijnen 4 en 15 ook mogen wegvallen. Het is echter een conventie van het aantal elementen van de stem hierin bij te houden. Sommige functies of programma's vullen deze variabele ook automatisch in.
Merk op dat we lijn 14 niet mogen schrijven als:
priem.priem.0=i
want REXX gaat dan op zoek naar... '''priem.PRIEM.0''' (het element PRIEM.0 van de stem priem.) en dat bestaat niet. Vandaar dat we variabele '''z''' als tussenstap gebruiken.
Het gevolg is wel dat zowel '''z''' als '''priem.0''' dezelfde waarden zullen bevatten.
De Object REXX en Reginald REXX implementaties laten echter wel toe het op volgende manier op te lossen:
priem.[priem.0]=i
Tussen de vierkante haakjes kunnen een complexe variabele of zelfs bewerkingen geschreven worden. Deze vorm is echter niet in alle REXX implementaties gekend, noch in de officiële ANSI J18-199X definities. We zullen deze oplossing verder vermijden om algemener te blijven.
Als eerste voorbeeld van de kracht van de '''PARSE''' instructie kunnen we melden dat de regels 2 tot 6 kunnen vervangen worden door
parse '''value''' 3 100 1 2 1 '''with''' start einde priem.0 priem.1 z
Vermits we hier een reeks tokens willen parsen mogen we het sleutelwoord '''with''' niet vergeten, anders is onduidelijk waar het sjabloon begint.
Het sjabloon is hier in zijn meest eenvoudige vorm, namelijk een reeks tokens, die variabelen zullen worden.
De eerste token van het sjabloon (start) zal het eerste woord van de bron (3) ontvangen. En zo verder. Dus, met één regel kennen we een initiële waarde aan 5 variabelen toe.
En, het is niet alleen een kortere schrijfwijze, het kan de uitvoeringssnelheid ook ten goede komen! Het aantal interpretatiestappen wordt hierdoor namelijk met 4 verminderd, al is de interpretatie van deze ene lijn wel complexer en dus iets meer tijdrovend.
Desgevallend kan de leesbaarheid als volgt verbeterd worden:
parse value 3 100 1 2 1,
'''with''' start einde priem.0 priem.1 z
Of er nu één of meerdere blanco karakters tussen de woorden van de bron staan doet er in dit geval niet toe. Op deze manier wordt duidelijk welke waarde naar welke variabele gaat.
Vergeet hierbij niet de vervolg-komma te schrijven op de eerste lijn, want het moet één instructie blijven.
Op dezelfde manier zouden we lijnen 13 tot 15 kunnen schrijven als:
parse value z+1 i with z . 1 priem.0 priem.z
doch dit is voer voor later, als we de '''parse''' instructie nog wat meer hebben bestudeerd.
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Functies deel 1
|huidige =Voorbeeld 1
|volgende=Bevelen, deel 2}}
{{Sub}}
au2ajac2kkhe6s7hgtouivefsz61eyx
Programmeren in REXX/Functies deel 1
0
28728
428207
425895
2026-05-20T06:10:39Z
Erik Baas
2193
lf
428207
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit hoofdstuk gaan we dieper in op een eerste reeks functies die standaard aanwezig zijn in REXX.
Vermits REXX in de eerste plaats een karakter georiënteerde taal is, is het dan ook niet verwonderlijk dat veel functies strings behandelen. REXX kent ook de notie "woorden" zodat er ook daarvoor specifieke functies zijn.
De parameters die tussen vierkante haakjes worden genoteerd zijn optioneel. Er wordt in die gevallen een standaardwaarde (default value) aangenomen. Deze is dan onderlijnd. Veel functies voorzien ook in een '''pad'''-parameter. De term heeft niets met een soort kikker te maken, maar komt van het Engelse werkwoord '''"to pad"''', in de betekenis van opvullen of verlengen. Het pad-karakter zal meestal dienen om het resultaat aan te vullen tot een gevraagde lengte. Daar de standaardwaarde voor een pad-karakter steeds een spatie is noteren we niet telkens meer [pad | "<u> </u>"], maar kortweg [pad].
=Manipulatie van strings=
'''Strings''' zijn dus karakterreeksen waarin alle mogelijke karakters ('00'x tot 'FF'x) kunnen voorkomen, inclusief spaties of controlekarakters.
==SUBSTR - Deel uit geheel halen==
'''substr'''(bron-string,start[,lengte][,pad])
Deze functie haalt een deel (''sub-string'') uit een bron-string. De bronstring is het resultaat van een voorafgaande interpretatie.
Het gedeelte dat eruit gehaald moet worden begint bij de ''start''-positie en krijgt een ''lengte''. Indien ''lengte'' niet is opgegeven dan wordt de rest van de string genomen. Indien de ''lengte'' groter is dan het aantal karakters dat overblijft in de bronstring wordt het resultaat verlengd met het ''pad''-karakter.
Dit zijn voorbeelden:
zin='Dit is een volzin'
say substr(zin,5,2) «is»
say substr(zin,10,4) «n vo»
say substr(zin,10,4,"-") «n vo»
say substr(zin,15,8,"-") «zin-----»
say substr(zin,15,8) «zin »
say substr(zin"!",15,6) «zin! »
say substr('Hallo',4) «lo»
In het derde voorbeeld heeft het pad-karakter geen invloed. In het vierde geval wél, want ''er is niet genoeg materiaal meer in de zin'' om een string van 8 karakters te produceren, en dus moeten pad-karakters worden toegevoegd. In het vijfde voorbeeld is geen pad-karakter opgegeven, dus worden spaties toegevoegd. Het resultaat is wel degelijk 8 karakters lang!
Het voorlaatste voorbeeld toont dat de bron complex kan zijn. Bij het laatste voorbeeld is geen lengte opgegeven, zodat het resultaat alles vanaf beginpositie 4 tot het einde van de string bevat.
==LENGTH - Lengte van een string bepalen==
'''length'''(string)
Geeft de lengte van de string terug.
say length('Dit is een zin') «14»
==LEFT - Linker deel uit een string halen==
'''left'''(string,aantal[,pad])
Hiermee halen we ''aantal'' karakters uit de string, te beginnen bij het eerst karakter. Indien het ''aantal'' groter is dan de string, dan wordt het resultaat verlengd met het ''pad''-karakter.
say left("Dit is een zin",3) «Dit»
say left("Hallo",8,"-") «Hallo---»
==RIGHT - Rechter deel uit een string halen==
'''right'''(string,aantal[,pad])
Dit is, hoe kan het ook anders, het omgekeerde van '''left'''.
say right("Hallo",8,'-') «---Hallo»
==STRIP - Een string afknippen==
'''strip'''(string[,optie | "<u>Both</u>"][,karakter | "<u> </u>"])
Deze functie elimineert alle spaties (of opgegeven ''karakter'')
*zowel vooraan als achteraan de string met optie '''B[oth]''' (standaardoptie);
*enkel vooraan de string met optie '''L[eading]''' (leidend), of
*enkel achteraan de string met optie '''T[railing]''' (volgend).
say strip(' Hallo ') «Hallo»
say strip(' Hallo ','L') «Hallo »
say strip('***Hallo***','Both','*') «Hallo»
==REVERSE - Een string omkeren==
'''reverse'''(string)
Keert de string eenvoudigweg om.
zin='Dit is een zin'
say reverse(zin) «niz nee si tiD»
==COPIES - Een string herhalen==
'''copies'''(string,aantal)
Retourneert een string die de oorspronkelijke string een ''aantal'' maal herhaalt. Er komen geen extra tussenliggende spaties bij !
say copies('=',10) «==========»
say copies(' ',10) « »
say copies("-§-",3) «-§--§--§-»
==POS - Eerste positie van een substring in een string zoeken==
'''pos'''(naald,hooiberg[,start | <u>1</u>])
POS geeft de eerste positie van de ''naald'' in de ''hooiberg''. Normaal wordt vanaf de eerste positie gezocht, maar men kan optioneel pas vanaf de positie ''start'' beginnen zoeken.
Wordt er niets gevonden, dan is het antwoord 0 (nul).
Bestand="d:\rexxprogrammas\test1.rex"
say pos(':',bestand) «2»
say pos('\',bestand,6) «18»
say pos('-',bestand) «0»
say pos('mm',bestand) «14»
De ''naald'' niet beperkt tot één karakter, zoals men kan leren uit het laatste voorbeeld.
==LASTPOS - Laatste positie van een substring in een string zoeken==
'''lastpos'''(naald,hooiberg[,start | <u>1</u>])
Zoals men kan verwachten is deze functie het omgekeerde van de functie '''pos'''.
Bestand="d:\rexxprogrammas\test1.rex"
say lastpos('\',bestand) «18»
say lastpos("",bestand) «0»
Merk op dat indien de opzoekterm een lengte 0 heeft het antwoord ook 0 is. Wie verwacht immers iets te vinden als men op zoek gaat naar <u>niets</u> ?
{{Bericht
|bericht=Voor een string zonder lengte of een lege string gebruiken we vanaf nu de Engelse term '''nullstring'''.
|type=nb}}
==SPACE - Een string opschonen==
'''space'''(string[,aantal | <u>1</u>][,pad])
Geeft de oorspronkelijke string terug, doch met telkens hetzelfde ''aantal'' spaties of ''pad''-karakters tussen elk woord. We kunnen dus ook alle spaties wegnemen door het ''aantal'' op nul te zetten.
say space('Dit is een zin') «Dit is een zin»
say space('5 17 3',2,'+') «5++17++3»
say space('Dit is een zin',0) «Ditiseenzin»
==CENTRE - Een string centreren==
'''centre'''(string,lengte[,pad])
Deze functie maakt een lijn van de opgegeven ''lengte'' waarin de ''string'' gecentreerd is. Aan beide zijden worden m.a.w. evenveel spaties (of ''pad''-karakters) toegevoegd.
Als de lengte kleiner is dan de string, dan worden er aan beide zijden karakters weggenomen.
{{Wp|en:Mike_Cowlishaw|Mike Cowlishaw}}, die REXX in zijn vrije tijd ontwikkelde is een Engelsman. Daarom noemde hij deze functie "centre". Doch, toen het als officieel product door de IBM laboratoria in de VS moest worden onderhouden heeft men het synoniem '''center''' moeten toevoegen om te voldoen aan de Amerikaanse schrijfwijze. We kunnen dus beide gebruiken.
say center('Hello',10) « Hello »
say centre('Hello',3) «ell»
==COMPARE - Strings vergelijken==
'''compare'''(string1,string2[,pad])
Met deze functie kunnen we 2 strings met elkaar vergelijken. De kortste wordt even lang gemaakt als de langste met het ''pad''-karakter.
Als beide strings dan identiek zijn is het resultaat 0 (nul). Anders geeft de functie de positie van het eerste karakter dat verschillend is. Kleine- en hoofdletters hebben hierbij belang !
say compare('Hello','Hallo') «2»
say compare('Hello ','Hello') «0»
say compare('Hello ','Hello',"-") «6»
==INSERT - Een stukje toevoegen in een string==
'''insert'''(nieuw,string[,start | <u>1</u>][,lengte][,pad])
Schuift het ''nieuw'' stukje in de string, na de ''start''-positie. Het toegevoegde stukje wordt eventueel verlengd tot ''lengte'' door er ''pad''-karakters aan toe te voegen.
say insert(' is','Diteen zin',4,4,' ') «Dit is een zin»
say insert(' is','Diteen zin',,4) « is Diteen zin»
==OVERLAY - Een stukje van een string overschrijven==
'''overlay'''(nieuw,string[,start | <u>1</u>][,lengte][,pad])
De functie '''overlay''' zal een ''nieuw'' stukje '''over''' de bestaande string plakken, beginnend bij positie ''start''. Het nieuwe stukje kan eerst worden verlengd tot ''lengte'' door er ''pad''-karakters aan toe te voegen.
say overlay('is','Dit was een zin',5,3) «Dit is een zin»
say space(overlay('is ','Dit was een zin',5)) «Dit is een zin»
In het tweede voorbeeld hebben we twee functies in elkaar gevlochten. De binnenste functie wordt eerst uitgevoerd. Ze geeft in dit geval «Dit is een zin» terug, dus met 2 spaties na het woord "is".
Het resultaat wordt dan door de buitenste functie verwerkt en reduceert de spaties tot één enkel blanco karakter.
==DELSTR - Een deel uit een string wegknippen==
'''delstr'''(string,start[,aantal])
Knipt een ''aantal'' karakters uit de ''string'', te beginnen bij ''start''. Als geen ''aantal'' is opgegeven elimineert de functie de rest van de bronstring.
say delstr('Dit is een zin',5,3) «Dit een zin»
say delstr('Jan Klaas',4) «Jan»
==VERIFY - Uit welke karakters is een string opgebouwd ?==
'''verify'''(string,referentie[,optie | "<u>Nomatch</u>"][,start | <u>1</u>])
Met '''verify''' kunnen we nagaan of onze string is opgebouwd uit karakters die in de ''referentie'' staan. De controle begint aan ''start'' als die parameter is opgegeven.
Indien aan deze voorwaarde is voldaan, dan is het antwoord 0 (nul). In het ander geval is het antwoord
* de eerste positie in string die niet voldoet als de ''optie'' '''Nomatch''' is opgegeven (dit is de standaard optie).
* de eerste positie in string die wél voldoet als ''optie'' '''Match''' is opgegeven.
Zo laat deze functie bijvoorbeeld toe na te gaan of een string enkel cijfers bevat.
say verify("142536","0123456789") «0»
say verify("1425A6","0123456789") «5»
We kunnen ook zoeken naar de positie van het eerste karakter dat wél in de referentie staat:
say verify("Jan Klaas;Hoogweg, 7;Ergenstevelde",";,/","Match") «10»
In dit voorbeeld is onze bron typisch voor een lijn uit een zogenaamd CSV-bestand (Comma Separated Values). Dit is een bestand dat door spreadsheet programma's kan worden aangemaakt of gelezen. Tussen elk veld staat een scheidingsteken. Maar dat scheidingsteken is niet noodzakelijk een komma zoals de naam laat uitschijnen. Als in een veld een komma kan voorkomen moet wel voor een ander scheidingteken gekozen worden. In ons voorbeeld gaan we op zoek naar het eerste karakter dat een komma, punt-komma of slash is. We veronderstellen dan dat dit karakter als scheidingsteken gebruikt wordt. Een aandachtig lezer zal echter inzien dat dit geen sluitende test is. Lees {{Wp|Csv|hier}} om meer te leren over CSV-bestanden.
==ABBREV - geldige afkorting==
'''abbrev'''(informatie,info[,lengte])
Deze functie geeft de waarde 1 (waar) als ''info'' gelijk is aan het begin van ''informatie'' en niet korter is dan ''lengte'' (als opgegeven). Anders is het antwoord 0 (onwaar). De standaardlengte is gelijk aan de lengte van de ''info'' parameter.
say abbrev("Print","Pri") «1»
say abbrev("PRINT","Pri") «0»
say abbrev("PRINT","PRI",4) «0»
say abbrev("PRINT","") «1»
Merk op dat een nullstring steeds voldoet als geen lengte is opgegeven. Het volgende stukje programma is daarom een manier om een standaardwaarde te kiezen als geen optie is meegegeven met het programma:
/* Programma met standaardoptie */
parse upper arg optie .
select /* eerste when bepaalt de standaardwaarde */
when abbrev("PRINT",optie) then ... /* printen */
when abbrev("COPY",optie) then ... /* kopiëren */
...
otherwise nop;
end
Als de gebruiker van dit programma geen optie meegeeft, dan zal de eerste '''when abbrev("PRINT","")''' dus steeds voldoen.
=Werken met woorden=
Met woorden bedoelen we groepjes aaneengesloten karakters die van elkaar gescheiden zijn door één of meer spaties. De woorden kunnen alle karakters bevatten, behalve de spatie natuurlijk.
{{Bericht
|bericht=Op personal computers bestaat een conventie dat een tekst eindigt bij de eerste '00'x, maar voor REXX geldt die conventie niet en maken '00'x karakters dus deel uit van de string.
|type=nb}}
In de voorbeelden hieronder veronderstellen we steeds dat ''zin'' staat voor "Dit is een zin.".
==WORD - Eén woord uit een zin ophalen==
'''word'''(zin,n)
Geeft het n-de woord uit de zin terug.
say word(zin,3) «een»
==SUBWORD - Woorden uit een zin ophalen==
'''subword'''(zin,n[,aantal])
Het resultaat bevat alle (of een opgegeven ''aantal'') woorden te beginnen bij het n-de woord uit de zin.
say subword(zin,3) «een zin.»
say subword(zin,2,2) «is een»
say subword(zin,3,5) «een zin.»
==WORDS - Aantal woorden in een zin==
'''words'''(zin)
Geeft, zoals te verwachten valt, het aantal woorden in de zin. In ons geval 4 dus.
==DELWORD - Woorden uit een zin elimineren==
'''delword'''(zin,n[,aantal])
Het resultaat van deze functie is de oorspronkelijke zin waaruit een ''aantal'' woorden, te beginnen bij het n-de woord, zijn verwijderd. Indien we geen ''aantal'' opgeven, dan elimineren we alle resterende woorden (en niet enkel 1 zoals men zou kunnen denken).
say delword(zin,2,2) «Dit zin.»
say delword(zin,2) «Dit»
==WORDLENGTH - Lengte van een woord in een zin==
'''wordlength'''(zin,n)
Geeft de lengte van het n-de woord in de zin. Als er geen n-de woord is, dan is de lengte uiteraard nul.
say wordlength(zin,3) «3»
==WORDINDEX - Positie van een woord in een zin==
'''wordindex'''(zin,n)
Vertelt op welke karakterpositie het n-de woord in de zin begint.
say wordindex(zin,4) «12»
==WORDPOS - Plaats van een woord in een zin==
'''wordpos'''(zoekterm,zin[,n | <u>1</u>])
Zegt ons het hoeveelste woord ''zoekterm'' in de ''zin'' is. Eventueel kan men de zoektocht beginnen bij het n-de woord. Is de string niet gevonden dan is het
antwoord uiteraard nul. De zoekterm kan uit één of meer woorden bestaan.
say wordpos("een",zin) «3»
say wordpos("of",zin) «0»
say wordpos("zin.",zin,2) «4»
say wordpos("zin",zin) «0»
say wordpos("een",zin,5) «0»
say wordpos("is een",zin) «2»
Met het vierde voorbeeld leren we dat we wel degelijk naar een woord zoeken, want niet "zin" maar "zin." komt als woord in de bron voor. Het laatste voorbeeld toont dat we kunnen zoeken met een zinnetje. Meer zelfs, de spaties in de zoekterm hebben daarbij geen belang.
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Bevelen, deel 1
|huidige =Functies, deel 1
|volgende=Voorbeeld1}}
{{Sub}}
or0bl18x4t4qtp0vltxm0330dhv3wyd
Programmeren in REXX/Bevelen, deel 2
0
28737
428206
425892
2026-05-20T06:10:39Z
Erik Baas
2193
lf
428206
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit hoofdstuk [[leren]] we nog andere REXX bevelen te gebruiken.
=Werken met de programmabuffer of stack=
Volgende instructies laten toe de programmabuffer of stack te gebruiken.
==QUEUE - Een lijn achteraan toevoegen aan de stack==
Het bevel '''queue''' voegt een lijn toe aan de programmastack. De lijn wordt achteraan de wachtrij (queue=staart) toegevoegd en zal dus als laatste terug worden gelezen.
Hier is de term FIFO (First In, First Out) van toepassing. Wie eerst aan het loket komt zal dus eerst bediend worden.
'''queue''' 'Klaas'
'''queue''' 'Jan'
parse pull woord ; say woord «Klaas»
parse pull woord ; say woord «Jan»
==PUSH - Een lijn vooraan toevoegen aan de stack==
Met '''push''' voegen we ook een lijn toe aan de stack, maar de lijn wordt nu vooraan in de wachtrij geplaatst (de andere worden a.h.w. achteruit ''gepusht''). De nieuwe lijn zal dus als eerste terug worden gelezen.
Men heeft het over LIFO (Last In, First Out).
'''push''' 'Klaas'
'''push''' 'Jan'
parse pull woord ; say woord «Jan»
parse pull woord ; say woord «Klaas»
==PARSE PULL - Lezen van de stack==
Met het '''parse pull''' bevel kunnen we nu lijn voor lijn uit de stack gaan halen.
Indien de stack leeg is, dan gaat het programma wachten op data die men zal inbrengen aan het klavier (en lijkt dit equivalent aan het gebruik van '''parse linein''').
'''parse pull''' input
say 'Je hebt "'input'" ingetoetst.'
==PULL - Lezen van de stack==
Het '''pull''' bevel is een verkorte vorm voor '''parse <span style="color: red;">upper</span> pull'''. Hetgeen wordt ingelezen wordt dus tevens omgezet naar hoofdletters. Omdat die omzetting niet duidelijk wordt aangegeven in de instructie verkiezen we '''parse upper pull'''.
Voor de volledigheid moeten we hier ook nog de '''queued()''' functie bespreken:
==QUEUED - Bepaal het aantal lijnen in de stack==
Deze functie heeft geen parameters en retourneert het aantal lijnen dat staat te wachten in de programmabuffer.
Indien een programma de stack wil ledigen is het goed eerst na te gaan of er nog een lijn staat te wachten. Zoniet stopt het programma en wacht het op input van de gebruiker, wat misschien niet de bedoeling is. '''Queued()''' is daarvoor geschikt.
do while queued()>0
parse pull line
/* verdere verwerking hier */
end
<!--------------------------------------------------------------------------------->
=Werken met subroutines of inwendige functies=
Subroutines en inwendige functies beginnen beide aan een label en eindigen met een '''return''' bevel. Het label bepaalt de naam van de functie of routine.
Een functie kan op twee manieren worden opgeroepen. Expliciet met een '''call''' bevel, of impliciet als een klassieke functie [functie(parm1,parm2,...)]. Wanneer deze laatste vorm wordt gebruikt '''''moet de functie een resultaat teruggeven''''', anders treedt er een fout op in de aard van ''Error 44: Function or message did not return data''. Het resultaat kan desnoods een nullstring zijn, als er maar iets wordt teruggegeven.
We bestuderen nu het bevel '''call'''.
==CALL - Oproepen van een routine of functie==
'''call''' naam [parameter1][,parameter2][,parameter3]...
Met dit bevel kunnen we zowel
* een interne routine,
* een externe routine of programma, als
* een interne functie
oproepen. De externe routine of programma is meestal een ander REXX programma. Sommige programmapakketten kunnen REXX als macro-taal gebruiken en dan kan met een call ook een functie van het pakket worden opgeroepen.
De ''naam'' verwijst naar wat wordt opgeroepen. Parameters worden van elkaar gescheiden door een komma.
In dit eenvoudig voorbeeld roepen we een interne routine op:
/* Programma met routine */
a=10
call MijnRoutine a
say a
exit
/****** onze routine begint hier ******/
MijnRoutine:
a=a+10
return
Op het scherm zullen we het getal «20» zien verschijnen. De variabele ''a'' is in dit voorbeeld inderdaad '''globaal''' aan het hoofdprogramma en de subroutine.
De routine kan dus de waarde van ''a'' lezen en/of aanpassen. Later zullen we zien hoe we dit kunnen vermijden.
Indien we van de subroutine een functie zouden willen maken, dan moeten we dus zorgen dat er een resultaat wordt teruggegeven bij de '''return'''. Ons voorbeeld wordt dan:
/* Programma met interne functie */
a=10 ; b=20
say MijnFunctie(a,b)
exit
/****** onze functie ******/
MijnFunctie:
parse arg w1 , w2
return w1*w2
Het resultaat dat '''return''' teruggeeft wordt natuurlijk eerst geïnterpreteerd door REXX.
We kunnen deze functie echter ook met een '''call''' oproepen:
/* Functie als routine */
a=10 ; b=20
'''call''' MijnFunctie a,b
say '''result'''
exit
MijnFunctie:
parse arg w1 , w2
return w1*w2
Het antwoord dat het bevel '''return''' dan teruggeeft is terug te vinden in de gereserveerde variabele '''result'''. Indien we vergeten een resultaat terug te geven zal de routine toch nog werken, maar de variabele ''result'' zal dan niet opgevuld zijn.
Soms hebben we namelijk geen resultaat nodig, of niet altijd nodig. Een functie kan bijvoorbeeld een host-commando (commando van het besturingssysteem) oproepen. Dit commando zal normaal gezien een returncode produceren. Die code kunnen we aan de oproeper van de routine teruggeven. Maar het staat de oproeper vrij deze code wél of niet op te pikken uit de variabele '''result'''.
Merk op dat ook in deze laatste voorbeelden de variabelen ''a'' en ''b'' zichtbaar en manipuleerbaar zijn door de subroutine of functie. Men zegt dan dat de variabelen ''globaal'' zijn. Dit kan natuurlijk leiden tot onverwachte toestanden in het hoofdprogramma.
Om die problemen te vermijden kunnen we gebruik maken van het '''procedure''' bevel.
==PROCEDURE - Beschermen van variabelen==
'''procedure''' [EXPOSE [''naam1''] [''naam2''] ...]
Een '''procedure''' bevel stelt dat alle variabelen vanaf nu ''lokaal'' moeten zijn. Dit bevel moet onmiddellijk ná het label volgen.
De variabelen van de oproeper blijven dus onbekend en onbereikbaar. Gebruiken we dezelfde naam voor een variabele in de hoofd- en subroutine, dan betreft het twee verschillende variabelen. De variabelen van de subroutine gaan verloren bij het '''return''' bevel.
Willen we sommige variabelen van het hoofdprogramma toch wel kunnen zien of aanpassen, dan moeten we ze '''expose'''ren. Op die manier worden het terug globale variabelen.
Men kan zowel afzonderlijke variabelen als hele stems exposeren. Dit is een voorbeeld:
/* Programma met lokale en globale variabelen */
a=10 ; b=20
mystem.0=2 ; mystem.1=5 ; mystem.2=8
say a "-" b "-" mystem.1 "-" mystem.2
call subroutine a
say a "-" b "-" mystem.1 "-" mystem.2
exit
/**** onze subroutine ****/
Subroutine: procedure '''expose''' b
a=43234
say a "-" b "-" mystem.1
b=a*b
return
Dit zien we bij uitvoering op het scherm verschijnen:
10 - 20 - 5 - 8
43234 - 20 - MYSTEM.1
10 - 200 - 5 - 8
De eerste resultaatlijn hoeft weinig uitleg, het toont de waarden zoals we ze net hebben toegekend in het hoofdprogramma.
Vervolgens roepen we de subroutine op die via het bevel '''procedure''' de variabelen van de oproeper afschermt. Er is wel een uitzondering gemaakt voor variabele ''b'', wie wordt namelijk geëxposeerd.
De tweede lijn in het resultaat bewijst dat de variabele ''a'' lokaal is voor de subroutine. De variabele ''b'' is wel degelijk die van de hoofdroutine,
dus met waarde «20». De variabele ''mystem.1'' tenslotte, is niet geïnitialiseerd in de subroutine.
Nadat de subroutine is uitgevoerd wordt de derde lijn afgedrukt. We zien daarbij dat enkel de geëxposeerde variabele ''b'' nu een andere waarde «200» heeft gekregen, als gevolg van de aanpassing in de subroutine.
Indien we ook de ''mystem.'' hadden willen publiek maken, dan moesten we eenvoudig dit toevoegen aan de '''expose''':
Subroutine: procedure expose b '''mystem.'''
We moeten gelukkig dus niet alle elementen afzonderlijk gaan exposeren !
{{Bericht
|titel=Tip
|bericht=Indien een hele resem variabelen globaal moeten zijn, dan kan men de namen ervan verzamelen in een nieuwe variabele, bv. ''GlobaleVariabelen''. En dan is het voldoende deze ene variabele te '''expose'''ren, mits ze tussen haakjes te zetten, zoals hier wordt getoond:
globaal='a b x'
...
Subroutine: procedure expose '''(globaal)''' mystem.
|type=tip}}
==RETURN - Verlaten van een subroutine of functie==
Met een '''return''' bevel verlaat men dus een subroutine of functie. In het geval van een functie moet een parameter zorgen voor het teruggeven van een resultaat. De parameter wordt zoals steeds, eerst door REXX geïnterpreteerd.
==SIGNAL - Springen naar een label==
'''signal''' label
Met '''signal''' springen we naar het label dat als parameter is opgegeven. Terugkeren zou enkel kunnen als we net ná het '''signal''' bevel een terugkeer-label voorzien. Dit is het belangrijke verschil met een '''call'''.
Signal gebruiken is een weinig elegante manier van programmeren. '''Signal''' wordt dan ook enkel gebruikt ingeval er nooit meer moet teruggekeerd worden. Typisch zijn de routines die fouten afhandelen en dan het programma beëindigen. We leren hier meer over in het hoofdstuk over [[Programmeren in REXX/Debugging|Debugging]].
==Bijzonderheden en valkuilen met CALL en functies==
===EXIT in de subroutine===
/* */
call subrout
say 'Goodbye'
exit
subrout:
say 'Hello'
exit
In de subroutine hebben we het bevel '''exit''' geschreven en niet '''return'''. REXX heeft hier geen probleem mee, maar we zullen nooit een «Goodbye» op het scherm zien verschijnen omdat we niet meer terugkeren naar de oproeper. We stoppen het programma.
Het kan zijn dat we in een subroutine beslissen niet langer verder te gaan met de rest van het programma, omdat er bijvoorbeeld een probleem is opgetreden. Dit is echter geen mooie manier van programmeren,
en soms moeilijk te debuggen. Beter is een foutcode met een '''return'''-bevel terug te geven en het hoofdprogramma te laten beslissen of het programma moet stoppen.
===Recursieve functie===
Een recursieve functie is een functie die zichzelf telkens weer oproept. Om te vermijden dat men er nooit meer uitgeraakt moet er ergens een "uitgang" voorzien worden.
Het volgend voorbeeld berekent de faculteit van een getal (x!).
/* Recursieve interne function */
parse arg getal
say getal'! =' facculteit(getal)
exit
/* Functie ter berekening van de faculteit */
Faculteit: procedure
arg n /* nieuwe n bij elke iteratie */
if n=0 then return 1 /* Bij 1 stoppen we */
return faculteit(n-1) * n
Dank zij het bevel '''procedure''' wordt bij elke recursieve oproep een nieuwe variabele ''n'' aangemaakt. Door te testen of "n=0" zullen we ook recursief uit alle subroutines terug naar boven zullen kruipen.
===Externe functies of routines===
Om een externe functie of routine op te roepen gaat men op dezelfde manier te werk, doch de variabelen van het oproepend programma zijn dan altijd onbereikbaar. Om gegevens door te spelen zal men bij het oproepen parameters moeten meegeven, want een '''expose''' heeft hier geen zin.
De externe routine haalt de parameters dan op met een '''[[Programmeren in REXX/Bevelen,_deel_1#ARG|ARG]]-''' of '''[[Programmeren in REXX/Bevelen,_deel_1#PARSE|PARSE ARG]]'''-bevel of een
'''[[Programmeren in REXX/Functies_deel_1#ARG|ARG]]'''-functie. Meer daarover in [[Programmeren in REXX/Host_Commando's|Oproepen van host commando's]].
===Tweelingen===
Niets belet ons om een interne functie te schrijven die dezelfde naam heeft als een standaard REXX functie of een bestaande externe functie.
Op die manier kunnen we bijvoorbeeld de werking van een functie beïnvloeden. REXX zoekt namelijk eerst intern en dan extern. De zoekvolgorde om externe functies te vinden is
afhankelijk van het besturingssysteem. Er kunnen bijvoorbeeld nog externe functiepakketten meespelen.
Willen we met zekerheid de standaardfunctie oproepen, dan moeten we de naam als een constante, en met hoofdletters schrijven.
Hier hebben we een voorbeeld:
say "LEFT"('Europeaan',6)
say left('Europeaan',6)
...
Left: Procedure
parse arg string , lengte
return right(string,lengte)
We zien dan het volgende op het scherm verschijnen:
Europe
opeaan
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Voorbeeld1
|huidige =Bevelen, deel 2
|volgende=Functies deel 2}}
{{Sub}}
3c70t0z5k4inwc6ylkgz7d7esyrvlds
Programmeren in REXX/Debugging
0
28767
428208
425896
2026-05-20T06:10:40Z
Erik Baas
2193
lf
428208
wikitext
text/x-wiki
{{Index Programmeren in REXX|Trace/Tracing en debugging}}
In dit hoofdstuk gaan we dieper in op het opzoeken van fouten in een REXX programma (debugging). We zullen het hebben over de uitgebreide traceer-mogelijkheden, maar ook over hoe we fouten kunnen intercepteren tijdens uitvoering.
=TRACE commando en functie=
REXX heeft zowel een '''trace''' commando als een trace functie waarmee tracering kan aan- of afgezet kan worden. We leggen later uit
in welke geval we beter het bevel of de functie gebruiken, maar we beginnen met de syntaxis van het '''trace''' bevel.
==TRACE bevel==
<!------------------------------------------------->
'''trace''' ''aantal''
of
'''trace''' [?][''type'' | "<u>Normal</u>"]
of
'''trace''' ''constante'' of ''symbool'' of ''VALUE uitdrukking''
In het eerste geval vragen we een ''aantal'' programmalijnen te traceren.
In het tweede geval vragen we om bepaalde types te traceren. We kunnen kiezen uit:
* '''N'''ormal, '''F'''ailure of '''E'''rror - toont alle host-commands die voor een fout zorgen, samen met de returncode. Onder Windows, zal het oproepen van een onbekend host-commando resulteren in een '''failure''' en een foutcode=1.
* '''A'''ll - alle lijnen worden vóór uitvoering getoond.
* '''C'''ommands - alle host-commands worden vóór uitvoering getoond, en indien een fout optreedt wordt ook de foutcode getoond.
* '''E'''rror - alle besturingssysteem-commando's worden getoond, samen met de eventuele foutcode.
* '''I'''ntermediates - de meest krachtige tracering die álle programmaregels traceert vóór hun uitvoering, maar daarbovenop ook alle tussenliggende interpretatiestappen toont.
* '''L'''abels - traceert de labels waarlangs het programma voorbijkomt. Nuttig om de weg te volgen die wordt afgelegd door oproep van interne functies of routines en sprongen ten gevolge van '''signal''' instructies.
* '''O'''ff - zet tracering af.
* '''R'''esults - traceert alle programmalijnen vóór uitvoering en toont tevens het eindresultaat na interpretatie.
Het optionele '''?'''-teken dat men voor het type kan schrijven zet de interactieve tracering aan, of terug uit bij een tweede oproep ervan. Er mag geen spatie zijn tussen het vraagteken en het type als er een wordt opgegeven.
Met [[#Interactieve tracering|interactieve tracering]] zal het programma wachten na uitvoering van elke programmalijn, en geeft het de programmeur de kans om
instructies uit te voeren of het programma af te breken. Dit is een uiterst krachtige optie, omdat het bijvoorbeeld ook toelaat waarden
van variabelen op te vragen of zelfs te veranderen om zo de koers van het programma te wijzigen. Het is tevens mogelijk het laatste statement nogmaals uit te voeren (bv. na veranderen van de variabelen). Voor een beginnend programmeur is het tevens een leerzame optie, omdat het duidelijk laat zien hoe REXX zijn werk doet.
Vooraleer verder te gaan met voorbeelden, geven we nog het formaat van de '''trace''' functie:
==TRACE functie==
'''trace'''([type])
Zonder type zal de functie de huidige traceringsmethode teruggeven. Met een type kan de nu geldende methode worden aangepast tijdens uitvoering van het programma.
{{Bericht
|bericht=Als men een functie oproept dan moet men steeds iets doen met het resultaat (say of in variabele steken). Doet men dat niet, en laat men de functie als alleenstaand statement, dan zal het resultaat van de functie terug door REXX opgepikt en geïnterpreteerd worden. Doordat je er niets mee doet, zal REXX het resultaat doorgeven aan de host om het commando te laten uitvoeren, wat doorgaans niet de bedoeling is. Men schrijft dus doorgaans '''call trace xx''' of '''xyz=trace(xx)''', en zeker niet '''trace(xx)''' zonder meer.
|type=waarschuwing}}
=Voorbeelden van tracering=
Om voorbeelden te geven maken we gebruik van een stukje programma dat we uit een vorig hoofdstuk haalden:
/* Voorbeelden van tracering */
parse arg traceringsoptie
call trace traceringsoptie
parse value time() time('S') with TijdNu DagSeconden
parse var TijdNu uu ':' mm ':' ss /* splits tijd in uren, minuten en seconden */
AantalSeconden=uu*3600 + mm*60 + ss /* hoeveel is dat in seconden */
say AantalSeconden=DagSeconden /* «1» want anders maakten we een fout */
Plus4min= AantalSeconden + 4*60 /* doe er 4 minuten bij */
/* Nu terug omzetten naar uu:mm:ss formaat... */
uu = Plus4min % 3600 /* Gehele deling */
if uu>23 then uu=uu-24 /* Misschien middernacht overschreden bij optelling */
rest = Plus4min // 3600 /* Rest na deling door 3600 (= aantal sec in 1 uur */
mm = rest % 60 /* Omzetten naar minuten via gehele deling */
ss = Plus4min // 60 /* Seconden zijn rest na deling door 60 */
Say 'Binnen 4 minuten zal het' right(uu,2,0)':'right(mm,2,0)':'right(ss,2,0) 'zijn.'
exit
Bij een eerste oproep gaan we de '''R'''esultaten traceren:
C:\>'''d:\RexxProgrammas\test R'''
>>> "N"
3 *-* parse value time() time('S') with TijdNu DagSeconden
>>> "S"
>>> "11:32:59 41579"
>>> "11:32:59"
>>> "41579"
4 *-* parse var TijdNu uu ':' mm ':' ss /* splits tijd in uren, minuten en seconden */
>>> ":"
>>> "11"
>>> ":"
>>> "32"
>>> "59"
5 *-* AantalSeconden=uu*3600 + mm*60 + ss /* hoeveel is dat in seconden */
>>> "41579"
6 *-* Plus4min= AantalSeconden + 4*60 /* doe er 4 minuten bij */
>>> "41819"
8 *-* uu = Plus4min % 3600 /* Gehele deling */
>>> "11"
9 *-* if uu>23
>>> "0"
10 *-* rest = Plus4min // 3600 /* Rest na deling door 3600 (= aantal sec in 1 uur */
>>> "2219"
11 *-* mm = rest % 60 /* Omzetten naar minuten via gehele deling */
>>> "36"
12 *-* ss = Plus4min // 60 /* Seconden zijn rest na deling door 60 */
>>> "59"
13 *-* Say 'Binnen 4 minuten zal het' right(uu,2,0)':'right(mm,2,0)':'right(ss,2,0) 'zijn.'
>>> "11"
>>> "2"
>>> "0"
>>> "36"
>>> "2"
>>> "0"
>>> "59"
>>> "2"
>>> "0"
>>> "Binnen 4 minuten zal het 11:36:59 zijn."
Binnen 4 minuten zal het 11:36:59 zijn.
14 *-* exit
Van elk statement zien we nu de tussenstappen van de interpretatie. Voor het derde statement zien we achtereenvolgens:
#dat er een constante 'S' is meegegeven in de tweede oproep van de functie time. REXX interpreteert dus eerst wat tussen haakjes staat. In dit geval is het een parameter van een functie, maar bij wiskundige formules kunnen we ook haakjes gebruiken om de volgorde van uitwerking te beïnvloeden. De parameter had trouwens ook een uitdrukking met variabelen kunnen zijn. Die moest dan eerst worden omgezet. Op statement 13 hebben we daar voorbeelden van;
#dat de bron van de '''parse''' instructie tot de waarde «11:32:59 41579» heeft geleid;
#dat de eerste variabele van het sjabloon (TijdNu) het eerste woord van de bron krijgt;
#dat de tweede variabele van het sjabloon (DagSeconden) het tweede woord van de bron krijgt;
Kiezen we nu voor de tracering met '''I'''ntermediaire resultaten dan zien we:
C:\>'''d:\RexxProgrammas\test I'''
>>> "N"
3 *-* parse value time() time('S') with TijdNu DagSeconden
>F> "11:44:02"
>L> "S"
>>> "S"
>F> "42242"
>O> "11:44:02 42242"
>>> "11:44:02 42242"
>>> "11:44:02"
>>> "42242"
4 *-* parse var TijdNu uu ':' mm ':' ss /* splits tijd in uren, minuten en seconden */
>V> "11:44:02"
>L> ":"
>>> ":"
>>> "11"
>L> ":"
>>> ":"
>>> "44"
>>> "02"
5 *-* AantalSeconden=uu*3600 + mm*60 + ss /* hoeveel is dat in seconden */
>V> "11"
>L> "3600"
>O> "39600"
>V> "44"
>L> "60"
>O> "2640"
>O> "42240"
>V> "02"
>O> "42242"
>>> "42242"
We hebben de output beperkt tot de eerste 5 statements, want we merken onmiddellijk dat we nu héél wat meer te zien krijgen.
<br>Om te beginnen moeten we even uitleggen wat die aanduidingen tussen >-tekens betekenen:
*'''*-*''' De te interpreteren lijn, eventueel gevolgd door:
*'''>L>''' De waarde van een constante ('''L'''iteral).
*'''>V>''' De huidige waarde van een '''V'''ariabele.
*'''>O>''' Een tussenresultaat bij de interpretatie (O staat voor '''O'''utput)
*'''>>>''' Het uiteindelijk resultaat van de interpretatie van het hele statement.
*'''>.>''' De waarde die aan een plaatshouder in een parse instructie is gegeven.
*'''>C>''' De waarde van een [[Programmeren in REXX/Fundamenten#SamVar|samengestelde variabele]] (stem-variabele) na interpretatie van haar staart-stuk. (C staat voor '''C'''ompound variable).
*'''>F>''' Het resultaat van een '''F'''unctie.
*'''+++''' Een bericht van trace, bv. een host-commando dat een fout genereerde, het bericht dat aanduidt dat interactieve tracering wordt gestart, een fout tegen de syntaxis...
We hebben hier slechts een beperkt aantal van die aanduidingen. We bekijken weer wat het derde statement ons heeft gegeven:
#De eerste oproep van de '''F'''unctie time geeft «11:44:02» als resultaat;
#De tweede functie heeft een constante parameter ('''L'''iteral);
#Het resultaat van de interpretatie is natuurlijk gewoon «S»;
#Het resultaat van de '''F'''unctie is nu «42242» seconden;
#Dus de '''O'''utput van de bron voor het parse bevel is «11:44:02 42242»;
#Het resultaat van de interpretatie is diezelfde waarde;
#De eerste variabele van het sjabloon heeft als resultaat het eerste woord van de bron;
#De tweede variabele van het sjabloon heeft als resultaat het tweede woord van de bron.
Kortom, meer dan voldoende informatie om desgevallend de fout te kunnen ontdekken.
==Interactieve tracering==
Nu gaan we nog een stap verder, en schakelen de interactieve tracering in. Wat vetjes gedrukt is voert de gebruiker in:
C:\>'''d:\RexxProgrammas\test ?r'''
>>> "N"
+++ Interactive trace. "Trace Off" to end debug, ENTER to Continue. +++
<span style="color: black; background-color:yellow;">[programma stopt en wacht op actie - we drukken de Enter-toets]</span>
3 *-* parse value time() time('S') with TijdNu DagSeconden
>>> "S"
>>> "11:57:18 43038"
>>> "11:57:18"
>>> "43038"
<span style="color: black; background-color:yellow;">[programma stopt en wacht op actie]</span>
'''TijdNu="11:57:00"'''
<span style="color: black; background-color:yellow;">[we drukken de Enter-toets]</span>
4 *-* parse var TijdNu uu ':' mm ':' ss /* splits tijd in uren, minuten en seconden */
>>> ":"
>>> "11"
>>> ":"
>>> "57"
>>> "00"
<span style="color: black; background-color:yellow;">[programma stopt en wacht op actie]</span>
'''TijdNu="11:57:30"'''
<span style="color: black; background-color:yellow;">[we drukken de Enter-toets]</span>
'''='''
<span style="color: black; background-color:yellow;">[we drukken de Enter-toets]</span>
4 *-* parse var TijdNu uu ':' mm ':' ss /* splits tijd in uren, minuten en seconden */
>>> ":"
>>> "11"
>>> ":"
>>> "57"
>>> "30"
<span style="color: black; background-color:yellow;">[programma stopt en wacht op actie - we drukken de Enter-toets]</span>
5 *-* AantalSeconden=uu*3600 + mm*60 + ss /* hoeveel is dat in seconden */
>>> "43050"
<span style="color: black; background-color:yellow;">[programma stopt en wacht op actie]</span>
'''exit'''
<span style="color: black; background-color:yellow;">[we drukken de Enter-toets]</span>
Telkens het zinvol is om de gebruiker een actie te laten uitvoeren stopt het programma. Als we onmiddellijk de ''Enter''-toets indrukken begint REXX het volgende statement uit te voeren.
Maar bij elk pauzemoment hebben we de mogelijkheid in te grijpen in het programma. We kunnen namelijk:
* een geldig REXX bevel geven, bijvoorbeeld een variabele aanpassen met een assignatie, met een '''trace''' commando de tracering veranderen of annuleren, de waarde van een variabele opvragen;
* een gelijkheidsteken (=) ingeven om het laatst uitgevoerde statement nogmaals te laten uitvoeren (eventueel na verandering van waarden).
Na het derde statement hebben we de waarde van ''TijdNu'' overschreven (de seconden op nul gezet). Na het vierde statement hebben de variabele nogmaals veranderd. Dan hebben we het =-teken ingevoerd. Daardoor is het vierde statement terug uitgevoerd, doch met de nieuwe waarde van ''TijdNu''. Na het vijfde statement geven we er de brui aan met een exit bevel.
'''Let op !'''
#Stel dat we alle waarden van een stem willen onderzoeken tijdens een pauzemoment. Dan hebben we een lus nodig. Maar we moeten deze lus compleet in één lijn opgeven, dus bijvoorbeeld '''do i=1 to mystem.0;say mystem.i;end'''. <span style="color: black; background-color:yellow;">Let ervoor op om niet ongewild een variabele van het programma zelf aan te passen. Dus, om die stem te tonen is het misschien beter een andere, minder gewone, lus-variabele te gebruiken, xyz bijvoorbeeld.</span>
#Als we interactief traceren en we geven een '''trace ?''' commando mee, dan wordt overgegaan op niet-interactieve tracering en zullen we verder niet meer kunnen ingrijpen in het programma tenzij er terug een '''call trace ?i''' in de broncode staat.
#Voeren we tijdens een pauzemoment '''trace "Off"''' in, dan worden alle traceringen gestopt, ook de interactieve.
#We kunnen ook een '''trace''' commando geven met een getal als parameter. Is het getal positief, dan zal het opgegeven aantal statements worden getoond, doch nu zonder pauzes. Is het getal negatief, dan zal dat aantal statements niet getraceerd, maar natuurlijk wel nog uitgevoerd worden. Handig bijvoorbeeld om een aantal iteraties van een lus niet in detail te bekijken.
==Wanneer TRACE bevel en wanneer TRACE functie ?==
Stel dat we een programma hebben met subroutines. Een trace in het hoofdprogramma blijft geldig voor zijn subroutines. Maar met een '''trace()''' functie kunnen we in een subroutine de tracering anders laten verlopen. Dat zal helemaal geen invloed hebben op hoe de hoofdroutine traceert.
Misschien willen we de subroutine of functie helemaal niet meer traceren omdat we er zeker van zijn dat ze feilloos werkt. Dan schrijven we aan het begin van de subroutine een '''call trace "Off"'''. De subroutine wordt niet getraceerd, de tracering van het hoofdprogramma loopt gewoon door na het beëindigen van de subroutine.
==Nuttige traceringen==
Met een '''Trace "C"''' traceren we enkel de host-commando's. Het nut ervan is echter wel verminderd in de Windows omgeving. Zoals we zullen zien in een volgend hoofdstuk, vervangen we veel host commando's door functies van het RexxUtil pakket. Voor ons lijken deze functies host commando's, maar voor REXX zijn het functies zoals alle andere en dus zal een "trace ?C" niet stoppen na zo'n functie.
'''Trace "?E"''' zal host-commando's enkel traceren als er een fout optreedt. Een ''MKDIR'' commando zal onopgemerkt voorbijgaan als alles goed verloopt, maar het programma zal in interactieve mode stoppen indien er een ongeldige naam aan het commando is meegegeven. Maar ook hier dezelfde opmerking als we overschakelen op de RexxUtil functies die we in het volgend hoofdstuk bespreken.
=Exitroutine=
Het is een goede gewoonte om in een programma slechts één algemene exit-routine te voorzien. Deze kan dan eventuele (fout)boodschappen op een gestandaardiseerde manier afdrukken.
Dit is een eenvoudig voorbeeld van zo'n exit-routine:
/* Programma met exit-routine */
... instructies ...
if fout-ontdekt then call foutexit 20,"Bericht 1","Bericht 2"
... instructies ...
call exit 0,"Alles is goed verlopen"
/*---------------------------------------*/
EXIT: FOUTEXIT: /* Algemene exit-routine */
parse source . . myname
a=lastpos('\',myname)
parse var myname +(a) myname '.'
do i=2 to arg()
say myname':' arg(i)
end
exit arg(1)
Wat leert ons dit voorbeeld ?
<ol compact>
<li>Het is mogelijk meer dan één label op dezelfde regel te schrijven. Ze worden op die manier synoniemen van elkaar. Hier gaan exits met of zonder fouten samen toekomen.</li>
<li>Onze exit-routine kan geen, één of meerdere parameters hebben. De eerste wordt verondersteld een returncode te zijn. De volgende parameters zijn de tekst die we op het scherm willen zien verschijnen.</li>
<li>In de exit-routine halen we eerst de naam van ons programma op via een '''parse source'''. We strippen het pad van de naam af.</li>
<li id="ARG">De functie '''arg()''' wordt hier op verschillende manieren gebruikt. '''arg()''' zonder parameter retourneert het aantal binnengekomen parameters. arg(0) ware hier intuïtiever geweest, naar analogie met een stem, maar zo werkt het spijtig genoeg niet. Geven we een positief getal mee aan '''arg(i)''', dan geeft dat toegang tot de i-de parameter die aan de (exit-)routine is meegegeven.</li>
<li>Hier behandelen we eerst alle parameters vanaf de tweede t.e.m. de laatste. Deze zijn berichten die we op het scherm zetten, voorafgegaan door de naam van het programma. De naam toevoegen is vooral nuttig indien we nog vanuit een ander REXX programma zijn opgeroepen. Dan weten we tenminste wie ons een bericht geeft. Meer nog, op die manier onderscheiden we onze berichten van die van host-commando's.</li>
<li>Als laatste gebruiken we het '''exit''' bevel, met de eerste parameter die een returncode voorstelt. Het is spijtig dat Windows - in tegenstelling tot bijvoorbeeld z/VM - deze foutcode niet op het scherm toont. Maar indien ons programma door een ander was opgeroepen, dan geven we op die manier wel de returncode op een standaardmanier terug. Het blijft dus een goede gewoonte een adequate returncode te geven op het einde van het programma.</li>
</ol>
Willen we een onderscheid maken tussen een oproep vanuit de host of vanuit een ander programma, dan kunnen we als volgt uitbreiden:
/*-----------------------*/
EXIT: FOUTEXIT: /* Algemene exit-routine */
/*-----------------------*/
parse source . oproepvorm myname
a=lastpos('\',myname)
parse var myname +(a) myname '.'
do i=2 to arg()
say myname':' arg(i)
end
if oproepvorm='COMMAND' then
if arg(1)<>"" & arg(1)<>0 then say myname': Foutcode='arg(1)
exit arg(1)
Het tweede woord (''oproepvorm'') dat door '''parse source''' wordt gegeven kan volgende waarden aannemen:
* COMMAND als het programma vanuit de host is opgeroepen;
* SUBROUTINE als het programma vanuit een ander (REXX) programma is opgeroepen als een subroutine (dus met een '''call''').
* FUNCTION als het programma vanuit een ander (REXX) programma is opgeroepen als een functie.
Hier zullen we zelf zorgen om de returncode op het scherm te zetten, maar alleen als we vanuit de host zijn opgeroepen en als het een fout betreft.
=Fouten intercepteren tijdens uitvoering=
REXX laat ook toe een aantal fouten tijdens uitvoering te intercepteren. Dit kan dank zij de bevelen '''signal on ''conditie''''' of '''call on ''conditie'''''.
Al naargelang het besturingssysteem en de versies van REXX kunnen min of meer soorten fouten worden geïntercepteerd. Maar normaal gezien zouden alle implementaties van REXX de volgende moeten aanbieden:
* NOTREADY - conditie die optreedt indien het besturingssysteem een apparaat moet benaderen dat niet gereed is (bv. geen CD in lade).
* SYNTAX - conditie die optreedt indien er een fout tegen de syntaxis wordt ontdekt. Hoewel OORexx het heel goed doet om veel van die fouten te ontdekken, nog voor hij met de uitvoering begint, blijft het nuttig ze nog verder op te vangen. REXX kan bijvoorbeeld pas tijdens uitvoering ontdekken dat variabele ''nr'' in "say left('xxx',nr)" niet met een geheel getal is opgevuld, en dus dat de functie niet kan werken. In sommige gevallen kan de programmeur zelf syntaxis fouten willen behandelen om bv. meer specifieke informatie te geven. Zo kan men tijdens de behandeling van database records zeggen welk record er behandeld werd op het moment dat de fout optrad. Door een "Signal on Syntax" in een subroutine te gebruiken, kan het hoofdprogramma desgewenst zelfs verder gaan na de fout. Een voorbeeld hiervan krijgen we verder.
* NOVALUE - meldt onmiddellijk als een niet geïnitialiseerde variabele in een instructie wordt gebruikt. We zijn al verschillende gevallen tegengekomen waar dit tot problemen kan leiden. Een goed REXX programma zou eigenlijk steeds een '''signal on novalue''' moeten gebruiken. Dit vereist dan wel nog meer discipline van de programmeur, want alles wat constant is (zoals bv. host commando's), moet dan al zeker als constante worden geschreven. Het voordeel is echter dat men schrijffouten in namen van variabelen snel ziet. Anders zou een '''if''' misschien een fout pad inslaan en pas veel later alles in het honderd laten lopen.
* ERROR - conditie die optreedt als een host-commando een fout geeft.
Met deze kennis kunnen we onze exit-routine sterk uitbreiden:
signal on Syntax
signal on Notready
signal on Novalue
signal on Error
... hier komt ons programma ...
call exit 0,'Alles goed verlopen'
/*----------------------------------------------------------------*/
Syntax: /* We komen hier bij een syntax fout */
/*----------------------------------------------------------------*/
call foutexit 99,'REXX syntaxfout op lijn' sigl,,
sourceline(sigl),,
'REXX zegt:' errortext(rc)
/*----------------------------------------------------------------*/
NotReady: /* We komen hier als een apparaat niet gebruiksklaar is */
/*----------------------------------------------------------------*/
call foutexit 99,'REXX probleem op lijn' sigl,,
sourceline(sigl),,
'Een apparaat is niet gebruiksklaar.'
/*-----------------------------------------------------------------*/
NoValue: /* we komen hier bij een niet-geïnitialiseerde var */
/*-----------------------------------------------------------------*/
undefvar= 'CONDITION'('D')
call foutexit 99,'REXX probleem op lijn' sigl,
'variabele' undefvar 'is niet gedefiniëerd.'
/*-----------------------------------------------------------------*/
Error: /* We komen hier als een host-command een returncode<>0 gaf */
/*-----------------------------------------------------------------*/
cmderr= 'CONDITION'('D')
call foutexit rc,'REXX probleem op lijn' sigl,,
'Commando' cmderr 'gaf foutcode='rc
De Exit-routine zelf is onveranderd gebleven en hebben we hier niet meer herhaald.
We kunnen hier het volgende leren:
*De '''signal on''' instructies bereiden ons voor om verschillende soorten fouten te intercepteren. Deze kunnen gelijk waar in het programma worden geplaatst en men kan ze terug afzetten met een '''signal off conditie'''. Gebruik enkel "signal on" voor wat zin heeft voor het programma. Maar altijd en overal deze subroutines voorzien kan op zich nooit kwaad.
*De gereserveerde variabele '''sigl''' bevat het lijnnummer vanwaar we gekomen zijn, dus de lijn waar de foutconditie is opgetreden.
*De functie '''sourceline(sigl)''' haalt de inhoud van die bewuste lijn uit de broncode op.
*De functie '''errortext(code)''' geeft de (Engelse) tekst die bij de fout hoort.
*De functie '''condition('D')''' geeft de beschrijving van de fout boven (Description). We kunnen ook de '''C'''ondition zelf opvragen (met ERROR, NOVALUE... als antwoord), of de '''S'''tatus die ON of OFF kan zijn.
*Tot slot: We hebben geen fout geschreven wanneer we twee komma's aan het eind van een lijn hebben gebruikt (bij "call foutexit") ? Probeer zelf te begrijpen waarom dit zo moet zijn !
Het intercepteren van fouten hebben we hier met een '''signal on''' instructie geactiveerd, maar we kunnen ook '''call on''' gebruiken om fouten te intercepteren (behalve voor syntaxfouten). In dat geval kunnen we in de subroutine die de fout behandelt, beslissen om toch terug te keren naar het hoofdprogramma. Maar of dit zinvol is hangt af van het hoofdprogramma. Meestal kunnen we toch niet veel zinnigs meer doen na zo'n fouten.
We kunnen de condities ook onderweg aan- en afzetten. Zo kunnen we enkel op subroutine-niveau fouten gaan onderscheppen. Het onderscheppen stopt automatisch bij het einde van de subroutine.
Onderstaand stukje programma geeft bijvoorbeeld een eenvoudige manier om te testen of een datum geldig is:
signal on Syntax
parse arg startDatum andereParms
startDatum=DatumValidatie(startDatum)
say 'startDatum='startDatum
exit
DatumValidatie: /* we aanvaarden datums in formaat jjjjmmdd of jjjj-mm-dd */
/* de datum die we terug geven heeft altijd formaat jjjjmmdd */
signal on syntax <span style="color: black; background-color:yellow;">name DatumNietSorted</span> /* Interceptieroutine met naam */
return date('S',arg(1),'S')
<span style="color: black; background-color:yellow;">DatumNietSorted</span>:
'''signal on syntax <span style="color: black; background-color:lightgreen;">name DatumNietISO</span>'''
return date('S',arg(1),'S',,'-')
<span style="color: black; background-color:lightgreen;">DatumNietISO</span>:
call foutExit 1949-11-16,'Foute ingavedatum:' arg(1),,
'we verwachten formaat jjjj-mm-dd of jjjjmmdd'
Wat leren we hier ?
*Aan een '''signal on''' of een '''call on''' kan een '''name onzenaam''' gegeven worden, zodat we een meer sprekende naam voor de interceptieroutine kunnen kiezen, of - zoals in bovenstaand voorbeeld het geval is - verschillende routines die fouten intercepteren mogelijk worden (gele en groene routines);
*In zekere zin hebben we hier een voorbeeld waarbij de interceptieroutine toch teruggaat naar het hoofdprogramma. De subroutine zelf wordt abrupt afgebroken;
*De '''signal on''' instructies worden pas aangezet in de subroutines of functies.
*De leuke returncode ''1949-11-16'' helemaal op het einde, stelt een datum voor (niet toevallig de verjaardag van de schrijver van deze tekst). En hij werkt zonder problemen, al zal het resultaat 1922 geven...
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Host Commando's
|huidige =Debugging
|volgende=RexxUtil}}
{{Sub}}
nwee8j73keqrhnnsptqje6kv0s70w07
Programmeren in REXX/Parse in detail
0
28798
428211
425897
2026-05-20T06:10:43Z
Erik Baas
2193
lf
428211
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit hoofdstuk gaan we dieper in op de mogelijkheden van het '''PARSE''' bevel.
=Waarvoor dient PARSE ?=
Parse laat toe een '''''bron''''' op te splitsen volgens een '''''sjabloon''''' (Engels: template) waarbij de verschillende delen aan variabelen worden toegekend.
'''parse''' ''bron'' ''sjabloon''
Bijvoorbeeld:
zin='Dit is een zin'
'''parse''' var zin woord1 woord2 woord3 woord4
Hierbij is de bron de inhoud van de variabele ''zin'' en bestaat het sjabloon uit «woord1 woord2 woord3 woord4».
Na uitvoering zal «Dit» in variabele ''woord1'' komen, «is» in variabele ''woord2'', enzovoort.
=Korte herhaling van de verschillende bronnen=
De bronnen kunnen zijn:
* '''ARG''' - de argumenten ofte parameters die aan het programma, een subroutine of functie worden meegegeven.
* '''PULL''' - de eerste zin die in de stack te vinden is. Bij ontstentenis hiervan, de gegevens die aan het klavier zullen worden ingevoerd.
* '''LINEIN''' - vergelijkbaar met '''pull''', maar er wordt niet naar de stack gekeken, enkel naar input aan het klavier.
* '''VAR''' ''variable'' - de inhoud van de opgegeven variabele.
* '''VALUE''' ''uitdrukking'' '''WITH''' - het resultaat van de interpretatie van de uitdrukking.
en een paar buitenbeentjes:
* '''SOURCE''' - de karakteristieken van het uitvoerend programma (minstens: besturingssysteem, oproeptype en naam en plaats van de broncode)
* '''VERSION''' - de geïnstalleerde versie en release van REXX.
{{Bericht
|bericht=Het sleutelwoord '''with''' is bij '''parse value''' écht nodig. De bron is een uitdrukking die complexe vormen kan aannemen, en het sleutelwoord dient als scheiding met het sjabloon.
Een veel voorkomende fout is een '''with''' te gebruiken bij een '''parse var''':
parse var zin '''with''' woord1 woord2
Dit resulteert niet in een syntax-fout, doch het eerste woord van ''zin'' zal terechtkomen in variabele ''with''.
|type=waarschuwing}}
=Bespreking van de sjabloonvormen=
Sjablonen kunnen bestaan uit:
* een eenvoudige opsomming van tokens (namen van variabelen);
* variabelen samen met constante zoek-strings;
* variabelen samen met relatieve of absolute positie-aanduidingen.
Ook combinaties van deze vormen zijn mogelijk.
Het voorbeeld waarmee we dit hoofdstuk zijn begonnen is van de eerste soort.
{{Bericht
|bericht=Indien de bron meer woorden bevat dan er variabelen zijn opgegeven in het sjabloon, dan krijgt de laatste variabele van het sjabloon '''de rest uit de bron'''. Dus bij:
'''parse value''' "Dit is een zin." '''with''' w1 w2 w3
zal variabele ''w3'' de waarde «een zin.» ontvangen.
|type=waarschuwing}}
==Plaatshouder==
Willen we vermijden dat de laatste variabele het ''overtollige'' deel van de bron bevat, dan lijkt het toevoegen van een extra "wegwerp"-variabele in het sjabloon een eenvoudige oplossing.
Dit zal wel werken, maar we verbruiken nodeloos geheugen indien de wegwerpvariabele nooit meer gebruikt zal worden.
Een meer elegante oplossing bestaat erin een '''plaatshouder''' te voorzien. Op elke plaats in het sjabloon waar we een woord uit de bron niet nodig zullen
hebben schrijven we dan een punt om de plaats te reserveren, zonder dat de inhoud zal worden opgeslagen in geheugen.
Dit is een voorbeeld:
'''parse value''' "Dit is een zin" '''with''' w1 . w3 .
Nu bevat ''w1'' de waarde «Dit», en ''w3'' de waarde «een».
Meer nog, vermits de laatste variabele van een sjabloon de rest van de bronstring zal bevatten, <u>inclusief de spaties</u>, zal een plaatshouder ons in het volgend voorbeeld ook
uit de nood kunnen helpen. Schrijven we:
'''parse value''' "Jan Klaas " '''with''' voornaam naam
dan zal ''naam'' de waarde « Klaas » bevatten, inclusief de 5 spaties aan het eind, én een spatie vooraan. Er wordt inderdaad slechts één spatie weggenomen tussen de woorden van de bron.
Gebruiken we echter een plaatshouder zoals hier:
'''parse value''' "Jan Klaas " '''with''' voornaam naam .
dan zal variabele ''naam'' slechts de waarde «Klaas» bevatten en neemt de plaatshouder de spaties voor zijn rekening.
Een plaatshouder kan ook nuttig zijn in alle meer complexe sjablonen die we verder behandelen.
==Sjablonen met constante zoekterm==
Een constante zoekterm in een sjabloon geeft aan dat de bron moet opgesplitst worden in 2 delen waar de constante (de eerste maal) voorkomt. Elk van de delen kan dan verder nog worden opgesplitst via andere sjabloonvormen. De zoekterm zelf maakt geen deel meer uit van het resultaat.
Indien de zoekterm niet voorkomt in de bron, dan zal het eerste deel de volledige bron bevatten, en het tweede deel leeg blijven (een nullstring zijn).
Voorbeeld:
'''parse value''' "123-4567890-12" '''with''' banknummer '-' kaartnummer '-' controlenummer
splitst het bankkaartnummer in 3 afzonderlijke delen op de plaatsen waar de zoekterm "-" voorkomt.
'''parse value''' "Jan Klaas,Binnenweg 3,Ergenstevelde,+(32)123 45 67 89",
'''with''' voornaam naam . ',' straat ',' stad ',' .
is een voorbeeld van opsplitsing van velden uit een CSV-bestand (zie {{Wp|Csv|hier}} voor meer uitleg over een CSV-bestand). Bij elke komma wordt een deel
van de bron afgesplitst en verder ontleedt. Hier wordt het eerste deel nog verder opgesplitst in 2 variabelen (''voornaam'' en ''naam'') en wordt de eventuele rest in dit veld door de plaatshouder opgevangen. Een aandachtig lezer zal opmerken dat het misloopt als het eerste veld "Jan van Gent" zou bevatten. Dit is duidelijk geen al te goede programmatie.
Alles wat na de derde komma komt wordt ook door een plaatshouder opgevangen. Die plaatshouder hoeft strikt gezien zelfs niet meer te worden geschreven.
Laten we echter volgend voorbeeld even bestuderen:
'''parse value''' "Klaas, Jan" '''with''' naam ', ' voornaam .
Onze zoekterm bevat 2 spaties na de komma. Onder deze vorm komt de zoekterm niet voor in de bron, met als gevolg dat ''naam'' de volledige bron zal bevatten en dat
''voornaam'' een nullstring wordt.
==Sjablonen met variabele zoekterm==
Zoektermen kunnen ook via een variabele worden opgegeven. In dat geval wordt de variabele '''''tussen haakjes''''' gezet om ze te onderscheiden van de rest in het sjabloon.
In volgend voorbeeld maken we het karakter dat de velden in een CSV bestand van elkaar scheidt variabel.
scheiding=","
'''parse value''' "Jan Klaas,Binnenweg 3,Ergenstevelde,+(32)123 45 67 89",
'''with''' voornaam naam (scheiding) straat (scheiding) stad (scheiding) .
==Sjablonen met posities==
Er zullen gevallen zijn waar we de opbouw van onze bron tot op de kolom kennen en waar we dan willen splitsen op bepaalde '''absolute''' of '''relatieve''' posities.
===Sjablonen met absolute posities===
Een '''absolute positie''' wordt aangegeven door een getal, zonder plus- of minteken.
Voorbeeld:
'''parse value''' "123-4567890-12" '''with''' banknummer '''4 5''' kaarnummer '''12 13''' controlenummer .
Hier zullen de karakters op posities 1 t.e.m. 3 in variabele ''banknummer'' komen. Met het karakter op positie 4 gebeurt niets.
Posities 5 tot 11 gaan naar ''kaartnummer'', positie 12 gaat verloren en de posities 13 tot aan de eerste spatie of het eind van de bron gaan in ''controlenummer''.
Kortom, we hebben dezelfde uitslag als in bij het eerste voorbeeld met constante zoekterm, maar omdat we het formaat van een (Belgisch) bankkaart nummer kennen is het mogelijk op deze manier te parsen.
Gebruik van absolute posities is typisch voor het behandelen van gegevens met vaste kolombreedtes. Bekijk dit voorbeeld:
record.1='Lateur Frank Stijn Streuvels '
record.2='Kyvon Adrianus Marinus André van Duin '
record.3='Arouet François Marie Voltaire '
do i=1 to 3
'''parse var''' record.i '''1''' eigennaam '''11''' voornaam '''31''' pseudoniem
say strip(voornaam) strip(eigennaam) 'is bij ons beter bekend als' pseudoniem
end
We splitsen dus op posities 1, 10 en 30. De opgave van positie 1 is niet nodig, maar verhoogt wel de leesbaarheid.
{{Toggletext
|kleur=#efdfef
|align=left
|tekstgrootte=
|afb=
|koptekst=Vraag: Waarom moeten we hier de voor- en eigennaam strippen alvorens hem af te drukken ? Hadden we niet met een plaatshouder kunnen werken om de overtollige spaties weg te nemen ?
|hoofdtekst=
Antwoord: Indien we een plaatshouder hadden gebruikt, dan spelen we delen van de dubbele voornamen kwijt. Het strippen is nodig want door op deze manier te parsen nemen we alle spaties ook mee.}}
<br>
Bij meer uitgebreide records schrijft men het soms als volgt:
'''parse var''' record.i ''' 1''' eigennaam, /* eerste veld */
'''11''' voornaam, /* tweede veld */
'''31''' pseudoniem /* derde veld */
waarbij de commentaren best wat zinvoller kunnen gemaakt worden. Vergeet hierbij ook de vervolg-komma's niet !
===Sjablonen met relatieve posities===
Als we weten hoe breed elke kolom is, dan kunnen we werken met '''relatieve''' posities. Die stellen we voor als
positieve of negatieve getallen. Met negatieve getallen verplaatsen we ons terug in de bron !
Indien de eerste kolom 10 karakters breed is, en de tweede 20, dan kunnen we ons vorig voorbeeld omvormen tot:
'''parse var''' record.i eigennaam +10 voornaam +20 pseudoniem
Ook absolute of relatieve posities kunnen variabel worden gemaakt, zoals in dit aangepast voorbeeld:
parse value 10 20 with breedte1 breedte2 .
...
parse var record.i eigennaam +(breedte1) voornaam +(breedte2) pseudoniem
Indien we absolute posities willen gebruiken, dan moeten we ze als volgt schrijven:
parse value 1 11 21 41 with veld1 veld2 veld3 .
...
parse var record.i =(veld1) eigennaam =(veld2) voornaam =(veld3) pseudoniem
Voor absolute posities gebruiken we dus een gelijkheidsteken, en geen + of -.
Laten we tot slot nog even naar volgend voorbeeld kijken:
parse value 'C:\Program Files\ooRexx' with drive '\' +0 subdir1 '\' +0 subdir2
We splitsen waar een \-teken voorkomt, maar door relatief '''+0''' te gebruiken trappelen we als het ware ter plaatse en zal het \-teken ook deel gaan uitmaken van de variabele die erna komt. Dus ''subdir1'' zal «\Program Files» bevatten.
=Nog meer mogelijkheden=
==De bron meermaals parsen==
Bij de [[Programmeren in REXX/Voorbeeld1#Extra opmerkingen|opmerkingen]] aan het eind van de bespreking van ons eerste REXX programma hebben we vermeld dat we:
z=z+1 /* 1 bij aan priemgetallenteller */
priem.z=i /* gevonden priemgetal toevoegen aan reeks */
priem.0=z /* element nul van stem aanpassen */
konden herleiden tot:
'''parse value''' z+1 i '''with''' z . 1 priem.0 priem.z
Wat zal er nu gebeuren ? REXX interpreteert van links naar rechts. Als we veronderstellen dat ''i'' op een bepaald moment gelijk is aan «23», namelijk ons 9de priemgetal, en ook dat ''z'' nog steeds «8» bevat, dan zal
# de interpretatie van de bron leiden tot «9 23»;
# het parsen beginnen door het eerste woord van de bron, «9» in variabele ''z'' te zetten en door de rest te elimineren middels de plaatshouder;
# teruggesprongen worden naar absolute positie 1 van de bron;
# het parsen daar hernemen en de waarde «9» aan variabele ''priem.0'' toegekend worden;
# en tenslotte wordt «23» gestockeerd in variabele ''priem.'''9''''', want ''z'' heeft ondertussen reeds de waarde «9» !
==Verschillende bronnen tegelijk parsen==
Enkel de bevelen [[Programmeren in REXX/Bevelen,_deel_1#ARG|ARG]] en [[Programmeren in REXX/Bevelen,_deel_1#PARSE|PARSE ARG]] kunnen meer dan één bron hebben.
Zij behandelen namelijk de parameters die aan een subroutine of interne functie zijn meegegeven. Deze worden van elkaar gescheiden door komma's. Dan moet voor elke parameter een apart sjabloon gemaakt worden en moeten de sjablonen ook van elkaar worden gescheiden door een komma. We komen dus tot dit veralgemeend formaat:
'''parse arg''' sjabloon1 , sjabloon2 , sjabloon3
Elk sjabloon kan daarbij zijn opgebouwd zoals we al hebben geleerd.
Laten we dit voorbeeld bestuderen:
aantal=3
musketiers="Porthos, Athos, Aramis, d'Artagnan"
hoeveel=func(aantal,musketiers)
say 'De 3 musketiers waren met' hoeveel', want naast' m1', 'm2' en 'm3' was er ook nog' vierde
exit
Func:
'''parse arg''' subtotaal ''',''' m1 ',' m2 ',' m3 ',' vierde
return subtotaal+1
Wat moeten we hiervan leren ?
# de functie krijgt 2 parameters binnen. Ze zijn gescheiden door een komma;
# de komma in het '''parse''' bevel, net na het woord ''subtotaal'', scheidt deze parameters van elkaar;
# de eerste parameter gaat dus in variabele ''subtotaal'';
# de tweede parameter - die in dit geval zelf ook komma's bevat - wordt door het tweede sjabloon (m1 ',' m2 ',' m3 ',' vierde) opgesplitst. Hier zijn de komma's constante zoektermen !
We mogen dus terecht volgend resultaat op het scherm zien verschijnen:
De 3 musketiers waren met 4, want naast Porthos, Athos en Aramis was er ook nog d'Artagnan.
{{Bericht
|bericht=Als een REXX programma vanuit het besturingssysteem (bv. op de opdrachtprompt van Windows) wordt opgeroepen kan men slechts één enkele parameter meegeven. Een eventuele komma in de parameter behoort dan in dat geval tot de bron zelf, en moet eventueel met een constante zoekterm worden gevonden.
<br>Aan een interne subroutine of functie kan men wél meer parameters meegeven zoals we hier hebben geleerd. Ook wanneer een ander REXX programma of een host-commando ons oproept, kunnen zij meer dan één parameter doorgeven.
|type=info}}
==Een lijst "opeten"==
Het kan gebeuren dat we een lange lijst data te verwerken krijgen. Indien deze lijst in één lange zin is vervat, dan bestaat een typische manier om de elementen van de lijst te behandelen er als volgt uit:
# indien de lijst later nog nodig is, maak dan een duplicaat in een hulpvariabele;
# start een lus die zal lopen tot de hulpvariabele leeg is;
# eet de hulpvariabele op door woord voor woord weg te parsen.
Het volgende voorbeeld zal dit duidelijk maken:
lijst="Jan Piet Paul Simon Matthias"
werk=lijst
do while werk \= ""
'''parse var''' werk element werk
... verwerk element ...
end
Ons '''parse''' bevel zal er bij de eerste iteratie voor zorgen dat:
* de variabele ''element'' de waarde «Jan» krijgt
* de variabele ''werk'' gereduceerd wordt tot «Piet Paul Simon Matthias»
Bij elke volgende iteratie gaat er zo een woord van ''werk'' naar de variabele ''element''. Na 5 iteraties zal ''werk'' "leeg" zijn en zal de lus dus stoppen.
==Een laatste uitgewerkt voorbeeld==
In dit programma verwachten we de naam van een map. Doch, optioneel kunnen ook andere parameters worden opgegeven die "/Vanaf startnummer" en "/Tot eindnummer" kunnen zijn.
Het gaat hier namelijk om het begin van een programma dat digitale foto's zal verwerken. Deze hebben typisch de vorm "IMG_nnnn.jpg", waarbij nnnn een volgnummer voorstelt. De verwerking kan beperkt worden tot de foto's met nummers gelegen tussen het opgegeven start- en eindnummer, anders worden alle foto's uit de map verwerkt.
Dit is ons programma:
Parse upper arg dir "" beginNr eindNr
dir=strip(dir)
do while left(dir,1)='/'
parse var dir optie dir
dir=strip(dir)
Select
when left(optie,2)='/V' then do
parse var dir beginNr dir
dir=strip(dir)
if length(beginNr)<>4 | \datatype(beginNr,'W') then
call exit 56,'/Van moet een getal van 4 cijfers zijn'
end
when left(optie,2)='/T' then do
parse var dir eindNr dir
dir=strip(dir)
if length(eindNr)<>4 | \datatype(eindNr,'W') then
call exit 57,'/Tot moet een getal van 4 cijfers zijn'
end
otherwise call exit 58,'Onbekende optie' optie
end /* select */
end
/* Hier volgt de verwerking van de gegevens...*/
EXIT:
parse arg foutcode ',' bericht
if bericht\='' then do
say bericht
exit foutcode
end
exit 0
Laten we veronderstellen dat we het programma oproepen als volgt:
rexx d:\RexxProgrammas\BewerkFotos /v 1212 /t 1233 d:\MijnFotos\Reis2011\
We willen dus foto's die in map d:\MijnFotos\Reis2011\ zitten verwerken. Maar we willen de verwerking ook beperken tot de foto's met nummers tussen 1212 en 1233.
Het eerste statement in ons programma zal de argumenten parsen. Daarbij maken we echter gebruik van nog een nieuwe techniek.
Door een nullstring in het sjabloon te steken gaan we op zoek naar de eerstvolgende "leegte". Die komen we uiteraard pas tegen op het einde van bron ! Dus, alles wat we als parameters hebben meegegeven gaat in de variabele ''dir''. Dan pas komen we de nullstring tegen, zodat de variabelen ''beginNr'' en ''eindNr'' geïnitialiseerd worden als een nullstring. Dit zal ons later toelaten met een "'''if BeginNr<>‘‘ then ...'''" na te gaan of we al dan niet een beginnummer tussen de parameters hebben gevonden.
Vervolgens gaan we alle parameters die in ''dir'' zitten opeten zoals we boven hebben geleerd. Komen we daarbij een woord tegen dat met een '/' begint, dan vermoeden we een optie te hebben gevonden. Met het '''select'''-blok gaan we vervolgens na of het een geldige optie is. De eerste letter is daarbij voldoende. Het moet gaan om /V of /T, anders geven we een foutbericht.
Bij een geldige optie hoort een getal. Dit halen we op door de variabele ''dir'' nog een woord verder op te eten.
Na het select-blok houden we dus nog enkel de echte mapnaam over in variabele ''dir''.
Bemerk ook de elegante '''exit''' subroutine. Ze behandelt de eventuele foutcodes en -berichten. We komen hier nog op terug in een [[Programmeren in REXX/Debugging#Exitroutine|volgende hoofdstuk]].
Hiermee hebben we hopelijk voldoende aangetoond welke de uitgebreide mogelijkheden van het '''parse''' bevel zijn.
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Functies deel 2
|huidige =Parse in detail
|volgende=Nog bevelen en functies}}
{{Sub}}
qyl1w5wp01k5rxyfvjwdkm73ag95se5
Kookboek/Escargot
0
28814
428095
396033
2026-05-20T05:28:03Z
Erik Baas
2193
lf
428095
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Caracoles-del-restaurante-granero.jpg|300px]]
| Naam = Escargot
| Categorie = Franse keuken
| Porties =
| Energie =
| Tijd = ± halfuur
| Stippen = 2
}}
==Basisrecept==
*Leg de escargots in een pan en giet er water bij tot ze onder staan. Voeg geen zout toe.
*Kook de escargots met het deksel op de pan gaar. De kooktijd is ongeveer 23 minuten. De escargot is goed als de schelp makkelijk loslaat. Escargots die na 45 minuten nog niet gaar zijn worden niet meer gaar (die waren te oud).
*Serveer de escargot heel met een klontje boter erop. Strooi er desgewenst nog zout over.
== Tips==
* Wie ervan houdt, doet er wel een schep suiker bij, om de escargot 'lekker zoet' te maken.
* Zie ook: [[Kookboek/Escargotrecepten|Escargotrecepten]]
{{Navigatie recepten}}
[[Categorie:Franse keuken|Escargot]]
[[Categorie:Vlees|Escargot]]
{{Sub}}
81qom7e7v0dwvcilywc69lm019z0m5w
Programmeren in REXX/Bestanden beheren
0
28828
428213
425899
2026-05-20T06:10:43Z
Erik Baas
2193
lf
428213
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit hoofdstuk [[leren]] we hoe we bestanden kunnen beheren, lezen of schrijven.
=Soorten bestanden=
Op een computerschijf staan duizenden bestanden. Deze kunnen heel verschillende gegevens (data) bevatten, gaande van een telefoonlijst over mailberichten, foto's en broncode voor programma's of uitvoerbare programma's zelf.
In dit hoofdstuk maken we een onderscheid tussen 2 grote families bestanden, namelijk de '''tekstbestanden''' en de '''binaire bestanden'''.
Met '''tekstbestanden''' bedoelen we bestanden die enkel leesbare tekst bevatten. De broncode van een REXX programma is er een typisch voorbeeld van. Maar ook onze telefoonlijst kan in die vorm opgeslagen zijn. Nog anders gezegd: het zijn bestanden die met het programma '''notepad''' (of kladblok) te lezen en te bewerken zijn.
'''Binaire bestanden''' komen véél meer voor. De inhoud is niet in leesbare vorm. Het meest typisch zijn de uitvoerbare programma's (.EXE, .COM en .DLL) die machine-instructies bevatten. Maar nogal wat programmapakketten bewaren de gegevens van de gebruiker in binaire bestanden. Een foto (.jpg) bevat misschien wel een klein deeltje leesbare EXIF informatie, maar de rest is enkel begrijpbaar voor een fotobewerkingsprogramma. Dit type bestanden kunnen we ook vanuit REXX benaderen, maar dat veronderstelt dan wel dat we de structuur ervan kennen. Dit zal slechts uitzonderlijk het geval zal zijn.
We kunnen bestanden nog op een andere manier indelen. We spreken dan van:
*'''Sequentiële''' bestanden, waarbij data in sequentiële volgorde wordt behandeld. Onze tekstbestanden zijn van dit type.
*Bestanden '''met directe toegang'''. Als alle lijnen (of logisch bij elkaar horende gegevens) dezelfde lengte hebben is het mogelijk een willekeurige lijn er rechtstreeks uit te halen. De verplaatsing in het bestand is eenvoudig het lijnnummer maal de lengte van één gegevenslijn. We kunnen de lijnen dus direct adresseren.
*'''Geïndexeerde''' bestanden waarbij de plaats van elk gegeven bijgehouden wordt in een apart bestand. Vergelijk het met een boek waarvan de index op aparte pagina's wordt bijgehouden. Dank zij de index is rechtstreekse toegang tot een hoofdstuk mogelijk.
*'''Relationele''' bestanden. Dit zijn bestanden met complexe opbouw, typisch voor relationele databasesystemen zoals {{Wp|DB2|DB2}}.
De twee laatste vormen zullen we hier niet tegenkomen. Ze vragen speciale hulpmiddelen om de gegevens te benaderen.
Verder heeft elk besturingssysteem ook nog zijn eigen manier om bestanden op gegevensdragers te organiseren. Zelfs de gebruikte karakterset kan verschillen. Op een mainframe gebruikt men de EBCDIC karakterset terwijl men op een PC gebruik maakt van een [[Basiskennis informatica/Codering/ASCII-tabel|ASCII]]-karakterset. En zelfs daarin kunnen nog varianten bestaan, specifiek voor een bepaalde regio of taal. Dit is een zeer uitgebreid en complexe materie die zeker niet tot dit boek behoort. Een begin van uitleg kan gevonden worden in het Wikipedia artikel over {{Wp|Tekenset|tekensets}}.
Mainframe systemen stockeren hun gegevens normaal lijn per lijn (men gebruikt de term record-oriented). De nu haast verdwenen ponskaart was de aanzet om gegevens op deze manier te ordenen. Elke kaart is te beschouwen als een regel in een tekst. Deze organisatie is later verder doorgedreven in de manier waarop gegevens op disk of band zijn opgeslagen. Een mainframe kent van elk record de lengte op voorhand.
PC's daarentegen, bewaren hun gegevens als een continue reeks karakters (streaming is hier de toepasselijke term). Wil men een logische opdeling in deze doorlopende reeks bytes, dan is een conventie nodig die door alle partijen is gekend. In onze tekst-bestanden bijvoorbeeld wordt elke regel van de volgende gescheiden worden door controle-karakters. Typisch zijn een combinatie van Carriage Return (=ga naar linker marge op een schrijfmachine) en Line Feed (=draai de drukrol een regel door). In de ASCII karaktertabel hebben ze de waarde '0D0A'x. Het einde van een bestand wordt meestal aangeduid met een End-Of-File karakter ('1A'x). Ook tabulatiekarakters kunnen we tegenkomen ('09'x). Een programma als notepad kan met deze karakters overweg.
REXX heeft bevelen en functies die tekstbestanden lijn voor lijn kunnen behandelen. De controle-karakters worden dus ook herkend. Maar REXX heeft evenzeer bevelen en functies die streaming toelaten, waardoor binaire bestanden kunnen worden gelezen of geschreven.
Om te beginnen bekijken we een nuttige functie die bestandsnamen kan opsplitsen.
=FILESPEC - bestandsnamen opsplitsen=
'''FILESPEC'''(optie,bestandsnaam)
De ''bestandsnaam'' wordt hier in de brede zin van de betekenis gebruikt, t.t.z. het is het volledig pad en de volledige naam van het bestand, inclusief extensie.
Met deze functie kunnen volgende ''opties'' worden gegeven om elementen uit de bestandsnaam te halen (we veronderstellen de bestandsnaam "d:\RexxProgrammas\Testen\priem.rex"):
*'''Drive''' geeft de stationsletter (bv. D:)
*'''Path''' geef het pad naar het bestand (bv. \RexxProgrammas\Testen\)
*'''Name''' geeft de naam van het bestand, inclusief extensie (bv. Priem.rex)
Zoals steeds is enkel de eerste letter van de optie nodig.
<!------------------------------------------------------------------------->
=STREAM functie=
De '''stream''' functie kan voor een stream
*de huidige status ervan weergeven, of
*een beschrijving van zijn toestand geven, of
*opdrachten zoals openen en sluiten uitvoeren.
In de voorbeelden van dit hoofdstuk zullen we steeds werken met bestanden op schijf (of CD of stick). Maar een ''stream'' kan ook nog andere soorten sequentiële data omvatten. Wat door de gebruiker wordt ingetikt op het klavier is bijvoorbeeld evenzeer een stream. Een antenne die het heelal afspeurt naar levende wezens zal ook een continue reeks bits en bytes - dus een stream - binnenkrijgen.
We bespreken nu de verschillende mogelijkheden van de '''stream''' functie.
==Status opvragen==
'''stream'''(stream[,"'''S'''tate"])
De standaard optie ''state'' laat weten in welke staat de ''stream'' op dit ogenblik is. Volgende kunnen voorkomen:
*'''ERROR''' - er is een fout opgetreden bij een vorige operatie;
*'''NOTREADY''' - de stream, of beter gezegd het toestel waar de stream zich bevindt, is niet gereed, de toegang is niet mogelijk;
*'''READY''' - de stream is klaar om bewerkt te worden;
*'''UNKNOWN''' - betekent meestal dat de stream (nog) niet is geopend, er is bv. geen CD in de lade.
==Een beschrijving geven==
'''stream'''(stream,"'''D'''escription")
Deze optie is vergelijkbaar met "Status", maar in het geval van ERROR of NOTREADY wordt extra informatie gegeven, indien deze voorhanden is.
==Opdrachten uitvoeren==
'''stream'''(stream,"'''C'''ommand",streaming_opdracht)
De mogelijke ''streaming_opdrachten'' zijn:
*'''OPEN''' om de stream te openen;
*'''CLOSE''' om de stream af te sluiten;
*'''QUERY''' om eigenschappen van de stream te ondervragen;
*'''FLUSH''' om de lees- of schrijfbuffer onmiddellijk leeg te maken;
*'''SEEK''' of '''POSITION''' om zich te verplaatsen in de stream;
Laten we deze opdrachten nu in meer detail bestuderen.
===OPEN opdracht===
'''stream'''(stream,"Command","OPEN" [intentie | "<u>Both</u>"] [optie | "<u>Append</u>"])
Om toegang te kunnen hebben tot de gegevens die in een stream zitten moet deze eerst ''geopend'' worden. Dit houdt in dat het besturingssysteem o.a.
#nagaat of het toestel (disk, CD, schotelantenne) waarop de stream zich bevindt bereikbaar is en klaar is om te werken (READY of NOTREADY);
#nagaat of de stream bestaat. Meer specifiek het geval voor bestanden op disk;
#geheugenbuffers aanmaakt om data te ontvangen bij lezen of om data te versturen bij schrijven. Deze buffers dienen o.a. om de snelheid te vergroten. Pas als een buffer is gevuld zal de inhoud fysisch naar het medium worden weggeschreven. Het lezen of schrijven gebeurt dus niet voor elke byte apart.
Wanneer we een stream openen kunnen we bepalen met welke ''intentie'' we hem openen. De mogelijke intenties zijn:
*'''READ''', we willen de stream enkel lezen;
*'''WRITE''', we willen naar de stream schrijven;
*'''BOTH''', we willen zowel kunnen lezen als schrijven. Dit is de standaard intentie.
Voor een schrijfintentie kunnen we nog een extra optie meegeven, nl:
*'''REPLACE''', we willen het bestand vervangen door nieuwe inhoud;
*'''APPEND''', we willen data toevoegen aan het eind van het bestand. Dit is de standaardoptie.
Een eerste voorbeeld laat zien hoe we een bestand (onze adressenlijst) klaarmaken om er lijnen aan te kunnen toevoegen:
bestand="D:\Map\Mijn adreslijst.txt"
if stream(bestand,"STATE")="READY" then call stream bestand,"COMMAND","OPEN WRITE APPEND"
Met intentie '''both''' kan een bestand dus zowel gelezen als beschreven worden. In dat geval moet de programmeur zelf zorgen om zijn lees- en schrijfpositie bij te houden. Daarvoor zijn de "SEEK" of "POSITION" opdrachten te gebruiken. In dit boek behandelen we deze opdrachten niet.
===CLOSE opdracht===
'''stream'''(stream,"Command","CLOSE")
De stream wordt nu afgesloten.
#de data die nog aanwezig is in de buffers worden weggeschreven;
#de informatie over het bestand wordt in de FAT tabel aangepast. Het gaat om de plaats op schijf, creatiedatum en/of laatste toegangsdatum, attributen, etc.
Er zijn geen extra opties bij het sluiten van een bestand.
bestand="D:\Map\Mijn adreslijst.txt"
call stream bestand,"C","CLOSE"
Merk op dat we aan de eerste letter van "Command, State" of "Description" genoeg hebben. Merk ook op dat we die opties constant maken, want stel dat er een variabele ''c'' of ''close'' zou bestaan, dan kan alles in het honderd lopen.
Daar de stream functie geen returncode teruggeeft, zullen we ze dikwijls via een '''call''' bevel oproepen.
===QUERY opdracht om eigenschappen op te vragen===
'''stream'''(bestand,"Command","QUERY" optie)
Uit volgende ''opties'' kunnen we kiezen:
*'''EXISTS'''. Als het bestand bestaat krijgen we het volledig pad terug. In het ander geval krijgen we een nullstring terug.
*'''TIMESTAMP'''. Geeft datum en tijd van het bestand in internationaal formaat (jjjj-mm-dd hh:mm:ss).
*'''SIZE'''. Geeft de grootte van het bestand in bytes.
Er zijn nog andere opties, zoals het opvragen van de lees- of schrijfpositie, maar die behandelen we hier ook niet.
In de OORexx implementatie biedt het RexxUtil functiepakket eenvoudiger manieren om informatie over een bestand op te vragen. We leren daarover meer in het hoofdstuk over [[Programmeren in REXX/RexxUtil|RexxUtil functies]].
say stream("..\Mijn addreslijst.txt","C","QUERY EXISTS")
In dit voorbeeld geven we niet het volledig pad naar het bestand. De twee puntjes verwijzen naar de map boven de nu actieve map. Als we voortgaan op de naam die we in voorgaande voorbeelden gebruikten, mogen we dus «D:\map\mijn adreslijst.txt» als antwoord verwachten.
<!--------------------------------------------------------------------->
=Bestanden lezen=
Nadat we het bestand hebben geopend kunnen we het gaan lezen. Hiervoor gebruiken we de functies '''charin''' of '''linein'''. In het eerste geval lezen we de stream zonder rekening te houden met controle-karakters zoals CrLf. '''Linein''' houdt wél rekening met de controlekarakters, we zullen dus lijn per lijn kunnen lezen.
==CHARIN methode om een bestand te lezen==
'''charin'''([bestand][,start | <u>1</u>][,aantal | <u>1</u>])
Deze functie geeft de inhoud van het bestand, te beginnen aan de byte op positie ''start'' en voor een opgegeven ''aantal'' bytes. Zonder opgave van aantal wordt slechts één byte gelezen.
Voor streams wordt een leespositie bijgehouden. Net na het openen is dit aan de eerste byte. Als men daarna een aantal bytes leest, verplaatst de leespositie zich over dat aantal. Bij een volgende leesopdracht zal men vanaf die positie verder lezen, tenzij we weer een expliciete ''start''-positie meegeven.
Wat we hier vertellen geldt eigenlijk alleen voor wat men '''persistente''' streams noemt. Een bestand op schijf is daar zeker een voorbeeld van. Een schotelantenne daarentegen, produceert een continue stroom data, en men spreekt dan van een '''transient''' stream. Voor deze laatste heeft een start-positie uiteraard geen enkele zin en mag ze zelfs niet worden opgegeven.
Nog een laatste opmerking, om volledig te zijn: als men geen bestandsnaam geeft, dan wordt gelezen van de '''standaard''' stream (STDIN). Meestal is dit het toetsenbord wat trouwens ook een voorbeeld van een transient stream is. Het lezen stopt wanneer de Enter-toets wordt ingedrukt.
In volgende voorbeelden veronderstellen we dat het bestand begint met de karakters "Mike Cowlishaw" en dat alle statements na elkaar uitgevoerd worden:
data=charin(MijnBestand,1,4) /* leest de eerste 4 karakters, dus "Mike" */
call charin MijnBestand,1,0 /* leest niets, maar zet leespositie aan begin */
data=charin(MijnBestand) /* leest het eerste karakter, dus "M" */
data=charin(MijnBestand,,3) /* dan de drie volgende karakters, dus "ike" */
Willen we alle karakters van ons (persistent) bestand lezen, dan moeten we dus weten hoe groot het bestand is. Dit zou men kunnen opvragen met een '''stream(bestand,"C","QUERY SIZE")''', doch de '''chars''' functie is heel wat eenvoudiger:
==CHARS functie - aantal karakters in een bestand==
'''chars'''([bestand])
Voor een persistente stream geeft deze functie het aantal karakters dat aanwezig is, vanaf de huidige leespositie tot het eind van de stream. Om een bestand in één operatie volledig te lezen kunnen we dus het volgende schrijven:
data=charin(MijnBestand,1,chars(MijnBestand))
Voor transient streams geeft de functie hoeveel karakters er in de STDIN-buffer te wachten staan.
==LINEIN methode om een bestand te lezen==
'''linein'''([bestand][,lijn | <u>1</u>][,aantal | <u>1</u>])
Deze functie neemt de controlekarakters tussen de tekstregels wél voor zijn rekening. Dus, elke Carriage-Return/Line-Feed (CrLf) bepaalt het einde van een regel. De functie zal niet verder lezen dan het eerste EOF (End-Of-File = '1A'x) karakter dat ze tegenkomt.
We kunnen vragen om één of geen lijn te lezen, en dit vanaf een bepaalde ''lijn''. Ook hier wordt een leespositie bijgehouden. Een volgende lezing begint bij die positie. Als vooraf met charin een deel is gelezen, kan het zelfs zijn dat de huidige leespositie midden in een regel staat. Als het ''aantal'' gelijk is aan nul, dan wordt uiteraard niets gelezen en blijft de leespositie ongewijzigd.
Als geen bestandsnaam is opgegeven, dan wordt ook hier van de '''standaard''' stream gelezen, dus meestal het toetsenbord. Ook nu wacht het programma tot de Enter-toets gebruikt wordt, want dat genereert een Carriage Return ('0D'x) en bepaalt dus het einde van een regel.
{{Bericht
|bericht=In de PC-wereld is het toetsenbord een transient stream. Alle karakters die worden ingetikt gaan onmiddellijk naar een geheugenbuffer in het systeem. Op een mainframe blijft alles in de buffer van de terminal (=scherm/toetsenbord combinatie) tot een zogenaamde interrupt-toets is ingedrukt (de Enter-toets of functietoetsen). Daar is het gebruik van "linein" ook veel logischer, want we herkennen weer de notie record.
|type=info}}
Voorbeelden:
tekstlijn=linein(MijnBestand) /* leest de eerste lijn van het bestand */
tekstlijn=linein(MijnBestand,10) /* leest de tiende lijn van het bestand */
Zelfs al worden deze statements na elkaar uitgevoerd, dan nog zal de tweede leesopdracht de 10de lijn lezen, en niet de 11de !
==LINES functie - zijn er nog data ?==
Er is ook een '''lines''' functie. Deze werkt niet zoals de '''chars''' functie. Ze antwoord enkel 1 als er nog data in de stream zit, anders 0. Deze functie kan desgevallend wel gebruikt worden om een lus te draaien tot de data op is, dus totdat men het einde van het bestand heeft bereikt.
<!------------------------------------------------------------------------------------->
=Bestanden schrijven=
Om data in een bestand te kunnen schrijven moet dit eerst geopend worden met de intentie '''write''' of '''both'''. Willen we achteraan toevoegen dan is de optie '''append''' nodig. Met '''replace''' zullen we (een deel van) het bestand overschrijven. Ook hier hebben we de 2 verschillende methodes, één om te streamen en één om lijn per lijn te schrijven.
==CHAROUT methode om een bestand te schrijven==
'''charout'''([bestand][,data][,start])
Zonder opgave van een bestandsnaam zal geschreven worden naar de '''standaard''' output-stream (STDOUT), meestal is dit het scherm.
Bij schrijfoperaties wordt eveneens een positie bijgehouden. Een volgende schrijfoperatie start dan bij die positie, tenzij expliciet een ''start'' wordt opgegeven. Deze start-positie kan enkel voor persistente streams en moet een positief getal zijn. Bij het openen van de stream is de schrijfpositie op het einde van het bestand.
Het is ook mogelijk een start-positie te geven zonder data mee te geven. Daarmee wordt dus enkel de schrijfpositie aangepast. En als noch start, noch data worden meegegeven, dan wordt het bestand gesloten en is de returncode van de functie 0.
In normale gevallen geeft deze functie een returncode die gelijk is aan het aantal karakters dat nog <u>niet</u> is weggeschreven. Normaal zal dit 0 zijn voor een bestand op disk, maar voor een printer moet misschien eerst nog papier worden bijgestoken.
Als voorbeeld een aantal statements, die na elkaar worden uitgevoerd:
call stream "MijnBestand","C","OPEN WRITE REPLACE"
call charout "MijnBestand","Hallo" /* Schrijft de eerste 5 karakters */
call charout "MijnBestand",,16 /* staat nu op positie 16 */
call charout "Mijnbestand","Tot ziens" /* schrijft bij vanaf pos 16 */
Merk op dat er toch wel karakters zullen geschreven worden tussen positie 6 en 16. Het zullen dan '00'x karakters zijn (hexadecimaal nul).
==LINEOUT methode om een bestand te schrijven==
'''lineout'''([bestand][,data][,lijn])
Deze functie geeft 0 als alles goed verliep, 1 als een fout optrad.
Telkens een lijn wordt geschreven worden ook de controlekarakters geschreven ('0D0A'x). Als ''data'' een nullstring is (""), dan maken we zo een lege lijn in de tekst, want de controlekarakters worden wel geschreven.
Zonder opgave van ''data'' wordt de schrijfpositie op regel ''lijn'' gezet. Zonder opgave van een bestandsnaam wordt naar STDOUT geschreven (meestal het scherm dus). Zonder ''data'' noch ''lijn'' wordt het bestand gesloten.
Voor persistente streams kan men een lijnnummer opgeven. Dit moet een positief getal zijn, en binnen de grenzen van het bestand liggen. In dit geval kan men dus geen lijnen "overslaan".
Dit zijn voorbeelden:
call lineout "MijnBestand","Dit is een zin" /* schrijft de zin */
call lineout "MijnBestand",,1 /* terug aan begin */
call lineout "MijnBestand","" /* een CrLf */
call lineout "MijnBestand","Tot ziens" /* schrijft de zin */
Als al deze statements na elkaar worden uitgevoerd zal er van de initiële tekst in het bestand niets overblijven, zelfs al hebben we geopend met de intentie "write append". Inderdaad, in het tweede statement positioneren we ons terug aan het begin van het bestand. Wat door het eerste statement is geschreven gaat daarbij ook weer verloren. Het uiteindelijke bestand zal slechts 2 regels bevatten, een eerste die leeg is, en een tweede die de tekst «Tot ziens» bevat.
<!--------------------------------------------------------------------->
=Bestanden uitvagen, hernoemen of kopiëren=
We leerden in het hoofdstuk over [[Programmeren in REXX/Host_Commando's|host commando's]] hoe we aan ons besturingssysteem kunnen vragen om bestanden te hernoemen, kopiëren of uit te vagen. Ook hier biedt het RexxUtil pakket dat bij de OORexx versie geleverd wordt betere alternatieven. Heel dikwijls hebben andere REXX implementaties soortgelijke pakketten. We zullen daar later nog op terugkomen. Hier enkel een voorbeeldje:
call SysFileDelete("d:\map\Mijn adreslijst.txt")
<!--------------------------------------------------------------------->
=Performantie aspecten=
We leerden al dat tekstbestanden zowel met de '''linein''' als met de '''charin''' functie kunnen gelezen worden. Maar in het tweede geval hebben we wel meer werk om de logische opsplitsing in regels te maken.
Toch is, op een PC, de '''charin''' methode te verkiezen indien snelheid belangrijk wordt. Voor een programma dat slechts een paar maal wordt uitgevoerd is het extra werk misschien zinloos, maar als het programma zeer frequent wordt uitgevoerd loont elke verbetering in snelheid. Ook wanneer het programma grote bestanden moet verwerken is snelheidswinst snel merkbaar.
Hoe pakken we dat dan aan ? Wel, we volgend deze logica:
#we lezen het volledig bestand met één charin. Enkel indien het computergeheugen het hele bestand niet zou kunnen bevatten moeten we het lezen opsplitsen in kleinere blokken;
#we starten een lus waarin we de lijnen er één voor één van afknippen middels het '''parse''' bevel. We knippen telkens wanneer de CrLf controlekarakters optreden.
#we behandelen de lijn en hernemen de lus.
We maken de proef met een tamelijk groot bestand. Het is meer dan 135000 bytes groot en bevat 3413 tekstlijnen. Ons voorbeeld-bestand wordt samen met OORexx geïnstalleerd. U kan deze test dus ook uitvoeren met hetzelfde bestand.
Als eerste test lezen we het bestand met de '''linein''' functie:
/* Lezen van een tekstbestand met linein */
call time 'R' /* reset van onze chronometer */
bestand="C:\Program Files\OORexx\Samples\OODialog\"||,
"OODialog.cls" /* het bestand */
call stream bestand,'C','OPEN READ' /* ...openen */
do i=1 by 1 while lines(bestand)<>0
lijn=linein(bestand)
/* Hier zouden we iets met lijn doen */
end
call stream bestand,'C','CLOSE' /* ... sluiten */
say 'Het lezen van' i-1 'lijnen duurde' time('E')'sec'
exit
Met de '''time''' functie kunnen we meten hoeveel tijd nodig is voor de verschillende operaties. Met een '''R'''eset zetten we de timer op nul. Bij elke latere '''E'''lapsed optie krijgen we het aantal seconden dat is verlopen sinds de vorige reset.
<br>Noteer ook hoe we de bestandsnaam over 2 regels hebben gedefinieerd. Zonder het concatenatieteken had REXX een spatie geplaatst tussen de 2 delen.
Dit krijgen we als antwoord als we het programma op ons systeem (Intel Q6600 2.4Ghz) draaien:
Het lezen van 3413 lijnen nam 0.226000sec in
N.B. Indien het programma meermaals na elkaar wordt uitgevoerd kunnen de resultaten licht verschillen. Dit heeft alles te maken met het feit dat het bestand nog deels in de buffers van het systeem kan zitten.
Nu stappen we over op de '''charin''' methode:
/* Lezen van een tekstbestand met charin */
call time 'R' /* reset van onze chronometer */
bestand="C:\Program Files\OORexx\Samples\OODialog\"||,
"OODialog.cls" /* het bestand */
call stream bestand,'C','OPEN READ' /* ...openen */
data=charin(bestand,1,chars(bestand))/* ...lezen */
call stream bestand,'C','CLOSE' /* ... sluiten */
teller=0
data=strip(data,'T','1A'x) /* EOF wegnemen*/
do i=1 by 1 while data<>’’ /* while lus */
parse var data with lijn '0D0A'x data /* opeten */
/* --------- Hier verwerken we de lijn --------- */
end
say 'Het lezen van' i-1 'lijnen duurde' time('E')'sec'
exit
Dit is het resultaat dat we bekomen op ons systeem:
3413 lijnen lezen nam 0.094000 seconden in beslag.
De uitvoeringstijd is met bijna 60% gedaald !
En toch is er nog verbetering mogelijk.
/* Lezen van een tekst met charin, 2de versie */
call time 'R' /* reset van onze chronometer */
bestand="C:\Program Files\OORexx\Samples\OODialog\"||,
"OODialog.cls" /* het bestand */
call stream bestand,'C','OPEN READ' /* ...openen */
data=charin(bestand,1,chars(bestand))/* ...lezen */
call stream bestand,'C','CLOSE' /* ... sluiten */
data=strip(data,'T','1A'x) /* EOF wegnemen*/
startp=1 /* startpositie */
do i=1 by 1 /* continu lus... */
p=pos('0D0A'x,data,startp) /* waar is CrLf ? */
if p>0 then lijn=substr(data,startp,p-startp)
else lijn=substr(data,startp)
/* ----------- Verwerk de lijn ---------------- */
if p=0 then leave /* stap uit lus ! */
startp=p+2 /* Spring over de CrLf */
end
say 'Het lezen van' i-1 'lijnen duurde' time('E')'sec'
exit
Met als resultaat:
3413 lijnen lezen nam 0.006000 seconden in beslag.
Nog eens een besparing van 94% ! Vanwaar komt die ?
Wel, in de eerste versie met "charin" gebruikten we '''parse''' om de ''data op te eten''. Het probleem is dat we een stukje van een grote string wegnemen en het overblijvend deel terug in dezelfde variabele ''data'' steken.
REXX heeft daar veel werk mee, want intern moet een nieuwe tijdelijke variabele gemaakt worden om het tweede deel van ''data'' in te steken. Dan wordt het geheugen van de oude variabele ''data'' opgekuist. Tenslotte wordt de nieuwe variabele naar ''data'' hernoemd. Het aanvragen en loslaten van geheugen is een tijdrovende operatie. In de laatste versie hebben we dat kunnen vermijden, met de spectaculaire winst tot gevolg.
Nog even de details van het programma bekijken:
#We gebruiken geen ''teller'' meer, maar onze lus gebruikt een lusvariabele ''i'' die we als teller kunnen gebruiken. We geven geen eindbestemming aan onze lusvariabele, zodat het een eindeloze lus wordt (een "do forever" dus, maar mét teller). We moeten er dan natuurlijk voor zorgen de lus op een bepaald moment te verlaten. Dat doen we met het '''leave''' bevel als we geen CrLf meer vinden.
#We gebruiken de functie '''pos''' om naar de CrLf controlekarakters te zoeken, maar we beginnen aan een startpositie (''startp'')die we in de lus telkens weer net ná de laatst gevonden CrLf zetten.
#Na de lus bevat de lusteller één te veel. Rexx verhoogt de teller namelijk op het eind van de lus. Daarom moeten we terug één aftrekken in het say bevel.
De geoptimaliseerde '''charin''' methode duurt dus 40 maal minder lang dan wanneer we de '''linein''' methode gebruikten.
We willen nogmaals benadrukken dat wat we in deze laatste paragraaf hebben beschreven enkel geldig is voor PC systemen. Op een mainframe is het net andersom, want streaming is onnatuurlijk voor een mainframe, records behandelen is een fluitje van een cent. Daar blijkt een oplossing met '''parse''' het dikwijls ook te winnen van andere oplossingen. Vermoedelijk heeft dit te maken met een andere manier waarop het geheugen beheerd wordt.
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =RexxUtil
|huidige =Bestanden beheren
|volgende=Een beetje OORexx}}
{{Sub}}
ls4bqo5yrsh9dgzr2mqye7y2eeniedq
Programmeren in REXX/Host Commando's
0
28832
428216
425900
2026-05-20T06:10:46Z
Erik Baas
2193
lf
428216
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit hoofdstuk leggen we uit hoe we host-commando's kunnen uitvoeren en waarop we daarbij moeten letten.
=Oproepen van een host-commando=
Met de term '''host''' bedoelen we het programma dat ons REXX programma heeft opgeroepen. We moeten dus aannemen dat die host
een omgeving heeft waar we commando's kunnen laten uitvoeren.
Het besturingssysteem voorziet in zo'n omgeving. In Windows systemen is dat de CMD-shell (de opdrachtprompt), op Linux systemen de "bash"-shell.
<div id="ADRESS">Maar andere programma's kunnen commando's aanvaarden vanuit een REXX programma. Zo zou een REXX programma kunnen "praten" met een editor, en daarbij documentinhoud opvragen of veranderen. Met het REXX '''address''' bevel kunnen we aangeven aan ''wie'' REXX de host commando's moet doorgeven; met de '''address()''' functie kunnen we opvragen naar ''wie'' de commando's op dit moment worden. In Windows is de standaard adressering een '''address "CMD"'''.</div>
In de rest van dit hoofdstuk zullen we voorbeelden gebruiken van een Windows systeem.
==DOS commando's==
We spreken wel van Windows commando's, maar eigenlijk bekijken we hier de oeroude MS-DOS commando's. Normaal voeren we die uit door een CMD opdrachtprompt te openen, of door ze in een BAT procedure te steken.
Maar het kan dus evengoed met REXX, met dan alle toeters en bellen die daarmee gepaard gaan.
Een commando roepen we op als een op zichzelf staand statement. Als REXX, na interpretatie, tot het besluit is gekomen dat het niet een werkje voor hem is (een assignatie of een REXX bevel) dan geeft hij het resultaat van de interpretatie door aan wie hem heeft opgeroepen. Hopelijk begrijpt de oproeper het commando en kan die er iets zinnigs mee doen. Als er problemen optreden, of het is een onbekend commando, dan hopen we een returncode terug te krijgen. Deze returncode zet REXX dan in de gereserveerde variabele '''RC'''. Windows is spijtig genoeg nogal spaarzaam wat returncodes betreft. Daarom bestaan er functies die voor een wat betere samenwerking zorgen. We zullen die bestuderen in het hoofdstuk [[Programmeren in REXX/RexxUtil|RexxUtil functies]].
In dit eerste voorbeeld roepen we het "COPY" commando op:
/* We voeren een host-commando uit */
MijnBestand='D:\Tekst.txt'
'COPY' Mijnbestand 'E:\Map\'
if rc<>0 then say 'Er waren problemen met het COPY commando.'
exit
In het geval de bestandsnaam of pad een spatie bevat moet die voor Windows tussen aanhalingstekens worden geplaatst. Dan moet ons voorbeeld als volgt worden aangepast:
/* We voeren een host-commando uit */
MijnBestand='"D:\Mijn Werkmap\Tekst.txt"'
'COPY' Mijnbestand 'E:\Map\'
if rc<>0 then say 'Er waren problemen met het COPY commando.'
exit
Voor REXX is de string die aan de variabele ''MijnBestand'' moet worden toegekend alles wat tussen de enkelvoudige aanhalingstekens staat, dus inclusief de dubbele aanhalingstekens. Dan zal het COPY commando geen problemen opleveren.
Alvorens we nu verder kunnen gaan moeten we een uiterst belangrijk punt aansnijden...
==Van levensbelang==
Wanneer we een host-commando willen uitvoeren, dan houden we best volgende regel aan:
{{Bericht
|bericht='''Schrijf alles wat niet variabel is, als een constante !'''
|type=waarschuwing}}
Wat kan er namelijk gebeuren als we dit niet doen ? Laten we kijken naar dit stukje programma:
/* Dit gaat ons in de problemen brengen */
copy d:\Mijnbestand e:\
Hier maken we het wel erg bont door niets tussen aanhalingstekens te schrijven. Niet te verwonderen dat we het volgende op het scherm zien verschijnen:
2 *-* copy d:\MijnFile e:\
Error 35 running d:\test.rex line 2: Invalid expression
Error 35.1: Incorrect expression detected at ":"
REXX kan helemaal niets doen met de ":", want dit is geen geldig teken voor een token, en als label kan het ook al niet dienen, want het is niet het eerste woord van een zin.
OK, laten we dat proberen te verbeteren:
/* Dit is ook niet helemaal koosjer */
copy "d:\Mijnbestand" "e:\"
We krijgen nu wel
1 bestand(en) gekopieerd.
doch er blijft een groot gevaar dreigen. Het woord "copy" is voor REXX geldig als naam voor een variabele. Het programma zal werken zolang we geen waarde aan deze variabele toekennen... maar...
/* Oei, systeem kapot */
copy="ERASE"
copy "C:\IO.SYS"
Oef, het bestand is als systeembestand en enkel-lezen gedefinieerd, er is dus gelukkig niets gebeurd, maar het kon catastrofaal zijn, niet ? In bovenstaand voorbeeld ziet men natuurlijk onmiddellijk de fout. Maar een REXX programma kan honderden statements bevatten (en dat is echt niet overdreven) waarbij het statement '''copy="ERASE"''' ergens ver van het statement '''copy "C:\IO.SYS"''' kan verwijderd zijn.
Dus, nogmaals, en we kunnen het niet genoeg herhalen:
{{Bericht
|bericht='''Schrijf alles wat niet variabel is, als constante !'''
|type=waarschuwing}}
==Een andere REXX oproepen==
Laten we veronderstellen dat we volgend eenvoudig REXXje willen oproepen:
/* RexxSubProgramma, wordt opgeroepen door een andere REXX */
parse source . oproeptype .
say 'RexxSubProgramma: We werden opgeroepen als' oproeptype
say 'RexxSubProgramma: We kregen' arg() 'parameter(s) door, nl.'
do i=1 to arg()
say 'RexxSubProgramma: "'arg(i)'"'
end
exit arg()
We kunnen dat REXXje op verschillende manieren oproepen:
*Door het op te roepen als een ''DOS-commando'';
*Door het op te roepen als een ''externe'' routine mits gebruik van een REXX '''call''' instructie
*Door het op te roepen als een ''externe'' functie.
Merk op dat een externe functie of routine steeds minder performant zal zijn dan wanneer we ze intern hadden geschreven. Om performant te werken moeten we dus dezelfde routine of functie steeds weer gaan kopiëren in elk programma dat er gebruik van wil maken.
In het hoofdstuk "[[Programmeren in REXX/Een_beetje_OORexx|Toch een beetje OORexx]]" zullen we echter leren dat OORexx mogelijkheden biedt om de externe functies toch even performant te laten werken als interne. We kunnen op die manier onze eigen functiepakketten samenstellen. Maar dit is dus niet in alle implementaties van REXX voorzien.
===Oproepen als een DOS commando===
/* TestRexx, roept een andere REXX op */
'REXX D:\RexxSubProgramma.rex p1 p2 , p3'
if rc<>0 then say 'TestRexx RexxSubProgramma gaf foutcode='rc
exit
Met dit resultaat aan het scherm:
RexxSubProgramma: We werden opgeroepen als COMMAND
RexxSubProgramma: We kregen 1 parameter(s) door, nl.
RexxSubProgramma: "p1 p2 , p3"
TestRexx: RexxSubProgramma gaf foutcode=1
Ons tweede RexxSubProgramma wordt opgeroepen alsof het rechtstreeks vanaf de CMD-opdrachtprompt zou worden opgeroepen. Dus, '''parse source''' geeft dan ook "COMMAND" als tweede antwoord.
Het subprogramma kreeg ook maar één parameter door. Zelfs al plaatsen we een komma tussen de parameters, toch wordt alles als één parameter beschouwd.
De komma staat immers in een constante, waarin REXX helemaal niet kijkt.
Het RexxSubProgramma draait in een proces, onderliggend aan het hoofdprogramma (child process). Het hoofdprogramma zal dus niet verder kunnen werken zolang het subprogramma niet is gestopt. Om dit te vermijden kan men gebruik maken van het Windows '''start''' commando om een ander proces te starten. We schrijven dan '''"START REXX D:\RexxSubProgramma.rex p1 p2 , p3"'''. Willen beide programma's dan nog met elkaar kunnen praten, dan moeten speciale technieken van multi-programmatie worden gebruikt, en dat onderwerp laten we in dit boek links liggen.
===Oproepen met een CALL instructie===
/* TestRexx, roept een andere REXX op */
call 'D:\RexxSubProgramma.rex p1 p2 , p3'
if rc<>'RC' then say 'TestRexx: RexxSubProgramma gaf returncode='rc
else say 'TestRexx: RexxSubProgramma gaf als resultaat:' result
exit
{{Bericht
|bericht=Verwar dit REXX '''call''' bevel niet met het Windows '''call''' commando !
|type=waarschuwing}}
Nu zien we het volgende op het scherm verschijnen:
2 *-* call 'D:\RexxSubProgramma.rex p1 p2 , p3'
Error 43 running d:\testrexx.rex line 2: Routine not found
Error 43.1: Could not find routine "D:\RexxSubProgramma.rex p1 p2 , p3"
Oei, wat hebben we nu verkeerd gedaan ? Wel, wanneer REXX een '''call''' bevel krijgt gaat hij op zoek naar wat als eerste parameter is meegegeven.
Die eerste parameter is '''D:\RexxSubProgramma.rex p1 p2 , p3'''. REXX kent geen interne of externe functie noch routine met die naam. Ook een extern REXX programma met die naam kan hij nergens vinden. We moeten ons call bevel dus als volgt verbeteren:
call 'D:\RexxSubProgramma.rex' 'p1 p2 , p3'
en nu zien we:
RexxSubProgramma: We werden opgeroepen als SUBROUTINE
RexxSubProgramma: We kregen 1 parameter(s) door, nl.
RexxSubProgramma: p1 p2 , p3
TestRexx: RexxSubProgramma gaf als resultaat: 1
Ditmaal worden we dus opgeroepen als "SUBROUTINE" en niet als "COMMAND".
<div id="DROP">
{{Bericht
|bericht=Merk op dat we testen of '''rc<>"RC"''' na het oproepen van onze subroutine. Als deze statements een eind ver in een programma voorkomen kan het echter gebeuren dat de variabele ''rc'' al is opgevuld met een returncode van een andere instructie. Onze test is dus niet waterdicht, tenzij we vóór het oproepen van onze subroutine een '''drop rc''' zouden schrijven. Met een '''DROP''' bevel worden de opgesomde variabelen verwijderd uit de gekende variabelen. Ook een stem kan men met '''drop''' volledig "weggooien" (drop stem.).
|type=nb}}
</div>
In tegenstelling tot een commando, dat enkel een getal als returncode kan teruggeven (variabele '''RC'''), komt het resultaat van een subroutine in de gereserveerde variabele '''RESULT''' terecht. Dat resultaat kan echt alles zijn, een cijfer, een string, of zelfs helemaal niets.
Daarom passen we ons programmaatjes aan in functie van wat er moet teruggegeven worden:
/* RexxSubProgramma, wordt opgeroepen door een andere REXX */
parse source . oproeptype .
say 'RexxSubProgramma: We werden opgeroepen als:' oproeptype
say 'RexxSubProgramma: We kregen' arg() 'parameter(s) door, nl.'
do i=1 to arg()
say 'RexxSubProgramma: "'arg(i)'"'
end
if oproeptype='FUNCTION' then return '==>'arg(1)'<=='
else return arg()
We hebben ons programmaatje bimodaal gemaakt, het kan opgeroepen worden als commando of als externe subroutine/functie. Noteer daarbij het volgende:
*'''Return arg()''' heeft hier hetzelfde effect als een '''exit arg()'''. Met een return bevel moet REXX naar een hoger niveau terugkeren. Zit je in een REXX subroutine, ga je dus terug naar een oproepende subroutine of uiteindelijk naar het hoofdprogramma. Zit je al in het hoofdprogramma (zoals hier het geval is), dan verlaat je met een return bevel het hoofdprogramma, en komt het dus neer op een exit bevel.
*Langs de kant van het oproepend programma komt het resultaat van de externe subroutine terecht in variabele '''result''', terwijl variabele '''RC''' niet wordt beïnvloed. Roept men een ander REXX programma op als een host commando, dan zit het resultaat wél in variabele '''RC''', en kan het alleen een geheel getal zijn. Variabele '''result''' wordt dan niet beïnvloed.
In dit geval draait het RexxSubProgramma in hetzelfde proces als het hoofdprogramma. Ook hier zal het hoofdprogramma niet verder kunnen zolang het subprogramma niet is beëindigd.
===Als functie===
Nu maken we er een functie van door de oproep te vervangen in:
say 'D:\RexxSubProgramma.rex'('p1 p2 , p3')
met als resultaat:
RexxSubProgramma: We werden opgeroepen als: FUNCTION
RexxSubProgramma: We kregen 1 parameter(s) door, nl.
RexxSubProgramma: p1 p2 , p3
==>p1 p2 , p3<==
TestRexx: RexxSubProgramma gaf als resultaat: RESULT
Let hierbij op volgende zaken:
#We werden wel degelijk opgeroepen als functie (FUNCTION);
#Variabele '''result''' is niet meer ingevuld, al schreven we '''return''' met een string. Na een '''call''', en enkel dan zal REXX met variabele ''result'' iets doen. Komt er niets terug, dan wordt ''result'' namelijk "gedropped". Hier hebben we geen '''call''' gebruikt, dus variabele ''result'' blijft wat ze tevoren al was (in ons voorbeeld, een niet geïnitialiseerde variabele).
#De functie <u>moet</u> altijd iets teruggeven, al was het een nullstring (dus '''return ""''' is prima).
#We hebben nog steeds slechts één parameter binnengekregen in het RexxSubProgramma...
{{Toggletext
|kleur=#efdfef
|align=left
|tekstgrootte=
|afb=
|koptekst=VRAAG: Waarom hebben we maar één parameter Hoe lossen we dat op ?
|hoofdtekst=
Antwoord:In al onze voorbeelden hebben we alles als één constante geschreven, niet te verwonderen dat we maar één parameter binnenkrijgen in de subroutine of functie. Willen we meer parameters doorgeven, dan moeten we het zo schrijven:
say 'D:\RexxSubProgramma.rex'('p1 p2' ''',''' 'p3')
om dan dit te bekomen:
<pre>
RexxSubProgramma: We werden opgeroepen als: FUNCTION
RexxSubProgramma: We kregen 2 parameter(s) door, nl.
RexxSubProgramma: p1 p2
RexxSubProgramma: p3
==>p1 p2<==
TestRexx: RexxSubProgramma gaf als resultaat: RESULT</pre>
}}
<br>Ons hoofdprogramma kunnen we ook naar het expertniveau tillen:
/* TestRexx, roept een andere REXX op */
drop rc result /* we willen zeker zijn dat deze nog niet bestaan */
call "D:\RexxSubProgramma.rex" "p1 p2" , "p3"
Select
when symbol('RC')='VAR' then say 'TestRexx: RexxSubProgramma gaf returncode='rc
when symbol('RESULT')='VAR' then say 'TestRexx: RexxSubProgramma gaf als resultaat:' result
otherwise say 'TestRexx: Er is geen returncode noch een resultaat'
exit
<p id="SYMBOL">De functie '''symbol()''' laat namelijk toe te testen of aan een variabele een waarde toegekend is. Indien dat wel het geval is, dan antwoordt '''symbol''' met "VAR", anders met "LIT". Is de naam echter geen geldig token, dan krijgen we "BAD" als antwoord. Merk tevens op dat we de naam van de variabele tussen aanhalingstekens plaatsen. Doen we dat niet, dan zou eerst de waarde van de variabele worden ingevuld alvorens de functie '''symbol''' wordt opgeroepen.</p>
Bekijk deze voorbeelden:
rc=10
say symbol(woord) /* LIT, want woord heeft waarde WOORD en geldig token */
say symbol(rc) /* BAD, want rc heeft waarde 10 en dat is een ongeldige naam */
say symbol('RC') /* VAR, want RC heeft waarde en is geldig token */
say symbol('rc') /* VAR, want rc heeft waarde en is geldig token */
Het zal de aandachtige lezer ook zijn opgevallen dat we in het statement '''call "D:\RexxSubProgramma.rex" "p1 p2" , "p3"''' de naam van de functie tussen aanhalingstekens hebben geschreven. Dit is hier nodig omdat we leestekens zoals \ en een punt in de naam hebben. We willen namelijk niet dat REXX dit eerst probeert te interpreteren.
Maar er is nog een andere geval waarin we een functie als constante moeten schrijven. Stel dat we een interne functie gemaakt hebben met dezelfde naam als een standaardfunctie. Hoe kunnen we dan beslissen welke functie we willen oproepen ? Wel, willen we de standaardfunctie oproepen, dan moeten we de naam als constante - met hoofdletters - schrijven. Hoofdletters zijn voor onze externe functie niet nodig, want het verwijst naar een bestand, en REXX vraagt aan Windows om dat voor hem op te zoeken. Windows kan overweg met gemengde karakters.
Hier hebben we een voorbeeld:
/* Interne functie met zelfde naam als standaardfunctie */
string="Dit is een zin"
say left(string,5) /* «n zin» */
say 'LEFT'(string,5) /* «Dit i» */
exit
left: return right(arg(1),arg(2))
Dit voorbeeld is een beetje bij z'n haar getrokken, maar een interne functie zou wel extra functionaliteit aan een standaardfunctie kunnen toevoegen.
Net als in het geval van de '''call''' draait de functie in hetzelfde proces als het hoofdprogramma en zal het hoofdprogramma niet verder kunnen zolang het subprogramma niet is beëindigd.
Kortom, als het na dit hoofdstuk duidelijk is dat
{{Bericht
|bericht='''alles wat niet variabel is, als constante moet geschreven worden !'''
|type=waarschuwing}}
dan hebben we het belangrijkste kunnen aanleren. We kunnen het echt niet genoeg herhalen !
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Voorbeeld 2
|huidige =Host Commando's
|volgende=Debugging}}
{{Sub}}
bfuji94admw7rp8p0td2vgaqsoau58p
Programmeren in REXX/RexxUtil
0
28833
428210
425904
2026-05-20T06:10:41Z
Erik Baas
2193
lf
428210
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
Vrijwel de meeste implementaties van REXX hebben naast de basistaal nog één of meer externe functiepakketten die de mogelijkheden van REXX vergroten. In het geval van [[http:https://www.oorexx.org/|OORexx]] waarop we ons hier baseren zijn er de volgende pakketten
*'''RexxUtil''' met vooral functies om het besturingssysteem te benaderen (Windows of Unix).
*'''RxMath''' met trigonometrische en logaritmische functies.
maar ook
*'''RxSock''', een Rexx functiepakket dat toegang verleent tot de TCP/IP socket API's zoals men ze in C programmeertaal kan vinden.
*'''RxFtp''', een Object Rexx Class library die toegang verleent tot de TCP/IP FTP interface.
<p id="RXFUNC">Met de functie '''RxFuncAdd''' kunnen we een functie uit een extern pakket laden, of beter gezegd, registreren voor ons programma.</p>
'''RxFuncAdd'''(naam,module[,procedure])
Willen we bijvoorbeeld de functie SysIni uit het RexxUtil pakket laden, dan gebruiken we het statement:
call RxFuncAdd "SysIni","RexxUtil"
Met de '''RxFuncQuery''' kunnen we controleren of de functie geladen is (rc=0) of niet (rc=1). Met de functie '''RxFuncDrop''' kunnen we een functie terug uitschrijven.
Maar vrijwel de meeste pakketten voorzien in een speciale functie die dan in één beweging alle andere functies laadt. Dit is wat we dan schrijven:
call RxFuncAdd 'SysLoadFuncs', 'rexxutil', 'SysLoadFuncs'
call SysLoadFuncs
call RxFuncAdd "MathLoadFuncs","rxmath","MathLoadFuncs"
call MathLoadFuncs
De "SysLoadFuncs" functie uit het RexxUtil pakket dient dus om alle RexxUtil functies te registreren. In het RxMath pakket zorgt de functie "MathLoadFuncs" daarvoor.
<br>{{Bericht
|bericht=Het is niet nodig dit in elk programma te schrijven. Het is voldoende om deze functiepakketten eenmalig te registreren tijdens het opstarten van het systeem. Maak daarom een ''start.rex'' programma met bovenstaande statements en plaats het programma in de startup-folder van Windows.
|type=info}}
We gaan nu de meest interessante functies van het RexxUtil pakket van nabij bekijken. Voor de volledige lijst verwijzen we naar de documentatie (C:\Program Files\ooRexx\doc\RexxRef.pdf).
=Functies voor het systeem=
We veronderstellen hier een Windows systeem, maar veel van deze functies werken ook op een Unix systeem, al zullen ze dan soms anders reageren.
==SysBootDrive - Vanaf welk station is het systeem opgestart ?==
'''SysBootDrive()'''
geeft de stationsletter van waaruit Windows is opgestart (bv. C:).
==SysCls - het scherm uitvagen==
'''SysCls()'''
Met deze functie kan men het scherm van de opdrachtprompt uitblanken tijdens uitvoering van het programma (clear screen).
==SysDriveInfo - informatie over diskstation==
'''SysDriveInfo'''(station)
Geeft de driveletter, de vrije ruimte, de totale ruimte en het label van het opgegeven station. Bijvoorbeeld:
say SysDriveInfo("C:") «C: 91855196160 157283799040 SYSTEM»
Pas op, het zijn decimale getallen. Om digitale gigabytes, of gibibytes te bekomen moeten we delen door 1024**2. Windows zal daarom bij de taartverdeling voor dit station 87,6GB vrije ruimte tonen.
==SysDriveMap - lijst van de stationsletters==
'''SysDriveMap'''([station | "<u>C:</u>"][,optie | "<u>USED</u>"])
Geeft een lijst van de stationsletters op het systeem, te beginnen bij ''station''. Men kan de lijst beperken door een optie op te geven. Deze kan zijn:
*USED - Geeft de stationsletters die toegankelijk zijn, zowel locale als remote;
*FREE - geeft enkel de vrije stations;
*LOCAL - geeft enkel de locale stations;
*REMOTE - geeft enkel de remote stations (bv. een NAS schijf);
*REMOVABLE - de stations die verwijderbaar zijn (bv. USB stick of kaartlezer);
*CDROM - geeft de CD-ROM stations;
*RAMDISK - virtuele stations die in RAM geheugen zijn gesimuleerd.
Bijvoorbeeld:
say SysDriveMap('F:','CDROM') «R: W:»
==SysFileSystemType - organisatie van een station==
'''SysFileSystemType'''(station)
Geeft de bestandsorganisatie van het opgegeven station (nullstring als het station niet gereed is, of niet bestaat).
say SysFileSystemType('C:') /* Geeft misschien "NTFS" */
==RxWinExec - programma uitvoeren (alleen Windows)==
'''RxWinExec'''(commando[,schermvorm | "<u>Normal</u>"])
Deze functie voert het opgegeven Windows commando uit. Het ''commando'' bevat alles wat men anders op de opdrachtprompt zou invoeren, parameters incluis.
Als geen expliciet pad is meegegeven in de naam van het commando, dan zoekt REXX achtereenvolgens:
#de huidige map (current directory);
#de map van waaruit OORexx is opgeroepen;
#de Windows systeemmap;
#de Windows map;
#de mappen die in de systeemvariabele "Path" zijn opgegeven.
De optie ''schermvorm'' bepaalt hoe het venster van de toepassing er moet uitzien. Dit kan volgende waarde aannemen:
*'''ShowNormal''': toont een normaal opdrachtvenster;
*'''ShowNoActivate''': toont een opdrachtvenster, doch behoudt het huidig als actief;
*'''ShowMinNoActive''': opent een geminimaliseerd scherm en behoudt het huidig venster als actief;
*'''ShowMinimized''': opent een geminimaliseerd venster;
*'''ShowMaximized''': opent een venster dat het hele scherm beslaat;
*'''Hide''': stopt het huidig venster weg en opent een nieuw venster;
*'''Minimize''': minimaliseert het venster en activeert het venster met hogere rang.
Het resultaat van deze functie is het Process ID (PID) van de toepassing die gestart is. Indien het starten niet is gelukt krijgen we één van volgende cijfers als resultaat
*'''2''', het bestand was niet gevonden;
*'''3''', het opgegeven pad bestaat niet;
*'''11''', het EXE bestand is ongeldig;
*'''-53''', het netwerk-pad is ongeldig.
We hebben hier dus een andere manier om een host-commando uit te voeren. Indien we zijn opgeroepen door een programmapakket, dan kunnen we via deze methode toch nog rechtstreeks een Windows commando uitvoeren zonder via het oproepend programma te moeten rondgaan.
==SysIni - Windows INI bestanden benaderen==
'''SysIni'''([inifile | "<u>WIN.INI</u>"],applicatie,sleutel,waarde,stem)
Deze functie laat een beperkte toegang toe tot INI bestanden. Variabelen worden verzameld onder hun ''applicatie''-naam en geassocieerde ''sleutels''. Het kan gebruikt worden om gegevens uit te wisselen tussen toepassingen die niet gelijktijdig actief zijn. Wees bijzonder voorzichtig bij het veranderen van bestaande sleutels. Het Windows register kan slechts beperkt met deze functie worden benaderd.
We kunnen een waarde opvragen, zetten of elimineren. Het antwoord van de functie is de opgevraagde waarde, of een nullstring indien het zetten of uitvagen van de waarde is gelukt.
Bij fouten wordt een foutbericht terug gegeven.
Indien geen ''inifile'' is meegegeven wordt het bestand "WIN.INI" gebruikt. De functie heeft 6 mogelijke vormen:
#'''SysIni([inifile],applicatie,sleutel,waarde)''' om één enkele waarde de zetten;
#'''SysIni([inifile],applicatie,sleutel)''' om de waarde van één enkele sleutel op te vragen;
#'''SysIni([inifile],applicatie,sleutel,"DELETE:")''' om één enkele sleutel te elimineren;
#'''SysIni([inifile],applicatie,"DELETE:")''' om een applicatie en al zijn sleutels te elimineren;
#'''SysIni([inifile],applicatie,"ALL:","stem")''' om alle sleutels van een applicatie op te vragen. Het resultaat gaat naar de opgegeven stem;
#'''SysIni([inifile],"ALL:","stem")''' om de namen van alle applicaties op te vragen. Het resultaat gaat naar de stem.
==SysShutdownSystem - het Windows systeem stoppen==
'''SysShutdownSystem([computer][,bericht][,wachttijd][,appsluiten | <u>0</u>][,herstart | <u>0</u>])'''
Dank zij deze functie kan het Windows systeem worden gestopt. De parameters zijn:
*Computer = de naam van het systeem op afstand. Zonder computernaam wordt het lokaal systeem gestopt;
*Bericht = een bericht naar de gebruiker;
*Wachttijd = de tijd dat het bericht blijft staan;
*Appsluiten = als op "1" gezet, toont het niet het bericht "Save unsaved data ?"
*Herstart = het systeem wordt herstart als hier 1 wordt opgegeven.
==SysSleep - het programma pauzeren==
'''SysSleep'''(seconden)
Het programma pauzeert gedurende het opgegeven aantal ''seconden''.
say 'Het programma gaat nu 2 seconden pauzeren...'
call SysSleep 2
Say 'Het programma gaat nu 0.1234567 seconden pauzeren..."
Call SysSleep 0.1234567
Het aantal seconden mag een getal zijn met maximaal 7 cijfers.
En eigenlijk hoort het volgende paar standaardfuncties hier ook logisch bij...
==USERID - naam van gebruiker==
'''userid'''()
Geeft de naam van de actieve user.
==DIRECTORY - de huidige actieve map==
'''directory'''([nieuwe_map])
Deze functie geeft de naam van de huidige actieve map en zet de ''nieuwe_map'' als nieuwe actieve map. Bij het opstarten van een REXX programma is de actieve map gelijk aan de map van waaruit het programma is opgestart. Dit is niet noodzakelijk de map waar de broncode van het programma staat ! Als we het programma als volgt oproepen,
C:\>'''rexx d:\RexxProgrammas\Mijntest.rex'''
dan zal «C:\» als actieve map worden aangeven.
<!-------------------------------------------------------------------------------------------------------->
=Bestanden beheren=
Voornamelijk voor Windows voorziet het RexxUtil pakket in een reeks functies waarmee we bestanden kunnen beheren. Het gebruik van deze functies is te verkiezen boven het oproepen van het rechtstreeks commando, omdat:
* we een meer sprekende returncode terugkrijgen;
* de Windows foutberichten niet meer op het scherm verschijnen. Desgevallend kunnen we er dan zelf één produceren dat duidelijker is voor de gebruiker.
We maken deze verschillen duidelijk bij de bespreking van de eerste functie '''SysFileDelete''' hieronder.
Maar eerst nog even dit: vermits het hier om functies gaat, en niet om host-commando's, zal de variabele '''rc''' niet ingevuld worden, maar wel de variabele '''result'''. Toch spreekt men vaak over returncode voor deze functies, maar dan kunnen we als volgt de verwarring wegnemen:
rc = Sysfunctie(parameters)
if rc<>0 then .....
==SysFileDelete - een bestand uitvagen==
'''SysFileDelete'''(bestandsnaam)
We mogen geen "wildcards" gebruiken, dus geen *.jpg bijvoorbeeld.
Dit zijn de mogelijke "returncodes" die we kunnen krijgen:
*'''0''' Alles OK, bestand is verwijderd;
*'''2''' Bestand is niet gevonden;
*'''3''' Het pad van de bestandsnaam bestaat niet;
*'''5''' Toegang geweigerd, of bestand is in gebruik;
*'''26''' Niet een DOS disk;
*'''32''' Sharing violation, bestand op andere computer mag alleen gelezen worden;
*'''36''' Sharing buffer overloop;
Laten we het gebruik van deze functie nu eens vergelijken met het rechtstreeks oproepen van het "ERASE" commando van Windows:
/* Verschil tussen SysFileErase en ERASE commando */
'ERASE D:\BestandBestaatNiet'
say 'RC='rc
SysFileDelete('D:\BestandBestaatNiet')
'ERASE D:\DitBestaatWel'
say 'RC='rc
SysFileDelete('D:\DitBestaatOok')
We krijgen het volgende op het scherm:
Kan D:\BestandBestaatNiet niet vinden
RC=0
2 wordt niet herkend als een interne of externe opdracht, programma of batchbestand.
RC=0
0 wordt niet herkend als een interne of externe opdracht, programma of batchbestand.
De eerste zin is het antwoord van Windows op het eerste 'ERASE' commando. Hier kunnen we nog met dat bericht leven. Maar voor een nietsvermoedende gebruiker is zo'n bericht, midden in de uitvoering van een programma niet duidelijk en ook niet leuk om zien. Erger nog, zelfs al mislukte dit commando omdat het bestand er niet is, toch geeft Windows een returncode 0 terug. Ons programma kan het foutbericht niet intercepteren en heeft er dus het raden naar of de operatie lukte of niet.
Bij de daaropvolgende '''SysFileDelete''' functie krijgen we een rare boodschap. Dit is het gevolg van een typische beginnersfout. We kijken nu terug naar de instructielijn met de SysFileDelete. REXX vervangt de functie door het resultaat dat ze produceerde, t.t.z. 2 want het bestand is niet gevonden. Het statement is nu erg kort geworden en maakt geen deel uit van een assignatie of een conditionele instructie (bv. when 2=0 then) of zo. REXX geeft dat resultaat dus door als host commando. Tot nader order heeft Windows geen commando dat "2" noemt, tenzij er een 2.BAT of 2.REX in het "path" te vinden is.
De tweede 'ERASE' geeft ons helemaal geen tekst te zien (alles verliep OK, maar we zien dat niet) en ook hier is de returncode=0.
De daaropvolgende 'SysFileDelete' heeft hetzelfde probleem als bij de eerste. We moeten dit dus anders schrijven:
/* Verschil tussen SysFileErase en ERASE commando */
'ERASE D:\BestandBestaatNiet'
say 'RC 1 ='rc
call SysFileDelete 'D:\BestandBestaatNiet'
say 'RC 2 ='result
'ERASE D:\DitBestaatWel'
say 'RC 3 ='rc
say 'RC 4 ='SysFileDelete('D:\DitBestaatOok')
We krijgen we:
Kan D:\BestandBestaatNiet niet vinden
RC 1 =0
RC 2 =2
RC 3 =0
RC 4 =0
En we zien dat de SysFileDelete functie ons wel degelijk meer zinvolle "returncodes" geeft. Het afschrikkend foutbericht krijgen we ook niet meer, maar ons programma kan aan de hand van de returncode de gebruiker op een vriendelijke manier inlichten als dat nodig zou blijken.
==SysFileCopy - een bestand kopiëren==
'''SysFileCopy'''(bronbestand,doelpad)
Er mogen geen "wildcards" gebruikt worden (bv. *.jpg). Als alles goed gaat hebben we een returncode 0, bij een fout geeft de functie een returncode 2.
Bijvoorbeeld:
call SysFileCopy "c:\temp\myfile.txt","d:\myfolder"
Noteer dat een bestaand bestand zonder verwittiging wordt overschreven.
==SysFileMove - een bestand verplaatsen==
'''SysFileMove'''(bronbestand,doelpad)
Zoals SysFileCopy, maar nu wordt het bestand van de oorspronkelijke plaats weggenomen nadat het kopiëren naar de nieuwe plaats is gelukt.
Als het bestand in het doelpad al bestaat, dan krijgen we een resultaat 183.
==SysIsFile - bestaat een bestand ?==
'''SysIsFile'''(bestandsnaam)
Deze functie geeft 0 als het bestand niet bestaat, en 1 als het wel bestaat. De ''bestandsnaam'' mag geen "wildcards" ofte jokers bevatten.
Vermits we de binaire waarde 0 (onwaar) of 1 (waar) terugkrijgen kunnen we eenvoudig dit schrijven:
if SysIsFile("MijnBestand.txt") then say "Het bestand bestaat !"
else say "Het bestand bestaat niet."
==SysIsFileDirectory - bestaat een map ?==
'''SysIsFileDirectory'''(mapnaam)
Is vergelijkbaar met SysIsFile, en antwoord dus 0 als de map niet bestaat, 1 als ze wel bestaat. Jokers zijn ook niet toegelaten.
==SysFileTree - bestanden zoeken==
Deze functie is equivalent aan het DIR commando, maar we krijgen het resultaat rechtstreeks terug in een REXX stem !
'''SysFileTree'''(zoekterm,stem.[,opties | "<u>B</u>"][,Zattribuut | "<u>*****</u>"][,Nattribuut | "<u>*****</u>"])
De ''zoekterm'' is zoals we met het DIR commando gebruiken, bijvoorbeeld "D:\Fotos\*.jpg". Dus jokers zijn nu wel toegelaten.
De lijst van de gevonden bestanden wordt in de opgegeven ''stem.'' geplaatst, waarbij de dimensie van de stem, dus het aantal gevonden bestanden, in element 0 wordt gezet.
Als ''opties'' kan men een combinatie van één of meer van volgende letters opgeven:
*'''F''' enkel naar bestanden zoeken ('''F'''iles);
*'''D''' enkel naar (sub)mappen zoeken ('''D'''irectories);
*'''B''' zowel bestanden als mappen zoeken ('''B'''oth). Dit is de standaardoptie.
*'''S''' recursief zoeken, dus ook in '''S'''ubmappen;
*'''T''' geeft '''T'''ijd en datum van de bestanden in de vorm JJ/MM/DD/UU/MM i.p.v. normaal iets als «13/11/05 2:12pm»;
*'''L''' geeft de tijd en datum in '''L'''ang formaat JJJJ-MM-DD UU:MM:SS. (Nuttig voor een sort);
*'''O''' geeft enkel de naam van het bestand. Zonder deze optie worden standaard de datum, tijd, grootte, attributen en naam van de bestanden teruggegeven.
Voorbeeld:
call SysFileTree "D:\CMD\E*.rex","bestand.","STF"
do i=1 to bestand.0
say bestand.i
end
geeft mogelijks:
09/10/29/17/19 899 A---- D:\CMD\Ebcdic2Ascii.rex
11/02/10/15/08 9057 A---- D:\CMD\ExifTagRoutine.rex
07/10/24/13/44 4008 A---- D:\CMD\ExtractJPG.rex
98/08/10/06/24 2259 A---- D:\CMD\rexxtools\EXEDEMO.REX
De datum en tijdsweergave in het voorbeeld hierboven is niet om naar huis te schrijven, en we zitten mogelijk ook al met een jaar-2000 probleemje. Daarom gebruiken we dus best de optie '''L''', zoals in ons volgend voorbeeld.
Ook hier geldt weer dat de naam van de stem waarin het resultaat moet komen als een constante moet worden geschreven. Doen we dat niet dan loopt alles in het honderd als iemand '''bestand.="Hello"''' zou gaan toevoegen...
'''Zattribuut''' bepaalt welke attributen de ge'''z'''ochte bestanden moeten hebben.
Het masker is standaard "*****", waarmee alle bestanden worden teruggegeven. Elke positie in het masker kan echter vervangen worden door een '''+''' of '''-''' om aan te duiden dat het bestand het desbetreffend attribuut verplicht wel of niet moet hebben. De volgorde van de attributen ligt vast en is gelijk aan '''''ADHRS''''', namelijk '''A'''rchive, '''D'''irectory, '''H'''idden, '''R'''ead-only en '''S'''ystem.
Dus, "*-+**" zou alle verborgen bestanden zoeken maar geen mappen.
'''Nattribuut''' bepaalt de '''n'''ieuwe attributen die aan de bestanden moeten worden toegekend. Men kan dus met deze functie attributen van bestanden veranderen. De volgorde van de attributen is weer '''''ADHRS''''' en als er een '''+''' gezet wordt dan wordt het attribuut aangezet. Met een '''-''' wordt het afgezet en met een '''*''' blijft het attribuut onveranderd. Dus, een ''Nattribuut'' gelijk aan "-**+*" zal het '''A'''rchive attribuut afzetten en de '''R'''ead-only aanzetten voor alle bestanden die aan de zoekopdracht voldeden. Een map maken van een bestand, ja dat lukt natuurlijk niet. De nieuwe attributen zijn onmiddellijk in het antwoord van de functie te zien.
Voorbeeld:
call SysFileTree "D:\Fotos\IMG_3*.jpg","bestand.","LFO",,"+----"
do i=1 to bestand.0
say bestand.i
end
geeft misschien iets in de aard van:
2009-12-13 15:07:24 7547847 A---- D:\Fotos\IMG_3223.jpg
2009-12-13 15:10:12 6845771 A---- D:\Fotos\IMG_3224.jpg
Wij vonden SysFileTree geweldig nuttig omdat ze de bestandsinformatie mooier teruggeeft dan het DIR commando van Windows, maar ook omdat men zeer eenvoudig kan kiezen welke bestanden met specifieke attributen men wil zien. Daarom hebben we een '''FileTree.rex''' programma gemaakt dat SysFileTree gebruikt en het resultaat op het scherm toont. We voegen nog de mogelijkheid om het resultaat te sorteren aan toe. Met piping kan men de output afleiden naar een bestand. Het programma is te vinden in het [[Programmeren in REXX/Voorbeeldprogramma's#Uitgebreide DIR dank zij SysFileTree|hoofdstuk met voorbeeldprogramma's]].
==SysGetFileDateTime - datum en tijd van bestand opvragen==
'''SysGetFileDateTime'''(bestandsnaam[,type | "<u>A</u>"])
Met deze functie kunnen we - indien het bestandssysteem het toelaat - de verschillende tijden van een bestand (of map) opvragen. Het bestand moet toegankelijk zijn en mag niet in gebruik zijn.
De verschillende tijden die we kunnen opvragen zijn:
*'''C'''reate - de creatiedatum en -tijd van het bestand;
*'''A'''ccess - de laatste maal dat het bestand benaderd werd. Dit is de standaardoptie;
*'''W'''rite - de laatste maal dat er naar het bestand is geschreven.
Vergelijk dit met bijvoorbeeld "SysFileTree" waar we enkel de '''A'''ccess tijd terugkrijgen.
==SysSetFileDateTime - een nieuwe datum en/of tijd aan een bestand toekennen==
'''SysSetFileDateTime'''(bestandsnaam[,nieuwe_datum][,nieuwe_tijd])
Met deze functie kunnen we datum en/of tijd van een bestand aanpassen. Het gaat enkel om de "Laatste Modificatie-datum". Indien datum noch tijd worden opgegeven, dan wordt de huidige systeemtijd toegewezen. Indien slechts één van deze twee parameters wordt opgegeven verandert uiteraard enkel dat gegeven. Ook de datum/tijd van een map kan zo worden aangepast. Het bestand of map moet toegankelijk zijn voor schrijven en niet in gebruik zijn door een ander proces of gebruiker.
De '''nieuwe datum''' moet verplicht voldoen aan volgende formaat: JJJJ-MM-DD. De '''nieuwe tijd''' moet opgegeven worden in het formaat UU:MM:SS (24-uursformaat).
Een returncode -1 geeft aan dat de aanpassing is mislukt. Dit zijn voorbeelden:
Call SysSetFileDateTime "MijnFoto.jpg" /* we zetten de systeemtijd */
Call SysSetFileDateTime "MijnFoto.jpg","1998-12-17" /* Enkel datum is veranderd */
Call SysSetFileDateTime "MijnFoto.jpg",,"16:37:21" /* Enkel uur wordt veranderd */
Call SysSetFileDateTime "MijnFoto.jpg","1998-12-17","16:37:21" /* Alles nieuw */
==SysFileSearch - tekst in een bestand zoeken==
'''SysFileSearch'''(zoekstring,bestand,stem.[,opties])
Met deze functie zoeken we in een bestand naar alle lijnen waar de ''zoekstring'' in voorkomt. Het resultaat ervan is terug te vinden in de opgegeven ''stem.''. Element 0 bevat dan het aantal gevonden lijnen.
Als opties kan men meegeven:
*'''C''' hoofdletter gevoelige opzoeking (case-sensitieve)
*'''N''' lijnnummers bij het resultaat zetten.
Bijvoorbeeld:
/* Zoeken naar DEVICE in CONFIG.SYS */
call SysFileSearch "DEVICE","C:\CONFIG.SYS","lijn.","N"
do i=1 to lijn.0
say lijn.i
end
geeft misschien volgende uitslag:
1 DEVICE=C:\SB16\DRV\CTSB16.SYS /UNIT=0 /BLASTER=A:240 I:5 D:1 H:5
2 DEVICE=C:\SB16\DRV\CTMMSYS.SYS
4 rem **** DOS SCSI CDROM device drivers ***
5 DEVICE=C:\SCSI\ASPI8DOS.SYS /D
6 DEVICE=C:\SCSI\ASPICD.SYS /D:ASPICD0
13 DEVICE=C:\DOS\SETVER.EXE
==SysSearchPath - zoeken naar een bestand in een pad==
'''SysSearchPath'''(pad,bestandsnaam[,optie | "<u>C</u>"])
Deze functie gaat na of het ''bestand'' in het opgegeven ''pad'' aanwezig is. Indien wel, dan wordt de volledige naam van het eerste bestand dat voldoet teruggegeven, en wordt er niet meer verder gezocht. Indien geen bestand is gevonden, dan krijgen we een nullstring terug. Het ''pad'' verwijst hier naar een "omgevingsvariabele" die een lijst van mappen bevat. De typische omgevingsvariabelen hiervoor zijn "PATH" en "DPATH".
De ''optie'' geeft aan waar het zoeken moet beginnen:
*'''C''' beginnen van in de huidige map ('''C'''urrent directory) en vervolgens het opgegeven pad.
*'''N''' niet in de huidige map beginnen.
Bijvoorbeeld:
/* Zoeken of we toegang hebben tot REXX.EXE via het actuele "PATH" */
gevonden = SysSearchPath("PATH","REXX.EXE")
if gevonden<>"" then say "REXX.EXE is gevonden in" gevonden
else say "REXX.EXE is niet te vinden in PATH"
Hopelijk krijgen we als antwoord:
REXX.EXE is gevonden in C:\Program Files\ooRexx\REXX.EXE
want anders moeten we steeds expliciet het volledig pad opgeven om de REXX interpreter op te starten.
<!------------------------------------------------------------------------------------>
=Mappen beheren=
==SysMkDir - een map aanmaken==
'''SysMkDir'''(nieuwe_map_naam)
Mogelijke returncodes zijn:
*'''0''' alles verliep naar wens;
*'''3''' pad waar map moet gemaakt worden is niet gevonden;
*'''5''' toegang geweigerd;
*'''26''' geen DOS disk;
*'''87''' ongeldige parameter (mapnaam ongeldig);
*'''108''' schijf gelocked;
*'''183''' map bestaat al;
Het MKDIR commando van Windows geeft altijd returncode=0.
==SysRmDir - een map wegnemen==
'''SysRmDir'''(mapnaam)
De returncodes kunnen nu zijn:
*'''0''' alles verliep naar wens;
*'''2''' map niet gevonden;
*'''3''' pad naar map is niet gevonden;
*'''5''' toegang geweigerd;
*'''16''' De map is de huidige map (we kunnen de tak waarop we zitten niet afzagen);
*'''26''' geen DOS disk;
*'''32''' map is niet gedeeld, of veranderingen niet toegestaan;
*'''108''' schijf gelocked;
*'''123''' ongeldige mapnaam;
*'''145''' map is niet leeg;
*'''146''' er is een substitutie op de map;
*'''147''' de map is gelinkt aan een andere;
<!--------------------------------------------------------------------------------------------->
=Werken met stems=
==SysStemCopy - een (deel van een) stem kopiëren==
'''SysStemCopy'''(bronstemstem,doelstem[,bstart | <u>1</u>][,dstart | <u>1</u>][,aantal][,<u>I</u> | O])
Deze functie kopieert elementen van één stem, de ''bronstem'', naar een andere, de ''doelstem''.
Het kopiëren begint bij element ''bstart'' van de bronstem. Dit eerste element gaat naar element met index ''dstart'' van de doelstem. Een ''aantal'' elementen kan opgegeven worden, anders worden alle resterende elementen van de bronstem gekopieerd.
Een laatste parameter bepaalt of de elementen van de bronstem als nieuwe elementen moeten worden '''I'''ngevoegd, dan wel of de elementen in de doelstem moeten worden '''O'''verschreven.
Deze functie kan enkel werken met stems waarvan de staart een continue getallenreeks is en waarvan element nul het aantal bevat. Dit is een conventie die we al lang kennen.
Een resultaat -1 betekent dat er problemen zijn opgetreden.
Voorbeeld:
parse value 3 "Dit is leuk" with bron.0 bron.1 bron.2 bron.3
Call SysStemCopy "bron.","doel."
Call SysStemCopy "bron.","doel.",1,4,2,"I"
In het eerste geval wordt de doel-stem gelijkgemaakt aan de bron-stem.
In het tweede geval voegen we de eerste twee elementen van de bron tussen na het vierde element van het doel. In dit concrete voorbeeld is dat dus aan het einde van de stem. Als we nu de elementen van de doelstem lijsten, dan bekomen we:
Dit
is
leuk
Dit
is
==SysStemDelete - elementen uit een stem nemen==
'''SysStemDelete'''(stem,start[,aantal | <u>1</u>])
Deze functie elimineert een ''aantal'' elementen van de ''stem'', beginnend aan het element met index ''start''.
Ook deze bewerking kan alleen op stems met numerieke indexen worden uitgevoerd. Na het elimineren van de elementen wordt de stem gecompacteerd, t.t.z. de indexen worden terug opeenvolgend gemaakt.
==SysStemInsert - elementen aan een stem toevoegen==
'''SysStemInsert'''(stem,index,waarde)
Deze functie voegt een nieuw element met ''index'' toe aan de ''stem'' en geeft het een ''waarde''. De volgende elementen worden opgeschoven, dus hun indexnummers worden met één verhoogd.
==SysStemSort - een stem sorteren==
'''SysStemSort'''(stem[,"D" | "<u>A</u>"][,"C" | "<u>I</u>"][,start | <u>1</u>][,einde | <u>stem.0*</u>][,beginkolom | <u>1</u>][,eindkolom | <u>*</u>])
De elementen van de stem (met numerieke indexen) worden geordend. Dit kan in oplopende of aflopende volgorde gebeuren ('''A'''scending of '''D'''escending).
Het sorteren kan wel of niet hoofdlettergevoelig zijn ('''C'''ase sensitive of case '''I'''nsensitive).
Het sorteren begint bij het element met index ''start'' en eindigt bij het element met index ''einde''. Het sorteren gebeurt tussen de ''beginkolom'' en de ''eindkolom'' (of volledige breedte).
<!--------------------------------------------------------------------------------------------->
=Andere nuttige functies=
==RxMessageBox - Een bericht in een kadertje==
'''RxMessageBox'''(text[,titel][,knoppen | "<u>OK</u>"][,icoontje])
Met deze functie kunnen we op een eenvoudige wijze een popup-schermpje maken waarin we een bericht kunnen tonen. Dit is vooral nuttig indien ons programma niet vanuit de opdrachtprompt is opgeroepen, maar door een link in het startmenu of een icoon op de desktop. Een '''say''' werkt dan niet omdat er geen scherm is om het te tonen.
Naast de ''tekst'' kunnen we ook zorgen voor een ''titel'' en kiezen welke ''knoppen'' en ''icoontje'' moeten voorzien worden.
De mogelijke knoppen zijn:
*'''NONE''' (geen knop voorzien):
*'''OK''' - een knop met de tekst "OK" voorzien.
*'''OKCANCEL''' - twee knoppen, een met "OK" en een met "CANCEL";
*'''RETRYCANCEL''' - de knoppen "RETRY" en "CANCEL";
*'''ABORTRETRYIGNORE''' - drie knoppen: "ABORT", "RETRY" en "IGNORE";
*'''YESNO''' - de knoppen "YES" en "NO";
*'''YESNOCANCEL''' - drie knoppen, "YES", "NO" en "CANCEL";
Een tekst op de knoppen kan niet vertaald worden. OORexx biedt hier andere mogelijkheden, we bespreken die in het hoofdstuk [[Programmeren in REXX/Een_beetje_OORexx|Een beetje OORexx]].
We kunnen kiezen uit volgende icoontjes:
*'''HAND''' - een handje;
*'''QUESTION''' - een vraagteken;
*'''EXCLAMATION''' - een uitroepteken;
*'''ASTERISK''' - een ster;
*'''INFORMATION''' - een Informatie-icoontje;
*'''STOP''' - een stopteken;
*'''QUERY''' - een vraagteken;
*'''WARNING''' - een waarschuwingsteken;
*'''ERROR''' - een foutteken.
Dit zijn de codes die we terugkrijgen als de gebruiker een knop heeft gekozen:
*'''1''' OK knop;
*'''2''' CANCEL knop (of Esc-toets);
*'''3''' ABORT knop;
*'''4''' RETRY knop;
*'''5''' IGNORE knop;
*'''6''' YES knop;
*'''7''' NO knop;
Voorbeeld:
if RxMessageBox("Gaan we verder ?","Vraagje","OKCANCEL","QUESTION")<>1 then exit
==SysDumpVariables - programmavariabelen lijsten==
'''SysDumpVariables'''([doel])
Deze functie schrijft alle variabelen en hun waarde naar STDOUT, of het bestand dat als ''doel'' is opgegeven. Het bestand wordt aangevuld (append).
Per variabele krijgen we een lijn in de vorm:
Name=MIJNVAR, Value="Dit is de inhoud"
Handig om te debuggen natuurlijk.
Hiermee beëindigen we de beschrijving van de functies uit het RexxUtil pakket. Er zijn minstens nog eens zoveel functies in dit pakket. We raden aan van er de documentatie eens op na te slaan om de andere functies te leren kennen. Deze opmerking geldt natuurlijk ook voor functiepakketten die bij andere implementaties van REXX zijn meegeleverd.
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Debugging
|huidige =RexxUtil functies
|volgende=Bestanden beheren}}
{{Sub}}
dvyw6kc6n6fq1v176zp8fzqw9hzo75u
Programmeren in REXX/Voor je begint
0
28876
428214
425901
2026-05-20T06:10:43Z
Erik Baas
2193
lf
428214
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit boek gaan er we er dus van uit dat [https://www.oorexx.org/ Object REXX (OORexx)] op een Windows systeem is geïnstalleerd.
==Installatie==
We gaan niet in op alle details van de installatie want deze kan licht verschillen bij elke nieuwe release. Meestal beperkt het zich toch tot het uitvoeren van een installatieprogramma. De installatie is zeer snel.
Tijdens installatie wordt ook de Windows omgevingsvariabele '''path''' aangevuld met de mappen waar OORexx is geïnstalleerd.
Een goede werkwijze is nu om alle nieuwe programma's samen te brengen in eenzelfde map, bijvoorbeeld
'''d:\RexxProgrammas\'''. Het kan dan ook nuttig zijn om deze map toe te voegen aan de omgevingsvariabele '''path''' om zodoende programma's eenvoudiger te kunnen oproepen.
Om dit te bewerkstelligen volgt men de ketting ''Configuratiescherm/Systeem/Geavanceerde Systeeminstellingen/Omgevingsvariabelen'' en zoekt men in de lijst naar '''path'''. Deze kan men dan aanpassen door onze programmamap er achteraan toe te voegen (gescheiden van het voorgaande met een punt-komma).
==Opdrachtprompt en RexxTry==
Als we geen gebruik maken van Object Orientatie kunnen we met REXX ook geen grafische toepassingen maken en werken we via de opdrachtprompt (CMD.EXE). We zullen bij het einde van het boek toch een hoofdstuk weiden aan manieren om eenvoudige grafische toepassingen te maken met elementen van de OORexx versie.
Handig is wel om de eigenschappen van de opdrachtprompt zó aan te passen dat de schermbuffergrootte bijvoorbeeld 132 karakters breed en 200 lijnen hoog wordt. De venstergrootte laat men dan op bijvoorbeeld 132x40. Op die manier kan men terugbladeren om vroegere uitvoerlijnen te bekijken. Misschien moet daarbij ook geëxperimenteerd worden met de karaktergrootte.
Leg deze eigenschappen eens en voor altijd vast door de eigenschappen van de opdrachtprompt in het Start Menu aan te passen (rechts klikken). Desgevallend ook een snelkoppeling voorzien op het bureaublad.
Tijdens de installatie is tevens een handig REXX programmaatje geïnstalleerd, namelijk '''RexxTry.rex'''. Dat programma laat toe eenvoudige REXX opdrachten uit te testen. Hier zien we een voorbeeldje (de vette woorden zijn door de gebruiker ingegeven).
C:\Users\Dmitri>'''RexxTry'''
REXX-ooRexx_3.1(MT) 6.01 20 Apr 2007
rexxtry.rex lets you interactively try REXX statements.
Each string is executed when you hit Enter.
Enter 'call tell' for a description of the features.
Go on - try a few... Enter 'exit' to end.
'''say "Hello"'''
Hello
........................................... rexxtry.rex on WindowsNT
'''a=5'''
........................................... rexxtry.rex on WindowsNT
'''say a**2'''
25
........................................... rexxtry.rex on WindowsNT
'''exit'''
C:\Users\Dmitri>
==Een programma afbreken==
In het geval een programma in een loop terechtkomt, of welke andere reden dan ook, kan men het afbreken door de toetscombinatie '''Ctrl-Break''' of '''Ctrl-C''' te gebruiken. Soms is een tweede maal nodig, bijvoorbeeld als het programma op een antwoord wacht, dan gaat de eerste maal verloren. Ctrl-C werkt doorgaans beter.
==Eigenaardigheid of fout ?==
REXX programma's zal men de extensie '''.rex''' geven. Dan kan men ze onmiddellijk oproepen.
C:\Users\Dmitri>'''MijnRexxProgrammaatje'''
We hebben echter opgemerkt dat met de huidige versie op deze manier geen parameters worden meegegeven. We moeten daarvoor het programma als volgt oproepen:
C:\Users\Dmitri>'''rexx MijnRexxProgrammaatje parameter1 parameter2 ...'''
==Welke Editor gebruiken ?==
De eerste keuze is '''Notepad''' van Windows. Maar deze editor is ietwat archaïsch geworden. Een goed en gratis alternatief is daarom
[https://notepad-plus-plus.org/ Notepad++]. Deze editor heeft geen ondersteuning voor de REXX syntaxis, maar men kan er een ontwerpen via "Beeld/Syntaxis ontwerpen". De syntaxisondersteuning voor TCL komt anders al dicht in de buurt.
De (betaalde) editor [https://www.ultraedit.com/ UltraEdit] heeft REXX syntaxisondersteuning.
{{Bladeren2
|Boek =Programmeren in REXX
|huidige =Voor je begin
|volgende=Fundamenten}}
{{Sub}}
mwy9bq436eptizcvad5qm1igjjzpoo1
Kookboek/Sudderlapjes
0
28896
428093
425189
2026-05-20T05:28:02Z
Erik Baas
2193
lf
428093
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Sudderlapjes.jpeg|300px]]
| Categorie = Vleesrecept
| Porties = 4
| Energie =
| Tijd = 25 minuten + 3-4 uur sudderen
| Stippen = 3
}}
'''Sudderlapjes''' is een stoofpot met rundvlees. Het is een lekker ′ouderwets′ gerecht uit de Nederlandse keuken. Het heeft weliswaar lang nodig, maar je hebt er maar 15 minuten werk aan (ik maak dit meestal de avond van tevoren).
Sudderlapjes zijn geschikt als vleesgerecht bij de hoofdmaaltijd.
==Ingrediënten==
* 2 {{Kb|p=ui|uien}}
* 2 teentjes knoflook
* 1-2 tomaten
* een flinke klont margarine
* 600 g {{Kb|p=rundvlees|runderlapjes}}
* een bouillonblokje
* 3 {{Kb|p=kruidnagel|kruidnagels}}
* 3 laurierblaadjes
* peper
* zout
* paprikapoeder
* ½ eetlepel verse tijm
==Keukengereedschap==
* Braadpan
==Bereidingswijze==
# Voorbereiding: snijd de tomaat, uien en knoflook fijn.
# Kruid het vlees met de peper, het zout en de paprikapoeder.
# Bak het vlees in een pan goed aan zodat het mooi bruin kleurt. Keer enkele keren, zodat alle lapjes aan beide zijden bruin zijn.
# Neem het vlees uit de pan en bak de ui, tomaat en knoflook aan, voeg kruidnagels, laurierblaadjes, bouillonblokje en wat heet water toe (het vlees moet net onder water staan) en breng dit aan dit kook.
# Zet de warmtebron op de laagste stand, leg het vlees weer in de pan en zet de deksel er schuin op. Let op dat het vlees niet droog komt te staan, voeg anders wat water bij. Laat dit zo lang mogelijk suddderen (3 à 4 uur), het vlees valt bijna uit elkaar en je krijgt een heerlijke jus.
# Serveertip: De saus/jus is vooral lekker bij gekookte aardappelen.
==Varianten==
* Het vlees is sneller gaar als je een [[Kookboek/Hogedrukpan|hogedrukpan]] gebruikt, maar dan kan het gerecht iets minder lekker zijn.
* [[Kookboek/Boeuf Bourguignon|Boeuf Bourguignon]]
{{Navigatie recepten}}
[[Categorie:Vleesrecept|Sudderlapjes]]
[[Categorie:Nederlandse keuken|Sudderlapjes]]
{{Sub}}
7gfkjkey505cxm3io82ga8ggke9cynl
Programmeren in REXX/Nog bevelen en functies
0
28919
428215
425902
2026-05-20T06:10:45Z
Erik Baas
2193
lf
428215
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit hoofdstuk leren we nog een aantal functies en bevelen te gebruiken. Het zijn niet de gemakkelijkste, vandaar dat we ze nu pas behandelen.
We beginnen met de bespreking van functies die met datum en tijd werken.
=Beheer van datums en tijd=
Omdat datums en tijden geen gebruik maken van het tientallig stelsel is het werken ermee niet altijd eenvoudig en vraagt het grote aandacht. Fouten zijn snel gemaakt.
==TIME==
'''time'''([optie | "<u>Normal</u>"])
Met deze functie kan men de huidige tijd onder verschillende vormen opvragen. De ''optie'' bepaalt de vorm en enkel het eerste karakter is daarbij nodig:
*Time('''N'''ormal) «15:57:48» (dit is de standaard-optie)
*Time('''C'''ivil) «3:57pm» (bij ons weinig gebruikt)
*Time('''L'''ong) «15:57:48.315000» (microseconden)
*Time('''H'''ours) «15» (uren sinds het begin v/d dag)
*Time('''M'''inutes) «957» (minuten sinds het begin v/d dag)
*Time('''S'''econds) «57468» (seconden sinds het begin v/d dag)
En nog twee speciale opties:
*Time('''E'''lapsed) «0.45455» (misschien)
*Time('''R'''eset) «10.03100» (misschien)
De eerste reeks behoeft weinig meer uitleg, behalve dat bij het '''L'''ong formaat, men op PC systemen geen grotere nauwkeurigheid dan milliseconden moet verwachten (de drie laatste decimalen zijn altijd 0).
Als de functie '''time''' meermaals in hetzelfde statement wordt opgeroepen dan zal ze steeds dezelfde waarde teruggeven. Het is alsof de tijd dan even stilstaat. Bovenstaande resultaten zijn allemaal samen in één statement uitgevoerd, dus slaan de uitkomsten op exact dezelfde tijd.
De twee laatste opties vragen wel wat meer uitleg. Ze laten toe de tijd te meten die voor het uitvoeren van een taak nodig was. Het is dus een soort chronometer.
<br>Bekijk deze volgorde:
call time 'R' /* zet de chronometer op 0, Reset dus */
/* ...een eerste reeks bewerkingen... */
say 'Reeks 1 nam' time('E') 'seconden in beslag.'
/* ...een tweede reeks bewerkingen... */
say 'Reeksen 1 en 2 namen samen' time('R') 'seconden in beslag.'
/* ...een derde reeks bewerkingen... */
say 'Reeks 3 duurde' time('E') 'seconden.'
In het eerste statement doen we een '''Reset''' van de chronometer. We zetten hem op nul. Vermits we niet geïnteresseerd zijn in de tijd die de chronometer op dat moment had gebruiken we een '''call time''' bevel i.p.v. '''tijd=time()'''.
<br>Na de eerste reeks bewerkingen vragen we de '''Elapsed''' (verlopen) tijd op. De chronometer wordt daarbij niet terug op nul gezet, en zal dus blijven doorlopen.
<br>Na de tweede reeks bewerkingen vragen we weer de verlopen tijd op, maar tegelijkertijd zetten we de chronometer terug op nul.
<br>Uiteindelijk vragen we hoeveel tijd de derde reeks bewerkingen in beslag nam.
Noteer ook dat REXX slechts één chronometer bezit. Als hij wordt gestart in een subroutine, dan zal hij zijn waarde verliezen (en terug op nul vallen) bij het verlaten van de subroutine.
Hier volgen een aantal voorbeelden van tijdsrekening:
parse value time() time('S') with TijdNu DagSeconden
parse var TijdNu uu ':' mm ':' ss /* splits tijd in uren, minuten en seconden */
AantalSeconden=uu*3600 + mm*60 + ss /* hoeveel is dat in seconden */
say AantalSeconden=DagSeconden /* «1» want anders maakten we een fout */
Plus4min= AantalSeconden + 4*60 /* doe er 4 minuten bij */
/* Nu terug omzetten naar uu:mm:ss formaat... */
uu = Plus4min % 3600 /* Gehele deling */
if uu>23 then uu=uu-24 /* Misschien middernacht overschreden bij optelling */
rest = Plus4min // 3600 /* Rest na deling door 3600 (= aantal sec in 1 uur */
mm = rest % 60 /* Omzetten naar minuten via gehele deling */
ss = Plus4min // 60 /* Seconden zijn rest na deling door 60 */
Say 'Binnen 4 minuten zal het' right(uu,2,0)':'right(mm,2,0)':'right(ss,2,0) 'zijn.'
De eerste paar statements hierboven lijken nodeloos complex: we halen de seconden uit een tijd in hh:mm:ss formaat. Dat hadden we rechtstreeks met '''time('S') kunnen doen. De lezer heeft gelijk, het dient enkel als voorbeeld om te tonen hoe we een hh:mm:ss tijd in stukjes hakken.'''
Het laatste deel is zeker een functie waard als men deze omzetting vele malen moet uitvoeren. Ze kan er dan in een zeer compacte vorm als volgt uitzien:
S2T: Procedure /* Zet een aantal Seconden om in normale Tijdformaat */
parse arg secs .
secs= secs//86400 /* Nooit meer dan 24 uur ? */
return right(secs % 3600,2,0) || ':' ||,
right(secs // 3600 % 60,2,0) || ':' ||,
right(secs // 60,2,0)
Bestudeer deze functie nog eens aandachtig zodat alle aspecten ervan duidelijk worden. Ze lijkt misschien nogal cryptisch, maar ze is alvast performant omdat er geen werkvariabelen worden aangemaakt. We laten het aan de lezer over om de tegenovergestelde functie T2S te schrijven. Die is veel eenvoudiger, maar kan ook nuttig zijn.
==DATE==
'''date'''([optie | "<u>Normal</u>"])
Het oorspronkelijk formaat, met slechts één mogelijke parameter ''optie'', is nogal rudimentair. Men kan enkel de datum van vandaag in verschillende formaten opvragen. De ''optie'' - de eerste letter is daarbij voldoende - bepaalt het formaat. We vernoemen hier enkel de voornaamste opties die men in alle REXX implementaties zal terugvinden:
*'''N'''ormal - dit formaat is standaard als geen optie wordt meegegeven. We krijgen de datum in de vorm '''dd mnd jjjj''', bv. 16 mar 2011 (maand in 3 karakters, Engelse namen);
*'''B'''asedate - het aantal dagen sinds 1 januari van het jaar 1. Er wordt hier geen rekening gehouden met de aanpassingen aan de kalender zoals o.a. Paus Gregorius ze doorvoerde in 1582. Voor meer informatie over tijdrekening, zie het artikel over {{Wp|Jaartelling|jaartelling}}. Een restdeling door 7 op een basisdatum geeft de dag in de week, waarbij maandag=0 en zondag=6. Anders gezegd, 1 januari 0001 was een maandag.
*'''D'''ays - de hoeveelste dag van dit jaar;
*'''E'''uropean - de datum in verkort Europees formaat (dd/mm/jj);
*'''M'''onth - de maand in dit jaar, niet afgekorte Engelse naam, bv. "January";
*'''O'''rdered - de datum in formaat jj/mm/dd. Kan dienen om te sorteren, maar het jaartal heeft slechts 2 posities;
*'''S'''orted - vandaar dat dit formaat beter aangepast is om te sorteren: jjjjmmdd;
*'''U'''sa - in Amerikaans formaat: dd/mm/jj;
*'''W'''eekday - de dag van de week in niet afgekorte Engelse tekst, bv. "Saturday".
OORexx biedt ook nog het '''L'''anguage formaat aan, waarbij de datum in lokaal formaat wordt gegeven, bv. 17 januari 2011. Het lokaal formaat wordt in de systeeminstellingen bepaald. Een REXX programma mag geen veronderstellingen maken omtrent het resultaat omdat het programma op een ander systeem in de prak kan lopen als er een andere land-instelling is gekozen.
Kortom, de meest zinvolle formaten zijn N, B, S, D, M en W. Sorteren kan enkel zinvol gebeuren met het S of B formaat. Het B-formaat is dan weer ideaal om met datums te rekenen zoals we verder zullen leren.
Bij vorige eeuwwisseling werd de functie drastisch uitgebreid om de jaar-2000 problematiek te kunnen aanpakken. De datum kan nu variabel zijn (dus niet enkel die van vandaag). Meer nog, de datum kan via de functie worden omgezet van één formaat in een ander waarbij ook scheidingstekens kunnen gekozen worden.
'''date'''(outputformaat,datum,inputformaat[,outputscheiding][,inputscheiding])
De input- en outputformaten zijn diegene wie we hierboven al bestudeerden.
Nu zal de ''datum'' die als 2de parameter is meegegeven, en wiens formaat is bepaald door de derde parameter, naar het ''outputformaat'' worden omgezet. Men kan tevens aangeven welk scheidingsteken er in de input staat, en welke er in de output moet komen. De datum kan in het verleden of de toekomst liggen.
Een moeilijke uitleg, daarom snel over naar voorbeelden om het te begrijpen:
Gisteren = date('Normal',date('B')-1,'B')
In de veronderstelling dat het vandaag 19 november 2011 is, dan mogen we terecht verwachten dat de functie aan ''Gisteren'' de waarde «18 Nov 2011» zal toekennen. Dit is hoe het werkt:
*de eerste parameter bepaalt dat we de datum in het '''N'''ormaal formaat willen terugkrijgen;
*de tweede parameter is de datum die moet worden omgevormd. In dit geval gebruiken we '''date('B')''' om vandaag in '''B'''asisdagen te krijgen. Daar kunnen we dan gemakkelijk één van aftrekken om naar gisteren over te gaan;
*de derde parameter geeft aan in welk formaat de tweede parameter is opgegeven, hier dus het B-formaat.
De functie zal dus de uitkomst van de tweede parameter intern omzetten naar het N-formaat.
Het voorbeeld onderstreept nogmaals het belang van het B-formaat als er moet gerekend worden. Dagen toevoegen of aftrekken van andere formaten kan niet altijd foutloos of is zelfs onmogelijk. '''date('N')-1''' zal bijvoorbeeld een ''bad arithmetic operation'' geven, want date('N') is geen getal.
Uiteraard kan de om te vormen datum uit een variabele gehaald worden. Laten we nog een voorbeeld bekijken:
sdate=19530422 /* Dit is een Sorted datum */
say 'Kris is geboren op' date('W',sdate,'S')',' date(,sdate,'S')
Het antwoord dat we hier mogen verwachten is «Kris is geboren op Wednesday, 22 Apr 1953».
Mooi is dat echter niet. Willen we het volledig in het Nederlands vertalen, dan moeten we wat meer moeite doen, zo bijvoorbeeld:
sdate=19530422 /* Dit is een Sorted datum */
dagen='maandag dinsdag woensdag donderdag vrijdag zaterdag zondag'
maanden='januari februari maart april mei juni',
'juli augustus september oktober november december'
basisdatum=date('B',sdate,'S') /* omzetten van sdate naar basisdatum */
/* Restdeling van basisdatum door 7 geeft een cijfer van 0 tot 6 */
/* waarbij 0 staat voor maandag en 6 voor een zondag */
dagnr=(basisdatum // 7)
dag = word(dagen,dagnr + 1) /* index mag niet nul zijn */
parse var sdate jjjj 5 mm 7 dd /* opsplitsen van sdate */
say 'Kris is geboren op' dag',' dd word(maanden,mm) jjjj
Nu wordt het resultaat «Kris is geboren op vrijdag, 22 april 1953». We kunnen dat nog wat inkorten door het zo te schrijven:
dag=word(dagen,date('B',sdate,'S')//7+1)
say 'Kris is geboren op' dag',' substr(sdate,7) word(maanden,substr(sdate,5,2)) left(sdate,4)
Als besluit geven we nog een aantal voorbeelden waarbij scheidingstekens worden gebruikt. De vierde parameter van de functie bepaalt welk teken in het resultaat moet verschijnen, en de vijfde parameter bepaalt welk teken er in de bron staat. Stel dat het nog steeds 19 november 2011 is, dan geven:
IsoDate = date('S',,,'-') «2011-11-19» (toevoegen scheidingsteken)
bdate = date('B',IsoDate,'S',,'-') «734459» (- is scheidingsteken in input)
mindate = date(,,,'-') «19-Nov-2011»(toevoegen scheidingsteken)
In het eerste geval voegen we mintekens toe aan een Sorted datum (jjjjmmdd). REXX weet waar het moet want het is duidelijk waar jaartal, maand en dag in een '''S'''orted datum staan !
<br>In het tweede geval zetten we die IsoDate weer om naar een Basedate, waarbij we duidelijk maken dat de Sorted input datum mintekens bevat. Argument 4 blijft leeg omdat we in de output geen scheidingsteken willen (wat trouwens niet kan voor een Basedate).
<br>In het derde geval vragen we mintekens toe te voegen in een '''N'''ormale datum.
Voor de volledigheid moeten we ook vermelden dat omzetting van tijden in OORexx ook mogelijk is. Bijvoorbeeld:
s=time('S') ; say time() s «12:39:27 45567»
say time(,s,'S') «12:39:27»
In het tweede statement worden seconden dus omgezet naar een leesbare tijd. Deze mogelijkheid bestaat dus niet in alle REXX implementaties en behoort niet tot de ANSI standaard.
<!----------------------------------------------------------------------------------------------->
=TRANSLATE - karakters vertalen=
'''translate'''(string[,outputtabel | <u>""</u>][,inputtabel | <u>'00'x->'FF'x</u>][,pad | <u>" "</u>])
Translate is eigenlijk een eenvoudige functie, maar kan zo krachtig gebruikt worden dat ze dan voor beginnelingen wat moeilijker onder de knie te krijgen is. Het zal trouwens snel duidelijk worden waarom we ze nu, net na de '''date''' functie bespreken.
In de eenvoudige vorm, waarbij enkel een ''string'' als parameter wordt meegegeven is het nog gemakkelijk: de string wordt naar hoofdletters vertaald.
say translate('Zaterdag 17/12 is het feest') «ZATERDAG 17/12 IS HET FEEST»
say translate('Maandag fèteren we met paté') «MAANDAG FèTEREN WE MET PATé»
Uit deze voorbeelden volgt duidelijk dat enkel de normale karakters a tot z naar hoofdletters worden vertaald.
Maar de naam van de functie laat vermoeden dat we er nog andere vertalingen kunnen mee maken. Willen we bijvoorbeeld accent-karakters vertalen, dan moeten we het als volgt schrijven:
say translate('Ik had een déjà vu ervaring','AE','àé') «Ik had een dEjA vu ervaring»
De tweede en derde parameter kunnen als tabellen worden gezien. Nu wordt niet meer naar hoofdletters vertaald !
REXX gaat nu namelijk voor elk karakter in de string na of het ook voorkomt in de derde parameter, de zogenaamde inputtabel. Indien wel, dan wordt het vervangen door het overeenkomstig karakter uit de tweede parameter, de zogenaamde outputtabel. Indien het niet voorkomt in de inputtabel, dan blijft het karakter onveranderd. Dit verklaart waarom nu nog enkel de "à" en "é" worden vertaald.
Nog een voorbeeld:
zin="Dit is een volzin"
say translate(zin,'ABCDEFGHI_','abcdefghi ') «DIt_Is_EEn_volzIn»
Nu worden enkel de karakters van a tot i naar hoofdletters vertaald.
<p id="XRANGE">Willen we toch het hele alfabet vertalen, moeten we het dan volledig uitschrijven ? Nee, het kan eenvoudiger door middel van de '''xrange''' functie. Deze functie retourneert alle karakters binnen een bepaald bereik.</p>
Dit wetende kunnen we dus nu schrijven:
say translate('Ik had een déjà vu ervaring',xrange('A','Z')||'AE',xrange('a','z')||'àé')
om toch «IK HAD EEN DEJA VU ERVARING» te bekomen.
Noteer dat '''xrange('A','Z')''' niet uitgaat van het alfabet, maar van de hexadecimale waarden van deze letters in de huidige karaktertabel (codepage). Voor ASCII maken we dus een tabel van '41'x t.e.m. '5A'x, terwijl het in EBCDIC een tabel is van 'C1'x t.e.m 'E9'x.
Indien geen ''inputtabel'', ''outputtabel'' noch een pad karakter wordt opgegeven, dan wordt de string naar hoofdletters vertaald zoals we al zagen.
Indien geen ''inputtabel'' is opgegeven doch wel een pad karakter, dan wordt de inputtabel verondersteld gelijk te zijn aan xrange("00"x,"FF"x). De ''outputtabel'' wordt dan verondersteld een nullstring te zijn waaraan een pad karakters zijn toegevoegd. In dit laatste geval wordt dus alles naar het pad karakter vertaald als er geen outputtabel is.
say translate(zin,,"izn","-") «D-t -s ee- vol---»
say translate(zin,"izn",,"-") «-----------------»
Pas op, het minteken staat in de vierde parameter !
We zijn echter nog niet uitgepraat over de '''translate''' functie. Ze kan namelijk ook dienen om de karakters in de string te verplaatsen. Nu wordt het wel wat moeilijker, daarom beginnen we met een eenvoudig voorbeeld:
translate('7890','ABCD','9870') «CBAD»
De eerste drie karakters worden van plaats verwisseld.
In tegenstelling tot het "gewone" gebruik van de '''translate''' functie, staat de string die we willen bewerken nu als tweede parameter. De functie werkt echter nog steeds op dezelfde manier. In ons voorbeeld betekent dat dus:
#Het eerste karakter uit de eerste parameter is "7". Staat dit in de inputtabel ? Ja, en wel op de derde plaats. Dus, we moeten die 7 vertalen naar het derde karakter van de outputtabel, dus C;
#Het tweede karakter is "8". Het staat op de tweede plaats in de inputtabel, dus we moeten het tweede karakter van de outputtabel nemen, dus "B";
#Het derde karakter "9" wordt op dezelfde manier naar "A" vertaald;
#Het laatste karakter "0" wordt "D".
Kortom, onze string "7890" wordt "CBAD", maar voor ons lijkt het alsof de tweede parameter wordt dooreengeschud.
Dit voorbeeld was goed om het principe uit te leggen, maar van weinig praktisch nut. Laten we nu overgaan tot een meer zinvol gebruik van deze techniek. Daarbij gaan we datums van één formaat in een ander omzetten. Dit is een eerste voorbeeld:
say translate('12345678','16-11-1949','12-34-5678') «16111949»
Hiermee bereiken we dat de mintekens uit de datum verdwijnen. Of we nu cijfers gebruiken of andere tekens heeft geen belang. Het volgende statement geeft exact hetzelfde resultaat, maar is er daarom niet echt beter leesbaar op geworden:
say translate('abcdefgh','16-11-1949','ab-cd-efgh')
Toch zullen we met deze manier verderwerken, maar onze vertaaltabellen op een intelligentere manier opbouwen. Als we nu schrijven:
say translate('DdMmEeJj','16-11-1949','Dd-Mm-EeJj')
dan wordt het plots duidelijker hoe het werkt. De posities voor de dag stellen we voor d.m.v. "Dd", die voor maand door "Mm" en die voor het jaartal door "EeJj" (E voor eeuw). Schrijf niet "dd" i.p.v. "Dd" want dan treedt er dubbelzinnigheid op zoals we hier kunnen zien:
say translate('ddmmeejj','16-11-1949','dd-mm-eejj') «11111144»
say translate('ddmmeejj','16-11-1949','Dd-Mm-EeJj') «66119999»
say translate('DdMmEeJj','16-11-1949','dd-mm-eejj') «D1M1C1J4»
Bij een zuivere permutatie, moeten de tekens van de eerste parameter uniek zijn, anders worden tekens uit tweede parameter meermaals herhaald.
In voorgaande voorbeelden haalden we tekens weg. Maar het is ook mogelijk tekens toe te voegen of te veranderen. In volgend voorbeeld maken we een ISO-datum (zie {{Wp|ISO_8601|ISO 8601}} voor meer informatie):
say translate('EeJj-Mm-Dd','16/11/1949','Dd/Mm/EeJj') «1949-11-16»
Hier is het belangrijk dat de toegevoegde tekens niet in het derde argument voorkomen.
Laten we de werking bij permutaties nog eens duidelijk formuleren:
*Parameter 1 bevat het gewenste formaat van het resultaat;
*Parameter 2 bevat de te permuteren gegevens;
*Parameter 3 beschrijft het formaat van de te permuteren gegevens.
Om te eindigen geven we een nog iets langer voorbeeld:
say translate('EeJjMmDd.HhNnSs','16/11/1949 12:14:03','Dd/Mm/EeJj Hh:Nn:Ss') «19491116.121403»
Daar we al "Mm" gebruiken als aanduiding voor de maand moeten we voor de minuten spijtig genoeg iets anders kiezen om de dubbelzinnigheid te vermijden. Het werd dan maar "Nn".
'''Translate''' is zeker niet de gemakkelijkste functie. Het is daarom goed om dit deel nog eens te herlezen om na te gaan of alles is begrepen.
{{Bericht
|bericht=Met deze functie kunnen we namelijk veel korter coderen. Kijk maar eens hoeveel SUBSTR e.d. men nodig heeft om bovenstaande translate te vervangen.
datumTijd='16/11/1949 12:14:03'
say substr(datumTijd,7,4)||substr(datumtijd,4,2)||left(datumtijd,2)||'.'||,
substr(datumtijd,12,2)||substr(datumtijd,15,2)||right(datumtijd,2)
|type=info}}
Vergeet ook niet een commentaartje toe te voegen om te zeggen wat je bereiken wil, bv. '''/* hervorm datum naar jjjjmmdd.uummss */'''
<!----------------------------------------------------------------------------------->
=INTERPRET - tweemaal interpreteren=
'''INTERPRET''' uitdrukking
Dank zij het '''interpret''' bevel kan een REXX programma een uit te voeren statement dynamisch aanmaken en dan laten uitvoeren.
Het komt er in feite op neer dat nieuwe statements tijdens uitvoering aan het programma worden toegevoegd.
De ''uitdrukking'' moet uiteraard resulteren in geldige statements. Alle bevelen zijn toegelaten, maar de DO- en SELECT-blokken moeten volledig zijn, dus hun END bevatten. Het "RexxTry" hulpmiddel dat we in het begin van dit boek bespraken doet niets anders dan elke lijn die de gebruiker intoetst interpreteren.
Een paar voorbeelden zullen snel alles duidelijk maken:
/* INTERPRET voorbeeld */
data="Dmitri"
interpret data "= 4"
Dit is wat er zal gebeuren:
#de uitdrukking '''data "= 4"''' resulteert in de string '''«Dmitri = 4»'''
#REXX interpreteert deze string als een statement
#het resultaat is dat variabele ''Dmitri'' de waarde «4» krijgt.
/* Een tweede INTERPRET voorbeeld */
data='do 3; say "Gegroet allemaal !"; end'
interpret data
Het resultaat zal zijn dat de zin «Gegroet allemaal !» driemaal zal worden afgedrukt. Hier zien we dat het DO-blok volledig moet zijn.
De grote moeilijkheid voor een beginnend REXX programmeur is te weten welk deel van de uitdrukking als constante moet worden geschreven. Bekijk deze voorbeelden:
rond="vierkant"
var="rond"
interpret say "Hello, de zon is" var «Error 37: Unexpected ","»
'''Interpret''' werkt in 2 stappen. Na de eerste stap wordt de uitdrukking «SAY Hello, de zon is rond». Het bevel '''say''' krijgt geen constante als input, en die komma stoort dan ook geweldig...
rond="vierkant"
var="rond"
interpret 'say' "Hello, de zon is" var «Error 37: Unexpected ","»
Dit helpt niet veel, het probleem ligt niet bij ''say''. Dit is wat het moet zijn:
rond="vierkant"
var="rond"
interpret 'say "Hello, de zon is"' var «Hello, de zon is vierkant»
Dus, de eerste stap moet leiden tot een geldig statement. Daarom moet alles wat niet variabel is als constante worden geschreven. De volgende oplossing zou ook werken...
rond="vierkant"
var="rond"
interpret say '"Hello, de zon is"' var «Hello, de zon is vierkant»
...tot zolang iemand het in zijn hoofd krijgt een variabele ''say'' te initialiseren...
Kortom, de levensbelangrijke regel die we al meermaals tegenkwamen geldt hier evenzeer.
Opmerkingen:
*Labels kunnen niet gebruikt worden in de uitdrukking;
*Door "Trace R" of "Trace I" te gebruiken zal het sneller duidelijk worden welk resultaat men zal bekomen;
<!--------------------------------------------------------------->
=VALUE - waarde van een veranderlijke variabele=
'''value'''(symbool[,nieuwe waarde])
De functie zal de waarde van het - dikwijls dynamisch opgebouwd - symbool teruggeven, en er optioneel daarna een ''nieuwe waarde'' aan toekennen.
Daar waar '''interpret''' een interpretatie in twee stappen toelaat zal de '''value''' functie een waardebepaling in twee stappen doen.
Het symbool moet dus duidelijk resulteren in een geldige naam voor een variabele. Kleine karakters worden wel omgezet naar hoofdletters.
Laten we onmiddellijk een aantal voorbeelden bestuderen, waarbij we veronderstellen dat:
a33=7 ; k=3 ; Dmitri="K" ; lijst.5="Hallo"
Nu voeren we deze statements na elkaar uit:
-1- say value('a'k) «A3»
-2- say value('a'k||k) «7»
-3- say value("Dmitri") «K»
-4- say value(Dmitri) «3»
-5- say value(Dmitri,5) «3» en K wordt 5
-6- say value(Dmitri) «5»
-7- say value('lijst.'k) «Hallo»
Bespreking lijn per lijn:
#In een eerste stap interpreteert REXX de parameter, en dat levert de waarde ''a3'' op. '''Value''' zoekt nu naar de waarde van variabele ''a3'', maar die is niet geïnitialiseerd en dus is het eindresultaat «A3»;
#Elke ''k'' wordt nu een 3, en alles samen wordt het symbool dus ''a33'' waarvan '''value''' ontdekt dat het de waarde «7» heeft;
#De constante "Dmitri" verwijst inderdaad naar een variabele met waarde «K»;
#Nu interpreteert REXX eerst de variabele ''dmitri'' tot haar waarde "K" en '''value''' maakt er uiteindelijk «3» van;
#Zelfde operatie, maar nu krijgt de variabele "K" ook nog een waarde 5. Het toekennen van een nieuwe waarde zouden we niet aanraden omdat het de dingen nodeloos compliceert;
#Als gevolg van het toewijzen van de nieuwe waarde in vorig statement, retourneert de functie dus nu «5».
#Vermits variabele ''k'' de waarde 5 heeft moet de functie de waarde van variabele "lijst.5" teruggeven, en die is inderdaad «Hallo».
Met het derde en vierde statement maken we weer eens duidelijk dat het belangrijk is te weten wat variabel is in de parameter en wat niet. Het is niet anders dan voor andere functies waar de uitdrukkingen die als parameter worden gegeven eerst door REXX worden geïnterpreteerd alvorens de functie zelf op te roepen. Het verwarrende hier is dat de functie a.h.w. nogmaals een interpretatie doet.
Wanneer komt deze functie nu van pas ? We maken het duidelijk met een voorbeeld:
adreslijn1='Jan Klaas'
adreslijn2='Hoogweg 7'
adreslijn3='ErgensTeVelde'
adreslijn4='België'
Men kan nu deze waarden als volgt opvragen en bewerken:
do i=1 to 4
say value('addreslijn'i)
end
Onmiddellijk met een stem werken is uiteraard wel eenvoudiger:
adreslijn.1='Jan Klaas'
adreslijn.2='Hoogweg 7'
adreslijn.3='ErgensTeVelde'
adreslijn.4='België'
do i=1 to 4 ; say adreslijn.i ; end
Er zijn echter minder voor de hand liggende gevallen, zoals dit:
adresNaam='Jan Klaas'
adresStraat='Hoogweg 7'
adresDorp='ErgensTeVelde'
adresLand='België'
Nu moeten we iets schrijven in de aard van:
elementen="Naam Straat Dorp Land"
do i=1 to words(elementen)
say value('Adres'word(elementen,i))
end
Maar weer eens, we hadden ook een stem kunnen gebruiken, waardoor we '''value''' hadden kunnen vermijden.
adres.straat='Hoogweg 7'
etc...
Dat werkt perfect, tot iemand het in zijn hoofd krijgt om te zeggen straat='LAND' zodat een Say adres.straat "België" op het scherm laat zien. Daarom gebruiken kenners speciale staarten, die nooit geldig variabele kunnen zijn:
adres.0Naam='Jan Klaas'
adres.0Straat='Hoogweg 7'
adres.0Dorp='ErgensTeVelde'
adres.0Land='België'
Kortom, indien we een variabele naam dynamisch opbouwen laat de functie '''value''' toe de waarde op te vragen. Indien we echter een volledig statement dynamisch opbouwen dan biedt '''interpret''' de mogelijkheid dat statement te interpreteren.
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Parse in detail
|huidige =Nog bevelen en functies
|volgende=Voorbeeld 2}}
{{Sub}}
282egiwmiy9cg0kvohg2gly9sl9mi7q
Programmeren in REXX/Een beetje OORexx
0
28936
428217
425903
2026-05-20T06:10:54Z
Erik Baas
2193
lf
428217
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
OORexx biedt toch een paar niet te versmaden extra mogelijkheden zonder dat de techniek van object georiënteerd programmeren moet aangeleerd worden.
In dit hoofdstuk behandelen we
*het maken van een extern functiepakket
*het gebruik van eenvoudige (en enigszins beperkte) grafische schermpjes.
Verdere informatie kan gevonden worden in het boek '''OODialog Reference''' dat na installatie als bestand ''oodialog.pdf'' terug te vinden is in map ''c:\Program Files\ooRexx\doc\''.
=Extern functiepakket maken=
Met OORexx is het wel mogelijk een extern functiepakket te maken waarbij het uitvoeren van een functie niet minder performant is dan indien ze intern zou geschreven zijn. Er kan wel een kleine extra tijd nodig zijn om het pakket te laden. Het grootste voordeel is echter dat we de functies niet steeds moeten toevoegen in elke programma dat er gebruik van wil maken.
Een functiepakket "MijnRoutines.rex" ziet er dan bijvoorbeeld als volgt uit:
'''::ROUTINE CHOP PUBLIC'''
/*+---------------------------------------------------------------+*/
/*| CHOP(string,lengte<,string2>) |*/
/*| kapt een string af aan bepaalde lengte |*/
/*| "string2" wordt er desgevallend achtergeplakt |*/
/*+---------------------------------------------------------------+*/
call trace 'Off'
if length(arg(1))<=arg(2) then return arg(1)
select
when arg()=2 then return left(arg(1),arg(2))
when arg()=3 then return left(arg(1),arg(2)-length(arg(3)))||arg(3)
end
'''::ROUTINE PAD PUBLIC'''
/*+---------------------------------------------------------------+*/
/*| PAD(string,lengte<,pad<,L|R>>) |*/
/*| maakt een string van opgegeven lengte |*/
/*+---------------------------------------------------------------+*/
call trace 'Off'
if length(arg(1))>=arg(2) then return arg(1)
select
when arg()=2 then return left(arg(1),arg(2))
when arg()=3 then return left(arg(1),arg(2),arg(3))
when arg(4)='L' then return left(arg(1),arg(2),arg(3))
when arg(4)='R' then return right(arg(1),arg(2),arg(3))
end
Het oproepend programma kan er dan als volgt gebruik van maken:
say chop("Dit is een lange tekst",10,'...') «Dit is een...»
say pad("Een tekst",18,'-') «Een tekst---------»
say pad("Een tekst",18,'-','R') «---------Een tekst»
Al lijken deze functies op '''left''' en '''right''', ze verschillen toch in die zin dat '''chop''' de string nooit zal verlengen terwijl '''pad''' de string nooit zal inkorten.
'''::REQUIRES "D:\RexxProgrammas\MijnRoutines.rex"'''
De zogenaamde '''directives''' zijn hier van belang. Het '''::REQUIRES''' directive zal aan REXX duidelijk maken dat het desbetreffend bestand moet geladen worden. Daarin vindt hij dan '''::ROUTINE''' directives die een naam geven aan een functie, of beter methode om de OO terminologie te gebruiken. Deze functies worden als publiek gedefiniëerd.
<!------------------------------------------------------------>
=Grafische schermpjes=
De nu volgende functies kunnen maken dat het programma geen opdrachtprompt meer nodig heeft. Of beter gezegd, de opdrachtprompt kan geminimaliseerd blijven. Als voor het programma een snelkoppeling wordt gemaakt kan het dus gaan lijken op een klassiek Windows programma.
Maak daarom een kopie van de opdrachtprompt. Open de eigenschappen en vul als "doel" voor de snelkoppeling het volgende in:
"C:\Program Files\ooRexx\rexx.exe" "D:\RexxProgrammas\MijnProgramma.rex"
en laat het "uitvoeren" in een geminimaliseerd venster. Op het tabblad "Algemeen" kan je een sprekende titel geven, en in de map "C:\Program Files\OORexx\" kan het icoontje OORexx.ico gekozen worden om niet dat van de opdrachtprompt te blijven behouden.
Indien OORexx niet ten volle wordt benut blijven de mogelijkheden echter beperkt zoals we zullen zien.
==Functies van het OODialog pakket==
OORexx levert een aantal extra functies als toevoeging voor de standaard functies die we vroeger aanleerden.
Deze functies zitten in OODialog.dll en moeten geactiveerd worden met:
call RxFuncAdd "InstMMFuncs","OODialog","InstMMFuncs"
call "InstMMFuncs"
Dit is de lijst van de functies uit dit pakket:
===InfoMessage===
'''InfoMessage'''(bericht)
Een pop-up schermpje verschijnt en toont de opgegeven ''tekst''. Het schermpje heeft een OK-knop. De titel is "Information" en er is een icoontje dat duidt op een bericht.
call InfoMessage "Welkom in de wereld van REXX"
[[Bestand:InfoMessage.jpg|Voorbeeld]]
===ErrorMessage===
Zoals een InfoMessage functie, maar met als titel "Error" en een icoontje dat op een fout wijst.
===YesNoMessage===
Zoals een InfoMessage, maar nu zijn er twee knoppen, "Yes" en "No". We kunnen desgevallend ook opgeven welke knop standaard actief is (de focus heeft).
'''YesNoMessage'''(bericht[,knop])
Het antwoord is 1 als "Yes" is gekozen, anders is het 0. Bijvoorbeeld:
if \YesNoMessage("Wil je hiermee verder gaan ?","No") then exit
[[Bestand:YesNoMessage.jpg|Voorbeeld]]
===GetScreenSize===
'''GetScreenSize'''()
Retourneert een string waarin 4 waarden staan:
#breedte van de dialoog in dialoogeenheden
#hoogte van de dialoog in dialoogeenheden
#breedte van het fysisch scherm in pixels
#hoogte van het fysisch scherm in pixels
===PlaySoundFile===
'''PlaySoundFile'''(wav-bestand[,asynchroon])
Speelt de muziek (geluid) van het wav-bestand (enkel deze vorm is toegelaten, dus geen MP3). Als de parameter ''asynchroon'' als "Yes" is opgegeven speelt de muziek verder terwijl het programma loopt.
Willen we continu de muziek herhalen, dan gebruiken we de functie '''PlaySoundFileInLoop'''. Om die muziek dan weer te stoppen gebruiken we de functie '''StopSoundFile()'''.
===GetFileNameWindow===
'''GetFileNameWindow'''(bestand,handle,filter,open_of_save,titel,standaardextensie,multiselectie,scheiding)
Presenteert een verkenners-venstertje waarop één of meer bestanden kunnen worden gekozen. Het resultaat komt in een string terug.
Alle parameters zijn optioneel:
*'''bestand''': een vooraf geselecteerde bestandsnaam of map. Indien geen ''bestand'' is opgegeven, bepaalt het systeem in welke map men begint, meestal is dit de map die de laatste keer is gebruikt, of indien Windows er geen heeft onthouden vertrekt men in de map "Mijn Documenten". Jokers kunnen gebruikt worden in de bestandsnaam.
*'''handle''': de handle van het oproepend scherm. Dit hebben we normaal gezien nergens voor nodig in een eenvoudig REXX programma.
*'''filter''': een masker. Dit is opgebouwd uit een reeks paren die van elkaar gescheiden zijn door '00'x. Elk van de paren bestaat uit een beschrijvende tekst en een masker, weer van elkaar gescheiden door een '00'x. Standaard is de filter de volgende:
"Text files (*.txt)"'0'x"*.TXT"'0'x"All files (*.*)"'0'x"*.*"
*'''open_of_save''': kan de waarden 1 of 0 aannemen. De waarde 1 betekent "Open" en is de standaardwaarde. De waarde 0 betekent "Save as".
*'''titel''': titel van het schermpje
*'''standaardextensie''': de extensie die aan de bestandsnaam moet worden toegevoegd indien er geen extensie is opgegeven.
*'''multiselectie''': indien 1 wordt opgegeven kunnen meerdere bestanden tegelijk worden geselecteerd.
*'''scheiding''': is het teken dat tussen de bestandsnamen in het antwoord moet worden gezet. Dit is belangrijk als men verwacht dat er spaties in de namen kunnen staan.
Voorbeeld:
bestanden=FileNameDialog("D:\RexxProgrammas\*.rex",,"REXX programma's (*.rex)"'0'x"*.REX",1,,,1,"#")
Later bespreken we een uitgebreider voorbeeld.
===SleepMS===
'''SleepMS'''(milliseconden)
Deze functie stopt de uitvoering gedurende een aantal milliseconden.
===WinTimer===
'''WinTimer'''(bevel,milliseconden)
Het bevel kan "Start","Stop" of "Wait" zijn. De functie activeert, stopt of wacht voor een Windows timer.
timer=WinTimer("START",300) /* 0,3 seconden */
call WinTimer "WAIT,timer /* wachten op tijdsignaal... */
stop = WinTimer("STOP",timer) /* vroegtijdig stoppen */
Standaard heeft REXX slechts één chronometer. Hiermee kunnen we meer chronometers starten, en wachten op een tijdssein.
<!--------------------------------------------------------------------------------------->
==Publieke OORexx routines==
De functies die we net zagen bestaan ook als zogenaamde publieke OORexx routines. Om deze functies te kunnen gebruiken moet volgende directive helemaal achteraan het REXX programma worden toegevoegd om de class-library te benaderen:
::REQUIRES "OODPLAIN.CLS"
U zal merken dat de beschrijving van de functies niet zelden gelijklopend is aan diegene die we hierboven hebben gezien, doch in sommige gevallen zal het mogelijk zijn de standaardwaarden of titels van de schermpjes zelf te kiezen, zodat ze niet steeds in het Engels moeten blijven. Daarom zullen sommige parameters nu anders worden geschreven.
Daarbovenop zijn er ook nog een reeks nieuwe, zeer nuttige functies (we moeten eigenlijk spreken van methodes). Om de verwarring met de vorige functies te vermijden adviseren we enkel de hier beschreven publieke methoden te gebruiken.
Dit is de lijst van publieke routines:
===PLAY - geluid afspelen===
'''Play'''(wav-bestand[,optie])
Speelt een geluidsbestand af (enkel WAV is voorzien). Met optie '''yes''' wordt het geluid asynchroon afgespeeld - het programma gaat verder. De optie '''loop''' laat toe het geluid asynchroon en continu te herhalen.
===INFODIALOG - een informatieschermpje===
'''InfoDialog'''(tekst)
Een schermpje met de opgegeven ''tekst'' verschijnt als pop-up. Het heeft een OK-knop.
===ERRORDIALOG - scherm met foutbericht===
'''ErrorDialog'''(foutbericht)
Het foutbericht wordt in een pop-up schermpje getoond. Er is een OK-knop en een icoontje dat duidt op een fout.
===ASKDIALOG - een eenvoudige vraag stellen===
'''AskDialog'''(vraag[,standaardknop])
De vraag wordt in een pop-up schermpje getoond. Er is een YES-knop en een NO-knop. Men kan d.m.v. de opties "Yes" of "No" aanduiden welke knop standaard geselecteerd moet zijn, zodat op de Enter-toets drukken deze keuze onmiddellijk bevestigd. Het antwoord van de functie is 1 als YES-knop is ingedrukt, anders is het 0.
Voorbeeld:
if \AskDialog("Gaan we hier toch mee verder ?","Yes") then exit
===FileNameDialog - selecteren van een bestand===
'''FileNameDialog'''([selbestand][,ouder][,masker][,laden_of_bewaren][,titel][,standaardextensie][,multi][,scheiding])
Deze functie opent een scherm waarop één of meer bestanden kunnen worden geselecteerd. De namen van deze bestanden vormen het antwoord van de functie.
De parameters zijn:
*'''selbestand''' - een eventueel voorgeselecteerd bestand of map. Als deze map niet is opgegeven zal het besturingssysteem bepalen in welke map men begint te zoeken (meestal de map die een vorige maal was geselecteerd).
Als wel een pad is opgegeven, maar het bestaat niet, dan is het alsof er geen pad is opgegeven. Jokers in bestandsnamen zijn toegelaten.
*'''ouder''' - een handle (identificatie) van een bovenliggend scherm. Wij hebben dit niet nodig.
*'''masker''' - paren filters die toelaten zich te beperken tot bepaalde soorten bestanden. Indien hier niets is opgegeven, is het standaardfilter gelijk aan «'''"Text Files (*.TXT)"'00'x"*.TXT"'00'x"All Files (*.*)"'00'x"*.*"'''», waarbij de gebruiker dus kan kiezen tussen tekstbestanden van het type *.txt, of alle bestanden (*.*). De scheiding tussen de verschillende paren moet met een '00'x karakter gebeuren.
*'''laden_of_bewaren''' - "LOAD" bepaalt dat een "File-Open" dialoog moet worden getoond (dit is de standaardwaarde). "SAVE" bepaalt dat een "File-Save" dialoog moet worden getoond.
*'''titel''' - vervangt de anders standaardtitels "Open a File" of "Save File as".
*'''standaardextensie''' - de extensie die aan het bestand moet worden toegevoegd als er geen is opgegeven. De standaardwaarde is "TXT".
*'''multi''' - meerdere bestanden kunnen worden geselecteerd mits "MULTI" op te geven. Het antwoord van de functie wordt dan «pad file1 file2 file3...»
*'''scheiding''' - een eventueel scheidingskarakter tussen de namen van de bestanden. Dit is nodig als men spaties in de namen verwacht. Met bijvoorbeeld "#" als scheiding krijgt het antwoord dan de vorm «pad#file1#file2 file3...»
Voorbeeld:
bestanden=FileNameDialog("D:\RexxProgrammas\*.rex",,"REXX programma's (*.rex)"'0'x"*.REX","LOAD",,,"MULTI","#")
if bestanden<>"" then do
if pos("#",bestanten)=0 then do
bestand.0=1 ; bestand.1=bestanden
end; else do
parse var bestanden pad "#" bestanden
do i=1 while bestanden<>''
parse var bestanden naam '#' bestanden
bestand.i=pad"\"naam
end
bestand.0=i-1
end
end; else bestand.0=0
===InputBox - een waarde opvragen===
'''InputBox'''(vraag,titel[,standaardwaarde][,breedte])
Toont een schermpje met één inputveld. Het schermpje heeft de opgegeven ''titel'' en de ''vraag'' staat net boven het inputveld. Er zijn 2 knoppen: OK en Cancel. De functie geeft de tekst die de gebruiker invult terug, of een nullstring als Cancel-knop werd gebruikt. De ''breedte'' van het inputveld kan worden opgegeven, maar deze is in dialoogeenheden, niet in karakters. Het is daarom nuttig de breedte van de gebruikte font te kennen indien men het inputveld een bepaalde lengte wil geven.
naam=InputBox("Hoe heet je ?","Een antwoord graag")
if naam<>"" then say "Je naam is" naam
[[Bestand:InputBox.jpg|Voorbeeld]]
===PasswordBox - een paswoord vragen===
'''PasswordBox'''(vraag,titel[,standaardwaarde][,breedte])
Deze functie gebruikt de onderliggende InputBox methode om een paswoord te vragen. Het paswoord wordt weggestopt achter sterretjes.
===IntegerBox - een geheel getal opvragen===
'''IntegerBox'''(vraag,titel[,standaardwaarde][,breedte])
Deze functie is ook een afgeleide van de InputBox methode, en aanvaardt enkel een positief of negatief '''geheel''' getal als input.
===MultiInputBox - meerdere waarden opvragen===
'''MultiInputBox'''(vraag,titel,labels.,data.[,breedte])
Deze methode laat toe meer dan één waarde op te vragen. De labels van de velden worden in een stem gezet. Het eerste element is de label voor het eerste veld, enzovoort.
De resultaten komen in een ''data.'' stem. Hiervan moeten de elementen beginnen aan nummer 101. De huidige waarde van de resultaatvelden worden op het schermpje getoond.
Dit is een voorbeeld:
lab.1='Type fotobestanden' ; lab.2='Te analyseren disken'
lab.3='Resultaatsbestand'
addr.101="JPG" ; addr.102="C: D:" ; addr.103="D:\Fotolijst.txt"
dlg = '''.MultiInputBox~new'''("Geef nodige parameters",,
"Parameters", lab., addr.,250)
if '''dlg~execute''' = 1 then do
fototype=dlg~typefotobestanden
drives=dlg~teanalyserendisken ; outputfile=dlg~resultaatsbestand
end; else call exit 28,'Programma onderbroken'
Merk op dat we nu de methode moeten initialiseren en daarna uitvoeren. Dit is OORexx syntaxis. De antwoorden van de gebruiker komen in velden die de genoemd zijn naar de labels, maar zonder de spaties. Ze zijn niet hoofdlettergevoelig, maar moeten wel juist geschreven zijn.
[[Bestand:MultiInputBox1.jpg|Voorbeeld]]
<br>Er is een klein schoonheidsfoutje op dit schermpje. De tekst bij het tweede veld is gesplitst en gedeeltelijk onleesbaar. De oplossing is om de allereerste label een breedte te geven die groot genoeg is voor alle volgende labels. We voegen daarom voldoende spaties toe bij lab.1 en bekomen:
[[Bestand:MultiInputBox2.jpg|Voorbeeld]]
<br>Een alternatieve manier om bovenstaande te schrijven is de volgende:
velden="fototype drives outputfile"
res='''MultiInputBox'''("Geef de nodige parameters",,
"Parameters",,
.array~of("Type fotobestanden ","Te analyseren disken","Resultaatsbestand"),,
.array~of("jpg","D E","CSV"),250)
if res \= .Nil then
do input over res
parse var velden veld velden
interpret veld"=input"
end
In dit geval werken we werkelijk met arrays. Ook het '''do''' bevel heeft een nieuwe vorm: "loop '''over''' alle elementen van de array". Dit zijn mogelijkheden die enkel door OORexx worden geboden. Indien uw programma op andere computers moet kunnen uitgevoerd worden is deze versie van REXX daar dus ook nodig.
===ListChoice - kiezen uit een lijst===
'''ListChoice'''(vraag,titel,.array~of(keuze1,keuze2,...[,breedte][,hoogte][,standaardkeuze])
Deze functie toont een selectieschermpje met de verschillende ''keuze''-mogelijkheden. De ''standaardkeuze'' is daarbij al geselecteerd, als er een is opgegeven. Nu kunnen zowel breedte als hoogte van het selectieschermpje bepaald worden.
say ListChoice("Wanneer kan je naar de tandarts komen ?",,
"Afspraakdag",,
.array~off("Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag"),,
100,100,"Woensdag")
===MultiListChoice - meerdere keuzes uit een lijst===
'''MultiListChoice'''(vraag,titel,.array~of(keuze1,keuze2,...[,breedte][,hoogte][,standaardkeuzes])
Dit is een variatie op de ListChoice methode. De standaardkeuzes zijn een lijst van getallen die overeenkomen met de posities in de lijst van mogelijke keuzes.
dagen=MultiListChoice("Welke dagen kan je komen ?",,
"Afspraakdag",,
.array~of("Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag"),,
100,100,"2 4")
if dagen <> .Nil then
do dag over dagen
say "Mogelijke afspraakdag=" dag
end
[[Bestand:MultiListChoice.jpg|Voorbeeld]]
===CheckList - een keuze in een lijst afvlaggen===
'''CheckList'''(vraag,titel,.array~of(keuze1,keuze2,...)[,breedte][,max_in_kolom])
Deze functie presenteert een lijst waarin één of meer elementen kunnen worden afgevlagd. De parameter ''max_in_kolom'' bepaalt hoeveel keuzes onder elkaar moeten komen alvorens over te gaan tot een nieuwe kolom.
Voorbeeld:
dagen=.array~of("Maandag","Dinsdag","Woensdag","Donderdag","Vrijdag")
afspraken=CheckList("Welke dagen kan je komen ?","Afspraken",dagen)
if afspraken <> .Nil then do i = 1 to afspraken~items
if afspraken[i] then say "Je kan op" dagen[i] "komen"
end
[[Bestand:CheckList.jpg|Voorbeeld]]
<br>Nogmaals, merk op dat we hier werkelijk met arrays werken, en niet met stems. Dit kan enkel met OORexx.
===SingleSelection - unieke keuze uit een lijst===
'''SingleSelection'''(tekst,titel,array~of(keuzes),[breedte][,max_in_kolom])
Nu presenteert de functie een lijst met radio-buttons waaruit de gebruiker er slechts één kan kiezen.
maanden=.array~of("Jan","Feb","Mar","Apr","Mei","Jun",,
"Jul","Aug","Sep","Oct","Nov","Dec")
maand=SingleSelection("Kies je maand","Geboren in",maanden,12,,6)
say "Je bent dus geboren in de maand" maanden[maand]
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Bestanden beheren
|huidige =Een beetje OORexx
|volgende=Voorbeeldprogramma's}}
{{Sub}}
68ecqx3tbnchefe769nj9a5a4lmyj9o
Programmeren in REXX/Voorbeeld 2
0
28961
428212
425905
2026-05-20T06:10:43Z
Erik Baas
2193
lf
428212
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
Ons tweede uitgewerkt programma is handig om na te gaan welke conversies kunnen werken en welk resultaat we mogen verwachten.
We leerden de conversiefuncties kennen in [[Programmeren in REXX/Functies deel 2#Omzetten van formaten]]. Het is echter niet altijd zeer intuïtief om te weten welke functie tot het beoogde resultaat leidt.
Een alfabetisch karakter omzetten naar een decimaal getal (C2D) lukt al bijvoorbeeld niet. En, moeten we het karakter "A" naar hexadecimaal of naar decimaal omzetten om zijn plaats in de karaktertabel te kennen ? Hoe kan het karakter "A" binair worden voorgesteld ? Enzovoort. Al deze vragen worden op een overzichtelijke manier beantwoord met dit programmaatje.
{{Code| | Taal= REXX | Titel= XtoX.rex | Code= <pre>
1 | /*****************************************************************
2 | Dit programma toont alle REXX conversie functies (bv. C2X)
3 | +-----------------------------------------------------------+
4 | | formaat: | XTOX waarde |
5 | +-----------------------------------------------------------+
6 | Waarde kan ook in hexadecimaal formaat gegeven worden '..'X
7 | Probeer bijvoorbeeld XTOX 15 of XTOX 'F1'X
8 | 18 Jul 1989: creatie
9 | 20 Dec 2000: B2X en X2B functies toegevoegd
10 | ******************************************************************/
11 | parse arg arg . 1 kar1 2 /* Argument ophalen */
12 | hex=0 /* veronderstel geen hexadecimale notatie */
13 | if kar1="'" | kar1='"' then /* als begin een ' of " is */
14 | if translate(right(arg,1))='X' then /* en rechts een X */
15 | parse value 1 translate(arg,"'",'"'),
16 | with hex arg /* vertalen en hex=1 */
16 |
17 | if hex then do /* als hexadecimaal is */
18 | parse var arg "'" arg "'" /* karakters er uithalen */
19 | if \datatype(arg,'X') then do /* verifiëren of geldig X */
20 | say '"'arg'" is geen geldige hex data' ; exit 5;end
21 | arg=x2c(arg) /* omzetten naar karakter */
22 | end
23 | /* Nu hebben we geldige karakters, dus alle conversies proberen */
24 | call test C2D
25 | call test C2X
26 | call test D2C
27 | call test D2X
28 | call test X2C
29 | call test X2D
30 | call test X2B
31 | call test B2X
32 | exit
33 | /* Functie TEST gaat na of conversie werkt en toont resultaat */
34 | TEST: parse arg functie /* Welke conversie ? */
35 | signal on syntax /* intercepteer syntax fouten */
36 | interpret "val="functie"(arg)" /* voer uit */
37 | say left(functie'('arg')='val,20)left("=X'"C2X(val)"'",30)
38 | return
39 | /* SYNTAX procedure wordt opgeroepen als conversie mislukt */
40 | SYNTAX:
41 | say functie'('arg')=onmogelijk' /* zeg dat het fout is */
42 | return
</pre>}}
*'''1''' tot '''10''': mooie inleidende commentaar voor het programma. Ook historiek van veranderingen.
*'''11''': ophalen van het argument, waarbij eerste karakter in ''kar1'' wordt gezet;
*'''13''': als links een ' of een " staat kunnen we te doen hebben met een hexadecimale notatie;
*'''14''': maar dan moet rechts een "X" staan;
*'''15''': dan zetten we hex=1 en vertalen we een eventuele " in '. Gewoon altijd het argument vertalen mag niet, want dan zou het argument geen ' of " meer mogen zijn;
*'''17''': als we nu een hexadecimale notatie hebben...
*'''18''': halen we de hexadecimale karakters eruit...
*'''19''': we gaan na of de karakters geldige hexadecimale karakters zijn, en...
*'''20''': tonen foutbericht en stoppen de procedure met code 5 als dat niet het geval is.
*'''21''': anders zetten we de hexadecimale karakters om naar gewone karakterstring;
*'''24''': nu roepen we een '''test''' subroutine op, één voor één met de namen van de mogelijke conversiefuncties;
*'''34''': de functie pikt de naam van de conversiefunctie op;
*'''35''': dit is de voornaamste regel in deze procedure. Door een '''signal on syntax''' zetten we de detectie van syntaxis fouten aan. Indien een fout wordt ontdekt springen we naar het label ''syntax:'';
*'''36''': omdat we de naam van de functie als variabele binnenkregen moeten we een '''interpret''' bevel gebruiken om de functie op te roepen. Sommige conversies zijn echter niet toegelaten, voornamelijk als een niet numerieke string een getal zou moeten worden via de D2... functies;
*'''37''': heeft de functie wél een resultaat gegeven, dan kunnen we dat afdrukken, en de functie beëindigen;
*'''40''': de syntax: routine wordt dus opgeroepen bij een ongeldige conversie. We melden dit ook en keren tenslotte ook terug naar de hoofdroutine.
Meer over '''signal on syntax''' leren we in het hoofdstuk [[Programmeren in REXX/Debugging|Debugging]].
Laten we naar een paar keer het programma uitvoeren:
C:\Users\Dmitri>'''rexx d:\RexxProgrammas\xtox "42"x'''
C2D(B)=66 =X'3636'
C2X(B)=42 =X'3432'
D2C(B)=onmogelijk
D2X(B)=onmogelijk
X2C(B)=♂ =X'0B'
X2D(B)=11 =X'3131'
X2B(B)=1011 =X'31303131'
B2X(B)=onmogelijk
Onze hexadecimale waarde '42'x is in het begin van het programma als dusdanig herkend en omgezet naar het karakter "B". Dit karakter proberen we nu op alle mogelijke manieren om te zetten. Het is geen numeriek getal, dus dat de omzetting van decimaal mislukt was te verwachten. Merk ook op dat het nuttig is zowel de karakterwaarde van het resultaat als de hexadecimale notatie ervan te tonen. We zien inderdaad dat X2C(B) een raar karakter produceert. Hexadecimaal heeft het de waarde '0B'x, en dat ligt in de reeks controlekarakters. Als we het programma met karakter "A" als parameter uitvoeren, hebben we een mooi voorbeeld van wat er kan gebeuren:
C:\Users\Dmitri>'''rexx d:\RexxProgrammas\xtox A'''
C2D(A)=65 =X'3635'
C2X(A)=41 =X'3431'
D2C(A)=onmogelijk
D2X(A)=onmogelijk
X2C(A)=
=X'0A'
X2D(A)=10 =X'3130'
X2B(A)=1010 =X'31303130'
B2X(A)=onmogelijk
Bij de X2C omzetting bekomen we de waarde '0A'x en dat is een Line-Feed... dus we gaan inderdaad naar de volgende lijn om het resultaat te tonen, en het alignement van de tekst gaat verloren.
In het begin van het hoofdstuk vroegen we ons af hoe we de binaire voorstelling van het karakter "A" konden bekomen. Wel, uit deze resultaten kunnen we besluiten dat X2B() al zeker niet de goede oplossing is, we moeten een dubbele conversie hanteren, namelijk X2B(C2X(A)). Inderdaad:
C:\Users\Dmitri>'''rexx d:\RexxProgrammas\xtox 41'''
C2D(41)=13361 =X'3133333631'
C2X(41)=3431 =X'33343331'
D2C(41)=) =X'29'
D2X(41)=29 =X'3239'
X2C(41)=A =X'41'
X2D(41)=65 =X'3635'
X2B(41)=01000001 =X'3031303030303031'
B2X(41)=onmogelijk
Die 41 is de hexadecimale voorstelling van het karakter A, dus binair bekomen we "01000001"b. Idealiter zou ons programma dus ook alle dubbele omzettingen moeten uitproberen zodat het voor ons nog gemakkelijker wordt. Maar dit laten we aan de lezer over.
In het laatste voorbeeld is enkel de B2X omzetting niet meer mogelijk omdat we geen binaire string als input hebben gegeven.
Zonder verdere uitleg geven we nog een tweede, gelijkaardig programma cadeau. Het toont alle formaten waarin een bepaalde datum kan worden gemaakt met de '''date()''' functie:
{{Code| | Taal= REXX | Titel= RexxDates.rex | Code= <pre>
/* Toon alle Rexx date() variaties
+-----------------------------------------------------------+
| format: | REXXDATES <inputdatum> |
+-----------------------------------------------------------+
21 Dec 2000: Accepteer een datum als input */
parse arg indatum '' t ; indatum=strip(indatum)
fmts='Basedate Days European Month Normal Ordered',
'Sorted Usa Weekday'
fmtsep='European Normal Ordered Sorted Usa'
NbFm=words(fmts)
/*----------------------------------------------------------------*/
/* Geval 1: geen datum meegegeven, toon vandaag in alle formaten */
/*----------------------------------------------------------------*/
if indatum='' then do
say 'De DATE functie kan volgende formaten produceren:'
do i=1 to NbFm
call rexdate word(Fmts,i)
end i
exit
end
/*----------------------------------------------------------------*/
/* Geval 2: we kregen wel een datum binnen */
/*----------------------------------------------------------------*/
if length(indatum)=10 then
if substr(indatum,5,1)substr(indatum,8,1)='--'
then indatum=left(indatum,4)substr(indatum,6,2)substr(indatum,9)
ValidFmts=''
do i=1 to NbFm
ValidFmts=ValidFmts CkDate(word(fmts,i))
end
If ValidFmts='' then do
Say 'Datum' indatum 'is geen geldige REXX datum formaat.'
exit 56
end
say 'De DATE functie kan volgende formaten produceren voor "'indatum'"'
ld=length(indatum)+19
Do while ValidFmts<>''
out.=''
Do 3 while ValidFmts<>''
parse var ValidFmts fmt ValidFmts
Out.0tit=Out.0tit left(fmt,12)
do i=1 to NbFm
fmto=word(Fmts,i)
out.fmto=out.fmto GivDate(fmtO,indatum,Fmt)
end i
end
Say right('? ===>',ld+5) Out.0tit
do i=1 to NbFm
fmto=word(Fmts,i)
t='Date('left(fmto,8)','indatum',"?")'
say ' 'left(t,ld) '= ' Out.fmto
end i
end
exit
REXDATE:
parse arg fmt
if wordpos(fmt,fmtSep)=0
then say ' 'left('Date('fmt')',15)'= ' date(fmt)
else say ' 'left('Date('fmt')',15)'= ' left(date(fmt),12),
left('Date('fmt',,,"-")',20)'= ' date(fmt,,,'-')
return
CkDate:
Signal on syntax name InvDate
call date 'U',indatum,arg(1)
return arg(1) /* Formaat is mogelijk */
InvDate: return '' /* Formaat is onmogelijk */
GivDate:
Signal on syntax name InvDate2
return left(date(arg(1),arg(2),arg(3)),12)
InvDate2: return '*Onmogelijk*'
</pre>}}
Dit is een mogelijke output van het programma:
C:\Users\Dmitri>'''rexx d:\RexxProgrammas\rexdates'''
De DATE functie kan volgende formaten produceren:
Date(Basedate) = 734470
Date(Days) = 334
Date(European) = 30/11/11 Date(European,,,"-")= 30-11-11
Date(Month) = November
Date(Normal) = 30 Nov 2011 Date(Normal,,,"-") = 30-Nov-2011
Date(Ordered) = 11/11/30 Date(Ordered,,,"-") = 11-11-30
Date(Sorted) = 20111130 Date(Sorted,,,"-") = 2011-11-30
Date(Usa) = 11/30/11 Date(Usa,,,"-") = 11-30-11
Date(Weekday) = Wednesday
en indien een datum is opgegeven:
C:\Users\Dmitri>'''rexx d:\RexxProgrammas\rexdates 20111216'''
De DATE functie kan volgende formaten produceren voor "20111216"
? ===> Basedate Sorted
Date(Basedate,20111216,"?") = 20111216 734486
Date(Days ,20111216,"?") = 235 350
Date(European,20111216,"?") = 23/08/63 16/12/11
Date(Month ,20111216,"?") = August December
Date(Normal ,20111216,"?") = 23 Aug 55063 16 Dec 2011
Date(Ordered ,20111216,"?") = 63/08/23 11/12/16
Date(Sorted ,20111216,"?") = 550630823 20111216
Date(Usa ,20111216,"?") = 08/23/63 12/16/11
Date(Weekday ,20111216,"?") = Sunday Friday
Dit tweede voorbeeld hoeft misschien een extra woordje uitleg: nu geven we een datum mee als parameter. Maar we zeggen nergens welk formaat die datum heeft. In dit geval kan 20111216 zowel een geldige Base datum als een geldige Sorted datum zijn. Daarom test RexDates welke formaten het kunnen zijn. En dus bevat het antwoord die twee kolommen, de eerste voor het geval dat input een Base datum is, de tweede als het een Sorted datum zou betreffen.
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Nog bevelen en functies
|huidige =Voorbeeld 2
|volgende=Host Commando's}}
{{Sub}}
jdhycswcrvd42vgjzwke6bwv4xf05qk
Kookboek/Panna cotta
0
28992
428097
420530
2026-05-20T05:28:05Z
Erik Baas
2193
lf
428097
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Panna cotta
| Categorie = Dessert
| Afbeelding = [[Bestand:Preparation of panna cotta.jpg|300px]]
| Onderschrift = Bereiding van panna cotta
| Porties = 4
| Energie =
| Tijd = 15 min + 4 uur koelkast
| Stippen = 2
}}
==Ingrediënten==
* 250 ml {{Kb|melk}}
* 250 ml {{Kb|room}}
* 2 zakjes vanillesuiker
* 4 blaadjes {{Kb|gelatine}}
==Bereidingswijze==
*week de gelatine in koud water
*breng de melk met de suiker net niet aan de kook
*los de gelatine op in de hete melk, flink roeren
*roer de room door de melk
*giet in vormpjes of dessertschaaltjes en laat het afkoelen in de koeling
== Varianten ==
* Vervang de vanillesuiker door 16 g suiker en een vanillestokje. Snijd het vanillestokje in de lengte door de helft en leg het in de melk. Haal het er vlak voor het toevoegen van de gelatine uit en schraap het met een scherp mes leeg. Voeg het schraapsel toe aan de melk, gebruik het vanillestokje desgewenst nog in een pot met suiker.
{{Navigatie recepten}}
[[Categorie:Zuiveldessert|Panna]]
[[Categorie:Italiaanse keuken|Panna]]
{{Sub}}
d8r1rj9hascr51y2qhbjr0fjpn37qme
Kookboek/California Roll
0
29050
428091
402489
2026-05-20T05:28:01Z
Erik Baas
2193
lf
428091
wikitext
text/x-wiki
{{Infobox recept
| Naam = California Roll
| Afbeelding = [[Bestand:Sushi1.jpg|300px]]
| Categorie = Rijstrecept
| Porties = 2
| Energie =
| Tijd = 40 minuten
| Stippen = 4
}}
De California Roll is een bekende [[Kookboek/Sushi|sushi]]-variant die door Japanse immigranten in Californië geïntroduceerd werd om de smaak aan te passen aan die van de Amerikanen.
==Ingrediënten==
*1 kop sushi {{Kb|rijst}} (180 gram)
*1 theelepel zout
*6 theelepels mirin
*6 theelepels rijstazijn
*1 {{Kb|avocado}}
*1 {{Kb|komkommer}}
*100 gram krabsticks
*20 gram {{Kb|sesamzaad}}
*2 velletjes nori (zeewier)
*1 eetlepel [[Kookboek/Wasabi|wasabi]] (optioneel)
*1 eetlepel Japanse mayonaise
==Bereiding rijst==
Was de rijst net zo lang in koud water totdat het water helder blijft. Doe de rijst daarna in een pot (Nederland: kookpan) en zorg dat het water een centimeter hoger dan de rijst staat. Kook met het deksel erop voor tien minuten op laag vuur. Tijdens het koken kun je al beginnen zout, mirin en rijstazijn te mengen en in een pan te verwarmen totdat het zout is opgelost. Breng het echter niet aan de kook. Doe de rijst nadat deze klaar is in een houten kom en verspreid de dressing evenredig over de rijst. Doe een natte doek over de kom zodat deze niet zal uitdrogen.
==Bereiding California Roll==
Snijdt de komkommer en avocado doormidden, verwijder de zaden en pit en snijdt beide daarna in reepjes van ongeveer een halve centimeter breed. Neem nu een bamboematje en bedek deze met folie. Heb je geen bamboematje dan kun je een stuk stevig papier van A4 formaat gebruiken. Voor de folie, dit werkt het beste met cellofaan, maar aluminiumfolie kan ook. Bedek de folie met een hand vol gekookte rijst en spreidt deze evenredig uit, net zo breed als het velletje nori (zeewier) maar laat in de lengte aan de onderkant 5 centimeter vrij. Leg daarna de nori op de rijst. Plaats nu enkele reepjes komkommer, avocado en krabstick op de nori, maar laat aan de onderkant weer 5 centimeter vrij. Voeg wasabi en mayonaise naar smaak toe. Rol de sushi nu voorzichtig op en begin te rollen aan de kant met de 5 centimeter vrij. Nadat je klaar bent met rollen kun je langzaam de folie eruit trekken. Deze zou als het goed gaat er zo uit moeten glijden zonder dat je rol weer open gaat. Leg de folie nu opnieuw op het bamboematje en spreidt hier het sesamzaad op uit. Rol de sushi rol opnieuw op, druk het wat aan en het sesamzaad zal eraan blijven plakken. Verwijder de folie en je hebt een echte California Roll. Snijdt deze in stukjes van acht. Herhaal alles voor het tweede velletje nori. In totaal zul je 16 stukjes krijgen.
==Houdbaarheid==
Hoewel sushi enkele dagen in de koelkast houdbaar is, zal de rijst erg snel uitdrogen. Het beste kun je dus de sushi meteen nadat je deze gemaakt het opeten.
==Externe Links==
* [https://www.oversushi.nl/ Over Sushi] - uitgebreide Nederlandstalige site over sushi met meer recepten
{{Navigatie recepten}}
[[Categorie:Rijstrecept|California]]
[[Categorie:Snack|California]]
{{Sub}}
0j8m58px86xjcmm8xt4fw0oa6n8jiko
Programmeren in REXX/Functies deel 2
0
29100
428218
425907
2026-05-20T06:10:54Z
Erik Baas
2193
lf
428218
wikitext
text/x-wiki
{{Index Programmeren in REXX}}
In dit hoofdstuk behandelen we een tweede reeks functies die standaard met REXX wordt geleverd.
Het gaat om functies die toelaten getallen te formatteren. Ook functies die getallen of strings omzetten van één formaat in een ander. We overlopen ook nog even hoe REXX met getallen werkt en hoe we de nauwkeurigheid van de uitkomsten kunnen bepalen.
Zoals steeds zullen resultaten tussen « en » worden getoond. Als er sprake is van een '''pad''' karakter, dan dient dit karakter om de (kortste) string op te vullen. Standaard wordt daar de spatie voor gebruikt.
=Hoe rekent REXX ?=
Het resultaat van een numerieke bewerking is een karakterreeks. De regels die daarbij spelen zijn:
*Het resultaat is berekend tot een maximaal aantal significante cijfers. Standaard is de nauwkeurigheid beperkt tot 9 cijfers, maar dit aantal kan aangepast worden. Indien het resultaat meer cijfers nodig heeft wordt het afgerond, dus 2/3=0.666666667;
*Behalve bij deling en machtsverheffing worden de nullen aan eind van de decimalen behouden, dus 2.40+2=4.40;
*Als het resultaat nul is dan wordt het steeds als één enkel cijfer 0 voorgesteld;
*Exponentiële notatie wordt pas gebruikt als het aantal significante cijfers vóór het decimaal punt groter wordt dan de nauwkeurigheid (standaardwaarde=9). Ook indien het aantal decimalen meer dan 2 maal de precisie overschrijdt, schakelt REXX over op exponentiële notatie, bijvoorbeeld:
1e6 * 1e6 «1E+12» en niet «1000000000000»
1 / 3E10 «3.33333333E-11» en niet «0.0000000000333333333»
*Alvorens een berekening aan te vatten zal REXX de spaties wegnemen. Het getal wordt dan beperkt tot het aantal significante cijfers plus één. De bewerking zelf gebeurt met het dubbele van de opgegeven nauwkeurigheid (standaard dus 2*9 cijfers);
*Noteer dat ".92" omgezet wordt tot "0.92".
*Machtsverheffing kan enkel met een exponent die een '''geheel''' positief of negatief getal is.
<!----------------------------------------------------------------------------------------------->
=NUMERIC - nauwkeurigheid van bewerkingen bepalen=
Alvorens dieper in te gaan op de numerieke functies moeten we het bevel '''numeric''' nog bespreken.
'''numeric digits''' [uitdrukking]
of
'''numeric fuzz''' [uitdrukking]
of
'''numeric form''' [formaat]
De eerste vorm bepaalt de nauwkeurigheid waarmee numerieke bewerkingen moeten worden uitgevoerd. Standaard worden daarvoor 9 cijfers gebruikt.
<br id=DIGITS>Noteer dat met de functie '''digits()''' de actuele cijfergrootte kan worden opgevraagd.<br>
say 1*999999999 «999999999»
say 1*9999999999 «1.00000000E+10»
Dus, eens men de nauwkeurigheid overschrijdt wordt het getal afgerond.
Met '''numeric fuzz''' kunnen we bepalen hoeveel cijfers bij vergelijkingen moeten worden verwaarloosd. Dit aantal moet kleiner zijn dan digits().
<br id=FUZZ>De actuele nauwkeurigheid kan worden opgevraagd met de functie '''fuzz'''. De "numeric fuzz" kan lokaal voor een subroutine worden veranderd.
en zal dus ook invloed hebben op eventuele afrondingen van getallen.<br>
numeric fuzz 5
say 0.123456789=0.123409876 «0»
numeric fuzz 6
say 0.123456789=0.123409876 «1»
Met '''numeric form''' tenslotte controleren we de vorm van de exponentiële notatie van getallen. We kunnen 2 formaten kiezen:
*'''scientific''', waarbij slechts één significant cijfer voor de komma geplaatst wordt. Dit is de standaard;
*'''engeneering''', waarbij in het exponentieel deel de macht steeds een veelvoud van 3 is.
<br id=FORM>De actuele exponent-vorm kan men opvragen met de functie '''form()'''.<br>
numeric form scientific
say 1*9999999999 «1.00000000E+10»
numeric form engineering
say 1*9999999999 «10.0000000E+9»
=Manipulatie van getallen=
De meeste functies en bewerkingen die we hier beschrijven zullen tot fouten leiden indien de tokens geen geldig getal voorstellen. De nu volgende functie laat toe te anticiperen op dat soort fouten.
<!------------------------------------------------->
==DATATYPE - controle op type gegevens==
'''datatype'''(''string''[,''type''])
Als we geen ''type'' opgeven, dan antwoord deze functie '''«NUM»''' als de ''string'' een geldig numeriek getal is. In het ander geval is het antwoord '''«CHAR»'''.
Maar we kunnen ook expliciet een ''type'' opgeven. Dan is het antwoord '''«1»''' (waar) als de string van dat type is, anders krijgen we '''«0»''' (onwaar). Het vetjes gedrukte karakter is voldoende.
* '''A'''lphanumeric (enkel A-Z, a-z en/of 0-9 karakters),
* '''B'''inary (enkel 1 en 0 karakters),
* '''L'''owercase (enkel kleine karakters),
* '''M'''ixed (kleine en grote karakters gemengd),
* '''N'''umber (numerisch),
* l'''O'''gical (exact een 1 of een 0 karakter, zonder spaties rond)
* '''S'''ymbol of '''V'''ariable (geldig symbool voor een variabele),
* '''U'''ppercase (enkel hoofdletters),
* '''W'''hole (geheel getal),
* he'''X'''adecimal (enkel 0-9 en/of A-F karakters)
Hier enkele voorbeelden:
say datatype("Abc") datatype("12") «CHAR NUM»
say datatype("Abc","N") datatype("Abc","M") «0 1»
say datatype('11101110','Binary') «1»
say datatype('3','Logical') datatype(12,'O') «0 0»
say datatype('01000001'b,'B') «0»
In het laatste geval is de binaire string gelijk aan '41'x, of de letter «A» in het ASCII stelsel, en dat is noch een karakter 1 ('31'x) noch een karakter 0 ('30'x), dus geen string die een binair getal voorstelt.
Met de gelijkwaardige types '''V'''ariable en '''S'''ymbol wordt getest of de string een syntactisch geldige naam heeft om als REXX variabele gebruikt te kunnen worden.
say datatype("AB%","Symbol") «0»
Er is nog een andere functie die ons soms kan helpen, namelijk '''symbol'''.
==SYMBOL - geldigheid tokens==
'''symbol'''(''"token"'')
Deze functie antwoord:
*'''«BAD»''' als het token geen geldige naam heeft om als variabele gebruikt te worden;
*'''«LIT«''' als het wel een geldige naam heeft, doch nog niet is geïnitialiseerd;
*'''«VAR»''' als het een geldige naam voor een variabele is, en ze reeds bestaat (een waarde kreeg).
Hier is het belangrijk te begrijpen dat we het te onderzoeken token doorgaans als een constante moeten schrijven, anders onderzoeken we de inhoud van het token op geldigheid, wat slechts sporadisch nodig is.
Voorbeelden:
a=10
say symbol("A") «VAR»
say symbol(a) «BAD»
say symbol(hello) «LIT»
say symbol("Hello") «LIT»
In het tweede geval schrijven we de variabele niet als constante string, dus testen we "10" wat geen geldig token is. In het derde geval lukt het nog net omdat ''hello'' nog niet geïnitialiseerd is, en dus zichzelf als waarde heeft. In het laatste voorbeeld zijn we beveiligd tegen het feit dat de variabele ''hello'' een waarde toegekend kreeg.
<!------------------------------------>
==ABS - Absolute waarde van een getal==
'''abs'''(''getal'')
Deze functie geeft de absolute waarde (positieve waarde) van het getal terug. De opgegeven parameter kan natuurlijk een uitdrukking zijn die na interpretatie in een getal moet resulteren. Is het geen getal, dan hebben we een uitvoeringsfout (93: Target must be a number).
say abs(24-12) «12»
say abs(12-24) «12»
<!------------------------------------>
==MAX en MIN - maximum en minimum zoeken==
'''max'''(''getal''[,''getal''][,''getal'']...)
'''min'''(''getal''[,''getal''][,''getal'']...)
Deze functies geven respectievelijk het grootste of het kleinste van een reeks getallen terug.
a=12 ; b=14
say max(a,b,24) min(4,-1*b,24) «24 -14»
<!------------------------------------>
==RANDOM - een willekeurig getal genereren==
'''random'''([''maximum''])
of
'''random'''([''minimum,maximum''['',zaadje''])
Deze functie geeft een willekeurig, positief geheel getal terug. Zonder parameters is het getal gelegen tussen 0 en 999. Maar er kan een ''minimum'' en/of een ''maximum'' worden meegegeven waartussen het getal moet liggen (het bereik is wel beperkt tot 100000).
Indien men een herhaling van dezelfde willekeurige reeks getallen wil bekomen, dan kan men een ''zaadje'' (een getal) meegeven bij de eerste oproep. Met hetzelfde zaadje zullen de getallen die dan gegenereerd worden steeds in dezelfde volgorde terugkomen. Handig als men een spelletje wil later herbeginnen met dezelfde kaarten of teerlingworpen.
<!------------------------------------>
==SIGN - wat is het teken van een getal ?==
'''sign'''(''getal'')
Het antwoord is «-1» voor een negatief ''getal'', «0» indien het ''getal'' nul is en «1» voor een positief getal.
say sign(-12 * -4) «1»
<!------------------------------------>
==TRUNC - decimalen weglaten==
'''trunc'''(''getal''[,''decimalen''])
Kapt het ''getal'', '''zonder afronding''', af bij het aantal opgegeven ''decimalen''. Bij ontstentenis van een aantal ''decimalen'' houdt men enkel het geheel getal over.
Wil men een afgerond getal bekomen, dan moet men gebruik maken van de nu volgende '''format''' functie.
<!------------------------------------>
==FORMAT - een getal formatteren voor uitvoer==
'''format'''(''getal''[,vóór][,na])
Het ''getal'' wordt eerst afgerond volgens de geldende afrondingsregels. Het resultaat is exact gelijk aan wat "getal+0" zou geven.
Men kan echter ook bepalen hoeveel cijfers er in het resultaat ''vóór'' en/of ''na'' de komma moeten komen. Geeft men een aantal ''vóór'' de komma dat te klein is om het getal te kunnen bevatten, dan treedt er een fout op. Hou daarbij ook rekening met een eventueel minteken. We kunnen ook meer posities voor de komma voorzien, in welk geval er spaties vooraan worden toegevoegd. Deze functie is, zoals haar naam impliceert, nuttig om het formaat van getallen onder controle te houden, bijvoorbeeld om de decimale punten onder elkaar te aligneren.
say trunc(10.676,2) «10.67»
say format(10.676,,2) «10.68»
numeric fuzz 4
say format(12.342233332,4,3) « 12.342»
say format(12.343392211,4,3) « 12.343»
say format(12.343792211,4,3) « 12.344»
Merk het verschil op tussen '''trunc''' en '''format''' wat de afronding betreft.
<!---------------------------------------------------------------------------->
==Omzetten van formaten==
Een reeks functies laat toe data om te zetten van één formaat [karakter(C), decimaal(D), hexadecimaal(X) of binair(B)] naar een ander.
<!------------------------------------>
===C2D - van karakter naar decimaal===
'''c2d'''(string[,lengte])
Deze functie zal de binaire waarde van karakterreeks ''string'' omzetten naar een decimaal getal. Hiermee wordt bedoeld dat de ''string'' als een opeenvolging van bits wordt gezien, en dat die reeks dan als decimaal getal wordt geïnterpreteerd.
Een binaire waarde kan geïnterpreteerd worden als een absolute waarde, of een getal met een teken. In het laatste geval zal het getal negatief zijn als de eerste bit op 1 staat. Lees voor meer informatie over negatieve binaire getallen het artikel {{Wp|2-complement|Two's complement}}. De opgegeven ''lengte'' zal bepalen of de eerste bit op 1 staat en of we dus een negatief getal bekomen.
Dit zijn voorbeelden op een PC, dus voor een ASCII karaktertabel:
say c2d('A') «65»
say c2d('a') «97»
say c2d(' ') «32»
say c2d('AB') «16706»
say c2d('FF'x) «255»
say c2d('FF'x,1) «-1»
say c2d('FF'x,2) «255»
In het laatste 2 gevallen hebben we een lengte meegegeven. Met een lengte 1 hebben we binair "11111111", en dus het negatief
(2-complement) getal -1. Met de lengte 2 hebben we binair echter "0000000011111111", en dat resulteert dan weer in het positief getal 255.
<!------------------------------------->
===C2X - van karakter naar hexadecimaal===
'''c2x'''(string)
Onze string wordt nu omgezet naar zijn hexadecimale voorstelling. Het resultaat is een reeks karakters (0-9 en A-F).
say c2x("A") «41»
say c2x(' A') «2041»
say c2x('11111111'b) «FF»
===D2C - van decimaal naar karakter===
'''d2c'''(getal)
Het getal wordt omgezet naar een karakterreeks.
say d2c(12) «♀» (dit is een controlekarakter !)
say d2c(65) «A»
say d2c(6645351) «efg»
<!------------------------------------->
===D2X - van decimaal naar hexadecimaal===
'''d2x'''(getal)
Het getal wordt omgezet naar hexadecimale voorstelling.
say d2x(10) «A» (dit is '0A'x, een controlekarakter)
say d2x(c2d('K')) «4B»
<!------------------------------------->
===X2C - van hexadecimaal naar karakter===
'''x2c'''(hexadecimale-string)
De hexadecimale string wordt naar karakters omgezet. De karakters zijn dan niet noodzakelijk leesbaar en als ze resulteren in controlekarakters kunnen onverwachte dingen gebeuren.
say x2c('4B') «K»
say x2c('7E7E') «~~»
say x2c('4B'x) Fout: Only 0-9, a-f, A-F, and blank are valid; found "K"
Het laatste voorbeeld is een fout die regelmatig gemaakt wordt. De parameter moet niet in hexadecimale REXX notatie geschreven worden, enkel de hexadecimale karakters zijn nodig.
<!------------------------------------->
===X2D - van hexadecimaal naar decimaal===
'''x2d'''(hexadecimale-string)
Ditmaal wordt de hexadecimale string omgezet naar de decimale waarde ervan.
say x2d('7E7E') «32382»
say x2d('4B') «75»
<!------------------------------------->
===B2X - van binair naar hexadecimaal===
'''b2x'''(binaire-string)
De bits worden omgezet in een meer leesbare hexadecimale vorm.
say b2x('11110000') «F0»
say b2x(11110000) «F0»
<!------------------------------------->
===X2B - van hexadecimaal naar binair===
'''x2b'''(hexadecimale-string)
Het omgekeerde van voorgaande functie.
say x2b(4B) «01001011»
say x2b(b2x(11110000)) «11110000»
say x2b(4B0) «010010110000»
In ons [[Programmeren in REXX/Voorbeeld 2 |tweede voorbeeld]] zullen we een programma beschrijven dat handig is om met deze functies vlot te kunnen werken.
<!----------------------------------------------------------------------->
==Binair rekenen==
Met onderstaande functies kan binair worden gerekend.
{|border="1" style="border-collapse:collapse;border:1px solid silver;"
|-
| 1 || AND || 1 ||=|| 1
|-
| 1 || AND || 0 ||=|| 0
|-
| 1 || OR || 1 ||=|| 1
|-
| 1 || OR || 0 ||=|| 1
|-
| 1 || XOR || 1 ||=|| 0
|-
| 1 || XOR || 0 ||=|| 1
|}
<!------------------------------------->
===BITAND - bit per bit AND-en===
'''bitand'''(string1[,string2][,pad])
say c2x('A') «41»
say x2b(41) «01000001»
say bitand('11111111'b,'A') «A»
say bitand('00001111'b,'A') «@»
<!------------------------------------->
===BITOR - bit per bit OR-en===
'''bitor'''(string1[,string2][,pad])
say c2x(bitor('11111111'b,'A')) «FF»
say bitor('00001111'b,'A') «O» ('4F'x)
<!------------------------------------->
===BITXOR - bit per bit XOR-en===
'''bitxor'''(string1[,string2][,pad])
say c2x(bitxor('11111111'b,'A')) «BE» ('10111110'b)
{{Bladeren2
|Boek =Programmeren in REXX
|vorige =Bevelen, deel 2
|huidige =Functies deel 2
|volgende=Parse in detail}}
{{Sub}}
2okrrhv6686bs5v1f1bsa7q6jwxkipr
Kookboek/Mosterdsoep
0
29246
428096
393130
2026-05-20T05:28:03Z
Erik Baas
2193
lf
428096
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Mosterdsoep
| Categorie = Soeprecept
| Porties = 4
| Energie =
| Tijd = 20 min
| Stippen = 3
}}
'''Mosterdsoep''' is een gebonden soep met mosterd als belangrijkste ingrediënt.
==Ingredienten==
*15 g bloem
*30 g boter
*1 {{Kb|ui}}
*1 teen knoflook
*[[Kookboek/Peper|peper]]
*100 g {{Kb|spek}}blokjes
*500 ml warme {{Kb|bouillon}}
*1 {{Kb|p=Ei|eierdooier}}
*100 g {{Kb|roomkaas}}
*2 eetlepels {{Kb|mosterd}}
==Bereiding==
* Smelt de boter in een soeppan, en bak de spekjes hierin, samen met de fijngehakte knoflook, een kras peper en de gesnipperde ui.
* Roer de kaas door de eierdooier, en roer hierin langzaam de warme bouillon.
* Meng de bloem door de spekjes, en laat dit nog 2 min. bakken terwijl je het flink roert, zodat het niet klontert.
* Meng dan de bouillon met kaas/ei erdoorheen, en warm het een paar minuten flink door, zodat de bloem bindt met het vocht, maar het mag niet meer koken.
==Varianten==
* Varieer door steeds andere soorten mosterd te gebruiken: fijne en grove, en uit verschillende streken.
* Voeg als garnering dun gesneden preiringetjes toe.
{{Navigatie recepten}}
[[Categorie:Soeprecept|Mosterdsoep]]
{{Sub}}
nt31qsg5twcwtde4cn4jjmuzb3e86pz
Kookboek/Mosterdsaus
0
29247
428092
405087
2026-05-20T05:28:02Z
Erik Baas
2193
lf
428092
wikitext
text/x-wiki
{{Infobox recept
|
|Naam=Mosterdsaus
|Afbeelding=[[Bestand:Échine de porc du ventoux sauce moutarde (cropped) 2010.jpg|300px]]
|Categorie=Saus
|Porties=4-5
|Energie=
|Tijd=15 minuten
|Stippen=2
}}
[[Kookboek/Saus|Saus]] | [[Kookboek/Recepten|Receptenindex]]
'''Mosterdsaus''' is een warme saus op basis van een [[Kookboek/Roux|roux]].
Mosterdsaus past goed bij gestoofde vis, gehaktballen, karbonade, schnitzel en diverse soorten groente, waaronder broccoli, bloemkool, andijvie, witlof, spruitjes en koolraap.
==Ingrediënten==
*30 g {{Kb|boter}}
*30 g {{Kb|bloem}}
*½ liter {{Kb|melk}} of {{Kb|bouillon}}
*1-2 el {{Kb|mosterd}}
*{{Kb|Zout}}
*{{Kb|Peper}}
*{{Kb|p=keukenazijn|Azijn}} of {{Kb|citroensap}}
==Bereiding==
#De boter in een pan smelten en de bloem erdoorheen roeren.
#Een deel van de melk of bouillon erbij gieten en roeren totdat er een gladde massa ontstaat, hiermee doorgaan totdat alle vocht is opgenomen. Zorg ervoor dat er geen klontjes ontstaan.
#De saus ca. 3 minuten laten doorkoken en intussen blijven roeren.
#De saus van het vuur af halen, de mosterd toevoegen en verder op smaak brengen met zout, peper en azijn/citroensap.
Eet smakelijk!
== Varianten ==
* Voor een pittiger saus: voeg aan de boter (vóórdat de bloem erbij gaat) één of meer theelepels met snippertjes {{Kb|p=chilipeper|rode peper}} of sambal toe en bak die op een laag vuur.
* Voeg naar smaak meer mosterd toe.
* Vervang (een deel van) de melk door kookroom.
* Voeg 1 eetlepel verse dille toe, fijngesneden.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Saus|Mosterdsaus]]
4vc9qec8zv004qay7bzy9cv8htekuo4
Meten en onzekerheid/Meten
0
29258
428222
380602
2026-05-20T06:11:54Z
Erik Baas
2193
lf
428222
wikitext
text/x-wiki
{{Meten en onzekerheid}}__NOTOC__
=3. Meten=
Meten is eigenlijk een heel alledaagse activiteit. Stel bijvoorbeeld dat je een boodschap gaat doen op de markt. Je telt hoeveel contant geld je nog op zak hebt, vergelijkt de grootte van twee bloemkolen, vergelijkt de kleur en vorm van twee verschillende soorten appels als indicatie voor de kwaliteit ervan... In feite zijn dat alle drie voorbeelden van metingen.
Ook in de beroepspraktijk is meten de basis voor verschillende activiteiten met een onderzoekscomponent. Denk daarbij bij voorbeeld aan het diagnosticeren van oorzaken van gezondheidsklachten in de (para)medische beroepen, het monitoren van de onderhoudstoestand van constructies in technische beroepen, het evalueren van de effectiviteit van nieuwe werkwijzen in managementberoepen, etc.
Dit boek gaat over meten zoals dat plaatsvindt in de beroepspraktijk. Hierbij gaat het om vragen als:
* hoe bereid ik mijn metingen voor?
* hoe verwerk ik mijn metingen?
* hoe betrouwbaar/nauwkeurig/valide zijn mijn metingen?
* welke conclusies mag ik verbinden uit mijn meetresultaten?
Dit hoofdstuk geeft daarvoor een eerste aanzet. In dit hoofdstuk gaan we specifiek in op een aantal deelvragen:
* Wat is meten?
* Waarmee meten we?
* Wat zijn meetvariabelen en wat voor soorten meetvariabelen zijn er?
==Definitie van meten==
[[Bestand:Meten.png|thumb|right|400px|Meten: van definitie van de te bepalen variabele tot meetwaarde]]
Er zijn verschillende definities van het begrip meten. Sommige leggen meer de nadruk op het {{Wp|kwantitatieve variabele|kwantificerende}} karakter van meten, terwijl ander definities weer meer nadruk leggen op het verschil tussen het gemetene en de meetwaarde zelf en de daaruit voortkomende onzekerheden.
De verschillen tussen mogelijke definities van meten vallen echter buiten het bestek van dit boek. De volgende definitie volstaat voor onze doeleinden: meten is het bepalen van de waarde van een {{Wp|variabele|meetvariabele}} met behulp van een specifiek {{Wp|meetinstrument|meetinstrument}} en meetprocedure. <ref>Deze definitie is een vrije interpretatie van de definitie van Gertsbakh, die als definitie geeft van measurement: The assignment of a number to the measurand, using special technical means (measuring instruments) and a specified technical procedure. Gertsbakh, I. (2003), Measurement Theory for Engineers. Springer Verlag, Berlin/Heidelberg/New York, p.1.</ref> Meting is niet beperkt tot {{Wp|Natuurkundige_grootheid|natuurkundige grootheden}}, maar strekt zich uit tot de kwantificatie van bijna al het denkbare. Voorbeelden van metingen zijn schattingen van faalkansen op basis van modelstudies, het bepalen van het vertrouwen van de consument op basis van telefonische enquêtes en het meten van prijsstijging van ijsjes in de zomer op basis van observaties.
Welke waarden een meetvariabele kan aannemen, hangt mede af van de gekozen ''meetschaal'' en de bijbehorende definities, zoals de definitie van de {{Wp|natuurkundige eenheid|meeteenheid}}, klassekenmerken, nulpunt, etc. Zo kan men de lengte van een persoon meten in centimeters of inches, maar ook enkel als rangordening tussen personen (groter of kleiner).
In de hier gebruikte definitie van meten wordt het belang van het meetinstrument en de meetprocedure benadrukt. Dit om onderscheid te maken tussen subjectieve (persoonsafhankelijke) waarnemingen en waarnemingen met behulp van een meetinstrument. Door gebruik te maken van de juiste meetinstrumeten en meetprocedures kan de kwaliteit en objectiviteit van de waarnemingen worden geborgd. Een voorbeeld is het meten van het voorrang nemen en voorrang verlenen op een gelijkwaardig kruispunt op basis van visuele observatie. Alleen als alle waarnemers dezelfde definities en standaarden hanteren, voorkom je dat de meetresultaten sterk worden beïnvloed door verschillen in interpretatie tussen waarnemers onderling.
Meten kan worden opgevat als de kernactiviteit van (empirisch) onderzoek. Door te meten is het mogelijk om:
*ideeën op te doen over hoe de werkelijkheid in elkaar zit (verkennend onderzoek);
*ideeën (hypothesen) over hoe de werkelijkheid in elkaar zit te toetsen (toetsend onderzoek);
*het functioneren van een systeem te monitoren en problemen op te sporen (diagnostisch onderzoek);
*te toetsen of een ingreep in een systeem wel heeft gewerkt (evaluerend onderzoek).
==Meetschaal==
De {{Wp|meetschaal|meetschaal}}, ook wel meetniveau genoemd, is een typering van een {{Wp|variabele|meetvariabele}}. <ref>Deze paragraaf is een bewerking van het lemma {{Wp|Meetschaal|}} op nl.wikipedia. Versie: [https://nl.wikipedia.org/w/index.php?title=Meetschalen&oldid=18046443]; auteurs: [https://nl.wikipedia.org/w/index.php?title=Meetschalen&action=history]</ref> Het meetniveau van een variabele bepaalt onder meer welke {{Wp|statistiek|statistische methoden}} op zinvolle wijze kunnen worden gebruikt om de meetgegevens te karakteriseren en interpreteren. De vijf meest gebruikte meetschalen, waarvan de eerste vier zijn geïntroduceerd door Stevens (1946) <ref>Stevens, S. S. (1946). "On the Theory of Scales of Measurement". Science <b>103</b>, pp. 677–680.</ref>, zijn:
*''Nominaal'': benoemen, ordening is willekeurig
*''Ordinaal'': ordening, afstanden tussen rangordes zijn willekeurig
*''Interval'': gelijke afstanden, nulpunt is willekeurig
*''Ratio'': absoluut nulpunt, schaal is willekeurig
*''Absoluut'': zowel nulpunt als schaal zijn vast
Ook hierbij geldt dat er verschil kan zijn tussen de meetschaal van de theoretische variabele (bijvoorbeeld {{Wp|Temperatuur|temperatuur}} in {{Wp|Kelvin (eenheid)|graden Kelvin}} - ratioschaal) en de variabele zoals gemeten (bijvoorbeeld temperatuur in {{Wp|Celsius|graden Celsius}} - intervalschaal). Hieronder worden de vijf hierboven genoemde meetschalen nader toegelicht.
{| class="wikitable"
!Niveau!!Kenmerkend!!Volgorde!!Verschillen!!Nulpunt
|-
!Nominaal
|x|||||||
|-
!Ordinaal
|x||x||||
|-
!Interval
|x||x||x||
|-
!Ratio
|x||x||x||x
|}
===Nominale schaal===
De eenvoudigste meetschaal die we kennen is het nominale. Daarbij gaat het, zoals de naam al aangeeft (Latijn: nomen, naam) bij het meten slechts om het benoemen (naam geven aan) een eigenschap van het gemetene. Voorbeelden zijn: geslacht (man/vrouw), de {{Wp|provincie|provincie}} waarin de ondervraagde woont, etc. Omdat zonder naamgeving niets onderscheiden kan worden, is elk van de andere meetniveaus ook minstens van nominaal niveau.
Voor praktische doeleinden worden de onderscheiden eigenschappen vaak gelabeld met een uniek nummer, letterreeks of ander symbool. Voorbeelden van numerieke labels zijn {{Wp|bankrekeningnummer|bankrekeningnummers}} en {{Wp|kenteken|kentekens}}. Daarbij worden nominale gegevens vaak voor het gemak van terugzoeken alfabetische of numeriek geordend. Deze ordening heeft echter geen specifieke betekenis.
===Ordinale schaal===
Metingen op ordinaal schaalniveau kennen een natuurlijke ordening, zonder dat het onderlinge verschil tussen objecten éénduidig kan worden uitgedrukt in een bepaalde {{Wp|natuurkundige eenheid|eenheid}}. Een voorbeeld van een ordinale meetschaal is de {{Wp|Hardheidsschaal van Mohs|Hardheidsschaal van Mohs}}. Deze maakt het mogelijk de hardheid van mineralen te vergelijken, door te bepalen welke stof de andere kan krassen. Een verschil van één eenheid op deze schaal zegt echter niets over het absolute verschl in hardheid. Een ander voorbeeld is de veelgebruikte {{Wp|Likertschaal|5-puntsschaal}} bij {{Wp|opiniepeiling|opiniepeilingen}} (zeer mee oneens - mee oneens - neutraal - mee eens - zeer mee eens). Bij een ordinale schaal is de volgorde duidelijk, maar zijn de verschillen niet interpreteerbaar: 'zeer mee eens' ligt niet noodzakelijk net zo ver boven 'mee eens' als dat 'mee eens' boven 'neutraal' ligt.
===Intervalschaal===
Metingen op intervalschaal betreffen altijd getallen. Naast de vanzelfsprekende ordening kunnen hiermee ook rekenkundige bewerkingen gedaan worden. Voor dit meetniveau zijn vooral de {{Wp|interval (wiskunde)|intervallen}} (de verschillen) van belang. Eigenlijk dient men de absolute aanduiding en de verschillen goed te onderscheiden. Daarbij is de absolute aanduiding op te vatten als het interval vanaf het gekozen {{Wp|nulpunt|nulpunt}}. Het nulpunt zelf heeft echter geen specifieke betekenis. Daarnaast dient ook, net als in geval van een ratioschaal, de meeteenheid te worden gekozen.
Intervalschalen komt men vooral tegen in {{Wp|coördinatenstelsel|coördinatenstelsels}}. Zowel het nulpunt van tijd- en ruimtecoördinaten als de oriëntatie van een coördinatenstelsel in de ruimte zijn min of meer willekeurig gedefinieerd. Coördinatenstelsels kennen geen echt natuurlijk nulpunt; zo is het nulpunt van het in Nederland gebruikte {{Wp|Rijksdriehoekscoördinaten|RD-stelsel}} gedefinieerd als 300 km ten westen en 600 km ten zuiden van de Onze Lieve Vrouwekerk in Amersfoort. Er zijn echter ook meeteenheden die een ander nulpunt hebben dan het natuurlijke nulpunt. Een voorbeeld hiervan is de {{Wp|Celsius (eenheid)|Celsiusschaal}} voor temperatuur, in tegenstelling tot de {{Wp|Kelvin (eenheid)|Kelvinschaal}}. Van 5 naar 10 graden Celsius betekent dus niet dat de temperatuur is verdubbeld. Het verschil tussen deze twee meeteenheden is niet de meetstandaard - een verschil van 1 graad Celsius en 1 graad Kelvin is exact hetzelfde, maar de keuze van het nulpunt.
===Ratioschaal===
Naast de kenmerken van een intervalschaal is er nu ook een absoluut nulpunt. Daarmee hebben ook verhoudingen (Latijn: ratio) van waarden op deze schaal betekenis. Bekende metingen, waarbij een grootheid wordt vergeleken met een meetstandaard en uitgedrukt in verhouding tot die standaard, zijn van rationiveau. Bij deze variabelen is dus de enige, min of meer arbiraire, keuze de meetstandaard.
Voorbeelden van meetvariabelen met een ratioschaal zijn, met de bijbehorende {{Wp|SI-eenheid}}, lengte in meter, energie in joule, etc.
===Absolute schaal===
De absolute schaal is ten slotte van toepassing op variabelen die betrekking hebben op een aantal of een daarvan afgeleide (dimensieloze) grootheid. Bij een absolute schaal is noch het nulpunt, noch de meeteenheid arbitrair gekozen, maar zijn deze op natuurlijke wijze gedefinieerd. Hoewel in navolging van Stevens deze variabelen vaak als ratioschaal worden getypeerd,is het feit dat hier geen meeteenheid gekozen hoeft te worden, een belangrijk verschil. Meetvariabelen op absolute schaal zijn dus per definitie dimensieloos.
Voorbeelden van grootheden op een absolute schaal zijn aantallen (bijvoorbeeld het aantal {{Wp|elektron|elektronen}} gedetecteerd in een {{Wp|nevelvat|nevelvat}} gedurende een vaste meetperiode, of een afgeleide daarvan (bijvoorbeeld de relatieve frequentie van het aantal keer ''kop'' bij 20 muntworpen).
==Meetinstrumentarium==
{{Afbeelding combi
| align = right
| width = 400px
| afb1 = Sphygmomanometer.JPG
| afb2 = Aircraft altimeter.JPG
| caption2 = Voorbeelden van meetinstrumenten: Bloeddrukmeter en hoogtemeter <ref>bron: https://commons.wikimedia.org</ref>
}}
Strikt gesproken kunnen we onderscheid maken tussen subjectieve (persoonsafhankelijke) waarnemingen en waarnemingen met behulp van een meetinstrument. Meetinstrumenten zorgen voor structurering en objectivering van de waarneming. Bovendien zou zonder meetinstrumenten onze mogelijkheden tot meten beperkt zijn tot wat onze zintuigen kunnen waarnemen. Bovendien moet een variabele éénduidig kunnen worden gemeten. Dit kan niet worden gegarandeerd door persoonsafhankelijke waarnemingen; er moet dus worden nagedacht over welk meetinstrument wordt gehanteerd.
De keuze van de operationele definitie hangt vaak samen met de keuze van het meetinstrument. Onder meetinstrumentarium verstaan we onder andere analytische machines en meetsystemen, met name in experimenteel onderzoek en observatieonderzoek in de technische- en natuurwetenchappen. Ook het uitwerken van een enquête in de sociale wetenschappen wordt echter wel beschouwd als uitwerking van het 'meetinstrument'. Belangrijk aspect is de controle van het meetinstrumentarium: hoe controleer je of het meetinstrument correct meet. Met name voor veel analytische meetinstrumenten zijn hiervoor standaard controleprocedure.
Bij de keuze van het meetinstrument vindt een koppeling plaats van de ''variabele zoals bedoeld'' aan de ''variabele zoals gemeten''. Hierbij kan een verschil in definitie ontstaan tussen de variabele zoals bedoel en de variabele zoals gemeten. Zo kan bijvoorbeeld een variabele als ''tevredenheid van een klas'' kwalitatief worden opgevat, maar in een onderzoek worden geoperationaliseerd als ''het percentage leerlingen dat aangeeft tevreden te zijn''.
In dit hoofdstuk zijn we vooral geïnteresseerd in de kenmerken van de variabele zoals gemeten door het gekozen instrument. Een eerste onderscheid is het hierboven genoemde vershil tussen kwalitatief en kwantitatief. Een voorbeeld van een zuiver kwantitatieve meting is het bepalen van de luchtdruk in {{Wp|Pascal (eenheid)|Pascal}} of {{Wp|Bar (druk)|Bar}} met behulp van een {{Wp|barometer|barometer}}. Het geslacht van een respondent in een interview of enquête is een kwalitatieve variabele. Overigens: met hetzelfde meetinstrument kun je ook het aantal mannen in de onderzochte {{Wp|steekproef|steekproef}} bepalen, en dat is weer een kwantitatieve variabele; het is dus een kenmerk van een variabele zoals gemeten met een bepaald type instrument.
Bij de keuze van het meetinstrument kunnen een aantal overwegingen een rol spelen:
*kwaliteit van het instrument (meetfouten)
*effecten van het instrument op het onderzoeksobject (destructief of non-destructief)
*kosten van het gebruik van het instrument
Over twee van deze aspecten, de kwaliteit van het meetinstrument en de effecten van het meetinstrument op het onderzoeksobject, meer in de volgende paragrafen.
==Meetfouten==
Voor het meten van grootheden is het gebruik van de juiste meetapparatuur en kennis van meetmethoden noodzakelijk. Een wezenlijk kwaliteitsbepalend aspect van het meetinstrument is de mate waarin ''meetfouten'' optreden. De meetfout is de afwijking tussen de gemeten waarde en de werkelijke waarden. Er zal altijd sprake zijn van een zekere meetfout: een gemeten waarde is namelijk nooit exact gelijk gelijk aan de werkelijke waarde van de gemeten grootheid.
De mate van afwijkingen tussen werkelijke en gemeten waarde hangt samen met drie verschillende kwaliteiten van het meetinstrument:
* ''validiteit'';
* ''betrouwbaarheid'';
* ''nauwkeurigheid''.
===Validiteit===
De validiteit van een meetinstrument is de mate waarin deze meet wat hij zou moeten meten. Een mogelijk probleem hierbij is het optreden van structurele meetfouten. Er is sprake van een structurele meetfout als gemiddeld gesproken het meetinstrument een hogere of lagere waarde aangeeft dan zou moeten. Als je bijvoorbeeld de breedte van een gebouw opmeet met een meetband die onvoldoende strak wordt gehouden, zul je een grotere lengte aflezen dan juist is.
Het controleren van het meetinstrument op structurele meetfouten wordt kalibratie genoemd. Kalibratie vindt meestal plaats voordat de metingen zelf worden verricht. Bij het kalibreren van meettoestellen wordt de afwijking (bias) van het meettoestel vastgesteld. Dit kan door te vergelijken met een referentie of met een berekend model. In sommige gevallen is het mogelijk om het meetinstrument bij te regelen om zo te corrigeren voor de geconstateerde afwijking. Dit wordt justatie genoemd. Een andere mogelijkheid is om de afwijkingen vast te leggen in een correctietabel, zodat de meetresultaten naderhand kunnen worden gecorrigeerd.
===Betrouwbaarheid===
De betrouwbaarheid van het meetinstrument is de mate waarin er sprake is van toevallige meetfouten. Kenmerkend voor zuiver toevallige meetfouten is dat de meetfout van de ene meting geen voorspellende waarde heeft voor de meetfout in een volgende meting, ook al wordt gemeten aan hetzelfde object. Een betrouwbaar meetinstrument zal bij herhaalde meting aan hetzelfde object met constante kenmerken dezelfde meetresultaten geven of alleen een kleine afwijking.
===Nauwkeurigheid===
De meetnauwkeurigheid is hoe precies het instrument afgelezen kan worden. Een thermometer kan bijvoorbeeld afleesbaar zijn per graad Celsius of per tiende graad Celsius. En een enquête naar de tevredenheid over de eigen werkomstandigheden kan informatie geven op de schaal tevreden - ontevreden of op een schaal van 1 tot 10. Indien een meetinstrument nauwkeuriger is dan betrouwbaar, bijvoorbeeld als de nauwkeurigheid in honderden graad Celsius is bij een betrouwbaarheid van plusminus 0,5 graad Celsius, dan spreekt men wel van schijnnauwkeurigheid. In dat geval zal namelijk het laatste cijfer van de meting vrijwel volledig worden bepaald door de meetfout en niet door het te meten verschijnsel.
===Validatie en kalibratie van het meetinstrument===
Van een meetinstrument mag men verlangen:
*dat het juiste instrument is toegepast om een gegeven variabele te meten: meet het instrument wat het geacht wordt te meten;
*dat het instrument juist is afgesteld.
Het eerste bovengenoemde aspect is de validatie, het tweede aspect de kalibratie.
Een meettoestel kan worden gekalibreerd door dezelfde meting te verrichten met een gekalibreerd en een niet-gekalibreerd meettoestel, en vervolgens de waarden te vergelijken. Een alternatief is gebruik te maken van een ijkobject waarvan de eigenschappen bekend zijn en vervolgens te kijken of het instrument de juiste waarden meet.
De volgende stap is het ''justeren'' van het meetinstrument. Dit is het zodanig aanpassen van de instellingen van het instrument, dat deze weer zo goed mogelijk de juiste waarde aangeeft. Indien dat niet mogelijk is, kan gebruik worden gemaakt van een correctietabel. In deze correctietabel kan dan worden opgezocht wat bij een afgelezen meetwaarde de werkelijke meetwaarde is.
==Destructieve en niet-destructieve metingen==
[[Bestand:GemX2.png|400px|thumb|Radiografie-apparaat voor niet-destructief onderzoek.]]
Idealiter wordt het object van meting niet beïnvloed door de meting zelf. Dit ideaal is echter vaak maar lastig volledig te verwezenlijken. Zo zal er bij een temperatuurmeting met behulp van een kwikthermometer er warmte stromen van het object waaraan wordt gemeten naar de thermometer (ervan uitgaande dat deze warmer is dan de thermometer was). Hierdoor zal de temperatuur van het object (licht) worden beïnvloed.
Dit aspect speelt sterker bij het bepalen van mechanische eigenschappen van materialen en constructies. De meest direct en eenvoudige manier om te bepalen bij welke belasting een object bezwijkt - wat zeer relevant is om te weten uit praktisch oogpunt - is door in laboratoriumomstandigheden het object te beproeven totaan bezwijken. Dit soort onderzoek noemen we ''destructief'', aangezien het object (of een monster van het materiaal bij materiaalkundig onderzoek) zodanig wordt belast dat het vervormt en/of bezwijkt. <ref>Onderstaande alinea is een bewerking van het lemma {{Wp|Destructief onderzoek|destructief onderzoek}} van nl.wikipedia. Versie: [https://nl.wikipedia.org/w/index.php?title=Destructief_onderzoek&oldid=23937762]; Auteurs: [https://nl.wikipedia.org/w/index.php?title=Destructief_onderzoek&action=history].</ref>
Bij ''destructief testen'' wordt een materiaal getest op bezwijkomstandigheden (bij welke belasting, temperatuur, etc. bezwijkt het materiaal) en bezwijkvorm (waar vervormt of breekt het materiaal het eerst). Zoals de naam het zegt is het materiaal na de test niet meer bruikbaar als constructief element. Denk bijvoorbeeld aan het afsteken van lucifers om te testen of deze wel lang genoeg branden. Destructieve tests zijn vrij makkelijk uit te voeren, in vergelijking met de niet-destructieve testen.
Destructieve tests worden gedaan om informatie in te winnen van de eigenschappen van het materiaal en/of het object, voor toekomstig gebruik ervan in de praktijk. Enkele voorbeelden van destructieve testen zijn:
* Trekproeven ter bepaling van een {{Wp|Spanning-rekdiagram|spanning-rekdiagram}}
* {{Wp|Vermoeiing|Vermoeiingstesten}}
* {{Wp|Hardheid|Hardheidstesten}}
* Impacttesten.
Ook voor het bepalen van de restlevensduur en maximale belastbaarheid van bestaande objecten, zoals dijklichamen gebouwen, verhardingen en bruggen kunnen destructieve testen worden toegepast, mits het mogelijk is om een monster van het materiaal uit het object te nemen en te beproeven. Dit betekent echter per definitie een verzwakking van het object, als het al mogelijk of verantwoord is om een dergelijk monster te nemen van het materiaal. In dergelijke gevallen verdient een niet-destructieve test de voorkeur. <ref>Onderstaande alinea is een bewerking van het lemma {{Wp|Niet-destructief onderzoek|niet-destructief onderzoek}} van nl.wikipedia. Versie: [https://nl.wikipedia.org/w/index.php?title=Niet-destructief_onderzoek&oldid=24535956]; Auteurs: [https://nl.wikipedia.org/w/index.php?title=Niet-destructief_onderzoek&action=history].</ref>
Onder ''niet-destructieve testen'' worden onderzoektechnieken verstaan waarmee men een indruk kan krijgen van de kwaliteit van een te onderzoeken object zonder dit object te beschadigen. Dat kan men bijvoorbeeld bereiken door er een röntgenfoto van te maken. In tegenstelling tot destructief onderzoek, waarbij beschadigingen van het object plaatsvinden, kan niet-destructief onderzoek op het gehele object plaatsvinden. Sinds het begin van de 20e eeuw zijn er diverse onderzoekstechnieken ontwikkeld, onder andere door de ontwikkeling van de {{Wp|elektrotechniek|elektrotechniek}} en [[elektronica]].
Voorbeelden van niet-destructieve onderzoekstechnieken zijn:
* Visuele inspectie
* {{Wp|Wervelstroom|Wervelstroom-onderzoek}}
* {{Wp|ultrasoon onderzoek|Ultrasoon onderzoek}}
* Radiografisch onderzoek: {{Wp|Röntgenbuis|Röntgenbuis}}, {{Wp|Isotoop|Isotopen-onderzoek}}
* Scheurdieptemetingen
* Materiaalidentificatie: {{Wp|Positive material identification|Positive material identification}} (PMI), Optische Emissie Spectroscopie (OES), {{Wp|Ferriet|Ferrietmeting}}.
{{Voetnoten}}
{{Bladeren2
|Boek=Meten en onzekerheid
|vorige=Onderzoeksproces
|tekstvorige=2. Onderzoeksproces
|huidige=3. Metingen
|volgende=Onzekerheid
|tekstvolgende=4. Onzekerheid
}}
{{Sub}}
h8fjna9vour7w4hk1m4h8tn07nidf1x
Meten en onzekerheid/Onzekerheid
0
29309
428224
406379
2026-05-20T06:12:29Z
Erik Baas
2193
lf
428224
wikitext
text/x-wiki
{{Meten en onzekerheid}}__NOTOC__
=4. Onzekerheid=
Een veelgehoorde uitpraak is ''meten is weten''. Waarom dan toch de nadruk op onzekerheid in dit boek over meten? Nu is het inderdaad zo dat metingen, in ieder geval ''valide'' metingen, ervoor zorgen dat de onzekerheid over de werkelijke situatie wordt verminderd. Toch is het een illusie te denken dat je door te meten alles kunt weten. "Meten is weten" is feitelijk onjuist: metingen moeten eerst nog gecorrigeerd en (soms stilzwijgend) geïnterpreteerd worden aan de hand van een theorie of veronderstelling, anders hebben metingen geen betekenis. Het is een versimpeling van de spreuk van {{Wp|Heike Kamerlingh Onnes|Heike Kamerlingh Onnes}} '''Door meten tot weten'''.
==Waarom is meten onzeker?==
Het doel van meten is om informatie te verzamelen over een werkelijke toestandsgrootheid van een object (meetvariabele). Er zijn echter goede redenen om te veronderstellen dat de werkelijke toestand van een object zelden exact zal overeenkomen met de gemeten waarden:
* metingen hebben een beperkte precisie
* meetinstrumenten geven niet altijd de juiste waarde aan
* bij het bedienen van meetinstrumenten kunnen fouten worden gemaakt
* de werkelijke waarde van de toestandsgrootheid varieert vaak in plaats en tijd
* etc.
Een voorbeeld: stel dat we de hoogteligging van een toren willen meten ten opzichte van een bekende referentiehoogte. We kunnen hiervoor bijvoorbeeld een {{Wp|GPS|GPS}} gebruiken met een precisie op centimeter-niveau. We kunnen kiezen voor andere meetinstrumenten met een grotere nauwkeurigheid, maar de precizie van aflezen of waarmee digitaal meetresultaten worden getoond is echter altijd eindig. Belangrijker is echter dat de afgelezen waarde niet altijd juist is. Door kleine afwijkingen in de afstelling van het meetinstrument kunnen fouten in de meetwaarde ontstaan. Deze fouten kunnen nog groter worden indien de meetinstrumenten fout worden bediend. Ten slotte varieert de werkelijke waarde van de toestandsgrootheid vaak in plaats en tijd. Zelfs al definiëren we de hoogte van de toren als het verschil tussen het allerhoogste punt en het {{Wp|NAP|NAP}}, dan blijft het probleem dat de hoogte van de toren varieert in de tijd. Bij warm weer zal het gebouw uitzetten, bij koud weer krimpen. Zo varieert de hoogte van de {{Wp|Eiffeltoren|Eiffeltoren}} ca. 15 cm afhankelijk van de temperatuur.
===Steekproeven===
De variabiliteit van het gemetene naar plaats en tijd is nog een relatief klein probleem bij het meten van de hoogte van een toren. Lastiger wordt het als de stijfheid van de ondergrond van een geheel bouwkavel of wegtracé moet worden gemeten, of bijvoorbeeld de gemiddelde intensiteit van het verkeer over de {{Wp|Rijksweg 10|A10}} op een gemiddelde werkdag. Gelukkig is het mogelijk om betrouwbare uitspraken te doen op basis van een beperkt aantal metingen, mits deze metingen een voldoende representatief beeld geven van het geheel. In dit geval spreken we van een {{Wp|steekproef|steekproef}}. <ref>De onderstaande paragraaf is een bewerking van het lemma steekproef van nl.wikipedia. Versie: [https://nl.wikipedia.org/w/index.php?title=Steekproef&oldid=27321810]; auteurs: [https://nl.wikipedia.org/w/index.php?title=Steekproef&action=history].</ref>
Er zijn echter meer goede redenen om te kiezen voor een steekproef van beperkte omvang:
*Het is gemakkelijker en goedkoper om slechts een deel van de populatie te onderzoeken.
*Als snelheid gewenst is, kan niet de hele populatie onderzocht worden.
*Bij [[Meten en onzekerheid/Meten #Destructieve en niet-destructieve metingen|destructief onderzoek]] zou de hele populatie verloren gaan.
In de steekproeftheorie beschouwen we de hierboven genoemde objecten (bouwkavel, wegtracé, verkeer over een weg) als een {{Wp|Populatie (statistiek)|populatie}} van verschillende plaatsen en tijdstippen. Men kan op verschillende manieren een steekproef verkrijgen. Als alle elementen uit de populatie dezelfde kans hebben om in de steekproef te worden opgenomen, spreekt men van een {{Wp|aselect|aselecte}} steekproef. Men spreekt van een selecte steekproef wanneer de elementen niet op toevalsbasis uit een populatie worden genomen. Zorgt men ervoor dat de verhouding mannen en vrouwen in de steekproef voorkomen ongeveer gelijk is aan deze verhouding in de bevolking dan heet de steekproef {{Wp|representatief|representatief}} (althans wat het kenmerk ''{{Wp|sekse|geslacht}}'' betreft). De keuze bepaalt in grote mate de validiteit van verdere analyse.
===Voorbeelden van blijvende onzekerheid na meting===
Stel dat we willen toetsen of de {{Wp|dichtheid (natuurkunde)|verdichtingsgraad}} van de fundering van een nieuwe weg voldoende groot is. Het weglichaam is 2,3 km lang en 15 m breed. We steken op 25 verschillende plekken een monster en bepalen met behulp van een {{Wp|proctorproef|proctorproef}} de verdichtingsgraad. Puur uitgaande van de meetresultaten, weet je eigenlijk niets meer dan de verdichtingsgraad die bereikt was op 25 verschillende plekken, notabene plekken die door het '[[Meten en onzekerheid/Meten #Destructieve en niet-destructieve metingen|destructieve]]' karakter van de meting aangetast zijn.
Op basis van onze {{Wp|geotechniek|geotechnische}} kennis en ervaring mogen we echter veronderstellen dat de verdichtingsgraad tussen twee nabij gelegen plekken niet veel van elkaar verschilt. Bovendien kunnen we uit de 25 metingen ook iets afleiden over de orde grootte van de onderlinge verschillen.
Het vakgebied dat zich bezighoudt met het verbinden van algemene conclusies uit een beperkte steekproef is de {{Wp|statistiek|statistiek}}. Dit vakgebied is nauw verwant aan - en volgens sommigen een onlosmakelijk onderdeel van - de kansrekening, welke zich bezighoudt met het rekenen met onzekerheid. Om een getalsmatige uitspraak te kunnen doen over de (on)zekerheid voor en na de metingen m.b.t. tot de verdichtingsgraad zullen we dus eerst een manier moeten vinden om onzekerheid in getallen uit te drukken. Dit kan met behulp van de begrippen ''kans'' en ''entropie''.
'''Proctorproef'''
De proctorproef <ref>Deze tekst is een bewerking van het lemma {{Wp|proctorproef|Proctorproef}} op nl.wikipedia. Versie: zie [https://nl.wikipedia.org/w/index.php?title=Proctorproef&oldid=28843230]; auteurs: zie [https://nl.wikipedia.org/w/index.php?title=Proctorproef&action=history]</ref> is een testprocedure die wordt toegepast om de dichtheid van een grondmonster te bepalen zodat men de funderingsstabiliteit van de grond kan vaststellen. De naam verwijst naar de Amerikaanse ingenieur Ralph R. Proctor die in 1933 de eerste varianten van de proef ontwikkelde.
Er moet eerst worden bepaald wat het vochtgehalte van de genomen grondmonsters is. De grondmonsters worden genomen met een cilinder van een bepaalde inhoud. Het vochtgehalte wordt gemeten door ongeveer 150 gram nat zand uit een monster in de ovenschaal te doen, dit gewicht wordt dan genoteerd. Hierna wordt dit zand enkele minuten verwarmd in een oven. Op regelmatige tijdstippen wordt gewogen en indien het gewicht niet meer dan 0,1% afwijkt van de vorige meting wordt het monster als droog beschouwd. Nu wordt het droge gewicht gemeten, en zo is bekend hoeveel vocht het betreffende monster bevat.
De maximale dichtheid wordt bepaald aan de hand van een test. Een machine met een gewicht van 2,5 kg met een oppervlakte van 50,8 mm slaat met 25 slagen per laag het monster aan, het aantal lagen verschilt per inhoud van de cilinder (3 tot 5), de lagen zijn gemiddeld 40 mm dik. De foto toont de cilinder met inhoud die wordt aangeslagen door het betreffende gewicht.
Om vervolgens de maximale proctordichtheid te bepalen wordt als volgt te werk gegaan:
Men begint met een normale waarde (het vochtgehalte zoals deze met het monster was geleverd) en vervolgens voegt men een x aantal % aan water toe en voert de test nogmaals uit. Dit gebeurt zo vaak totdat de dichtheid begint te dalen.
{{Afbeelding duo
| breedte = 825px
| afbeelding1 = Zand oven.jpg
| breedte1 = 400px
| bijschrift1 = Om het vochtgehalte te bepalen, wordt het monster gewogen, gedroogd in een oven en opnieuw gewogen.
| afbeelding2 = Proctorproef.jpg
| breedte2 = 400px
| bijschrift2 = Het monster wordt aangeslagen om de maximale dichtheid te bereiken
}}
==Onzekerheid en kansbegrip==
Kansrekening is een tak van de wiskunde die zich bezighoudt met situaties waarin het toeval een rol speelt, met als gevolg dat er geen zekerheid is over allerlei uitkomsten. Kansrekening is ontstaan vanuit de maatschappelijke behoefte om zo effectief mogelijk om te gaan met onzekerheden. De kansrekening tracht mathematische hulpmiddelen aan te reiken aan een zeer breed scala van maatschappelijke activiteiten en wetenschappen, om binnen een omgeving met onzekerheden toch gefundeerde keuzes te kunnen maken of conclusies te kunnen trekken.Zie voor een (wiskundige) inleiding in de [[Discrete Kansrekening|Discrete Kansrekening]] het gelijknamige wikiboek.
===Intuïtieve uitleg van het begrip kans <ref>Deze paragraaf is een bewerking van het lemma {{Wp|kansrekening|Kansrekening}} van nl.wikipedia; zie: [https://nl.wikipedia.org/w/index.php?title=Kansrekening&oldid=28041936]; auteurs: zie [https://nl.wikipedia.org/w/index.php?title=Kansrekening&action=history] en de module [[Discrete Kansrekening/Basisbegrippen/Intuïtief kansbegrip]] uit het wikiboek [[Discrete Kansrekening]]. Versie: zie [https://nl.wikibooks.org/w/index.php?title=Discrete_Kansrekening/Basisbegrippen/Intu%C3%AFtief_kansbegrip&oldid=137484]; auteurs: zie [https://nl.wikibooks.org/w/index.php?title=Discrete_Kansrekening/Basisbegrippen/Intu%C3%AFtief_kansbegrip&action=history]</ref>===
In een situatie waarin het toeval een rol speelt zal tevoren vaak niet bekend zijn wat de ''uitkomst'' van een ''{{Wp|gebeurtenis (kansrekening)|gebeurtenis}}'' (een
waarneming of meting) is. Wel kan meestal van tevoren aangegeven worden wat de ''mogelijke'' uitkomsten zijn. De kans is dan een maat voor de waarschijnlijkheid van iedere uitkomst. Deze kansmaat heeft een aantal (wenselijke) eigenschappen. Als alle uitkomsten even waarschijnlijk (of, zo je wilt, onwaarschijnlijk) zijn, dan hebben ze logischgewijs dezelfde kans. Verder moeten we, net als bij meetvariabelen, een schaal definiëren om een getalswaarde te kunnen gaan geven. Dit doen we door 0% waarschijnlijkheid (het minimum) te laten overeenkomen met een kans van 0 en 100% waarschijnlijkheid (het maximum) overeen te laten komen met een kans van 1. Ten slotte willen we dat tussen een kans van 0 en 1 er een logische schaling is, zodat we een kans van 1/2 mogen opvatten als dat de betreffende uitkomst even waarschijnlijk wel als niet kan gebeuren.
We gaan nu proberen in een aantal situaties op intuïtieve gronden kansen toe te kennen aan mogelijke uitkomsten.
{|style="border:2px solid #000000;" width=825
|- style="color: black; background-color:#FFFFAA;"
|
'''Voorbeeld 1'''<br>
Drie rode ballen en één zwarte heb je gestopt in een schaal. De ballen voelen allemaal hetzelfde. Je pakt, zonder in de schaal te kijken, ‘willekeurig’ een bal. Wat is de kans dat de bal rood is?
|}
In dit voorbeeld is er sprake van vier gelijkwaardige mogelijkheden, waarvan er drie leiden tot de uitkomst ''rood''. De meeste mensen zullen daarom ervoor kiezen om aan deze gebeurtenis de kans <math>\tfrac{3}{4}</math> toe te kennen.
{|style="border:2px solid #000000;" width=825
|- style="color: black; background-color:#FFFFAA;"
|
'''Voorbeeld 2'''<br>
We werpen een zuivere dobbelsteen (dwz. een exacte kubus, gemaakt van een homogeen materiaal en de 6 zijden voorzien van de ogenaantallen 1 tot en met 6, zonder de gewichtsverdeling te verstoren). Wat is de kans op het gooien van een '6'? En wat is de kans op het gooien van een even aantal ogen?
|}
Ook hier is er sprake van een (fysische) symmetrie. Op grond van de symmetrie van de dobbelsteen zeggen we dat elk van de mogelijke uitkomsten (ogenaantallen) 1 tot en met 6 gelijke kans van optreden heeft. Het begrip symmetrie is de basis voor de ''klassieke'' definitie van het begrip kans. Het werd geïntroduceerd door Laplace (1749-1827). In een symmetrisch experiment wordt de kans op een gebeurtenis A gegeven door de fractie voor A gunstige (dat wil zeggen tot A behorende) uitkomsten #A ten opzichte van het totaal aantal mogelijke uitkomsten #S:
:<math>P(A) = \frac{\# A}{\# S}</math>
De kans op een '6' is daarmee <math>\tfrac{1}{6}</math> en de kans op een 'even aantal ogen' <math>\tfrac {3}{6} = \tfrac{1}{2}</math>.
{|style="border:2px solid #000000;" width=825
|- style="color: black; background-color:#FFFFAA;"
|
'''Voorbeeld 3'''<br>
Er is een longontsteking bij je geconstateerd. Uit onderzoek weet de behandelend arts dat in gelijkwaardige gevallen 92% van de patiënten geneest na een behandeling met antibiotica. Verder heeft de arts geen relevante informatie om de kans op genezing na deze behandeling in te schatten. Hoe groot acht je de kans dat je geneest na de behandeling?
|}
In dit voorbeeld is het niet mogelijk om alleen op basis van 'symmetrie' kansen toe te kennen. Toch zullen veel mensen bereid zijn om de genoemde 92% patiënten die geneest te vertalen naar een kans(schatting) van 0,92. Als we intuïtief twijfelen aan de 'hardheid' van deze kans, dan heeft dat waarschijnlijk als oorzaak dat we (1) de betrouwbaarheid niet weten van het empirische gegeven dat 92% geneest en (2) niet weten of we, als we andere informatie zouden hebben, niet tot andere conclusies zouden komen. Bijvoorbeeld: wat nu als uit ander onderzoek blijkt dat mensen met een vergelijkbare medische geschiedenis lagere kans hebben om te genezen na deze ene kuur?
===Naar een algemene kansdefintie===
[[Bestand:NYW-DKfreqq1000.png|thumb|right|400px|Illustratie van de convergentie van de relatieve frequentie naar de kans bij 1000 worpen met een symmetrische munt. <ref>Bron: Nijdam, W. & W. Albers, [[Discrete Kansrekening]]. [https://nl.wikibooks.org|].</ref>]]
Op basis van de bovenstaande voorbeelden kunnen we concluderen dat er verschillende aanknopingspunten zijn om het begrip 'kans' te definiëren. In situaties met een symmetrische uitkomstenruimte kunnen we de (klassieke) kansdefinitie van Laplace toepassen. Deze kansdefinitie heeft echter twee belangrijke beperkingen. De klassieke definitie veronderstelt een eindige uitkomstenruimte, terwijl we ook experimenten in onze beschouwingen willen betrekken waarbij de uitkomstenruimte oneindig veel elementen bevat. Bovendien is in veel situaties niet duidelijk hoe je een dergelijke 'symmetrische' uitkomstenruimte moet definiëren, bijvoorbeeld als het gaat om het gooien van een asymmetrisch voorwerp als een punaise in plaats van een symmetrische munt of dobbelsteen.
Een andere intuïtieve benadering is het ervaringsfeit dat het herhaald uitvoeren van hetzelfde experiment leidt tot dezelfde relatieve frequentie op de lange duur. Op basis hiervan kun je wanneer bijvoorbeeld een uitkomst in 30% van een lange reeks waarnemingen optreedt, dit interpreteren als dat deze uitkomst (globaal) 30% kans van optreden heeft voor ieder experiment.
De overeenkomst is voor eindige aantallen experimenten echter nooit exact; alleen bij een fictieve oneindige rij experimenten komt de denkbeeldige relatieve frequentie overeen met de kans. Het gelijkstellen van het begrip 'kans' aan deze denkbeeldige relatieve frequentie in een oneindige reeks heeft echter een zware prijs: hierdoor verliest het begrip alle relatie met onze (eindige) werkelijkheid.
Bovenstaande modellen (symmetrie en relatieve frequentie) zijn nodig om het begrip kans te koppelen aan onze waarneembare werkelijkheid en helpen het begrip intuïtief te begrijpen. Voor een wiskundig éénduidige definitie zijn deze echter niet voldoende. Daarom wordt het begrip kans in de volgende paragraaf {{Wp|axioma|axiomatisch}} ingevoerd. De kans, aangeduid met 'P', zal aan een gebeurtenis de kans van optreden ''P(A)'' toekennen volgens een drietal vastgestelde regels (zie onder ''formele definitie van het begrip kans''). De begrippen: uitkomst, gebeurtenis en kans vormen de basis waarop de gehele kansrekening rust.
===Formele definitie van het begrip kans <ref>Deze paragraaf is een bewerking van het lemma {{Wp|axioma's van de kansrekening|Axioma's van de kansrekening}} van nl.wikipedia. Versie: [https://nl.wikipedia.org/w/index.php?title=Axioma%27s_van_de_kansrekening&oldid=26265147]; auteurs: [https://nl.wikipedia.org/w/index.php?title=Axioma%27s_van_de_kansrekening&action=history].</ref>===
De {{Wp|axioma's van de kansrekening|axioma's van de kansrekening}} zijn enkele door de Russische wiskundige {{Wp|Andrej Kolmogorov|Kolmogorov}} geformuleerde wiskundige uitganspunten, op basis waarvan alle regels van de kansrekening kunnen worden afgeleid. Het is als het ware een formele wiskundige definitie van het begrip kans. Hierdoor is het mogelijk om te redeneren over en rekenen met kansen als abstract begrip, onafhankelijk van de vraag hoe we in werkelijkheid bepalen wat de 'kans' is van een reële gebeurtenis zoals beschreven in de drie bovenstaande voorbeelden.
====Kansruimte====
Bij kansrekening hebben we te maken met een willekeurige (niet-{{Wp|lege verzameling|lege}}) {{Wp|Verzameling (wiskunde)|verzameling}} Ω en een {{Wp|collectie (wiskunde)|collectie}} deelverzamelingen daarvan, <math>\scriptstyle \mathcal{F}</math>, de {{Wp|gebeurtenis (kansrekening)|gebeurtenissen}}. Op de collectie gebeurtenissen is een kans ''P'' (van 'Probabilitas') gedefinieerd. De verzameling Ω kan worden gezien als de verzameling van de mogelijke uitkomsten van een kansexperiment; daarom wordt Ω de 'uitkomstenruimte' genoemd en de elementen van Ω uitkomsten.
Er is echter wel een technische beperking die voor niet-wiskundigen lastig uit te leggen is, maar wel van belang is om paradoxale uitkomsten te voorkomen in situaties waarbij de uitkomstenruimte uit een 'oneindig' aantal elementen bestaat. Niet iedere deelverzameling van Ω kan als gebeurtenis optreden; de deelverzamelingen die wel als gebeurtenis kunnen optreden vormen een speciale collectie <math>\scriptstyle \mathcal{F}</math>. Om te garanderen dat allerlei met een of meer gebeurtenissen samenhangende deelverzamelingen van Ω ook tot de gebeurtenissen behoren, wordt gëeist dat <math>\scriptstyle \mathcal{F}</math> een {{Wp|Sigma-algebra|σ-algebra}} is.
Een dergelijk drietal <math>\scriptstyle (\Omega,\mathcal{F},P)</math> heet ''kansruimte'' en is een bijzonder geval van wat in de wiskunde, specifiek de maattheorie, een {{Wp|maatruimte|maatruimte}} wordt genoemd.
Over het algemeen kan niet iedere deelverzameling van Ω als gebeurtenis optreden; de deelverzamelingen die wel als gebeurtenis kunnen optreden vormen een speciale collectie <math>\scriptstyle \mathcal{F}</math>. De kans ''P'' moet voldoen aan de volgende voorwaarden, de zgn. axioma's van Kolmogorov:<br>
'''Axioma 1: de kans van een gebeurtenis E is niet-negatief:'''
:<math>P(E)\in\mathbb{R}\land P(E)\geq 0 \qquad \forall E\in F</math>
'''Axioma 2: De kans op een zekere gebeurtenis (de vereniging van alle mogelijke gebeurtenissen is genormeerd op 1:'''
:<math>P(\Omega) = 1 \!</math>
'''Axioma 3: Voor gebeurtenissen die niet tegelijkertijd kunnen optreden, kun je de kans dat een van deze gebeurtenissen optreedt, berekenen als de som van de kansen op de afzonderlijke gebeurtenissen:'''
:<math>P(E_1 \cup E_2 \cup \cdots) = \sum_{i=1}^\infty P(E_i)</math> voor iedere {{Wp|aftelbare verzameling|aftelbare}} {{Wp|rij (wiskunde)|rij}} {{Wp|disjuncte verzamelingen|disjuncte}} gebeurtenissen <math>E_1, E_2, ...</math>.
{|style="border:2px solid #000000;" width=825
|- style="color: black; background-color:#FFFFAA;"
|'''Voorbeeld 4'''
Bij eenmaal gooien met een dobbelsteen is de uitkomstenruimte (verzameling mogelijke uitkomsten) Ω = {1,2,3,4,5,6}. Welk ogenaantal boven zal komen bij een worp met een dobbelsteen, weten we tevoren niet - dat is ook juist de bedoeling - maar we weten wel dat er slechts de mogelijkheden 1 tot en met 6 zijn. De verzameling van de mogelijke uitkomsten van zo'n toevalsexperiment wordt 'uitkomstenruimte' (of 'uitkomstenverzameling') genoemd en veelal aangeduid met Ω. De kans op een van de ogenaantallen 1 tot en met 6, dus de kans op heel Ω, is 1. De kans op een van de ogenaantallen uit {1,2,3,5,6} is gelijk aan de kans op een uitkomst uit {1,5} plus de kans op een uitkomst uit {2,3,6}. Bij een zuivere dobbelsteen zal de kans op elk van de gebeurtenissen {1}, {2}, ...,{6} hetzelfde zijn en dus gelijk aan <math>\tfrac {1}{6}</math>. Voor de hiervoor genoemde gebeurtenissen geldt dan:
:<math>P(\{1,2,3,5,6\}) = \tfrac{5}{6} = \tfrac{2}{6} + \tfrac{3}{6}=P(\{1,5\})+P(\{2,3,6\})</math>.
Behalve de vraag welke uitkomst de worp met de dobbelsteen heeft, is er ook behoefte om vragen als "Is de uitkomst een even ogenaantal?" of "Heb je meer dan 4 gegooid?" te beantwoorden. Deze vragen hebben betrekking op meer dan een uitkomst, de eerste op de uitkomsten 2, 4 en 6, en de tweede op de uitkomsten 5 en 6. Het resultaat 'even uitkomst' en evenzo 'meer ogen dan 4' wordt een ''{{Wp|gebeurtenis (kansrekening)|gebeurtenis}}'' genoemd en voorgesteld door respectievelijk de deelverzamelingen {2,4,6} en {5,6} van de uitkomstenruimte.
|}
====Vergelijking met intuïtief geformuleerde eigenschappen====
Eerder in dit hoofdstuk hebben we op basis van wat gevoelsmatig logisch is (plus bepaalde vrij arbitraire afspraken, zoals dat we de maximale kans normeren op 1), een aantal eigenschappen genoemd die wenselijk zijn voor een kansmaat. We vertalen deze naar de volgende desiderata (wenselijke eigenschappen) ten aanzien van een kansmaat:
# Aan uitkomsten die equivalent of anderszins even waarschijnlijk zijn, kennen we dezelfde unieke kans toe.
# Een onmogelijke gebeurtenis (een gebeurtenis die geen deel uitmaakt van de set van mogelijke gebeurtenissen) heeft kans 0.
# Een zekere gebeurtenis Ω (de vereniging van alle mogelijke gebeurtenissen) heeft kans 1.
# Een gebeurtenis A die even waarschijnlijk is als zijn complement (de gebeurtenis niet-A), heeft als kans <math>\tfrac {1}{2}</math>
Met uizondering van eigenschap 1, die meer te maken heeft met hoe wij kansen toekennen aan gebeurtenissen, kunnen deze eigenschappen direct uit de axioma's van Kolmogorov worden afgeleid. Zo garandeert de combinatie van het tweede en derde axioma de eigenschap dat als gebeurtenis A even waarschijnlijk is als gebeurtenis niet-A, deze allebei kans <math>\tfrac {1}{2}</math> moeten hebben. Immers:
* A en niet-A zijn twee disjuncte gebeurtenissen, waarvan de vereniging per definitie gelijk is aan de hele kansruimte Ω. De kans op A of niet-A is 1 op grond van het tweede axioma.
* A en niet-A (_A) zijn disjuncte gebeurtenissen, dus volgens het derde axioma is P(Ω)de som van P(A) en P(_A).
* Als A en niet-A even waarschijnlijk zijn, geldt per definitie P(A) = P(_A).
* De enige oplossing voor P(A) + P(A) = 1 is P(A) = <math>\tfrac{1}{2}</math>.
{{Voetnoten}}
{{Bladeren2
|Boek=Meten en onzekerheid
|vorige=Meten
|tekstvorige=3. Meten
|huidige=4. Onzekerheid
|volgende=Onderzoek
|tekstvolgende=5. Meetonzekerheid
}}
{{Sub}}
ggcqf8z6uy64yrgublwbxll29a3g251
Kookboek/Roquefort-sektsoep
0
29347
428098
394031
2026-05-20T05:28:06Z
Erik Baas
2193
lf
428098
wikitext
text/x-wiki
{{Infobox recept
|
|Naam= Roquefort-sektsoep
|Categorie=Soeprecept
|Porties=4 personen
|Energie=
|Tijd=± 30 minuten
|Stippen=2
}}
[[Kookboek/Soep|Soep]] | [[Kookboek/Recepten|Receptenindex]]
Roquefort-sektsoep is een schimmelkaassoep gemaakt met [[Kookboek/Roquefort|roquefort]] en [[Kookboek/Sekt|sekt]]. De originele smaak van deze soep vraagt een sekt die van de [[Kookboek/Riesling|Rieslingdruif]] gemaakt is. Liefst van een zo droog mogelijke type, dus “Brut” of “Trocken”. Het recept is geschreven voor een volledige {{Wp|Menu (restaurant)#Gangen|gang}}, maar is ook zeer geschikt als [[Kookboek/Amuse|amuse]] wanneer het in kleine glaasjes geserveerd wordt. In dat geval kan het recept gehalveerd worden en is het voldoende voor ongeveer 10 à 12 personen.
===Voor 4 personen===
==Ingrediënten==
* 80 gram Roquefort
* 0,2 liter Sekt
* [[Kookboek/Sjalot|4 sjalotjes]]
* [[Kookboek/Bleekselderij|100 gram bleekselderij]]
* [[Kookboek/Boter |20 gram roomboter]]. Géén margarine!
* [[Kookboek/Bloem|10 gram bloem]]
* 0,5 l {{Kb|p=bouillon|kippenbouillon}}
* {{Kb|crème fraîche}}
* [[Kookboek/Peper|Peper]] uit de {{Wp|Pepermolen|molen}}
* [[Kookboek/Waterkers|Waterkers]] om te garneren
==Bereiding==
# Fijngesneden sjalotten en in stukjes gesneden bleekselderij glazig aanbakken in de boter.
# Bloem toevoegen en even laten mee garen/bloemen. Pan van het vuur halen en in kleine beetjes de bouillon toevoegen. Goed blijven roeren met een garde, vooral in het begin, net zoals dit gaat bij een [[Kookboek/Roux|roux]].
# Nu ook de sekt toevoegen en een paar minuten laten doorkoken.
# Kleingesneden roquefort toevoegen evenals de crème fraiche.
# De soep [[Kookboek/Pureren|pureren met een staafmixer]] en op smaak brengen met vers gemalen peper. Zout is niet nodig.
# Bij het serveren wat blaadjes waterkers als garnering gebruiken.
==Serveertip==
De soep kan geserveerd worden met bladerdeegstengels en een glaasje van de overgebleven sekt.
{{Navigatie recepten}}
[[Categorie:Soeprecept|Roquefort]]
[[Categorie:Kaasrecept|Roquefort]]
{{Sub}}
eiwq9j872y2z1q2egnukns91ccumsvr
Kookboek/Boterkoek
0
29390
428110
402665
2026-05-20T05:28:20Z
Erik Baas
2193
lf
428110
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Boterkoek
| Afbeelding = [[Bestand:Boterkoek.JPG|right|300px]]
| Categorie = Cake, gebak en taart
| Porties =
| Energie = 516 kcal
| Tijd = ± 10 minuten bereiding + oventijd + afkoelen
| Stippen = 1
}}
[[Kookboek]] | [[Kookboek/Cake, gebak en taart|Cake, gebak en taart]] | [[Kookboek/Recepten|Receptenindex]]
== Ingrediënten ==
* 200 gram {{Kb|p=boter|(room)boter}}
* 200 gram {{Kb|suiker}}
* 250 gram {{Kb|bloem}}
* [[Kookboek/Melk|melk]] of geklopt [[Koekboek/Ei|ei]] om te bestrijken
* gember (facultatief)
* boter om in te vetten
* paneermeel
* boterkoekblik 23 cm
== Bereiding ==
# Verwarm de oven voor op 200°C (heteluchtoven 180°C). Laat de ingrediënten op kamertemperatuur komen.
# Snijd de boter klein en meng met de suiker en de bloem met koele hand tot een samenhangend deeg.
# Vet het blik in en bestrooi het met paneermeel. Doe het deeg erin en druk aan tot het egaal verdeeld is.
# (Doe de gember erop.) Maak met een mes ruiten in de bovenkant van het deeg en bestrijk het met melk of ei.
# Zet de boterkoek in de oven en haal deze er na 20-25 minuten weer uit. De boterkoek is gaar als hij mooi goudbruin is.
# Laat hem een minuut of 10 afkoelen, alvorens het schuifje rond te draaien. Daarna zit de koek los en dan kan je hem zo uithalen.
{{Navigatie recepten}}
[[Categorie:Cake, gebak en taart|Boterkoek]]
{{Sub}}
cfi1h2gyugsqmoirh1l3lkna9a7ira2
Tracéplanning/Tracéspecificatie
0
29712
428225
308378
2026-05-20T06:12:42Z
Erik Baas
2193
lf
428225
wikitext
text/x-wiki
{{Infrastructuurplanning}}
__NOTOC__
=8. Tracéspecificatie=
Het resultaat van het specificeren van alternatieve tracés is een aantal schetsontwerpen. De precieze geometrie van het tracé, het {{Wp|alignement|alignement}}, moet nog nader worden uitgewerkt om de tracés te kunnen beoordelen.
Bepalend voor het alignement zijn meestal bepaalde ''dwangpunten''. Voorbeelden van dwangpunten zijn:
*de minimale of maximale hoogte van een tracé, gegeven kruisende infrastructuur (kruisende weg, spoorweg, pijpleiding, elektriciteitskabels, etc.);
*aansluiting van het tracé aan het bestaande netwerk;
*te vermijden objecten (inclusief marges).
==Bepalen van dwanghoogtes==
Indien twee tracés elkaar ongelijkvloers dienen te kruisen, dan is het minimale hoogteverschil tussen de assen altijd meer dan de minimale vrije hoogte benodigd voor het kruisende verkeer. De volgende aspecten spelen mede een rol:
*de dikte van de constructie van het kunstwerk dat de ongelijkvloerse kruising mogelijk maakt;
*de helling van het onderste tracé;
*de {{Wp|verkanting|verkanting}} van het bovenste tracé;
*eventuele ruimte voor correcties van de wegligging, bijvoorbeeld bij overlagingen van asfaltlagen.
{{Afbeelding vast
|afbeelding=Dwanghoogte.png
|breedte=500px
|bijschrift=Bepaling van dwanghoogte van wegas van autosnelweg (op kunstwerk) ten opzichte van NAP, gegeven de hoogte van de kruisende weg
}}
De bovenstaande figuur illustreert de berekening van de minimum hoogteligging van de hartlijn van een nieuwe autosnelweg die een (vlakke) weg op maaiveld kruist. De zijkant van het viaduct is maatgevend voor de minimum doorrijhoogte, terwijl de wegas van de autosnelweg in het midden ligt. De minimumhoogte van de wegas wordt hier dus berekend door:
*De hoogte ''h<sub>w</sub>'' van de as van de onderste weg t.o.v. NAP;
*plus de minimum doorrijhoogte ''h<sub>0</sub>'';
*plus een marge, o.a. voor latere overlagingen ''h<sub>+</sub>'';
*plus de constructiehoogte van het kunstwerk ''c'';
*plus de constructiehoogte van de {{Wp|bovenbouw (spoorwegen)|bovenbouw}} van de (spoor)weg ''c<sub>+</sub>''
*plus het hoogteverschil tussen zijkant en wegas autosnelweg (afstand wegas - rand kunstwerk ''b'' vermenigvuldigd met het verkantingspercentage ''p'').
==Uitwerking van het horizontaal alignement==
Het horizontaal alignement van wegen, spoorwegen en fietspaden (en ook van de meeste soorten leidingen) wordt opgebouwd uit een beperkt aantal elementen. De belangrijkste elementen zijn:
*rechte lijn;
*cirkelboog;
*overgangsboog.
In deze paragraaf gaan we vooral in op de berekening van de ''lengte'' van deze elementen, gegeven enkele randvoorwaarden.
===Rechte lijn===
De rechte lijn is in de {{Wp|Euclidische meetkunde|Euclidische meetkunde}} de kortste verbindingsweg tussen twee punten. De rechte lijn is daarmee de meest directe manier om twee plaatsen te verbinden. Veel tracés van kanalen, spoorwegen en wegen bevatten daarom rechte lijnen.
De lengte van een lijn ''d'' is volgens de stelling van {{Wp|Pythagoras|Pythagoras}} gelijk aan de wortel uit de som van de kwadraten van de verschillen tussen de coördinaten van de eindpunten <math>p_1=(x_1,y_1)</math> en <math>p_2= (x_2,y_2)</math>:
:<math>d = \sqrt{(x_1-x_2)^2 + (y_1-y_2)^2}</math>
===Cirkelboog===
Naast rechte lijnen worden {{Wp|cirkelboog|cirkelbogen}} gebruikt in het horizontaal alignement om vloeiende richtingsveranderingen mogelijk te maken. Een cirkelboog is een deel van een volledige cirkel. Kenmerkend voor de cirkelboog is dat de hoeksnelheid en de benodigde middelpuntzoekende kracht om een boog te berijden constant zijn. Hierdoor is een cirkelboog berijdbaar met een constante {{Wp|stuurinrichting|stuurverdraaiing}}. Ook de theoretische {{Wp|verkanting|verkanting}}, de verkanting waarbij de benodigde middelpuntzoekende kracht voor het berijden van een boog geheel wordt geleverd door de normaalkracht, is constant bij een constante boogstraal.
{{Afbeelding vast
|afbeelding=Oppervlakte Cirkelsegment 1.png
|breedte=400px
|bijschrift=Voorbeeld van een cirkelsegment met tangenthoek <math>\alpha</math>, koorde k en pijl p.
}}
De lengte van een cirkelboog kan het eenvoudigst worden berekend gegeven de tangenthoek en de {{Wp|boogstraal|boogstraal}}:
:<math>l = \alpha*R</math>
Daarbij is de hoek <math>\alpha</math> in radialen.
We kunnen echter ook gegeven de tangentpunten en -hoeken de boogstraal herleiden. Allereerst bepalen we de koorde ''k'' uit de rechtlijnige afstand tussen de tangentpunten. Er geldt nu dat:
:<math>\frac{\tfrac12 k}{R} = \sin \tfrac12 \alpha</math>
Hieruit volgt dus dat:
:<math>R = \frac{k}{2 \sin \tfrac12 \alpha}</math>
{{Afbeelding vast
|afbeelding = Alignement bundeling.png
|breedte = 600px
|bijschrift = Horizontaal alignement bij bundeling: cirkelboog als overgang tussen rechtstand en (tegengerichte) cirkelboog
}}
Indien we een boog gebruiken om twee rechtstanden met elkaar te verbinden, is de middelpuntshoek <math>\alpha</math> gelijk aan de tangenthoek <math>\theta</math> van de beide kruisende lijnen. Bij een overgang tussen een rechtstand en een (ruime) boog moet daarbij ook een correctie plaatsvinden voor de boogstraal (zie bovenstaande figuur). De tangenthoek van de verbindingsboog <math>\alpha</math> wordt dan berekend uit de tangenthoek tussen de aan te sluiten lijnen <math>\theta</math>, gecorrigeerd voor de middelpuntshoek <math>\beta</math> van het 'geknipte' gedeelte uit de ruime boog:
:<math>\alpha = \theta - \beta</math>
===Overgangsboog <ref>Deze paragraaf is een bewerking van de lemmata {{Wp|overgangsboog|overgangsboog}} en {{Wp|clothoïde|clothoïde}} van nl.wikipedia. Versie: zie [https://nl.wikipedia.org/w/index.php?title=Overgangsboog&oldid=24380786] en [https://nl.wikipedia.org/w/index.php?title=Clotho%C3%AFde&oldid=27241478]; auteurs: zie [https://nl.wikipedia.org/w/index.php?title=Overgangsboog&action=history] en [https://nl.wikipedia.org/w/index.php?title=Clotho%C3%AFde&action=history].</ref>===
[[Bestand:Clothoide.svg|thumb|right|400px|Clothoïde als overgangsboog]]
Een overgangsboog is de geleidelijke overgang tussen een rechtstand en een {{Wp|boog (meetkunde)|cirkelboog}} of tussen twee bogen met een verschillende {{Wp|straal (wiskunde)|straal}} R in het (horizontaal) alignement van een weg of spoorweg. Door de {{Wp|Kromming (meetkunde)|kromming}} van de weg of spoorweg geleidelijk toe- of af te laten nemen, wordt een plotselinge toe- of afname van de zijdelingse versnelling vermeden. Een nevenfunctie van de overgangsboog is om de {{Wp|verkanting|verkanting}} van de weg geleidelijk te kunnen aanpassen, waarbij de gewenste verkanting weer afhankelijk is van de boogstraal en de ontwerpsnelheid.
Zowel voor wegen als spoorwegen geldt over het algemeen dat een overgangsboog enkel hoeft te worden toegepast tussen een rechtstand en een (ruime) boog, indien ook de verkanting verandert. Hoe ruim de betreffende boog moet zijn hangt samen met de ontwerpsnelheid. Zo hoeft volgens het Nederlandse Handboek Wegontwerp een boog met een straal vanaf 2000 meter in een {{Wp|stroomweg|stroomweg}} niet te worden ingeleid met een overgangsboog, terwijl bij een ontwerpsnelheid van 50 km/uur een boog met een straal vanaf 300 meter reeds geen overgangsboog meer behoeft. <ref>CROW (2002), Handboek Wegontwerp</ref>
Als overgangsboog wordt in Europa meestal de {{Wp|clothoïde|clothoïde}} gebruikt voor zowel wegen als spoorwegen. Een clothoïde (Grieks: κλοθειν (klothein), spinnen (wol)) is een symmetrische {{Wp|spiraal|dubbelspiraal}} met het {{Wp|buigpunt|buigpunt}} in de {{Wp|oorsprong (wiskunde)|oorsprong}}, met de eigenschap dat met toenemende booglengte ook de kromming toeneemt en wel geldt in elk punt van de kromme. De kromming is hierbij de {{Wp|inverse|inverse}} van de boogstraal:
:<math> \frac{1}{r} = k.l</math>
waarbij:
*r = de locale boogstraal op een punt van de clothoïde
*l = de verstreken booglengte van de clothoïde, gemeten vanaf het buigpunt
*k = een constante
De clothoïdeparameter ''k'' bepaalt dus de 'snelheid' van de verandering van de kromming.
De totale lengte van de clothoïde wordt berekend uit:
:<math> L = \frac{A^2}{R} </math>.
waarin:
*<math>A = \frac {1}{\sqrt{k}}</math>
*R = de boogstraal van de in te leiden boog in [m],
*L = de booglengte [m] van de overgangsboog, gemeten vanaf de rechtstand.
In rechthoekige coördinaten kan de clothoïde niet exact worden weergegeven. De kubische spiraal is echter een goede benadering:
:<math>x \approx l</math>
:<math>y \approx \frac{l^3}{6A^2}</math>
Toepassing van de clothoïde als overgangsboog heeft een aantal kenmerken die over het algemeen als gunstig worden gezien door verkeersingenieurs:
* Bij constante snelheid is de toename van de kromming per tijdseenheid gelijk. Met andere woorden, de {{Wp|hoeksnelheid|hoeksnelheid}} van een voertuig neemt lineair toe of af, of nog met andere woorden de {{Wp|hoekversnelling|hoekversnelling}} is constant.
* De toename van de dwarsversnelling per afgelegde afstand is gelijk, waardoor de toename van de dwarsversnelling per tijdseenheid gelijk is bij constante snelheid.
* De ideale {{Wp|verkanting|verkanting}} neemt lineair toe als functie van de afgelegde afstand.
Indien geen overgangsboog zou worden toegepast, zou bij een overgang van een rechtstand of ruime [[cirkelboog|boog]] naar een krappe boog de dwarsversnelling ineens toenemen, zou in het geval van wegverkeer een automobilist ineens een grote stuurverdraaiing moeten maken en zou al in de rechtstand of ruime boog de verkantingsovergang moeten worden aangebracht, wat ongunstig zou zijn uit comfortredenen.
==Uitwerking van het verticaal alignement==
De hoogteverschillen in het verticaal tracé kunnen zowel worden bepaald door dwanghoogtes van kruisende infrastructuur als door variaties in de basishoogteligging en variaties van het maaiveld zelf. Daarbij is het vaak de vraag of het gegeven een horizontaal tracé mogelijk is om een bepaald hoogteverschil te overbruggen.
In deze paragraaf kijken we specifiek naar het overbruggen van hoogteverschillen bij dwangpunten, gegeven een bij benadering vlak maaiveld. Dit is de meest voorkomende situatie in relatief vlakke gebieden.
We gaan nader in op de volgende situaties:
*overbrugging hoogteverschil met een helling (plus top- en voetboog)
*overbrugging hoogteverschil met enkel een top- en voetboog
Hierbij kijken we zowel naar de totale overbruggingslengte gegeven het maximum hellingpercentage als het maximum hellingpercentage gegeven de hellinglengte.
===Overbrugging van een hoogteverschil met enkel top- en voetboog===
{{Afbeelding vast
|afbeelding=Alignement_voet-_en_topboog.png
|breedte=750px
|bijschrift=Overbrugging van hoogteverschil met enkel een top- en voetboog.
}}
Bovenstaande figuur illustreert de relatie tussen hoogteverschil, de gekozen boogstralen en het maximum hellingpercentage bij een overbrugging van een hoogteverschil met een voetboog, direct gevolgd door een topboog. Uitgangspunt is dat het tracé voor en na de hoogteoverbrugging vlak is.
Op basis van de bovenstaande figuur kun je afleiden dat de totale lengte van de helling ''L'' gelijk is aan:
:<math>L = \sqrt{2.H.\sum R-H^2} \approx \sqrt{2.H.\sum R}</math>
waarbij:
*<math>\sum R = R_v + R_t</math>: de som van de straal van de voetboog ''R<sub>v</sub>'' en de straal van de topboog ''R<sub>t</sub>'' in meter;
*''H'': het te overbruggen hoogteverschil in meter.
De hellingshoek op de aansluiting tussen de top- en voetboog - het steilste gedeelte dus - kun je als volgt berekenen:
<math> \alpha = arccos \frac {\sum R - H}{\sum R}</math>
Het hellingpercentage 'i' kan daarmee als volgt worden berekend:
<math>i = \frac {\sqrt {2H \sum R - H^2}}{\sum R - H} \approx \frac{2H}{L}</math>
===Overbrugging van een hoogteverschil met een helling===
Een probleem bij de bovenstaande oplossing kan zijn dat vanaf een zeker hoogteverschil het maximum hellingpercentage ontoelaatbaar wordt. Een oplossing kan dan zijn de boogstralen te vergroten, maar dit leidt tot een sterke toename van de totale hellinglengte. Om de hellinglengte zo kort mogelijk te houden, is een alternatief om een helling toe te passen tussen de voet- en de topboog.
{{Afbeelding vast
|afbeelding=alignement voetboog.png
|breedte=750px
|bijschrift=Uit het lengteprofiel is de 'extra' lengte van een voetboog af te leiden ten opzichte van een situatie met enkel een helling
}}
De hellinglengte is in dit geval gelijk aan de het te overbruggen hoogteverschil gedeeld door het hellingpercentage, vermeerderd met de 'extra' hellinglengte ''z'' (zie bovenstaande figuur). Uit de bovenstaande figuur kunnen de volgende formules worden afgeleid voor ''x'' (lengte van de voetboog), ''y'' (hoogteverschil overbrugd door voetboog) en ''z'' (extra hellinglengte door voetboog):
:<math>x = R \sin \alpha</math>
:<math>y = R - R \cos \alpha</math>
:<math>z = R \tan (\tfrac{1}{2}\alpha) \approx \tfrac{1}{2}.i.R</math>
Hierbij is ''i'' het hellingpercentage, uitgedrukt als fractie (dus 5% wordt 0,05).
Uiteraard kunnen dezelfde formules worden toegepast voor topbogen.
{{Voetnoten}}
{{Bladeren2
|Boek=Infrastructuurplanning
|vorige=Dimensionering
|tekstvorige=7. Dimensionering en verknoping met het netwerk
|huidige=8. Tracéspecificatie
|volgende=Toetsing
|tekstvolgende=9. Toetsing
}}
{{Sub}}
319p4t0pe3nd8rnjiwx8om2r1jj49vm
Gebruiker:Erik Baas/common.js
2
29822
428020
428002
2026-05-20T05:15:00Z
Erik Baas
2193
428020
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgNamespaceNumber') == 10) { // main, template
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{Navigatie([\|,\n])/ig, "{{Bladeren2$1"); // 20260516
text = text.replace(/\{\{Recept ?\|]/ig, "{{Infobox recept\n|"); // 2260516
text = text.replace(/\{\{Recept[\n,\}]/ig, "{{Infobox recept\n");
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
5mwinbde4x4sb5x2sa17a6m8y26ojej
428022
428020
2026-05-20T05:18:59Z
Erik Baas
2193
428022
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgNamespaceNumber') == 10) { // main, template
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{Navigatie([\|,\n])/ig, "{{Bladeren2$1"); // 20260516
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Recept/ig, "{{Infobox recept"); // 2260516
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
5ncy5el6ni6vcm4kstezc4c8o1rl0x7
428201
428022
2026-05-20T06:07:20Z
Erik Baas
2193
428201
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgNamespaceNumber') == 10) { // main, template
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{(Sjabloon\:)?Navigatie([\|,\n])/ig, "{{Bladeren2$1"); // 20260516
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Recept/ig, "{{Infobox recept"); // 2260516
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
0nfo0wppbxi5owuaf2v1stofal848j5
428202
428201
2026-05-20T06:08:50Z
Erik Baas
2193
428202
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgNamespaceNumber') == 10) { // main, template
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{(Sjabloon\:)?Navigatie([\|,\n])/ig, "{{Bladeren2$2"); // 20260516
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Recept/ig, "{{Infobox recept"); // 2260516
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
g5yb2xshhdkpysc3k0rzl2fnkb4698p
428226
428202
2026-05-20T06:20:15Z
Erik Baas
2193
428226
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
// autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgNamespaceNumber') == 0 || mw.config.get('wgNamespaceNumber') == 10) { // main, template
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
text = text.replace(/\{\{Sjabloon:/ig, "{{");
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{Navigatie([\|,\n])/ig, "{{Bladeren2$1"); // 20260516
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Recept/ig, "{{Infobox recept"); // 2260516
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
q06l714ns1l27lp5gsflm7ah0bhhw5c
428227
428226
2026-05-20T06:28:27Z
Erik Baas
2193
428227
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
// autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgPageContentModel') != "javascript" &&
mw.config.get('wgNamespaceNumber') != 828) { // js, module
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
text = text.replace(/\{\{Sjabloon:/ig, "{{");
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{Navigatie([\|,\n])/ig, "{{Bladeren2$1"); // 20260516
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Recept/ig, "{{Infobox recept"); // 2260516
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
41t7eqlpubrd1njjdnimqp7uy319jdn
428228
428227
2026-05-20T06:30:03Z
Erik Baas
2193
428228
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgPageContentModel') != "javascript" &&
mw.config.get('wgNamespaceNumber') != 828) { // js, module
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
text = text.replace(/\{\{Sjabloon:/ig, "{{");
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{Navigatie([\|,\n])/ig, "{{Bladeren2$1"); // 20260516
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Recept/ig, "{{Infobox recept"); // 2260516
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
kc9p10f53z6sp13fkabireg46583gl1
428230
428228
2026-05-20T06:34:49Z
Erik Baas
2193
428230
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
// autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgPageContentModel') != "javascript" &&
mw.config.get('wgNamespaceNumber') != 828) { // js, module
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
text = text.replace(/\{\{Sjabloon:/ig, "{{");
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{Navigatie([\|,\n])/ig, "{{Bladeren2$1"); // 20260516
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Recept/ig, "{{Infobox recept"); // 2260516
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
41t7eqlpubrd1njjdnimqp7uy319jdn
428231
428230
2026-05-20T06:36:35Z
Erik Baas
2193
428231
javascript
text/javascript
// <nowiki>
$(function () {
// importScript('Gebruiker:Erik Baas/markeer.js'); /* markeer & next*/
// watisdit();
// insertTekst();
// massDelete();
automatePurgeConfirmationDialog();
// if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { autoEdit(); } // 20260420
replaceObsoleteHTMLTags();
markeerLintErrors();
addSubpagesLink();
// loadWikidataInfo();
fWikidata();
// autoSave();
addPurgeTab(); // check: altijd als laatste!
return;
});
function autoSave() {
if (mw.config.get('wgPageContentModel') != "javascript" &&
mw.config.get('wgNamespaceNumber') != 828) { // -js, -module
if (mw.config.get('wgAction') == 'edit') {
document.getElementById('wpSummary').value = 'lf';
setTimeout(autoSave_sub, 10000);
}
}
return;
}
function autoSave_sub() {
document.getElementById("wpSave").click();
return;
}
function fWikidata() { /* Zoek in Wikidata - bron: [[w:Gebruiker:Zanaq/fwikidata.js]] (c) 2013 Zanaq, GPL
* Voegt een link "Zoek in Wikidata" toe aan de sectie "hulpmiddelen". */
var title = mw.config.get('wgTitle');
mw.util.addPortletLink('p-tb',
'https://www.wikidata.org/w/index.php?button=&title=Special%3ASearch&search=' + encodeURIComponent(title.substr(title.lastIndexOf('/') + 1)),
'Zoek in WikiData',
'ca-wikidata',
'Zoek in Wikidata');
return;
};
function watisdit() {
const collection = document.getElementsByClassName("cdx-button");
alert(collection[0].innerHTML + ' *** ' + collection[1].innerHTML);
return;
};
function autoEdit() {
if (mw.config.get('wgNamespaceNumber') == 0) { // 0=(main), 3=Overleg gebruiker, 10=Template
if (mw.config.get('wgAction') == 'view') {
if (mw.config.get('wgDiffOldId') == null) { // of wgDiffNewId ?
window.location += '?action=edit';
}
}
}
return;
}
function loadWikidataInfo() {
/* Wikidata; 20260130
bron: https://nl.wikipedia.org/w/index.php?title=Wikipedia:Wikidata&oldid=70312736#Geschiedenis
geeft onder paginatitel korte info over onderwerp in Wikidata */
if ( mw.config.get( 'wgNamespaceNumber' ) === 0 ) {
// importScriptURI("//www.wikidata.org/w/index.php?title=User:Yair rand/WikidataInfo.js&action=raw&ctype=text/javascript");
importScriptURI("//nl.wikibooks.org/w/index.php?title=User:Erik_Baas/WikidataInfo.js&action=raw&ctype=text/javascript");
}
return;
}
function addSubpagesLink() {
/*
* Voegt een link "Subpagina's" toe aan de sectie "hulpmiddelen".
* Gebaseerd op de code in [[:commons:MediaWiki:Common.js]].
* Bron: https://nl.wikipedia.org/w/index.php?title=MediaWiki:Gadget-subpages.js
* Onderhoud: [[User:Krinkle]]
*/
var i18n = {
en: "Subpages",
fr: "Sous-pages",
nl: "Subpagina's"
};
if ( [ 'Special', 'File', 'Category' ].indexOf( mw.config.get( 'wgCanonicalNamespace' ) ) === -1 ) {
var text = i18n[ mw.config.get( 'wgUserLanguage' ) ] || i18n.nl;
var link = mw.util.getUrl( 'Speciaal:Voorvoegselindex/' + mw.config.get( 'wgPageName' ) + '/' );
mw.util.addPortletLink( 'p-tb', link, text, '', 'Subpagina\'s van deze pagina');
};
return;
}
function replaceObsoleteHTMLTags() {
var prev = '', sub='', subColor='', subFace='', subSize='', found='', text='', res='', X, Y, Z;
var objSummary = document.getElementById('wpSummary');
var obj = document.getElementById('wpTextbox1');
if (obj == null) return; /* exit */
if (! (mw.config.get('wgPageContentModel') == 'wikitext')) return; /* exit */
var text = '' + obj.value;
if (text.search(/{{Wiu[2,3]/i) > -1) {
alert('Stop: werk in uitvoering!');
return; /* exit */
}
createDebug();
/* <font> */
while (true) {
// common pt. 1
X = /<font.*?>/i.exec(text); // .exec: if not found: X=null, X[0] etc. = undefined !!
if (X == null) break; // geen font-tags
X = X + ''; // !!
subColor = subFace = subSize = X.replace(/(\x22|\x27)/g, ""); // - ' en "
/* <font color> */
if (subColor.search(/color/i) > -1) {
subColor = /color *= *[a-z,0-9,#]*/i.exec(subColor) + ''; // !!
if (subColor) {
subColor = subColor.replace(/ *= */, ": ") + ";";
subColor = subColor.toLowerCase();
}
}
else {subColor = null;} // geen color-attribute
/* <font face> */
if (subFace.search(/face/i) > -1) {
subFace = subFace.replace(/ *, */g, ",");
subFace = /face *= *[a-z,0-9,\,]*/i.exec(subFace) + ''; // !!
if (subFace) {
subFace = subFace.replace(/,/g, ', ');
subFace = subFace.replace(/face *= */i, 'font-family: ') + ';';
}
}
else {subFace = null;} // geen face-attribute
/* <font size> */
// todo
// tijdelijk: subSize = null;
if (subSize.search(/size/i) > -1) {
debug(subSize); // <font color=red face=Tahoma size=3>
subSize = /(?<=size *= *).*?(?=(\x20,'>'))/i.exec(subSize) + '';
debug(subSize); //
// subSize = subSize.replace(/.../, "...");
}
else {subSize = null;} // geen size-attribute
// tijdelijk:
subSize = null;
// common pt. 2
Y = '<span style="';
//debug(Y);
if (subColor) Y += subColor;
//debug(Y);
if (subFace) Y += (subColor ? ' ' : '') + subFace;
//debug(Y);
if (subSize) Y += (subColor || subFace ? ' ' : '') + subSize;
//debug(Y);
Y += '">';
//debug(Y);
text = text.replace(X,Y);
text = text.replace(/<\/font/ig, "</span");
} // while (true)
/*
ToDo:
- font color/size/face !!!
- uitzonderingen maken voor elementen tussen blockquote-, nowiki-, pre- en comment-tags !
*/
/*** Obsolete elements:***/
/* <big> */
text = text.replace(/(<big>){3,6}/ig, '<span style="font-size: xx-large;">'); //xxx-large werkt niet in Chrome !
text = text.replace(/(<big>){2}/ig, '<span style="font-size: x-large;">');
// 20220106: x-large voor zon en water
if (mw.config.get('wgTitle').indexOf("Leer jezelf ecologisch tuinieren") > -1) {
text = text.replace(/(?<=\| *zon *=.*)<big>/ig, '<span style="font-size: x-large;">');
text = text.replace(/(?<=\| *water *=.*)<big>/ig, '<span style="font-size: x-large;">');
}
text = text.replace(/<big/ig, '<span style="font-size: large;"');
text = text.replace(/(<\/big *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <center> */
text = text.replace(/<center/ig, '<div style="text-align: center;"');
text = text.replace(/<\/center/ig, "</div");
/* <small> */
text = text.replace(/(<small>){3,6}/ig, '<span style="font-size: xx-small;">');
text = text.replace(/(<small>){2}/ig, '<span style="font-size: x-small;">');
text = text.replace(/<small/ig, '<span style="font-size: smaller;"');
text = text.replace(/(<\/small *[a-z|0-9]*>){1,6}/ig, "</span>");
/* <source> 20220116 */
text = text.replace(/<source/ig,'<syntaxhighlight');
text = text.replace(/<\/source/ig,'</syntaxhighlight');
/* <strike> */
text = text.replace(/<strike/ig, "<s");
text = text.replace(/<\/strike/ig, "</s");
/* <tt> */
text = text.replace(/<tt/ig, "<code");
text = text.replace(/<\/tt/ig, "</code");
/*** Diversen: ***/
/* <br> */
text = text.replace(/\x20*<\/?br\x20?\/? ?>/ig, "<br>");
/* <br clear=left/right/all/both> */
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?left(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: left;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?right(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: right;">');
text = text.replace(/\x20*<br clear ?= ?(\x22|\x27)?(all|both)(\x22|\x27)?\x20?\/?>/ig, '<br style="clear: both;">');
/* <hr> */
text = text.replace(/<\/?hr\x20?\/?>/ig, "<hr>");
text = text.replace(/\[\[categorie/ig, "[[Categorie");
text = text.replace(/\[\[afbeelding/ig, "[[Afbeelding");
/* prettytable */
text = text.replace(/prettytable/ig, "wikitable");
/* WSBN nummer :-( */
text = text.replace(/\[WSBN( |-|_)?nummer/ig, " [WSBN");
text = text.replace(/.*Hier.*onderhoudsmeldingen.*\n/ig, "");
/* . ná <ref> */
while(true) {
X = /(?<!\.) ?<ref>.*?<\/ref>\./.exec(text);
if (X == null) break;
Y = X[0].replace(/ ?<ref>/,'.<ref>');
Y = Y.replace('</ref>.','</ref>');
text = text.replace(X,Y);
}
/* sjablonen en Magic Words */
text = text.replace(/{{{/g, "aW~d6-8Ht#yV_5"); // vervang "{{{" tijdelijk door code om varabelen te onderscheiden van sjablonen
/* Magic Words - 20230323 */
text = text.replace(/\{\{#categorytree:/g, "{{#Categorytree:");
text = text.replace(/\{\{#expr:/g, "{{#Expr:");
text = text.replace(/\{\{\s?#if:\s?/ig, "{{#If:");
text = text.replace(/\{\{ ?#invoke:/g, "{{#Invoke:");
text = text.replace(/\{\{ ?#pos:/g, "{{#Pos:");
text = text.replace(/\{\{ ?#switch:/g, "{{#Switch:");
/* Magic Words met 2 hoofdletters: 20230421 */
text = text.replace(/\{\{ ?#ife/ig, "{{#IfE");
/* oud:
text = text.replace(/\{\{ ?#iferror:/g, "{{#IfError:");
text = text.replace(/\{\{ ?#ifexpr:/g, "{{#IfExpr:");
text = text.replace(/\{\{ ?#ifexist:/g, "{{#IfExist:");
text = text.replace(/\{\{ ?#ifeq:/g, "{{#IfEq:");
*/
/* ISBN 20230625 */
// text = text.replace(/ISBN\s{1,3}/ig, "{{ISBN|");
// debug ("ISBN checken!");
// text = text.replace(/(?<=\{\{ISBN\|[0-9%s]{8,13})(( )|\.|,|\n)/ig, "}} "); // <-
/* ISBN exp. 20240121 */
text = text.replace(/ISBN\s{1,3}([0-9]\-?)*/ig, "{{$&}}");
text = text.replace(/\{\{ISBN\s{1,3}/ig, "{{ISBN|");
/* Sjabloonredirects vervangen 20220209 */
text = text.replace(/{{Beg(innetje)?}}/ig, "{{Begin}}");
text = text.replace(/{{Alleen afdrukken ?(\|\n|\n\|)/ig, '{{Alleen afdrukken inline\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Alleen afdrukken ?\|/ig, '{{Alleen afdrukken inline|');
text = text.replace(/{{Herhalen ?\|/ig, '{{Repeat|');
text = text.replace(/{{Niet afdrukken ?(\|\n|\n\|)/ig, '{{Niet afdrukken block\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Niet afdrukken ?\|/ig, '{{Niet afdrukken block|');
text = text.replace(/\n\| *Moeilijkheid *= *[ a-zA-Z]*/ig, ''); // 20251012
text = text.replace(/{{Zieook ?(\|\n|\n\|)/ig, '{{Zie ook\n|\n'); // extra \n tbv. sommige wikicodes
text = text.replace(/{{Zieook ?\|/ig, '{{Zie ook|');
/* text = text.replace(/{{Crd ?\|/ig, '{{Akkoord|'); klaar */
/* text = text.replace(/{{Akkoorden ?\|/ig, '{{Akkoord|'); klaar */
// eerst toepassen op _alle_ sjablonen, ipv. check op overbodige "|" ?
/* sjabloonnaam met hoofdletter */
{
while(true){
X = /{{[a-z]/.exec(text);
if (X == null) break;
Y = X[0].toUpperCase();
text = text.replace(X,Y);
}
/* Idem in Sjabloon:Tl: 20230421 -- ToDo
while(true){
X = /{{tl\|[A-Za-z]/i.exec(text);
alert("X1=" + X);
if (X == null) break;
alert("X2=" + X);
Y = X[0].toUpperCase();
alert("Y=" + Y);
text = text.replace(X, "{{Tl|" + Y);
alert("3=" + text.replace(X, "{{Tl|" + Y));
/ alert(X + " - " Y + " - " + text.replace(X, "{{Tl|" + Y));
}
*/
// overbodige pipe na sjabloonnaam
prev = text;
text = text.replace(/(?<={{[a-z,0-9, ,-]*) *\| *\n/ig, '\n|\n');
if (!(prev == text)) {
debug('checken: evt. eerste sjabloonparameter(s)!'); // alert
}
}
text = text.replace(/aW~d6-8Ht#yV_5/g, "{{{"); // herstel code naar "{{{" ---------------
/* {{Sub}} onderaan */
X = text.search(/{{sub}}/i);
if (X > -1 && X < 50) {text = text.replace(/{{sub}}\n?/i, '') + '{{Sub}}';}
/* lege regels voor {{sub}} */
text = text.replace(/\n ?\n*{{sub}}/ig,'\n{{Sub}}');
/* <tr> |- */
text = text.replace(/\|-+/g, "|-");
/* overbodige laatste <tr> */
text = text.replace(/ *\|-\x20*\n *\|}/g, "|}");
/* wikicode hr: 4 streepjes */
text = text.replace(/^-{5,}/g, "----");
text = text.replace(/\n-{5,}/g, "\n----");
/* http:// */
prev = text;
text = text.replace(/http:\/\//ig, 'https://');
if (!(prev == text)) {debug('Check externe links (https)!');} // alert
/* "xxe eeuw" in tekst */ { // 20220119
/* disabled: mag geen _links_ wijzigen ! 20220215
text = text.replace(/(?<=(1|2)?[0-9])e eeuw/g,'<sup>e</sup> eeuw');
text = text.replace(/(?<=(1|2)?[0-9])e-eeuw/g,'<sup>e</sup>-eeuw');
*/
}
text = text.replace(/\[\[categorie:/ig, "[[Categorie:");
text = text.replace(/\[\[:categorie:/ig, "[[:Categorie:");
/* Afsluitende tag op Categorie: 20220124, v2 */
if (mw.config.get('wgNamespaceNumber') == 14) {
text = text.replace(/'''{{PAGENAME}}(?!''')/i, "'''{{PAGENAME}}'''");
}
/* Check op nested span tags - 20220218 */
/*
if (text.search(/<\/span( color)?> ?<\/span>/i) > -1 ){
// alert('Check: nested span tags!?');
text = text.replace(/"><span style="/ig, ' ') // erg bot: alleen voor eco tuin ??
text = text.replace(/<\/span( color)?><\/span>/ig, '</span>'); // ,,
}
*/
/* {{Fase0..4}} -> {{Fase|0..4}} */
text = text.replace(/\{\{Fase(?=[0-4])/ig, '{{Fase|'); // 20250810
text = text.replace(/\{\{Fase([1-4])/ig, "{{Fase|$1"); // 20260514 dubbel
/* geen lege regel na kopje - 20230724 */
text = text.replace(/==\n\n(?!==)/g, "==\n");
// komma vóór <ref> // 20251004
text = text.replace(/ \<\/ref\>/ig, '</ref>');
text = text.replace(/ \<\/cite\>/ig, '</cite>');
// links wp fixen: // 20251004
if (mw.config.get('wgNamespaceNumber') == 0) {
text = text.replace(/\[\[:?w:(nl:)?(.*?)\]\]/ig , '{{Wp|$2}}');
}
text = text.replace(/\{\{W\|/ig, '{{Wp|'); // 20251008
text = text.replace(/\{\{W[^a-zA-Z]/ig, "{{Wp"); // dubbel
// objSummary.value = 'Lintfouten: Verouderde HTML elementen';
// document.getElementById('wpSummary').value = 'lf'; // 20260323
text = text.replace(/\{\{Sjabloon:/ig, "{{");
//aap ******* . + * ? ^ $ ( ) [ ] { } | / \ ********
// template:
// text = text.replace(/\{\{/ig, "{{");
text = text.replace(/\{\{Leer jezelf ecologisch tuinieren/ig, "{{Index Leer jezelf ecologisch tuinieren");
text = text.replace(/\{\{00%/ig, "{{0%");
text = text.replace(/\{\{Navigatie([\|,\n])/ig, "{{Bladeren2$1"); // 20260516
text = text.replace(/\{\{Recepten/ig, "{{Navigatie recepten");
text = text.replace(/\{\{Recept/ig, "{{Infobox recept"); // 2260516
text = text.replace(/\{\{Talen/ig, "{{Taal- en letterkunde");
/*
if (mw.config.get('wgTitle').indexOf("Programmeren in TI-Basic/") > -1) { // 20260420
text = text.replace(/\{\{Links\}\}\n/i, "");
// text = text + String.fromCharCode(13, 10) + "{{Links}}";
text = text + "{{Links}}";
}
*/
/* 20260413:
text = text.replace(/ategorie:GFDL afbeeldingen/ig, "ategorie:Bestanden met GFDL Licentie");
text = text.replace(/ategorie:Afbeelding naar licentie/ig, "ategorie:Bestand naar licentie");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons met dezelfde naam/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons met dezelfde naam");
text = text.replace(/ategorie:Wikibooks:Afbeelding beschikbaar op commons/ig, "ategorie:Wikibooks:Bestand beschikbaar op commons");
text = text.replace(/ategorie:Wikibooks:Afbeeldingen niet te verplaatsen naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand niet te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:PD-afbeeldingen/ig, "ategorie:Bestanden met PD Licentie");
text = text.replace(/ategorie:Ewmulti-afbeeldingen/ig, "ategorie:Bestanden met Ewmulti Licentie");
text = text.replace(/ategorie:Afbeeldingen zonder geldige licentie/ig, "ategorie:Bestanden zonder geldige licentie");
text = text.replace(/ategorie:Wikibooks:Verplaats naar Wikimedia Commons/ig, "ategorie:Wikibooks:Bestand te verplaatsen naar Wikimedia Commons");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by-sa/ig, "ategorie:Bestanden met Creative Commons Licentie by-sa");
text = text.replace(/ategorie:Afbeeldingen met Creative Commons Licentie by/ig, "ategorie:Bestanden met Creative Commons Licentie by");
text = text.replace(/ategorie:Afbeeldingen/ig, "ategorie:Bestand");
text = text.replace(/ategorie:Creative Commons-afbeeldingen/ig, "ategorie:Bestanden met Creative Commons Licentie");
*/
text = text.replace(/\{\{Information/i, "{{Informatie");
//text = text.replace(/\{\{Links\}\}\n/i, ""); // 20260412
//text = text.replace(/\{\{Sub\}\}/i, "{{Sub}}\n{{Links}}");
text = text.replace(/Youtube/g, "YouTube"); // 20260406
text = text.replace(/{{Clearboth/ig, "{{Clear both"); // 20260323
text = text.replace(/{{Clearleft/ig, "{{Clear left");
text = text.replace(/( | ){0,3}<ref(?!erences)/ig, ' <ref'); // 1 spatie voor <ref> 20260121
text = text.replace(/<ref(.*)?> <ref/ig, '<ref$1><ref'); // tenzij 2 x ref na elkaar
text = text.replace(/\{\{L\|(.*)\}\}/ig, '[[../$1/]]'); // {{L|x}} -> [[../x/]] 20251229
text = text.replace(/#DOORVERWIJZING ?/ig, '#Redirect ');
text = text.replace(/\{\{Boeksjabloon[^ \(]/ig, '{{Index basis\n');
text = text.replace(/\|naam cursus/ig, '|titel');
if (mw.config.get('wgPageName').indexOf('Sjabloon:Index_') > -1) { // mw.config.get('wgPageName') geeft {{FULLPAGENAME}} !
text = text.replace(/## ?\[\[/g , '**[[');
text = text.replace(/# ?\[\[/g , '*[[');
// ??? text = text.replace(/\[\[Categorie:Sjablonen index\]\]\n?/ig, '');
}
// {{tl}}:
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + '$1'.toUpperCase()); // werkt niet
// text = text.replace(/\{\{tl\|(a-z)/ig, '{{Tl|' + String($1).charAt(0).toUpperCase()); // crasht
// komma in getal -> punt - verder testen! - werkt maar t/m 999,999! :
// text = text.replace(/([0-9]{1,3}),([0-9]{3})/g, '$1.$2');
text = text.replace(/\{\{Schaak\/Bord\|=/ig , '{{Schaak/Bord2'); // 20251030
text = text.replace(/\|\n\|=/ig , '|\n|');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/(\n[1-8].*?)= ?\n/ig , '$1\n');
text = text.replace(/\{\{HTML-standaardattributen/ig, '{{HTML standaardattributen');
text = text.replace(/\{\{HTML (tags|elementen)/ig, '{{Navigatie HTML elementen'); // 20251016
text = text.replace(/\[\[(:)?File:/ig, '[[$1Bestand:'); // 20251009
text = text.replace(/\[\[(:)?Image:/ig, '[[$1Afbeelding:');
text = text.replace(/\n\n?\{\{Recepten\}\}/ig, '\n{{Navigatie recepten}}'); // 20251012
text = text.replace(/\{\{Beg\}\}/ig, '{{Begin}}'); // 20251022
text = text.replace(/\{\{Boekenplanken\}\}/ig, '{{Navigatie boekenplanken}}'); // 20251022
/*** Eenmalige acties ***/
text = text.replace(/\[\[Kookboek\/\bDessert\b/ig, '[[Kookboek/Nagerecht'); // 20251012
text = text.replace(/\{\{TOCRechts/ig, '{{TOC rechts'); // 20230417
text = text.replace(/\{\{Wikt(?=(\||\}))/ig, '{{Wiktionary'); // 20230514
text = text.replace(/\{\{Woordenboek Index\}/ig, '{{Alfabet met links}'); // 20230520
text = text.replace(/se wikipedia/ig, 'stalige Wikipedia'); // 20230614
text = text.replace(/background: ?none;? ?/ig, ''); // 20250711
text = text.replace(/\n?\n\n\n\{\{Recepten\}\}/ig, '\n\n{{Recepten}}'); // 20250805
text = text.replace(/\{\{Recept\n\|\n/ig, '{{Recept\n'); // 20250805
text = text.replace(/(?<![a-zA-Z])NB(\.(\:)?|\:) ?/g, 'NB '); // 20250817
text = text.replace(/Wiskunde voor MBO techniek\//g, 'Wiskunde voor MBO techniek 1/'); // 20250824
/*** Archief eenmalige acties ***/
/*
text = text.replace(/\{\[Clear both/ig , "{{Clear both");
text = text.replace(/{{Clearright/ig , "{{Clear right");
text = text.replace(/{{Boeken/ig , "{{Post-it/Boeken");
// tbv. Maatschappijleer/Alfabetische woordenlijst maatschappijleer - 20260303:
// text = text.replace(/; ?<<!-- ?/ig , ';<!--');
// text = text.replace(/ ?-->span>/ig , '-->');
// text = text.replace(/;<\/span>/ig , ';');
// text = text.replace(/\[\[Categorie:Land\]\]/ig, '[[Categorie:Land in Europa]]'); // 20260125
if (mw.config.get('wgTitle').indexOf('Atlas van') > -1) { // wd-properties vervangen; 20260119
text = text.replace(/(property|statements):P18/ig, '$1:afbeelding');
text = text.replace(/(property|statements):P31/ig, '$1:is een');
text = text.replace(/(property|statements):P35/ig, '$1:staatshoofd');
text = text.replace(/(property|statements):P47/ig, '$1:grenst aan');
text = text.replace(/(property|statements):P122/ig, '$1:regeringsvorm');
text = text.replace(/(property|statements):P206/ig, '$1:gelegen in of aan waterlichaam');
text = text.replace(/(property|statements):P361/ig, '$1:onderdeel van');
text = text.replace(/(property|statements):P571/ig, '$1:datum van oprichting of creatie');
text = text.replace(/(property|statements):P1539/ig, '$1:vrouwelijke bevolking');
text = text.replace(/(property|statements):P1540/ig, '$1:mannelijke bevolking');
text = text.replace(/(property|statements):P2131/ig, '$1:bruto binnenlands product');
}
// tbv. [[Wikibooks:Lijst van eigenschappen van Wikidata-items]]: (20251211))
text = text.replace(/\<br\>\[\[d:Property talk:P[0-9]{1,5}\|talk\]\]\<br\>\[\[d:Wikidata:Database reports\/Constraint violations\/P[0-9]{1,5}\|covi\]\]\|/ig, '|');
// voor [[Onderwijs in relatie tot P2P]] :
text = text.replace(/tot P2P\/(.*)/g, 'tot P2P/$1|$1]]');
text = text.replace(/{{StringReplace ?\|/ig, '{{Replace|');
if (mw.config.get('wgNamespaceNumber') == 3) { // "Overleg gebruiker"; 20251116
text = text.replace(/\{\{Zandbak\}\}/ig, '{{Zb}}');
}
text = text.replace(/\{\{Bladeren(2|3)/ig, '{{Bladeren4'); // 20230531
text = text.replace(/\[\[Categorie:Weglaten bij afdrukken.*?\]\]\n?/ig, ''); // 20251024
text = text.replace(/\{\{Miljoen/ig, '{{Afronden'); // 20251005
// lintfouten: Ingebedde stijlregel voor de achtergrondkleur zonder bijbehorende tekstkleur // 20250711
text = text.replace(/(color: ?(black|inherit); ?)?background(-color)?:/ig, 'color: inherit; background-color:');
if (mw.config.get('wgNamespaceNumber') == 14) { // 20251009
if (mw.config.get('wgTitle').indexOf('- inhoud') > -1) {
text = text.replace(/\n?\[\[Categorie:Hoofdstuk.*?\]\]\n?/ig, '');
if (text.indexOf('Categorie:Inhoud') > -1) {
// window.location.assign('https://nl.wikibooks.org/w/index.php?title=Categorie:Inhoud');
return;
}
text = text.replace(/\n?\[\[Categorie:Inhoud\]\]\n?/ig, '');
text = text + '[[Categorie:Inhoud]]\n'; // toevoegen indien cat:hoofdstuk nog niet aanwezig
// werkt niet (edit wordt niet opgeslagen):
// var Button = document.getElementById("wpSave");
// Button.click();
}
}
var X = mw.config.get('wgPageName');
document.write(X + '__');
var Y = X.search('Wikibooks:Infobox/');
document.write(Y + '__');
if (Y > -1) {
document.write('ja__');
text = text.replace(/--\>\|.*boekenplank.*(taal( en letterkunde)?|talen)/ig, '-->| boekenplank = Taal en letterkunde');// 2025100?
}
text = text.replace(/\{\{Abc\}\}/ig, '{{Alfabet met ankers}}'); // 20230414
text = text.replace(/\[\[Categorie\:Sjablonen sjabloondocumentatie/ig, '[[Categorie:Sjabloondocumentatie');
text = text.replace(/Moderne/g , 'moderne'); // 20251006
text = text.replace(/Hedendaagse/g , 'hedendaagse');
text = text.replace(/Architectuur/g , 'architectuur');
// rode (wp-)links ontlinken:
// tbv. [[Veelvoorkomende misvattingen/Wetenschap en technologie]]
// "lazy" mode: (.*?) - https://javascript.info/regexp-greedy-and-lazy ! :-)
// problemen:
// * afb. met link(s) in de caption gaan stuk -> handmatig op te lossen
// * links met afwijkende omschrijving worden zichtbaar -> niet ,,
// 2: te behouden links veiligstellen:
text = text.replace(/\[\[((Afbeelding|Bestand|bibcode|doi|File|Image|Media):.*?)\]\]/ig, 'REPL251005pre$1REPL251005post');
// 3: alle overige links omzetten naar tekst:
text = text.replace(/\[\[(.*?)\]\]/ig, '$1');
text = text.replace(/\[\[(.*?)\]\]/ig, '$1'); // 2e keer tbv. geneste links!
// 4: te behouden links herstellen:
text = text.replace(/REPL251005pre/g, '[[');
text = text.replace(/REPL251005post/g, ']]');
*/
/*
text = text.replace(/{{Receptmetafbeelding/ig, '{{Infobox recept'); // 20230312, 20251011
te gretig; text = text.replace(/,\<ref\>(.*)\<\/ref\>/ig , '<ref>$1</ref>,'); // 20251004
text = text.replace(/\[Spaans\/Les( |_)0/ig , '[Spaans/Les '); // 20250930
text = text.replace(/Categorie\:Ingrediënt\/Drank/ig , 'Categorie:Drank') // 20250929
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Fruit/ig , 'Categorie:Fruit') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Gevogelte/ig , 'Categorie:Gevogelte') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Graan/ig , 'Categorie:Graan') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Groente/ig , 'Categorie:Groente') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Zuivel/ig , 'Categorie:Zuivel') // ,,
text = text.replace(/Categorie\:Kookboek\/Ingrediënt\/Vruchtensap/ig , 'Categorie:Vruchtensap') // ,,
*/
/* text = text.replace(/Italiaans.*Antwoorden.*\]\]/g, mw.config.get('wgTitle') + '/Antwoorden]]'); // 20250920 */
/* text = text.replace(/Italiaans\/Les0?/g, 'Italiaans/Les '); // 20250920 */
/* text = text.replace(/ hele )/ig, ' heel '); //20250920 */
/* text = text.replace(/WikiJunior/g, 'Wikijunior'); // 20250718 */
/* text = text.replace(/\{\{TOCLinks/ig, '{{TOC links'); // 20230417 */
/* text = text.replace(/\/(.{1,65})\]\]/ig, '/$1|$1]]'); // 20250903 */
/* text = text.replace(/\{\{Uitleg\|(.{5,43})\|(.{5,43})\}\}/ig, '{{Hover|tekst=$2|hovertekst=$1}}'); // 20250901 */
/* text = text.replace(/\{\{Tuin(\n|\|)/i, '{{Tuinkalender'); // 20250803 */
/* text = text.replace(/\{\{Tuinkalender\|Pagina.*tuinieren\/(.*)\|tuinkalender\]\]\n?\|Onderdeel\=(.*)\n\}\}/i, '{{Tuinkalender|$1|$2}}'); // 20250831 */
/* text = text.replace(/(?<=g)allerij/ig, 'alerij'); // 20230614 */
/* text = text.replace(/(?<=t)utti frutti/ig, 'uttifrutti'); // 20250817 */
/* text = text.replace(/\{\{\#babel\:/ig, '{{Babel|'); // 20250813 */
/* text = text.replace(/\n/g, ']]\n'); // 20250812 */
/* text = text.replace(/gerbuik/g, 'gebruik'); // 20250806 */
/* text = text.replace(/\{\{Noindex\}\}/ig, '__NOINDEX__'); */
/* text = text.replace(/\{\{Clear\}\}/ig, '{{Clearboth}}'); */
/* text = text.replace(/\| ?Naam ? ?= ? ?{{PAGENAME}}/, '| Naam = '); // 20250805 */
/* text = text.replace(/Categorie:Sjablonen voor een bepaald boek/ig, 'Categorie:Sjablonen talen en dialecten'); */
/* text = text.replace(/Categorie\:Fase(?=[0-4])/ig, 'Categorie:Fase ');*/ // 20250803
/* 1e img van Sjabloon:Gestarte boeken verwijderen */
// text = text.replace(/ ?\[\[Bestand:.-4\.svg\|.px\]\] ?/ig , '\n'); // 20250722
// text = text.replace(/ /ig , ' ');
// text = text.replace(/\* ? ?/ig , '<br>\n');
// text = text.replace(/\]\] \{\{/ig , ']]{{');
// text = text.replace(/\{\{0%/ig , '00%');
//text = text.replace(/Chillipepers\.nl/ig, 'chillipepers.nl'); // 20250722
//text = text.replace(/Chillipeper\.nl/ig, 'chillipeper.nl'); // ,,
// text = text.replace(/Basiskennis( |_)chemie6\//g, 'Basiskennis chemie 6/'); // 20250906
// // document.getElementById('wpSummary').value = 'lf'; werkt niet!??
// ---------------------------------------------------------------------------------------------
/* tbv. lintfouten op overleg gebruiker */
// text = text.replace(/('''|\<\/?b\>)/ig, ""); /* 20230627 */
/* tbv. verkeerd geneste tags op overleg:gebruiker */
// text = text.replace(/\<\/?span.*?\>/ig, ""); /* 20230627 */
// obj.value = 'Lintfouten: Verkeerd geneste tags';
/* test: CSS beter leesbaar maken - 20230519 */
text = text.replace(/(?<=style\=\".*): *(?=\>)/ig, ": "); /* too greedy; check "http(s):, /File: etc. ! */
text = text.replace(/(?<=style\=\"); ?(?=\")/ig, "; ");
/* ------ oud -------------
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen Wikibooks-gebruikers');
text = text.replace(/\[\[Categor(ie|y):Sjablonen(?=[\||\]\]])/ig, '[[Categorie:Sjablonen voor een bepaald boek');
// "xxe eeuw" in titel { // 20220119
var title = mw.config.get('wgTitle');
var pattern = /(?<=(1|2)?[0-9])e-eeuw/;
if (text.search(/{{DISPLAYTITLE:/) == -1) {
if (title.search(pattern) > -1) {
text = '{{DISPLAYTITLE:' + title.replace(pattern,'<sup>e</sup>-eeuw') + '}}' j+ text;
}
}
else debug('{{DISPLAYTITLE: is niet vervangen');
}
// tijdelijk (tbv "Lintfouten: Afsluitende tag ontbreekt")
text = text.replace(/{{cat\|?/ig, "{{Cat");
text = text.replace(/{{boekcat\|/ig, "{{Boekcat");
text = text.replace("'''{{PAGENAME}}", "'''{{PAGENAME}}'''");
*/
/* verplaatsen naar andere categorie:
text = text.replace(/\[\[Categorie:Aardrijkskunde/ig, "[[Categorie:Geografie");
*/
/* sig BeeBringer:
text = text.replace(/\[\[Bestand:BeeBringer.png\]\].*?\<\/sup>/, '\n[[Gebruiker:BeeBringer|BeeBringer]] [[Overleg_gebruiker:BeeBringer|overleg]]');
text = text.replace(/u wijzingen/, 'uw wijzigingen');
*/
/* div. typefouten */
// text = text.replace(/(?<=w)ijzingen/, 'ijzigingen');
text = text.replace(/paramaters/, 'parameters');
/*** Einde ***/
/* niets veranderd? */
if (obj.value == text) return; /* exit */
obj.value = text; /* klaar om op te slaan */
// obj.value = obj.value + '\n\n' + text; // TIJDELIJK!!
/*** Samenvatting ***/
var obj = document.getElementById('wpSummary');
// obj.value = 'cat';
// obj.value = 'Lintfouten: Verouderde HTML-elementen';
// obj.value = 'Lintfouten: Afsluitende tag ontbreekt';
/* tijdelijk (voor eenmalige acties): */
// obj.value = '[[Categorie:Sjablonen voor een bepaald boek]]';
// obj.value = '[[Categorie:Sjablonen Wikibooks-gebruikers]]';
/*** Niet volgen tenzij reeds eerder gevolgd ***/
var obj = document.getElementById('ca-watch');
if (obj) {document.getElementById('wpWatchthis').checked = false;}
return;
}
function addPurgeTab() {
/* Voegt een "purge" tabje toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
if(!document.getElementById) return;
var x = document.getElementById('ca-history');
if(! x) { return; }
var tabs = document.getElementById('p-cactions').getElementsByTagName('ul')[0];
if(x.children) { x = x.children[0]; }
else { x = x.childNodes[0]; }
addlilink(tabs, x.href.replace(/=history/, "=purge"), 'purge', 'ca-purge');
// ta['ca-purge'] = ['g', 'Purge the internal cache for this page']; // "ta is not defined"
}
function addlilink(tabs, url, name, id) {
/* voegt tabjes toe
(bron: https://nl.wikipedia.org/wiki/Gebruiker:Pjetter/monobook.js) */
var na = document.createElement('a');
na.href = url;
na.appendChild(document.createTextNode(name));
var li = document.createElement('li');
li.id = id;
li.appendChild(na);
tabs.appendChild(li);
return li;
}
function experiment() { // (om 'Inklappen' resp. 'Uitklappen' te vervangen)
UitklapDivHide = '▲'; // U+25B2 kleiner: ▴ u+25B4 werkt niet
UitklapDivShow = '▼'; // U+25BC kleiner: ▾ u+25BE ,, ,,
}
function automatePurgeConfirmationDialog() {
/* Automate purge confirmation dialog. (https://en.wikipedia.org/wiki/Wikipedia:Purge) */
if (mw.config.get('wgAction') === 'purge' ) {
$('form[action*="action=purge"]').submit();
}
return;
}
function markeerLintErrors() { // 20220114
// Markeert aantallen > 0 op Speciaal:LintErrors met een rode achtergrond.
if (! (mw.config.get('wgPageName') == 'Speciaal:LintErrors')) return; /* exit */
var list = document.getElementsByTagName("BDI");
if (list.length == 0) return;
for (i=0; i<list.length; i++) {
if (! (list[i].innerHTML == '(0 fouten)')) {
list[i].style.background = '#ff8080';
}
}
return;
}
function createDebug() { // v2, 20220113
// Creëert een debug-venster direct boven het bewerkingsvak.
var obj = document.getElementById('wpTextbox1');
var parent = document.getElementById('editform');
var newItem = document.createElement("DIV");
newItem.id = 'debug';
newItem.style.display='none';
var textnode = document.createTextNode("");
newItem.appendChild(textnode);
parent.insertBefore(newItem, obj);
}
function debug(txt) {
// Voegt een regel tekst toe aan het debug-venster.
var obj = document.getElementById('debug');
if (obj == null) return; /* exit */
obj.style.display = 'block';
obj.innerHTML = obj.innerHTML + txt.replace(/</g,'<') + '<br>';
}
function massDelete() { /* tbv. verwijderen ~450 pagina's, zie lijst op LJET/Gewenste pagina's */
if (mw.config.get('wgTitle').indexOf('Leer jezelf') == -1) return;
if (mw.config.get('wgAction') != 'delete') return;
document.getElementById('ooui-php-2').value = 'Verwijdersessie 3 september 2025';
document.getElementById("deleteconfirm").submit();
return;
}
function insertTekst() {
var title = mw.config.get('wgTitle');
if ((title.search(/Kookboek [0-9]{1,2} /i)) == 0) {
if (mw.config.get('wgNamespaceNumber') == 10) {
if (mw.config.get('wgAction') == 'view') {
window.location += '?action=edit';
var text = document.getElementById('wpTextbox1').value;
text = '__EXPECTUNUSEDCATEGORY__\n' + text;
}
}
}
return;
}
function capFirst(str) {
/* fix all-caps en camel-case */
return str[0].toUpperCase() + str.slice(1).toLowerCase();
}
// </nowiki>
qvvklhws7eq90jxqz7qwyc88c46w73i
Kookboek/Broccoli met kaassaus
0
29850
428105
402675
2026-05-20T05:28:13Z
Erik Baas
2193
lf
428105
wikitext
text/x-wiki
{{Infobox recept
| Naam = Broccoli met kaassaus
| Afbeelding = [[Bestand:Tomatsauce med ansjoser, tun, broccoli og kapers (4460999026).jpg|300px]]
| Onderschrift = Broccoli met tomatensaus
| Categorie = Rijstrecept
| Porties = 4
| Energie =
| Tijd = 60 min
| Stippen = 3
}}
[[Kookboek/Recepten|Receptenindex]]
==Ingrediënten==
*2 {{Kb|p=Ui|uien}}
*500 g {{Kb|tomaat}}
*[[Kookboek/Olie|(zonnebloem)olie]]
*250 gram {{Kb|gehakt}}
*50 gram {{Kb|boter}}
* 1 {{Kb|ei}}
*[[Kookboek/Zout|zout]]
*[[Kookboek/Peper|peper]]
*2 stronken {{Kb|broccoli}}
*200 g {{Kb|roomkaas}}
*50 g {{Kb|bloem}}
*2 (groente)bouillonblokjes
*200 g {{Kb|rijst}}
==Bereiding==
#Snipper de ui en bak deze zacht in de olijfolie. Voeg later het gehakt bij en bak dit rul.
#Kook ondertussen water met 1 bouillonblokje. Snijd de roosjes broccoli van de stronken en kook deze in 5 min gaar in de bouillon, zet daarna apart.
#Snijd een klein kruisje in de schil van de tomaten en doe deze ong. 1 min in de kokende bouillon totdat de schil loslaat.
#Ontvel de tomaat, haal de harde stukken eruit en snijd deze in blokjes. Bak deze kort mee met de ui/het gehakt.
#In de kookbouillon van de broccoli/tomaat kun je nu de rijst koken.
#Splits het ei en roer de dooier in een schaal door de roomkaas.
#Maak van 500 ml heet water en het andere bouillonblokje bouillon en roer dit scheutje voor scheutje door het kaasmengsel.
#Smelt de boter in een sauspannetje en bak de bloem ongeveer 2 min. mee, terwijl je het flink van de bodem blijft roeren.
#Schep daarna (met een soeplepel bijv.) beetje bij beetje de kaasbouillon door de bloem tot het een saus is.
#Roer de saus door het gehakt en voeg de broccoli en de rijst hieraan toe.
==Opmerkingen, tips en variaties==
Tip: de roomkaas geeft een zachte smaak. Door (deels) wat pittigere kaas te gebruiken (geraspte oude kaas, of blauwschimmelkaas), krijgt het gerecht een wat pittiger smaak.
Aan de ui en tomaat kan naar smaak peper en zout worden toegevoegd vlak voor het de pan in gaat.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Groentenrecept|Broccoli]]
[[Categorie:Saus|Broccoli]]
iejioucbhtika9safp4h3mhvtp7q81i
Kookboek/16e-eeuwse gelatinepudding
0
29872
428088
404972
2026-05-20T05:27:58Z
Erik Baas
2193
lf
428088
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding =
| Onderschrift =
| Categorie =
| Porties =
| Energie =
| Tijd =
| Stippen =
}}
Dit recept voor een 16<sup>e</sup>-eeuwse amandelpudding komt oorspronkelijk uit een kookboek dat is geschreven door de Duitse kok {{Wp|en:Marx Rumpolt|Marx Rumpolt}}. Waarschijnlijk was deze pudding een van de gerechten die Rumpolt geregeld maakte voor zijn meester, de aartsbisschop van Mainz.
Het onderstaande recept is goed voor 1 liter pudding.
==Ingrediënten==
*ca. 200 gram amandelmoes
*7 dl ongegist wit {{Kb|druivensap}}
*wat vloeibare honing
*25 gram vislijm
*3 dl water
==Bereidingswijze==
#Breng het water aan de kook en laat de vislijm hierin oplossen.
#Meng de amandelmoes met een deel van het druivensap tot een vloeibaar geheel. Voeg vervolgens de rest van het druivensap, de honing en het water met de opgeloste vislijm toe.
#Het geheel even laten doorkoken en intussen goed blijven roeren.
#Het geheel in een puddingvorm gieten en koud en stijf laten worden.
==Variaties==
In plaats van vislijm kan ook gewone gelatine worden gebruikt. In dit geval de gelatine niet laten koken.
{{Sub}}
{{Bron|bronvermelding=
*Winter, J.M. van (1976), ''Van soeter cokene. Recepten uit de oudheid en de middeleeuwen'', Haarlem: Fibula-van Dishoeck, {{ISBN|90 228 4291 6}}, p.42
}}
{{Navigatie recepten}}
[[Categorie:Historisch recept|gelatinepudding]]
0ipru1j8uis7owpyktnmpmmayjexdcl
Kookboek/Historisch recept
0
29873
428112
404973
2026-05-20T05:28:25Z
Erik Baas
2193
lf
428112
wikitext
text/x-wiki
Hier vindt u een overzicht van allerlei historische recepten.
==Hoofdgerechten==
*[[Kookboek/Asperges à la Flamande|Asperges à la Flamande]]
*[[Kookboek/Balkenbrij|Balkenbrij]]
*[[Kookboek/Kalfslever met druiven|Kalfslever met druiven]]
==Nagerechten==
*[[Kookboek/16e-eeuwse gelatinepudding|16e-eeuwse gelatinepudding]]
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Historisch recept| ]]
b44wqsjuvuqimxke1t4ui82i8j5mdii
Kookboek/Zevenbladtapenade
0
29884
428099
398792
2026-05-20T05:28:06Z
Erik Baas
2193
lf
428099
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Zevenbladtapenade
| Categorie =
| Porties = 60 gram
| Tijd = 5 minuten
| Stippen = 1
}}
Een goede manier om van die zevenblad in je tuin af te komen.
== Ingrediënten ==
* 3 scheuten {{Kb|olijfolie}} extra vierge
* 2 el. {{Kb|p=feta|fetakaasblokjes}}
* 1 el. pijnboompitten
* 1 teentje knoflook
* handvol zevenbladblaadjes van de top
* snufje peper en zout
* basilicum naar smaak
== Bereiding ==
* Doe de olijfolie, feta, pijnboompitten, knoflook, zevenblad, peper en zout (en basilicum) in een foodprocessor.
* Mix een halve minuut door elkaar.
* Doe in een bakje.
{{Navigatie recepten}}
[[Categorie:Saus|Zevenbladtapenade]]
{{Sub}}
q3wgcpgtz5z0rfp67lkmzmmhth0rarc
Kookboek/Little Red Rooster
0
29954
428100
395403
2026-05-20T05:28:08Z
Erik Baas
2193
lf
428100
wikitext
text/x-wiki
'''Little Red Rooster''' is een cocktail van likeur, citroen en sinaasappel.
== Ingrediënten ==
* 20 ml cointreau
* 60 ml witte martini
* 20 ml campari
* schijfje citroen
* schijfje sinaasappel
== Bereiding==
# Gebruik een whiskyglas.
# De cointreau, martini en campari bij elkaar doen in een cocktailshaker.
# Goed schudden en versieren met de schijfjes citroen en sinaasappel.
{{Navigatie recepten}}
[[Categorie:Cocktail|Little Red Rooster]]
{{Sub}}
cmr2cehsucbmd7midy3j1dhlz21fkah
Kookboek/Brodo
0
30054
428090
400711
2026-05-20T05:28:00Z
Erik Baas
2193
lf
428090
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Brodo
| Afbeelding = [[Afbeelding:Készül a húsleves.jpg|300px]]
| Onderschrift=''Vegetarische Brodo''
| Categorie = Soeprecept
| Porties = 4
| Energie =
| Tijd =
| Stippen = 2
}}
[[Kookboek/Italiaanse keuken|Italiaanse keuken]] | [[Kookboek/Pastagerecht|Pastagerecht]] | [[Kookboek/Soep|Soep]] | [[Kookboek/Recepten|Receptenindex]]
Een voorbeeld van een Italiaanse ''brodo'' is dit recept voor een [[Kookboek/Groenten|groentesoep]] met [[Kookboek/Gevogelte|kip]] of soepvlees en [[Kookboek/Pastagerecht|pasta]]. Brodo is een hoofdgerecht dat door veel Italianen met [[Kookboek/Kaas|kaas]] gegeten wordt.
==Ingrediënten ==
*400 g {{Kb|p=Kip|kipvlees}}: eerst koken in de soep en daarna uitpluizen;
*800-1000 g groenten: {{Kb|prei}}, {{Kb|bladselderij}}, {{Kb|champignon|champignons}}, {{Kb|wortel}}, {{Kb|p=doperwt|erwtjes}} en een beetje geconcentreerde [[Kookboek/Tomaat|tomatensaus]];
*300 g {{Kb|pasta}}: men kan eender welke pasta kiezen, zolang die maar bij het gerecht past. [[Kookboek/Vermicelli|Vermicelli]] is bijvoorbeeld ook mogelijk;
*2 [[Kookboek/Bouillon|kippenbouillonblokjes]];
*Kruiden: zout, peper, {{Kb|cayennepeper}}.
==Recept==
# Maak de groenten schoon.
# Neem een grote kookpot (soeppan) en voeg de kip er bij met de groenten.
# Voeg er dan water bij tot de kip onder water staat.
# Doe er nu de twee kippenbouillonblokjes bij en kruid met zout en de pepers.
# Als de kip gaar is, haal je die uit de pot.
# Laat de kip afkoelen op een bord.
# Als de kip koud is doe je de kip in stukjes weer in de soep.
# Alles weer warm laten worden door het aan de kook te brengen. Voeg de pasta erbij en laat die gaar worden.
# Als dat het geval is en juist voordat je aan tafel gaat moet je de vermicelli toevoegen en even laten meekoken.
{{Navigatie recepten}}
[[Categorie:Soeprecept|Brodo]]
[[Categorie:Pastarecept|Brodo]]
[[Categorie:Italiaanse keuken|Brodo]]
[[Categorie:Eenpansgerecht|Brodo]]
{{Sub}}
77lg4gncyz1sk272e9ijtij6yn6pbdo
Kookboek/Siciliaanse spaghetti
0
30055
428103
399640
2026-05-20T05:28:11Z
Erik Baas
2193
lf
428103
wikitext
text/x-wiki
{{Infobox recept|Siciliaanse Spaghetti
| Naam = Kookboek/Siciliaanse Spaghetti
| Afbeelding = [[Bestand:Espaguetis con carne picada y tomate.jpg|300px]]
| Categorie = pastarecept
| Porties =4
| Energie =
| Tijd =een uur
| Stippen =2
}}
==Ingredienten==
*500 g {{Kb|p=gehakt|Rundergehakt}}
*150 g geraspte Parmezaanse {{Kb|kaas}}
*1 ei
*200 g vers broodkruim (van witbrood)
*een paar tenen knoflook
*een snufje nootmuskaat
*olijfolie
*1 flinke ui
*250 g ontvelde, ontpitte en in kleine stukjes gesneden {{Kb|tomaat}}
*1 pak gezeefde tomaten
*1 grote rode {{Kb|paprika}}
*250 ml {{Kb|rode wijn}}
*fijngesneden verse basilicum, en oregano
*{{Kb|pasta}} naar keuze, bijv. spaghetti
==Bereiding==
#Maak het gehakt aan met de kaas, ei, broodkruim, en knoflook en wat nootmuskaat.
#Vorm hiervan kleine gehaktballetjes, en braad deze in wat olijfolie gaar.
#Bak de in stukjes gesneden ui, de gesneden paprika en de verse tomaat even mee.
#Voeg het pak gezeefde tomaten en de rode,wijn toe en laat het geheel c.a. 20 minuten sudderen.
#Voeg vlak voor het opdienen de verse groene kruiden aan het gerecht toe, en laat deze even meekoken.
==Opdienen==
Dien het gerecht op met knoflookboter en knapperig stokbrood, spaghetti of macaroni.
{{Navigatie recepten}}
[[Categorie:Pastarecept|Siciliaanse]]
[[Categorie:Italiaanse keuken|Siciliaanse spaghetti]]
{{Sub}}
8udsd1le84kyhzwcpcxeif58hkfysjr
Kookboek/Mergballetjes
0
30267
428121
396182
2026-05-20T05:28:44Z
Erik Baas
2193
lf
428121
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Mergballetjes
| Afbeelding = [[Bestand:Markkloesschensuppe.jpg|300px]]
| Categorie = Soeprecept
| Porties =
| Energie =
| Tijd = voorbereidingstijd 30 minuten, bereidingstijd 15 minuten
| Stippen = 3
}}
==Ingrediënten==
*2 {{Kb|p=mergpijp|mergpijpjes}} van rund
*2 eieren
*zout
*peper
*nootmuskaat
*{{Kb|paneermeel}}
==Bereiding==
*Haal het merg uit het bot (op kamertemperatuur) met een klein scherp mesje.
*Prak het merg fijn met een vork, voeg twee eieren toe en meng het geheel.
*Breng op smaak met zout, peper en nootmuskaat
*Meng alles tot een kneedbare massa met behulp van paneermeel.
*Maak, om te testen, één soepballetje en kook dit in bouillon in een apart pannetje. Mocht dit balletje uiteen vallen, voeg dan aan de massa nog wat paneermeel toe. Test eventueel opnieuw. Valt het testballetje niet uiteen, dan is de massa goed.
*Draai nu soepballetjes van de massa en voeg ze voorzichtig toe aan de kokende bouillon.
*Laat deze ongeveer 15 minuten zachtjes koken.
*De mergballetjes zijn nu klaar en kunnen toegevoegd worden aan soep.
Eet smakelijk!
{{Navigatie recepten}}
[[Categorie:Soeprecept|Merg]]
{{Sub}}
716dxktnq4wmc786k9dpg32qe7071cs
Kookboek/Rundvlees in bier
0
30414
428101
401735
2026-05-20T05:28:08Z
Erik Baas
2193
lf
428101
wikitext
text/x-wiki
{{Infobox recept
| Naam = Kookboek/Rundvlees in bier
| Afbeelding = [[Bestand:Bockbiergulasch Rind Brauhaus Coburg.JPG|300px]]
| Onderschrift = Rundvlees in bockbier met bijgerechten
| Categorie = Vleesrecept
| Porties =4
| Energie =
| Tijd = ca 3 kwartier voorbereiden, ca 2.5 a 3 uur stoven
| Stippen =3
}}
==Ingrediënten:==
*ruim 500 gr doorregen {{Kb|p=rundvlees|stoofvlees}} (riblap, borststuk oid)
*2 flinke uien
*een paar tenen knoflook
*reuzel of boter
*1 klein blikje {{Kb|tomatenpuree}}
*2 dl krachtige {{Kb|bouillon}}
*1 fles donker hoparm {{Kb|bier}} (Rodenbach Grand Cru is prima, maar een geuze of lambiek is ook bruikbaar)
*zwarte peper
*zout
*laurier
*{{Kb|piment}}
*verse tijm
*grove mosterd
*een snee oud witbrood
*een eetlepel bloem
*eventueel wat bruine suiker
==Bereiding:==
Het vlees en de uien in niet te kleine stukken snijden, en de knoflooktenen fijnsnijden. Het vlees kruiden met peper, zout, en piment.
In een pan met dikke bodem de reuzel of boter goed heet laten worden en het vlees rondom aanbraden (eventueel in kleinere porties) als het vlees goed bruin is dit uit de pan nemen en onder folie warmhouden.
Het vuur temperen en de uien glazig en bruin bakken. Bloem toevoegen en deze wat mee laten kleuren, knoflook erbij (niet bruin laten worden) en afblussen met het bier.
De tomatenpuree, het vlees, laurierblad, tijm en eventueel wat bruine suiker toevoegen en de vloeistof met bouillon aanvullen tot het vlees net onder staat. Het brood met de mosterd besmeren, en omgekeerd op het vlees leggen. De pan sluiten en het gerecht in 2 tot 3 uur zachtjes gaar stoven.
Om aanbranden te voorkomen kun je dit heel goed in een warme oven doen (150-160 graden), anders op het kleinste gaspitje. Hoe langzamer dit gaat, hoe beter het resultaat. Als de saus te dik wordt, deze tussentijds met wat bouillon aanvullen.
Serveren met aardappelpuree, gebakken aardappelen of een gratin en een krachtig smakende groente zoals rode kool, sperzieboontjes, spruitjes of andijvierolletjes met spek. Bij een feestelijke gelegenheid zijn meerdere aardappel en groentegerechten een optie.
== Varianten ==
* [[Kookboek/Vlaamse stoofkarbonaden|Vlaamse stoofkarbonaden]] - zonder bier
{{Navigatie recepten}}
[[Categorie:Vleesrecept|Rundvlees]]
[[Categorie:KB-riblap]]
{{Sub}}
tobspqmdos6rqpy30g8tb8byybmxwqg
Kookboek/Whoopie
0
30536
428094
396580
2026-05-20T05:28:03Z
Erik Baas
2193
lf
428094
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Whoopie
| Afbeelding = [[Bestand:Halloween Whoopie Pies on wire rack.jpg|300px]]
| Categorie = Koekjes
| Porties = 15 whoopies
| Energie =
| Tijd = 25 minuten + bereiding vulling
| Stippen = 3
}}
== Basisrecept ==
Voor 15 whoopies is nodig:
=== Ingrediënten ===
* 120 gram boter
* 100 gram suiker
* 2 eieren
* 250 gram bloem
* 1 theelepel chemische gist
* 150 milliliter melk
=== Bereidingswijze ===
# Verwarm de oven voor op ± 180 °C.
# Bedek een bakplaat met bakpapier (buiten de oven).
# Klop de boter en de suiker tot een gladde massa. Voeg vervolgens de eieren, gezeefde bloem, gist en melk toe en klop het geheel tot een glad beslag.
# Verdeel het beslag in 30 kleine hoopjes op de bakplaat. Let er goed op dat er minimaal 2 centimeter tussen het beslag zit, zodat de Whoopies niet aan elkaar vast bakken.
# Plaats de bakplaat 10 minuten in de oven.
# Laat ze afkoelen alvorens je ze van de bakplaat haalt.
# Spuit vervolgens met een spuitzak de vulling op de ene helft van de Whoopie, plaats de andere helft vervolgens op de vulling.
== Varianten ==
* Voeg een smaakje toe aan het beslag, zoals cacaopoeder, specerijen en/of pompoenpuree.
* Met de vulling kan je eindeloos blijven variëren.
* Zie [[c:Category:Whoopie pies|Whoopie pies op Commons]] voor meer inspiratie.
{{Navigatie recepten}}
[[Categorie:Koekjes|Whoopie]]
[[Categorie:Amerikaanse keuken|Whoopie]]
{{Sub}}
3uj5lokvv5vhcfcisl2rvp4gqtixnp9
Kookboek/Choco-koekjescake
0
30620
428113
395280
2026-05-20T05:28:26Z
Erik Baas
2193
lf
428113
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/ snelle choco-koekjescake snelle chocolade en koekjes cake
| Categorie = Cake, gebak en taart
| Porties = 8 personen
| Energie =
| Tijd = 10 minuten en 1 uur opstijven in de vriezer
| Stippen = 1
}}
Dit is een ideale cake als de winkels dicht zijn en er plots bezoek komt die wat bijzonders verwacht/verdient. Bij een tankstation of nachtwinkel koop je de koekjes en de chocolade, eventueel kun je de slagroom vervangen door een kopje koffie of warme melk. Even opstijven in de diepvries en tadaa een chocolade verrassing.
== Ingredienten ==
* pak mariabiscuit of andere kaakjes, {{Kb|p=biscuit|biscuits}}
* 200 gram {{Kb|chocolade}} (elke chocolade-variant kan)
* bekertje {{Kb|slagroom}}
* 30 graam boter
* eventueel een scheutje cognac of amaretto oid.
* eventueel noten of rozijnen
== Keukenbenodigdheden ==
* keukenmachine of plasticzakje en een roller
* magnetronschaal
* handklopper / garde / handmixer
== Bereidingswijze ==
# Verkruimel de kaakjes met de keukemachine of in het zakje met de roller.
# Ondertussen smelt je in de magnetron je boter en chocolade in de schaal. (3 a 4 minuten op 700/900 watt)
# Mix de chocola en boter met de slagroom (of koffie of melk en evt de alcohol)
# Roer de verkruimelde koekjes er door heen.
# Laat minimaal een uur opstijven in de diepvries en vervolgens op kamertemperatuur komen
Je kunt een bol maken van je 'deeg', je kunt hem in een aluminiumfolie rollen en er een rol van maken, eventueel laten opstijven in een cakevorm. De mogelijkheden zijn eindeloos.
Een combinatie van pure chocolade en minimarshmellows is lekker, ook de combinatie espresso en pure chocolade met kokosbiscuit (nizza of zaanse kermis).
{{Navigatie recepten}}
[[Categorie:Cake|Choco-koekjes]]
{{Sub}}
0q64rwlnkjcmen7r6kk32bxib447j3j
Kookboek/Groninger mosterdsoep
0
31237
428120
394035
2026-05-20T05:28:39Z
Erik Baas
2193
lf
428120
wikitext
text/x-wiki
[[Kookboek/Soep|Soep]] |
[[Kookboek/Recepten|Receptenindex]]
{{Infobox recept
|
| Naam = Kookboek/Groninger Mosterdsoep
| Categorie = Soeprecept
| Porties = 4
| Energie =
| Tijd = 40 minuten
| Stippen = 3
}}
'''Groninger mosterdsoep''' is een [[Kookboek/Soep|soep]] op basis van een roux met Groninger mosterd. Het kenmerk van de Groninger mosterd is dat de mosterdzaden niet of grof gemalen zijn, dit geeft de soep een pittig karakter. De soep wordt vaak geserveerd met gebakken spekjes en prei.
== Ingredienten ==
* 50 gram roomboter
* 60 gram patentbloem
* 200 ml kookroom
* 1 liter {{Kb|bouillon}}
* 2 eetlepels Groninger {{Kb|mosterd}}
* Naar eigen smaak gebakken spekjes en prei
== Bereiding ==
# Smelt de boter in een pan. Voeg de bloem al roerend er aan toe.
# Laat het mengsel (de roux) 10 minuten garen. Maak ondertussen 1 liter bouillon.
# Meng de bouillon met de roux en laat dit 10 minuten koken. Haal daarna de soep door een zeef.
# Voeg de 2 eetlepels Groninger mosterd toe en laat de soep nog even koken.
# Voeg voor het serveren de room toe en laat de soep daarna niet meer koken. Voeg naar eigen smaak gebakken spekjes en prei toe.
{{Navigatie recepten}}
[[Categorie:Soeprecept|Mosterdsoep, Groninger]]
{{Sub}}
9gqgjzx4ejqeb53xp24h7rasecmcdhr
Kookboek/Königsberger Klopse
0
31334
428108
410270
2026-05-20T05:28:20Z
Erik Baas
2193
lf
428108
wikitext
text/x-wiki
[[Afbeelding:Koenigsberger.jpg|thumb|right|Königsberger Klopse]]
Königsberger Klopse is een {{Wp|Oost-Pruisen|Oost-Pruisische}} specialiteit van gekookte vleesknoedels in witte saus met [[Kookboek/Kappertjes|kappertjes]].
Königsberger Klopse wordt gemaakt uit gehakt van [[Kookboek/Kalfsvlees|kalfs-]] of [[Kookboek/rundvlees|rundvlees]] en [[Kookboek/Varkensvlees|varkensvlees]] met [[Kookboek/Ansjovis|ansjovissen]], uien, geweekt wit brood, ei en specerijen. De balletjes worden gegaard in zout water (eventueel met azijn of witte wijn) met uien, peperkorrels, [[Kookboek/Piment|piment]] en laurier. De saus wordt gemaakt van boter, meel en een deel van het kookvocht (= inmiddels bouillon) van de balletjes, gebonden met room en eigeel en op smaak gebracht met citroensap en kappertjes. Dit kan gegeten worden met aardappelen of rijst.
==Recept voor 4 personen==
===Benodigdheden===
{| class="wikitable"
|-
! Voor de balletjes: !! Voor het kookwater: !! Voor de saus:
|-
|
500 gram {{Kb|gehakt}} half om half, 1 flinke gesnipperde ui, 1 ei, peper, zout, 2 fijngewreven {{Kb|p=ansjovis|ansjovisjes}}, 1 sneetje gemalen of geweekt witbrood, 1 dessertlepel {{Kb|mosterd}}
|| 1,5 liter water, 2 bouillonblokjes, 1 ui (geschild en in kwarten), 1 laurierblad, 2 {{Kb|p=piment|pimentkorrels}} of {{Kb|p=kruidnagel|kruidnagels}}, 4 peperkorrels, 2 {{Kb|p=jeneverbes|jeneverbessen}}, beetje citroensap of witte wijn |
| 30 gram boter, 30 gram bloem (gezeefd), 0,75 liter kookwater van de balletjes, 1 eierdooier, 1/8 liter {{Kb|room}}, 0,5 glaasje {{Kb|kappertjes}}, flink wat citroensap
|}
===Bereidingswijze===
# Water met de bouillonblokjes, laurierblad, ui, piment, peperkorrels en jeneverbes aan de kook brengen en daarna zachtjes laten trekken tot de gehaktballetjes erin gaan.
# Gehakt mengen met ui, ei, peper, zout, ansjovis, gemalen of geweekt witbrood en mosterd. Hiervan ongeveer 18 balletjes ter grootte van een pingpongbal vormen.
# Gehaktballetjes één voor één in het kookwater doen en in een open pan op een lage warmtebron 20 minuten laten trekken. Balletjes uit de pan halen en warm houden.
# Boter smelten in een ruime pan. Bloem gezeefd toevoegen en goed roeren. Beetje bij beetje 0,75 bouillon van de gehaktballetjes toevoegen. Saus aan de kook brengen en 5 minuten zachtjes laten koken.
# Eidooier met de room los roeren, daar een beetje warme saus door roeren en het geheel langzaam door de niet meer kokende saus in de pan roeren. Kappertjes en flink wat citroensap toevoegen en de saus op smaak maken met zout en peper.
# Vervolgens de balletjes in de saus doen en nog even door laten garen.
Lekker met kruimige aardappels.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Vleesrecept]]
m1iv8joosznjqz0wvzohf0v6mzx9iho
Wikijunior:Schaken voor beginners/Remise
104
31483
428193
379847
2026-05-20T05:53:58Z
Erik Baas
2193
428193
wikitext
text/x-wiki
Remise is een term bij schaken dat hetzelfde betekent als gelijkspel.
Je kan op zes manieren met remise eindigen:
#eeuwig schaak
#pat
#zetherhaling
#onvoldoende materiaal
#overeenkomst
#50 zetten-regel
Eeuwig schaak: Als een speler telkens schaak kan blijven geven, maar geen mat.
Pat: Als de speler aan zet geen reglementaire zet meer kan doen en niet schaak staat.
Zetherhaling: Als er drie keer dezelfde stelling op het bord is verschenen mag een speler remise claimen.
Onvoldoende materiaal: Als er met de stukken op het bord geen mat meer kan worden gegeven. Bijvoorbeeld een koning tegen een koning en paard.
Overeenkomst: Als een speler remise aanbiedt en de andere speler accepteert het.
50 zetten-regel: Als er meer dan vijftig zetten zijn gedaan zonder een pionzet, waardoor theoretisch weer dezelfde stelling op het bord zou kunnen komen, dan wordt de partij automatisch remise.
Als een schaakwedstrijd eindigt met remise krijgt elke speler een halve punt. De meeste partijen op hoog niveau (grootmeesters) eindigen in remises.
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Winnen
|tekstvorige=
|huidige=Remise
|volgende=Waarden
|tekstvolgende=Waarde van de stukken
}}
{{Juniorsub}}
lssd5fi8z33urjrx29m72djcxyzw93q
Kookboek/Bechamelsaus
0
31824
428104
402663
2026-05-20T05:28:11Z
Erik Baas
2193
lf
428104
wikitext
text/x-wiki
{{Infobox recept
|
|Naam=Bechamelsaus
|Afbeelding=[[Bestand:Lasagne.jpg|thumb|300px]]
|Onderschrift = Bechamelsaus verwerkt in [[Kookboek/Lasagne|lasagne]]
|Categorie=Saus
|Porties=
|Energie=
|Tijd=
|Stippen=2
}}
Bechamelsaus is een saus op basis van boter, melk en bloem. Deze saus is een standaardingrediënt van [[Kookboek/Lasagne Bolognese|lasagne Bolognese]], maar wordt in Nederland en België ook veel gebruikt om groenten zoals bloemkool, broccoli of andijvie te binden, hoewel in veel huishoudens daarvoor ook wel een eenvoudiger te bereiden saus op basis van [[Kookboek/Maïzena|maïzena]] wordt gebruikt. Fijnproevers zullen over het algemeen de variant op basis van bloem verkiezen.
==Ingrediënten==
*{{Kb|boter}}
*{{Kb|bloem}}
*{{Kb|melk}}
*{{Kb|zout}} en {{Kb|peper}}
*eventueel {{Kb|nootmuskaat}}
==Bereiding==
De boter wordt eerst gesmolten. Vervolgens wordt onder het roeren langzaam de gezeefde bloem toegevoegd, zodat er een [[Kookboek/Roux|roux]] ontstaat. Deze roux kan naargelang de gaartijd blank, blond of bruin zijn. Dit heeft een effect op de kleur van de saus.
Het gegaarde mengsel wordt vervolgens verdund met melk. Meestal wordt er een verhouding gebruikt van één deel boter, één deel bloem en tien delen melk. De eerste hoeveelheid melk moet in zeer kleine beetjes worden toegevoegd, waarna telkens wordt geroerd, omdat de saus anders gemakkelijk gaat klonteren. Daarbij wordt het vuur zeer laag gehouden of zelfs helemaal afgezet.
Na toevoeging van het laatste deel melk moet de saus nog even "opkomen" (kort koken) om de bloem helemaal gaar te laten worden. De dikte van de saus kan worden gevarieerd door meer of minder melk toe te voegen. Voor een romiger versie kan extra room worden toegevoegd.
Ten slotte worden naar smaak zout, peper en nootmuskaat toegevoegd. De toevoeging van nootmuskaat is echter typisch Nederlands en Belgisch, in Frankrijk gebruikt men in plaats daarvan laurier en fijngesneden ui. Sommige koks gebruiken in bechamelsaus liever geen zwarte peper, omdat deze erg zichtbaar is. Witte peper valt niet op in de bijna witte saus.
{{Navigatie recepten}}
[[Categorie:Saus|Bechamel]]
{{Sub}}
1c4ge2vkx8nv7you6d3wkja6t70czcf
Sterren kijken
0
31941
428223
401544
2026-05-20T06:11:56Z
Erik Baas
2193
lf
428223
wikitext
text/x-wiki
{{Bi}}Dit boek geeft basisinformatie over sterrenkijken.
[[Bestand:Starry Night at La Silla.jpg|300px]]
=='''Inhoud'''==
#[[Sterren kijken/Wat heb je nodig voor sterren kijken?|Wat heb je nodig voor sterren kijken?]]
#[[Sterren kijken/De theorie|De theorie]]
#[[Sterren kijken/Jezelf oriënteren op de hemel en je eerste waarneming|Jezelf oriënteren op de hemel en je eerste waarneming]]
#[[Sterren kijken/Alle 88 sterrenbeelden|Alle 88 sterrenbeelden]]
#[[Sterren kijken/Oefeningen|Oefeningen]]
==Waar dit boek over gaat==
In dit boek vind je informatie over welke dingen je nodig hebt voor het sterrenkijken, hoe je nou eigenlijk sterrenkijkt en een overzicht van alle 88 sterrenbeelden met informatie over waar, wanneer en hoe je ze het beste kunt zien.
Ook komen er opdrachten in die je zelf kunt doen om te oefenen.
Tot slot geeft dit boek nog informatie over het nut van sterrenkijken.
Dit boek is voor zowel beginners als voor mensen die al wat ervaring hebben op het gebied van astronomie.
{{Bladeren2
|Boek =sterren kijken
|huidige =hoofdpagina
|volgende=Wat heb je nodig voor sterrenkijken?}}
{{Boek}}
{{Fase|1}}
4v2cc01lir0cgy8e8dz6o3hydjz09m6
Kookboek/Kourabiedes
0
32010
428116
402459
2026-05-20T05:28:30Z
Erik Baas
2193
lf
428116
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Kourabiedes platter 2008 01 08.jpg|300px]]
| Onderschrift =
| Categorie = Koekjes
| Porties =
| Energie =
| Tijd = 40 minuten
| Stippen = 3
}}
Gedurende de hele kerstperiode kent men in de Griekse keuken de klassieke '''kerstkoekje'''s: Kourabiedes en [[Kookboek/Melomakarona|Melomakarona]].
Deze koekjes worden vaak thuis gebakken maar elke supermarkt en banketbakker in Griekenland verkoopt ze in de kerstperiode. Vaak wordt er Metaxa, een Griekse brandewijn, bij geserveerd.
==Ingrediënten==
*1 kop ongezouten {{Kb|boter}}
*1/2 kop {{Kb|suiker}}
*1 eierdooier
*1 eetlepel {{Wp|Metaxa|Metaxa}}
*3 koppen {{Kb|bloem}}
*1/2 theelepel {{Kb|bakpoeder}}
*450 g {{Kb|poedersuiker}} (om te bestrooien)
*Snufje zout
==Bereiding==
# Klop boter en suiker tot het licht en luchtig is. Grieken zijn enorme zoetekauwen dus ze gebruiken zelf heel veel suiker (½ kop), maar het is best mogelijk om zelf wat minder suiker toe te voegen.
# Klop de dooier erdoorheen en de Metaxa of vieux. Voeg de gezeefde bloem, het bakpoeder en het zout beetje bij beetje toe.
# Kneed het geheel tot een soepel deeg. Als het deeg plakt, wat bloem toevoegen.
# Neem kleine beetjes deeg en vorm er kleine balletjes of langwerpige rolletjes met een dikte van ± 2 cm en ± 4 cm lang.
# Op ingevet bakblik leggen en ongeveer 20 minuten bakken op 175 graden (heteluchtoven).
# Strooi er flink poedersuiker over met een zeef terwijl de koekjes nog heet zijn, af laten koelen.
# Voor koerabiedes met amandelen, 1/2 kop gepelde en gehakte amandelen toevoegen aan het deeg.
In Griekenland worden deze koekjes tot na oud en nieuw met een glaasje Metaxa geserveerd.
{{Navigatie recepten}}
[[Categorie:Griekse keuken|Kourabiedes]]
[[Categorie:Koekjes]]
{{Sub}}
nv2fr98tuv0z64e0hlgncd799tuqetm
Kookboek/Stoofperen met spek
0
32014
428118
406568
2026-05-20T05:28:32Z
Erik Baas
2193
lf
428118
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Birnen, Bohnen und Speck cropped.jpg|300px]]
| Onderschrift = Met sperziebonen en aardappelen
| Categorie = Fruitrecept
| Porties =
| Energie =
| Tijd = ± 4 uur
| Stippen = 2
}}
Een ouderwets boerenrecept voor stoofpeertjes met gekookte spek
== Benodigdheden ==
=== Ingrediënten ===
* water
* 10 tot 20 stuks {{Kb|p=stoofperen|Gieser Wildeman}}
* 500-1000 g {{Kb|spek}} aan één stuk, dat goed 'doorregen' is, dat is spek met afwisselende lagen vlees en vet
=== Keukengereedschap ===
* 1 grote pan met deksel
== Bereidingswijze ==
# Leg het stuk spek in de pan en vul de pan tot aan de rand van het spek met water of maximaal de 1/3 van de pan. Zet de pan op een hoog vuur.
# Schrob de peertjes schoon. Je mag ze in de schil laten en het steeltje ook laten zitten, dan schil je de peertjes op je bord.
# Doe de peertjes in de pan, naast en op het stuk spek.
# Als de 'peertjes-met-spek' goed kookt, kan het vuur helemaal laag totdat de kook er nog net op zit. Daarna is het een kwestie van geduld, ongeveer 3 à 4 uur.
== Varianten ==
* Als je vegetariër of veganist bent, kun je gerookte tofoe in blokken snijden en met zout en eventueel een miniblokje kokosvet, de rook-/speksmaak ook goed in de peertjes krijgen.
{{Navigatie recepten}}
[[Categorie:Vleesrecept|Stoofperen]]
[[Categorie:Fruitrecept|Stoofperen]]
{{Sub}}
bn7lnep1fluu77p80t4m7xcr48h1jhb
Kookboek/Kalfslever met druiven
0
32016
428106
404971
2026-05-20T05:28:17Z
Erik Baas
2193
lf
428106
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding =
| Onderschrift =
| Categorie =
| Porties =
| Energie =
| Tijd =
| Stippen =
}}Dit recept is afkomstig uit het kookboek van meester Eberhard, de kok van koning {{Wp|Hendrik XVI van Beieren|Hendrik XVI van Beieren}}. Het wordt vermeld in een handschrift uit de 15e eeuw, dat bewaard wordt in de bibliotheek van Schloss Harburg (Zwaben).
==Ingrediënten==
Voor 4 à 5 personen:
*500 g rauwe {{Kb|p=lever|kalfslever}}
*100 g vers {{Kb|spek}}
*1 tros witte {{Kb|p=druif|druiven}}
*eigeel
*eidooiers
*poeder van rood sandelhout
*1 net (dik vel vet dat om de ingewanden van een koe zit, bij de slager vragen)
*gehakte peterselie
*kruiden naar eigen smaak
==Bereidingswijze==
# Snijd de lever en het spek fijn en ontpit de druiven. Maak een mengsel van de lever, het spek en de druiven. Voeg de kruiden naar smaak toe, maar gebruik omwille van de smaak niet teveel zout.
# Smeer het net aan de binnenkant in met eigeel. Naai het mengsel van lever, spek en druiven daarna vast in het net met naaigaren, naai het net zorgvuldig dicht zodat er tijdens het roosteren niets uit kan vallen.
# Verwarm de "zak" in een koekenpan of op een grill en laat hem in ongeveer een uur gaar worden, zodat het een ronde rol wordt.
# Garneer de rol aan een kant met eidooiers die vermengd zijn met het sandelhoutpoeder en aan de andere kant met eidooiers en peterselie. Snijd het gerecht in plakken. Pas op met rauwe eieren, zie [[Kookboek/Ei#Waarschuwing|Waarschuwing]]!
Het net hoeft niet mee opgegeten te worden, maar dit mag wel.
{{Bron|bronvermelding=
*Winter, J.M. van (1976) ''Van soeter cokene. Recepten uit de oudheid en de middeleeuwen'', Haarlem: Fibula-van Dishoeck, {{ISBN|90 228 4291 6}}, p.123.
}}
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Historisch recept|Kalfslever]]
[[Categorie:Vleesrecept|Kalfslever]]
7zejlvu38msspb9scxcrnzv381k9i6x
Kookboek/Japanse fondue voor een persoon
0
32061
428107
420424
2026-05-20T05:28:18Z
Erik Baas
2193
lf
428107
wikitext
text/x-wiki
[[Kookboek/Fondue|Fondue]] op basis van bouillon, met vlees en stukjes groenten op de vorkjes.
{{Infobox recept
|
| Naam = Kookboek/japansfondue voor een persoon
| Categorie = Japanse keuken
| Porties = 1 portie
| Energie =
| Tijd = 30 minuten , 1 uurtje soep trekken.
| Stippen =1
}}
==Ingrediënten==
*1 wortel,
*20 g {{Kb|taugé}}
*2 shitaken
*{{Kb|p=tofu|tofoe}}
*stukje {{Kb|Chinese kool}}
*wat lente-uitjes
*100 g biefstuk in dunne plakjes
*een kommetje {{Kb|rijst}}
*Japanse sojasaus
*stukje {{Kb|gember}}
*sake
*een {{Kb|p=mergpijp|mergpijpje}}
*wat poulet
*een (runder-)bouillonblokje
*wat olie
==Bereiding==
#Zet water op met het mergpijpje, de poulet en het bouillonblokje. Laat de soep ongeveer een uurtje trekken.
#Leg ondertussen het volgende op een mooi wit bord: de schoongemaakte groente, de taugé, een stukje wortel in dunne plakjes gesneden, de shitaken in twee maal twee helften, het stukje Chinese kool in dunne reepjes, de lente-uitjes in stukjes van 2 cm en de tofoe in kleine blokjes die je even in de olie knapperig frituurt.
#Rangschik de gesneden biefstuk op een schoteltje, maak een sausje van een stukje geraspte gemberwortel (1 bij 1cm), voeg drie eetlepels Japanse sojasaus en een lepel sake (en eventueel nog wat bruine suiker) toe.
#Doe de gekookte rijst in een kom, schenk de gloeiendhete soep in een bowl met eventueel wat ringetjes rode peper en zet alles op tafel.
#Doe wat groente in de soep, doop er de biefstukplakjes in en smullen maar!
#Ook lekker erbij: ongeveer 6 a 7 eetlepels japanse soja saus, een afgestreken eetlepel bruine suiker, een scheutje sake, en een eetlepel sesampasta goed door elkaar mengen, als het sausje te dik is een scheutje water toevoegen.
{{Navigatie recepten}}
[[Categorie:Vleesrecept]]
[[Categorie:Japanse keuken|Fondue]]
{{Sub}}
oosco15zqqnhqt8z6fx23qm83r77ul8
Kookboek/Hollandse tomatensoep
0
32141
428119
402672
2026-05-20T05:28:34Z
Erik Baas
2193
lf
428119
wikitext
text/x-wiki
{{Infobox recept
| Naam = Hollandse tomatensoep
| Afbeelding = [[Bestand:Tomatensoep met ballen, vermicelli en wortel.jpg|300px]]
| Onderschrift = Tomatensoep met balletjes, vermicelli en wortel
| Categorie =soeprecept
| Porties = 4 personen
| Energie =
| Tijd = een uur
| Stippen = 2
}}
'''Hollandse tomatensoep''' is tomatensoep met soepballetjes en stukjes rundvlees.
==Ingrediënten==
* 1.5 liter water
* 1 {{Kb|p=mergpijp|mergpijpje}}
* 200 g {{Kb|p=rundvlees|runderpoulet }}
* 1 blokje {{Kb|p=bouillon|runderbouillon}}
* 1 kruidnagel
* 300 g {{Kb|p=gehakt|rundergehakt }}
* een paar druppels Worcestersaus
* 1 ei
* peper
* zout
* snufje nootmuskaat
* 1 eetlepel paneermeel
* 1 eetlepel roomboter
* 1 flinke ui
* 2 rijpe {{Kb|p=tomaat|tomaten}}
* 2 blikjes {{Kb|tomatenpuree}}
==Bereiding==
* Water, mergpijpje en poulet rustig aan de kook brengen. Het schuim eraf scheppen. Bouillonblokje erbij en op een laag vuurtje rustig een uurtje laten koken. Halverwege de bereidingstijd gaat het kruidnageltje samen met wat water erbij.
* Ondertussen in een schaal het gehakt, een paar druppeltjes Worcestersaus, het eierdooiertje (gescheiden), wat peper en zout, een snufje nootmuskaat en eventueel wat paneermeel erbij. Alles door elkaar mengen en er kleine balletjes van draaien.
* Een kwartier voordat de bouillon klaar is, zet je een grote pan op, doe je er de boter in, snijd je de ui in kleine snippertjes en laat deze rustig in de boter fruiten. Dan doe je de kleingesneden tomaten en even later de tomatenpuree erbij. Alles goed doorroeren, daarna de bouillon erbij schenken (zonder het kruidnageltje en het mergpijpje).
* Op het laatst nog wat druppeltjes Worcestersaus en de gehaktballetjes erbij. Na 10 minuten is de soep klaar.
== Varianten ==
* Voeg 50 g vermicelli bij de soep, tegelijk met de gehaktballetjes.
{{Navigatie recepten}}
[[Categorie:Soeprecept|Tomatensoep]]
[[Categorie:Vleesrecept|Tomatensoep]]
[[Categorie:Nederlandse keuken|Tomatensoep]]
{{Sub}}
lffzne2depc9bxyfjpmile6m0taq7ue
Kookboek/Spaghetti met herfstpaddenstoelen
0
32142
428117
411359
2026-05-20T05:28:31Z
Erik Baas
2193
lf
428117
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Spaghetti ai funghi.jpg|300px]]
| Categorie = Pastarecept
| Porties = 2
| Energie =
| Tijd =
| Stippen = 1
}}
Spaghetti met bospaddenstoelen is een vegetarisch gerecht dat vooral in de herfst goed zal smaken.
==Ingrediënten==
*200 gram {{Kb|spaghetti}}
*gemixte {{Kb|p=paddestoel|bospaddenstoelen}} zoals: cantharellen, eekhoorntjesbrood, boschampions enz.
*{{Kb|p=kaas|notenkaas}}
*{{Kb|room}}
*grove peper
*een lepel roomboter
*wat Parmezaanse kaas
==Bereiding==
# Kook de spaghetti zoals aangegeven op de verpakking. Doe wat boter in een koekenpan, en bak de gemixte bos paddenstoelen op een gematigd vuur lichtbruin, laat de notenkaas (eventueel met wat fijngehakte {{Kb|p=walnoot|walnoten}}) smelten bij de paddenstoelen, doe er een scheutje room bij, zodat er een gladde, romige saus ontstaat. Pak een mooi diep bord, rangschik er de spaghetti op en schep er de gloeiendhete saus overheen,
# Strooi er als finishing touche een beetje verse peper en Parmezaan overheen. Puur natuur!
{{Navigatie recepten}}
[[Categorie:Pastarecept|Spaghetti met herfstpaddenstoelen]]
[[Categorie:Vegetarisch recept|Spaghetti]]
{{Sub}}
g4y6hsn14raqr7b9e92ggko5wmrj252
Kookboek/Gemista
0
32160
428111
402299
2026-05-20T05:28:21Z
Erik Baas
2193
lf
428111
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Gemista.jpg|300px]]
| Onderschrift =
| Categorie = Groentenrecept
| Porties = 5-6
| Energie =
| Tijd = ± 20 minuten + 1 uur oventijd
| Stippen = 3
}}
'''Gemista''' (Grieks: ''Γεμιστά'') is een traditioneel gerecht uit de [[Kookboek/Griekse keuken|Griekse keuken]]. ''Gemista'' betekent letterlijk gevuld, dit omdat het een ovengerecht is dat bestaat uit gevulde groenten (tomaten, paprika en courgette).
In sommige streken van Griekenland worden er soms pijnboompitten, gehakt en/of rozijnen aan de gemista toegevoegd. Ook wordt dille als kruid gebruikt.
Gemista wordt warm, lauw en koud geserveerd. Het is een gerecht wat zowel thuis als in taverna's gegeten wordt.
==Ingrediënten==
*4 forse {{Kb|p=tomaat|vleestomaten}}
*Blik gepelde tomaten
*
3 {{Kb|p=paprika|paprika's}}
*1 {{Kb|courgette}}
*1 kop olijfolie
*1 1/2 kop rijst
*2 teentjes knoflook
*1 grote ui fijngesneden
*1 kop fijngesneden peterselie
*1/4 kopje mint
*Peper en zout
==Bereiding==
# De tomaten en paprika's wassen. Snijd het kapje eraf. Vervolgens het vruchtvlees uit in de tomaten scheppen en apart houden.
# Pers de knofllook uit.
# Haal de zaadlijsten uit de paprika's.
# Hol de courgette uit en voeg het vruchtvlees toe aan de vulling.
# Hierna de tomaten, courgette en paprika's van binnen bestrooien met wat zout.
# Het vruchtvlees van de tomaten pureren. Meng dit met de overgebleven ingrediënten door elkaar in een pan en kook het mengsel tot de rijst gaar is. Schep het mengsel vervolgens in de uitgeholde groente.
# Zet het gerecht in de oven ingesteld op 180°C. Baktjjd ongeveer een uur, afhankelijk van de oven.
{{Navigatie recepten}}
[[Categorie:Griekse keuken|Gemista]]
[[Categorie:Groentenrecept|Gemista]]
[[Categorie:Ovenschotel|Gemista]]
{{Sub}}
hv89hv3134hyk1d4q4gne6kud46uzdl
Kookboek/Regenboogtaart
0
32297
428109
402469
2026-05-20T05:28:20Z
Erik Baas
2193
lf
428109
wikitext
text/x-wiki
{{Infobox recept|[https://www.hightearecepten.nl/Recept/regenboogtaart-recept/ Regenboogtaart, een lekker high tea recept!]
| Afbeelding = [[Bestand:Rainbow cake (6824648824).jpg|300px]]
| Naam = Kookboek/regenboogtaart
| Categorie = Cake, gebak en taart
| Porties = 8-12
| Energie =
| Tijd = 40m
| Stippen = 3
}}
'''Regenboogtaart Recept'''
In Nederland is de regenboogtaart of regenboogcake niet heel erg bekend, maar in Engelstalige landen des te meer. Het is niet erg moeilijk om een regenboogtaart te maken, maar het kost wat geduld om de taart in elkaar te zetten, als je gaat voor de schoonheid natuurlijk! Hieronder staat het recept voor de regenboog taart. Vind nog meer informatie over de [https://www.hightearecepten.nl/Recept/regenboogtaart-recept/ high tea regenboogtaart recept].
Ingrediënten Cake
300 gr. {{Kb|bloem}}
300 gr. {{Kb|boter}} (roomboter/margarine)
300 gr. {{Kb|suiker}}
6 {{Kb|p=ei|eieren}}
6tl. vanille-extract of 3 zakjes vanillesuiker
4 voedingskleuren: blauw, rood, groen, geel
Ingrediënten Botercrème Topping
125 gr zachte boter
250gr {{Kb|poedersuiker}} of suikerbakkerspoeder
2 theelepels vanille-extract
3 tot 4 eetlepels melk of water
eventueel een kleurstof
== Bereidingswijze ==
Stap1
Verwarm de oven op 160 ° C. Vet de taartvorm (circa 20cm) in met boter. Laat de boter op kamertemperatuur zacht worden.
Stap2
Neem een grote kom en doe daar de boter en het suiker in. Meng dit goed door elkaar met de hand of met een mixer en voeg één voor één de eieren toe en meng deze door het boter– suikermengsel. Verdeel het beslag gelijkmatig over 6 kleine schaaltjes.
Stap3
Met behulp van voedingskleuren kleur je het beslag in de zes kommen: blauw , rood, groen, geel, oranje (met behulp van rood en geel ) en paars (met blauw en rood ) .
Stap4
Bak nu stuk voor stuk de lagen taart in de taartvorm of handiger als je meerdere vormen hebt. Eventueel kun je proberen de lagen over mekaar te gieten, maar de kans is groot dat de lagen door elkaar heen gaan lopen.
Stap5
Bak 18 tot 20 minuten of tot de cake terug veert wanneer het licht aangeraakt wordt in het midden (of als de zijkanten van de randen beginnen weg te trekken). Verwijder de lagen uit de vorm en laat de lagen afkoelen.
Stap6
Vervolgens maak je de botercrème: Neem een grote kom en voeg daar de boter en de suiker aan toe, meng het geheel met de hand of met een mixer op lage stand en voeg de melk (lepel voor lepel), het vanille extract en eventueel de kleurstof toe. Blijf kloppen tot het een glad mengsel is. Zet vervolgens de mixer op de hoogste stand totdat het mengsel licht en luchtig wordt.
Stap7
Leg de eerste cakelaag op een bord. Verspreid nu de crème over de individuele lagen, stuk voor stuk en leg de lagen op elkaar, in de volgorde van de kleuren van de regenboog. Heb je de taart in een keer gebakken? Verspreid dan het mengsel over de zijkant en de bovenkant van de taart.
[https://www.hightearecepten.nl/ Lekker recept voor bij de high tea!]
{{Navigatie recepten}}
[[Categorie:Taart|Regenboogtaart]]
{{Sub}}
4on5y15zcnrtijg6eyrmuuuuxbncub9
Kookboek/Cupcakes met Rozenwater
0
32298
428115
402727
2026-05-20T05:28:30Z
Erik Baas
2193
lf
428115
wikitext
text/x-wiki
{{Infobox recept| Rozenwater Cupcake
| Naam = Kookboek/Cupcakes met Rozenwater
| Afbeelding = [[Bestand:Chai white chocolate cupcakes (2).jpg|300px]]
| Categorie = Cake, gebak en taart
| Porties = 12
| Energie =
| Tijd = 50 minuten
| Stippen = 2
}}
[https://www.hightearecepten.nl/Recept/rozenwater-cupcakes-recept/ Rozenwater Cupcakes Recept voor High Tea]
Dit is een recept voor het maken van cupcakes waar rozenwater doorheen is gemixt.
* Het rozenwater kun je vaak kopen in een toko bij je in de buurt en bij sommige supermarkten of gewoon bestellen op internet. * * Versieringen zijn vaak te koop in de supermarkt of speciaalzaken.
* Voor de topping kun je botercrème of glazuur gebruiken, net wat je het lekkerst vindt. Beiden is het erg makkelijk te maken, maar voor botercrème is het wel leuk als je een spuitzak bij de hand hebt.
=== Ingredienten===
* 100 ml melk
* 1 pakje glazuur of botercrème
* 1 el rozenwater
* 150 gr. zelfreizend bakmeel
* 150 gr zacht ongezouten boter
* 150 gr fijne kristalsuiker
* 3 medium eieren op kamertemperatuur
* Rozenblaadjes of zilveren balletjes ter decoratie
== Bereiding ==
# Verwarm de oven voor op 190 graden. Neem een schaal voor kleine cakejes met 12 gaten en vet deze in of leg er (papieren) cakevormpjes in.
# Met gebruik van een houten lepel meng je de boter en suiker samen tot een zacht en glad geheel. Voeg de eieren een voor een toe en meng goed gedurende elke toevoeging. Als het mengsel dreigt te gaan klonteren voeg er dan een theelepeltje meel aan toe.
# Kneed/roer het overgebleven meel door het mengsel en voeg er het rozenwater aan toe. Vervolgens kun je aan het geheel wat melk toevoegen, als het nog dik is. Het mengsel zou net van de lepel moeten vallen als je het een beetje schudt.
# Schep het mengsel in de cakevormpjes en bak het in de oven tot de bovenkant licht goud kleurt, ongeveer 20 minuten. Haal hierna de muffins uit de oven en laat ze afkoelen.
# Maak in een grote kom het glazuur of de botercrème klaar en verdeel dit over de cakejes. Laat het even rusten voordat je de cakejes versiert met rozenblaadjes en zilveren balletjes. Nog meer [https://www.hightearecepten.nl/high-tea-recepten-2/ high tea recepten]
{{Navigatie recepten}}
[[Categorie:Gebakje|Cupcakes]]
{{Sub}}
l6x1ilvojf4alx1ieot7jemb58pmmmc
Kookboek/Kantonese rijst
0
32397
428114
402885
2026-05-20T05:28:28Z
Erik Baas
2193
lf
428114
wikitext
text/x-wiki
__NOTOC__{{Infobox recept
|
|Naam=Kantonese rijst
|Afbeelding= [[Bestand:Hung Hom Station Maxim's MX Yangzhou fried rice 11-01-2023.jpg|300px]]
|Categorie=Rijstrecept
|Porties=4
|Energie=
|Tijd=30 minuten
|Stippen=3
}}
==Ingrediënten==
*300 g rijst (bijv. basmati of pandan)
*300 g {{Kb|bleekselderij}}
*2 uien (bosui kan ook)
*300 g prei
*ca. 100 gram gepelde {{Kb|p=garnaal|garnalen}}
*100 gram {{Kb|ham}}
*3 {{Kb|p=ei|eieren}}
*ketjap
*peper
*zout
==Bereiding==
#Kook de rijst gaar volgens de voorschriften en laat hem uitlekken.
#Snijd de ui en prei in ringen en de bleekselderij in kleine stukjes.
#Kluts de eieren in een kom. Bak de geklutste eieren in een braadpan met wat olie tot een [[Kookboek/Omelet|omelet]]. Snijd de de omelet in reepjes en leg deze even op een bord.
#Bak nu in de pan de groenten samen met de ham en garnalen in enkele minuten gaar en voeg het geheel samen met de omeletreepjes in de pan of op het bord.
#Voeg hieraan ten slotte de gekookte rijst toe. Indien de rijst inmiddels is afgekoeld, eerst weer opwarmen.
#Naar smaak ketjap, peper en zout toevoegen.
==Variatie==
*Voeg paprikapoeder, sojasaus en/of doperwten toe.
*Gebruik zilvervliesrijst in plaats van witte rijst.
*Tip: kook de bleekselderij met de rijst mee, dan wordt hij wèl gaar.
==Tips==
*Serveer als bijgerecht [[Kookboek/Loempia|loempia's]].
{{Navigatie recepten}}
[[Categorie:Rijstrecept|Kantonese rijst]]
[[Categorie:Vleesrecept|Kantonese rijst]]
[[Categorie:Chinese keuken|Kantonese rijst]]
{{Sub}}
grqmv1fzgyftrt4pavdlj4y185syu5z
Kookboek/Saumon du Chef Léon
0
32595
428122
395039
2026-05-20T05:30:00Z
Erik Baas
2193
lf
428122
wikitext
text/x-wiki
{{Infobox recept
|
| Afbeelding = [[Bestand:Flammlachs auf dem Märchenbazar auf dem Tollwood-Gelände im Olympiapark München 2032-12-11.jpg|300px]]
| Naam = Kookboek/Saumon du Chef Léon
| Categorie = Vis- of zeevruchtrecept
| Porties = 14
| Energie =
| Tijd = 6 uur pekelen en 1,5 uur bij het vuur
| Stippen = 3
}}
==Benodigdheden==
=== Ingrediënten ===
*2 zijden {{Kb|zalm}} (geen wilde)
*{{Kb|basterdsuiker}} (bruin)
*{{Kb|whisky}} ({{Wp|Lagavulin Single Malt|Lagavulin Single Malt}})
*grof zeezout
=== Keukengereedschap ===
*grote schaal
*huishoudfolie
*houten plank met houder
==Bereiding==
Leg 1 zijden zalm in een passende schaal. Strooi grof zeezout over de zalm en bedek dit met een laag bruine basterdsuiker. Strooi hier over weer wat zeezout en leg de andere zij zalm hier op.
Wikkel ze in de huishoudfolie en doe ze in de bak in de koelkast. Draai het pakket na drie uur om en doe de bak wederom in de koelkast.
Spoel de zijden zalm met koud water af en span ze op de planken.
Zet ze voor ongeveer 1,5 uur bij het vuur en als ze mooi en gaar zijn dan over giet je de zijden zalm met whisky zodat ze geflambeerd worden.
Neem eerst zelf een hapje want eenmaal gepresenteerd blijft er niets meer over.
==Externe links==
*[https://www.omaserveert.nl/saumon-du-chef-leon omaserveert.nl]
{{Navigatie recepten}}
[[Categorie:Zalmrecept|Saumon]]
{{Sub}}
pivbl7auyzi6rtope1roqlcupyan4ms
Kookboek/Groene pesto
0
32741
428125
404244
2026-05-20T05:30:04Z
Erik Baas
2193
lf
428125
wikitext
text/x-wiki
{{Infobox recept
|
|Afbeelding = [[Bestand:BasilPesto.JPG|300px]]
|Naam=Groene pesto
|Categorie=Saus
|Porties= ± 240 gram
|Energie=
|Tijd = 15 min
|Stippen=3
}}
[[Kookboek/Saus|Saus]] | [[Kookboek/Recepten|Receptenindex]]
Dit is een recept voor Pesto Genovese, een sausje dat voor diverse doeleinden gebruikt kan worden, van dipsaus tot pastasaus.
De essentie van een groene pesto is de gelijke verhouding tussen groen (basilicum), (Parmezaanse) kaas en pijnboompitten/noten, daaraan wordt olijfolie en knoflook toegevoegd. Het geheel wordt traditioneel met een vijzel vermalen, maar een keukenmachine voldoet ook.
==Ingrediënten==
* 75 g verse {{Kb|p=Basilicum|basilicum}}
* 75 gram Parmezaanse {{Kb|kaas}}
* 2 teentjes {{Kb|p=Knoflook|knoflook}}
* 75 g {{Kb|pijnboompitten}}
* olijfolie
* snufje grof zeezout
NB Wie niet zoveel binnen enkele dagen gebruikt, kan de hoeveelheden beter door 2 of 3 delen; verse pesto is niet lang houdbaar.
== Keukengereedschap ==
* Vijzel (of keukenmachine)
* Koekenpan
* Enkele schaaltjes of lege potjes met deksels
==Bereiding==
De stappen 1. en 2. zijn optioneel, ze verhogen de houdbaarheid.
# Blancheer de basilicum gedurende een paar seconden.
# Koel af in ijswater en laat uitlekken.
# Rasp de kaas zo fijn mogelijk.
# Rooster de pijnboompitten in een hete pan zonder olie zeker 2 minuten, terwijl de pan voortdurend in beweging is. Let er op dat ze niet aanbakken, dit zorgt voor een bittere smaak. Laat ze daarna rusten en afkoelen op een stuk keukenpapier.
# Leg de knoflook in de vijzel en voeg hier enkele korreltjes grof zeezout aan toe. Stamp de knoflook fijn en draai rond totdat er fijne knoflookpasta ontstaat.
# Voeg de basilicum en nogmaals enkele korrels zeezout in de vijzel. Blijf de basilicum goed ronddraaien (heen en weer) in de vijzel totdat er groen sap ontstaat.
# Voeg de pijnboompitten toe en druk deze fijn totdat er een smeuïge puree ontstaat.
# Voeg beetje bij beetje de geraspte kaas toe. Blijf in de tussentijd rond draaien in de vijzel totdat er een mooie egale puree ontstaat.
# Voeg scheutje voor scheutje olijfolie toe terwijl je blijft ronddraaien, tot de juiste dikte is verkregen.
Tot slot voeg je nog wat citroensap toe en blijf de pesto proeven totdat je de gewenste frisheid hebt.
== Varianten ==
* Het groen bestaat traditioneel voornamelijk uit basilicum, maar bladpeterselie of koriander zijn ook goede toevoegingen.
* De Parmezaanse kaas kan vervangen worden een oude schapenkaas, zoals een Pecorino of een (Spaanse) Manchego of een oude kaas van koeienmelk. Ook een mix van Parmezaanse kaas en Pecorino (in de verhouding 2:1, dus in dit recept 50 g Parmezaanse en 25 g Pecorino) is een optie.
* De noten bestaan traditioneel uit pijnboompitten, maar walnoten en cashewnoten worden vaak als alternatief gebruikt. Met name industriële pesto's bevatten voornamelijk cashewnoten, omdat ze tot een betere houdbaarheid leiden.
* Mogelijke toevoegingen:
** 2-3 el citroensap, aan het eind van het bereidingsproces
== Fotogalerij ==
<gallery widths="200" heights="150">
Pesto.jpg|Basilicum
Pesto1.jpg|Ingrediënten
Campionato mondiale del pesto.jpg|Met de stamper in de vijzel
Pesto3.jpg|Toevoegen van de olie
Pesto4.jpg|Een smeuïg sausje
Spaghetti con pesto alla genovese.jpg|Spaghetti met pesto
</gallery>
== Houdbaarheid ==
De houdbaarheid is bij zelfgemaakte pesto's wel eens een probleem. Langer dan 3 weken blijven ze vaak niet goed, ook niet in de koelkast. Met name het blancheren van het groen kan de houdbaarheid verhogen.
== Recepten met pesto ==
<DynamicPageList>
category= KB-pesto
mode=unordered
order=ascending
suppresserrors = true
ordermethod = sortkey
</DynamicPageList>
==Zie ook==
* [[Kookboek/Zevenbladtapenade|Zevenbladtapenade]]
* [https://www.zelfpestomaken.nl/ Zelfpestomaken] voor pesto rosso of rucolapesto
{{Navigatie recepten}}
[[Categorie:Italiaanse keuken|Pesto]]
[[Categorie:Saus|Pesto]]
{{Sub}}
h71426ohatxagzhlv4s3i9xfo9jw2ir
Kookboek/Kwarktaart met bosbessen
0
35076
428126
409338
2026-05-20T05:30:04Z
Erik Baas
2193
lf
428126
wikitext
text/x-wiki
{{Infobox recept
|
| Afbeelding = [[Bestand:001 Blueberry cheesecakes.jpg|thumb|300px]]
| Onderschrift = Bosbessenkwarktaartjes
| Naam = '''Bosbessen yoghurt/kwarktaartje'''
| Categorie = Cake, gebak en taart
| Porties = 4
| Energie =
| Tijd = 1 uur bereiding, 3 uur in de koelkast
| Stippen = 3
}}
==Benodigdheden==
=== Ingrediënten ===
* potje Hak-bosbessen
* 3 {{Kb|p=gelatine|gelatineblaadjes}}
* ong. 5 theelepeltjes suiker
* dikke {{Kb|yoghurt}} of {{Kb|kwark}} naar keuze
* klein bakje {{Kb|slagroom}}
*50 gr {{Kb|p=boter|roomboter }}
*(San) Francisco {{Kb|p=biscuit|tarwebiscuit}}: 8 à 9 koekjes
=== Keukengereedschap ===
* 1 kleine ronde springvorm
* steelpannetje
* een garde
* een keukenmachine om de koekjes te verpulveren of deegroller
==Bereiding==
# Verpulver de koekjes met de keukenmachine of met een deegroller.
# Zet een steelpannetje op het vuur en smelt de boter daarin, niet verhitten of bruin laten worden. Doe er de koekkruimels bij, zodat er een plakkerige massa ontstaat.
# Vul de bodem van de springvorm met een laag koekkruimels, druk met een lepel goed aan en zet het in de koelkast.
# Pak een kom, doe er 7 flinke lepels kwart of dikke yoghurt in.
# Open het potje bosbessen en schep de helft van de bessen (zonder sap!) in de (schone) keukenmachine, verpulver de bessen. Doe ze in het (schone!) pannetje.
# Week de gelatine 5 minuten in koud water, leg de blaadjes in het pannetje met de bosbessen en met twee theelepeltjes suiker (niet teveel), verwarmen op het vuur, niet laten koken.
# Als de gelatineblaadjes zijn opgelost, laat je het prutje een beetje afkoelen en schep je het vervolgens luchtig door de yoghurt of kwark (plus een theelepel suiker).
# Klop de slagroom (helft van het bakje, stevig geklopt) met het laatste lepeltje suiker, even in de koelkast laten opstijven. Daarna luchtig door het kwarkmengsel scheppen. Het mengsel tot de rand van de springvorm gieten. Daarna 3 uur laten opstijven in de koelkast.
# Versier de kwarktaart desgewenst met een laagje bosbessenjam, de uitgelekte overgebleven bosbessen en toefjes slagroom.
{{Navigatie recepten}}
[[Categorie:Taart|Kwarktaart]]
[[Categorie:Zuivelrecept|Kwarktaart]]
{{Sub}}
60n5771n4sfwy6ps7xey05woc2lhyg3
Kookboek/Varkenslende met mascarponesaus
0
35465
428123
406720
2026-05-20T05:30:01Z
Erik Baas
2193
lf
428123
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Sliced pork loin (1028139620).jpg|300px]]
| Onderschrift = Rauwe varkenslende
| Naam = Kookboek/varkenslende met mascarponesaus
| Categorie = Vleesrecept
| Porties = 4
| Energie =
| Tijd = 20 min
| Stippen = 2
}}
'''Varkenslende''' is een mager, mals stuk varkensvlees, met een randje vet. In dit recept wordt uitgelegd hoe die wordt bereid en hoe je van de jus een mascarponesaus kunt maken.
== Ingrediënten ==
* 4 plak(ken) {{Kb|p=varkensvlees|Varkenslende}}
* 60 g {{Kb|Spek}}
* 40 g {{Kb|Mascarpone}}
* 1 Ui
* Boter
* {{Kb|Saffraan}}
* 1 glas {{Kb|bouillon}}
* Zout
== Bereidingswijze ==
# Snipper de ui en het spek.
# Bak de varkenslende gedurende 15 minuten in de boter met de ui en spekblokjes.
# Los de saffraan en mascarpone op in de bouillon. Voeg dit mengsel toe aan de saus.
# Mix de saus en schenk haar op het moment van serveren over de lenden.
{{Navigatie recepten}}
[[Categorie:Vleesrecept|Varkenslende]]
{{Sub}}
8xp620rivw0sky7xnz1135w05vwl8y8
Kookboek/Zuurkoolsalade
0
35786
428124
411365
2026-05-20T05:30:04Z
Erik Baas
2193
lf
428124
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Cavolo salato.jpg|300px]]
| Categorie = Saladerecept
| Porties = 4
| Energie =
| Tijd = 10-15 minuten
| Stippen = 1
}}
Een '''zuurkoolsalade''' wordt gemaakt van rauwe zuurkool, waaraan andere ingrediënten worden toegevoegd. Als dressing wordt vaak mayonaise gebruikt, maar bijv. honing kan ook.
==Ingrediënten==
* 500 g {{Kb|zuurkool}}
* 1 friszoete {{Kb|appel}}, bijvoorbeeld Elstar, Gala, Pink Lady (zie [[Kookboek/Appel#Zoet - zuur]] voor andere mogelijkheden)
* 3 el plantaardige olie, bijvoorbeeld notenolie
* ½-1 eeetlepel mosterd
* 1 eetlepel honing of gembersiroop
* 1 eetlepel milde azijn, bijvoorbeeld appelazijn, witte-wijnazijn of augurkennat
* peper
==Bereiding==
# Laat de zuurkool goed uitlekken: doe de zuurkool in een zeef en druk daar met een lepel op om het vocht er uit te persen.
# Haal de zuurkool met een vork uit elkaar en snijd ze fijner.
# Doe de zuurkool in een slakom.
# Maak een saladesaus van de olie, mosterd, honing, azijn en peper en giet die over de zuurkool.
# Snijd de appel in kleine stukjes en roer die direct door de salade.
== Varianten ==
* Vervang de appel door kleine stukjes {{Kb|ananas}}.
* Voeg 50 g gewelde {{Kb|p=rozijn|rozijnen}} toe, bijvoorbeeld geweld (geweekt) in sinaasappelsap of appelsap.
* Voeg 50 g ongebrande {{Kb|p=walnoot|walnoten}} toe, in stukjes gehakt.
* Voeg 50 g kleingesneden ham toe.
* Vervang 200 g zuurkool door 200 g geraspte {{Kb|wortel}}.
* Vervang de mosterd door 2 theelepels {{Kb|mierikswortel}}.
* Voeg 1 eetlepel fijngesneden {{Kb|dille}} toe, bij voorkeur verse.
* Andere ingrediënten naar keuze: biet, sla, broccoli, tomaat.
==Externe links==
*[https://www.mijnrecepten.nl/ingredient/zuurkool/ Recepten op mijnrecepten.nl]
{{Navigatie recepten}}
[[Categorie:Nederlandse keuken|Zuurkool]]
[[Categorie:Saladerecept|Zuurkool]]
{{Sub}}
4brmmg08oijxj7u8fekaghisyud1qkn
Kookboek/Tomatensoep
0
35787
428127
401043
2026-05-20T05:30:06Z
Erik Baas
2193
lf
428127
wikitext
text/x-wiki
{{Infobox recept
|Naam=Tomatensoep
|Afbeelding=[[Afbeelding:Tomato soup.jpg|300px]]
|Onderschrift=Licht gebonden tomatensoep waar weinig aan is toegevoegd
|Categorie=Soeprecept
|Porties=4
|Energie=
|Tijd=25 minuten
|Stippen=1
}}
[[Kookboek/Soep|Soep]] | [[Kookboek/Recepten|Receptenindex]]
Dit is een basisrecept voor tomatensoep. Er zijn zeer veel variaties mogelijk.
==Ingrediënten==
* 500 -1000 g {{Kb|p=tomaat|tomaten}}
* 1 l {{Kb|bouillon}}
==Bereiding==
* Was de tomaten, haal de kroontjes eraf en snij ze in een grote stukken.
* Breng de tomaat in de bouillon aan de kook. Laat het geheel ongeveer een kwartier zachtjes koken.
* Pureer de soep totdat de gewenste dikte is bereikt.
== Varianten ==
* Vervang de tomaten door tomatenpuree.
* Voeg verse ingrediënten toe, zoals ui, {{Kb|p=laurier|laurierblaadjes}}, {{Kb|marjolein}}, peterselie, bladselderij...
* Voeg gehaktballetjes toe en laat die 10 minuten meekoken.
* Voor een gebonden soep: Smelt 50 g boter of margarine in een andere pan en maak met 50 g bloem hiervan een [[Kookboek/Roux|roux]]. Voeg deel voor deel en al roerend de tomatensoep erbij (zonder balletjes) totdat een gladde soep ontstaat. Breng de soep op smaak met peper en roer er wat fijngesneden bladpeterselie bij. Schep tenslotte op elk bord of soepkom een lepel stijfgeslagen ongezoete room of kookroom.
==Afgeleide recepten==
*[[Kookboek/Hollandse tomatensoep]]
*[[Kookboek/Chinese tomatensoep]]
==Externe links==
*[https://www.okokorecepten.nl/recept/soep/tomatensoep/ Recepten met tomatensoep op okokorecepten.nl]
*[https://www.mijnrecepten.nl/soep/tomatensoep/ Recepten met tomatensoep op mijnrecepten.nl]
*[https://4en5meiamsterdam.nl/hier-vind-je-het-recept-van-de-vrijheidssoep-2024/ Vrijheidssoep 2024] Tomatensoep met miso en bosui
{{Navigatie recepten}}
{{Wikipedia|Pagina=Tomatensoep|Naam=Tomatensoep}}
{{Wiktionary|tomatensoep}}
[[Categorie:Soeprecept|Tomatensoep]]
{{Sub}}
d9si2jf5d4pyd3l9jey47a1wx210snj
Kookboek/Tarte tatin
0
35840
428129
395272
2026-05-20T05:30:07Z
Erik Baas
2193
lf
428129
wikitext
text/x-wiki
[[Bestand:Franse tarte tatin.jpg|200px|thumb|Franse tarte tatin]]
==Benodigdheden==
*1 kg appels, 100 gram boter, 150 gram kristalsuiker, 1 rol bladerdeeg.
==Bereiding==
*Schil de appels, verwijder het klokhuis, en snijd ze in stukjes: naargelang de grootte in kwartjes of halfjes
*Verdeel de boter en de suiker in de bakvorm en laten smelten en karameliseren in een voorverwarmde oven
*Haal de bakvorm uit de oven en schik de appelen, druk mooi aan.
*Rol het bladerdeeg uit over het mengsel. Druk de randen goed aan, en prik gaatjes in het bladerdeeg.
*Plaats 20 minuten in een voorverwarmde oven 200 °C
*Haal de taart uit de oven en draai deze om. Gebruik hiervoor een bord of schotel. Let op voor de hete vloeistof en de karamel die kunnen uitlopen. Dien warm op met een bolletje vanille-ijs.
{{Navigatie recepten}}
[[Categorie:Taart|Tarte tatin]]
{{Sub}}
qg3h1wah0acjysln0c1lal2l01z0i6g
Kookboek/Thee
0
35889
428128
411235
2026-05-20T05:30:07Z
Erik Baas
2193
lf
428128
wikitext
text/x-wiki
[[Bestand:Tea at Lipton Tea House.jpg|thumb|Theekopje en theepot]]
[[Bestand:Thetaske (tetaske).JPG|thumb|150px|Theemuts]]
[[Bestand:Zuckerzange.jpg|thumb|Suikerklontjes en suikertang]]
'''Thee''' is een zeer bekende hete drank die wordt gemaakt van de gedroogde bladeren van de ''Camellia sinensis'', in de volksmond bekend als de theeplant.
== Thee zetten ==
===Ingrediënten===
* losse thee: 1 à 2 theelepels per kopje; OF
* een of meer theezakjes, zie de aanwijzingen op de verpakking voor het aantal
===Keukengereedschap===
* Theepot, bij voorkeur één die warmte goed kan vasthouden, zoals aardewerk, porselein of gietijzer. OF een theekopje.
* Bij het gebruik van losse thee: een {{Wp|Thee-ei|thee-ei}} of {{Wp|Theezeef|theezeefje}} (om thee met losse theebladeren te filteren)
* Om de thee warm te houden: een {{Wp|Theemuts|theemuts}} of andere warmhouder (zoals een thermoskan die niet voor koffie wordt gebruikt, een dubbelwandige metalen theepot of een warmhouder met een theelichtje; een theepot die daartegen bestand is, kan ook op het warmhoudplaatje van het koffiezetapparaat worden gezet).
* Om thee te serveren: theekopjes, theeglazen of mokken.
* Vaak ook: een pot met suiker en een suikerlepeltje of met suikerklontjes met een suikertang. En theelepeltjes om de suiker dan door de thee te roeren.
===Bereidingswijze===
Van het zetten van thee wordt soms een heel ritueel gemaakt, maar thee zetten kan ook eenvoudig, zelfs direct in een kopje.
Spoel eerst de pot om met heet water om hem op te warmen. Giet dan heet {{Kb|water}} in de voorverwarmde pot en doe de thee erin, los, in een thee-ei of in een theezakje. Laat de thee een paar minuten trekken. Bij lang trekken (meer dan 5 minuten) wordt de thee bitterder, dan bij korter trekken (2-3 minuten). Voor zwarte thee mag de watertemperatuur niet hoger zijn dan 90 °C. De thee wordt dan vrijwel niet bitter.
'''Groene thee''' mag eveneens niet te heet getrokken worden, omdat hij dan te bitter smaakt: niet heter dan 70 °C. Dat kan op de volgende manier: giet eerst de voorverwarmde pot voor een kwart vol met koud water en vul aan met kokend water. (Tip: zoek een mok waar precies een kwart pot in past en houd die mok apart.) De temperatuur is met het koude water tussen de 70 en 80 graden. Goede en goed gezette groene thee smaakt kruidig, zwarte thee-achtig en zoetig tegelijk.
De pot afwassen is niet echt nodig, omspoelen is voldoende en in elk geval mag er geen zeep worden gebruikt.
== Thee serveren ==
[[Bestand:Biergarten Inselmühle 04.jpg|thumb|Doos met theezakjes naar keuze]]
* '''Let op''': Het drinken van te hete thee (heter dan 70 graden Celsius) wordt in verband gebracht met slokdarmkanker.
* Vaak wordt geen thee meer in een theepot gezet, maar wordt per theedrinker heet water in een theekop(je) geschonken en wordt een doos met een sortering aan theezakjes met verschillende smaken thee gepresenteerd. De theedrinker kan dan zelf de gewenste thee laten trekken. Dit gebeurt zowel in horeca-gelegenheden als thuis. Extra benodigd: een schoteltje of schaaltje om gebruikte theezakjes op/in te leggen.
* Het is het gezondste om thee ongezoet te drinken. Maar veel mensen houden toch van een zoetere smaak. Naast een of meer theelepels suiker of suikerklontjes kan daarvoor ook een beetje honing of een [[Kookboek/Zoetstof|zoetje]] door een kop thee worden geroerd.
* Engelsen voegen ook een wolkje melk en/of een schijfje citroen toe.
* Thee wordt vaak geserveerd met iets lekkers, van een eenvoudig {{Wp|Mariakaakje|mariakaakje}} tot een uitgebreide [[Kookboek/Maaltijden samenstellen#High tea|high tea]] met kleine sandwiches, taart, scones en bonbons.
== Varianten ==
* Voeg bij het trekken van de thee enkele plakjes verse gember toe voor een pittiger smaak.
* Er zijn talloze soorten gedroogde thee te koop, van diverse soorten zwarte en andere kleuren thee (zie {{Wp|Thee_(drank)#Theesoorten|Theesoorten}}) en zwarte thee met een smaakje, tot zogenaamde "infusions", vaak {{Wp|Thee_(drank)#Kruidenaftreksels|kruidenaftreksels}}, zonder echte thee. Muntthee is de meest bekende van die kruidenaftreksels. In de regel worden andere soorten thee op dezelfde manier gezet als hierboven beschreven. In tegenstelling tot gewone thee, worden infusions in de regel lekkerder naarmate ze langer worden getrokken.
** Verse '''muntthee''': was enkele takjes verse [[Kookboek/Munt|munt]] en schud het water er af. Doe de takjes in een hoog theeglas of in een theepot, giet er heet water overheen en laat de muntthee minimaal 5 minuten trekken. Hoe langer muntthee trekt, hoe lekkerder hij wordt.
* '''IJsthee''': zet thee op de hierboven beschreven manier en voeg desegewenst enkele smaakmakers toe, zoals citroenschijfjes, gember, suiker/honing en/of takjes munt. Laat de thee afkoelen in de koelkast. Voeg vlak voor het serveren enkele ijsblokjes toe.
* '''{{Wp|Grog|Grog}}''': zet eerst zwarte thee, schenk die in een mok of theeglas, iets meer dan halfvol. Giet er een flinke scheut rum bij, ongeveer een borrelglas, en het sap van een halve citroen. Toevoegen: 1 theelepel honing, 1 à 2 plakjes verse gember en andere kruiden zoals steranijs, kruidnagels en/of een beetje gemalen kaneel. Roer alles goed door elkaar en laat even trekken. Drink de grog warm. De rum kan worden vervangen door cognac of whiskey.
* '''[[Kookboek/Kwast|Kwast]]''' is geen echte thee, maar wel een niet-alcoholische drank met heet water.
== Bewaren ==
* Droge thee: 3 maanden, goed afgesloten, op een donkere, droge plaats, zoals een keukenkastje.
* Bereide thee: 3-7 dagen in de koelkast of 3 maanden in de vriezer.
{{Navigatie recepten}}
{{Sub}}
[[Categorie:Drank|Thee]]
997rj67g71ink0c1xh0a7891w1o6xmq
Kookboek/Sachertorte
0
36371
428131
402465
2026-05-20T05:30:09Z
Erik Baas
2193
lf
428131
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Sacher tort PL.JPG|300px]]
| Categorie = Cake, gebak en taart
| Porties = 12? (mede afhankelijk van de grootte van de taartpunten)
| Energie =
| Tijd = ± 50 minuten + 45 minuten oventijd + 1 uur afkoelen
| Stippen = 5
}}
'''Sachertorte''' is een Weense chocoladetaart.
==Ingrediënten==
* ''Deeg'': 125 gram pure {{Kb|chocolade}} (in stukjes), 125 gram koude {{Kb|boter}}, 150 gram {{Kb|poedersuiker}}, 6 {{Kb|p=ei|eidooiers}} en 6 eiwitten (van grote eieren, op kamertemperatuur), merg van één {{Kb|p=vanille|vanillestokje}}, 100 gram {{Kb|suiker}}, 150 gram {{Kb|bloem}}.
* ''Abrikozenglazuur'': In een pannetje 250 gram {{Kb|p=jam|abrikozenjam}} met 2 eetlepels bruine {{Kb|rum}} aan de kook brengen, onder voortdurend roeren. Twee à drie minuten laten doorkoken, tot er een gladde massa ontstaan is. Door een zeef halen en warm verder verwerken.
* ''Chocoladeglazuur'': In een schaal 150 gram suiker, 90 ml water en 125 gram pure chocolade (in stukjes) tot net onder het kookpunt brengen. Voortdurend roeren. Daarna de hitte beperken en vijf minuten onder voortdurend roeren op een laag vuur laten staan. Van het vuur halen en nog één minuut roeren, tot het mengsel enigszins is afgekoeld. Direct verder verwerken. Bij het uitgieten de bodem van de schaal niet leegschrapen.
==Bereidingswijze==
* De oven voorverwarmen op 200 °C.
* De randen van een springvorm goed invetten en met bloem bestuiven. De bodem met bakpapier bekleden.
* De chocolade [[Kookboek/Au bain-marie|au bain-marie]] laten smelten en daarna iets laten afkoelen, onder voortdurend roeren.
* De boter met een handmixer in ongeveer één minuut schuimig roeren. Op de laagste stand de poedersuiker toevoegen. Daarna nog twee minuten op de hoogste stand mixen, tot de massa licht van kleur en schuimig is. Eén voor één de eidooiers toevoegen en daarna de gesmolten chocolade en het vanillemerg toevoegen.
* De eiwitten met de suiker opkloppen, echter niet te stijf.
* Ongeveer ¼ van de eiwitmassa door de chocolademassa roeren. De rest van het eiwit voorzichtig door de massa spatelen, zodat nog kleine witte stukjes zichtbaar blijven. De bloem in twee porties zeven boven de massa en er door spatelen.
* Het deeg gelijkmatig in de springvorm verdelen.
* Gedurende 45 minuten bakken in het midden van de oven.
* De taart in de breedte doorsnijden zodat er twee ronde plakken overblijven. Vullen met abrikozenglazuur. De twee helften weer op elkaar zetten en de taart met de rest van de abrikozenglazuur bedekken.
* Het glazuur koud laten worden, zodat het gelijkmatig en stevig wordt.
* Het chocoladeglazuur bereiden en gelijkmatig over de taart gieten.
* Iets laten drogen, de taart op een serveerschaal plaatsen en minimaal één uur laten afkoelen, zodat de glazuurlaag stevig wordt.
De taart ongeveer één uur voor serveren uit de koelkast halen en serveren met een lepel “Schlagobers”. Hiervoor de slagroom zoeten met vanillesuiker in plaats van kristalsuiker.
{{Wikipedia|Pagina=Sachertorte|Naam= Sachertorte}}
{{Navigatie recepten}}
{{Sub}}
[[Categorie:Taart|Sachertorte]]
[[Categorie:Chocoladerecept|Sachertorte]]
gv290tzkr16ypuof9o5vylad9a8ay59
Kookboek/Frangipanetaart
0
36376
428134
395259
2026-05-20T05:30:10Z
Erik Baas
2193
lf
428134
wikitext
text/x-wiki
==Benodigdheden==
*100 gram zelfrijzende bloem
*120 gram gemalen amandelen
* een scheutje amandelessence
*3 eieren
* 2 pakjes vanillesuiker
* 200 gram (room)boter
* 200 gram suiker
* Eventueel 2 à 3 appelen (als je dit in je taart gebruikt).
==Hoe ga je te werk==
Eerst meng je de boter met de suiker. Daarna voeg je één voor één de eieren erbij, deze moet je onder kloppen met de rest van het mengsel. Vervolgens voeg je de bloem en de amandelen er aan toe. Nu meng je de essence onder het beslag. Als het beslag klaar is doe je alles in een ingevette en met bloem bestrooide vorm, je kan ook een bakpapier in de vorm leggen. Als laatste moet je de appel in dunne schijfjes snijden en deze op het beslag in de vorm leggen.
Zet de taart in een voorverwarmde oven van 175° gedurende 45 minuten. Voor de afwerking kan je suikerglazuur gebruiken of de taart bestrooien met bloemsuiker.
{{Navigatie recepten}}
[[Categorie:Taart|Frangipanetaart]]
{{Sub}}
hb448f3x8yb9za3m3z9wwpd6mel1xub
Kookboek/Margarita
0
36380
428130
404484
2026-05-20T05:30:08Z
Erik Baas
2193
lf
428130
wikitext
text/x-wiki
[[Bestand:Original Margarita.JPG|thumb|Margarita]]
Dit is een recept voor een [[Mexicaanse keuken|Mexicaanse]] cocktail.
==Ingrediënten==
*2/4 witte {{Kb|tequila}}
* 1/4 triple sec
* 1/4 limoensap
* een stukje {{Kb|limoen}}
* ijs
* keukenzout
==Bereiding ==
# Wrijf een partje limoen over de rand van een gekoeld [[cocktailglas]].
# Zet het glas omgekeerd in het zout.
# Shake de ingrediënten.
# Schenk het mengsel door een strainer in het glas, zodat het ijs achterblijft in de shaker.
# Garneer het glas met een nieuw stukje limoen.
{{Sub}}
{{Wikipedia|Pagina=Margarita (cocktail)|Naam=Margarita}}
{{Navigatie recepten}}
[[Categorie:Cocktail|Margarita]]
[[Categorie:Mexicaanse keuken|Margarita]]
40ejkdpmbiz4ofamg3xrteh2dknb76a
Kookboek/IJzerkoekje
0
36384
428137
395289
2026-05-20T05:30:13Z
Erik Baas
2193
lf
428137
wikitext
text/x-wiki
Van het Vlaardingse ijzerkoekje bestaan verschillende recepten. Onderstaand recept is van een van de Vlaardingse banketbakkers. Andere recepten vermelden soms ei, vanille of andere smaakmakers als ingrediënt.
==Ingrediënten ==
Benodigdheden voor circa 35 ijzerkoekjes:
* 325 gram basterdsuiker
* 450 gram (Zeeuwse) bloem
* 300 gram boter (of margarine)
* een mespuntje keukenzout
* drie theelepels kaneel
* wat boter of olie voor het bakken
== Verder nodig ==
* ijzerkoekjesijzer
* ijzerkoekjessteker
Beide benodigdeheden zijn in de handel verkrijgbaar, althans in Vlaardingen.
==Bereiding==
Deeg met alle ingrediënten goed kneden. Dit enkele uren tot een halve dag in de koelkast leggen; daarna met deegrol uitrollen op plank met bloem, ca. 6–8 mm dik. Daarna weer even koelen. Koekjes met ijzerkoekjessteker uitsteken en op matig vuur bakken op met olie of boter ingevet ijzerkoekijzer, tenminste 1 tot enkele minuten aan beide zijden.
{{Wikipedia|Pagina=IJzerkoekje|Naam=IJzerkoekje}}
{{Navigatie recepten}}
{{Sub}}
[[Categorie:Koekjes|IJzerkoekje]]
of09fiw2hs3p9uduwi1dco4mqyxwcg9
Kookboek/Sea Breeze
0
36448
428132
394203
2026-05-20T05:30:10Z
Erik Baas
2193
lf
428132
wikitext
text/x-wiki
[[Bestand:Cocktail_with_vodka.jpg|200px|thumb]]
'''Sea Breeze''' is een cocktail met wodka, cranberrysap, grapefruitsap, limoen en gebroken ijs
==Ingrediënten ==
* 50 ml {{Kb|wodka}}
* 50 ml cranberrysap
* 70 ml grapefruitsap
* Een stukje limoen
* Crushed ijs
==Bereiding==
# Vul het glas (highball of tumbler voor driekwart met crushed ijs.
# Voeg de wodka, het grapefruitsap en het cranberrysap toe.
#Voeg een stukje limoen toe
#Roer nog even om alles te mengen.
{{Navigatie recepten}}
[[Categorie:Cocktail|Sea Breeze]]
{{Sub}}
om3vaffi8oxeqhfyyy4o2cn7zaruh6d
Kookboek/Moscow Mule
0
36449
428133
395525
2026-05-20T05:30:10Z
Erik Baas
2193
lf
428133
wikitext
text/x-wiki
[[Bestand:Moscow Mule.jpg|200px|thumb]]
De '''Moscow Mule''' is een cocktail van wodka, ginger ale, suikersiroop, limoen en munt.
==Ingrediënten ==
* 50 ml {{Kb|wodka}}
* 80 ml {{Kb|ginger ale}}
* een eetlepel suikersiroop
* 10 ml limoensap
* wat munt
* een partje limoen
* ijs(klontjes)
== Bereiding ==
# Vul een longdrinkglas met ijs.
# Voeg de wodka toe.
# Voeg de suikersiroop en het limoensap toe.
# Vul de rest van het glas met ginger ale.
# Roer het geheel.
# Maak het drankje af door een los stukje limoen en een blaadje munt toe te voegen.
{{Navigatie recepten}}
[[Categorie:Cocktail|Moscow Mule]]
{{Sub}}
kpib4ecjm3if4t2b9zriaz0i8035ouu
Kookboek/White Russian
0
36450
428135
396407
2026-05-20T05:30:11Z
Erik Baas
2193
lf
428135
wikitext
text/x-wiki
[[Bestand:15-09-26-RalfR-WLC-0041.jpg|150px|thumb|Een nog niet gemixte White Russian]]
== Ingrediënten ==
* 5 cl {{Kb|wodka}}
* 2 cl [[Kookboek/Likeur|notenlikeur]]
* {{Kb|room}}
==Bereiding ==
# Schenk de wodka en likeur in een tumbler met ijsblokjes.
# Voeg naar smaak room toe.
# Mix de ingrediënten geleidelijk door elkaar.
{{Navigatie recepten}}
[[Categorie:Cocktail|White Russian]]
[[Categorie:KB-wodka| ]]
{{Sub}}
bmhdqzt5hpw8k6cs3agh5fy0wt1qpmy
Kookboek/Black Russian
0
36451
428136
396165
2026-05-20T05:30:13Z
Erik Baas
2193
lf
428136
wikitext
text/x-wiki
[[Bestand:Blackrussian.jpg|thumb|150px|Een Black Russian]]
'''Black Russian''' is een cocktail-drank.
==Ingrediënten ==
* 2 delen {{Kb|wodka}}
* 1 deel Tia Maria (koffielikeur)
* IJsblokjes
== Bereiding ==
# Neem een gekoeld shortdrinkglas.
# Doe de ijsblokjes erin
# Voeg de wodka en de likeur toe
# Roer het kort door elkaar
{{Navigatie recepten}}
[[Categorie:Cocktail|Black_Russian]]
{{Sub}}
rpo001zife40yuy3b5h9nz45jium5ma
Kookboek/Ossenstaartsoep
0
36484
428139
416210
2026-05-20T05:30:15Z
Erik Baas
2193
lf
428139
wikitext
text/x-wiki
{{Infobox recept
|Naam=Ossenstaartsoep
|Afbeelding= [[Afbeelding:Sup_Buntut_-_Nelayan_Indonesian_Restaurant.jpg|250px]]
|Categorie=Soeprecept
|Porties=
|Energie=
|Tijd=
|Stippen=1
}}
[[Kookboek/Soep|Soep]] | [[Kookboek/Recepten|Receptenindex]]
Dit is een basisrecept voor ossenstaartsoep.
==Ingrediënten==
*1 {{Kb|p=rundvlees|ossenstaart}}, gesneden
*stuk spek- of hamzwoerd
*1 ui of prei in ringen
*{{Kb|wortel}}
*{{Kb|p=knolselderij|selderijknol}}
*1 eetlepel {{Kb|tomatenpuree}}
*paar takjes {{Kb|peterselie}} en {{Kb|bladselderij}}
*2 laurierbladen
*schijfje citroen
*1 theelepel tijm, roosmarijn, korianderzaadjes
*zout en peper
*3 {{Kb|p=kruidnagel|kruidnagels}}
*35 g boter
*35 g bloem
*versgehakte peterselie
== Bereiding==
*Bak de ossenstaart en zwoerd samen met de ui, wortel en selderijknol in een braadpan bruin. Voeg vervolgens de tomatenpuree toe, Nog even later doorbakken, roeren en 1½ liter water toevoegen.
*Voeg vervolgens de peterselie, bladselderij, laurierbladen, citroen, tijm roosmarijn, koriander, zout, peperkorrels en kruidnagels toe en laat het geheel op laag vuur 4 nog uur trekken totdat de bouillon klaar is voor verder gebruik.
*In een andere pan de boter smelten en bloem toevoegen en bruin laten worden
*Vervolgens de gezeefde bouillon geleidelijk toevoegen aan de roux, voortdurend blijven roeren.
*Voeg eventueel doperwtjes en reepjes wortel toe en ten slotte de peterselie
*Opdienen met een glas madeira.
==Externe links==
*[https://www.mijnrecepten.nl/ingredient/ossenstaartsoep/ Recepten op mijnrecepten.nl]
*[https://www.okokorecepten.nl/recept/soep/ossenstaartsoep/ Recepten op okokorecepten.nl]
{{Appendix|2=
===Bron(nen)===
*{{Aut|Wina Born}}, ''Het volkomen Kookboek'', Meijer Pers, {{ISBN|9062011713}}, 1976
}}
{{Navigatie recepten}}
[[Categorie:Soeprecept|Ossenstaartsoep]]
{{Sub}}
dr6u56n5dzg787e279un40rzzye8kiu
Kookboek/Geroosterde groenten
0
36514
428138
394147
2026-05-20T05:30:13Z
Erik Baas
2193
lf
428138
wikitext
text/x-wiki
{{Infobox recept
|
| Afbeelding = [[Bestand:Roasted veggies (15615524401).jpg|300px]]
| Naam = Kookboek/Geroosterde groenten
| Categorie = ovenschotel
| Porties = 3
| Energie =
| Tijd = ruim een uur
| Stippen = 2
}}
[[Bestand:Roasted Vegetables (31367098615).jpg|thumb|Geroosterde groenten-2]]
[[Bestand:Neon root veggies (roasted beets, turnips, rutabaga, carrots and onions) (6893015819).jpg|thumb|Geroosterde groenten-3]]
'''Geroosterde groenten''' is een gerecht uit een combi-magnetron met aardappelen en diverse soorten groenten.
== Ingrediënten==
'''Vaste ingrediënten'''<br>
* 3 eetlepels olijfolie of andere plantaardige olie
* 2 uien, grof gesneden
* 2-3 tenen knoflook, in plakjes
* 3-4 aardappelen, 10 minuten voorgekookt met wat zout
* peper
* zout
* verse oregano, tijm en/of rozemarijn
'''Variabele ingrediënten'''<br>
Kies 4-6 {{Kb|p=groente|groenten}} uit de volgende lijst, naar keuze of beschikbaarheid, in totaal zo'n 700 g:
* ½ {{Kb|knolselderij}}
* ½ pompoen
* wortels (geschrapt, doormidden en gehalveerd)
* aubergine
* broccoli of bloemkoolroosjes
* 1 courgette
* (punt)paprika
* cherry-/kerstomaten (heel laten, niet snijden)
* 1 of 2 pastinaken
* 1 of 2 rode biet, halfgaar gekookt
* stronkje witlof
* venkelknol
* prei
* 2-3 zoete aardappels
* 4-5 aardperen
==Bereidingswijze==
# Verwarm de ovenstand van de magnetron voor op 200 °C.
# Maak de groenten schoon en schil ze zonodig. Snijd ze in blokken of plakken van ongeveer gelijke dikte, 1-1,5 cm.
# Meng alles goed, uitgezonderd de tomaten, doe de groenten op een grote ingevette bakplaat, strooi er ruim de kruiden overheen en doorheen, en vervolgens wat zout en veel peper, besprenkel met olijfolie.
# Plaats de bakplaat in de combimagnetron en laat de groenten 40 minuten garen.
## Schep de groenten om de 10 minuten om. Doe de tomaten er pas de laatste 15 minuten bij.
## Gebruik de laatste tien minuten de grill.
== Varianten ==
* Je kan er ook nog wat (gebakken) spekjes doorheen doen, of er karbonade, [[Kookboek/Braadworst|braadworst/saucijzen]], beenham of gorgonzola (kaas) bij geven.
{{Navigatie recepten}}
[[Categorie:Groentenrecept|Geroosterde groenten]]
[[Categorie:Ovenschotel|Geroosterde groenten]]
{{Sub}}
ntq917wv0ulh5gpyi8zj4rcqkra00xx
Kookboek/Rijstepap
0
36559
428140
406587
2026-05-20T05:33:02Z
Erik Baas
2193
lf
428140
wikitext
text/x-wiki
{{Niet te koppelen}}<!--[[Kookboek/Rijstebrij]] is al opgenomen in [[d:Q19029]]-->
'''Rijstepap''' bestaat uit gekookte {{Kb|rijst}} met melk erbij. Het wordt vooral in Azië veel gegeten.
{{Infobox recept
| Naam = Rijstepap
| Categorie = paprecept
| Porties = 1
| Energie = 100 kJ
| Tijd = 5 minuten
| Stippen = 3
}}
==Bereidingswijze==
* Stap 1: doe 1 kopje rijst in een pan. Vervolgens voeg je hier 100 ml melk aan toe.
* Stap 2: laat dit 3 minuten koken (+/- 100 graden Celsius).
* Stap 3: giet de rijstepap af in een kop.
==Zie ook==
* [[Kookboek/Rijstebrij]] (voor een recept van Nederlandse oorsprong)
* [[d:Q19029|Wikidata-item]] (voor meer koppelingen met o.a. Wikimedia Commons (afbeeldingen) en recepten voor rijstepap in anderstalige kookboeken)
{{Sub}}
{{Wikipedia
|Pagina=Rijstepap
|Naam= Rijstepap
}}
{{Navigatie recepten}}
[[Categorie:Rijstrecept]]
[[Categorie:Paprecept]]
3xw8y0tg5fsvdsnzc3u9mmgdgv3ffrm
Kookboek/Fatányéros
0
36607
428141
404555
2026-05-20T05:33:02Z
Erik Baas
2193
lf
428141
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Fatányéros 2.jpg|300px]]
| Onderschrift =
| Categorie = Vleesrecept
| Porties = 6-8
| Energie =
| Tijd =
| Stippen = 2
}}
'''Fatányéros''' is een gerecht uit Transsylvanië.
==Recept==
===Ingrediënten===
*250 gr {{Kb|p=varkensvlees|varkenslende}}
*250 gr {{Kb|kalfsvlees}}
*250 gr {{Kb|p=rundvlees|rundslende}}
*160 gr gerookt {{Kb|spek}}
*Gemalen paprikapoeder
*50 gr bloem
*2 dl olie
*zout
*salade (rodekool, paprika, tomaat, komkommer en gekookte rode biet)
*gebakken aardappelen
===Bereiding===
# Het vlees in ongeveer 60 gram grote stukken verdelen, bestrooien met zout en paneren in de bloem. In de hete olie bakken.
# Het spek in 4 stukken verdelen en de delen 2 cm diep insnijden op een drietal plaatsen. Het spek bakken.
# Een groot houten bord bedekken met rodekool, paprika, tomaat, komkommer en rode biet. In het midden op een hoop de gebakken aardappelen stapelen en daarop het vlees verdelen. Ten slotte het spek erbovenop plaatsen, als een hanenkam.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Hongaarse keuken]]
[[Categorie:Vleesrecept|Fatányéros]]
7zxi1p327o3mldnynaa8yyxoon25tq8
Kookboek/Doperwtjessalade met kapucijners
0
36675
428142
397884
2026-05-20T05:33:04Z
Erik Baas
2193
lf
428142
wikitext
text/x-wiki
{{Infobox recept
| Naam = Doperwtensalade met kapucijners
| Categorie = saladerecept
| Porties = 2 a 3 porties
| Energie =
| Tijd = 1 uur
| Stippen = 2
}}
==Benodigdheden==
* 400 gram verse, ongepelde {{Kb|p=peulvrucht|kapucijners}}
* 400 gram verse, ongepelde {{Kb|p=doperwt|doperwten}}
* 2 el {{Kb|olie}}
* 4 el {{Kb|keukenazijn}}
* {{Kb|zout}}/{{Kb|peper}}
* verse kruiden, zoals {{Kb|peterselie}}, {{Kb|bladselderij}}, {{Kb|bieslook}}
* 1 tl {{Kb|suiker}}
* 1 a 2 knoflookpitjes
* wat {{Kb|kropsla}}
* wat {{Kb|p=spek|spekjes}}
==Bereiding==
# Pel de kapucijners en de doperwtjes. Kook de peulvruchten 5 a 10 minuten, daarna afgieten, en op een bordje doen.
# Snijd de kruiden fijn, en mix deze door elkaar. Neem een grote, diepe, kom, en doe daar 2 el olie, 4 el azijn, 1 tl suiker, een beetje zout, peper, en een teentje of twee gehakte knoflook bij. Goed roeren en de kruiden erbij voegen.
# Spekjes uitbakken, en uit laten lekken.
# De kropsla wassen en ontnerven, daarna in stukken scheuren. Laat de sla uitlekken in een vergiet.
# Pak als laatste een mooi zomers bord, drapeer de sla, doe er de peulvruchten bij, sprenkel er de kruidenvinaigrette overheen en meng alles door elkaar. Als laatste doe je er de knapperige spekjes overheen.
Serveer de salade met warm stokbrood en boter.
{{Navigatie recepten}}
[[Categorie:Saladerecept|Doperwtjessalade]]
[[Categorie:Peulvruchtrecept|Doperwtjessalade]]
{{Sub}}
d8ui2px85nxbfkxsbypnqv6v6p0mzui
Kookboek/Vegetarische lasagne
0
36676
428145
409357
2026-05-20T05:33:06Z
Erik Baas
2193
lf
428145
wikitext
text/x-wiki
{{Infobox recept|. Groente lasagne
| Naam = Vegetarische lasagne
| Afbeelding = [[Bestand:Lasagne in baking dish fresh from the oven.jpg|300px]]
| Categorie = Vegetarisch recept
| Porties = 2 a 3 porties
| Energie =
| Tijd = 1 uur
| Stippen = 2
}}
'''Vegetarische lasagne''' is een ovenschotel zonder vlees, maar wel met groente, lasagne-vellen en kaas.
== Benodigdheden ==
* 1 grote {{Kb|aubergine}}
* 1 grote {{Kb|courgette}}
* half doosje {{Kb|p=Champignon|paddenstoelen}}
* 2 el {{Kb|p=Olie en vet|olie}} + een tl extra olie
* 1 blikje {{Kb|tomatenpuree}}
* 1 klein bakje {{Kb|slagroom}}
* 1 a 2 tenen knoflook
* [[Kookboek/Lasagnebladen|Lasagnebladeren]]
* Klein beetje gemixte Italiaanse kruiden
* Scheutje wijn, sherry kan ook.
* ovenschaal
* zakje geraspte, belegen, Hollandse {{Kb|kaas}}
== Bereiding ==
#Snijd de aubergine en courgette in kleine blokjes, en de paddenstoelen in plakjes.
#Doe 2 el olie, samen met de groente in een grote koekenpan, en laat alles op een zacht vuur garen.
#Maak een kuiltje in het midden van de pan (het kuiltje moet diep genoeg zijn, je moet de bodem van de pan zien).
#Doe daar een tl olie in, hak de knoflook fijn en doe het samen met de Italiaanse kruiden (1 tl), de wijn (2 el, of 1 el sherry) in het kuiltje.
#Even laten bakken onderwijl roerend.
#Puree erbij (vergeet niet dat op 1 blikje puree, nog 2 van diezelfde blikjes water , bij het groentemengsel gedaan moet worden), en alles 2 minuten rustig laten sudderen op laag/gemiddeld vuur.
#Dan pak je een ovenschaal (de schaal moet groot genoeg zijn, alle ingrediënten moeten erin kunnen), en doe je een laagje van het groenten mengsel in de schaal, deze beleg je met 1 laag lasagnebladen.
#Daarover heen strooi je wat kaas.
#De volgende stap is room bij het groentemengsel in de koekenpan voegen, misschien is een half bakje genoeg. Mocht het toch nog wat te droog zijn, dan doe je er nog een klein scheutje water bij, de saus weer even roeren en doorkoken.
#Nu gaat het tweede laagje room/groentemengsel over de kaas heen, daarop leg je weer een laagje lasagne bladeren, zorg dat alles goed onder de saus (saus! dus niet al te waterig!) staat!
#Vervolgens weer wat geraspte kaas, en daarna weer het groente mengsel, totdat het gerecht helemaal onder de groentesaus staat.
#Misschien op het laatst nog een beetje kaas voor het gratineren en vervolgens kan het gerecht de oven in, op 200 graden ongeveer 25 minuten.
#Kijk aan het eind van de gaar tijd, of de lasagne bladeren al dente zijn, en serveer het gerecht met een groene salade.
Eet smakelijk!
{{Navigatie recepten}}
[[Categorie:Vegetarisch recept|Lasagne]]
[[Categorie:Pastarecept|Lasagne]]
{{Sub}}
ndwzh1tb3da4g92004si11v6qumfrlh
Kookboek/Vasilopita
0
36720
428143
410999
2026-05-20T05:33:04Z
Erik Baas
2193
lf
428143
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding = [[Bestand:Greek vasilopita.JPG|300px]]
| Onderschrift =
| Categorie = Griekse keuken
| Porties = 15-20
| Energie =
| Tijd = 15 minuten + 60 minuten oven
| Stippen = 3
}}
'''Vasilopita''' (Grieks: Βασιλόπιτα) ofwel ''koningsbrood'' is een klassiek brood dat met Nieuwjaar in Griekenland geserveerd wordt. Rond middernacht op oudejaarsavond wordt het brood aangesneden. In het brood zit een muntje verstopt. Diegene die dat in zijn stuk brood vindt, zou het hele jaar geluk hebben.
Er zijn vele variaties en ook in omringende christelijke landen kent met dit brood.
==Recept==
===Ingrediënten ===
*850 gram {{Kb|p=bloem|meel}}
*180 gram {{Kb|suiker}}
*180 gram {{Kb|boter}}
*6 grote {{Kb|p=ei|eieren}}
*100 gram {{Kb|gist}} of bakpoeder
*Rozijnen en krenten
*{{Kb|Sinaasappelsap}}
*Geraspte sinaasappelschil
*Scheutje {{Wp|Metaxa|Metaxa}}
*Snufje zout
*Munt
*Eventueel {{Wp|Mastiek (hars)|mastiek}}.
===Bereiding===
Verwarm de oven voor op 150 graden.
Neem een beslagkom en sla de boter zacht en romig met een mixer. Splits het eiwit van het het eigeel en sla het eiwit in een aparte beslagkom stijf en meng voorzichtig, met kleine hoeveelheden, het meel en de bakpoeder of het gist hierdoorheen. Voeg de overige ingrediënten toe, de losgeslagen boter en meng het geheel tot een luchtig deeg met een spatel. Voeg het muntje toe, eventueel verpakt in een stukje aluminiumfolie.
Bak hierna de Vasilopita in ongeveer 60 minuten af en controleer met een breinaald of deze hierna van binnen gaar is.
==Zie ook==
* [[Kookboek/Griekse keuken|Griekse keuken]]
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Griekse keuken|Vasilopita]]
[[Categorie:Broodrecept - zelf brood maken|Vasilopita]]
ntlp3btycdgfnarhv6g7ojgxgbdnni6
Wikijunior:Schaken voor beginners/Waarden
104
36730
428194
375591
2026-05-20T05:54:00Z
Erik Baas
2193
428194
wikitext
text/x-wiki
De waarden van de stukken zijn belangrijk bij het vergelijken hoe goed iemand staat. Elk stuk staat voor een bepaalde waarde.
*De pion staat voor 1 punt
*Het paard staat voor 3 punten
*De loper staat voor 3 punten
*De toren staat voor 5 punten
*De dame staat voor 9 punten
De koning telt niet mee omdat de koning niet geslagen kan worden.
In totaal staan er dus 8x1 + 4x3 + 2X5 + 1X9 = 39 punten per kleur op het bord.
Een veel voorkomende ruil, naast de gelijke ruil (paard tegen paard of toren tegen toren, loper tegen paard), is een toren tegen een loper of paard. Omdat deze ruil zoveel voorkomt is er een woord voor bedacht: een '''kwaliteit'''. Als een witte toren en een zwarte loper worden geslagen, staat zwart dus een kwaliteit voor.
Als een speler veel sterker is dan diens tegenstander, kan diegene ervoor kiezen om met minder stukken te spelen, een zogenoemde ''handicap''. Dit wordt uitgedrukt in het aantal punten waar de speler minder mee start.
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Remise
|tekstvorige=
|huidige=Waarde van de stukken
|volgende=De stukken
|tekstvolgende=
}}
{{Juniorsub}}
0qyq38teb2f7qbtigxo82pf14nu99pz
Wikijunior:Schaken voor beginners/De stukken
104
36731
428195
309824
2026-05-20T05:54:02Z
Erik Baas
2193
428195
wikitext
text/x-wiki
Er zitten zes verschillende stukken in het schaakspel: de koning, de dame, de toren, de loper, het paard en de pion.
Van de koning en de dame zitten er maar een per kleur, de toren, loper en het paard zijn alledrie in tweetallen op het bord te vinden. Van de pionnen zijn er maar liefst acht per kleur.
== Koning ==
De koning is het belangrijkste stuk. Zodra deze wordt geslagen is het spel voorbij. De bedoeling is dan ook om de koning zo lang mogelijk te beschermen. De witte koning start op e1 en de zwarte koning op e8.
== Dame ==
De dame is het meest waardevolle stuk na de koning. Zij staat naast de koning op d1 voor wit en op d8 voor zwart.
== Toren ==
De toren is het makkelijkste stuk om te begrijpen op een regel na: de [[Wikijunior:Schaken voor beginners/Bijzondere zetten#Rokeren|''rokade'']]. De torens staan in de hoeken op a1 en h1 voor wit en op a8 en h8 voor zwart.
== Loper ==
De loper lijkt op de toren maar omdat de loper zich alleen maar diagonaal mag bewegen is het wel handig dat er twee van zijn. De lopers starten naast de koning en dame op c1 en f1 voor wit en op c8 en f8 voor zwart.
== Paard ==
Het paard is de vreemde eend in de bijt. De vreemde sprong van het paard is het lastigst te begrijpen. Het paard is ook het enige stuk dat meteen uit de beginstand kan spelen omdat het over stukken heen mag springen. De paarden starten op b1 en g1 voor wit en op b8 en g8 voor zwart.
== Pion ==
De pion ziet er het simpelste uit, maar heeft nog twee moeilijke regels, [[Wikijunior:Schaken voor beginners/Bijzondere zetten#Promoveren|''promoveren'']] en [[Wikijunior:Schaken voor beginners/Bijzondere zetten#En passant|''en passant'']] die op de volgende pagina zullen worden uitgelegd. De pionnen starten op de tweede rij voor wit, op de zevende rij voor zwart.
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Waarden
|tekstvorige=Waarde van de stukken
|huidige=De stukken
|volgende=Bijzondere zetten
|tekstvolgende=
}}
{{Juniorsub}}
tjc9uvrqvrr3ndw717mvepv0108ih44
Wikijunior:Schaken voor beginners/Bijzondere zetten
104
36735
428196
309825
2026-05-20T05:54:03Z
Erik Baas
2193
428196
wikitext
text/x-wiki
In het schaken zijn er niet alleen normale zetten, zetten die al beschreven zijn bij [[wikijunior:Schaken voor beginners/Verplaatsen van stukken|het verplaatsen van stukken]], maar ook bijzondere zetten die niet altijd mogen worden gedaan.
== Promoveren ==
{{Schaakdiagram|=
8 | | |pl| | | | | |=
7 |kd| | | | | | | |=
6 | | |kl| | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Voetregel='''Wit is bezig met promoveren. Als de pion een dame zou worden staat de zwarte koning pat. Het is dus verstandiger om tot een toren te promoveren.'''
|Float=right
|30}}
Een pion komt wel eens aan de overkant terecht en zou daar dan volgens de normale regels niets meer kunnen, hij kan tenslotte niet achteruit spelen/slaan. Om dit op te lossen is er een beloning bedacht voor de dappere pion: hij mag een ander stuk worden van de eigen kleur; hij ''promoveert''. Het enige stuk dat de pion niet mag worden is een koning. Het is dus theoretisch mogelijk om maximaal negen dames op het bord te hebben: acht gepromoveerde pionnen en de dame die in het begin start. De dame wordt het meest gekozen omdat die het sterkst is, maar niet altijd is dat handig. Daarom wordt er ook wel eens zwakker stuk gekozen (dat heet ''minorpromotie''). Zie het diagram hiernaast.
== En passant ==
{{Schaakdiagram
|=
8 | | | | | | | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | |xx|pd| | | | |=
3 | | |xb| | | | | |=
2 | | |pl| | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Voetregel=Wit aan zet verplaatst de pion naar c4. De zwarte pion slaat de witte pion '''en passant''' en komt op het blauwe kruisje te staan.
|30}}
Misschien wel de lastigste zet van alle zetten die er zijn: en passant. ''Letterlijk vanuit het frans: in het voorbijgaan''.
Zoals we weten mag de pion op de tweede rij/zevende rij twee stapjes naar voren zetten. Als er dan van de tegenstander in de kolom ernaast op de vierde rij staat, mag deze de pion slaan. De pion komt dan op de plek waar pion zou zijn geslagen als deze maar een stapje had gezet. Let wel op dat deze zet meteen na de vorige zet moet worden uitgevoerd. Als zwart eerst een andere zet doet en daarna en passant wil slaan is zijn kans voorbij.
== Rokeren ==
{{Schaakdiagram
|=
8 |rd| |1d|2d|kd| | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | | | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | |kl|2d|1d|rl|=
a b c d e f g h
|Voetregel=Wit voert de korte rokade uit, zwart de lange rokade. Op de 1 komen de koningen te staan, op de 2 komen de torens te staan.
|Float=right
|30}}
{{Schaakdiagram
|=
8 |rd| | |xx|kd| | | |=
7 | | | | | | | | |=
6 | | | | | | | | |=
5 | | | | | | |bl| |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | |nd| |=
1 | | | | |kl| | |rl|=
a b c d e f g h
|Voetregel=Wit mag niet rokeren want hij staat schaak. Zwart mag niet rokeren want hij komt onderweg schaak te staan.
|30}}
Waarschijnlijk de meest voorkomende bijzondere zet: '''Rokeren'''. Rokeren is de enige zet waarbij twee stukken worden verplaatst. De '''koning''' wordt met deze zet twee zetten opzij verplaatst en de '''toren''' ernaast aan de andere kant. Zie het diagram.
Er zijn twee rokades: ''Korte rokade'' en ''Lange rokade''.<br>
Bij de korte rokade gaat de witte koning van e1 naar g1 en gaat de toren van h1 naar f1. Voor zwart geldt het gespiegelde.<br>
Bij de lange rokade gaat de witte koning van e1 naar c1 en gaat de toren van a1 naar d1. Voor zwart geldt het gespiegelde.<br>
Bij het rokeren volgen wel een aantal regels:<br>
*Rokeren mag alleen als de koning en de toren nog niet hebben gespeeld. Ook niet wanneer de koning weer terug op e1/e8 staat.
*Rokeren mag alleen als de koning niet schaak staat of onderweg schaak staat.
*Rokeren mag alleen als de koning niet schaak staat op het veld waar hij uiteindelijk terecht komt.
Het maakt niet uit of de toren wordt aangevallen.
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=De stukken
|tekstvorige=
|huidige=Bijzondere zetten
|volgende=Schaaknotatie
|tekstvolgende=De schaaknotatie
}}
{{Juniorsub}}
tlj7j8vpkv037x7bi32zoamcu6rlqbc
Wikijunior:Schaken voor beginners/Schaaknotatie
104
36737
428197
339945
2026-05-20T05:54:05Z
Erik Baas
2193
428197
wikitext
text/x-wiki
De schaaknotatie is bedacht zodat partijen nagespeeld konden worden en er een database is opgebouwd met alle partijen. Tegenwoordig is het noteren van partijen die meetellen voor de rating verplicht.
Er zijn twee verschillende notaties: de lange en de korte notatie.
== Lange notatie ==
De lange notatie is eigenlijk de veiligste manier van noteren, maar duurt ook het langst. Om te beginnen krijgt elke functie een afkorting:
* Elk veld heeft zijn eigen naam met behulp van de letters en cijfers die aan de rand van het bord staan
* Koning krijgt K
* Dame krijgt D (daarom wordt de dame ook geen koningin genoemd)
* Toren krijgt T
* Loper krijgt L
* Paard krijgt P
* Pion krijgt geen afkorting
* Een gewone zet krijg -
* Slaan krijgt x
* Schaak geven krijgt +
* Dubbelschaak krijgt ++
* Schaakmat krijgt #
* En passant slaan krijgt e.p.
* Promotie krijgt achter het veld de letter welk stuk de pion wordt
* Korte rokade krijgt 0-0
* Lange rokade krijgt 0-0-0
Je noteert dan als volgt:
# Eerst het stuk dat beweegt (als het een pion is, komt er dus niks te staan)
# Daarna het veld waar het stuk vandaan komt
# Dan het zetteken (gewone zet, slaan)
# Dan het veld waar het stuk naartoe gaat
# Dan eventueel het achtervoegsel (schaak, mat, promotie of e.p.)
Voor een rokade is alleen de notatie 0-0(-0) voldoende.
{{Schaakdiagram|=
8 |rd|nd|bd|qd|kd| | |rd|=
7 |pd|pd|pd|pd| |ql|pd|pd|=
6 | | | | | |nd| | |=
5 | | |bd| |pd| | | |=
4 | | |bl| |pl| | | |=
3 | | | | | | | | |=
2 |pl|pl|pl|pl| |pl|pl|pl|=
1 |rl|nl|bl| |kl| |nl|rl|=
a b c d e f g h
|Kopregel=Het herdersmat
|Voetregel=De meest bekende mat
|Float=right
|30}}
Om nu het herdersmat te noteren wordt het als volgt:
Wit Zwart
1. e2-e4 e7-e5 (omdat er geen letter voor het veld staat gaat het dus om een pion.<br>
2. Lf1-c4 Lf8-c5<br>
3. Dd1-h5 Pg8-f6<br>
4. Dxf7#
== Korte notatie ==
De korte notatie maakt gebruikt van dezelfde afkortingen als bij de lange notatie. Het verschil is dat het veld van herkomst niet wordt weergegeven. Het herdersmatje wordt dan zo weergegeven:
Wit Zwart
1. e4 e5 (omdat er geen letter voor het veld staat gaat het dus om een pion.<br>
2. Lc4 Lc5<br>
3. Dh5 Pf6<br>
4. Dxf7#
{{Schaakdiagram|=
8 | | | | | | | | |=
7 |rd| |xr| | | | |rd|=
6 | | | | | | | | |=
5 | | | | | |nd| | |=
4 | | | |xb| | | | |=
3 | |nl| | |xy| | | |=
2 | | | | |nl| | | |=
1 | | | | | |nd| | |=
a b c d e f g h
|Voetregel='''Een zwarte toren gaat naar het rode kruis, een wit paard gaat naar het blauwe kruis en een zwart paard gaat naar een geel kruis.'''
|30}}
Zoals je ziet is deze notatie een stuk korter dan de lange notatie.
Bij een aantal zetten moet er echter opgelet worden. Zo zijn er een aantal zetten waarbij twee paarden naar hetzelfde veld kunnen.
Voor de witte paarden kan je zowel de letter als het cijfer gebruiken. Het meest gebruikelijke is om de letter te gebruiken, dus: '''Pbd3''' of '''Pfd3'''.<br>
Voor de zwarte torens krijg je '''Tac7''' of '''Thc7'''. De eerste letter geeft de rij aan waar het stuk vandaan komt.<br>
Voor de zwarte paarden werkt de letter niet omdat beide paarden op de f-lijn staan. Dus gebruiken we het cijfer: '''P1e3''' of '''P5e3'''.
{{Schaakdiagram|=
8 |kd| | | | | | | |=
7 | |nd| | | | | | |=
6 | | | | |nd| | | |=
5 | | |xx| | | | | |=
4 | | | | | | | | |=
3 | | | | | |bl| | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Voetregel='''Het paard op b7 staat gepend door de loper, daardoor kan alleen het paard op e6 naar c5'''
|Float=right
|30}}
Alleen als er een optie wegvalt, bijvoorbeeld omdat een stuk [[Wikijunior:Schaken voor beginners/Aanval#Penning|gepend]] staat, zie voorbeeld. De notatie Pc5 is dan genoeg omdat het andere paard niet mag bewegen.
Voor rokades, schaak, mat, promotie en en passant gelden nog steeds dezelfde notatie-afkortingen.
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Bijzondere zetten
|tekstvorige=
|huidige=De schaaknotatie
|volgende=Aanval
|tekstvolgende=De aanval
}}
{{Juniorsub}}
83m6ymonuu94ua3by2gplw4yul4qvb1
Wikijunior:Schaken voor beginners/Eindspel
104
36741
428198
309829
2026-05-20T05:54:07Z
Erik Baas
2193
428198
wikitext
text/x-wiki
Soms komt het voor dat van een speler alle stukken zijn geslagen behalve de koning en dat de ander alleen nog de koning en een of twee andere stukken heeft. Hier worden de meest voorkomende eindspelen beschreven met een link naar de uitlegpagina.
== Twee Torens tegen Koning ==
Waarschijnlijk de meest makkelijke manier van mat zetten.
Voor de uitleg zie [[Wikijunior:Schaken voor beginners/Twee Torens tegen Koning|hier]]
== Dame tegen Koning ==
De meest bekende waarschijnlijk en het gevaar voor pat is groot.
Voor de uitleg zie [[Wikijunior:Schaken voor beginners/Dame tegen Koning|hier]].
== Toren tegen Koning ==
De meest voorkomende waarschijnlijk in partijtjes.
Voor de uitleg zie [[Wikijunior:Schaken voor beginners/Toren tegen Koning|hier]].
== Pion tegen Koning ==
Een moeilijkere variant op Dame tegen Koning omdat je eerst de pion moet laten promoveren, daarna kan je het stappenplan van D tegen K volgen.
Voor de uitleg zie [[Wikijunior:Schaken voor beginners/Pion tegen Koning|hier]].
== Twee Lopers tegen Koning ==
Een zeer lastige mat, vereist veel oefening.
Voor de uitleg zie [[Wikijunior:Schaken voor beginners/Twee Lopers tegen Koning|hier]].
== Loper en Paard tegen Koning ==
Waarschijnlijk de lastigste omdat dit bijna nooit wordt bereikt binnen de [[Wikijunior:Schaken voor beginners/Remise|50 zetten-regel]].
Voor de uitleg zie [[Wikijunior:Schaken voor beginners/Loper en Paard tegen Koning|hier]].
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Openingen
|tekstvorige=
|huidige=Het eindspel
|volgende=Lastige schaakwoorden
|tekstvolgende=
}}
{{Juniorsub}}
awrdibxuh49bsezwhfgbpnbmbl7hxeo
Kookboek/Zombie
0
36855
428152
396388
2026-05-20T05:33:12Z
Erik Baas
2193
lf
428152
wikitext
text/x-wiki
[[Bestand:Zombiecocktail.jpg|right|150px]]
'''Zombie''' is een cocktaildrank op basis van rum en diverse fruitsappen.
== Ingrediënten ==
* 2 delen witte {{Kb|rum}}
* 2 delen bruine rum
* 1 deel lichtbruine rum of Bacardi
* 1 deel triple sec
* 1 deel {{Kb|sinaasappel|sinaasappelsap}}
* 1 deel {{Kb|p=limoen|limoensap}}
* 1 deel {{Kb|ananas|ananassap}}
* 1 deel [[Kookboek/Guave|guavesap]]
* 1 eetlepel [[Kookboek/Grenadine|grenadine]]
* 1 eetlepel amandel-sinaasappelsiroop
* 1 theelepel [[pastis]]
* ijsgruis
==Bereiding ==
# Meng alle ingrediënten in een blender.
# Schenk het in een glas.
# Garneer het glas eventueel met [[Kookboek/Munt|muntblaadjes]] en stukjes ananas.
{{Navigatie recepten}}
[[Categorie:Cocktail|Zombie]]
{{Sub}}
l8740b2kpqmxtj3kik9pcoqesehuim3
Kookboek/Manhattan
0
36856
428155
395405
2026-05-20T05:33:15Z
Erik Baas
2193
lf
428155
wikitext
text/x-wiki
[[Bestand:Manhattan (Orange peel Manhattan).jpg| thumb|Manhattan van sinaasappelschil]]
==Ingrediënten ==
* 1 deel zoete [[Kookboek/Vermout|vermout]]
* 3 delen [[Kookboek/Roggewhisky|whisky]]
* gehakt ijs
* een scheut [[Kookboek/Angostura|Angostura bitters]]
* een maraschinokers
== Bereiding ==
# Zet het glas van tevoren in de vriezer.
# Voeg de dranken en het ijs samen in een mengglas.
# Roer het geheel.
# Schenk alles over een strainer in een glas.
# Voeg de kers toe.
==Variaties==
Er zijn heel veel varianten mogelijk.
* De '''Droge Manhattan'''; deze variant wordt gemaakt van droge [[Kookboek/Vermout|vermout]] en een flinke scheut [[Kookboek/Blue Curaçao|Blue Curaçao]].
* De '''Perfect Manhattan'''; deze variant wordt gemaakt van 1½ deel zoete en 1½ deel droge vermout.
* Bij de '''Cubaanse Manhattan'''; bij deze variant wordt er bruine [[Kookboek/Rum|rum]] toegevoegd
* In de '''Florida Manhattan'''; bij deze variant wordt de kers en de brandewijn weggelaten. Ervoor in de plaats komt een schijfje [[kookboek/Citroen|citroen]].
* De '''Rob Roy Manhattan''' deze variant wordt gemaakt van ''[[Kookboek/Scotch|Scotch]]''.
{{Navigatie recepten}}
[[Categorie:Cocktail|Manhattan]]
{{Sub}}
7vr82e8q2l30qgjdyxeb19fl3z5orzi
Kookboek/Zeevruchtensalade met inktvis en garnalen
0
36907
428154
402485
2026-05-20T05:33:14Z
Erik Baas
2193
lf
428154
wikitext
text/x-wiki
{{Infobox recept
|Naam=
|Categorie=Vis- of zeevruchtrecept
|Porties=4
|Energie=
|Tijd= 2½ uur
|Stippen=3
}}
'''Zeevruchtensalade met inktvis en garnalen''' is een salade met garnalen en rauwe inktvis.
==Ingrediënten==
Voor 4-6 personen:
*300 g inktvis
*300 g gekookte en gepelde {{Kb|p=garnaal|garnalen}}
*1 stengel bleekselderij
*1 wortel
*½ bosje peterselie
*2 el citroensap
*zout en peper
*paar eetlepels olijfolie
*citroensap
==Optioneel==
*Verse citroen in plakjes
==Bereiding==
*Spoel de inktvis af met koud water en dep hem droog. Breng water met wat zout aan de kook en doe de inktvis erin, 1 minuut laten doorkoken. Doe de inktvis in een vergiet, spoel hem af met koud water en laat hem uitlekken. Snij de inktvis in ringen van ½ cm.
*Spoel de garnalen af en dep ze droog.
*Was de bleekselderij en verwijder de lelijke delen en eventuele draden. Snij de stengel in de lengte door en daarna in dunne plakken.
*Was of schil de wortel en snijd hem in stukken en vervolgens in kleine reepjes.
*Was de peterselie, sla de peterselie droog en hak deze daarna fijn.
* Doe het citroensap in een kom samen met het zout, de peper en de olie. Meng/Klop het tot een romig geheel. Meng vervolgens de inktvis, garnalen, groente en peterselie erdoor en zet het geheel 2 uur in de koelkast.
* Schep de salade nog eens door alvorens op te dienen. Serveer eventueel met verse plakjes citroen.
{{Bron|bronvermelding=
*Dit recept is grotendeels gebaseerd op een recept uit ''BASIC ITALIAN, Authentieke Italiaanse gerechten snel en smakelijk op tafel'', Schinharl, Cornelia & Dickhaut, Sebastian, 2001, {{ISBN|9044300962}}
}}
{{Navigatie recepten}}
[[Categorie:Vis- of zeevruchtrecept|{{SUBPAGENAME}}]]
{{Sub}}
02iq50914jam3h5q0fcdmdtqwpodwub
Kookboek/Tomatensaus
0
36908
428144
409155
2026-05-20T05:33:06Z
Erik Baas
2193
lf
428144
wikitext
text/x-wiki
{{Infobox recept
|Naam= Tomatensaus
|Afbeelding=[[Bestand:Flickr - cyclonebill - Tomatsauce.jpg|300px]]
|Categorie=Tomatenrecept
|Porties= 4
|Energie=
|Tijd= 20-45 minuten
|Stippen=3
}}
Dit is een basisrecept voor Italiaanse tomatensaus, die kan worden gegeten bij de meeste soorten [[Kookboek/Pasta|pasta]].
==Ingrediënten==
*500 g rijpe tomaten
*1 kleine wortel
*1 stengel bleekselderij
*1 ui
*2 teentjes knoflook
*1 tl rozemarijn
*2 el olijfolie
*verse blaadjes basilicum
*zout en peper
==Bereiding==
*Ontdoe de tomaten van hun steelaanzetjes en leg ze in een kom. Overgiet ze met kokend water en wacht tot het losse velletje bij de plek waar het steeltje is verwijderd omhoog buigt. Doe de tomaten in een vergiet, laat ze schrikken met koud water en verwijder de velletjes. Snij de tomaten in blokjes.
*Maak de wortel en de selderij schoon (de wortel eventueel [[Kookboek/Schillen|schillen]] of schrapen) en snijd beide groenten in kleine blokjes. Pel de ui en knoflook en snijd ook deze klein. Hak ook de rozemarijn fijn.
*Verhit de olie in een koekenpan en fruit eerst de ui en knoflook. Bak vervolgens de wortel en selderij kort mee. Voeg als laatste de tomaten en rozemarijn toe samen met wat zout en peper.
*Laat het geheel nu ca. 20 minuten op middelhoog vuur sudderen. Let op: voortdurend blijven roeren. Als de saus tijdens het garen te dik wordt, wat water toevoegen.
* Als de saus helemaal gaar is, de basilicum toevoegen en eventueel voor de smaak nog meer zout en peper.
==Varianten==
*In plaats van verse tomaten kunnen ook gepelde tomaten uit blik worden gebruikt. In dat geval deze klein snijden en als laatste toevoegen in de koekenpan samen met peper en zout. De tomaten moeten in dit geval ca. 10 minuten meegaren.
*Na het fruiten van de ui en knoflook kunnen tegelijk met de overige ingrediënten (groente-)bouillon of rode wijn worden toegevoegd.
*Er kan voor een volledig "basale" saus ook alleen met tomaten, knoflook en olie worden gewerkt. Andere ingrediënten en bijvoorbeeld gehakt kunnen naar keuze worden toegevoegd.
==Tips==
*Kook de pasta ''al dente'' terwijl de saus bezig is gaar te worden. De beetgare pasta moet namelijk meteen aan de saus worden toegevoegd.
*Met een staafmixer of blender kan de saus helemaal glad worden gemaakt.
{{Bron|bronvermelding=
*Dit recept is grotendeels gebaseerd op een recept uit ''BASIC ITALIAN, Authentieke Italiaanse gerechten snel en smakelijk op tafel'', Schinharl, Cornelia & Dickhaut, Sebastian, 2001, {{ISBN|9044300962}}
* [https://10xgezonder.nl/basis-tomatensaus/ ''BASIS TOMATENSAUS RECEPT''], 10xgezonder.nl
}}
{{Commonscat|Tomato sauce}}
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Italiaanse keuken|Tomatensaus]]
[[Categorie:Saus|Tomatensaus]]
[[Categorie:Tomatenrecept|Tomatensaus]]
rp99glq230krolu4p09rweijv6lcxgg
Wikijunior:Schaken voor beginners/Aanval
104
36940
428199
420700
2026-05-20T05:54:09Z
Erik Baas
2193
428199
wikitext
text/x-wiki
De aanval is zoals bekend de beste verdediging. Maar hoe kun je het beste veilig aanvallen? Natuurlijk door veilig aan te vallen, maar verder? De meest voorkomende tactische zetten zullen hier behandeld worden.
== Veilig aanvallen ==
Dit klinkt natuurlijk logisch, maar toch is het belangrijk goed op te letten waar je de stukken neerzet. Er worden, met name bij ingewikkelde stellingen, nog wel eens vijandelijke stukken over het hoofd gezien.
== Tweevoudige aanval ==
{{Schaakdiagram|=
8 | | |ql| | | | | |=
7 | | | | | |bl| | |=
6 | | | | | | | | |=
5 | |pd| | | | | | |=
4 | | |nd| | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Voetregel=Het zwarte paard wordt door zowel de dame als de loper aangevallen. Er is sprake van een ''tweevoudige aanval''.
|Float=right
|30}}
Dit begrip lijkt een beetje op de dubbele aanval (zie hieronder) en wordt er ook regelmatig mee verward, maar het verwijst feitelijk naar iets heel anders. Bij een tweevoudige aanval wordt een vijandelijk stuk door twee verschillende stukken aangevallen en maar door een stuk verdedigd. Omdat het stuk is verdedigd maakt het dus uit met welk stuk je als eerste slaat, zie het voorbeeld. Op het moment dat wit eerst slaat met de dame verliest hij negen punten en wint vier punten (paard+pion), een totaal van -5. Op het moment dat wit eerst slaat met de loper verliest hij drie punten en wint vier punten (paard+pion), een totaal van +1.
== Dubbele aanval ==
{{Schaakdiagram|=
8 | | | | | | | | |=
7 |kd| |xx| | | | | |=
6 | | | | | | | | |=
5 | |nl| | |nd| |rd| |=
4 | | | | | |xr| | |=
3 | | |qd| | |pl| | |=
2 | | | | | | | | |=
1 | | | | | | | | |=
a b c d e f g h
|Voetregel=Op het moment dat de witte pion een stap naar voren zet, worden zowel het paard als de loper aangevallen. In het geval van het witte paard worden zowel de koning als de dame aangevallen.
|Float=left
|30}}
Een ''dubbele aanval'', waarbij dus twee vijandelijke stukken tegelijk worden aangevallen, wordt ook vaak een ''vork'' genoemd. Vooral met een paard is een dubbele aanval heel goed mogelijk, maar in principe kunnen alle stukken het. Er is nog een speciale vorm van een dubbele aanval: de drievoudige aanval. Deze komt eigenlijk alleen voor bij het paard, maar ook de dame of de koning zou een drievoudige aanval kunnen creëren. En binnen de drievoudige aanval is er nog een bijzondere situatie: stel dat op het zwarte kruisje een zwarte toren zou staan. Dan zou het paard de koning, de dame én de toren aanvallen! Dit wordt ook wel ''familieschaak'' genoemd.
Naast de dubbele aanval bestaat er ook nog het ''dubbelschaak''. Dat is dus een schaakstelling waarin twee verschillende stukken de andere koning aanvallen.
Het speciale van dubbelschaak is dat de koning moet zetten omdat er geen stuk tussen geplaatst kan worden.
== Penning ==
{{Schaakdiagram|=
8 | | | | | | | | |=
7 |kd| |qd| | |rl| | |=
6 | | | |pd| | |pl| |=
5 | | | | | | | | |=
4 | | | | | | | |bd|=
3 | | | | | | |nl| |=
2 | | | | | | | | |=
1 | | | | |ql| | | |=
a b c d e f g h
|Voetregel=De zwarte dame staat gepend door de witte toren. De toren kan niet geslagen worden omdat deze gedekt staat door de pion. Het witte paard wordt gepend door de zwarte loper.
|Float=right
|30}}
Bij een ''penning'' wordt een bepaald stuk als het ware "vastgezet" op het bord. Dit betekent concreet dat het stuk niet mag of kan bewegen, omdat anders een stuk van dezelfde kleur in de buurt verloren zou gaan, óf omdat dit een situatie waarin de koning schaak komt te staan zou opleveren, en dit kan natuurlijk nooit. Een penning heet dus alleen een penning als het stuk dat achter de "blokkade" staat meer waard is dan de "blokkade" zelf. {{Clear left}}
Er zijn twee soorten penningen:
; Relatieve penning
: Van een ''relatieve penning'' is sprake als het blokkadestuk in theorie wel zou mogen bewegen, maar dit niet verstandig is, bijvoorbeeld omdat de dame dan kan worden geslagen.
; Absolute penning
: Bij een ''absolute penning'' mag het blokkadestuk niet bewegen omdat dat een onreglementaire zet zou zijn. Dit betekent meer concreet dat het stuk dat achter de blokkade staat de koning is.
In het voorbeeld is de zwarte penning een relatieve penning, de witte een absolute penning.
== Aftrekaanval ==
{{Schaakdiagram|=
8 | |kd| | | | | | |=
7 | | | | | | | | |=
6 |xr| |xr| | | | | |=
5 | |rd| | | | | | |=
4 | |nl| | | | |pl| |=
3 | | | | |xx| |pl|kl|=
2 | |ql|pl| | | |xy| |=
1 | | | |qd| |nd| | |=
a b c d e f g h
|Voetregel=In dit geval heeft zwart het witte paard gepend. Maar op het moment dat wit het paard naar a6 of c6 speelt, staat de koning schaak en kan zwart dus niet de dame slaan, maar moet de koning in veiligheid brengen. Wit heeft ook een probleem: als zwart het paard naar e3 wil spelen, dreigt er met '''Dd1-h1 mat'''.
|Float=left
|30}}
Een ''aftrekaanval'' betekent dat een bepaald stuk beweegt, met als gevolg dat een ander stuk van dezelfde kleur een stuk van de vijand aanvalt doordat door het bewegen van het eerste stuk "de weg vrij wordt gemaakt".
Bij een aftrekaanval is er dus sprake van een onverwachte aanval. Een aftrekaanval heeft alleen succes als beide stukken een doel hebben (het witte paard heeft de koning als doel, de dame heeft de toren als doel. Het zwarte paard heeft het gele veld onder controle terwijl de dame een matveld als doel heeft). Op het moment dat het achterste stuk de koning van de tegenstander aanvalt is er sprake van ''aftrekschaak'' omdat de koning dan schaak wordt gezet.
== Röntgenaanval ==
{{Schaakdiagram|=
8 | | | | | |rd| | |=
7 |qd| | |kd| | |rl| |=
6 | | | | | | | | |=
5 | | | | | |nl| | |=
4 | | | | | | | | |=
3 | | | | | | | | |=
2 | | | | | | | | |=
1 | | | | | |rl| | |=
a b c d e f g h
|Voetregel=De zwarte koning staat aangevallen door de witte toren. De koning moet dus opzij en wordt daardoor de baan naar de dame vrijgemaakt. De toren kan nu dus de dame slaan. De röntgenaanval van zwart heeft eigenlijk niet zo heel veel zin omdat het paard naar e3 of g3 gespeeld kan worden en daarmee de toren wordt gedekt.
|Float=right
|30}}
De ''röntgenaanval'' is een speciale vorm van een [[#Tweevoudige aanval|tweevoudige aanval]] waarbij de twee aangevallen stukken op dezelfde baan liggen (horizontaal, verticaal en diagonaal). De enige stukken die dus een röntgenaanval kunnen creëren zijn de dame, de toren en de loper. Het stuk dat als eerste in de lijn voorkomt is meestal van hogere waarde dan het stuk dat erachter staat.
Naast de röntgenaanval bestaat er ook nog de [[Wikijunior:Schaken voor beginners/Verdediging#Röntgendekking|röntgendekking]].
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Schaaknotatie
|tekstvorige=De schaaknotatie
|huidige=De aanval
|volgende=Verdediging
|tekstvolgende=De verdediging
}}
{{Juniorsub}}
ccno0oofdnhrfncf5zdect03epad1ch
Kookboek/Lange vingers
0
36944
428146
402466
2026-05-20T05:33:06Z
Erik Baas
2193
lf
428146
wikitext
text/x-wiki
[[Bestand:Biskotten-02.jpg|thumb|300px|Lange vingers]]
==Ingrediënten==
*3 {{Kb|p=ei|eieren}}
*70 gram fijne {{Kb|suiker}}
*75 gram {{Kb|bloem}}
*{{Kb|poedersuiker}}
==Benodigdheden==
*spuitzak
== Bereiding ==
*Splits elk ei, door het eiwit te scheiden van het eigeel.
*Klop het eiwit en de fijne suiker totdat het stijf is (er blijven pieken aan de garde hangen).
*Spatel nu voorzichtig de dooiers door het opgeklopte eiwit.
*Spatel nu, al zevend, de bloem erdoor en meng tot één massa.
*Doe het mengsel in de spuitzak en spuit de lange vingers op de bakplaat. Als je per lange vinger een lengte van 6,5 centimeter en een breedte van 2,5 centimeter aanhoudt, heb je genoeg voor 16 lange vingers.
*Bestrooi de lange vingers met suiker en leg ze 10-15 minuten in de voorverwarmde oven van 180° C. <ref>https://www.heelhollandbakt.nl/recepten/lange-vingers/</ref>
Eet smakelijk!
{{Navigatie recepten}}
== Bronnen en referenties ==
[[Categorie:Zoetigheid|Lange vingers]]
{{Sub}}
{{Appendix|2=
{{References}}
}}
7hxp8c3tk038f6bijd4xywxgdzu8kas
Wikijunior:Schaken voor beginners/Verdediging
104
36989
428200
397191
2026-05-20T05:54:11Z
Erik Baas
2193
428200
wikitext
text/x-wiki
Als aanvallen nu eenmaal te laat is, dan moet je gaan verdedigen. Maar hoe doe je dat het best? Hier worden de meest voorkomende tactische zetten over het verdedigen uitgelegd.
== Verdedigen ==
Bij verdedigen in het algemeen wordt er uitgegaan van vier verschillende mogelijkheden:
#Aanvaller slaan
#Weggaan
#Tussenplaatsen
#Dekken
Al deze thema's zullen hier in onderwerpen langskomen.
=== Slaan ===
Het handigst is meestal gewoon de aanvaller slaan als dat kan. Zeker als de aanvaller ongedekt staat is dat mogelijk. Maar stel dat het aangevallen stuk de dame is en dat de aanvaller verdedigd staat, dan verliest de verdediger dus de dame terwijl de aanvaller hooguit een toren of loper verliest.
=== Weggaan ===
Als slaan niet lukt is weggaan vaak de meest handige zet, maar ook dat is niet altijd mogelijk. Bijvoorbeeld als de dame wordt gepend door de loper. Als de dame dan weggaat, kan het stuk dat achter de dame staat geslagen worden.
=== Tussenplaatsen ===
Tussenplaatsen (niet te verwarren met de [[Wikijunior:Schaken voor beginners/Tussenzet|tussenzet]]) wordt dan een andere mogelijkheid om de aanvaller te stoppen. Het stuk wordt ze geplaatst dat het tussen het aanvallende stuk en het aangevallen stuk staat. Zoals je misschien al snapt is dit niet mogelijk wanneer de koning aanvalt (hier kan niets tussengezet worden), of als het paard aanvalt (het paard springt er gewoon overheen). Het belangrijke van het tussenplaatsen is het
=== Dekken ===
Dekken wordt in de schaakwereld algemeen gebruikt om alle termen van verdedigen aan te duiden, wat dus eigenlijk niet juist is. Dekken gaat erom dat het stuk dat aangevallen staat, teruggeslagen kan worden zodra de aanvaller slaat. Natuurlijk maakt de [[Wikijunior:Schaken voor beginners/Waarden|waarde van de stukken]] hier uit, dus zorg dat je een dame niet laat slaan, tenzij het voordelig voor je uitkomt. Bij dekken zijn er nog wel speciale gevallen van dekken die hieronder uitgelegd zullen worden.
==== Röntgendekking ====
{{Schaakdiagram|=
8 |kd| |rd| | | |nd|rl| r1=
7 | | | | | | |qd|pd| r2=
6 | | | | | | | | | r3=
5 | | | | | | | | | r4=
4 | | | |bl| | | | | r5=
3 | | |pl|pl| | | | | r6=
2 | | | | |bl| | | | r7=
1 | | | |kl| | | | | r8=
a b c d e f g h
|Voetregel=Wit dekt met behulp van '''röntgendekking''' de toren. Op het moment dat zwart de toren slaat, kan de loper de dame terugslaan.
|Float=right
|30}}
Het verdedigende stuk wordt zo geplaatst dat het precies in dezelfde baan als de aanvaller staat waardoor deze alsnog de aanvaller kan slaan.
==== Verdedigen tegen penning ====
Verdedigen tegen een penning is altijd lastig. Het eenvoudigste is om een stuk tussen het gepende stuk en het staartstuk te plaatsen. Een andere oplossing is het staartstuk weghalen, maar dan kan het kopstuk geslagen worden.
==== Verdedigen tegen dubbele aanval ====
Kijk altijd of het mogelijk is om een [[Wikijunior:Schaken voor beginners/Tussenzet|tussenzet]] te spelen met een van de aangevallen stukken, anders zit er niets anders op dan een stuk te laten slaan.
{{Bladeren2
|Boek=Wikijunior:Schaken voor beginners
|vorige=Aanval
|tekstvorige=De aanval
|huidige=De verdediging
|volgende=Tussenzet
|tekstvolgende=De tussenzet (in ontwikkeling)
}}
{{Juniorsub}}
4vde8mvy8bgiqqzk7ckzu6s76tcekqp
Kookboek/Stroopwafel
0
37175
428147
400101
2026-05-20T05:33:07Z
Erik Baas
2193
lf
428147
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Stroopwafelijzer.jpg|300px]]
| Onderschrift = Bereiding van een stroopwafel
| Naam = Stroopwafel (in de figuur een stroopwafelijzer)
| Categorie = Cake, gebak en taart
| Porties =
| Energie =
| Tijd = 1 uur
| Stippen = 5
}}
[[Bestand:Stroopwafels.jpg|300px|right|Stroopwafels]]
== Ingrediënten ==
Voor de wafels:
* 500 gr bloem
* 250 gr gesmolten boter
* 150 gr suiker
* 50 gr gist
* 60 ml lauwe melk
* 1 ei
* mespuntje zout
* boter voor invetten wafelijzer
Voor de vulling:
* 250 ml melassestroop of {{Kb|p=stroop|keukenstroop}}
* 200 gr bruine basterdsuiker
* 50 gr boter
* Eventueel: 1 theelepel kaneelpoeder, zout
Varianten:
* Vulling met karamelstroop in plaats van melassestroop
==Keukengereedschap==
* Wafelijzer
* Scherp mes met een lang lemmet om de wafels door te snijden
==Bereiding==
*Doe bloem, suiker en zout in een kom en meng het door elkaar. Meng er voorzichtig de gesmolten boter doorheen en het ei. Voeg ten slotte beetje bij beetje de melk toe waar de gist doorheen is geroerd. Kneed het geheel tot soepel deeg. Laat het deeg drie kwartier rijzen op een warme plek.
*Maak de vulling door de stroop met suiker en boter in een pan zachtjes te verhitten. Voeg naar smaak kaneel of zout toe. Laat de pan op heel laag vuur staan of zet hem in [[Kookboek/Au bain-marie|au bain-marie]].
*Maak het wafelijzer zeer heet en vet het in met wat boter. Neem een stukje van het deeg en knijp het wafelijzer samen. Bak het deeg gedurende ongeveer 1 minuut. De buitenkant moet bruin worden, maar de binnenkant moet zacht blijven. Haal de wafel uit het ijzer en leg het op een snijplank. Snijd de wafel in een ronde vorm. Dit is alleen nodig voor een fraai uiterlijk en niet strikt noodzakelijk.
*Leg de wafel daarna vlak op het aanrecht en snijd hem direct, terwijl hij nog warm is, horizontaal door.
*Bedek de ene helft van de doorgesneden wafel met een laagje stroop en leg de andere helft erop. Bak pas na het vullen van een stroopwafel een volgende, of werk met twee personen.
* De wafel kan warm of koud gegeten worden.
== Zie ook ==
*[https://www.youtube.com/watch?v=zXON_wvPhR8 Demonstratiefilmpje op YouTube]
{{Navigatie recepten}}
[[Categorie:Wafel|{{SUBPAGENAME}}]]
{{Sub}}
r68k5wyr1qt2wvscuk5uk7mgegg008y
Kookboek/Ovengerechten met assisted steam/Zalmfilet
0
37237
428149
403455
2026-05-20T05:33:08Z
Erik Baas
2193
lf
428149
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Salmon filet prepared in assited steam oven.jpg|300px]]
| Naam = Zalmfilet
| Categorie =
| Porties =
| Energie =
| Tijd = 15 minuten
| Stippen = 1
}}
Dit is een basisrecept voor zalmfilet uit een oven met assisted steam. Het resultaat is een zachte gegaarde vis, die nét gaar is.
==Benodigdheden==
===Ingrediënten===
*{{Kb|p=zalm|Zalmfilet}} van ca. 2 cm dik
*Olie, bijvoorbeeld olijfolie of zonnebloemolie
*Peper
*Zout
===Keukengereedschap===
*Een kleine ovenschaal zonder deksel
==Bereidingswijze==
*Zet de oven op de heteluchtstand op 190<sup>o</sup>C
*Verwarm de oven voor tot deze (vrijwel) 190<sup>o</sup>C heeft bereikt.
*Doe een klein scheutje olie in de ovenschaal en verspreid dit over de bodem.
*Bestrooi de vis met zout en peper naar smaak.
*Leg de vis in de ovenschaal.
*Stel de oven nu in op "stoom", stand "gemiddeld".
*Zet de schaal met vis midden in de oven.
*Laat 13 minuten in de oven staan.
*Haal de vis uit de oven en dien meteen op.
==Varianten==
*De filet van 2 cm dik wordt nét niet gaar op hierboven beschreven methode. Sommigen mensen vinden volledig gare zalm lekkerder. Verleng daartoe de baktijd tot 15 minuten
*Voor filet dunner dan 2 cm is 13 minuten of iets minder voldoende.
*Bestrooi de zalm met wat dille voor hij de oven in gaat.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Zalmrecept|Ovengerecht]]
[[Categorie:Ovenschotel|Zalmrecept]]
i6b88ie7k35h1hh04tjbxhu8nfl0slh
Kookboek/Bloemkool met kaas en prei
0
37297
428148
402986
2026-05-20T05:33:08Z
Erik Baas
2193
lf
428148
wikitext
text/x-wiki
{{Infobox recept
|Naam= Bloemkoolrecept
|Afbeelding=[[Afbeelding:Bloemkool met kaas en prei.jpg|300px|Bloemkool met kaas/prei]]
|Categorie=Groentenrecept
|Porties= 2
|Energie=
|Tijd=30 minuten + 15 minuten oventijd
|Stippen=3
}}
[[Kookboek/Nederlandse keuken|Nederlandse keuken]] | [[Kookboek/Bloemkool|Bloemkool]] | [[Kookboek/Recepten|Receptenindex]]
==Ingrediënten==
*halve grote of een kleine {{Kb|bloemkool}}
*1 grote aardappel
*75 gram cherrytomaat in kwarten gesneden
*halve prei
*1 teen knoflook (geperst of fijn gesneden)
*15 gram boter of margarine
*2 eetlepels bloem
*200 ml (soja)melk
*peper, paprikapoeder, zout
*30 gram oude kaas en 30 gram Parmezaanse kaas (beide geraspt)
*peterselie
==Bereidingswijze==
#Snijd de bloemkool in roosjes
#Schil de aardappel en snijd die in blokjes
#Breng ze samen aan de kook en laat het 10 minuten [[Kookboek/Blancheren|blancheren]]
#Afgieten en uit laten lekken, waarna in een ingevette ovenschaal verdelen samen met de tomaat
#Verwarm de oven voor op 180 graden met het rooster in het midden
#Snijd de halve prei in ringen en bak het met de knoflook in de boter
#Roerend de bloem toevoegen en langzaam bijvullen met melk
#Op smaak brengen met peper, paprikapoeder en zout
#Helft van de kaas erdoorheen roeren, beetje bij beetje bijvullen met melk en intussen laten inkoken tot de gewenste dikte is bereikt
#Verdelen over de bloemkool en aardappel en de andere helft van de kaas eroverheen doen
#15 minuten in de oven zetten
#Strooi peterselie erover op het bord
{{Tuinkalender|Bloemkool|bloemkool}}
{{Navigatie recepten}}
[[Categorie:Groentenrecept|Bloemkool]]
[[Categorie:Ovenschotel|Bloemkool]]
{{Sub}}
ky5jjprzfqy1ptkbhka2zkni49d0gz2
Kookboek/Screwdriver
0
37378
428150
396401
2026-05-20T05:33:10Z
Erik Baas
2193
lf
428150
wikitext
text/x-wiki
{{Infobox recept
|
| Afbeelding = [[Bestand:Screwdriver, Birmingham-Shuttlesworth International Airport, Birmingham AL.jpg|300px]]
| Naam = Screwdriver
| Categorie = Cocktail
| Porties =
| Energie =
| Tijd =
| Stippen = 2
}}
'''Screwdriver''' is een cocktaildrank op basis van wodka en sinaasappelsap.
==Ingrediënten ==
* 2 delen {{Kb|wodka}}
* vers {{Kb|sinaasappelsap}}
* een schijfje sinaasappel
* ijsblokjes
== Bereiding ==
# Doe het ijs in een glas.
# Schenk de wodka eroverheen.
# Vul de inhoud aan met sinaasappelsap.
# Roer alles goed door elkaar.
# Garneer het glas met een schijfje sinaasappel.
{{Navigatie recepten}}
[[Categorie:Cocktail|Screwdriver]]
[[Categorie:KB-sinaasappelsap| ]]
[[Categorie:KB-wodka| ]]
{{Sub}}
n7r6ah7shktrecbc0stzqykjnw1i77b
Kookboek/Orgasme
0
37379
428153
393863
2026-05-20T05:33:12Z
Erik Baas
2193
lf
428153
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Orgasm (cocktail).jpg|thumb|Een orgasmecocktail met twee maraschinokersen]]
| Naam = Orgasme
| Categorie = Cocktail
| Porties =
| Energie =
| Tijd = 5 minuten
| Stippen = 1
}}
'''Orgasme''' is een cocktail-drank.
==Ingrediënten ==
* 1 deel Baileys Irish Cream
* 1 deel cointreau
* 1 deel Grand Marnier
* ijsblokjes
== Bereiding ==
# Doe de ijsblokjes in een breed glas
# Voeg de ingrediënten toe
# Roer het geheel voorzichtig door
{{Navigatie recepten}}
[[Categorie:Cocktail|Orgasm]]
{{Sub}}
c0sqsl21y3gal7yoshrgmso49x33cfh
Kookboek/Eggnog
0
37381
428158
402695
2026-05-20T05:33:20Z
Erik Baas
2193
lf
428158
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Eggnog2.jpg|200px|thumb|Eggnog met [[Kookboek/Nootmuskaat|nootmuskaat]]]]
| Naam = Eggnog
| Categorie = Cocktail
| Porties =
| Energie =
| Tijd =
| Stippen =
}}
==Ingrediënten ==
* 200 ml volle {{Kb|melk}}
* 2 {{Kb|p=ei|eierdooiers}} en twee theelepels eiwit
* 60 ml room
* 40 g suiker
* 25 ml whisky, cognac of rum
* Snuf versgeraspte nootmuskaat
* 2 kaneelstokjes
== Bereiding ==
*Breng de 200 ml melk samen met 40 gram suiker tegen de kook aan.
*Doe twee eierdooiers en twee theelepeltjes van het eiwit in een blender.
*Laat de blender draaien terwijl je de warme melk bij de eieren schenkt (10-20 seconden).
*Doe er dan 60 ml room bij en een snuf versgeraspte nootmuskaat.
* Voeg dan de whisky (of cognac of rum) toe en laat de blender nog even draaien.
* Serveer in kleine glaasjes, bestrooid met een snufje nootmuskaat en een kaneelstokje om te roeren.
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Cocktail|Eggnog]]
[[Categorie:Eierrecept|Eggnog]]
r5f7vahqc16m7521114aj98xzn7ky9a
Kookboek/Cuba libre
0
37389
428151
399166
2026-05-20T05:33:11Z
Erik Baas
2193
lf
428151
wikitext
text/x-wiki
{{Infobox recept
|Naam=Cuba libre
|Afbeelding=[[Bestand:15-09-26-RalfR-WLC-0056.jpg|300px]]
|Categorie=Cocktail
|Porties=
|Energie=
|Tijd=
|Stippen=1
}}
'''Cuba libre''' is een cocktaildrank met rum en cola.
==Ingrediënten ==
* {{Kb|cola}}
* 2 delen {{Kb|rum}}
* een stukje {{Kb|limoen}}
* ijsblokjes
== Bereiding ==
# Wrijf een stukje limoen over de rand van het glas.
# Knijp de limoen uit in het glas en gooi de uitgeknepen limoen erbij.
# Vul een longdrinkglas helemaal vol met ijsblokjes.
# Schenk hieroverheen 35 cc witte rum.
# Vul het glas verder aan met cola.
{{Navigatie recepten}}
[[Categorie:Cocktail|Cuba_libre]]
{{Sub}}
dqwupbs5c7lp4tmf7v9cilryz48qutz
Kookboek/Taco's met zoete aardappel en zwarte bonen
0
37719
428157
409455
2026-05-20T05:33:17Z
Erik Baas
2193
lf
428157
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Roasted sweet potato + black bean tacos (7784822910).jpg|300px]]
| Onderschrift = Taco met zoete aardappelblokjes en zwarte bonen
| Categorie = Vegetarisch recept
| Porties = 2
| Energie =
| Tijd = ± 1:10
| Stippen = 3
}}
[[Kookboek/Vegetarische keuken|Vegetarische gerechten]] | [[Kookboek/Recepten|Receptenindex]]
[[Bestand:Ipomoea_batatas_006.JPG | thumb | Zoete aardappel]]
[[Bestand:Lime_Blossom.jpg | thumb | Limoenplant met bloesem]]
[[Bestand:A_scene_of_Coriander_leaves.JPG | thumb | Korianderblad]]
[[Bestand:Black_Turtle_Bean.jpg | thumb | Gedroogde zwarte bonen]]
[[Bestand:Cabbages_Green_and_Purple_2120px.jpg | thumb | Groene en rode kool]]
[[Bestand:Tortillas_de_maiz_blanco_(M%C3%A9xico)_01.jpg | thumb | Mais tortilla's]]
=== Ingrediënten ===
;Voor de aardappelen:
* 2 [[Kookboek/Zoete aardappel|zoete (oranje) aardappelen]], geschild en in kleine blokjes gesneden (5-8 mm)
* 1 eetlepel [[Kookboek/Olijfolie|olijfolie]]
* zout en rode chili vlokken naar smaak
* sap van 1 {{Kb|limoen}}
;Voor de koolsalade:
* 2 koppen gesnipperde {{Kb|Rodekool}} / {{Kb|groene kool}}
* 1/4 kop fijngesneden [[Kookboek/Ui|ui]]
* 2 eetlepels gehakt {{Kb|p=Koriander|korianderblad}}
* zout en rode chili vlokken naar smaak
* sap van 1 limoen
;Voor de bonen:
* 1 theelepel olijfolie
* 1/4 kop fijngesneden ui
* 1 theelepel gemalen {{Kb|p=komijnzaad|komijn}}
* 1 blik {{Kb|p=Peulvrucht|zwarte bonen}} (400g), uitgelekt en afgespoeld
* sap van 1 limoen
;Voor de tortilla's:
* 300 gram {{Kb|bloem}}
* halve theelepel [[Kookboek/Zout|zout]]
* 125 ml warm water
* scheut olijfolie
=== Benodigdheden ===
* snijplank
* koksmes
* oven
* bakplaat
* bakpapier
* middelgrote kommen
* deegroller
* maatbeker
* weegschaal
* koekenpan
* (houten) spatel
=== Bereidingswijze ===
# Meng het zout door de bloem. Voeg olie en water toe en kneed minimaal 5 minuten tot een soepel deeg. Dek af met een vochtige theedoek en laat 30-60 minuten rusten
# Verwarm de oven voor op 200 graden. Leg de blokjes zoete aardappel op een bakplaat met bakpapier. Doe de olijfolie, zout, chili vlokken en limoensap er bovenop. Roer door totdat alle aardappelstukjes bedekt zijn.
# Schuif de bakplaat in het midden van de oven en bak totdat de aardappelstukjes gaar en bruin zijn. Dit duurt ongeveer een half uur. Haal de bakplaat één of twee keer uit de oven om de aardappelstukjes door te roeren. Dan weet je zeker dat ze gelijkmatig garen. Haal de bakplaat uit de oven als de aardappelblokjes gaar en bruin zijn.
# Terwijl de aardappels garen, maak je de salade. Doe de kool, ui en gesneden koriander in een middelgrote kom. Voeg het limoensap, zout en chilivlokken toe. Roer door en zet aan de kant. Door het even te laten staan, wordt de kool zachter.
# Doe om de bonen te maken olijfolie in een middelgrote koekenpan. Voeg de uien toe en bak ze glazig. Ongeveer 3 minuten. Doe het komijnpoeder erbij en roer totdat de geur vrijkomt. Voeg de bonen en het limoensap toe. Bak nog even door totdat alles helemaal warm is.
# Verdeel de deegbal in 8 stukken. Bestuif het aanrecht met bloem en rol het deeg uit in een cirkel. Bak de tortilla's in een droge koekenpan, op middelhoog vuur, 1 tot 1,5 minuut per kant. Niet te lang, want dan worden de tortilla's te droog en kun je ze niet meer oprollen.
# Maak een taco door op de ene helft van een tortilla van alles wat te leggen, de andere helft van tortilla er overheen te vouwen, de zijflappen naar binnen te vouwen en het geheel op te rollen.
== Varianten ==
* Bij het samenstellen van de taco (stap 7): Rasp wat kaas over de bonen of voeg een eetlepel yoghurt, {{Kb|roomkaas}} of {{Kb|p=Zure room|sourcream}} toe.
== Zie ook ==
* [[Kookboek/Taco]] voor het basis-recept met varianten
{{Navigatie recepten}}
[[Categorie:Vegetarisch recept|Taco's_met_zoete_aardappel_en_zwarte_bonen]]
[[Categorie:Mexicaanse keuken|Taco's_met_zoete_aardappel_en_zwarte_bonen]]
[[Categorie:Peulvruchtrecept|TZwarte bonen]]
{{Sub}}
8cyfldnls5tv5utvjjedtf7rua9eiig
Kookboek/Borsjtsj
0
37953
428162
407679
2026-05-20T05:33:28Z
Erik Baas
2193
lf
428162
wikitext
text/x-wiki
{{Infobox recept
|Naam=Borstjsj
|Afbeelding= [[Afbeelding:Borscht with cream.jpg|300px|Borsjtsj met zure room]]
|Categorie=Soeprecept
|Porties= 4
|Energie=
|Tijd= ± 25 minuten excl. groenten schoonmaken, bouillon + bieten koken
|Stippen=3
}}
[[Kookboek/Soep|Soep]]
'''Borsjtsj''' is een Oost-Europese soep op basis van rode bieten.
== Ingrediënten ==
* 800 g gekookte, geschilde en geraspte {{Kb|rode biet|rode bieten}} (± 1 kg rauwe bieten)
* 1 gesnipperde ui
* 1 l {{Kb|p=bouillon|runderbouillon}} met 400 g gaar rundvlees
* zout en peper
* 1 bekertje {{Kb|zure room}}
== Bereiding ==
# Verwarm de bouillon en voeg de bieten en ui toe.
# Breng het geheel aan de kook. Temper dan de de hittebron en laat alles gedurende vijftien minuten zachtjes trekken.
# Breng de soep met zout en peper op smaak.
# Schep de soep op borden en schenk op elk bord een wolk room.
== Varianten ==
* Vervang een deel van de rode bieten door dezelfde hoeveelheid kool, bleekselderij, wortelen, knoflook en stelen van een bosje dille: kook die mee in de bouillon. De dilletoppen kan men na afloop fijngesneden over de soep strooien, als garnering.
* Mogelijke extra kruiden en specerijen om mee te koken: 2 kruidnagels, 1 takje verse tijm, majoraan. Vis de kruidnagelen vlak voor het serveren er weer uit.
* Voeg vijf minuten voordat de soep gereed is toe: 1 fijngesneden appel en/of enkele in plakjes gesneden champignons.
* Roer er 1 eetlepel rode wijnazijn en/of het sap van 1 citroen doorheen.
* Zet de soep 1 nacht in de koelkast voordat hij wordt geserveerd, om alle smaken goed te laten intrekken. Verwarm de soep vlak voor het serveren, maar kook hem niet meer.
* In Rusland heeft men de gewoonte er enkele fijn geprakte hardgekookte eieren bij te geven. Ook een paar in dunne sliertjes gesneden augurken (zure of zoetzure), kunnen erbij worden geserveerd.
* Garneer elk bord met peterselie.
{{Tuinkalender|Rode biet|rode bieten}}
{{Wikipedia
|Pagina = Borsjtsj
|Naam = Borsjtsj
}}
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Soeprecept|Borsjtsj]]
[[Categorie:Russische keuken]]
[[Categorie:Groentenrecept|Bietensoep]]
e46gnoztukm2pegoy7u6zhslrju0l1e
Computersystemen/Randapparatuur
0
38509
428232
420255
2026-05-20T07:46:59Z
Mattias.Campe
572
/* Controller en driver */
428232
wikitext
text/x-wiki
{{Index Computersystemen}}
== Doelstellingen ==
Onderstaande doelstellingen komen in meer of mindere mate aan bod. De <span style="color:lightgrey;">grijze</span> doelstellingen komen hier niet aan bod. Dat zijn bv. praktijkoefeningen die aansluiten bij deze theorie, maar die in dit Wikibook niet behandeld worden. Of bv. theorie die in een ander hoofdstuk wordt behandeld.
Uit het leerplan van '''Applicatie- en Databeheer''' <ref>[https://pro.katholiekonderwijs.vlaanderen/iii-apda-da Leerplan Informatica- en communicatiewetenschappen B + S - 3de graad - D-finaliteit]</ref>, een deel van leerplandoel 23:
* LPD 23: De leerlingen lichten de opbouw en werking van een computersysteem met zijn basiscomponenten en optionele componenten toe.
** <span style="color:lightgrey;">Aansluitingen en connectoren</span>
** Functie van controller en driver
* Lexicon. De basiscomponenten van een computersysteem zijn: <span style="color:lightgrey;">moederbord, processor,intern geheugen (werkgeheugen, cache geheugen, systeemgeheugen, CMOS), koeling, voeding,</span> grafische kaart<span style="color:lightgrey;">, klok</span>.
* Lexicon. De optionele componenten van een computersysteem zijn hardwarecomponenten die dienen voor invoer, uitvoer <span style="color:lightgrey;">of opslag</span>
* <span style="color:lightgrey;">Wenk. Enkel de gangbare actuele basiscomponenten en optionele componenten van een computersysteem worden besproken. Je kan ook sensoren als mogelijk invoerapparaat voor een smartphone behandelen.</span>
Uit het leerplan Toegepaste Informatica van de richting '''Informaticabeheer''' <ref>Meer informatie op [https://ond.vvkso-ict.com/vvksomainnieuw/leerplanpubliek.asp?NR=2015/003 leerplan D/2015/7841/003]</ref>:
* 1.3.1 De functie en belangrijke karakteristieken van de gangbare optionele componenten toelichten, bijvoorbeeld beeldscherm, grafische kaart, muis, toetsenbord, printer, scanner ...
* 1.3.4 De functie van een controller en een driver toelichten.
* 1.3.5 Belangrijke eenheden voor technische specificaties van optionele componenten toelichten, bijvoorbeeld <span style="text-decoration:line-through;">bit, byte, rpm,</span> inch, dpi, ppm, ppi, Hz, <span style="text-decoration:line-through;">bps</span>, ANSI lumen ...
* ''1.4.6 Aan de hand van technische specificaties diverse uitvoeringen van optionele componenten vergelijken.''
Het is niet de bedoeling alle mogelijke randapparatuur uit te leggen of álle aspecten van deze randapparatuur. Sommige aspecten zijn gemakkelijk te begrijpen, bij andere zaken volgt verder extra uitleg. Zo zouden de meeste zaken in (web)winkels over beeldschermen, grafische kaarten, muizen, toetsenborden, printers/scanners en beamers begrepen moeten worden.
== Controller en driver ==
Een driver legt de verbinding tussen de controller en het besturingssysteem. Maar wat is 'driver' en wat is 'controller'?
Een '''controller''' is een stuk hardware dat met het effectieve randapparaat een verbinding legt, waardoor de driver deze kan aansturen. Enkele voorbeelden:
* De geheugencontroller is het stuk hardware dat toegang tot het geheugen controleert.
* Een ''network interface controller'' (NIC).
* Een ''disk controller'', vaak geïntegreerd op de harde schijf zelf.
Een '''{{Wp|en:Device driver|driver}}''' ({{Wp|Stuurprogramma|stuurprogramma}}) is een stuk software dat een verbinding legt tussen de hardware/controller en het besturingssysteem. Het stuurprogramma zorgt er hiermee voor dat de programmeur van een applicatie geen weet hoeft te hebben van de hardware waar zijn applicatie op zal gaan draaien. Op een uniforme manier kan de programmeur het besturingssysteem aanspreken. Het besturingssysteem spreekt vervolgens de hardware aan via het stuurprogramma.
Stel bv. dat je als programmeur je eigen tekstverwerker wilt schrijven, dan zal je geen eigen programmacode schrijven om te kunnen afdrukken. Gezien de verschillende types van printers zou dit heel veel werk zijn. Wat je wel doet is de afdruk-{{Wp|Application programming interface|API}} van het besturingssysteem aanroepen. Deze zal de afdruktaak op zijn beurt doorgeven aan de driver die met de printer overeenkomt. Vervolgens zal de printer de taak afdrukken. Dankzij dit systeem kan je tekstverwerker ook afdrukken naar toekomstige printers, zonder dat je zelf code moet veranderen.
Er zijn verschillende situaties bij het eerste gebruik van randapparatuur:
* Alles werkt perfect ''out-of-the-box'': de benodigde driver zit al in het besturingssysteem.
* Het besturingssysteem merkt dat er nieuwe hardware is, installeert alles automatisch en na een eventuele herstart werkt alles perfect.
* Het werkt, maar niet optimaal. Bv. bij een videokaart waar je bij kantoorwerk optimaal kan werken, maar waarbij je bij het spelen van een spel niet het onderste uit de kan kan halen, alhoewel de videokaart dit wel zou moeten kunnen. Door het besturingssysteem de opdracht te geven om te zoeken naar nieuwe drivers kan je dit misschien oplossen of je gaat zelf op de website van de fabrikant van de videokaart kijken of er geen betere driver te vinden is.
* Het werkt helemaal niet. Dan moet je hopen (''plug and pray'') dat je op de website van de fabrikant een driver voor jouw besturingssysteem vindt. Je kan ook op andere websites kijken, maar wees wantrouwig in wat je allemaal installeert.
Uiteraard hoop je op ''plug and play'', maar soms is het ''plug and pray''. Daar de driver verbinding legt tussen het besturingssysteem en de hardware zullen IT-administrators niet altijd happig zijn om een upgrade van een besturingssysteem te doen, zeker als er geen gangbare hardware wordt gebruikt (bv. ziekenhuizen, ruimteorganisaties,...). De kans bestaat nl. dat de makers van een besturingssysteem hun drivermodel aanpassen, waardoor deze nieuwe manier niet meer overweg kan met de oude drivers. Het gevolg is dat er geen communicatie met de randapparatuur mogelijk is of dat bepaalde functionaliteit niet meer werkt.
<gallery>
Disassembled SyQuest SQ3270S Disk Drive 270MB.jpg|HDD met controller
File:Driverarch.png|Driver architectuur
Hardware driver(ubuntu).png|Ubuntu driver
</gallery>
== Beeldscherm ==
Een {{Wp|Beeldscherm|beeldscherm}} of monitor is een apparaat dat bewegende beelden kan tonen. Het wordt ook gebruikt voor statische beelden die af en toe veranderd worden.
=== De techniek ===
[[Bestand:Pixel_geometry_01_Pengo.jpg|miniatuur|Closeup van pixels]]
Om een beeld op een beeldscherm te kunnen opbouwen worden heel kleine puntjes (de {{Wp|en:Pixel|pixels}}) gemaakt. Als deze voldoende klein zijn en/of worden bekeken vanop een voldoende grote afstand, dan zie je niet de afzonderlijke pixels, maar een beeld. Om kleur te krijgen worden drie subpixels gebruikt die een combinatie kunnen maken van de basiskleuren rood, groen en blauw, kortweg {{Wp|RGB-kleursysteem|RGB}}. Deze RGB-{{Wp|Kleurcodering|kleurcodering}} wordt ook gebruikt op websites om bv. tekst of vlakken een kleur te geven.
Als je leest over de techniek om op ''platte schermen'' iets te kunnen tonen, dan kan oa. je onderstaande tegenkomen:
* {{Wp|Liquid crystal display|LCD}} met een backlight (bv. {{Wp|CCFL|CCFL}} of {{Wp|Tv met led-backlight|LED}} als lichtbron).
* {{Wp|Amoled|Amoled}} heeft een kleiner energieverbruik, maar is helaas ook duurder in vergelijking met LCD. Je zal deze dan ook eerder vinden bij de kleinere schermen (bv. mobiele telefoons, mediaspelers en digitale camera's).
* De {{Wp|Digitale inkt|digitale inkt}} ({{Wp|en:E Ink|E Ink}}) is interessant bij het lezen van e-books, omdat het energieverbruik heel laag is en het nog goed kan gelezen worden bij zonlicht. Of bij ELS ({{Wp|Elektronisch schaplabel|Elektronisch schaplabel}} of {{Wp|en:electronic shelf label|electronic shelf label}}) zodat je prijzen gemakkelijk kan aanpassen zonder dat er veel energieverbruik is. Zo is {{Wp|en:SES-imagotag|SES-imagotag}} een bekende fabrikant.
* Er bestaan nog meer technieken, zoals {{Wp|Plasmascherm|plasma}}, {{Wp|en:Twisted nematic field effect|TN}}- of {{Wp|en:IPS panel|IPS}}-paneel. <ref>Zie bv. de video [https://www.youtube.com/watch?v=r8Y26Uq07Kw#t=335.871724 IPS vs TN Panel - What's the freaking difference? Comparison and Explanation]</ref>. Maar het zou ons te ver leiden om ze allemaal te bespreken.
<gallery>
File:Lcd-engineerguy.ogv|Werking LCD
Image:LCD layers.svg|Opbouw LCD
File:AMOLED.png|Opbouw Amoled
Electronic paper (Side view of Electrophoretic display) in svg.svg|Opbouw digitale inkt
</gallery>
=== Grootte, resolutie, aspect ratio, pixeldichtheid en schaling ===
Volgende kenmerken staan in relatie tot elkaar en zijn belangrijk om te bekijken:
* De grootte van het scherm ({{Wp|en:Display size|display size}}) wordt diagonaal gemeten en uitgedrukt in inch. Een inch is 2,54 centimeter en als je het nameet blijkt het al eens af te wijken van de officiële specificatie (bv. omdat de fabrikant hetgene onder de plastiek rand zit, ook meet). Bij tv's staat het vaak ook in centimeter, omdat de klant zich daar meer bij kan voorstellen dan inch.
* Een {{Wp|Resolutie_(digitale_beeldverwerking)|resolutie}} wordt uitgedrukt als <code>breedte×hoogte</code>. Zo betekent 1920x1080 dat er 1920 pixels in de breedte en 1080 pixels in de hoogte zijn. Er is dus een totaal van 2.073.600 pixels. Een LCD-scherm is gemaakt voor een optimale resolutie, maar via de instellingen van het besturingssysteem kan je dit wijzigen. Vaak merk je echter dat het geen optimale resolutie is. In theorie kan om het even welke resolutie, maar in de praktijk zijn er enkele {{Wp|en:List of common resolutions|gangbare resoluties}}, waarvan sommige een ''marketingbenaming'' krijgen:
** 2K verwijst naar ongeveer 2000 pixels in de breedte. Bv. 1920×1080 (Full HD of FHD) of 2048×1080 (DCI 2K).
** 4K verwijst naar ongeveer 4000 pixels in de breedte. Bv. 3840×2160 (4K UHD) of 4096×2160 (DCI 4K).
** 8K verwijst naar ongeveer 8000 pixels in de breedte. Bv. 7680×4320 (8K UHD).
* De {{Wp|Beeldverhouding|beeldverhouding}} ({{Wp|en:Display_aspect_ratio|aspect ratio}}) is de verhouding tussen de breedte en de hoogte van het beeld. Als je vierkante pixels hebt, dan betekent een resolutie van 1920x1080 een aspect ratio van 16:9. De breuk 1920/1080 kan je nl. vereenvoudigen naar 16/9 door teller en noemer te delen door 120. Merk op dat een resolutie van 1920x1200 met een aspect ratio van 16:10 wordt aangegeven i.p.v. 8:5. Zo herkennen mensen een aspect ratio van 16:9 of 16:10 snel als ongeveer hetzelfde widescreen.
* De {{Wp|Pixeldichtheid|pixeldichtheid}} ({{Wp|en:Pixel density|pixel density}}) is het aantal pixels per inch (ppi). Hoe hoger, hoe beter de beeldkwaliteit.
* De schaling bepaalt hoe groot tekst, apps en andere items zijn. Bij een groot scherm en hoge resolutie kan dit op 100% staan, bij een klein(er) scherm en dezelfde resolutie kan het interessant zijn om dit op 125% te zetten.
<gallery>
Resolution_illustration.png|Effect van resolutie
LCD_screen_sizes.svg|grootte en beeldverhouding
Display resolution and pixel density.png|resolutie en pixeldichtheid
Windows 10 Scale and Layout Settings.jpg|Schaling in Windows
GTK_3.10_resolution_independence_comparison.png|Niet geschaald vs geschaald
Resolution and aspect ratio.gif|Animatie resolutie en aspect ratio
</gallery>
Om de relatie van resolutie, aspect ratio, pixeldichtheid en schaling te begrijpen, kan je bovenstaande animatie bekijken. Hierin wordt een zwarte lijn onder een hoek van 45° getekend en een vierkant icoontje van 3 op 3.
# Bij een resolutie van 32x20 is de aspect ratio dus 16:10. De lijn is onder een hoek van 45°, het icoontje is een vierkant. Door de lage resolutie zijn de details van het beeld niet goed.
# De resolutie bij de tweede stap wordt verhoogd naar 32x24, dus een aspect ratio van 4:3. De aspect ratio respecteert niet de fysische verhoudingen van het scherm: de lijn is nog steeds schuin, maar niet meer onder een hoek van 45°. Het icoontje blijft een icoon van 3 op 3, maar het is geen vierkant meer.
# De volgende stap is een resolutie van 32x32 en dus een aspect ratio van 1:1. De lijn gaat van de ene naar de andere hoek, maar niet onder een hoek van 45°. Het icoontje is nu nog platter gedrukt.
# Bij de volgende stap wordt de resolutie verhoogd tot 64x40 en hebben we terug de correcte aspect ratio van 16:10. De lijn is terug onder een hoek van 45° en het icoontje is terug een vierkant. Er is meer detail t.o.v. de eerste stap, want als de fysische grootte van het scherm hetzelfde blijft en je verhoogt de resolutie, dan moet bijgevolg de pixeldichtheid vergroten. Toch blijft het hoekige van de lijn zichtbaar (wat kan verbeterd worden door {{Wp|Anti-aliasing|anti-aliasing}}). Het icoontje blijft een vierkant icoon van 3x3, maar is nu wel kleiner.<br>Je voelt aan dat als de resolutie blijft toenemen op eenzelfde schermgrootte, dat tekst en icoontjes zó klein kunnen worden, dat ze te weinig nog de afzonderlijke details kunnen tonen. In dat geval kan het nodig zijn om de schaal aan te passen, bv. naar 125%.
# Bij de laatste stap is de pixeldichtheid hetzelfde als de vorige stap, maar omdat de fysische grootte van het scherm kleiner is, moet de resolutie ook kleiner zijn, nl. 32x20 (zoals bij de eerste stap). Er passen dus evenveel pixels hier of bij de eerste stap, maar de pixels hier zijn wel kleiner. De aspect ratio is 16:10 en respecteert de fysische verhoudingen van het scherm.
Voor het scherm van je gsm zal je geen al te groot scherm willen (want minder mobiel), maar toch een hoge resolutie en pixeldichtheid. Je kijkt nl. op je gsm vanaf een kleine afstand, waarbij je voldoende detail wil zien, zonder de individuele pixels te zien. Voor een tv is de grootte belangrijk en ook de resolutie speelt een rol. De pixeldichtheid mag iets lager zijn, omdat je op een veel grotere afstand van de tv zit t.o.v. je gsm . Zelf al zijn de individuele pixels groter (lage ppi, grote grootte), je zal ze niet afzonderlijk zien door de grote afstand.
=== Refresh rate ===
De {{Wp|Refresh rate|refresh rate}} is het aantal keer per seconde dat weergevende hardware al zijn pixels kan verversen en wordt uitgedrukt in hertz (Hz).
=== Reactietijd ===
De reactietijd ({{Wp|en:Response time (technology)|response time}}) is de tijd die nodig is voor een pixel om te veranderen, gemeten in ms. In principe geldt: hoe lager, hoe beter. Vaak wordt grey-to-grey gemeten, maar er bestaat hiervoor geen standaard.
=== Contrast ===
Van de eigenschap contrast ({{Wp|en:Contrast ratio|contrast ratio}}) bestaat niet echt een officiële manier om het vast te leggen, maar het heeft te maken met hoeveel (grijs)waarden tussen wit en zwart kunnen worden weergegeven. Hoe hoger het getal, hoe beter.
=== Helderheid ===
De {{Wp|Helderheid (beeld)|helderheid}} (brightness) is het aantal {{Wp|Candela (eenheid)|candela}} per vierkante meter (cd/m³), waarbij candela de lichtsterkte weergeeft. Hoe meer cd/m², hoe krachtiger de lichtbron. Hoe hoger het getal, hoe beter.
=== Kijkhoek ===
De kijkhoek ({{Wp|en:Viewing angle|viewing angle}}) is de maximale hoek van waaruit een beeldscherm bekeken kan worden zonder dat dat (veel) verlies van contrast en kleur oplevert. Horizontaal of verticaal kan er sprake zijn van verschillende kijkhoeken.
Voor een tv zal je een zo groot mogelijke kijkhoek willen, maar voor een laptop op de trein zal je deze niet al te groot willen, zodanig dat je relatief privé kan werken. Bij de schermen van een bankautomaat zal men zéker een kleine kijkhoek wensen.
=== Samengevat ===
Bij het kiezen van een LCD-scherm blijken dus heel wat specificaties belangrijk te zijn. Sta ook stil bij het volgende:
* Hecht niet teveel belang aan niet gestandaardiseerde specificaties (bv. contrast, helderheid, kijkhoek), zeker als je vergelijkt tussen verschillende fabrikanten!
* Bekijk waar mogelijk het scherm in het echt, bij voorkeur onder verschillende omstandigheden (zonlicht, verlichting, kijkhoek,…).
* De aansluitingen (DVI, VGA,...) zijn ook belangrijk.
* Al of niet ''touch''? Overweeg wel of de extra kost voor jouw situatie de moeite waard is.
* De mogelijke instellingen van het scherm kunnen ook belangrijk zijn. Bij sommige kan je je tv instellen voor dynamische, levendige, natuurlijke,… weergave.
* Een gekalibreerd beeldscherm zal bij fotobewerking belangrijk zijn: het beeld op het scherm moet zo goed mogelijk lijken op het beeld dat van de drukpers rolt.
* Het bronmateriaal doet er ook veel toe: als je het “allerbeste” scherm hebt gekocht en je speelt er een YouTube-filmpje op af van lage kwaliteit, dan zal je scherm dat niet plots supergoed weergeven. De extra kost van een 8K-scherm kan zo (voorlopig) de investering niet waard zijn.
== Grafische kaart ==
Alhoewel de term '{{Wp|Videokaart|grafische kaart}}' en '{{Wp|Graphics processing unit|GPU}}' vaak door elkaar worden gebruikt, zijn het toch geen synoniemen. De ''graphics processing unit'' wordt namelijk óp de grafische kaart geplaatst. Zo kunnen twee verschillende grafische kaarten, toch dezelfde GPU gebruiken. Bepaalde specificaties van de GPU ken je al vanuit de hoofdstukken [[Computersystemen/Moederbord|moederbord]], [[Computersystemen/Processor|CPU]] en [[Computersystemen/Geheugen|geheugen]]: klokfrequentie, aantal cores, geheugen, geheugentype, busbreedte,...
<gallery>
File:Nvidia7600GS_TOP.jpg|Grafische kaart
File:6600GT_GPU.jpg|GPU
File:3-way-SLI.jpg|3-way SLI
</gallery>
Net als bij de CPU heeft ook de GPU een soort van 'instructieset'. De bekendste zijn wellicht {{Wp|Microsoft DirectX|DirectX}} of {{Wp|OpenGL|OpenGL}}, omdat dit vaak gebruikt wordt bij het ontwikkelen van spellen. Het gaat verder dan dat, met bv. {{Wp|en:Mantle (API)|AMD Mantle}}, {{Wp|en:FreeSync|AMD FreeSync}}, {{Wp|CUDA|NVIDIA CUDA}}, {{Wp|PhysX|NVIDIA PhysX}}.
De grafische kaart is uiteraard het bekendst voor zijn grafische toepassingen, maar omdat deze ook heel goed is in parallelle berekeningen (vandaar het hoge aantal cores), wordt deze soms ook gebruikt voor niet-grafische zaken, bv. wetenschappelijke berekeningen of {{Wp|Bitcoin#Mining_en_controle|bitcoin mining}}.
== Muis ==
De {{Wp|Muis (computer)|muis}} is een handig hulpmiddel om de positie van een cursor op het beeldscherm veranderen. Dankzij knoppen en een wieltje kan je nog extra handelingen uitvoeren. De meeste specificaties van de muis zullen bekend zijn. Voor het gros van de personen zal een eenvoudige muis voldoen, maar gamers of grafici zullen in het duurdere segment kijken. Voor hen kan nauwkeurigheid (dpi), de polling rate (Hz), de resolutie, de beeldsensor (megapixels) en het aantal knoppen belangrijk zijn.
Er bestaan varianten op de klassieke muis zoals {{Wp|Trackball|trackball}}, {{Wp|Voetmuis|voetmuis}}, {{Wp|Touchpad|touchpad}} of {{Wp|Joystick|joystick}}.
<gallery>
File:5 Tastenmaus Microsoft IntelliMouse Optical Black.jpg|optische vijfknopsmuis
File:Touchpad-Wiki.JPG|touchpad
File:Logitech-trackball.jpg|trackball
File:Joyopis.svg|joystick
</gallery>
== Toetsenbord ==
Bij het {{Wp|Toetsenbord (computer)|toetsenbord}} geldt ongeveer hetzelfde zoals bij de muizen: vooral gamers en grafici zullen hogere eisen stellen. Een belangrijk verschil is wel dat een toetsenbord een eigen indeling kent, zoals {{Wp|AZERTY|AZERTY}} (bv. in België) of {{Wp|QWERTY|QWERTY}} (bv. in Nederland). De AZERTY-indeling wordt wereldwijd amper gebruikt.
<gallery>
File:Pc105 wide delete tall enter xfree86 belgium keyboard full size.png|AZERTY lay-out
File:Pc104 wide delete short enter xfree86 us keyboard full size.png|QWERTY lay-out
File:LenovoKeyboard.jpg|QWERTY-toetsenbord
File:Apple Adjustable Keyboard.jpg|Ergonomisch toetsenbord
</gallery>
== Printer ==
Een {{Wp|Printer|printer}} is een apparaat dat de uitvoer van een computer, scanner of digitale camera afdrukt. De meest bekende soorten:
* De {{Wp|Inkjetprinter|inkjetprinter}} gebruikt vloeibare inkt, die op het papier 'gesproeid' wordt. Het voordeel van de inkjettechnologie is dat de printers goedkoop gemaakt kunnen worden en fraaie resultaten kunnen laten zien. Vele leveranciers verkopen de printer goedkoop en verdienen aan de dure inktpatronen.
* De {{Wp|Laserprinter|laserprinter}} drukt tekst en afbeeldingen af door toner (zwart of gekleurd poeder) aan het papier te hechten. De meeste toners hebben een hogere printcapaciteit dan inktcartridges. De aanschafprijs lijkt dan hoog - zeker als je voor een kleurenlaserprinter ineens 4 toners moet kopen - maar de prijs per pagina is meestal lager.
* De {{Wp|3D-printer|3D-printer}} kan driedimensionale objecten produceren, meestal a.d.h.v. plastic omdat dit goedkoop is en makkelijk in gebruik. In wat volgt worden vooral de kenmerken van de "gewone" printer besproken.
De resolutie van een {{Wp|Printer|printer}} wordt uitgedrukt in {{Wp|Dots per inch|dots per inch}}, bv. 1200 dpi. Dit lijkt dus goed op de ''pixels per inch'' van een beeldscherm, maar een printer kan door het iets verschuiven van de printkop de ruimte tussen twee dots opvullen. Vandaar hoeft de ppi- en de dpi-waarde niet gelijk te zijn. Als er een verschil is tussen de horizontale en verticale resolutie, zullen er twee waarden worden opgegeven. De snelheid van een printer wordt uitgedrukt in pagina's per minuut (ppm), met vaak een aparte waarde voor zwart-wit versus kleur.
Dé beste printer bestaat niet: bekijk altijd de noden bij het vergelijken. Vergeet zeker niet de prijs van de ''{{Wp|en:Consumables|consumables}}'', nl. de drum of de inktpatronen. Zo kan goedkoop alsnog duurkoop worden. In bedrijven en scholen zal men zo vaak een zwart-wit laserprinter terugvinden, omdat de prijs hiervan per blad het meest voordelige is. Als officieel papier nodig is (bv. met het logo), dan is dit vaak in kleur voorgedrukt en komt de zwart-wit afdruk daar bovenop.
Waar er bij een scherm sprake is van {{Wp|RGB-kleursysteem|RGB}}, wordt bij drukwerk vooral de {{Wp|CMYK|CMYK}}-{{Wp|kleurcodering|kleurcodering}} gebruikt. De basiskleuren zijn ''cyaan'' (blauw), ''magenta'' (roze/paars), ''yellow'' (geel) en ''key'' (zwart). Dit betekent ook dat er bij grafische beeldbewerking soms een vertaling moet gebeuren van de RGB-kleuren, naar een CMYK-spectrum.
<gallery>
Epson-inkjet-printer.jpg|Inkjetprinter
Ink-jet-cartridge.jpg|Inkjetcartridge
Laser_toner_cartridge.svg|Onderdelen laserprinter
Copier-engineerguy.ogv|Werking laserprinter
Color_Laser_Printer_Magnified.jpg|Zoom laserafdruk
Cmyk-rgb.jpg|RGB vs CMYK
MakerBot_ThingOMatic_Bre_Pettis.jpg|3D-printer
Hyperboloid Print.ogv|Werking 3D-printer
</gallery>
== Scanner ==
Een scanner is een invoerapparaat waarmee een object in de echte wereld systematisch afgetast wordt om omgezet te worden in data. Door deze ruime definitie kan je heel wat mogelijkheden bedenken, zoals een flatbedscanner (om gemakkelijk een papier in te scannen), een 3D-scanner (om een 3D-weergave van een object te verkrijgen), een QR- of {{Wp|Barcodescanner|barcodescanner}}, een {{Wp|Lidar|Lidar}} (zodat bv. een auto weet wat er rond zich bevindt), een {{Wp|Magnetic resonance imaging|MRI-scanner }} (om een beeld te krijgen van het inwendige van het lichaam),...
Bij randapparatuur zal de {{Wp|Scanner (grafisch)|grafische scanner}} het meest bekend zijn. Vaak is deze voor consumenten in één multifunctioneel toestel geïntegreerd (met print, scan- en kopieerfuncties). De meeste scanspecificaties zullen duidelijk zijn, eventueel met uitzondering van de kleurdiepte, uitgedrukt in aantal bits. Dit is de bitruimte die wordt gebruikt voor het weergeven van een kleur. Met een bitruimte van 3 bits, zou je slechts 8 (=2³) kleuren kunnen coderen. Naast de kleurdiepte is uiteraard ook de resolutie belangrijk!
<gallery>
Scanner.view.750pix.jpg|Flatbed scanner
Multifunction-Printer.jpg|Multifunctioneel
BASA portable scanner 01.jpg|Draagbare scanner
3D Printshow 2014 London - ZMorph - 3D scanner (14964233160).jpg|3D scanner
</gallery>
== Beamer ==
Een {{Wp|Videoprojector|beamer}} of videoprojector is een projector voor video- of computerbeelden. Een belangrijk kenmerk is {{Wp|Lichtstroom|lichtstroom}} (uitgedrukt in {{Wp|Lumen (eenheid)|lumen}}), omdat het een maat is voor de totale hoeveelheid zichtbaar licht die een lichtbron in alle richtingen uitstraalt. Bij een beamer heeft men het over ANSI-lumen: hoe hoger deze waarde, hoe beter.
Er bestaan verschillende projectietechnieken, zoals LCD, DLP, LED en laser. Bij de uitvoeringen heb je ook short-throw of ultra-short throw. Daarbij wordt de beamer dicht bij het projectiescherm gehangen, zodat je minder kans hebt om het projectiebeeld te hinderen.
Een belangrijke instelling van de beamer is de {{Wp|en:Keystone_effect#Correction|keystone correctie}} (letterlijk ''{{Wp|Sluitsteen|sluitsteen}} correctie''), wat nodig is wanneer de beamer niet recht tegenover het projectievlak staat.
<gallery>
Sample-SP.JPG|LCD
L-Karniesbogen_(keystone).png|Een 'echte' keystone
Keystone.jpg|Keystone
Projector_Screen_Geometry_Throw_Ratio.png|Afstanden
</gallery>
{{Appendix}}
{{Sub}}
8uue7bjfz3r60aiyt679p6akuryl7ii
428233
428232
2026-05-20T08:07:54Z
Mattias.Campe
572
/* Grootte, resolutie, aspect ratio, pixeldichtheid en schaling */
428233
wikitext
text/x-wiki
{{Index Computersystemen}}
== Doelstellingen ==
Onderstaande doelstellingen komen in meer of mindere mate aan bod. De <span style="color:lightgrey;">grijze</span> doelstellingen komen hier niet aan bod. Dat zijn bv. praktijkoefeningen die aansluiten bij deze theorie, maar die in dit Wikibook niet behandeld worden. Of bv. theorie die in een ander hoofdstuk wordt behandeld.
Uit het leerplan van '''Applicatie- en Databeheer''' <ref>[https://pro.katholiekonderwijs.vlaanderen/iii-apda-da Leerplan Informatica- en communicatiewetenschappen B + S - 3de graad - D-finaliteit]</ref>, een deel van leerplandoel 23:
* LPD 23: De leerlingen lichten de opbouw en werking van een computersysteem met zijn basiscomponenten en optionele componenten toe.
** <span style="color:lightgrey;">Aansluitingen en connectoren</span>
** Functie van controller en driver
* Lexicon. De basiscomponenten van een computersysteem zijn: <span style="color:lightgrey;">moederbord, processor,intern geheugen (werkgeheugen, cache geheugen, systeemgeheugen, CMOS), koeling, voeding,</span> grafische kaart<span style="color:lightgrey;">, klok</span>.
* Lexicon. De optionele componenten van een computersysteem zijn hardwarecomponenten die dienen voor invoer, uitvoer <span style="color:lightgrey;">of opslag</span>
* <span style="color:lightgrey;">Wenk. Enkel de gangbare actuele basiscomponenten en optionele componenten van een computersysteem worden besproken. Je kan ook sensoren als mogelijk invoerapparaat voor een smartphone behandelen.</span>
Uit het leerplan Toegepaste Informatica van de richting '''Informaticabeheer''' <ref>Meer informatie op [https://ond.vvkso-ict.com/vvksomainnieuw/leerplanpubliek.asp?NR=2015/003 leerplan D/2015/7841/003]</ref>:
* 1.3.1 De functie en belangrijke karakteristieken van de gangbare optionele componenten toelichten, bijvoorbeeld beeldscherm, grafische kaart, muis, toetsenbord, printer, scanner ...
* 1.3.4 De functie van een controller en een driver toelichten.
* 1.3.5 Belangrijke eenheden voor technische specificaties van optionele componenten toelichten, bijvoorbeeld <span style="text-decoration:line-through;">bit, byte, rpm,</span> inch, dpi, ppm, ppi, Hz, <span style="text-decoration:line-through;">bps</span>, ANSI lumen ...
* ''1.4.6 Aan de hand van technische specificaties diverse uitvoeringen van optionele componenten vergelijken.''
Het is niet de bedoeling alle mogelijke randapparatuur uit te leggen of álle aspecten van deze randapparatuur. Sommige aspecten zijn gemakkelijk te begrijpen, bij andere zaken volgt verder extra uitleg. Zo zouden de meeste zaken in (web)winkels over beeldschermen, grafische kaarten, muizen, toetsenborden, printers/scanners en beamers begrepen moeten worden.
== Controller en driver ==
Een driver legt de verbinding tussen de controller en het besturingssysteem. Maar wat is 'driver' en wat is 'controller'?
Een '''controller''' is een stuk hardware dat met het effectieve randapparaat een verbinding legt, waardoor de driver deze kan aansturen. Enkele voorbeelden:
* De geheugencontroller is het stuk hardware dat toegang tot het geheugen controleert.
* Een ''network interface controller'' (NIC).
* Een ''disk controller'', vaak geïntegreerd op de harde schijf zelf.
Een '''{{Wp|en:Device driver|driver}}''' ({{Wp|Stuurprogramma|stuurprogramma}}) is een stuk software dat een verbinding legt tussen de hardware/controller en het besturingssysteem. Het stuurprogramma zorgt er hiermee voor dat de programmeur van een applicatie geen weet hoeft te hebben van de hardware waar zijn applicatie op zal gaan draaien. Op een uniforme manier kan de programmeur het besturingssysteem aanspreken. Het besturingssysteem spreekt vervolgens de hardware aan via het stuurprogramma.
Stel bv. dat je als programmeur je eigen tekstverwerker wilt schrijven, dan zal je geen eigen programmacode schrijven om te kunnen afdrukken. Gezien de verschillende types van printers zou dit heel veel werk zijn. Wat je wel doet is de afdruk-{{Wp|Application programming interface|API}} van het besturingssysteem aanroepen. Deze zal de afdruktaak op zijn beurt doorgeven aan de driver die met de printer overeenkomt. Vervolgens zal de printer de taak afdrukken. Dankzij dit systeem kan je tekstverwerker ook afdrukken naar toekomstige printers, zonder dat je zelf code moet veranderen.
Er zijn verschillende situaties bij het eerste gebruik van randapparatuur:
* Alles werkt perfect ''out-of-the-box'': de benodigde driver zit al in het besturingssysteem.
* Het besturingssysteem merkt dat er nieuwe hardware is, installeert alles automatisch en na een eventuele herstart werkt alles perfect.
* Het werkt, maar niet optimaal. Bv. bij een videokaart waar je bij kantoorwerk optimaal kan werken, maar waarbij je bij het spelen van een spel niet het onderste uit de kan kan halen, alhoewel de videokaart dit wel zou moeten kunnen. Door het besturingssysteem de opdracht te geven om te zoeken naar nieuwe drivers kan je dit misschien oplossen of je gaat zelf op de website van de fabrikant van de videokaart kijken of er geen betere driver te vinden is.
* Het werkt helemaal niet. Dan moet je hopen (''plug and pray'') dat je op de website van de fabrikant een driver voor jouw besturingssysteem vindt. Je kan ook op andere websites kijken, maar wees wantrouwig in wat je allemaal installeert.
Uiteraard hoop je op ''plug and play'', maar soms is het ''plug and pray''. Daar de driver verbinding legt tussen het besturingssysteem en de hardware zullen IT-administrators niet altijd happig zijn om een upgrade van een besturingssysteem te doen, zeker als er geen gangbare hardware wordt gebruikt (bv. ziekenhuizen, ruimteorganisaties,...). De kans bestaat nl. dat de makers van een besturingssysteem hun drivermodel aanpassen, waardoor deze nieuwe manier niet meer overweg kan met de oude drivers. Het gevolg is dat er geen communicatie met de randapparatuur mogelijk is of dat bepaalde functionaliteit niet meer werkt.
<gallery>
Disassembled SyQuest SQ3270S Disk Drive 270MB.jpg|HDD met controller
File:Driverarch.png|Driver architectuur
Hardware driver(ubuntu).png|Ubuntu driver
</gallery>
== Beeldscherm ==
Een {{Wp|Beeldscherm|beeldscherm}} of monitor is een apparaat dat bewegende beelden kan tonen. Het wordt ook gebruikt voor statische beelden die af en toe veranderd worden.
=== De techniek ===
[[Bestand:Pixel_geometry_01_Pengo.jpg|miniatuur|Closeup van pixels]]
Om een beeld op een beeldscherm te kunnen opbouwen worden heel kleine puntjes (de {{Wp|en:Pixel|pixels}}) gemaakt. Als deze voldoende klein zijn en/of worden bekeken vanop een voldoende grote afstand, dan zie je niet de afzonderlijke pixels, maar een beeld. Om kleur te krijgen worden drie subpixels gebruikt die een combinatie kunnen maken van de basiskleuren rood, groen en blauw, kortweg {{Wp|RGB-kleursysteem|RGB}}. Deze RGB-{{Wp|Kleurcodering|kleurcodering}} wordt ook gebruikt op websites om bv. tekst of vlakken een kleur te geven.
Als je leest over de techniek om op ''platte schermen'' iets te kunnen tonen, dan kan oa. je onderstaande tegenkomen:
* {{Wp|Liquid crystal display|LCD}} met een backlight (bv. {{Wp|CCFL|CCFL}} of {{Wp|Tv met led-backlight|LED}} als lichtbron).
* {{Wp|Amoled|Amoled}} heeft een kleiner energieverbruik, maar is helaas ook duurder in vergelijking met LCD. Je zal deze dan ook eerder vinden bij de kleinere schermen (bv. mobiele telefoons, mediaspelers en digitale camera's).
* De {{Wp|Digitale inkt|digitale inkt}} ({{Wp|en:E Ink|E Ink}}) is interessant bij het lezen van e-books, omdat het energieverbruik heel laag is en het nog goed kan gelezen worden bij zonlicht. Of bij ELS ({{Wp|Elektronisch schaplabel|Elektronisch schaplabel}} of {{Wp|en:electronic shelf label|electronic shelf label}}) zodat je prijzen gemakkelijk kan aanpassen zonder dat er veel energieverbruik is. Zo is {{Wp|en:SES-imagotag|SES-imagotag}} een bekende fabrikant.
* Er bestaan nog meer technieken, zoals {{Wp|Plasmascherm|plasma}}, {{Wp|en:Twisted nematic field effect|TN}}- of {{Wp|en:IPS panel|IPS}}-paneel. <ref>Zie bv. de video [https://www.youtube.com/watch?v=r8Y26Uq07Kw#t=335.871724 IPS vs TN Panel - What's the freaking difference? Comparison and Explanation]</ref>. Maar het zou ons te ver leiden om ze allemaal te bespreken.
<gallery>
File:Lcd-engineerguy.ogv|Werking LCD
Image:LCD layers.svg|Opbouw LCD
File:AMOLED.png|Opbouw Amoled
Electronic paper (Side view of Electrophoretic display) in svg.svg|Opbouw digitale inkt
</gallery>
=== Grootte, resolutie, aspect ratio, pixeldichtheid en schaling ===
Volgende kenmerken staan in relatie tot elkaar en zijn belangrijk om te bekijken:
* De grootte van het scherm ({{Wp|en:Display size|display size}}) wordt diagonaal gemeten en uitgedrukt in inch. Een inch is 2,54 centimeter en als je het nameet blijkt het al eens af te wijken van de officiële specificatie (bv. omdat de fabrikant hetgene onder de plastiek rand zit, ook meet). Bij tv's staat het vaak ook in centimeter, omdat de klant zich daar meer bij kan voorstellen dan inch.
* Een {{Wp|Resolutie_(digitale_beeldverwerking)|resolutie}} wordt uitgedrukt als <code>breedte×hoogte</code>. Zo betekent 1920x1080 dat er 1920 pixels in de breedte en 1080 pixels in de hoogte zijn. Er is dus een totaal van 2.073.600 pixels. Een LCD-scherm is gemaakt voor een optimale resolutie, maar via de instellingen van het besturingssysteem kan je dit wijzigen. Vaak merk je echter dat het geen optimale resolutie is. In theorie kan om het even welke resolutie, maar in de praktijk zijn er enkele {{Wp|en:List of common resolutions|gangbare resoluties}}, waarvan sommige een ''marketingbenaming'' krijgen:
** 2K verwijst naar ongeveer 2000 pixels in de breedte. Bv. 1920×1080 (Full HD of FHD) of 2048×1080 (DCI 2K).
** 4K verwijst naar ongeveer 4000 pixels in de breedte. Bv. 3840×2160 (4K UHD) of 4096×2160 (DCI 4K).
** 8K verwijst naar ongeveer 8000 pixels in de breedte. Bv. 7680×4320 (8K UHD).
* De {{Wp|Beeldverhouding|beeldverhouding}} ({{Wp|en:Display_aspect_ratio|aspect ratio}}) is de verhouding tussen de breedte en de hoogte van het beeld. Als je vierkante pixels hebt, dan betekent een resolutie van 1920x1080 een aspect ratio van 16:9. De breuk 1920/1080 kan je nl. vereenvoudigen naar 16/9 door teller en noemer te delen door 120. Merk op dat een resolutie van 1920x1200 met een aspect ratio van 16:10 wordt aangegeven i.p.v. 8:5. Zo herkennen mensen een aspect ratio van 16:9 of 16:10 snel als ongeveer hetzelfde widescreen.
* De {{Wp|Pixeldichtheid|pixeldichtheid}} ({{Wp|en:Pixel density|pixel density}}) is het aantal pixels per inch (ppi). Hoe hoger, hoe beter de beeldkwaliteit.
* De schaling bepaalt hoe groot tekst, apps en andere items zijn. Bij een groot scherm en hoge resolutie kan dit op 100% staan, bij een klein(er) scherm en dezelfde resolutie kan het interessant zijn om dit op 125% te zetten.
<gallery>
Resolution_illustration.png|Effect van resolutie
LCD_screen_sizes.svg|grootte en beeldverhouding
Display resolution and pixel density.png|resolutie en pixeldichtheid
Windows 10 Scale and Layout Settings.jpg|Schaling in Windows
GTK_3.10_resolution_independence_comparison.png|Niet geschaald vs geschaald
Resolution and aspect ratio.gif|Animatie resolutie en aspect ratio
Calibration-test-white.png|Kalibratietest wit
Calibration-test-black.png|Kalibratietest zwart
</gallery>
Om de relatie van resolutie, aspect ratio, pixeldichtheid en schaling te begrijpen, kan je bovenstaande animatie bekijken. Hierin wordt een zwarte lijn onder een hoek van 45° getekend en een vierkant icoontje van 3 op 3.
# Bij een resolutie van 32x20 is de aspect ratio dus 16:10. De lijn is onder een hoek van 45°, het icoontje is een vierkant. Door de lage resolutie zijn de details van het beeld niet goed.
# De resolutie bij de tweede stap wordt verhoogd naar 32x24, dus een aspect ratio van 4:3. De aspect ratio respecteert niet de fysische verhoudingen van het scherm: de lijn is nog steeds schuin, maar niet meer onder een hoek van 45°. Het icoontje blijft een icoon van 3 op 3, maar het is geen vierkant meer.
# De volgende stap is een resolutie van 32x32 en dus een aspect ratio van 1:1. De lijn gaat van de ene naar de andere hoek, maar niet onder een hoek van 45°. Het icoontje is nu nog platter gedrukt.
# Bij de volgende stap wordt de resolutie verhoogd tot 64x40 en hebben we terug de correcte aspect ratio van 16:10. De lijn is terug onder een hoek van 45° en het icoontje is terug een vierkant. Er is meer detail t.o.v. de eerste stap, want als de fysische grootte van het scherm hetzelfde blijft en je verhoogt de resolutie, dan moet bijgevolg de pixeldichtheid vergroten. Toch blijft het hoekige van de lijn zichtbaar (wat kan verbeterd worden door {{Wp|Anti-aliasing|anti-aliasing}}). Het icoontje blijft een vierkant icoon van 3x3, maar is nu wel kleiner.<br>Je voelt aan dat als de resolutie blijft toenemen op eenzelfde schermgrootte, dat tekst en icoontjes zó klein kunnen worden, dat ze te weinig nog de afzonderlijke details kunnen tonen. In dat geval kan het nodig zijn om de schaal aan te passen, bv. naar 125%.
# Bij de laatste stap is de pixeldichtheid hetzelfde als de vorige stap, maar omdat de fysische grootte van het scherm kleiner is, moet de resolutie ook kleiner zijn, nl. 32x20 (zoals bij de eerste stap). Er passen dus evenveel pixels hier of bij de eerste stap, maar de pixels hier zijn wel kleiner. De aspect ratio is 16:10 en respecteert de fysische verhoudingen van het scherm.
Voor het scherm van je gsm zal je geen al te groot scherm willen (want minder mobiel), maar toch een hoge resolutie en pixeldichtheid. Je kijkt nl. op je gsm vanaf een kleine afstand, waarbij je voldoende detail wil zien, zonder de individuele pixels te zien. Voor een tv is de grootte belangrijk en ook de resolutie speelt een rol. De pixeldichtheid mag iets lager zijn, omdat je op een veel grotere afstand van de tv zit t.o.v. je gsm . Zelf al zijn de individuele pixels groter (lage ppi, grote grootte), je zal ze niet afzonderlijk zien door de grote afstand.
=== Refresh rate ===
De {{Wp|Refresh rate|refresh rate}} is het aantal keer per seconde dat weergevende hardware al zijn pixels kan verversen en wordt uitgedrukt in hertz (Hz).
=== Reactietijd ===
De reactietijd ({{Wp|en:Response time (technology)|response time}}) is de tijd die nodig is voor een pixel om te veranderen, gemeten in ms. In principe geldt: hoe lager, hoe beter. Vaak wordt grey-to-grey gemeten, maar er bestaat hiervoor geen standaard.
=== Contrast ===
Van de eigenschap contrast ({{Wp|en:Contrast ratio|contrast ratio}}) bestaat niet echt een officiële manier om het vast te leggen, maar het heeft te maken met hoeveel (grijs)waarden tussen wit en zwart kunnen worden weergegeven. Hoe hoger het getal, hoe beter.
=== Helderheid ===
De {{Wp|Helderheid (beeld)|helderheid}} (brightness) is het aantal {{Wp|Candela (eenheid)|candela}} per vierkante meter (cd/m³), waarbij candela de lichtsterkte weergeeft. Hoe meer cd/m², hoe krachtiger de lichtbron. Hoe hoger het getal, hoe beter.
=== Kijkhoek ===
De kijkhoek ({{Wp|en:Viewing angle|viewing angle}}) is de maximale hoek van waaruit een beeldscherm bekeken kan worden zonder dat dat (veel) verlies van contrast en kleur oplevert. Horizontaal of verticaal kan er sprake zijn van verschillende kijkhoeken.
Voor een tv zal je een zo groot mogelijke kijkhoek willen, maar voor een laptop op de trein zal je deze niet al te groot willen, zodanig dat je relatief privé kan werken. Bij de schermen van een bankautomaat zal men zéker een kleine kijkhoek wensen.
=== Samengevat ===
Bij het kiezen van een LCD-scherm blijken dus heel wat specificaties belangrijk te zijn. Sta ook stil bij het volgende:
* Hecht niet teveel belang aan niet gestandaardiseerde specificaties (bv. contrast, helderheid, kijkhoek), zeker als je vergelijkt tussen verschillende fabrikanten!
* Bekijk waar mogelijk het scherm in het echt, bij voorkeur onder verschillende omstandigheden (zonlicht, verlichting, kijkhoek,…).
* De aansluitingen (DVI, VGA,...) zijn ook belangrijk.
* Al of niet ''touch''? Overweeg wel of de extra kost voor jouw situatie de moeite waard is.
* De mogelijke instellingen van het scherm kunnen ook belangrijk zijn. Bij sommige kan je je tv instellen voor dynamische, levendige, natuurlijke,… weergave.
* Een gekalibreerd beeldscherm zal bij fotobewerking belangrijk zijn: het beeld op het scherm moet zo goed mogelijk lijken op het beeld dat van de drukpers rolt.
* Het bronmateriaal doet er ook veel toe: als je het “allerbeste” scherm hebt gekocht en je speelt er een YouTube-filmpje op af van lage kwaliteit, dan zal je scherm dat niet plots supergoed weergeven. De extra kost van een 8K-scherm kan zo (voorlopig) de investering niet waard zijn.
== Grafische kaart ==
Alhoewel de term '{{Wp|Videokaart|grafische kaart}}' en '{{Wp|Graphics processing unit|GPU}}' vaak door elkaar worden gebruikt, zijn het toch geen synoniemen. De ''graphics processing unit'' wordt namelijk óp de grafische kaart geplaatst. Zo kunnen twee verschillende grafische kaarten, toch dezelfde GPU gebruiken. Bepaalde specificaties van de GPU ken je al vanuit de hoofdstukken [[Computersystemen/Moederbord|moederbord]], [[Computersystemen/Processor|CPU]] en [[Computersystemen/Geheugen|geheugen]]: klokfrequentie, aantal cores, geheugen, geheugentype, busbreedte,...
<gallery>
File:Nvidia7600GS_TOP.jpg|Grafische kaart
File:6600GT_GPU.jpg|GPU
File:3-way-SLI.jpg|3-way SLI
</gallery>
Net als bij de CPU heeft ook de GPU een soort van 'instructieset'. De bekendste zijn wellicht {{Wp|Microsoft DirectX|DirectX}} of {{Wp|OpenGL|OpenGL}}, omdat dit vaak gebruikt wordt bij het ontwikkelen van spellen. Het gaat verder dan dat, met bv. {{Wp|en:Mantle (API)|AMD Mantle}}, {{Wp|en:FreeSync|AMD FreeSync}}, {{Wp|CUDA|NVIDIA CUDA}}, {{Wp|PhysX|NVIDIA PhysX}}.
De grafische kaart is uiteraard het bekendst voor zijn grafische toepassingen, maar omdat deze ook heel goed is in parallelle berekeningen (vandaar het hoge aantal cores), wordt deze soms ook gebruikt voor niet-grafische zaken, bv. wetenschappelijke berekeningen of {{Wp|Bitcoin#Mining_en_controle|bitcoin mining}}.
== Muis ==
De {{Wp|Muis (computer)|muis}} is een handig hulpmiddel om de positie van een cursor op het beeldscherm veranderen. Dankzij knoppen en een wieltje kan je nog extra handelingen uitvoeren. De meeste specificaties van de muis zullen bekend zijn. Voor het gros van de personen zal een eenvoudige muis voldoen, maar gamers of grafici zullen in het duurdere segment kijken. Voor hen kan nauwkeurigheid (dpi), de polling rate (Hz), de resolutie, de beeldsensor (megapixels) en het aantal knoppen belangrijk zijn.
Er bestaan varianten op de klassieke muis zoals {{Wp|Trackball|trackball}}, {{Wp|Voetmuis|voetmuis}}, {{Wp|Touchpad|touchpad}} of {{Wp|Joystick|joystick}}.
<gallery>
File:5 Tastenmaus Microsoft IntelliMouse Optical Black.jpg|optische vijfknopsmuis
File:Touchpad-Wiki.JPG|touchpad
File:Logitech-trackball.jpg|trackball
File:Joyopis.svg|joystick
</gallery>
== Toetsenbord ==
Bij het {{Wp|Toetsenbord (computer)|toetsenbord}} geldt ongeveer hetzelfde zoals bij de muizen: vooral gamers en grafici zullen hogere eisen stellen. Een belangrijk verschil is wel dat een toetsenbord een eigen indeling kent, zoals {{Wp|AZERTY|AZERTY}} (bv. in België) of {{Wp|QWERTY|QWERTY}} (bv. in Nederland). De AZERTY-indeling wordt wereldwijd amper gebruikt.
<gallery>
File:Pc105 wide delete tall enter xfree86 belgium keyboard full size.png|AZERTY lay-out
File:Pc104 wide delete short enter xfree86 us keyboard full size.png|QWERTY lay-out
File:LenovoKeyboard.jpg|QWERTY-toetsenbord
File:Apple Adjustable Keyboard.jpg|Ergonomisch toetsenbord
</gallery>
== Printer ==
Een {{Wp|Printer|printer}} is een apparaat dat de uitvoer van een computer, scanner of digitale camera afdrukt. De meest bekende soorten:
* De {{Wp|Inkjetprinter|inkjetprinter}} gebruikt vloeibare inkt, die op het papier 'gesproeid' wordt. Het voordeel van de inkjettechnologie is dat de printers goedkoop gemaakt kunnen worden en fraaie resultaten kunnen laten zien. Vele leveranciers verkopen de printer goedkoop en verdienen aan de dure inktpatronen.
* De {{Wp|Laserprinter|laserprinter}} drukt tekst en afbeeldingen af door toner (zwart of gekleurd poeder) aan het papier te hechten. De meeste toners hebben een hogere printcapaciteit dan inktcartridges. De aanschafprijs lijkt dan hoog - zeker als je voor een kleurenlaserprinter ineens 4 toners moet kopen - maar de prijs per pagina is meestal lager.
* De {{Wp|3D-printer|3D-printer}} kan driedimensionale objecten produceren, meestal a.d.h.v. plastic omdat dit goedkoop is en makkelijk in gebruik. In wat volgt worden vooral de kenmerken van de "gewone" printer besproken.
De resolutie van een {{Wp|Printer|printer}} wordt uitgedrukt in {{Wp|Dots per inch|dots per inch}}, bv. 1200 dpi. Dit lijkt dus goed op de ''pixels per inch'' van een beeldscherm, maar een printer kan door het iets verschuiven van de printkop de ruimte tussen twee dots opvullen. Vandaar hoeft de ppi- en de dpi-waarde niet gelijk te zijn. Als er een verschil is tussen de horizontale en verticale resolutie, zullen er twee waarden worden opgegeven. De snelheid van een printer wordt uitgedrukt in pagina's per minuut (ppm), met vaak een aparte waarde voor zwart-wit versus kleur.
Dé beste printer bestaat niet: bekijk altijd de noden bij het vergelijken. Vergeet zeker niet de prijs van de ''{{Wp|en:Consumables|consumables}}'', nl. de drum of de inktpatronen. Zo kan goedkoop alsnog duurkoop worden. In bedrijven en scholen zal men zo vaak een zwart-wit laserprinter terugvinden, omdat de prijs hiervan per blad het meest voordelige is. Als officieel papier nodig is (bv. met het logo), dan is dit vaak in kleur voorgedrukt en komt de zwart-wit afdruk daar bovenop.
Waar er bij een scherm sprake is van {{Wp|RGB-kleursysteem|RGB}}, wordt bij drukwerk vooral de {{Wp|CMYK|CMYK}}-{{Wp|kleurcodering|kleurcodering}} gebruikt. De basiskleuren zijn ''cyaan'' (blauw), ''magenta'' (roze/paars), ''yellow'' (geel) en ''key'' (zwart). Dit betekent ook dat er bij grafische beeldbewerking soms een vertaling moet gebeuren van de RGB-kleuren, naar een CMYK-spectrum.
<gallery>
Epson-inkjet-printer.jpg|Inkjetprinter
Ink-jet-cartridge.jpg|Inkjetcartridge
Laser_toner_cartridge.svg|Onderdelen laserprinter
Copier-engineerguy.ogv|Werking laserprinter
Color_Laser_Printer_Magnified.jpg|Zoom laserafdruk
Cmyk-rgb.jpg|RGB vs CMYK
MakerBot_ThingOMatic_Bre_Pettis.jpg|3D-printer
Hyperboloid Print.ogv|Werking 3D-printer
</gallery>
== Scanner ==
Een scanner is een invoerapparaat waarmee een object in de echte wereld systematisch afgetast wordt om omgezet te worden in data. Door deze ruime definitie kan je heel wat mogelijkheden bedenken, zoals een flatbedscanner (om gemakkelijk een papier in te scannen), een 3D-scanner (om een 3D-weergave van een object te verkrijgen), een QR- of {{Wp|Barcodescanner|barcodescanner}}, een {{Wp|Lidar|Lidar}} (zodat bv. een auto weet wat er rond zich bevindt), een {{Wp|Magnetic resonance imaging|MRI-scanner }} (om een beeld te krijgen van het inwendige van het lichaam),...
Bij randapparatuur zal de {{Wp|Scanner (grafisch)|grafische scanner}} het meest bekend zijn. Vaak is deze voor consumenten in één multifunctioneel toestel geïntegreerd (met print, scan- en kopieerfuncties). De meeste scanspecificaties zullen duidelijk zijn, eventueel met uitzondering van de kleurdiepte, uitgedrukt in aantal bits. Dit is de bitruimte die wordt gebruikt voor het weergeven van een kleur. Met een bitruimte van 3 bits, zou je slechts 8 (=2³) kleuren kunnen coderen. Naast de kleurdiepte is uiteraard ook de resolutie belangrijk!
<gallery>
Scanner.view.750pix.jpg|Flatbed scanner
Multifunction-Printer.jpg|Multifunctioneel
BASA portable scanner 01.jpg|Draagbare scanner
3D Printshow 2014 London - ZMorph - 3D scanner (14964233160).jpg|3D scanner
</gallery>
== Beamer ==
Een {{Wp|Videoprojector|beamer}} of videoprojector is een projector voor video- of computerbeelden. Een belangrijk kenmerk is {{Wp|Lichtstroom|lichtstroom}} (uitgedrukt in {{Wp|Lumen (eenheid)|lumen}}), omdat het een maat is voor de totale hoeveelheid zichtbaar licht die een lichtbron in alle richtingen uitstraalt. Bij een beamer heeft men het over ANSI-lumen: hoe hoger deze waarde, hoe beter.
Er bestaan verschillende projectietechnieken, zoals LCD, DLP, LED en laser. Bij de uitvoeringen heb je ook short-throw of ultra-short throw. Daarbij wordt de beamer dicht bij het projectiescherm gehangen, zodat je minder kans hebt om het projectiebeeld te hinderen.
Een belangrijke instelling van de beamer is de {{Wp|en:Keystone_effect#Correction|keystone correctie}} (letterlijk ''{{Wp|Sluitsteen|sluitsteen}} correctie''), wat nodig is wanneer de beamer niet recht tegenover het projectievlak staat.
<gallery>
Sample-SP.JPG|LCD
L-Karniesbogen_(keystone).png|Een 'echte' keystone
Keystone.jpg|Keystone
Projector_Screen_Geometry_Throw_Ratio.png|Afstanden
</gallery>
{{Appendix}}
{{Sub}}
kujvmixnpq9zfim0xbgsc1g0awgldy1
428234
428233
2026-05-20T08:10:10Z
Mattias.Campe
572
/* Samengevat */
428234
wikitext
text/x-wiki
{{Index Computersystemen}}
== Doelstellingen ==
Onderstaande doelstellingen komen in meer of mindere mate aan bod. De <span style="color:lightgrey;">grijze</span> doelstellingen komen hier niet aan bod. Dat zijn bv. praktijkoefeningen die aansluiten bij deze theorie, maar die in dit Wikibook niet behandeld worden. Of bv. theorie die in een ander hoofdstuk wordt behandeld.
Uit het leerplan van '''Applicatie- en Databeheer''' <ref>[https://pro.katholiekonderwijs.vlaanderen/iii-apda-da Leerplan Informatica- en communicatiewetenschappen B + S - 3de graad - D-finaliteit]</ref>, een deel van leerplandoel 23:
* LPD 23: De leerlingen lichten de opbouw en werking van een computersysteem met zijn basiscomponenten en optionele componenten toe.
** <span style="color:lightgrey;">Aansluitingen en connectoren</span>
** Functie van controller en driver
* Lexicon. De basiscomponenten van een computersysteem zijn: <span style="color:lightgrey;">moederbord, processor,intern geheugen (werkgeheugen, cache geheugen, systeemgeheugen, CMOS), koeling, voeding,</span> grafische kaart<span style="color:lightgrey;">, klok</span>.
* Lexicon. De optionele componenten van een computersysteem zijn hardwarecomponenten die dienen voor invoer, uitvoer <span style="color:lightgrey;">of opslag</span>
* <span style="color:lightgrey;">Wenk. Enkel de gangbare actuele basiscomponenten en optionele componenten van een computersysteem worden besproken. Je kan ook sensoren als mogelijk invoerapparaat voor een smartphone behandelen.</span>
Uit het leerplan Toegepaste Informatica van de richting '''Informaticabeheer''' <ref>Meer informatie op [https://ond.vvkso-ict.com/vvksomainnieuw/leerplanpubliek.asp?NR=2015/003 leerplan D/2015/7841/003]</ref>:
* 1.3.1 De functie en belangrijke karakteristieken van de gangbare optionele componenten toelichten, bijvoorbeeld beeldscherm, grafische kaart, muis, toetsenbord, printer, scanner ...
* 1.3.4 De functie van een controller en een driver toelichten.
* 1.3.5 Belangrijke eenheden voor technische specificaties van optionele componenten toelichten, bijvoorbeeld <span style="text-decoration:line-through;">bit, byte, rpm,</span> inch, dpi, ppm, ppi, Hz, <span style="text-decoration:line-through;">bps</span>, ANSI lumen ...
* ''1.4.6 Aan de hand van technische specificaties diverse uitvoeringen van optionele componenten vergelijken.''
Het is niet de bedoeling alle mogelijke randapparatuur uit te leggen of álle aspecten van deze randapparatuur. Sommige aspecten zijn gemakkelijk te begrijpen, bij andere zaken volgt verder extra uitleg. Zo zouden de meeste zaken in (web)winkels over beeldschermen, grafische kaarten, muizen, toetsenborden, printers/scanners en beamers begrepen moeten worden.
== Controller en driver ==
Een driver legt de verbinding tussen de controller en het besturingssysteem. Maar wat is 'driver' en wat is 'controller'?
Een '''controller''' is een stuk hardware dat met het effectieve randapparaat een verbinding legt, waardoor de driver deze kan aansturen. Enkele voorbeelden:
* De geheugencontroller is het stuk hardware dat toegang tot het geheugen controleert.
* Een ''network interface controller'' (NIC).
* Een ''disk controller'', vaak geïntegreerd op de harde schijf zelf.
Een '''{{Wp|en:Device driver|driver}}''' ({{Wp|Stuurprogramma|stuurprogramma}}) is een stuk software dat een verbinding legt tussen de hardware/controller en het besturingssysteem. Het stuurprogramma zorgt er hiermee voor dat de programmeur van een applicatie geen weet hoeft te hebben van de hardware waar zijn applicatie op zal gaan draaien. Op een uniforme manier kan de programmeur het besturingssysteem aanspreken. Het besturingssysteem spreekt vervolgens de hardware aan via het stuurprogramma.
Stel bv. dat je als programmeur je eigen tekstverwerker wilt schrijven, dan zal je geen eigen programmacode schrijven om te kunnen afdrukken. Gezien de verschillende types van printers zou dit heel veel werk zijn. Wat je wel doet is de afdruk-{{Wp|Application programming interface|API}} van het besturingssysteem aanroepen. Deze zal de afdruktaak op zijn beurt doorgeven aan de driver die met de printer overeenkomt. Vervolgens zal de printer de taak afdrukken. Dankzij dit systeem kan je tekstverwerker ook afdrukken naar toekomstige printers, zonder dat je zelf code moet veranderen.
Er zijn verschillende situaties bij het eerste gebruik van randapparatuur:
* Alles werkt perfect ''out-of-the-box'': de benodigde driver zit al in het besturingssysteem.
* Het besturingssysteem merkt dat er nieuwe hardware is, installeert alles automatisch en na een eventuele herstart werkt alles perfect.
* Het werkt, maar niet optimaal. Bv. bij een videokaart waar je bij kantoorwerk optimaal kan werken, maar waarbij je bij het spelen van een spel niet het onderste uit de kan kan halen, alhoewel de videokaart dit wel zou moeten kunnen. Door het besturingssysteem de opdracht te geven om te zoeken naar nieuwe drivers kan je dit misschien oplossen of je gaat zelf op de website van de fabrikant van de videokaart kijken of er geen betere driver te vinden is.
* Het werkt helemaal niet. Dan moet je hopen (''plug and pray'') dat je op de website van de fabrikant een driver voor jouw besturingssysteem vindt. Je kan ook op andere websites kijken, maar wees wantrouwig in wat je allemaal installeert.
Uiteraard hoop je op ''plug and play'', maar soms is het ''plug and pray''. Daar de driver verbinding legt tussen het besturingssysteem en de hardware zullen IT-administrators niet altijd happig zijn om een upgrade van een besturingssysteem te doen, zeker als er geen gangbare hardware wordt gebruikt (bv. ziekenhuizen, ruimteorganisaties,...). De kans bestaat nl. dat de makers van een besturingssysteem hun drivermodel aanpassen, waardoor deze nieuwe manier niet meer overweg kan met de oude drivers. Het gevolg is dat er geen communicatie met de randapparatuur mogelijk is of dat bepaalde functionaliteit niet meer werkt.
<gallery>
Disassembled SyQuest SQ3270S Disk Drive 270MB.jpg|HDD met controller
File:Driverarch.png|Driver architectuur
Hardware driver(ubuntu).png|Ubuntu driver
</gallery>
== Beeldscherm ==
Een {{Wp|Beeldscherm|beeldscherm}} of monitor is een apparaat dat bewegende beelden kan tonen. Het wordt ook gebruikt voor statische beelden die af en toe veranderd worden.
=== De techniek ===
[[Bestand:Pixel_geometry_01_Pengo.jpg|miniatuur|Closeup van pixels]]
Om een beeld op een beeldscherm te kunnen opbouwen worden heel kleine puntjes (de {{Wp|en:Pixel|pixels}}) gemaakt. Als deze voldoende klein zijn en/of worden bekeken vanop een voldoende grote afstand, dan zie je niet de afzonderlijke pixels, maar een beeld. Om kleur te krijgen worden drie subpixels gebruikt die een combinatie kunnen maken van de basiskleuren rood, groen en blauw, kortweg {{Wp|RGB-kleursysteem|RGB}}. Deze RGB-{{Wp|Kleurcodering|kleurcodering}} wordt ook gebruikt op websites om bv. tekst of vlakken een kleur te geven.
Als je leest over de techniek om op ''platte schermen'' iets te kunnen tonen, dan kan oa. je onderstaande tegenkomen:
* {{Wp|Liquid crystal display|LCD}} met een backlight (bv. {{Wp|CCFL|CCFL}} of {{Wp|Tv met led-backlight|LED}} als lichtbron).
* {{Wp|Amoled|Amoled}} heeft een kleiner energieverbruik, maar is helaas ook duurder in vergelijking met LCD. Je zal deze dan ook eerder vinden bij de kleinere schermen (bv. mobiele telefoons, mediaspelers en digitale camera's).
* De {{Wp|Digitale inkt|digitale inkt}} ({{Wp|en:E Ink|E Ink}}) is interessant bij het lezen van e-books, omdat het energieverbruik heel laag is en het nog goed kan gelezen worden bij zonlicht. Of bij ELS ({{Wp|Elektronisch schaplabel|Elektronisch schaplabel}} of {{Wp|en:electronic shelf label|electronic shelf label}}) zodat je prijzen gemakkelijk kan aanpassen zonder dat er veel energieverbruik is. Zo is {{Wp|en:SES-imagotag|SES-imagotag}} een bekende fabrikant.
* Er bestaan nog meer technieken, zoals {{Wp|Plasmascherm|plasma}}, {{Wp|en:Twisted nematic field effect|TN}}- of {{Wp|en:IPS panel|IPS}}-paneel. <ref>Zie bv. de video [https://www.youtube.com/watch?v=r8Y26Uq07Kw#t=335.871724 IPS vs TN Panel - What's the freaking difference? Comparison and Explanation]</ref>. Maar het zou ons te ver leiden om ze allemaal te bespreken.
<gallery>
File:Lcd-engineerguy.ogv|Werking LCD
Image:LCD layers.svg|Opbouw LCD
File:AMOLED.png|Opbouw Amoled
Electronic paper (Side view of Electrophoretic display) in svg.svg|Opbouw digitale inkt
</gallery>
=== Grootte, resolutie, aspect ratio, pixeldichtheid en schaling ===
Volgende kenmerken staan in relatie tot elkaar en zijn belangrijk om te bekijken:
* De grootte van het scherm ({{Wp|en:Display size|display size}}) wordt diagonaal gemeten en uitgedrukt in inch. Een inch is 2,54 centimeter en als je het nameet blijkt het al eens af te wijken van de officiële specificatie (bv. omdat de fabrikant hetgene onder de plastiek rand zit, ook meet). Bij tv's staat het vaak ook in centimeter, omdat de klant zich daar meer bij kan voorstellen dan inch.
* Een {{Wp|Resolutie_(digitale_beeldverwerking)|resolutie}} wordt uitgedrukt als <code>breedte×hoogte</code>. Zo betekent 1920x1080 dat er 1920 pixels in de breedte en 1080 pixels in de hoogte zijn. Er is dus een totaal van 2.073.600 pixels. Een LCD-scherm is gemaakt voor een optimale resolutie, maar via de instellingen van het besturingssysteem kan je dit wijzigen. Vaak merk je echter dat het geen optimale resolutie is. In theorie kan om het even welke resolutie, maar in de praktijk zijn er enkele {{Wp|en:List of common resolutions|gangbare resoluties}}, waarvan sommige een ''marketingbenaming'' krijgen:
** 2K verwijst naar ongeveer 2000 pixels in de breedte. Bv. 1920×1080 (Full HD of FHD) of 2048×1080 (DCI 2K).
** 4K verwijst naar ongeveer 4000 pixels in de breedte. Bv. 3840×2160 (4K UHD) of 4096×2160 (DCI 4K).
** 8K verwijst naar ongeveer 8000 pixels in de breedte. Bv. 7680×4320 (8K UHD).
* De {{Wp|Beeldverhouding|beeldverhouding}} ({{Wp|en:Display_aspect_ratio|aspect ratio}}) is de verhouding tussen de breedte en de hoogte van het beeld. Als je vierkante pixels hebt, dan betekent een resolutie van 1920x1080 een aspect ratio van 16:9. De breuk 1920/1080 kan je nl. vereenvoudigen naar 16/9 door teller en noemer te delen door 120. Merk op dat een resolutie van 1920x1200 met een aspect ratio van 16:10 wordt aangegeven i.p.v. 8:5. Zo herkennen mensen een aspect ratio van 16:9 of 16:10 snel als ongeveer hetzelfde widescreen.
* De {{Wp|Pixeldichtheid|pixeldichtheid}} ({{Wp|en:Pixel density|pixel density}}) is het aantal pixels per inch (ppi). Hoe hoger, hoe beter de beeldkwaliteit.
* De schaling bepaalt hoe groot tekst, apps en andere items zijn. Bij een groot scherm en hoge resolutie kan dit op 100% staan, bij een klein(er) scherm en dezelfde resolutie kan het interessant zijn om dit op 125% te zetten.
<gallery>
Resolution_illustration.png|Effect van resolutie
LCD_screen_sizes.svg|grootte en beeldverhouding
Display resolution and pixel density.png|resolutie en pixeldichtheid
Windows 10 Scale and Layout Settings.jpg|Schaling in Windows
GTK_3.10_resolution_independence_comparison.png|Niet geschaald vs geschaald
Resolution and aspect ratio.gif|Animatie resolutie en aspect ratio
Calibration-test-white.png|Kalibratietest wit
Calibration-test-black.png|Kalibratietest zwart
</gallery>
Om de relatie van resolutie, aspect ratio, pixeldichtheid en schaling te begrijpen, kan je bovenstaande animatie bekijken. Hierin wordt een zwarte lijn onder een hoek van 45° getekend en een vierkant icoontje van 3 op 3.
# Bij een resolutie van 32x20 is de aspect ratio dus 16:10. De lijn is onder een hoek van 45°, het icoontje is een vierkant. Door de lage resolutie zijn de details van het beeld niet goed.
# De resolutie bij de tweede stap wordt verhoogd naar 32x24, dus een aspect ratio van 4:3. De aspect ratio respecteert niet de fysische verhoudingen van het scherm: de lijn is nog steeds schuin, maar niet meer onder een hoek van 45°. Het icoontje blijft een icoon van 3 op 3, maar het is geen vierkant meer.
# De volgende stap is een resolutie van 32x32 en dus een aspect ratio van 1:1. De lijn gaat van de ene naar de andere hoek, maar niet onder een hoek van 45°. Het icoontje is nu nog platter gedrukt.
# Bij de volgende stap wordt de resolutie verhoogd tot 64x40 en hebben we terug de correcte aspect ratio van 16:10. De lijn is terug onder een hoek van 45° en het icoontje is terug een vierkant. Er is meer detail t.o.v. de eerste stap, want als de fysische grootte van het scherm hetzelfde blijft en je verhoogt de resolutie, dan moet bijgevolg de pixeldichtheid vergroten. Toch blijft het hoekige van de lijn zichtbaar (wat kan verbeterd worden door {{Wp|Anti-aliasing|anti-aliasing}}). Het icoontje blijft een vierkant icoon van 3x3, maar is nu wel kleiner.<br>Je voelt aan dat als de resolutie blijft toenemen op eenzelfde schermgrootte, dat tekst en icoontjes zó klein kunnen worden, dat ze te weinig nog de afzonderlijke details kunnen tonen. In dat geval kan het nodig zijn om de schaal aan te passen, bv. naar 125%.
# Bij de laatste stap is de pixeldichtheid hetzelfde als de vorige stap, maar omdat de fysische grootte van het scherm kleiner is, moet de resolutie ook kleiner zijn, nl. 32x20 (zoals bij de eerste stap). Er passen dus evenveel pixels hier of bij de eerste stap, maar de pixels hier zijn wel kleiner. De aspect ratio is 16:10 en respecteert de fysische verhoudingen van het scherm.
Voor het scherm van je gsm zal je geen al te groot scherm willen (want minder mobiel), maar toch een hoge resolutie en pixeldichtheid. Je kijkt nl. op je gsm vanaf een kleine afstand, waarbij je voldoende detail wil zien, zonder de individuele pixels te zien. Voor een tv is de grootte belangrijk en ook de resolutie speelt een rol. De pixeldichtheid mag iets lager zijn, omdat je op een veel grotere afstand van de tv zit t.o.v. je gsm . Zelf al zijn de individuele pixels groter (lage ppi, grote grootte), je zal ze niet afzonderlijk zien door de grote afstand.
=== Refresh rate ===
De {{Wp|Refresh rate|refresh rate}} is het aantal keer per seconde dat weergevende hardware al zijn pixels kan verversen en wordt uitgedrukt in hertz (Hz).
=== Reactietijd ===
De reactietijd ({{Wp|en:Response time (technology)|response time}}) is de tijd die nodig is voor een pixel om te veranderen, gemeten in ms. In principe geldt: hoe lager, hoe beter. Vaak wordt grey-to-grey gemeten, maar er bestaat hiervoor geen standaard.
=== Contrast ===
Van de eigenschap contrast ({{Wp|en:Contrast ratio|contrast ratio}}) bestaat niet echt een officiële manier om het vast te leggen, maar het heeft te maken met hoeveel (grijs)waarden tussen wit en zwart kunnen worden weergegeven. Hoe hoger het getal, hoe beter.
=== Helderheid ===
De {{Wp|Helderheid (beeld)|helderheid}} (brightness) is het aantal {{Wp|Candela (eenheid)|candela}} per vierkante meter (cd/m³), waarbij candela de lichtsterkte weergeeft. Hoe meer cd/m², hoe krachtiger de lichtbron. Hoe hoger het getal, hoe beter.
=== Kijkhoek ===
De kijkhoek ({{Wp|en:Viewing angle|viewing angle}}) is de maximale hoek van waaruit een beeldscherm bekeken kan worden zonder dat dat (veel) verlies van contrast en kleur oplevert. Horizontaal of verticaal kan er sprake zijn van verschillende kijkhoeken.
Voor een tv zal je een zo groot mogelijke kijkhoek willen, maar voor een laptop op de trein zal je deze niet al te groot willen, zodanig dat je relatief privé kan werken. Bij de schermen van een bankautomaat zal men zéker een kleine kijkhoek wensen.
=== Samengevat ===
Bij het kiezen van een LCD-scherm blijken dus heel wat specificaties belangrijk te zijn. Sta ook stil bij het volgende:
* Hecht niet teveel belang aan niet gestandaardiseerde specificaties (bv. contrast, helderheid, kijkhoek), zeker als je vergelijkt tussen verschillende fabrikanten!
* Bekijk waar mogelijk het scherm in het echt, bij voorkeur onder verschillende omstandigheden (zonlicht, verlichting, kijkhoek,…).
* De aansluitingen (HDMI, USB-C, ...) zijn ook belangrijk.
* Al of niet ''touch''? Overweeg als de extra kost voor jouw situatie de moeite waard is.
* De mogelijke instellingen van het scherm kunnen ook belangrijk zijn. Bij sommige kan je je tv instellen voor dynamische, levendige, natuurlijke,… weergave.
* Een gekalibreerd beeldscherm zal bij fotobewerking belangrijk zijn: het beeld op het scherm moet zo goed mogelijk lijken op het beeld dat van de drukpers rolt.
* Het bronmateriaal doet er ook veel toe: als je het “allerbeste” scherm hebt gekocht en je speelt er een YouTube-filmpje op af van lage kwaliteit, dan zal je scherm dat niet plots supergoed weergeven. De extra kost van een 8K-scherm kan zo (voorlopig) de investering niet waard zijn.
== Grafische kaart ==
Alhoewel de term '{{Wp|Videokaart|grafische kaart}}' en '{{Wp|Graphics processing unit|GPU}}' vaak door elkaar worden gebruikt, zijn het toch geen synoniemen. De ''graphics processing unit'' wordt namelijk óp de grafische kaart geplaatst. Zo kunnen twee verschillende grafische kaarten, toch dezelfde GPU gebruiken. Bepaalde specificaties van de GPU ken je al vanuit de hoofdstukken [[Computersystemen/Moederbord|moederbord]], [[Computersystemen/Processor|CPU]] en [[Computersystemen/Geheugen|geheugen]]: klokfrequentie, aantal cores, geheugen, geheugentype, busbreedte,...
<gallery>
File:Nvidia7600GS_TOP.jpg|Grafische kaart
File:6600GT_GPU.jpg|GPU
File:3-way-SLI.jpg|3-way SLI
</gallery>
Net als bij de CPU heeft ook de GPU een soort van 'instructieset'. De bekendste zijn wellicht {{Wp|Microsoft DirectX|DirectX}} of {{Wp|OpenGL|OpenGL}}, omdat dit vaak gebruikt wordt bij het ontwikkelen van spellen. Het gaat verder dan dat, met bv. {{Wp|en:Mantle (API)|AMD Mantle}}, {{Wp|en:FreeSync|AMD FreeSync}}, {{Wp|CUDA|NVIDIA CUDA}}, {{Wp|PhysX|NVIDIA PhysX}}.
De grafische kaart is uiteraard het bekendst voor zijn grafische toepassingen, maar omdat deze ook heel goed is in parallelle berekeningen (vandaar het hoge aantal cores), wordt deze soms ook gebruikt voor niet-grafische zaken, bv. wetenschappelijke berekeningen of {{Wp|Bitcoin#Mining_en_controle|bitcoin mining}}.
== Muis ==
De {{Wp|Muis (computer)|muis}} is een handig hulpmiddel om de positie van een cursor op het beeldscherm veranderen. Dankzij knoppen en een wieltje kan je nog extra handelingen uitvoeren. De meeste specificaties van de muis zullen bekend zijn. Voor het gros van de personen zal een eenvoudige muis voldoen, maar gamers of grafici zullen in het duurdere segment kijken. Voor hen kan nauwkeurigheid (dpi), de polling rate (Hz), de resolutie, de beeldsensor (megapixels) en het aantal knoppen belangrijk zijn.
Er bestaan varianten op de klassieke muis zoals {{Wp|Trackball|trackball}}, {{Wp|Voetmuis|voetmuis}}, {{Wp|Touchpad|touchpad}} of {{Wp|Joystick|joystick}}.
<gallery>
File:5 Tastenmaus Microsoft IntelliMouse Optical Black.jpg|optische vijfknopsmuis
File:Touchpad-Wiki.JPG|touchpad
File:Logitech-trackball.jpg|trackball
File:Joyopis.svg|joystick
</gallery>
== Toetsenbord ==
Bij het {{Wp|Toetsenbord (computer)|toetsenbord}} geldt ongeveer hetzelfde zoals bij de muizen: vooral gamers en grafici zullen hogere eisen stellen. Een belangrijk verschil is wel dat een toetsenbord een eigen indeling kent, zoals {{Wp|AZERTY|AZERTY}} (bv. in België) of {{Wp|QWERTY|QWERTY}} (bv. in Nederland). De AZERTY-indeling wordt wereldwijd amper gebruikt.
<gallery>
File:Pc105 wide delete tall enter xfree86 belgium keyboard full size.png|AZERTY lay-out
File:Pc104 wide delete short enter xfree86 us keyboard full size.png|QWERTY lay-out
File:LenovoKeyboard.jpg|QWERTY-toetsenbord
File:Apple Adjustable Keyboard.jpg|Ergonomisch toetsenbord
</gallery>
== Printer ==
Een {{Wp|Printer|printer}} is een apparaat dat de uitvoer van een computer, scanner of digitale camera afdrukt. De meest bekende soorten:
* De {{Wp|Inkjetprinter|inkjetprinter}} gebruikt vloeibare inkt, die op het papier 'gesproeid' wordt. Het voordeel van de inkjettechnologie is dat de printers goedkoop gemaakt kunnen worden en fraaie resultaten kunnen laten zien. Vele leveranciers verkopen de printer goedkoop en verdienen aan de dure inktpatronen.
* De {{Wp|Laserprinter|laserprinter}} drukt tekst en afbeeldingen af door toner (zwart of gekleurd poeder) aan het papier te hechten. De meeste toners hebben een hogere printcapaciteit dan inktcartridges. De aanschafprijs lijkt dan hoog - zeker als je voor een kleurenlaserprinter ineens 4 toners moet kopen - maar de prijs per pagina is meestal lager.
* De {{Wp|3D-printer|3D-printer}} kan driedimensionale objecten produceren, meestal a.d.h.v. plastic omdat dit goedkoop is en makkelijk in gebruik. In wat volgt worden vooral de kenmerken van de "gewone" printer besproken.
De resolutie van een {{Wp|Printer|printer}} wordt uitgedrukt in {{Wp|Dots per inch|dots per inch}}, bv. 1200 dpi. Dit lijkt dus goed op de ''pixels per inch'' van een beeldscherm, maar een printer kan door het iets verschuiven van de printkop de ruimte tussen twee dots opvullen. Vandaar hoeft de ppi- en de dpi-waarde niet gelijk te zijn. Als er een verschil is tussen de horizontale en verticale resolutie, zullen er twee waarden worden opgegeven. De snelheid van een printer wordt uitgedrukt in pagina's per minuut (ppm), met vaak een aparte waarde voor zwart-wit versus kleur.
Dé beste printer bestaat niet: bekijk altijd de noden bij het vergelijken. Vergeet zeker niet de prijs van de ''{{Wp|en:Consumables|consumables}}'', nl. de drum of de inktpatronen. Zo kan goedkoop alsnog duurkoop worden. In bedrijven en scholen zal men zo vaak een zwart-wit laserprinter terugvinden, omdat de prijs hiervan per blad het meest voordelige is. Als officieel papier nodig is (bv. met het logo), dan is dit vaak in kleur voorgedrukt en komt de zwart-wit afdruk daar bovenop.
Waar er bij een scherm sprake is van {{Wp|RGB-kleursysteem|RGB}}, wordt bij drukwerk vooral de {{Wp|CMYK|CMYK}}-{{Wp|kleurcodering|kleurcodering}} gebruikt. De basiskleuren zijn ''cyaan'' (blauw), ''magenta'' (roze/paars), ''yellow'' (geel) en ''key'' (zwart). Dit betekent ook dat er bij grafische beeldbewerking soms een vertaling moet gebeuren van de RGB-kleuren, naar een CMYK-spectrum.
<gallery>
Epson-inkjet-printer.jpg|Inkjetprinter
Ink-jet-cartridge.jpg|Inkjetcartridge
Laser_toner_cartridge.svg|Onderdelen laserprinter
Copier-engineerguy.ogv|Werking laserprinter
Color_Laser_Printer_Magnified.jpg|Zoom laserafdruk
Cmyk-rgb.jpg|RGB vs CMYK
MakerBot_ThingOMatic_Bre_Pettis.jpg|3D-printer
Hyperboloid Print.ogv|Werking 3D-printer
</gallery>
== Scanner ==
Een scanner is een invoerapparaat waarmee een object in de echte wereld systematisch afgetast wordt om omgezet te worden in data. Door deze ruime definitie kan je heel wat mogelijkheden bedenken, zoals een flatbedscanner (om gemakkelijk een papier in te scannen), een 3D-scanner (om een 3D-weergave van een object te verkrijgen), een QR- of {{Wp|Barcodescanner|barcodescanner}}, een {{Wp|Lidar|Lidar}} (zodat bv. een auto weet wat er rond zich bevindt), een {{Wp|Magnetic resonance imaging|MRI-scanner }} (om een beeld te krijgen van het inwendige van het lichaam),...
Bij randapparatuur zal de {{Wp|Scanner (grafisch)|grafische scanner}} het meest bekend zijn. Vaak is deze voor consumenten in één multifunctioneel toestel geïntegreerd (met print, scan- en kopieerfuncties). De meeste scanspecificaties zullen duidelijk zijn, eventueel met uitzondering van de kleurdiepte, uitgedrukt in aantal bits. Dit is de bitruimte die wordt gebruikt voor het weergeven van een kleur. Met een bitruimte van 3 bits, zou je slechts 8 (=2³) kleuren kunnen coderen. Naast de kleurdiepte is uiteraard ook de resolutie belangrijk!
<gallery>
Scanner.view.750pix.jpg|Flatbed scanner
Multifunction-Printer.jpg|Multifunctioneel
BASA portable scanner 01.jpg|Draagbare scanner
3D Printshow 2014 London - ZMorph - 3D scanner (14964233160).jpg|3D scanner
</gallery>
== Beamer ==
Een {{Wp|Videoprojector|beamer}} of videoprojector is een projector voor video- of computerbeelden. Een belangrijk kenmerk is {{Wp|Lichtstroom|lichtstroom}} (uitgedrukt in {{Wp|Lumen (eenheid)|lumen}}), omdat het een maat is voor de totale hoeveelheid zichtbaar licht die een lichtbron in alle richtingen uitstraalt. Bij een beamer heeft men het over ANSI-lumen: hoe hoger deze waarde, hoe beter.
Er bestaan verschillende projectietechnieken, zoals LCD, DLP, LED en laser. Bij de uitvoeringen heb je ook short-throw of ultra-short throw. Daarbij wordt de beamer dicht bij het projectiescherm gehangen, zodat je minder kans hebt om het projectiebeeld te hinderen.
Een belangrijke instelling van de beamer is de {{Wp|en:Keystone_effect#Correction|keystone correctie}} (letterlijk ''{{Wp|Sluitsteen|sluitsteen}} correctie''), wat nodig is wanneer de beamer niet recht tegenover het projectievlak staat.
<gallery>
Sample-SP.JPG|LCD
L-Karniesbogen_(keystone).png|Een 'echte' keystone
Keystone.jpg|Keystone
Projector_Screen_Geometry_Throw_Ratio.png|Afstanden
</gallery>
{{Appendix}}
{{Sub}}
mlqo18n6oapvqqur8q6b9re8tag35wp
428235
428234
2026-05-20T08:16:42Z
Mattias.Campe
572
/* Grafische kaart */
428235
wikitext
text/x-wiki
{{Index Computersystemen}}
== Doelstellingen ==
Onderstaande doelstellingen komen in meer of mindere mate aan bod. De <span style="color:lightgrey;">grijze</span> doelstellingen komen hier niet aan bod. Dat zijn bv. praktijkoefeningen die aansluiten bij deze theorie, maar die in dit Wikibook niet behandeld worden. Of bv. theorie die in een ander hoofdstuk wordt behandeld.
Uit het leerplan van '''Applicatie- en Databeheer''' <ref>[https://pro.katholiekonderwijs.vlaanderen/iii-apda-da Leerplan Informatica- en communicatiewetenschappen B + S - 3de graad - D-finaliteit]</ref>, een deel van leerplandoel 23:
* LPD 23: De leerlingen lichten de opbouw en werking van een computersysteem met zijn basiscomponenten en optionele componenten toe.
** <span style="color:lightgrey;">Aansluitingen en connectoren</span>
** Functie van controller en driver
* Lexicon. De basiscomponenten van een computersysteem zijn: <span style="color:lightgrey;">moederbord, processor,intern geheugen (werkgeheugen, cache geheugen, systeemgeheugen, CMOS), koeling, voeding,</span> grafische kaart<span style="color:lightgrey;">, klok</span>.
* Lexicon. De optionele componenten van een computersysteem zijn hardwarecomponenten die dienen voor invoer, uitvoer <span style="color:lightgrey;">of opslag</span>
* <span style="color:lightgrey;">Wenk. Enkel de gangbare actuele basiscomponenten en optionele componenten van een computersysteem worden besproken. Je kan ook sensoren als mogelijk invoerapparaat voor een smartphone behandelen.</span>
Uit het leerplan Toegepaste Informatica van de richting '''Informaticabeheer''' <ref>Meer informatie op [https://ond.vvkso-ict.com/vvksomainnieuw/leerplanpubliek.asp?NR=2015/003 leerplan D/2015/7841/003]</ref>:
* 1.3.1 De functie en belangrijke karakteristieken van de gangbare optionele componenten toelichten, bijvoorbeeld beeldscherm, grafische kaart, muis, toetsenbord, printer, scanner ...
* 1.3.4 De functie van een controller en een driver toelichten.
* 1.3.5 Belangrijke eenheden voor technische specificaties van optionele componenten toelichten, bijvoorbeeld <span style="text-decoration:line-through;">bit, byte, rpm,</span> inch, dpi, ppm, ppi, Hz, <span style="text-decoration:line-through;">bps</span>, ANSI lumen ...
* ''1.4.6 Aan de hand van technische specificaties diverse uitvoeringen van optionele componenten vergelijken.''
Het is niet de bedoeling alle mogelijke randapparatuur uit te leggen of álle aspecten van deze randapparatuur. Sommige aspecten zijn gemakkelijk te begrijpen, bij andere zaken volgt verder extra uitleg. Zo zouden de meeste zaken in (web)winkels over beeldschermen, grafische kaarten, muizen, toetsenborden, printers/scanners en beamers begrepen moeten worden.
== Controller en driver ==
Een driver legt de verbinding tussen de controller en het besturingssysteem. Maar wat is 'driver' en wat is 'controller'?
Een '''controller''' is een stuk hardware dat met het effectieve randapparaat een verbinding legt, waardoor de driver deze kan aansturen. Enkele voorbeelden:
* De geheugencontroller is het stuk hardware dat toegang tot het geheugen controleert.
* Een ''network interface controller'' (NIC).
* Een ''disk controller'', vaak geïntegreerd op de harde schijf zelf.
Een '''{{Wp|en:Device driver|driver}}''' ({{Wp|Stuurprogramma|stuurprogramma}}) is een stuk software dat een verbinding legt tussen de hardware/controller en het besturingssysteem. Het stuurprogramma zorgt er hiermee voor dat de programmeur van een applicatie geen weet hoeft te hebben van de hardware waar zijn applicatie op zal gaan draaien. Op een uniforme manier kan de programmeur het besturingssysteem aanspreken. Het besturingssysteem spreekt vervolgens de hardware aan via het stuurprogramma.
Stel bv. dat je als programmeur je eigen tekstverwerker wilt schrijven, dan zal je geen eigen programmacode schrijven om te kunnen afdrukken. Gezien de verschillende types van printers zou dit heel veel werk zijn. Wat je wel doet is de afdruk-{{Wp|Application programming interface|API}} van het besturingssysteem aanroepen. Deze zal de afdruktaak op zijn beurt doorgeven aan de driver die met de printer overeenkomt. Vervolgens zal de printer de taak afdrukken. Dankzij dit systeem kan je tekstverwerker ook afdrukken naar toekomstige printers, zonder dat je zelf code moet veranderen.
Er zijn verschillende situaties bij het eerste gebruik van randapparatuur:
* Alles werkt perfect ''out-of-the-box'': de benodigde driver zit al in het besturingssysteem.
* Het besturingssysteem merkt dat er nieuwe hardware is, installeert alles automatisch en na een eventuele herstart werkt alles perfect.
* Het werkt, maar niet optimaal. Bv. bij een videokaart waar je bij kantoorwerk optimaal kan werken, maar waarbij je bij het spelen van een spel niet het onderste uit de kan kan halen, alhoewel de videokaart dit wel zou moeten kunnen. Door het besturingssysteem de opdracht te geven om te zoeken naar nieuwe drivers kan je dit misschien oplossen of je gaat zelf op de website van de fabrikant van de videokaart kijken of er geen betere driver te vinden is.
* Het werkt helemaal niet. Dan moet je hopen (''plug and pray'') dat je op de website van de fabrikant een driver voor jouw besturingssysteem vindt. Je kan ook op andere websites kijken, maar wees wantrouwig in wat je allemaal installeert.
Uiteraard hoop je op ''plug and play'', maar soms is het ''plug and pray''. Daar de driver verbinding legt tussen het besturingssysteem en de hardware zullen IT-administrators niet altijd happig zijn om een upgrade van een besturingssysteem te doen, zeker als er geen gangbare hardware wordt gebruikt (bv. ziekenhuizen, ruimteorganisaties,...). De kans bestaat nl. dat de makers van een besturingssysteem hun drivermodel aanpassen, waardoor deze nieuwe manier niet meer overweg kan met de oude drivers. Het gevolg is dat er geen communicatie met de randapparatuur mogelijk is of dat bepaalde functionaliteit niet meer werkt.
<gallery>
Disassembled SyQuest SQ3270S Disk Drive 270MB.jpg|HDD met controller
File:Driverarch.png|Driver architectuur
Hardware driver(ubuntu).png|Ubuntu driver
</gallery>
== Beeldscherm ==
Een {{Wp|Beeldscherm|beeldscherm}} of monitor is een apparaat dat bewegende beelden kan tonen. Het wordt ook gebruikt voor statische beelden die af en toe veranderd worden.
=== De techniek ===
[[Bestand:Pixel_geometry_01_Pengo.jpg|miniatuur|Closeup van pixels]]
Om een beeld op een beeldscherm te kunnen opbouwen worden heel kleine puntjes (de {{Wp|en:Pixel|pixels}}) gemaakt. Als deze voldoende klein zijn en/of worden bekeken vanop een voldoende grote afstand, dan zie je niet de afzonderlijke pixels, maar een beeld. Om kleur te krijgen worden drie subpixels gebruikt die een combinatie kunnen maken van de basiskleuren rood, groen en blauw, kortweg {{Wp|RGB-kleursysteem|RGB}}. Deze RGB-{{Wp|Kleurcodering|kleurcodering}} wordt ook gebruikt op websites om bv. tekst of vlakken een kleur te geven.
Als je leest over de techniek om op ''platte schermen'' iets te kunnen tonen, dan kan oa. je onderstaande tegenkomen:
* {{Wp|Liquid crystal display|LCD}} met een backlight (bv. {{Wp|CCFL|CCFL}} of {{Wp|Tv met led-backlight|LED}} als lichtbron).
* {{Wp|Amoled|Amoled}} heeft een kleiner energieverbruik, maar is helaas ook duurder in vergelijking met LCD. Je zal deze dan ook eerder vinden bij de kleinere schermen (bv. mobiele telefoons, mediaspelers en digitale camera's).
* De {{Wp|Digitale inkt|digitale inkt}} ({{Wp|en:E Ink|E Ink}}) is interessant bij het lezen van e-books, omdat het energieverbruik heel laag is en het nog goed kan gelezen worden bij zonlicht. Of bij ELS ({{Wp|Elektronisch schaplabel|Elektronisch schaplabel}} of {{Wp|en:electronic shelf label|electronic shelf label}}) zodat je prijzen gemakkelijk kan aanpassen zonder dat er veel energieverbruik is. Zo is {{Wp|en:SES-imagotag|SES-imagotag}} een bekende fabrikant.
* Er bestaan nog meer technieken, zoals {{Wp|Plasmascherm|plasma}}, {{Wp|en:Twisted nematic field effect|TN}}- of {{Wp|en:IPS panel|IPS}}-paneel. <ref>Zie bv. de video [https://www.youtube.com/watch?v=r8Y26Uq07Kw#t=335.871724 IPS vs TN Panel - What's the freaking difference? Comparison and Explanation]</ref>. Maar het zou ons te ver leiden om ze allemaal te bespreken.
<gallery>
File:Lcd-engineerguy.ogv|Werking LCD
Image:LCD layers.svg|Opbouw LCD
File:AMOLED.png|Opbouw Amoled
Electronic paper (Side view of Electrophoretic display) in svg.svg|Opbouw digitale inkt
</gallery>
=== Grootte, resolutie, aspect ratio, pixeldichtheid en schaling ===
Volgende kenmerken staan in relatie tot elkaar en zijn belangrijk om te bekijken:
* De grootte van het scherm ({{Wp|en:Display size|display size}}) wordt diagonaal gemeten en uitgedrukt in inch. Een inch is 2,54 centimeter en als je het nameet blijkt het al eens af te wijken van de officiële specificatie (bv. omdat de fabrikant hetgene onder de plastiek rand zit, ook meet). Bij tv's staat het vaak ook in centimeter, omdat de klant zich daar meer bij kan voorstellen dan inch.
* Een {{Wp|Resolutie_(digitale_beeldverwerking)|resolutie}} wordt uitgedrukt als <code>breedte×hoogte</code>. Zo betekent 1920x1080 dat er 1920 pixels in de breedte en 1080 pixels in de hoogte zijn. Er is dus een totaal van 2.073.600 pixels. Een LCD-scherm is gemaakt voor een optimale resolutie, maar via de instellingen van het besturingssysteem kan je dit wijzigen. Vaak merk je echter dat het geen optimale resolutie is. In theorie kan om het even welke resolutie, maar in de praktijk zijn er enkele {{Wp|en:List of common resolutions|gangbare resoluties}}, waarvan sommige een ''marketingbenaming'' krijgen:
** 2K verwijst naar ongeveer 2000 pixels in de breedte. Bv. 1920×1080 (Full HD of FHD) of 2048×1080 (DCI 2K).
** 4K verwijst naar ongeveer 4000 pixels in de breedte. Bv. 3840×2160 (4K UHD) of 4096×2160 (DCI 4K).
** 8K verwijst naar ongeveer 8000 pixels in de breedte. Bv. 7680×4320 (8K UHD).
* De {{Wp|Beeldverhouding|beeldverhouding}} ({{Wp|en:Display_aspect_ratio|aspect ratio}}) is de verhouding tussen de breedte en de hoogte van het beeld. Als je vierkante pixels hebt, dan betekent een resolutie van 1920x1080 een aspect ratio van 16:9. De breuk 1920/1080 kan je nl. vereenvoudigen naar 16/9 door teller en noemer te delen door 120. Merk op dat een resolutie van 1920x1200 met een aspect ratio van 16:10 wordt aangegeven i.p.v. 8:5. Zo herkennen mensen een aspect ratio van 16:9 of 16:10 snel als ongeveer hetzelfde widescreen.
* De {{Wp|Pixeldichtheid|pixeldichtheid}} ({{Wp|en:Pixel density|pixel density}}) is het aantal pixels per inch (ppi). Hoe hoger, hoe beter de beeldkwaliteit.
* De schaling bepaalt hoe groot tekst, apps en andere items zijn. Bij een groot scherm en hoge resolutie kan dit op 100% staan, bij een klein(er) scherm en dezelfde resolutie kan het interessant zijn om dit op 125% te zetten.
<gallery>
Resolution_illustration.png|Effect van resolutie
LCD_screen_sizes.svg|grootte en beeldverhouding
Display resolution and pixel density.png|resolutie en pixeldichtheid
Windows 10 Scale and Layout Settings.jpg|Schaling in Windows
GTK_3.10_resolution_independence_comparison.png|Niet geschaald vs geschaald
Resolution and aspect ratio.gif|Animatie resolutie en aspect ratio
Calibration-test-white.png|Kalibratietest wit
Calibration-test-black.png|Kalibratietest zwart
</gallery>
Om de relatie van resolutie, aspect ratio, pixeldichtheid en schaling te begrijpen, kan je bovenstaande animatie bekijken. Hierin wordt een zwarte lijn onder een hoek van 45° getekend en een vierkant icoontje van 3 op 3.
# Bij een resolutie van 32x20 is de aspect ratio dus 16:10. De lijn is onder een hoek van 45°, het icoontje is een vierkant. Door de lage resolutie zijn de details van het beeld niet goed.
# De resolutie bij de tweede stap wordt verhoogd naar 32x24, dus een aspect ratio van 4:3. De aspect ratio respecteert niet de fysische verhoudingen van het scherm: de lijn is nog steeds schuin, maar niet meer onder een hoek van 45°. Het icoontje blijft een icoon van 3 op 3, maar het is geen vierkant meer.
# De volgende stap is een resolutie van 32x32 en dus een aspect ratio van 1:1. De lijn gaat van de ene naar de andere hoek, maar niet onder een hoek van 45°. Het icoontje is nu nog platter gedrukt.
# Bij de volgende stap wordt de resolutie verhoogd tot 64x40 en hebben we terug de correcte aspect ratio van 16:10. De lijn is terug onder een hoek van 45° en het icoontje is terug een vierkant. Er is meer detail t.o.v. de eerste stap, want als de fysische grootte van het scherm hetzelfde blijft en je verhoogt de resolutie, dan moet bijgevolg de pixeldichtheid vergroten. Toch blijft het hoekige van de lijn zichtbaar (wat kan verbeterd worden door {{Wp|Anti-aliasing|anti-aliasing}}). Het icoontje blijft een vierkant icoon van 3x3, maar is nu wel kleiner.<br>Je voelt aan dat als de resolutie blijft toenemen op eenzelfde schermgrootte, dat tekst en icoontjes zó klein kunnen worden, dat ze te weinig nog de afzonderlijke details kunnen tonen. In dat geval kan het nodig zijn om de schaal aan te passen, bv. naar 125%.
# Bij de laatste stap is de pixeldichtheid hetzelfde als de vorige stap, maar omdat de fysische grootte van het scherm kleiner is, moet de resolutie ook kleiner zijn, nl. 32x20 (zoals bij de eerste stap). Er passen dus evenveel pixels hier of bij de eerste stap, maar de pixels hier zijn wel kleiner. De aspect ratio is 16:10 en respecteert de fysische verhoudingen van het scherm.
Voor het scherm van je gsm zal je geen al te groot scherm willen (want minder mobiel), maar toch een hoge resolutie en pixeldichtheid. Je kijkt nl. op je gsm vanaf een kleine afstand, waarbij je voldoende detail wil zien, zonder de individuele pixels te zien. Voor een tv is de grootte belangrijk en ook de resolutie speelt een rol. De pixeldichtheid mag iets lager zijn, omdat je op een veel grotere afstand van de tv zit t.o.v. je gsm . Zelf al zijn de individuele pixels groter (lage ppi, grote grootte), je zal ze niet afzonderlijk zien door de grote afstand.
=== Refresh rate ===
De {{Wp|Refresh rate|refresh rate}} is het aantal keer per seconde dat weergevende hardware al zijn pixels kan verversen en wordt uitgedrukt in hertz (Hz).
=== Reactietijd ===
De reactietijd ({{Wp|en:Response time (technology)|response time}}) is de tijd die nodig is voor een pixel om te veranderen, gemeten in ms. In principe geldt: hoe lager, hoe beter. Vaak wordt grey-to-grey gemeten, maar er bestaat hiervoor geen standaard.
=== Contrast ===
Van de eigenschap contrast ({{Wp|en:Contrast ratio|contrast ratio}}) bestaat niet echt een officiële manier om het vast te leggen, maar het heeft te maken met hoeveel (grijs)waarden tussen wit en zwart kunnen worden weergegeven. Hoe hoger het getal, hoe beter.
=== Helderheid ===
De {{Wp|Helderheid (beeld)|helderheid}} (brightness) is het aantal {{Wp|Candela (eenheid)|candela}} per vierkante meter (cd/m³), waarbij candela de lichtsterkte weergeeft. Hoe meer cd/m², hoe krachtiger de lichtbron. Hoe hoger het getal, hoe beter.
=== Kijkhoek ===
De kijkhoek ({{Wp|en:Viewing angle|viewing angle}}) is de maximale hoek van waaruit een beeldscherm bekeken kan worden zonder dat dat (veel) verlies van contrast en kleur oplevert. Horizontaal of verticaal kan er sprake zijn van verschillende kijkhoeken.
Voor een tv zal je een zo groot mogelijke kijkhoek willen, maar voor een laptop op de trein zal je deze niet al te groot willen, zodanig dat je relatief privé kan werken. Bij de schermen van een bankautomaat zal men zéker een kleine kijkhoek wensen.
=== Samengevat ===
Bij het kiezen van een LCD-scherm blijken dus heel wat specificaties belangrijk te zijn. Sta ook stil bij het volgende:
* Hecht niet teveel belang aan niet gestandaardiseerde specificaties (bv. contrast, helderheid, kijkhoek), zeker als je vergelijkt tussen verschillende fabrikanten!
* Bekijk waar mogelijk het scherm in het echt, bij voorkeur onder verschillende omstandigheden (zonlicht, verlichting, kijkhoek,…).
* De aansluitingen (HDMI, USB-C, ...) zijn ook belangrijk.
* Al of niet ''touch''? Overweeg als de extra kost voor jouw situatie de moeite waard is.
* De mogelijke instellingen van het scherm kunnen ook belangrijk zijn. Bij sommige kan je je tv instellen voor dynamische, levendige, natuurlijke,… weergave.
* Een gekalibreerd beeldscherm zal bij fotobewerking belangrijk zijn: het beeld op het scherm moet zo goed mogelijk lijken op het beeld dat van de drukpers rolt.
* Het bronmateriaal doet er ook veel toe: als je het “allerbeste” scherm hebt gekocht en je speelt er een YouTube-filmpje op af van lage kwaliteit, dan zal je scherm dat niet plots supergoed weergeven. De extra kost van een 8K-scherm kan zo (voorlopig) de investering niet waard zijn.
== Grafische kaart ==
Alhoewel de term '{{Wp|Videokaart|grafische kaart}}' en '{{Wp|Graphics processing unit|GPU}}' vaak door elkaar worden gebruikt, zijn het toch geen synoniemen. De ''graphics processing unit'' wordt namelijk óp de grafische kaart geplaatst. Zo kunnen twee verschillende grafische kaarten, toch dezelfde GPU gebruiken. Bepaalde specificaties van de GPU ken je al vanuit de hoofdstukken [[Computersystemen/Moederbord|moederbord]], [[Computersystemen/Processor|CPU]] en [[Computersystemen/Geheugen|geheugen]]: klokfrequentie, aantal cores, geheugen, geheugentype, busbreedte,...
<gallery>
File:Nvidia7600GS_TOP.jpg|Grafische kaart
File:6600GT_GPU.jpg|GPU
File:3-way-SLI.jpg|3-way SLI
</gallery>
Net als bij de CPU heeft ook de GPU een soort van 'instructieset'. De bekendste zijn wellicht {{Wp|Microsoft DirectX|DirectX}} of {{Wp|OpenGL|OpenGL}}, omdat dit vaak gebruikt wordt bij het ontwikkelen van spellen. Het gaat verder dan dat, met bv. {{Wp|en:Mantle (API)|AMD Mantle}}, {{Wp|en:FreeSync|AMD FreeSync}}, {{Wp|CUDA|NVIDIA CUDA}}, {{Wp|PhysX|NVIDIA PhysX}}.
De grafische kaart is uiteraard het bekendst voor zijn grafische toepassingen en dan zijn de aansluitingen (HMDI, USB-C, ...) en de maximale resolutie (bv. bij het aansturen van meerdere beeldschermen) heel belangrijk. Omdat een GPU heel goed is in parallelle berekeningen (vandaar het hoge aantal cores), wordt deze soms ook gebruikt voor niet-grafische zaken, bv. wetenschappelijke berekeningen, {{Wp|Bitcoin#Mining_en_controle|bitcoin mining}} of AI-modellen.
== Muis ==
De {{Wp|Muis (computer)|muis}} is een handig hulpmiddel om de positie van een cursor op het beeldscherm veranderen. Dankzij knoppen en een wieltje kan je nog extra handelingen uitvoeren. De meeste specificaties van de muis zullen bekend zijn. Voor het gros van de personen zal een eenvoudige muis voldoen, maar gamers of grafici zullen in het duurdere segment kijken. Voor hen kan nauwkeurigheid (dpi), de polling rate (Hz), de resolutie, de beeldsensor (megapixels) en het aantal knoppen belangrijk zijn.
Er bestaan varianten op de klassieke muis zoals {{Wp|Trackball|trackball}}, {{Wp|Voetmuis|voetmuis}}, {{Wp|Touchpad|touchpad}} of {{Wp|Joystick|joystick}}.
<gallery>
File:5 Tastenmaus Microsoft IntelliMouse Optical Black.jpg|optische vijfknopsmuis
File:Touchpad-Wiki.JPG|touchpad
File:Logitech-trackball.jpg|trackball
File:Joyopis.svg|joystick
</gallery>
== Toetsenbord ==
Bij het {{Wp|Toetsenbord (computer)|toetsenbord}} geldt ongeveer hetzelfde zoals bij de muizen: vooral gamers en grafici zullen hogere eisen stellen. Een belangrijk verschil is wel dat een toetsenbord een eigen indeling kent, zoals {{Wp|AZERTY|AZERTY}} (bv. in België) of {{Wp|QWERTY|QWERTY}} (bv. in Nederland). De AZERTY-indeling wordt wereldwijd amper gebruikt.
<gallery>
File:Pc105 wide delete tall enter xfree86 belgium keyboard full size.png|AZERTY lay-out
File:Pc104 wide delete short enter xfree86 us keyboard full size.png|QWERTY lay-out
File:LenovoKeyboard.jpg|QWERTY-toetsenbord
File:Apple Adjustable Keyboard.jpg|Ergonomisch toetsenbord
</gallery>
== Printer ==
Een {{Wp|Printer|printer}} is een apparaat dat de uitvoer van een computer, scanner of digitale camera afdrukt. De meest bekende soorten:
* De {{Wp|Inkjetprinter|inkjetprinter}} gebruikt vloeibare inkt, die op het papier 'gesproeid' wordt. Het voordeel van de inkjettechnologie is dat de printers goedkoop gemaakt kunnen worden en fraaie resultaten kunnen laten zien. Vele leveranciers verkopen de printer goedkoop en verdienen aan de dure inktpatronen.
* De {{Wp|Laserprinter|laserprinter}} drukt tekst en afbeeldingen af door toner (zwart of gekleurd poeder) aan het papier te hechten. De meeste toners hebben een hogere printcapaciteit dan inktcartridges. De aanschafprijs lijkt dan hoog - zeker als je voor een kleurenlaserprinter ineens 4 toners moet kopen - maar de prijs per pagina is meestal lager.
* De {{Wp|3D-printer|3D-printer}} kan driedimensionale objecten produceren, meestal a.d.h.v. plastic omdat dit goedkoop is en makkelijk in gebruik. In wat volgt worden vooral de kenmerken van de "gewone" printer besproken.
De resolutie van een {{Wp|Printer|printer}} wordt uitgedrukt in {{Wp|Dots per inch|dots per inch}}, bv. 1200 dpi. Dit lijkt dus goed op de ''pixels per inch'' van een beeldscherm, maar een printer kan door het iets verschuiven van de printkop de ruimte tussen twee dots opvullen. Vandaar hoeft de ppi- en de dpi-waarde niet gelijk te zijn. Als er een verschil is tussen de horizontale en verticale resolutie, zullen er twee waarden worden opgegeven. De snelheid van een printer wordt uitgedrukt in pagina's per minuut (ppm), met vaak een aparte waarde voor zwart-wit versus kleur.
Dé beste printer bestaat niet: bekijk altijd de noden bij het vergelijken. Vergeet zeker niet de prijs van de ''{{Wp|en:Consumables|consumables}}'', nl. de drum of de inktpatronen. Zo kan goedkoop alsnog duurkoop worden. In bedrijven en scholen zal men zo vaak een zwart-wit laserprinter terugvinden, omdat de prijs hiervan per blad het meest voordelige is. Als officieel papier nodig is (bv. met het logo), dan is dit vaak in kleur voorgedrukt en komt de zwart-wit afdruk daar bovenop.
Waar er bij een scherm sprake is van {{Wp|RGB-kleursysteem|RGB}}, wordt bij drukwerk vooral de {{Wp|CMYK|CMYK}}-{{Wp|kleurcodering|kleurcodering}} gebruikt. De basiskleuren zijn ''cyaan'' (blauw), ''magenta'' (roze/paars), ''yellow'' (geel) en ''key'' (zwart). Dit betekent ook dat er bij grafische beeldbewerking soms een vertaling moet gebeuren van de RGB-kleuren, naar een CMYK-spectrum.
<gallery>
Epson-inkjet-printer.jpg|Inkjetprinter
Ink-jet-cartridge.jpg|Inkjetcartridge
Laser_toner_cartridge.svg|Onderdelen laserprinter
Copier-engineerguy.ogv|Werking laserprinter
Color_Laser_Printer_Magnified.jpg|Zoom laserafdruk
Cmyk-rgb.jpg|RGB vs CMYK
MakerBot_ThingOMatic_Bre_Pettis.jpg|3D-printer
Hyperboloid Print.ogv|Werking 3D-printer
</gallery>
== Scanner ==
Een scanner is een invoerapparaat waarmee een object in de echte wereld systematisch afgetast wordt om omgezet te worden in data. Door deze ruime definitie kan je heel wat mogelijkheden bedenken, zoals een flatbedscanner (om gemakkelijk een papier in te scannen), een 3D-scanner (om een 3D-weergave van een object te verkrijgen), een QR- of {{Wp|Barcodescanner|barcodescanner}}, een {{Wp|Lidar|Lidar}} (zodat bv. een auto weet wat er rond zich bevindt), een {{Wp|Magnetic resonance imaging|MRI-scanner }} (om een beeld te krijgen van het inwendige van het lichaam),...
Bij randapparatuur zal de {{Wp|Scanner (grafisch)|grafische scanner}} het meest bekend zijn. Vaak is deze voor consumenten in één multifunctioneel toestel geïntegreerd (met print, scan- en kopieerfuncties). De meeste scanspecificaties zullen duidelijk zijn, eventueel met uitzondering van de kleurdiepte, uitgedrukt in aantal bits. Dit is de bitruimte die wordt gebruikt voor het weergeven van een kleur. Met een bitruimte van 3 bits, zou je slechts 8 (=2³) kleuren kunnen coderen. Naast de kleurdiepte is uiteraard ook de resolutie belangrijk!
<gallery>
Scanner.view.750pix.jpg|Flatbed scanner
Multifunction-Printer.jpg|Multifunctioneel
BASA portable scanner 01.jpg|Draagbare scanner
3D Printshow 2014 London - ZMorph - 3D scanner (14964233160).jpg|3D scanner
</gallery>
== Beamer ==
Een {{Wp|Videoprojector|beamer}} of videoprojector is een projector voor video- of computerbeelden. Een belangrijk kenmerk is {{Wp|Lichtstroom|lichtstroom}} (uitgedrukt in {{Wp|Lumen (eenheid)|lumen}}), omdat het een maat is voor de totale hoeveelheid zichtbaar licht die een lichtbron in alle richtingen uitstraalt. Bij een beamer heeft men het over ANSI-lumen: hoe hoger deze waarde, hoe beter.
Er bestaan verschillende projectietechnieken, zoals LCD, DLP, LED en laser. Bij de uitvoeringen heb je ook short-throw of ultra-short throw. Daarbij wordt de beamer dicht bij het projectiescherm gehangen, zodat je minder kans hebt om het projectiebeeld te hinderen.
Een belangrijke instelling van de beamer is de {{Wp|en:Keystone_effect#Correction|keystone correctie}} (letterlijk ''{{Wp|Sluitsteen|sluitsteen}} correctie''), wat nodig is wanneer de beamer niet recht tegenover het projectievlak staat.
<gallery>
Sample-SP.JPG|LCD
L-Karniesbogen_(keystone).png|Een 'echte' keystone
Keystone.jpg|Keystone
Projector_Screen_Geometry_Throw_Ratio.png|Afstanden
</gallery>
{{Appendix}}
{{Sub}}
efh96dtfvgwbi8m9nx7tdg4fcq2blqj
428241
428235
2026-05-20T11:54:05Z
Erik Baas
2193
als -> of (nl)
428241
wikitext
text/x-wiki
{{Index Computersystemen}}
== Doelstellingen ==
Onderstaande doelstellingen komen in meer of mindere mate aan bod. De <span style="color:lightgrey;">grijze</span> doelstellingen komen hier niet aan bod. Dat zijn bv. praktijkoefeningen die aansluiten bij deze theorie, maar die in dit Wikibook niet behandeld worden. Of bv. theorie die in een ander hoofdstuk wordt behandeld.
Uit het leerplan van '''Applicatie- en Databeheer''' <ref>[https://pro.katholiekonderwijs.vlaanderen/iii-apda-da Leerplan Informatica- en communicatiewetenschappen B + S - 3de graad - D-finaliteit]</ref>, een deel van leerplandoel 23:
* LPD 23: De leerlingen lichten de opbouw en werking van een computersysteem met zijn basiscomponenten en optionele componenten toe.
** <span style="color:lightgrey;">Aansluitingen en connectoren</span>
** Functie van controller en driver
* Lexicon. De basiscomponenten van een computersysteem zijn: <span style="color:lightgrey;">moederbord, processor,intern geheugen (werkgeheugen, cache geheugen, systeemgeheugen, CMOS), koeling, voeding,</span> grafische kaart<span style="color:lightgrey;">, klok</span>.
* Lexicon. De optionele componenten van een computersysteem zijn hardwarecomponenten die dienen voor invoer, uitvoer <span style="color:lightgrey;">of opslag</span>
* <span style="color:lightgrey;">Wenk. Enkel de gangbare actuele basiscomponenten en optionele componenten van een computersysteem worden besproken. Je kan ook sensoren als mogelijk invoerapparaat voor een smartphone behandelen.</span>
Uit het leerplan Toegepaste Informatica van de richting '''Informaticabeheer''' <ref>Meer informatie op [https://ond.vvkso-ict.com/vvksomainnieuw/leerplanpubliek.asp?NR=2015/003 leerplan D/2015/7841/003]</ref>:
* 1.3.1 De functie en belangrijke karakteristieken van de gangbare optionele componenten toelichten, bijvoorbeeld beeldscherm, grafische kaart, muis, toetsenbord, printer, scanner ...
* 1.3.4 De functie van een controller en een driver toelichten.
* 1.3.5 Belangrijke eenheden voor technische specificaties van optionele componenten toelichten, bijvoorbeeld <span style="text-decoration:line-through;">bit, byte, rpm,</span> inch, dpi, ppm, ppi, Hz, <span style="text-decoration:line-through;">bps</span>, ANSI lumen ...
* ''1.4.6 Aan de hand van technische specificaties diverse uitvoeringen van optionele componenten vergelijken.''
Het is niet de bedoeling alle mogelijke randapparatuur uit te leggen of álle aspecten van deze randapparatuur. Sommige aspecten zijn gemakkelijk te begrijpen, bij andere zaken volgt verder extra uitleg. Zo zouden de meeste zaken in (web)winkels over beeldschermen, grafische kaarten, muizen, toetsenborden, printers/scanners en beamers begrepen moeten worden.
== Controller en driver ==
Een driver legt de verbinding tussen de controller en het besturingssysteem. Maar wat is 'driver' en wat is 'controller'?
Een '''controller''' is een stuk hardware dat met het effectieve randapparaat een verbinding legt, waardoor de driver deze kan aansturen. Enkele voorbeelden:
* De geheugencontroller is het stuk hardware dat toegang tot het geheugen controleert.
* Een ''network interface controller'' (NIC).
* Een ''disk controller'', vaak geïntegreerd op de harde schijf zelf.
Een '''{{Wp|en:Device driver|driver}}''' ({{Wp|Stuurprogramma|stuurprogramma}}) is een stuk software dat een verbinding legt tussen de hardware/controller en het besturingssysteem. Het stuurprogramma zorgt er hiermee voor dat de programmeur van een applicatie geen weet hoeft te hebben van de hardware waar zijn applicatie op zal gaan draaien. Op een uniforme manier kan de programmeur het besturingssysteem aanspreken. Het besturingssysteem spreekt vervolgens de hardware aan via het stuurprogramma.
Stel bv. dat je als programmeur je eigen tekstverwerker wilt schrijven, dan zal je geen eigen programmacode schrijven om te kunnen afdrukken. Gezien de verschillende types van printers zou dit heel veel werk zijn. Wat je wel doet is de afdruk-{{Wp|Application programming interface|API}} van het besturingssysteem aanroepen. Deze zal de afdruktaak op zijn beurt doorgeven aan de driver die met de printer overeenkomt. Vervolgens zal de printer de taak afdrukken. Dankzij dit systeem kan je tekstverwerker ook afdrukken naar toekomstige printers, zonder dat je zelf code moet veranderen.
Er zijn verschillende situaties bij het eerste gebruik van randapparatuur:
* Alles werkt perfect ''out-of-the-box'': de benodigde driver zit al in het besturingssysteem.
* Het besturingssysteem merkt dat er nieuwe hardware is, installeert alles automatisch en na een eventuele herstart werkt alles perfect.
* Het werkt, maar niet optimaal. Bv. bij een videokaart waar je bij kantoorwerk optimaal kan werken, maar waarbij je bij het spelen van een spel niet het onderste uit de kan kan halen, alhoewel de videokaart dit wel zou moeten kunnen. Door het besturingssysteem de opdracht te geven om te zoeken naar nieuwe drivers kan je dit misschien oplossen of je gaat zelf op de website van de fabrikant van de videokaart kijken of er geen betere driver te vinden is.
* Het werkt helemaal niet. Dan moet je hopen (''plug and pray'') dat je op de website van de fabrikant een driver voor jouw besturingssysteem vindt. Je kan ook op andere websites kijken, maar wees wantrouwig in wat je allemaal installeert.
Uiteraard hoop je op ''plug and play'', maar soms is het ''plug and pray''. Daar de driver verbinding legt tussen het besturingssysteem en de hardware zullen IT-administrators niet altijd happig zijn om een upgrade van een besturingssysteem te doen, zeker als er geen gangbare hardware wordt gebruikt (bv. ziekenhuizen, ruimteorganisaties,...). De kans bestaat nl. dat de makers van een besturingssysteem hun drivermodel aanpassen, waardoor deze nieuwe manier niet meer overweg kan met de oude drivers. Het gevolg is dat er geen communicatie met de randapparatuur mogelijk is of dat bepaalde functionaliteit niet meer werkt.
<gallery>
Disassembled SyQuest SQ3270S Disk Drive 270MB.jpg|HDD met controller
File:Driverarch.png|Driver architectuur
Hardware driver(ubuntu).png|Ubuntu driver
</gallery>
== Beeldscherm ==
Een {{Wp|Beeldscherm|beeldscherm}} of monitor is een apparaat dat bewegende beelden kan tonen. Het wordt ook gebruikt voor statische beelden die af en toe veranderd worden.
=== De techniek ===
[[Bestand:Pixel_geometry_01_Pengo.jpg|miniatuur|Closeup van pixels]]
Om een beeld op een beeldscherm te kunnen opbouwen worden heel kleine puntjes (de {{Wp|en:Pixel|pixels}}) gemaakt. Als deze voldoende klein zijn en/of worden bekeken vanop een voldoende grote afstand, dan zie je niet de afzonderlijke pixels, maar een beeld. Om kleur te krijgen worden drie subpixels gebruikt die een combinatie kunnen maken van de basiskleuren rood, groen en blauw, kortweg {{Wp|RGB-kleursysteem|RGB}}. Deze RGB-{{Wp|Kleurcodering|kleurcodering}} wordt ook gebruikt op websites om bv. tekst of vlakken een kleur te geven.
Als je leest over de techniek om op ''platte schermen'' iets te kunnen tonen, dan kan oa. je onderstaande tegenkomen:
* {{Wp|Liquid crystal display|LCD}} met een backlight (bv. {{Wp|CCFL|CCFL}} of {{Wp|Tv met led-backlight|LED}} als lichtbron).
* {{Wp|Amoled|Amoled}} heeft een kleiner energieverbruik, maar is helaas ook duurder in vergelijking met LCD. Je zal deze dan ook eerder vinden bij de kleinere schermen (bv. mobiele telefoons, mediaspelers en digitale camera's).
* De {{Wp|Digitale inkt|digitale inkt}} ({{Wp|en:E Ink|E Ink}}) is interessant bij het lezen van e-books, omdat het energieverbruik heel laag is en het nog goed kan gelezen worden bij zonlicht. Of bij ELS ({{Wp|Elektronisch schaplabel|Elektronisch schaplabel}} of {{Wp|en:electronic shelf label|electronic shelf label}}) zodat je prijzen gemakkelijk kan aanpassen zonder dat er veel energieverbruik is. Zo is {{Wp|en:SES-imagotag|SES-imagotag}} een bekende fabrikant.
* Er bestaan nog meer technieken, zoals {{Wp|Plasmascherm|plasma}}, {{Wp|en:Twisted nematic field effect|TN}}- of {{Wp|en:IPS panel|IPS}}-paneel. . <ref>Zie bv. de video [https://www.youtube.com/watch?v=r8Y26Uq07Kw#t=335.871724 IPS vs TN Panel - What's the freaking difference? Comparison and Explanation]</ref> Maar het zou ons te ver leiden om ze allemaal te bespreken.
<gallery>
File:Lcd-engineerguy.ogv|Werking LCD
Image:LCD layers.svg|Opbouw LCD
File:AMOLED.png|Opbouw Amoled
Electronic paper (Side view of Electrophoretic display) in svg.svg|Opbouw digitale inkt
</gallery>
=== Grootte, resolutie, aspect ratio, pixeldichtheid en schaling ===
Volgende kenmerken staan in relatie tot elkaar en zijn belangrijk om te bekijken:
* De grootte van het scherm ({{Wp|en:Display size|display size}}) wordt diagonaal gemeten en uitgedrukt in inch. Een inch is 2,54 centimeter en als je het nameet blijkt het al eens af te wijken van de officiële specificatie (bv. omdat de fabrikant hetgene onder de plastiek rand zit, ook meet). Bij tv's staat het vaak ook in centimeter, omdat de klant zich daar meer bij kan voorstellen dan inch.
* Een {{Wp|Resolutie_(digitale_beeldverwerking)|resolutie}} wordt uitgedrukt als <code>breedte×hoogte</code>. Zo betekent 1920x1080 dat er 1920 pixels in de breedte en 1080 pixels in de hoogte zijn. Er is dus een totaal van 2.073.600 pixels. Een LCD-scherm is gemaakt voor een optimale resolutie, maar via de instellingen van het besturingssysteem kan je dit wijzigen. Vaak merk je echter dat het geen optimale resolutie is. In theorie kan om het even welke resolutie, maar in de praktijk zijn er enkele {{Wp|en:List of common resolutions|gangbare resoluties}}, waarvan sommige een ''marketingbenaming'' krijgen:
** 2K verwijst naar ongeveer 2000 pixels in de breedte. Bv. 1920×1080 (Full HD of FHD) of 2048×1080 (DCI 2K).
** 4K verwijst naar ongeveer 4000 pixels in de breedte. Bv. 3840×2160 (4K UHD) of 4096×2160 (DCI 4K).
** 8K verwijst naar ongeveer 8000 pixels in de breedte. Bv. 7680×4320 (8K UHD).
* De {{Wp|Beeldverhouding|beeldverhouding}} ({{Wp|en:Display_aspect_ratio|aspect ratio}}) is de verhouding tussen de breedte en de hoogte van het beeld. Als je vierkante pixels hebt, dan betekent een resolutie van 1920x1080 een aspect ratio van 16:9. De breuk 1920/1080 kan je nl. vereenvoudigen naar 16/9 door teller en noemer te delen door 120. Merk op dat een resolutie van 1920x1200 met een aspect ratio van 16:10 wordt aangegeven i.p.v. 8:5. Zo herkennen mensen een aspect ratio van 16:9 of 16:10 snel als ongeveer hetzelfde widescreen.
* De {{Wp|Pixeldichtheid|pixeldichtheid}} ({{Wp|en:Pixel density|pixel density}}) is het aantal pixels per inch (ppi). Hoe hoger, hoe beter de beeldkwaliteit.
* De schaling bepaalt hoe groot tekst, apps en andere items zijn. Bij een groot scherm en hoge resolutie kan dit op 100% staan, bij een klein(er) scherm en dezelfde resolutie kan het interessant zijn om dit op 125% te zetten.
<gallery>
Resolution_illustration.png|Effect van resolutie
LCD_screen_sizes.svg|grootte en beeldverhouding
Display resolution and pixel density.png|resolutie en pixeldichtheid
Windows 10 Scale and Layout Settings.jpg|Schaling in Windows
GTK_3.10_resolution_independence_comparison.png|Niet geschaald vs geschaald
Resolution and aspect ratio.gif|Animatie resolutie en aspect ratio
Calibration-test-white.png|Kalibratietest wit
Calibration-test-black.png|Kalibratietest zwart
</gallery>
Om de relatie van resolutie, aspect ratio, pixeldichtheid en schaling te begrijpen, kan je bovenstaande animatie bekijken. Hierin wordt een zwarte lijn onder een hoek van 45° getekend en een vierkant icoontje van 3 op 3.
# Bij een resolutie van 32x20 is de aspect ratio dus 16:10. De lijn is onder een hoek van 45°, het icoontje is een vierkant. Door de lage resolutie zijn de details van het beeld niet goed.
# De resolutie bij de tweede stap wordt verhoogd naar 32x24, dus een aspect ratio van 4:3. De aspect ratio respecteert niet de fysische verhoudingen van het scherm: de lijn is nog steeds schuin, maar niet meer onder een hoek van 45°. Het icoontje blijft een icoon van 3 op 3, maar het is geen vierkant meer.
# De volgende stap is een resolutie van 32x32 en dus een aspect ratio van 1:1. De lijn gaat van de ene naar de andere hoek, maar niet onder een hoek van 45°. Het icoontje is nu nog platter gedrukt.
# Bij de volgende stap wordt de resolutie verhoogd tot 64x40 en hebben we terug de correcte aspect ratio van 16:10. De lijn is terug onder een hoek van 45° en het icoontje is terug een vierkant. Er is meer detail t.o.v. de eerste stap, want als de fysische grootte van het scherm hetzelfde blijft en je verhoogt de resolutie, dan moet bijgevolg de pixeldichtheid vergroten. Toch blijft het hoekige van de lijn zichtbaar (wat kan verbeterd worden door {{Wp|Anti-aliasing|anti-aliasing}}). Het icoontje blijft een vierkant icoon van 3x3, maar is nu wel kleiner.<br>Je voelt aan dat als de resolutie blijft toenemen op eenzelfde schermgrootte, dat tekst en icoontjes zó klein kunnen worden, dat ze te weinig nog de afzonderlijke details kunnen tonen. In dat geval kan het nodig zijn om de schaal aan te passen, bv. naar 125%.
# Bij de laatste stap is de pixeldichtheid hetzelfde als de vorige stap, maar omdat de fysische grootte van het scherm kleiner is, moet de resolutie ook kleiner zijn, nl. 32x20 (zoals bij de eerste stap). Er passen dus evenveel pixels hier of bij de eerste stap, maar de pixels hier zijn wel kleiner. De aspect ratio is 16:10 en respecteert de fysische verhoudingen van het scherm.
Voor het scherm van je gsm zal je geen al te groot scherm willen (want minder mobiel), maar toch een hoge resolutie en pixeldichtheid. Je kijkt nl. op je gsm vanaf een kleine afstand, waarbij je voldoende detail wil zien, zonder de individuele pixels te zien. Voor een tv is de grootte belangrijk en ook de resolutie speelt een rol. De pixeldichtheid mag iets lager zijn, omdat je op een veel grotere afstand van de tv zit t.o.v. je gsm . Zelf al zijn de individuele pixels groter (lage ppi, grote grootte), je zal ze niet afzonderlijk zien door de grote afstand.
=== Refresh rate ===
De {{Wp|Refresh rate|refresh rate}} is het aantal keer per seconde dat weergevende hardware al zijn pixels kan verversen en wordt uitgedrukt in hertz (Hz).
=== Reactietijd ===
De reactietijd ({{Wp|en:Response time (technology)|response time}}) is de tijd die nodig is voor een pixel om te veranderen, gemeten in ms. In principe geldt: hoe lager, hoe beter. Vaak wordt grey-to-grey gemeten, maar er bestaat hiervoor geen standaard.
=== Contrast ===
Van de eigenschap contrast ({{Wp|en:Contrast ratio|contrast ratio}}) bestaat niet echt een officiële manier om het vast te leggen, maar het heeft te maken met hoeveel (grijs)waarden tussen wit en zwart kunnen worden weergegeven. Hoe hoger het getal, hoe beter.
=== Helderheid ===
De {{Wp|Helderheid (beeld)|helderheid}} (brightness) is het aantal {{Wp|Candela (eenheid)|candela}} per vierkante meter (cd/m³), waarbij candela de lichtsterkte weergeeft. Hoe meer cd/m², hoe krachtiger de lichtbron. Hoe hoger het getal, hoe beter.
=== Kijkhoek ===
De kijkhoek ({{Wp|en:Viewing angle|viewing angle}}) is de maximale hoek van waaruit een beeldscherm bekeken kan worden zonder dat dat (veel) verlies van contrast en kleur oplevert. Horizontaal of verticaal kan er sprake zijn van verschillende kijkhoeken.
Voor een tv zal je een zo groot mogelijke kijkhoek willen, maar voor een laptop op de trein zal je deze niet al te groot willen, zodanig dat je relatief privé kan werken. Bij de schermen van een bankautomaat zal men zéker een kleine kijkhoek wensen.
=== Samengevat ===
Bij het kiezen van een LCD-scherm blijken dus heel wat specificaties belangrijk te zijn. Sta ook stil bij het volgende:
* Hecht niet teveel belang aan niet gestandaardiseerde specificaties (bv. contrast, helderheid, kijkhoek), zeker als je vergelijkt tussen verschillende fabrikanten!
* Bekijk waar mogelijk het scherm in het echt, bij voorkeur onder verschillende omstandigheden (zonlicht, verlichting, kijkhoek,…).
* De aansluitingen (HDMI, USB-C, ...) zijn ook belangrijk.
* Al of niet ''touch''? Overweeg of de extra kost voor jouw situatie de moeite waard is.
* De mogelijke instellingen van het scherm kunnen ook belangrijk zijn. Bij sommige kan je je tv instellen voor dynamische, levendige, natuurlijke,… weergave.
* Een gekalibreerd beeldscherm zal bij fotobewerking belangrijk zijn: het beeld op het scherm moet zo goed mogelijk lijken op het beeld dat van de drukpers rolt.
* Het bronmateriaal doet er ook veel toe: als je het “allerbeste” scherm hebt gekocht en je speelt er een YouTube-filmpje op af van lage kwaliteit, dan zal je scherm dat niet plots supergoed weergeven. De extra kost van een 8K-scherm kan zo (voorlopig) de investering niet waard zijn.
== Grafische kaart ==
Alhoewel de term '{{Wp|Videokaart|grafische kaart}}' en '{{Wp|Graphics processing unit|GPU}}' vaak door elkaar worden gebruikt, zijn het toch geen synoniemen. De ''graphics processing unit'' wordt namelijk óp de grafische kaart geplaatst. Zo kunnen twee verschillende grafische kaarten, toch dezelfde GPU gebruiken. Bepaalde specificaties van de GPU ken je al vanuit de hoofdstukken [[Computersystemen/Moederbord|moederbord]], [[Computersystemen/Processor|CPU]] en [[Computersystemen/Geheugen|geheugen]]: klokfrequentie, aantal cores, geheugen, geheugentype, busbreedte,...
<gallery>
File:Nvidia7600GS_TOP.jpg|Grafische kaart
File:6600GT_GPU.jpg|GPU
File:3-way-SLI.jpg|3-way SLI
</gallery>
Net als bij de CPU heeft ook de GPU een soort van 'instructieset'. De bekendste zijn wellicht {{Wp|Microsoft DirectX|DirectX}} of {{Wp|OpenGL|OpenGL}}, omdat dit vaak gebruikt wordt bij het ontwikkelen van spellen. Het gaat verder dan dat, met bv. {{Wp|en:Mantle (API)|AMD Mantle}}, {{Wp|en:FreeSync|AMD FreeSync}}, {{Wp|CUDA|NVIDIA CUDA}}, {{Wp|PhysX|NVIDIA PhysX}}.
De grafische kaart is uiteraard het bekendst voor zijn grafische toepassingen en dan zijn de aansluitingen (HMDI, USB-C, ...) en de maximale resolutie (bv. bij het aansturen van meerdere beeldschermen) heel belangrijk. Omdat een GPU heel goed is in parallelle berekeningen (vandaar het hoge aantal cores), wordt deze soms ook gebruikt voor niet-grafische zaken, bv. wetenschappelijke berekeningen, {{Wp|Bitcoin#Mining_en_controle|bitcoin mining}} of AI-modellen.
== Muis ==
De {{Wp|Muis (computer)|muis}} is een handig hulpmiddel om de positie van een cursor op het beeldscherm veranderen. Dankzij knoppen en een wieltje kan je nog extra handelingen uitvoeren. De meeste specificaties van de muis zullen bekend zijn. Voor het gros van de personen zal een eenvoudige muis voldoen, maar gamers of grafici zullen in het duurdere segment kijken. Voor hen kan nauwkeurigheid (dpi), de polling rate (Hz), de resolutie, de beeldsensor (megapixels) en het aantal knoppen belangrijk zijn.
Er bestaan varianten op de klassieke muis zoals {{Wp|Trackball|trackball}}, {{Wp|Voetmuis|voetmuis}}, {{Wp|Touchpad|touchpad}} of {{Wp|Joystick|joystick}}.
<gallery>
File:5 Tastenmaus Microsoft IntelliMouse Optical Black.jpg|optische vijfknopsmuis
File:Touchpad-Wiki.JPG|touchpad
File:Logitech-trackball.jpg|trackball
File:Joyopis.svg|joystick
</gallery>
== Toetsenbord ==
Bij het {{Wp|Toetsenbord (computer)|toetsenbord}} geldt ongeveer hetzelfde zoals bij de muizen: vooral gamers en grafici zullen hogere eisen stellen. Een belangrijk verschil is wel dat een toetsenbord een eigen indeling kent, zoals {{Wp|AZERTY|AZERTY}} (bv. in België) of {{Wp|QWERTY|QWERTY}} (bv. in Nederland). De AZERTY-indeling wordt wereldwijd amper gebruikt.
<gallery>
File:Pc105 wide delete tall enter xfree86 belgium keyboard full size.png|AZERTY lay-out
File:Pc104 wide delete short enter xfree86 us keyboard full size.png|QWERTY lay-out
File:LenovoKeyboard.jpg|QWERTY-toetsenbord
File:Apple Adjustable Keyboard.jpg|Ergonomisch toetsenbord
</gallery>
== Printer ==
Een {{Wp|Printer|printer}} is een apparaat dat de uitvoer van een computer, scanner of digitale camera afdrukt. De meest bekende soorten:
* De {{Wp|Inkjetprinter|inkjetprinter}} gebruikt vloeibare inkt, die op het papier 'gesproeid' wordt. Het voordeel van de inkjettechnologie is dat de printers goedkoop gemaakt kunnen worden en fraaie resultaten kunnen laten zien. Vele leveranciers verkopen de printer goedkoop en verdienen aan de dure inktpatronen.
* De {{Wp|Laserprinter|laserprinter}} drukt tekst en afbeeldingen af door toner (zwart of gekleurd poeder) aan het papier te hechten. De meeste toners hebben een hogere printcapaciteit dan inktcartridges. De aanschafprijs lijkt dan hoog - zeker als je voor een kleurenlaserprinter ineens 4 toners moet kopen - maar de prijs per pagina is meestal lager.
* De {{Wp|3D-printer|3D-printer}} kan driedimensionale objecten produceren, meestal a.d.h.v. plastic omdat dit goedkoop is en makkelijk in gebruik. In wat volgt worden vooral de kenmerken van de "gewone" printer besproken.
De resolutie van een {{Wp|Printer|printer}} wordt uitgedrukt in {{Wp|Dots per inch|dots per inch}}, bv. 1200 dpi. Dit lijkt dus goed op de ''pixels per inch'' van een beeldscherm, maar een printer kan door het iets verschuiven van de printkop de ruimte tussen twee dots opvullen. Vandaar hoeft de ppi- en de dpi-waarde niet gelijk te zijn. Als er een verschil is tussen de horizontale en verticale resolutie, zullen er twee waarden worden opgegeven. De snelheid van een printer wordt uitgedrukt in pagina's per minuut (ppm), met vaak een aparte waarde voor zwart-wit versus kleur.
Dé beste printer bestaat niet: bekijk altijd de noden bij het vergelijken. Vergeet zeker niet de prijs van de ''{{Wp|en:Consumables|consumables}}'', nl. de drum of de inktpatronen. Zo kan goedkoop alsnog duurkoop worden. In bedrijven en scholen zal men zo vaak een zwart-wit laserprinter terugvinden, omdat de prijs hiervan per blad het meest voordelige is. Als officieel papier nodig is (bv. met het logo), dan is dit vaak in kleur voorgedrukt en komt de zwart-wit afdruk daar bovenop.
Waar er bij een scherm sprake is van {{Wp|RGB-kleursysteem|RGB}}, wordt bij drukwerk vooral de {{Wp|CMYK|CMYK}}-{{Wp|kleurcodering|kleurcodering}} gebruikt. De basiskleuren zijn ''cyaan'' (blauw), ''magenta'' (roze/paars), ''yellow'' (geel) en ''key'' (zwart). Dit betekent ook dat er bij grafische beeldbewerking soms een vertaling moet gebeuren van de RGB-kleuren, naar een CMYK-spectrum.
<gallery>
Epson-inkjet-printer.jpg|Inkjetprinter
Ink-jet-cartridge.jpg|Inkjetcartridge
Laser_toner_cartridge.svg|Onderdelen laserprinter
Copier-engineerguy.ogv|Werking laserprinter
Color_Laser_Printer_Magnified.jpg|Zoom laserafdruk
Cmyk-rgb.jpg|RGB vs CMYK
MakerBot_ThingOMatic_Bre_Pettis.jpg|3D-printer
Hyperboloid Print.ogv|Werking 3D-printer
</gallery>
== Scanner ==
Een scanner is een invoerapparaat waarmee een object in de echte wereld systematisch afgetast wordt om omgezet te worden in data. Door deze ruime definitie kan je heel wat mogelijkheden bedenken, zoals een flatbedscanner (om gemakkelijk een papier in te scannen), een 3D-scanner (om een 3D-weergave van een object te verkrijgen), een QR- of {{Wp|Barcodescanner|barcodescanner}}, een {{Wp|Lidar|Lidar}} (zodat bv. een auto weet wat er rond zich bevindt), een {{Wp|Magnetic resonance imaging|MRI-scanner }} (om een beeld te krijgen van het inwendige van het lichaam),...
Bij randapparatuur zal de {{Wp|Scanner (grafisch)|grafische scanner}} het meest bekend zijn. Vaak is deze voor consumenten in één multifunctioneel toestel geïntegreerd (met print, scan- en kopieerfuncties). De meeste scanspecificaties zullen duidelijk zijn, eventueel met uitzondering van de kleurdiepte, uitgedrukt in aantal bits. Dit is de bitruimte die wordt gebruikt voor het weergeven van een kleur. Met een bitruimte van 3 bits, zou je slechts 8 (=2³) kleuren kunnen coderen. Naast de kleurdiepte is uiteraard ook de resolutie belangrijk!
<gallery>
Scanner.view.750pix.jpg|Flatbed scanner
Multifunction-Printer.jpg|Multifunctioneel
BASA portable scanner 01.jpg|Draagbare scanner
3D Printshow 2014 London - ZMorph - 3D scanner (14964233160).jpg|3D scanner
</gallery>
== Beamer ==
Een {{Wp|Videoprojector|beamer}} of videoprojector is een projector voor video- of computerbeelden. Een belangrijk kenmerk is {{Wp|Lichtstroom|lichtstroom}} (uitgedrukt in {{Wp|Lumen (eenheid)|lumen}}), omdat het een maat is voor de totale hoeveelheid zichtbaar licht die een lichtbron in alle richtingen uitstraalt. Bij een beamer heeft men het over ANSI-lumen: hoe hoger deze waarde, hoe beter.
Er bestaan verschillende projectietechnieken, zoals LCD, DLP, LED en laser. Bij de uitvoeringen heb je ook short-throw of ultra-short throw. Daarbij wordt de beamer dicht bij het projectiescherm gehangen, zodat je minder kans hebt om het projectiebeeld te hinderen.
Een belangrijke instelling van de beamer is de {{Wp|en:Keystone_effect#Correction|keystone correctie}} (letterlijk ''{{Wp|Sluitsteen|sluitsteen}} correctie''), wat nodig is wanneer de beamer niet recht tegenover het projectievlak staat.
<gallery>
Sample-SP.JPG|LCD
L-Karniesbogen_(keystone).png|Een 'echte' keystone
Keystone.jpg|Keystone
Projector_Screen_Geometry_Throw_Ratio.png|Afstanden
</gallery>
{{Appendix}}
{{Sub}}
owjm52slk2wq0hctvt8xbxhd4lj9bbd
Kookboek/Bearnaisesaus
0
39104
428156
402845
2026-05-20T05:33:17Z
Erik Baas
2193
lf
428156
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Bearnaise (cropped).JPG|300px]]
| Categorie = Saus
| Porties = 6-8
| Energie =
| Tijd = 45 minuten
| Stippen = 4
}}
==Ingrediënten==
* 2 deciliter droge {{Kb|witte wijn}}
* 2 deciliter witte wijnazijn
* 1 theelepel witte {{Kb|p=peper|peperkorrels}}
* 10 takjes {{Kb|dragon}}
* een teen knoflook
* 2 stuks gesnipperde sjalot
* 6 {{Kb|p=ei|eidooiers}}
* 300 gram gesmolten {{Kb|boter}}
* 50 gram gehakte dragonblaadjes
* 50 gram gehakte {{Kb|kervel}}
* peper en zout
* een eetlepel noilly prat (Franse, droge vermout)
==Bereidingswijze==
* Doe de wijn, azijn, peperkorrels, dragonstengels, knoflookteen en de gesnipperde sjalotten in een pan en kook dit in tot 1 decilter.
* laat dit even staan om de smaken door te laten trekken (dit is de gastrique)
* laat ondertussen de boter smelten
* passeer de gastrique door een fijne zeef
* voeg de eidooiers toe aan de gastrique
* verwarm onder voortdurend kloppen de gastrique
* zorg dat de gastrique luchtig geklopt word tot ongeveer 70 graden celcius en gaat binden
* als de gastrique en eidooier op temperatuur zijn, voeg dan beetje bij beetje de gesmolten boter toe
* voeg pas boter toe als de vorige boter is opgenomen
* hak de kervel en dragon fijn en voeg dit toe aan de saus
* Breng de saus op smaak met peper, zout en de noilly prat
* hou de saus lauwwarm om schiften of stollen te voorkomen.
== Bewaren ==
Aangezien bearnaisesaus niet kan worden opgewarmd, heeft het geen zin een restje te bewaren. Maak dus niet teveel saus.
{{Navigatie recepten}}
[[Categorie:Saus|Bearnaisesaus]]
{{Sub}}
igumtbo86jdqo8aijwywwfv7dqzhk73
Kookboek/Friet-ei
0
39286
428159
402491
2026-05-20T05:33:22Z
Erik Baas
2193
lf
428159
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding=[[Bestand:Eierbal.jpg|300px]]
| Onderschrift = Eierbal
| Naam = Kookboek/friet-ei
| Categorie = Snack
| Porties = 4 tot 10
| Energie = -
| Tijd = 20 minuten voorbereiding, 3-5 minuten bakken
| Stippen = 3
}}
[[Kookboek/Snacks|Snacks]] | [[Kookboek/Recepten|Receptenindex]]
Een friet-ei — in Groningen bekend onder de naam eierbal — is een snack die bestaat uit een half gekookt {{Kb|ei}}, dat verpakt in [[Kookboek|ragout]] en {{Kb|paneermeel}} is gefrituurd.
==Ingrediënten==
{| class="wikitable"
|-
! Aantal Frieteieren !! 6 !! 8 !! 10 !! 4
|-
| Eieren || 3 || 4 || 5 || 2
|-
| Boter (gram) || 100 || 135 || 170 || 70
|-
| Meel (gram) || 100 || 135 || 170 || 70
|-
| Bouillonblok || 1 || 1,5 || 1 2/3 || 2/3
|-
| Kerriepoeder || +/- 3 theelepels || +/- 4 theelepels || +/- 5 theelepels || +/- 2 theelepels
|-
| Water (ml)|| Voorbeeld || Voorbeeld || Voorbeeld || Voorbeeld
|-
| Voorbeeld || 150 || 200 || 250 || 100
|}
Overig: meel, geklopt ei, paneermeel (verkruimeld beschuit)
==Bereidingswijze==
Kook de eieren hard. Smelt de boter zacht in een kleine steelpan. Voeg het meel toe en daarna de kerriepoeder. Klopt goed met een garde en laat het geheel een paar minuten zacht bakken. Los de bouillonblok op in water en voeg dit in scheutjes, al kloppend met het garde toe aan het meel. Het geheel komt een beetje los van de bodem en pakt wat samen. Haal de pan van het vuur. Laat het mengsel afkoelen.
Snijd de gekookte eieren doormidden. Weeg +/- 48-50 gram van het mengsel af en pak het ei goed ermee in. Pak vervolgens 3 borden voor het meel, ei en paneermeel. Rol het ei vervolgens goed in het meel, ei en paneermeel (in deze volgorde). Laat de eieren even rusten in de koelkast.
==Afbakken==
Bak de frieteieren mooi bruin in 3-5 min in een frietpan op 170 graden.
==Opmerkingen, tips, variaties==
* Ongebakken frieteieren kunnen 2 dagen bewaard worden in de koelkast. Frieteieren invriezen kan, maar gaat iets ten koste van de smaak.
* Het (Venlose) friet-ei en de Groningse eierbal vertonen veel overeenkomsten. Daarom worden in dit kookboek de recepten voor beide op deze éne pagina beschreven. Eventuele verschillen kunnen worden opgenomen in een paragraaf "Varianten".
{{Navigatie recepten}}
[[Categorie:Snack|Friet-ei]]
[[Categorie:Eierrecept|Friet-ei]]
{{Sub}}
nvvgcamiyr0yzcrkoksmfl4g4vf45k1
Kookboek/Kweeperengelei
0
39605
428165
397532
2026-05-20T05:33:30Z
Erik Baas
2193
lf
428165
wikitext
text/x-wiki
{{Infobox recept
|Naam=Kweeperengelei
|Afbeelding=[[Bestand:Cotignac ou gelée de coing.jpg|300px|Kweperengelei]]
|Categorie=Dessert
|Porties=
|Energie=
|Tijd=3 uur + wachttijd
|Stippen=2
}}
[[Kookboek/Nagerecht|Dessert]] | [[Kookboek/Recepten|Receptenindex]]<br>
==Ingrediënten==
*Kweeperen
*Geleisuiker
==Bereidingswijze==
#Maak de kweeperen goed schoon met heet water en een borstel
#Snijd de kweeperen in stukken
#Doe de gesneden kweeperen inclusief de pitten in een grote pan
#Voeg zoveel water toe dat de kweeperen nét onder water staan.
#Breng het water aan de kook
#Laat zachtjes doorkoken tot de kweeperen heel erg zacht geworden zijn. Dat duurt ongeveer 3 uur
#Zet een lege grote pan of schaal klaar, met daarboven een vergiet die bekleed is met een oude theedoek of met kaasdoek
#Giet de hete massa over in de vergiet
#Doe de theedoek dicht en laat het geheel uitlekken, zet er een gewicht op om alle vloeistof zoveel mogelijk uit te persen
#Maak de gebruikte pan schoon
#Zet heel goed schoongemaakte - bij voorkeur gesteriliseerde - weckpotten of jampotten klaar om te vullen, zie [[Kookboek/Inmaken|Inmaken]]
#Zoek een goed schoongemaakte pollepel en een goed schone maatbeker, want er moet vanaf nu hygiënisch gewerkt worden
#Doe de vloeistof weer terug in de pan met behulp van een maatbeker en bepaal de hoeveelheid gezeefde vloeistof
#Voeg aan de gezeefde vloeistof in de pan geleisuiker toe, volgens de gebruiksaanwijzing op het pak geleisuiker
#Kook de gezeefde vloeistof even door, onderwijl goed roeren.
#Vul de potten met de hete gelei
#Doe de potten goed dicht en laat ze afkoelen
== Fotogalerij ==
<gallery widths="180" heights="100">
Bestand:Gesneden kweeperen.jpg|De peren snijden
Bestand:Kweeperen koken (start).jpg|Gesneden kweeperen in de pan met water
Bestand:Kweeperen koken (na 90 minuten).jpg|Na 90 minuten koken
Bestand:Kweeperen koken (na 180 minuten).jpg|Na 180 minuten koken
Bestand:Langdurig gekookte kweeperen laten uitlekken.jpg|Laten uitlekken in vergiet met theedoek
Bestand:Kweeperen laten uitlekken met een pan water als gewicht.jpg|Laten uitlekken in vergiet
Bestand:Kweeperengelei. Het sap koken met geleisuiker.jpg|Het gezeefde sap koken met geleisuiker
Bestand:Kweeperengelei.jpg|De gevulde potten
</gallery><br>
==Toepassingen==
Gebruik de gelei op gebak, als broodbeleg of in desserts.
{{Wikipedia
|Pagina= Kweepeer
|Naam= Kweepeer)
}}
{{Navigatie recepten}}
[[Categorie:Dessert|Kweeperengelei]]
[[Categorie:Zoet broodbeleg|Kweeperengelei]]
{{Sub}}
5jswlkl8r4dpohzwbn0p09h65rz7g33
Kookboek/Christmas pudding
0
39666
428161
398649
2026-05-20T05:33:27Z
Erik Baas
2193
lf
428161
wikitext
text/x-wiki
[[Bestand:Plum pudding.jpg|thumb|Christmas pudding]]
'''Christmas pudding'''
=== Recept ===
:Ingrediënten
:200 g rozijnen
:300 g krenten
:200 g blanke rozijnen
:350 g harde boter, geraspt
:200 g broodkruim
:½ sinaasappel, schoon geboend en geraspt
:2 theelepels kaneelpoeder
:1 zakje amandelen (55 g), gehakt
:75 g bloem
:200 ml melk
:3 eieren
:100 ml brandy
:1 citroen, schoon geboend en schil geraspt en geperst
:nootmuskaat naar smaak
===Bereidingswijze===
Voeg alle bovenstaande ingrediënten samen in een puddingvorm. Vervolgens meng je de ingrediënten met een mixer tot een glad geheel. Verstop het muntje ergens in de pudding en dek de vorm dan af met bakpapier. Kook een laagje water in een pan en zet de pan met puddingvorm en al op een laag vuurtje. Laat de pudding in zeven uur gaar stomen. Haal de pudding uit de vorm en bewaar hem in een afgesloten blik tot Kerstmis.
Vet de puddingschaal in met zonnebloemolie. Rasp de citroen boven de puddingschaal zodat er overal een beetje rasp zit. Schenk de maple siroop onderin de vorm. Pureer de gedroogde cranberries en de pruimen met een derde van de whisky. Roer de boter met de suiker luchtig. Klop één voor één de eieren erdoor. Voeg de vruchtenpuree toe en meng tot een gladde massa. Spatel het zelfrijzend bakmeel, de bakpoeder en de kaneelpoeder erdoorheen. Schenk de massa in de puddingschaal. Dek de schaal af met bakpapier en aluminiumfolie en bind het vast met touw.
Zet een pan op het vuur met een ring of een stenen bakje op de bodem om ervoor te zorgen dat de pudding niet aan kan bakken. Zet de gevulde puddingschaal op de ring of bakje en schenk tot 5 centimeter onder de rand van de puddingvorm heet water in de pan. Leg een deksel op de pan en kook de pudding op middelhoog vuur circa 1 uur en 30 minuten. Laat de pudding circa 20 minuten afkoelen in de in de vorm voor je hem stort. Zet de pudding op een mooie schaal. Verwarm de overgebleven whisky circa 1 minuut. Overgiet de pudding en flambeer eventueel aan tafel. Garneer met een takje hulst.
{{Navigatie recepten}}
[[Categorie:Cake, gebak en taart|{{SUBPAGENAME}}]]
[[Categorie:Feestdagrecept|Christmas pudding]]
{{Sub}}
ktyzndijtib9i4syk4lsowugrzivme8
Kookboek/Escargotrecepten
0
40019
428164
396035
2026-05-20T05:33:30Z
Erik Baas
2193
lf
428164
wikitext
text/x-wiki
'''Escargotrecepten'''
Slakken zijn in de volgende vormen te verkrijgen:
*Levend, verzameld uit de natuur of van een slakkenkweker.<br>
*In pot of blik, met een primaire voorbereiding vergelijkbaar als met vlees, gevogelte, en vis: klaar voor het koken;<br>
*Kant-en-klare maaltijd (meestal ingevroren), wanneer het alleen opgewarmd hoeft te worden.
In geval van levende slakken, dient de volgende voorbereiding in acht genomen te worden: [[Slacht en bereiding van levende slakken]].
In geval van slakken in pot of blik, dan kan direct met het recept naar keuze gekookt worden.
Gerecht: [[Kookboek/Escargot a la Bourguignonne/Escargot a la Bourguignonne]]<br>
Type gerecht: aperitief/entrée.<br>
Slakkensoort: Traditioneel wijngaardslak, maar alle soorten kunnen<br>
Oorsprong: In 1796 uitgevonden door pere Vallée, een Franse priester; om vervolgens in 1814 door Talleyrand aan Tsaar Alexander I van Rusland te worden aangeboden gedurende een diner.<br>
Gerecht: [[Kookboek/Marrokaanse slakkensoep/Marrokaanse slakkensoep]]<br>
Type gerecht: soep.<br>
Slakkensoort: Kleine slakken uit de natuur.<br>
Oorsprong: Marokko, traditioneel streetfood.<br>
== Fotogalerij ==
<gallery widths="250" heights="180">
Escargot à la Bourguignonne - eatingeast.jpg|Escargot à la Bourguignonne
Escargot de Bourgogne à la franc-comtoise 002.jpg|Escargot de Bourgogne à la franc-comtoise
</gallery>
{{Navigatie recepten}}
[[Categorie:Franse keuken|Escargot]]
[[Categorie:Vleesrecept|Escargot]]
{{Sub}}
qjpb21ga6o4rbjd184l94r9it7098pb
428172
428164
2026-05-20T05:34:04Z
Erik Baas
2193
lf
428172
wikitext
text/x-wiki
'''Escargotrecepten'''
Slakken zijn in de volgende vormen te verkrijgen:
*Levend, verzameld uit de natuur of van een slakkenkweker.<br>
*In pot of blik, met een primaire voorbereiding vergelijkbaar als met vlees, gevogelte, en vis: klaar voor het koken;<br>
*Kant-en-klare maaltijd (meestal ingevroren), wanneer het alleen opgewarmd hoeft te worden.
In geval van levende slakken, dient de volgende voorbereiding in acht genomen te worden: [[Slacht en bereiding van levende slakken]].
In geval van slakken in pot of blik, dan kan direct met het recept naar keuze gekookt worden.
Gerecht: [[Kookboek/Escargot a la Bourguignonne/Escargot a la Bourguignonne]]<br>
Type gerecht: aperitief/entrée.<br>
Slakkensoort: Traditioneel wijngaardslak, maar alle soorten kunnen<br>
Oorsprong: In 1796 uitgevonden door pere Vallée, een Franse priester; om vervolgens in 1814 door Talleyrand aan Tsaar Alexander I van Rusland te worden aangeboden gedurende een diner.<br>
Gerecht: [[Kookboek/Marrokaanse slakkensoep|Marokaanse slakkensoep]]<br>
Type gerecht: soep.<br>
Slakkensoort: Kleine slakken uit de natuur.<br>
Oorsprong: Marokko, traditioneel streetfood.<br>
== Fotogalerij ==
<gallery widths="250" heights="180">
Escargot à la Bourguignonne - eatingeast.jpg|Escargot à la Bourguignonne
Escargot de Bourgogne à la franc-comtoise 002.jpg|Escargot de Bourgogne à la franc-comtoise
</gallery>
{{Navigatie recepten}}
[[Categorie:Franse keuken|Escargot]]
[[Categorie:Vleesrecept|Escargot]]
{{Sub}}
bqb41szk3dtl5u2rf0md0iv8vhhvtfa
428173
428172
2026-05-20T05:35:26Z
Erik Baas
2193
lf
428173
wikitext
text/x-wiki
'''Escargotrecepten'''
Slakken zijn in de volgende vormen te verkrijgen:
*Levend, verzameld uit de natuur of van een slakkenkweker.<br>
*In pot of blik, met een primaire voorbereiding vergelijkbaar als met vlees, gevogelte, en vis: klaar voor het koken;<br>
*Kant-en-klare maaltijd (meestal ingevroren), wanneer het alleen opgewarmd hoeft te worden.
In geval van levende slakken, dient de volgende voorbereiding in acht genomen te worden: [[Slacht en bereiding van levende slakken]].
In geval van slakken in pot of blik, dan kan direct met het recept naar keuze gekookt worden.
Gerecht: [[Kookboek/Escargot a la Bourguignonne|Escargot a la Bourguignonne]]<br>
Type gerecht: aperitief/entrée.<br>
Slakkensoort: Traditioneel wijngaardslak, maar alle soorten kunnen<br>
Oorsprong: In 1796 uitgevonden door pere Vallée, een Franse priester; om vervolgens in 1814 door Talleyrand aan Tsaar Alexander I van Rusland te worden aangeboden gedurende een diner.<br>
Gerecht: [[Kookboek/Marokkaanse slakkensoep|Marokkaanse slakkensoep]]<br>
Type gerecht: soep.<br>
Slakkensoort: Kleine slakken uit de natuur.<br>
Oorsprong: Marokko, traditioneel streetfood.<br>
== Fotogalerij ==
<gallery widths="250" heights="180">
Escargot à la Bourguignonne - eatingeast.jpg|Escargot à la Bourguignonne
Escargot de Bourgogne à la franc-comtoise 002.jpg|Escargot de Bourgogne à la franc-comtoise
</gallery>
{{Navigatie recepten}}
[[Categorie:Franse keuken|Escargot]]
[[Categorie:Vleesrecept|Escargot]]
{{Sub}}
gs3qp6td7nbb3mu9672lpdvsgssq8m8
Kookboek/Indiase Dahl
0
40081
428160
397195
2026-05-20T05:33:24Z
Erik Baas
2193
lf
428160
wikitext
text/x-wiki
{{Infobox recept
| Afbeelding = [[Bestand:Daal after Tadka Pulse Soup India.jpg|300px]]
| Naam = Kookboek/Indiase Dahl
| Categorie = Bijgerecht
| Porties = 4-6
| Energie =
| Tijd = 60 minuten
| Stippen = 3
}}
=== Benodigdheden ===
* Hogedrukpan om de linzen en groenten te koken
* Koekenpan of wokpan om de tarka (kruidenmix en ui, knoflook, tomaatmengsel) in te bakken
* Snijplank en koksmes
=== Ingrediënten ===
* 250-300 gram dahl (gele linzen, channa dahl, hele mung bonen of andere 'grote' dahl)
* 3 grote tomaten
* 1 rode {{Kb|paprika}}
* 1 {{Kb|courgette}}
* 1 {{Kb|aubergine}} (evt)
* 2 groene chili pepers (heel of gehalveerd als je de zaadjes eruit wilt hebben)
* 1 of 2 el verse gehakte {{Kb|gember}}
* 1 of 2 fijgesneden uien
* 1 of 2 fijngesneden teentjes knoflook
* 2x 1/2 tl geelwortel (turmeric)
* 1/2 tl curry Madras, chana dahl masala of vergelijkbare kruidenmix
* 1/2 tot 1 tl mosterdzaad
* 1/2 tot 1 tl korianderzaad
* 1/2 tot 1 tl {{Kb|komijnzaad}}
* 5-10 zwarte peperkorrels
* 2-5 curry blaadjes
* 2 el verse koriander
* 1/2 limoen of citroen
* 2 tl zout
=== Werkwijze ===
# Was de dahl een beetje in de snelkookpan door ze een paar keer te spoelen. Doe er dan ruim water bij. Ongeveer twee keer zoveel als het volume van de dahl. Later kan er evt nog water bij als de dahl erg dik is.
# Snijd de paprika in twee of drie of stukken en verwijder de steel en zaadlijsten. Snijd de steel en het harde stukje aan de bolle kant van de courgette en aubergine (deze mogen heel blijven) Doe de groenten bij de dahl. Rasp de gember gelijk in de snelkookpan (grof). Doe de peperkorrels bij het geheel en een halve tl turmeric/geelwortel, sluit de pan af en breng aan de kook. Voeg <u>geen</u> zout toe. Dit kan de linzen 'taai' maken.
# Zodra de snelkookpan druk laat onsnappen kan het vuur wat lager en kook je het geheel nog een half uur tot drie kwartier rustig door. Hoe groter de dahl of bonen, hoe langer het moet koken. Bij kleinere dahl is 20 minuten waarschijnlijk al genoeg. Zeker als je ze niet helemaal tot moes wilt koken. Voor de zekerheid kun je na 30 minuten even kijken hoe ze er aan toe zijn.
# Doe ondertussen wat olie (paar el) in een bakpan op middelhoog vuur. Voeg het mosterdzaad toe als de olie heet is en voeg zodra dit begint te sputteren het korianderzaad, groene peper en curryblad toe. Bak dit even mee en voeg dan de fijngesneden ui toe en ook het komijnzaad. Als de ui wat geel wordt kan de knoflook erbij en op het moment dat het mengsel goudbruin is kan de andere halve tl geelwortel en evt. andere kruidenpoeder(s) toegevoegd worden. Bak deze even mee (niet te lang) en voeg dan de tomaatblokjes toe.
# Zodra de olie zich afscheidt, is de tarka klaar. De inhoud van de snelkookpan kan nu toegevoed worden aan de tarka (of andersom als de bakpan te klein is. Zout en geperste citroen of limoen en korianderblad toevoegen en even doorroeren.
NB Als je gedroogd curryblad gebruikt, dan is het beter om deze samen met de tomaat aan de tarka toe te voegen. Anders bestaat de kans dat ze verbranden.
== Fotogalerij ingrediënten ==
<gallery widths="160" heights="130">
Kamdi pappu.JPG|Dahl/gele linzen
Tomato je.jpg|Tomaten
Red bell pepper.jpg|Paprika
Courgette Cucurbita pepo.jpg|Courgette
Green Chilly.jpg|Groene peper
Ginger Root Display.JPG|Gember
Onions.jpg|Uien
Garlic.JPG|Knoflook
Turmeric_Powder.jpg|Geelwortel
Black mustard seeds (closeup).jpg|Mosterdzaad
Coriander Seeds.jpg|Korianderzaad
Cumin seed whole.JPG|Komijnzaad
Black_Pepper_IMG_4866_-_02.jpg|Zwarte peper
Murraya koenigii leaves - curry leaves.jpg|Curryblad
Coriander 01.jpg|Verse koriander
Lime CDC.jpg|Limoen
</gallery>
{{Navigatie recepten}}
[[Categorie:Indiase keuken|Dahl]]
[[Categorie:Bijgerecht|Dahl]]
[[Categorie:Groentenrecept|Dahl]]
[[Categorie:Peulvruchtrecept|Dahl]]
{{Sub}}
c0zs8sl7udgdbqs4iv59xu23bqy2iqs
Kookboek/Heet bier
0
40082
428169
394659
2026-05-20T05:33:32Z
Erik Baas
2193
lf
428169
wikitext
text/x-wiki
[[Kookboek/Drank|Overzicht van beschreven drankrecepten]]<br>
'''Heet bier''' (Gronings: ''haitbier'') is een typisch Gronings streekgerecht (drankje).
== Ingrediënten ==
* 2 eieren
* 125 g {{Kb|p=basterdsuiker|bruine suiker}}
* 1 liter lagerbier
* 2 {{Kb|p=kruidnagel|kruidnagels}}
* 10 cm {{Kb|p=kaneel|pijpkaneel}}
* mespuntje zout
* ½ citroenschil
* 1 deciliter rum of brandewijn
== Bereiding ==
Een drankje dat weer leven brengt in de verkleumde lijven van schaatsenrijders en postbodes. Laat het bier met de kruidnagels een tijdje trekken. Roer de eieren met de suiker los en voeg het hete bier er al roerend aan toe. Voorzichtig! Zet dit alles op het vuur en blijf roeren tot de massa gebonden is. Pas op, want het mag niet koken. Neem dan de pan van het vuur en voeg zout en rum toe. Een koppig drankje, dat wel.
{{Navigatie recepten}}
[[Categorie:Drank|Heet bier]]
[[Categorie:Nederlands streekgerecht|Heet bier]]
{{Sub}}
1q79g5rjosaib5jg8bqiu57gvitati4
Kookboek/Tomatenrijst
0
40118
428171
417929
2026-05-20T05:33:37Z
Erik Baas
2193
lf
428171
wikitext
text/x-wiki
{{Infobox recept
| Naam = Tomatenrijst
| Afbeelding = [[Bestand:Rijst met courgette, tomaten en gehakt 2025.jpg|300px]]
| Onderschrift = Tomatenrijst met geruld gehakt
| Categorie = Eenpansgerecht
| Porties = 4–5
| Energie =
| Tijd = 1 uur
| Stippen =
}}
'''Tomatenrijst'''
== Ingrediënten ==
*500gr {{Kb|gehakt}}
*2 eetl. ketjap
*1 ei
*3 teentjes knoflook
*1 theelepel kerrie
*½ theelepel sambal
*1 cm gember
*1 kg {{Kb|p=tomaat|tomaten}}
*2 {{Kb|p=courgette|courgettes}}
*300-400 gr {{Kb|rijst}}
*6 eetl. olie
== Bereiding ==
Breng het gehakt op smaak met de ketjap, ei, knoflook, kerrie, sambal en gember, en draai er ballen of rolletjes van. Hoeveel is afhankelijk van het aantal eters en evt. de grootte van de pan. Bak het gehakt in de olie rondom bruin.
Snijd de courgettes in de lengte in vieren en daarna in plakjes of rasp de courgette op de keukenrasp, en doe de stukjes courgette bij de gehaktballen. Snijd de tomaat in plakken of blokjes en doe die ook in de pan. De groente zal veel vocht laten vrijkomen. Laat de tomaat in dat vocht stuk sudderen, totdat er een saus ontstaat. Ook de courgette mag eventueel stuk koken. Roer af en toe door, zodat alles gaar wordt.
Wanneer de saus er als saus uit begint te zien (na ongeveer een half uur of langer), mag de rijst door de saus worden geroerd. De rijst moet wel onder "water" staan, voeg anders een klein beetje water toe. Deze rijst zal het vocht van de saus opnemen en daarin gaar worden. Houd de tijd van de verpakking van de rijst aan. Proef of het gaar is.
== Varianten ==
* Maak geen ballen van het gehakt, maar bak het gehakt (nu zonder ei) rul met een vork of pollepel.
* Vervang de rijst door macaroni of een andere kleine pastasoort (geen lasagne of spaghetti).
* Kook de rijst apart, dat verkort de totale kooktijd met 10 minuten of meer (afhankelijk van de rijstsoort), maar dan is het geen eenpansgerecht meer.
{{Navigatie recepten}}
[[Categorie:Eenpansgerecht|{{SUBPAGENAME}}]]
[[Categorie:Rijstrecept|{{SUBPAGENAME}}]]
[[Categorie:Tomatenrecept|{{SUBPAGENAME}}]]
{{Sub}}
ejefl16kzj954t1va4pztxuxrgpur85
Kookboek/Surinaamse kerrie-aardappelen
0
40367
428163
402671
2026-05-20T05:33:28Z
Erik Baas
2193
lf
428163
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Surinaamse kerrie-aardappelen
| Afbeelding = [[Bestand:Surinaamse kerrie-aardappelen.jpg|300px]]
| Onderschrift = Aardappelen met Hindoestaanse masala
| Categorie = Vegetarisch recept
| Porties = 4
| Energie =
| Tijd = 45 minuten
| Stippen = 3
}}
=== Benodigdheden ===
* Grote wok of hapjespan
* Aardappelschilmes
* Koksmes
* Spatel
=== Ingrediënten ===
* 500 gram geschilde kruimige {{Kb|p=aardappel|aardappelen}}
* 1 grote of 2 kleinere {{Kb|p=ui|uien}}, gesnipperd
* 1-2 eetl. zonnebloemolie
* 1-2 teentjes knoflook
* 1/2 eetl. Hindoestaanse {{Kb|p=kerrie|masala}} (bijv. H. Nandan Masala)
* 1 blokje groentenbouillon
* zout en peper naar smaak
=== Bereidingswijze ===
# Snijd de aardappelen in gelijke stukken niet groter dan een golfbal en houd deze bij de hand.
# Bak de ui in de olie gedurende 2-3 minuten op middelhoog vuur. Pers de knoflook boven de pan en bak deze nog ongeveer 2 minuten mee totdat het geheel lichtbruin/goudbruin is.
# Voeg de masala toe. Bak deze 30 seconden mee om middelhoog vuur. Voeg dan de aardappelen toe en bak het geheel nog een minuut of twee.
# Voeg ongeveer een liter water toe en in elk geval zoveel dat de aardappelen net onder water staan. Voeg nu ook het bouillonblokje toe en voeg tijdens het koken eventueel nog één of twee kopjes water toe om ervoor te zorgen dat de aardappen in voldoende mater onder water blijven staan.
# Kook de aardappelen in ongeveer 20 minuten gaar en prak eventueel een paar aardappelen tot moes om de saus dikker te maken. Serveer met groenten en ei, kruidige tofu of tempé.
{{Navigatie recepten}}
[[Categorie:Aardappelrecept|Surinaamse]]
[[Categorie:Surinaamse keuken|Kerrie-aardappelen]]
[[Categorie:Vegetarisch recept|Surinaamse]]
{{Sub}}
ludy6ylk8r4tlyhr989qdt1cldynj82
Kookboek/Kousenband voor Surinaamse roti
0
40369
428170
409499
2026-05-20T05:33:34Z
Erik Baas
2193
lf
428170
wikitext
text/x-wiki
{{Infobox recept
| Naam =
| Afbeelding = [[Bestand:Asparagus bean fry 2.jpg|300px]]
| Categorie = Vegetarisch recept
| Porties = 4
| Energie =
| Tijd = 30 minuten
| Stippen = 3
}}
== Benodigdheden ==
* Grote wok of hapjespan
* Koksmes
* Spatel
== Ingrediënten ==
[[Bestand:Vigna unguiculata3.jpg|thumb|Kousenband gekocht op de Binnenrotte-markt in Rotterdam|292px]]
* 500 gram {{Kb|kousenband}}
* 1 of 2 sjalotten, fijn gesnipperd
* 1-2 teentjes knoflook
* 1/2 tl. komijnpoeder
* 1/2 blokje groentebouillon opgelost in 250 ml gekookt water
* 1 tl. suiker
* zout en peper naar smaak
=== Bereidingswijze ===
# Was de kousenband en snijd deze in stukken van 3-5 cm. De uiteinden, de laatste 1/2 cm mogen weg.
# Bak de sjalot in 1-2 eetl. zonnebloemolie ongeveer 2 minuten op middelhoog vuur. Pers de knoflook boven de pan en bak deze nog ongeveer 2 minuten mee totdat het geheel goudbruin is.
# Voeg kousenband met het komijnpoeder toe en bak dit 30 seconden mee. Doe dan de bouillon erbij.
# Kook het geheel in totaal 15-25 minuten. Check onderwijl of je vindt dat de kousenband zacht genoeg is.
Serveer met [[Kookboek/Surinaamse kerrie-aardappelen|masala-aardappelen]] en roti en tahoe/tempé/{{Kb|tofu}} of ei.
{{Wikipedia
|Pagina = Kousenband
|Naam = Kousenband
}}
{{Sub}}
{{Navigatie recepten}}
[[Categorie:Surinaamse keuken|Kousenband]]
[[Categorie:Groentenrecept|Kousenband]]
nchd10ucya2y7y7eo18pyocyqys0awj
Kookboek/Tofu voor Surinaamse roti
0
40370
428166
397482
2026-05-20T05:33:31Z
Erik Baas
2193
lf
428166
wikitext
text/x-wiki
{{Infobox recept
|
| Naam = Kookboek/Surinaamse kerrie-aardappelen
| Categorie = Vegetarisch recept
| Porties = 4
| Energie =
| Tijd = 45 minuten
| Stippen = 3
}}
=== Benodigdheden ===
* Koekenpan met goede anti-aanbaklaag
* Koksmes
* Snijplank
* Spatel
=== Ingrediënten ===
[[Bestand:Japanese_SilkyTofu_(Kinugoshi_Tofu).JPG|thumb|Een blok verse of rauwe tofu]]
* 450-500 gram {{Kb|tofu}}/tofoe
* 4-5 el. zonnebloemolie (voor aanbakken)
* 1-2 el.
* 2-3 sjalotjes fijn gesnipperd
* 2-3 teentjes knoflook geperst
* 2 el. ketjap manis
* 2 el. zoute sojasaus
* 2 tl. sambal oelek
* 2 tl. gemberpoeder
* zout en peper naar smaak
=== Bereidingswijze ===
Snijd de tofu in gelijke blokjes van 2-3 cm bij 1-2 cm. Verwarm de olie in de koekenpan en bak de blokjes tofu rondom goudbruin. Schep de gebakken tofu vervolgens op een bord met keukenpapier, zodat het kan uitlekken en afkoelen.
Doe de sjalotjes, knoflook, ketjap manis, zoute sojasaus, sambal oelek, gemberpoeder en evt. zout en peper in een kom en roer dit met een lepel door elkaar. Voeg de gebakken tofu aan de kom met marinade toe en schep het geheel om zodat de marinade gelijkmatig over de blokjes verdeeld is. Laat dit minstens 12 uur in de koelkast staan.
Verwarm olie in een koekenpan. Bak de gemarineerde tofu onder regelmatig omscheppen totdat het door en door warm is (het hoeft niet helemaal knapperig te worden).
Serveer bij Surinaamse roti, bami of nasi.
{{Navigatie recepten}}
[[Categorie:Surinaamse keuken|Tofu]]
[[Categorie:Vegetarisch recept|Tofu]]
{{Sub}}
hdvo9di43679b4re5g6x350o0j6xsw7
Kookboek/Turks brood
0
40653
428167
402788
2026-05-20T05:33:31Z
Erik Baas
2193
lf
428167
wikitext
text/x-wiki
{{Infobox recept
| Naam = Turks brood
| Afbeelding = [[Bestand:Classic Turkish pide.jpg|300px]]
| Categorie = broodgerecht
| Porties =
| Energie =
| Tijd = ± 2 u, 30 m bakken: 15m
| Stippen = 3
}}
Wil je zelf Turks brood bakken? Met dit recept voor Turks brood bak je een heerlijk brood, perfect voor bij de borrel met verschillende dips, bij een kop soep of als basis voor een pizza van Turks brood. Het is een makkelijk brood om te bakken. Hieronder staan ook een paar handige tips waarmee het brood nog lekkerder wordt.
==Ingrediëntenlijst==
Voor het deeg:
*500 gr Amerikaanse {{Kb|p=bloem|patentbloem}}
*7 gr gedroogde {{Kb|gist}}
*325 ml water, lauwwarm
*1½ theelepel suiker
*2 el zonnebloemolie
*10 gr zout
Verder nodig:
*bloem, om te bestuiven
*1 ei losgeklopt
*40 ml melk
*{{Kb|sesamzaad}}
*nigellazaad
== Bereiding ==
Meng de ingrediënten voor het deeg tot een soepel geheel en kneed dit minimaal 10 minuten door. Dit kun je met de hand doen of met een standmixer met deeghaak. Doe het deeg in kom, dek af met plasticfolie en laat het 1 uur rijzen op een warme en tochtvrije plaats.
Bekleed een (bak)plaat met bakpapier en bestuif deze licht met bloem. Stort het deeg op de bakplaat en druk het uit tot een ovaalvormig brood van ongeveer 25×30 centimeter. Laat het deeg 30 minuten rijzen.
Verwarm intussen de oven met ovensteen en stoombakje voor op 230 °C. Heb je deze niet, plaats dan alvast een bakplaat in de oven en een (metalen) braadslee op de bodem van de oven.
Druk na 30 minuten rijzen met je vingers een patroon in het brood, zoals op de foto te zien is. Klop het ei met de melk los en bestrijk het deeg hiermee. Bestrooi het met sesam- en nigellazaad en laat het brood nog 1 uur rijzen.
Schuif het brood met bakpapier en al op de hete ovensteen (of de hete bakplaat) en giet wat water in het stoombakjes (of in de braadslee). Bak het Turks brood in 13-18 minuten goudbruin en gaar. Laat het daarna afkoelen op een rooster.
{{Navigatie recepten}}
[[Categorie:Broodrecept|Turks]]
[[Categorie:Platbrood|Turks]]
{{Sub}}
ca73nip1n9cm8jy5npaz6ww3g0blj4s
Kookboek/Toastjes
0
41956
428168
395345
2026-05-20T05:33:31Z
Erik Baas
2193
lf
428168
wikitext
text/x-wiki
{{Infobox recept
|Afbeelding=[[Bestand:Toastje.jpg|thumb|300px|Toastjes met ansjovis en kaas]]
|Naam=Toastjes
|Categorie=Snack
|Porties=10
|Tijd=5 minuten. Direct opdienen
|Stippen=1
}}
[[Kookboek/Snacks|Snacks]] | [[Kookboek/Recepten|Receptenindex]]
Een '''toastje''' is een droog koekje dat met hartig broodbeleg bij de borrel of tussendoor wordt gegeten. Vaak wordt er {{Kb|kaas}}, [[Kookboek/Worst|worst]], {{Kb|pesto}}, tapenade of [[Kookboek/Vis|vis]] (bijvoorbeeld [[Kookboek/Zalm|zalm]] of [[Kookboek/Ansjovis|ansjovis]]) op een toastje gedaan. Een plakje of stukje camembert wordt weleens op een sesamtoastje gelegd, hetgeen met een glas {{Kb|witte wijn}} een bekende combinatie vormt.
Toastjes worden veelal belegd met verschillende laagjes over elkaar. Bijvoorbeeld een toastje met daarop een stukje kaas met daarop een halve kerstomaat met daarop een toefje {{Kb|mayonaise}}.
Indien een toastje wordt belegd met een [[Kookboek/Salade|salade]] of bijvoorbeeld filet americain, dan moet zeker gesteld worden dat het toastje snel gegeten wordt, anders wordt het zacht.
{{Navigatie recepten}}
[[Categorie:Snack|Toastjes]]
{{Sub}}
83lpp6qkdyhm7tqhckch1my7ylb6gj6
Sjabloon:Pagina's in naamruimte/sub2
10
42711
428010
400703
2026-05-19T12:32:51Z
Erik Baas
2193
link niet afdrukken
428010
wikitext
text/x-wiki
<!--
-->{{#If:{{{1|}}}|<!--
-->{{If|{{{tr|}}}|<tr><td>{{{1}}}</td><td>{{#IfEq:{{{1|}}}|0|(hoofdnaamruimte)|{{Ns:{{{1}}}}}}}</td><td>}}<!--
-->{{#Invoke:functions|pagesInNamespace|{{{1|}}}}}{{Niet afdrukken inline|[https://nl.wikibooks.org/wiki/Speciaal:AllePaginas?namespace={{{1|10}}}  ]}}<!--
-->{{If|{{{tr|}}}|</td></tr>}}<!--
-->}}<noinclude>
[[Categorie:Subsjablonen]]
</noinclude>
cl2jrgrzwj7v2rvfhvyk3s3nb4uqewh
428011
428010
2026-05-19T12:34:05Z
Erik Baas
2193
Versie [[Special:Diff/428010|428010]] van [[Special:Contributions/Erik Baas|Erik Baas]] ([[User talk:Erik Baas|overleg]]) ongedaan gemaakt
428011
wikitext
text/x-wiki
<!--
-->{{#If:{{{1|}}}|<!--
-->{{If|{{{tr|}}}|<tr><td>{{{1}}}</td><td>{{#IfEq:{{{1|}}}|0|(hoofdnaamruimte)|{{Ns:{{{1}}}}}}}</td><td>}}<!--
-->{{#Invoke:functions|pagesInNamespace|{{{1|}}}}}[https://nl.wikibooks.org/wiki/Speciaal:AllePaginas?namespace={{{1|10}}}  ]<!--
-->{{If|{{{tr|}}}|</td></tr>}}<!--
-->}}<noinclude>
[[Categorie:Subsjablonen]]
</noinclude>
mm1e58setd44xscsnx0462i42fpj093
428012
428011
2026-05-19T12:48:14Z
Erik Baas
2193
<span class="noprint">
428012
wikitext
text/x-wiki
<!--
-->{{#If:{{{1|}}}|<!--
-->{{If|{{{tr|}}}|<tr><td>{{{1}}}</td><td>{{#IfEq:{{{1|}}}|0|(hoofdnaamruimte)|{{Ns:{{{1}}}}}}}</td><td>}}<!--
-->{{#Invoke:functions|pagesInNamespace|{{{1|}}}}}<span class="noprint">[https://nl.wikibooks.org/wiki/Speciaal:AllePaginas?namespace={{{1|10}}}  ]</span><!--
-->{{If|{{{tr|}}}|</td></tr>}}<!--
-->}}<noinclude>
[[Categorie:Subsjablonen]]
</noinclude>
rz9uaq5iqqc7az0zs0by31tc2pi6z1j
Help:Wikidata
12
44838
428240
425702
2026-05-20T11:44:37Z
Erik Baas
2193
lf
428240
wikitext
text/x-wiki
<templatestyles src="Wikidata/style.css" />
{{Post-it/Wikidata}}
{{Gebruikt Templatestyles|Wikidata/style.css}}
voorlopig:
*[[d:Wikidata:Introduction/nl]]
*zie [[w:Wikipedia:Wikidata|nl.wikipedia]]
*[[Help:Pagina's die niet gekoppeld zijn aan items]]
*[[d:Wikidata:List_of_properties/nl|Lijst van alle eigenschappen]]
*[[d:Wikidata:Database reports/List of properties/all/nl|Lijst van alle Nederlandstalige properties]]
----
{{Wiu4}}
;Wikidata
:Wikidata is een database met bijna 121 miljoen<!--30 mrt 2026--> items. Elk item heeft een "ID": een "Q" gevolgd door een nummer.<br>
:Bij elk item is een aantal van de 13.336 mogelijke "properties" (eigenschappen)<!--30 mrt 2026--> ingevuld, elk met een ID dat bestaat uit een "P" met een getal.<br>
:Een property kan meer dan één waarde bevatten (denk bv. aan de talen die in een land gesproken worden), deze worden van elkaar onderscheiden door "qualifiers".
;Data opvragen
* <code><nowiki>{{#property:afbeelding}}</nowiki></code> geeft de bestandsnaam van de eigenschap ''afbeelding'' (P18) van het land ''Monaco'' (Q235): <span class="wikidata-property">{{#property:afbeelding|from=Q235}}</span>
* <code><nowiki>{{#statements:afbeelding}}</nowiki></code> geeft een ''afbeeldingslink'', de afbeelding wordt dus meteen zichtbaar: <span class="wikidata-property">{{#statements:afbeelding|from=Q235}}</span>.
:Als de pagina niet gekoppeld is met Wikidata kan "|from=Q235" worden toegevoegd om aan te geven dat er data over Monaco gevraagd wordt:
:*<code><nowiki>{{#property:afbeelding|from=Q235}}</nowiki></code> of
:*<code><nowiki>{{#statements:afbeelding|from=Q235}}</nowiki></code>
;Properties met meer dan een deel:
*<code><nowiki>{{#property:P37}}</nowiki></code> geeft <span class="wikidata-property">{{#property:P37|from=Q39}} (P37 = "officiële taal", Q39 = "Zwitserland")</span><br>
*<code><nowiki>{{#statements:officiële taal}}</nowiki></code> geeft <span class="wikidata-property">{{#statements:officiële taal|from=Q39}}</span>
::NB Merk op dat in dit geval de waarden waarvan op Wikidata een link naar Wikibooks bestaat meteen een aanklikbare ''link'' naar die pagina geven.
;Sjablonen
:Er zijn een paar sjablonen om met de gegevens van Wikidata verder te kunnen werken:
:*{{Tl|Expand monthname}} - vervangt de afgekorte maandnaam in bv. "8 jan 1297" door de volledige naam. (ook niet fool-proof, faalt wanneer alleen een jaartal vermeld is)
:*{{Tl|Gebruikt Wikidata}} - plaatst de sjabloon of pagina in [[:Categorie:Wikibooks:Pagina die Wikidata gebruikt]].
:*{{Tl|IsGekoppeld}} - detecteert of een pagina aan Wikidata gekoppeld is
:*{{Tl|Ontpunt}} - verwijdert punten uit getallen groter dan 999 om verder ''rekenen'' met die waarde mogelijk te maken.
:*{{Tl|Split}} - sommige properties bevatten meer dan een gegeven, deze sjabloon dient om er een van max. 6 te kunnen kiezen.
:*{{Tl|Wd}} - voor een eenvoudiger toepassing van {{#property:}} en {#statements:}}
:Of juist niet:
:*{{Tl|Niet te koppelen}} - tbv. pagina's die beslist ''niet'' aan een Wikidata-item gekoppeld moeten worden.
*Bij het hernoemen of verwijderen van een pagina op Wikibooks wordt een gekoppeld item op Wikidata automatisch aangepast.
Een link naar het item op Wikidata maak je met <code><nowiki>[[d:Q235]]</nowiki></code> (Q235 betreft het land "Monaco").
;krabbels
*voor pagina's die nog niet gekoppeld zijn kun je toch data opvragen, zie <code><nowiki>{{Infobox land|from=Q36}}</nowiki></code> op [[Atlas van Europa/Polen]].
*gekoppelde pagina's geven een link onder "In andere projecten" en mogelijk onder "In andere talen"; zo is deze pagina gekoppeld met item Q28925727.
*{{#statements:P1629|from=P18}}: <span class="wikidata-property">{{#statements:P1629|from=P18}}</span>
*{{#statements:P1629|from=P31}}: <span class="wikidata-property">{{#statements:P1629|from=P31}}</span>
[[Categorie:Help]]
e5x92agpehqv7kxigtn31am5ze1i1d6
Maatschappijleer/Dia/Aandachtsrichter: sociale verschillen
0
45513
428019
423130
2026-05-19T17:36:04Z
Pbuddenberg
15132
428019
wikitext
text/x-wiki
[https://commons.wikimedia.org/wiki/File:2025_Inequality-Adjusted_Human_Development_Index.svg Ongelijkheid wereldkaart] |
[https://www.youtube.com/watch?v=ZsYTF7BpA-U Hoe kansenongelijkheid een leven lang door werkt] |
[[w:Sociale_ongelijkheid|Sociale ongelijkheid]] |
[https://www.scp.nl/actueel/nieuws/2023/03/07/aanzienlijke-verschillen-tussen-sociale-klassen-in-nederland SCP]
[[Bestand:Tax the Rich ! (51982704885).jpg|thumb|upright=2|Op 2 april 2022 vond de tweede van twee grote demonstraties plaats die dat jaar in Londen werden gehouden. De demonstranten wilden hiermee de medeplichtigheid van de overheid aan de stijging van de kosten van levensonderhoud en de toenemende ongelijkheid en armoede aankaarten.]]
<hr>
<p style="font-size:30px;color:green;">SOCIALE VERSCHILLEN</p>
<p style="font-size:16px;">1. Benoem en beschrijf wat we bedoelen met sociale verschillen.</p>
<p style="font-size:16px;">2. Geef voorbeelden van sociale ongelijkheid en leg uit welke gevolgen dit kan hebben.</p>
<p style="font-size:16px;">3. Noem de belangrijkste oorzaken van sociale ongelijkheid en armoede.</p>
<p style="font-size:16px;">4. Leg uit wat de rol van de overheid is als het gaat om het verkleinen van sociale verschillen.</p>
[[Bestand:Плакат. Алексей Радаков. Самодержавный строй.jpg|thumb|upright=1|]]
{{Sub}}
{{Links}}
lrgasupcpk2ki51u58w3fxn8q8vtnnk
Sjabloon:Wikidata/style.css
10
45770
428239
414314
2026-05-20T11:44:18Z
Erik Baas
2193
Erik Baas heeft de pagina [[Help:Wikidata/style.css]] hernoemd naar [[Sjabloon:Wikidata/style.css]] zonder een doorverwijzing achter te laten
414314
sanitized-css
text/css
span.wikidata-property {
background-color: #b0e000;
padding: 0 3px;
}
j1ek70d7r91wrx0ksx0h2a6dawx7ryz
Programmeren in BASIC/Functies
0
46518
428016
427170
2026-05-19T13:53:27Z
Erik Baas
2193
+3
428016
wikitext
text/x-wiki
{{Kolommen automatisch
|columns = 5
|min-width = 12em
|inhoud=
<onlyinclude>
*[[Programmeren in BASIC/Functies/ABS()|ABS()]]
*[[Programmeren in BASIC/Functies/ASC()|ASC()]]
*[[Programmeren in BASIC/Functies/ATN()|ATN()]]
*[[Programmeren in BASIC/Functies/CDBL()|CDBL()]]
*[[Programmeren in BASIC/Functies/CSNG()|CDNG()]]
*[[Programmeren in BASIC/Functies/CHR$()|CHR$()]]
*[[Programmeren in BASIC/Functies/CINT()|CINT()]]
*[[Programmeren in BASIC/Functies/COS()|COS()]]
*[[Programmeren in BASIC/Functies/FRE()|FRE()]]
*[[Programmeren in BASIC/Functies/HEX$()|HEX$()]]
*[[Programmeren in BASIC/Functies/INSTR()|INSTR()]]
*[[Programmeren in BASIC/Functies/INT()|INT()]]
*[[Programmeren in BASIC/Functies/LEFT$()|LEFT$()]]
*[[Programmeren in BASIC/Functies/LEN()|LEN()]]
*[[Programmeren in BASIC/Functies/LOF()|LOF()]]
*[[Programmeren in BASIC/Functies/MID$()|MID$()]]
*[[Programmeren in BASIC/Functies/PEEK()|PEEK()]]
*[[Programmeren in BASIC/Functies/RIGHT$()|RIGHT$()]]
*[[Programmeren in BASIC/Functies/RND()|RND()]]
*[[Programmeren in BASIC/Functies/SGN()|SGN()]]
*[[Programmeren in BASIC/Functies/SIN()|SIN()]]
*[[Programmeren in BASIC/Functies/SPACE$()|SPACE$()]]
*[[Programmeren in BASIC/Functies/SQR()|SQR()]]
*[[Programmeren in BASIC/Functies/STR$()|STR$()]]
*[[Programmeren in BASIC/Functies/TAN()|TAN()]]
*[[Programmeren in BASIC/Functies/VAL()|VAL()]]
</onlyinclude>
}}
{{Wiu5|rechts|35px}}
{{Sub}}
{{Links}}
b9sppe9f2zz2vm8x7xc6pqw8mzpt2dn
428017
428016
2026-05-19T14:10:41Z
Erik Baas
2193
428017
wikitext
text/x-wiki
{{Kolommen automatisch
|columns = 5
|min-width = 12em
|inhoud=
<onlyinclude>
*[[Programmeren in BASIC/Functies/ABS()|ABS()]]
*[[Programmeren in BASIC/Functies/ASC()|ASC()]]
*[[Programmeren in BASIC/Functies/ATN()|ATN()]]
*[[Programmeren in BASIC/Functies/CDBL()|CDBL()]]
*[[Programmeren in BASIC/Functies/CSNG()|CSNG()]]
*[[Programmeren in BASIC/Functies/CHR$()|CHR$()]]
*[[Programmeren in BASIC/Functies/CINT()|CINT()]]
*[[Programmeren in BASIC/Functies/COS()|COS()]]
*[[Programmeren in BASIC/Functies/FRE()|FRE()]]
*[[Programmeren in BASIC/Functies/HEX$()|HEX$()]]
*[[Programmeren in BASIC/Functies/INSTR()|INSTR()]]
*[[Programmeren in BASIC/Functies/INT()|INT()]]
*[[Programmeren in BASIC/Functies/LEFT$()|LEFT$()]]
*[[Programmeren in BASIC/Functies/LEN()|LEN()]]
*[[Programmeren in BASIC/Functies/LOF()|LOF()]]
*[[Programmeren in BASIC/Functies/MID$()|MID$()]]
*[[Programmeren in BASIC/Functies/PEEK()|PEEK()]]
*[[Programmeren in BASIC/Functies/RIGHT$()|RIGHT$()]]
*[[Programmeren in BASIC/Functies/RND()|RND()]]
*[[Programmeren in BASIC/Functies/SGN()|SGN()]]
*[[Programmeren in BASIC/Functies/SIN()|SIN()]]
*[[Programmeren in BASIC/Functies/SPACE$()|SPACE$()]]
*[[Programmeren in BASIC/Functies/SQR()|SQR()]]
*[[Programmeren in BASIC/Functies/STR$()|STR$()]]
*[[Programmeren in BASIC/Functies/TAN()|TAN()]]
*[[Programmeren in BASIC/Functies/VAL()|VAL()]]
</onlyinclude>
}}
{{Wiu5|rechts|35px}}
{{Sub}}
{{Links}}
45xbbk6e4x9qv85272psvk6hgohq31d
428236
428017
2026-05-20T10:30:42Z
Erik Baas
2193
+2
428236
wikitext
text/x-wiki
{{Kolommen automatisch
|columns = 5
|min-width = 12em
|inhoud=
<onlyinclude>
*[[Programmeren in BASIC/Functies/ABS()|ABS()]]
*[[Programmeren in BASIC/Functies/ASC()|ASC()]]
*[[Programmeren in BASIC/Functies/ATN()|ATN()]]
*[[Programmeren in BASIC/Functies/CDBL()|CDBL()]]
*[[Programmeren in BASIC/Functies/CSNG()|CSNG()]]
*[[Programmeren in BASIC/Functies/CHR$()|CHR$()]]
*[[Programmeren in BASIC/Functies/CINT()|CINT()]]
*[[Programmeren in BASIC/Functies/COS()|COS()]]
*[[Programmeren in BASIC/Functies/FRE()|FRE()]]
*[[Programmeren in BASIC/Functies/HEX$()|HEX$()]]
*[[Programmeren in BASIC/Functies/INSTR()|INSTR()]]
*[[Programmeren in BASIC/Functies/INT()|INT()]]
*[[Programmeren in BASIC/Functies/LEFT$()|LEFT$()]]
*[[Programmeren in BASIC/Functies/LEN()|LEN()]]
*[[Programmeren in BASIC/Functies/LOc()|LOC()]]
*[[Programmeren in BASIC/Functies/LOF()|LOF()]]
*[[Programmeren in BASIC/Functies/LOG()|LOG()]]
*[[Programmeren in BASIC/Functies/MID$()|MID$()]]
*[[Programmeren in BASIC/Functies/PEEK()|PEEK()]]
*[[Programmeren in BASIC/Functies/RIGHT$()|RIGHT$()]]
*[[Programmeren in BASIC/Functies/RND()|RND()]]
*[[Programmeren in BASIC/Functies/SGN()|SGN()]]
*[[Programmeren in BASIC/Functies/SIN()|SIN()]]
*[[Programmeren in BASIC/Functies/SPACE$()|SPACE$()]]
*[[Programmeren in BASIC/Functies/SQR()|SQR()]]
*[[Programmeren in BASIC/Functies/STR$()|STR$()]]
*[[Programmeren in BASIC/Functies/TAN()|TAN()]]
*[[Programmeren in BASIC/Functies/VAL()|VAL()]]
</onlyinclude>
}}
{{Wiu5|rechts|35px}}
{{Sub}}
{{Links}}
10mukk1fm2u3dbxkoshfx03ypbzemoq