mix-language 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ function Element_draggable (self, args)
6
+ {
7
+ return Element_attribute(self, [new_string('draggable'), args[0]]);
8
+ }
9
+
10
+ function Element_drag (self, args)
11
+ {
12
+ return Element_on(self, [new_string('drag'), args[0]]);
13
+ }
14
+
15
+ function Element_drag_end (self, args)
16
+ {
17
+ return Element_on(self, [new_string('dragend'), args[0]]);
18
+ }
19
+
20
+ function Element_drag_enter (self, args)
21
+ {
22
+ return Element_on(self, [new_string('dragenter'), args[0]]);
23
+ }
24
+
25
+ function Element_drag_leave (self, args)
26
+ {
27
+ return Element_on(self, [new_string('dragleave'), args[0]]);
28
+ }
29
+
30
+ function Element_drag_over (self, args)
31
+ {
32
+ var func = args[0];
33
+
34
+ if (xself(self, ELEMENT_TYPE, "#on"))
35
+ {
36
+ return self;
37
+ }
38
+
39
+ var name = 'ondragover';
40
+ var node = self.value;
41
+
42
+ if (func === NULL)
43
+ {
44
+ node[name] = null;
45
+ return self;
46
+ }
47
+
48
+ if (xarg(func, FUNCTION_TYPE, "Element#on", "function"))
49
+ {
50
+ return self;
51
+ }
52
+
53
+ var body = func.value;
54
+
55
+ node[name] = function (event)
56
+ {
57
+ event = event || window.event;
58
+
59
+ if (event.preventDefault)
60
+ {
61
+ event.preventDefault();
62
+ }
63
+
64
+ event.returnValue = false;
65
+
66
+ body(self, [new_event(event)]);
67
+
68
+ return false;
69
+ }
70
+
71
+ return self;
72
+ }
73
+
74
+ function Element_drag_start (self, args)
75
+ {
76
+ var func = args[0];
77
+
78
+ if (xself(self, ELEMENT_TYPE, "#on"))
79
+ {
80
+ return self;
81
+ }
82
+
83
+ var name = 'ondragstart';
84
+ var node = self.value;
85
+
86
+ if (func === NULL)
87
+ {
88
+ node[name] = null;
89
+ return self;
90
+ }
91
+
92
+ if (xarg(func, FUNCTION_TYPE, "Element#on", "function"))
93
+ {
94
+ return self;
95
+ }
96
+
97
+ var body = func.value;
98
+
99
+ node[name] = function (event)
100
+ {
101
+ event = event || window.event;
102
+ event.__default_allowed__ = true;
103
+ event.dataTransfer.setData('text/plain', null);
104
+
105
+ body(self, [new_event(event)]);
106
+
107
+ return event.__default_allowed__;
108
+ }
109
+
110
+ return self;
111
+ }
112
+
113
+ function Element_drop (self, args)
114
+ {
115
+ return Element_on(self, [new_string('drop'), args[0]]);
116
+ }
117
+
118
+ function Event_drop_effect (self, args)
119
+ {
120
+ var str = args[0];
121
+
122
+ if (xself(self, EVENT_TYPE, "#drop_effect") || xarg(str, STRING_TYPE, "Event#drop_effect", "string"))
123
+ {
124
+ return self;
125
+ }
126
+
127
+ var dt = self.value.dataTransfer;
128
+
129
+ if (dt)
130
+ {
131
+ dt.dropEffect = str.value;
132
+ }
133
+
134
+ return self;
135
+ }
136
+
137
+ function Event_effect_allowed (self, args)
138
+ {
139
+ var str = args[0];
140
+
141
+ if (xself(self, EVENT_TYPE, "#effect_allowed") || xarg(str, STRING_TYPE, "Event#effect_allowed", "string"))
142
+ {
143
+ return self;
144
+ }
145
+
146
+ var dt = self.value.dataTransfer;
147
+
148
+ if (dt)
149
+ {
150
+ dt.effectAllowed = str.value;
151
+ }
152
+
153
+ return self;
154
+ }
155
+
156
+ function Event_get_data (self, args)
157
+ {
158
+ var str = args[0];
159
+
160
+ if (xself(self, EVENT_TYPE, "#get_data") || xarg(str, STRING_TYPE, "Event#get_data", "string"))
161
+ {
162
+ return NULL;
163
+ }
164
+
165
+ var dt = self.value.dataTransfer;
166
+
167
+ if (dt)
168
+ {
169
+ return new_string(dt.getData(str.__value__));
170
+ }
171
+
172
+ return NULL;
173
+ }
174
+
175
+ function Event_no_drop (self, args)
176
+ {
177
+ return Event_drop_effect(self, [new_string('none')]);
178
+ }
179
+
180
+ function Event_set_data (self, args)
181
+ {
182
+ var type = args[0];
183
+ var value = args[1];
184
+
185
+ if (xself(self, EVENT_TYPE, "#set_data") || xarg(str, STRING_TYPE, "Event#set_data", "string mime-type") || xarg(str, STRING_TYPE, "Event#set_data", "string value"))
186
+ {
187
+ return NULL;
188
+ }
189
+
190
+ var dt = self.value.dataTransfer;
191
+
192
+ if (dt)
193
+ {
194
+ dt.setData(type.value, value.value);
195
+ }
196
+
197
+ return self;
198
+ }
199
+
200
+ add_function(ELEMENT, 'draggable', Element_draggable, ['setting']);
201
+ add_function(ELEMENT, 'drag', Element_drag, ['function']);
202
+ add_function(ELEMENT, 'drag_end', Element_drag_end, ['function']);
203
+ add_function(ELEMENT, 'drag_enter', Element_drag_enter, ['function']);
204
+ add_function(ELEMENT, 'drag_leave', Element_drag_leave, ['function']);
205
+ add_function(ELEMENT, 'drag_over', Element_drag_over, ['function']);
206
+ add_function(ELEMENT, 'drag_start', Element_drag_start, ['function']);
207
+ add_function(ELEMENT, 'drop', Element_drop, ['function']);
208
+ add_function(EVENT, 'drop_effect', Event_drop_effect, ['setting']);
209
+ add_function(EVENT, 'effect_allowed', Event_effect_allowed, ['setting']);
210
+ add_function(EVENT, 'get_data', Event_get_data, ['mime_type']);
211
+ add_function(EVENT, 'no_drop', Event_no_drop, []);
@@ -0,0 +1,307 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var ELEMENT =
6
+ {
7
+ functions: {}
8
+ }
9
+
10
+ copy_functions(ELEMENT, OBJECT);
11
+
12
+ var startup = function ()
13
+ {
14
+ var node = document.getElementById('mix-app');
15
+
16
+ if (node)
17
+ {
18
+ SELF = APP =
19
+ {
20
+ object_type: ELEMENT_TYPE,
21
+ functions: {},
22
+ data: {},
23
+ keys: [],
24
+ unknown: Object_bad_key,
25
+ value: node,
26
+ parent: NULL,
27
+ children: [],
28
+ }
29
+
30
+ copy_functions(APP, ELEMENT);
31
+ }
32
+ else
33
+ {
34
+ SELF = APP = new_object({}, []);
35
+ warn("Did not find element with id \"mix-app\"");
36
+ }
37
+ };
38
+
39
+ function new_element (element_type, fields, keys)
40
+ {
41
+ var node = document.createElement(element_type.tag_name);
42
+ var element =
43
+ {
44
+ object_type: ELEMENT_TYPE,
45
+ functions: {},
46
+ data: fields,
47
+ keys: keys,
48
+ unknown: Object_bad_key,
49
+ value: node,
50
+ parent: NULL,
51
+ children: []
52
+ }
53
+
54
+ copy_functions(element, ELEMENT);
55
+ copy_functions(element, element_type);
56
+
57
+ return element;
58
+ }
59
+
60
+ function Element_add_class (self, args)
61
+ {
62
+ var str = args[0];
63
+
64
+ if (xself(self, ELEMENT_TYPE, "#add_class") || xarg(str, STRING_TYPE, "#add_class", "string"))
65
+ {
66
+ return self;
67
+ }
68
+
69
+ var node = self.value;
70
+ var name = str.value.trim();
71
+ var classes = node.className.split(/\s+/);
72
+ var index = classes.indexOf(name);
73
+
74
+ if (index < 0)
75
+ {
76
+ classes.push(name);
77
+ node.className = classes.join(' ').trim();
78
+ }
79
+
80
+ return self;
81
+ }
82
+
83
+ function Element_attribute (self, args)
84
+ {
85
+ var str = args[0];
86
+ var setting = args[1];
87
+
88
+ if (xself(self, ELEMENT_TYPE, "#attribute") || xarg(str, null, "Element#attribute", "string"))
89
+ {
90
+ return self;
91
+ }
92
+
93
+ var name = str.value;
94
+ var node = self.value;
95
+
96
+ if (setting)
97
+ {
98
+ var value = call_function(setting, 'stringify', []).value;
99
+
100
+ node.setAttribute(name, value);
101
+ return self;
102
+ }
103
+ else
104
+ {
105
+ return new_string(node[name]);
106
+ }
107
+ }
108
+
109
+ function Element_empty_q (self, args)
110
+ {
111
+ if (xself(self, ELEMENT_TYPE, "#empty?"))
112
+ {
113
+ return NULL;
114
+ }
115
+
116
+ return (self.children.length === 0) ? TRUE : FALSE;
117
+ }
118
+
119
+ function Element_last (self, args)
120
+ {
121
+ if (xself(self, ELEMENT_TYPE, "#last"))
122
+ {
123
+ return NULL;
124
+ }
125
+
126
+ var elements = self.children;
127
+ var l = elements.length;
128
+
129
+ return (l === 0) ? NULL : elements[l - 1];
130
+ }
131
+
132
+ function Element_length (self, args)
133
+ {
134
+ if (xself(self, ELEMENT_TYPE, "#length"))
135
+ {
136
+ return NULL;
137
+ }
138
+
139
+ return new_number(self.children.length);
140
+ }
141
+
142
+ function Element_pop (self, args)
143
+ {
144
+ if (xself(self, ELEMENT_TYPE, "#pop"))
145
+ {
146
+ return NULL;
147
+ }
148
+
149
+ var elements = self.children;
150
+
151
+ if (elements.length === 0)
152
+ {
153
+ return NULL;
154
+ }
155
+
156
+ var element = elements.pop();
157
+
158
+ element.parent = NULL;
159
+ self.value.removeChild(element.value);
160
+
161
+ return element;
162
+ }
163
+
164
+ function Element_push (self, args)
165
+ {
166
+ var element = args[0];
167
+
168
+ if (xself(self, ELEMENT_TYPE, "#push") || xarg(element, null, "Element#push", "element or text"))
169
+ {
170
+ return self;
171
+ }
172
+
173
+ if (element.object_type !== TEXT_TYPE && element.object_type !== ELEMENT_TYPE)
174
+ {
175
+ warn("Ignoring Element#push;" + " expected element or text argument");
176
+ return self;
177
+ }
178
+
179
+ if (element.parent !== NULL)
180
+ {
181
+ call_function(element, 'release', []);
182
+ }
183
+
184
+ var e = self;
185
+
186
+ while (e !== NULL)
187
+ {
188
+ if (e === element)
189
+ {
190
+ warn("Ignoring attempt to nest element into itself");
191
+ return self;
192
+ }
193
+
194
+ e = e.parent;
195
+ }
196
+
197
+ var node = element.value;
198
+
199
+ element.parent = self;
200
+ self.children.push(element);
201
+ self.value.appendChild(node);
202
+
203
+ return self;
204
+ }
205
+
206
+ function Element_release (self, args)
207
+ {
208
+ if (xself(self, ELEMENT_TYPE, "#release"))
209
+ {
210
+ return self;
211
+ }
212
+
213
+ var parent = self.parent;
214
+
215
+ if (parent === NULL)
216
+ {
217
+ return self;
218
+ }
219
+
220
+ var node = self.value;
221
+ var parent_node = parent.value;
222
+ var index = parent.children.indexOf(self);
223
+
224
+ parent.children.splice(index, 1);
225
+ parent_node.removeChild(node);
226
+ self.parent = NULL;
227
+
228
+ return self;
229
+ }
230
+
231
+ function Element_remove_class (self, args)
232
+ {
233
+ var str = args[0];
234
+
235
+ if (xself(self, ELEMENT_TYPE, "#add_class") || xarg(str, STRING_TYPE, "#add_class", "string"))
236
+ {
237
+ return self;
238
+ }
239
+
240
+ var node = self.value;
241
+ var name = str.value.trim();
242
+ var classes = node.className.split(/\s+/);
243
+ var index = classes.indexOf(name);
244
+
245
+ while (index >= 0)
246
+ {
247
+ classes.splice(index, 1)
248
+ index = classes.indexOf(name);
249
+ }
250
+
251
+ node.className = classes.join(' ');
252
+
253
+ return self;
254
+ }
255
+
256
+ function Element_stringify (self, args)
257
+ {
258
+ if (xself(self, ELEMENT_TYPE, "#stringify"))
259
+ {
260
+ return self;
261
+ }
262
+
263
+ var node = self.value;
264
+ var id = node.id;
265
+ var classes = node.className
266
+ var string = node.nodeName;
267
+
268
+ string += (id) ? '#' + id : '';
269
+
270
+ if (classes !== "")
271
+ {
272
+ var class_names = classes.split(' ');
273
+
274
+ for (var i = 0, l = class_names.length; i < l; ++i)
275
+ {
276
+ string += '.' + class_names[i];
277
+ }
278
+ }
279
+
280
+ var fields = self.data;
281
+ var keys = self.keys;
282
+
283
+ for (var k, i = 0, l = keys.length; i < l; ++i)
284
+ {
285
+ k = keys[i];
286
+
287
+ string += ' ' + k + ':';
288
+ string += ' ' + call_function(fields[k], 'inspect', []).value;
289
+
290
+ if (i < l - 1)
291
+ {
292
+ string += ',';
293
+ }
294
+ }
295
+
296
+ return new_string('<' + string + '>');
297
+ }
298
+
299
+ add_function(ELEMENT, 'add_class', Element_add_class, ['string']);
300
+ add_function(ELEMENT, 'last', Element_last, []);
301
+ add_function(ELEMENT, 'length', Element_length, []);
302
+ add_function(ELEMENT, 'empty?', Element_empty_q, []);
303
+ add_function(ELEMENT, 'pop', Element_pop, []);
304
+ add_function(ELEMENT, 'push', Element_push, ['element']);
305
+ add_function(ELEMENT, 'release', Element_release, []);
306
+ add_function(ELEMENT, 'stringify', Element_stringify, []);
307
+ add_function(ELEMENT, 'remove_class', Element_remove_class, ['string']);
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var EVENT =
6
+ {
7
+ functions: {}
8
+ };
9
+
10
+ copy_functions(EVENT, OBJECT);
11
+
12
+ function new_event (value)
13
+ {
14
+ var ev =
15
+ {
16
+ object_type: EVENT_TYPE,
17
+ functions: {},
18
+ data: {},
19
+ value: value
20
+ };
21
+
22
+ copy_functions(ev, EVENT);
23
+
24
+ return ev;
25
+ }
26
+
27
+ function Element_on (self, args)
28
+ {
29
+ var str = args[0];
30
+ var func = args[1];
31
+
32
+ if (xself(self, ELEMENT_TYPE, "#on") || xarg(str, STRING_TYPE, "Element#on", "string"))
33
+ {
34
+ return self;
35
+ }
36
+
37
+ var name = 'on' + str.value;
38
+ var node = self.value;
39
+
40
+ if (func === NULL)
41
+ {
42
+ node[name] = null;
43
+ return self;
44
+ }
45
+
46
+ if (xarg(func, FUNCTION_TYPE, "Element#on", "function"))
47
+ {
48
+ return self;
49
+ }
50
+
51
+ var body = func.value;
52
+
53
+ node[name] = function (event)
54
+ {
55
+ event = event || window.event;
56
+ event.__default_allowed__ = true;
57
+
58
+ body(self, [new_event(event)]);
59
+
60
+ return event.__default_allowed__;
61
+ }
62
+
63
+ return self;
64
+ }
65
+
66
+ function Event_prevent_default (self, args)
67
+ {
68
+ if (xself(self, EVENT_TYPE, "#prevent_default"))
69
+ {
70
+ return self;
71
+ }
72
+
73
+ var event = self.value;
74
+
75
+ if (event.preventDefault)
76
+ {
77
+ event.preventDefault();
78
+ }
79
+
80
+ event.returnValue = false;
81
+ event.__default_allowed__ = false;
82
+
83
+ return self;
84
+ }
85
+
86
+ function Event_stop_bubbling (self, args)
87
+ {
88
+ if (xself(self, EVENT_TYPE, "#prevent_default"))
89
+ {
90
+ return self;
91
+ }
92
+
93
+ var event = self.value;
94
+
95
+ if (event.stopPropagation)
96
+ {
97
+ event.stopPropagation();
98
+ }
99
+
100
+ event.cancelBubble = true;
101
+
102
+ return self;
103
+ }
104
+
105
+ function Event_stringify (self, args)
106
+ {
107
+ return new_string('<event>');
108
+ }
109
+
110
+ add_function(EVENT, 'inspect', Event_stringify, []);
111
+ add_function(EVENT, 'prevent_default', Event_prevent_default, []);
112
+ add_function(EVENT, 'stop_bubbling', Event_stop_bubbling, []);
113
+ add_function(EVENT, 'stringify', Event_stringify, []);
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ function Element_click (self, args)
6
+ {
7
+ return Element_on(self, [new_string('click'), args[0]]);
8
+ }
9
+
10
+ function Element_double_click (self, args)
11
+ {
12
+ return Element_on(self, [new_string('dblclick'), args[0]]);
13
+ }
14
+
15
+ add_function(ELEMENT, 'click', Element_click, ['function']);
16
+ add_function(ELEMENT, 'double_click', Element_double_click, ['function']);
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var TABLE =
6
+ {
7
+ functions: {},
8
+ tag_name: 'table'
9
+ };
10
+
11
+ HTML_TYPES['Table'] = TABLE;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright © 2011 Jesse Sielaff
3
+ */
4
+
5
+ var TD =
6
+ {
7
+ functions: {},
8
+ tag_name: 'td'
9
+ };
10
+
11
+ HTML_TYPES['Td'] = TD;
12
+
13
+ function Td_colspan (self, args)
14
+ {
15
+ return Element_attribute(self, [new_string('colspan'), args[0]]);
16
+ }
17
+
18
+ add_function(TD, 'colspan', Td_colspan, ['string','(setting)']);