de

designoir

Quotes

Webtypographie ist ein leider kaum beachtetes Thema. Viele Nutzer haben selbst Probleme, richtig zu schreiben, und sind dementsprechend kaum für schlechte Textgestaltung sensibilisiert. Aber egal, ob sie es nun wissen beziehungsweise einsehen wollen oder nicht – das optische Erscheinungsbild eines Textes hat nicht nur den Selbstzweck, sondern ist entscheidend für einen guten Lesefluss.

Einer der häufigsten “Fehler” betrifft Anführungszeichen. Das "-Zeichen ist nach den Regeln keiner Sprache dafür geeignet, diese Rolle zu übernehmen, doch die korrekten Zeichen lassen sich nur schwer mit der Tastatur erzeugen. Textverarbeitungssoftware hilft hier, doch wenn man direkt im Browser tippt, ist man bisher auf sich alleine gestellt. Die Folge ist, dass auf vielen Websites nur " Verwendung findet, und auf wieder anderen regiert das Chaos:

Screenshot zeit.de Screenshot deutsche-handwerks-zeitung.de

An dieser Stelle setzt die Quotes-Klasse an. Statt dem Autor einen vielleicht nicht zumutbaren Mehraufwand abzuverlangen, sollen die Anführungszeichen automatisch korrigiert werden. Bei der Instanziierung kann dazu mit der Übergabe eines Paremters eine von vier Voreinstellungen geladen werden: de für „...“, de2 für »...«, fr für « ... » und en für “...”.

Danach kann der Methode run() ein Text übergeben werden, der auch HTML-Code enthalten darf und überarbeitet zurückgegeben wird. Neben den zuvor eingestellten Anführungszeichen wird dabei auch ' in umgewandelt.

Quotes.php

Requires: Preprocess

<?php

/**
 * class Quotes
 * Copyright (C) 2006  Dao Gottwald  <dao at design-noir.de>
 * 
 * Licensed under the terms of the GNU Lesser General Public License:
 *   http://www.opensource.org/licenses/lgpl-license.php
 *
 * @version  1.0.1
 */

require_once 'Preprocess.php';

class Quotes extends Preprocess {
    private
        $quot_a,
        $quot_b;
    
    public function __construct ($lc = 'en') {
        switch ($lc) {
            case 'de':
                $this->set ('&#8222;', '&#8220;');
                break;
            case 'de2':
                $this->set ('&#187;', '&#171;');
                break;
            case 'fr':
                $this->set ('&#171;&#160;', '&#160;&#187;');
                break;
            case 'en':
            default:
                $this->set ('&#8220;', '&#8221;');
        }
    }
    public function set ($quot_a, $quot_b) {
        $this->quot_a = $quot_a;
        $this->quot_b = $quot_b;
    }
    
    public function run ($text) {
        $this->text =& $text;
        $t = $this->_escape_init();
        $this->_escape_comments_cdata();
        $this->_escape_content ('pre', 'code', 'blockcode', 'samp', 'kbd', 'textarea');
        $this->_escape_init_plenk();
        $this->_escape_inline_tags();
        $this->_escape_tags ('br');
        $text = preg_replace_callback ('~>.*?<~s', array ($this, '_replace'), '>'.$text.'<');
        $text = substr ($text, 1, -1);
        $this->_escape_fin();
        $this->_escape_init($t);
        $this->_escape_fin();
        return $text;
    }
    private function _replace (array $matches) {
        $matches[0] = str_replace ('\'', '&#8217;', $matches[0]);
        return preg_replace ('~(?<=\W)"(.*?)"(?=\W)~s', $this->quot_a.'\\1'.$this->quot_b, $matches[0]);
    }
}

?>

Die folgenden Beispiele zeigen, wie die Klasse eingesetzt werden kann.

Example #1: de.php

<?php

$text = 'Im <a href="http://www.heise.de/newsticker/meldung/67333">Lauf der gestrigen Debatte</a>'.
' hatten sich Abgeordnete quer auch durch die großen Fraktionen geteilter Meinung gezeigt.
Laut der finnischen EVP-Abgeordneten Piia-Nora Kauppi dürfte es nicht sein, "dass alle in der Gesellschaft überwacht werden".
Sie bezeichnete den Kompromiss als "nicht ausgewogen".';

$q = new Quotes ('de');
echo $q->run($text), '<hr/>';

$q = new Quotes ('de2');
echo $q->run($text);

?>

Run de.php

Example #2: fr.php

<?php

$q = new Quotes ('fr');
echo $q->run('<a href="http://www.zdnet.fr/actualites/internet/0,39020774,39260253,00.htm">Ces amendements</a>'.
' "visent à créer une autorisation pour les internautes français de télécharger des fichiers musicaux donnant lieu,
en contrepartie, à une rémunération pour les ayants droit."');

?>

Run fr.php

Example #3: en.php

<?php

ob_start (array (new Quotes ('en'), 'run'));

?>Google also will provide snippets of reviews from sites on the Web and links to those sites.
"This has been one of the longstanding unfilled user needs," Mayer said.
"We saw a search need where we weren't providing users with the highest-quality results that we could."

Run en.php

Comments

HTML will not be interpreted.

Last changed on April 10, 2007 Dão G., 2005–2010
aggressiv akt andromeda bar beine blue efeu frontal fugaetu industriell komet land noir rost rot sonnenblume splash split winter wolke zeit