Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfHtmlFormatterVisitor.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfHtmlFormatterVisitor.java	(revision 38)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/EbnfHtmlFormatterVisitor.java	(revision 39)
@@ -4,4 +4,6 @@
 import java.util.Iterator;
 
+import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang.StringUtils;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.parsetree.LeafNode;
@@ -11,8 +13,10 @@
 import de.ugoe.cs.swe.bnftools.ebnf.RuleReference;
 import de.ugoe.cs.swe.bnftools.ebnf.SectionHeading;
+import de.ugoe.cs.swe.bnftools.ebnf.StringRule;
 
 public class EbnfHtmlFormatterVisitor extends EbnfFormatterVisitor {
 
 	private ArrayList<MetaTextEntry> metaTexts = new ArrayList<MetaTextEntry>();
+	private ArrayList<MetaTextEntry> transformedTexts = new ArrayList<MetaTextEntry>();
 	
 	public EbnfHtmlFormatterVisitor(EObject rootNode, FormatterConfig config) {
@@ -35,4 +39,8 @@
 			currentMetaText = metaTexts.iterator().next();
 
+		MetaTextEntry currentTransformedText = null;
+		if (transformedTexts.iterator().hasNext())
+			currentTransformedText = transformedTexts.iterator().next();
+		
 		while (bufferPositionFormattedTextNoWhitespaces <= formattedTextNoWhitespaces.length()) {
 			skipWhitespacesOriginalText();
@@ -51,4 +59,13 @@
 			
 			if (formattedPositionNoWhitespaces != originalPosition) {
+//				if ((currentMetaText != null) && (bufferPositionFormattedTextNoWhitespaces == currentMetaText.getOffset())) {
+//					result.append(currentMetaText.getText());
+//					metaTexts.remove(currentMetaText);
+//					if (metaTexts.iterator().hasNext())
+//						currentMetaText = metaTexts.iterator().next();
+//					else
+//						currentMetaText = null;
+//				}
+
 				if (formattedPositionNoWhitespaces == ';') { // formatted text always outputs the optional semicolon, skip it if necessary
 					bufferPositionFormattedTextNoWhitespaces++;
@@ -93,5 +110,5 @@
 				}
 			} else {
-				if ((currentMetaText != null) && (bufferPositionFormattedText >= currentMetaText.getOffset())) {
+				if ((currentMetaText != null) && (bufferPositionFormattedTextNoWhitespaces == currentMetaText.getOffset())) {
 					result.append(currentMetaText.getText());
 					metaTexts.remove(currentMetaText);
@@ -101,18 +118,33 @@
 						currentMetaText = null;
 				}
-				
-				result.append(formattedText.substring(bufferPositionFormattedText, bufferPositionFormattedText+1));
-				bufferPositionOriginalText++;
-				bufferPositionFormattedText++;
-				bufferPositionFormattedTextNoWhitespaces++;
-				
-				if ((currentMetaText != null) && (bufferPositionFormattedText >= currentMetaText.getOffset())) {
-					result.append(currentMetaText.getText());
-					metaTexts.remove(currentMetaText);
-					if (metaTexts.iterator().hasNext())
-						currentMetaText = metaTexts.iterator().next();
-					else
-						currentMetaText = null;
+
+				if (currentTransformedText != null && currentTransformedText.getOffset() == bufferPositionFormattedTextNoWhitespaces) {
+					result.append(currentTransformedText.getTransformedText());
+					bufferPositionOriginalText += currentTransformedText.getText().length();
+					bufferPositionFormattedText += currentTransformedText.getText().length();
+					bufferPositionFormattedTextNoWhitespaces += currentTransformedText.getText().replaceAll("[ \t\r\n]", "").length();
+					transformedTexts.remove(currentTransformedText);
+					currentTransformedText = null;
+					
+					if (transformedTexts.iterator().hasNext())
+						currentTransformedText = transformedTexts.iterator().next();
+				} else {
+					String text = formattedText.substring(bufferPositionFormattedText, bufferPositionFormattedText+1);
+					result.append(text);
+					bufferPositionOriginalText++;
+					bufferPositionFormattedText++;
+					bufferPositionFormattedTextNoWhitespaces++;
 				}
+
+//				if ((currentMetaText != null) && (bufferPositionFormattedTextNoWhitespaces == currentMetaText.getOffset())) {
+//					result.append(currentMetaText.getText());
+//					metaTexts.remove(currentMetaText);
+//					if (metaTexts.iterator().hasNext())
+//						currentMetaText = metaTexts.iterator().next();
+//					else
+//						currentMetaText = null;
+//				}
+
+//				}
 			}
 		}
@@ -121,6 +153,13 @@
 	
 	protected void metaText(String str) {
-		MetaTextEntry metaTextEntry = new MetaTextEntry(str, buf.length());
+		MetaTextEntry metaTextEntry = new MetaTextEntry(str, buf.toString().replaceAll("[ \t\n\r]", "").length());
 		metaTexts.add(metaTextEntry);
+	}
+
+	protected void textTransformed(String original, String transformed) {
+		MetaTextEntry metaText = new MetaTextEntry(original, transformed, buf.toString().replaceAll("[ \t\n\r]", "").length());
+		transformedTexts.add(metaText);
+		buf.append(original);
+		newLineOffsetCounter += original.length();
 	}
 
@@ -182,3 +221,19 @@
 		ruleSpacingStack.pop();
 	}
+	
+	protected void visitBefore(StringRule node) {
+		wrap();
+		if (node.getLiteral() != null) {
+//			text("\"" + node.getLiteral() + "\"");
+			textTransformed("\"" + node.getLiteral() + "\"", StringEscapeUtils.escapeHtml("\"" + node.getLiteral() + "\""));
+//			textTransformed("\"" + node.getLiteral() + "\"", "gnabar");
+		} else if (node.getColon() != null) {
+//			text("\"\"\"");
+			textTransformed("\"\"\"", StringEscapeUtils.escapeHtml("\"\"\""));
+//			textTransformed("\"\"\"", "gnabar");
+		}
+	}
+
+	protected void visitAfter(StringRule node) {
+	}
 }
Index: /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/MetaTextEntry.java
===================================================================
--- /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/MetaTextEntry.java	(revision 38)
+++ /trunk/de.ugoe.cs.swe.bnftools.ebnf.ui/src/de/ugoe/cs/swe/bnftools/ui/formatter/MetaTextEntry.java	(revision 39)
@@ -3,8 +3,15 @@
 public class MetaTextEntry {
 	private String text;
+	private String transformedText = null;
 	private int offset;
 
 	public MetaTextEntry(String text, int offset) {
 		this.text = text;
+		this.offset = offset;
+	}
+
+	public MetaTextEntry(String text, String transformedText, int offset) {
+		this.text = text;
+		this.transformedText = transformedText;
 		this.offset = offset;
 	}
@@ -31,3 +38,11 @@
 	}
 
+	public String getTransformedText() {
+		return transformedText;
+	}
+
+	public void setTransformedText(String transformedText) {
+		this.transformedText = transformedText;
+	}
+
 }
