Skip to content

Instantly share code, notes, and snippets.

@noteed
Created August 20, 2024 10:36
Show Gist options
  • Save noteed/c82bba778f5a3403e62da73894352886 to your computer and use it in GitHub Desktop.
Save noteed/c82bba778f5a3403e62da73894352886 to your computer and use it in GitHub Desktop.
Word-break
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>/home/thu/projects/slab/src/Slab/Command.hs</title>
<meta name="colorscheme" content="wildcharm"></meta>
<style>
* {font-family: monospace}
body {background-color: #ffffff; color: #000000; margin:0px; padding:0px; margin-top: 13.5px; margin-left: -0.5px;}
.String {color: #0000c0}
.hsImportModuleName {}
.Statement {color: #c00000}
.Special {color: #8700ff}
.hsImportGroup {}
.Constant {color: #0000c0}
.hsDelimiter {}
.PreProc {color: #c000c0}
.Comment {color: #6c6c6c}
.ConId {}
.VarId {}
.hsImportList {}
.Type {color: #c00000}
.Todo {background-color: #ffff00; color: #000000}
pre {margin: 0px; width: 93.10ch; white-space: pre-wrap; word-break: break-all; padding: 0px; font-size:11.5px; letter-spacing: 0.08px; }
</style>
</head>
<body>
<pre>
<span class="Special">{-# LANGUAGE ApplicativeDo #-}</span>
<span class="Comment">-- |</span>
<span class="Comment">-- Module : Slab.Command</span>
<span class="Comment">-- Description : Command-line interface to Slab</span>
<span class="Comment">--</span>
<span class="Comment">-- @Slab.Command@ provides a command line interface for the Slab program.</span>
<span class="Comment">--</span>
<span class="Comment">-- Commands and options are defined by parsers written using the</span>
<span class="Comment">-- @optparse-applicative@ library.</span>
<span class="Comment">--</span>
<span class="Comment">-- The implementation of each command can be found in the &quot;Slab.Run&quot; module.</span>
<span class="Type">module</span> <span class="ConId">Slab.Command</span>
<span class="hsDelimiter">(</span> <span class="ConId">Command</span> <span class="hsDelimiter">(</span><span class="Statement">..</span><span class="hsDelimiter">)</span>
<span class="hsDelimiter">,</span> <span class="ConId">CommandWithPath</span> <span class="hsDelimiter">(</span><span class="Statement">..</span><span class="hsDelimiter">)</span>
<span class="hsDelimiter">,</span> <span class="ConId">RenderMode</span> <span class="hsDelimiter">(</span><span class="Statement">..</span><span class="hsDelimiter">)</span>
<span class="hsDelimiter">,</span> <span class="ConId">ParseMode</span> <span class="hsDelimiter">(</span><span class="Statement">..</span><span class="hsDelimiter">)</span>
<span class="hsDelimiter">,</span> <span class="ConId">RunMode</span> <span class="hsDelimiter">(</span><span class="Statement">..</span><span class="hsDelimiter">)</span>
<span class="hsDelimiter">,</span> <span class="VarId">parserInfo</span>
<span class="hsDelimiter">)</span> <span class="Type">where</span>
<span class="PreProc">import</span><span class="hsImportGroup"> </span><span class="hsImportModuleName">Data.Text</span><span class="hsImportGroup"> </span><span class="hsDelimiter">(</span><span class="ConId">Text</span><span class="hsDelimiter">)</span>
<span class="PreProc">import</span><span class="hsImportGroup"> </span><span class="hsImportModuleName">Data.Version</span><span class="hsImportGroup"> </span><span class="hsDelimiter">(</span><span class="VarId">showVersion</span><span class="hsDelimiter">)</span>
<span class="PreProc">import</span><span class="hsImportGroup"> </span><span class="hsImportModuleName">Options.Applicative</span><span class="hsImportGroup"> </span><span class="hsDelimiter">((</span><span class="hsImportList">&lt;**&gt;</span><span class="hsDelimiter">))</span>
<span class="PreProc">import</span><span class="hsImportGroup"> </span><span class="hsImportModuleName">Options.Applicative</span><span class="hsImportGroup"> </span><span class="PreProc">qualified</span><span class="hsImportGroup"> </span><span class="PreProc">as</span><span class="hsImportGroup"> </span><span class="hsImportModuleName">A</span>
<span class="PreProc">import</span><span class="hsImportGroup"> </span><span class="hsImportModuleName">Paths</span><span class="hsImportGroup">_slab </span><span class="hsDelimiter">(</span><span class="VarId">version</span><span class="hsDelimiter">)</span>
<span class="Comment">--------------------------------------------------------------------------------</span>
<span class="Type">data</span> <span class="ConId">Command</span>
<span class="Statement">=</span> <span class="ConId">Build</span> <span class="ConId">FilePath</span> <span class="ConId">RenderMode</span> <span class="ConId">RunMode</span> <span class="ConId">FilePath</span>
<span class="Statement">|</span> <span class="ConId">Watch</span> <span class="ConId">FilePath</span> <span class="ConId">RenderMode</span> <span class="ConId">RunMode</span> <span class="ConId">FilePath</span>
<span class="Statement">|</span> <span class="ConId">Serve</span> <span class="ConId">FilePath</span> <span class="ConId">FilePath</span>
<span class="Statement">|</span> <span class="ConId">ReportPages</span> <span class="ConId">FilePath</span>
<span class="Statement">|</span> <span class="ConId">ReportHeadings</span> <span class="ConId">FilePath</span>
<span class="Statement">|</span> <span class="Comment">-- | Return the content of element matching the provided ID.</span>
<span class="ConId">ReportElement</span> <span class="ConId">Text</span> <span class="ConId">FilePath</span>
<span class="Statement">|</span> <span class="Comment">-- | Generate code. Only Haskell for now.</span>
<span class="ConId">Generate</span> <span class="ConId">FilePath</span>
<span class="Statement">|</span> <span class="ConId">CommandWithPath</span> <span class="ConId">FilePath</span> <span class="ConId">ParseMode</span> <span class="ConId">CommandWithPath</span>
<span class="Comment">-- | Commands operating on a path.</span>
<span class="Type">data</span> <span class="ConId">CommandWithPath</span>
<span class="Statement">=</span> <span class="ConId">Render</span> <span class="ConId">RenderMode</span> <span class="ConId">RunMode</span>
<span class="Statement">|</span> <span class="Comment">-- | If True, simplify the evaluated AST.</span>
<span class="ConId">Execute</span> <span class="ConId">Bool</span> <span class="ConId">RunMode</span>
<span class="Statement">|</span> <span class="Comment">-- | If True, simplify the evaluated AST.</span>
<span class="ConId">Evaluate</span> <span class="ConId">Bool</span>
<span class="Statement">|</span> <span class="ConId">Parse</span>
<span class="Statement">|</span> <span class="Comment">-- | List the classes used in a template. </span><span class="Todo">TODO</span><span class="Comment"> Later, we want to list (or create a tree) of extends/includes.</span>
<span class="ConId">Classes</span>
<span class="Statement">|</span> <span class="Comment">-- | List the fragments used in a template. If a name is given, extract that definition.</span>
<span class="ConId">Fragments</span> <span class="hsDelimiter">(</span><span class="ConId">Maybe</span> <span class="ConId">Text</span><span class="hsDelimiter">)</span>
<span class="Type">data</span> <span class="ConId">RenderMode</span> <span class="Statement">=</span> <span class="ConId">RenderNormal</span> <span class="Statement">|</span> <span class="ConId">RenderPretty</span>
<span class="Type">data</span> <span class="ConId">ParseMode</span>
<span class="Statement">=</span> <span class="Comment">-- | Don't process include statements.</span>
<span class="ConId">ParseShallow</span>
<span class="Statement">|</span> <span class="Comment">-- | Process the include statements, creating a complete template.</span>
<span class="ConId">ParseDeep</span>
<span class="Type">data</span> <span class="ConId">RunMode</span>
<span class="Statement">=</span> <span class="Comment">-- | A failing external command fails the template.</span>
<span class="ConId">RunNormal</span>
<span class="Statement">|</span> <span class="Comment">-- | A failing external command doesn't fail the template and its output is</span>
<span class="Comment">-- rendered in the template.</span>
<span class="ConId">RunPassthrough</span>
<span class="Comment">--------------------------------------------------------------------------------</span>
<span class="VarId">parserInfo</span> <span class="Statement">::</span> <span class="ConId">A.ParserInfo</span> <span class="ConId">Command</span>
<span class="VarId">parserInfo</span> <span class="Statement">=</span>
<span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parser</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">simpleVersioner</span> <span class="hsDelimiter">(</span><span class="String">&quot;slab &quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">version'</span><span class="hsDelimiter">)</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.fullDesc</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.header</span>
<span class="hsDelimiter">(</span><span class="String">&quot;slab &quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">version'</span> <span class="Statement">&lt;&gt;</span> <span class="String">&quot; - A programmable markup language to generate HTML&quot;</span><span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.progDesc</span>
<span class="String">&quot;Slab is a programmable markup language to generate HTML.&quot;</span>
<span class="Type">where</span>
<span class="VarId">version'</span> <span class="Statement">=</span> <span class="VarId">showVersion</span> <span class="VarId">version</span>
<span class="Comment">--------------------------------------------------------------------------------</span>
<span class="VarId">parser</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parser</span> <span class="Statement">=</span>
<span class="VarId">A.subparser</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.command</span>
<span class="String">&quot;build&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserBuild</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Build a library of Slab templates to HTML&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;watch&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserWatch</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Watch and build a library of Slab templates to HTML&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;serve&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserServe</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Watch and serve a library of Slab templates&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;report&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserReport</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Analyse a library of Slab templates&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;render&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserRender</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Render a Slab template to HTML&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;run&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserExectue</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Execute a Slab template&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;evaluate&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserEvaluate</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Evaluate a Slab template&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;parse&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserParse</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Parse a Slab template to AST&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;generate&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserGenerate</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Generate code corresponding to a Slab template&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;classes&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserClasses</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Parse a Slab template and report its CSS classes&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;fragments&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserFragments</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Parse a Slab template and report its fragments&quot;</span>
<span class="hsDelimiter">)</span>
<span class="hsDelimiter">)</span>
<span class="Comment">--------------------------------------------------------------------------------</span>
<span class="VarId">parserBuild</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserBuild</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">srcDir</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.argument</span>
<span class="VarId">A.str</span>
<span class="hsDelimiter">(</span><span class="VarId">A.metavar</span> <span class="String">&quot;DIR&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.action</span> <span class="String">&quot;file&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Directory of Slab templates to build.&quot;</span><span class="hsDelimiter">)</span>
<span class="VarId">mode</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.flag</span>
<span class="ConId">RenderNormal</span>
<span class="ConId">RenderPretty</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;pretty&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Use pretty-printing&quot;</span>
<span class="hsDelimiter">)</span>
<span class="VarId">passthrough</span> <span class="Statement">&lt;-</span> <span class="VarId">parserPassthroughFlag</span>
<span class="VarId">distDir</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.strOption</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;dist&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.value</span> <span class="String">&quot;./_site&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.metavar</span> <span class="String">&quot;DIR&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span>
<span class="String">&quot;A destination directory for the generated HTML files.&quot;</span>
<span class="hsDelimiter">)</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="ConId">Build</span> <span class="VarId">srcDir</span> <span class="VarId">mode</span> <span class="VarId">passthrough</span> <span class="VarId">distDir</span>
<span class="VarId">parserServe</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserServe</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">srcDir</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.argument</span>
<span class="VarId">A.str</span>
<span class="hsDelimiter">(</span><span class="VarId">A.metavar</span> <span class="String">&quot;DIR&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.action</span> <span class="String">&quot;file&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Directory of Slab templates to build.&quot;</span><span class="hsDelimiter">)</span>
<span class="VarId">distDir</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.strOption</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;dist&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.value</span> <span class="String">&quot;./_site&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.metavar</span> <span class="String">&quot;DIR&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span>
<span class="String">&quot;A directory with existing static files.&quot;</span>
<span class="hsDelimiter">)</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="ConId">Serve</span> <span class="VarId">srcDir</span> <span class="VarId">distDir</span>
<span class="VarId">parserReport</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserReport</span> <span class="Statement">=</span>
<span class="VarId">A.subparser</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.command</span>
<span class="String">&quot;pages&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserReportPages</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Report pages found in a directory&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;headings&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserReportHeadings</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Report the headings of a page&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.command</span>
<span class="String">&quot;element&quot;</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.info</span> <span class="hsDelimiter">(</span><span class="VarId">parserReportElement</span> <span class="Statement">&lt;**&gt;</span> <span class="VarId">A.helper</span><span class="hsDelimiter">)</span> <span class="Statement">$</span>
<span class="VarId">A.progDesc</span>
<span class="String">&quot;Return the content of element matching the provided ID&quot;</span>
<span class="hsDelimiter">)</span>
<span class="hsDelimiter">)</span>
<span class="VarId">parserReportPages</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserReportPages</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">srcDir</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.argument</span>
<span class="VarId">A.str</span>
<span class="hsDelimiter">(</span><span class="VarId">A.metavar</span> <span class="String">&quot;DIR&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.action</span> <span class="String">&quot;file&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Directory of Slab templates to analyse.&quot;</span><span class="hsDelimiter">)</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="ConId">ReportPages</span> <span class="VarId">srcDir</span>
<span class="VarId">parserReportHeadings</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserReportHeadings</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">path</span> <span class="Statement">&lt;-</span> <span class="VarId">parserTemplatePath</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="ConId">ReportHeadings</span> <span class="VarId">path</span>
<span class="VarId">parserReportElement</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserReportElement</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">id_</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.argument</span>
<span class="VarId">A.str</span>
<span class="hsDelimiter">(</span><span class="VarId">A.metavar</span> <span class="String">&quot;ID&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Element ID to match.&quot;</span><span class="hsDelimiter">)</span>
<span class="VarId">path</span> <span class="Statement">&lt;-</span> <span class="VarId">parserTemplatePath</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="ConId">ReportElement</span> <span class="VarId">id_</span> <span class="VarId">path</span>
<span class="VarId">parserWatch</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserWatch</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">srcDir</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.argument</span>
<span class="VarId">A.str</span>
<span class="hsDelimiter">(</span><span class="VarId">A.metavar</span> <span class="String">&quot;DIR&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.action</span> <span class="String">&quot;file&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Directory of Slab templates to watch.&quot;</span><span class="hsDelimiter">)</span>
<span class="VarId">mode</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.flag</span>
<span class="ConId">RenderNormal</span>
<span class="ConId">RenderPretty</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;pretty&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Use pretty-printing&quot;</span>
<span class="hsDelimiter">)</span>
<span class="VarId">passthrough</span> <span class="Statement">&lt;-</span> <span class="VarId">parserPassthroughFlag</span>
<span class="VarId">distDir</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.strOption</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;dist&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.value</span> <span class="String">&quot;./_site&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.metavar</span> <span class="String">&quot;DIR&quot;</span>
<span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span>
<span class="String">&quot;A destination directory for the generated HTML files.&quot;</span>
<span class="hsDelimiter">)</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="ConId">Watch</span> <span class="VarId">srcDir</span> <span class="VarId">mode</span> <span class="VarId">passthrough</span> <span class="VarId">distDir</span>
<span class="VarId">parserExectue</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserExectue</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">pathAndmode</span> <span class="Statement">&lt;-</span> <span class="VarId">parserWithPath</span>
<span class="VarId">simpl</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.switch</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;simplify&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Simplify the AST&quot;</span>
<span class="hsDelimiter">)</span>
<span class="VarId">passthrough</span> <span class="Statement">&lt;-</span> <span class="VarId">parserPassthroughFlag</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="VarId">uncurry</span> <span class="ConId">CommandWithPath</span> <span class="VarId">pathAndmode</span> <span class="Statement">$</span> <span class="ConId">Execute</span> <span class="VarId">simpl</span> <span class="VarId">passthrough</span>
<span class="VarId">parserRender</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserRender</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">mode</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.flag</span>
<span class="ConId">RenderNormal</span>
<span class="ConId">RenderPretty</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;pretty&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Use pretty-printing&quot;</span>
<span class="hsDelimiter">)</span>
<span class="VarId">pathAndmode</span> <span class="Statement">&lt;-</span> <span class="VarId">parserWithPath</span>
<span class="VarId">passthrough</span> <span class="Statement">&lt;-</span> <span class="VarId">parserPassthroughFlag</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="VarId">uncurry</span> <span class="ConId">CommandWithPath</span> <span class="VarId">pathAndmode</span> <span class="Statement">$</span> <span class="ConId">Render</span> <span class="VarId">mode</span> <span class="VarId">passthrough</span>
<span class="VarId">parserEvaluate</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserEvaluate</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">pathAndmode</span> <span class="Statement">&lt;-</span> <span class="VarId">parserWithPath</span>
<span class="VarId">simpl</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.switch</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;simplify&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Simplify the AST&quot;</span>
<span class="hsDelimiter">)</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="VarId">uncurry</span> <span class="ConId">CommandWithPath</span> <span class="VarId">pathAndmode</span> <span class="Statement">$</span> <span class="ConId">Evaluate</span> <span class="VarId">simpl</span>
<span class="VarId">parserParse</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserParse</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">pathAndmode</span> <span class="Statement">&lt;-</span> <span class="VarId">parserWithPath</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="VarId">uncurry</span> <span class="ConId">CommandWithPath</span> <span class="VarId">pathAndmode</span> <span class="ConId">Parse</span>
<span class="VarId">parserGenerate</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserGenerate</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">path</span> <span class="Statement">&lt;-</span> <span class="VarId">parserTemplatePath</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="ConId">Generate</span> <span class="VarId">path</span>
<span class="VarId">parserClasses</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserClasses</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">pathAndmode</span> <span class="Statement">&lt;-</span> <span class="VarId">parserWithPath</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="VarId">uncurry</span> <span class="ConId">CommandWithPath</span> <span class="VarId">pathAndmode</span> <span class="ConId">Classes</span>
<span class="VarId">parserFragments</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">Command</span>
<span class="VarId">parserFragments</span> <span class="Statement">=</span> <span class="Statement">do</span>
<span class="VarId">pathAndmode</span> <span class="Statement">&lt;-</span> <span class="VarId">parserWithPath</span>
<span class="VarId">mname</span> <span class="Statement">&lt;-</span>
<span class="VarId">A.optional</span> <span class="Statement">$</span>
<span class="VarId">A.argument</span>
<span class="VarId">A.str</span>
<span class="hsDelimiter">(</span><span class="VarId">A.metavar</span> <span class="String">&quot;NAME&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Fragment name to extract.&quot;</span><span class="hsDelimiter">)</span>
<span class="VarId">pure</span> <span class="Statement">$</span> <span class="VarId">uncurry</span> <span class="ConId">CommandWithPath</span> <span class="VarId">pathAndmode</span> <span class="Statement">$</span> <span class="ConId">Fragments</span> <span class="VarId">mname</span>
<span class="Comment">--------------------------------------------------------------------------------</span>
<span class="VarId">parserWithPath</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="hsDelimiter">(</span><span class="ConId">FilePath</span><span class="hsDelimiter">,</span> <span class="ConId">ParseMode</span><span class="hsDelimiter">)</span>
<span class="VarId">parserWithPath</span> <span class="Statement">=</span> <span class="hsDelimiter">(,)</span> <span class="Statement">&lt;$&gt;</span> <span class="VarId">parserTemplatePath</span> <span class="Statement">&lt;*&gt;</span> <span class="VarId">parserShallowFlag</span>
<span class="VarId">parserTemplatePath</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">FilePath</span>
<span class="VarId">parserTemplatePath</span> <span class="Statement">=</span>
<span class="VarId">A.argument</span>
<span class="VarId">A.str</span>
<span class="hsDelimiter">(</span><span class="VarId">A.metavar</span> <span class="String">&quot;FILE&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.action</span> <span class="String">&quot;file&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Slab template to parse.&quot;</span><span class="hsDelimiter">)</span>
<span class="VarId">parserShallowFlag</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">ParseMode</span>
<span class="VarId">parserShallowFlag</span> <span class="Statement">=</span>
<span class="VarId">A.flag</span>
<span class="ConId">ParseDeep</span>
<span class="ConId">ParseShallow</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;shallow&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Don't parse recursively the included Slab files&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Comment">--------------------------------------------------------------------------------</span>
<span class="VarId">parserPassthroughFlag</span> <span class="Statement">::</span> <span class="ConId">A.Parser</span> <span class="ConId">RunMode</span>
<span class="VarId">parserPassthroughFlag</span> <span class="Statement">=</span>
<span class="VarId">A.flag</span>
<span class="ConId">RunNormal</span>
<span class="ConId">RunPassthrough</span>
<span class="hsDelimiter">(</span> <span class="VarId">A.long</span> <span class="String">&quot;passthrough&quot;</span> <span class="Statement">&lt;&gt;</span> <span class="VarId">A.help</span> <span class="String">&quot;Allow external command failures&quot;</span>
<span class="hsDelimiter">)</span>
<span class="Comment">-- From optparse-applicative ~ 0.18 (we're on 0.17), although we add also `-v`.</span>
<span class="Comment">-- | A hidden \&quot;--version\&quot; option that displays the version.</span>
<span class="Comment">--</span>
<span class="Comment">-- &gt; opts :: ParserInfo Sample</span>
<span class="Comment">-- &gt; opts = info (sample &lt;**&gt; simpleVersioner &quot;v1.2.3&quot;) mempty</span>
<span class="VarId">simpleVersioner</span>
<span class="Statement">::</span> <span class="ConId">String</span>
<span class="Comment">-- ^ Version string to be shown</span>
<span class="Statement">-&gt;</span> <span class="ConId">A.Parser</span> <span class="hsDelimiter">(</span><span class="VarId">a</span> <span class="Statement">-&gt;</span> <span class="VarId">a</span><span class="hsDelimiter">)</span>
<span class="VarId">simpleVersioner</span> <span class="VarId">version_</span> <span class="Statement">=</span>
<span class="VarId">A.infoOption</span> <span class="VarId">version_</span> <span class="Statement">$</span>
<span class="VarId">mconcat</span>
<span class="hsDelimiter">[</span> <span class="VarId">A.long</span> <span class="String">&quot;version&quot;</span>
<span class="hsDelimiter">,</span> <span class="VarId">A.short</span> <span class="Constant">'v'</span>
<span class="hsDelimiter">,</span> <span class="VarId">A.help</span> <span class="String">&quot;Show version information&quot;</span>
<span class="hsDelimiter">,</span> <span class="VarId">A.hidden</span>
<span class="hsDelimiter">]</span>
</pre>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment