Alternativ steuerbarer Browser

Du hast eine Idee für ein Projekt?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hallo zusammen!

Ich plane einen Browser, dessen Steuerung über Eingaben in die Addresszeile funkioniert. Eingaben, die mit einem Punkt beginnen, werden als Befehl interpretiert, alles andere als URL. Fehlt der URL das http://www., so wird dieses ergänzt. Bisher an Befehlen implementiert:

.back - eine Seite zurück
.forward - eine Seite vor
.clearhist - History löschen
.find - findet Suchstring (auch Leerzeichen möglich)
.scale - vergrößert/verkleinert die Schrift im Browser, ausgehend von 1.0, z.B. .scale 0.8
.getscale - liefert derzeit eingestellte Skalierung zurück
.exit - beendet das Programm

Was haltet ihr von dieser Idee. Findet ihr das im täglichen Gebrauch praktisch oder eher unnötig kompliziert?

Würde mich über etwas Feedback freuen. :)

Sebastian

Programmlogik (robby.py) : http://paste.pocoo.org/show/87490/
Gui (ui_robby.py) : http://paste.pocoo.org/show/87489/

Bitte beide Dateien ins selbe Verzeichnis ablegen und ui_robby.py auch auf jeden Fall so nennen, sonst klappt der Import nicht. Gestartet wird dann mit robby.py, python-qt4 wird in der Version 4.4 vorausgesetzt (getestet mit 4.4.2).
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

na wenns dir Spass macht will ich dir das sicher nicht ausreden, aber ich benutze seit Ewigkeiten shortcuts im ff

http://www.mouserunner.com/FF_Shortcuts1Printable.html

alles bis auf die Schrift skalieren kann er sowieso und noch vieles mehr. Schriften und Bilder skaliere ich mit dem Mausrad - das finde ich am praktischsten...
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich kenne und nutze auch einige der sehr praktischen Shortcuts im FF. Später soll aber noch sowas wie .showhist eingebaut werden, das im selben Fenster alle Seiten vor und nach der aktuellen durchnummeriert anzeigt. Drei davor wären dann ".back 3". Klar kann man auch im FF, aber da muss ich die Maus bemühen und den Eintrag anklicken. Überhaupt soll das Konzept so sein, dass alle möglichen Einstellungen über diese Punkt-Kommandos verändert werden können ohne dass man in seperaten Fenstern und Reitern rumklicken muss. Drei Tabs weiter? Einfach ".tab 3" eingeben. So in der Art halt. Ich weiß nicht inwiefern FF das alles kann...

Ich persönlich habe meine 10-Finger halt ganz gerne an den Buchstaben: Ein ".back" ist für mich schneller eingeben als ein Alt+Nach-Links-Taste. Wahrscheinlich werde ich aber so eine Art Mischnung anbieten. Denn wenn die Addresszeile gerade nicht den Fokus hat, ist natürlich der Shortcut bequemer.
alles bis auf die Schrift skalieren kann er sowieso und noch vieles mehr.
Das Skript habe ich ja deshalb ins Ideenforum gesetzt, weil ich gerade erst angefangen habe und das keinesfalls schon eine Version 0.1 oder so sein soll. ;)
Zuletzt geändert von snafu am Donnerstag 9. Oktober 2008, 11:24, insgesamt 1-mal geändert.
lunar

Die elif-Kaskade in run_command() ist hässlich. Für den Anfang tut es wohl ein Dictionary, dass Kommandos auf Callables mappt, wenn du das ausbauen willst, solltest du dir da eine vernünftige Plugin-Architektur überlegen, so dass man die verfügbaren Kommandos leicht erweitern kann.

Desweiteren solltest du daran denken, dass es auch URLs wie http://wiki.python.de oder "https://example.com" gibt, die in call_url() garantiert nicht zu "http://www.http://wiki.python.de" oder "http://www.https://example.com" expandiert werden sollten. Diese Logik sollte besser so gestaltet werden, dass zuerst die Existenz des eingegebenen Namens überprüft, dann der Status des HTTP-Ports, und erst danach "www" davor gehängt wird. Außerdem solltest du auch andere Protokolle zulassen, ein Browser sollte im mindesten auch HTTPS sprechen, FTP wäre sicherlich auch nicht zu verachten.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

