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,461 @@
1
+ #include "rb_katana.h"
2
+
3
+ // SupportsRule
4
+
5
+ /*
6
+ * @return [Symbol]
7
+ */
8
+ VALUE rb_supports_exp_op(VALUE self)
9
+ {
10
+ ID id;
11
+ KatanaSupportsExp *c_exp;
12
+ Data_Get_Struct(self, KatanaSupportsExp, c_exp);
13
+
14
+ switch (c_exp->op)
15
+ {
16
+ case KatanaSupportsOperatorNone:
17
+ id = rb_intern("none");
18
+ break;
19
+ case KatanaSupportsOperatorNot:
20
+ id = rb_intern("not");
21
+ break;
22
+ case KatanaSupportsOperatorAnd:
23
+ id = rb_intern("and");
24
+ break;
25
+ case KatanaSupportsOperatorOr:
26
+ id = rb_intern("or");
27
+ break;
28
+ default:
29
+ id = rb_intern("unknown");
30
+ break;
31
+ }
32
+ return ID2SYM(id);
33
+ }
34
+
35
+ VALUE rb_supports_exp_exps(VALUE self)
36
+ {
37
+ KatanaSupportsExp *c_exp;
38
+ Data_Get_Struct(self, KatanaSupportsExp, c_exp);
39
+
40
+ if (c_exp->exps)
41
+ {
42
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_exp->exps);
43
+
44
+ VALUE sing = rb_singleton_class(array);
45
+ rb_define_method(sing, "each", rb_supports_expression_each, 0);
46
+
47
+ return array;
48
+ }
49
+ else
50
+ return Qnil;
51
+ }
52
+
53
+ VALUE rb_supports_exp_declaration(VALUE self)
54
+ {
55
+ KatanaSupportsExp *c_exp;
56
+ Data_Get_Struct(self, KatanaSupportsExp, c_exp);
57
+ if (c_exp->decl)
58
+ {
59
+ VALUE array = Data_Wrap_Struct(rb_Declaration, NULL, NULL, c_exp->decl);
60
+ }
61
+ else
62
+ return Qnil;
63
+ }
64
+
65
+ VALUE rb_supports_rules(VALUE self)
66
+ {
67
+ KatanaSupportsRule *c_rule;
68
+ Data_Get_Struct(self, KatanaSupportsRule, c_rule);
69
+
70
+ if (c_rule->rules)
71
+ {
72
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_rule->rules);
73
+
74
+ VALUE sing = rb_singleton_class(array);
75
+ rb_define_method(sing, "each", rb_rule_each, 0);
76
+
77
+ return array;
78
+ }
79
+ else
80
+ return Qnil;
81
+ }
82
+
83
+ VALUE rb_supports_exp(VALUE self)
84
+ {
85
+ KatanaSupportsRule *c_rule;
86
+ Data_Get_Struct(self, KatanaSupportsRule, c_rule);
87
+
88
+ if (c_rule->exp)
89
+ {
90
+ VALUE exp = Data_Wrap_Struct(rb_SupportsExp, NULL, NULL, c_rule->exp);
91
+ return exp;
92
+ }
93
+ else
94
+ return Qnil;
95
+ }
96
+
97
+ // NamespaceRule
98
+
99
+ /*
100
+ * @return [String, nil]
101
+ */
102
+ VALUE rb_namespace_rule_prefix(VALUE self)
103
+ {
104
+ KatanaNamespaceRule *c_rule;
105
+ Data_Get_Struct(self, KatanaNamespaceRule, c_rule);
106
+ if (c_rule->prefix)
107
+ return rb_str_new2(c_rule->prefix);
108
+ else
109
+ return Qnil;
110
+ }
111
+
112
+ /*
113
+ * @return [String, nil]
114
+ */
115
+ VALUE rb_namespace_rule_uri(VALUE self)
116
+ {
117
+ KatanaNamespaceRule *c_rule;
118
+ Data_Get_Struct(self, KatanaNamespaceRule, c_rule);
119
+ if (c_rule->prefix)
120
+ return rb_str_new2(c_rule->uri);
121
+ else
122
+ return Qnil;
123
+ }
124
+
125
+ // MediaRule
126
+
127
+ /*
128
+ * @return [Katana::Array]
129
+ */
130
+ VALUE rb_media_rule_rules(VALUE self)
131
+ {
132
+ KatanaMediaRule *c_media_rule;
133
+ Data_Get_Struct(self, KatanaMediaRule, c_media_rule);
134
+
135
+ if (c_media_rule->rules)
136
+ {
137
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_media_rule->rules);
138
+
139
+ VALUE sing = rb_singleton_class(array);
140
+ rb_define_method(sing, "each", rb_rule_each, 0);
141
+
142
+ return array;
143
+ }
144
+ else
145
+ return Qnil;
146
+ }
147
+
148
+ /*
149
+ * @return [Katana::Array<Katana::MediaQuery>]
150
+ */
151
+ VALUE rb_media_rule_medias(VALUE self)
152
+ {
153
+ KatanaMediaRule *c_media_rule;
154
+ Data_Get_Struct(self, KatanaMediaRule, c_media_rule);
155
+
156
+ if (c_media_rule->medias)
157
+ {
158
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_media_rule->medias);
159
+ VALUE sing = rb_singleton_class(array);
160
+ rb_define_method(sing, "each", rb_media_query_each, 0);
161
+
162
+ return array;
163
+ }
164
+ else
165
+ return Qnil;
166
+ }
167
+
168
+ // MediaQueryExp
169
+
170
+ /*
171
+ * @return [String, nil]
172
+ */
173
+ VALUE rb_media_query_exp_feature(VALUE self)
174
+ {
175
+ KatanaMediaQueryExp *c_query;
176
+ Data_Get_Struct(self, KatanaMediaQueryExp, c_query);
177
+ if (c_query->feature)
178
+ return rb_str_new2(c_query->feature);
179
+ else
180
+ return Qnil;
181
+ }
182
+
183
+ /*
184
+ * @return [Katana::Array<Katana::Value>, nil]
185
+ */
186
+ VALUE rb_media_query_exp_values(VALUE self)
187
+ {
188
+ KatanaMediaQueryExp *c_query;
189
+ Data_Get_Struct(self, KatanaMediaQueryExp, c_query);
190
+
191
+ if (c_query->values)
192
+ {
193
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_query->values);
194
+
195
+ VALUE sing = rb_singleton_class(array);
196
+ rb_define_method(sing, "each", rb_value_each, 0);
197
+
198
+ return array;
199
+ }
200
+ else
201
+ return Qnil;
202
+ }
203
+
204
+ // MediaQuery
205
+
206
+ /*
207
+ * @return [String]
208
+ */
209
+ VALUE rb_media_query_type(VALUE self)
210
+ {
211
+ KatanaMediaQuery *c_query;
212
+ Data_Get_Struct(self, KatanaMediaQuery, c_query);
213
+ if (c_query->type)
214
+ return rb_str_new2(c_query->type);
215
+ else
216
+ return Qnil;
217
+ }
218
+
219
+ /*
220
+ * @return [Symbol]
221
+ */
222
+ VALUE rb_media_query_restrictor(VALUE self)
223
+ {
224
+ ID id;
225
+ KatanaMediaQuery *c_query;
226
+ Data_Get_Struct(self, KatanaMediaQuery, c_query);
227
+ switch (c_query->restrictor)
228
+ {
229
+ case KatanaMediaQueryRestrictorNone:
230
+ id = rb_intern("none");
231
+ break;
232
+ case KatanaMediaQueryRestrictorOnly:
233
+ id = rb_intern("only");
234
+ break;
235
+ case KatanaMediaQueryRestrictorNot:
236
+ id = rb_intern("not");
237
+ break;
238
+ default:
239
+ id = rb_intern("undefined");
240
+ break;
241
+ }
242
+ return ID2SYM(id);
243
+ }
244
+
245
+ /*
246
+ * @return [Katana::Array<Katana::MediaQueryExpression>]
247
+ */
248
+ VALUE rb_media_query_expressions(VALUE self)
249
+ {
250
+ KatanaMediaQuery *c_query;
251
+ Data_Get_Struct(self, KatanaMediaQuery, c_query);
252
+
253
+ if (c_query->expressions)
254
+ {
255
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_query->expressions);
256
+
257
+ VALUE sing = rb_singleton_class(array);
258
+ rb_define_method(sing, "each", rb_expression_each, 0);
259
+
260
+ return array;
261
+ }
262
+ else
263
+ return Qnil;
264
+ }
265
+
266
+ // PageRule
267
+
268
+ /*
269
+ * @return [Katana::Array<Katana::Declaration>]
270
+ */
271
+ VALUE rb_page_rule_declarations(VALUE self)
272
+ {
273
+ KatanaPageRule *c_rule;
274
+ Data_Get_Struct(self, KatanaPageRule, c_rule);
275
+
276
+ if (c_rule->declarations)
277
+ {
278
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_rule->declarations);
279
+
280
+ VALUE sing = rb_singleton_class(array);
281
+ rb_define_method(sing, "each", rb_declaration_each, 0);
282
+
283
+ return array;
284
+ }
285
+ else
286
+ return Qnil;
287
+ }
288
+
289
+ // FontFaceRule
290
+
291
+ /*
292
+ * @return [Katana::Array<Katana::Declaration>]
293
+ */
294
+ VALUE rb_font_face_rule_declarations(VALUE self)
295
+ {
296
+ KatanaFontFaceRule *c_rule;
297
+ Data_Get_Struct(self, KatanaFontFaceRule, c_rule);
298
+
299
+ if (c_rule->declarations)
300
+ {
301
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_rule->declarations);
302
+
303
+ VALUE sing = rb_singleton_class(array);
304
+ rb_define_method(sing, "each", rb_declaration_each, 0);
305
+
306
+ return array;
307
+ }
308
+ else
309
+ return Qnil;
310
+ }
311
+
312
+ // ImportRule
313
+
314
+ /*
315
+ * @return [String]
316
+ */
317
+ VALUE rb_import_rule_href(VALUE self)
318
+ {
319
+ KatanaImportRule *c_rule;
320
+ Data_Get_Struct(self, KatanaImportRule, c_rule);
321
+ if (c_rule->href)
322
+ return rb_str_new2(c_rule->href);
323
+ else
324
+ return Qnil;
325
+ }
326
+
327
+ /*
328
+ * @return [Katana::Array<Katana::MediaQuery>]
329
+ */
330
+ VALUE rb_import_rule_medias(VALUE self)
331
+ {
332
+ KatanaImportRule *c_rule;
333
+ Data_Get_Struct(self, KatanaImportRule, c_rule);
334
+
335
+ if (c_rule->medias)
336
+ {
337
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_rule->medias);
338
+
339
+ VALUE sing = rb_singleton_class(array);
340
+ rb_define_method(sing, "each", rb_media_query_each, 0);
341
+
342
+ return array;
343
+ }
344
+ else
345
+ return Qnil;
346
+ }
347
+
348
+ // CharsetRule
349
+
350
+ /*
351
+ * @return [String]
352
+ */
353
+ VALUE rb_charset_rule_encoding(VALUE self)
354
+ {
355
+ KatanaCharsetRule *c_rule;
356
+ Data_Get_Struct(self, KatanaCharsetRule, c_rule);
357
+ if (c_rule->encoding)
358
+ return rb_str_new2(c_rule->encoding);
359
+ else
360
+ return Qnil;
361
+ }
362
+
363
+ // StyleRule
364
+
365
+ /*
366
+ * @return [Katana::Array<Katana::Selector>]
367
+ */
368
+ VALUE rb_style_rule_selectors(VALUE self)
369
+ {
370
+ KatanaStyleRule *c_style_rule;
371
+ Data_Get_Struct(self, KatanaStyleRule, c_style_rule);
372
+
373
+ if (c_style_rule->selectors)
374
+ {
375
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_style_rule->selectors);
376
+
377
+ VALUE sing = rb_singleton_class(array);
378
+ rb_define_method(sing, "each", rb_selector_each, 0);
379
+
380
+ return array;
381
+ }
382
+ else
383
+ return Qnil;
384
+ }
385
+
386
+ /*
387
+ * @return [Katana::Array<Katana::Declaration>]
388
+ */
389
+ VALUE rb_style_rule_declarations(VALUE self)
390
+ {
391
+ KatanaStyleRule *c_style_rule;
392
+ Data_Get_Struct(self, KatanaStyleRule, c_style_rule);
393
+
394
+ if (c_style_rule->declarations)
395
+ {
396
+ VALUE array = Data_Wrap_Struct(rb_KArray, NULL, NULL, c_style_rule->declarations);
397
+
398
+ VALUE sing = rb_singleton_class(array);
399
+ rb_define_method(sing, "each", rb_declaration_each, 0);
400
+
401
+ return array;
402
+ }
403
+ else
404
+ return Qnil;
405
+ }
406
+
407
+ void init_katana_rule()
408
+ {
409
+ // SupportsRule
410
+ rb_SupportsExp = rb_define_class_under(rb_Katana, "SupportsExpression", rb_cObject);
411
+ rb_define_method(rb_SupportsExp, "operation", rb_supports_exp_op, 0);
412
+ rb_define_method(rb_SupportsExp, "expressions", rb_supports_exp_exps, 0);
413
+ rb_define_method(rb_SupportsExp, "declaration", rb_supports_exp_declaration, 0);
414
+
415
+ rb_SupportsRule = rb_define_class_under(rb_Katana, "SupportsRule", rb_cObject);
416
+ rb_define_method(rb_SupportsRule, "expression", rb_supports_exp, 0);
417
+ rb_define_method(rb_SupportsRule, "rules", rb_supports_rules, 0);
418
+
419
+ // NamespaceRule
420
+ rb_NamespaceRule = rb_define_class_under(rb_Katana, "NamespaceRule", rb_cObject);
421
+ rb_define_method(rb_NamespaceRule, "prefix", rb_namespace_rule_prefix, 0);
422
+ rb_define_method(rb_NamespaceRule, "uri", rb_namespace_rule_uri, 0);
423
+
424
+ // MediaRule
425
+ rb_MediaRule = rb_define_class_under(rb_Katana, "MediaRule", rb_cObject);
426
+ rb_define_method(rb_MediaRule, "medias", rb_media_rule_medias, 0);
427
+ rb_define_method(rb_MediaRule, "rules", rb_media_rule_rules, 0);
428
+
429
+ // MediaQueryExp
430
+ rb_MediaQueryExp = rb_define_class_under(rb_Katana, "MediaQueryExpression", rb_cObject);
431
+ rb_define_method(rb_MediaQueryExp, "feature", rb_media_query_exp_feature, 0);
432
+ rb_define_method(rb_MediaQueryExp, "values", rb_media_query_exp_values, 0);
433
+
434
+ // MediaQuery
435
+ rb_MediaQuery = rb_define_class_under(rb_Katana, "MediaQuery", rb_cObject);
436
+ rb_define_method(rb_MediaQuery, "type", rb_media_query_type, 0);
437
+ rb_define_method(rb_MediaQuery, "restrictor", rb_media_query_restrictor, 0);
438
+ rb_define_method(rb_MediaQuery, "expressions", rb_media_query_expressions, 0);
439
+
440
+ // PageRule
441
+ rb_PageRule = rb_define_class_under(rb_Katana, "PageRule", rb_cObject);
442
+ rb_define_method(rb_PageRule, "declarations", rb_page_rule_declarations, 0);
443
+
444
+ // FontFaceRule
445
+ rb_FontFaceRule = rb_define_class_under(rb_Katana, "FontFaceRule", rb_cObject);
446
+ rb_define_method(rb_FontFaceRule, "declarations", rb_font_face_rule_declarations, 0);
447
+
448
+ // ImportRule
449
+ rb_ImportRule = rb_define_class_under(rb_Katana, "ImportRule", rb_cObject);
450
+ rb_define_method(rb_ImportRule, "href", rb_import_rule_href, 0);
451
+ rb_define_method(rb_ImportRule, "medias", rb_import_rule_medias, 0);
452
+
453
+ // CharsetRule
454
+ rb_CharsetRule = rb_define_class_under(rb_Katana, "CharsetRule", rb_cObject);
455
+ rb_define_method(rb_CharsetRule, "encoding", rb_charset_rule_encoding, 0);
456
+
457
+ // StyleRule
458
+ rb_StyleRule = rb_define_class_under(rb_Katana, "StyleRule", rb_cObject);
459
+ rb_define_method(rb_StyleRule, "selectors", rb_style_rule_selectors, 0);
460
+ rb_define_method(rb_StyleRule, "declarations", rb_style_rule_declarations, 0);
461
+ }