On Mar 1, 2006, at 19:21, Andreas L Delmelle wrote:

Maybe we could make sure the Writer is wrapped into a BufferedWriter when creating it in RTFHandler, just to streamline a bit.

I'd drop that static Map anyways. Makes sense if you need the same constant in a hundred different places, but since all remains private to that tiny class here, they could as well be hardcoded. Work directly on the char primitive instead of the Character object as much as possible. (?)

New tiny patch proposal for this below. Nothing broke, and strictly RTF-wise the output for list-item-label text now seems more correct than before. Unfortunately, I lack extensive tests for this sort of thing, so I wouldn't mind a second opinion --especially WRT the generated RTF code. I tried to make sure nothing was altered apart from the way the characters for those labels are written to the output stream, but you never know...

TIA,

Andreas


Index: src/java/org/apache/fop/render/rtf/RTFHandler.java
===================================================================
--- src/java/org/apache/fop/render/rtf/RTFHandler.java (revision 382930)
+++ src/java/org/apache/fop/render/rtf/RTFHandler.java  (working copy)
@@ -19,6 +19,7 @@
package org.apache.fop.render.rtf;
// Java
+import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
@@ -52,9 +53,9 @@
import org.apache.fop.fo.flow.ListItemLabel;
import org.apache.fop.fo.flow.PageNumber;
import org.apache.fop.fo.flow.Table;
-import org.apache.fop.fo.flow.TableColumn;
import org.apache.fop.fo.flow.TableBody;
import org.apache.fop.fo.flow.TableCell;
+import org.apache.fop.fo.flow.TableColumn;
import org.apache.fop.fo.flow.TableHeader;
import org.apache.fop.fo.flow.TableRow;
import org.apache.fop.fo.pagination.Flow;
@@ -147,7 +148,8 @@
     public void startDocument() throws SAXException {
         // TODO sections should be created
         try {
-            rtfFile = new RtfFile(new OutputStreamWriter(os));
+            rtfFile = new RtfFile(new BufferedWriter(
+                    new OutputStreamWriter(os, "US-ASCII")));
             docArea = rtfFile.startDocumentArea();
         } catch (IOException ioe) {
// TODO could we throw Exception in all FOEventHandler events? Index: src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/ RtfListStyleText.java
===================================================================
--- src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/ RtfListStyleText.java (revision 382930) +++ src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/ RtfListStyleText.java (working copy)
@@ -63,7 +63,8 @@
         item.writeGroupMark(true);
         //item.writeControlWord("pndec");
         item.writeOneAttribute(RtfListTable.LIST_FONT_TYPE, "2");
-        item.writeControlWord("pntxtb " + text);
+        item.writeControlWord("pntxtb ");
+ RtfStringConverter.getInstance().writeRtfString(item.writer, text);
         item.writeGroupMark(false);
     }

@@ -102,8 +103,9 @@
                 sCount = "0" + sCount;
             }
         }
-        element.writeOneAttributeNS(
-                RtfListTable.LIST_TEXT_FORM, "\\'" + sCount + text);
+ element.writeControlWordNS(RtfListTable.LIST_TEXT_FORM + "\ \'" + sCount);
+        RtfStringConverter.getInstance().writeRtfString(
+                element.writer, text);
         element.writeGroupMark(false);

         element.writeGroupMark(true);
Index: src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/ RtfStringConverter.java
===================================================================
--- src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/ RtfStringConverter.java (revision 382930) +++ src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/ RtfStringConverter.java (working copy)
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2004 The Apache Software Foundation.
+ * Copyright 1999-2006 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -26,8 +26,6 @@
package org.apache.fop.render.rtf.rtflib.rtfdoc;
-import java.util.Map;
-import java.util.HashMap;
import java.io.IOException;
import java.io.Writer;
@@ -38,23 +36,6 @@
public class RtfStringConverter {
private static final RtfStringConverter INSTANCE = new RtfStringConverter();
-    private static final Map SPECIAL_CHARS;
-    private static final Character DBLQUOTE = new Character('\"');
-    private static final Character QUOTE = new Character('\'');
-    private static final Character SPACE = new Character(' ');
-
- /** List of characters to escape with corresponding replacement strings */
-    static {
-        SPECIAL_CHARS = new HashMap();
-        SPECIAL_CHARS.put(new Character('\t'), "tab");
-        SPECIAL_CHARS.put(new Character('\n'), "line");
-        SPECIAL_CHARS.put(new Character('\''), "rquote");
-        SPECIAL_CHARS.put(new Character('\"'), "rdblquote");
-        SPECIAL_CHARS.put(new Character('\\'), "\\");
-        SPECIAL_CHARS.put(new Character('{'), "{");
-        SPECIAL_CHARS.put(new Character('}'), "}");
-    }
-
     /** singleton pattern */
     private RtfStringConverter() {
     }
@@ -79,43 +60,47 @@
             return;
         }
+        String replacement;
+        char c, d;
         // TODO: could be made more efficient (binary lookup, etc.)
-        for (int i = 0; i < str.length(); i++) {
-            final Character c = new Character(str.charAt(i));
-            Character d;
-            String replacement;
-            if (i != 0) {
-                d = new Character(str.charAt(i - 1));
-            } else {
-                d = new Character(str.charAt(i));
+        for (int i = -1; ++i < str.length();) {
+            c = str.charAt(i);
+            switch (c) {
+            case '\"':
+            case '\'':
+                d = str.charAt((i == 0) ? i : i - 1);
+                if (d == ' ') {
+                    replacement = (c == '\"') ? "ldblquote" : "lquote";
+                } else {
+                    replacement = (c == '\"') ? "rdblquote" : "rquote";
+                }
+                break;
+            case '\t':
+                replacement = "tab";
+                break;
+            case '\n':
+                replacement = "line";
+                break;
+            case '\\':
+            case '{':
+            case '}':
+                replacement = Character.toString(c);
+                break;
+            default:
+                replacement = null;
             }
-            //This section modified by Chris Scott
-            //add "smart" quote recognition
- if (c.equals((Object)DBLQUOTE) && d.equals((Object) SPACE)) {
-                replacement = "ldblquote";
- } else if (c.equals((Object)QUOTE) && d.equals((Object) SPACE)) {
-                replacement = "lquote";
-            } else {
-                replacement = (String)SPECIAL_CHARS.get(c);
-            }
-
             if (replacement != null) {
                 // RTF-escaped char
-                w.write('\\');
-                w.write(replacement);
-                w.write(' ');
-            } else if (c.charValue() > 127) {
+                w.write('\\' + replacement + ' ');
+            } else if (c > 127) {
// write unicode representation - contributed by Michel Jacobson
                 // <[EMAIL PROTECTED]>
-                w.write("\\u");
-                w.write(Integer.toString((int)c.charValue()));
-                w.write("\\\'3f");
+                w.write("\\u" + (int) c + "\\\'3f");
             } else {
                 // plain char that is understood by RTF natively
-                w.write(c.charValue());
+                w.write(c);
             }
         }
     }
-
}

Reply via email to