on master help sign in
* Language.Elm.Yesod

This module provides a very simple [elm| |] quasiquoter and a generateWidget function to use elm in combination with Yesod's widget system.

commitcdef603d8c249b6c5e2d2d1e510c277cb5ab444f authorVincent Ambo <v.ambo@me.com> dateMon 28 May 2012, 16:08 (14 years ago) parent51b2a28
2 files changed+45−2
Elm.cabal+3−2 src/Language/Elm/Yesod.hs+42
Elm.cabal+3−2
@@ -61,10 +61,11 @@ Executable elm-server
6161 Build-depends: base >=4.2 && <5, containers >= 0.3, transformers >= 0.2,
6262 mtl >= 2, parsec >= 3.1.1, blaze-html == 0.5.0.*,
6363 HTTP >= 4000, happstack-server == 7.0.2,
64− deepseq
64+ deepseq, yesod-core, shakespeare-css, shakespeare-js, hamlet,
65+ template-haskell
6566
6667Library
67− exposed-modules: Language.Elm
68+ exposed-modules: Language.Elm, Language.Elm.Yesod
6869 Hs-Source-Dirs: src, src/Parse, src/Types
6970 other-modules: Ast, CompileToJS, GenerateHtml, Guid, Initialize,
7071 Rename, Binop, Combinators, Lexer,
src/Language/Elm/Yesod.hsnew file+42
@@ -0,0 +1,42 @@
1+{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
2+
3+module Language.Elm.Yesod (elm, generateWidget) where
4+
5+import Language.Haskell.TH.Quote
6+import Language.Haskell.TH
7+import Text.Blaze (preEscapedToMarkup)
8+import Text.Hamlet
9+import Text.Julius
10+import Text.Lucius
11+import Yesod.Widget
12+
13+import Initialize
14+import CompileToJS
15+import ExtractNoscript
16+
17+elm :: QuasiQuoter
18+elm = QuasiQuoter {quoteExp = \s -> [|s|] }
19+
20+css = [lucius|
21+* { padding:0; margin:0;
22+hyphens: auto; -moz-hyphens: auto;
23+-webkit-hyphens: auto; -ms-hyphens: auto;}
24+body { font-family: Arial; }
25+a:link, a:visited, a:active { text-decoration: none}
26+a:hover {text-decoration: underline; color: #ff8f12;}
27+|]
28+
29+generateWidget :: String -> GWidget sub master ()
30+generateWidget source =
31+ let expr = initialize source
32+ js = compileToJS expr
33+ noscript = either id extract expr
34+ in do toWidgetHead css
35+ toWidgetHead [julius| #{js} |]
36+ [whamlet|
37+<div #widthChecker style="width:100%; height:1px; position:absolute; top:-1px;">
38+<span #content>
39+<script type="text/javascript">
40+ Dispatcher.initialize()
41+<noscript>^{preEscapedToMarkup noscript}
42+|]