Text.Blaze中的可选html属性

时间:2012-01-14 08:37:41

标签: html haskell

Text.Blaze有一个运营商!添加属性到html:

option ! id "bla" ! value "1" ! selected "" $ "Hello!"

我的问题是如何让属性可选? 现在我的代码很难看:

option ! id "bla" ! value "1" ! (if x == val then selected "" else someStupidAttribute "")  $ "Hello!"

这导致每个html选项元素都有不必要的无关属性,因为我必须提供一个。

编辑:我接受了hammar的回答。我创建了一个辅助函数:

(!?) :: Attributable h => h -> (Bool,Attribute) -> h
html !? (True, attr) = html ! attr
html !? _ = html

以下是如何使用它:

option ! id "bla" ! value "1" !? ((k == val), selected "") $ "Hello!"

4 个答案:

答案 0 :(得分:5)

如何定义便利运算符以有条件地应用属性?

(!?) :: Attributable h => h -> Maybe Attribute -> h
html !? (Just attr) = html ! attr
html !? Nothing = html

有了这个,您可以按如下方式编写示例。

option ! id "bla" ! value "1" !? toMaybe (x == val) (selected "") $ "Hello!"

在这里,toMaybe只是构建Maybe值的有用助手,但如果您愿意,可以使用其他内容。

toMaybe :: Bool -> a -> Maybe a
toMaybe False _ = Nothing
toMaybe True  x = Just x

答案 1 :(得分:2)

我最喜欢的条件是使用列表推导; [foo | x]会评估为[foo][]。我们能适应这个伎俩吗好吧,使用一个应用属性列表的辅助函数:

element !. options = foldr (!) element options -- (!.) = foldr (!)

现在你可以写一些相对非常像这两个中的一个(取决于品味):

option ! id "bla" ! value "1" !. [selected "" | x == val] $ "Hello!"
option !. [id "bla", value "1"] ++ [selected "" | x == val] $ "Hello!"

您可能需要为!.添加固定声明;您可以在ghci中使用:i !来查看您要与之互操作的内容。

答案 2 :(得分:0)

我不知道是否有更好的Blaze特定的方式来做这个,我知道这不是非常可读,但你可以做到

(if x == val then (! selected "") else id) (option ! id "bla" ! value "1") $ "Hello!"

答案 3 :(得分:0)

这似乎对我有用 - mempty:

import Data.Monoid (mempty)
option ! id "bla" ! value "1" ! (if x == val then selected "" else mempty) $ "Hello!"