Haskell之Yesod开发–简单网站开发(二)
2015-06-16 15:38
615 查看
接下来复制三段代码,从P60最后到P65。要注意第三段代码,
对于第三段代码,我们执行一下,会看到控制台输出了文件的内容
接下来复制P67页的代码。这里我们会了解到
然后复制P68页的代码。我们会看到如何渲染一段简单的Html标签语言
然后我们稍作一点替换
接下来我们略微做一点总结
@{DataType}:例如
@{(DataType,[(key,value)])}:
解析函数会将
则后段函数的输出类型
这里我们注意到
赶快来试一试吧
那我们能不能使用hamlet来进行中转呢?我们尝试写一段代码
这里我们会得到一个冲突,
至此我们已经能够理解hamlet的层次了
三种
如果需要读取文件并渲染,参考简单文件渲染
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
如果需要读取文件并渲染,参考简单文件渲染
相关文章推荐
- Haskell之Yesod开发–简单网站开发(一)
- Linux内核中Netfilter架构介绍
- 【Java安全技术探索之路系列:Java可扩展安全架构】之二十二:SASL(三):SASL编程模型.md
- 【Java安全技术探索之路系列:Java可扩展安全架构】之二十一:SASL(二):SASL类和接口.md
- 【Java安全技术探索之路系列:Java可扩展安全架构】之二十:SASL(一):SASL架构介绍.md
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十九:JGSS(三):JGSS编程模型.md
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十八:JGSS(二):JGSS类和接口
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十七:JGSS(一):JGSS架构介绍
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十六:JAAS(三):JAAS编程模型
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十五:JAAS(二):JAAS类和接口
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十四:JAAS(一):JAAS架构介绍
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十三:JSSE(三):JSSE编程模型
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十二:JSSE(二):JSSE类和接口
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十一:JSSE(一):JSSE架构介绍
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十:JCP(三):JCP编程模型
- 【Java安全技术探索之路系列:Java可扩展安全架构】之九:JCP(二):JCP类和接口
- 【Java安全技术探索之路系列:Java可扩展安全架构】之八:JCP(一):JCP架构介绍
- Android开发有用的三方网站
- 网站实时弹幕
- 如何理解Xen sHype/ACM安全架构