Merge branch 'subtree'
[fanfix.git] / src / be / nikiroo / fanfix / output / BasicOutput.java
index 9bf096cca1ef8f5b7e5594694dc88da558f2ec11..62a008c001b8b3697671079ab34b839fef74bf31 100644 (file)
@@ -12,6 +12,7 @@ import be.nikiroo.fanfix.data.Paragraph;
 import be.nikiroo.fanfix.data.Paragraph.ParagraphType;
 import be.nikiroo.fanfix.data.Story;
 import be.nikiroo.utils.Progress;
+import be.nikiroo.utils.Version;
 
 /**
  * This class is the base class used by the other output classes. It can be used
@@ -45,6 +46,7 @@ public abstract class BasicOutput {
 
                ;
 
+               @Override
                public String toString() {
                        return super.toString().toLowerCase();
                }
@@ -61,13 +63,13 @@ public abstract class BasicOutput {
                        StringId id = longDesc ? StringId.OUTPUT_DESC
                                        : StringId.OUTPUT_DESC_SHORT;
 
-                       String desc = Instance.getTrans().getStringX(id, this.name());
+                       String desc = Instance.getInstance().getTrans().getStringX(id, this.name());
 
                        if (desc == null) {
-                               desc = Instance.getTrans().getString(id, this);
+                               desc = Instance.getInstance().getTrans().getString(id, this.toString());
                        }
 
-                       if (desc == null) {
+                       if (desc == null || desc.isEmpty()) {
                                desc = this.toString();
                        }
 
@@ -78,14 +80,15 @@ public abstract class BasicOutput {
                 * The default extension to add to the output files.
                 * 
                 * @param readerTarget
-                *            the target to point to to read the {@link Story} (for
-                *            instance, the main entry point if this {@link Story} is in
-                *            a directory bundle)
+                *            TRUE to point to the main {@link Story} entry point for a
+                *            reader (for instance, the main entry point if this
+                *            {@link Story} is in a directory bundle), FALSE to point to
+                *            the main file even if it is a directory for instance
                 * 
                 * @return the extension
                 */
                public String getDefaultExtension(boolean readerTarget) {
-                       BasicOutput output = BasicOutput.getOutput(this, false);
+                       BasicOutput output = BasicOutput.getOutput(this, false, false);
                        if (output != null) {
                                return output.getDefaultExtension(readerTarget);
                        }
@@ -94,7 +97,8 @@ public abstract class BasicOutput {
                }
 
                /**
-                * Call {@link OutputType#valueOf(String.toUpperCase())}.
+                * Call {@link OutputType#valueOf(String)} after conversion to upper
+                * case.
                 * 
                 * @param typeName
                 *            the possible type name
@@ -107,42 +111,48 @@ public abstract class BasicOutput {
                }
 
                /**
-                * Call {@link OutputType#valueOf(String.toUpperCase())} but return NULL
-                * for NULL and empty instead of raising an exception.
+                * Call {@link OutputType#valueOf(String)} after conversion to upper
+                * case but return def for NULL and empty instead of raising an
+                * exception.
                 * 
                 * @param typeName
                 *            the possible type name
+                * @param def
+                *            the default value
                 * 
                 * @return NULL or the type
                 */
-               public static OutputType valueOfNullOkUC(String typeName) {
+               public static OutputType valueOfNullOkUC(String typeName, OutputType def) {
                        if (typeName == null || typeName.isEmpty()) {
-                               return null;
+                               return def;
                        }
 
                        return OutputType.valueOfUC(typeName);
                }
 
                /**
-                * Call {@link OutputType#valueOf(String.toUpperCase())} but return NULL
-                * in case of error instead of raising an exception.
+                * Call {@link OutputType#valueOf(String)} after conversion to upper
+                * case but return def in case of error instead of raising an exception.
                 * 
                 * @param typeName
                 *            the possible type name
+                * @param def
+                *            the default value
                 * 
                 * @return NULL or the type
                 */
-               public static OutputType valueOfAllOkUC(String typeName) {
+               public static OutputType valueOfAllOkUC(String typeName, OutputType def) {
                        try {
                                return OutputType.valueOfUC(typeName);
                        } catch (Exception e) {
-                               return null;
+                               return def;
                        }
                }
        }
 
        /** The creator name (this program, by me!) */
-       static final String EPUB_CREATOR = "Fanfix (by Niki)";
+       static protected final String EPUB_CREATOR = "Fanfix "
+                       + Version.getCurrentVersion() + " (by Niki)";
 
        /** The current best name for an image */
        private String imageName;
@@ -175,15 +185,19 @@ public abstract class BasicOutput {
                        throws IOException {
                storyPg = pg;
 
-               target = new File(target).getAbsolutePath();
-               File targetDir = new File(target).getParentFile();
-               String targetName = new File(target).getName();
-
-               String ext = getDefaultExtension(false);
-               if (ext != null && !ext.isEmpty()) {
-                       if (targetName.toLowerCase().endsWith(ext)) {
-                               targetName = targetName.substring(0,
-                                               targetName.length() - ext.length());
+               File targetDir = null;
+               String targetName = null;
+               if (target != null) {
+                       target = new File(target).getAbsolutePath();
+                       targetDir = new File(target).getParentFile();
+                       targetName = new File(target).getName();
+
+                       String ext = getDefaultExtension(false);
+                       if (ext != null && !ext.isEmpty()) {
+                               if (targetName.toLowerCase().endsWith(ext)) {
+                                       targetName = targetName.substring(0, targetName.length()
+                                                       - ext.length());
+                               }
                        }
                }
 
@@ -229,22 +243,42 @@ public abstract class BasicOutput {
                return type;
        }
 
+       /**
+        * Enable the creation of a .info file next to the resulting processed file.
+        * 
+        * @return TRUE to enable it
+        */
+       protected boolean isWriteInfo() {
+               return writeInfo;
+       }
+
+       /**
+        * Enable the creation of a cover file next to the resulting processed file
+        * if possible.
+        * 
+        * @return TRUE to enable it
+        */
+       protected boolean isWriteCover() {
+               return writeCover;
+       }
+
        /**
         * The output type.
         * 
         * @param type
         *            the new type
-        * @param infoCover
-        *            TRUE to enable the creation of a .info file and a cover if
-        *            possible
+        * @param writeCover
+        *            TRUE to enable the creation of a cover if possible
+        * @param writeInfo
+        *            TRUE to enable the creation of a .info file
         * 
         * @return this
         */
-       protected BasicOutput setType(OutputType type, boolean writeCover,
-                       boolean writeInfo) {
+       protected BasicOutput setType(OutputType type, boolean writeInfo,
+                       boolean writeCover) {
                this.type = type;
-               this.writeCover = writeCover;
                this.writeInfo = writeInfo;
+               this.writeCover = writeCover;
 
                return this;
        }
@@ -253,13 +287,15 @@ public abstract class BasicOutput {
         * The default extension to add to the output files.
         * 
         * @param readerTarget
-        *            the target to point to to read the {@link Story} (for
-        *            instance, the main entry point if this {@link Story} is in a
-        *            directory bundle)
+        *            TRUE to point to the main {@link Story} entry point for a
+        *            reader (for instance, the main entry point if this
+        *            {@link Story} is in a directory bundle), FALSE to point to the
+        *            main file even if it is a directory for instance
         * 
         * @return the extension
         */
-       public String getDefaultExtension(boolean readerTarget) {
+       public String getDefaultExtension(
+                       @SuppressWarnings("unused") boolean readerTarget) {
                return "";
        }
 
@@ -290,16 +326,16 @@ public abstract class BasicOutput {
 
                String chapterNameNum = String.format("%03d", 0);
                String paragraphNumber = String.format("%04d", 0);
-               imageName = paragraphNumber + "_" + chapterNameNum + ".png";
+               imageName = paragraphNumber + "_" + chapterNameNum;
 
                if (story.getMeta() != null) {
                        story.getMeta().setType("" + getType());
                }
 
-               if (writeCover) {
+               if (isWriteCover()) {
                        InfoCover.writeCover(targetDir, targetName, story.getMeta());
                }
-               if (writeInfo) {
+               if (isWriteInfo()) {
                        InfoCover.writeInfo(targetDir, targetName, story.getMeta());
                }
 
@@ -338,13 +374,13 @@ public abstract class BasicOutput {
 
                int num = 0;
                String paragraphNumber = String.format("%04d", num++);
-               imageName = chapterNameNum + "_" + paragraphNumber + ".png";
+               imageName = chapterNameNum + "_" + paragraphNumber;
 
                writeChapterHeader(chap);
                int i = 1;
                for (Paragraph para : chap) {
                        paragraphNumber = String.format("%04d", num++);
-                       imageName = chapterNameNum + "_" + paragraphNumber + ".png";
+                       imageName = chapterNameNum + "_" + paragraphNumber;
                        writeParagraph(para);
                        if (chapPg != null) {
                                chapPg.setProgress(i++);
@@ -359,6 +395,7 @@ public abstract class BasicOutput {
                writeParagraphFooter(para);
        }
 
+       @SuppressWarnings("unused")
        protected void writeTextLine(ParagraphType type, String line)
                        throws IOException {
        }
@@ -475,29 +512,33 @@ public abstract class BasicOutput {
         * 
         * @param type
         *            the type
-        * @param infoCover
-        *            force the <tt>.info</tt> file and the cover to be saved next
+        * @param writeCover
+        *            TRUE to enable the creation of a cover if possible to be saved
+        *            next to the main target file
+        * @param writeInfo
+        *            TRUE to enable the creation of a .info file to be saved next
         *            to the main target file
         * 
         * @return the {@link BasicOutput}
         */
-       public static BasicOutput getOutput(OutputType type, boolean infoCover) {
+       public static BasicOutput getOutput(OutputType type, boolean writeInfo,
+                       boolean writeCover) {
                if (type != null) {
                        switch (type) {
                        case EPUB:
-                               return new Epub().setType(type, infoCover, infoCover);
+                               return new Epub().setType(type, writeInfo, writeCover);
                        case TEXT:
-                               return new Text().setType(type, true, infoCover);
+                               return new Text().setType(type, writeInfo, true);
                        case INFO_TEXT:
                                return new InfoText().setType(type, true, true);
                        case SYSOUT:
                                return new Sysout().setType(type, false, false);
                        case CBZ:
-                               return new Cbz().setType(type, infoCover, infoCover);
+                               return new Cbz().setType(type, writeInfo, writeCover);
                        case LATEX:
-                               return new LaTeX().setType(type, infoCover, infoCover);
+                               return new LaTeX().setType(type, writeInfo, writeCover);
                        case HTML:
-                               return new Html().setType(type, infoCover, infoCover);
+                               return new Html().setType(type, writeInfo, writeCover);
                        }
                }