show squares to indicate line breaks
In order to demonstrate that it is possible to distribute the content of
one IText node over several inline boxes, we insert a Square at every
line break. All boxes that relate to the IText node are aggregated in an
InlineContainer.
Signed-off-by: Florian Thienel <florian@thienel.org>
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 9dc0786..5eb5db1 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
@@ -14,6 +14,7 @@
import static org.eclipse.vex.core.internal.boxes.BoxFactory.nodeReference;
import static org.eclipse.vex.core.internal.boxes.BoxFactory.nodeReferenceWithText;
import static org.eclipse.vex.core.internal.boxes.BoxFactory.rootBox;
+import static org.eclipse.vex.core.internal.boxes.BoxFactory.square;
import static org.eclipse.vex.core.internal.boxes.BoxFactory.verticalBlock;
import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.frame;
import static org.eclipse.vex.core.internal.visualization.CssBoxFactory.paragraph;
@@ -29,6 +30,7 @@
import org.eclipse.vex.core.internal.boxes.IInlineBox;
import org.eclipse.vex.core.internal.boxes.IParentBox;
import org.eclipse.vex.core.internal.boxes.IStructuralBox;
+import org.eclipse.vex.core.internal.boxes.InlineContainer;
import org.eclipse.vex.core.internal.boxes.RootBox;
import org.eclipse.vex.core.internal.css.CSS;
import org.eclipse.vex.core.internal.css.StyleSheet;
@@ -41,6 +43,7 @@
import org.eclipse.vex.core.provisional.dom.INode;
import org.eclipse.vex.core.provisional.dom.IText;
import org.eclipse.vex.core.provisional.dom.IValidator;
+import org.eclipse.vex.core.provisional.dom.MultilineText;
/**
* @author Florian Thienel
@@ -198,7 +201,19 @@
@Override
public IInlineBox visit(final IText text) {
- return textContent(text.getContent(), text.getRange(), styles);
+ if (!CSS.PRE.equals(styles.getWhiteSpace())) { // TODO use IWhitespacePolicy
+ return textContent(text.getContent(), text.getRange(), styles);
+ }
+
+ final InlineContainer lineContainer = inlineContainer();
+ final MultilineText lines = text.getContent().getMultilineText(text.getRange());
+ for (int i = 0; i < lines.size(); i += 1) {
+ lineContainer.appendChild(textContent(text.getContent(), lines.getRange(i), styles));
+ if (text.getContent().isLineBreak(lines.getRange(i).getEndOffset())) {
+ lineContainer.appendChild(square(10));
+ }
+ }
+ return lineContainer;
}
});
}
diff --git a/org.eclipse.vex.core/src/org/eclipse/vex/core/provisional/dom/IContent.java b/org.eclipse.vex.core/src/org/eclipse/vex/core/provisional/dom/IContent.java
index 4ecda19..07d3a51 100644
--- a/org.eclipse.vex.core/src/org/eclipse/vex/core/provisional/dom/IContent.java
+++ b/org.eclipse.vex.core/src/org/eclipse/vex/core/provisional/dom/IContent.java
@@ -122,6 +122,14 @@
boolean isTagMarker(int offset);
/**
+ * Indicate if there is a line break at the given offset.
+ *
+ * @param offset
+ * offset at which to check if a line break is present.
+ */
+ boolean isLineBreak(int offset);
+
+ /**
* Delete the given range of characters.
*
* @param range