91dd628bd8
Need unique name for library collision with template parser. Few more changes to work under VM. More changes for lang.dart seperation. Seperation from lang.dart (tokenizer can't access private fields of base class in another library). This was allowed in frog but not in the VM. VM is right so need to sever dependency. BUG= TEST= Review URL: https://chromiumcodereview.appspot.com//9695048 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@5544 260f80e4-7a28-3924-810f-c04153c831b5
192 lines
6.6 KiB
Dart
192 lines
6.6 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.
|
|
|
|
#import('dart:html');
|
|
#import('css.dart');
|
|
#import('../lib/file_system_memory.dart');
|
|
|
|
void runCss([bool debug = false, bool parseOnly = false]) {
|
|
final Document doc = window.document;
|
|
final TextAreaElement classes = doc.query("#classes");
|
|
final TextAreaElement expression = doc.query('#expression');
|
|
final TableCellElement validity = doc.query('#validity');
|
|
final TableCellElement result = doc.query('#result');
|
|
|
|
List<String> knownWorld = classes.value.split("\n");
|
|
List<String> knownClasses = [];
|
|
List<String> knownIds = [];
|
|
for (final name in knownWorld) {
|
|
if (name.startsWith('.')) {
|
|
knownClasses.add(name.substring(1));
|
|
} else if (name.startsWith('#')) {
|
|
knownIds.add(name.substring(1));
|
|
}
|
|
}
|
|
|
|
CssWorld cssWorld = new CssWorld(knownClasses, knownIds);
|
|
bool templateValid = true;
|
|
String dumpTree = "";
|
|
|
|
String cssExpr = expression.value;
|
|
if (!debug) {
|
|
try {
|
|
cssParseAndValidate(cssExpr, cssWorld);
|
|
} catch (final cssException) {
|
|
templateValid = false;
|
|
dumpTree = cssException.toString();
|
|
}
|
|
} else if (parseOnly) {
|
|
try {
|
|
Parser parser = new Parser(new SourceFile(
|
|
SourceFile.IN_MEMORY_FILE, cssExpr));
|
|
Stylesheet stylesheet = parser.parse();
|
|
StringBuffer stylesheetTree = new StringBuffer();
|
|
String prettyStylesheet = stylesheet.toString();
|
|
stylesheetTree.add("${prettyStylesheet}\n");
|
|
stylesheetTree.add("\n============>Tree Dump<============\n");
|
|
stylesheetTree.add(stylesheet.toDebugString());
|
|
dumpTree = stylesheetTree.toString();
|
|
} catch (final cssParseException) {
|
|
templateValid = false;
|
|
dumpTree = cssParseException.toString();
|
|
}
|
|
} else {
|
|
try {
|
|
dumpTree = cssParseAndValidateDebug(cssExpr, cssWorld);
|
|
} catch (final cssException) {
|
|
templateValid = false;
|
|
dumpTree = cssException.toString();
|
|
}
|
|
}
|
|
|
|
final bgcolor = templateValid ? "white" : "red";
|
|
final color = templateValid ? "black" : "white";
|
|
final valid = templateValid ? "VALID" : "NOT VALID";
|
|
String resultStyle = "resize:none; margin:0; height:100%; width:100%;"
|
|
"padding:5px 7px;";
|
|
String validityStyle = "font-weight:bold; background-color:$bgcolor;"
|
|
"color:$color; border:1px solid black; border-bottom:0px solid white;";
|
|
validity.innerHTML = '''
|
|
<div style="$validityStyle">
|
|
Expression: $cssExpr is $valid
|
|
</div>
|
|
''';
|
|
result.innerHTML = "<textarea style=\"$resultStyle\">$dumpTree</textarea>";
|
|
}
|
|
|
|
void main() {
|
|
final element = new Element.tag('div');
|
|
element.innerHTML = '''
|
|
<table style="width: 100%; height: 100%;">
|
|
<tbody>
|
|
<tr>
|
|
<td style="vertical-align: top; width: 200px;">
|
|
<table style="height: 100%;">
|
|
<tbody>
|
|
<tr style="vertical-align: top; height: 1em;">
|
|
<td>
|
|
<span style="font-weight:bold;">Classes</span>
|
|
</td>
|
|
</tr>
|
|
<tr style="vertical-align: top;">
|
|
<td>
|
|
<textarea id="classes" style="resize: none; width: 200px; height: 100%; padding: 5px 7px;">.foobar\n.xyzzy\n.test\n.dummy\n#myId\n#myStory</textarea>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
<td>
|
|
<table style="width: 100%; height: 100%;" cellspacing=0 cellpadding=0 border=0>
|
|
<tbody>
|
|
<tr style="vertical-align: top; height: 100px;">
|
|
<td>
|
|
<table style="width: 100%;">
|
|
<tbody>
|
|
<tr>
|
|
<td>
|
|
<span style="font-weight:bold;">Selector Expression</span>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td>
|
|
<textarea id="expression" style="resize: none; width: 100%; height: 100px; padding: 5px 7px;"></textarea>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr style="vertical-align: top; height: 50px;">
|
|
<td>
|
|
<table>
|
|
<tbody>
|
|
<tr>
|
|
<td>
|
|
<button id=parse>Parse</button>
|
|
</td>
|
|
<td>
|
|
<button id=check>Check</button>
|
|
</td>
|
|
<td>
|
|
<button id=debug>Debug</button>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
|
|
<tr style="vertical-align: top;">
|
|
<td>
|
|
<table style="width: 100%; height: 100%;" border="0" cellpadding="0" cellspacing="0">
|
|
<tbody>
|
|
<tr style="vertical-align: top; height: 1em;">
|
|
<td>
|
|
<span style="font-weight:bold;">Result</span>
|
|
</td>
|
|
</tr>
|
|
<tr style="vertical-align: top; height: 1em;">
|
|
<td id="validity">
|
|
</td>
|
|
</tr>
|
|
<tr style="vertical-align: top;">
|
|
<td id="result">
|
|
<textarea style="resize: none; width: 100%; height: 100%; border: black solid 1px; padding: 5px 7px;"></textarea>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
''';
|
|
|
|
document.body.style.setProperty("background-color", "lightgray");
|
|
document.body.elements.add(element);
|
|
|
|
ButtonElement parseButton = window.document.query('#parse');
|
|
parseButton.on.click.add((MouseEvent e) {
|
|
runCss(true, true);
|
|
});
|
|
|
|
ButtonElement checkButton = window.document.query('#check');
|
|
checkButton.on.click.add((MouseEvent e) {
|
|
runCss();
|
|
});
|
|
|
|
ButtonElement debugButton = window.document.query('#debug');
|
|
debugButton.on.click.add((MouseEvent e) {
|
|
runCss(true);
|
|
});
|
|
|
|
initCssWorld(false);
|
|
}
|