28#include <Objectively/Array.h>
33#define _Class _SelectorSequence
45 release(this->simpleSelectors);
57 return str(this->sequence);
60#pragma mark - SelectorSequence
106 while (isspace(*c)) {
131static Array *
parse(
const char *rule) {
135 Array *selectorSequences = $$(Array, arrayWithCapacity, 8);
136 assert(selectorSequences);
140 const char *c = rule;
142 const size_t size = strcspn(c,
" \n\t>+~");
144 char *sequence = calloc(1,
size + 1);
147 strncpy(sequence, c,
size);
150 assert(selectorSequence);
153 assert(selectorSequence->
right);
155 selectorSequence->
left = left;
156 left = selectorSequence->
right;
158 $(selectorSequences, addObject, selectorSequence);
160 release(selectorSequence);
165 c += strspn(c,
" \n\t>+~");
168 return (Array *) selectorSequences;
171#pragma mark - Class lifecycle
178 ((ObjectInterface *) clazz->interface)->dealloc =
dealloc;
179 ((ObjectInterface *) clazz->interface)->description =
description;
181 ((SelectorSequenceInterface *) clazz->interface)->initWithSequence =
initWithSequence;
183 ((SelectorSequenceInterface *) clazz->interface)->parse =
parse;
195 clazz = _initialize(&(
const ClassDef) {
196 .name =
"SelectorSequence",
197 .superclass = _Object(),
200 .interfaceSize =
sizeof(SelectorSequenceInterface),
static View * init(View *self)
static bool matchesSelector(const View *self, const SimpleSelector *simpleSelector)
static SDL_Size size(const Image *self)
static bool matchesView(const SelectorSequence *self, const View *view)
static Array * parse(const char *rule)
static String * description(const Object *self)
static SequenceCombinator sequenceCombinator(const char *c)
Class * _SelectorSequence(void)
static void dealloc(Object *self)
static void initialize(Class *clazz)
static SelectorSequence * initWithSequence(SelectorSequence *self, const char *sequence)
The SeletorSequence type.
SequenceCombinator
Combinators are operators for chaining SelectorSequences.
@ SequenceCombinatorTerminal
@ SequenceCombinatorAdjacent
@ SequenceCombinatorChild
@ SequenceCombinatorDescendent
@ SequenceCombinatorSibling
Views are the fundamental building blocks of ObjectivelyMVC user interfaces.
SelectorSequences are comprised of one or more SimpleSelectors.
SequenceCombinator left
The combinators.
char * sequence
The sequence, as provided by the user.
bool matchesView(const SelectorSequence *self, const View *view)
Array * simpleSelectors
The SimpleSelectors comprising this SelectorSequence.
Views are the fundamental building blocks of ObjectivelyMVC user interfaces.