You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PropertyTokenizer.html 48KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
  2. <!-- Created by htmlize-0.67 in css mode. -->
  3. <html>
  4. <head>
  5. <title>PropertyTokenizer.java</title>
  6. <style type="text/css">
  7. <!--
  8. body {
  9. color: #000000;
  10. background-color: #faf0e6;
  11. } /* default */
  12. .function-name {
  13. color: #8b2323;
  14. background-color: #faf0e6;
  15. } /* font-lock-function-name-face */
  16. .jde-java-font-lock-italic {
  17. background-color: #faf0e6;
  18. font-style: italic;
  19. } /* jde-java-font-lock-italic-face */
  20. .jde-java-font-lock-modifier {
  21. color: #da70d6;
  22. background-color: #faf0e6;
  23. } /* jde-java-font-lock-modifier-face */
  24. .keyword {
  25. color: #8b0000;
  26. background-color: #faf0e6;
  27. } /* font-lock-keyword-face */
  28. .variable-name {
  29. color: #8b008b;
  30. background-color: #faf0e6;
  31. } /* font-lock-variable-name-face */
  32. .string {
  33. color: #008b00;
  34. background-color: #faf0e6;
  35. } /* font-lock-string-face */
  36. .jde-java-font-lock-package {
  37. color: #0000cd;
  38. background-color: #faf0e6;
  39. } /* jde-java-font-lock-package-face */
  40. .jde-java-font-lock-constant {
  41. color: #5f9ea0;
  42. background-color: #faf0e6;
  43. } /* jde-java-font-lock-constant-face */
  44. .type {
  45. color: #4682b4;
  46. background-color: #faf0e6;
  47. } /* font-lock-type-face */
  48. .jde-java-font-lock-doc-tag {
  49. color: #008b00;
  50. background-color: #faf0e6;
  51. } /* jde-java-font-lock-doc-tag-face */
  52. .comment {
  53. color: #00008b;
  54. background-color: #faf0e6;
  55. } /* font-lock-comment-face */
  56. .jde-java-font-lock-number {
  57. color: #bc8f8f;
  58. background-color: #faf0e6;
  59. } /* jde-java-font-lock-number-face */
  60. a {
  61. color: inherit;
  62. background-color: inherit;
  63. font: inherit;
  64. text-decoration: inherit;
  65. }
  66. a:hover {
  67. text-decoration: underline;
  68. }
  69. -->
  70. </style>
  71. </head>
  72. <body>
  73. <pre>
  74. <span class="comment">/*
  75. * $Id$
  76. * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
  77. * For details on use and redistribution please refer to the
  78. * LICENSE file included with these sources.
  79. */</span>
  80. <span class="keyword">package</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">fo</span>.<span class="jde-java-font-lock-package">expr</span>;
  81. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Numeric</span>;
  82. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Length</span>;
  83. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Frequency</span>;
  84. <span class="keyword">import</span> <span class="jde-java-font-lock-package">org</span>.<span class="jde-java-font-lock-package">apache</span>.<span class="jde-java-font-lock-package">fop</span>.<span class="jde-java-font-lock-package">datatypes</span>.<span class="type">Time</span>;
  85. <span class="comment">/**
  86. * Class to tokenize XSL FO property expression.
  87. * This class is heavily based on the epxression tokenizer in James Clark's
  88. * XT, an XSLT processor.
  89. */</span>
  90. <span class="keyword">class</span> <span class="function-name" id="PropertyTokenizerClass">PropertyTokenizer</span> {
  91. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">String</span> <span class="variable-name" id="tag">tag</span> = &quot;<span class="string">$Name$</span>&quot;;
  92. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">String</span> <span class="variable-name" id="revision">revision</span> = &quot;<span class="string">$Revision$</span>&quot;;
  93. <span class="comment">/*
  94. * Maintain the numbering of this list in (X)Emacs by issuing
  95. * a shell command on the region with replacement (M-1 M-|). Use
  96. * the perl command:
  97. * perl -p -e 'BEGIN{$n=0};$n++ if s/= [0-9]+/= $n/'
  98. *
  99. * in vi, set mark `</span><span class="jde-java-font-lock-doc-tag">a</span><span class="comment">' at the last line and
  100. * !'aperl... etc
  101. */</span>
  102. <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">int</span>
  103. <span class="jde-java-font-lock-constant" id="EOF">EOF</span> = <span class="jde-java-font-lock-number">0</span>
  104. ,<span class="jde-java-font-lock-constant" id="NCNAME">NCNAME</span> = <span class="jde-java-font-lock-number">1</span>
  105. ,<span class="jde-java-font-lock-constant" id="MULTIPLY">MULTIPLY</span> = <span class="jde-java-font-lock-number">2</span>
  106. ,<span class="jde-java-font-lock-constant" id="LPAR">LPAR</span> = <span class="jde-java-font-lock-number">3</span>
  107. ,<span class="jde-java-font-lock-constant" id="RPAR">RPAR</span> = <span class="jde-java-font-lock-number">4</span>
  108. ,<span class="jde-java-font-lock-constant" id="LITERAL">LITERAL</span> = <span class="jde-java-font-lock-number">5</span>
  109. ,<span class="jde-java-font-lock-constant" id="FUNCTION_LPAR">FUNCTION_LPAR</span> = <span class="jde-java-font-lock-number">6</span>
  110. ,<span class="jde-java-font-lock-constant" id="PLUS">PLUS</span> = <span class="jde-java-font-lock-number">7</span>
  111. ,<span class="jde-java-font-lock-constant" id="MINUS">MINUS</span> = <span class="jde-java-font-lock-number">8</span>
  112. ,<span class="jde-java-font-lock-constant" id="MOD">MOD</span> = <span class="jde-java-font-lock-number">9</span>
  113. ,<span class="jde-java-font-lock-constant" id="DIV">DIV</span> = <span class="jde-java-font-lock-number">10</span>
  114. ,<span class="jde-java-font-lock-constant" id="COMMA">COMMA</span> = <span class="jde-java-font-lock-number">11</span>
  115. ,<span class="jde-java-font-lock-constant" id="PERCENT">PERCENT</span> = <span class="jde-java-font-lock-number">12</span>
  116. ,<span class="jde-java-font-lock-constant" id="COLORSPEC">COLORSPEC</span> = <span class="jde-java-font-lock-number">13</span>
  117. ,<span class="jde-java-font-lock-constant" id="FLOAT">FLOAT</span> = <span class="jde-java-font-lock-number">14</span>
  118. ,<span class="jde-java-font-lock-constant" id="INTEGER">INTEGER</span> = <span class="jde-java-font-lock-number">15</span>
  119. ,<span class="jde-java-font-lock-constant" id="ABSOLUTE_LENGTH">ABSOLUTE_LENGTH</span> = <span class="jde-java-font-lock-number">16</span>
  120. ,<span class="jde-java-font-lock-constant" id="RELATIVE_LENGTH">RELATIVE_LENGTH</span> = <span class="jde-java-font-lock-number">17</span>
  121. ,<span class="jde-java-font-lock-constant" id="TIME">TIME</span> = <span class="jde-java-font-lock-number">18</span>
  122. ,<span class="jde-java-font-lock-constant" id="FREQ">FREQ</span> = <span class="jde-java-font-lock-number">19</span>
  123. ,<span class="jde-java-font-lock-constant" id="ANGLE">ANGLE</span> = <span class="jde-java-font-lock-number">20</span>
  124. ,<span class="jde-java-font-lock-constant" id="INHERIT">INHERIT</span> = <span class="jde-java-font-lock-number">21</span>
  125. ,<span class="jde-java-font-lock-constant" id="AUTO">AUTO</span> = <span class="jde-java-font-lock-number">22</span>
  126. ,<span class="jde-java-font-lock-constant" id="NONE">NONE</span> = <span class="jde-java-font-lock-number">23</span>
  127. ,<span class="jde-java-font-lock-constant" id="BOOL">BOOL</span> = <span class="jde-java-font-lock-number">24</span>
  128. ,<span class="jde-java-font-lock-constant" id="URI">URI</span> = <span class="jde-java-font-lock-number">25</span>
  129. ,<span class="jde-java-font-lock-constant" id="MIMETYPE">MIMETYPE</span> = <span class="jde-java-font-lock-number">26</span>
  130. ,<span class="jde-java-font-lock-constant" id="SLASH">SLASH</span> = <span class="jde-java-font-lock-number">27</span>
  131. <span class="comment">// NO_UNIT is a transient token for internal use only. It is
  132. </span> <span class="comment">// never set as the end result of parsing a token.
  133. </span> ,<span class="jde-java-font-lock-constant" id="NO_UNIT">NO_UNIT</span> = <span class="jde-java-font-lock-number">28</span>
  134. <span class="comment">//,NSPREFIX = 29
  135. </span> <span class="comment">//,WHITESPACE = 30
  136. </span> ;
  137. <span class="comment">/*
  138. * Absolute unit type constants
  139. */</span>
  140. <span class="type">int</span> <span class="variable-name" id="currentToken">currentToken</span> = <span class="jde-java-font-lock-constant">EOF</span>;
  141. <span class="type">String</span> <span class="variable-name" id="currentTokenValue">currentTokenValue</span> = <span class="jde-java-font-lock-constant" id="null">null</span>;
  142. <span class="jde-java-font-lock-modifier">protected</span> <span class="type">int</span> <span class="variable-name" id="currentUnitIndex">currentUnitIndex</span> = <span class="jde-java-font-lock-number">0</span>;
  143. <span class="jde-java-font-lock-modifier">protected</span> <span class="type">int</span> <span class="variable-name" id="currentUnit">currentUnit</span>;
  144. <span class="jde-java-font-lock-modifier">protected</span> <span class="type">String</span> <span class="variable-name" id="unitString">unitString</span>;
  145. <span class="jde-java-font-lock-modifier">protected</span> <span class="type">String</span> <span class="variable-name" id="uri">uri</span>;
  146. <span class="jde-java-font-lock-modifier">private</span> <span class="type">int</span> <span class="variable-name" id="currentTokenStartIndex">currentTokenStartIndex</span> = <span class="jde-java-font-lock-number">0</span>;
  147. <span class="jde-java-font-lock-modifier">private</span> <span class="type">String</span> <span class="variable-name" id="expr">expr</span> = <span class="jde-java-font-lock-constant">null</span>;
  148. <span class="jde-java-font-lock-modifier">private</span> <span class="type">int</span> <span class="variable-name" id="exprIndex">exprIndex</span> = <span class="jde-java-font-lock-number">0</span>;
  149. <span class="jde-java-font-lock-modifier">private</span> <span class="type">int</span> <span class="variable-name" id="exprLength">exprLength</span>;
  150. <span class="jde-java-font-lock-modifier">protected</span> <span class="type">int</span> <span class="variable-name" id="property">property</span>;
  151. <span class="jde-java-font-lock-modifier">protected</span> <span class="function-name" id="PropertyTokenizer">PropertyTokenizer</span>() {}
  152. <span class="comment">/**
  153. * Initialize this tokenizer to tokenize the passed
  154. * String as a value of the passed property.
  155. * It is assumed that the subclass has made any necessary
  156. * synchronization arrangements.
  157. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name">property</span><span class="comment"> an &lt;tt&gt;int&lt;/tt&gt; containing the property index.
  158. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="s">s</span><span class="comment"> The Property expression to tokenize.
  159. */</span>
  160. <span class="jde-java-font-lock-modifier">protected</span> <span class="type">void</span> <span class="function-name" id="initialize">initialize</span>(<span class="type">int</span> <span class="variable-name">property</span>, <span class="type">String</span> <span class="variable-name">s</span>) {
  161. expr = s;
  162. exprLength = s.length();
  163. <span class="keyword">this</span>.property = property;
  164. <span class="comment">//System.out.println(&quot;-----Tokenizer initialized: &quot; + expr);
  165. </span> }
  166. <span class="comment">/**
  167. * Reset the tokenizer to null (or equivalent) values.
  168. * Synchronization is achieved in the subclass.
  169. */</span>
  170. <span class="jde-java-font-lock-modifier">protected</span> <span class="type">void</span> <span class="function-name" id="reset">reset</span>() {
  171. expr = <span class="jde-java-font-lock-constant">null</span>;
  172. exprIndex = <span class="jde-java-font-lock-number">0</span>;
  173. exprLength = <span class="jde-java-font-lock-number">0</span>;
  174. currentToken = <span class="jde-java-font-lock-constant">EOF</span>;
  175. currentTokenValue = <span class="jde-java-font-lock-constant">null</span>;
  176. property = <span class="jde-java-font-lock-number">0</span>;
  177. <span class="comment">//System.out.println(&quot;-----Tokenizer reset.&quot;);
  178. </span> }
  179. <span class="comment">/**
  180. * Get the current expression
  181. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> - the expression.
  182. */</span>
  183. <span class="jde-java-font-lock-modifier">public</span> <span class="type">String</span> <span class="function-name" id="getExpr">getExpr</span>() {
  184. <span class="keyword">return</span> expr;
  185. }
  186. <span class="comment">/**
  187. * Return the next token in the expression string.
  188. * This sets the following package visible variables:
  189. * currentToken An enumerated value identifying the recognized token
  190. * currentTokenValue A String containing the token contents
  191. * currentUnit If currentToken = ABSOLUTE_LENGTH, TIME or FREQUENCY,
  192. * an enumerated value identifying the unit.
  193. * </span><span class="jde-java-font-lock-doc-tag">@throws</span><span class="comment"> </span><span class="type">PropertyException</span><span class="comment"> If un unrecognized token is encountered.
  194. */</span>
  195. <span class="type">void</span> <span class="function-name" id="next">next</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  196. <span class="comment">//System.out.println(&quot;expr:&quot; + expr + &quot;: exprIndex: &quot; + exprIndex);
  197. </span> currentTokenValue = <span class="jde-java-font-lock-constant">null</span>;
  198. currentTokenStartIndex = exprIndex;
  199. <span class="type">boolean</span> <span class="variable-name" id="bSawDecimal">bSawDecimal</span>;
  200. <span class="keyword">for</span> (; ; ) {
  201. <span class="keyword">if</span> (exprIndex &gt;= exprLength) {
  202. currentToken = <span class="jde-java-font-lock-constant">EOF</span>;
  203. <span class="keyword">return</span>;
  204. }
  205. <span class="type">char</span> <span class="variable-name" id="c">c</span> = expr.charAt(exprIndex++);
  206. <span class="keyword">switch</span> (c) {
  207. <span class="keyword">case</span> '<span class="string"> </span>':
  208. <span class="keyword">case</span> '<span class="string">\t</span>':
  209. <span class="keyword">case</span> '<span class="string">\r</span>':
  210. <span class="keyword">case</span> '<span class="string">\n</span>':
  211. <span class="comment">// Whitespace characters are valid within strings.
  212. </span> <span class="comment">// in font family names, sequences of whitespace are
  213. </span> <span class="comment">// compressed into a single space. (Rec 7.8.2)
  214. </span> <span class="comment">//scanWhitespace();
  215. </span> <span class="comment">//currentToken = WHITESPACE;
  216. </span> <span class="comment">//currentTokenValue = expr.substring(currentTokenStartIndex,
  217. </span> <span class="comment">// exprIndex);
  218. </span> <span class="comment">//return;
  219. </span> currentTokenStartIndex = exprIndex;
  220. <span class="keyword">break</span>;
  221. <span class="keyword">case</span> '<span class="string">,</span>':
  222. currentToken = <span class="jde-java-font-lock-constant">COMMA</span>;
  223. <span class="keyword">return</span>;
  224. <span class="keyword">case</span> '<span class="string">+</span>':
  225. currentToken = <span class="jde-java-font-lock-constant">PLUS</span>;
  226. <span class="keyword">return</span>;
  227. <span class="keyword">case</span> '<span class="string">-</span>':
  228. currentToken = <span class="jde-java-font-lock-constant">MINUS</span>;
  229. <span class="keyword">return</span>;
  230. <span class="keyword">case</span> '<span class="string">(</span>':
  231. currentToken = <span class="jde-java-font-lock-constant">LPAR</span>;
  232. <span class="keyword">return</span>;
  233. <span class="keyword">case</span> '<span class="string">)</span>':
  234. currentToken = <span class="jde-java-font-lock-constant">RPAR</span>;
  235. <span class="keyword">return</span>;
  236. <span class="keyword">case</span> '<span class="string">&quot;</span>':
  237. <span class="keyword">case</span> '<span class="string">\'</span>':
  238. exprIndex = expr.indexOf(c, exprIndex);
  239. <span class="keyword">if</span> (exprIndex &lt; <span class="jde-java-font-lock-number">0</span>) {
  240. exprIndex = currentTokenStartIndex + <span class="jde-java-font-lock-number">1</span>;
  241. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">missing quote</span>&quot;);
  242. }
  243. currentTokenValue = expr.substring(currentTokenStartIndex
  244. + <span class="jde-java-font-lock-number">1</span>, exprIndex++);
  245. currentToken = <span class="jde-java-font-lock-constant">LITERAL</span>;
  246. <span class="keyword">return</span>;
  247. <span class="keyword">case</span> '<span class="string">*</span>':
  248. currentToken = <span class="jde-java-font-lock-constant">MULTIPLY</span>;
  249. <span class="keyword">return</span>;
  250. <span class="keyword">case</span> '<span class="string">0</span>':
  251. <span class="keyword">case</span> '<span class="string">1</span>':
  252. <span class="keyword">case</span> '<span class="string">2</span>':
  253. <span class="keyword">case</span> '<span class="string">3</span>':
  254. <span class="keyword">case</span> '<span class="string">4</span>':
  255. <span class="keyword">case</span> '<span class="string">5</span>':
  256. <span class="keyword">case</span> '<span class="string">6</span>':
  257. <span class="keyword">case</span> '<span class="string">7</span>':
  258. <span class="keyword">case</span> '<span class="string">8</span>':
  259. <span class="keyword">case</span> '<span class="string">9</span>':
  260. scanDigits();
  261. <span class="keyword">if</span> (exprIndex &lt; exprLength &amp;&amp; expr.charAt(exprIndex) == '<span class="string">.</span>') {
  262. exprIndex++;
  263. bSawDecimal = <span class="jde-java-font-lock-constant" id="true">true</span>;
  264. <span class="keyword">if</span> (exprIndex &lt; exprLength
  265. &amp;&amp; isDigit(expr.charAt(exprIndex))) {
  266. exprIndex++;
  267. scanDigits();
  268. }
  269. } <span class="keyword">else</span>
  270. bSawDecimal = <span class="jde-java-font-lock-constant" id="false">false</span>;
  271. currentUnitIndex = exprIndex;
  272. <span class="keyword">if</span> (exprIndex &lt; exprLength &amp;&amp; expr.charAt(exprIndex) == '<span class="string">%</span>') {
  273. currentToken = <span class="jde-java-font-lock-constant">PERCENT</span>;
  274. unitString = &quot;<span class="string">%</span>&quot;;
  275. exprIndex++;
  276. } <span class="keyword">else</span> {
  277. <span class="comment">// Check for possible unit name following number
  278. </span> currentToken = scanUnitName();
  279. <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">NO_UNIT</span>)
  280. currentToken = bSawDecimal ? <span class="jde-java-font-lock-constant">FLOAT</span> : <span class="jde-java-font-lock-constant">INTEGER</span>;
  281. }
  282. currentTokenValue = expr.substring(currentTokenStartIndex,
  283. currentUnitIndex);
  284. <span class="keyword">return</span>;
  285. <span class="keyword">case</span> '<span class="string">.</span>':
  286. <span class="keyword">if</span> (exprIndex &lt; exprLength
  287. &amp;&amp; isDigit(expr.charAt(exprIndex))) {
  288. ++exprIndex;
  289. scanDigits();
  290. currentUnitIndex = exprIndex;
  291. <span class="keyword">if</span> (exprIndex &lt; exprLength
  292. &amp;&amp; expr.charAt(exprIndex) == '<span class="string">%</span>') {
  293. exprIndex++;
  294. currentToken = <span class="jde-java-font-lock-constant">PERCENT</span>;
  295. } <span class="keyword">else</span> {
  296. <span class="comment">// Check for possible unit name following number
  297. </span> currentToken = scanUnitName();
  298. <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">NO_UNIT</span>)
  299. currentToken = <span class="jde-java-font-lock-constant">FLOAT</span>;
  300. }
  301. currentTokenValue = expr.substring(currentTokenStartIndex,
  302. currentUnitIndex);
  303. <span class="keyword">return</span>;
  304. }
  305. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">illegal character '.'</span>&quot;);
  306. <span class="keyword">case</span> '<span class="string">#</span>': <span class="comment">// Start of color value
  307. </span> <span class="keyword">if</span> (exprIndex &lt; exprLength
  308. &amp;&amp; isHexDigit(expr.charAt(exprIndex))) {
  309. <span class="type">int</span> <span class="variable-name" id="len">len</span>;
  310. ++exprIndex;
  311. scanHexDigits();
  312. currentToken = <span class="jde-java-font-lock-constant">COLORSPEC</span>;
  313. currentTokenValue = expr.substring(currentTokenStartIndex,
  314. exprIndex);
  315. <span class="comment">// Probably should have some multiple of 3 for length!
  316. </span> len = exprIndex - currentTokenStartIndex;
  317. <span class="keyword">if</span> (len == <span class="jde-java-font-lock-number">4</span> || len == <span class="jde-java-font-lock-number">7</span>) <span class="keyword">return</span>;
  318. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">color not 3 or 6 hex digits</span>&quot;);
  319. } <span class="keyword">else</span> {
  320. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">illegal character '#'</span>&quot;);
  321. }
  322. <span class="keyword">case</span> '<span class="string">/</span>':
  323. currentToken = <span class="jde-java-font-lock-constant">SLASH</span>;
  324. <span class="keyword">return</span>;
  325. <span class="keyword">default</span>:
  326. --exprIndex;
  327. scanName();
  328. <span class="keyword">if</span> (exprIndex == currentTokenStartIndex)
  329. <span class="comment">// Not a name - must be a &lt;string&gt;
  330. </span> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
  331. (&quot;<span class="string">illegal character '</span>&quot;
  332. + expr.charAt(exprIndex) + &quot;<span class="string">'</span>&quot;);
  333. currentTokenValue = expr.substring(currentTokenStartIndex,
  334. exprIndex);
  335. <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">mod</span>&quot;)) {
  336. currentToken = <span class="jde-java-font-lock-constant">MOD</span>;
  337. <span class="keyword">return</span>;
  338. }
  339. <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">div</span>&quot;)) {
  340. currentToken = <span class="jde-java-font-lock-constant">DIV</span>;
  341. <span class="keyword">return</span>;
  342. }
  343. <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">inherit</span>&quot;)) {
  344. currentToken = <span class="jde-java-font-lock-constant">INHERIT</span>;
  345. <span class="keyword">return</span>;
  346. }
  347. <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">auto</span>&quot;)) {
  348. currentToken = <span class="jde-java-font-lock-constant">AUTO</span>;
  349. <span class="keyword">return</span>;
  350. }
  351. <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">none</span>&quot;)) {
  352. currentToken = <span class="jde-java-font-lock-constant">NONE</span>;
  353. <span class="keyword">return</span>;
  354. }
  355. <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">true</span>&quot;)
  356. || currentTokenValue.equals(&quot;<span class="string">false</span>&quot;)) {
  357. currentToken = <span class="jde-java-font-lock-constant">BOOL</span>;
  358. <span class="keyword">return</span>;
  359. }
  360. <span class="comment">// Quick and dirty url &quot;parsing&quot;. Assume that a
  361. </span> <span class="comment">// URI-SPECIFICATION must be the only component of a
  362. </span> <span class="comment">// property value expression
  363. </span> <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">url</span>&quot;)
  364. &amp;&amp; expr.charAt(exprIndex) == '<span class="string">(</span>') {
  365. <span class="keyword">if</span> (! scanUrl()) {
  366. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
  367. (&quot;<span class="string">Invalid url expression :</span>&quot; +
  368. expr.substring(exprIndex));
  369. }
  370. currentToken = <span class="jde-java-font-lock-constant">URI</span>;
  371. <span class="keyword">return</span>;
  372. }
  373. <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">content-type</span>&quot;)) {
  374. <span class="comment">// content-type attribute value. Must be followed
  375. </span> <span class="comment">// by a mime type
  376. </span> <span class="keyword">if</span> (expr.charAt(exprIndex) == '<span class="string">:</span>') {
  377. <span class="type">int</span> <span class="variable-name" id="mimeptr">mimeptr</span> = ++exprIndex;
  378. scanMimeType();
  379. currentToken = <span class="jde-java-font-lock-constant">MIMETYPE</span>;
  380. currentTokenValue =
  381. expr.substring(mimeptr, exprIndex);
  382. <span class="keyword">return</span>;
  383. }
  384. <span class="comment">// else it's just a name
  385. </span> }
  386. <span class="keyword">if</span> (currentTokenValue.equals(&quot;<span class="string">namespace-prefix</span>&quot;)) {
  387. <span class="comment">// content-type attribute value. Must be followed
  388. </span> <span class="comment">// by a declared namespace-prefix or null
  389. </span> <span class="keyword">if</span> (expr.charAt(exprIndex) == '<span class="string">:</span>') {
  390. <span class="type">int</span> <span class="variable-name" id="nsptr">nsptr</span> = ++exprIndex;
  391. scanName(); <span class="comment">// Allowed to be empty
  392. </span> currentToken = <span class="jde-java-font-lock-constant">NCNAME</span>;
  393. currentTokenValue =
  394. expr.substring(nsptr, exprIndex);
  395. <span class="keyword">return</span>;
  396. }
  397. <span class="comment">// else it's just a name
  398. </span> }
  399. <span class="keyword">if</span> (followingParen()) {
  400. currentToken = <span class="jde-java-font-lock-constant">FUNCTION_LPAR</span>;
  401. } <span class="keyword">else</span> {
  402. currentToken = <span class="jde-java-font-lock-constant">NCNAME</span>;
  403. }
  404. <span class="keyword">return</span>;
  405. }
  406. }
  407. }
  408. <span class="comment">/**
  409. * Attempt to recognize a valid UnitName token in the input expression.
  410. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> token value appropriate to UnitName: ABSOLUTE_LENGTH,
  411. * RELATIVE_LENGTH or NO_UNIT.
  412. * </span><span class="jde-java-font-lock-doc-tag">@exception</span><span class="comment"> </span><span class="type">PropertyException</span><span class="comment"> if an NCName not a UnitName recognized.
  413. */</span>
  414. <span class="jde-java-font-lock-modifier">private</span> <span class="type">int</span> <span class="function-name" id="scanUnitName">scanUnitName</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  415. currentUnitIndex = exprIndex;
  416. scanName();
  417. <span class="keyword">if</span> (currentUnitIndex &lt; exprIndex) {
  418. unitString = expr.substring(currentUnitIndex, exprIndex);
  419. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">em</span>&quot;)) <span class="keyword">return</span> <span class="jde-java-font-lock-constant">RELATIVE_LENGTH</span>;
  420. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">cm</span>&quot;)) {
  421. currentUnit = Length.<span class="jde-java-font-lock-constant" id="CM">CM</span>;
  422. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">ABSOLUTE_LENGTH</span>;
  423. }
  424. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">mm</span>&quot;)) {
  425. currentUnit = Length.<span class="jde-java-font-lock-constant" id="MM">MM</span>;
  426. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">ABSOLUTE_LENGTH</span>;
  427. }
  428. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">in</span>&quot;)) {
  429. currentUnit = Length.<span class="jde-java-font-lock-constant" id="IN">IN</span>;
  430. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">ABSOLUTE_LENGTH</span>;
  431. }
  432. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">pt</span>&quot;)) {
  433. currentUnit = Length.<span class="jde-java-font-lock-constant" id="PT">PT</span>;
  434. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">ABSOLUTE_LENGTH</span>;
  435. }
  436. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">pc</span>&quot;)) {
  437. currentUnit = Length.<span class="jde-java-font-lock-constant" id="PC">PC</span>;
  438. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">ABSOLUTE_LENGTH</span>;
  439. }
  440. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">px</span>&quot;)) {
  441. currentUnit = Length.<span class="jde-java-font-lock-constant" id="PX">PX</span>;
  442. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">ABSOLUTE_LENGTH</span>;
  443. }
  444. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">s</span>&quot;)) {
  445. currentUnit = Time.<span class="jde-java-font-lock-constant" id="SEC">SEC</span>;
  446. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">TIME</span>;
  447. }
  448. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">ms</span>&quot;)) {
  449. currentUnit = Time.<span class="jde-java-font-lock-constant" id="MSEC">MSEC</span>;
  450. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">TIME</span>;
  451. }
  452. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">Hz</span>&quot;)) {
  453. currentUnit = Frequency.<span class="jde-java-font-lock-constant" id="HZ">HZ</span>;
  454. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">FREQ</span>;
  455. }
  456. <span class="keyword">if</span> (unitString.equals(&quot;<span class="string">kHz</span>&quot;)) {
  457. currentUnit = Frequency.<span class="jde-java-font-lock-constant" id="KHZ">KHZ</span>;
  458. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">FREQ</span>;
  459. }
  460. <span class="comment">// Not a UnitName
  461. </span> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
  462. (&quot;<span class="string">NCName following a number is not a UnitName</span>&quot;);
  463. } <span class="keyword">else</span> { <span class="comment">// No NCName found
  464. </span> <span class="keyword">return</span> <span class="jde-java-font-lock-constant">NO_UNIT</span>;
  465. }
  466. }
  467. <span class="comment">/**
  468. * Attempt to recognize a valid NAME token in the input expression.
  469. */</span>
  470. <span class="jde-java-font-lock-modifier">private</span> <span class="type">void</span> <span class="function-name" id="scanName">scanName</span>() {
  471. <span class="keyword">if</span> (exprIndex &lt; exprLength &amp;&amp; isNameStartChar(expr.charAt(exprIndex)))
  472. <span class="keyword">while</span> (++exprIndex &lt; exprLength
  473. &amp;&amp; isNameChar(expr.charAt(exprIndex)));
  474. }
  475. <span class="comment">/**
  476. * Attempt to recognize a valid sequence of decimal digits in the
  477. * input expression.
  478. */</span>
  479. <span class="jde-java-font-lock-modifier">private</span> <span class="type">void</span> <span class="function-name" id="scanDigits">scanDigits</span>() {
  480. <span class="keyword">while</span> (exprIndex &lt; exprLength &amp;&amp; isDigit(expr.charAt(exprIndex)))
  481. exprIndex++;
  482. }
  483. <span class="comment">/**
  484. * Scan to the end of a sequence of whitespace characters in the
  485. * input expression.
  486. */</span>
  487. <span class="jde-java-font-lock-modifier">private</span> <span class="type">void</span> <span class="function-name" id="scanWhitespace">scanWhitespace</span>() {
  488. <span class="keyword">while</span> (exprIndex &lt; exprLength &amp;&amp; isSpace(expr.charAt(exprIndex)))
  489. exprIndex++;
  490. }
  491. <span class="comment">/**
  492. * Attempt to recognize a valid sequence of hexadecimal digits in the
  493. * input expression.
  494. */</span>
  495. <span class="jde-java-font-lock-modifier">private</span> <span class="type">void</span> <span class="function-name" id="scanHexDigits">scanHexDigits</span>() {
  496. <span class="keyword">while</span> (exprIndex &lt; exprLength &amp;&amp; isHexDigit(expr.charAt(exprIndex)))
  497. exprIndex++;
  498. }
  499. <span class="comment">/**
  500. * Attempt to recognize a mime-type. Working definition here:
  501. * NCName/NCName (NCName as recognized by scanName()).
  502. */</span>
  503. <span class="jde-java-font-lock-modifier">private</span> <span class="type">void</span> <span class="function-name" id="scanMimeType">scanMimeType</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
  504. <span class="type">int</span> <span class="variable-name" id="part1">part1</span> = exprIndex;
  505. scanName();
  506. <span class="keyword">if</span> (part1 != exprIndex) {
  507. <span class="keyword">if</span> (expr.charAt(exprIndex) == '<span class="string">/</span>') {
  508. <span class="type">int</span> <span class="variable-name" id="part2">part2</span> = ++exprIndex;
  509. scanName();
  510. <span class="keyword">if</span> (part2 != exprIndex)
  511. <span class="keyword">return</span>;
  512. }
  513. }
  514. <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(&quot;<span class="string">Mime type expected; found:</span>&quot; +
  515. expr.substring(part1));
  516. }
  517. <span class="comment">/**
  518. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> a boolean value indicating whether the following non-whitespace
  519. * character is an opening parenthesis.
  520. */</span>
  521. <span class="jde-java-font-lock-modifier">private</span> <span class="type">boolean</span> <span class="function-name" id="followingParen">followingParen</span>() {
  522. <span class="keyword">for</span> (<span class="type">int</span> <span class="variable-name" id="i">i</span> = exprIndex; i &lt; exprLength; i++) {
  523. <span class="keyword">switch</span> (expr.charAt(i)) {
  524. <span class="keyword">case</span> '<span class="string">(</span>':
  525. exprIndex = i + <span class="jde-java-font-lock-number">1</span>;
  526. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">true</span>;
  527. <span class="keyword">case</span> '<span class="string"> </span>':
  528. <span class="keyword">case</span> '<span class="string">\r</span>':
  529. <span class="keyword">case</span> '<span class="string">\n</span>':
  530. <span class="keyword">case</span> '<span class="string">\t</span>':
  531. <span class="keyword">break</span>;
  532. <span class="keyword">default</span>:
  533. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">false</span>;
  534. }
  535. }
  536. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">false</span>;
  537. }
  538. <span class="comment">/**
  539. * Primitive URI extractor. Assumes that the only contents of a
  540. * URI-SPECIFICATION property type is a complete uri-specification.
  541. * No checking is done on the syntactical validity of the URI.
  542. * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> a boolean indicating whether the remainder of the
  543. * characters form the body of a &lt;tt&gt;url(...)&lt;/tt&gt; specification.
  544. * As a side-effect, sets the &lt;tt&gt;protected&lt;/tt&gt; field &lt;i&gt;</span><span class="jde-java-font-lock-italic">uri</span><span class="comment">&lt;/i&gt;
  545. * and sets &lt;i&gt;</span><span class="jde-java-font-lock-italic">exprIndex</span><span class="comment">&lt;/i&gt; past the end of the expression, when
  546. * returning a &lt;tt&gt;true&lt;/tt&gt; value.
  547. */</span>
  548. <span class="jde-java-font-lock-modifier">private</span> <span class="type">boolean</span> <span class="function-name" id="scanUrl">scanUrl</span>() {
  549. <span class="type">char</span> <span class="variable-name" id="ch">ch</span>;
  550. <span class="type">String</span> <span class="variable-name" id="str">str</span> = expr.substring(exprIndex).trim();
  551. <span class="keyword">if</span> (str.charAt(str.length() - <span class="jde-java-font-lock-number">1</span>) != '<span class="string">)</span>') <span class="keyword">return</span> <span class="jde-java-font-lock-constant">false</span>;
  552. <span class="comment">// Remove closing parenthesis and trim
  553. </span> str = str.substring(<span class="jde-java-font-lock-number">0</span>, str.length() - <span class="jde-java-font-lock-number">1</span>).trim();
  554. <span class="keyword">if</span> ((ch = str.charAt(<span class="jde-java-font-lock-number">0</span>)) == '<span class="string">&quot;</span>' || ch == '<span class="string">\'</span>') {
  555. <span class="keyword">if</span> (str.charAt(str.length() - <span class="jde-java-font-lock-number">1</span>) != ch) <span class="keyword">return</span> <span class="jde-java-font-lock-constant">false</span>;
  556. str = str.substring(<span class="jde-java-font-lock-number">1</span>, str.length() - <span class="jde-java-font-lock-number">1</span>);
  557. }
  558. uri = str.trim();
  559. exprIndex = expr.length();
  560. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">true</span>;
  561. }
  562. <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">String</span> <span class="variable-name" id="nameStartChars">nameStartChars</span> =
  563. &quot;<span class="string">_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ</span>&quot;;
  564. <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">String</span> <span class="variable-name" id="nameChars">nameChars</span> = &quot;<span class="string">.-0123456789</span>&quot;;
  565. <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">String</span> <span class="variable-name" id="digits">digits</span> = &quot;<span class="string">0123456789</span>&quot;;
  566. <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">String</span> <span class="variable-name" id="hexchars">hexchars</span> = digits + &quot;<span class="string">abcdefABCDEF</span>&quot;;
  567. <span class="comment">/**
  568. * Return a boolean value indicating whether the argument is a
  569. * decimal digit (0-9).
  570. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name">c</span><span class="comment"> The character to check
  571. */</span>
  572. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">boolean</span> <span class="function-name" id="isDigit">isDigit</span>(<span class="type">char</span> <span class="variable-name">c</span>) {
  573. <span class="keyword">return</span> digits.indexOf(c) &gt;= <span class="jde-java-font-lock-number">0</span>;
  574. }
  575. <span class="comment">/**
  576. * Return a boolean value indicating whether the argument is a
  577. * hexadecimal digit (0-9, A-F, a-f).
  578. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name">c</span><span class="comment"> The character to check
  579. */</span>
  580. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">boolean</span> <span class="function-name" id="isHexDigit">isHexDigit</span>(<span class="type">char</span> <span class="variable-name">c</span>) {
  581. <span class="keyword">return</span> hexchars.indexOf(c) &gt;= <span class="jde-java-font-lock-number">0</span>;
  582. }
  583. <span class="comment">/**
  584. * Return a boolean value indicating whether the argument is whitespace
  585. * as defined by XSL (space, newline, CR, tab).
  586. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name">c</span><span class="comment"> The character to check
  587. */</span>
  588. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">boolean</span> <span class="function-name" id="isSpace">isSpace</span>(<span class="type">char</span> <span class="variable-name">c</span>) {
  589. <span class="keyword">switch</span> (c) {
  590. <span class="keyword">case</span> '<span class="string"> </span>':
  591. <span class="keyword">case</span> '<span class="string">\r</span>':
  592. <span class="keyword">case</span> '<span class="string">\n</span>':
  593. <span class="keyword">case</span> '<span class="string">\t</span>':
  594. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">true</span>;
  595. }
  596. <span class="keyword">return</span> <span class="jde-java-font-lock-constant">false</span>;
  597. }
  598. <span class="comment">/**
  599. * Return a boolean value indicating whether the argument is a valid name
  600. * start character, ie. can start a NAME as defined by XSL.
  601. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name">c</span><span class="comment"> The character to check
  602. */</span>
  603. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">boolean</span> <span class="function-name" id="isNameStartChar">isNameStartChar</span>(<span class="type">char</span> <span class="variable-name">c</span>) {
  604. <span class="keyword">return</span> nameStartChars.indexOf(c) &gt;= <span class="jde-java-font-lock-number">0</span> || c &gt;= <span class="jde-java-font-lock-number">0x80</span>;
  605. }
  606. <span class="comment">/**
  607. * Return a boolean value indicating whether the argument is a valid name
  608. * character, ie. can occur in a NAME as defined by XSL.
  609. * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name">c</span><span class="comment"> The character to check
  610. */</span>
  611. <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">static</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">boolean</span> <span class="function-name" id="isNameChar">isNameChar</span>(<span class="type">char</span> <span class="variable-name">c</span>) {
  612. <span class="keyword">return</span> nameStartChars.indexOf(c) &gt;= <span class="jde-java-font-lock-number">0</span> || nameChars.indexOf(c) &gt;= <span class="jde-java-font-lock-number">0</span>
  613. || c &gt;= <span class="jde-java-font-lock-number">0x80</span>;
  614. }
  615. }
  616. </pre>
  617. </body>
  618. </html>