Skip to content

Commit d5a40fe

Browse files
committed
editor: working example
1 parent ae3a309 commit d5a40fe

File tree

5 files changed

+100
-32
lines changed

5 files changed

+100
-32
lines changed

build/editor.nix

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,29 @@ let
77
rev = "716879f16d53c93766e7ed9af17416fccb2edfe1";
88
};
99

10+
reflexWidgetsSrc = fetchGit {
11+
url = https://github.com/atidot/reflex-widgets;
12+
rev = "d270d3c63e1d3d3399343cd2792734b30a9b96cb";
13+
};
14+
1015
reflex-platform = import reflexPlatformSrc {};
1116
in
1217
reflex-platform.project({ pkgs, ... }: {
1318
packages = {
1419
language-powerquery-ast = ../language-powerquery-ast;
1520
language-powerquery = ../language-powerquery;
1621
language-powerquery-editor = ../language-powerquery-editor;
22+
23+
reflex-utils = reflexWidgetsSrc + "/reflex-utils";
24+
reflex-mdl = reflexWidgetsSrc + "/reflex-mdl";
25+
reflex-chartjs = reflexWidgetsSrc + "/reflex-chartjs";
26+
reflex-jsoneditor = reflexWidgetsSrc + "/reflex-jsoneditor";
27+
reflex-codemirror = reflexWidgetsSrc + "/reflex-codemirror";
28+
reflex-select2 = reflexWidgetsSrc + "/reflex-select2";
1729
};
1830

1931
shells = {
20-
ghcjs = [ "language-powerquery-ast"
21-
"language-powerquery"
22-
"language-powerquery-editor"
32+
ghcjs = [ "language-powerquery-editor"
2333
];
2434
};
2535
})

language-powerquery-editor/README.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
1-
# m2wasm
2-
(WIP) PowerQuery -> WASM compilation
1+
# language-powerquery-editor
2+
Reflex FRP viewer for PowerQuery parser
3+
4+
![alt text][editor_poc]
5+
6+
[editor_poc]: raw/language-powerquery-editor-poc.gif

language-powerquery-editor/language-powerquery-editor.cabal

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ library
2626
, uniplate
2727
, aeson
2828
, bytestring
29+
, data-default
2930
, text
3031
, time
3132
, language-powerquery-ast
@@ -34,6 +35,13 @@ library
3435
, ghcjs-dom
3536
, reflex
3637
, reflex-dom
38+
39+
, reflex-utils
40+
, reflex-mdl
41+
, reflex-chartjs
42+
, reflex-codemirror
43+
, reflex-jsoneditor
44+
, reflex-select2
3745
hs-source-dirs: src
3846
default-language: Haskell2010
3947

Loading

language-powerquery-editor/src/Language/PowerQuery/Editor/Editor.hs

Lines changed: 73 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4,53 +4,99 @@
44
{-# LANGUAGE RankNTypes #-}
55
module Language.PowerQuery.Editor.Editor where
66

7+
import Prelude hiding (head)
78
import "base" Control.Monad.IO.Class (liftIO)
9+
import "lens" Control.Lens
10+
import "data-default" Data.Default (def)
811
import "uniplate" Data.Generics.Uniplate.Data (universeBi)
912
import "aeson" Data.Aeson (Value(Null), toJSON)
10-
import "text" Data.Text (Text, unpack)
13+
import "text" Data.Text (Text, unpack, pack)
1114
import "time" Data.Time.Clock (getCurrentTime)
1215
import "reflex" Reflex
1316
import "reflex-dom" Reflex.Dom hiding (Value)
17+
18+
import "reflex-utils" Reflex.Utils
19+
import "reflex-mdl" Reflex.MDL
20+
import "reflex-chartjs" Reflex.ChartJS.ChartJS
21+
import "reflex-codemirror" Reflex.CodeMirror
22+
import "reflex-jsoneditor" Reflex.JsonEditor
23+
import "reflex-select2" Reflex.Select2.Select2
1424
import "language-powerquery-ast" Language.PowerQuery.AST
1525
import "language-powerquery" Language.PowerQuery
1626

17-
codemirror :: forall t m. (MonadWidget t m)
18-
=> ()
19-
-> m (Event t Text)
20-
codemirror _ = return undefined
27+
--
28+
main :: IO ()
29+
main = mainWidget main_
30+
where
31+
main_ :: forall t m. MonadWidget t m => m ()
32+
main_ = do
33+
headD <- head
34+
whenLoaded [headD] blank body
35+
return ()
36+
37+
38+
--
39+
head :: forall t m. MonadWidget t m => m (Dynamic t Bool)
40+
head = do
41+
s1Ds <- sequence [ script "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"
42+
, script "https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.bundle.min.js"
43+
44+
, script "https://cdnjs.cloudflare.com/ajax/libs/jsoneditor/6.1.0/jsoneditor.min.js"
45+
, css "https://cdnjs.cloudflare.com/ajax/libs/jsoneditor/6.1.0/jsoneditor.min.css"
2146

22-
jsoneditor :: forall t m. (MonadWidget t m)
23-
=> Dynamic t Value
24-
-> m ()
25-
jsoneditor _ = return ()
47+
, script "https://cdnjs.cloudflare.com/ajax/libs/material-design-lite/1.3.0/material.min.js"
48+
, css "https://cdnjs.cloudflare.com/ajax/libs/material-design-lite/1.3.0/material.min.css"
49+
, script "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.48.0/codemirror.min.js"
50+
, css "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.48.0/codemirror.min.css"
51+
, css "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.48.0/theme/zenburn.css"
52+
]
53+
whenLoaded s1Ds blank $ do
54+
sequence [ script "https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.7/js/select2.full.min.js"
55+
, css "https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.7/css/select2.css.min"
56+
]
57+
return ()
2658

2759

60+
--
2861
body :: forall t m. (MonadWidget t m)
2962
=> m ()
3063
body = do
31-
-- code editor
32-
(scriptE' :: Event t Text) <- codemirror ()
33-
scriptE <- debounce 1 scriptE' -- rate limit change events from editor
64+
mdlGrid $ do
65+
-- code editor
66+
scriptE <- mdlCell 6 $ do
67+
(scriptE' :: Event t Text) <- codemirror codeMirrorConfig
68+
debounce 0.05 scriptE' -- rate limit change events from editor
3469

35-
-- Tokens
36-
let lexE = (lexer . unpack) <$> scriptE
37-
let (tokensE :: Event t [Token]) = filterRight lexE
38-
let (lexErrorE :: Event t String) = filterLeft lexE
70+
-- Tokens
71+
let lexE = (lexer . unpack) <$> scriptE
72+
let (tokensE :: Event t [Token]) = filterRight lexE
73+
let (lexErrorE :: Event t String) = filterLeft lexE
3974

40-
-- AST
41-
let (astE :: Event t (Document Annotation)) = parseDocument <$> tokensE
42-
let (variablesE :: Event t [Variable Annotation]) = variables <$> astE
75+
-- AST
76+
let (astE :: Event t (Document Annotation)) = parseDocument <$> tokensE
4377

44-
-- JSON viewer
45-
let (jsonE :: Event t Value) = toJSON <$> astE
46-
jsonD <- holdDyn Null jsonE
47-
jsoneditor jsonD
78+
let (variablesE :: Event t [Text]) = (map (pack . show) . map _variable_name . variables) <$> astE
79+
variablesD <- holdDyn [] variablesE
80+
81+
-- JSON viewer
82+
_ <- mdlCell 6 $ do
83+
-- variables
84+
display variablesD
85+
--_ <- select2 def variablesD
86+
87+
-- JSON editor
88+
let (jsonE :: Event t Value) = toJSON <$> astE
89+
jsonD <- holdDyn Null jsonE
90+
_ <- jsoneditor jsonD
91+
blank
92+
93+
return ()
4894

4995
where
5096
variables :: (Document Annotation -> [Variable Annotation])
5197
variables = universeBi
5298

53-
54-
55-
main = mainWidget $ do
56-
body
99+
codeMirrorConfig :: Configuration
100+
codeMirrorConfig
101+
= def
102+
& configuration_theme ?~ pack "zenburn"

0 commit comments

Comments
 (0)