[gnome-builder/wip/chergert/markdown] markdown: live scrolling for markdown
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/chergert/markdown] markdown: live scrolling for markdown
- Date: Sat, 3 Oct 2015 00:33:08 +0000 (UTC)
commit 074fad2c06e48cdd5e7c7faad0e4612dfdc9a30d
Author: Christian Hergert <christian hergert me>
Date: Fri Oct 2 17:32:33 2015 -0700
markdown: live scrolling for markdown
.../html-preview/html_preview_plugin/__init__.py | 28 +++++-
.../html_preview_plugin/markdown-view.js | 97 +++++++++++++++++++-
2 files changed, 122 insertions(+), 3 deletions(-)
---
diff --git a/plugins/html-preview/html_preview_plugin/__init__.py
b/plugins/html-preview/html_preview_plugin/__init__.py
index 6cd4155..4c39580 100644
--- a/plugins/html-preview/html_preview_plugin/__init__.py
+++ b/plugins/html-preview/html_preview_plugin/__init__.py
@@ -23,6 +23,7 @@ from gettext import gettext as _
import gi
import os
+import re
gi.require_version('Builder', '1.0')
gi.require_version('Ide', '1.0')
@@ -37,6 +38,10 @@ from gi.repository import Ide
from gi.repository import WebKit2
from gi.repository import Peas
+TAG = re.compile(u'(<.+?>)')
+IDENT = u'53bde44bb4f156e94a85723fe633c80b54f11f69'
+B = re.compile(u'(?<=[a-zA-Z\d\u4e00-\u9fa5])\B(?=[a-zA-Z\d\u4e00-\u9fa5])')
+
class HtmlPreviewData(GObject.Object, Builder.ApplicationAddin):
MARKDOWN_CSS = None
MARKED_JS = None
@@ -104,7 +109,6 @@ class HtmlPreviewView(Builder.View):
settings = self.webview.get_settings()
settings.enable_html5_local_storage = False
-
language = document.get_language()
if language and language.get_id() == 'markdown':
self.markdown = True
@@ -120,7 +124,27 @@ class HtmlPreviewView(Builder.View):
return self.document
def get_markdown(self, text):
- text = text.replace("\"", "\\\"").replace("\n", "\\n")
+ # Determine the location of the insert cursor.
+ insert = self.document.get_insert()
+ iter = self.document.get_iter_at_mark(insert)
+ line = iter.get_line()
+
+ # However, we want to try to give some context while editing.
+ # So try to give 10 lines of context above.
+ #if line < 10:
+ # line = 0
+ #else:
+ # line -= 10
+
+ lines = text.split('\n')
+ if TAG.search(lines[line]) is not None:
+ lines[line] = TAG.sub(u'\\1 ' + IDENT, lines[line], 1)
+ else:
+ lines[line] = B.sub(IDENT, lines[line], 1)
+
+ # Generate our custom HTML with replaced text
+ text = '\n'.join(lines).replace("\"", "\\\"").replace("\n", "\\n")
+
params = (HtmlPreviewData.MARKDOWN_CSS,
text,
HtmlPreviewData.MARKED_JS,
diff --git a/plugins/html-preview/html_preview_plugin/markdown-view.js
b/plugins/html-preview/html_preview_plugin/markdown-view.js
index 80e32dd..4c4ee4d 100644
--- a/plugins/html-preview/html_preview_plugin/markdown-view.js
+++ b/plugins/html-preview/html_preview_plugin/markdown-view.js
@@ -1,5 +1,99 @@
+// most of this file is based on markdown-preview.vim
+//
+
+var renderer = new marked.Renderer();
+var flagSign = "53bde44bb4f156e94a85723fe633c80b54f11f69";
+var rFlagSign = flagSign.split('').reverse().join('');
+var aPoint = '<a style="position: relative;" href="#'+ rFlagSign +'" id="'+ rFlagSign +'"></a>';
+
+ renderer.heading = function(text, level, raw) {
+ var result = '';
+ if (text.indexOf(flagSign) !== -1) {
+ text = text.replace(flagSign, '');
+ raw = text;
+ result = aPoint;
+ }
+ return result
+ + '<h'
+ + level
+ + ' id="'
+ + this.options.headerPrefix
+ + raw.toLowerCase().replace(/[^\w]+/g, '-')
+ + '">'
+ + text
+ + '</h'
+ + level
+ + '>\n';
+ };
+
+ renderer.html = function(html) {
+ var i, len, line;
+ html = html.split('\n');
+ for(i = 0, len = html.length; i < len; i++) {
+ line = html[i];
+ if(line.indexOf(flagSign) !== -1) {
+ html[i] = line.replace(flagSign, '') + aPoint;
+ }
+ }
+ return html.join('\n');
+ };
+
+ renderer.listitem = function(text) {
+ text = text.replace(flagSign, aPoint);
+ return '<li>' + text + '</li>\n';
+ };
+
+ renderer.paragraph = function(text) {
+ text = text.replace(flagSign, aPoint);
+ return '<p>' + text + '</p>\n';
+ };
+
+ renderer.tablerow = function(content) {
+ content = content.replace(flagSign, aPoint);
+ return '<tr>\n' + content + '</tr>\n';
+ };
+
+ renderer.codespan = function(text) {
+ var result = '';
+ if(text.indexOf(flagSign) !== -1) {
+ text = text.replace(flagSign, '');
+ result = aPoint;
+ }
+ return result + '<code>' + text + '</code>\n'
+ };
+
+ renderer.image = function(href, title, text) {
+ var result = '';
+ if(!!title && title.indexOf(flagSign) !== -1) {
+ title = title.replace(flagSign, '');
+ result = aPoint;
+ }
+ if(!!text && text.indexOf(flagSign) !== -1) {
+ text = text.replace(flagSign, '');
+ result = aPoint;
+ }
+ return result + rImage.call(renderer, href, title, text);
+ };
+
+ renderer.link = function(href, title, text) {
+ var result = '';
+ if(!!href && href.indexOf(flagSign) !== -1) {
+ href = href.replace(flagSign, '');
+ result = aPoint;
+ }
+ if(!!title && title.indexOf(flagSign) !== -1) {
+ title = title.replace(flagSign, '');
+ result = aPoint;
+ }
+ if(!!text && text.indexOf(flagSign) !== -1) {
+ text = text.replace(flagSign, '');
+ result = aPoint;
+ }
+ return result + rLink.call(renderer, href, title, text);
+ };
+
marked.setOptions({
- renderer: new marked.Renderer(),
+ renderer: renderer,
gfm: true,
tables: true,
breaks: false,
@@ -11,4 +105,5 @@ marked.setOptions({
function preview(){
document.getElementById('preview').innerHTML = marked(str);
+ location.hash = '#' + rFlagSign;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]