Seite 1 von 1

Browser aus Tkinter und re (nur eine dumme Idee)

Verfasst: Donnerstag 1. Oktober 2009, 20:21
von krisi12345
Ich hatte eine dumme Idee die aber vieleicht möglich wäre:
Könnte man bzw. wer würde sich die mühe machen aus dem Modul Tkinter (Canvas) und re einen Internet Browser zu schreiben?

Allein alle (X)HTML, CSS Befehle und eine gesamte Javascript Engine einzubauen wäre wahrscheihnlich ungeheure Programmierarbeit, na ja wozu gibt es DLL's :D

Verfasst: Donnerstag 1. Oktober 2009, 21:19
von EyDu
Natürlich kann man das. Das will nur sicher niemand für dich übernehmen.

Verfasst: Donnerstag 1. Oktober 2009, 21:21
von krisi12345
Das will nur sicher niemand für dich übernehmen.
Ich habe nicht gesagt das das jemand machen soll!

Verfasst: Donnerstag 1. Oktober 2009, 21:31
von snafu
Man könnte die Webkit-Engine portieren. Ich glaube aber, dass es den meisten Leuten reichter erstmal Webkit bei den beiden "Großen" GTK und Qt zu haben.

Re: Browser aus Tkinter und re (nur eine dumme Idee)

Verfasst: Donnerstag 1. Oktober 2009, 21:32
von cofi
Und warum sollte man das wollen?

Sofern du bei RegExp bleibst, und keinen echten Parser benutzt/implementierst, wuerde ich aber auch die Machbarkeit anzweifeln und gerade wenn man sich die Massen, an nicht-standardkonformen Websites anschaut, stellt sich auch die Frage, ob man den Teil selbst uebernehmen will.
krisi12345 hat geschrieben:Allein alle (X)HTML, CSS Befehle und eine gesamte Javascript Engine einzubauen wäre wahrscheihnlich ungeheure Programmierarbeit, na ja wozu gibt es DLL's :D
Ich hoffe du meinst mit DLLs Module ?

Re: Browser aus Tkinter und re (nur eine dumme Idee)

Verfasst: Freitag 2. Oktober 2009, 10:56
von Leonidas
krisi12345 hat geschrieben:Könnte man bzw. wer würde sich die mühe machen aus dem Modul Tkinter (Canvas) und re einen Internet Browser zu schreiben?
Gibts doch schon, nennt sich Grail und wurde unter anderem von Fred L. Drake (bekannt von der Python-Dokumentation) geschrieben.

Re: Browser aus Tkinter und re (nur eine dumme Idee)

Verfasst: Freitag 2. Oktober 2009, 15:34
von stuhlbein
Leonidas hat geschrieben:
krisi12345 hat geschrieben:Könnte man bzw. wer würde sich die mühe machen aus dem Modul Tkinter (Canvas) und re einen Internet Browser zu schreiben?
Gibts doch schon, nennt sich Grail und wurde unter anderem von Fred L. Drake (bekannt von der Python-Dokumentation) geschrieben.
... Welcher aber mit modernen Pythonversionen (2.4, 2.5, 2.6, 3.*) nicht ausführbar ist ;)

@OP: Ich würde einen in Python geschriebenen webbrowser Interessant finden, vorallem da man es sicher durch skripte erweitern kann - gute Code-basis vorrausgesetzt. Aber Tk, geschweige denn reguläre ausdrücke würd ich dafür nicht verwenden, sondern eher Webkit.

Verfasst: Samstag 10. Oktober 2009, 11:28
von sma
Natürlich kann man prinzipiell einen XHTML-Parser und -Renderer bauen. Das wäre noch nicht einmal sonderlich schwer, wenn man nicht die vielen in der Praxis vorkommenden Abweichungen und "Quirks" zur Kompatibilität mit Fehlern diverser anderer Browser (sprich IE) berücksichtigt, sondern exakt den Standard implementiert. Lässt man auch noch CSS weg, ist das Projekt übersichtlich (will sagen, habe ich schon mal vor einigen Jahren für ein Hilfesystem in Java gemacht).

