// 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.

/**
 * @assertion Returns whether the regular expression has a match in the string
 * [str].
 * @description Tests whether regular expressions for shallow XML parsing work.
 * @3rdparty sputnik-v1:S15.10.2_A1_T1.js /
 * http://www.cs.sfu.ca/~cameron/REX.html#AppB
 * @author rodionov
 */

// REX/Javascript 1.0
// Robert D. Cameron "REX: XML Shallow Parsing with Regular Expressions",
// Technical Report TR 1998-17, School of Computing Science, Simon Fraser
// University, November, 1998.
// Copyright (c) 1998, Robert D. Cameron.

main() {
  String TextSE = "[^<]+";
  String UntilHyphen = "[^-]*-";
  String Until2Hyphens = "$UntilHyphen([^-]$UntilHyphen)*-";
  String CommentCE = "$Until2Hyphens>?";
  String UntilRSBs = "[^]]*]([^]]+])*]+";
  String CDATA_CE = '$UntilRSBs([^]>]$UntilRSBs)*>';
  String S = "[ \\n\\t\\r]+";
  String NameStrt = "[A-Za-z_:]|[^\\x00-\\x7F]";
  String NameChar = "[A-Za-z0-9_:.-]|[^\\x00-\\x7F]";
  String Name = "($NameStrt)($NameChar)*";
  String QuoteSE = '"[^"]' "*" '"'  "|'[^']*'";
  String DT_IdentSE = "$S$Name($S($Name|$QuoteSE))*";
  String MarkupDeclCE = "([^]\"'><]+|$QuoteSE)*>";
  String S1 = "[\\n\\r\\t ]";
  String UntilQMs = "[^?]*\\?+";
  String PI_Tail = "\\?>|$S1$UntilQMs([^>?]$UntilQMs)*>";
  String DT_ItemSE = "<(!(--$Until2Hyphens>|[^-]$MarkupDeclCE)|\\?$Name($PI_Tail))|%$Name;|$S";
  String DocTypeCE = "$DT_IdentSE($S)?(\\[($DT_ItemSE)*]($S)?)?>?";
  String DeclCE = "--($CommentCE)?|\\[CDATA\\[($CDATA_CE)?|DOCTYPE($DocTypeCE)?";
  String PI_CE = "$Name($PI_Tail)?";
  String EndTagCE = "$Name($S)?>?";
  String AttValSE = '"[^<"]' "*" '"' "|'[^<']*'";
  String ElemTagCE = "$Name($S$Name($S)?=($S)?($AttValSE))*($S)?/?>?";
  String MarkupSPE = "<(!($DeclCE)?|\\?($PI_CE)?|/($EndTagCE)?|($ElemTagCE)?)";
  String XML_SPE = "$TextSE|$MarkupSPE";
  
  List<String> patterns = [TextSE, UntilHyphen, Until2Hyphens, CommentCE,
    UntilRSBs, CDATA_CE, S, NameStrt, NameChar, Name, QuoteSE, DT_IdentSE,
    MarkupDeclCE, S1,UntilQMs, PI_Tail, DT_ItemSE, DocTypeCE, DeclCE,
    PI_CE, EndTagCE, AttValSE, ElemTagCE, MarkupSPE, XML_SPE];
  
  String html = """
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:xlink="http://www.w3.org/XML/XLink/0.9">
  <head><title>Three Namespaces</title></head>
  <body>
    <h1 align="center">An Ellipse and a Rectangle</h1>
    <svg xmlns="http://www.w3.org/Graphics/SVG/SVG-19991203.dtd"
         width="12cm" height="10cm">
      <ellipse rx="110" ry="130" />
      <rect x="4cm" y="1cm" width="3cm" height="6cm" />
    </svg>
    <p xlink:type="simple" xlink:href="ellipses.html">
      More about ellipses
    </p>
    <p xlink:type="simple" xlink:href="rectangles.html">
      More about rectangles
    </p>
    <hr/>
    <p>Last Modified February 13, 2000</p>
  </body>
</html>
""";

  patterns.forEach((String s) {
    RegExp re = new RegExp(s);
    re.hasMatch(html);
  });
}
