num}} -- num = 5 or 5/7 or 100/1000
* -- num = -1 gives a "not rated yet"
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the LGNU Lesser General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* LGNU Lesser General Public License for more details.
*
* You should have received a copy of the LGNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
if(!defined('DOKU_PLUGIN_STARS2_IMAGES')) define('DOKU_PLUGIN_STARS2_IMAGES',DOKU_BASE.'lib/plugins/stars2/images/');
require_once(DOKU_PLUGIN.'syntax.php');
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_stars2 extends DokuWiki_Syntax_Plugin {
/**
* return some info
*/
function getInfo(){
return array(
'author' => 'Zahno Silvan',
'email' => 'zaswiki@gmail.com',
'date' => '2020-07-07',
'name' => 'Stars2 Plugin',
'desc' => 'Embedding Rating Stars',
'url' => 'https://github.com/tschinz/dokuwiki_stars_plugin',
);
}
/**
* What kind of syntax are we?
*/
function getType(){
return 'substition';
}
/**
* Where to sort in?
*/
function getSort(){
return 299;
}
/**
* Connect pattern to lexer
*/
function connectTo($mode) {
$this->Lexer->addSpecialPattern('\{\{stars>.*?\}\}',$mode,'plugin_stars2');
}
/**
* Handle the match
*/
function handle($match, $state, $pos, Doku_Handler $handler){
switch ($state) {
case DOKU_LEXER_ENTER :
break;
case DOKU_LEXER_MATCHED :
break;
case DOKU_LEXER_UNMATCHED :
break;
case DOKU_LEXER_EXIT :
break;
case DOKU_LEXER_SPECIAL :
return $match;
break;
}
return array();
}
/**
* Create output
*/
function render($mode, Doku_Renderer $renderer, $data) {
if($mode == 'xhtml' || $mode == 'odt')
{
// strip {{stars> from start
$data = substr($data,8);
// strip }} from end
$data = substr($data,0,-2);
$num = $data;
if (empty($num))
$num = "0/5";
$empty = true;
// Get seperate num's
$num=explode('/',$num); // Strip size
if (!isset($num[1]))
$num[1] = $num[0];
if ($num[0]>$num[1])
$num[1]=$num[0];
if ($num[1]>10)
{
$num[0] = 10 * $num[0] / $num[1];
$num[1] = 10;
} // end if ($num[1]>10)
if ($mode == 'xhtml')
{
if ($empty == true)
$renderer->doc .= $this->_Stars_static($num);
else
$renderer->doc .= $this->_Stars_dynamic($num);
}
else
{
$this->_Stars_static_for_odt($renderer, $num);
}
return true;
}
return false;
}
function _Stars_static($d)
{
# Get the config options
$options['height'] = $this->getConf('height');
$string='';
// Not rated yet images
if($d[0] < 0)
{
$d[0] = -$d[0];
$nry = true;
}
else
$nry = false;
// render full stars
for($i=1; $i<=$d[0]; $i++)
if($nry == true)
$string .= '';
else
$string .= '';
// render half star if necessary
if($i-.5 <= $d[0])
{
$string .= '';
$i+= .5;
} // end if($i-$d[0] > 0)
for($i;$i<=$d[1];$i++)
$string .= '';
$string .= '';
return $string;
} // end function _Stars_static($d)
function _Stars_dynamic($d)
{
# Get the config options
$options['height'] = $this->getConf('height');
$string='';
// render full stars
for($i=1; $i<=$d[0]; $i++)
$string .= '';
// render half star if necessary
if($i-.5 <= $d[0])
{
$string .= '';
$i+= .5;
} // end if($i-$d[0] > 0)
for($i;$i<=$d[1];$i++)
$string .= '';
$string .= '';
return $string;
} // end function _Stars_dynamic($d)
function _Stars_static_for_odt(&$renderer, $d)
{
// Prepare the full path for the function _odtAddImage
// otherwise the file will not be found!
$src_unknown = DOKU_INC . DOKU_PLUGIN_STARS2_IMAGES . 'unknownstar.png';
$src_full = DOKU_INC . DOKU_PLUGIN_STARS2_IMAGES . 'fullstar.png';
$src_half = DOKU_INC . DOKU_PLUGIN_STARS2_IMAGES . 'halfstar.png';
$src_empty = DOKU_INC . DOKU_PLUGIN_STARS2_IMAGES . 'emptystar.png';
// Not rated yet images
if($d[0] < 0)
{
$d[0] = -$d[0];
$nry = true;
}
else
$nry = false;
// render full stars
for($i=1; $i<=$d[0]; $i++)
{
if($nry == true)
{
$renderer->_odtAddImage($src_unknown);
}
else
{
$renderer->_odtAddImage($src_full);
}
}
// render half star if necessary
if($i-.5 <= $d[0])
{
$renderer->_odtAddImage($src_half);
$i+= .5;
} // end if($i-$d[0] > 0)
for($i;$i<=$d[1];$i++)
{
$renderer->_odtAddImage($src_empty);
}
} // end function _Stars_static_for_odt($d)
}