Last active
December 26, 2015 08:49
-
-
Save jsoffer/7125336 to your computer and use it in GitHub Desktop.
Mini-navegador homebrew. Construído porque Opera está funcionando mal (por ejemplo, no guarda el buscador http://localhost:8000, que es un servicio interno, por default). Webkit. Mucha flexibilidad, pocas funciones.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
A minimal web browser. | |
Original: http://ralsina.me/weblog/posts/BB948.html | |
Features: | |
+++ verificar no tráfico no solicitado (startup, al menos) | |
+++ proxy | |
* actualizar dirección al cambiar de página | |
+++ ctrl-l: address bar | |
* ctrl-q: salir | |
* dirección destino, [title], ¿status bar? | |
+++ ^J como Enter en address bar | |
* tamaño de fuentes (+, -) | |
* buscar en página | |
* historia en address bar [medio - falta sesiones anteriores] | |
+++ movimiento con hjkl | |
Features missing: | |
fuentes (kerning, antialiasing) | |
desactivar javascript, cookies, redirect | |
iframe on/off | |
tabs | |
'http[s]://' automático en address bar | |
descargar con click derecho + menú no sirve | |
¿dónde están los settings, en memoria? | |
shift+movimiento+^J -> ir a enlace | |
manejo de errores (si hay error, 404, etc. nada más no cambia) | |
¿texto mal justificado? (soft hyphens) | |
botón medio: ir a url en buffer | |
gg/G para home y end | |
""" | |
import sys | |
from PyQt4 import QtGui,QtCore,QtWebKit,QtNetwork | |
class MainWindow(QtGui.QMainWindow): | |
def __init__(self, url): | |
#print dir(self) | |
QtGui.QMainWindow.__init__(self) | |
self.sb=self.statusBar() | |
# Existe Status Bar | |
self.pbar = QtGui.QProgressBar() | |
self.pbar.setMaximumWidth(120) | |
self.wb=QtWebKit.QWebView(loadProgress = self.pbar.setValue, loadFinished = self.pbar.hide, loadStarted = self.pbar.show, titleChanged = self.setWindowTitle) | |
# Existe Navegador | |
self.setCentralWidget(self.wb) | |
self.tb=self.addToolBar("Main Toolbar") | |
# Existe Toolbar | |
self.url = QtGui.QLineEdit(returnPressed = lambda:self.wb.setUrl(QtCore.QUrl.fromUserInput(self.url.text()))) | |
# Existe Address | |
self.tb.addWidget(self.url) | |
self.centraAddress = QtGui.QShortcut("Ctrl+L", self, activated = lambda: (self.url.setFocus(), self.url.selectAll())) | |
self.enterFalso = QtGui.QShortcut("Ctrl+J", self, activated = self.url.returnPressed) # solo urlbar, adaptar al componente activo | |
self.abajo = QtGui.QShortcut("J", self, activated = lambda: self.wb.page().mainFrame().scroll(0,100)) | |
self.arriba = QtGui.QShortcut("K", self, activated = lambda: self.wb.page().mainFrame().scroll(0,-100)) | |
self.wb.urlChanged.connect(lambda u: self.url.setText(u.toString())) | |
self.wb.urlChanged.connect(lambda: self.url.setCompleter(QtGui.QCompleter(QtCore.QStringList([QtCore.QString(i.url().toString()) for i in self.wb.history().items()]), caseSensitivity = QtCore.Qt.CaseInsensitive))) | |
self.wb.statusBarMessage.connect(self.sb.showMessage) | |
self.wb.page().linkHovered.connect(lambda l: self.sb.showMessage(l, 3000)) | |
self.search = QtGui.QLineEdit(returnPressed = lambda: self.wb.findText(self.search.text())) | |
self.search.hide() | |
self.muestraSearch = QtGui.QShortcut("/", self, activated = lambda: (self.search.show(), self.search.setFocus())) | |
self.ocultaSearch = QtGui.QShortcut("Esc", self, activated = lambda: (self.search.hide(), self.wb.setFocus())) | |
self.quit = QtGui.QShortcut("Ctrl+Q", self, activated = self.close) | |
self.zoomIn = QtGui.QShortcut("+", self, activated = lambda: self.wb.setZoomFactor(self.wb.zoomFactor()+.2)) | |
self.zoomOut = QtGui.QShortcut("-", self, activated = lambda: self.wb.setZoomFactor(self.wb.zoomFactor()-.2)) | |
self.zoomOne = QtGui.QShortcut("=", self, activated = lambda: self.wb.setZoomFactor(1)) | |
self.wb.settings().setAttribute(QtWebKit.QWebSettings.PluginsEnabled, False) | |
self.sb.addPermanentWidget(self.search) | |
self.sb.addPermanentWidget(self.pbar) | |
self.wb.load(url) | |
if __name__ == "__main__": | |
# Proxy | |
proxy = QtNetwork.QNetworkProxy() | |
proxy.setType(QtNetwork.QNetworkProxy.HttpProxy) | |
proxy.setHostName('localhost'); | |
proxy.setPort(3128) | |
QtNetwork.QNetworkProxy.setApplicationProxy(proxy); | |
#App | |
app=QtGui.QApplication(sys.argv) | |
if len(sys.argv) > 1: | |
url = QtCore.QUrl.fromUserInput(sys.argv[1]) | |
print url | |
else: | |
url = QtCore.QUrl('about:') | |
wb=MainWindow(url) | |
wb.show() | |
sys.exit(app.exec_()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment