
br.com.objectos.css.io.SelectorBuilder Maven / Gradle / Ivy
The newest version!
/*
* Copyright 2016 Objectos, Fábrica de Software LTDA.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package br.com.objectos.css.io;
import br.com.objectos.codereader.CodeReader;
import br.com.objectos.css.Selector;
/**
* @author [email protected] (Marcio Endo)
*/
class SelectorBuilder {
private Mode mode;
private Selector first;
private SelectorBuilder() {
mode = Mode.START;
}
public static SelectorBuilder start() {
return new SelectorBuilder();
}
public Selector build(CodeReader reader) {
return first != null
? !reader.empty()
? mode.add(first, TagSelector.parse(reader))
: first
: TagSelector.parse(reader);
}
void add(Selector selector) {
first = mode.add(first, selector);
mode = Mode.ADD;
}
void adjacentSibling() {
mode = Mode.ADJACENT_SIBLING;
}
void child() {
mode = Mode.CHILD;
}
void descendant() {
mode = mode.descendant();
}
void generalSibling() {
mode = Mode.GENERAL_SIBLING;
}
private enum Mode {
ADD {
@Override
Selector add(Selector first, Selector second) {
return CssSelectors.and(first, second);
}
},
START {
@Override
Selector add(Selector first, Selector second) {
return second;
}
},
DESCENDANT {
@Override
Selector add(Selector first, Selector second) {
return new DescendantSelector(first, second);
}
},
CHILD {
@Override
Selector add(Selector first, Selector second) {
return new ChildSelector(first, second);
}
@Override
Mode descendant() {
return this;
}
},
ADJACENT_SIBLING {
@Override
Selector add(Selector first, Selector second) {
return new SiblingSelector(SiblingOperator.ADJACENT, first, second);
}
@Override
Mode descendant() {
return this;
}
},
GENERAL_SIBLING {
@Override
Selector add(Selector first, Selector second) {
return new SiblingSelector(SiblingOperator.GENERAL, first, second);
}
@Override
Mode descendant() {
return this;
}
};
abstract Selector add(Selector first, Selector second);
Mode descendant() {
return Mode.DESCENDANT;
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy