packages feed

feed-translator-0.1.0.1: src/Web/Feed/FeedTranslatorView.hs

{-# LANGUAGE OverloadedStrings, QuasiQuotes #-}
module Web.Feed.FeedTranslatorView (index) where

import Control.Monad (forM_)
import Data.List (intercalate)

import qualified Data.Map.Strict as M
import qualified Data.Set as S
import Text.Blaze (dataAttribute)
import Text.Blaze.Html (Html, toHtml)
import Text.Blaze.Html5
import Text.Blaze.Internal (AttributeValue, stringValue)
import qualified Text.Blaze.Html5 as H
import qualified Text.Blaze.Html5.Attributes as A
import Text.RawString.QQ

languagePairs :: M.Map String (S.Set String)
languagePairs = M.fromList [ ("en", S.fromList ["ko", "es", "pt", "id", "th"])
                           , ("ko", S.fromList ["en", "ja"])
                           , ("ja", S.fromList ["ko"])
                           , ("es", S.fromList ["en"])
                           , ("pt", S.fromList ["en"])
                           , ("id", S.fromList ["en"])
                           , ("th", S.fromList ["en"])
                           ]

languageNames :: M.Map String String
languageNames = M.fromList [ ("en", "English")
                           , ("ko", "한국어")
                           , ("ja", "日本語")
                           , ("es", "español")
                           , ("pt", "português")
                           , ("id", "Bahasa Indonesia")
                           , ("th", "ไทย")
                           ]

languageSelector :: AttributeValue -- | The 'name' of 'select' element.
                 -> Html
languageSelector name' =
    select ! A.name name' ! A.id name' ! A.class_ "browser-default" $ do
        let langs = M.toList languageNames
        forM_ langs $ \(code, name') ->
            let targets = case M.lookup code languagePairs of
                              Just set -> intercalate "," $ S.toList set
                              Nothing -> ""
                opt = option ! A.value (stringValue code)
                             ! dataAttribute "targets" (stringValue targets)
            in case targets of
                   "" -> opt ! A.disabled "disabled"
                   _ -> opt
               $ toHtml (name' ++ " [" ++ code ++ "]")

materializeCss :: AttributeValue
materializeCss = "//cdnjs.cloudflare.com/ajax/libs/materialize/0.97.0/css/materialize.min.css"

materializeJs :: AttributeValue
materializeJs = "//cdnjs.cloudflare.com/ajax/libs/materialize/0.97.0/js/materialize.min.js"

jQueryJs :: AttributeValue
jQueryJs = "//code.jquery.com/jquery-2.1.4.min.js"

index :: Html
index =
    docTypeHtml $ do
        H.head $ do
            meta ! A.charset "utf8"
            title "Feed Translator"
            link ! A.rel "stylesheet" ! A.href materializeCss
        body $ do
            nav $
                H.div ! A.class_ "container" $
                    H.div ! A.class_ "nav-wrapper" $
                        a ! A.class_ "brand-logo"
                          ! A.href "/"
                          $ "Feed Translator"
            H.div ! A.class_ "container" $ do
                p $ do
                    "Powered by "
                    a ! A.href "http://translate.naver.com/"
                      $ "Naver Translate"
                    "."
                form ! A.action "/query/" $ do
                    H.div ! A.class_ "row" $ do
                        H.div ! A.class_ "col s6" $ do
                            H.div ! A.class_ "row" $
                                H.div ! A.class_ "input-field col s12" $
                                    label ! A.for "source" $ "From"
                            H.div ! A.class_ "row" $
                                H.div ! A.class_ "input-field col s12" $
                                    languageSelector "source"
                        H.div ! A.class_ "col s6" $ do
                            H.div ! A.class_ "row" $
                                H.div ! A.class_ "input-field col s12" $
                                    label ! A.for "target" $ "To"
                            H.div ! A.class_ "row" $
                                H.div ! A.class_ "input-field col s12" $
                                    languageSelector "target"
                    H.div ! A.class_ "row" $
                        H.div ! A.class_ "input-field col s12" $ do
                            input ! A.id "url"
                                  ! A.name "url"
                                  ! A.type_ "url"
                                  ! A.class_ "validate"
                            label ! A.for "url" $ "URL"
                    H.div ! A.class_ "row" $
                        H.div ! A.class_ "input-field col s12" $
                            button ! A.type_ "submit"
                                   ! A.class_ "waves-effect waves-light btn"
                                   $ "Translate"
            script ! A.src jQueryJs $ ""
            script ! A.src materializeJs $ ""
            script [r|
                (function ($) {
                    var filterTarget = function () {
                        var sourceOption = $('option:selected', this);
                        var dataTargets = sourceOption.data('targets') || '';
                        var targets = dataTargets.split(',');
                        $('select[name=target] > option').prop(
                            'disabled',
                            function () {
                                return targets.indexOf(this.value) < 0;
                            }
                        );
                        $('select[name=target] > ' +
                          'option:not(:disabled):first').prop('selected', true);
                    };
                    var source = $('select[name=source]').change(filterTarget)
                                                         .each(filterTarget);
                })(jQuery);
            |]