rename 8chan to vichan, rework resolvables

disallows sites that were already added from being added again.
refactor-toolbar
Floens 8 years ago
parent c49d724330
commit 2ac934c7f9
  1. 10
      Clover/app/src/main/java/org/floens/chan/core/site/Resolvable.java
  2. 4
      Clover/app/src/main/java/org/floens/chan/core/site/Site.java
  3. 36
      Clover/app/src/main/java/org/floens/chan/core/site/SiteResolver.java
  4. 6
      Clover/app/src/main/java/org/floens/chan/core/site/Sites.java
  5. 96
      Clover/app/src/main/java/org/floens/chan/core/site/sites/chan4/Chan4.java
  6. 94
      Clover/app/src/main/java/org/floens/chan/core/site/sites/vichan/ViChan.java
  7. 4
      Clover/app/src/main/java/org/floens/chan/core/site/sites/vichan/ViChanParserHandler.java
  8. 6
      Clover/app/src/main/java/org/floens/chan/core/site/sites/vichan/ViChanReplyHttpCall.java

@ -1,14 +1,12 @@
package org.floens.chan.core.site;
import okhttp3.HttpUrl;
public interface Resolvable {
enum ResolveResult {
NO,
NAME_MATCH,
FULL_MATCH
}
boolean matchesName(String value);
ResolveResult matchesName(String value);
boolean respondsTo(HttpUrl url);
Class<? extends Site> getSiteClass();
}

@ -134,9 +134,9 @@ public interface Site {
SiteIcon icon();
boolean respondsTo(HttpUrl url);
Resolvable resolvable();
Loadable resolve(HttpUrl url);
Loadable resolveLoadable(HttpUrl url);
boolean feature(Feature feature);

@ -41,11 +41,24 @@ public class SiteResolver {
HttpUrl httpUrl = sanitizeUrl(url);
if (httpUrl == null) {
for (Site site : Sites.allSites()) {
Resolvable resolvable = site.resolvable();
if (resolvable.matchesName(url)) {
return site;
}
}
return null;
}
if (!httpUrl.scheme().equals("https")) {
httpUrl = httpUrl.newBuilder().scheme("https").build();
}
for (Site site : Sites.allSites()) {
if (site.respondsTo(httpUrl)) {
Resolvable resolvable = site.resolvable();
if (resolvable.respondsTo(httpUrl)) {
return site;
}
}
@ -60,12 +73,14 @@ public class SiteResolver {
if (httpUrl == null) {
for (Resolvable resolvable : resolvables) {
if (resolvable.matchesName(url) == Resolvable.ResolveResult.NAME_MATCH) {
return new SiteResolverResult(SiteResolverResult.Match.BUILTIN, resolvable.getSiteClass(), null);
if (resolvable.matchesName(url)) {
return new SiteResolverResult(SiteResolverResult.Match.BUILTIN,
resolvable.getSiteClass(), null);
}
}
return new SiteResolverResult(SiteResolverResult.Match.NONE, null, null);
return new SiteResolverResult(SiteResolverResult.Match.NONE,
null, null);
}
if (!httpUrl.scheme().equals("https")) {
@ -73,8 +88,9 @@ public class SiteResolver {
}
for (Resolvable resolvable : resolvables) {
if (resolvable.matchesName(httpUrl.toString()) == Resolvable.ResolveResult.FULL_MATCH) {
return new SiteResolverResult(SiteResolverResult.Match.BUILTIN, resolvable.getSiteClass(), null);
if (resolvable.respondsTo(httpUrl)) {
return new SiteResolverResult(SiteResolverResult.Match.BUILTIN,
resolvable.getSiteClass(), null);
}
}
@ -89,10 +105,12 @@ public class SiteResolver {
}
for (Site site : Sites.allSites()) {
Loadable resolved = site.resolve(httpUrl);
if (site.resolvable().respondsTo(httpUrl)) {
Loadable resolved = site.resolveLoadable(httpUrl);
if (resolved != null) {
return new LoadableResult(resolved);
if (resolved != null) {
return new LoadableResult(resolved);
}
}
}

@ -3,7 +3,7 @@ package org.floens.chan.core.site;
import android.util.SparseArray;
import org.floens.chan.core.site.sites.chan4.Chan4;
import org.floens.chan.core.site.sites.chan8.Chan8;
import org.floens.chan.core.site.sites.vichan.ViChan;
import java.util.ArrayList;
import java.util.Collections;
@ -18,14 +18,14 @@ public class Sites {
// find the correct class to use.
SITE_CLASSES.put(0, Chan4.class);
SITE_CLASSES.put(1, Chan8.class);
SITE_CLASSES.put(1, ViChan.class);
}
public static final List<Resolvable> RESOLVABLES = new ArrayList<>();
static {
RESOLVABLES.add(Chan4.RESOLVABLE);
RESOLVABLES.add(Chan8.RESOLVABLE);
RESOLVABLES.add(ViChan.RESOLVABLE);
}
private static List<Site> ALL_SITES = Collections.unmodifiableList(new ArrayList<Site>());

@ -63,20 +63,20 @@ import okhttp3.Request;
public class Chan4 extends SiteBase {
public static final Resolvable RESOLVABLE = new Resolvable() {
@Override
public ResolveResult matchesName(String value) {
switch (value) {
case "4chan":
return ResolveResult.NAME_MATCH;
case "https://4chan.org/":
return ResolveResult.FULL_MATCH;
default:
return ResolveResult.NO;
}
public Class<? extends Site> getSiteClass() {
return Chan4.class;
}
@Override
public Class<? extends Site> getSiteClass() {
return Chan4.class;
public boolean matchesName(String value) {
return value.equals("4chan");
}
@Override
public boolean respondsTo(HttpUrl url) {
return url.host().equals("4chan.org") ||
url.host().equals("www.4chan.org") ||
url.host().equals("boards.4chan.org");
}
};
@ -310,53 +310,49 @@ public class Chan4 extends SiteBase {
}
@Override
public boolean respondsTo(HttpUrl url) {
return url.host().equals("4chan.org") ||
url.host().equals("www.4chan.org") ||
url.host().equals("boards.4chan.org");
public Resolvable resolvable() {
return RESOLVABLE;
}
@Override
public Loadable resolve(HttpUrl url) {
if (respondsTo(url)) {
List<String> parts = url.pathSegments();
if (!parts.isEmpty()) {
String boardCode = parts.get(0);
Board board = board(boardCode);
if (board != null) {
if (parts.size() < 3) {
// Board mode
return loadableProvider.get(Loadable.forCatalog(board));
} else if (parts.size() >= 3) {
// Thread mode
int no = -1;
try {
no = Integer.parseInt(parts.get(2));
} catch (NumberFormatException ignored) {
}
public Loadable resolveLoadable(HttpUrl url) {
List<String> parts = url.pathSegments();
if (!parts.isEmpty()) {
String boardCode = parts.get(0);
Board board = board(boardCode);
if (board != null) {
if (parts.size() < 3) {
// Board mode
return loadableProvider.get(Loadable.forCatalog(board));
} else if (parts.size() >= 3) {
// Thread mode
int no = -1;
try {
no = Integer.parseInt(parts.get(2));
} catch (NumberFormatException ignored) {
}
int post = -1;
String fragment = url.fragment();
if (fragment != null) {
int index = fragment.indexOf("p");
if (index >= 0) {
try {
post = Integer.parseInt(fragment.substring(index + 1));
} catch (NumberFormatException ignored) {
}
int post = -1;
String fragment = url.fragment();
if (fragment != null) {
int index = fragment.indexOf("p");
if (index >= 0) {
try {
post = Integer.parseInt(fragment.substring(index + 1));
} catch (NumberFormatException ignored) {
}
}
}
if (no >= 0) {
Loadable loadable = loadableProvider.get(
Loadable.forThread(this, board, no));
if (post >= 0) {
loadable.markedNo = post;
}
return loadable;
if (no >= 0) {
Loadable loadable = loadableProvider.get(
Loadable.forThread(this, board, no));
if (post >= 0) {
loadable.markedNo = post;
}
return loadable;
}
}
}

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.core.site.sites.chan8;
package org.floens.chan.core.site.sites.vichan;
import android.support.annotation.Nullable;
@ -51,25 +51,23 @@ import okhttp3.Request;
import static org.floens.chan.Chan.injector;
public class Chan8 extends SiteBase {
private static final String TAG = "Chan8";
public class ViChan extends SiteBase {
private static final String TAG = "ViChan";
public static final Resolvable RESOLVABLE = new Resolvable() {
@Override
public ResolveResult matchesName(String value) {
switch (value) {
case "8chan":
return ResolveResult.NAME_MATCH;
case "https://8ch.net/":
return ResolveResult.FULL_MATCH;
default:
return ResolveResult.NO;
}
public Class<? extends Site> getSiteClass() {
return ViChan.class;
}
@Override
public Class<? extends Site> getSiteClass() {
return Chan8.class;
public boolean matchesName(String value) {
return value.equals("8chan") || value.equals("8ch");
}
@Override
public boolean respondsTo(HttpUrl url) {
return url.host().equals("8ch.net");
}
};
@ -187,48 +185,46 @@ public class Chan8 extends SiteBase {
}
@Override
public boolean respondsTo(HttpUrl url) {
return url.host().equals("8ch.net");
public Resolvable resolvable() {
return RESOLVABLE;
}
@Override
public Loadable resolve(HttpUrl url) {
if (respondsTo(url)) {
List<String> parts = url.pathSegments();
if (!parts.isEmpty()) {
String boardCode = parts.get(0);
Board board = board(boardCode);
if (board != null) {
if (parts.size() < 3) {
// Board mode
return loadableProvider.get(Loadable.forCatalog(board));
} else if (parts.size() >= 3) {
// Thread mode
int no = -1;
public Loadable resolveLoadable(HttpUrl url) {
List<String> parts = url.pathSegments();
if (!parts.isEmpty()) {
String boardCode = parts.get(0);
Board board = board(boardCode);
if (board != null) {
if (parts.size() < 3) {
// Board mode
return loadableProvider.get(Loadable.forCatalog(board));
} else if (parts.size() >= 3) {
// Thread mode
int no = -1;
try {
no = Integer.parseInt(parts.get(2).replace(".html", ""));
} catch (NumberFormatException ignored) {
}
int post = -1;
String fragment = url.fragment();
if (fragment != null) {
try {
no = Integer.parseInt(parts.get(2).replace(".html", ""));
post = Integer.parseInt(fragment);
} catch (NumberFormatException ignored) {
}
}
int post = -1;
String fragment = url.fragment();
if (fragment != null) {
try {
post = Integer.parseInt(fragment);
} catch (NumberFormatException ignored) {
}
if (no >= 0) {
Loadable loadable = loadableProvider.get(
Loadable.forThread(this, board, no));
if (post >= 0) {
loadable.markedNo = post;
}
if (no >= 0) {
Loadable loadable = loadableProvider.get(
Loadable.forThread(this, board, no));
if (post >= 0) {
loadable.markedNo = post;
}
return loadable;
}
return loadable;
}
}
}
@ -278,7 +274,7 @@ public class Chan8 extends SiteBase {
@Override
public ChanReader chanReader() {
FutabaChanParser parser = new FutabaChanParser(new Chan8ParserHandler());
FutabaChanParser parser = new FutabaChanParser(new ViChanParserHandler());
return new FutabaChanReader(parser);
}
@ -286,7 +282,7 @@ public class Chan8 extends SiteBase {
public void post(Reply reply, final PostListener postListener) {
// TODO
HttpCallManager httpCallManager = injector().instance(HttpCallManager.class);
httpCallManager.makeHttpCall(new Chan8ReplyHttpCall(this, reply),
httpCallManager.makeHttpCall(new ViChanReplyHttpCall(this, reply),
new HttpCall.HttpCallback<CommonReplyHttpCall>() {
@Override
public void onHttpSuccess(CommonReplyHttpCall httpPost) {

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.core.site.sites.chan8;
package org.floens.chan.core.site.sites.vichan;
import android.text.SpannableString;
@ -30,7 +30,7 @@ import org.jsoup.nodes.Element;
import java.util.Set;
public class Chan8ParserHandler extends DefaultFutabaChanParserHandler {
public class ViChanParserHandler extends DefaultFutabaChanParserHandler {
@Override
public CharSequence handleParagraph(FutabaChanParser parser, Theme theme, Post.Builder post, CharSequence text, Element element) {
if (element.hasClass("quote")) {

@ -15,7 +15,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.floens.chan.core.site.sites.chan8;
package org.floens.chan.core.site.sites.vichan;
import android.text.TextUtils;
@ -36,12 +36,12 @@ import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import okhttp3.Response;
public class Chan8ReplyHttpCall extends CommonReplyHttpCall {
public class ViChanReplyHttpCall extends CommonReplyHttpCall {
private static final Pattern REQUIRE_AUTHENTICATION = Pattern.compile(".*\"captcha\": ?true.*");
private static final Pattern ERROR_MESSAGE =
Pattern.compile(".*<h1>Error</h1>.*<h2[^>]*>(.*?)<\\/h2>.*");
public Chan8ReplyHttpCall(Site site, Reply reply) {
public ViChanReplyHttpCall(Site site, Reply reply) {
super(site, reply);
}
Loading…
Cancel
Save