Esempio n. 1
0
    def show_preview(self, loaded=False):
        if loaded:
            self.scrolled_window.remove(self.scrolled_window.get_child())
            self.scrolled_window.add(self.preview_webview)
            self.preview_webview.show()
            self.queue_draw()
        else:
            args = [
                '--standalone', '--mathjax',
                '--css=' + Theme.get_current().web_css_path, '--lua-filter=' +
                helpers.get_script_path('relative_to_absolute.lua'),
                '--lua-filter=' + helpers.get_script_path('task-list.lua')
            ]
            output = helpers.pandoc_convert(self.text_view.get_text(),
                                            to="html5",
                                            args=args)

            if self.preview_webview is None:
                self.preview_webview = WebKit.WebView()
                self.preview_webview.get_settings(
                ).set_allow_universal_access_from_file_urls(True)

                # Show preview once the load is finished
                self.preview_webview.connect("load-changed",
                                             self.on_preview_load_change)

                # This saying that all links will be opened in default browser, \
                # but local files are opened in appropriate apps:
                self.preview_webview.connect("decide-policy",
                                             self.on_click_link)

            self.preview_webview.load_html(output, 'file://localhost/')
Esempio n. 2
0
    def show_preview(self, loaded=False):
        if loaded:
            self.scrolled_window.remove(self.scrolled_window.get_child())
            self.scrolled_window.add(self.preview_webview)
            self.preview_webview.show()
            self.queue_draw()
        else:
            # Insert a tag with ID to scroll to
            # self.TextBuffer.insert_at_cursor('<span id="scroll_mark"></span>')
            # TODO
            # Find a way to find the next header, scroll to the next header.
            # TODO: provide a local version of mathjax

            # We need to convert relative routes to absolute ones
            # For that first we need to know if the file is saved:
            if self.filename:
                base_path = os.path.dirname(self.filename)
            else:
                base_path = ''
            os.environ['PANDOC_PREFIX'] = base_path + '/'

            args = ['pandoc',
                    '-s',
                    '--from=markdown',
                    '--to=html5',
                    '--mathjax',
                    '--css=' + Theme.get_current().web_css_path,
                    '--quiet',
                    '--lua-filter=' + helpers.get_script_path('relative_to_absolute.lua'),
                    '--lua-filter=' + helpers.get_script_path('task-list.lua')]

            # TODO: find a way to pass something like this instead of the quiet arg        
            #'--metadata pagetitle="test"',
            
            proc = subprocess.Popen(
                args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)

            text = bytes(self.get_text(), "utf-8")
            output = proc.communicate(text)[0]

            if self.preview_webview is None:
                self.preview_webview = WebKit.WebView()
                self.preview_webview.get_settings().set_allow_universal_access_from_file_urls(True)

                # Delete the cursor-scroll mark again
                # cursor_iter = self.TextBuffer.get_iter_at_mark(self.TextBuffer.get_insert())
                # begin_del = cursor_iter.copy()
                # begin_del.backward_chars(30)
                # self.TextBuffer.delete(begin_del, cursor_iter)

                # Show preview once the load is finished
                self.preview_webview.connect("load-changed", self.on_preview_load_change)

                # This saying that all links will be opened in default browser, \
                # but local files are opened in appropriate apps:
                self.preview_webview.connect("decide-policy", self.on_click_link)

            self.preview_webview.load_html(output.decode("utf-8"), 'file://localhost/')
Esempio n. 3
0
    def export(self, text=""):
        """Export the given text using the specified format.
        For advanced export, this includes special flags for the enabled options.

        Keyword Arguments:
            text {str} -- Text to export (default: {""})
        """

        export_type = self.stack.get_visible_child_name()
        args = []
        if export_type == "advanced":
            filename = self.adv_export_name.get_text()
            output_dir = os.path.abspath(
                self.filechoosers["advanced"].get_current_folder())
            basename = os.path.basename(filename)

            fmt = self.formats[self.format_field.get_active()]
            to = fmt["to"]
            ext = fmt["ext"]

            if self.builder.get_object("html5").get_active() and to == "html":
                to = "html5"
            if self.builder.get_object("smart").get_active():
                to += "+smart"

            args.extend(self.get_advanced_arguments(to, ext))

        else:
            args = ["--variable=papersize:a4"]
            filename = self.filechoosers[export_type].get_filename()
            if filename.endswith("." + export_type):
                filename = filename[:-len(export_type) - 1]
            output_dir = os.path.abspath(os.path.join(filename,
                                                      os.path.pardir))
            basename = os.path.basename(filename)

            to = export_type
            ext = export_type

            if export_type == "html":
                to = "html5"
                args.append("--standalone")
                args.append("--css=%s" % Theme.get_current().web_css_path)
                args.append("--mathjax")
                args.append(
                    "--lua-filter=%s" %
                    helpers.get_script_path('relative_to_absolute.lua'))
                args.append("--lua-filter=%s" %
                            helpers.get_script_path('task-list.lua'))

        helpers.pandoc_convert(text,
                               to=to,
                               args=args,
                               outputfile="%s/%s.%s" %
                               (output_dir, basename, ext))
