package com.prettifier.pretty.helper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.webkit.MimeTypeMap;
import com.fastaccess.data.dao.NameParser;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.helper.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by Kosh on 25 Dec 2016, 9:12 PM
*/
public class GithubHelper {
private static Pattern LINK_TAG_MATCHER = Pattern.compile("href=\"(.*?)\"");
private static Pattern IMAGE_TAG_MATCHER = Pattern.compile("src=\"(.*?)\"");
@NonNull public static String generateContent(@NonNull String source, @Nullable String baseUrl, boolean wrap, boolean dark) {
Logger.e(baseUrl);
if (baseUrl == null) {
return mergeContent(source, wrap, dark);
} else {
return mergeContent(validateImageBaseUrl(source, baseUrl), wrap, dark);
}
}
@NonNull private static String validateImageBaseUrl(@NonNull String source, @NonNull String baseUrl) {
NameParser nameParser = new NameParser(baseUrl);
String owner = nameParser.getUsername();
String repoName = nameParser.getName();
Matcher matcher = IMAGE_TAG_MATCHER.matcher(source);
while (matcher.find()) {
String src = matcher.group(1).trim();
if (src.startsWith("http://") || src.startsWith("https://")) {
continue;
}
String finalSrc = "https://raw.githubusercontent.com/" + owner + "/" + repoName + "/master/" + src;
source = source.replace("src=\"" + src + "\"", "src=\"" + finalSrc + "\"");
}
return validateLinks(source, baseUrl);
}
private static String validateLinks(@NonNull String source, @NonNull String baseUrl) {
NameParser nameParser = new NameParser(baseUrl);
String owner = nameParser.getUsername();
String repoName = nameParser.getName();
Matcher matcher = LINK_TAG_MATCHER.matcher(source);
while (matcher.find()) {
String href = matcher.group(1).trim();
if (href.startsWith("#") || href.startsWith("http://") || href.startsWith("https://") || href.startsWith("mailto:")) {
continue;
}
String link;
if (!InputHelper.isEmpty(MimeTypeMap.getFileExtensionFromUrl(href))) {
link = "https://raw.githubusercontent.com/" + owner + "/" + repoName + "/master/" + href; //assuming always master is bad :'(
} else {
String formattedLink = href.replaceFirst("./", "/");
link = "https://api.github.com/repos/" + owner + "/" + repoName +
(formattedLink.startsWith("/") ? formattedLink : ("/" + formattedLink));
}
source = source.replace("href=\"" + href + "\"", "href=\"" + link + "\"");
}
return source;
}
private static String mergeContent(@NonNull String source, boolean wrap, boolean dark) {
return "<html>\n" +
"\n" +
"<head>\n" +
" <meta charset=\"UTF-8\">\n" +
" <meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;\"/>" +
" <link rel=\"stylesheet\" type=\"text/css\" href=\"" + getStyle(dark, wrap) + "\">\n" +
" <script src=\"./intercept-hash.js\"></script>\n" +
"</head>\n" +
"\n" +
"<body>\n" +
source +
(!wrap ? "\n<script src=\"./intercept-touch.js\"></script>\n" : "\n") +
"</body>\n" +
"\n" +
"</html>\n";
}
private static String getStyle(boolean dark, boolean isWrap) {
return isWrap ? dark ? "./github_wrap_dark.css" : "./github_wrap.css" : dark ? "./github_dark.css" : "./github.css";
}
}