diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 22761b1cc..0265c7b66 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -28,6 +28,10 @@ from PyQt5.QtCore import pyqtSignal, pyqtSlot, QUrl, QObject, QSizeF, Qt from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QWidget, QApplication +import pygments +import pygments.lexers +import pygments.formatters + from qutebrowser.keyinput import modeman from qutebrowser.config import config from qutebrowser.utils import (utils, objreg, usertypes, log, qtutils, @@ -150,10 +154,33 @@ class AbstractAction: raise WebTabError("{} is not a valid web action!".format(name)) self._widget.triggerPageAction(member) - def show_source(self): + def show_source(self, pygments=False): """Show the source of the current page in a new tab.""" raise NotImplementedError + def _show_source_pygments(self): + + def show_source_cb(source): + """Show source as soon as it's ready.""" + # WORKAROUND for https://github.com/PyCQA/pylint/issues/491 + # pylint: disable=no-member + lexer = pygments.lexers.HtmlLexer() + formatter = pygments.formatters.HtmlFormatter( + full=True, linenos='table') + # pylint: enable=no-member + highlighted = pygments.highlight(source, lexer, formatter) + + tb = objreg.get('tabbed-browser', scope='window', + window=self._tab.win_id) + new_tab = tb.tabopen(background=False, related=True) + # The original URL becomes the path of a view-source: URL + # (without a host), but query/fragment should stay. + url = QUrl('view-source:' + urlstr) + new_tab.set_html(highlighted, url) + + urlstr = self._tab.url().toString(QUrl.RemoveUserInfo) + self._tab.dump_async(show_source_cb) + class AbstractPrinting: diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 4cdd2604b..2b579bd5c 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1515,11 +1515,15 @@ class CommandDispatcher: ) @cmdutils.register(instance='command-dispatcher', scope='window') - def view_source(self, edit=False): + def view_source(self, edit=False, pygments=False): """Show the source of the current page in a new tab. Args: edit: Edit the source in the editor instead of opening a tab. + pygments: Use pygments to generate the view. This is always + the case for QtWebKit. For QtWebEngine it may display + slightly different source. + Some JavaScript processing may be applied. """ tab = self._current_widget() try: @@ -1534,7 +1538,7 @@ class CommandDispatcher: ed = editor.ExternalEditor(self._tabbed_browser) tab.dump_async(ed.edit) else: - tab.action.show_source() + tab.action.show_source(pygments) @cmdutils.register(instance='command-dispatcher', scope='window', debug=True) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 1143ab01f..728bae1a0 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -106,7 +106,11 @@ class WebEngineAction(browsertab.AbstractAction): """Save the current page.""" self._widget.triggerPageAction(QWebEnginePage.SavePage) - def show_source(self): + def show_source(self, pygments=False): + if pygments: + self._show_source_pygments() + return + try: self._widget.triggerPageAction(QWebEnginePage.ViewSource) except AttributeError: diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 1f178a032..fce8c8f57 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -23,10 +23,6 @@ import re import functools import xml.etree.ElementTree -import pygments -import pygments.lexers -import pygments.formatters - import sip from PyQt5.QtCore import (pyqtSlot, Qt, QEvent, QUrl, QPoint, QTimer, QSizeF, QSize) @@ -55,28 +51,8 @@ class WebKitAction(browsertab.AbstractAction): """Save the current page.""" raise browsertab.UnsupportedOperationError - def show_source(self): - - def show_source_cb(source): - """Show source as soon as it's ready.""" - # WORKAROUND for https://github.com/PyCQA/pylint/issues/491 - # pylint: disable=no-member - lexer = pygments.lexers.HtmlLexer() - formatter = pygments.formatters.HtmlFormatter( - full=True, linenos='table') - # pylint: enable=no-member - highlighted = pygments.highlight(source, lexer, formatter) - - tb = objreg.get('tabbed-browser', scope='window', - window=self._tab.win_id) - new_tab = tb.tabopen(background=False, related=True) - # The original URL becomes the path of a view-source: URL - # (without a host), but query/fragment should stay. - url = QUrl('view-source:' + urlstr) - new_tab.set_html(highlighted, url) - - urlstr = self._tab.url().toString(QUrl.RemoveUserInfo) - self._tab.dump_async(show_source_cb) + def show_source(self, pygments=False): + self._show_source_pygments() class WebKitPrinting(browsertab.AbstractPrinting):