eee15ceec791173b3ee0442d3afb1b368c16a1bc
[debian/jabref.git] / src / java / net / sf / jabref / export / layout / format / RTFChars.java
1 package net.sf.jabref.export.layout.format;
2
3 import net.sf.jabref.export.layout.*;
4 import net.sf.jabref.Globals;
5
6 public class RTFChars implements LayoutFormatter {
7
8
9   public String format(String field) {
10     int i;
11     field = firstFormat(field);
12
13     StringBuffer sb = new StringBuffer("");
14     StringBuffer currentCommand = null;
15     char c;
16     boolean escaped = false, incommand = false;
17     for (i=0; i<field.length(); i++) {
18       c = field.charAt(i);
19       if (escaped && (c == '\\')) {
20         sb.append('\\');
21         escaped = false;
22       }
23       else if (c == '\\') {
24         escaped = true;
25         incommand = true;
26         currentCommand = new StringBuffer();
27       }
28       else if (!incommand && (c=='{' || c=='}')) {
29         // Swallow the brace.
30       }
31       else if (Character.isLetter((char)c) ||
32                (Globals.SPECIAL_COMMAND_CHARS.indexOf(""+(char)c) >= 0)) {
33         escaped = false;
34         if (!incommand)
35           sb.append((char)c);
36           // Else we are in a command, and should not keep the letter.
37         else {
38           currentCommand.append( (char) c);
39
40           testCharCom: if ((currentCommand.length() == 1)
41               && (Globals.SPECIAL_COMMAND_CHARS.indexOf(currentCommand.toString()) >= 0)) {
42             // This indicates that we are in a command of the type \^o or \~{n}
43             if (i >= field.length()-1)
44               break testCharCom;
45
46             String command = currentCommand.toString();
47             i++;
48             c = field.charAt(i);
49             //System.out.println("next: "+(char)c);
50             String combody;
51             if (c == '{') {
52               IntAndString part = getPart(field, i);
53               i += part.i;
54               combody = part.s;
55             }
56             else {
57               combody = field.substring(i,i+1);
58               //System.out.println("... "+combody);
59             }
60             //System.out.println(command+combody);
61             Object result = Globals.RTFCHARS.get(command+combody);
62             
63             if (result != null)
64               sb.append((String)result);
65
66             incommand = false;
67             escaped = false;
68
69           }
70
71         }
72
73       }
74       else {
75         //if (!incommand || ((c!='{') && !Character.isWhitespace(c)))
76         testContent: if (!incommand || (!Character.isWhitespace(c) && (c != '{')))
77           sb.append((char)c);
78         else {
79           // First test if we are already at the end of the string.
80           if (i >= field.length()-1)
81             break testContent;
82
83           if (c == '{') {
84
85             String command = currentCommand.toString();
86             // Then test if we are dealing with a italics or bold command. If so, handle.
87             if (command.equals("emph") || command.equals("textit")) {
88               IntAndString part = getPart(field, i);
89               i += part.i;
90                 sb.append("}{\\i ").append(part.s).append("}{");
91             }
92             else if (command.equals("textbf")) {
93               IntAndString part = getPart(field, i);
94               i += part.i;
95                 sb.append("}{\\b ").append(part.s).append("}{");
96             }
97           } else
98             sb.append((char)c);
99
100         }
101         incommand = false;
102         escaped = false;
103       }
104     }
105
106     return sb.toString();
107         //field.replaceAll("\\\\emph", "").replaceAll("\\\\em", "").replaceAll("\\\\textbf", "");
108   }
109
110   private String firstFormat(String s) {
111     return s.replaceAll("&|\\\\&","&amp;");//.replaceAll("--", "&mdash;");
112   }
113
114   private IntAndString getPart(String text, int i) {
115     char c;
116     int count = 0;//, i=index;
117     StringBuffer part = new StringBuffer();
118     while ((count >= 0) && (i < text.length())) {
119       i++;
120       c = text.charAt(i);
121       if (c == '}')
122         count--;
123       else if (c == '{')
124         count++;
125
126       part.append((char)c);
127     }
128     //System.out.println("part: "+part.toString()+"\nformatted: "+format(part.toString()));
129     return new IntAndString(part.length(), format(part.toString()));
130   }
131
132   private class IntAndString{
133     public int i;
134     String s;
135     public IntAndString(int i, String s) {
136       this.i = i;
137       this.s = s;
138     }
139   }
140 }