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 }