Stefan

Verfasst: Samstag 10. Oktober 2009, 12:17
von krisi12345
Man könnte ja eine Datei/Modul schreiben das sich um die GUI Basis und um das downloden und zerlegen der Seite kümmert. Die HTML/CSS Befehle werden in Strings unterteilt, weitere Dateien/Module in der jede Funktion ein HTML/CSS Befehl ist könnten dann die Strings ausernander nehmen und GUI Befehle ausgeben.

Der Vorteil dieses Vorgehens wäre das man/Welt immer eine HTML/CSS Funktion nach der anderen in die Module einbaut.

Verfasst: Sonntag 11. Oktober 2009, 09:41
von sma
"Befehle in Strings unterteilen" klingt falsch. Lassen wir CSS außer Acht, kannst du XHTML mit einem XML-Parser in einen DOM verwandeln. Aus

Code: Alles auswählen

<body>
    <h1>Überschrift</h1>
    <p>Absatz mit <strong>etwas Fettschrift</strong>.</p>
</body>
wird dann

Code: Alles auswählen

Body(
    H1(Text("Überschrift")),
    P(Text("Absatz mit "), Strong(Text("etwas Fettschrift")), Text(".")))
Mein Ziel ist, dass jedes Objekt seine eigene Größe bestimmen kann und weiß, wie seine Kinder angeordnet werden müssen. HTML kennt zwei Arten von Elementen: Block-Elemente und Inline-Elemente. Erstere werden bei vorgegebener Breite einfach untereinander dargestellt und sind so hoch, wie sie eben sein müssen. Letztere sind in Block-Elementen enthalten und passen sich in ihrer Höhe an die Zeilenhöhe an, sind so breit wie sie es eben sein müssen und brechen außerdem in der durch das Block-Element vorgegebenen Breite um. H1 und P sind Block-Elemente, Text und Strong Inline-Elemente und Body ein Container für Block-Elemente.

Damit ich den Umbruch abbilden kann, definiere ich noch Line-Elemente. Angenommen, die vorgegebene Breite wäre so, dass das "etwas", nicht aber das "Fettschrift" in die erste Zeile passen würde. Dann muss der Umbruch folgende Objekte erzeugen:

Code: Alles auswählen

Lines(
    Line(Text("Absatz mit "), Strong(Text("etwas"))),
    Line(Strong(Text("Fettschrift")), Text(".")))
Möglicherweise wäre es einfacher, jedes Wort als Objekt zu repräsentieren und es nur noch wissen zu lassen, ob hinter ihm ein Umbruch möglich ist oder nicht. In HTML (außer bei PRE) werden ja beliebig viele Leerzeichen und Leerzeilen zu nur einem Leerzeichen zusammengefasst.

Wenn ich eine Funktion "text_width(font, text)" habe, mit der ich unter Angabe eines Fonts die Breite eines Textes in Pixeln berechnen kann, dann kann ich damit aus der ersten direkt aus dem XML abgeleiteten Form die zweite Zeilenform berechnen.

Danach kann ich einen relativ einfachen Layout-Algorithmus auf das Objektmodell loslassen. Ein Text-Elemente definiert seine Höhe und Breite durch die Schrift und den Text. Ein Line-Element und jedes Inline-Element, das selbst wieder Kinder hat wie z.B. Strong, ordnet seine Kinder von links nach rechts nebeneinander an und bestimmt seine Breite also als Summe aller Breiten und seine Höhe als das Maximum der vorgegebenen Höhe oder der Höhen der Kinder. Bei der Position ist noch die Grundlinie zu berücksichtigen. Block-Elemente ordnen ihre Line-Elemente nun untereinander an. Die Breite ist das Maximum aller Breiten und die Höhe die Summe aller Höhen. Und das Body-Container-Element macht das selbe für seine Kinder.

Stefan

Verfasst: Freitag 23. Oktober 2009, 12:01
von snafu
Interessant ist in diesem Zusammenhang vielleicht auch:

http://webkit.org/blog/114/webcore-rend ... he-basics/