On Feb 28, 2006, at 23:17, Andreas L Delmelle wrote:

<snip />
Is it allowed to use unicode escapes in control words? If so, the solution could be as simple as using RTFStringConverter to escape any 'text' if necessary.

In practice, my proposal would come down to

On that note, while browsing through the related sources, found some room for minor optimization in the RtfStringConverter itself. If this deals with many and/or large portions of text: see below.

If no one objects...

Cheers,

Andreas

Index: src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/ RtfStringConverter.java
===================================================================
--- src/java/org/apache/fop/render/rtf/rtflib/rtfdoc/ RtfStringConverter.java (revision 381394) +++ 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,50 @@
             return;
         }
+        StringBuffer sb = new StringBuffer();
+        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();) {
+            replacement = null;
+            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 = "" + c;
+                break;
+            default:
+                //nop
             }
-            //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) {
+                sb.append('\\').append(replacement).append(' ');
+            } 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");
+                sb.append("\\u").append((int) c).append("\\\'3f");
             } else {
                 // plain char that is understood by RTF natively
-                w.write(c.charValue());
+                sb.append(c);
             }
         }
+        w.write(sb.toString());
     }
-
}

Reply via email to