habaki 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ }