Mercurial > repos > tabletprog
comparison src/editor.tp @ 30:608eb70fe261
Fix some compiler bugs and do initial work on module import
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 19 Apr 2012 19:20:21 -0700 |
parents | editor.tp@18cec540238a |
children | 668f533e5284 |
comparison
equal
deleted
inserted
replaced
29:18cec540238a | 30:608eb70fe261 |
---|---|
1 #{ | |
2 //mquery functions | |
3 q <- foreign: :query {} | |
4 qall <- foreign: :query {} | |
5 each <- foreign: :iterable fun {} | |
6 addClass <- foreign: :node className {} | |
7 removeClass <- foreign: :node className {} | |
8 get <- foreign: :url onSuccess onFail onOther {} | |
9 newEl <- foreign: :tagname props {} | |
10 | |
11 //TP Parser | |
12 parser <- foreign: #{ | |
13 parse <- foreign: :str {} | |
14 } | |
15 isLambda <- foreign: :astnode {} | |
16 | |
17 //js builtins | |
18 console <- foreign: #{ | |
19 log <- foreign: :val {} | |
20 } | |
21 window <- foreign: #{} | |
22 Object <- foreign: #{ | |
23 keys <- foreign: :object {} | |
24 } | |
25 | |
26 //kernel definitions | |
27 true <- #{ | |
28 if:else <- :self trueblock :elseblock { | |
29 trueblock: | |
30 } | |
31 } | |
32 | |
33 false <- #{ | |
34 if:else <- :self trueblock :elseblock { | |
35 elseblock: | |
36 } | |
37 } | |
38 | |
39 filter <- :arr pred { | |
40 output <- arr slice: 0 0 | |
41 each: arr :idx el { | |
42 if: (pred: el) { | |
43 output push: el | |
44 } else: {} | |
45 } | |
46 output | |
47 } | |
48 | |
49 //editor code | |
50 editFile <- :path { | |
51 get: path :request { | |
52 addClass: (q: "body") "editorMode" | |
53 src <- request responseText | |
54 ast <- parser parse: src | |
55 ast populateSymbols: (foreign: null) | |
56 ast toHTML: (q: "#src") | |
57 } | |
58 } | |
59 | |
60 selectNode <- :node { | |
61 each: (qall: ".selected") :idx el { | |
62 removeClass: el "selected" | |
63 } | |
64 addClass: node "selected" | |
65 } | |
66 | |
67 selectQuery <- :selector { | |
68 selectQuery: selector in: (foreign: undefined) | |
69 } | |
70 | |
71 selectQuery:in <- :selector :context { | |
72 each: (qall: ".selected") :idx el { | |
73 removeClass: el "selected" | |
74 } | |
75 each: (qall: selector context) :idx el { | |
76 addClass: el "selected" | |
77 } | |
78 } | |
79 | |
80 selectParent <- :node { | |
81 each: (qall: ".selectParent") :idx el { | |
82 removeClass: el "selected" | |
83 } | |
84 addClass: (node parentNode) "selectParent" | |
85 } | |
86 | |
87 popInscope:onClick <- :syms :handler { | |
88 inscope <- q: "#inscope" | |
89 inscope innerHTML!: "" | |
90 each: syms :idx key { | |
91 inscope appendChild: (newEl: "li" #{ | |
92 textContent <- key | |
93 onclick <- { handler: key } | |
94 }) | |
95 } | |
96 } | |
97 | |
98 symbolClick <- :domnode astnode event { | |
99 console log: astnode | |
100 selectNode: domnode | |
101 popInscope: ((astnode symbols) allSymbols) onClick: :key { | |
102 domnode textContent!: key | |
103 astnode name!: key | |
104 } | |
105 event stopPropagation | |
106 } | |
107 | |
108 funClick <- :domnode astnode event { | |
109 selectParent: domnode | |
110 selectQuery: ".selectParent > .funpart" in: (domnode parentNode) | |
111 symtable <- astnode symbols | |
112 syms <- filter: (symtable allSymbols) :sym { | |
113 isLambda: ((symtable find: sym) def) | |
114 } | |
115 popInscope: syms onClick: {} | |
116 event stopPropagation | |
117 } | |
118 | |
119 lambdaClick <- :domnode astnode event { | |
120 symbolClick: domnode astnode event | |
121 } | |
122 | |
123 main <- { | |
124 get: "/src/" :data { | |
125 fakeEl <- newEl: "div" #{ | |
126 innerHTML <- data response | |
127 } | |
128 each: (qall: "a" fakeEl) :idx el { | |
129 if: ((el textContent) = "../") {} else: { | |
130 nel <- newEl: "a" #{ | |
131 href <- "/edit/src/" + (el textContent) | |
132 textContent <- el textContent | |
133 } | |
134 nel onclick!: :event { | |
135 link <- foreign: this | |
136 path <- link href | |
137 path <- path substr: (path indexOf: "/edit/") + 5 | |
138 editFile: path | |
139 foreign: false | |
140 } | |
141 li <- newEl: "li" | |
142 li appendChild: nel | |
143 (q: "#browser ul") appendChild: li | |
144 } | |
145 } | |
146 } | |
147 | |
148 //bind handlers for editor buttons | |
149 each: (qall: ".controls li") :idx el { | |
150 el onclick!: :event { | |
151 srcel <- (q: "#src") | |
152 srcel textContent!: (srcel textContent) + (el textContent) | |
153 } | |
154 } | |
155 (q: "#ops_button") onclick!: :event { | |
156 each: (qall: ".controls") :idx el { | |
157 addClass: el "showops" | |
158 } | |
159 } | |
160 | |
161 path <- (window location) pathname | |
162 if: (path indexOf: "/edit/") = 0 { | |
163 editFile: (path substr: 5) | |
164 } else: {} | |
165 } | |
166 | |
167 } |