h*,&N      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                   0.0.3.0Command-line interface to Slab Safe-Inferred "%&4Q slab.A failing external command fails the template.slabA failing external command doesn't fail the template and its output is rendered in the template.slab!Don't process include statements.slab=Process the include statements, creating a complete template. slabCommands operating on a path. slab$If True, simplify the evaluated AST. slab$If True, simplify the evaluated AST.slabList the classes used in a template. TODO Later, we want to list (or create a tree) of extends/includes.slabList the fragments used in a template. If a name is given, extract that definition.slab$Generate code. Only Haskell for now.  1Errors that the different Slab stages can produce Safe-Inferred "%&slabRepresent all errors emitted by Slab. I.e. this is used in each stage (, , , ).slab9Extract a Right value, or die, emitting an error message. The abstract syntax used by Slab Safe-Inferred "%&Q%slabA representation of a  template is a list of Inline, supporting efficient rendering. Use parse< to create a template from a text containing placeholders. & is a literal Text value. ' is a placeholder created with #{...}.(slabSimple expression language.<slab9Allow to assign the content of a JSON file to a variable.?slab-The text follows an element on the same line.@slabThe text follows a pipe character. Multiple lines each introduced by a pipe symbol are grouped as a single  node.Aslab:The text is part of a text block following a trailing dot.BslabThe text is the content of an include statement without a .slab extension.Cslab"The text is the output of command.DslabRepresent an attribute or an argument of an element. Attributes can be IDs, classes, or arbitrary keys. Arguments are expressions with no key. The Code must already be evaluated.MslabSpecifies if a fragment definition is a normal definition, or one meant to be an argument of a fragment call.slab"Arbitrary element name, using the el keyword.slab?A "passthrough" comment will be included in the generated HTML.slabOnly  doctype html for now.slabNothing# when the template is parsed, then  Just nodes after preprocessing (i.e. actually running the include statement). The filter name follows the same behavior as BlockFilter.slabdefault defines an optional formal parameter with a default content. Its content is used when the argument is not given.slabSimilar to an anonymous fragment call, where the fragment body is the content of the referenced file.slab5Run an external command, with maybe some stdin input.slabTakes two blocks and returns a BlockList containing both, but peel the outer list of a and b if they are themselves BlockList.slab5Set attrs on a the first block, if it is a BlockElem.slab1Set the content on a block, if it is a BlockElem.slabFind the head element and add a script element at its end. TODO This doesn't go through all children to find the head. It's best to use "Evaluate.simplify" before using this function.slabGroup multiple classes or IDs in a single class or ID, and transform the other attributes in ,s.Psbz}c]`S_Q{hrRTya^xUVWXYZ[\defgijklmnopqtuvw|~MNOILJKDHFEG>@A?BC(*+-.0928),/134567:;<=%&'"#$Psbz}c]`S_Q{hrRTya^xUVWXYZ[\defgijklmnopqtuvw|~MNOILJKDHFEG>@A?BC(*+-.0928),/134567:;<=%&'"#$Render an AST to HTML Safe-Inferred "%&(Parse the concrete Slab syntax to an AST Safe-Inferred "%&aslabRecord whether we are parsing a template within the normal block syntax, or within an inline block syntax (introduced by #{...}). This is allow a closing curly bracket in the normal case without requiring to escape it, and disallowing it in the inline case (since it is used to end the inline case).slabA mapping from placeholders in the template to values with an applicative lookup function. For instance the lookup function can fail, returning  or .slab0We expose the expression parser for development:  Parse.parseExpr "1 + 2 * a" slabParse the indented content of an HTML element or a fragment call.slab4Parse indented text following a dot, or a run block.slab(Parse lines of text, indented more than ref?. E.g.: a b c will return ["a", " b", "c"].slabConsidering all the given lines as a block, strip the leading whitespace of each line so that the left-most character of the block is in the first column.slabParse multiple lines starting each with a pipe prefix. Most of our parsers parse a single line (and optional indented child lines) and most nodes map to a single line, but here we want to be able to view such blocks as a single node, and we make sur to add newlines between each when rendered.slab&A parser to convert the content of an included to Syntax. The behavior w.r.t. to newlines should be the same as having each line directly preceded by a | in the including file.slab%Parse an expression on a single line.slabSame as "parserExpr" but allow expressions to be written on multiple lines. Subsequent lines must be indented compared to the first line.slab6Parse both attributes and arguments. E.g. (), (class=a)slabCreate a template from a template string. A malformed template string will cause  to return a parse error.slabEquivalent to  but in an inline context.-Parse and process included and imported files Safe-Inferred "%&6slab Similar to  parseFile( but pre-process the include statements.)Translate from the Slab syntax to Haskell Safe-Inferred "%&slab Render an element, aligning the ! character: 1 elem ! a ! b $ do child0 child1 (Evaluate an AST (to a non-reducible AST) Safe-Inferred "%&slab Similar to preprocessFile but evaluate the template.slabSame as  plus an implicit content block. Note that unlike , this version takes also care of passing the environment being constructed to each definition. *Run external commands referenced by an AST Safe-Inferred "%& Cslab Similar to  evaluateFile but run external commands. Build Slab templates to HTML Safe-Inferred "%&!&slab A version of  that doesn't write files to disk, but instead record the generated  s in STM. >Report information about Slab templates (mostly empty for now) Safe-Inferred "%&! *Continuously build a set of Slab templates Safe-Inferred "%&" 2Run a development server to preview Slab templates Safe-Inferred "%&1$jslab Turn our ? implementation into a Wai application, suitable for Warp.run.slabTry to serve a built page, and fallback to static files if the page doesn't exist.slabSends messages to the browser whenever a message is written to the channel.slabThe auto-reload script. It connects to a websocket and refreshes the current page when it receives a message from the server. Such a message is sent whenever a .slab file is rebuilt.Implementation of Slab's CLI Safe-Inferred "%&&6slab"eval" parses a string as a  Syntax.Syntax>, and evaluates it. This doesn't run the proprocessing stage.  Run.eval "p= 1 + 2 * 3" slab!Run "eval" and render the result.slab"calc" parses a string as a  Syntax.Expr, and evaluates it. I.e. it doens't use the fragment syntax, or imports and includes.  Run.calc "1 + 2 * 3"  !"#$%&'()*+ ,-./01234556789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXVYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~aK                        #slab-0.0.3.0-9HgaIbPKZG61H9ekW0qlU3 Slab.Command Slab.Error Slab.Syntax Slab.Render Slab.ParseSlab.PreProcessSlab.Generate.Haskell Slab.Evaluate Slab.Execute Slab.Build Slab.Report Slab.Watch Slab.ServeSlab.RunslabSlabParse PreProcessEvaluate ExecuteErrorDataTextRunMode RunNormalRunPassthrough ParseMode ParseShallow ParseDeep RenderMode RenderNormal RenderPrettyCommandWithPathRenderExecuteClasses FragmentsCommandBuildWatchServe ReportPagesReportHeadingsGenerate parserInfoError ParseErrorPreProcessError EvaluateErrorunwrapdisplay $fShowError $fEqErrorEnv envVariablesInlineLitPlaceExprVariableBoolIntSingleQuoteStringListObjectLookup ApplicationAddSubTimesDivide GreaterThan LesserThanEqualConsBlockFragThunkJsonPathBuiltIn TextSyntaxNormalPipeDotInclude RunOutputAttrIdClassArg TrailingSymHasDotHasEqualNoSym DefinitionUseDefinitionNormal DefinitionArgElemHtmlBodyDivSpanBrHrH1H2H3H4H5H6HeaderHeadMetaMainLinkAPEmUlLiTitleTableTheadTbodyTrTdDlDtDdFooterFigureFormLabel BlockquoteButton FigcaptionAudioScriptStyleSmallSourcePreCodeImgIFrameInputISvgTextareaCanvas CommentType NormalCommentPassthroughComment BlockDoctype BlockElem BlockText BlockIncludeBlockFragmentDefBlockFragmentCallBlockFor BlockComment BlockFilter BlockRawElem BlockDefault BlockImportBlockRunBlockAssignVarsBlockIf BlockList BlockCode isDoctype trailingSym pasteBlockssetAttrs setContent addScriptsplitAttrsAndArgsemptyEnv displayEnv freeVariablesthunkextractClassesextractFragments findFragmentidNamesFromAttrsidNamesFromAttrs'classNamesFromAttrsnamesFromAttrs groupAttrs$fShowBlockFragment$fEqBlockFragment$fEqEnv $fShowEnv $fShowExpr$fEqExpr $fShowBlock $fEqBlock $fEqInline $fShowInline $fShowAttr$fEqAttr$fShowTextSyntax$fEqTextSyntax$fShowTrailingSym$fEqTrailingSym$fShowDefinitionUse$fEqDefinitionUse $fShowElem$fEqElem$fShowCommentType$fEqCommentType prettyHtmls renderHtmlsrenderHtmlsUtf8 renderBlocks extractTextsInterpolationContext parseFile parseFileEparse parseExprparserTextIncludeparse' parseInlinesContext ctxStartPathpreprocessFilepreprocessFileErenderHs evaluateFile defaultEnvevaluateevalExprsimplifyctxPath ctxRunMode executeFileexecuteStmStorebuildDir buildFilebuildDirInMemorybuildFileInMemory listTemplates reportPagesreportHeadings $fShowHeading $fEqHeading $fShowModulerunevalrendercalc InlineContextbase GHC.MaybeNothing Data.EitherLeftparserElemBody parserDotText textBlockrealign parserPipe parserExpr parserExprIndparserAttrListparseInlineBlock parserBlockprettyBlockElemextractVariables'extractVariablesserveserverTapp websocketautoreloadScript