diff options
Diffstat (limited to 'gnu/javax/swing')
-rw-r--r-- | gnu/javax/swing/text/html/css/CSSColor.java | 13 | ||||
-rw-r--r-- | gnu/javax/swing/text/html/css/CSSParser.java | 25 | ||||
-rw-r--r-- | gnu/javax/swing/text/html/css/CSSParserCallback.java | 2 | ||||
-rw-r--r-- | gnu/javax/swing/text/html/css/FontSize.java | 129 | ||||
-rw-r--r-- | gnu/javax/swing/text/html/css/Selector.java | 2 | ||||
-rw-r--r-- | gnu/javax/swing/text/html/parser/htmlValidator.java | 5 | ||||
-rw-r--r-- | gnu/javax/swing/text/html/parser/support/Parser.java | 35 | ||||
-rw-r--r-- | gnu/javax/swing/text/html/parser/support/low/Constants.java | 11 | ||||
-rw-r--r-- | gnu/javax/swing/text/html/parser/support/textPreProcessor.java | 20 |
9 files changed, 198 insertions, 44 deletions
diff --git a/gnu/javax/swing/text/html/css/CSSColor.java b/gnu/javax/swing/text/html/css/CSSColor.java index 57230f12a..ea4b94ae0 100644 --- a/gnu/javax/swing/text/html/css/CSSColor.java +++ b/gnu/javax/swing/text/html/css/CSSColor.java @@ -110,9 +110,16 @@ public class CSSColor val1 = (String) COLOR_MAP.get(val1); if (val1 != null) { - String hexVal = val1.substring(1); - int rgb = Integer.parseInt(hexVal, 16); - color = new Color(rgb); + String hexVal = val1.substring(1).trim(); + try + { + int rgb = Integer.parseInt(hexVal, 16); + color = new Color(rgb); + } + catch (NumberFormatException ex) + { + color = Color.BLACK; + } } else color = null; diff --git a/gnu/javax/swing/text/html/css/CSSParser.java b/gnu/javax/swing/text/html/css/CSSParser.java index 0d68457a3..5647e2506 100644 --- a/gnu/javax/swing/text/html/css/CSSParser.java +++ b/gnu/javax/swing/text/html/css/CSSParser.java @@ -45,6 +45,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; +import java.util.StringTokenizer; /** * A parser for CSS stylesheets. @@ -158,7 +159,15 @@ public class CSSParser { StringBuilder selector = new StringBuilder(); parseSelector(selector); - callback.startStatement(new Selector(selector.toString())); + StringTokenizer selSplitter = + new StringTokenizer(selector.toString(), ","); + Selector[] sels = new Selector[selSplitter.countTokens()]; + for (int i = 0; selSplitter.hasMoreTokens(); i++) + { + String sel = selSplitter.nextToken().trim(); + sels[i] = new Selector(sel); + } + callback.startStatement(sels); // Read any number of whitespace. int token; do @@ -260,7 +269,7 @@ public class CSSParser StringBuilder value = new StringBuilder(); if (parseValue(value)) { - callback.declaration(property, value.toString()); + callback.declaration(property, value.toString().trim()); } else { @@ -458,9 +467,17 @@ public class CSSParser InputStreamReader r = new InputStreamReader(bin); CSSParserCallback cb = new CSSParserCallback() { - public void startStatement(Selector selector) + public void startStatement(Selector[] selector) { - System.out.println("startStatement: " + selector); + System.out.print("startStatement: "); + for (int i = 0; i < selector.length; i++) + { + System.out.print(selector[i]); + if (i < selector.length - 1) + System.out.print(','); + else + System.out.println(); + } } public void endStatement() { diff --git a/gnu/javax/swing/text/html/css/CSSParserCallback.java b/gnu/javax/swing/text/html/css/CSSParserCallback.java index b62baddfc..f49ffa232 100644 --- a/gnu/javax/swing/text/html/css/CSSParserCallback.java +++ b/gnu/javax/swing/text/html/css/CSSParserCallback.java @@ -62,7 +62,7 @@ public interface CSSParserCallback * * @param selector the selector of the statement. */ - void startStatement(Selector selector); + void startStatement(Selector[] selector); /** * Signals the end of a statement. diff --git a/gnu/javax/swing/text/html/css/FontSize.java b/gnu/javax/swing/text/html/css/FontSize.java index 19e1d701a..7dc8d46c6 100644 --- a/gnu/javax/swing/text/html/css/FontSize.java +++ b/gnu/javax/swing/text/html/css/FontSize.java @@ -52,6 +52,24 @@ public class FontSize private String value; /** + * The actual font size. + */ + private int size; + + /** + * The index of one of the standard sizes that this font size maps to. + * This is -1 if this fontsize doesn't map to one of the standard sizes. + * + * @see #SCALE + */ + private int sizeIndex; + + /** + * True when this font size is relative. + */ + private boolean isRelative; + + /** * The default size for 'medium' absolute size. The other absolute sizes * are calculated from this. */ @@ -70,6 +88,27 @@ public class FontSize public FontSize(String val) { value = val; + sizeIndex = -1; + isRelative = false; + size = mapValue(); + } + + /** + * Returns the font size value. + * + * @return the font size value + */ + public int getValue(int p) + { + if (isRelative) + mapRelative(p); + return size; + } + + public int getValue() + { + assert ! isRelative; + return size; } /** @@ -77,17 +116,21 @@ public class FontSize * * @return the converted real value in point */ - public int getValue() + private int mapValue() { int intVal; if (value.contains("pt")) intVal = mapPoints(); else if (value.contains("px")) intVal = mapPixels(); + else if (value.contains("em") || value.contains("%") + || value.contains("larger") || value.contains("smaller")) + { + intVal = -1; + isRelative = true; + } else intVal = mapAbsolute(); - // FIXME: Allow relative font values, ('larger' and 'smaller'). This - // requires knowledge about the parent element's font size. return intVal; } @@ -111,10 +154,65 @@ public class FontSize */ private int mapPixels() { - int end = value.indexOf("pt"); + int end = value.indexOf("px"); + if (end == -1) + end = value.length(); String number = value.substring(0, end); - int intVal = Integer.parseInt(number); - return intVal; + try + { + int intVal = Integer.parseInt(number); + return intVal; + } + catch (NumberFormatException ex) + { + return DEFAULT_FONT_SIZE; + } + } + + private int mapPercent(int par) + { + int end = value.indexOf("%"); + if (end == -1) + end = value.length(); + String number = value.substring(0, end); + try + { + int intVal = Integer.parseInt(number); + return intVal * par / 100; + } + catch (NumberFormatException ex) + { + System.err.println("couldn't map value: '" + value + "'"); + return DEFAULT_FONT_SIZE; + } + } + + private int mapEM(int par) + { + int end = value.indexOf("em"); + if (end == -1) + end = value.length(); + String number = value.substring(0, end); + try + { + float factor = Float.parseFloat(number); + // FIXME: Should be relative to the parent element's size. + return (int) (factor * par); + } + catch (NumberFormatException ex) + { + return DEFAULT_FONT_SIZE; + } + } + + private int mapSmaller(int par) + { + return (int) (par * 0.9); + } + + private int mapLarger(int par) + { + return (int) (par * 0.9); } /** @@ -143,6 +241,7 @@ public class FontSize // FIXME: Scale the real medium size of the document, rather than the // constant here. int intVal = (int) (scale * DEFAULT_FONT_SIZE); + sizeIndex = index; return intVal; } @@ -153,4 +252,22 @@ public class FontSize { return value; } + + private int mapRelative(int par) + { + if (value.contains("%")) + size = mapPercent(par); + else if (value.contains("em")) + size = mapEM(par); + else if (value.contains("larger")) + size = mapLarger(par); + else if (value.contains("smaller")) + size = mapSmaller(par); + return size; + } + + public boolean isRelative() + { + return isRelative; + } } diff --git a/gnu/javax/swing/text/html/css/Selector.java b/gnu/javax/swing/text/html/css/Selector.java index 75f2d46c6..b8128233b 100644 --- a/gnu/javax/swing/text/html/css/Selector.java +++ b/gnu/javax/swing/text/html/css/Selector.java @@ -214,7 +214,7 @@ public class Selector { b++; id = sel.substring(idIndex + 1, - clazzIndex > 0 ? Math.min(idIndex, sel.length()) + clazzIndex > 0 ? Math.min(clazzIndex, sel.length()) : sel.length()); } String tag = sel.substring(0, diff --git a/gnu/javax/swing/text/html/parser/htmlValidator.java b/gnu/javax/swing/text/html/parser/htmlValidator.java index 4d287a677..7507850e8 100644 --- a/gnu/javax/swing/text/html/parser/htmlValidator.java +++ b/gnu/javax/swing/text/html/parser/htmlValidator.java @@ -153,7 +153,7 @@ public abstract class htmlValidator * Remove the given tag from the stack or (if found) from the list * of the forcibly closed tags. */ - public void closeTag(TagElement tElement) + public boolean closeTag(TagElement tElement) { HTML.Tag tag = tElement.getHTMLTag(); hTag x; @@ -191,11 +191,12 @@ public abstract class htmlValidator } stack.remove(x); - return; + return true; } } } s_error("Closing unopened <" + tag + ">"); + return false; } /** diff --git a/gnu/javax/swing/text/html/parser/support/Parser.java b/gnu/javax/swing/text/html/parser/support/Parser.java index f1f25fad0..98058e503 100644 --- a/gnu/javax/swing/text/html/parser/support/Parser.java +++ b/gnu/javax/swing/text/html/parser/support/Parser.java @@ -659,19 +659,18 @@ public class Parser else text = textProcessor.preprocess(buffer); - if (text != null && text.length > 0) + if (text != null && text.length > 0 + // According to the specs we need to discard whitespace immediately + // before a closing tag. + && (text.length > 1 || text[0] != ' ' || ! TAG_CLOSE.matches(this))) { TagElement pcdata = new TagElement(dtd.getElement("#pcdata")); - if ((text.length > 1 && text[0] != ' ') - || validator.tagIsValidForContext(pcdata) == Boolean.TRUE) - { - attributes = htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET; - _handleEmptyTag(pcdata); + attributes = htmlAttributeSet.EMPTY_HTML_ATTRIBUTE_SET; + _handleEmptyTag(pcdata); - handleText(text); - if (titleOpen) - title.append(text); - } + handleText(text); + if (titleOpen) + title.append(text); } } @@ -1197,8 +1196,8 @@ public class Parser */ private void _handleEndTag(TagElement tag) { - validator.closeTag(tag); - _handleEndTag_remaining(tag); + if (validator.closeTag(tag)) + _handleEndTag_remaining(tag); } /** @@ -1218,6 +1217,11 @@ public class Parser if (preformatted < 0) preformatted = 0; + // When a block tag is closed, consume whitespace that follows after + // it. + if (h.isBlock()) + optional(WS); + if (h == HTML.Tag.TITLE) { titleOpen = false; @@ -1460,7 +1464,12 @@ public class Parser if (te.getElement().type == DTDConstants.EMPTY) _handleEmptyTag(te); else - _handleStartTag(te); + { + // According to the specs we need to consume whitespace following + // immediately after a opening tag. + optional(WS); + _handleStartTag(te); + } } } diff --git a/gnu/javax/swing/text/html/parser/support/low/Constants.java b/gnu/javax/swing/text/html/parser/support/low/Constants.java index 283d32385..5416582ad 100644 --- a/gnu/javax/swing/text/html/parser/support/low/Constants.java +++ b/gnu/javax/swing/text/html/parser/support/low/Constants.java @@ -209,6 +209,17 @@ public class Constants } ); + /** + * Ordinary HTML tag closing pattern. + */ + public static final pattern TAG_CLOSE = + new pattern(new node[] + { + new node(BEGIN), new node(WS, true), new node(SLASH), + new node(WS, true), new node(NUMTOKEN) + } + ); + /* Special tokens */ /** diff --git a/gnu/javax/swing/text/html/parser/support/textPreProcessor.java b/gnu/javax/swing/text/html/parser/support/textPreProcessor.java index b81275b1f..6fd79e258 100644 --- a/gnu/javax/swing/text/html/parser/support/textPreProcessor.java +++ b/gnu/javax/swing/text/html/parser/support/textPreProcessor.java @@ -65,22 +65,14 @@ public class textPreProcessor int b = text.length - 1; // Remove leading/trailing whitespace, leaving at most one character - try - { - while (Constants.bWHITESPACE.get(text[a]) - && Constants.bWHITESPACE.get(text[a + 1])) - a++; + int len = text.length; + while (a + 1 < len && Constants.bWHITESPACE.get(text[a]) + && Constants.bWHITESPACE.get(text[a + 1])) + a++; - while (b > a && Constants.bWHITESPACE.get(text[b]) + while (b > a && Constants.bWHITESPACE.get(text[b]) && Constants.bWHITESPACE.get(text[b - 1])) - b--; - } - catch (ArrayIndexOutOfBoundsException sx) - { - // A text fragment, consisting from spaces and line breaks only, - // mutates into single space. - return new char[] { ' ' }; - } + b--; a_text.setLength(0); |