Latex2UnicodeSpecials.java
001 /* This file is part of the project "Hilbert II" - http://www.qedeq.org
002  *
003  * Copyright 2000-2013,  Michael Meyling <mime@qedeq.org>.
004  *
005  * "Hilbert II" is free software; you can redistribute
006  * it and/or modify it under the terms of the GNU General Public
007  * License as published by the Free Software Foundation; either
008  * version 2 of the License, or (at your option) any later version.
009  *
010  * This program is distributed in the hope that it will be useful,
011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
013  * GNU General Public License for more details.
014  */
015 
016 package org.qedeq.kernel.bo.service.unicode;
017 
018 
019 /**
020  * Special LaTeX into UTF-8 transformations.
021  *
022  @author  Michael Meyling
023  */
024 public final class Latex2UnicodeSpecials {
025 
026     /** Available subscript characters. */
027     private static final String SUBSCRIPT_CHARACTERS = "0123456789()+-=";
028 
029     /** Available superscript characters. */
030     private static final String SUPERSCRIPT_CHARACTERS = "0123456789()+-=n";
031 
032     /**
033      * Constructor.
034      */
035     private Latex2UnicodeSpecials() {
036         // never used
037     }
038 
039     /**
040      * Transform into bold characters.
041      *
042      @param   token   String to transform.
043      @return  Result of transformation.
044      */
045     public static String transform2Bold(final String token) {
046         final StringBuffer buffer = new StringBuffer();
047         for (int i = 0; i < token.length(); i++) {
048             final char c = token.charAt(i);
049             switch (c) {
050             case 'A':
051             case 'B':
052             case 'C':
053             case 'D':
054             case 'E':
055             case 'F':
056             case 'G':
057             case 'H':
058             case 'I':
059             case 'J':
060             case 'K':
061             case 'L':
062             case 'M':
063             case 'N':
064             case 'O':
065             case 'P':
066             case 'Q':
067             case 'R':
068             case 'S':
069             case 'T':
070             case 'U':
071             case 'V':
072             case 'W':
073             case 'X':
074             case 'Y':
075             case 'Z':
076                 buffer.append((char) ('\uFF21' 'A' + c));
077                 break;
078             case 'a':
079             case 'b':
080             case 'c':
081             case 'd':
082             case 'e':
083             case 'f':
084             case 'g':
085             case 'h':
086             case 'i':
087             case 'j':
088             case 'k':
089             case 'l':
090             case 'm':
091             case 'n':
092             case 'o':
093             case 'p':
094             case 'q':
095             case 'r':
096             case 's':
097             case 't':
098             case 'u':
099             case 'v':
100             case 'w':
101             case 'x':
102             case 'y':
103             case 'z':
104                 buffer.append((char) ('\uFF41' 'a' + c));
105                 break;
106             default:
107                 buffer.append(c);
108             }
109         }
110         return buffer.toString();
111     }
112 
113     /**
114      * Transform into mathfrak characters.
115      *
116      @param   token   String to transform.
117      @return  Result of transformation.
118      */
119     public static String transform2Mathfrak(final String token) {
120         final StringBuffer buffer = new StringBuffer();
121         for (int i = 0; i < token.length(); i++) {
122             final char c = token.charAt(i);
123             switch (c) {
124             case 'A': buffer.append("\u13AF");
125                 break;
126             case 'B': buffer.append("\u212C");
127                 break;
128             case 'b': buffer.append("\u13B2");
129                 break;
130             case 'C': buffer.append("\u212D");
131                 break;
132             case 'E': buffer.append("\u2130");
133                 break;
134             case 'e': buffer.append("\u212F");
135                 break;
136             case 'F': buffer.append("\u2131");
137                 break;
138             case 'G': buffer.append("\u13B6");
139                 break;
140             case 'g': buffer.append("\u210A");
141                 break;
142             case 'L': buffer.append("\u2112");
143                 break;
144             case 'l': buffer.append("\u2113");
145                 break;
146             case 'M': buffer.append("\u2133");
147                 break;
148             case 'o': buffer.append("\u2134");
149                 break;
150             case 'P': buffer.append("\u2118");
151                 break;
152             case 'R': buffer.append("\u211B");
153                 break;
154             case 'S': buffer.append("\u093D");
155                 break;
156             case 's': buffer.append("\u0D1F");
157                 break;
158             case 'T': buffer.append("\u01AC");
159                 break;
160             case 'V': buffer.append("\u01B2");
161                 break;
162             case 'Y': buffer.append("\u01B3");
163             break;
164             case 'Z': buffer.append("\u2128");
165                 break;
166             default:
167                 buffer.append(c);
168             }
169         }
170         return buffer.toString();
171     }
172 
173     /**
174      * Transform into subscript characters.
175      *
176      @param   content String to transform.
177      @return  Result of transformation.
178      */
179     public static String transform2Subscript(final String content) {
180         final StringBuffer buffer = new StringBuffer();
181         boolean supported = true;
182         for (int i = 0; i < content.length(); i++) {
183             if (SUBSCRIPT_CHARACTERS.indexOf(content.charAt(i)) 0) {
184                 supported = false;
185                 break;
186             }
187         }
188         if (!supported) {
189             if (content.length() == 1) {
190                 buffer.append("_" + content);
191             else {
192                 buffer.append("_(" + content + ")");
193             }
194         else {
195             for (int i = 0; i < content.length(); i++) {
196                 final char c = content.charAt(i);
197                 switch (c) {
198                 case '0':
199                 case '1':
200                 case '2':
201                 case '3':
202                 case '4':
203                 case '5':
204                 case '6':
205                 case '7':
206                 case '8':
207                 case '9':
208                     buffer.append((char) (c - '0' '\u2080'));
209                     break;
210                 case '+':
211                     buffer.append('\u208A');
212                     break;
213                 case '-':
214                     buffer.append('\u208B');
215                     break;
216                 case '=':
217                     buffer.append('\u208C');
218                     break;
219                 case '(':
220                     buffer.append('\u208D');
221                     break;
222                 case ')':
223                     buffer.append('\u208E');
224                     break;
225                 default:
226                     buffer.append(c);
227                 }
228             }
229         }
230         return buffer.toString();
231     }
232 
233     /**
234      * Transform into superscript characters.
235      *
236      @param   content String to transform.
237      @return  Result of transformation.
238      */
239     public static String transform2Superscript(final String content) {
240         final StringBuffer buffer = new StringBuffer();
241         boolean supported = true;
242         for (int i = 0; i < content.length(); i++) {
243             if (SUPERSCRIPT_CHARACTERS.indexOf(content.charAt(i)) 0) {
244                 supported = false;
245                 break;
246             }
247         }
248         if (!supported) {
249             if (content.length() == 1) {
250                 buffer.append("^" + content);
251             else {
252                 buffer.append("^(" + content + ")");
253             }
254         else {
255             for (int i = 0; i < content.length(); i++) {
256                 final char c = content.charAt(i);
257                 switch (c) {
258                 case '0':
259                     buffer.append((char) (c - '0' '\u2070'));
260                     break;
261                 case '1':
262                     buffer.append((char) (c - '0' '\u00B9'));
263                     break;
264                 case '2':
265                     buffer.append((char) (c - '0' '\u00B2'));
266                     break;
267                 case '3':
268                     buffer.append((char) (c - '0' '\u00B3'));
269                     break;
270                 case '4':
271                 case '5':
272                 case '6':
273                 case '7':
274                 case '8':
275                 case '9':
276                     buffer.append((char) (c - '4' '\u2074'));
277                     break;
278                 case '+':
279                     buffer.append('\u207A');
280                     break;
281                 case '-':
282                     buffer.append('\u207B');
283                     break;
284                 case '=':
285                     buffer.append('\u207C');
286                     break;
287                 case '(':
288                     buffer.append('\u207D');
289                     break;
290                 case ')':
291                     buffer.append('\u207E');
292                     break;
293                 case 'n':
294                     buffer.append('\u207F');
295                     break;
296                 default:
297                     buffer.append(c);
298                 }
299             }
300         }
301         return buffer.toString();
302     }
303 
304     /**
305      * Transform into emph characters.
306      *
307      @param   token   String to transform.
308      @return  Result of transformation.
309      */
310     public static String transform2Emph(final String token) {
311         final StringBuffer buffer = new StringBuffer();
312         for (int i = 0; i < token.length(); i++) {
313 //            buffer.append('\u2006');
314             buffer.append(' ');
315             buffer.append(token.charAt(i));
316         }
317         return buffer.toString();
318     }
319 }