summaryrefslogtreecommitdiff
path: root/gnu/javax/swing/text/html
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/javax/swing/text/html')
-rw-r--r--gnu/javax/swing/text/html/css/CSSColor.java13
-rw-r--r--gnu/javax/swing/text/html/css/CSSParser.java25
-rw-r--r--gnu/javax/swing/text/html/css/CSSParserCallback.java2
-rw-r--r--gnu/javax/swing/text/html/css/FontSize.java129
-rw-r--r--gnu/javax/swing/text/html/css/Selector.java2
-rw-r--r--gnu/javax/swing/text/html/parser/htmlValidator.java5
-rw-r--r--gnu/javax/swing/text/html/parser/support/Parser.java35
-rw-r--r--gnu/javax/swing/text/html/parser/support/low/Constants.java11
-rw-r--r--gnu/javax/swing/text/html/parser/support/textPreProcessor.java20
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);