【问题标题】:Haskell Snap Framework - Dynamic hyperlinks with HeistHaskell Snap 框架 - 带有 Heist 的动态超链接
【发布时间】:2013-08-08 05:23:13
【问题描述】:

我正在尝试使用 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'>1”文本。而源码显示如下:

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

我认为我需要让它打印实际的 ,但我不确定如何实现这一点。 由于我目前正在运行 runChildrenWithText 来填充这个 Heist 模板,更改为只是 runChildrenWith 需要拼接而不是文本,所以我希望有一些方法可以在没有 '' 的情况下 runChildrenWithText 被转换为 '&lt'和'&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)]

【问题讨论】:

    标签: haskell haskell-snap-framework heist


    【解决方案1】:

    您看到的行为正是预期的。您遇到问题的原因是因为您使用的是runChildrenWithText,这是一个更高级别的函数,专为您返回文本节点的情况而设计。它适用于您想要页面上的实际文本时。您所看到的是实现这一目标的正确方法。

    拼接是返回节点列表的计算。

    type Splice n = HeistT n n [Node]
    

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

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

    要使用这种接头,您需要使用runChildrenWith 而不是runChildrenWithText

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

    【讨论】:

    • 您编辑的错误是因为拼接必须返回[Node],但我只是返回了Node。另外,我在 TextNode 部分也犯了同样的错误。那也应该是一个列表。我已经更新了答案。
    • 在 Haskell 方面仍然是新手,因此很难解决这些问题,希望我做的越多越容易!
    • 是的,一开始很难。如果您仔细查看这些错误消息,我认为很容易看出发生了什么。编译器希望看到[Node],但它却看到了Node。你如何解决这个问题?将其包装在列表中。过一段时间就容易了。
    • 除了没有将数字连接到超链接的末尾之外,它似乎还可以工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    相关资源
    最近更新 更多