1
20 package org.crosswire.jsword.book.sword;
21
22 import java.util.regex.Pattern;
23
24 import org.crosswire.common.util.Language;
25 import org.crosswire.common.util.Version;
26 import org.crosswire.jsword.book.BookCategory;
27 import org.crosswire.jsword.book.BookMetaData;
28
29
61 enum ConfigEntryType {
62
65 DATA_PATH(SwordBookMetaData.KEY_DATA_PATH) {
66 @Override
67 public boolean isAllowed(String value) {
68 return true;
69 }
70 },
71
72
75 DESCRIPTION(SwordBookMetaData.KEY_DESCRIPTION),
76
77
80 MOD_DRV(SwordBookMetaData.KEY_MOD_DRV,
81 "RawText",
82 "zText",
83 "RawCom",
84 "RawCom4",
85 "zCom",
86 "HREFCom",
87 "RawFiles",
88 "RawLD",
89 "RawLD4",
90 "zLD",
91 "RawGenBook"
92 ),
93
94
98 COMPRESS_TYPE(SwordBookMetaData.KEY_COMPRESS_TYPE,
99 "LZSS",
100 "ZIP",
101 "GZIP",
102 "BZIP2",
103 "XZ"
104 ),
105
106
109 BLOCK_TYPE(SwordBookMetaData.KEY_BLOCK_TYPE,
110 "BOOK",
111 "CHAPTER",
112 "VERSE"
113 ),
114
115
119 BLOCK_COUNT(SwordBookMetaData.KEY_BLOCK_COUNT) {
120 @Override
121 public boolean isText() {
122 return false;
123 }
124
125 @Override
126 public boolean isAllowed(String aValue) {
127 try {
128 Integer.parseInt(aValue);
129 return true;
130 } catch (NumberFormatException e) {
131 return false;
132 }
133 }
134
135 @Override
136 public Object convert(String input) {
137 try {
138 return Integer.valueOf(input);
139 } catch (NumberFormatException e) {
140 return getDefault();
141 }
142 }
143 },
144
145
148 KEY_TYPE(SwordBookMetaData.KEY_KEY_TYPE,
149 "TreeKey",
150 "VerseKey"
151 ),
152
153
156 CASE_SENSITIVE_KEYS(SwordBookMetaData.KEY_CASE_SENSITIVE_KEYS,
157 "true",
158 "false"
159 )
160 {
161 @Override
162 public boolean isText() {
163 return false;
164 }
165
166 @Override
167 public Object convert(String input) {
168 return Boolean.valueOf(input);
169 }
170 },
171
172
176 CIPHER_KEY(SwordBookMetaData.KEY_CIPHER_KEY),
177
178
181 VERSIFICATION(BookMetaData.KEY_VERSIFICATION,
182 "Catholic",
183 "Catholic2",
184 "German",
185 "KJV",
186 "KJVA",
187 "LXX",
188 "Leningrad",
189 "Luther",
190 "MT",
191 "NRSV",
192 "NRSVA",
193 "Orthodox",
194 "Synodal",
195 "SynodalProt",
196 "Vulg"
197 ),
198
199
203 GLOBAL_OPTION_FILTER(SwordBookMetaData.KEY_GLOBAL_OPTION_FILTER,
204 "GBFStrongs",
205 "GBFFootnotes",
206 "GBFMorph",
207 "GBFHeadings",
208 "GBFRedLetterWords",
209 "GBFScripref", "ThMLStrongs",
211 "ThMLFootnotes",
212 "ThMLScripref",
213 "ThMLMorph",
214 "ThMLHeadings",
215 "ThMLVariants",
216 "ThMLLemma",
217 "UTF8Cantillation",
218 "UTF8GreekAccents",
219 "UTF8HebrewPoints",
220 "UTF8ArabicPoints",
221 "OSISLemma",
222 "OSISMorphSegmentation",
223 "OSISStrongs",
224 "OSISFootnotes",
225 "OSISScripref",
226 "OSISMorph",
227 "OSISHeadings",
228 "OSISVariants",
229 "OSISRedLetterWords",
230 "OSISGlosses",
231 "OSISRuby", "OSISXlit",
233 "OSISEnum",
234 "OSISReferenceLinks|*",
235 "OSISDictionary" )
237 {
238 @Override
239 public boolean mayRepeat() {
240 return true;
241 }
242 },
243
244
247 SIGLUM1(SwordBookMetaData.KEY_SIGLUM1),
248 SIGLUM2(SwordBookMetaData.KEY_SIGLUM2),
249 SIGLUM3(SwordBookMetaData.KEY_SIGLUM3),
250 SIGLUM4(SwordBookMetaData.KEY_SIGLUM4),
251 SIGLUM5(SwordBookMetaData.KEY_SIGLUM5),
252
257 DIRECTION(SwordBookMetaData.KEY_DIRECTION,
258 "LtoR",
259 "RtoL",
260 "bidi"
261 ),
262
263
267 SOURCE_TYPE(SwordBookMetaData.KEY_SOURCE_TYPE,
268 "Plaintext",
269 "GBF",
270 "ThML",
271 "OSIS",
272 "TEI"
273 ),
274
275
281 ENCODING(SwordBookMetaData.KEY_ENCODING,
282 "Latin-1",
283 "UTF-8",
284 "UTF-16",
285 "SCSU"
286 ),
287
288
292 DISPLAY_LEVEL(SwordBookMetaData.KEY_DISPLAY_LEVEL) {
293 @Override
294 public boolean isText() {
295 return false;
296 }
297
298 @Override
299 public boolean isAllowed(String value) {
300 try {
301 Integer.parseInt(value);
302 return true;
303 } catch (NumberFormatException e) {
304 return false;
305 }
306 }
307
308 @Override
309 public Object convert(String input) {
310 try {
311 return Integer.valueOf(input);
312 } catch (NumberFormatException e) {
313 return null;
314 }
315 }
316 },
317
318
321 FONT(BookMetaData.KEY_FONT),
322
323
327 OSIS_Q_TO_TICK(SwordBookMetaData.KEY_OSIS_Q_TO_TICK,
328 "true",
329 "false"
330 )
331 {
332 @Override
333 public boolean isText() {
334 return false;
335 }
336
337 @Override
338 public Object convert(String input) {
339 return Boolean.valueOf(input);
340 }
341 },
342
343
346 FEATURE(SwordBookMetaData.KEY_FEATURE,
347 "StrongsNumbers",
348 "GreekDef",
349 "HebrewDef",
350 "GreekParse",
351 "HebrewParse",
352 "DailyDevotion",
353 "Glossary",
354 "Images",
355 "NoParagraphs"
356 )
357 {
358 @Override
359 public boolean mayRepeat() {
360 return true;
361 }
362 },
363
364
368 GLOSSARY_FROM(SwordBookMetaData.KEY_GLOSSARY_FROM) {
369 @Override
370 public boolean isText() {
371 return false;
372 }
373
374 @Override
375 public Object convert(String input) {
376 return new Language(input);
377 }
378
379 @Override
380 public String unconvert(Object internal) {
381 if (internal instanceof Language) {
382 return ((Language) internal).getGivenSpecification();
383 }
384 return super.unconvert(internal);
385 }
386 },
387
388
392 GLOSSARY_TO(SwordBookMetaData.KEY_GLOSSARY_TO) {
393 @Override
394 public boolean isText() {
395 return false;
396 }
397
398 @Override
399 public Object convert(String input) {
400 return new Language(input);
401 }
402
403 @Override
404 public String unconvert(Object internal) {
405 if (internal instanceof Language) {
406 return ((Language) internal).getGivenSpecification();
407 }
408 return super.unconvert(internal);
409 }
410 },
411
412
416 PREFERRED_CSS_XHTML(SwordBookMetaData.KEY_PREFERRED_CSS_XHTML),
417
418
422 STRONGS_PADDING(SwordBookMetaData.KEY_STRONGS_PADDING),
423
424
427 ABBREVIATION(SwordBookMetaData.KEY_ABBREVIATION),
428
429
432 ABOUT(SwordBookMetaData.KEY_ABOUT) {
433 @Override
434 public boolean allowsContinuation() {
435 return true;
436 }
437
438 @Override
439 public boolean allowsRTF() {
440 return true;
441 }
442 },
443
444
447 VERSION(SwordBookMetaData.KEY_VERSION) {
448 @Override
449 public boolean isText() {
450 return false;
451 }
452
453 @Override
454 public boolean isAllowed(String aValue) {
455 try {
456 new Version(aValue);
457 return true;
458 } catch (IllegalArgumentException e) {
459 return false;
460 }
461 }
462
463 @Override
464 public Object convert(String input) {
465 try {
466 return new Version(input);
467 } catch (IllegalArgumentException e) {
468 return null;
469 }
470 }
471 },
472
473
479 HISTORY(SwordBookMetaData.KEY_HISTORY) {
480 @Override
481 public boolean mayRepeat() {
482 return true;
483 }
484 },
485
486
490 MINIMUM_VERSION(SwordBookMetaData.KEY_MINIMUM_VERSION),
491
492
495 CATEGORY(BookMetaData.KEY_CATEGORY,
496 "Other",
497 "Daily Devotional",
498 "Glossaries",
499 "Cults / Unorthodox / Questionable Material",
500 "Essays",
501 "Maps",
502 "Images",
503 "Biblical Texts",
504 "Commentaries",
505 "Lexicons / Dictionaries",
506 "Generic Books"
507 )
508 {
509 @Override
510 public Object convert(String input) {
511 return BookCategory.fromString(input);
512 }
513 },
514
515
519 LCSH(SwordBookMetaData.KEY_LCSH),
520
521
524 LANG(BookMetaData.KEY_LANG) {
525 @Override
526 public boolean isText() {
527 return false;
528 }
529
530 @Override
531 public Object convert(String input) {
532 return new Language(input);
533 }
534
535 @Override
536 public String unconvert(Object internal) {
537 if (internal instanceof Language) {
538 return ((Language) internal).getGivenSpecification();
539 }
540 return super.unconvert(internal);
541 }
542 },
543
544
548 INSTALL_SIZE(SwordBookMetaData.KEY_INSTALL_SIZE) {
549 @Override
550 public boolean isText() {
551 return false;
552 }
553
554 @Override
555 public boolean isAllowed(String value) {
556 try {
557 Integer.parseInt(value);
558 return true;
559 } catch (NumberFormatException e) {
560 return false;
561 }
562 }
563
564 @Override
565 public Object convert(String input) {
566 try {
567 return Integer.valueOf(input);
568 } catch (NumberFormatException e) {
569 return null;
570 }
571 }
572 },
573
574
578 SWORD_VERSION_DATE(SwordBookMetaData.KEY_SWORD_VERSION_DATE) {
579 @Override
580 public boolean isAllowed(String value) {
581 return validDatePattern.matcher(value).matches();
582 }
583
584 private Pattern validDatePattern = Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
585 },
586
587
592 OBSOLETES(SwordBookMetaData.KEY_OBSOLETES) {
593 @Override
594 public boolean mayRepeat() {
595 return true;
596 }
597 },
598
599
603 OSIS_VERSION(SwordBookMetaData.KEY_OSIS_VERSION),
604
605
608 COPYRIGHT(SwordBookMetaData.KEY_COPYRIGHT) {
609 @Override
610 public boolean allowsContinuation() {
611 return true;
612 }
613 },
614
615
618 COPYRIGHT_HOLDER(SwordBookMetaData.KEY_COPYRIGHT_HOLDER),
619
620
624 COPYRIGHT_DATE(SwordBookMetaData.KEY_COPYRIGHT_DATE) {
625 @Override
626 public boolean isAllowed(String value) {
627 return validDatePattern.matcher(value).matches();
628 }
629
630 private Pattern validDatePattern = Pattern.compile("\\d{4}(\\s*-\\s*\\d{4})?(\\s*,\\s*\\d{4}(\\s*-\\s*\\d{4})?)*");
631 },
632
633
636 COPYRIGHT_NOTES(SwordBookMetaData.KEY_COPYRIGHT_NOTES) {
637 @Override
638 public boolean allowsContinuation() {
639 return true;
640 }
641
642 @Override
643 public boolean allowsRTF() {
644 return true;
645 }
646 },
647
648
651 COPYRIGHT_CONTACT_NAME(SwordBookMetaData.KEY_COPYRIGHT_CONTACT_NAME) {
652 @Override
653 public boolean allowsContinuation() {
654 return true;
655 }
656
657 @Override
658 public boolean allowsRTF() {
659 return true;
660 }
661 },
662
663
666 COPYRIGHT_CONTACT_NOTES(SwordBookMetaData.KEY_COPYRIGHT_CONTACT_NOTES) {
667 @Override
668 public boolean allowsContinuation() {
669 return true;
670 }
671
672 @Override
673 public boolean allowsRTF() {
674 return true;
675 }
676 },
677
678
681 COPYRIGHT_CONTACT_ADDRESS(SwordBookMetaData.KEY_COPYRIGHT_CONTACT_ADDRESS) {
682 @Override
683 public boolean allowsContinuation() {
684 return true;
685 }
686
687 @Override
688 public boolean allowsRTF() {
689 return true;
690 }
691 },
692
693
696 COPYRIGHT_CONTACT_EMAIL(SwordBookMetaData.KEY_COPYRIGHT_CONTACT_EMAIL),
697
698
701 SHORT_PROMO(SwordBookMetaData.KEY_SHORT_PROMO) {
702 @Override
703 public boolean allowsHTML() {
704 return true;
705 }
706 },
707
708
711 SHORT_COPYRIGHT(SwordBookMetaData.KEY_SHORT_COPYRIGHT),
712
713
716 DISTRIBUTION_LICENSE(SwordBookMetaData.KEY_DISTRIBUTION_LICENSE,
717 "Public Domain",
718 "Copyrighted",
719 "Copyrighted; Free non-commercial distribution",
720 "Copyrighted; Permission to distribute granted to *",
721 "Copyrighted; Freely distributable",
722 "Copyrighted; Permission granted to distribute non-commercially in SWORD format",
723 "GFDL",
724 "GPL",
725 "Creative Commons: by-nc-nd*",
726 "Creative Commons: by-nc-sa*",
727 "Creative Commons: by-nc*",
728 "Creative Commons: by-nd*",
729 "Creative Commons: by-sa*",
730 "Creative Commons: by*",
731 "Creative Commons: CC0*",
732 "General public license for distribution for any purpose" ),
734
735
738 DISTRIBUTION_NOTES(SwordBookMetaData.KEY_DISTRIBUTION_NOTES) {
739 @Override
740 public boolean allowsContinuation() {
741 return true;
742 }
743 },
744
745
748 TEXT_SOURCE(SwordBookMetaData.KEY_TEXT_SOURCE) {
749 @Override
750 public boolean allowsContinuation() {
751 return true;
752 }
753 },
754
755
758 UNLOCK_URL(SwordBookMetaData.KEY_UNLOCK_URL),
759
760
764 DISTRIBUTION_SOURCE(SwordBookMetaData.KEY_DISTRIBUTION_SOURCE) {
765 @Override
766 public boolean allowsContinuation() {
767 return true;
768 }
769 },
770
771
774 LOCAL_STRIP_FILTER(SwordBookMetaData.KEY_LOCAL_STRIP_FILTER),
775
776
779 SEARCH_OPTION(SwordBookMetaData.KEY_SEARCH_OPTION),
780
781
785 SCOPE(BookMetaData.KEY_SCOPE),
786
787
791 BOOK_LIST(BookMetaData.KEY_BOOKLIST);
792
793
796 ConfigEntryType(String name) {
797 this.name = name;
798 this.picks = null;
799 String defValue = SwordBookMetaData.DEFAULTS.get(name);
800 this.defaultValue = defValue == null ? null : convert(defValue);
801 }
802
803
806 ConfigEntryType(String name, String... picks) {
807 this.name = name;
808 this.picks = picks;
809 String defValue = SwordBookMetaData.DEFAULTS.get(name);
810 this.defaultValue = defValue == null ? null : convert(defValue);
811 }
812
813
818 public boolean isText() {
819 return true;
820 }
821
822
830 public boolean isAllowed(String value) {
831 if (value == null) {
832 return false;
833 }
834 if (hasChoices()) {
835 for (String item : picks) {
836 String val = value;
837 String pick = item;
838 if (pick.endsWith("*")) {
842 int len = pick.length() - 1;
843 pick = pick.substring(0, len);
844 if (val.length() > len) {
845 val = val.substring(0, len);
846 }
847 }
848 if (pick.equalsIgnoreCase(val)) {
849 return true;
850 }
851 }
852
853 return false;
854 }
855 return true;
856 }
857
858
865 public String filter(String value) {
866 if (hasChoices()) {
868 for (String pick : picks) {
870 if (pick.equals(value)) {
871 return value;
872 }
873 }
874
875 for (String pick : picks) {
877 if (pick.equalsIgnoreCase(value)) {
878 return pick;
879 }
880 }
881 }
882
883 return value;
884 }
885
886
891 public boolean allowsRTF() {
892 return false;
893 }
894
895
900 public boolean allowsHTML() {
901 return false;
902 }
903
904
911 public boolean allowsContinuation() {
912 return false;
913 }
914
915
921 public boolean mayRepeat() {
922 return false;
923 }
924
925
931 protected boolean hasChoices() {
932 return picks != null;
933 }
934
935
940 public Object getDefault() {
941 return defaultValue;
942 }
943
944
951 public Object convert(String input) {
952 return input;
953 }
954
955
961 public String unconvert(Object internal) {
962 if (internal == null) {
963 return null;
964 }
965 return internal.toString();
966 }
967
968
974 public static ConfigEntryType fromString(String name) {
975 if (name != null) {
976 if (name.startsWith(ConfigEntryType.HISTORY.toString())) {
978 return ConfigEntryType.HISTORY;
979 }
980
981 for (ConfigEntryType o : ConfigEntryType.values()) {
982 if (name.equals(o.name)) {
983 return o;
984 }
985 }
986 }
987
988 return null;
993 }
994
995 @Override
996 public String toString() {
997 return name;
998 }
999
1000
1003 private final String name;
1004
1005
1008 private final Object defaultValue;
1009
1010
1013 private final String[] picks;
1014
1015
1018 public static final String DIRECTION_LTOR = "LtoR";
1019 public static final String DIRECTION_RTOL = "RtoL";
1020 public static final String DIRECTION_BIDI = "bidi";
1021
1022}
1023