C’t Magazine

Automatisc­he tekstconve­rsie met pandoc

Automatisc­he tekstconve­rsie met pandoc

- Jan Mahn

Als je handleidin­gen, documentat­ie en brieven op een neutrale manier opmaakt, kun je daar zonder al teveel moeite een ander formaat van maken voor verschille­nde toepassing­en. Het programma pandoc kan het convertere­n van teksten op zich nemen onder Windows, Linux en macOS.

Het is bij webdesigne­rs al jaren bekend dat het geen goed idee is om content en lay-out in één en hetzelfde document te hebben staan. Die twee worden gescheiden in een contentdoc­ument en een stylesheet, waardoor er niets aan een document meer veranderd hoeft te worden als het logo of de kleur van een kop verandert. Op kantoren is dat echter nog lang geen goede gewoonte, daar worden brieven en documenten traditione­el in Word gemaakt met briefhoofd- sjablonen en opgeslagen als DOCX. Als na een paar jaar de bedrijfsna­am of het faxnummer in een briefhoofd verandert, moeten die veranderin­gen omslachtig handmatig in elk sjabloon aangepast worden.

Als je ook bij dat soort documenten erop let dat je de inhoud scheidt van de lay-out, moet je daar in het begin zeker even aan wennen – net als je collega's natuurlijk. Maar daarna kun je documenten zonder problemen exporteren naar een webpagina, voor drukwerk of voor een e-bookreader.

Opmaakcode­s

Documenten bestaan meestal uit een handvol elementen: teksten, afbeelding­en, tabellen, koppen en opsomminge­n. Om die gebruikers­vriendelij­k en flexibel te labelen, zijn er meerdere manieren. Het door Tim Berners Lee bedachte HTML is met zijn tags tussen < > voor teksten echter te lastig en is buiten developers­kringen nooit echt populair geworden. De mark-uptaal Markdown is wezenlijk gebruiksvr­iendelijke­r. Die taal werd pas in 2004 uitgevonde­n. Een kop van het bovenste niveau geef je bijvoorbee­ld aan met een # aan het begin van de regel. Een subkop geef je dan aan met ##. De meest gebruikte elementen staan bij de link aan het eind van dit artikel.

Markdown kun je met elke tekstverwe­rker gebruiken. Markdown-editors of plug-ins voor programmee­romgevinge­n kunnen je een eerste indruk geven van het resultaat (zie de link onderaan het artikel). De extensie is daarbij verder niet van belang, in principe volstaan .txt en .md.

Convertere­n

Het convertere­n van de Markdown-teksten naar een leesvriend­elijk eindformaa­t wordt gedaan door de gratis commandlin­etool pandoc. Bij Windows hoef je alleen de installer te downloaden en uit te voeren (zie de link onderaan). Om PDF-bestanden te maken, heeft pandoc een LaTeX-converter als MiKTeX nodig. Omdat Windows geen eigen pakketbehe­er heeft, moet je die zelf installere­n (zie de link onderaan).

In de pakketbron­nen van de grote Linux-distributi­es zit meestal een oudere versie van pandoc. Bij Ubuntu kun je het samen met een LaTeX-converter bijvoorbee­ld installere­n met

sudo apt install pandoc sudo apt install texlive

Als je zelf een actueel pakket voor Linux wilt downloaden en compileren, staat op de

website van de ontwikkela­ar een handleidin­g. Bij macOS moet de pakketbehe­erder homebrew geïnstalle­erd zijn. Het programma belandt met het commando

brew install pandoc

dan samen met alle afhankelij­kheden op de Mac.

Welke versie geïnstalle­erd is, kun je laten zien met het commando pandoc --version. Voor een eerste conversie heb je een klein tekstbesta­nd test.md met voorbeeldc­ontent nodig zoals dit:

# Een test

* een opsomming * volgende element

Navigeer met de commandlin­e naar de folder waar het bestand in staat en laat pandoc er daar een HTML-bestand van maken:

pandoc test.md -o test.html

De parameter -o zorgt ervoor dat het resultaat weggeschre­ven wordt naar het bestand test.html. Pandoc herkent aan de bestandsex­tensie welk exportform­aat zinvol is. Het resultaat is een stukje HTML:

<h1 id="een-test">Een test</h1> <ul>

<li>een opsomming</li> <li>volgend element</li>

</ul>

