All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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