*/ // must be run within Dokuwiki if (!defined('DOKU_INC')) die(); if (!defined('DOKU_LF')) define('DOKU_LF', "\n"); if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); require_once DOKU_PLUGIN.'syntax.php'; class syntax_plugin_publistx extends DokuWiki_Syntax_Plugin { function getType() { return 'substition'; } function getPType() { return 'block'; } function getSort() { return 105; } function connectTo($mode) { $this->Lexer->addSpecialPattern('\[publist\|.+?\]',$mode,'plugin_publistx'); } function handle($match, $state, $pos, &$handler){ $data = array(); // Partition properly $matches = array(); $pattern = '/\[publist(?:\|(page|file|url):(.+?))(?:\|(wiki|html):(page|file|url):(.+?))(?:\|(.+?(?:\|.+?)*))?\]/'; if ( 0 === preg_match($pattern, $match, $matches) ) { $data['error'] = 'Not valid publist syntax: '.$match; } else { $data['bibtex'] = array('type' => $matches[1], 'ref' => $matches[2]); $data['template'] = array('target' => $matches[3], 'type' => $matches[4], 'ref' => $matches[5]); $data['options'] = array(); // Set default language. Get current lang from translation plugin // if installed & enabled or fall back to default lang in conf. if (!plugin_isdisabled('translation')) { $trans =& plugin_load('helper', 'translation'); global $ID; $mylang = $trans->getLangPart($ID); } else { global $conf; $mylang = $conf['lang']; } $data['options']['lang'] = $mylang; if ( !empty($matches[6]) ) { $matches = explode('|', $matches[6]); foreach ( $matches as $opt ) { $optparts = array(); if ( preg_match('/(.+?):(.+)/', $opt, $optparts) ) { $optparts[2] = explode(';', $optparts[2]); $option = array(); foreach ( $optparts[2] as $single ) { $single = explode('=', $single); if (count($single) == 1 && count($optparts[2]) == 1) { $option = $single[0]; } else { $option[$single[0]] = str_replace(',', '|', $single[1]); } } $data['options'][$optparts[1]] = $option; } } } if ($data['options']['authors']) { $tmp = explode(':', $data['options']['authors'],2); $data['authors'] = array('type' => $tmp[0], 'ref' => $tmp[1]); } } return $data; } function render($mode, &$renderer, $data) { if($mode != 'xhtml') return false; if ( empty($data['error']) ) { // Retrieve BibTeX source $bibtex = $this->_load($data, 'bibtex'); if ( empty($bibtex) ) { $data['error'] .= $data['bibtex']['type'].' '.$data['bibtex']['ref'].' does not exist
'; } // Retrieve Template source $template = $this->_load($data, 'template'); if ( empty($template) ) { $data['error'] .= $data['template']['type'].' '.$data['template']['ref'].' does not exist
'; } $authors = null; if ($data['authors']) { // Retrieve Authors source $authors = $this->_load($data, 'authors'); if ( empty($authors) ) { $data['error'] .= $data['authors']['type'].' '.$data['authors']['ref'].' does not exist
'; } } if ( !empty($bibtex) && !empty($template) ) { require_once(dirname(__FILE__).'/bib2tpl/bibtex_converter.php'); if ( is_readable(dirname(__FILE__).'/sanitiser.php')) { include(dirname(__FILE__).'/sanitiser.php'); } if ( empty($sanitiser) ) { $sanitiser = create_function('$i', 'return $i;'); } $parser = new BibtexConverter($data['options'],$sanitiser,$authors); $code = $parser->convert($bibtex, $template); if ( $data['template']['target'] == 'wiki' ) { $code = p_render($mode, p_get_instructions($code), $info); } $renderer->doc .= $code; } } if ( !empty($data['error']) ) { $renderer->doc .= $data['error']; } $renderer->info['cache'] = false; return true; } function _load($data, $kind) { global $INFO; if ( $data[$kind]['type'] == 'url' ) { return file_get_contents($data[$kind]['ref']); } if ( $data[$kind]['type'] == 'file' ) { return file_get_contents(dirname(__FILE__).'/'.$kind.'/'.$data[$kind]['ref']); } else if ( $data[$kind]['type'] == 'page' ) { $exists = false; $id = $data[$kind]['ref']; resolve_pageid($INFO['namespace'], $id, $exists); if ( $exists ) { return rawWiki($id); } } return null; } } // vim:ts=4:sw=4:et:enc=utf-8: