1 package eu.simuline.m2latex.core;
2
3 import java.io.File;
4 import java.util.Arrays;
5 import java.util.Collection;
6 import java.util.HashMap;
7 import java.util.Map;
8 import java.util.stream.Collectors;
9
10
11
12
13
14
15
16
17 enum Converter {
18
19 Maven {
20 String getCommand() {
21 return "mvn";
22 }
23
24 String getVersionPattern() {
25 return X_X_X;
26 }
27 String getVersionEnvironment() {
28 return "^Apache Maven %s";
29 }
30 ConverterCategory getCategory() {
31 return ConverterCategory.Unparametrized;
32 }
33 },
34 Ant {
35 String getCommand() {
36 return "ant";
37 }
38
39 String getVersionOption() {
40 return "-version";
41 }
42
43 String getVersionPattern() {
44 return X_X_X;
45 }
46
47 String getVersionEnvironment() {
48 return "^Apache Ant\\(TM\\) version %s";
49 }
50
51 ConverterCategory getCategory() {
52 return ConverterCategory.Unparametrized;
53 }
54 },
55 Java {
56 String getCommand() {
57 return "java";
58 }
59
60 String getVersionPattern() {
61 return V_JAVA;
62 }
63
64
65
66
67 String getVersionEnvironment() {
68 return "^openjdk %s \\d{4}-\\d{2}-\\d{2}";
69 }
70 ConverterCategory getCategory() {
71 return ConverterCategory.Unparametrized;
72 }
73 },
74 Python {
75 String getCommand() {
76 return "python";
77 }
78
79 String getVersionPattern() {
80 return X_X_X;
81 }
82
83 String getVersionEnvironment() {
84 return "^" + Python + " %s";
85 }
86 ConverterCategory getCategory() {
87 return ConverterCategory.Unparametrized;
88 }
89 },
90 Perl {
91 String getCommand() {
92 return "perl";
93 }
94 String getVersionPattern() {
95 return X_X_X;
96 }
97
98
99
100
101 String getVersionEnvironment() {
102 return "^.*\\RThis is " + getCommand() + " .* \\(v%s\\)";
103 }
104 ConverterCategory getCategory() {
105 return ConverterCategory.Unparametrized;
106 }
107 },
108 Lua {
109 String getCommand() {
110 return "lua";
111 }
112
113 String getVersionOption() {
114 return "-v";
115 }
116
117 String getVersionPattern() {
118 return X_X_X;
119 }
120
121
122
123
124 String getVersionEnvironment() {
125 return "^Lua %s Copyright \\(C\\) \\d{4}-\\d{4} Lua\\.org, PUC-Rio";
126 }
127 ConverterCategory getCategory() {
128 return ConverterCategory.Unparametrized;
129 }
130 },
131 PdfLatex {
132 String getCommand() {
133 return "pdflatex";
134 }
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153 String getVersionPattern() {
154
155
156 return X_X_X;
157 }
158
159
160
161
162
163 String getVersionEnvironment() {
164 return "^pdfTeX 3\\.\\d*-\\d+\\.\\d+-%s \\(TeX Live \\d{4}(?:/.+)?\\)";
165 }
166
167 ConverterCategory getCategory() {
168 return ConverterCategory.LaTeX;
169 }
170
171 },
172
173 LuaLatex {
174 String getCommand() {
175 return "lualatex";
176 }
177
178 String getVersionPattern() {
179 return X_X_X;
180 }
181
182
183 String getVersionEnvironment() {
184 return "^This is LuaHBTeX, Version %s \\(TeX Live \\d{4}(?:/.+)?\\)";
185 }
186
187 ConverterCategory getCategory() {
188 return ConverterCategory.LaTeX;
189 }
190 },
191 XeLatex {
192 String getCommand() {
193 return "xelatex";
194 }
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213 String getVersionPattern() {
214 return "((0\\.\\d*))";
215 }
216
217
218
219
220
221 String getVersionEnvironment() {
222 return "^XeTeX 3\\.\\d*-\\d+\\.\\d+-%s \\(TeX Live \\d{4}(?:/.+)?\\)";
223 }
224
225 ConverterCategory getCategory() {
226 return ConverterCategory.LaTeX;
227 }
228 },
229 Latex2rtf {
230 String getCommand() {
231 return "latex2rtf";
232 }
233
234 String getVersionOption() {
235 return "-v";
236 }
237
238 String getHelpOption() {
239 return "-h";
240 }
241
242 String getVersionPattern() {
243 return "((\\d+)\\.(\\d+)\\.(\\d+) r(\\d+))";
244 }
245
246 String getVersionEnvironment() {
247 return "^" + getCommand()
248 + " %s \\(released [A-Z][a-z]{2} \\d+, \\d{4}\\)\\R";
249 }
250
251 ConverterCategory getCategory() {
252 return ConverterCategory.LaTeX2Rtf;
253 }
254 },
255 Odt2doc {
256 String getCommand() {
257 return "odt2doc";
258 }
259
260
261 String getVersionPattern() {
262 return X_X_X;
263 }
264
265 String getVersionEnvironment() {
266
267 return "^(?:.*\\R.*\\R)?" + "unoconv %s\\R";
268 }
269
270 ConverterCategory getCategory() {
271 return ConverterCategory.Odt2Doc;
272 }
273
274 },
275 Dvips {
276 String getCommand() {
277 return "dvips";
278 }
279
280 String getVersionOption() {
281 return "-v";
282 }
283
284 String getVersionPattern() {
285 return "(([0-9\\.]{4})\\.(\\d))";
286 }
287
288 String getVersionEnvironment() {
289 return "^This is " + getCommand() + "\\(k\\) %s "
290 + "(?:\\(TeX Live \\d+\\) )?"
291 + "Copyright \\d+ Radical Eye Software \\(www\\.radicaleye\\.com\\)\\R";
292 }
293
294 ConverterCategory getCategory() {
295 return ConverterCategory.Unspecific;
296 }
297
298 },
299
300
301
302
303
304
305 Dvipdfm {
306 String getCommand() {
307 return "dvipdfm";
308 }
309
310 String getVersionPattern() {
311 return VYYYYMMDD;
312 }
313
314 String getVersionEnvironment() {
315 return "^This is " + getCommand()
316 + " Version %s by the DVIPDFMx project team,\\R";
317 }
318
319 ConverterCategory getCategory() {
320 return ConverterCategory.Dvi2Pdf;
321 }
322
323 },
324
325
326
327
328
329
330
331
332
333
334 Dvipdfmx {
335 String getCommand() {
336 return "dvipdfmx";
337 }
338
339 String getVersionPattern() {
340 return VYYYYMMDD;
341 }
342
343 String getVersionEnvironment() {
344 return "^This is " + getCommand()
345 + " Version %s by the DVIPDFMx project team,\\R";
346 }
347
348 ConverterCategory getCategory() {
349 return ConverterCategory.Dvi2Pdf;
350 }
351 },
352
353
354
355
356
357
358
359
360
361
362 XDvipdfmx {
363 String getCommand() {
364 return "xdvipdfmx";
365 }
366
367 String getVersionPattern() {
368 return VYYYYMMDD;
369 }
370
371 String getVersionEnvironment() {
372 return "^This is " + getCommand()
373 + " Version %s by the DVIPDFMx project team,\\R";
374 }
375
376 ConverterCategory getCategory() {
377 return ConverterCategory.Dvi2Pdf;
378 }
379 },
380
381
382
383
384
385
386
387
388
389
390
391 Dvipdft {
392 String getCommand() {
393 return "dvipdft";
394 }
395
396 String getVersionPattern() {
397 return "((\\d{4})(\\d{2})(\\d{2})\\.(\\d{4}))";
398 }
399
400 String getVersionEnvironment() {
401 return "^" + getCommand() + " version %s by Thomas Esser and others\\R";
402 }
403
404 ConverterCategory getCategory() {
405 return ConverterCategory.Dvi2Pdf;
406 }
407 },
408 GS {
409 String getCommand() {
410 return "gs";
411 }
412
413 String getVersionOption() {
414 return "--version";
415 }
416
417
418
419
420 String getVersionPattern() {
421
422 return X_X_X;
423 }
424
425 String getVersionEnvironment() {
426
427 return "^%s";
428 }
429
430 ConverterCategory getCategory() {
431 return ConverterCategory.Unspecific;
432 }
433 },
434 ChkTeX {
435 String getCommand() {
436 return "chktex";
437 }
438
439 String getVersionPattern() {
440 return X_X_X;
441 }
442
443 String getVersionEnvironment() {
444 return "^" + ChkTeX + " v%s - "
445 + "Copyright \\d{4}-\\d{2} Jens T. Berger Thielemann.\\R";
446 }
447
448 ConverterCategory getCategory() {
449 return ConverterCategory.LatexChk;
450 }
451 },
452 VeraPdf {
453 String getCommand() {
454 return "verapdf";
455 }
456
457 String getVersionPattern() {
458 return X_X_X;
459 }
460
461 String getVersionEnvironment() {
462 return "^veraPDF %s\\R";
463 }
464
465 ConverterCategory getCategory() {
466 return ConverterCategory.StandardValidator;
467 }
468
469 },
470 DiffPdfVisualLy {
471 String getCommand() {
472 return "diff-pdf-visually";
473 }
474
475 String getVersionPattern() {
476 return X_X_X;
477 }
478
479
480 String getVersionEnvironment() {
481
482 return "^" + getCommand() + " %s";
483 }
484
485
486 ConverterCategory getCategory() {
487 return ConverterCategory.DiffPdf;
488 }
489 },
490 DiffPdf {
491 String getCommand() {
492 return "diff-pdf";
493 }
494
495
496
497 String getVersionOption() {
498 return "-h";
499 }
500
501 String getVersionPattern() {
502 return VX;
503 }
504
505 String getVersionEnvironment() {
506
507 return "^Usage: .*\\R.*\\R.*\\R.*\\R.*\\R.*\\R.*\\R.*\\R"
508 + ".*\\w*rasterization resolution \\(default: %s dpi\\)";
509 }
510
511
512 ConverterCategory getCategory() {
513 return ConverterCategory.DiffPdf;
514 }
515 },
516 Diff {
517 String getCommand() {
518 return "diff";
519 }
520
521 String getVersionPattern() {
522 return VX_X;
523 }
524
525 String getVersionEnvironment() {
526
527 return "^" + getCommand() + " \\(GNU diffutils\\) %s";
528 }
529
530
531 ConverterCategory getCategory() {
532 return ConverterCategory.DiffPdf;
533 }
534 },
535 Pdf2txt {
536 String getCommand() {
537 return "pdftotext";
538 }
539
540 String getVersionOption() {
541 return "-v";
542 }
543
544 String getVersionPattern() {
545 return X_X_X;
546 }
547
548 String getVersionEnvironment() {
549 return "^" + getCommand() + " version %s\\R";
550 }
551
552 ConverterCategory getCategory() {
553 return ConverterCategory.Pdf2Txt;
554 }
555 },
556 PdfInfo {
557 String getCommand() {
558 return "pdfinfo";
559 }
560
561 String getVersionOption() {
562 return "-v";
563 }
564
565 String getVersionPattern() {
566 return X_X_X;
567 }
568
569 String getVersionEnvironment() {
570 return "^" + getCommand() + " version %s";
571 }
572
573
574 ConverterCategory getCategory() {
575 return ConverterCategory.MetaInfoPdf;
576 }
577 },
578 ExifTool {
579 String getCommand() {
580 return "exiftool";
581 }
582
583 String getVersionOption() {
584 return "-ver";
585 }
586
587 String getHelpOption() {
588 return "-h";
589 }
590
591 String getVersionPattern() {
592 return VX_X;
593 }
594
595 String getVersionEnvironment() {
596 return "^%s";
597 }
598
599
600
601 ConverterCategory getCategory() {
602 return ConverterCategory.Unspecific;
603 }
604 },
605 BibTeX {
606 String getCommand() {
607 return "bibtex";
608 }
609
610 String getVersionPattern() {
611 return "((0\\.\\d*)([a-z]))";
612 }
613
614 String getVersionEnvironment() {
615 return "^" + BibTeX + " %s \\(TeX Live \\d{4}(?:/.+)?\\)";
616 }
617
618 ConverterCategory getCategory() {
619 return ConverterCategory.BibTeX;
620 }
621 },
622 BibTeXu {
623 String getCommand() {
624 return "bibtexu";
625 }
626
627
628
629
630
631
632
633
634
635
636
637
638 String getVersionPattern() {
639 return VX_X;
640 }
641
642 String getVersionEnvironment() {
643 return "^This is " + BibTeXu + ": a UTF-8 Big " + BibTeX
644 + " version .* \\(TeX Live \\d{4}\\)\\R"
645 + "Implementation: .*\\R"
646 + "Release version: %s \\(\\d{2} [a-z]{3} \\d{4}\\)\\R";
647 }
648
649 ConverterCategory getCategory() {
650 return ConverterCategory.BibTeX;
651 }
652 },
653 BibTeX8 {
654 String getCommand() {
655 return "bibtex8";
656 }
657
658
659
660
661
662
663
664
665
666
667
668
669
670 String getVersionPattern() {
671 return VX_X;
672 }
673
674 String getVersionEnvironment() {
675 return "^This is 8-bit Big " + BibTeX
676 + " version .* \\(TeX Live \\d{4}\\)\\R"
677 + "Implementation: .*\\R"
678 + "Release version: %s \\(\\d{2} [a-z]{3} \\d{4}\\)\\R";
679 }
680
681 ConverterCategory getCategory() {
682 return ConverterCategory.BibTeX;
683 }
684 },
685 Makeindex {
686 String getCommand() {
687 return "makeindex";
688 }
689
690 String getVersionOption() {
691 return TexFileUtils.getEmptyIdx().getName().toString();
692 }
693
694 String getVersionPattern() {
695 return VX_X;
696 }
697
698 String getVersionEnvironment() {
699 return "^This is " + getCommand() + ", version %s "
700 + "\\[TeX Live \\d{4}\\] \\(kpathsea \\+ Thai support\\).\\R";
701 }
702
703 ConverterCategory getCategory() {
704 return ConverterCategory.MakeIndex;
705 }
706
707 },
708
709 Upmendex {
710 String getCommand() {
711 return "upmendex";
712 }
713
714 String getVersionOption() {
715 return "-h";
716 }
717
718 String getVersionPattern() {
719 return VD;
720 }
721
722 String getVersionEnvironment() {
723 return "^" + getCommand()
724 + " - index processor, version %s \\(TeX Live \\d{4}\\).\\R";
725 }
726
727 ConverterCategory getCategory() {
728 return ConverterCategory.Unspecific;
729 }
730
731 },
732 Xindex {
733 String getCommand() {
734 return "xindex";
735 }
736
737 String getVersionPattern() {
738 return VD;
739 }
740
741 String getVersionEnvironment() {
742 return "^" + getCommand()
743 + " version %s\\R";
744 }
745
746 ConverterCategory getCategory() {
747 return ConverterCategory.Unspecific;
748 }
749
750 },
751
752 Xindy {
753 String getCommand() {
754 return "xindy";
755 }
756
757
758 String getVersionPattern() {
759 return X_X_X;
760 }
761
762 String getVersionEnvironment() {
763 return "^" + getCommand() + " release: %s\\R";
764 }
765
766 ConverterCategory getCategory() {
767 return ConverterCategory.Unspecific;
768 }
769 },
770 Splitindex {
771 String getCommand() {
772 return "splitindex";
773 }
774
775 String getVersionPattern() {
776 return VX_X;
777 }
778
779 String getVersionEnvironment() {
780 return "^" + getCommand() + ".pl %s\\R";
781 }
782
783 ConverterCategory getCategory() {
784 return ConverterCategory.SplitIndex;
785 }
786 },
787 Makeglossaries {
788 String getCommand() {
789 return "makeglossaries";
790 }
791
792 String getVersionPattern() {
793 return VD;
794 }
795
796 String getVersionEnvironment() {
797 return "^" + Makeglossaries + " Version %s "
798 + "\\(\\d{4}-\\d{2}-\\d{2}\\)\\R";
799 }
800
801 ConverterCategory getCategory() {
802 return ConverterCategory.MakeGlossaries;
803 }
804 },
805 Bib2Gls {
806 String getCommand() {
807 return "bib2gls";
808 }
809
810 String getVersionPattern() {
811 return VD;
812 }
813
814 String getVersionEnvironment() {
815 return "^" + Bib2Gls.getCommand() + " version %s "
816 + "\\(\\d{4}-\\d{2}-\\d{2}\\)\\R";
817 }
818
819 ConverterCategory getCategory() {
820 return ConverterCategory.Unspecific;
821 }
822 },
823
824 PythonTeX {
825 String getCommand() {
826 return "pythontex";
827 }
828
829 String getVersionPattern() {
830 return VX_X;
831 }
832
833 String getVersionEnvironment() {
834 return "^" + PythonTeX + " %s\\R";
835 }
836
837 ConverterCategory getCategory() {
838 return ConverterCategory.Pythontex;
839 }
840 },
841
842 DePythonTeX {
843 String getCommand() {
844 return "depythontex";
845 }
846
847 String getVersionPattern() {
848 return VX_X;
849 }
850
851 String getVersionEnvironment() {
852 return "^" + DePythonTeX + " %s\\R";
853 }
854
855
856 ConverterCategory getCategory() {
857 return ConverterCategory.DePythontex;
858 }
859 },
860
861 Latexmk {
862 String getCommand() {
863 return "latexmk";
864 }
865
866 String getVersionPattern() {
867 return "((\\d+)\\.(\\d+)([a-z]?))";
868 }
869
870 String getVersionEnvironment() {
871 return "^(?:.*\\R)*" + Latexmk
872 + ", John Collins, .*\\d+ [A-Z][a-z]+\\.? \\d+. Version %s\\R";
873 }
874
875 ConverterCategory getCategory() {
876 return ConverterCategory.Latexmk;
877 }
878 },
879 MetaPost {
880 String getCommand() {
881 return "mpost";
882 }
883
884 String getVersionPattern() {
885 return VX_X;
886 }
887
888 String getVersionEnvironment() {
889 return "^" + MetaPost + " %s \\(TeX Live \\d{4}(?:/.+)?\\)";
890 }
891
892 ConverterCategory getCategory() {
893 return ConverterCategory.MetaPost;
894 }
895 },
896 Extractbb {
897 String getCommand() {
898 return "extractbb";
899 }
900
901
902 String getVersionPattern() {
903 return X_X_X;
904
905 }
906
907 String getVersionEnvironment() {
908 return "^" + Extractbb.getCommand() + ".lua v%s \\(\\d{4}-\\d{2}-\\d{2}\\)";
909
910 }
911
912 ConverterCategory getCategory() {
913 return ConverterCategory.EbbCmd;
914 }
915 },
916 Gnuplot {
917 String getCommand() {
918 return "gnuplot";
919 }
920
921 String getVersionPattern() {
922 return "((\\d+)\\.(\\d+) patchlevel (\\d+))";
923 }
924
925 String getVersionEnvironment() {
926 return "^" + getCommand() + " %s\\R";
927 }
928
929 ConverterCategory getCategory() {
930 return ConverterCategory.Gnuplot2Dev;
931 }
932 },
933 Inkscape {
934 String getCommand() {
935 return "inkscape";
936 }
937
938 String getVersionPattern() {
939 return X_X_X;
940 }
941
942
943 String getVersionEnvironment() {
944 return "^(?:.*\\R)?"
945
946 + Inkscape + " %s \\((?:[0-9a-f]+, \\d{4}-\\d{2}-\\d{2}|unknown)\\)\\R";
947 }
948
949 ConverterCategory getCategory() {
950 return ConverterCategory.Svg2Dev;
951 }
952 },
953 Fig2Dev {
954 String getCommand() {
955 return "fig2dev";
956 }
957
958 String getVersionOption() {
959 return "-V";
960
961 }
962
963 String getHelpOption() {
964 return "-h";
965 }
966
967 String getVersionPattern() {
968 return "((\\d+)\\.(\\d+)\\.(\\d+)([a-z])?)";
969 }
970
971 String getVersionEnvironment() {
972 return "^" + getCommand() + " Version %s\\R";
973 }
974
975 ConverterCategory getCategory() {
976 return ConverterCategory.Fig2Dev;
977 }
978
979 };
980
981
982
983
984 private final static String X_X_X = "((\\d+)\\.(\\d+)\\.(\\d+))";
985
986
987
988
989
990
991 private final static String V_JAVA = "((\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?(?:\\\\.(\\d+))?)";
992
993
994
995
996 private final static String VX_X = "((\\d+)\\.(\\d+))";
997
998
999
1000
1001 private final static String VX = "((\\d+))";
1002
1003
1004
1005
1006
1007
1008
1009 private final static String VD = "((\\d+\\.\\d+))";
1010
1011
1012
1013
1014 private final static String VYYYYMMDD = "((\\d{4})(\\d{2})(\\d{2}))";
1015
1016
1017 private final static Map<String, Converter> cmd2conv;
1018 static {
1019 cmd2conv = new HashMap<String, Converter>();
1020 for (Converter conv : Converter.values()) {
1021 cmd2conv.put(conv.getCommand(), conv);
1022 }
1023 }
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035 public static Converter cmd2Conv(String cmd) {
1036 return cmd2conv.get(cmd);
1037 }
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050 static String toCommandsString(Collection<Converter> convs) {
1051 return convs.stream().map(x -> x.getCommand())
1052 .collect(Collectors.joining(", "));
1053 }
1054
1055
1056
1057
1058
1059
1060
1061 static String toCommandsString() {
1062 return toCommandsString(Arrays.asList(Converter.values()));
1063 }
1064
1065
1066
1067
1068
1069
1070
1071
1072 abstract String getCommand();
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086 String getVersionOption() {
1087 return "--version";
1088 }
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098 String getHelpOption() {
1099 return "--help";
1100 }
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113 abstract String getVersionPattern();
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125 abstract String getVersionEnvironment();
1126
1127
1128 abstract ConverterCategory getCategory();
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161 String getVersionInfo(CommandExecutor executor) throws BuildFailureException {
1162 return executor.executeEnvR0(TexFileUtils.getEmptyIdx().getParentFile(), null,
1163 getCommand(), new String[] {getVersionOption()}).output;
1164 }
1165
1166 }