Skip to content

Commit

Permalink
Feature: Add Line numbers support (Issue #2057, PR #2062, by @guang-lin)
Browse files Browse the repository at this point in the history
Co-authored-by: Gregor Santner <gsantner@mailbox.org>
  • Loading branch information
guanglinn and gsantner committed Aug 14, 2023
1 parent d8ffc01 commit 667b5d7
Show file tree
Hide file tree
Showing 84 changed files with 2,387 additions and 789 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,7 @@ public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
_hlEditor.setTextColor(_appSettings.getEditorForegroundColor());
_hlEditor.setGravity(_appSettings.isEditorStartEditingInCenter() ? Gravity.CENTER : Gravity.NO_GRAVITY);
_hlEditor.setHighlightingEnabled(_appSettings.getDocumentHighlightState(_document.getPath(), _hlEditor.getText()));
_hlEditor.setLineNumbersEnabled(_appSettings.isLineNumbersEnabled());
_hlEditor.setAutoFormatEnabled(_appSettings.getDocumentAutoFormatEnabled(_document.getPath()));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Do not need to send contents to accessibility
Expand Down Expand Up @@ -561,6 +562,13 @@ public void onFsViewerConfig(GsFileBrowserOptions.Options dopt) {
updateMenuToggleStates(0);
return true;
}
case R.id.action_line_numbers: {
_appSettings.setLineNumbersEnabled(!_appSettings.isLineNumbersEnabled());
_hlEditor.setLineNumbersEnabled(_appSettings.isLineNumbersEnabled());
_hlEditor.invalidate();
updateMenuToggleStates(0);
return true;
}
case R.id.action_enable_highlighting: {
final boolean newState = !_hlEditor.getHighlightingEnabled();
_hlEditor.setHighlightingEnabled(newState);
Expand Down Expand Up @@ -626,6 +634,9 @@ private void updateMenuToggleStates(final int selectedFormatActionId) {
if ((mi = _fragmentMenu.findItem(R.id.action_enable_highlighting)) != null) {
mi.setChecked(_hlEditor.getHighlightingEnabled());
}
if ((mi = _fragmentMenu.findItem(R.id.action_line_numbers)) != null) {
mi.setChecked(_hlEditor.getLineNumbersEnabled());
}
if ((mi = _fragmentMenu.findItem(R.id.action_enable_auto_format)) != null) {
mi.setChecked(_hlEditor.getAutoFormatEnabled());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
package net.gsantner.markor.format.asciidoc;

import android.content.Context;

import net.gsantner.markor.format.TextConverterBase;
import net.gsantner.opoc.format.GsTextUtils;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,8 @@ private static void addColumnsLine(StringBuilder mdMarkup, @NonNull String[] col
mdMarkup.append(MD_COL_DELIMITER).append(MD_LINE_DELIMITER);
}

@NonNull private static String getCol(@NonNull String[] columns, int i) {
@NonNull
private static String getCol(@NonNull String[] columns, int i) {
return (i >= 0 && i < columns.length) ? columns[i] : "";
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
import android.content.Context;
import android.text.TextUtils;

import androidx.annotation.NonNull;

import com.vladsch.flexmark.ext.admonition.AdmonitionExtension;
import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension;
import com.vladsch.flexmark.ext.autolink.AutolinkExtension;
Expand Down Expand Up @@ -54,6 +52,7 @@

import other.com.vladsch.flexmark.ext.katex.FlexmarkKatexExtension;
import other.de.stanetz.jpencconverter.JavaPasswordbasedCryption;
import other.flexmark.ext.codeblocks.LineNumbersExtension;

@SuppressWarnings({"unchecked", "WeakerAccess"})
public class MarkdownTextConverter extends TextConverterBase {
Expand Down Expand Up @@ -96,13 +95,18 @@ public class MarkdownTextConverter extends TextConverterBase {
public static final String HTML_PRESENTATION_BEAMER_SLIDE_START_DIV = "<!-- Presentation slide NO --> <div class='slide_pNO slide'><div class='slide_body'>";
public static final String TOKEN_SITE_DATE_JEKYLL = "{{ site.time | date: '%x' }}";

public static final String HTML_KATEX_INCLUDE = "<link rel='stylesheet' type='text/css' href='file:///android_asset/katex/katex.min.css'>" +
"<script src='file:///android_asset/katex/katex.min.js'></script>" +
"<script src='file:///android_asset/katex/katex-render.js'></script>" +
"<script src='file:///android_asset/katex/mhchem.min.js'></script>";
private static final String CSS_PREFIX = "<link rel='stylesheet' href='file:///android_asset/";
private static final String CSS_POSTFIX = "'/>";
private static final String JS_PREFIX = "<script type='text/javascript' src='file:///android_asset/";
private static final String JS_POSTFIX = "'></script>";

public static final String HTML_KATEX_INCLUDE = CSS_PREFIX + "katex/katex.min.css" + CSS_POSTFIX +
JS_PREFIX + "katex/katex.min.js" + JS_POSTFIX +
JS_PREFIX + "katex/katex-render.js" + JS_POSTFIX +
JS_PREFIX + "katex/mhchem.min.js" + JS_POSTFIX;
public static final String CSS_KATEX = CSS_S + ".katex { font-size: inherit; }" + CSS_E;

public static final String HTML_MERMAID_INCLUDE = "<script src='file:///android_asset/mermaid/mermaid.min.js'></script>";
public static final String HTML_MERMAID_INCLUDE = JS_PREFIX + "mermaid/mermaid.min.js" + JS_POSTFIX;

public static final String HTML_FRONTMATTER_CONTAINER_S = "<div class='front-matter-container'>";
public static final String HTML_FRONTMATTER_CONTAINER_E = "</div>";
Expand All @@ -116,8 +120,8 @@ public class MarkdownTextConverter extends TextConverterBase {
public static final String YAML_FRONTMATTER_SCOPES = "post"; //, page, site";
public static final Pattern YAML_FRONTMATTER_TOKEN_PATTERN = Pattern.compile("\\{\\{\\s+(?:" + YAML_FRONTMATTER_SCOPES.replaceAll(",\\s*", "|") + ")\\.[A-Za-z0-9]+\\s+\\}\\}");

public static final String HTML_ADMONITION_INCLUDE = "<link rel='stylesheet' type='text/css' href='file:///android_asset/flexmark/admonition.css'>" +
"<script src='file:///android_asset/flexmark/admonition.js'></script>";
public static final String HTML_ADMONITION_INCLUDE = CSS_PREFIX + "flexmark/admonition.css" + CSS_POSTFIX +
JS_PREFIX + "flexmark/admonition.js" + JS_POSTFIX;
public static final String CSS_ADMONITION = CSS_S + ".adm-block { width: initial; font-size: 90%; text-indent: 0em; } .adm-heading { height: auto; padding-top: 0.4em; padding-left: 2.2em; padding-bottom: 0.4em; } .adm-body { padding-top: 0.25em; padding-bottom: 0.25em; margin-left: 0.5em; margin-right: 0.5em; } .adm-icon { position: absolute; top: 50%; left: 0.5em; transform: translateY(-50%); } .adm-block > .adm-heading { position: relative; cursor: pointer; } .adm-block.adm-open > .adm-heading:after, .adm-block.adm-collapsed > .adm-heading:after { top: 50%; transform: translateY(-50%); content: '▼'; } .adm-block.adm-collapsed > .adm-heading:after { content: '◀'; } pre + div.adm-block, div.adm-block + pre { margin-top: 1.75em; }" + CSS_E;

//########################
Expand Down Expand Up @@ -157,7 +161,15 @@ public String convertMarkup(String markup, Context context, boolean isExportInLi
String converted = "", onLoadJs = "", head = "";

MutableDataSet options = new MutableDataSet();
options.set(Parser.EXTENSIONS, flexmarkExtensions);

if (_appSettings.isLineNumbersEnabled()) {
// Add code blocks Line numbers extension
ArrayList<Extension> extensions = new ArrayList<>(flexmarkExtensions);
extensions.add(LineNumbersExtension.create());
options.set(Parser.EXTENSIONS, extensions);
} else {
options.set(Parser.EXTENSIONS, flexmarkExtensions);
}
options.set(Parser.SPACE_IN_LINK_URLS, true); // allow links like [this](some filename with spaces.md)
//options.set(HtmlRenderer.SOFT_BREAK, "<br />\n"); // Add linefeed to html break
options.set(EmojiExtension.USE_IMAGE_TYPE, EmojiImageType.UNICODE_ONLY); // Use unicode (OS/browser images)
Expand Down Expand Up @@ -261,7 +273,7 @@ public String convertMarkup(String markup, Context context, boolean isExportInLi
}

// Enable View (block) code syntax highlighting
final String xt = getViewHlPrismIncludes(context, (GsContextUtils.instance.isDarkModeEnabled(context) ? "-tomorrow" : ""));
final String xt = getViewHlPrismIncludes((GsContextUtils.instance.isDarkModeEnabled(context) ? "-tomorrow" : ""));
head += xt;

// Jekyll: Replace {{ site.baseurl }} with ..--> usually used in Jekyll blog _posts folder which is one folder below repository root, for reference to e.g. pictures in assets folder
Expand Down Expand Up @@ -348,27 +360,18 @@ private String escapeSpacesInLink(final String markup) {
}

@SuppressWarnings({"StringConcatenationInsideStringBufferAppend"})
private String getViewHlPrismIncludes(@NonNull final Context context, final String themeName) {
final StringBuilder sb = new StringBuilder(1500);
final String js_prefix = "<script type='text/javascript' src='file:///android_asset/prism/";
sb.append("\n\n");
sb.append("<link rel='stylesheet' href='file:///android_asset/prism/prism" + themeName + ".min.css' /> ");
sb.append(js_prefix + "prism.min.js'></script> ");
sb.append(js_prefix + "prism-markup-templating.min.js'></script> ");
try {
for (String lang : context.getAssets().list("prism")) {
if (!lang.endsWith(".js") || lang.contains("prism.min.js") || lang.contains("prism-markup-templating.min.js")) {
continue;
}
sb.append(js_prefix);
sb.append(lang);
sb.append("'></script> ");
}
} catch (Exception e) {
e.printStackTrace();
private String getViewHlPrismIncludes(final String themeName) {
final StringBuilder sb = new StringBuilder(1000);
sb.append(CSS_PREFIX + "prism/themes/prism" + themeName + ".min.css" + CSS_POSTFIX);
sb.append(JS_PREFIX + "prism/prism.js" + JS_POSTFIX);
sb.append(JS_PREFIX + "prism/plugins/autoloader/prism-autoloader.min.js" + JS_POSTFIX);

if (_appSettings.isLineNumbersEnabled()) {
sb.append(CSS_PREFIX + "prism/plugins/line-numbers/prism-line-numbers.css" + CSS_POSTFIX);
sb.append(JS_PREFIX + "prism/plugins/line-numbers/prism-line-numbers.min.js" + JS_POSTFIX);
}
sb.append("\n\n");
return sb.toString();

return sb.append("\n").toString();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,16 +252,16 @@ private void addRemoveItems(final String prefix, final GsCallback.r1<Collection<
final boolean append = _appSettings.isTodoAppendProConOnEndEnabled();

MarkorDialogFactory.showUpdateItemsDialog(getActivity(), R.string.insert_context, all, current, _hlEditor,
updated -> {
final TextViewUtils.ChunkedEditable chunk = TextViewUtils.ChunkedEditable.wrap(_hlEditor.getText());
for (final String item : GsCollectionUtils.setDiff(current, updated)) {
removeItem(chunk, prefix + item);
}
for (final String item : GsCollectionUtils.setDiff(updated, current)) {
insertUniqueItem(chunk, prefix + item, append);
}
chunk.applyChanges();
});
updated -> {
final TextViewUtils.ChunkedEditable chunk = TextViewUtils.ChunkedEditable.wrap(_hlEditor.getText());
for (final String item : GsCollectionUtils.setDiff(current, updated)) {
removeItem(chunk, prefix + item);
}
for (final String item : GsCollectionUtils.setDiff(updated, current)) {
insertUniqueItem(chunk, prefix + item, append);
}
chunk.applyChanges();
});
}

private static void removeItem(final Editable editable, final String item) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ public static String createWikitextHeaderAndTitleContents(String fileNameWithout
@Override
public boolean runTitleClick() {
final Matcher m = WikitextSyntaxHighlighter.HEADING.matcher("");
MarkorDialogFactory.showHeadlineDialog(getActivity(), _hlEditor, _disabledHeadings, (text, start, end) -> {
MarkorDialogFactory.showHeadlineDialog(getActivity(), _hlEditor, _disabledHeadings, (text, start, end) -> {
if (m.reset(text.subSequence(start, end)).find()) {
return 7 - (m.end(2) - m.start(2));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import android.widget.EditText;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.core.content.ContextCompat;
Expand Down Expand Up @@ -62,7 +61,6 @@
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
Expand Down
Loading

0 comments on commit 667b5d7

Please sign in to comment.