Haskell之Yesod开发–简单网站开发(二)

来源:互联网 发布:华硕主板开启网络唤醒 编辑:程序博客网 时间:2024/06/06 02:54

接下来复制三段代码,从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

hamletshamlet要高级一点,它需要一个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.Htmltype HtmlUrlI18n msg url = Translate msg -> Render url-> HtmlrenderHtml::Text.Blaze.Html.Html->String
$ renderHtml $ (ihamlet) (toHtml.renderEnglish) renderUrl

则后段函数的输出类型Html刚好满足renderHtml的参数类型需求

这里我们注意到 toHtml.renderEnglish的类型是Msg->Html,而我们的[shamlet|..|]的类型也正好是Html,那我们是不是可以使用一个f::Msg->Html的函数来替换掉呢?答案是肯定的。请看下列代码

renderChinese::Msg->HtmlrenderChinese Hellp = [shamlet|<lable>ni hao|]renderChinese (Apples i) = [shamlet|<lable> ni you #{i} ge ping guo. |]

赶快来试一试吧

那我们能不能使用hamlet来进行中转呢?我们尝试写一段代码

renderLanguage::Msg->HtmlUrl LanguagerenderLanguage 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->HtmlrenderLanguage Hello =[hamlet|<label>@{Chinese}|] renderUrl1renderLanguage (Apples _)=[hamlet|<label>@{English}|] renderUrl1renderUrl1::Language->[(Text,Text)]->Text

至此我们已经能够理解hamlet的层次了

shamlet没有需要渲染的值
hamlet@@?的值,通过第一个参数提供
ihamlet@,@?,_{..}的值,其中_{..}通过第一个render参数提供,@@?通过第二个参数提供,
shamlet,hamlet,ihamlet均可以通过#{}来进行参数值替换

hamletihamlet参数的渲染的结果类型为Text
三种hamlet的最终类型均为Html,由renderHtml渲染为String

如果需要读取文件并渲染,参考简单文件渲染

0 0
原创粉丝点击