ebook_correctionsAs a part of my prac­tical term in the past six mon­ths, I de­ve­lo­ped an XML-based work­flow for au­to­ma­ted E-Book-production. To be ho­nest, we ne­ver thought about a re­vi­si­on or cor­rec­tion work­flow. But the publishing-houses did! After de­li­vering the pro­du­ced epub-files to them we re­cei­ved the cor­rec­tions and an­no­ta­ti­ons via Fax – as shown in the image on the right si­de.

D’oh! We de­ve­lo­ped a re­al­ly cool high-technology work­flow and they put their reading-device on the co­pi­er, co­pied it, ma­de their an­no­ta­ti­ons on the pa­per and old-school-faxed it back to our of­fice.

Hehe ^^ No com­ment… 😉

–––––
Info: I’m stu­dy­ing prin­ting and me­dia tech­no­lo­gy and for my prac­tical term I worked at a small pu­bli­shing ser­vice pro­vi­der, the pa­gi­na GmbH in Tübingen, Germany. With col­le­gues I de­ve­lo­ped this re­al­ly cool XML-EPUB-workflow with in­te­gra­ted au­to­ma­ted font-subsetting. Whoever is in­te­rested in this is­sue, feel free to ask me or the guys at pa­gi­na…

E-Mails mit PHP zu ver­sen­den geht ja an­sich ganz ein­fach und kom­for­ta­bel. Interessant wird es je­doch, wenn Textmails mit ma­nu­el­len Zeilenumbrüchen ver­schickt wer­den sol­len.

Ein Zeilenumbruch wird im Mailtext bei­spiels­wei­se wie folgt er­zeugt:

$mail­text = "Ich bin ein Absatz.\n";
$mail­text.= "Und ich auch!";

Damit die Steuerzeichen \n, \r oder \t in­ter­pre­tiert wer­den müs­sen sie in dop­pel­ten Anführungszeichen ste­hen! Einfache Anführungszeichen im obi­gen Beispiel wür­den be­wir­ken, dass das ab­schlie­ßen­de \n im E-Mail-Text aus­ge­ge­ben wird.

Soll nun Text aus ei­ner MySQL-Datenbank in die E-Mail flie­ßen, und wur­de die­ser Text zu­vor über ein HTML-<textarea>-Feld in der Datenbank ge­spei­chert, wer­den plötz­lich al­le Datenbankinhalte mit dop­pel­ten Zeilenumbrüchen in der E-Mail dar­ge­stellt.

Grund da­für ist die Form des Zeilenumbruchs der beim Speichern in die Datenbank ge­schrie­ben wird. Und das ist bei der Übergabe des HTML-<textarea>-Feldes ein so­ge­nann­ter „Windows-Zeilenumbruch“ im Format \r\n. Normalerweise in­ter­pre­tie­ren die meis­ten Programme die­se Umbruchs-Kombination (Carriage-Return + NewLine) als ei­nen zu­sam­men­hän­gen­den Umbruch, die gän­gi­gen E-Mail-Clients hin­ge­gen in­ter­pre­tie­ren \r\n als dop­pel­ten Zeilenumbruch. Auch un­ter Windows.

Um die­se Missinterpretation zu um­ge­hen soll­te vor Versand der E-Mail der kom­plet­te E-Mail-Text nach die­ser Zeichenkombination durch­sucht wer­den. Am ein­fachs­ten geht dies mit ei­nem Regulären Ausdruck der al­le Vorkomnisse von \r\n durch \n er­setzt.

$mail­text = "Ich bin ein Absatz.\n";
$mail­text.= "Und ich auch! Nach mir kommt Datenbankinhalt.";
$mail­text.= $da­ten­bank­in­halt;
 
$mail­text = preg_replace("%\r\n%", "\n", $mail­text);

Vor ei­ni­gen Monaten ha­be ich ei­ne Lösung zum Upload von docx- und xslx-Dateien in Mediawiki-Wiki’s ge­pos­tet.

Inzwischen ist das E-Book in al­ler Munde, und na­tür­lich soll man auch frei ver­füg­ba­re E-Books im Wiki hoch­la­den dür­fen. Doch auch hier wird der MimeType wie­der nicht rich­tig er­kannt.

file -bi un­ter Linux lie­fert für ein E-Book im po­pu­lä­ren „EPUB“-Format den MimeType application/x-zip, PHP in­ter­pre­tiert je­doch als application/zip. Ganz rich­tig wä­re üb­ri­gens application/epub+zip.

Um den EPUB-Upload zu ge­stat­ten muss al­so die Extension epub dem Array $wg­File­Ex­ten­si­ons in der LocalConfig.php hin­zu­ge­fügt wer­den. Danach muss noch die Datei mime.types im Ordner /includes an­ge­passt wer­den. Dazu muss le­dig­lich die Zeile application/zip [...] um den Eintrag epub er­wei­tert wer­den.

