[Add a Web.Text module Neil Mitchell**20080811221318] { addfile ./src/Web/Text.hs hunk ./src/Web/Text.hs 1 + +module Web.Text where + +import Data.Char +import Data.Maybe +import Data.TagStr +import Numeric + + +-- | Only append strings if neither one is empty +(+?) :: String -> String -> String +a +? b = if null a || null b then [] else a ++ b + +-- | Escape the second argument as HTML before appending +(+&) :: String -> String -> String +a +& b = a ++ escapeHTML b + +-- | Escape the second argument as a CGI query string before appending +(+%) :: String -> String -> String +a +% b = a ++ escapeCGI b + + +escapeHTML = concatMap f + where + f '\"' = """ + f '<' = "<" + f '>' = ">" + f x = [x] + +escapeCGI = concatMap f + where + f x | isAlphaNum x = [x] + | otherwise = '%' : ['0'|length s == 1] ++ s + where s = showHex (ord x) "" + + +showTagHTML = showTagHTMLWith (const Nothing) + + +showTagHTMLWith :: (TagStr -> Maybe String) -> TagStr -> String +showTagHTMLWith f x = g x + where + g x | isJust (f x) = fromJust $ f x + g (Str x) = escapeHTML x + g (Tags xs) = concatMap g xs + g (TagBold x) = "" ++ showTagHTML x ++ "" + g (TagUnderline x) = "" ++ showTagHTML x ++ "" + g (TagHyperlink url x) = "" ++ showTagHTML x ++ "" + g (TagColor i x) = "" ++ showTagHTML x ++ "" }