diff --git a/.sublime/Default.sublime-keymap b/.sublime/Default.sublime-keymap index 14d8af4..fe4ac3b 100644 --- a/.sublime/Default.sublime-keymap +++ b/.sublime/Default.sublime-keymap @@ -3,7 +3,7 @@ "keys": ["alt+m"], "command": "toggle_setting", "args": { - "setting": "markdown_preview_enabled" + "setting": "markdown_live_preview_enabled" }, "context": [ { diff --git a/.sublime/MarkdownLivePreview.sublime-commands b/.sublime/MarkdownLivePreview.sublime-commands index 59d9993..0ca84ac 100644 --- a/.sublime/MarkdownLivePreview.sublime-commands +++ b/.sublime/MarkdownLivePreview.sublime-commands @@ -3,7 +3,7 @@ "caption": "MarkdownLivePreview: Toggle", "command": "toggle_setting", "args": { - "setting": "markdown_preview_enabled" + "setting": "markdown_live_preview_enabled" } } ] diff --git a/MLPApi.py b/MLPApi.py new file mode 100644 index 0000000..d41d4f8 --- /dev/null +++ b/MLPApi.py @@ -0,0 +1,27 @@ +# -*- encoding: utf-8 -*- + +import sublime +import sublime_plugin + +from .functions import * +from .setting_names import * + +def get_preview_name(md_view): + name = md_view.name() \ + or os.path.basename(md_view.file_name()) \ + or 'Untitled' + return name + '- Preview' + +def create_preview(md_view): + window = md_view.window() + md_view_settings = md_view.settings() + + preview = window.new_file() + preview.set_name(get_preview_name(md_view)) + preview.set_scratch(True) + preview.settings().set(IS_PREVIEW, True) + window.run_command('new_pane') # move to new group + + md_view_settings.set(PREVIEW_ID, preview.id()) + + return preview diff --git a/MarkdownLivePreview.py b/MarkdownLivePreview.py new file mode 100644 index 0000000..9608424 --- /dev/null +++ b/MarkdownLivePreview.py @@ -0,0 +1,52 @@ +# -*- encoding: utf-8 -*- + +import sys +import os.path +import sublime +import sublime_plugin + +from .MLPApi import * +from .setting_names import * +from .functions import * + +class MarkdownLivePreviewListener(sublime_plugin.EventListener): + + def on_load(self, view): + if not is_markdown_view(view): + return + vsettings = view.settings() + + def on_modified(self, md_view): + if not is_markdown_view(md_view): + return + window = md_view.window() + md_view_settings = md_view.settings() + if md_view_settings.get(PREVIEW_ENABLED) is not True: + return + + if not md_view_settings.get(PREVIEW_ID): + create_preview(md_view) + window.focus_view(md_view) + + def on_pre_close(self, view): + vsettings = view.settings() + window = view.window() + if vsettings.get(IS_PREVIEW) is True: + if vsettings.get(IS_HIDDEN) is True: + return + mdvsettings = get_view_from_id(window, vsettings.get(MD_VIEW_ID)) + if mdvsettings is None: + return + mdvsettings = mdvsettings.settings() + mdvsettings.erase(PREVIEW_ENABLED) + mdvsettings.erase(PREVIEW_ID) + return + + id = vsettings.get(PREVIEW_ID) + + if vsettings.get(PREVIEW_ENABLED) is True and id is not None: + preview = get_view_from_id(window, id) + preview_settings = preview.settings() + preview_settings.erase(IS_PREVIEW) + preview_settings.erase(MD_VIEW_ID) + sublime.set_timeout_async(lambda: preview.close(), 250) diff --git a/MarkdownLivePreview.tasks b/MarkdownLivePreview.tasks index d63639e..680cd85 100644 --- a/MarkdownLivePreview.tasks +++ b/MarkdownLivePreview.tasks @@ -1,17 +1,16 @@ Fast: ☐ sync scroll @needsUpdate(because of images) - ☐ regive focus to the right markdown view + ☐ cache image in object when used, so that it's faster @needsTest ☐ call settings listener on_new too - might be too heavy - ☐ use alt attribute for 404 error Medium: ☐ auto refresh preview if loading images - ☐ cache image in object when used, so that it's faster @needsTest + ☐ use alt attribute for 404 error ☐ use MarkdownLivePreview syntax, so we can use syntax's settings Long: - ☐ fix #4 + ☐ fix #4 @high ☐ support hanchor (TOC) @big Unknown: @@ -20,6 +19,7 @@ Unknown: ___________________ Archive: + ✔ regive focus to the right markdown view @done Mon 02 Jan 2017 at 18:34 @project(Fast) ✔ try/except for 404 @done Mon 02 Jan 2017 at 18:03 @project(Fast) ✔ fix bug when empty `src` @done Mon 02 Jan 2017 at 17:15 @project(Fast) ✔ preview.set_scratch(True) @done Mon 02 Jan 2017 at 16:58 diff --git a/devListener.py b/devListener.py new file mode 100644 index 0000000..e48f398 --- /dev/null +++ b/devListener.py @@ -0,0 +1,19 @@ +# -*- encoding: utf-8 -*- + +import sublime +import sublime_plugin +import os.path + +class MLPDevListener(sublime_plugin.EventListener): + + def on_post_save(self, view): + if not (os.path.dirname(__file__) in view.file_name() and + view.file_name().endswith('.py')): + return + sublime.run_command('reload_plugin', { + 'main': os.path.join(sublime.packages_path(), + 'MarkdownLivePreview', 'md_in_popup.py'), + 'scripts': ['image_manager', 'functions', 'MLPApi', + 'setting_names'], + 'quiet': True + }) diff --git a/functions.py b/functions.py index 96842e8..17d5985 100644 --- a/functions.py +++ b/functions.py @@ -5,6 +5,9 @@ import sublime file404 = os.path.join(os.path.dirname(__file__), '404.png') +def is_markdown_view(view): + return 'markdown' in view.scope_name(0) + def to_base64(path=None, content=None): if path is None and content is None: return to_base64(file404) diff --git a/md_in_popup.py b/md_in_popup.py index 762d3b5..95d22a7 100644 --- a/md_in_popup.py +++ b/md_in_popup.py @@ -175,7 +175,7 @@ def show_html(md_view, preview): vector[1] += preview.line_height() preview.set_viewport_position(vector, animate=False) -class MLPDevListener(sublime_plugin.EventListener): +class MLPDevListener: def on_post_save(self, view): if not (os.path.dirname(__file__) in view.file_name() and @@ -188,7 +188,8 @@ class MLPDevListener(sublime_plugin.EventListener): 'quiet': True }) -class MarkdownLivePReviewListener(sublime_plugin.EventListener): +# class MarkdownLivePReviewListener(sublime_plugin.EventListener): +class MarkdownLivePReviewListener: def on_load(self, view): settings = view.settings() @@ -197,6 +198,31 @@ class MarkdownLivePReviewListener(sublime_plugin.EventListener): settings.add_on_change('markdown_preview_enabled', lambda: self.on_modified(view)) + def on_deactivated_async(self, md_view): + md_view_settings = md_view.settings() + if md_view.window().active_view().settings()\ + .get('is_markdown_preview'): + return + return + markdown_preview_enabled = md_view_settings.get( + 'markdown_preview_enabled') is True + preview_id = md_view_settings.get('markdown_preview_id', None) + + if not markdown_preview_enabled or not preview_id: + return + + get_view_from_id(md_view.window(), preview_id).close() + md_view_settings.erase('markdown_preview_id') + + + def on_activated(self, md_view): + md_view_settings = md_view.settings() + markdown_preview_enabled = md_view_settings.get( + 'markdown_preview_enabled') is True + if markdown_preview_enabled: + return + create_preview(md_view.window(), md_view) + def on_modified(self, md_view): window = md_view.window() md_view_settings = md_view.settings() diff --git a/sample.md b/sample.md index 977b065..58c1a7e 100644 --- a/sample.md +++ b/sample.md @@ -1,9 +1,5 @@ # DuckDuckGo - The Search engine you'll fall in love with -![DuckDUckGo](http://www.articpost.com/wp-content/uploads/2014/08/DuckDuckGo-Search-Engine.jpg) - ![image](http://afterishtar.pl/images/100x100.gif) -![image](http://erewer.omc/dsfdsf) - -This is a test +hello! diff --git a/setting_names.py b/setting_names.py new file mode 100644 index 0000000..1d1ad07 --- /dev/null +++ b/setting_names.py @@ -0,0 +1,7 @@ +# -*- encoding: utf-8 -*- + +PREVIEW_ENABLED = 'markdown_live_preview_enabled' +PREVIEW_ID = 'markdown_live_preview_id' +IS_PREVIEW = 'is_markdown_live_preview' +IS_HIDDEN = 'is_hidden_markdown_live_preview' +MD_VIEW_ID = 'markdown_live_preview_md_id'