Moving HighlightJS into app. (#477)
Final fixes and improvements. Fixing crash of app in Android 5.0 Removing unused theme. Moving HighlightJS to app. Reviewed-on: https://gitea.com/gitnex/GitNex/pulls/477 Reviewed-by: M M Arif <mmarif@swatian.com>
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
package org.mian.gitnex.helpers.highlightjs;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.content.Context;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.webkit.WebSettings;
|
||||
import android.webkit.WebView;
|
||||
|
||||
import org.mian.gitnex.helpers.highlightjs.models.Language;
|
||||
import org.mian.gitnex.helpers.highlightjs.models.Theme;
|
||||
import org.mian.gitnex.helpers.highlightjs.utils.SourceUtils;
|
||||
|
||||
/**
|
||||
* This Class was created by Patrick J
|
||||
* on 09.06.16. (modified by opyale)
|
||||
*/
|
||||
|
||||
public class HighlightJsView extends WebView {
|
||||
|
||||
private Language language = Language.AUTO_DETECT;
|
||||
private Theme theme = Theme.DEFAULT;
|
||||
|
||||
private boolean zoomSupport = false;
|
||||
private boolean showLineNumbers = true;
|
||||
private TextWrap textWrap = TextWrap.NO_WRAP;
|
||||
|
||||
public HighlightJsView(Context context) {
|
||||
|
||||
super(context);
|
||||
setup();
|
||||
}
|
||||
|
||||
public HighlightJsView(Context context, AttributeSet attrs) {
|
||||
|
||||
super(context, attrs);
|
||||
setup();
|
||||
}
|
||||
|
||||
public HighlightJsView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
|
||||
super(context, attrs, defStyleAttr);
|
||||
setup();
|
||||
}
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
private void setup() {
|
||||
|
||||
WebSettings settings = getSettings();
|
||||
|
||||
settings.setJavaScriptEnabled(true);
|
||||
settings.setBuiltInZoomControls(true);
|
||||
settings.setSupportZoom(zoomSupport);
|
||||
settings.setDisplayZoomControls(false);
|
||||
|
||||
setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
|
||||
|
||||
}
|
||||
|
||||
private void changeZoomSettings(boolean enable) {
|
||||
|
||||
this.zoomSupport = enable;
|
||||
getSettings().setSupportZoom(enable);
|
||||
}
|
||||
|
||||
public void setSource(String source) {
|
||||
|
||||
source = (source == null) ? " " : source;
|
||||
|
||||
String html_content = SourceUtils.generateContent(source, theme.getName(), language.getName(), zoomSupport, showLineNumbers, textWrap);
|
||||
loadDataWithBaseURL("file:///android_asset/", html_content, "text/html", "utf-8", null);
|
||||
|
||||
}
|
||||
|
||||
public void refresh() {
|
||||
|
||||
super.reload();
|
||||
}
|
||||
|
||||
public void setHighlightLanguage(Language language) {
|
||||
this.language = language;
|
||||
}
|
||||
|
||||
public void setTheme(Theme theme) {
|
||||
this.theme = theme;
|
||||
}
|
||||
|
||||
public void setTextWrap(TextWrap textWrap) {
|
||||
this.textWrap = textWrap;
|
||||
}
|
||||
|
||||
public Language getHighlightLanguage() {
|
||||
return language;
|
||||
}
|
||||
|
||||
public Theme getTheme() {
|
||||
return theme;
|
||||
}
|
||||
|
||||
public void setZoomSupportEnabled(boolean supportZoom) {
|
||||
changeZoomSettings(supportZoom);
|
||||
}
|
||||
|
||||
public void setShowLineNumbers(boolean showLineNumbers) {
|
||||
this.showLineNumbers = showLineNumbers;
|
||||
}
|
||||
|
||||
public enum TextWrap {
|
||||
NO_WRAP, WORD_WRAP, BREAK_ALL
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
package org.mian.gitnex.helpers.highlightjs.models;
|
||||
|
||||
/**
|
||||
* This Class was created by Patrick J
|
||||
* on 09.06.16.
|
||||
*/
|
||||
|
||||
public enum Language {
|
||||
AUTO_DETECT(null),
|
||||
DISABLE_HIGHLIGHT("nohighlight"),
|
||||
_1C("1c"),
|
||||
ABNF("abnf"),
|
||||
ACCESS_LOGS("accesslog"),
|
||||
ADA("ada"),
|
||||
ARM_ASSEMBLER("arm"),
|
||||
AVR_ASSEMBLER("avrasm"),
|
||||
ACTION_SCRIPT("actionscript"),
|
||||
APACHE("apache"),
|
||||
APPLE_SCRIPT("applescript"),
|
||||
ASCII_DOC("asciidoc"),
|
||||
ASPECT_J("aspectj"),
|
||||
AUTO_HOTKEY("autohotkey"),
|
||||
AUTO_IT("autoit"),
|
||||
AXAPTA("axapta"),
|
||||
AWK("awk"),
|
||||
BASH("bash"),
|
||||
SHELL("sh"),
|
||||
ZSH("zsh"),
|
||||
BASIC("basic"),
|
||||
BNF("bnf"),
|
||||
BRAINFUCK("brainfuck"),
|
||||
C("c"),
|
||||
C_SHARP("csharp"),
|
||||
C_PLUS_PLUS("cpp"),
|
||||
CACHE_OBJECT_SCRIPT("cos"),
|
||||
C_MAKE("cmake"),
|
||||
COQ("coq"),
|
||||
CSP("csp"),
|
||||
CSS("css"),
|
||||
CAPTAIN_PROTO("capnproto"),
|
||||
CLEAN("clean"),
|
||||
CLOJURE("clojure"),
|
||||
COFFEE_SCRIPT("coffeescript"),
|
||||
CRMSH("crmsh"),
|
||||
CRYSTAL("crystal"),
|
||||
D("d"),
|
||||
DNS_ZONE_FILE("dns"),
|
||||
DOS("dos"),
|
||||
BATCH("bat"),
|
||||
DART("dart"),
|
||||
DELPHI("delphi"),
|
||||
DIFF("diff"),
|
||||
DJANGO("django"),
|
||||
DOCKER_FILE("dockerfile"),
|
||||
DSCONFIG("dsconfig"),
|
||||
DTS("dts"),
|
||||
DUST("dust"),
|
||||
EBNF("ebnf"),
|
||||
ELIXIR("elixir"),
|
||||
ELM("elm"),
|
||||
ERLANG("erlang"),
|
||||
EXCEL("excel"),
|
||||
F_SHARP("fsharp"),
|
||||
FIX("fix"),
|
||||
FLIX("flix"),
|
||||
FORTRAN("fortran"),
|
||||
G_CODE("gcode"),
|
||||
GAMS("gams"),
|
||||
GAUSS("gauss"),
|
||||
GHERKIN("gherkin"),
|
||||
GO("go"),
|
||||
GOLO("golo"),
|
||||
GRADLE("gradle"),
|
||||
GROOVY("groovy"),
|
||||
HTML("html"),
|
||||
XML("xml"),
|
||||
HTTP("http"),
|
||||
HAML("haml"),
|
||||
HANDLEBARS("hbs"),
|
||||
HASKELL("hs"),
|
||||
HAXE("hx"),
|
||||
HY("hy"),
|
||||
INI("ini"),
|
||||
INFORM7("i7"),
|
||||
IRPF90("irpf90"),
|
||||
JSON("json"),
|
||||
JAVA("java"),
|
||||
JAVA_SCRIPT("javascript"),
|
||||
LASSO("lasso"),
|
||||
LEAF("leaf"),
|
||||
LESS("less"),
|
||||
LDIF("ldif"),
|
||||
LISP("lisp"),
|
||||
LIVE_CODE_SERVER("livecodeserver"),
|
||||
LIVE_SCRIPT("livescript"),
|
||||
LLVM("llvm"),
|
||||
LUA("lua"),
|
||||
MAKEFILE("makefile"),
|
||||
MARKDOWN("md"),
|
||||
MATHEMATICA("mma"),
|
||||
MATLAB("matlab"),
|
||||
MAXIMA("maxima"),
|
||||
MAYA_EMBEDDED_LANGUAGE("mel"),
|
||||
MERCURY("mercury"),
|
||||
MIZAR("mizar"),
|
||||
MOJOLICIOUS("mojolicious"),
|
||||
MONKEY("monkey"),
|
||||
MOONSCRIPT("moonscript"),
|
||||
N1QL("n1ql"),
|
||||
NSIS("nsis"),
|
||||
NGINX("nginx"),
|
||||
NIMROD("nimrod"),
|
||||
NIX("nix"),
|
||||
O_CAML("ocaml"),
|
||||
OBJECTIVE_C("objectivec"),
|
||||
OPENGL_SHADING_LANGUAGE("glsl"),
|
||||
OPEN_SCAD("scad"),
|
||||
ORACLE_RULES_LANGUAGE("ruleslanguage"),
|
||||
OXYGENE("oxygene"),
|
||||
PF("pf"),
|
||||
PHP("php"),
|
||||
PARSER3("parser3"),
|
||||
PERL("perl"),
|
||||
PONY("pony"),
|
||||
POWER_SHELL("ps"),
|
||||
PROCESSING("processing"),
|
||||
PROLOG("prolog"),
|
||||
PROTOCOL_BUFFERS("protobuf"),
|
||||
PUPPET("pp"),
|
||||
PYTHON("python"),
|
||||
PYTHON_PROFILER_RESULTS("profile"),
|
||||
Q("k"),
|
||||
QML("qml"),
|
||||
R("r"),
|
||||
RENDER_MAN_RIB("rib"),
|
||||
RENDER_MAN_RSL("rsl"),
|
||||
ROBOCONF("roboconf"),
|
||||
RUBY("ruby"),
|
||||
RUST("rust"),
|
||||
SCSS("scss"),
|
||||
SQL("sql"),
|
||||
STEP_PART_21("p21"),
|
||||
SCALA("scala"),
|
||||
SCHEME("scheme"),
|
||||
SCILAB("sci"),
|
||||
SMALI("smali"),
|
||||
SMALLTALK("smalltalk"),
|
||||
STAN("stan"),
|
||||
STATA("stata"),
|
||||
STYLUS("stylus"),
|
||||
SUB_UNIT("subunit"),
|
||||
SWIFT("swift"),
|
||||
TEST_ANYTHING_PROTOCOL("tap"),
|
||||
TCL("tcl"),
|
||||
TEX("tex"),
|
||||
THRIFT("thrift"),
|
||||
TP("tp"),
|
||||
TWIG("twig"),
|
||||
TYPE_SCRIPT("typescript"),
|
||||
VB_NET("vbnet"),
|
||||
VB_SCRIPT("vbscript"),
|
||||
VHDL("vhdl"),
|
||||
VALA("vala"),
|
||||
VERILOG("v"),
|
||||
VIM("vim"),
|
||||
X86_ASSEMBLY("x86asm"),
|
||||
XL("xl"),
|
||||
X_QUERY("xq"),
|
||||
ZEPHIR("zep");
|
||||
|
||||
private final String className;
|
||||
|
||||
Language(String name) {
|
||||
this.className = name;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return className;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,96 @@
|
||||
package org.mian.gitnex.helpers.highlightjs.models;
|
||||
|
||||
/**
|
||||
* This Class was created by Patrick J
|
||||
* on 09.06.16.
|
||||
*/
|
||||
|
||||
public enum Theme {
|
||||
AGATE("agate"),
|
||||
ANDROID_STUDIO("androidstudio"),
|
||||
ARDUINO_LIGHT("arduino-light"),
|
||||
ARTA("arta"),
|
||||
ASCETIC("ascetic"),
|
||||
ATELIER_CAVE_DARK("atelier-cave-dark"),
|
||||
ATELIER_CAVE_LIGHT("atelier-cave-light"),
|
||||
ATELIER_DUNE_DARK("atelier-dune-dark"),
|
||||
ATELIER_DUNE_LIGHT("atelier-dune-light"),
|
||||
ATELIER_ESTUARY_DARK("atelier-estuary-dark"),
|
||||
ATELIER_ESTUARY_LIGHT("atelier-estuary-light"),
|
||||
ATELIER_FOREST_DARK("atelier-forest-dark"),
|
||||
ATELIER_FOREST_LIGHT("atelier-forest-light"),
|
||||
ATELIER_HEATH_DARK("atelier-heath-dark"),
|
||||
ATELIER_HEATH_LIGHT("atelier-heath-light"),
|
||||
ATELIER_LAKESIDE_DARK("atelier-lakeside-dark"),
|
||||
ATELIER_LAKESIDE_LIGHT("atelier-lakeside-light"),
|
||||
ATELIER_PLATEAU_DARK("atelier-plateau-dark"),
|
||||
ATELIER_PLATEAU_LIGHT("atelier-plateau-light"),
|
||||
ATELIER_SAVANNA_DARK("atelier-savanna-dark"),
|
||||
ATELIER_SAVANNA_LIGHT("atelier-savanna-light"),
|
||||
ATELIER_SEASIDE_DARK("atelier-seaside-dark"),
|
||||
ATELIER_SEASIDE_LIGHT("atelier-seaside-light"),
|
||||
ATELIER_SULPHURPOOL_DARK("atelier-sulphurpool-dark"),
|
||||
ATELIER_SULPHURPOOL_LIGHT("atelier-sulphurpool-light"),
|
||||
ATOM_ONE_DARK("atom-one-dark"),
|
||||
ATOM_ONE_LIGHT("atom-one-light"),
|
||||
BROWN_PAPER("brown-paper"),
|
||||
CODEPEN_EMBED("codepen-embed"),
|
||||
COLOR_BREWER("color-brewer"),
|
||||
DARK("dark"),
|
||||
DARKULA("darkula"),
|
||||
DEFAULT("default"),
|
||||
DOCCO("docco"),
|
||||
DRAKULA("drakula"),
|
||||
FAR("far"),
|
||||
FOUNDATION("foundaiton"),
|
||||
GITHUB("github"),
|
||||
GITHUB_GIST("github-gist"),
|
||||
GOOGLECODE("googlecode"),
|
||||
GRAYSCALE("grayscale"),
|
||||
GRUVBOX_DARK("gruvbox-dark"),
|
||||
GRUVBOX_LIGHT("gruvbox-light"),
|
||||
HOPSCOTCH("hopscotch"),
|
||||
HYBRID("hybrid"),
|
||||
IDEA("idea"),
|
||||
IR_BLACK("ir-black"),
|
||||
KIMBIE_DARK("kimbie.dark"),
|
||||
KIMBIE_LIGHT("kimbie.light"),
|
||||
MAGULA("magula"),
|
||||
MONO_BLUE("mono-blue"),
|
||||
MONOKAI("monokai"),
|
||||
MONOKAI_SUBLIME("monokai-sublime"),
|
||||
OBSIDIAN("obsidian"),
|
||||
OCEAN("ocean"),
|
||||
PARAISO_DARK("paraiso-dark"),
|
||||
PARAISO_LIGHT("paraiso-light"),
|
||||
POJOAQUE("pojoaque"),
|
||||
PURE_BASIC("purebasic"),
|
||||
QT_CREATOR_DARK("qtcreator_dark"),
|
||||
QT_CREATOR_LIGHT("qtcreator_light"),
|
||||
RAILSCASTS("railscasts"),
|
||||
RAINBOX("rainbow"),
|
||||
SCHOOL_BOOK("school-book"),
|
||||
SOLARIZED_DARK("solarized-dark"),
|
||||
SOLARIZED_LIGHT("solarized-light"),
|
||||
SUNBURST("sunburst"),
|
||||
TOMORROW("tomorrow"),
|
||||
TOMORROW_NIGHT_BLUE("tomorrow-night-blue"),
|
||||
TOMORROW_NIGHT_BRIGHT("tomorrow-night-bright"),
|
||||
TOMORROW_NIGHT("tomorrow-night"),
|
||||
TOMORROW_NIGHT_EIGHTIES("tomorrow-night-eighties"),
|
||||
VS("vs"),
|
||||
X_CODE("xcode"),
|
||||
XT256("xt256"),
|
||||
ZENBURN("zenburn");
|
||||
|
||||
private final String themeName;
|
||||
|
||||
Theme(String themeName) {
|
||||
this.themeName = themeName;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return themeName;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package org.mian.gitnex.helpers.highlightjs.utils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import org.mian.gitnex.helpers.highlightjs.HighlightJsView;
|
||||
|
||||
/**
|
||||
* This Class was created by Patrick J
|
||||
* on 09.06.16. (modified by opyale)
|
||||
*/
|
||||
|
||||
public class SourceUtils {
|
||||
|
||||
public static String generateContent(String source, @NonNull String theme, @Nullable String language, boolean supportZoom, boolean showLineNumbers,
|
||||
HighlightJsView.TextWrap textWrap) {
|
||||
|
||||
return getStylePageHeader(supportZoom, textWrap) +
|
||||
getSourceForTheme(theme) +
|
||||
(showLineNumbers ? getLineNumberStyling() : "") +
|
||||
getScriptPageHeader(showLineNumbers) +
|
||||
getSourceForLanguage(source, language) +
|
||||
getTemplateFooter();
|
||||
}
|
||||
|
||||
private static String getStylePageHeader(boolean enableZoom, HighlightJsView.TextWrap textWrap) {
|
||||
|
||||
String preTag;
|
||||
|
||||
switch (textWrap) {
|
||||
|
||||
case WORD_WRAP:
|
||||
preTag = "pre { white-space: pre-wrap; word-wrap: break-word; }";
|
||||
break;
|
||||
|
||||
case BREAK_ALL:
|
||||
preTag = "pre { white-space: pre-wrap; word-break: break-all; }";
|
||||
break;
|
||||
|
||||
default:
|
||||
preTag = "pre { }";
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return "<!DOCTYPE html>" +
|
||||
"<html>" +
|
||||
"<head>" +
|
||||
"<meta charset=\"utf-8\">" +
|
||||
(enableZoom ? "" : "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0\">") +
|
||||
"<style>" +
|
||||
"html, body { width:100%; height: 100%; margin: 0px; padding: 0px; }" +
|
||||
preTag +
|
||||
"</style>";
|
||||
}
|
||||
|
||||
private static String getScriptPageHeader(boolean showLineNumbers) {
|
||||
|
||||
return "<script src=\"./highlightjs/highlight.pack.js\"></script>" +
|
||||
(showLineNumbers ? "<script src=\"./highlightjs/highlightjs-line-numbers.min.js\"></script>" : "") +
|
||||
"<script>hljs.initHighlightingOnLoad();</script>" +
|
||||
(showLineNumbers ? "<script>hljs.initLineNumbersOnLoad();</script>" : "") +
|
||||
"</head><body style=\"margin: 0; padding: 0\" class=\"hljs\">";
|
||||
}
|
||||
|
||||
private static String getLineNumberStyling() {
|
||||
|
||||
return "<style>" +
|
||||
".hljs-line-numbers { text-align: right; border-right: 1px solid #ccc; color: #999; user-select: none; }" +
|
||||
"</style>";
|
||||
}
|
||||
|
||||
private static String getTemplateFooter() {
|
||||
|
||||
return "</body></html>";
|
||||
}
|
||||
|
||||
private static String escapeCode(String code) {
|
||||
|
||||
return code.replaceAll("<", "<")
|
||||
.replaceAll(">", ">");
|
||||
}
|
||||
|
||||
private static String getSourceForTheme(String theme) {
|
||||
|
||||
return String.format("<link rel=\"stylesheet\" href=\"./highlightjs/themes/%s.css\">", theme);
|
||||
}
|
||||
|
||||
private static String getSourceForLanguage(String source, String language) {
|
||||
|
||||
if (language != null) {
|
||||
return String.format("<pre><code class=\"%s\">%s</code></pre>", language, escapeCode(source));
|
||||
} else {
|
||||
return String.format("<pre><code>%s</code></pre>", escapeCode(source));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user