{
  "headers" : {

    "an XHTML XML prolog" : {
      "haml" : "!!! XML",
      "html" : "<?xml version='1.0' encoding='utf-8' ?>"
    },

    "an XHTML default (transitional) doctype" : {
      "haml" : "!!!",
      "html" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">"
    },

    "an XHTML 1.1 doctype" : {
      "haml" : "!!! 1.1",
      "html" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"
    },

    "an XHTML 1.2 mobile doctype" : {
      "haml" : "!!! mobile",
      "html" : "<!DOCTYPE html PUBLIC \"-//WAPFORUM//DTD XHTML Mobile 1.2//EN\" \"http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd\">"
    },

    "an XHTML 1.1 basic doctype" : {
      "haml" : "!!! basic",
      "html" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML Basic 1.1//EN\" \"http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd\">"
    },

    "an XHTML 1.0 frameset doctype" : {
      "haml" : "!!! frameset",
      "html" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">"
    },

    "an HTML 5 doctype with XHTML syntax" : {
      "haml" : "!!! 5",
      "html" : "<!DOCTYPE html>"
    },

    "an HTML 5 XML prolog (silent)" : {
      "haml" : "!!! XML",
      "html" : "",
      "config" : {
        "format" : "html5"
      }
    },

    "an HTML 5 doctype" : {
      "haml" : "!!!",
      "html" : "<!DOCTYPE html>",
      "config" : {
        "format" : "html5"
      }
    },

    "an HTML 4 XML prolog (silent)" : {
      "haml" : "!!! XML",
      "html" : "",
      "config" : {
        "format" : "html4"
      }
    },

    "an HTML 4 default (transitional) doctype" : {
      "haml" : "!!!",
      "html" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">",
      "config" : {
        "format" : "html4"
      }
    },

    "an HTML 4 frameset doctype" : {
      "haml" : "!!! frameset",
      "html" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">",
      "config" : {
        "format" : "html4"
      }
    },

    "an HTML 4 strict doctype" : {
      "haml" : "!!! strict",
      "html" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">",
      "config" : {
        "format" : "html4"
      }
    }

  },

  "basic Haml tags and CSS": {

    "a simple Haml tag" : {
      "haml" : "%p",
      "html" : "<p></p>"
    },

    "a self-closing tag (XHTML)" : {
      "haml" : "%meta",
      "html" : "<meta />"
    },

    "a self-closing tag (HTML4)" : {
      "haml" : "%meta",
      "html" : "<meta>",
      "config" : {
        "format" : "html4"
      }
    },

    "a self-closing tag (HTML5)" : {
      "haml" : "%meta",
      "html" : "<meta>",
      "config" : {
        "format" : "html5"
      }
    },

    "a self-closing tag ('/' modifier + XHTML)" : {
      "haml" : "%zzz/",
      "html" : "<zzz />"
    },

    "a self-closing tag ('/' modifier + HTML5)" : {
      "haml" : "%zzz/",
      "html" : "<zzz>",
      "config" : {
        "format" : "html5"
      }
    },

    "a tag with a CSS class" : {
      "haml" : "%p.class1",
      "html" : "<p class='class1'></p>"
    },

    "a tag with multiple CSS classes" : {
      "haml" : "%p.class1.class2",
      "html" : "<p class='class1 class2'></p>"
    },

    "a tag with a CSS id" : {
      "haml" : "%p#id1",
      "html" : "<p id='id1'></p>"
    },

    "a tag with multiple CSS id's" : {
      "haml" : "%p#id1#id2",
      "html" : "<p id='id2'></p>"
    },

    "a tag with a class followed by an id" : {
      "haml" : "%p.class1#id1",
      "html" : "<p class='class1' id='id1'></p>"
    },

    "a tag with an id followed by a class" : {
      "haml" : "%p#id1.class1",
      "html" : "<p class='class1' id='id1'></p>"
    },

    "an implicit div with a CSS id" : {
      "haml" : "#id1",
      "html" : "<div id='id1'></div>"
    },

    "an implicit div with a CSS class" : {
      "haml" : ".class1",
      "html" : "<div class='class1'></div>"
    },

    "multiple simple Haml tags" : {
      "haml" : "%div\n  %div\n    %p",
      "html" : "<div>\n  <div>\n    <p></p>\n  </div>\n</div>"
    }
  },

  "tags with unusual HTML characters" : {

    "a tag with colons" : {
      "haml" : "%ns:tag",
      "html" : "<ns:tag></ns:tag>"
    },

    "a tag with underscores" : {
      "haml" : "%snake_case",
      "html" : "<snake_case></snake_case>"
    },

    "a tag with dashes" : {
      "haml" : "%dashed-tag",
      "html" : "<dashed-tag></dashed-tag>"
    },

    "a tag with camelCase" : {
      "haml" : "%camelCase",
      "html" : "<camelCase></camelCase>"
    },

    "a tag with PascalCase" : {
      "haml" : "%PascalCase",
      "html" : "<PascalCase></PascalCase>"
    }
  },

  "tags with unusual CSS identifiers" : {

    "an all-numeric class" : {
      "haml" : ".123",
      "html" : "<div class='123'></div>"
    },

    "a class with underscores" : {
      "haml" : ".__",
      "html" : "<div class='__'></div>"
    },

    "a class with dashes" : {
      "haml" : ".--",
      "html" : "<div class='--'></div>"
    }
  },

  "tags with inline content" : {

    "Inline content simple tag" : {
      "haml" : "%p hello",
      "html" : "<p>hello</p>"
    },

    "Inline content tag with CSS" : {
      "haml" : "%p.class1 hello",
      "html" : "<p class='class1'>hello</p>"
    },

    "Inline content multiple simple tags" : {
      "haml" : "%div\n  %div\n    %p text",
      "html" : "<div>\n  <div>\n    <p>text</p>\n  </div>\n</div>"
    }
  },

  "tags with nested content" : {

    "Nested content simple tag" : {
      "haml" : "%p\n  hello",
      "html" : "<p>\n  hello\n</p>"
    },

    "Nested content tag with CSS" : {
      "haml" : "%p.class1\n  hello",
      "html" : "<p class='class1'>\n  hello\n</p>"
    },

    "Nested content multiple simple tags" : {
      "haml" : "%div\n  %div\n    %p\n      text",
      "html" : "<div>\n  <div>\n    <p>\n      text\n    </p>\n  </div>\n</div>"
    }
  },

  "tags with HTML-style attributes": {

    "HTML-style one attribute" : {
      "haml" : "%p(a='b')",
      "html" : "<p a='b'></p>"
    },

    "HTML-style multiple attributes" : {
      "haml" : "%p(a='b' c='d')",
      "html" : "<p a='b' c='d'></p>"
    },

    "HTML-style attributes separated with newlines" : {
      "haml" : "%p(a='b'\n  c='d')",
      "html" : "<p a='b' c='d'></p>"
    },

    "HTML-style interpolated attribute" : {
      "haml" : "%p(a=\"#{var}\")",
      "html" : "<p a='value'></p>",
      "locals" : {
        "var" : "value"
      }
    },

    "HTML-style 'class' as an attribute" : {
      "haml" : "%p(class='class1')",
      "html" : "<p class='class1'></p>"
    },

    "HTML-style tag with a CSS class and 'class' as an attribute" : {
      "haml" : "%p.class2(class='class1')",
      "html" : "<p class='class1 class2'></p>"
    },

    "HTML-style tag with 'id' as an attribute" : {
      "haml" : "%p(id='1')",
      "html" : "<p id='1'></p>"
    },

    "HTML-style tag with a CSS id and 'id' as an attribute" : {
      "haml" : "%p#id(id='1')",
      "html" : "<p id='id_1'></p>"
    },

    "HTML-style tag with a variable attribute" : {
      "haml" : "%p(class=var)",
      "html" : "<p class='hello'></p>",
      "locals" : {
        "var" : "hello"
      }
    },

    "HTML-style tag with a CSS class and 'class' as a variable attribute" : {
      "haml" : ".hello(class=var)",
      "html" : "<div class='hello world'></div>",
      "locals" : {
        "var" : "world"
      }
    },

    "HTML-style tag multiple CSS classes (sorted correctly)" : {
      "haml" : ".z(class=var)",
      "html" : "<div class='a z'></div>",
      "locals" : {
        "var" : "a"
      }
    }
  },

  "tags with Ruby-style attributes": {

    "Ruby-style one attribute" : {
      "haml" : "%p{:a => 'b'}",
      "html" : "<p a='b'></p>",
      "optional" : true
    },

    "Ruby-style attributes hash with whitespace" : {
      "haml" : "%p{  :a  =>  'b'  }",
      "html" : "<p a='b'></p>",
      "optional" : true
    },

    "Ruby-style interpolated attribute" : {
      "haml" : "%p{:a =>\"#{var}\"}",
      "html" : "<p a='value'></p>",
      "optional" : true,
      "locals" : {
        "var" : "value"
      }
    },

    "Ruby-style multiple attributes" : {
      "haml" : "%p{ :a => 'b', 'c' => 'd' }",
      "html" : "<p a='b' c='d'></p>",
      "optional" : true
    },

    "Ruby-style attributes separated with newlines" : {
      "haml" : "%p{ :a => 'b',\n  'c' => 'd' }",
      "html" : "<p a='b' c='d'></p>",
      "optional" : true
    },

    "Ruby-style 'class' as an attribute" : {
      "haml" : "%p{:class => 'class1'}",
      "html" : "<p class='class1'></p>",
      "optional" : true
    },

    "Ruby-style tag with a CSS class and 'class' as an attribute" : {
      "haml" : "%p.class2{:class => 'class1'}",
      "html" : "<p class='class1 class2'></p>",
      "optional" : true
    },

    "Ruby-style tag with 'id' as an attribute" : {
      "haml" : "%p{:id => '1'}",
      "html" : "<p id='1'></p>",
      "optional" : true
    },

    "Ruby-style tag with a CSS id and 'id' as an attribute" : {
      "haml" : "%p#id{:id => '1'}",
      "html" : "<p id='id_1'></p>",
      "optional" : true
    },

    "Ruby-style tag with a CSS id and a numeric 'id' as an attribute" : {
      "haml" : "%p#id{:id => 1}",
      "html" : "<p id='id_1'></p>",
      "optional" : true
    },

    "Ruby-style tag with a variable attribute" : {
      "haml" : "%p{:class => var}",
      "html" : "<p class='hello'></p>",
      "optional" : true,
      "locals" : {
        "var" : "hello"
      }
    },

    "Ruby-style tag with a CSS class and 'class' as a variable attribute" : {
      "haml" : ".hello{:class => var}",
      "html" : "<div class='hello world'></div>",
      "optional" : true,
      "locals" : {
        "var" : "world"
      }
    },

    "Ruby-style tag multiple CSS classes (sorted correctly)" : {
      "haml" : ".z{:class => var}",
      "html" : "<div class='a z'></div>",
      "optional" : true,
      "locals" : {
        "var" : "a"
      }
    }
  },

  "silent comments" : {

    "an inline silent comment" : {
      "haml" : "-# hello",
      "html" : ""
    },

    "a nested silent comment" : {
      "haml" : "-#\n  hello",
      "html" : ""
    }

  },

  "markup comments" : {

    "an inline markup comment" : {
      "haml" : "/ comment",
      "html" : "<!-- comment -->"
    },

    "a nested markup comment" : {
      "haml" : "/\n  comment\n  comment2",
      "html" : "<!--\n  comment\n  comment2\n-->"
    }
  },

  "conditional comments": {
    "a conditional comment" : {
      "haml" : "/[if IE]\n  %p a",
      "html" : "<!--[if IE]>\n  <p>a</p>\n<![endif]-->"
    }
  },

  "internal filters": {

    "content in an 'escaped' filter" : {
      "haml" : ":escaped\n  <&\">",
      "html" : "&lt;&amp;&quot;&gt;"
    },

    "content in a 'preserve' filter" : {
      "haml" : ":preserve\n  hello\n\n%p",
      "html" : "hello&#x000A;\n<p></p>"
    },

    "content in a 'plain' filter" : {
      "haml" : ":plain\n  hello\n\n%p",
      "html" : "hello\n<p></p>"
    },

    "content in a 'css' filter" : {
      "haml" : ":css\n  hello\n\n%p",
      "html" : "<style type='text/css'>\n  /*<![CDATA[*/\n    hello\n  /*]]>*/\n</style>\n<p></p>"
    },

    "content in a 'javascript' filter" : {
      "haml" : ":javascript\n  a();\n%p",
      "html" : "<script type='text/javascript'>\n  //<![CDATA[\n    a();\n  //]]>\n</script>\n<p></p>"
    }

  },

  "Ruby-style interpolation": {

    "interpolation inside inline content" : {
      "haml" : "%p #{var}",
      "html" : "<p>value</p>",
      "optional" : true,
      "locals" : {
        "var" : "value"
      }
    },

    "no interpolation when escaped" : {
      "haml" : "%p \\#{var}",
      "html" : "<p>#{var}</p>",
      "optional" : true,
      "locals" : {
        "var" : "value"
      }
    },

    "interpolation when the escape character is escaped" : {
      "haml" : "%p \\\\#{var}",
      "html" : "<p>\\value</p>",
      "optional" : true,
      "locals" : {
        "var" : "value"
      }
    },

    "interpolation inside filtered content" : {
      "haml" : ":plain\n  #{var} interpolated: #{var}",
      "html" : "value interpolated: value",
      "optional" : true,
      "locals" : {
        "var" : "value"
      }
    }
  },

  "HTML escaping" : {

    "code following '&='" : {
      "haml" : "&= '<\"&>'",
      "html" : "&lt;&quot;&amp;&gt;"
    },

    "code following '=' when escape_haml is set to true" : {
      "haml" : "= '<\"&>'",
      "html" : "&lt;&quot;&amp;&gt;",
      "config" : {
        "escape_html" : "true"
      }
    },

    "code following '!=' when escape_haml is set to true" : {
      "haml" : "!= '<\"&>'",
      "html" : "<\"&>",
      "config" : {
        "escape_html" : "true"
      }
    }

  },

  "boolean attributes" : {

    "boolean attribute with XHTML" : {
      "haml" : "%input(checked=true)",
      "html" : "<input checked='checked' />",
      "config" : {
        "format" : "xhtml"
      }
    },

    "boolean attribute with HTML" : {
      "haml" : "%input(checked=true)",
      "html" : "<input checked>",
      "config" : {
        "format" : "html5"
      }
    }
  },

  "whitespace preservation" : {

    "following the '~' operator" : {
      "haml"     : "~ \"Foo\\n<pre>Bar\\nBaz</pre>\"",
      "html"     : "Foo\n<pre>Bar&#x000A;Baz</pre>",
      "optional" : true
    },

    "inside a textarea tag" : {
      "haml" : "%textarea\n  hello\n  hello",
      "html" : "<textarea>hello\nhello</textarea>"
    },

    "inside a pre tag" : {
      "haml" : "%pre\n  hello\n  hello",
      "html" : "<pre>hello\nhello</pre>"
    }
  },

  "whitespace removal" : {

    "a tag with '>' appended and inline content" : {
      "haml" : "%li hello\n%li> world\n%li again",
      "html" : "<li>hello</li><li>world</li><li>again</li>"
    },

    "a tag with '>' appended and nested content" : {
      "haml" : "%li hello\n%li>\n  world\n%li again",
      "html" : "<li>hello</li><li>\n  world\n</li><li>again</li>"
    },

    "a tag with '<' appended" : {
      "haml" : "%p<\n  hello\n  world",
      "html" : "<p>hello\nworld</p>"
    }
  }
}