Files
sdk/utils/css/tree.dart
T
terry@google.com 64784aa1b1 Beginning of CSS parser using frog parsering infrastructure.
Change for in memory buffers.

BUG=
TEST=

Review URL: http://codereview.chromium.org//8498020

git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@1752 260f80e4-7a28-3924-810f-c04153c831b5
2011-11-22 17:30:20 +00:00

298 lines
9.0 KiB
Dart

// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Generated by scripts/tree_gen.py.
/////////////////////////////////////////////////////////////////////////
// CSS specific types:
/////////////////////////////////////////////////////////////////////////
class Identifier extends lang.Node {
String name;
Identifier(this.name, lang.SourceSpan span): super(span) {}
visit(TreeVisitor visitor) => visitor.visitIdentifier(this);
String toString() => name;
}
class Wildcard extends lang.Node {
Wildcard(lang.SourceSpan span): super(span);
visit(TreeVisitor visitor) => visitor.visitWildcard(this);
String toString() => '*';
}
class SelectorGroup extends lang.Node {
// List of SimpleSelector(s) list contain any mix SimpleSelector or
// SimpleSlectorName (or class derived from SimpleSelectorName e.g.,
// IdSelector, ClassSelector, ElementSelector, PseudoClassSelector,
// PseudoElementSelector, NotSelector, or Attribute
List<SimpleSelector> selectors;
SelectorGroup(this.selectors, lang.SourceSpan span): super(span);
visit(TreeVisitor visitor) => visitor.visitSelectorGroup(this);
String toString() {
StringBuffer buff = new StringBuffer();
for (selector in selectors) {
if (selector.isCombinatorDescendant()) {
buff.add(' ');
} else if (selector.isCombinatorPlus()) {
buff.add(' + ');
} else if (selector.isCombinatorGreater()) {
buff.add(' > ');
} else if (selector.isCombinatorTilde()) {
buff.add(' ~ ');
}
buff.add(selector.toString());
}
return buff.toString();
}
/** A multiline string showing the node and its children. */
String toDebugString() {
var to = new lang.TreeOutput();
var tp = new TreePrinter(to);
this.visit(tp);
return to.buf.toString();
}
}
/* All other selectors (element, #id, .class, attribute, pseudo, negation,
* namespace, *) are derived from this selector.
*/
class SimpleSelector extends lang.Node {
int _combinator; // +, >, ~ or descendant (space), and NONE
var _name;
SimpleSelector(this._name, lang.SourceSpan span,
[this._combinator = TokenKind.COMBINATOR_NONE]) : super(span);
// Name can be an Identifier or WildCard we'll return either the name or '*'.
String get name() => isWildcard() ? '*' : _name.name;
bool isWildcard() => _name is Wildcard;
// TODO(terry): Kind of hacky to reset combinator to NONE
void resetCombinatorNone() {
assert(isCombinatorDescendant());
_combinator = TokenKind.COMBINATOR_NONE;
}
bool isCombinatorNone() => _combinator == TokenKind.COMBINATOR_NONE;
bool isCombinatorDescendant() =>
_combinator == TokenKind.COMBINATOR_DESCENDANT;
bool isCombinatorPlus() => _combinator == TokenKind.COMBINATOR_PLUS;
bool isCombinatorGreater() => _combinator == TokenKind.COMBINATOR_GREATER;
bool isCombinatorTilde() => _combinator == TokenKind.COMBINATOR_TILDE;
visit(TreeVisitor visitor) => visitor.visitSimpleSelector(this);
String toString() => name;
}
// element name
class ElementSelector extends SimpleSelector {
ElementSelector(var name, lang.SourceSpan span,
[int combinator = TokenKind.COMBINATOR_NONE]) :
super(name, span, combinator);
visit(TreeVisitor visitor) => visitor.visitElementSelector(this);
String toString() => "$name";
/** A multiline string showing the node and its children. */
String toDebugString() {
var to = new lang.TreeOutput();
var tp = new TreePrinter(to);
this.visit(tp);
return to.buf.toString();
}
}
// namespace|element
class NamespaceSelector extends SimpleSelector {
var _namespace; // null, Wildcard or Identifier
NamespaceSelector(this._namespace, var name, lang.SourceSpan span,
[int combinator = TokenKind.COMBINATOR_NONE]) :
super(name, span, combinator);
String get namespace() => _namespace is Wildcard ? '*' : _namespace.name;
bool isNamespaceWildcard() => _namespace is Wildcard;
SimpleSelector get nameAsSimpleSelector() => _name;
visit(TreeVisitor visitor) => visitor.visitNamespaceSelector(this);
String toString() => "$namespace|$nameAsSimpleSelector";
}
// #id
class IdSelector extends SimpleSelector {
IdSelector(Identifier name, lang.SourceSpan span,
[int combinator = TokenKind.COMBINATOR_NONE]) :
super(name, span, combinator);
visit(TreeVisitor visitor) => visitor.visitIdSelector(this);
String toString() => "#$name";
}
// .class
class ClassSelector extends SimpleSelector {
ClassSelector(Identifier name, lang.SourceSpan span,
[int combinator = TokenKind.COMBINATOR_NONE]) :
super(name, span, combinator);
visit(TreeVisitor visitor) => visitor.visitClassSelector(this);
String toString() => ".$name";
}
// :pseudoClass
class PseudoClassSelector extends SimpleSelector {
PseudoClassSelector(Identifier name, lang.SourceSpan span,
[int combinator = TokenKind.COMBINATOR_NONE]) :
super(name, span, combinator);
visit(TreeVisitor visitor) => visitor.visitPseudoClassSelector(this);
String toString() => ":$name";
}
// ::pseudoElement
class PseudoElementSelector extends SimpleSelector {
PseudoElementSelector(Identifier name, lang.SourceSpan span,
[int combinator = TokenKind.COMBINATOR_NONE]) :
super(name, span, combinator);
visit(TreeVisitor visitor) => visitor.visitPseudoElementSelector(this);
String toString() => "::$name";
}
// TODO(terry): Implement
// NOT
class NotSelector extends SimpleSelector {
NotSelector(String name, lang.SourceSpan span,
[lang.Token combinator = TokenKind.COMBINATOR_NONE]) :
super(name, span, combinator);
visit(TreeVisitor visitor) => visitor.visitNotSelector(this);
}
// TODO(terry): Implement
// [attribute]
class Attribute extends lang.Node {
var name; // NamespaceSelector or SimpleSelector
int matchType; // ~=, |=, ^=, $=, *=, =
String value;
}
interface TreeVisitor {
void visitSelectorGroup(SelectorGroup node);
void visitSimpleSelector(SimpleSelector node);
void visitElementSelector(ElementSelector node);
void visitNamespaceSelector(NamespaceSelector node);
void visitIdSelector(IdSelector node);
void visitClassSelector(ClassSelector node);
void visitPseudoClassSelector(PseudoClassSelector node);
void visitPseudoElementSelector(PseudoElementSelector node);
void visitNotSelector(NotSelector node);
void visitIdentifier(Identifier node);
void visitWildcard(Wildcard node);
// TODO(terry): Defined for ../tree.dart.
void visitTypeReference(lang.TypeReference node);
}
class TreePrinter implements TreeVisitor {
var output;
TreePrinter(this.output) { output.printer = this; }
void visitSelectorGroup(SelectorGroup node) {
output.heading('Selector Group', node.span);
output.writeNodeList('selectors', node.selectors);
output.writeln('');
}
void visitSimpleSelector(SimpleSelector node) {
if (node.isCombinatorNone()) {
output.writeValue('combinator', "NONE");
} else if (node.isCombinatorDescendant()) {
output.writeValue('combinator', "descendant");
} else if (node.isCombinatorPlus()) {
output.writeValue('combinator', "+");
} else if (node.isCombinatorGreater()) {
output.writeValue('combinator', ">");
} else if (node.isCombinatorTilde()) {
output.writeValue('combinator', "~");
} else {
output.writeValue('combinator', "ERROR UNKNOWN");
}
}
void visitNamespaceSelector(NamespaceSelector node) {
output.heading('Namespace Selector', node.span);
visitSimpleSelector(node);
output.writeNode('namespace', node._namespace);
output.writeNode('name', node._name);
}
void visitElementSelector(ElementSelector node) {
output.heading('Element Selector', node.span);
visitSimpleSelector(node);
output.writeNode('name', node._name);
}
void visitIdSelector(IdSelector node) {
output.heading('Id Selector', node.span);
visitSimpleSelector(node);
output.writeNode('name', node._name);
}
void visitClassSelector(ClassSelector node) {
output.heading('Class Selector', node.span);
visitSimpleSelector(node);
output.writeNode('name', node._name);
}
void visitPseudoClassSelector(PseudoClassSelector node) {
output.heading('Pseudo Class Selector', node.span);
visitSimpleSelector(node);
output.writeNode('name', node._name);
}
void visitPseudoElementSelector(PseudoElementSelector node) {
output.heading('Pseudo Element Selector', node.span);
visitSimpleSelector(node);
output.writeNode('name', node._name);
}
void visitNotSelector(NotSelector node) {
visitSimpleSelector(node);
output.heading('Not Selector', node.span);
}
void visitIdentifier(Identifier node) {
output.heading('Identifier(' + output.toValue(node.name) + ")", node.span);
}
void visitWildcard(Wildcard node) {
output.heading('Wildcard(*)', node.span);
}
// TODO(terry): Defined for frog/tree.dart.
void visitTypeReference(lang.TypeReference node) {
output.heading('Unimplemented');
}
}