Wer viel mit CSS arbeitet und („krasse“) tabellenfreie Web-Layouts erstellt, der wird nicht drumherum kommen, sich mit den CSS-Selektoren zu beschäftigen.
Inzwischen bin ich etwas XPATH-verwöhnt was Selektoren angeht, denn mit self, child, parent, descendant, descendant-or-self, ancestor, ancestor-or-self, preceding, following, preceding-sibling und following-sibling hat man dort alle, und damit meine ich wirklich ALLE, Möglichkeiten im XML-(Struktur-)Baum zu navigieren und Elemente zu selektieren.

Die Möglichkeiten in CSS sind dagegen eher bescheiden. Hier eine kurze Übersicht über die wichtigsten CSS-Selektoren:

  • klasse klasse2
    Selektiert klasse2 die sich *irgendwo* innerhalb von klasse befindet.
    Beispiel:

    <div class="klasse">
      <span class="klasse2">Dieser SPAN wird selektiert.
        <p class="klasse2">Dieser Absatz wird selektiert.</p>
      </span>
    </div>
  • klasse>klasse2
    Selektiert klasse2, wenn sich diese genau EINE Ebene unterhalb von klasse befindet.
    Beispiel:

    <div class="klasse">
      <span class="klasse2">Dieser SPAN wird selektiert!
        <p class="klasse2">Dieser Absatz wird NICHT selektiert.</p>
      </span>
    </div>
  • klasse*klasse2
    Selektiert klasse2, wenn sich diese genau ZWEI Ebenen unterhalb von klasse befindet.
    Beispiel:

    <div class="klasse">
      <span class="klasse2">Dieser SPAN wird NICHT selektiert.
        <p class="klasse2">Dieser Absatz wird selektiert.</p>
      </span>
    </div>
  • klasse+klasse2
    Selektiert klasse2, wenn sich diese direkt NACH klasse befindet.
    Beispiel:

    <div class="klasse">
      <span class="klasse2">Dieser SPAN wird NICHT selektiert.</span>
    </div>
    <div class="klasse2">
      Dafür wird dieses DIV selektiert.
    </div>

Was ich mir für CSS wirklich wünsche, ist ein parent-Selektor. Der würde viel Arbeit abnehmen! Ist aber in CSS3 leider nicht vorgesehen und bis CSS4 rauskommt könnten noch ein paar Jährchen vergehen. Schade…

CSS 4 You bietet auf zwei Seiten noch weitere Infos zum Umgang mit Selektoren.

Wir neh­men fol­gen­den Fall an:

Es soll ei­ne per­ma­nen­te Weiterleitung er­fol­gen von der al­ten URL http://www.domain.de/wiki/ nach http://wiki.domain.de/. Alle an­ge­for­der­ten Seiten und Verzeichnisse (bei­spiels­wei­se index.php?title=Hauptseite) sol­len eben­falls wei­ter­ge­lei­tet wer­den.

Am ef­fek­tivs­ten wä­re hier ei­ne Weiterleitung mit­tels mod_rewrite, für Anfänger je­doch nicht oh­ne wei­te­res zu im­ple­men­tie­ren, und auch nur dann mög­lich, wenn der Webserver, sprich Apache dies er­laubt.

Eine Alternative da­zu stellt das fol­gen­de klei­ne PHP-Script dar:

<?php
/**
 * Permanente Weiterleitung
 * @author Tobias Fischer / to­bi­as (at) me­dia­ver­sal (punkt) de
 * @date 2009-04-24
 */
 
$url = $PHP_SELF . '?' . $QUERY_STRING;
$url = str_replace('/wiki', '', $url);
 
hea­der("Status: 301 Moved Permanently");
hea­der("Location: http://wiki.domain.de" . $url);
 
exit;
?>

$PHP_SELF gibt das Verzeichnis und die auf­ge­ru­fe­ne Datei ab Domainebene zu­rück, in un­se­rem Fall al­so /wiki/index.php. $QUERY_STRING lie­fert al­le an­ge­häng­ten Variablen „nach dem Fragezeichen“.
Nun müs­sen wir die­se bei­den Fragmente nur noch zu­sam­men­set­zen, dar­aus das ak­tu­el­le Arbeitsverzeichnis /wiki ent­fer­nen und an die neue URL http://wiki.domain.de/ an­hän­gen.

Die Statusmeldung 301 teilt dem Browser oder auch even­tu­el­len Suchmaschinen mit, dass die an­ge­for­der­te Seite per­ma­nent um­ge­zo­gen ist – 302 da­ge­gen wür­de tem­po­rär um­lei­ten.