FimfictionApi: improve bbcode description handling
[fanfix.git] / src / be / nikiroo / fanfix / supported / FimfictionApi.java
index 591bbb08736c921333b885c19548c51e7d5c78c2..59b593ec7aecedea5cb24c4f91b10f6819b172d6 100644 (file)
@@ -159,7 +159,15 @@ class FimfictionApi extends BasicSupport {
 
        @Override
        protected String getDesc(URL source, InputStream in) {
-               return getKeyJson(json, 0, "type", "story", "description");
+               String desc = getKeyJson(json, 0, "type", "story", "description");
+
+               // TODO: if the description becomes available in html, use it
+               desc = desc.replace("\\r\\n", "<br/>");
+               desc = desc.replace("[i]", "_").replace("[/i]", "_")
+                               .replace("[b]", "*").replace("[/b]", "*");
+               desc = desc.replaceAll("\\[[^\\]]*\\]", "");
+
+               return desc;
        }
 
        @Override
@@ -281,6 +289,34 @@ class FimfictionApi extends BasicSupport {
                        return null;
                }
 
-               return getKeyText(json.substring(pos), "\"", null, "\"");
+               String result = null;
+               String wip = json.substring(pos);
+
+               pos = nextUnescapedQuote(wip, 0);
+               if (pos >= 0) {
+                       wip = wip.substring(pos + 1);
+                       pos = nextUnescapedQuote(wip, 0);
+                       if (pos >= 0) {
+                               result = wip.substring(0, pos);
+                       }
+               }
+
+               return result;
+       }
+
+       // next " but don't take \" into account
+       static private int nextUnescapedQuote(String result, int pos) {
+               while (pos >= 0) {
+                       pos = result.indexOf("\"", pos);
+                       if (pos == 0 || (pos > 0 && result.charAt(pos - 1) != '\\')) {
+                               break;
+                       }
+
+                       if (pos < result.length()) {
+                               pos++;
+                       }
+               }
+
+               return pos;
        }
 }