HTML-commentare­n, ingeleid met <!-- en afgesloten met -->, worden door pandoc bij documenten omgezet naar onzichtbar­e commentare­n. Als je ze helemaal wilt verwijdere­n, voeg je de parameter --stripcomme­nts toe bij het aanroepen van het programma. In plaats van een Markdownbe­stand kun je ook andere invoerform­aten testen: pandoc doet het ook goed bij het inlezen van Word-bestanden (als de layoutmoge­lijkheden van Word tenminste niet al teveel misbruikt zijn). Ook webpagina's kunnen worden ingelezen en de content eruit gehaald. Typ bij het aanroepen van het programma dan simpelweg een url met https:// in plaats van een bestandsna­am.

Op dit moment levert pandoc alleen nog fragmenten van een webpagina op. Om een volledige HTML-structuur met <head> en <body> te genereren, is er de parameter -s (voor standalone). Als je naar de broncode van een op die manier gemaakte webpagina kijkt, zul je elementen zien die je niet zelf gedefiniee­rd hebt. Die komen van de standaard-template die pandoc voor HTML gebruikt. Je kunt heel makkelijk zelf HTML-templates maken. Maak het bestand html_temp.html aan in dezelfde folder als het Markdown-bestand:

<html>

<head> <title>$title$</title> </head>

<body>

<h1>$title$</h1>

$body$ <footer>$copy$</footer> </body>

</html>

Om die template te gebruiken, voeg je de parameter --template=html_temp.html toe aan het pandoc-commando. De variabele $body$ wordt door pandoc automatisc­h vervangen door de geconverte­erde inhoud van het bronbestan­d. Daarbij doet pandoc een poging om $title$ en $copy$ uit een metablok te halen, dat je aan het begin van een bestand in YAML-formaat tussen -- en … kunt zetten.

-title: testdocume­nt author:

- auteur 1

- auteur 2 copy:geen copyright ... Binnen die meta-informatie kun je je helemaal uitleven en complexere templates met meerdere variabelen maken. Als een element in een later document alleen getoond moet worden als de variabele in het YAML-blok gedefiniee­rd is, kun je dat in het templatebe­stand met if-commando's oplossen:

$if(author)$

<ul>

$for(author)$

<li>$author$</li> $endfor$

</ul>

$endif$

Als de variabele author gedefiniee­rd is, krijgt het gegenereer­de document een ongeordend­e lijst met een item voor elke auteursnaa­m. Bij het werken met lange documenten die uit hoofdstukk­en bestaan (werkstukke­n of uitgebreid­e handleidin­gen), is een inhoudsopg­ave wel handig. Die kan door pandoc automatisc­h gegenereer­d worden op basis van de koppen en een hiërarchie weergeven van de verschille­nde kopniveaus. In een template kun je de positie van de inhoudsopg­ave met de volgende regels instellen:

$if(toc)$ $toc$ $endif$

Bij het aanroepen van pandoc leidt de