Esempio n. 4
0
    def __init__(self, filename):
        """Set up the about dialog"""
        self.builder = Gtk.Builder()
        self.builder.add_from_resource(
            "/de/wolfvollprecht/UberWriter/ui/Export.ui")
        self.dialog = self.builder.get_object("Export")
        self.stack = self.builder.get_object("export_stack")
        self.stack_switcher = self.builder.get_object("format_switcher")
        self.paper_size = self.builder.get_object("combobox_paper_size")

        stack_pdf_disabled = self.builder.get_object("pdf_disabled")
        filename = filename or _("Untitled document.md")

        self.filechoosers = {
            export_format: self.stack.get_child_by_name(export_format)
            for export_format in ["pdf", "html", "advanced"]
        }
        for export_format, filechooser in self.filechoosers.items():
            filechooser.set_do_overwrite_confirmation(True)
            filechooser.set_current_folder(os.path.dirname(filename))
            if export_format == "advanced":
                self.adv_export_name = self.builder.get_object(
                    "advanced_export_name")
                self.adv_export_name.set_text(os.path.basename(filename)[:-3])
            else:
                filechooser.set_current_name(
                    os.path.basename(filename)[:-2] + export_format)

        # Disable pdf if Texlive not installed
        texlive_installed = helpers.exist_executable("pdftex")

        if not texlive_installed:
            self.filechoosers["pdf"].set_visible(False)
            stack_pdf_disabled.set_visible(True)
            stack_pdf_disabled.set_text(disabled_text())
            stack_pdf_disabled.set_justify(Gtk.Justification.CENTER)
            self.stack.connect('notify', self.allow_export,
                               'visible_child_name')

        self.builder.get_object("highlight_style").set_active(0)

        self.builder.get_object("css_filechooser").set_uri(
            helpers.path_to_file(Theme.get_current().web_css_path))

        format_store = Gtk.ListStore(int, str)
        for i, fmt in enumerate(self.formats):
            format_store.append([i, fmt["name"]])
        self.format_field = self.builder.get_object('choose_format')
        self.format_field.set_model(format_store)

        format_renderer = Gtk.CellRendererText()
        self.format_field.pack_start(format_renderer, True)
        self.format_field.add_attribute(format_renderer, "text", 1)
        self.format_field.set_active(0)