lunar hat geschrieben:Die elif-Kaskade in run_command() ist hässlich. Für den Anfang tut es wohl ein Dictionary, dass Kommandos auf Callables mappt
Die Idee kam mir auch schon, bzw ich habe schon probiert den Befehl als Key und den Methodenaufruf als Wert einzutragen. Beim Ausprobieren war es dann aber so, dass jedes Mal alle Aufrufe nacheinander durchgeführt wurden. Also:

Code: Alles auswählen

cmds = {'.bla' : blupp(arg)}
Von daher dachte ich, dass sowas in Python nicht geht. Wie muss es denn richtig lauten?
lunar hat geschrieben:Desweiteren solltest du daran denken, dass es auch URLs wie http://wiki.python.de oder "https://example.com" gibt, die in call_url() garantiert nicht zu "http://www.http://wiki.python.de" oder "http://www.https://example.com" expandiert werden sollten. Diese Logik sollte besser so gestaltet werden, dass zuerst die Existenz des eingegebenen Namens überprüft, dann der Status des HTTP-Ports, und erst danach "www" davor gehängt wird. Außerdem solltest du auch andere Protokolle zulassen, ein Browser sollte im mindesten auch HTTPS sprechen, FTP wäre sicherlich auch nicht zu verachten.
Ja, richtig. Und ich plane auch Eingaben, die keine TLD haben, als Suche an Scroogle zu schicken. Ähnlich verfährt Firefox ja auch mit Google. Die ganzen Protokolle werden natürlich auch eingebaut, Downloads funktionieren ja auch noch nicht. Wie gesagt: Ich sitze da jetzt vielleicht seit 2-3 Tagen dran und wollte erstmal ein Feedback zur Grundidee/Struktur erhalten. :)
Lonestar
User
Beiträge: 147
Registriert: Samstag 9. August 2008, 08:31

snafu hat geschrieben: Ich persönlich habe meine 10-Finger halt ganz gerne an den Buchstaben: Ein ".back" ist für mich schneller eingeben als ein Alt+Nach-Links-Taste. Wahrscheinlich werde ich aber so eine Art Mischnung anbieten. Denn wenn die Addresszeile gerade nicht den Fokus hat, ist natürlich der Shortcut bequemer.
ohne provozieren zu wollen - Alt+Nach-Links-Taste ist wirklich unpraktisch, backspace tuts auch :wink:
Wenn es ums pure programmieren geht damit man ein sinnvolles Projekt hat habe ich da garnichts gegen einzuwenden. Wenn du aber dein fertiges Projekt auch einem möglichst großem Publikum zukommen lassen möchtest wäre ein Plugin für einen bereits existierenden Browser die einfachere Variante. Das wäre dann wenn ich mich nicht vertue nicht mehr in python möglich uns somit auch nicht in deinem Sinne. Also wünsche ich mal viel spass beim basteln
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

snafu hat geschrieben:Ich persönlich habe meine 10-Finger halt ganz gerne an den Buchstaben: Ein ".back" ist für mich schneller eingeben als ein Alt+Nach-Links-Taste. Wahrscheinlich werde ich aber so eine Art Mischnung anbieten. Denn wenn die Addresszeile gerade nicht den Fokus hat, ist natürlich der Shortcut bequemer.
w3m bzw. emacs-w3m? :D
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
lunar

snafu hat geschrieben:
lunar hat geschrieben:Die elif-Kaskade in run_command() ist hässlich. Für den Anfang tut es wohl ein Dictionary, dass Kommandos auf Callables mappt
Die Idee kam mir auch schon, bzw ich habe schon probiert den Befehl als Key und den Methodenaufruf als Wert einzutragen. Beim Ausprobieren war es dann aber so, dass jedes Mal alle Aufrufe nacheinander durchgeführt wurden. Also:

