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 }