PageRenderTime 55ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 0ms

/tool-support/src/latex/verbfilterScala.java

http://github.com/scala/scala-dist
Java | 325 lines | 311 code | 14 blank | 0 comment | 43 complexity | 6fdbddc523113f437efa5166491e8b8f MD5 | raw file
Possible License(s): Apache-2.0, BSD-3-Clause
  1. import java.io.*;
  2. public class verbfilterScala {
  3. static String[] reserved = {
  4. "abstract", "case", "catch", "class", "def",
  5. "do", "else", "extends", "false", "final",
  6. "finally", "for", "if", "implicit", "import",
  7. "match", "mixin", "new", "null",
  8. "object", "override", "package", "private",
  9. "protected", "requires", "return",
  10. "sealed", "super", "this", "throw",
  11. "trait", "true", "try", "type", "val",
  12. "var", "while", "with", "yield"};
  13. static final int TABINC = 8;
  14. final static String beginVerbatim = "\\begin{verbatim}";
  15. final static String endVerbatim = "\\end{verbatim}";
  16. final static String verb = "\\verb";
  17. static int lineCount, verbLine;
  18. static boolean startsWith(byte[] buf, int offset, String s) {
  19. int i = 0;
  20. while (i < s.length() && buf[offset+i] == s.charAt(i)) i++;
  21. return i == s.length();
  22. }
  23. static void writeString(OutputStream out, String s) throws IOException {
  24. for (int i = 0; i < s.length(); i++)
  25. out.write(s.charAt(i));
  26. }
  27. static int skipBlanks(byte[] buf, int offset) {
  28. while (buf[offset] == ' ') offset++;
  29. return offset;
  30. }
  31. static int compare(byte[] buf, int i, String key) {
  32. int j = 0;
  33. int l = key.length();
  34. while (i < buf.length && j < l) {
  35. char bch = (char)buf[i];
  36. char kch = key.charAt(j);
  37. if (bch < kch) return -1;
  38. else if (bch > kch) return 1;
  39. i++;
  40. j++;
  41. }
  42. if (j < l)
  43. return -1;
  44. else if (i < buf.length &&
  45. ('A' <= buf[i] && buf[i] <= 'Z' ||
  46. 'a' <= buf[i] && buf[i] <= 'z' ||
  47. '0' <= buf[i] && buf[i] <= '9' ||
  48. buf[i] == '_'))
  49. return 1;
  50. else
  51. return 0;
  52. }
  53. static int keyIndex(byte[] buf, int i, String[] keys) {
  54. int lo = 0;
  55. int hi = keys.length - 1;
  56. while (lo <= hi) {
  57. int mid = (hi + lo) / 2;
  58. int diff = compare(buf, i, keys[mid]);
  59. if (diff < 0) hi = mid - 1;
  60. else if (diff > 0) lo = mid + 1;
  61. else return mid;
  62. }
  63. return -1;
  64. }
  65. static int processLeadingWhitespace(byte[] buf,
  66. int i,
  67. OutputStream out) throws IOException {
  68. int col = 0;
  69. while (true) {
  70. if (buf[i] == ' ') {
  71. writeString(out, "~~"); i++; col++;
  72. } else if (buf[i] == '\t') {
  73. i++;
  74. do {
  75. writeString(out, "~~"); col++;
  76. } while (col % TABINC != 0);
  77. } else {
  78. return i;
  79. }
  80. }
  81. }
  82. static int processVerbatim(byte[] buf,
  83. int i,
  84. OutputStream out,
  85. String delimiter) throws IOException {
  86. verbLine = lineCount;
  87. int delimiter0 = delimiter.charAt(0);
  88. int j = skipBlanks(buf, i);
  89. if (buf[j] == '\n') { i = j+1; lineCount++; }
  90. i = processLeadingWhitespace(buf, i, out);
  91. while (true) {
  92. if (buf[i] == delimiter0 && startsWith(buf, i, delimiter))
  93. return i + delimiter.length();
  94. switch (buf[i]) {
  95. case ' ':
  96. writeString(out, "~");
  97. break;
  98. case '\n':
  99. writeString(out, "\n");
  100. j = i+1;
  101. lineCount++;
  102. if (buf[j] == delimiter0 && startsWith(buf, j, delimiter))
  103. return j + delimiter.length();
  104. writeString(out, "\\\\");
  105. if (buf[i+1] == '\n') {
  106. writeString(out, "[0.5em]"); i++;
  107. lineCount++;
  108. }
  109. i = processLeadingWhitespace(buf, i+1, out)-1;
  110. break;
  111. case '^':
  112. writeString(out, "\\^~$\\!\\!$");
  113. break;
  114. case '&':
  115. writeString(out, "\\&");
  116. break;
  117. case '*':
  118. writeString(out, "$*$");
  119. break;
  120. case '%':
  121. writeString(out, "$\\%$");
  122. break;
  123. case '_':
  124. writeString(out, "\\_");
  125. break;
  126. case '~':
  127. writeString(out, "\\~~$\\!\\!$");
  128. break;
  129. case '{':
  130. writeString(out, "{\\small\\{}");
  131. break;
  132. case '}':
  133. writeString(out, "{\\small\\}}");
  134. break;
  135. case '[':
  136. writeString(out, "$[$");
  137. //if (buf[i+1] == ']') out.write('~');
  138. break;
  139. case ']':
  140. writeString(out, "$]$");
  141. break;
  142. case '(':
  143. writeString(out, "$($");
  144. break;
  145. case ')':
  146. writeString(out, "$)$");
  147. break;
  148. case ':':
  149. if (i > 0 && Character.isJavaIdentifierPart((char)buf[i-1]))
  150. writeString(out, "\\,");
  151. writeString(out, "{\\rm :}");
  152. break;
  153. case '<':
  154. if (buf[i+1] == '=') {
  155. writeString(out, "$\\leq$"); i++;
  156. } else if (buf[i+1] == '-') {
  157. writeString(out, "$\\leftarrow$"); i++;
  158. } else if (buf[i+1] == '<') {
  159. writeString(out, "$<\\!$");
  160. } else {
  161. writeString(out, "$<$");
  162. }
  163. break;
  164. case '>':
  165. if (buf[i+1] == '=') {
  166. writeString(out, "$\\geq$"); i++;
  167. } else if (buf[i+1] == '>') {
  168. writeString(out, "$>\\!$");
  169. } else {
  170. writeString(out, "$>$");
  171. }
  172. break;
  173. case '=':
  174. if (buf[i+1] == '=') {
  175. writeString(out, "$==$"); i++;
  176. } else if (buf[i+1] == '>') {
  177. writeString(out, "$\\Rightarrow$"); i++;
  178. } else {
  179. out.write('=');
  180. }
  181. break;
  182. case '/':
  183. if (buf[i+1] == '/') {
  184. out.write ('/');
  185. do {
  186. out.write(buf[i+1]);
  187. i++;
  188. } while (buf[i+1] != '\n' &&
  189. (buf[i+1] != delimiter0 ||
  190. !startsWith(buf, i+1, delimiter)));
  191. } else {
  192. out.write('/');
  193. }
  194. break;
  195. case '-':
  196. if (buf[i+1] == '>') {
  197. writeString(out, "$\\rightarrow$");
  198. i++;
  199. } else {
  200. writeString(out, "$-$");
  201. }
  202. break;
  203. case '+':
  204. writeString(out, "$+$");
  205. break;
  206. case '|':
  207. writeString(out, "$\\,|$");
  208. break;
  209. case '#':
  210. writeString(out, "\\#");
  211. break;
  212. case '\\':
  213. if (buf[i+1] == '=' || buf[i+1] == '>') {
  214. out.write(buf[i]);
  215. i++;
  216. out.write(buf[i]);
  217. } else if (buf[i+1] == '$') {
  218. writeString(out, "\\$");
  219. i++;
  220. } else if (buf[i+1] == 'R') {
  221. writeString(out, "\\color{red}"); i++;
  222. } else if (buf[i+1] == 'S') {
  223. writeString(out, "\\color{black}"); i++;
  224. } else if (buf[i+1] == 'B') {
  225. writeString(out, "\\color{blue}"); i++;
  226. } else if (buf[i+1] == 'G') {
  227. writeString(out, "\\color{green}"); i++;
  228. } else {
  229. writeString(out, "$\\backslash$");
  230. }
  231. break;
  232. case '$':
  233. out.write(buf[i]);
  234. do {
  235. i++;
  236. out.write(buf[i]);
  237. } while (i + 1 < buf.length && buf[i] != '$');
  238. break;
  239. default:
  240. if (i == 0 || !Character.isJavaIdentifierPart((char)buf[i-1])) {
  241. int k = keyIndex(buf, i, reserved);
  242. if (k >= 0) {
  243. writeString(out, "{\\vem " + reserved[k] + "}");
  244. i = i + reserved[k].length() - 1;
  245. break;
  246. }
  247. }
  248. out.write(buf[i]);
  249. break;
  250. }
  251. i++;
  252. }
  253. }
  254. static void process(byte[] buf, OutputStream out) throws IOException {
  255. int i = 0;
  256. while (i < buf.length - 1) {
  257. if (buf[i] == '%') {
  258. do {
  259. out.write(buf[i]);
  260. i++;
  261. } while (buf[i] != '\n' && buf[i] != 0);
  262. } else if (startsWith(buf, i, beginVerbatim)) {
  263. writeString(out, "\\begin{program}");
  264. i = processVerbatim(buf, i + beginVerbatim.length(), out,
  265. endVerbatim);
  266. writeString(out, "\\end{program}");
  267. } else if (startsWith(buf, i, verb)) {
  268. writeString(out, "\\prog{");
  269. i = i + verb.length();
  270. char[] delimiterArray = {(char)buf[i]};
  271. String delimiter = new String(delimiterArray);
  272. i = processVerbatim(buf, i + 1, out, delimiter);
  273. writeString(out, "}");
  274. } else {
  275. if (buf[i] == '\n') lineCount++;
  276. out.write(buf[i]);
  277. i++;
  278. }
  279. }
  280. }
  281. public static void main(String[] argv) throws IOException {
  282. if (argv.length != 2) {
  283. String classname = new Error().getStackTrace()[0].getClassName();
  284. System.err.println(
  285. "Usage: " + classname + " <source-file> <destination-file>");
  286. System.exit(1);
  287. }
  288. InputStream in = new FileInputStream(new File(argv[0]));
  289. byte[] buf = new byte[in.available() + 1];
  290. in.read(buf, 0, buf.length-1);
  291. in.close();
  292. OutputStream out =
  293. new BufferedOutputStream(
  294. new FileOutputStream(
  295. new File(argv[1])));
  296. try {
  297. writeString(out,"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
  298. writeString(out,"% DO NOT EDIT. Automatically generated file! %\n");
  299. writeString(out,"%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
  300. writeString(out,"\n");
  301. lineCount = 1;
  302. process(buf, out);
  303. } catch (RuntimeException ex) {
  304. System.err.println ("\n **** error at line " + verbLine);
  305. throw ex;
  306. }
  307. out.close();
  308. }
  309. }