Skip to content

Commit a85a3c3

Browse files
authored
Merge branch 'master' into l10n_master
2 parents 828773a + 3964129 commit a85a3c3

File tree

15 files changed

+180
-132
lines changed

15 files changed

+180
-132
lines changed

CONTRIBUTORS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ Where:
4949
* **[Frederic Jacob](https://github.com/fredericjacob)**<br/>~° Added Zim-Wiki highlighting, text actions, view mode, page creation
5050
* **[Winston Feng](https://github.com/tifish)**<br/>~° Support spaces in URL
5151
* **[k3b](https://github.com/k3b)**<br/>~° Added CSV-Support
52-
* **[Li Guanglin](https://github.com/guanglinn)**<br/>~° Added line numbers support
52+
* **[Li Guanglin](https://github.com/guanglinn)**<br/>~° Added support for line numbers
5353
* **[bigger124](https://github.com/bigger124)**<br>~° Added OrgMode-Support
5454
* **[Ayowel](https://github.com/ayowel)**<br>~° Mermaid update
5555
* **[Matthew White](https://github.com/mehw)**<br>~° Zim-Wiki link/attachment conformance

app/src/main/java/net/gsantner/markor/activity/DocumentEditAndViewFragment.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
import net.gsantner.markor.frontend.MarkorDialogFactory;
5656
import net.gsantner.markor.frontend.filebrowser.MarkorFileBrowserFactory;
5757
import net.gsantner.markor.frontend.textview.HighlightingEditor;
58-
import net.gsantner.markor.frontend.textview.LineNumbersTextView;
58+
import net.gsantner.markor.frontend.textview.LineNumbersView;
5959
import net.gsantner.markor.frontend.textview.TextViewUtils;
6060
import net.gsantner.markor.model.AppSettings;
6161
import net.gsantner.markor.model.Document;
@@ -104,7 +104,8 @@ public static DocumentEditAndViewFragment newInstance(final @NonNull Document do
104104

105105
private DraggableScrollbarScrollView _verticalScrollView;
106106
private HorizontalScrollView _horizontalScrollView;
107-
private LineNumbersTextView _lineNumbersView;
107+
private LineNumbersView _lineNumbersView;
108+
private SearchView _menuSearchViewForViewMode;
108109
private Document _document;
109110
private FormatRegistry _format;
110111
private MarkorContextUtils _cu;
@@ -571,13 +572,19 @@ public void onFsViewerConfig(GsFileBrowserOptions.Options dopt) {
571572
final boolean newState = !isWrapped();
572573
_appSettings.setDocumentWrapState(_document.path, newState);
573574
setWrapState(newState);
575+
if (_isPreviewVisible && _webView != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
576+
_webView.evaluateJavascript("setWrapWords('" + newState + "');", null);
577+
}
574578
updateMenuToggleStates(0);
575579
return true;
576580
}
577581
case R.id.action_line_numbers: {
578582
final boolean newState = !_lineNumbersView.isLineNumbersEnabled();
579583
_appSettings.setDocumentLineNumbersEnabled(_document.path, newState);
580584
_lineNumbersView.setLineNumbersEnabled(newState);
585+
if (_isPreviewVisible && _webView != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
586+
_webView.evaluateJavascript("setLineNumbers('" + newState + "');", null);
587+
}
581588
updateMenuToggleStates(0);
582589
return true;
583590
}
@@ -607,6 +614,9 @@ public void onFsViewerConfig(GsFileBrowserOptions.Options dopt) {
607614
if (_isPreviewVisible) {
608615
if (_webView != null) {
609616
_webView.getSettings().setTextZoom((int) (newSize * VIEW_FONT_SCALE));
617+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && _lineNumbersView.isLineNumbersEnabled()) {
618+
_webView.evaluateJavascript("refreshLineNumbers();", null);
619+
}
610620
}
611621
_appSettings.setDocumentViewFontSize(_document.path, newSize);
612622
} else {

app/src/main/java/net/gsantner/markor/format/markdown/MarkdownTextConverter.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -278,13 +278,10 @@ public String convertMarkup(String markup, Context context, boolean lightMode, b
278278
}
279279
}
280280

281-
// Enable View (block) code syntax highlighting
281+
// Enable code block (view mode) syntax highlighting
282282
if (markup.contains("```")) {
283283
head += getViewHlPrismIncludes(GsContextUtils.instance.isDarkModeEnabled(context) ? "-tomorrow" : "", enableLineNumbers);
284-
onLoadJs += "usePrismCodeBlock();";
285-
if (as.getDocumentWrapState(file.getAbsolutePath())) {
286-
onLoadJs += "wrapCodeBlockWords();";
287-
}
284+
onLoadJs += "usePrism('" + as.getDocumentWrapState(file.getAbsolutePath()) + "', '" + enableLineNumbers + "');";
288285
}
289286

290287
// Enable Mermaid
@@ -347,11 +344,6 @@ public String convertMarkup(String markup, Context context, boolean lightMode, b
347344
}
348345
}
349346

350-
if (enableLineNumbers) {
351-
// For Prism line numbers plugin
352-
onLoadJs += "enableLineNumbers(); adjustLineNumbers();";
353-
}
354-
355347
// Deliver result
356348
return putContentIntoTemplate(context, converted, lightMode, file, onLoadJs, head);
357349
}
@@ -386,7 +378,7 @@ private String escapeSpacesInLink(final String markup) {
386378
}
387379

388380
@SuppressWarnings({"StringConcatenationInsideStringBufferAppend"})
389-
private String getViewHlPrismIncludes(final String theme, final boolean isLineNumbersEnabled) {
381+
private String getViewHlPrismIncludes(final String theme, final boolean lineNumbers) {
390382
final StringBuilder sb = new StringBuilder(1000);
391383
sb.append(CSS_PREFIX + "prism/themes/prism" + theme + ".min.css" + CSS_POSTFIX);
392384
sb.append(CSS_PREFIX + "prism/prism-markor.css" + CSS_POSTFIX);
@@ -399,11 +391,9 @@ private String getViewHlPrismIncludes(final String theme, final boolean isLineNu
399391
sb.append(JS_PREFIX + "prism/plugins/toolbar/prism-toolbar.min.js" + JS_POSTFIX);
400392
sb.append(JS_PREFIX + "prism/plugins/copy-to-clipboard/prism-copy-to-clipboard.min.js" + JS_POSTFIX);
401393

402-
if (isLineNumbersEnabled) {
403-
sb.append(CSS_PREFIX + "prism/plugins/line-numbers/prism-line-numbers-markor.css" + CSS_POSTFIX);
404-
sb.append(JS_PREFIX + "prism/plugins/line-numbers/prism-line-numbers.min.js" + JS_POSTFIX);
405-
sb.append(JS_PREFIX + "prism/plugins/line-numbers/prism-line-numbers-markor.js" + JS_POSTFIX);
406-
}
394+
sb.append(CSS_PREFIX + "prism/plugins/line-numbers/prism-line-numbers-markor.css" + CSS_POSTFIX);
395+
sb.append(JS_PREFIX + "prism/plugins/line-numbers/prism-line-numbers.min.js" + JS_POSTFIX);
396+
sb.append(JS_PREFIX + "prism/plugins/line-numbers/prism-line-numbers-markor.js" + JS_POSTFIX);
407397

408398
return sb.toString();
409399
}

app/src/main/java/net/gsantner/markor/frontend/textview/LineNumbersTextView.java renamed to app/src/main/java/net/gsantner/markor/frontend/textview/LineNumbersView.java

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -13,44 +13,52 @@
1313
import android.widget.EditText;
1414

1515
import androidx.annotation.NonNull;
16-
import androidx.appcompat.widget.AppCompatTextView;
1716

1817
@SuppressWarnings("UnusedReturnValue")
19-
public class LineNumbersTextView extends AppCompatTextView {
18+
public class LineNumbersView extends View {
2019
private EditText editText;
2120
private LineNumbersDrawer lineNumbersDrawer;
2221
private boolean lineNumbersEnabled;
2322

24-
public LineNumbersTextView(Context context) {
23+
public LineNumbersView(Context context) {
2524
super(context);
2625
}
2726

28-
public LineNumbersTextView(Context context, AttributeSet attrs) {
27+
public LineNumbersView(Context context, AttributeSet attrs) {
2928
super(context, attrs);
3029
}
3130

32-
public LineNumbersTextView(Context context, AttributeSet attrs, int defStyleAttr) {
31+
public LineNumbersView(Context context, AttributeSet attrs, int defStyleAttr) {
3332
super(context, attrs, defStyleAttr);
3433
}
3534

3635
@Override
37-
protected void onVisibilityChanged(View changedView, int visibility) {
36+
protected void onAttachedToWindow() {
37+
super.onAttachedToWindow();
38+
setWidth(0); // Initial width
39+
}
40+
41+
@Override
42+
protected void onVisibilityChanged(@NonNull View changedView, int visibility) {
3843
super.onVisibilityChanged(changedView, visibility);
3944
if (isLineNumbersEnabled() && visibility == View.VISIBLE) {
4045
refresh();
4146
}
4247
}
4348

4449
@Override
45-
protected void onDraw(Canvas canvas) {
50+
protected void onDraw(@NonNull Canvas canvas) {
4651
super.onDraw(canvas);
4752
if (lineNumbersEnabled) {
4853
lineNumbersDrawer.draw(canvas);
4954
}
5055
}
5156

57+
/**
58+
* Refresh LineNumbersView.
59+
*/
5260
public void refresh() {
53-
setText(""); // To activate LineNumbersTextView refresh
61+
invalidate();
5462
if (getWidth() == 0) {
5563
lineNumbersDrawer.getEditText().postInvalidate();
5664
}
@@ -64,6 +72,11 @@ public void setup(final @NonNull EditText editText) {
6472
this.lineNumbersDrawer = null;
6573
}
6674

75+
public void setWidth(int width) {
76+
getLayoutParams().width = width;
77+
requestLayout();
78+
}
79+
6780
public void setLineNumbersEnabled(final boolean enabled) {
6881
lineNumbersEnabled = enabled;
6982

@@ -76,7 +89,7 @@ public void setLineNumbersEnabled(final boolean enabled) {
7689
if (lineNumbersDrawer == null) {
7790
return;
7891
}
79-
lineNumbersDrawer.done();
92+
lineNumbersDrawer.cleanup();
8093
}
8194
refresh();
8295
}
@@ -87,7 +100,7 @@ public boolean isLineNumbersEnabled() {
87100

88101
static class LineNumbersDrawer {
89102
private final EditText editText;
90-
private final LineNumbersTextView textView;
103+
private final LineNumbersView lineNumbersView;
91104

92105
private final Paint paint = new Paint();
93106

@@ -96,8 +109,8 @@ static class LineNumbersDrawer {
96109
private static final int EDITOR_PADDING_LEFT = 8;
97110
private final int ORIGINAL_PADDING_LEFT;
98111

99-
private final Rect visibleArea = new Rect();
100-
private final Rect lineNumbersArea = new Rect();
112+
private final Rect visibleRect = new Rect();
113+
private final Rect lineNumbersRect = new Rect();
101114

102115
private int fenceX;
103116
private int numberX;
@@ -123,7 +136,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) {
123136
@Override
124137
public void afterTextChanged(Editable editable) {
125138
if (isLayoutLineCountChanged() || isMaxNumberChanged()) {
126-
textView.refresh();
139+
lineNumbersView.refresh();
127140
}
128141
}
129142
};
@@ -136,14 +149,14 @@ public void onScrollChanged() {
136149
final long time = System.currentTimeMillis();
137150
if (time - lastTime > 125) {
138151
lastTime = time;
139-
textView.refresh();
152+
lineNumbersView.refresh();
140153
}
141154
}
142155
};
143156

144-
public LineNumbersDrawer(final @NonNull EditText editText, final @NonNull LineNumbersTextView textView) {
157+
public LineNumbersDrawer(final @NonNull EditText editText, final @NonNull LineNumbersView lineNumbersView) {
145158
this.editText = editText;
146-
this.textView = textView;
159+
this.lineNumbersView = lineNumbersView;
147160
ORIGINAL_PADDING_LEFT = editText.getPaddingLeft();
148161
paint.setColor(0xFF999999);
149162
paint.setTextAlign(Paint.Align.RIGHT);
@@ -154,15 +167,15 @@ public EditText getEditText() {
154167
}
155168

156169
private boolean isOutOfLineNumbersArea() {
157-
final int margin = (int) (visibleArea.height() * 0.5f);
158-
final int top = visibleArea.top - margin;
159-
final int bottom = visibleArea.bottom + margin;
170+
final int margin = (int) (visibleRect.height() * 0.5f);
171+
final int top = visibleRect.top - margin;
172+
final int bottom = visibleRect.bottom + margin;
160173

161-
if (top < lineNumbersArea.top || bottom > lineNumbersArea.bottom) {
174+
if (top < lineNumbersRect.top || bottom > lineNumbersRect.bottom) {
162175
// Set line numbers area
163176
// height of line numbers area = (1.5 + 1 + 1.5) * height of visible area
164-
lineNumbersArea.top = top - visibleArea.height();
165-
lineNumbersArea.bottom = bottom + visibleArea.height();
177+
lineNumbersRect.top = top - visibleRect.height();
178+
lineNumbersRect.bottom = bottom + visibleRect.height();
166179
return true;
167180
} else {
168181
return false;
@@ -262,7 +275,8 @@ private void setRefreshOnScrollChanged(final boolean enabled) {
262275
public void prepare() {
263276
setLineTracking(true);
264277
setRefreshOnScrollChanged(true);
265-
textView.setVisibility(VISIBLE);
278+
lineNumbersView.setWidth(0);
279+
lineNumbersView.setVisibility(VISIBLE);
266280
editText.setPadding(EDITOR_PADDING_LEFT, editText.getPaddingTop(), editText.getPaddingRight(), editText.getPaddingBottom());
267281
}
268282

@@ -272,7 +286,7 @@ public void prepare() {
272286
* @param canvas The canvas on which the line numbers will be drawn.
273287
*/
274288
public void draw(final Canvas canvas) {
275-
if (!editText.getLocalVisibleRect(visibleArea)) {
289+
if (!editText.getLocalVisibleRect(visibleRect)) {
276290
return;
277291
}
278292

@@ -286,7 +300,7 @@ public void draw(final Canvas canvas) {
286300
if (isTextSizeChanged() || isMaxNumberDigitsChanged()) {
287301
numberX = NUMBER_PADDING_LEFT + (int) paint.measureText(String.valueOf(maxNumber));
288302
fenceX = numberX + NUMBER_PADDING_RIGHT;
289-
textView.setWidth(fenceX + 1);
303+
lineNumbersView.setWidth(fenceX + 1);
290304
}
291305

292306
// If current visible area is out of current line numbers area,
@@ -299,7 +313,7 @@ public void draw(final Canvas canvas) {
299313
}
300314

301315
// Draw right border of the fence
302-
canvas.drawLine(fenceX, lineNumbersArea.top, fenceX, lineNumbersArea.bottom, paint);
316+
canvas.drawLine(fenceX, lineNumbersRect.top, fenceX, lineNumbersRect.bottom, paint);
303317

304318
// Draw line numbers
305319
int i = startLine[0];
@@ -308,7 +322,7 @@ public void draw(final Canvas canvas) {
308322
final int count = layout.getLineCount();
309323
final int offsetY = editText.getPaddingTop();
310324

311-
if (y > lineNumbersArea.top) {
325+
if (y > lineNumbersRect.top) {
312326
if (invalid) {
313327
invalid = false;
314328
startLine[0] = i;
@@ -322,14 +336,14 @@ public void draw(final Canvas canvas) {
322336
for (; i < count; i++) {
323337
if (text.charAt(layout.getLineStart(i) - 1) == '\n') {
324338
y = layout.getLineBaseline(i);
325-
if (y > lineNumbersArea.top) {
339+
if (y > lineNumbersRect.top) {
326340
if (invalid) {
327341
invalid = false;
328342
startLine[0] = i;
329343
startLine[1] = number;
330344
}
331345
canvas.drawText(String.valueOf(number), numberX, y + offsetY, paint);
332-
if (y > lineNumbersArea.bottom) {
346+
if (y > lineNumbersRect.bottom) {
333347
break;
334348
}
335349
}
@@ -341,12 +355,11 @@ public void draw(final Canvas canvas) {
341355
/**
342356
* Reset some states related line numbers.
343357
*/
344-
public void done() {
358+
public void cleanup() {
345359
setLineTracking(false);
346360
setRefreshOnScrollChanged(false);
347361
maxNumberDigits = 0;
348-
textView.setWidth(0);
349-
textView.setVisibility(GONE);
362+
lineNumbersView.setVisibility(GONE);
350363
editText.setPadding(ORIGINAL_PADDING_LEFT, editText.getPaddingTop(), editText.getPaddingRight(), editText.getPaddingBottom());
351364
}
352365
}

app/src/main/res/layout/document__fragment__edit.xml

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,32 +30,30 @@
3030
android:layout_height="wrap_content"
3131
android:orientation="horizontal">
3232

33-
<net.gsantner.markor.frontend.textview.LineNumbersTextView
33+
<net.gsantner.markor.frontend.textview.LineNumbersView
3434
android:id="@+id/document__fragment__edit__line_numbers_view"
3535
android:layout_width="wrap_content"
36-
android:layout_height="match_parent"
37-
android:layout_weight="0"
38-
android:text="" />
36+
android:layout_height="match_parent" />
3937

4038
<net.gsantner.markor.frontend.textview.HighlightingEditor
4139
android:id="@+id/document__fragment__edit__highlighting_editor"
4240
android:layout_width="0dp"
4341
android:layout_height="wrap_content"
4442
android:layout_weight="1"
45-
android:background="@color/background"
4643
android:alpha="0"
44+
android:background="@color/background"
4745
android:gravity="top"
4846
android:imeOptions="flagNoExtractUi"
4947
android:inputType="textMultiLine|textCapSentences"
48+
android:isScrollContainer="false"
5049
android:minHeight="1dp"
50+
android:nestedScrollingEnabled="false"
51+
android:overScrollMode="never"
5152
android:paddingLeft="@dimen/activity_horizontal_margin"
5253
android:paddingTop="@dimen/activity_vertical_margin"
5354
android:paddingRight="@dimen/activity_horizontal_margin"
5455
android:paddingBottom="@dimen/editor_bottom_margin"
55-
android:nestedScrollingEnabled="false"
56-
android:isScrollContainer="false"
5756
android:scrollbars="none"
58-
android:overScrollMode="never"
5957
android:scrollHorizontally="false"
6058
android:textCursorDrawable="@drawable/cursor_accent" />
6159
</LinearLayout>
@@ -79,10 +77,10 @@
7977

8078
<ViewStub
8179
android:id="@+id/document__fragment_webview_stub"
82-
android:layout="@layout/document__fragment_view"
8380
android:layout_width="match_parent"
8481
android:layout_height="match_parent"
85-
android:layout_marginBottom="@dimen/textactions_bar_height" />
82+
android:layout_marginBottom="@dimen/textactions_bar_height"
83+
android:layout="@layout/document__fragment_view" />
8684

8785
<FrameLayout
8886
android:id="@+id/document__fragment_fullscreen_overlay"

app/thirdparty/assets/prism/components/prism-less.min.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/thirdparty/assets/prism/components/prism-nginx.min.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/thirdparty/assets/prism/components/prism-properties.min.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)