*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 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
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
require dirname(__FILE__) . '/vendor/autoload.php';
use DokuWiki\Barcodes\BarcodesWrapper;
use DokuWiki\Barcodes\BarcodesException;
use DokuWiki\Barcodes\Color;
class syntax_plugin_barcodes extends DokuWiki_Syntax_Plugin
{
public function getType()
{
return 'substition';
}
public function getSort()
{
return 32;
}
public function connectTo($mode)
{
$this->Lexer->addSpecialPattern(']*/?>', $mode, 'plugin_barcodes');
}
public function handle($match, $state, $pos, Doku_Handler $handler)
{
$data = new stdClass();
// parse element
try {
$barcode = new SimpleXMLElement($match);
}
catch (Exception $e) {
$data->error = 'error parsing barcode tag';
return $data;
}
// parse attributes
$attributes = new stdClass();
$attributes->type = strtoupper($barcode->attributes()['type']);
$attributes->value = strval($barcode->attributes()['value']);
$attributes->img_type = $barcode->attributes()['img-type'] ? strval($barcode->attributes()['img-type']) : $this->getConf('default_img_type');
$attributes->color = $barcode->attributes()['color'] ? Color::str2hex($barcode->attributes()['color']) : Color::str2hex($this->getConf('default_color'));
$attributes->background_color = $barcode->attributes()['background-color'] ? Color::str2hex($barcode->attributes()['background-color']) : ($this->getConf('default_background_color') ? Color::str2hex($this->getConf('default_background_color')) : null);
$attributes->size = preg_match('/^([0-9]+)(px)?$/', $barcode->attributes()['size'], $matches) ? intval($matches[1]) : null;
$attributes->scale = $barcode->attributes()['scale'] ? floatval($barcode->attributes()['scale']) : 1;
$attributes->padding = preg_match('/^([0-9]+)(px)?$/', $barcode->attributes()['padding'], $matches) ? intval($matches[1]) : $this->getConf('default_padding');
$attributes->logo = $barcode->attributes()['logo'] ? strval($barcode->attributes()['logo']) : null;
$data->attributes = $attributes;
// return
return $data;
}
public function render($mode, Doku_Renderer $renderer, $data)
{
if ($mode == 'xhtml') {
// check if an parsing error has occured
if ($data->error) {
$renderer->doc .= $this->renderErrorMessage($data->error);
return false;
}
// render barcode
try {
$barcode = new BarcodesWrapper($data->attributes);
$renderer->doc .= $barcode->getHtml();
return true;
}
catch (BarcodesException $e) {
$renderer->doc .= $this->renderErrorMessage($e->getMessage());
return false;
}
}
return false;
}
private function renderErrorMessage($error_message) {
return '<barcode: ' . htmlspecialchars($error_message) . ' />';
}
}