Code: Alles auswählen

cmds = {'.bla' : blupp(arg)}
Von daher dachte ich, dass sowas in Python nicht geht. Wie muss es denn richtig lauten?
So führst du die Funktion ja auch bei der Deklaration des Wörterbuchs aus. Der Wert muss ein aufrufbares Objekt sein, nicht das Resultat des Aufrufs:

Code: Alles auswählen

cmds = {'.spam': lambda: egg(arg)}
Wenn du ein Plugin-System baust, dann könnte die Hauptklasse bei der Instantiierung nach Plugins suchen, und dieses Wörterbuch dann selbstständig aufbauen. Dann brauchst du auch keine anonymen Funktionen mehr, stattdessen würden die Werte wahrscheinlich Instanzen der Plugin-Klassen darstellen, die anschließend aufgerufen werden würden.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Lonestar hat geschrieben:Wenn es ums pure programmieren geht damit man ein sinnvolles Projekt hat habe ich da garnichts gegen einzuwenden. Wenn du aber dein fertiges Projekt auch einem möglichst großem Publikum zukommen lassen möchtest wäre ein Plugin für einen bereits existierenden Browser die einfachere Variante. Das wäre dann wenn ich mich nicht vertue nicht mehr in python möglich uns somit auch nicht in deinem Sinne. Also wünsche ich mal viel spass beim basteln
Welche Browser unterstützen denn überhaupt Plugins außer Speicherfresser Firefox? Ich will ja zudem auch weg von der Mozilla-Engine. Und da mein Projekt ja doch einen recht anderen Aufbau hat, stellt sich mir die Frage wie sinnvoll es ist, sämtliche Funktionalität eines Browsers zu entnehmen und quasi bei Null anzufangen vs. von Anfang an bei Nul zu beginnen. ;)
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Rebecca hat geschrieben:w3m bzw. emacs-w3m? :D
"Tastaturgesteuert" ist nicht immer gleichbedeutend mit "textbasiert". ;)

Es bezieht sich ja hier nur auf die Steuerung des Browsers, nicht aber auf die Navigation in der Website. Mal sehen, ob ich da auch eine Mischform einbauen kann. Jedenfalls möchte ich den User (mich immer einschließend) nicht bei jeder Seite an die Tastatur "zwingen".
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Schon mal Vimperator ausprobiert?
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

lunar hat geschrieben:Wenn du ein Plugin-System baust, dann könnte die Hauptklasse bei der Instantiierung nach Plugins suchen, und dieses Wörterbuch dann selbstständig aufbauen. Dann brauchst du auch keine anonymen Funktionen mehr, stattdessen würden die Werte wahrscheinlich Instanzen der Plugin-Klassen darstellen, die anschließend aufgerufen werden würden.
Das wäre für später auch eine Idee, ich würde aber zunächst die lambda-Lösung vorziehen. Plugins machen für mich dann Sinn, wenn Dritte eigene Plugins erstellen dürfen. Aber hier besteht natürlich immer die Gefahr, das bösartiger Code eingeschleust werden kann. Es müsste also vor Instanzierung der Plugin-Klasse erst einmal geprüft werden, was die Klasse macht oder eine Art eigene Sprache entwickelt werden. Und das ist für den Anfang wohl eher Overkill. Was ich mir höchstens userseitig vorstellen könnte, wäre die Umbenennung vorhandener Befehle oder die Zusammenfassung mehrerer Schritte. Das müsste ich aber alles in einer späteren Phase ausfeilen. Momentan hat das eher niedrige Priorität für mich.
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

DasIch hat geschrieben:Schon mal Vimperator ausprobiert?
Sieht, was die Beschreibung angeht, sehr vielversprechend aus. Ich werde mir das später mal installieren und ausprobieren. :)

