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 }
|