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:
opyale 2020-04-30 06:28:27 +00:00 committed by M M Arif
parent c41ab845fd
commit 5d1efe0f3f
16 changed files with 989 additions and 20 deletions

View File

@ -38,7 +38,7 @@ dependencies {
def acra = "5.5.0"
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:1.1.0"
implementation "androidx.appcompat:appcompat:1.2.0-beta01"
implementation "com.google.android.material:material:1.2.0-alpha06"
implementation "androidx.constraintlayout:constraintlayout:1.1.3"
implementation "androidx.legacy:legacy-support-v4:1.0.0"
@ -79,7 +79,6 @@ dependencies {
implementation "com.github.HamidrezaAmz:BreadcrumbsView:0.2.9"
implementation "commons-io:commons-io:20030203.000550"
implementation "com.github.chrisbanes:PhotoView:2.3.0"
implementation "com.pddstudio:highlightjs-android:1.5.0"
implementation "com.github.barteksc:android-pdf-viewer:3.2.0-beta.1"
implementation "ch.acra:acra-mail:$acra"
implementation "ch.acra:acra-limiter:$acra"

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
!function(e){"use strict";function t(){"complete"===document.readyState?n():e.addEventListener("DOMContentLoaded",n)}function n(){try{var e=document.querySelectorAll("code.hljs");for(var t in e)e.hasOwnProperty(t)&&r(e[t])}catch(n){console.error("LineNumbers error: ",n)}}function r(e){if("object"==typeof e){var t=e.parentNode,n=o(t.textContent);if(n>1){for(var r="",c=0;n>c;c++)r+=c+1+"\n";var l=document.createElement("code");l.className="hljs hljs-line-numbers",l.style["float"]="left",l.textContent=r,t.insertBefore(l,e)}}}function o(e){if(0===e.length)return 0;var t=/\r\n|\r|\n/g,n=e.match(t);return n=n?n.length:0,e[e.length-1].match(t)||(n+=1),n}"undefined"==typeof e.hljs?console.error("highlight.js not detected!"):(e.hljs.initLineNumbersOnLoad=t,e.hljs.lineNumbersBlock=r)}(window);

View File

@ -0,0 +1,66 @@
/*
Date: 24 Fev 2015
Author: Pedro Oliveira <kanytu@gmail . com>
*/
.hljs {
color: #a9b7c6;
background: #282b2e;
display: block;
overflow-x: auto;
padding: 0.5em;
}
.hljs-number,
.hljs-literal,
.hljs-symbol,
.hljs-bullet {
color: #6897BB;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-deletion {
color: #cc7832;
}
.hljs-variable,
.hljs-template-variable,
.hljs-link {
color: #629755;
}
.hljs-comment,
.hljs-quote {
color: #808080;
}
.hljs-meta {
color: #bbb529;
}
.hljs-string,
.hljs-attribute,
.hljs-addition {
color: #6A8759;
}
.hljs-section,
.hljs-title,
.hljs-type {
color: #ffc66d;
}
.hljs-name,
.hljs-selector-id,
.hljs-selector-class {
color: #e8bf6a;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@ -0,0 +1,87 @@
/*
Arduino® Light Theme - Stefania Mellai <s.mellai@arduino.cc>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #FFFFFF;
}
.hljs,
.hljs-subst {
color: #434f54;
}
.hljs-keyword,
.hljs-attribute,
.hljs-selector-tag,
.hljs-doctag,
.hljs-name {
color: #00979D;
}
.hljs-built_in,
.hljs-literal,
.hljs-bullet,
.hljs-code,
.hljs-addition {
color: #D35400;
}
.hljs-regexp,
.hljs-symbol,
.hljs-variable,
.hljs-template-variable,
.hljs-link,
.hljs-selector-attr,
.hljs-selector-pseudo {
color: #00979D;
}
.hljs-type,
.hljs-string,
.hljs-selector-id,
.hljs-selector-class,
.hljs-quote,
.hljs-template-tag,
.hljs-deletion {
color: #005C5F;
}
.hljs-title,
.hljs-section {
color: #880000;
font-weight: bold;
}
.hljs-comment {
color: rgba(149,165,166,.8);
}
.hljs-meta-keyword {
color: #728E00;
}
.hljs-meta {
color: #434f54;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
.hljs-function {
color: #728E00;
}
.hljs-number {
color: #8A7B52;
}

View File

@ -0,0 +1,71 @@
/*
FAR Style (c) MajestiC <majestic2k@gmail.com>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #000080;
}
.hljs,
.hljs-subst {
color: #0ff;
}
.hljs-string,
.hljs-attribute,
.hljs-symbol,
.hljs-bullet,
.hljs-built_in,
.hljs-builtin-name,
.hljs-template-tag,
.hljs-template-variable,
.hljs-addition {
color: #ff0;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-section,
.hljs-type,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-variable {
color: #fff;
}
.hljs-comment,
.hljs-quote,
.hljs-doctag,
.hljs-deletion {
color: #888;
}
.hljs-number,
.hljs-regexp,
.hljs-literal,
.hljs-link {
color: #0f0;
}
.hljs-meta {
color: #008080;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-title,
.hljs-section,
.hljs-name,
.hljs-strong {
font-weight: bold;
}
.hljs-emphasis {
font-style: italic;
}

View File

@ -0,0 +1,99 @@
/*
github.com style (c) Vasily Polovnyov <vast@whiteants.net>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
color: #333;
background: #f8f8f8;
}
.hljs-comment,
.hljs-quote {
color: #998;
font-style: italic;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-subst {
color: #333;
font-weight: bold;
}
.hljs-number,
.hljs-literal,
.hljs-variable,
.hljs-template-variable,
.hljs-tag .hljs-attr {
color: #008080;
}
.hljs-string,
.hljs-doctag {
color: #d14;
}
.hljs-title,
.hljs-section,
.hljs-selector-id {
color: #900;
font-weight: bold;
}
.hljs-subst {
font-weight: normal;
}
.hljs-type,
.hljs-class .hljs-title {
color: #458;
font-weight: bold;
}
.hljs-tag,
.hljs-name,
.hljs-attribute {
color: #000080;
font-weight: normal;
}
.hljs-regexp,
.hljs-link {
color: #009926;
}
.hljs-symbol,
.hljs-bullet {
color: #990073;
}
.hljs-built_in,
.hljs-builtin-name {
color: #0086b3;
}
.hljs-meta {
color: #999;
font-weight: bold;
}
.hljs-deletion {
background: #fdd;
}
.hljs-addition {
background: #dfd;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@ -0,0 +1,73 @@
/*
IR_Black style (c) Vasily Mikhailitchenko <vaskas@programica.ru>
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #000;
color: #f8f8f8;
}
.hljs-comment,
.hljs-quote,
.hljs-meta {
color: #7c7c7c;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-tag,
.hljs-name {
color: #96cbfe;
}
.hljs-attribute,
.hljs-selector-id {
color: #ffffb6;
}
.hljs-string,
.hljs-selector-attr,
.hljs-selector-pseudo,
.hljs-addition {
color: #a8ff60;
}
.hljs-subst {
color: #daefa3;
}
.hljs-regexp,
.hljs-link {
color: #e9c062;
}
.hljs-title,
.hljs-section,
.hljs-type,
.hljs-doctag {
color: #ffffb6;
}
.hljs-symbol,
.hljs-bullet,
.hljs-variable,
.hljs-template-variable,
.hljs-literal {
color: #c6c5fe;
}
.hljs-number,
.hljs-deletion {
color:#ff73fd;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}

View File

@ -0,0 +1,83 @@
/*
Monokai Sublime style. Derived from Monokai by noformnocontent http://nn.mit-license.org/
*/
.hljs {
display: block;
overflow-x: auto;
padding: 0.5em;
background: #23241f;
}
.hljs,
.hljs-tag,
.hljs-subst {
color: #f8f8f2;
}
.hljs-strong,
.hljs-emphasis {
color: #a8a8a2;
}
.hljs-bullet,
.hljs-quote,
.hljs-number,
.hljs-regexp,
.hljs-literal,
.hljs-link {
color: #ae81ff;
}
.hljs-code,
.hljs-title,
.hljs-section,
.hljs-selector-class {
color: #a6e22e;
}
.hljs-strong {
font-weight: bold;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-keyword,
.hljs-selector-tag,
.hljs-name,
.hljs-attr {
color: #f92672;
}
.hljs-symbol,
.hljs-attribute {
color: #66d9ef;
}
.hljs-params,
.hljs-class .hljs-title {
color: #f8f8f2;
}
.hljs-string,
.hljs-type,
.hljs-built_in,
.hljs-builtin-name,
.hljs-selector-id,
.hljs-selector-attr,
.hljs-selector-pseudo,
.hljs-addition,
.hljs-variable,
.hljs-template-variable {
color: #e6db74;
}
.hljs-comment,
.hljs-deletion,
.hljs-meta {
color: #75715e;
}

View File

@ -28,14 +28,14 @@ import androidx.core.content.ContextCompat;
import com.github.barteksc.pdfviewer.PDFView;
import com.github.barteksc.pdfviewer.util.FitPolicy;
import com.github.chrisbanes.photoview.PhotoView;
import com.pddstudio.highlightjs.HighlightJsView;
import com.pddstudio.highlightjs.models.Theme;
import org.apache.commons.io.FileUtils;
import org.mian.gitnex.R;
import org.mian.gitnex.clients.RetrofitClient;
import org.mian.gitnex.fragments.BottomSheetFileViewerFragment;
import org.mian.gitnex.helpers.AlertDialogs;
import org.mian.gitnex.helpers.Toasty;
import org.mian.gitnex.helpers.highlightjs.HighlightJsView;
import org.mian.gitnex.helpers.highlightjs.models.Theme;
import org.mian.gitnex.models.Files;
import org.mian.gitnex.util.AppUtil;
import org.mian.gitnex.util.TinyDB;
@ -196,7 +196,6 @@ public class FileViewActivity extends BaseActivity implements BottomSheetFileVie
singleCodeContents.setTheme(Theme.MONOKAI_SUBLIME);
}
singleCodeContents.setShowLineNumbers(true);
singleCodeContents.setSource(appUtil.decodeBase64(response.body().getContent()));
}

View File

@ -21,8 +21,8 @@ public class SettingsFileViewerActivity extends BaseActivity {
private Context appCtx;
private View.OnClickListener onClickListener;
private static String[] fileveiwerSourceCodeThemesList = {"Sublime", "Arduino Light", "Github", "Far ", "Ir Black", "Android Studio"};
private static int fileveiwerSourceCodeThemesSelectedChoice = 0;
private static String[] fileViewerSourceCodeThemesList = {"Sublime", "Arduino Light", "Github", "Far ", "Ir Black", "Android Studio"};
private static int fileViewerSourceCodeThemesSelectedChoice = 0;
@Override
protected int getLayoutResourceId() {
@ -43,18 +43,18 @@ public class SettingsFileViewerActivity extends BaseActivity {
initCloseListener();
closeActivity.setOnClickListener(onClickListener);
final TextView fileveiwerSourceCodeThemesSelected = findViewById(R.id.sourceCodeThemeSelected); // setter for fileviewer theme
final TextView fileViewerSourceCodeThemesSelected = findViewById(R.id.sourceCodeThemeSelected); // setter for fileviewer theme
LinearLayout sourceCodeThemeFrame = findViewById(R.id.sourceCodeThemeFrame);
Switch pdfModeSwitch = findViewById(R.id.switchPdfMode);
if(!tinyDb.getString("fileviewerSourceCodeThemeStr").isEmpty()) {
fileveiwerSourceCodeThemesSelected.setText(tinyDb.getString("fileviewerSourceCodeThemeStr"));
fileViewerSourceCodeThemesSelected.setText(tinyDb.getString("fileviewerSourceCodeThemeStr"));
}
if(fileveiwerSourceCodeThemesSelectedChoice == 0) {
fileveiwerSourceCodeThemesSelectedChoice = tinyDb.getInt("fileviewerThemeId");
if(fileViewerSourceCodeThemesSelectedChoice == 0) {
fileViewerSourceCodeThemesSelectedChoice = tinyDb.getInt("fileviewerThemeId");
}
if(tinyDb.getBoolean("enablePdfMode")) {
@ -70,18 +70,18 @@ public class SettingsFileViewerActivity extends BaseActivity {
AlertDialog.Builder fvtsBuilder = new AlertDialog.Builder(SettingsFileViewerActivity.this);
fvtsBuilder.setTitle(R.string.fileviewerSourceCodeThemeSelectorDialogTitle);
if(fileveiwerSourceCodeThemesSelectedChoice != -1) {
if(fileViewerSourceCodeThemesSelectedChoice != -1) {
fvtsBuilder.setCancelable(true);
}
else {
fvtsBuilder.setCancelable(false);
}
fvtsBuilder.setSingleChoiceItems(fileveiwerSourceCodeThemesList, fileveiwerSourceCodeThemesSelectedChoice, (dialogInterfaceTheme, i) -> {
fvtsBuilder.setSingleChoiceItems(fileViewerSourceCodeThemesList, fileViewerSourceCodeThemesSelectedChoice, (dialogInterfaceTheme, i) -> {
fileveiwerSourceCodeThemesSelectedChoice = i;
fileveiwerSourceCodeThemesSelected.setText(fileveiwerSourceCodeThemesList[i]);
tinyDb.putString("fileviewerSourceCodeThemeStr", fileveiwerSourceCodeThemesList[i]);
fileViewerSourceCodeThemesSelectedChoice = i;
fileViewerSourceCodeThemesSelected.setText(fileViewerSourceCodeThemesList[i]);
tinyDb.putString("fileviewerSourceCodeThemeStr", fileViewerSourceCodeThemesList[i]);
tinyDb.putInt("fileviewerSourceCodeThemeId", i);
dialogInterfaceTheme.dismiss();
@ -113,9 +113,7 @@ public class SettingsFileViewerActivity extends BaseActivity {
}
private void initCloseListener() {
onClickListener = view -> {
finish();
};
onClickListener = view -> finish();
}
}

View File

@ -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
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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("<", "&lt;")
.replaceAll(">", "&gt;");
}
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));
}
}
}

View File

@ -89,7 +89,7 @@
</LinearLayout>
<com.pddstudio.highlightjs.HighlightJsView
<org.mian.gitnex.helpers.highlightjs.HighlightJsView
android:id="@+id/singleCodeContents"
android:layout_width="match_parent"
android:layout_height="wrap_content"