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,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
+ }