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.
- checksums.yaml +7 -0
- data/Gemfile +3 -0
- data/ext/katana/extconf.rb +20 -0
- data/ext/katana/rb_katana.c +280 -0
- data/ext/katana/rb_katana.h +102 -0
- data/ext/katana/rb_katana_array.c +144 -0
- data/ext/katana/rb_katana_declaration.c +389 -0
- data/ext/katana/rb_katana_rule.c +461 -0
- data/ext/katana/rb_katana_selector.c +559 -0
- data/ext/katana/src/foundation.c +237 -0
- data/ext/katana/src/foundation.h +120 -0
- data/ext/katana/src/katana.h +590 -0
- data/ext/katana/src/katana.lex.c +4104 -0
- data/ext/katana/src/katana.lex.h +592 -0
- data/ext/katana/src/katana.tab.c +4422 -0
- data/ext/katana/src/katana.tab.h +262 -0
- data/ext/katana/src/parser.c +1563 -0
- data/ext/katana/src/parser.h +237 -0
- data/ext/katana/src/selector.c +659 -0
- data/ext/katana/src/selector.h +54 -0
- data/ext/katana/src/tokenizer.c +300 -0
- data/ext/katana/src/tokenizer.h +41 -0
- data/lib/habaki/charset_rule.rb +25 -0
- data/lib/habaki/declaration.rb +53 -0
- data/lib/habaki/declarations.rb +346 -0
- data/lib/habaki/error.rb +43 -0
- data/lib/habaki/font_face_rule.rb +24 -0
- data/lib/habaki/formal_syntax.rb +464 -0
- data/lib/habaki/formatter.rb +99 -0
- data/lib/habaki/import_rule.rb +34 -0
- data/lib/habaki/media_rule.rb +173 -0
- data/lib/habaki/namespace_rule.rb +31 -0
- data/lib/habaki/node.rb +52 -0
- data/lib/habaki/page_rule.rb +24 -0
- data/lib/habaki/qualified_name.rb +29 -0
- data/lib/habaki/rule.rb +48 -0
- data/lib/habaki/rules.rb +225 -0
- data/lib/habaki/selector.rb +98 -0
- data/lib/habaki/selectors.rb +49 -0
- data/lib/habaki/style_rule.rb +35 -0
- data/lib/habaki/stylesheet.rb +158 -0
- data/lib/habaki/sub_selector.rb +234 -0
- data/lib/habaki/sub_selectors.rb +42 -0
- data/lib/habaki/supports_rule.rb +65 -0
- data/lib/habaki/value.rb +321 -0
- data/lib/habaki/values.rb +86 -0
- data/lib/habaki/visitor/element.rb +50 -0
- data/lib/habaki/visitor/media.rb +22 -0
- data/lib/habaki/visitor/nokogiri_element.rb +56 -0
- data/lib/habaki.rb +39 -0
- metadata +190 -0
@@ -0,0 +1,237 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2015 QFish <im@qfi.sh>
|
3
|
+
*
|
4
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
* of this software and associated documentation files (the "Software"), to deal
|
6
|
+
* in the Software without restriction, including without limitation the rights
|
7
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
* copies of the Software, and to permit persons to whom the Software is
|
9
|
+
* furnished to do so, subject to the following conditions:
|
10
|
+
*
|
11
|
+
* The above copyright notice and this permission notice shall be included in
|
12
|
+
* all copies or substantial portions of the Software.
|
13
|
+
*
|
14
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
* THE SOFTWARE.
|
21
|
+
*/
|
22
|
+
|
23
|
+
#ifndef __Katana__parser__
|
24
|
+
#define __Katana__parser__
|
25
|
+
|
26
|
+
#include <stdio.h>
|
27
|
+
#include <stdlib.h>
|
28
|
+
#include "katana.lex.h"
|
29
|
+
|
30
|
+
#ifdef __cplusplus
|
31
|
+
extern "C" {
|
32
|
+
#endif
|
33
|
+
|
34
|
+
#define KATANA_FELX_DEBUG 0
|
35
|
+
#define KATANA_BISON_DEBUG 0
|
36
|
+
#define KATANA_PARSER_DEBUG 0
|
37
|
+
#define KATANA_PARSER_LOG_ENABLE 0
|
38
|
+
|
39
|
+
|
40
|
+
struct KatanaInternalOutput;
|
41
|
+
struct KatanaInternalOptions;
|
42
|
+
|
43
|
+
typedef void* (*KatanaAllocatorFunction)(void* userdata, size_t size);
|
44
|
+
|
45
|
+
typedef void (*KatanaDeallocatorFunction)(void* userdata, void* ptr);
|
46
|
+
|
47
|
+
typedef struct KatanaInternalOptions {
|
48
|
+
KatanaAllocatorFunction allocator;
|
49
|
+
KatanaDeallocatorFunction deallocator;
|
50
|
+
void* userdata;
|
51
|
+
} KatanaOptions;
|
52
|
+
|
53
|
+
extern const KatanaOptions kKatanaDefaultOptions;
|
54
|
+
|
55
|
+
typedef struct KatanaInternalParser {
|
56
|
+
// Settings for this parse run.
|
57
|
+
const struct KatanaInternalOptions* options;
|
58
|
+
|
59
|
+
// Output for the parse.
|
60
|
+
struct KatanaInternalOutput* output;
|
61
|
+
|
62
|
+
// The flex tokenizer info
|
63
|
+
yyscan_t* scanner;
|
64
|
+
|
65
|
+
// The floating declarations
|
66
|
+
KatanaArray* parsed_declarations;
|
67
|
+
#if KATANA_PARSER_DEBUG
|
68
|
+
// The floating selectors
|
69
|
+
KatanaArray* parsed_selectors;
|
70
|
+
#endif // #if KATANA_PARSER_DEBUG
|
71
|
+
|
72
|
+
KatanaSourcePosition* position;
|
73
|
+
KatanaParserString default_namespace;
|
74
|
+
|
75
|
+
} KatanaParser;
|
76
|
+
|
77
|
+
|
78
|
+
KatanaArray* katana_new_array(KatanaParser* parser);
|
79
|
+
|
80
|
+
|
81
|
+
KatanaStylesheet* katana_new_stylesheet(KatanaParser* parser);
|
82
|
+
void katana_parser_reset_declarations(KatanaParser* parser);
|
83
|
+
|
84
|
+
|
85
|
+
KatanaRule* katana_new_namespace_rule(KatanaParser* parser, KatanaParserString* prefix, KatanaParserString* uri);
|
86
|
+
|
87
|
+
|
88
|
+
KatanaRule* katana_new_font_face(KatanaParser* parser);
|
89
|
+
|
90
|
+
KatanaRule* katana_new_page_rule(KatanaParser* parser);
|
91
|
+
|
92
|
+
KatanaRule* katana_new_keyframes_rule(KatanaParser* parser, KatanaParserString* name, KatanaArray* keyframes, bool isPrefixed);
|
93
|
+
KatanaKeyframe* katana_new_keyframe(KatanaParser* parser, KatanaArray* selectors);
|
94
|
+
KatanaArray* katana_new_Keyframe_list(KatanaParser* parser);
|
95
|
+
void katana_keyframe_rule_list_add(KatanaParser* parser, KatanaKeyframe* keyframe, KatanaArray* list);
|
96
|
+
void katana_parser_clear_keyframes(KatanaParser* parser, KatanaArray* keyframes);
|
97
|
+
|
98
|
+
|
99
|
+
void katana_set_charset(KatanaParser* parser, KatanaParserString* encoding);
|
100
|
+
|
101
|
+
|
102
|
+
KatanaRule* katana_new_import_rule(KatanaParser* parser, KatanaParserString* href, KatanaArray* media);
|
103
|
+
|
104
|
+
|
105
|
+
KatanaValue* katana_new_value(KatanaParser* parser);
|
106
|
+
KatanaValue* katana_new_dimension_value(KatanaParser* parser, KatanaParserNumber* value, KatanaValueUnit unit);
|
107
|
+
KatanaValue* katana_new_number_value(KatanaParser* parser, int sign, KatanaParserNumber* value, KatanaValueUnit unit);
|
108
|
+
KatanaValue* katana_new_operator_value(KatanaParser* parser, int value);
|
109
|
+
KatanaValue* katana_new_ident_value(KatanaParser* parser, KatanaParserString* value);
|
110
|
+
KatanaValue* katana_new_function_value(KatanaParser* parser, KatanaParserString* name, KatanaArray* args);
|
111
|
+
KatanaValue* katana_new_list_value(KatanaParser* parser, KatanaArray* list);
|
112
|
+
|
113
|
+
void katana_value_set_string(KatanaParser* parser, KatanaValue* value, KatanaParserString* string);
|
114
|
+
void katana_value_set_sign(KatanaParser* parser, KatanaValue* value, int sign);
|
115
|
+
|
116
|
+
|
117
|
+
KatanaArray* katana_new_value_list(KatanaParser* parser);
|
118
|
+
void katana_value_list_add(KatanaParser* parser, KatanaValue* value, KatanaArray* list);
|
119
|
+
void katana_value_list_insert(KatanaParser* parser, KatanaValue* value, int index, KatanaArray* list);
|
120
|
+
void katana_value_list_steal_values(KatanaParser* parser, KatanaArray* values, KatanaArray* list);
|
121
|
+
|
122
|
+
|
123
|
+
KatanaRule* katana_new_supports_rule(KatanaParser* parser, KatanaSupportsExp* exp, KatanaArray* rules);
|
124
|
+
KatanaSupportsExp *katana_new_supports_exp(KatanaParser* parser, KatanaSupportsOperator op);
|
125
|
+
void katana_supports_exp_list_add(KatanaParser* parser, KatanaSupportsExp* exp, KatanaArray* list);
|
126
|
+
|
127
|
+
KatanaRule* katana_new_media_rule(KatanaParser* parser, KatanaArray* medias, KatanaArray* rules);
|
128
|
+
|
129
|
+
|
130
|
+
KatanaArray* katana_new_media_list(KatanaParser* parser);
|
131
|
+
void katana_media_list_add(KatanaParser* parser, KatanaMediaQuery* media_query, KatanaArray* medias);
|
132
|
+
|
133
|
+
|
134
|
+
KatanaMediaQuery* katana_new_media_query(KatanaParser* parser, KatanaMediaQueryRestrictor r, KatanaParserString *type, KatanaArray* exps);
|
135
|
+
|
136
|
+
|
137
|
+
// i.e. (min-width: 960px)
|
138
|
+
KatanaMediaQueryExp * katana_new_media_query_exp(KatanaParser* parser, KatanaParserString* feature, KatanaArray* values);
|
139
|
+
|
140
|
+
|
141
|
+
KatanaArray* katana_new_media_query_exp_list(KatanaParser* parser);
|
142
|
+
void katana_media_query_exp_list_add(KatanaParser* parser, KatanaMediaQueryExp* exp, KatanaArray* list);
|
143
|
+
|
144
|
+
|
145
|
+
KatanaArray* katana_new_rule_list(KatanaParser* parser);
|
146
|
+
KatanaArray* katana_rule_list_add(KatanaParser* parser, KatanaRule* rule, KatanaArray* rule_list);
|
147
|
+
|
148
|
+
|
149
|
+
KatanaRule* katana_new_style_rule(KatanaParser* parser, KatanaArray* selectors);
|
150
|
+
|
151
|
+
|
152
|
+
void katana_start_declaration(KatanaParser* parser);
|
153
|
+
void katana_end_declaration(KatanaParser* parser, bool flag, bool ended);
|
154
|
+
void katana_set_current_declaration(KatanaParser* parser, KatanaParserString* tag);
|
155
|
+
KatanaDeclaration *katana_new_declaration(KatanaParser* parser, KatanaParserString* name, bool important, KatanaArray* values);
|
156
|
+
bool katana_add_declaration(KatanaParser* parser, KatanaDeclaration *decl);
|
157
|
+
void katana_parser_clear_declarations(KatanaParser* parser);
|
158
|
+
|
159
|
+
|
160
|
+
void katana_start_selector(KatanaParser* parser);
|
161
|
+
void katana_end_selector(KatanaParser* parser);
|
162
|
+
|
163
|
+
KatanaQualifiedName * katana_new_qualified_name(KatanaParser* parser, KatanaParserString* prefix, KatanaParserString* localName, KatanaParserString* uri);
|
164
|
+
|
165
|
+
KatanaSelector* katana_new_selector(KatanaParser* parser);
|
166
|
+
KatanaSelector* katana_sink_floating_selector(KatanaParser* parser, KatanaSelector* selector);
|
167
|
+
KatanaSelector* katana_rewrite_specifier_with_element_name(KatanaParser* parser, KatanaParserString* tag, KatanaSelector* specifier);
|
168
|
+
KatanaSelector* katana_rewrite_specifier_with_namespace_if_needed(KatanaParser* parser, KatanaSelector* specifier);
|
169
|
+
KatanaSelector* katana_rewrite_specifiers(KatanaParser* parser, KatanaSelector* specifiers, KatanaSelector* newSpecifier);
|
170
|
+
|
171
|
+
void katana_adopt_selector_list(KatanaParser* parser, KatanaArray* selectors, KatanaSelector* selector);
|
172
|
+
void katana_selector_append(KatanaParser* parser, KatanaSelector* selector, KatanaSelector* new_selector, KatanaSelectorRelation relation);
|
173
|
+
void katana_selector_insert(KatanaParser* parser, KatanaSelector* selector, KatanaSelector* new_selector, KatanaSelectorRelation before, KatanaSelectorRelation after);
|
174
|
+
void katana_selector_prepend_with_element_name(KatanaParser* parser, KatanaSelector* selector, KatanaParserString* tag);
|
175
|
+
|
176
|
+
KatanaArray* katana_new_selector_list(KatanaParser* parser);
|
177
|
+
KatanaArray* katana_reusable_selector_list(KatanaParser* parser);
|
178
|
+
void katana_selector_list_shink(KatanaParser* parser, int capacity, KatanaArray* list);
|
179
|
+
void katana_selector_list_add(KatanaParser* parser, KatanaSelector* selector, KatanaArray* list);
|
180
|
+
|
181
|
+
void katana_selector_set_value(KatanaParser* parser, KatanaSelector* selector, KatanaParserString* value);
|
182
|
+
void katana_selector_set_argument(KatanaParser* parser, KatanaSelector* selector, KatanaParserString* argument);
|
183
|
+
void katana_selector_set_argument_with_number(KatanaParser* parser, KatanaSelector* selector, int sign, KatanaParserNumber* value);
|
184
|
+
|
185
|
+
bool katana_parse_attribute_match_type(KatanaParser* parser, KatanaAttributeMatchType, KatanaParserString* attr);
|
186
|
+
|
187
|
+
bool katana_selector_is_simple(KatanaParser* parser, KatanaSelector* selector);
|
188
|
+
void katana_selector_extract_pseudo_type(KatanaSelector* selector);
|
189
|
+
|
190
|
+
|
191
|
+
void katana_add_rule(KatanaParser* parser, KatanaRule* rule);
|
192
|
+
|
193
|
+
void katana_start_rule(KatanaParser* parser);
|
194
|
+
void katana_end_rule(KatanaParser* parser, bool ended);
|
195
|
+
|
196
|
+
void katana_start_rule_header(KatanaParser* parser, KatanaRuleType type);
|
197
|
+
void katana_end_rule_header(KatanaParser* parser);
|
198
|
+
void katana_end_invalid_rule_header(KatanaParser* parser);
|
199
|
+
void katana_start_rule_body(KatanaParser* parser);
|
200
|
+
|
201
|
+
|
202
|
+
bool katana_string_is_function(KatanaParserString* string);
|
203
|
+
void katana_string_clear(KatanaParser* parser, KatanaParserString* string);
|
204
|
+
|
205
|
+
|
206
|
+
void katana_parse_internal_rule(KatanaParser* parser, KatanaRule* e);
|
207
|
+
void katana_parse_internal_keyframe_rule(KatanaParser* parser, KatanaKeyframe* e);
|
208
|
+
void katana_parse_internal_keyframe_key_list(KatanaParser* parser, KatanaArray* e);
|
209
|
+
void katana_parse_internal_value(KatanaParser* parser, KatanaArray* e);
|
210
|
+
void katana_parse_internal_media_list(KatanaParser* parser, KatanaArray* e);
|
211
|
+
void katana_parse_internal_supports_list(KatanaParser* parser, KatanaArray* e);
|
212
|
+
void katana_parse_internal_declaration_list(KatanaParser* parser, bool e);
|
213
|
+
void katana_parse_internal_selector(KatanaParser* parser, KatanaArray* e);
|
214
|
+
|
215
|
+
|
216
|
+
// Bison error
|
217
|
+
void katanaerror(YYLTYPE* yyloc, void* scanner, KatanaParser * parser, char*);
|
218
|
+
|
219
|
+
// Bison parser location
|
220
|
+
KatanaSourcePosition* katana_parser_current_location(KatanaParser* parser, KATANALTYPE* yylloc);
|
221
|
+
|
222
|
+
// Log
|
223
|
+
void katana_parser_log(KatanaParser* parser, const char * format, ...);
|
224
|
+
|
225
|
+
// Error
|
226
|
+
void katana_parser_resume_error_logging();
|
227
|
+
void katana_parser_report_error(KatanaParser* parser, KatanaSourcePosition* pos, const char *, ...);
|
228
|
+
|
229
|
+
// print
|
230
|
+
void katana_print(const char * format, ...);
|
231
|
+
|
232
|
+
|
233
|
+
#ifdef __cplusplus
|
234
|
+
}
|
235
|
+
#endif
|
236
|
+
|
237
|
+
#endif /* defined(__Katana__parser__) */
|