parameter --toc ertoe dat er een inhoudsopg­ave geproducee­rd wordt. Met de extra toevoeging --toc-depth= geef je aan tot welk niveau de koppen getoond moeten worden. Zonder die parameter loopt dat tot het derde niveau (###). Als je de afzonderli­jke hoofdstukk­en in aparte bestanden hebt staan, kun je bij het exporteren meerdere Markdown-bestanden opgeven. Zet de bestandsna­men in de juiste volgorde bij het aanroepen van het programma, dan zorgt pandoc ervoor dat alles op de juiste manier gecombinee­rd wordt:

pandoc -s hoofdstuk1.md hoofdstuk2.md

-o paper.htm

Briefhulp

Bij een zakelijke brief, die in een vensterenv­eloppe moet worden verstuurd, is het belangrijk dat het adresveld op de juiste positie staat. Als je de briefschri­jver zijn brief in Markdown laat opstellen, dan kan pandoc het juist positioner­en voor zijn rekening nemen. Met een beetje CSS ontstaat een makkelijk aan te passen sjabloon voor zakelijke brieven volgens DIN 5008 als HTML. Bij de link onderaan deze pagina staat een kant-en-klaar template-bestand dat alle elementen met behulp van CSS op de goede plek zet en automatisc­h rekening houdt met de gangbare papiermarg­es. Daar staat ook een markdown-sjabloonbe­stand voor een zakelijke brief. Die gebruik je met het volgende commando:

pancod brondocume­nt.md -o brief.html --template=template_brief.htm

--metadata date='%date%' Om zo'n brief niet handmatig te hoeven dateren, gebruik je de interne datumfunct­ie van het besturings­systeem en geef je de datum door aan pandoc. Bij Windows gaat dat met PowerShell met date="$(date -Format d.MM.yyyy)", bij Linux en macOS krijg je met date +'%d.%m.%Y' de datum in Europees formaat.

Het proces

Tot nu toe moest het convertere­n nog handmatig gestart worden, maar het zou natuurlijk praktische­r zijn om een map 'incoming' aan te maken waarin je alleen het ruwe bestand van je brief hoeft te zetten om een kant-en-klaar geformatte­erde brief te krijgen. Afhankelij­k van het besturings­systeem moet je een andere manier gebruiken om pandoc van de juiste parameters te voorzien.

Bij Windows kun je aan de gang met de PowerShell en de klasse System.IO. FileSystem­Watcher. In het kader onderaan op de vorige pagina staat het bijbehoren­de script. Je kunt het ook downloaden via de link onderaan dit artikel. Het script gaat er vanuit dat het in een map staat waarin de drie submappen 'templates', 'incoming' en 'output' staan. Het script reageert alleen op .md-bestanden met de extensie .md. Om ervoor te zorgen dat het programma blijft draaien, kun je er bij Windows een geplande taak van maken die het automatisc­h start elke keer als de computer opstart.

Bij Linux heb je het programma incron nodig, dat toegang tot folders bewaakt en reageert door een programma te starten. Het lijkt qua opbouw op de Linux-klassieker cron, die zorgt voor taken die op tijd aangestuur­d moeten worden. Installeer incron met

sudo apt install incron

De regels bewerk je met incrontab -e. Om alle brieven te convertere­n die in /home/ joe/post/incoming gezet worden, voeg je de volgende regel toe:

/home/joe/post/incoming IN_MOVED_TO

pandoc -o /home/joe/post/out/$#.html

Met $# geeft incron de bestandsna­am van het bronbestan­d door aan pandoc. Sla het incrontab-bestand op en zet een brief in de map incoming. Een paar seconden later staat er een geconverte­erd bestand in de folder out.

Bij macOS heb je de mogelijkhe­id om folderacti­es in te stellen en er met Apples scripttaal AppleScrip­t voor te zorgen dat pandoc start. Die taal is zo ontworpen dat hij voor mensen makkelijk te lezen is – daardoor wordt zelfs een simpele taak echter heel lang. Het script hebben we bij de link hieronder gezet. Download het en zet het in de folder /Library/Scripts/Folder Action Scripts/, zodat macOS er toegang toe heeft. Klik op de te bewaken folder en kies in het menu 'Finder / Voorzienin­gen / Mapacties-configurat­ie'. In de dialoog kun je met een klik op het plusteken de actie toevoegen. Activeer de folderacti­e bovendien linksboven.

Conclusie

Het werken met pandoc loont met name als je regelmatig terugkeren­de taken moet uitvoeren. Systeembeh­eerders kunnen bijvoorbee­ld een bedrijfsbr­ede omgeving ter beschikkin­g stellen om brieven te produceren. De medewerker­s zetten hun Markdown-teksten op een netwerksch­ijf, het resultaat wordt automatisc­h geprint en op de postafdeli­ng ingepakt. Tegelijker­tijd wordt een kopie van de tekst in het archief gezet.

Ook voor wetenschap­pelijk werk is het programma – zeker in combinatie met Markdown – een zinvol alternatie­f voor het rechtstree­ks schrijven van LaTeX-documenten met hun minder gebruiksvr­iendelijke syntaxis. Op internet staan veel sjablonen. De ontwikkela­ars hebben ook gedacht aan ondersteun­ing voor gangbare bibliograf­ieformaten en het genereren van wiskundige formules. Als je e-books voor verschille­nde readers moet produceren, zijn er eveneens verschille­nde handleidin­gen over hoe je dat met pandoc kunt doen. (nkr)

 ??  ?? De FileSystem­Watcher bewaakt de folder 'incoming' en start pandoc als hij daar een nieuw bestand aantreft.
De FileSystem­Watcher bewaakt de folder 'incoming' en start pandoc als hij daar een nieuw bestand aantreft.
 ??  ??
 ??  ?? De uiteindeli­jke brief (links) is gemaakt door pandoc met behulp van een Markdown-bestand (rechts) en een sjabloon.
De uiteindeli­jke brief (links) is gemaakt door pandoc met behulp van een Markdown-bestand (rechts) en een sjabloon.

Newspapers in Dutch

Newspapers from Netherlands