From 54c417391dbe4544eed7ecfa51aa87292826b10a Mon Sep 17 00:00:00 2001 From: Florian Bruhin Date: Fri, 15 Sep 2017 18:26:33 +0200 Subject: [PATCH] Add a qute://configdiff page --- qutebrowser/browser/qutescheme.py | 13 +- qutebrowser/config/configdiff.py | 758 ++++++++++++++++++++++++++++++ 2 files changed, 770 insertions(+), 1 deletion(-) create mode 100644 qutebrowser/config/configdiff.py diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py index b6f50c2b3..6b382c32e 100644 --- a/qutebrowser/browser/qutescheme.py +++ b/qutebrowser/browser/qutescheme.py @@ -34,7 +34,7 @@ import pkg_resources from PyQt5.QtCore import QUrlQuery, QUrl import qutebrowser -from qutebrowser.config import config, configdata, configexc +from qutebrowser.config import config, configdata, configexc, configdiff from qutebrowser.utils import (version, utils, jinja, log, message, docutils, objreg, usertypes, qtutils) from qutebrowser.misc import objects @@ -421,3 +421,14 @@ def qute_settings(url): configdata=configdata, confget=config.instance.get_str) return 'text/html', html + + +@add_handler('configdiff') +def qute_configdiff(_url): + """Handler for qute://configdiff.""" + try: + return 'text/html', configdiff.get_diff() + except OSError as e: + error = (b'Failed to read old config: ' + + str(e.strerror).encode('utf-8')) + return 'text/plain', error diff --git a/qutebrowser/config/configdiff.py b/qutebrowser/config/configdiff.py new file mode 100644 index 000000000..cad66d749 --- /dev/null +++ b/qutebrowser/config/configdiff.py @@ -0,0 +1,758 @@ +# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et: + +# Copyright 2017 Florian Bruhin (The Compiler) +# +# This file is part of qutebrowser. +# +# qutebrowser is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# qutebrowser is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with qutebrowser. If not, see . + +"""Code to show a diff of the legacy config format.""" + +import difflib +import os.path + +import pygments +import pygments.lexers +import pygments.formatters + +from qutebrowser.utils import standarddir + + +OLD_CONF = """ +[general] +ignore-case = smart +startpage = https://start.duckduckgo.com +yank-ignored-url-parameters = ref,utm_source,utm_medium,utm_campaign,utm_term,utm_content +default-open-dispatcher = +default-page = ${startpage} +auto-search = naive +auto-save-config = true +auto-save-interval = 15000 +editor = gvim -f "{}" +editor-encoding = utf-8 +private-browsing = false +developer-extras = false +print-element-backgrounds = true +xss-auditing = false +default-encoding = iso-8859-1 +new-instance-open-target = tab +new-instance-open-target.window = last-focused +log-javascript-console = debug +save-session = false +session-default-name = +url-incdec-segments = path,query +[ui] +history-session-interval = 30 +zoom-levels = 25%,33%,50%,67%,75%,90%,100%,110%,125%,150%,175%,200%,250%,300%,400%,500% +default-zoom = 100% +downloads-position = top +status-position = bottom +message-timeout = 2000 +message-unfocused = false +confirm-quit = never +zoom-text-only = false +frame-flattening = false +user-stylesheet = +hide-scrollbar = true +smooth-scrolling = false +remove-finished-downloads = -1 +hide-statusbar = false +statusbar-padding = 1,1,0,0 +window-title-format = {perc}{title}{title_sep}qutebrowser +modal-js-dialog = false +hide-wayland-decoration = false +keyhint-blacklist = +keyhint-delay = 500 +prompt-radius = 8 +prompt-filebrowser = true +[network] +do-not-track = true +accept-language = en-US,en +referer-header = same-domain +user-agent = +proxy = system +proxy-dns-requests = true +ssl-strict = ask +dns-prefetch = true +custom-headers = +netrc-file = +[completion] +show = always +download-path-suggestion = path +timestamp-format = %Y-%m-%d +height = 50% +cmd-history-max-items = 100 +web-history-max-items = -1 +quick-complete = true +shrink = false +scrollbar-width = 12 +scrollbar-padding = 2 +[input] +timeout = 500 +partial-timeout = 5000 +insert-mode-on-plugins = false +auto-leave-insert-mode = true +auto-insert-mode = false +forward-unbound-keys = auto +spatial-navigation = false +links-included-in-focus-chain = true +rocker-gestures = false +mouse-zoom-divider = 512 +[tabs] +background-tabs = false +select-on-remove = next +new-tab-position = next +new-tab-position-explicit = last +last-close = ignore +show = always +show-switching-delay = 800 +wrap = true +movable = true +close-mouse-button = middle +position = top +show-favicons = true +favicon-scale = 1.0 +width = 20% +pinned-width = 43 +indicator-width = 3 +tabs-are-windows = false +title-format = {index}: {title} +title-format-pinned = {index} +title-alignment = left +mousewheel-tab-switching = true +padding = 0,0,5,5 +indicator-padding = 2,2,0,4 +[storage] +download-directory = +prompt-download-directory = true +remember-download-directory = true +maximum-pages-in-cache = 0 +offline-web-application-cache = true +local-storage = true +cache-size = +[content] +allow-images = true +allow-javascript = true +allow-plugins = false +webgl = true +hyperlink-auditing = false +geolocation = ask +notifications = ask +media-capture = ask +javascript-can-open-windows-automatically = false +javascript-can-close-windows = false +javascript-can-access-clipboard = false +ignore-javascript-prompt = false +ignore-javascript-alert = false +local-content-can-access-remote-urls = false +local-content-can-access-file-urls = true +cookies-accept = no-3rdparty +cookies-store = true +host-block-lists = https://www.malwaredomainlist.com/hostslist/hosts.txt,http://someonewhocares.org/hosts/hosts,http://winhelp2002.mvps.org/hosts.zip,http://malwaredomains.lehigh.edu/files/justdomains.zip,https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&mimetype=plaintext +host-blocking-enabled = true +host-blocking-whitelist = piwik.org +enable-pdfjs = false +[hints] +border = 1px solid #E3BE23 +mode = letter +chars = asdfghjkl +min-chars = 1 +scatter = true +uppercase = false +dictionary = /usr/share/dict/words +auto-follow = unique-match +auto-follow-timeout = 0 +next-regexes = \bnext\b,\bmore\b,\bnewer\b,\b[>→≫]\b,\b(>>|»)\b,\bcontinue\b +prev-regexes = \bprev(ious)?\b,\bback\b,\bolder\b,\b[<←≪]\b,\b(<<|«)\b +find-implementation = python +hide-unmatched-rapid-hints = true +[searchengines] +DEFAULT = https://duckduckgo.com/?q={} +[aliases] +[colors] +completion.fg = white +completion.bg = #333333 +completion.alternate-bg = #444444 +completion.category.fg = white +completion.category.bg = qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 #888888, stop:1 #505050) +completion.category.border.top = black +completion.category.border.bottom = ${completion.category.border.top} +completion.item.selected.fg = black +completion.item.selected.bg = #e8c000 +completion.item.selected.border.top = #bbbb00 +completion.item.selected.border.bottom = ${completion.item.selected.border.top} +completion.match.fg = #ff4444 +completion.scrollbar.fg = ${completion.fg} +completion.scrollbar.bg = ${completion.bg} +statusbar.fg = white +statusbar.bg = black +statusbar.fg.private = ${statusbar.fg} +statusbar.bg.private = #666666 +statusbar.fg.insert = ${statusbar.fg} +statusbar.bg.insert = darkgreen +statusbar.fg.command = ${statusbar.fg} +statusbar.bg.command = ${statusbar.bg} +statusbar.fg.command.private = ${statusbar.fg.private} +statusbar.bg.command.private = ${statusbar.bg.private} +statusbar.fg.caret = ${statusbar.fg} +statusbar.bg.caret = purple +statusbar.fg.caret-selection = ${statusbar.fg} +statusbar.bg.caret-selection = #a12dff +statusbar.progress.bg = white +statusbar.url.fg = ${statusbar.fg} +statusbar.url.fg.success = white +statusbar.url.fg.success.https = lime +statusbar.url.fg.error = orange +statusbar.url.fg.warn = yellow +statusbar.url.fg.hover = aqua +tabs.fg.odd = white +tabs.bg.odd = grey +tabs.fg.even = white +tabs.bg.even = darkgrey +tabs.fg.selected.odd = white +tabs.bg.selected.odd = black +tabs.fg.selected.even = ${tabs.fg.selected.odd} +tabs.bg.selected.even = ${tabs.bg.selected.odd} +tabs.bg.bar = #555555 +tabs.indicator.start = #0000aa +tabs.indicator.stop = #00aa00 +tabs.indicator.error = #ff0000 +tabs.indicator.system = rgb +hints.fg = black +hints.bg = qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 247, 133, 0.8), stop:1 rgba(255, 197, 66, 0.8)) +hints.fg.match = green +downloads.bg.bar = black +downloads.fg.start = white +downloads.bg.start = #0000aa +downloads.fg.stop = ${downloads.fg.start} +downloads.bg.stop = #00aa00 +downloads.fg.system = rgb +downloads.bg.system = rgb +downloads.fg.error = white +downloads.bg.error = red +webpage.bg = white +keyhint.fg = #FFFFFF +keyhint.fg.suffix = #FFFF00 +keyhint.bg = rgba(0, 0, 0, 80%) +messages.fg.error = white +messages.bg.error = red +messages.border.error = #bb0000 +messages.fg.warning = white +messages.bg.warning = darkorange +messages.border.warning = #d47300 +messages.fg.info = white +messages.bg.info = black +messages.border.info = #333333 +prompts.fg = white +prompts.bg = darkblue +prompts.selected.bg = #308cc6 +[fonts] +_monospace = xos4 Terminus, Terminus, Monospace, "DejaVu Sans Mono", Monaco, "Bitstream Vera Sans Mono", "Andale Mono", "Courier New", Courier, "Liberation Mono", monospace, Fixed, Consolas, Terminal +completion = 8pt ${_monospace} +completion.category = bold ${completion} +tabbar = 8pt ${_monospace} +statusbar = 8pt ${_monospace} +downloads = 8pt ${_monospace} +hints = bold 13px ${_monospace} +debug-console = 8pt ${_monospace} +web-family-standard = +web-family-fixed = +web-family-serif = +web-family-sans-serif = +web-family-cursive = +web-family-fantasy = +web-size-minimum = 0 +web-size-minimum-logical = 6 +web-size-default = 16 +web-size-default-fixed = 13 +keyhint = 8pt ${_monospace} +messages.error = 8pt ${_monospace} +messages.warning = 8pt ${_monospace} +messages.info = 8pt ${_monospace} +prompts = 8pt sans-serif +""" + +OLD_KEYS_CONF = """ +[!normal] +leave-mode + + +[normal] +clear-keychain ;; search ;; fullscreen --leave + + +set-cmd-text -s :open + o +set-cmd-text :open {url:pretty} + go +set-cmd-text -s :open -t + O +set-cmd-text :open -t -i {url:pretty} + gO +set-cmd-text -s :open -b + xo +set-cmd-text :open -b -i {url:pretty} + xO +set-cmd-text -s :open -w + wo +set-cmd-text :open -w {url:pretty} + wO +set-cmd-text / + / +set-cmd-text ? + ? +set-cmd-text : + : +open -t + ga + +open -w + +tab-close + d + +tab-close -o + D +tab-only + co +tab-focus + T +tab-move + gm +tab-move - + gl +tab-move + + gr +tab-next + J + +tab-prev + K + +tab-clone + gC +reload + r + +reload -f + R + +back + H + +back -t + th +back -w + wh +forward + L + +forward -t + tl +forward -w + wl +fullscreen + +hint + f +hint all tab + F +hint all window + wf +hint all tab-bg + ;b +hint all tab-fg + ;f +hint all hover + ;h +hint images + ;i +hint images tab + ;I +hint links fill :open {hint-url} + ;o +hint links fill :open -t -i {hint-url} + ;O +hint links yank + ;y +hint links yank-primary + ;Y +hint --rapid links tab-bg + ;r +hint --rapid links window + ;R +hint links download + ;d +hint inputs + ;t +scroll left + h +scroll down + j +scroll up + k +scroll right + l +undo + u + +scroll-perc 0 + gg +scroll-perc + G +search-next + n +search-prev + N +enter-mode insert + i +enter-mode caret + v +enter-mode set_mark + ` +enter-mode jump_mark + ' +yank + yy +yank -s + yY +yank title + yt +yank title -s + yT +yank domain + yd +yank domain -s + yD +yank pretty-url + yp +yank pretty-url -s + yP +open -- {clipboard} + pp +open -- {primary} + pP +open -t -- {clipboard} + Pp +open -t -- {primary} + PP +open -w -- {clipboard} + wp +open -w -- {primary} + wP +quickmark-save + m +set-cmd-text -s :quickmark-load + b +set-cmd-text -s :quickmark-load -t + B +set-cmd-text -s :quickmark-load -w + wb +bookmark-add + M +set-cmd-text -s :bookmark-load + gb +set-cmd-text -s :bookmark-load -t + gB +set-cmd-text -s :bookmark-load -w + wB +save + sf +set-cmd-text -s :set + ss +set-cmd-text -s :set -t + sl +set-cmd-text -s :bind + sk +zoom-out + - +zoom-in + + +zoom + = +navigate prev + [[ +navigate next + ]] +navigate prev -t + {{ +navigate next -t + }} +navigate up + gu +navigate up -t + gU +navigate increment + +navigate decrement + +inspector + wi +download + gd +download-cancel + ad +download-clear + cd +view-source + gf +set-cmd-text -s :buffer + gt +tab-focus last + + + +enter-mode passthrough + +quit + + ZQ +wq + ZZ +scroll-page 0 1 + +scroll-page 0 -1 + +scroll-page 0 0.5 + +scroll-page 0 -0.5 + +tab-focus 1 + + g0 + g^ +tab-focus 2 + +tab-focus 3 + +tab-focus 4 + +tab-focus 5 + +tab-focus 6 + +tab-focus 7 + +tab-focus 8 + +tab-focus -1 + + g$ +home + +stop + +print + +open qute://settings + Ss +follow-selected + + + + + + +follow-selected -t + + +repeat-command + . +tab-pin + +record-macro + q +run-macro + @ +[insert] +open-editor + +insert-text {primary} + +[hint] +follow-hint + + + + + + +hint --rapid links tab-bg + +hint links + +hint all tab-bg + +[passthrough] +[command] +command-history-prev + +command-history-next + +completion-item-focus prev + + +completion-item-focus next + + +completion-item-focus next-category + +completion-item-focus prev-category + +completion-item-del + +command-accept + + + + + + +[prompt] +prompt-accept + + + + + + +prompt-accept yes + y +prompt-accept no + n +prompt-open-download + +prompt-item-focus prev + + +prompt-item-focus next + + +[command,prompt] +rl-backward-char + +rl-forward-char + +rl-backward-word + +rl-forward-word + +rl-beginning-of-line + +rl-end-of-line + +rl-unix-line-discard + +rl-kill-line + +rl-kill-word + +rl-unix-word-rubout + +rl-backward-kill-word + +rl-yank + +rl-delete-char + +rl-backward-delete-char + +[caret] +toggle-selection + v + +drop-selection + +enter-mode normal + c +move-to-next-line + j +move-to-prev-line + k +move-to-next-char + l +move-to-prev-char + h +move-to-end-of-word + e +move-to-next-word + w +move-to-prev-word + b +move-to-start-of-next-block + ] +move-to-start-of-prev-block + [ +move-to-end-of-next-block + } +move-to-end-of-prev-block + { +move-to-start-of-line + 0 +move-to-end-of-line + $ +move-to-start-of-document + gg +move-to-end-of-document + G +yank selection -s + Y +yank selection + y + + + + + + +scroll left + H +scroll down + J +scroll up + K +scroll right + L +""" + + +def get_diff(): + """Get a HTML diff for the old config files.""" + old_conf_lines = [] + old_key_lines = [] + + for filename, dest in [('qutebrowser.conf', old_conf_lines), + ('keys.conf', old_key_lines)]: + path = os.path.join(standarddir.config(), filename) + + with open(path, 'r', encoding='utf-8') as f: + for line in f: + if not line.strip() or line.startswith('#'): + continue + dest.append(line.rstrip()) + + conf_delta = difflib.unified_diff(OLD_CONF.splitlines(), old_conf_lines) + key_delta = difflib.unified_diff(OLD_KEYS_CONF.splitlines(), old_key_lines) + + conf_diff = '\n'.join(conf_delta) + key_diff = '\n'.join(key_delta) + + # pylint: disable=no-member + # WORKAROUND for https://bitbucket.org/logilab/pylint/issue/491/ + lexer = pygments.lexers.DiffLexer() + formatter = pygments.formatters.HtmlFormatter( + full=True, linenos='table', + title='Config diff') + # pylint: enable=no-member + return pygments.highlight(conf_diff + key_diff, lexer, formatter)