*/
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
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_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://wiki.splitbrain.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, &$handler){
return $match;
}
/**
* Create output
*/
function render($mode, &$renderer, $data) {
if($mode == 'xhtml'){
// include_once "fortuneclass.php";
$f = new Fortune;
$fortunecookie = $f->quoteFromDir(DOKU_PLUGIN . "fortune/dat/");
$renderer->doc .= "
";
$renderer->doc .= nl2br(htmlspecialchars($fortunecookie));
$renderer->doc .= "
";
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 "";
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
?>