ConLite/conlite/classes/template/class.clCounterFunctionPars...

188 Zeilen
5.7 KiB
PHP

<?php
/**
* class.clCounterFunctionParser.php
*
* clCounterFunctionParser class
* Template parser class for counters
*
* @package ConLite
* @subpackage CoreClasses
* @version $Rev$
*
* $Id$
*/
/**
* @package ConLite Backend classes
* @version 1.1
* @author Stefan Welpot
* @modified René Mansveld
* @copyright ConLite <www.conlite.org>
* @license http://www.conlite.org/license/LIZENZ.txt
* @link http://www.conlite.org
* @since file available since ConLite release 2.0.0
*/
/**
* class clCounterFunctionParser
*
* Implemenation des AbstractTemplateParser zur Verwendung von
* Zählern im Template
* Als Tag im Template ist vorgesehen:
* - {counter PARAMETER}
* Die PARAMETER sind:
* - name=ZÄHLERNAME
* - start=STARTWERT (default: 0)
* - step=SCHRITTWEITE (default: 1)
* - print=(true|false) (default: true)
* Alle Parameter sind optional.
*
* Über die Name-Eigenschaft können mehrere unschiedliche Zähler verwendet werden.
* Bei jedem Vorkommen des {counter}-Tags wird der gleichnamige Zähler um STEP erhöht.
* Wird die Eigenschaft print auf true oder gar nicht gesetzt erfolgt eine Ausgabe des
* Zählerwerts an der Stelle des {counter}-Tags
*/
include_once('class.clAbstractTemplateParser.php');
class clCounterFunctionParser extends clAbstractTemplateParser {
/**
* Regexp-Pattern für {counter PARAMETER}
* @var pattern_countertag
*/
var $pattern_countertag = "/(?si)\{counter(.*?\})/";
/**
* Regexp-Pattern für Parameter name=NAME
* @var pattern_countername
*/
var $pattern_countername = "/(?i)name\040?\=(.+?)(\040|\})/";
/**
* Regexp-Pattern für Parameter start=STARTWERT
* @var pattern_counterstart
*/
var $pattern_counterstart = "/(?i)start\040?\=(\d+?)(\040|\})/";
/**
* Regexp-Pattern für Parameter step=SCHRITTWEITE
* @var pattern_counterstep
*/
var $pattern_counterstep = "/(?i)step\040?\=(\d+?)(\040|\})/";
/**
* Regexp-Pattern für Parameter print=(true|false)
* @var pattern_counterprint
*/
var $pattern_counterprint = "/(?i)print\040?\=(true|false)(\040|\})/";
/**
* Defaultwert für Parameter name
* @var default_countername
*/
var $default_countername = "unnamed";
/**
* Defaultwert für Parameter start
* @var default_counterstart
*/
var $default_counterstart = 0;
/**
* Defaultwert für Parameter step
* @var default_counterstep
*/
var $default_counterstep = 1;
/**
* Defaultwert für Parameter print
* @var default_counterprint
*/
var $default_counterprint = true;
/**
* Konstruktor
*/
public function __construct() {}
/**
* @see AbstractTemplateParser#parse(string)
*/
public function parse($template) {
$counterParameters = "";
$counterKey = "";
$array_matches = array();
$array_countermatches = array();
$array_initCounters = array();
$boolPrint = $this->default_counterprint;
$boolDoNotInkr = false;
preg_match_all($this->pattern_countertag, $template, $array_countermatches, PREG_SET_ORDER);
for($i = 0; $i < count($array_countermatches); $i++) {
$counterKey = "";
$counterParameters = $array_countermatches[$i][1];
//Attribut Countername auslesen, falls vorhanden
preg_match($this->pattern_countername, $counterParameters, $array_matches);
if(count($array_matches) > 0) {
$counterKey = $array_matches[1];
}
else { // sonst defaultname
$counterKey = $this->default_countername;
}
if(!array_key_exists($counterKey, $array_initCounters)) { // neuen Counter initialisieren
$array_initCounters[$counterKey]['value'] = $this->default_counterstart;
$array_initCounters[$counterKey]['step'] = $this->default_counterstep;
$boolDoNotInkr = true;
}
//Attribut step
preg_match($this->pattern_counterstep, $counterParameters, $array_matches);
if(count($array_matches) > 0) {
$array_initCounters[$counterKey]['step'] = $array_matches[1];
}
//Attribut start
preg_match($this->pattern_counterstart, $counterParameters, $array_matches);
if(count($array_matches) > 0) {
$array_initCounters[$counterKey]['value'] = $array_matches[1];
$boolDoNotInkr = true;
}
// value regulär erhöhen
if(!$boolDoNotInkr) {
$array_initCounters[$counterKey]['value'] = $array_initCounters[$counterKey]['value'] + $array_initCounters[$counterKey]['step'];
}
else {
$boolDoNotInkr = false;
}
//Attribut print
preg_match($this->pattern_counterprint, $counterParameters, $array_matches);
if(count($array_matches) > 0) {
$boolPrint = (strcasecmp("true", $array_matches[1]) == 0) ? true : false;
}
else {
$boolPrint = $this->default_counterprint;
}
if($boolPrint) {
$template = preg_replace($this->pattern_countertag, $array_initCounters[$counterKey]['value'], $template, 1);
}
else {
$template = preg_replace($this->pattern_countertag, '', $template, 1);
}
}
return $template;
}
}
?>