Benutzer-Werkzeuge

Webseiten-Werkzeuge


Action unknown: siteexport_addpage
comp:userfriendly

Userfriendly.org Daily Cartoon

Ich mag es, wenn auch mal tagesaktuelle Sachen in einem Wiki auftauchen. Zum Beispiel hatte ich per iframe-Plugin den täglichen Spruch von http://bowp.netaction.de/ausrede/, aber 2009 hat der Spruch noch nicht gewechselt, und das ist langweilig. Ein Announcement ist auch nicht zu finden – einfach mal schlecht gewartet, nehme ich an.

So habe ich mir denn gedacht, man kann ja mal exemplarisch eine Cartoonseite einbinden. Seite einlesen, URL parsen, im Wiki einbauen, gut is :-) Najagut, Copyright ist zu beachten. Und so wie ich es umgesetzt habe, muss auch in den PHP-Einstellungen beachtet werden, dass die Funktion file() den Zugriff auf externe URLs erlaubt.

Hier zeige ich mal den Code, den ich in meinen 4 Wänden benutze – der also in diesem Wiki nicht aktiv ist, ihr braucht das auf dem Spielplatz gar nicht zu versuchen ;-). Der Code steht in einer Datei namens syntax.php im Verzeichnis lib/plugins/userfriendly innerhalb meiner DokuWiki-Installation

<?php
/**
 * userfriendly plugin: shows the daily cartoon from userfriendly.org
 *
/**
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
 * @author     Werner Flamme <w.flamme@web.de>
 * @date       2009-01-17
 */
 
if(!defined('DOKU_INC'))
    die();
if(!defined('DOKU_PLUGIN'))
    define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/');
require_once(DOKU_PLUGIN . 'syntax.php');
 
/**
 * All DokuWiki plugins to extend the parser/rendering mechanism
 * need to inherit from this class
 */
class syntax_plugin_userfriendly extends DokuWiki_Syntax_Plugin {
 
    var $err_sorrynopic = 'Sorry, no picture found';
 
    /**
     * return some info
     */
    function getInfo()
    {
        return array(
            'author' => 'Werner Flamme',
            'email'  => 'w.flamme@web.de',
            'date'   => '2009-01-17',
            'name'   => 'Userfriendly.org Cartoon Plugin',
            'desc'   => 'Shows the daily cartoon from userfriendly org ' .
                        'as shown on http://ars.userfriendly.org/cartoons/?id=<date>',
            'url'    => 'http://www.wernerflamme.name/doku.php?id=comp:userfriendly'
        );
    } // function getInfo
 
    /**
    * What kind of syntax are we?
    */
    function getType()
    {
        return 'substition';
    } // function getType
 
    /**
    * What kind of plugin are we?
    */
    function getPType()
    {
        return 'block';
    } // function getPType
 
    /**
    * Where to sort in?
    */
    function getSort()
    {
        return 200;
    } // function getSort
 
    /**
    * Connect pattern to lexer
    */
    function connectTo($mode)
    {
        $this->Lexer->addSpecialPattern('{~userfriendly~}', 
                               $mode, 'plugin_userfriendly');
    } // function connectTo
 
    /**
     * Handle the match
    */
    function handle($match, $state, $pos)
    {
        return array();
    } // function handle
 
    /**
     * Allow plugin types
    */
    function getAllowedTypes()
    {
        return array('substition');
    } // function getAllowedTypes
 
    /**
     * Create output
     @param $mode       current mode of DokuWiki 
            (see http://wiki.splitbrain.org/plugin:tutorial)
     @param $renderer   DokuWiki's rendering object
     @param $data       (not looked at)
     @var   $pagearr    the starting page of userfriendly.org (as array)
     @var   $line       that's what $pagearr consists of
     @var   $srcpos     position of the line where SRC= starts
     @var   $srclen     length of the URL after SRC=
     @var   $picid      the URL of the daily cartoon
     @var   $linkstart  constant expression to start the link tag with
     @var   $imgstart   constant expression to start the img tag with
     @return true, if rendering happens, false in all other cases
    */
    function render($mode, &$renderer, $data)
    {
        if ($mode == 'xhtml') {
            $pagearr = file("http://userfriendly.org/");
            if (!is_array($pagearr))
                return -1;
            foreach ($pagearr as $line) {
                if (substr($line, 0, 50) == '<A href="http://ars.userfriendly.org/cartoons/?id=') {
                    $srcpos = strpos($line, 'SRC="http://www.userfriendly.org/cartoons/');
                    $srclen = strlen($line) - $srcpos - 10;
                    $picid = substr($line, $srcpos + 4, $srclen);
                    $linkstart = '<a href="http://userfriendly.org/">';
                    $imgalt    = 'userfriendly.org daily cartoon';
                } // if URL in this line
            } // foreach ($pagearr as $line)
            if ( (strlen($picid) == 0) )
                $renderer->doc .= "<p>{$this->err_sorrynopic}</p>";
//            $renderer->doc .= "<p>{$linkstart}Hier wäre *IHR* Bild.</a></p>\n";
            if (!function_exists('p_get_instructions'))
                require_once(DOKU_INC . 'inc/parserutils.php');
            $picid   = substr($picid, 1, -1);
            $instruc = p_get_instructions('[[http://www.userfriendly.org/|{{' . $picid . '}}]]');
            $myinfo  = array();
            $retval  = p_render('xhtml', $instruc, $myinfo);
//            echo htmlentities($retval);
            $renderer->doc .= $retval;
            return true;
       } // if ($mode == 'xhtml')
        return false;
    } // function render
 
 
} // class syntax_plugin_userfriendly
 
//Setup VIM: ex: et ts=4 enc=utf-8 :

So, und wenn ich auf eine Seite den Ausdruck schreibe, den ich in der Funktion connectTo benutzt habe, erhalte ich an dieser Stelle den Cartoon des Tages (nach Zeitrechnung des Standorts von userfriendly.org) von userfriendly.org :-).

Der Code ist noch verbesserungswürdig. So könnte ich zum Parsen der Seite reguläre Ausdrücke benutzen und/oder könnte alles den Funktionen von inc/SimplePie.php überlassen – aber für den von mir skizzierten Wirkungsbereich ;-) tut die vorhandene Lösung erst mal, und wenn nix mehr kommt, sehen wir weiter… Vielleicht nehme ich dazu den RSS-Feed von Dilbert ;-)

comp/userfriendly.txt · Zuletzt geändert: 2009-02-01 1550 von werner

Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki