接下来复制三段代码,从P60最后到P65。要注意第三段代码,
template.lucius
需要使用全路径引用。否则会报错找不到文件
对于第三段代码,我们执行一下,会看到控制台输出了文件的内容
接下来复制P67页的代码。这里我们会了解到ihamlet
是如何使用的
然后复制P68页的代码。我们会看到如何渲染一段简单的Html标签语言
然后我们稍作一点替换
import Text.Balze.Hhtml.Rederer.String(renderHtml)
import Text.Hamlet(HtmlUrl,hamlet)
main = forM_ items $\item-> putStrLn $ renderHtml $[hamlet|
<label>You have #{show $ itemQty item} #{itemName item}.
|] render
接下来我们略微做一点总结
shamlet::Text.Blaze.Html.Html
这是最基本的使用。可以直接将它作为一个字符串使用。需要替换其中的字符则使用where和let
hamlet::HtmlUrl DateType
hamlet
比shamlet
要高级一点,它需要一个OverloadedStrings
的替换方式,对于其中字符的替换,因为[hamlet|..|]
之后需要直接接一个函数,所以建议采用函数参数的方式传递,使用let
也可以,但是写法比较纠结。
[hamlet|..|]
之后接的函数,需要提供一个Data->[(Text,Text)]->Text
的类型,[hamlet|..|]
会将整个体中的以@包裹的代码块进行解析.@
包括的代码有一下两种形式
- @{DataType}:例如
<a href=@{Home}
- @{(DataType,[(key,value)])}:
<a href=@{(Home,[("page",pack$show 1)])}
解析函数会将Home
解析为Data,如果Home
后有列表,则会解析为第二个参数,如果没有则会传递[]
ihamlet::HtmlUrlI18n Msg DataType
如果需要做的是外部替换,那么需要将hamlet
中的内容整体传递到外部函数进行匹配替换,我们就需要ihamlet
ihamlet
中有一个重要的方法_{data}
,处于_{..}
之中的值会传递给一个参数为DataType
类型的函数,而这个函数建议返回为Text
类型
toHtml::blaze-markup-0.6.1.0:Text.Blaze.toMarkup a=> a->Text.Blaze.Html.Html
type HtmlUrlI18n msg url = Translate msg -> Render url-> Html
renderHtml::Text.Blaze.Html.Html->String
$ renderHtml $ (ihamlet) (toHtml.renderEnglish) renderUrl
则后段函数的输出类型Html
刚好满足renderHtml
的参数类型需求
这里我们注意到 toHtml.renderEnglish
的类型是Msg->Html
,而我们的[shamlet|..|]
的类型也正好是Html
,那我们是不是可以使用一个f::Msg->Html
的函数来替换掉呢?答案是肯定的。请看下列代码
renderChinese::Msg->Html
renderChinese Hellp = [shamlet|<lable>ni hao|]
renderChinese (Apples i) = [shamlet|<lable> ni you #{i} ge ping guo. |]
赶快来试一试吧
那我们能不能使用hamlet来进行中转呢?我们尝试写一段代码
renderLanguage::Msg->HtmlUrl Language
renderLanguage Hellp=[hamlet|<lable>Chinese|]
renderLanguage (Apples _) = [hamlet|<lable>Enghlish|]
...
main = putStrLn $ renderHtml $ (template 5) renderLanguage renderUrl
这里我们会得到一个冲突,template
的类型为HtmlUrlI18n Msg Data1
,它需要一个Msg->Html
的结构,而我们的renderLanguage
提供的类型为Msg->HtmlUrl Language
,显然不符合,那么我们这里稍加改造
renderLanguage::Msg->Html
renderLanguage Hello =[hamlet|<label>@{Chinese}|] renderUrl1
renderLanguage (Apples _)=[hamlet|<label>@{English}|] renderUrl1
renderUrl1::Language->[(Text,Text)]->Text
至此我们已经能够理解hamlet的层次了
shamlet
没有需要渲染的值
hamlet
有@
和@?
的值,通过第一个参数提供
ihamlet
有@
,@?
,_{..}
的值,其中_{..}
通过第一个render参数提供,@
和@?
通过第二个参数提供,
shamlet
,hamlet
,ihamlet
均可以通过#{}
来进行参数值替换
hamlet
和ihamlet
的参数的渲染的结果类型为Text
,
三种hamlet
的最终类型均为Html
,由renderHtml
渲染为String
如果需要读取文件并渲染,参考简单文件渲染