Esempio n. 5
0
    def apply_current_theme(self):
        # get current theme
        theme = Theme.get_current()

        # set theme variant (dark/light)
        Gtk.Settings.get_default().set_property(
            "gtk-application-prefer-dark-theme",
            GLib.Variant("b", theme.is_dark))

        # set theme css
        style_provider = Gtk.CssProvider()
        style_provider.load_from_path(theme.gtk_css_path)
        Gtk.StyleContext.add_provider_for_screen(
            Gdk.Screen.get_default(), style_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
Esempio n. 6
0
    def export(self, text=""):
        """Export the given text using the specified format.
        For advanced export, this includes special flags for the enabled options.

        Keyword Arguments:
            text {str} -- Text to export (default: {""})
        """

        export_type = self.stack.get_visible_child_name()
        args = []
        if export_type == "advanced":
            filename = self.adv_export_name.get_text()
            output_dir = os.path.abspath(self.filechoosers["advanced"].get_current_folder())
            basename = os.path.basename(filename)

            fmt = self.formats[self.format_field.get_active()]
            to = fmt["to"]
            ext = fmt["ext"]

            if self.builder.get_object("html5").get_active() and to == "html":
                to = "html5"
            if self.builder.get_object("smart").get_active():
                to += "+smart"

            args.extend(self.get_advanced_arguments())

        else:
            filename = self.filechoosers[export_type].get_filename()
            if filename.endswith("." + export_type):
                filename = filename[:-len(export_type)-1]
            output_dir = os.path.abspath(os.path.join(filename, os.path.pardir))
            basename = os.path.basename(filename)

            to = export_type
            ext = export_type

            if export_type == "html":
                to = "html5"
                args.append("--standalone")
                args.append("--css=%s" % Theme.get_current().web_css_path)
                args.append("--mathjax")
                args.append("--lua-filter=%s" % helpers.get_script_path('relative_to_absolute.lua'))
                args.append("--lua-filter=%s" % helpers.get_script_path('task-list.lua'))

        helpers.pandoc_convert(
            text, to=to, args=args,
            outputfile="%s/%s.%s" % (output_dir, basename, ext))
Esempio n. 7
0
    def __do_convert(self):
        while True:
            while True:
                (text, callback, user_data) = self.queue.get()
                if text is None and callback is None:
                    return
                if self.queue.empty():
                    break

            args = ['--standalone',
                    '--mathjax',
                    '--css=' + Theme.get_current().web_css_path,
                    '--lua-filter=' + helpers.get_script_path('relative_to_absolute.lua'),
                    '--lua-filter=' + helpers.get_script_path('task-list.lua')]
            text = helpers.pandoc_convert(text, to="html5", args=args)

            GLib.idle_add(callback, text, *user_data)
Esempio n. 8
0
    def __init__(self, filename):
        """Set up the about dialog"""
        self.builder = get_builder('Export')
        self.dialog = self.builder.get_object("Export")
        self.stack = self.builder.get_object("export_stack")
        self.stack_switcher = self.builder.get_object("format_switcher")

        stack_pdf_disabled = self.builder.get_object("pdf_disabled")
        filename = filename or _("Untitled document.md")

        self.filechoosers = {export_format: self.stack.get_child_by_name(export_format)
                             for export_format in ["pdf", "html", "advanced"]}
        for export_format, filechooser in self.filechoosers.items():
            filechooser.set_do_overwrite_confirmation(True)
            filechooser.set_current_folder(os.path.dirname(filename))
            if export_format == "advanced":
                self.adv_export_name = self.builder.get_object("advanced_export_name")
                self.adv_export_name.set_text(os.path.basename(filename)[:-3])
            else:
                filechooser.set_current_name(os.path.basename(filename)[:-2] + export_format)

        # Disable pdf if Texlive not installed
        texlive_installed = helpers.exist_executable("pdftex")

        if not texlive_installed:
            self.filechoosers["pdf"].set_visible(False)
            stack_pdf_disabled.set_visible(True)
            stack_pdf_disabled.set_text(disabled_text())
            stack_pdf_disabled.set_justify(Gtk.Justification.CENTER)
            self.stack.connect('notify', self.allow_export, 'visible_child_name')

        self.builder.get_object("highlight_style").set_active(0)

        self.builder.get_object("css_filechooser").set_uri(
            helpers.path_to_file(Theme.get_current().web_css_path))

        format_store = Gtk.ListStore(int, str)
        for i, fmt in enumerate(self.formats):
            format_store.append([i, fmt["name"]])
        self.format_field = self.builder.get_object('choose_format')
        self.format_field.set_model(format_store)

        format_renderer = Gtk.CellRendererText()
        self.format_field.pack_start(format_renderer, True)
        self.format_field.add_attribute(format_renderer, "text", 1)
        self.format_field.set_active(0)
Esempio n. 9
0
    def __do_convert(self):
        while True:
            while True:
                (text, callback, user_data) = self.queue.get()
                if text is None and callback is None:
                    return
                if self.queue.empty():
                    break

            args = [
                '--standalone', '--mathjax',
                '--css=' + Theme.get_current().web_css_path, '--lua-filter=' +
                helpers.get_script_path('relative_to_absolute.lua'),
                '--lua-filter=' + helpers.get_script_path('task-list.lua')
            ]
            text = helpers.pandoc_convert(text, to="html5", args=args)

            GLib.idle_add(callback, text, *user_data)
Esempio n. 10
0
    def apply_current_theme(self, *_):
        """Adjusts the window, CSD and preview for the current theme."""
        # Get current theme
        theme, changed = Theme.get_current_changed()
        if changed:
            # Set theme variant (dark/light)
            Gtk.Settings.get_default().set_property(
                "gtk-application-prefer-dark-theme",
                GLib.Variant("b", theme.is_dark))

            # Set theme css
            style_provider = Gtk.CssProvider()
            style_provider.load_from_path(helpers.get_css_path("gtk/base.css"))
            Gtk.StyleContext.add_provider_for_screen(
                self.get_screen(), style_provider,
                Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

            # Redraw contents of window
            self.queue_draw()
Esempio n. 11
0
    def apply_current_theme(self, *_):
        """Adjusts the window, CSD and preview for the current theme."""
        # Get current theme
        theme, changed = Theme.get_current_changed()
        if changed:
            # Set theme variant (dark/light)
            Gtk.Settings.get_default().set_property(
                "gtk-application-prefer-dark-theme",
                GLib.Variant("b", theme.is_dark))

            # Set theme css
            style_provider = Gtk.CssProvider()
            style_provider.load_from_path(helpers.get_css_path("gtk/base.css"))
            Gtk.StyleContext.add_provider_for_screen(
                self.get_screen(), style_provider,
                Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

            # Redraw contents of window
            self.queue_draw()
Esempio n. 12
0
    def apply_current_theme(self, *_):
        """Adjusts the window, CSD and preview for the current theme."""
        # Get current theme
        theme, changed = Theme.get_current_changed()
        if changed:
            # Set theme variant (dark/light)
            Gtk.Settings.get_default().set_property(
                "gtk-application-prefer-dark-theme",
                GLib.Variant("b", theme.is_dark))

            # Set theme css
            css_provider_file = Gio.File.new_for_uri(
                "resource:///de/wolfvollprecht/UberWriter/media/css/gtk/base.css"
            )
            style_provider = Gtk.CssProvider()
            style_provider.load_from_file(css_provider_file)
            Gtk.StyleContext.add_provider_for_screen(
                self.get_screen(), style_provider,
                Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)

            # Redraw contents of window
            self.queue_draw()