diff options
author | Florian Thienel | 2016-01-21 16:54:01 +0000 |
---|---|---|
committer | Florian Thienel | 2016-01-21 16:54:01 +0000 |
commit | 8d7e9b473724baf0c142f67753145220c2bc32a8 (patch) | |
tree | a7e471efc950b871f5f0c807dda5a9adac0f3716 | |
parent | bcbe88ad4caf86de5340d3236bd255e47e920b74 (diff) | |
download | org.eclipse.mylyn.docs.vex-8d7e9b473724baf0c142f67753145220c2bc32a8.tar.gz org.eclipse.mylyn.docs.vex-8d7e9b473724baf0c142f67753145220c2bc32a8.tar.xz org.eclipse.mylyn.docs.vex-8d7e9b473724baf0c142f67753145220c2bc32a8.zip |
allow url(...) to be used in the content CSS property
Signed-off-by: Florian Thienel <florian@thienel.org>
10 files changed, 168 insertions, 11 deletions
diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/css/BatikBehaviorTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/css/BatikBehaviorTest.java index e3542dae..8760d402 100644 --- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/css/BatikBehaviorTest.java +++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/css/BatikBehaviorTest.java @@ -50,7 +50,7 @@ public class BatikBehaviorTest { final Element element = new Element("plan"); final IElement before = styleSheet.getPseudoElementBefore(element); final Styles beforeStyles = styleSheet.getStyles(before); - assertEquals("test", beforeStyles.getContent(element).get(0)); + assertEquals("test", beforeStyles.getTextualContent(element).get(0)); assertEquals(123.0f, beforeStyles.getFontSize(), 0.0f); } @@ -63,7 +63,7 @@ public class BatikBehaviorTest { assertEquals(123.0f, styles.getFontSize(), 0.0f); final IElement before = styleSheet.getPseudoElementBefore(element); final Styles beforeStyles = styleSheet.getStyles(before); - assertEquals("test", beforeStyles.getContent(element).get(0)); + assertEquals("test", beforeStyles.getTextualContent(element).get(0)); assertEquals(123.0f, beforeStyles.getFontSize(), 0.0f); } @@ -76,9 +76,9 @@ public class BatikBehaviorTest { final Element nochild = new Element("child"); child.setParent(element); final Styles styles = styleSheet.getStyles(child); - assertEquals(1, styles.getContent(element).size()); - assertEquals("child", styles.getContent(element).get(0)); + assertEquals(1, styles.getTextualContent(element).size()); + assertEquals("child", styles.getTextualContent(element).get(0)); final Styles nochildStyles = styleSheet.getStyles(nochild); - assertEquals("nochild", nochildStyles.getContent(element).get(0)); + assertEquals("nochild", nochildStyles.getTextualContent(element).get(0)); } }
\ No newline at end of file diff --git a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/css/CssTest.java b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/css/CssTest.java index 33892320..a770e768 100644 --- a/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/css/CssTest.java +++ b/org.eclipse.vex.core.tests/src/org/eclipse/vex/core/internal/css/CssTest.java @@ -579,9 +579,9 @@ public class CssTest { final Styles styles = ss.getStyles(element); - assertEquals("Before", styles.getContent(element).get(0)); + assertEquals("Before", styles.getTextualContent(element).get(0)); element.setAttribute("attribute", "After"); - assertEquals("After", styles.getContent(element).get(0)); + assertEquals("After", styles.getTextualContent(element).get(0)); } @Test diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/IPropertyContent.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/IPropertyContent.java new file mode 100644 index 00000000..2eb64415 --- /dev/null +++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/IPropertyContent.java @@ -0,0 +1,16 @@ +/******************************************************************************* + * Copyright (c) 2016 Florian Thienel and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Florian Thienel - initial API and implementation + *******************************************************************************/ +package org.eclipse.vex.core.internal.css; + +public interface IPropertyContent { + + <T> T accept(IPropertyContentVisitor<T> visitor); +} diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/IPropertyContentVisitor.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/IPropertyContentVisitor.java new file mode 100644 index 00000000..0beaee18 --- /dev/null +++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/IPropertyContentVisitor.java @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2016 Florian Thienel and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Florian Thienel - initial API and implementation + *******************************************************************************/ +package org.eclipse.vex.core.internal.css; + +public interface IPropertyContentVisitor<T> { + + T visit(TextualContent content); + + T visit(URIContent content); + +} diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/StyleSheet.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/StyleSheet.java index 5e388d74..40fdbf39 100644 --- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/StyleSheet.java +++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/StyleSheet.java @@ -263,6 +263,10 @@ public class StyleSheet { // content: attr(attributeName) content.add(lexicalUnit); break; + case LexicalUnit.SAC_URI: + // content: url("<some URI of an image>") + content.add(lexicalUnit); + break; } lexicalUnit = lexicalUnit.getNextLexicalUnit(); } diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Styles.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Styles.java index 4b2af16e..4213ed8c 100644 --- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Styles.java +++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/Styles.java @@ -13,6 +13,8 @@ *******************************************************************************/ package org.eclipse.vex.core.internal.css; +import java.net.URI; +import java.net.URISyntaxException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -22,6 +24,7 @@ import org.eclipse.vex.core.internal.core.Color; import org.eclipse.vex.core.internal.core.FontSpec; import org.eclipse.vex.core.internal.core.Length; import org.eclipse.vex.core.provisional.dom.BaseNodeVisitor; +import org.eclipse.vex.core.provisional.dom.BaseNodeVisitorWithResult; import org.eclipse.vex.core.provisional.dom.IElement; import org.eclipse.vex.core.provisional.dom.INode; import org.eclipse.vex.core.provisional.dom.IProcessingInstruction; @@ -168,7 +171,7 @@ public class Styles { * @param node * The INode to get attr(...) values from */ - public List<String> getContent(final INode node) { + public List<String> getTextualContent(final INode node) { final List<String> content = new ArrayList<String>(); for (LexicalUnit lexicalUnit : contentLexicalUnits) { switch (lexicalUnit.getLexicalUnitType()) { @@ -202,6 +205,57 @@ public class Styles { return content; } + public List<IPropertyContent> getAllContent(final INode node) { + final List<IPropertyContent> allContent = new ArrayList<IPropertyContent>(); + for (LexicalUnit lexicalUnit : contentLexicalUnits) { + final IPropertyContent content = getContent(lexicalUnit, node); + if (content != null) { + allContent.add(content); + } + lexicalUnit = lexicalUnit.getNextLexicalUnit(); + } + return allContent; + } + + private IPropertyContent getContent(final LexicalUnit lexicalUnit, final INode node) { + switch (lexicalUnit.getLexicalUnitType()) { + case LexicalUnit.SAC_STRING_VALUE: + // content: "A String" + return new TextualContent(lexicalUnit.getStringValue()); + case LexicalUnit.SAC_ATTR: + // content: attr(attributeName) + final LexicalUnit currentLexicalUnit = lexicalUnit; + return node.accept(new BaseNodeVisitorWithResult<IPropertyContent>() { + @Override + public IPropertyContent visit(final IElement element) { + final String attributeValue = element.getAttributeValue(currentLexicalUnit.getStringValue()); + if (attributeValue != null) { + return new TextualContent(attributeValue); + } + return null; + } + + @Override + public IPropertyContent visit(final IProcessingInstruction pi) { + if (currentLexicalUnit.getStringValue().equalsIgnoreCase(CSS.PSEUDO_TARGET)) { + return new TextualContent(pi.getTarget()); + } + return null; + } + }); + case LexicalUnit.SAC_URI: + // content: url("<some URI of an image>") + try { + return new URIContent(new URI(lexicalUnit.getStringValue())); + } catch (final URISyntaxException e) { + e.printStackTrace(); + return null; + } + default: + return null; + } + } + /** * Returns the value of the <code>display</code> property. */ diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/TextualContent.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/TextualContent.java new file mode 100644 index 00000000..f2764eb5 --- /dev/null +++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/TextualContent.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2016 Florian Thienel and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Florian Thienel - initial API and implementation + *******************************************************************************/ +package org.eclipse.vex.core.internal.css; + +public class TextualContent implements IPropertyContent { + + public final String text; + + public TextualContent(final String text) { + this.text = text; + } + + @Override + public <T> T accept(final IPropertyContentVisitor<T> visitor) { + return visitor.visit(this); + } + + @Override + public String toString() { + return text; + } + +} diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/URIContent.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/URIContent.java new file mode 100644 index 00000000..4c06f2b8 --- /dev/null +++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/css/URIContent.java @@ -0,0 +1,32 @@ +/******************************************************************************* + * Copyright (c) 2016 Florian Thienel and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Florian Thienel - initial API and implementation + *******************************************************************************/ +package org.eclipse.vex.core.internal.css; + +import java.net.URI; + +public class URIContent implements IPropertyContent { + + public final URI uri; + + public URIContent(final URI uri) { + this.uri = uri; + } + + @Override + public <T> T accept(final IPropertyContentVisitor<T> visitor) { + return visitor.visit(this); + } + + @Override + public String toString() { + return uri.toString(); + } +} diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/LayoutUtils.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/LayoutUtils.java index 49a24dbc..dbe570d1 100644 --- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/LayoutUtils.java +++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/layout/LayoutUtils.java @@ -77,7 +77,7 @@ public class LayoutUtils { * The node passed to Styles#getContent (to get attr values from) */ public static String getGeneratedContent(final LayoutContext context, final Styles styles, final INode node) { - final List<String> content = styles.getContent(node); + final List<String> content = styles.getTextualContent(node); final StringBuffer sb = new StringBuffer(); for (final String string : content) { sb.append(string); // TODO: change to ContentPart diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java index f23ec37d..0a0d1ea8 100644 --- a/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java +++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/internal/visualization/CssBasedBoxModelBuilder.java @@ -41,6 +41,7 @@ import org.eclipse.vex.core.internal.boxes.Paragraph; import org.eclipse.vex.core.internal.boxes.RootBox; import org.eclipse.vex.core.internal.boxes.TextContent; import org.eclipse.vex.core.internal.css.CSS; +import org.eclipse.vex.core.internal.css.IPropertyContent; import org.eclipse.vex.core.internal.css.StyleSheet; import org.eclipse.vex.core.internal.css.Styles; import org.eclipse.vex.core.internal.css.Styles.PseudoElement; @@ -287,7 +288,7 @@ public class CssBasedBoxModelBuilder implements IBoxModelBuilder { } final StringBuilder content = new StringBuilder(); - for (final String part : pseudoElementStyles.getContent(node)) { + for (final IPropertyContent part : pseudoElementStyles.getAllContent(node)) { content.append(part); } return frame(paragraph(pseudoElementStyles, staticText(content.toString(), pseudoElementStyles)), pseudoElementStyles); @@ -440,7 +441,7 @@ public class CssBasedBoxModelBuilder implements IBoxModelBuilder { } final StringBuilder content = new StringBuilder(); - for (final String part : pseudoElementStyles.getContent(node)) { + for (final IPropertyContent part : pseudoElementStyles.getAllContent(node)) { content.append(part); } return frame(inlineContainer(staticText(content.toString(), pseudoElementStyles)), pseudoElementStyles); |