// Copyright (c) 2012, 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.

#library('css');

#import('dart:math', prefix: 'Math');
#import("../lib/file_system.dart");
#import('../lib/file_system_memory.dart');

#source('cssoptions.dart');
#source('source.dart');
#source('tokenkind.dart');
#source('token.dart');
#source('tokenizer_base.dart');
#source('tokenizer.dart');
#source('treebase.dart');
#source('tree.dart');
#source('cssselectorexception.dart');
#source('cssworld.dart');
#source('parser.dart');
#source('validate.dart');
#source('generate.dart');
#source('world.dart');


void initCssWorld([bool commandLine = true]) {
  FileSystem fs = new MemoryFileSystem();
  parseOptions([], fs);
  initializeWorld(fs);

  // TODO(terry): Should be set by arguments.  When run as a tool these aren't
  // set when run internaly set these so we can compile CSS and catch any
  // problems programmatically.
  options.throwOnErrors = true;
  options.throwOnFatal = true;
  options.useColors = commandLine ? true : false;
  options.warningsAsErrors = false;
  options.showWarnings = true;
}

// TODO(terry): Add obfuscation mapping file.
void cssParseAndValidate(String cssExpression, CssWorld cssworld) {
  Parser parser = new Parser(new SourceFile(SourceFile.IN_MEMORY_FILE,
      cssExpression));
  var tree = parser.parseTemplate();
  if (tree != null) {
    Validate.template(tree.selectors, cssworld);
  }
}

// Returns pretty printed tree of the expression.
String cssParseAndValidateDebug(String cssExpression, CssWorld cssworld) {
  Parser parser = new Parser(new SourceFile(SourceFile.IN_MEMORY_FILE,
      cssExpression));
  String output = "";
  String prettyTree = "";
  try {
    var tree = parser.parseTemplate();
    if (tree != null) {
      prettyTree = tree.toDebugString();
      Validate.template(tree.selectors, cssworld);
      output = prettyTree;
    }
  } catch (e) {
    String error = e.toString();
    output = "$error\n$prettyTree";
    throw e;
  }

  return output;
}
