您的位置:首页 > 运维架构 > 网站架构

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

2015-06-16 15:38 615 查看
接下来复制三段代码,从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


如果需要读取文件并渲染,参考简单文件渲染
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