Nur was noch dazu kommen soll: Ich habe ein kleines anderes Projekt (unveröffentlicht) am Laufen, wo ich den X-Server auf offene Fenster anspreche und diese kontrollieren kann (resize, move, reparent etc). Ich möchte das später in meinen Browser einbauen können. Ein .run xterm würde mir dann ein Terminal setzen, das Teil des Browserfensters ist und auch an die richtige Stelle kommt - externe Programme sollen quasi wie Websites integriert werden. Ich denke da vor allem an Dock Widgets und Tabs, bei denen ich bequem Eingaben von Websites in das Terminal oder den Editor übertragen/vergleichen kann u.ä. Letzteres ist sicher noch etwas Zukunftsmusik, aber eigentlich war das mein Hauptantrieb zur Entwicklung eines eigenen Browsers. Die anderen Ideen sind später dazu gekommen. Ob das (für mich) alles realisierbar ist, steht auf einem Blatt...
lunar

snafu hat geschrieben:
lunar hat geschrieben:Wenn du ein Plugin-System baust, dann könnte die Hauptklasse bei der Instantiierung nach Plugins suchen, und dieses Wörterbuch dann selbstständig aufbauen. Dann brauchst du auch keine anonymen Funktionen mehr, stattdessen würden die Werte wahrscheinlich Instanzen der Plugin-Klassen darstellen, die anschließend aufgerufen werden würden.
Das wäre für später auch eine Idee, ich würde aber zunächst die lambda-Lösung vorziehen. Plugins machen für mich dann Sinn, wenn Dritte eigene Plugins erstellen dürfen.
Ein Plugininterface erleichtert jedem das Hinzufügen neuer Kommandos. Ich denke, da bist du eingeschlossen ;)
Aber hier besteht natürlich immer die Gefahr, das bösartiger Code eingeschleust werden kann. Es müsste also vor Instanzierung der Plugin-Klasse erst einmal geprüft werden, was die Klasse macht oder eine Art eigene Sprache entwickelt werden.
Wieso sollte man die Plugin-Klassen überprüfen? Die Plugins werden ja nicht ohne Nutzerinteraktion installiert, also überlässt man die Prüfung der Vertrauenswürdigkeit lieber dem Nutzer, der kann das nämlich besser beurteilen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:Welche Browser unterstützen denn überhaupt Plugins außer Speicherfresser Firefox?
Plugins viele, Erweiterungen wenige in dem Maße wie Firefox, der ja selbst zum großen Teil in JavaScript geschrieben ist und die Oberfläche mit XUL zeichnet. So umfassend skriptbar ist wohl nur noch Emacs.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

snafu hat geschrieben:
DasIch hat geschrieben:Schon mal Vimperator ausprobiert?
Sieht, was die Beschreibung angeht, sehr vielversprechend aus. Ich werde mir das später mal installieren und ausprobieren. :)
Echt nicht übel, das Teil. Sind viele Sachen dabei, die mir gut gefallen. Allerdings nervt es mich z.B. tierisch, dass ich für das Öffnen einer Datei oder URL explizit :open eingeben muss. Ich denke gerade das ist die Standardaktion und sollte daher nicht als Option daherkommen.
Benutzeravatar
tiax
User
Beiträge: 152
Registriert: Samstag 23. Juli 2005, 17:28
Kontaktdaten:

deswegen kannst du "o" drücken.
Ne invoces expellere non possis
[url=xmpp://florian@florianheinle.de]xmpp:florian@florianheinle.de[/url]
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

tiax hat geschrieben:deswegen kannst du "o" drücken.
Ja, die Kurzform kenne ich schon. Darum gings mir aber jetzt gar nicht.
Benutzeravatar
tiax
User
Beiträge: 152
Registriert: Samstag 23. Juli 2005, 17:28
Kontaktdaten:

du kannst das "o" statt dem Doppelpunkt eingeben
Ne invoces expellere non possis
[url=xmpp://florian@florianheinle.de]xmpp:florian@florianheinle.de[/url]
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Okay, das kannte ich noch nicht. Das macht die Sache irgendwie schon wieder einfacher. Auch wenn es nur um einen Doppelpunkt geht. :D
Antworten