html to txt: colspan, rowspan

html to txt: colspan, rowspan

am 16.05.2006 12:57:03 von unknown

Post removed (X-No-Archive: yes)

Re: html to txt: colspan, rowspan

am 19.05.2006 01:49:08 von Arne Ruhnau

Martin Trautmann schrieb:
> hat jemand womoeglich schon eine funktionierende Loesung in der
> Schublade, um HTML in eine Textdatei (.csv) umzuwandeln?

Wie sich herausstellt, meinst du hier scheinbar nur die Umwandlung von
nicht-verschachtelten Tabellen nach CSV.



> Hat sich aber schon jemand eine Loesung ausgedacht, um Tabellen mit
> colspan und rowspan in Text flachzuklopfen?
>
> Beispiel:
>
> +---+---+---+---+
> | | A | B | C |
> +---+---+---+---+
> | | D | E |
> | F +---+---+---+
> | | G | |
> +---+---+---+

Das ist aber keine Tabelle, sondern nur lustige Zeichenhaufen, die von
meinen Augen als tabellendarstellend verstanden werden. Ein
tatsächliches Beispiel hätte

, und Konsorten. Oder direkt
beides, damit man nicht unbedingt HTML können muss, aber dennoch die
Struktur hat...

> wird zu
>
> , A , B , C
> F , D , D , E
> F , G ,

> Oder falls nein: Was ist der optimale Ansatz, um Arrays dynamisch zu
> erweitern und z.B. fuer "Tabellen in Tabellen" umzurechnen?

Bei Rekursion fällt mir keine gescheihte Verflachungstaktik ein. Hat CSV
nicht immer ne feste Felderzahl pro Zeile? Dann ist das kaputt.

Du brauchst eine Zeile, die weiß, wo sie noch Platz hat. Am besten
kannst du der Zeile dann einfach sagen "He, hier is noch ein Element"
und sie fügt es in die erste vorhandene Lücke ein. Außerdem muss sie
auch Elemente an eine feste Position setzen können. Eine Idee wäre es
also, dir eine Klasse FlacheTabelle zu basteln, die aus Reihen besteht,
die aus Zellen bestehen (Intern einfach als ArrayOfArrays
implementiert), also sowas:

bless( bless([...], FlacheTabelleZeile),
bless([...], FlacheTabelleZeile),
...
), FlacheTabelle;

Dann schreibst du für FlacheTabelle noch ne Dump-Methode, und die macht
dir in einer doppelten for-schleife ein normales nacktes ArrayOfArrays
daraus.

my $htmltabelle = einzeiler();
my $table = FlacheTabelle->new();
my @trs = rows($htmltabelle);
for (my $row=0; $row != @trs; ++$row) {
my $hrobj = $htmltabelle->row($row); # HTML
my $robj = $table->row($row); # FlacheTabelle;
for(my $cell = 0; $cell!= $hrobj->cells(); ++$cell) {
my $hcobj = $hrobj->cell($cell); # HTML
my $hasSpan = 0;
if(my $colspan = $hcobj->colspan()) {
++$hasSpan;
map { $robj->add($hcobj->content()) }
(0..$colspan-1);
}
if(my $rowspan = $hcobj->rowspan()) {
++$hasSpan;
for(my $off = 0; $off != $rowspan; ++$off) {
$table->setField($row+$off, $cell, $hcobj->content());
}
}
if(!$hasSpan) {
$robj->add($hcobj->content());
}
}
}

Das da oben ist mehr so ein herunterschreiben von Pseudocode, der nach
Perl ausschaut. FlacheTabelleZeile::add wäre dann dafür verantwortlich,
das Elemente an die frühestmögliche Stelle kommen (setField kann ja
schon hier und da etwas eintragen).

nur so eine Idee,

Arne

Re: html to txt: colspan, rowspan

am 19.05.2006 18:57:00 von unknown

Post removed (X-No-Archive: yes)

Re: html to txt: colspan, rowspan

am 29.05.2006 12:05:12 von Arne Ruhnau

Martin Trautmann schrieb:
> On Fri, 19 May 2006 01:49:08 +0200, Arne Ruhnau wrote:
>
>> Martin Trautmann schrieb:
>>
>>>Hat sich aber schon jemand eine Loesung ausgedacht, um Tabellen mit
>>>colspan und rowspan in Text flachzuklopfen?
>>>
>>>Beispiel:
>>>
>>> +---+---+---+---+
>>> | | A | B | C |
>>> +---+---+---+---+
>>> | | D | E |
>>> | F +---+---+---+
>>> | | G | |
>>> +---+---+---+
>
>


