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