2012-01-14 16 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!" 

これは、私は1つを供給する必要があるという理由だけで、不要な無関係な属性を持っているすべてのHTMLオプション要素につながります。

EDIT:私はハンマーの答えを受け入れました。私はこれを行うためのより良いブレイズ固有の方法があるかどうかわからない、と私は、このISNを知っ

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

'' [テキストブレイズ-Internal.html](https://hackage.haskell.org/package/blazeに今です!? -markup-0.7.0.3/docs/Text-Blaze-Internal.html#t:属性あり)。 :) – Johannes

答えて

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!" 

toMaybeMaybe値を構築するための単なる便利なヘルパーですが、あなたが望むなら、あなたは何か他のものを使用することができます。

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

ありがとう、私はそれが好きです。私の質問は、もし私がText.Blaze自体から何かを見逃していたら本当にありました。私自身のヘルパー関数を定義しなければならない場合は、ブール値と属性を受け入れることができます。 –

0

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

そして、ここではそれを使用する方法は次のとおりです。私は、ヘルパー関数を作成しました「Tひどく読めるが、あなたは条件付き属性を適用するために便利な演算子の定義について

(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

クールフリーク。どうもありがとうございました。私はあなたを支持しましたが、私は既に他の答えを受け入れました。 –

+0

Btw折り畳みではなく折り畳み –

0

これは私のために働くようだ - mempty:

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