2012-01-14 76 views
3

Text.Blaze有一個操作符!添加屬性到html:Text.Blaze中的可選html屬性

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

我的問題是我如何使屬性可選? 現在我的代碼是醜陋:

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

這導致每個HTML選項元素有不必要的屬性無關,只是因爲我必須提供一個。

編輯:我接受了哈馬爾的答案。我創建了一個輔助函數:

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

這裏是如何使用它:

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

''是現在[文本閃耀Internal.html(https://hackage.haskell.org/package/blaze -markup-0.7.0.3 /文檔/文本布拉-Internal.html#T:歸屬)。 :) – Johannes 2015-12-25 22:59:52

回答

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 
+0

謝謝,我喜歡它。我的問題是,如果我錯過了Text.Blaze本身的東西。如果我必須定義自己的幫助函數,那麼我可以只接受一個接受布爾值和屬性。 – 2012-01-14 17:50:16

0

我不知道是否有這樣做的更好的特定閃耀的方式,我知道這個ISN不是非常可讀,但你可以做

(if x == val then (! selected "") else id) (option ! id "bla" ! value "1") $ "Hello!" 
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 !來查看您想要與之互操作的內容。

+0

令人驚歎的酷。非常感謝你。我向你致敬,但我已經接受了其他答案。 – 2012-01-14 18:05:24

+0

順便說一句,它不折疊 – 2012-01-14 18:16:32

0

這似乎爲我工作 - mempty!?

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