123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038 |
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
- <!-- Created by htmlize-0.67 in css mode. -->
- <html>
- <head>
- <title>PropertyParser.java</title>
- <style type="text/css">
- <!--
- body {
- color: #000000;
- background-color: #faf0e6;
- } /* default */
- .jde-java-font-lock-number {
- color: #bc8f8f;
- background-color: #faf0e6;
- } /* jde-java-font-lock-number-face */
- .function-name {
- color: #8b2323;
- background-color: #faf0e6;
- } /* font-lock-function-name-face */
- .jde-java-font-lock-italic {
- background-color: #faf0e6;
- font-style: italic;
- } /* jde-java-font-lock-italic-face */
- .jde-java-font-lock-modifier {
- color: #da70d6;
- background-color: #faf0e6;
- } /* jde-java-font-lock-modifier-face */
- .keyword {
- color: #8b0000;
- background-color: #faf0e6;
- } /* font-lock-keyword-face */
- .variable-name {
- color: #8b008b;
- background-color: #faf0e6;
- } /* font-lock-variable-name-face */
- .string {
- color: #008b00;
- background-color: #faf0e6;
- } /* font-lock-string-face */
- .jde-java-font-lock-package {
- color: #0000cd;
- background-color: #faf0e6;
- } /* jde-java-font-lock-package-face */
- .jde-java-font-lock-constant {
- color: #5f9ea0;
- background-color: #faf0e6;
- } /* jde-java-font-lock-constant-face */
- .type {
- color: #4682b4;
- background-color: #faf0e6;
- } /* font-lock-type-face */
- .jde-java-font-lock-bold {
- background-color: #faf0e6;
- font-weight: bold;
- } /* jde-java-font-lock-bold-face */
- .jde-java-font-lock-doc-tag {
- color: #008b00;
- background-color: #faf0e6;
- } /* jde-java-font-lock-doc-tag-face */
- .comment {
- color: #00008b;
- background-color: #faf0e6;
- } /* font-lock-comment-face */
- .reference {
- color: #cd0000;
- background-color: #faf0e6;
- } /* font-lock-reference-face */
- a {
- color: inherit;
- background-color: inherit;
- font: inherit;
- text-decoration: inherit;
- }
- a:hover {
- text-decoration: underline;
- }
- -->
- </style>
- </head>
- <body>
- <pre>
- <span class="comment">/*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */</span>
-
- <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>;
-
- <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">fo</span>.<span class="type">PropertyConsts</span>;
- <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">fo</span>.<span class="jde-java-font-lock-package">properties</span>.<span class="type">Property</span>;
- <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">fo</span>.<span class="type">PropNames</span>;
- <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">fo</span>.<span class="type">FOTree</span>;
- <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">fo</span>.<span class="type">FONode</span>;
- <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">fo</span>.<span class="jde-java-font-lock-package">expr</span>.<span class="type">SystemFontFunction</span>;
-
- <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">PropertyValue</span>;
- <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">PropertyValueList</span>;
- <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>;
- <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">Literal</span>;
- <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">NCName</span>;
- <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">Percentage</span>;
- <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">Ems</span>;
- <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">IntegerType</span>;
- <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>;
- <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>;
- <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>;
- <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">Angle</span>;
- <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">Bool</span>;
- <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">Auto</span>;
- <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">None</span>;
- <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">Slash</span>;
- <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">ColorType</span>;
- <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">StringType</span>;
- <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">MimeType</span>;
- <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">UriType</span>;
- <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="jde-java-font-lock-package">indirect</span>.<span class="type">Inherit</span>;
- <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="jde-java-font-lock-package">indirect</span>.<span class="type">InheritedValue</span>;
- <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="jde-java-font-lock-package">indirect</span>.<span class="type">FromParent</span>;
- <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="jde-java-font-lock-package">indirect</span>.<span class="type">FromNearestSpecified</span>;
-
- <span class="keyword">import</span> <span class="jde-java-font-lock-package">java</span>.<span class="jde-java-font-lock-package">util</span>.<span class="type">HashMap</span>;
-
- <span class="comment">/**
- * Class to parse XSL FO property expression.
- * This class is heavily based on the expression parser in James Clark's
- * XT, an XSLT processor.
- *
- * PropertyParser objects are re-usable. The constructor simply creates the
- * object. To parse an expression, the public method <i></span><span class="jde-java-font-lock-italic">Parse</span><span class="comment"></i> is
- * called.
- */</span>
- <span class="jde-java-font-lock-modifier">public</span> <span class="keyword">class</span> <span class="function-name" id="PropertyParserClass">PropertyParser</span> <span class="keyword">extends</span> <span class="type">PropertyTokenizer</span> {
-
- <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> = "<span class="string">$Name$</span>";
- <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> = "<span class="string">$Revision$</span>";
-
- <span class="comment">/** The FO tree which has initiated this parser */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="type">FOTree</span> <span class="variable-name" id="foTree">foTree</span>;
- <span class="comment">/** The FONode which has initiated this parser */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="type">FONode</span> <span class="variable-name" id="node">node</span>;
-
- <span class="jde-java-font-lock-modifier">public</span> <span class="function-name" id="PropertyParser">PropertyParser</span>(<span class="type">FOTree</span> <span class="variable-name">foTree</span>) {
- <span class="keyword">super</span>();
- <span class="keyword">this</span>.foTree = foTree;
- }
-
- <span class="comment">/**
- * Parse the property expression described in the instance variables.
- *
- * <p>The <tt>PropertyValue</tt> returned by this function has the
- * following characteristics:
- * If the expression resolves to a single element that object is returned
- * directly in an object which implements <PropertyValue</tt>.
- *
- * <p>If the expression cannot be resolved into a single object, the set
- * to which it resolves is returned in a <tt>PropertyValueList</tt> object
- * (which itself implements <tt>PropertyValue</tt>).
- *
- * <p>The <tt>PropertyValueList</tt> contains objects whose corresponding
- * elements in the original expression were separated by <em></span><span class="jde-java-font-lock-italic">commas</span><span class="comment"></em>.
- *
- * <p>Objects whose corresponding elements in the original expression
- * were separated by spaces are composed into a sublist contained in
- * another <tt>PropertyValueList</tt>. If all of the elements in the
- * expression were separated by spaces, the returned
- * <tt>PropertyValueList</tt> will contain one element, a
- * <tt>PropertyValueList</tt> containing objects representing each of
- * the space-separated elements in the original expression.
- *
- * <p>E.g., if a <b></span><span class="jde-java-font-lock-bold">font-family</span><span class="comment"></b> property is assigned the string
- * <em></span><span class="jde-java-font-lock-italic">Palatino, New Century Schoolbook, serif</span><span class="comment"></em>, the returned value
- * will look like this:
- * <pre>
- * PropertyValueList(NCName('Palatino')
- * PropertyValueList(NCName('New')
- * NCName('Century')
- * NCName('Schoolbook') )
- * NCName('serif') )
- * </pre>
- * <p>If the property had been assigned the string
- * <em></span><span class="jde-java-font-lock-italic">Palatino, "New Century Schoolbook", serif</span><span class="comment"></em>, the returned value
- * would look like this:
- * <pre>
- * PropertyValueList(NCName('Palatino')
- * NCName('New Century Schoolbook')
- * NCName('serif') )
- * </pre>
- * <p>If a <b></span><span class="jde-java-font-lock-bold">background-position</span><span class="comment"></b> property is assigned the string
- * <em></span><span class="jde-java-font-lock-italic">top center</span><span class="comment"></em>, the returned value will look like this:
- * <pre>
- * PropertyValueList(PropertyValueList(NCName('top')
- * NCName('center') ) )
- * </pre>
- *
- * <p>Note: If the property expression String is empty, a StringProperty
- * object holding an empty String is returned.
- * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name">node</span><span class="comment"> - the <tt>FONode</tt> for which the property expression
- * is being resolved.
- * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="property">property</span><span class="comment"> - an <tt>int</tt> containing the property index.
- * which the property expression is to be evaluated.
- * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="expr">expr</span><span class="comment"> - the specified value (attribute on the xml element).
- * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> a PropertyValue holding the parsed result.
- * </span><span class="jde-java-font-lock-doc-tag">@throws</span><span class="comment"> </span><span class="type">PropertyException</span><span class="comment"> if the "expr" cannot be parsed as a
- * PropertyValue.
- */</span>
- <span class="jde-java-font-lock-modifier">public</span> <span class="type">PropertyValue</span> <span class="function-name" id="parse">parse</span>(<span class="type">FONode</span> <span class="variable-name">node</span>, <span class="type">int</span> <span class="variable-name">property</span>, <span class="type">String</span> <span class="variable-name">expr</span>)
- <span class="keyword">throws</span> <span class="type">PropertyException</span>
- {
- <span class="comment">//System.out.println("-----Entering parse:"
- </span> <span class="comment">// + PropNames.getPropertyName(property) + " " + expr);
- </span> <span class="jde-java-font-lock-modifier">synchronized</span> (<span class="keyword">this</span>) {
- <span class="comment">// make sure this parser is available
- </span> <span class="keyword">if</span> (getExpr() != <span class="jde-java-font-lock-constant" id="null">null</span>) <span class="comment">// the parser is currently active
- </span> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
- ("<span class="string">PropertyParser is currently active: </span>" + getExpr());
- initialize(property, expr);
- <span class="keyword">this</span>.node = node;
- }
-
- next();
- <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant" id="EOF">EOF</span>)
- <span class="comment">// prop value is empty
- </span> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
- ("<span class="string">No token recognized in :</span>" + expr + "<span class="string">:</span>");
-
- <span class="type">PropertyValueList</span> <span class="variable-name" id="propList">propList</span> = <span class="keyword">new</span> <span class="type">PropertyValueList</span>(property);
- <span class="keyword">while</span> (<span class="jde-java-font-lock-constant" id="true">true</span>) {
- <span class="type">PropertyValue</span> <span class="variable-name" id="prop">prop</span> = parseAdditiveExpr();
- <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">EOF</span>) {
- <span class="comment">// end of the expression - add to list and go
- </span> <span class="keyword">if</span> (propList.size() != <span class="jde-java-font-lock-number">0</span>) {
- propList.add(prop);
- reset();
- <span class="keyword">return</span> propList;
- } <span class="keyword">else</span> { <span class="comment">// list is empty
- </span> reset();
- <span class="keyword">return</span> prop;
- }
- }
- <span class="comment">// throw away commas separating arguments. These can occur
- </span> <span class="comment">// in font-family and voice-family. Commas are regarded here
- </span> <span class="comment">// as separators of list and sublist elements.
- </span> <span class="comment">// See 7.16.5 "text-shadow" in the 1.0 Recommendation for an
- </span> <span class="comment">// example of sublists.
- </span> <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant" id="COMMA">COMMA</span>) {
- next();
- propList.add(prop);
- } <span class="keyword">else</span> { <span class="comment">// whitespace separates list elements; make a sublist
- </span> propList.add(parseSublist(prop));
- <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">EOF</span>) {
- reset();
- <span class="keyword">return</span> propList;
- }
- }
- }
- }
-
- <span class="comment">/**
- * <p>Parse a property values sublist - a list of whitespace separated
- * <tt>PropertyValue</tt>s.
- * <p>
- * Property value expressions for various properties may contain lists
- * of values, which may be separated by whitespace or by commas. See,
- * e.g., 7.6.17 "voice-family" and 7.8.2 "font-family". The shorthands
- * may also contain lists of elements, generally (or exclusively)
- * whitespace separated. 7.16.5 "text-shadow" allows whitespace
- * separated length doubles or triples to be specified for individual
- * shadow effects, with multiple shadow effects, each separated by
- * commmas.
- * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="initialValue">initialValue</span><span class="comment"> a <tt>PropertyValue</tt> to assign as the initial
- * value of the sublist. The detection of this value, which is
- * whitespace separated from a subsequent value, has been the
- * trigger for the creation of the sublist.
- * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> a <tt>PropertyValueList</tt> containing the sublist. The
- * indicatior for the end of the sublist is the end of the expression,
- * or a comma.
- */</span>
- <span class="type">PropertyValueList</span> <span class="function-name" id="parseSublist">parseSublist</span>(<span class="type">PropertyValue</span> <span class="variable-name">initialValue</span>)
- <span class="keyword">throws</span> <span class="type">PropertyException</span>
- {
- <span class="type">PropertyValueList</span> <span class="variable-name" id="sublist">sublist</span> = <span class="keyword">new</span> <span class="type">PropertyValueList</span>(property);
- sublist.add(initialValue);
- <span class="keyword">while</span> (<span class="jde-java-font-lock-constant">true</span>) {
- <span class="type">PropertyValue</span> <span class="variable-name">prop</span> = parseAdditiveExpr();
- <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">EOF</span>) {
- <span class="comment">// end of the expression - add to sublist and go
- </span> sublist.add(prop);
- <span class="keyword">return</span> sublist;
- }
- <span class="comment">// Comma separates next element - end of sublist
- </span> <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">COMMA</span>) {
- next();
- sublist.add(prop);
- <span class="keyword">return</span> sublist;
- } <span class="keyword">else</span> { <span class="comment">// whitespace separates next elements; add to sublist
- </span> sublist.add(prop);
- }
- }
- }
-
- <span class="comment">/**
- * Reset the parser by resetting the tokenizer to null (or equivalent)
- * values.
- */</span>
- <span class="jde-java-font-lock-modifier">public</span> <span class="type">void</span> <span class="function-name" id="resetParser">resetParser</span>() {
- <span class="jde-java-font-lock-modifier">synchronized</span> (<span class="keyword">this</span>) {
- <span class="comment">//elementsSeen = 0;
- </span> <span class="comment">//restrictedValueFunctSeen = null;
- </span> reset();
- }
- }
-
- <span class="comment">/**
- * Generate an arithmetic error string.
- * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> arithmetic error message.
- */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="type">String</span> <span class="function-name" id="arithErrorStr">arithErrorStr</span>() {
- <span class="keyword">return</span> "<span class="string">Arithmetic operator not followed by Numeric or integer: </span>"
- + getExpr();
- }
-
-
- <span class="comment">/**
- * Generate an function numeric argument error string.
- * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> function numeric argument error message.
- */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="type">String</span> <span class="function-name" id="funcNumericErrorStr">funcNumericErrorStr</span>() {
- <span class="keyword">return</span> "<span class="string">Function requires Numeric or integer argument: </span>"
- + getExpr();
- }
-
- <span class="comment">/**
- * Try to parse an addition or subtraction expression and return the
- * resulting PropertyValue.
- */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="type">PropertyValue</span> <span class="function-name" id="parseAdditiveExpr">parseAdditiveExpr</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
- <span class="comment">// Evaluate and put result on the operand stack
- </span> <span class="comment">//System.out.println("parseAdd");
- </span> <span class="type">PropertyValue</span> <span class="variable-name">prop</span> = parseMultiplicativeExpr();
- <span class="type">PropertyValue</span> <span class="variable-name" id="pv">pv</span>;
- <span class="reference">outer</span>:
- <span class="keyword">for</span> (; ; ) {
- <span class="reference">inner</span>:
- <span class="keyword">switch</span> (prop.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>: {
- <span class="keyword">switch</span> (currentToken) {
- <span class="keyword">case</span> <span class="reference">PLUS</span>:
- next();
- pv = parseMultiplicativeExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- ((<span class="type">Numeric</span>)prop).add((<span class="type">Numeric</span>)pv);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- ((<span class="type">Numeric</span>)prop).add((<span class="type">double</span>)
- (((<span class="type">IntegerType</span>)pv).getInt()));
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">case</span> <span class="reference">MINUS</span>:
- next();
- pv = parseMultiplicativeExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- ((<span class="type">Numeric</span>)prop).subtract((<span class="type">Numeric</span>)pv);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- ((<span class="type">Numeric</span>)prop).subtract((<span class="type">double</span>)
- (((<span class="type">IntegerType</span>)pv).getInt()));
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">default</span>:
- <span class="keyword">break</span> <span class="reference">outer</span>;
- }
- }
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>: {
- <span class="type">int</span> <span class="variable-name" id="intVal">intVal</span> = ((<span class="type">IntegerType</span>)prop).getInt();
- <span class="keyword">switch</span> (currentToken) {
- <span class="keyword">case</span> <span class="reference">PLUS</span>:
- next();
- pv = parseMultiplicativeExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = ((<span class="type">Numeric</span>)pv).add((<span class="type">double</span>)intVal);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- ((<span class="type">IntegerType</span>)prop).setInt(intVal +
- ((<span class="type">IntegerType</span>)pv).getInt());
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">case</span> <span class="reference">MINUS</span>:
- next();
- pv = parseMultiplicativeExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- ((<span class="type">Numeric</span>)pv).add((<span class="type">double</span>)(-intVal));
- prop = ((<span class="type">Numeric</span>)pv).negate();
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- ((<span class="type">IntegerType</span>)prop).setInt(intVal +
- ((<span class="type">IntegerType</span>)pv).getInt());
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">default</span>:
- <span class="keyword">break</span> <span class="reference">outer</span>;
- }
- }
- <span class="keyword">default</span>:
- <span class="keyword">break</span> <span class="reference">outer</span>;
- }
- }
- <span class="keyword">return</span> prop;
- }
-
- <span class="comment">/**
- * Try to parse a multiply, divide or modulo expression and return
- * the resulting PropertyValue.
- */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="type">PropertyValue</span> <span class="function-name" id="parseMultiplicativeExpr">parseMultiplicativeExpr</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
- <span class="comment">//System.out.println("parseMult");
- </span> <span class="type">PropertyValue</span> <span class="variable-name">prop</span> = parseUnaryExpr();
- <span class="type">PropertyValue</span> <span class="variable-name">pv</span>;
- <span class="reference">outer</span>:
- <span class="comment">// Outer loop exists to handle a sequence of multiplicative operations
- </span> <span class="comment">// e.g. 5 * 4 / 2
- </span> <span class="comment">// break outer; will terminate the multiplicative expression parsing
- </span> <span class="comment">// break inner; will look for another trailing multiplicative
- </span> <span class="comment">// operator.
- </span> <span class="keyword">for</span> (; ; ) {
- <span class="reference">inner</span>:
- <span class="keyword">switch</span> (prop.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- <span class="keyword">switch</span> (currentToken) {
- <span class="keyword">case</span> <span class="reference">DIV</span>:
- next();
- pv = parseUnaryExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- ((<span class="type">Numeric</span>)prop).divide
- ((<span class="type">double</span>)(((<span class="type">IntegerType</span>)pv).getInt()));
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- ((<span class="type">Numeric</span>)prop).divide((<span class="type">Numeric</span>)pv);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">case</span> <span class="reference">MOD</span>:
- next();
- pv = parseUnaryExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- ((<span class="type">Numeric</span>)prop).mod
- ((<span class="type">double</span>)(((<span class="type">IntegerType</span>)pv).getInt()));
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- ((<span class="type">Numeric</span>)prop).mod((<span class="type">Numeric</span>)pv);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">case</span> <span class="reference">MULTIPLY</span>:
- next();
- pv = parseUnaryExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- ((<span class="type">Numeric</span>)prop).multiply
- ((<span class="type">double</span>)(((<span class="type">IntegerType</span>)pv).getInt()));
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- ((<span class="type">Numeric</span>)prop).multiply((<span class="type">Numeric</span>)pv);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">default</span>:
- <span class="keyword">break</span> <span class="reference">outer</span>;
- }
- <span class="comment">// N.B. The above case cannot fall through to here
- </span> <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- <span class="comment">// This code treats all multiplicative operations as implicit
- </span> <span class="comment">// operations on doubles. It might be reasonable to allow
- </span> <span class="comment">// an integer multiply.
- </span> <span class="type">int</span> <span class="variable-name">intVal</span> = ((<span class="type">IntegerType</span>)prop).getInt();
- <span class="keyword">switch</span> (currentToken) {
- <span class="keyword">case</span> <span class="reference">DIV</span>:
- next();
- pv = parseUnaryExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- prop = <span class="keyword">new</span> <span class="type">Numeric</span>(property,
- (<span class="type">double</span>)intVal / ((<span class="type">IntegerType</span>)pv).getInt());
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = (<span class="keyword">new</span> <span class="type">Numeric</span>(property, (<span class="type">double</span>)intVal))
- .divide((<span class="type">Numeric</span>)pv);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">case</span> <span class="reference">MOD</span>:
- next();
- pv = parseUnaryExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- prop = <span class="keyword">new</span> <span class="type">Numeric</span>(property,
- ((<span class="type">double</span>)intVal) % ((<span class="type">IntegerType</span>)pv).getInt());
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = (<span class="keyword">new</span> <span class="type">Numeric</span>(property, (<span class="type">double</span>)intVal))
- .mod((<span class="type">Numeric</span>)pv);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">case</span> <span class="reference">MULTIPLY</span>:
- next();
- pv = parseUnaryExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- prop = <span class="keyword">new</span> <span class="type">Numeric</span>(property,
- ((<span class="type">double</span>)intVal) * ((<span class="type">IntegerType</span>)pv).getInt());
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = (<span class="keyword">new</span> <span class="type">Numeric</span>(property, (<span class="type">double</span>)intVal))
- .multiply((<span class="type">Numeric</span>)pv);
- <span class="keyword">break</span> <span class="reference">inner</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- <span class="keyword">default</span>:
- <span class="keyword">break</span> <span class="reference">outer</span>;
- }
- <span class="keyword">default</span>:
- <span class="keyword">break</span> <span class="reference">outer</span>;
- }
- }
- <span class="keyword">return</span> prop;
- }
-
- <span class="comment">/**
- * Try to parse a unary minus expression and return the
- * resulting PropertyValue.
- */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="type">PropertyValue</span> <span class="function-name" id="parseUnaryExpr">parseUnaryExpr</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
- <span class="comment">//System.out.println("Unary entry");
- </span> <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant" id="MINUS">MINUS</span>) {
- next();
- <span class="type">PropertyValue</span> <span class="variable-name">pv</span> = parseUnaryExpr();
- <span class="keyword">switch</span> (pv.getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- <span class="keyword">return</span> ((<span class="type">Numeric</span>)pv).negate();
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- ((<span class="type">IntegerType</span>)pv).setInt( -((<span class="type">IntegerType</span>)pv).getInt());
- <span class="keyword">return</span> pv;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(arithErrorStr());
- }
- }
- <span class="keyword">return</span> parsePrimaryExpr();
- }
-
-
- <span class="comment">/**
- * Checks that the current token is a right parenthesis
- * and throws an exception if this isn't the case.
- */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="jde-java-font-lock-modifier">final</span> <span class="type">void</span> <span class="function-name" id="expectRpar">expectRpar</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
- <span class="keyword">if</span> (currentToken != <span class="jde-java-font-lock-constant" id="RPAR">RPAR</span>)
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>("<span class="string">expected )</span>");
- next();
- }
-
- <span class="comment">/**
- * Try to parse a primary expression and return the
- * resulting PropertyValue.
- * A primary expression is either a parenthesized expression or an
- * expression representing a primitive PropertyValue datatype, such as a
- * string literal, an NCname, a number or a unit expression, or a
- * function call expression.
- */</span>
- <span class="jde-java-font-lock-modifier">private</span> <span class="type">PropertyValue</span> <span class="function-name" id="parsePrimaryExpr">parsePrimaryExpr</span>() <span class="keyword">throws</span> <span class="type">PropertyException</span> {
- <span class="type">PropertyValue</span> <span class="variable-name">prop</span>;
- <span class="comment">//System.out.println("Primary currentToken:" + currentToken + " "
- </span> <span class="comment">// + currentTokenValue);
- </span> <span class="keyword">switch</span> (currentToken) {
- <span class="keyword">case</span> <span class="reference">LPAR</span>:
- next();
- prop = parseAdditiveExpr();
- expectRpar();
- <span class="comment">// Do this here, rather than breaking, because expectRpar()
- </span> <span class="comment">// consumes the right parenthesis and calls next().
- </span> <span class="keyword">return</span> prop;
-
- <span class="keyword">case</span> <span class="reference">LITERAL</span>:
- prop = <span class="keyword">new</span> <span class="type">Literal</span>(property, currentTokenValue);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">NCNAME</span>:
- <span class="comment">// Interpret this in context of the property or do it later?
- </span> prop = <span class="keyword">new</span> <span class="type">NCName</span>(property, currentTokenValue);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">FLOAT</span>:
- <span class="comment">// Do I need to differentiate here between floats and integers?
- </span> prop = <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, Double.parseDouble(currentTokenValue));
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">INTEGER</span>:
- prop = <span class="keyword">new</span> <span class="type">IntegerType</span>
- (property, Integer.parseInt(currentTokenValue));
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">PERCENT</span>:
- <span class="comment">/*
- * Generate a Percentage object with the percentage number.
- * The constructor converts this to a straight multiplicative
- * factor by dividing by 100.
- */</span>
- prop = Percentage.makePercentage
- (property, Double.parseDouble(currentTokenValue));
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">ABSOLUTE_LENGTH</span>:
- prop = Length.makeLength(property,
- Double.parseDouble(currentTokenValue),
- currentUnit);
- <span class="keyword">break</span>;
- <span class="keyword">case</span> <span class="reference">TIME</span>:
- prop = <span class="keyword">new</span> <span class="type">Time</span>(property, currentUnit,
- Double.parseDouble(currentTokenValue));
- <span class="keyword">break</span>;
- <span class="keyword">case</span> <span class="reference">FREQ</span>:
- prop = <span class="keyword">new</span> <span class="type">Frequency</span>(property, currentUnit,
- Double.parseDouble(currentTokenValue));
- <span class="keyword">break</span>;
- <span class="keyword">case</span> <span class="reference">ANGLE</span>:
- prop = <span class="keyword">new</span> <span class="type">Angle</span>(property, currentUnit,
- Double.parseDouble(currentTokenValue));
- <span class="keyword">break</span>;
- <span class="keyword">case</span> <span class="reference">RELATIVE_LENGTH</span>:
- prop = Ems.makeEms(node, property,
- Double.parseDouble(currentTokenValue));
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">COLORSPEC</span>:
- prop = <span class="keyword">new</span> <span class="type">ColorType</span>(property, currentTokenValue);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">BOOL</span>:
- prop = <span class="keyword">new</span> <span class="type">Bool</span>(property, currentTokenValue);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">AUTO</span>:
- prop = <span class="keyword">new</span> <span class="type">Auto</span>(property);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">NONE</span>:
- prop = <span class="keyword">new</span> <span class="type">None</span>(property);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">INHERIT</span>:
- prop = <span class="keyword">new</span> <span class="type">Inherit</span>(property);
- <span class="comment">//throw new PropertyException("INHERIT not supported");
- </span> <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">URI</span>:
- prop = <span class="keyword">new</span> <span class="type">UriType</span>(property, currentTokenValue);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">MIMETYPE</span>:
- prop = <span class="keyword">new</span> <span class="type">MimeType</span>(property, currentTokenValue);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">SLASH</span>:
- prop = <span class="keyword">new</span> <span class="type">Slash</span>(property);
- <span class="keyword">break</span>;
-
- <span class="keyword">case</span> <span class="reference">FUNCTION_LPAR</span>: {
- <span class="comment">// N.B. parseArgs() invokes expectRpar at the end of argument
- </span> <span class="comment">// processing, so, like LPAR processing, next() is not called
- </span> <span class="comment">// and the return from this method must be premature
- </span> prop = <span class="jde-java-font-lock-constant">null</span>;
- <span class="type">int</span> <span class="variable-name" id="funcType">funcType</span> = PropertyValue.<span class="jde-java-font-lock-constant" id="NO_TYPE">NO_TYPE</span>;
- <span class="type">String</span> <span class="variable-name" id="function">function</span> = currentTokenValue;
- next();
- <span class="keyword">do</span> {
- <span class="comment">// Numeric functions
- </span> <span class="keyword">if</span> (function.equals("<span class="string">floor</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name" id="args">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- args[<span class="jde-java-font-lock-number">0</span>] =
- <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).floor());
- <span class="keyword">break</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
- }
- <span class="keyword">break</span>;
- }
- <span class="keyword">if</span> (function.equals("<span class="string">ceiling</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- args[<span class="jde-java-font-lock-number">0</span>] =
- <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).ceiling());
- <span class="keyword">break</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
- }
- <span class="keyword">break</span>;
- }
- <span class="keyword">if</span> (function.equals("<span class="string">round</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- args[<span class="jde-java-font-lock-number">0</span>] =
- <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).round());
- <span class="keyword">break</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
- }
- <span class="keyword">break</span>;
- }
- <span class="keyword">if</span> (function.equals("<span class="string">min</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">2</span>);
- <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- args[<span class="jde-java-font-lock-number">0</span>] =
- <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).min((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">1</span>]);
- <span class="keyword">break</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
- }
- <span class="keyword">break</span>;
- }
- <span class="keyword">if</span> (function.equals("<span class="string">max</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">2</span>);
- <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- args[<span class="jde-java-font-lock-number">0</span>] =
- <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).max((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">1</span>]);
- <span class="keyword">break</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
- }
- <span class="keyword">break</span>;
- }
- <span class="keyword">if</span> (function.equals("<span class="string">abs</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- args[<span class="jde-java-font-lock-number">0</span>] =
- <span class="keyword">new</span> <span class="type">Numeric</span>
- (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt());
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).abs();
- <span class="keyword">break</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
- }
- <span class="keyword">break</span>;
- }
-
- <span class="comment">// Color functions
- </span> <span class="keyword">if</span> (function.equals("<span class="string">rgb</span>")) {
- <span class="comment">// Currently arguments must all be integers.
- </span> <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">3</span>);
- <span class="keyword">switch</span> (args[<span class="jde-java-font-lock-number">0</span>].getType()) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.INTEGER</span>:
- prop = <span class="keyword">new</span> <span class="type">ColorType</span>
- (property, ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getInt(),
- ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">1</span>]).getInt(),
- ((<span class="type">IntegerType</span>)args[<span class="jde-java-font-lock-number">2</span>]).getInt());
- <span class="keyword">break</span>;
- <span class="keyword">case</span> <span class="reference">PropertyValue.NUMERIC</span>:
- prop = <span class="keyword">new</span> <span class="type">ColorType</span>
- (property, ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">0</span>]).asInt(),
- ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">1</span>]).asInt(),
- ((<span class="type">Numeric</span>)args[<span class="jde-java-font-lock-number">2</span>]).asInt());
- <span class="keyword">break</span>;
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>(funcNumericErrorStr());
- }
- <span class="keyword">break</span>;
- }
- <span class="keyword">if</span> (function.equals("<span class="string">rgb-icc</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">6</span>);
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>("<span class="string">rgb-icc</span>");
- <span class="comment">//break;
- </span> }
- <span class="keyword">if</span> (function.equals("<span class="string">system-color</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
- prop = <span class="keyword">new</span> <span class="type">ColorType</span>
- (property, ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getString());
- <span class="keyword">break</span>;
- }
-
- <span class="comment">// Font function
- </span> <span class="keyword">if</span> (function.equals("<span class="string">system-font</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>, <span class="jde-java-font-lock-number">2</span>);
- <span class="keyword">if</span> (args.length == <span class="jde-java-font-lock-number">1</span>) {
- prop = SystemFontFunction.systemFontCharacteristic
- (property,
- ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getString());
- } <span class="keyword">else</span> {
- <span class="comment">// 2 args
- </span> prop = SystemFontFunction.systemFontCharacteristic
- (property,
- ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getString(),
- ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">1</span>]).getString());
- }
- <span class="keyword">break</span>;
- }
-
- <span class="comment">// Property value functions
- </span> <span class="keyword">if</span> (function.equals("<span class="string">label-end</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>);
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>("<span class="string">label-end</span>");
- <span class="comment">//break;
- </span> }
- <span class="keyword">if</span> (function.equals("<span class="string">body-start</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>);
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>("<span class="string">body-start</span>");
- <span class="comment">//break;
- </span> }
- <span class="keyword">if</span> (function.equals("<span class="string">inherited-property-value</span>")) {
- <span class="type">int</span> <span class="variable-name" id="propindex">propindex</span> = property;
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>, <span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">if</span> (args.length != <span class="jde-java-font-lock-number">0</span>)
- propindex = PropNames.getPropertyIndex(
- ((<span class="type">StringType</span>)args[<span class="jde-java-font-lock-number">0</span>]).getString());
-
- <span class="comment">// If it's a compound, return an InheritedValue object
- </span> <span class="keyword">if</span> (PropertyConsts.pconsts.isCompound(propindex)) {
- prop = <span class="keyword">new</span> <span class="type">InheritedValue</span>(property, propindex);
- <span class="keyword">break</span>;
- }
- <span class="comment">// Is it an inherited property?
- </span> <span class="keyword">if</span> (PropertyConsts.pconsts.inheritance(propindex)
- == Property.<span class="jde-java-font-lock-constant" id="NO">NO</span>)
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
- ("<span class="string">inherited-property-value: </span>"
- + PropNames.getPropertyName(propindex)
- + "<span class="string"> is not inherited.</span>");
- <span class="comment">// Not a compound, and inherited - try to resolve it
- </span> prop = node.fromParent(property, propindex);
- <span class="keyword">break</span>;
- }
- <span class="comment">// N.B. see comments on classes FromNearestSpecified and
- </span> <span class="comment">// FromParent for explanation of this section
- </span> <span class="keyword">if</span> (function.equals("<span class="string">from-parent</span>"))
- funcType = PropertyValue.<span class="jde-java-font-lock-constant" id="FROM_PARENT">FROM_PARENT</span>;
- <span class="keyword">if</span> (function.equals("<span class="string">from-nearest-specified-value</span>"))
- funcType = PropertyValue.<span class="jde-java-font-lock-constant" id="FROM_NEAREST_SPECIFIED">FROM_NEAREST_SPECIFIED</span>;
- <span class="keyword">if</span> (funcType == <span class="reference">PropertyValue</span>.<span class="type">FROM_PARENT</span>
- || funcType == PropertyValue.<span class="jde-java-font-lock-constant">FROM_NEAREST_SPECIFIED</span>)
- {
- <span class="comment">// Preset the return value in case of a shorthand property
- </span> <span class="keyword">switch</span> (funcType) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_PARENT</span>:
- prop = <span class="keyword">new</span> <span class="type">FromParent</span>(property);
- <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_NEAREST_SPECIFIED</span>:
- prop = <span class="keyword">new</span> <span class="type">FromNearestSpecified</span>(property);
- }
-
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>, <span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">if</span> (args.length == <span class="jde-java-font-lock-number">0</span>) {
- <span class="keyword">if</span> (! (PropertyConsts.pconsts.isShorthand(property)
- || PropertyConsts.pconsts.isCompound(property))) {
- <span class="comment">// develop the function value and return it as
- </span> <span class="comment">// a property.
- </span> <span class="keyword">switch</span> (funcType) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_PARENT</span>:
- prop = node.fromParent(property);
- <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_NEAREST_SPECIFIED</span>:
- prop = node.fromNearestSpecified(property);
- }
- }
- <span class="comment">// else a shorthand/compound - do nothing;
- </span> <span class="comment">// prop has been
- </span> <span class="comment">// set to the appropriate pseudo-propertyValue
- </span> } <span class="keyword">else</span> { <span class="comment">// one argument - it must be a property name
- </span> <span class="keyword">if</span> ( ! (args[<span class="jde-java-font-lock-number">0</span>] <span class="keyword">instanceof</span> <span class="type">NCName</span>))
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
- (function + "<span class="string"> function requires</span>"
- + "<span class="string"> property name arg.</span>");
- <span class="comment">// else arg[0] is an NCName
- </span> <span class="type">NCName</span> <span class="variable-name" id="ncname">ncname</span> = (<span class="type">NCName</span>)args[<span class="jde-java-font-lock-number">0</span>];
- <span class="type">String</span> <span class="variable-name" id="propname">propname</span> = ncname.getNCName();
- <span class="type">int</span> <span class="variable-name" id="nameindex">nameindex</span> =
- PropNames.getPropertyIndex(propname);
- <span class="keyword">if</span> (PropertyConsts.pconsts.isShorthand(nameindex)
- || PropertyConsts.pconsts.isCompound(nameindex)) {
- <span class="comment">// the argument is a shorthand/compound property -
- </span> <span class="comment">// it must be the same as the property being
- </span> <span class="comment">// assigned to.
- </span> <span class="comment">// see 5.10.4 Property Value Functions
- </span> <span class="keyword">if</span> ( ! (nameindex == property))
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>
- (function +
- "<span class="string"> argument </span>" + propname +
- "<span class="string"> does not match property </span>" +
- PropNames.getPropertyName(property));
- <span class="comment">// else perform shorthand/compound processing
- </span> <span class="comment">// i.e. do nothing;
- </span> <span class="comment">// prop has been set to the correct
- </span> <span class="comment">// pseudo-propertyValue
- </span> }
- <span class="keyword">else</span> { <span class="comment">// An NCName but not a shorthand/compound
- </span> <span class="comment">// Perform normal from-? processing
- </span> <span class="keyword">switch</span> (funcType) {
- <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_PARENT</span>:
- prop = node.fromParent(property, nameindex);
- <span class="keyword">case</span> <span class="reference">PropertyValue.FROM_NEAREST_SPECIFIED</span>:
- prop = node.fromNearestSpecified
- (property, nameindex);
- }
- }
- }
- <span class="keyword">break</span>;
- }
- <span class="keyword">if</span> (function.equals("<span class="string">from-table-column</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>, <span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>
- ("<span class="string">from-table-column</span>");
- <span class="comment">//break;
- </span> }
- <span class="keyword">if</span> (function.equals("<span class="string">proportional-column-width</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>
- ("<span class="string">proportional-column-width</span>");
- <span class="comment">//break;
- </span> }
- <span class="keyword">if</span> (function.equals("<span class="string">merge-property-values</span>")) {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = parseArgs(<span class="jde-java-font-lock-number">0</span>, <span class="jde-java-font-lock-number">1</span>);
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">FunctionNotImplementedException</span>
- ("<span class="string">merge-property-values</span>");
- <span class="comment">//break;
- </span> }
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>("<span class="string">no such function: </span>"
- + function);
- } <span class="keyword">while</span> (<span class="jde-java-font-lock-constant" id="false">false</span>);
- <span class="keyword">return</span> prop;
- }
- <span class="keyword">default</span>:
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>("<span class="string">syntax error</span>");
- }
- next();
- <span class="keyword">return</span> prop;
- }
-
- <span class="comment">/**
- * Parse a comma separated list of function arguments. Each argument
- * may itself be an expression. This method consumes the closing right
- * parenthesis of the argument list.
- * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="nbArgs">nbArgs</span><span class="comment"> The number of arguments expected by the function.
- * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> <tt>PropertyValueList</tt> of <tt>PropertyValue</tt> objects
- * representing the arguments found.
- * </span><span class="jde-java-font-lock-doc-tag">@exception</span><span class="comment"> </span><span class="type">PropertyException
- </span><span class="comment"> */</span>
- <span class="type">PropertyValue</span>[] <span class="function-name" id="parseArgs">parseArgs</span>(<span class="type">int</span> <span class="variable-name">nbArgs</span>) <span class="keyword">throws</span> <span class="type">PropertyException</span> {
- <span class="keyword">return</span> parseArgs(nbArgs, nbArgs);
- }
-
- <span class="comment">/**
- * Parse a comma separated list of function arguments. Each argument
- * may itself be an expression. This method consumes the closing right
- * parenthesis of the argument list.
- * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="minArgs">minArgs</span><span class="comment"> The minimum number of arguments expected by the function.
- * </span><span class="jde-java-font-lock-doc-tag">@param</span><span class="comment"> </span><span class="variable-name" id="maxArgs">maxArgs</span><span class="comment"> The maximum number of arguments expected by the function.
- * </span><span class="jde-java-font-lock-doc-tag">@return</span><span class="comment"> <tt>PropertyValueList</tt> of <tt>PropertyValue</tt> objects
- * representing the arguments found. N.B. The actual number of arguments
- * returned is guaranteed to be between minArgs and maxArgs, inclusive,
- * but the actual list of args found is terminated by the end of the
- * array, or the first null element.
- * </span><span class="jde-java-font-lock-doc-tag">@exception</span><span class="comment"> </span><span class="type">PropertyException
- </span><span class="comment"> */</span>
- <span class="type">PropertyValue</span>[] <span class="function-name">parseArgs</span>(<span class="type">int</span> <span class="variable-name">minArgs</span>, <span class="type">int</span> <span class="variable-name">maxArgs</span>)
- <span class="keyword">throws</span> <span class="type">PropertyException</span>
- {
- <span class="type">PropertyValue</span>[] <span class="variable-name">args</span> = <span class="keyword">new</span> <span class="type">PropertyValue</span>[maxArgs];
- <span class="type">PropertyValue</span> <span class="variable-name">prop</span>;
- <span class="type">int</span> <span class="variable-name" id="i">i</span> = <span class="jde-java-font-lock-number">0</span>;
- <span class="keyword">if</span> (currentToken == <span class="jde-java-font-lock-constant">RPAR</span>) {
- <span class="comment">// No args: func()
- </span> next();
- } <span class="keyword">else</span> {
- <span class="keyword">while</span> (<span class="jde-java-font-lock-constant">true</span>) {
- prop = parseAdditiveExpr();
- <span class="keyword">if</span> (i < maxArgs) {
- args[i++] = prop;
- }
- <span class="comment">// ignore extra args
- </span> <span class="keyword">if</span> (currentToken != <span class="jde-java-font-lock-constant">COMMA</span>)
- <span class="keyword">break</span>;
- next();
- }
- expectRpar();
- }
- <span class="keyword">if</span> (minArgs > i || i > maxArgs) {
- <span class="keyword">throw</span> <span class="keyword">new</span> <span class="type">PropertyException</span>("<span class="string">Wrong number of args for function</span>");
- }
- <span class="keyword">return</span> args;
- }
-
- }
- </pre>
- </body>
- </html>
|