kriegaex / Galileo-Openbook-Cleaner

HTML cleaner for Galileo Computing's openbooks, implemented in Java
Other
64 stars 6 forks source link

Prevent insertion of line breaks #37

Closed StefRe closed 4 years ago

StefRe commented 4 years ago

Additional line breaks cause indentation of the first line and double line spacing of all lines in code listings (class="listing") of the java 8 book.

Jsoup inserts additional line breaks at appending child elements in the moveNodes function. Instead of appending the children of the removed source elements to the target element we now insert them (they will be moved from their current parents). Further we disable jsoup pretty printing.

Fixes issue # 36.

StefRe commented 4 years ago

Fix für #36: Anstatt zu versuchen, die css geradezubiegen wollte ich die html-Originalformatierung erhalten. Prettyprint abzuschalten reicht aber nicht, da durch das Anfügen der zum verschiebenden Elemente in moveNodes der html-Text genauso wie bei prettyprint = True mit zusätzlichen Zeilenumbrüchen formatiert wird (auch wenn man prettyprint gleich nach Parsen des Dokuments abschaltet und auch in der aktuellen Version 1.12.1 von Jsoup). Warum das so ist, verstehe ich nicht. InsertChildren bewirkt praktischerweise nicht nur ein Einfügen wie der Name vermuten läßt, sondern effektiv ein Verschieben (siehe docs):

Inserts the given child nodes into this element at the specified index. Current nodes will be shifted to the right. The inserted nodes will be moved from their current parent. To prevent moving, copy the nodes first.

Habe den geänderten Code aber nur mit dem neuen Java_8 - Buch getestet, sollte aber auch generell ohne Nebenwirkungen sein.

kriegaex commented 4 years ago

Ich habe zwischendurch - wenig Zeit leider - mal versucht, Pretty-Printing zu erhalten und stattdessen, so wie in allen anderen Büchern, die <div class="listing"> verwenden, einfach einen <pre class="prettyprint"> nachfolgen zu lassen und die inneren Nodes darin einzuhüllen. Das hat dann zur Folge, dass ich auch die <br> Nodes durch Zeilenumbrüche ersetzen musste, weil wir uns ja jetzt in einem <pre> Block befinden und sie nicht mehr brauchen. Alle anderen Bücher machen es genauso. Das klappt auch recht gut in manchen Code-Blöcken, aber sobald sie Syntax Highlighting und somit innere Tags enthalten, schlägt das Pretty-Printing trotzdem wieder zu mit Zeilenumbrüchen, weil wir dann weitere Tags wie z.B. <span> im HTML haben.

Generell Pretty-Printing auszuschalten, gefällt mir nicht. Mir geht es beim Cleaner nicht nur um das Ausmisten der Seite und sie optisch sauberer zu machen, ich mag auch, dass der HTML-Code lesbarer wird durch Pretty-Printing. Da die Einstellung aber anscheinend immer fürs ganze Dokument gilt, kann ich sie nicht einfach lokal deaktivieren innerhalb div.listing, wie ich es für akzeptabel halten würde.

Alternativ eine eigene clean-Logik für Jsoup zu schreiben, habe ich noch nie versucht und das wäre evtl. auch ziemlich aufwendig, keine Ahnung. Kann gut sein, dass ich am Ende einfach Deinen PR akzeptiere, aber im Moment überlege ich noch. Vielleicht hast Du auch noch eine Idee. Du kannst ja erst mal arbeiten, d.h. ich blockiere Dich gerade nicht.