summaryrefslogtreecommitdiff
path: root/sources/scala/xml/Parsing.scala
blob: bc86d18e622e6e481f7b65d5ead0a34ba2dfafdb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/*                     __                                               *\
**     ________ ___   / /  ___     Scala API                            **
**    / __/ __// _ | / /  / _ |    (c) 2003-2004, LAMP/EPFL             **
**  __\ \/ /__/ __ |/ /__/ __ |                                         **
** /____/\___/_/ |_/____/_/ | |                                         **
**                          |/                                          **
** $Id$
\*                                                                      */
package scala.xml ;

/** DEPRECATED - use either parsing.TokenTests, or Utilty (helper functions
 *  for parsing XML fragments ).
 */
object Parsing {

  /** (#x20 | #x9 | #xD | #xA) */
  final def isSpace( ch:Char ):Boolean = ch match {
    case '\u0009' | '\u000A' | '\u000D' | '\u0020' => true
    case _                                         => false;
  }

  /** (#x20 | #x9 | #xD | #xA)+ */
  final def isSpace( cs:Seq[Char] ):Boolean = {
    val it = cs.elements;
    it.hasNext && it.forall { isSpace };
  }

  /** NameChar ::= Letter | Digit | '.' | '-' | '_' | ':'
   *             | CombiningChar | Extender
   *
   * see [4] and Appendix B of XML 1.0 specification
  */
  def isNameChar( ch:Char ) = isNameStart( ch ) || (ch match {
    case '.' | '-' | ':' => true;
    case _ => java.lang.Character.getType( ch ).asInstanceOf[Byte] match {
      case java.lang.Character.COMBINING_SPACING_MARK => true; // Mc
      case java.lang.Character.ENCLOSING_MARK => true;         // Me
      case java.lang.Character.NON_SPACING_MARK => true;       // Mn
      case java.lang.Character.MODIFIER_LETTER => true;        // Lm
      case java.lang.Character.DECIMAL_DIGIT_NUMBER => true;   // Nd
      case _ => false;
    }
  });

  /** NameStart ::= ( Letter | '_' )
   *  where Letter means in one of the Unicode general
   *  categories { Ll, Lu, Lo, Lt, Nl }
   *
   *  We do not allow a name to start with ':'.
   *  see [3] and Appendix B of XML 1.0 specification
   */
  def isNameStart( ch:Char ) =
    java.lang.Character.getType( ch ).asInstanceOf[Byte] match {
      case  java.lang.Character.LOWERCASE_LETTER => true;
      case  java.lang.Character.UPPERCASE_LETTER => true;
      case  java.lang.Character.OTHER_LETTER     => true;
      case  java.lang.Character.TITLECASE_LETTER => true;
      case  java.lang.Character.LETTER_NUMBER    => true;
      case _ => ch match {
        case '_' => true
        case _ => false;
      }
    }

  /** Name ::= ( Letter | '_' ) (NameChar)*
   *
   *  see  [5] of XML 1.0 specification
   */
  def isName( s:String ):boolean = {
    if( s.length() > 0 ) {
      val z:Seq[Char] = s;
      val y           = z.elements;
      if( isNameStart( y.next ) ) {
        while( y.hasNext && isNameChar( y.next ) ) {};
        !y.hasNext
      } else false;
    } else false;
  }

  def isPubIDChar( c:Char ) = c match {
    case '\u0020' | '\u000D' | '\u000A' => true;
    case _ if
      ('0' < c && c < '9')||('a' < c && c < 'z')||('A' < c && c < 'Z') => true;
    case '-' | '\''| '(' | ')' | '+' | ',' | '.' | '/' | ':'  | '=' |
         '?' | ';' | '!' | '*' | '#' | '@' | '$' | '_' | '%'           => true
    case _ => false;
  }

  def checkSysID( s:String ):boolean = {
    s.indexOf('"') == -1 || s.indexOf('\'') == -1
  }

  def checkPubID( s:String ):boolean = {
    if( s.length() > 0 ) {
      val z:Seq[Char] = s;
      val y = z.elements;
      while( y.hasNext && isPubIDChar( y.next ) ){};
      !y.hasNext
    } else true
  }

}