Benutzer-Werkzeuge

Webseiten-Werkzeuge


users:werner:modirend

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
users:werner:modirend [2007-01-13 2101]
werner URL angepasst
users:werner:modirend [2007-01-13 2115] (aktuell)
werner Erweiterung
Zeile 1: Zeile 1:
 +====== Ein Renderer-Plugin für DokuWiki ======
  
 +...das mir leider nicht geglückt ist :-(
 +
 +Mich stört, dass im Sourcecode von DokuWiki die einfachen und doppelten Anführungszeichen fest codiert sind. Zur Zeit behebe ich das durch einen Flicken im verwendeten [[doku>wiki:tpl:ach|ACH-Template]]:
 +
 +<code php>
 +      <?php
 +        ob_start();
 +        tpl_content();
 +        $myhtml = ob_get_contents();
 +        ob_end_clean();
 +        echo wfModiOut('screen', $myhtml);
 +       ?>
 +</code>
 +
 +Dabei ist ''wfModiOut()'' eine Funktion, die im Wesentlichen aus zwei Befehlen besteht:
 +
 +<code php>
 +      $retval = str_replace('&ldquo;', '&raquo;', $retval);
 +      $retval = str_replace('&rdquo;', '&laquo;', $retval);
 +</code>
 +
 +Ich dachte mir, dass ein Renderer-Plugin so etwas überflüssig macht, und ging nun daran, mir die Freckelei im Template mit folgendem Stück Code zu ersparen:
 +
 +<code php>
 +<?php
 +
 +/**
 +    MODIfied RENDerer for XHTML output
 +    @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 +    @author Werner Flamme \<w.flamme@web.de>
 +**/
 +// the following lines are stolen from the s5 plugin of Harry Fuecks and Andi Gohr
 +// must be run within Dokuwiki
 +if(!defined('DOKU_INC')) die();
 +
 +// we inherit from the XHTML renderer instead directly of the base renderer
 +require_once DOKU_INC.'inc/parser/xhtml.php';
 +// stolen code ends here
 +
 +if (!defined('DOKU_PLUGIN'))
 +  define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
 +require_once DOKU_PLUGIN . 'modirend/conf/default.php';
 +
 +/**
 +    This class allows to change the double and single quotation marks,
 +    something I always wanted but what never got implemented.
 +    Instead of modifying 4 lines in DokuWikis source code
 +    I have to write a plugin :-(
 +**/
 +class Doku_Renderer_modirend extends Doku_Renderer_xhtml {
 +
 +    /**
 +        Return some info
 +    **/
 +    function getInfo(){
 +        return array(
 +                    'author' => 'Werner Flamme',
 +                    'email'  => 'w.flamme@web.de',
 +                    'date'   => '2007-01-13',
 +                    'name'   => 'MODIfied RENDerer',
 +                    'desc'   => 'Changes quote marks',
 +                    'url'    => 'http://www.wernerflamme.name/users:werner:modirend',
 +                    );
 +    } // function getInfo
 +
 +    /**
 +        add opening single quotation mark to document's code
 +    **/
 +    function singlequoteopening()
 +    {
 +        global $conf;
 +        $default = '&lsquo;'; // from the standard renderer
 +        $insert  = $conf['modirend_sq_open'];
 +        $this->doc .= (strlen($insert) > 0) ? $insert : $default;
 +    } // function singlequoteopening
 +
 +    /**
 +        add closing single quotation mark to document's code
 +    **/
 +    function singlequoteclosing()
 +    {
 +        global $conf;
 +        $default = '&rsquo;'; // from the standard renderer
 +        $insert  = $conf['modirend_sq_close'];
 +        $this->doc .= (strlen($insert) > 0) ? $insert : $default;
 +    } // function singlequoteclosing
 +
 +    /**
 +        add opening double quotation mark to document's code
 +    **/
 +    function doublequoteopening()
 +    {
 +        global $conf;
 +        $default = '&ldquo;';
 +        $insert  = $conf['modirend_dq_open'];
 +        $this->doc .= (strlen($insert) > 0) ? $insert : $default;
 +    } // function doublequoteopening
 +
 +    /**
 +        add closing double quotation mark to document's code
 +    **/
 +    function doublequoteclosing()
 +    {
 +        global $conf;
 +        $default = '&rdquo;';
 +        $insert  = $conf['modirend_dq_close'];
 +        $this->doc .= (strlen($insert) > 0) ? $insert : $default;
 +    } // function doublequoteclosing
 +} // class Doku_Renderer_modirend
 +
 +//Setup VIM: ex: et ts=4 enc=utf-8 :
 +</code>
 +
 +Ich benutze also den Standard-XHTML-Renderer und überschreibe 4 seiner Methoden. Wenn ich ein ''&do=export_modirend'' manuell an die URL anhänge (oder über ''exportlink($ID, 'modirend')'' die Daten sehen will), erscheinen "meine" Anführungszeichen. Das ist die Theorie.
 +
 +In der Praxis führt das ''&do=export_modirend'' dazu, dass der Dokumenteninhalt zwar angezeigt wird, aber ohne meine Anführungszeichen.
 +
 +Des weiteren führte das dazu, dass mein Apache auch auf anderen Seiten und ohne ''&do=export_modirend'' nur noch Fragmente ausgab -- im Error-Log fand ich nur einen Hinweis auf einen segfault, keinerlei PHP-Fehler.
 +
 +Ebenso erhalte ich einen Segfault, wenn ich folgendes in mein Template einbaue:
 +
 +<code php>
 +        if ($fpo = fopen('old.txt', 'w')) {
 +            fwrite($fpo, wfModiOut('screen', $myhtml));
 +            fclose($fpo);
 +        } // if ($fpo = fopen('old.txt', 'w'))
 +        if ($fpn = fopen('new.txt', 'w')) {
 +            $newlink = 'http://' . $_SERVER['SERVER_NAME'] . exportlink($ID, 'modirend');
 +            echo "$newlink<br />\n";
 +            $newlink = str_replace('&amp;', '&', $newlink);
 +            fwrite($fpn, "$newlink\n");
 +            if ($newc = fopen($newlink, 'r')) {
 +                while (!feof($newc)) {
 +                    $newtxt = fread($newc, 1024);
 +                    fwrite($fpn, $newtxt);
 +                } // while (!feof($newc))
 +                fclose($newc);
 +                fclose($fpn);
 +            } // if ($newc = fopen($newlink, 'r'))
 +        } // if ($fpn = fopen('new.txt', 'w'))
 +</code>
 +
 +Die Datei ''old.txt'' enthaelt den Text wie er angezeigt wird, ''new.txt'' enthält keine Anführungszzeichen -- wenn überhaupt etwas passiert, denn meist segfaultet der Apache :-( Er tut das übrigens oft unabhängig von diesem Codestück. :-/
 +
 +Ich dachte zuerst, dass -- aus welchem Grund auch immer -- innerhalb der Funktionen die von mir gesetzten Zeichen nicht bekannt sind, deshalb das Setzen von ''$default'' und die Abfrage von ''strlen($insert)''. Aber in ''new.txt'' erscheint an den jeweiligen Stellen //gar kein// Anführungszeichen. 
 +
 +Wenn mein Renderer gar nicht aufgerufen würde, würde entweder gar nichts passieren (bzw. eine Meldung kommen, dass der Renderer nicht zur Verfügung steht) oder die Default-Zeichen müssten erscheinen. Aber //gar nichts//?
 +
 +Frage: warum stellt sich das erwartete Ergebnis -- also ein Text, der genau so aussieht wie der standardmäßig produzierte, nur mit anderen Anführungszeichen -- nicht ein? Wie benutze ich das Plugin sachgerecht?
users/werner/modirend.txt · Zuletzt geändert: 2007-01-13 2115 von werner