>
>
>
>
>
>
>
>
>
 ABC
F > valign=top>

D

E
G



>>>Oder falls nein: Was ist der optimale Ansatz, um Arrays dynamisch zu
>>>erweitern und z.B. fuer "Tabellen in Tabellen" umzurechnen?
>>
>> Bei Rekursion fällt mir keine gescheihte Verflachungstaktik ein. Hat CSV
>> nicht immer ne feste Felderzahl pro Zeile? Dann ist das kaputt.
>
>
> Nein, CSV kann voellig beliebig sein. Die Zeilen koennen
> unterschiedliche Laengen haben.

Dann kannst du einfache Marker in deinen CSV-Zeilen unterbringen, die
sagen, wann eine neue Tabelle anfängt. Die eingebettete Tabelle kommt
dann entweder in die selbe Zeile (hässlich, denke ich) oder aber einfach
in die folgendenen Zeilen. Beim auslesen des CSVs musst du dann nur
Klammern/Marker zählen, um zu wissen, wie tief eingebettet du bist.

>> my $htmltabelle = einzeiler();
>> my $table = FlacheTabelle->new();
>> my @trs = rows($htmltabelle);
>> for (my $row=0; $row != @trs; ++$row) {
>> my $hrobj = $htmltabelle->row($row); # HTML
>> my $robj = $table->row($row); # FlacheTabelle;
>> for(my $cell = 0; $cell!= $hrobj->cells(); ++$cell) {
>> my $hcobj = $hrobj->cell($cell); # HTML
>> my $hasSpan = 0;
>> if(my $colspan = $hcobj->colspan()) {
>> ++$hasSpan;
>> map { $robj->add($hcobj->content()) }
>> (0..$colspan-1);
>> }
>> if(my $rowspan = $hcobj->rowspan()) {
>> ++$hasSpan;
>> for(my $off = 0; $off != $rowspan; ++$off) {
>> $table->setField($row+$off, $cell, $hcobj->content());
>> }
>> }
>> if(!$hasSpan) {
>> $robj->add($hcobj->content());
>> }
>> }
>> }
>
>
> Du machst also einen ersten Durchlauf zur Initialisierung, um deine
> Tabelle einzurichten?
Nein. Obwohl, ja. Ich weiß nicht so recht was du mit einrichten meinst,
aber die Intention des Codes da oben war es, den Parsebaum der Tabelle
tr-weise abzugrasen und die Inhalte an die richtigen Stellen in einem
zweidimensionalen Array zu packen.

> * deine rows() muss also schon mit rowspan-Funktionen klarkommen?
Nein.

Die Idee, die mir durch den Kopf geisterte, war, dass rows() die
tr-Objekte aus der aktuellen Tabelle holt.

Der Code da oben ist aber ohnehin so nicht richtig, vielmehr muss man
implizit in jeder td rowspwan und colspan = 1 als default annehmen und
dann rowspan innerhalb von colspan auswerten, um auch zweidimensionale
Bereiche zu bekommen:

A


> * Ich hatte gehofft, dass ich das ganze noch halbwegs einfach als
> wachsendes, zweidimensionales Array nutzen koennte - also dass
> ich ohne Initialisierung auskaeme. Die Schreiberichtung ist ja
> konstant nach rechts/unten:
> Neue Spalten erweitern einfach den Matrix-Index x,
> neue Zeilen das y.

was ist mit



AB
C


die zweite Spalte der ersten Zeile soll ja nicht die erste Spalte der
zweiten Zeile füllen, sondern auch dort die zweite. Deswegen meine Idee
mit den Lücken, da die zweite Zeile beim rowspan in der ersten Zeile
schon in der zweiten Zeile einen Wert bekommt, in der zweiten Zeile dann
aber in die Lücke in der ersten Spalte 'C' einfügen muss. Die
Schreibrichtung ist in diesem Fall nicht konstant nach rechts unten.

>> nur so eine Idee,
>
> Ich koennte nun natuerlich mal in sourcecode wie den von w3m reinsehen,
> wie's da geloest wird. Aber das Problem erscheint mir hinreichend
> kompliziert, um hier erst mal zu fragen, ob jemand derartiges vielleicht
> schon mal probiert/geloest hat.

Ähm... den Punkt versteh ich nicht. Wenn du weißt, dass es gelöst ist,
und weißt, wo es gelöst ist, hast du doch jemanden, der etwas derartiges
bereits gelöst hat...

Arne Ruhnau

Re: html to txt: colspan, rowspan

am 12.06.2006 13:15:54 von unknown

Post removed (X-No-Archive: yes)