Mercurial > repos > tabletprog
comparison src/editor.tp @ 126:a2d2d8e09291
Merge
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 05 Aug 2013 23:37:17 -0700 |
parents | 1157639353e7 |
children | 2b25d0ce2946 |
comparison
equal
deleted
inserted
replaced
125:6f8d868e8da0 | 126:a2d2d8e09291 |
---|---|
3 q <- foreign: :query {} | 3 q <- foreign: :query {} |
4 qall <- foreign: :query {} | 4 qall <- foreign: :query {} |
5 each <- foreign: :iterable fun {} | 5 each <- foreign: :iterable fun {} |
6 addClass <- foreign: :node className {} | 6 addClass <- foreign: :node className {} |
7 removeClass <- foreign: :node className {} | 7 removeClass <- foreign: :node className {} |
8 hasClass <- foreign: :node className {} | |
8 get <- foreign: :url onSuccess onFail onOther {} | 9 get <- foreign: :url onSuccess onFail onOther {} |
10 getEl <- foreign: :from idx {} | |
11 setEl <- foreign: :to idx val {} | |
9 newEl <- foreign: :tagname props {} | 12 newEl <- foreign: :tagname props {} |
10 | 13 |
11 //TP Parser | 14 //TP Parser |
12 parser <- foreign: #{ | 15 parser <- foreign: #{ |
13 parse <- foreign: :str {} | 16 parse <- foreign: :str {} |
22 Object <- foreign: #{ | 25 Object <- foreign: #{ |
23 keys <- foreign: :object {} | 26 keys <- foreign: :object {} |
24 } | 27 } |
25 | 28 |
26 //kernel definitions | 29 //kernel definitions |
27 import: kernel | 30 //import: kernel |
31 | |
32 filter <- :arr pred { | |
33 output <- arr slice: 0 0 | |
34 each: arr :idx el { | |
35 if: (pred: el) { | |
36 output push: el | |
37 } else: {} | |
38 } | |
39 output | |
40 } | |
28 | 41 |
29 //editor code | 42 //editor code |
43 selection <- #{ | |
44 valid? <- false | |
45 } | |
46 | |
47 setSelection:withInNode <- :astnode :innode { | |
48 fakeEvent <- #{ | |
49 stopPropagation <- :Blah { | |
50 } | |
51 } | |
52 selection <- #{ | |
53 valid? <- true | |
54 in <- { | |
55 (innode domNode) onclick: fakeEvent | |
56 } | |
57 out <- { | |
58 fakeEvent <- #{ | |
59 stopPropagation <- :Blah { | |
60 } | |
61 } | |
62 ((astnode up) domNode) onclick: fakeEvent | |
63 } | |
64 } | |
65 } | |
66 | |
67 setSelection <- :astnode { | |
68 fakeEvent <- #{ | |
69 stopPropagation <- :Blah { | |
70 } | |
71 } | |
72 selection <- #{ | |
73 valid? <- true | |
74 in <- { | |
75 } | |
76 out <- { | |
77 fakeEvent <- #{ | |
78 stopPropagation <- :Blah { | |
79 } | |
80 } | |
81 ((astnode up) domNode) onclick: fakeEvent | |
82 } | |
83 } | |
84 } | |
85 | |
30 editFile <- :path { | 86 editFile <- :path { |
31 get: path :request { | 87 get: path :request { |
32 addClass: (q: "body") "editorMode" | 88 addClass: (q: "body") "editorMode" |
33 src <- request responseText | 89 src <- request responseText |
34 ast <- parser parse: src | 90 ast <- parser parse: src |
57 } | 113 } |
58 } | 114 } |
59 | 115 |
60 selectParent <- :node { | 116 selectParent <- :node { |
61 each: (qall: ".selectParent") :idx el { | 117 each: (qall: ".selectParent") :idx el { |
62 removeClass: el "selected" | 118 removeClass: el "selectParent" |
63 } | 119 } |
64 addClass: (node parentNode) "selectParent" | 120 addClass: node "selectParent" |
65 } | 121 } |
66 | 122 |
67 popInscope:onClick <- :syms :handler { | 123 popInscope:onClick <- :syms :handler { |
68 inscope <- q: "#inscope" | 124 inscope <- q: "#inscope" |
69 inscope innerHTML!: "" | 125 inscope innerHTML!: "" |
70 each: syms :idx key { | 126 each: syms :idx key { |
71 inscope appendChild: (newEl: "li" #{ | 127 inscope appendChild: (newEl: "li" #{ |
72 textContent <- key | 128 textContent <- key |
73 onclick <- { handler: key } | 129 onclick <- :Event { handler: key } |
74 }) | 130 }) |
75 } | 131 } |
76 } | 132 } |
77 | 133 |
134 scalarClick <- :domnode astnode event { | |
135 selectNode: domnode | |
136 setSelection: astnode | |
137 event stopPropagation: (foreign: undefined) | |
138 //TODO: set focus | |
139 } | |
140 | |
78 symbolClick <- :domnode astnode event { | 141 symbolClick <- :domnode astnode event { |
79 console log: astnode | |
80 selectNode: domnode | 142 selectNode: domnode |
81 popInscope: ((astnode symbols) allSymbols) onClick: :key { | 143 popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { |
82 domnode textContent!: key | 144 domnode textContent!: key |
83 astnode name!: key | 145 astnode name!: key |
84 } | 146 } |
85 event stopPropagation | 147 setSelection: astnode |
148 event stopPropagation: (foreign: undefined) | |
149 } | |
150 | |
151 assignClick <- :domnode astnode event { | |
152 selectParent: domnode | |
153 selectQuery: ".selectParent > .varname" in: domnode | |
154 popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { | |
155 (domnode firstChild) textContent!: key | |
156 (astnode symbol) name!: key | |
157 } | |
158 setSelection: astnode withInNode: (astnode expression) | |
159 event stopPropagation: (foreign: undefined) | |
160 } | |
161 | |
162 opClick <- :domnode astnode event { | |
163 selectParent: domnode | |
164 selectQuery: ".selectParent > .opname" in: domnode | |
165 showOps | |
166 setSelection: astnode withInNode: (astnode left) | |
167 event stopPropagation: (foreign: undefined) | |
86 } | 168 } |
87 | 169 |
88 funClick <- :domnode astnode event { | 170 funClick <- :domnode astnode event { |
89 selectParent: domnode | 171 selectParent: domnode |
90 selectQuery: ".selectParent > .funpart" in: (domnode parentNode) | 172 selectQuery: ".selectParent > .funpart" in: domnode |
91 symtable <- astnode symbols | 173 symtable <- astnode symbols |
92 syms <- filter: (symtable allSymbols) :sym { | 174 syms <- filter: (symtable allSymbols: (foreign: undefined)) :sym { |
93 isLambda: ((symtable find: sym) def) | 175 isLambda: ((symtable find: sym) def) |
94 } | 176 } |
95 popInscope: syms onClick: {} | 177 inner <- if: (astnode receiver) != (foreign: null) { |
96 event stopPropagation | 178 astnode receiver |
179 } else: { | |
180 (astnode args) getEl: 0 | |
181 } | |
182 setSelection: astnode withInNode: inner | |
183 popInscope: syms onClick: :key { | |
184 astnode name!: key | |
185 parts <- key split: ":" | |
186 nodes <- [] | |
187 each: (domnode children) :idx val{ | |
188 nodes push: val | |
189 } | |
190 partIdx <- 0 | |
191 nodeIdx <- 0 | |
192 lastWasNamePart <- true | |
193 while: { partIdx < (parts length) || nodeIdx < (nodes length) } do: { | |
194 if: nodeIdx < (nodes length) { | |
195 node <-getEl: nodes nodeIdx | |
196 nodeIdx <- nodeIdx + 1 | |
197 if: (hasClass: node "funpart") { | |
198 if: partIdx < (parts length) { | |
199 postfix <- if: partIdx = 0 && nodeIdx = 2 && (parts length) = 1 && (nodes length) = 2 { "" } else: { ":" } | |
200 t <- (getEl: parts partIdx) | |
201 node textContent!: (getEl: parts partIdx) . postfix | |
202 partIdx <- partIdx + 1 | |
203 } else: { | |
204 domnode removeChild: node | |
205 } | |
206 lastWasNamePart <- true | |
207 } else: { | |
208 if: (not: lastWasNamePart) && partIdx < (parts length) && nodeIdx > 0 { | |
209 domnode insertBefore: (newEl: "span" #{ | |
210 className <- "funpart selected" | |
211 textContent <- (getEl: parts partIdx) . ":" | |
212 }) node | |
213 partIdx <- partIdx + 1 | |
214 } | |
215 lastWasNamePart <- false | |
216 } | |
217 } else: { | |
218 console log: "part: " . (getEl: parts partIdx) | |
219 domnode appendChild: (newEl: "span" #{ | |
220 className <- "funpart selected" | |
221 textContent <- (getEl: parts partIdx) . ":" | |
222 }) | |
223 partIdx <- partIdx + 1 | |
224 } | |
225 } | |
226 } | |
227 event stopPropagation: (foreign: undefined) | |
97 } | 228 } |
98 | 229 |
99 lambdaClick <- :domnode astnode event { | 230 lambdaClick <- :domnode astnode event { |
100 symbolClick: domnode astnode event | 231 selectNode: domnode |
232 popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { | |
233 console log: "foooobar!" | |
234 } | |
235 inner <- if: ((astnode args) length) > 0 { | |
236 (astnode args) getEl: 0 | |
237 } else: { | |
238 (astnode expressions) getEl: 0 | |
239 } | |
240 setSelection: astnode withInNode: inner | |
241 event stopPropagation: (foreign: undefined) | |
242 } | |
243 | |
244 objectClick <- :domnode astnode event { | |
245 selectNode: domnode | |
246 popInscope: ((astnode symbols) allSymbols: (foreign: undefined)) onClick: :key { | |
247 console log: "fooobar!" | |
248 } | |
249 setSelection: astnode withInNode: ((astnode messages) getEl: 0) | |
250 event stopPropagation: (foreign: undefined) | |
251 } | |
252 | |
253 visible <- "showops" | |
254 | |
255 showOps <- { | |
256 each: (qall: ".controls") :idx el { | |
257 removeClass: el visible | |
258 addClass: el "showops" | |
259 } | |
260 visible <- "showops" | |
261 } | |
262 | |
263 showLit <- { | |
264 each: (qall: ".controls") :idx el { | |
265 removeClass: el visible | |
266 addClass: el "showlit" | |
267 } | |
268 visible <- "showlit" | |
101 } | 269 } |
102 | 270 |
103 main <- { | 271 main <- { |
104 get: "/src/" :data { | 272 get: "/src/" :data { |
105 fakeEl <- newEl: "div" #{ | 273 fakeEl <- newEl: "div" #{ |
122 li appendChild: nel | 290 li appendChild: nel |
123 (q: "#browser ul") appendChild: li | 291 (q: "#browser ul") appendChild: li |
124 } | 292 } |
125 } | 293 } |
126 } | 294 } |
127 | 295 |
128 //bind handlers for editor buttons | 296 //bind handlers for editor buttons |
129 each: (qall: ".controls li") :idx el { | 297 each: (qall: ".controls li") :idx el { |
130 el onclick!: :event { | 298 el onclick!: :event { |
131 srcel <- (q: "#src") | 299 srcel <- (q: "#src") |
132 srcel textContent!: (srcel textContent) + (el textContent) | 300 srcel textContent!: (srcel textContent) + (el textContent) |
133 } | 301 } |
134 } | 302 } |
135 (q: "#ops_button") onclick!: :event { | 303 (q: "#ops_button") onclick!: :event { |
136 each: (qall: ".controls") :idx el { | 304 showOps |
137 addClass: el "showops" | 305 } |
138 } | 306 (q: "#lit_button") onclick!: :event { |
139 } | 307 showLit |
140 | 308 } |
309 | |
310 (q: "#in") onclick!: :event { | |
311 console log: "inwards" | |
312 if: (selection valid?) { | |
313 selection in | |
314 } | |
315 } | |
316 | |
317 (q: "#out") onclick!: :event { | |
318 console log: "outwards" | |
319 if: (selection valid?) { | |
320 selection out | |
321 } | |
322 } | |
323 | |
141 path <- (window location) pathname | 324 path <- (window location) pathname |
142 if: (path indexOf: "/edit/") = 0 { | 325 if: (path indexOf: "/edit/") = 0 { |
143 editFile: (path substr: 5) | 326 editFile: (path substr: 5) |
144 } else: {} | 327 } |
145 } | 328 } |
146 | 329 |
147 } | 330 } |