Skip to content

Instantly share code, notes, and snippets.

@jsoffer
Last active December 26, 2015 08:49
Show Gist options
  • Save jsoffer/7125336 to your computer and use it in GitHub Desktop.
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.
#!/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