habaki 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +3 -0
  3. data/ext/katana/extconf.rb +20 -0
  4. data/ext/katana/rb_katana.c +280 -0
  5. data/ext/katana/rb_katana.h +102 -0
  6. data/ext/katana/rb_katana_array.c +144 -0
  7. data/ext/katana/rb_katana_declaration.c +389 -0
  8. data/ext/katana/rb_katana_rule.c +461 -0
  9. data/ext/katana/rb_katana_selector.c +559 -0
  10. data/ext/katana/src/foundation.c +237 -0
  11. data/ext/katana/src/foundation.h +120 -0
  12. data/ext/katana/src/katana.h +590 -0
  13. data/ext/katana/src/katana.lex.c +4104 -0
  14. data/ext/katana/src/katana.lex.h +592 -0
  15. data/ext/katana/src/katana.tab.c +4422 -0
  16. data/ext/katana/src/katana.tab.h +262 -0
  17. data/ext/katana/src/parser.c +1563 -0
  18. data/ext/katana/src/parser.h +237 -0
  19. data/ext/katana/src/selector.c +659 -0
  20. data/ext/katana/src/selector.h +54 -0
  21. data/ext/katana/src/tokenizer.c +300 -0
  22. data/ext/katana/src/tokenizer.h +41 -0
  23. data/lib/habaki/charset_rule.rb +25 -0
  24. data/lib/habaki/declaration.rb +53 -0
  25. data/lib/habaki/declarations.rb +346 -0
  26. data/lib/habaki/error.rb +43 -0
  27. data/lib/habaki/font_face_rule.rb +24 -0
  28. data/lib/habaki/formal_syntax.rb +464 -0
  29. data/lib/habaki/formatter.rb +99 -0
  30. data/lib/habaki/import_rule.rb +34 -0
  31. data/lib/habaki/media_rule.rb +173 -0
  32. data/lib/habaki/namespace_rule.rb +31 -0
  33. data/lib/habaki/node.rb +52 -0
  34. data/lib/habaki/page_rule.rb +24 -0
  35. data/lib/habaki/qualified_name.rb +29 -0
  36. data/lib/habaki/rule.rb +48 -0
  37. data/lib/habaki/rules.rb +225 -0
  38. data/lib/habaki/selector.rb +98 -0
  39. data/lib/habaki/selectors.rb +49 -0
  40. data/lib/habaki/style_rule.rb +35 -0
  41. data/lib/habaki/stylesheet.rb +158 -0
  42. data/lib/habaki/sub_selector.rb +234 -0
  43. data/lib/habaki/sub_selectors.rb +42 -0
  44. data/lib/habaki/supports_rule.rb +65 -0
  45. data/lib/habaki/value.rb +321 -0
  46. data/lib/habaki/values.rb +86 -0
  47. data/lib/habaki/visitor/element.rb +50 -0
  48. data/lib/habaki/visitor/media.rb +22 -0
  49. data/lib/habaki/visitor/nokogiri_element.rb +56 -0
  50. data/lib/habaki.rb +39 -0
  51. metadata +190 -0
@@ -0,0 +1,389 @@
1
+ /*
2
+ * Declarations and values
3
+ */
4
+ #include "rb_katana.h"
5
+
6
+ // Declaration
7
+
8
+ /*
9
+ * @return [String, nil]
10
+ */
11
+ VALUE rb_declaration_prop(VALUE self)
12
+ {
13
+ KatanaDeclaration *c_decl;
14
+ Data_Get_Struct(self, KatanaDeclaration, c_decl);
15
+ if (c_decl->property)
16
+ return rb_str_new2(c_decl->property);
17
+ else
18
+ Qnil;
19
+ }
20
+
21
+ /*
22
+ * @return [Boolean]
23
+ */
24
+ VALUE rb_declaration_important(VALUE self)
25
+ {
26
+ KatanaDeclaration *c_decl;
27
+ Data_Get_Struct(self, KatanaDeclaration, c_decl);
28
+ if (c_decl->important)
29
+ return Qtrue;
30
+ else
31
+ return Qfalse;
32
+ }
33
+
34
+ /*
35
+ * @return [Katana::Array<Katana::Value>, nil]
36
+ */
37
+ VALUE rb_declaration_values(VALUE self)
38
+ {
39
+ KatanaDeclaration *c_declaration;
40
+ Data_Get_Struct(self, KatanaDeclaration, c_declaration);
41
+
42
+ if (c_declaration->values)
43
+ {
44
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_declaration->values);
45
+
46
+ VALUE sing = rb_singleton_class(array);
47
+ rb_define_method(sing, "each", rb_value_each, 0);
48
+
49
+ return array;
50
+ }
51
+ else
52
+ return Qnil;
53
+ }
54
+
55
+ /*
56
+ * @return [SourcePosition]
57
+ */
58
+ VALUE rb_declaration_position(VALUE self)
59
+ {
60
+ KatanaDeclaration *c_decl;
61
+ Data_Get_Struct(self, KatanaDeclaration, c_decl);
62
+ return Data_Wrap_Struct(rb_KPosition, NULL, NULL, &c_decl->position);
63
+ }
64
+
65
+ // Value
66
+
67
+ /*
68
+ * @return [Symbol]
69
+ */
70
+ VALUE rb_value_unit(VALUE self)
71
+ {
72
+ ID id;
73
+ KatanaValue *c_val;
74
+ Data_Get_Struct(self, KatanaValue, c_val);
75
+ switch (c_val->unit)
76
+ {
77
+ case KATANA_VALUE_UNKNOWN:
78
+ id = rb_intern("unknown");
79
+ break;
80
+ case KATANA_VALUE_NUMBER:
81
+ id = rb_intern("number");
82
+ break;
83
+ case KATANA_VALUE_PERCENTAGE:
84
+ id = rb_intern("percentage");
85
+ break;
86
+ case KATANA_VALUE_EMS:
87
+ id = rb_intern("em");
88
+ break;
89
+ case KATANA_VALUE_EXS:
90
+ id = rb_intern("ex");
91
+ break;
92
+ case KATANA_VALUE_PX:
93
+ id = rb_intern("px");
94
+ break;
95
+ case KATANA_VALUE_CM:
96
+ id = rb_intern("cm");
97
+ break;
98
+ case KATANA_VALUE_MM:
99
+ id = rb_intern("mm");
100
+ break;
101
+ case KATANA_VALUE_IN:
102
+ id = rb_intern("in");
103
+ break;
104
+ case KATANA_VALUE_PT:
105
+ id = rb_intern("pt");
106
+ break;
107
+ case KATANA_VALUE_PC:
108
+ id = rb_intern("pc");
109
+ break;
110
+ case KATANA_VALUE_DEG:
111
+ id = rb_intern("deg");
112
+ break;
113
+ case KATANA_VALUE_RAD:
114
+ id = rb_intern("rad");
115
+ break;
116
+ case KATANA_VALUE_GRAD:
117
+ id = rb_intern("grad");
118
+ break;
119
+ case KATANA_VALUE_MS:
120
+ id = rb_intern("ms");
121
+ break;
122
+ case KATANA_VALUE_S:
123
+ id = rb_intern("s");
124
+ break;
125
+ case KATANA_VALUE_HZ:
126
+ id = rb_intern("hz");
127
+ break;
128
+ case KATANA_VALUE_KHZ:
129
+ id = rb_intern("khz");
130
+ break;
131
+ case KATANA_VALUE_DIMENSION:
132
+ id = rb_intern("dimension");
133
+ break;
134
+ case KATANA_VALUE_STRING:
135
+ id = rb_intern("string");
136
+ break;
137
+ case KATANA_VALUE_URI:
138
+ id = rb_intern("uri");
139
+ break;
140
+ case KATANA_VALUE_IDENT:
141
+ id = rb_intern("ident");
142
+ break;
143
+ case KATANA_VALUE_ATTR:
144
+ id = rb_intern("attr");
145
+ break;
146
+ case KATANA_VALUE_COUNTER:
147
+ id = rb_intern("counter");
148
+ break;
149
+ case KATANA_VALUE_RECT:
150
+ id = rb_intern("rect");
151
+ break;
152
+ case KATANA_VALUE_RGBCOLOR:
153
+ id = rb_intern("rgbcolor");
154
+ break;
155
+ case KATANA_VALUE_VW:
156
+ id = rb_intern("vw");
157
+ break;
158
+ case KATANA_VALUE_VH:
159
+ id = rb_intern("vh");
160
+ break;
161
+ case KATANA_VALUE_VMIN:
162
+ id = rb_intern("vmin");
163
+ break;
164
+ case KATANA_VALUE_VMAX:
165
+ id = rb_intern("vmax");
166
+ break;
167
+ case KATANA_VALUE_DPPX:
168
+ id = rb_intern("dppx");
169
+ break;
170
+ case KATANA_VALUE_DPI:
171
+ id = rb_intern("dpi");
172
+ break;
173
+ case KATANA_VALUE_DPCM:
174
+ id = rb_intern("dpcm");
175
+ break;
176
+ case KATANA_VALUE_FR:
177
+ id = rb_intern("fr");
178
+ break;
179
+ case KATANA_VALUE_UNICODE_RANGE:
180
+ id = rb_intern("unicode_range");
181
+ break;
182
+ case KATANA_VALUE_PARSER_OPERATOR:
183
+ id = rb_intern("parser_operator");
184
+ break;
185
+ case KATANA_VALUE_PARSER_INTEGER:
186
+ id = rb_intern("parser_integer");
187
+ break;
188
+ case KATANA_VALUE_PARSER_HEXCOLOR:
189
+ id = rb_intern("parser_hexcolor");
190
+ break;
191
+ case KATANA_VALUE_PARSER_FUNCTION:
192
+ id = rb_intern("parser_function");
193
+ break;
194
+ case KATANA_VALUE_PARSER_LIST:
195
+ id = rb_intern("parser_list");
196
+ break;
197
+ case KATANA_VALUE_PARSER_Q_EMS:
198
+ id = rb_intern("parser_q_ems");
199
+ break;
200
+ case KATANA_VALUE_PARSER_IDENTIFIER:
201
+ id = rb_intern("parser_identifier");
202
+ break;
203
+ case KATANA_VALUE_TURN:
204
+ id = rb_intern("turn");
205
+ break;
206
+ case KATANA_VALUE_REMS:
207
+ id = rb_intern("rem");
208
+ break;
209
+ case KATANA_VALUE_CHS:
210
+ id = rb_intern("ch");
211
+ break;
212
+ case KATANA_VALUE_COUNTER_NAME:
213
+ id = rb_intern("counter_name");
214
+ break;
215
+ case KATANA_VALUE_SHAPE:
216
+ id = rb_intern("shape");
217
+ break;
218
+ case KATANA_VALUE_QUAD:
219
+ id = rb_intern("quad");
220
+ break;
221
+ case KATANA_VALUE_CALC:
222
+ id = rb_intern("calc");
223
+ break;
224
+ case KATANA_VALUE_CALC_PERCENTAGE_WITH_NUMBER:
225
+ id = rb_intern("calc_percentage_with_number");
226
+ break;
227
+ case KATANA_VALUE_CALC_PERCENTAGE_WITH_LENGTH:
228
+ id = rb_intern("calc_percentage_with_length");
229
+ break;
230
+ case KATANA_VALUE_VARIABLE_NAME:
231
+ id = rb_intern("variable_name");
232
+ break;
233
+ case KATANA_VALUE_PROPERTY_ID:
234
+ id = rb_intern("property_id");
235
+ break;
236
+ case KATANA_VALUE_VALUE_ID:
237
+ id = rb_intern("value_id");
238
+ break;
239
+ default:
240
+ id = rb_intern("undefined");
241
+ break;
242
+ }
243
+ return ID2SYM(id);
244
+ }
245
+
246
+ /*
247
+ * @return [String, Float, nil]
248
+ */
249
+ VALUE rb_value_value(VALUE self)
250
+ {
251
+ VALUE val = Qnil;
252
+ KatanaValue *c_val;
253
+ Data_Get_Struct(self, KatanaValue, c_val);
254
+
255
+ switch (c_val->unit)
256
+ {
257
+ case KATANA_VALUE_NUMBER:
258
+ case KATANA_VALUE_PERCENTAGE:
259
+ case KATANA_VALUE_EMS:
260
+ case KATANA_VALUE_EXS:
261
+ case KATANA_VALUE_REMS:
262
+ case KATANA_VALUE_CHS:
263
+ case KATANA_VALUE_PX:
264
+ case KATANA_VALUE_CM:
265
+ case KATANA_VALUE_DPPX:
266
+ case KATANA_VALUE_DPI:
267
+ case KATANA_VALUE_DPCM:
268
+ case KATANA_VALUE_MM:
269
+ case KATANA_VALUE_IN:
270
+ case KATANA_VALUE_PT:
271
+ case KATANA_VALUE_PC:
272
+ case KATANA_VALUE_DEG:
273
+ case KATANA_VALUE_RAD:
274
+ case KATANA_VALUE_GRAD:
275
+ case KATANA_VALUE_MS:
276
+ case KATANA_VALUE_S:
277
+ case KATANA_VALUE_HZ:
278
+ case KATANA_VALUE_KHZ:
279
+ case KATANA_VALUE_TURN:
280
+ case KATANA_VALUE_VW:
281
+ case KATANA_VALUE_VH:
282
+ case KATANA_VALUE_VMIN:
283
+ case KATANA_VALUE_VMAX:
284
+ // printf("KATANA: %s %d %f\n", c_val->raw, c_val->iValue, c_val->fValue);
285
+ // val = rb_str_new2(c_val->raw);
286
+ val = rb_float_new(c_val->fValue);
287
+ break;
288
+ case KATANA_VALUE_IDENT:
289
+ val = rb_str_new2(c_val->string);
290
+ break;
291
+ case KATANA_VALUE_STRING:
292
+ val = rb_str_new2(c_val->string);
293
+ break;
294
+ case KATANA_VALUE_PARSER_FUNCTION:
295
+ {
296
+ val = Data_Wrap_Struct(rb_ValueFunction, NULL, NULL, c_val->function);
297
+ break;
298
+ }
299
+ case KATANA_VALUE_PARSER_OPERATOR:
300
+ val = rb_sprintf("%c", c_val->iValue);
301
+ break;
302
+ case KATANA_VALUE_PARSER_LIST:
303
+ // TODO
304
+ // return katana_stringify_value_list(parser, value->list);
305
+ break;
306
+ case KATANA_VALUE_PARSER_HEXCOLOR:
307
+ val = rb_str_new2(c_val->string);
308
+ break;
309
+ case KATANA_VALUE_URI:
310
+ val = rb_str_new2(c_val->string);
311
+ break;
312
+ case KATANA_VALUE_UNICODE_RANGE:
313
+ val = rb_str_new2(c_val->string);
314
+ break;
315
+ case KATANA_VALUE_DIMENSION:
316
+ val = rb_str_new2(c_val->string);
317
+ break;
318
+ case KATANA_VALUE_UNKNOWN:
319
+ val = rb_str_new2(c_val->string);
320
+ break;
321
+ default:
322
+ fprintf(stderr, "KATANA: unsupported value unit %d (%s)\n", c_val->unit, c_val->string);
323
+ break;
324
+ }
325
+
326
+ return val;
327
+ }
328
+
329
+ // ValueFunction
330
+
331
+ /*
332
+ * @return [String, nil]
333
+ */
334
+ VALUE rb_value_function_name(VALUE self)
335
+ {
336
+ KatanaValueFunction *c_val;
337
+ Data_Get_Struct(self, KatanaValueFunction, c_val);
338
+ if (c_val->name)
339
+ return rb_str_new2(c_val->name);
340
+ else
341
+ return Qnil;
342
+ }
343
+
344
+ /*
345
+ * @return [Katana::Array<Katana::Value>, nil]
346
+ */
347
+ VALUE rb_value_function_args(VALUE self)
348
+ {
349
+ KatanaValueFunction *c_val;
350
+ Data_Get_Struct(self, KatanaValueFunction, c_val);
351
+ if (c_val->args)
352
+ {
353
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_val->args);
354
+
355
+ VALUE sing = rb_singleton_class(array);
356
+ rb_define_method(sing, "each", rb_value_each, 0);
357
+
358
+ return array;
359
+ }
360
+ else
361
+ return Qnil;
362
+ }
363
+
364
+ void init_katana_declaration()
365
+ {
366
+ // Declaration
367
+ rb_Declaration = rb_define_class_under(rb_Katana, "Declaration", rb_cObject);
368
+ rb_define_method(rb_Declaration, "property", rb_declaration_prop, 0);
369
+ rb_define_method(rb_Declaration, "important", rb_declaration_important, 0);
370
+ rb_define_method(rb_Declaration, "values", rb_declaration_values, 0);
371
+
372
+ rb_define_method(rb_Declaration, "position", rb_declaration_position, 0);
373
+
374
+ // Declaration
375
+ rb_Declaration = rb_define_class_under(rb_Katana, "Declaration", rb_cObject);
376
+ rb_define_method(rb_Declaration, "property", rb_declaration_prop, 0);
377
+ rb_define_method(rb_Declaration, "important", rb_declaration_important, 0);
378
+ rb_define_method(rb_Declaration, "values", rb_declaration_values, 0);
379
+
380
+ // Value
381
+ rb_Value = rb_define_class_under(rb_Katana, "Value", rb_cObject);
382
+ rb_define_method(rb_Value, "value", rb_value_value, 0);
383
+ rb_define_method(rb_Value, "unit", rb_value_unit, 0);
384
+
385
+ // ValueFunction
386
+ rb_ValueFunction = rb_define_class_under(rb_Katana, "ValueFunction", rb_cObject);
387
+ rb_define_method(rb_ValueFunction, "name", rb_value_function_name, 0);
388
+ rb_define_method(rb_ValueFunction, "args", rb_value_function_args, 0);
389
+ }