kriegaex / Galileo-Openbook-Cleaner

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

Code-Formatierung im `java_8` Buch #36

Closed StefRe closed 4 years ago

StefRe commented 4 years ago

Hallo Alexander, Vielen Dank für das großartige Programm. Mit dem aktuelle snapshot von parse-online-books funktioniert es gut, bis auf die Formatierung der Codeblöcke - hier wird die erste Zeile eingerückt und es werden zusätzliche Leerzeilen eingefügt: grafik grafik (links original, rechts konvertiert)

Läßt sich das relativ einfach beheben?

kriegaex commented 4 years ago

Das Problem ist, dass das kein Codeblock, z.B. <pre>, ist sondern etwas manuell Formatiertes mit Zeilenumbrüchen, das im Original so aussieht:

<div class="listing" id="l_ohne_01_00">#include &lt;cstring&gt;<br></br>#include &lt;iostream&gt;<br></br><br></br>using namespace std;<br></br><br></br>class VeryUnsafe {<br></br>public:<br></br>  VeryUnsafe() { strcpy( password, "HaL9124f/aa" ); }<br></br>private:<br></br>  char password[ 100 ];<br></br>};<br></br>int main() {<br></br>  VeryUnsafe badguy;<br></br>  char *pass = reinterpret_cast&lt;char*&gt;( &amp; badguy );<br></br>  cout &lt;&lt; "Password: " &lt;&lt; pass &lt;&lt; endl;<br></br>}</div>

Der Cleaner säubert nicht nur sondern formatiert auch den gesäuberten Quellcode neu, so dass es hinterher so aussieht:

    <div class="listing" id="l_ohne_01_00">
      #include &lt;cstring&gt; 
     <br> 
     <br>#include &lt;iostream&gt; 
     <br> 
     <br> 
     <br> 
     <br>using namespace std; 
     <br> 
     <br> 
     <br> 
     <br>class VeryUnsafe { 
     <br> 
     <br>public: 
     <br> 
     <br> VeryUnsafe() { strcpy( password, "HaL9124f/aa" ); } 
     <br> 
     <br>private: 
     <br> 
     <br> char password[ 100 ]; 
     <br> 
     <br>}; 
     <br> 
     <br>int main() { 
     <br> 
     <br> VeryUnsafe badguy; 
     <br> 
     <br> char *pass = reinterpret_cast&lt;char*&gt;( &amp; badguy ); 
     <br> 
     <br> cout &lt;&lt; "Password: " &lt;&lt; pass &lt;&lt; endl; 
     <br> 
     <br>} 
    </div> 

So weit, so gut. Allerdings ist dann - das siehst Du hier nicht - im CSS die Einstellung white-space: pre-wrap; zu finden. Mehr dazu hier. Kurz gesagt, führt es dazu, dass innerhalb der so ausgezeichneten Blocks für die Klasse .listing plötzlich Whitespace so behandelt wird, als wäre ein <pre> Block vorhanden, nur dass es zusätzlich Wortumbruch gibt. Wenn ich z.B. in den Entwickler-Tools des Browsers die white-space-Eigenschaft vorübergehend deaktiviere, sieht der "Codeblock" so aus, wie er soll. (Ich erkläre das alles auch, um für mich selbst laut nachzudenken.) Update: Na ja, er sieht nicht ganz aus, wie er soll, denn die Einrückungen im Code selbst sind dann auch weg.

Am einfachsten wäre es wohl, den Cleaner das CSS anpassen zu lassen. Danach wäre allerdings zu prüfen, ob sich das irgendwo anders negativ auswirkt. Ich hoffe nicht. Ob und wann ich dazu komme, weiß ich noch nicht, ich mache kaum noch etwas am Openbook Cleaner. Aber demnächst sollte ich mal Zeit haben.

Ich habe das nachgeprüft in einer älteren (früher heruntergeladenen) Kopie des java_8 Buches, dort heißt die CSS-Datei _rwopen.css. In Zeile 209 änderst Du einfach white-space:pre-wrap; in white-space:wrap;, wenn Du meine Erklärung nachvollziehen willst.

Noch eine Info an mich selbst: Das Buch java_8 ist das einzige, in dem das CSS white-space: pre-wrap; oder white-space: pre; enthält, abgesehen von einem anderen Buch, wo es aber für <pre> Elemente redundant gesetzt wird.