diff --git a/MLPApi.py b/MLPApi.py index 5fc86bd..958dab2 100644 --- a/MLPApi.py +++ b/MLPApi.py @@ -21,7 +21,13 @@ def get_preview_name(md_view): name = md_view.name() \ or os.path.basename(md_view.file_name()) \ or 'Untitled' - return name + '- Preview' + return name + ' - Preview' + +def find_preview(window): + for view in window.views(): + vsettings = view.settings() + if vsettings.get(IS_PREVIEW): + yield view, vsettings def create_preview(md_view): window = md_view.window() @@ -29,25 +35,59 @@ def create_preview(md_view): md_view_settings.set(JUST_CREATED, True) preview = window.new_file() - preview.settings().set(IS_PREVIEW, True) + + psettings = preview.settings() + psettings.set(IS_PREVIEW, True) + psettings.set(MD_VIEW_ID, md_view.id()) preview.set_name(get_preview_name(md_view)) preview.set_scratch(True) - window.run_command('new_pane') # move to new group - md_view_settings.set(PREVIEW_ID, preview.id()) + window.run_command('new_pane') # move to new group + return preview + return preview -def hide_preview(md_view): +def hide_preview(view): + window = view.window() + vsettings = view.settings() + if vsettings.get(IS_PREVIEW): + preview = view + psettings = vsettings + md_view_id = vsettings.get(MD_VIEW_ID) + md_view = get_view_from_id(window, md_view_id) + if md_view is None: + raise ValueError('Tried to get md_view from id {} but got None'.format(md_view_id)) + mdvsettings = md_view.settings() + + elif vsettings.get(PREVIEW_ENABLED): + md_view = view + preview_id = vsettings.get(PREVIEW_ID) + preview = get_view_from_id(window, preview_id) + mdvsettings = vsettings + if preview is None: + raise ValueError('Tried to get preview from id {} but got None'.format(preview_id)) + psettings = preview.settings() + else: + raise ValueError('Call hide_preview with a view which is not the preview or the md_view') + psettings.set(IS_HIDDEN, True) + mdvsettings.erase(PREVIEW_ID) + sublime.set_timeout(lambda: preview.close(), 250) + return + + + window = md_view.window() if window is None: return mdvsettings = md_view.settings() preview_id = mdvsettings.get(PREVIEW_ID) + if not preview_id: + return mdvsettings.erase(PREVIEW_ID) preview = get_view_from_id(window, preview_id) if preview is None: - return + raise ValueError('Tried to get view from id {} but got None'.format(preview_id)) psettings = preview.settings() psettings.set(IS_HIDDEN, True) sublime.set_timeout(preview.close(), 250) diff --git a/MarkdownLivePreview.py b/MarkdownLivePreview.py index a31c159..8ce1074 100644 --- a/MarkdownLivePreview.py +++ b/MarkdownLivePreview.py @@ -11,15 +11,33 @@ from .functions import * class MarkdownLivePreviewListener(sublime_plugin.EventListener): + def on_activated(self, view): + # if view is md_view and has no preview + # -> create preview + window = view.window() + vsettings = view.settings() + if vsettings.get(PREVIEW_ENABLED): + id = vsettings.get(PREVIEW_ID) + if id is None or get_view_from_id(window, id) is None: + preview = create_preview(view) + return + + # if view is preview + # -> do nothing + if vsettings.get(IS_PREVIEW): + return + # if view is not the md_view or the preview + # remove preview if any + for view, settings in find_preview(window): + settings.set(IS_HIDDEN, True) + view.close() + +class MarkdownLivePreviewListener_: + def __init__(self, *args, **kwargs): super(MarkdownLivePreviewListener, *args, **kwargs) self.last_deactivated_view = None - 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 @@ -32,14 +50,18 @@ class MarkdownLivePreviewListener(sublime_plugin.EventListener): MarkdownLivePreviewListener.md_view = md_view create_preview(md_view) MarkdownLivePreviewListener.has_preview = True - window.focus_view(md_view) + # window.focus_view(md_view) + return + if True: + pass else: preview = get_view_from_id(window, id) if preview is None: - raise ValueError('Getting preview from id: got None') + raise ValueError('Glastetting preview from id: got None') show_html(md_view, preview) def on_pre_close(self, view): + return vsettings = view.settings() window = view.window() if vsettings.get(IS_PREVIEW) is True: @@ -63,7 +85,9 @@ class MarkdownLivePreviewListener(sublime_plugin.EventListener): sublime.set_timeout(lambda: preview.close(), 250) def on_deactivated(self, view): - self.last_deactivated_view = view + settings = view.settings() + if settings.get(IS_PREVIEW) or settings.get(PREVIEW_ENABLED): + self.last_deactivated_view = view def on_activated(self, view): vsettings = view.settings() @@ -76,7 +100,13 @@ class MarkdownLivePreviewListener(sublime_plugin.EventListener): return if id is not None: return - return create_preview(view) + create_preview(view) + # view.window().focus_view(view) + return + if self.last_deactivated_view: + window = view.window() + focused_view = window.active_view() hide_preview(self.last_deactivated_view) + window.focus_view(focused_view) diff --git a/md_in_popup.py b/md_in_popup.py deleted file mode 100644 index 95d22a7..0000000 --- a/md_in_popup.py +++ /dev/null @@ -1,270 +0,0 @@ -# -*- encoding: utf-8 -*- -import sublime -import sublime_plugin -import os.path -import re -from html.parser import HTMLParser - -from .lib import markdown2 -from .image_manager import ImageManager -from .escape_amp import * -from .functions import * - -# Main sublime tools function - -def plugin_loaded(): - global STYLE_FILE - STYLE_FILE = os.path.join(sublime.packages_path(), 'User', 'MarkdownLivePreview.css') - -def replace_img_src_base64(html): - """Really messy, but it works (should be updated)""" - index = -1 - tag_start = ' blocks - this function replaces every \n with a
in a
"""
-
-    while True:
-        obj = re.search(r'
(.*?)
', html, re.DOTALL) - if not obj: - break - html = list(html) - html[obj.start(0):obj.end(0)] = '
' + ''.join(html[obj.start(1):obj.end(1)]) \
-                                            .replace('\n', '
') \ - .replace(' ', ' ') + '
' - html = ''.join(html) - return html - -def close_preview(md_view_settings, preview): - preview.close() - md_view_settings.erase('markdown_preview_id') - md_view_settings.erase('markdown_preview_enabled') - -def create_preview(window, md_view): - focus_group, focus_view = window.get_view_index(md_view) - preview = window.new_file() - window.run_command('new_pane') # move the preview to a new group - name = md_view.name() or os.path.basename(md_view.file_name()) \ - or 'Untitled' - preview.set_name(name + ' - Preview') - preview.set_scratch(True) - - preview_settings = preview.settings() - preview_settings.set('gutter', False) - preview_settings.set('word_wrap', True) - preview_settings.set('is_markdown_preview', True) - preview_settings.set('markdown_view_id', md_view.id()) - - - md_view.settings().set('markdown_preview_id', preview.id()) - window.focus_group(focus_group) - window.focus_view(md_view) - - return preview - -def show_html(md_view, preview): - html = '\n{}'.format(get_style(), - pre_with_br(markdown2.markdown(get_view_content(md_view), - extras=['fenced-code-blocks', - 'no-code-highlighting']))) - - # the option no-code-highlighting does not exists - # in the official version of markdown2 for now - # I personaly edited the file (markdown2.py:1743) - - html = html.replace(' ', ' espace;') # save where are the spaces - - html = HTMLParser().unescape(html) - - html = escape_amp(html) - - # exception, again, because
 aren't supported by the phantoms
-    html = html.replace(' espace;', '.')
-    html = replace_img_src_base64(html)
-    preview.erase_phantoms('markdown_preview')
-    preview.add_phantom('markdown_preview',
-                         sublime.Region(-1),
-                         html,
-                         sublime.LAYOUT_BLOCK,
-                         lambda href: sublime.run_command('open_url',
-                                                          {'url': href}))
-
-    # set viewport position
-
-    # 0 < y < 1
-    y = md_view.text_to_layout(md_view.sel()[0].begin())[1] / md_view.layout_extent()[1]
-    vector = [0, y * preview.layout_extent()[1]]
-    # remove half of the viewport_extent.y to center it on the screen (verticaly)
-    vector[1] -= preview.viewport_extent()[1] / 2
-    vector[1] = mini(vector[1], 0)
-    vector[1] += preview.line_height()
-    preview.set_viewport_position(vector, animate=False)
-
-class MLPDevListener:
-
-    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'],
-            'quiet': True
-        })
-
-# class MarkdownLivePReviewListener(sublime_plugin.EventListener):
-class MarkdownLivePReviewListener:
-
-    def on_load(self, view):
-        settings = view.settings()
-        if not 'markdown' in settings.get('syntax').lower():
-            return
-        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()
-
-        if not 'markdown' in md_view_settings.get('syntax').lower():
-            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:
-            if preview_id is not None:
-                preview = get_view_from_id(window, preview_id)
-                if preview:
-                    close_preview(md_view_settings, preview)
-            return
-
-        if preview_id is None:
-            preview = create_preview(window, md_view)
-        else:
-            preview = get_view_from_id(window, preview_id)
-            if not preview:
-                md_view_settings.erase('markdown_preview_id')
-                md_view_settings.erase('markdown_preview_enabled')
-                return
-
-        show_html(md_view, preview)
-
-    def on_pre_close(self, view):
-        settings = view.settings()
-        if settings.get('markdown_preview_enabled') is True:
-            preview = get_view_from_id(view.window(),
-                                       settings.get('markdown_preview_id'))
-            if preview:
-                sublime.set_timeout_async(lambda: preview.close(), 250)
-        elif settings.get('is_markdown_preview') is True:
-            md_view = get_view_from_id(view.window(),
-                                       settings.get('markdown_view_id'))
-            if md_view:
-                def callback():
-                    md_view_settings = md_view.settings()
-                    md_view_settings.erase('markdown_preview_enabled')
-                    md_view_settings.erase('markdown_preview_id')
-                sublime.set_timeout_async(callback, 250)