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/')
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/')
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))
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)
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)
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))
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)
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)
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)
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()
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()