Table of Contents
fortune Plugin
Description
This plugin Show a Quote of the Day on your page. It should change every time the page is rendered again.
The plugin uses code written by Henrik Aasted Sorensen, henrik@aasted.org Read more at http://www.aasted.org/quote
Fortune files can be found e.g. from freshmeat Dead link (404) — patric 2022-01-29 13:44
and one nice from here http://www.splitbrain.org/Fortunes/hitchhiker
Usage
After installation (below) you can insert the code
{{fortune}}
in your page to display a random quote.
Installation
Search and install the plugin using the Extension Manager. Refer to Plugins on how to install plugins manually.
Download: here
Create a new folder lib/plugin/fortune/dat/
and set it to be writable for the web server.
From the cookie file, put the file containing the text (not the .dat file) to the created fortune/dat/ directory. The dat file will be generated automatically.
Plugin
lib/plugin/fortune/syntax.php
:
<?php /** * Include Plugin: displays a wiki page within another * Usage: * {{fortune}} * * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Otto Vainio <oiv-plugins@valjakko.net> */ /** * All DokuWiki plugins to extend the parser/rendering mechanism * need to inherit from this class */ class syntax_plugin_fortune extends DokuWiki_Syntax_Plugin { /** * return some info */ function getInfo(){ return array( 'author' => 'Otto Vainio', 'email' => 'oiv-plugins@valjakko.net', 'date' => '2005-10-14', 'name' => 'Fortune Plugin', 'desc' => 'Displays qotd (Quote Of The Day)', 'url' => 'http://www.dokuwiki.org/plugin:fortune', ); } /** * What kind of syntax are we? */ function getType(){ return 'substition'; } /** * Where to sort in? */ function getSort(){ return 56; } /** * Paragraph Type */ function getPType(){ return 'block'; } /** * Connect pattern to lexer */ function connectTo($mode) { $this->Lexer->addSpecialPattern("{{fortune}}",$mode,'plugin_fortune'); } /** * Handle the match */ function handle($match, $state, $pos, Doku_Handler $handler){ return $match; } /** * Create output */ function render($mode, Doku_Renderer $renderer, $data) { if($mode == 'xhtml'){ // include_once "fortuneclass.php"; $f = new Fortune; $fortunecookie = $f->quoteFromDir(DOKU_PLUGIN . "fortune/dat/"); $renderer->doc .= "<div class=\"fortune\">"; $renderer->doc .= nl2br(htmlspecialchars($fortunecookie)); $renderer->doc .= "</div>"; return true; } return false; } } /* Main methods to use: quoteFromDir($dir): Quotes from any of the fortune-files in the dir. getRandomQuote($file): Quotes from the specific file. Written by Henrik Aasted Sorensen, henrik@aasted.org Read more at http://www.aasted.org/quote Edited by Otto Vainio */ class Fortune { function quoteFromDir($dir) { $amount = 0; $index = 0; clearstatcache(); if ( $handle = opendir($dir) ) { while (false !== ($file = readdir($handle))) { if (strlen($file)>2 && $file!="_dummy") { if (substr($file,-4) == ".dat"){ if (@filemtime(substr($file,0,-4))>@filemtime($dir.$file)) { $this->createIndexFile($dir.substr($file,0,-4)); } $number = $this->getNumberOfQuotes($dir . $file); $amount += $number; $quotes[$index] = $amount; $files[$index] = $file; $index++; } else { if (!is_file($dir.$file.".dat") || (@filemtime($dir.$file)>@filemtime($dir.$file.".dat"))) { $this->createIndexFile($dir.$file); $number = $this->getNumberOfQuotes($dir . $file . ".dat"); $amount += $number; $quotes[$index] = $amount; $files[$index] = $file.".dat"; $index++; } } } } srand((double)microtime()*1000000); $index = rand(0, $amount); $i = 0; while ($quotes[$i] < $index) { $i++; } return $this->getRandomQuote($dir .$files[$i]); } return ""; } /* Reads the number of quotes in the file. */ function getNumberOfQuotes($file) { $len=0; if ($fd = @fopen($file, "rb")) { $this->readLong($fd); // Just move over the first long. Might as well be fseek. $len = $this->readLong($fd); fclose($fd); } return $len; } /* Picks quote number $index from the dat-file in $file. */ function getExactQuote($file, $index) { if (is_file($file) == FALSE) { return; } if ( ($fd = fopen($file, "rb")) == FALSE ) { return; } fseek($fd, 24 + 4 * $index); $phys_index = $this->readLong($fd); fclose($fd); $quotefile = substr($file, 0, strlen($file) - 4); if ( ($fd = fopen($quotefile, "rb")) == FALSE ) { return; } $res = $this->getQuote($fd, $phys_index); fclose($fd); return $res; } /* Returns a random quote from $file. */ function getRandomQuote($file) { $number = $this->getNumberOfQuotes($file); $index = rand(0, $number - 1); return $this->getExactQuote($file, $index); } /* Reads a quote from the specified index. */ function getQuote($fd, $index) { fseek($fd, $index); $line=""; $res = ""; do { $res = $res . $line; $line = fgets($fd, 1024); } while ( ($line[0] != "%") && (!feof($fd)) ); return $res; } /* Gets indexes from the file pointed to by the filedescriptor $fd. */ function getIndices($fd) { fseek($fd, 24, SEEK_SET); $i = 0; while ( feof($fd) == FALSE ) { $res[$i] = readLong($fd); $i++; } return $res; } function readLong($fd) { $res = fread($fd, 4); $l = ord($res[3]); $l += ord($res[2]) << 8; $l += ord($res[1]) << 16; $l += ord($res[0]) << 24; return $l; } function createIndexFile($file) { $fd = fopen($file, "r"); if ($fd == false) { // echo "File error!"; exit; } $i = 1; $length = 0; $longest = 0; $shortest = 100000; $indices[0] = 0; while (!feof($fd)) { $line = fgets($fd); if ($line == "%\n") { $indices[$i] = ftell($fd); $i++; if ($length > $longest) $longest = $length; if ($length < $shortest) $shortest = $length; $length = 0; } else { $length = $length + strlen($line); } } fclose($fd); $fd = @fopen($file . ".dat", "w"); if ($fd == false) { // echo "<!-- createIndexFile: Could not write to file....-->"; exit; } // Write header. $this->writeLong($fd, 2); $this->writeLong($fd, count($indices)); $this->writeLong($fd, $longest); $this->writeLong($fd, $shortest); $this->writeLong($fd, 0); $this->writeLong($fd, 37 << 24); for ($i = 0 ; $i < count($indices) ; $i++) { $this->writeLong($fd, $indices[$i]); } fclose($fd); } function writeLong($fd, $l) { fwrite($fd, chr ( ($l >> 24) & 255)); fwrite($fd, chr ( ($l >> 16) & 255)); fwrite($fd, chr ( ($l >> 8) & 255)); fwrite($fd, chr ( $l & 255)); } }// End of class
Discussion
The link to the archive for the plugin manager is pointing to the archive for your ifauth plugin! — ChristopherArndt 2005-10-17 13:05Fixed — Otto Vainio 2005-10-18 11:26
How is this plugin used? — M. O'Neill 2005-12-09 06:03Good questionI totally forgot this. I now added a section usage — Otto Vainio 2005-12-09 10:20
Good Idea. Instead of using normal fortune files you also could use it to show a hint of the day for DokuWiki, like used in many software-applications. The only problem would be to collect some hints. Who would be interested? — Konrad Bauckmeier 2005-12-09 11:39
I'm using fortune for some time now and I'm wondering if there is a smart possibility of using different sets of data for several namespaces or by triggering it in the code like:{{fortune:[namespace]}}
, so I could use quotes concerning health in a different namespace than quotes from some movie or those concerning sports or politics. The [namespace] trigger should not be mandatory but an option. Any idea, how this could be solved best? — eModul 2007-02-18 14:11
I added a style sheet to this. Wanted to set the FORTUNE off a bit form the rest of the page. Just make a 'style.css' file in the fortune directory.
.fortune { border: 1px black solid; margin-left: 40px; margin-right: 40px; margin-bottom: 40px; padding: 10px; font-style: italic; }
— Walter 2009-01-11 03:36
Walter, you're from the future (2009? wow!)! Great plugin! Could this be extended to read a quote from a different file, such as: {{fortune:[dat_filename]}}
. This may complement/solve/be-the-same-as eModul's question from above… Juice 2008-06-03
Same fortune every time
How does it update?
Ditto. Is there a way to tell Dokuwiki not to cache this particular element?
⇒ one can deactivate cache with the directive
~~NOCACHE~~