Haskell Snap Framework - 带有Heist的动态超链接

时间:2013-08-07 18:28:49

标签: haskell haskell-snap-framework heist

我正在尝试使用Heist模板系统创建动态链接。问题是链接显示为文本而不是解释为html。是否有一种特定的方法可以使用Heist创建这样的动态列表?

构建链接的功能:

renderCategories :: Monad m => Db.Category -> I.Splice m
renderCategories (Db.Category catid catname catdesc) =
  I.runChildrenWithText [ ("categoryId", T.concat $ ["<a    href='http://localhost:8000/thread_home?cateid=", T.pack . show $ catid, "'>", T.pack . show $ catid, "</a>"])
    , ("categoryName", catname)
    , ("categoryDesc", catdesc)]

标签在网页上显示为“http:// localhost:8000 / thread_home?cateid = 1'&gt; 1”文字。消息来源显示如下:

&lt;a href='http://localhost:8000/thread_home?cateid=1'&gt;1&lt;/a&gt;

我认为我需要打印实际的&lt;和&gt;但我不知道如何实现这一目标。 由于我目前正在运行runChildrenWithText以填充此Heist模板,因此更改为runChildrenWith需要拼接而不是文本,因此我希望有一些方法可以在没有'&lt;'的情况下运行ChildrenWithText和'&gt;'被转换为'&amp; lt'和'&amp; gt'。 任何帮助表示赞赏!

修改

我正在尝试使用以下方法手动创建链接:

renderCategories :: Monad m => Db.Category -> I.Splice m
renderCategories (Db.Category catid catname catdesc) =
  I.runChildrenWith [ ("categoryId", return $ X.Element "a"[("href", "http://localhost")] $ X.TextNode (T.pack $ show catid))]

但是我遇到两个错误:

Couldn't match type `X.Node' with `[X.Node]'
Expected type: I.Splice m
  Actual type: heist-0.11.1:Heist.Types.HeistT m m X.Node
In the expression:
  return
  $ X.Element "a" [("href", "http://localhost")]
    $ X.TextNode (T.pack $ show catid)

Couldn't match expected type `[X.Node]' with actual type `X.Node'
In the return type of a call of `X.TextNode'
In the second argument of `($)', namely
  `X.TextNode (T.pack $ show catid)'

我目前并不理解这些错误,我们非常感谢任何帮助。

返回链接和普通文本的工作函数:

renderCategories :: Monad m => Db.Category -> I.Splice m
renderCategories (Db.Category catid catname catdesc) =
I.runChildrenWith [( "categoryId", return $ [X.Element "a" [("href", T.concat $     ["http://localhost:8000/thread_home?cateid=", T.pack $ show catid] )] [X.TextNode (T.pack $  show catid)] ] )
, ("categoryName", I.textSplice catname)
, ("categoryDesc",  I.textSplice catdesc)]

1 个答案:

答案 0 :(得分:2)

您所看到的行为正是预期的行为。您遇到问题的原因是因为您正在使用runChildrenWithText这是一个更高级别的功能,专门用于返回文本节点的情况。它适用于您希望页面上显示实际文本的时间。您所看到的是实现这一目标的正确方法。

splice是一个返回节点列表的计算。

type Splice n = HeistT n n [Node]

Node是DOM作为Haskell类型的表示,所以如果你想返回一个链接,你应该这样做:

return $ [Element "a" [("href", "http://localhost")] [TextNode (T.pack $ show catid)]]

要使用此类拼接,您需要使用runChildrenWith代替runChildrenWithText

如果Node的手动创建看起来很难看,那么还有一个更方便的选择。如果您导入模块Text.Blaze.Renderer.XmlHtml,则会在那里找到可以使用blaze-html语法生成Node树的函数。