on master help sign in
* Language.Elm.Yesod
cdef603Vincent Ambo
Elm.cabal+3−2
@@ -61,10 +61,11 @@ Executable elm-server
61 Build-depends: base >=4.2 && <5, containers >= 0.3, transformers >= 0.2,
61 Build-depends: base >=4.2 && <5, containers >= 0.3, transformers >= 0.2,
62 mtl >= 2, parsec >= 3.1.1, blaze-html == 0.5.0.*,
62 mtl >= 2, parsec >= 3.1.1, blaze-html == 0.5.0.*,
63 HTTP >= 4000, happstack-server == 7.0.2,
63 HTTP >= 4000, happstack-server == 7.0.2,
64− deepseq
64+ deepseq, yesod-core, shakespeare-css, shakespeare-js, hamlet,
65+ template-haskell
65
66
66Library
67Library
67− exposed-modules: Language.Elm
68+ exposed-modules: Language.Elm, Language.Elm.Yesod
68 Hs-Source-Dirs: src, src/Parse, src/Types
69 Hs-Source-Dirs: src, src/Parse, src/Types
69 other-modules: Ast, CompileToJS, GenerateHtml, Guid, Initialize,
70 other-modules: Ast, CompileToJS, GenerateHtml, Guid, Initialize,
70 Rename, Binop, Combinators, Lexer,
71 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+|]