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
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.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
均可以通过#{}
来进行参数值替换
hamlet
和ihamlet
的参数的渲染的结果类型为Text
,
三种hamlet
的最终类型均为Html
,由renderHtml
渲染为String
如果需要读取文件并渲染,参考简单文件渲染
- Haskell之Yesod开发–简单网站开发(二)
- Haskell之Yesod开发–简单网站开发
- Haskell之Yesod开发–简单网站开发(一)
- Haskell之Yesod开发–简单网站开发(三)
- Haskell之Yesod开发–简单网站开发(四)
- Haskell之Yesod开发–简单网站开发(五)
- Haskell之Yesod开发–基础环境
- Haskell之Yesod开发–边踩坑边开发(1)
- Haskell之Yesod开发–边踩坑边开发(2)
- Haskell之Yesod开发–边踩坑边开发(3)
- Haskell之Yesod开发–边踩坑边开发(4)
- Haskell之Yesod开发–边踩坑边开发(4.1)
- Haskell之Yesod开发–边踩坑边开发(2.1)
- Haskell的yesod框架-1
- Haskell的Yesod技术大全
- Haskell 开发环境搭建
- sublime text开发haskell
- webservice篇之简单开发(二)
- app 性能测试--弱网
- wxPython写计算器
- Error:Attribute application@icon value=(@drawable/ic_launcher) 报错的解决方法
- Haskell之Yesod开发–简单网站开发(一)
- Convert Sorted List to Binary Search Tree
- Haskell之Yesod开发–简单网站开发(二)
- Android—Greendao:SQLite Exception: no such table Error [duplicate]
- 1 微信企业号、订阅号、服务号之间有什么区别
- 浮点数的表示 问题
- TI低功耗蓝牙(BLE)介绍
- StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程
- python替换字符串中的子串 %(xxxx)s
- Spring3 MVC 注解(一)---注解基本配置及@controller和 @RequestMapping 常用解释
- oracle dmp文件导入导出