是否可以使用具有结束标签的哈姆雷特?

时间:2013-11-20 10:23:09

标签: haskell yesod hamlet

是否可以使用Hamlet模板库但仍然可以编写结束标记?由于我在编写Ruby时没有使用Haml的相同原因,我对模板中存在大量空白的想法感到不舒服。

This answer关于另一个问题似乎建议您可以使用结束标记,但是在我已经在FP Haskell Center上设置的基本入门项目中我无法获得编译代码如果我将结束标记添加到在同一行上打开的标记以外的任何内容。

1 个答案:

答案 0 :(得分:1)

文档似乎很清楚:

  

...在Hamlet中使用结束标记的唯一时间是内联标记;普通标签未关闭。

http://www.yesodweb.com/book/shakespearean-templates(“标签”部分的结尾)

相关的源代码:https://github.com/yesodweb/shakespeare/blob/master/hamlet/Text/Hamlet/Parse.hs#L558函数parseDocparseLines等。

以下显示每行中的第一项(标签)是专门处理的, 而其他人只是ContentRaw

ghci Text/Hamlet/Parse.hs
fmap (\(x,y,z)->z) $ parseLines defaultHamletSettings "<foo> <bar> @{oof} </rab>"

    ==> Ok [(0,LineTag {_lineTagName = "foo", _lineAttr = [],
          _lineContent = [ContentRaw " <bar> ",
          ContentUrl False (DerefIdent (Ident "oof")),ContentRaw " </rab>"], 
          _lineClasses = [], _lineAttrs = [], _lineNoNewline = False})]

因此,hamlet将永远不会注意到(内联)标记是否已关闭。

仍有可能切换到“永不关闭”模式,而closeStyle中的nestToDoc看起来很有希望,但对于非空内容,我们总是会CloseSeparate ,暗示将插入结束标记。