Version 1.2.4: fixes, new "Re-download" UI option
[fanfix.git] / src / be / nikiroo / fanfix / supported / BasicSupport.java
index b6fd1e277d67c3facbba0738b45f096f49d4734c..2b4715ab0beec0af04f5d52a70f88f55a61193fd 100644 (file)
@@ -60,7 +60,9 @@ public abstract class BasicSupport {
                /** Furry website with comics support */
                E621,
                /** CBZ files */
-               CBZ;
+               CBZ,
+               /** HTML files */
+               HTML;
 
                /**
                 * A description of this support type (more information than the
@@ -148,7 +150,7 @@ public abstract class BasicSupport {
 
        private InputStream in;
        private SupportType type;
-       private URL currentReferer; // with on 'r', as in 'HTTP'...
+       private URL currentReferer; // with only one 'r', as in 'HTTP'...
 
        // quote chars
        private char openQuote = Instance.getTrans().getChar(
@@ -285,7 +287,7 @@ public abstract class BasicSupport {
         */
        protected Story processMeta(URL url, boolean close, boolean getDesc)
                        throws IOException {
-               in = Instance.getCache().open(url, this, false);
+               in = openInput(url);
                if (in == null) {
                        return null;
                }
@@ -765,6 +767,21 @@ public abstract class BasicSupport {
                return url;
        }
 
+       /**
+        * Open the input file that will be used through the support.
+        * 
+        * @param source
+        *            the source {@link URL}
+        * 
+        * @return the {@link InputStream}
+        * 
+        * @throws IOException
+        *             in case of I/O error
+        */
+       protected InputStream openInput(URL source) throws IOException {
+               return Instance.getCache().open(source, this, false);
+       }
+
        protected InputStream reset(InputStream in) {
                try {
                        in.reset();
@@ -896,7 +913,7 @@ public abstract class BasicSupport {
         * 
         * @return the processed {@link Paragraph}
         */
-       private Paragraph processPara(String line) {
+       protected Paragraph processPara(String line) {
                line = ifUnhtml(line).trim();
 
                boolean space = true;
@@ -919,11 +936,16 @@ public abstract class BasicSupport {
 
                        if (tentativeCloseQuote) {
                                tentativeCloseQuote = false;
-                               if ((car >= 'a' && car <= 'z') || (car >= 'A' && car <= 'Z')
-                                               || (car >= '0' && car <= '9')) {
+                               if (Character.isLetterOrDigit(car)) {
                                        builder.append("'");
                                } else {
-                                       builder.append(closeQuote);
+                                       // handle double-single quotes as double quotes
+                                       if (prev == car) {
+                                               builder.append(closeDoubleQuote);
+                                               continue;
+                                       } else {
+                                               builder.append(closeQuote);
+                                       }
                                }
                        }
 
@@ -939,9 +961,21 @@ public abstract class BasicSupport {
                        case '\'':
                                if (space || (brk && quote)) {
                                        quote = true;
-                                       builder.append(openQuote);
-                               } else if (prev == ' ') {
-                                       builder.append(openQuote);
+                                       // handle double-single quotes as double quotes
+                                       if (prev == car) {
+                                               builder.deleteCharAt(builder.length() - 1);
+                                               builder.append(openDoubleQuote);
+                                       } else {
+                                               builder.append(openQuote);
+                                       }
+                               } else if (prev == ' ' || prev == car) {
+                                       // handle double-single quotes as double quotes
+                                       if (prev == car) {
+                                               builder.deleteCharAt(builder.length() - 1);
+                                               builder.append(openDoubleQuote);
+                                       } else {
+                                               builder.append(openQuote);
+                                       }
                                } else {
                                        // it is a quote ("I'm off") or a 'quote' ("This
                                        // 'good' restaurant"...)
@@ -994,7 +1028,13 @@ public abstract class BasicSupport {
                                        quote = true;
                                        builder.append(openQuote);
                                } else {
-                                       builder.append(openQuote);
+                                       // handle double-single quotes as double quotes
+                                       if (prev == car) {
+                                               builder.deleteCharAt(builder.length() - 1);
+                                               builder.append(openDoubleQuote);
+                                       } else {
+                                               builder.append(openQuote);
+                                       }
                                }
                                space = false;
                                brk = false;
@@ -1007,7 +1047,13 @@ public abstract class BasicSupport {
                        case '」':
                                space = false;
                                brk = false;
-                               builder.append(closeQuote);
+                               // handle double-single quotes as double quotes
+                               if (prev == car) {
+                                       builder.deleteCharAt(builder.length() - 1);
+                                       builder.append(closeDoubleQuote);
+                               } else {
+                                       builder.append(closeQuote);
+                               }
                                break;
 
                        case '«':
@@ -1105,8 +1151,8 @@ public abstract class BasicSupport {
                        }
                }
 
-               for (SupportType type : new SupportType[] { SupportType.TEXT,
-                               SupportType.INFO_TEXT }) {
+               for (SupportType type : new SupportType[] { SupportType.INFO_TEXT,
+                               SupportType.TEXT }) {
                        BasicSupport support = getSupport(type);
                        if (support != null && support.supports(url)) {
                                return support;
@@ -1142,6 +1188,8 @@ public abstract class BasicSupport {
                        return new E621().setType(type);
                case CBZ:
                        return new Cbz().setType(type);
+               case HTML:
+                       return new Html().setType(type);
                }
 
                return null;