182c064c1SAndreas Gohr<?php 282c064c1SAndreas Gohr/** 382c064c1SAndreas Gohr * DokuWiki Plugin struct (Action Component) 482c064c1SAndreas Gohr * 582c064c1SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 682c064c1SAndreas Gohr * @author Andreas Gohr, Michael Große <dokuwiki@cosmocode.de> 782c064c1SAndreas Gohr */ 882c064c1SAndreas Gohr 982c064c1SAndreas Gohr// must be run within Dokuwiki 1082c064c1SAndreas Gohrif(!defined('DOKU_INC')) die(); 1182c064c1SAndreas Gohr 1282c064c1SAndreas Gohr/** 1382c064c1SAndreas Gohr * Class action_plugin_struct_output 1482c064c1SAndreas Gohr * 1582c064c1SAndreas Gohr * This action component handles the automatic output of all schema data that has been assigned 1682c064c1SAndreas Gohr * to the current page by appending the appropriate instruction to the handler calls. 1782c064c1SAndreas Gohr * 1882c064c1SAndreas Gohr * The real output creation is done within the syntax component 1982c064c1SAndreas Gohr * @see syntax_plugin_struct_output 2082c064c1SAndreas Gohr */ 2182c064c1SAndreas Gohrclass action_plugin_struct_output extends DokuWiki_Action_Plugin { 2282c064c1SAndreas Gohr 23*3851b2fbSAnna Dabrowska const DW2PDF_PLACEHOLDER_PREFIX = 'PLUGIN_STRUCT'; 24*3851b2fbSAnna Dabrowska 2582c064c1SAndreas Gohr /** 2682c064c1SAndreas Gohr * Registers a callback function for a given event 2782c064c1SAndreas Gohr * 2882c064c1SAndreas Gohr * @param Doku_Event_Handler $controller DokuWiki's event controller object 2982c064c1SAndreas Gohr * @return void 3082c064c1SAndreas Gohr */ 3182c064c1SAndreas Gohr public function register(Doku_Event_Handler $controller) { 3282c064c1SAndreas Gohr $controller->register_hook('PARSER_HANDLER_DONE', 'AFTER', $this, 'handle_output'); 33*3851b2fbSAnna Dabrowska $controller->register_hook('PLUGIN_DW2PDF_REPLACE', 'BEFORE', $this, 'replace_dw2pdf'); 34*3851b2fbSAnna Dabrowska $controller->register_hook('PLUGIN_DW2PDF_REPLACE', 'AFTER', $this, 'cleanup_dw2pdf'); 3582c064c1SAndreas Gohr } 3682c064c1SAndreas Gohr 3782c064c1SAndreas Gohr /** 3882c064c1SAndreas Gohr * Appends the instruction to render our syntax output component to each page 3928b818ceSAndreas Gohr * after the first found headline or the very begining if no headline was found 4082c064c1SAndreas Gohr * 4182c064c1SAndreas Gohr * @param Doku_Event $event 4282c064c1SAndreas Gohr * @param $param 4382c064c1SAndreas Gohr */ 44881e940cSAndreas Gohr public function handle_output(Doku_Event $event, $param) { 450e4a3e7cSMichael Große global $ID; 4602481400SAndreas Gohr if(!page_exists($ID)) return; 4728b818ceSAndreas Gohr $ins = -1; 4828b818ceSAndreas Gohr $pos = 0; 4928b818ceSAndreas Gohr foreach($event->data->calls as $num => $call) { 5028b818ceSAndreas Gohr // try to find the first header 5128b818ceSAndreas Gohr if($call[0] == 'header') { 5228b818ceSAndreas Gohr $pos = $call[2]; 5328b818ceSAndreas Gohr $ins = $num; 5428b818ceSAndreas Gohr break; 5528b818ceSAndreas Gohr } 5682c064c1SAndreas Gohr 5728b818ceSAndreas Gohr // abort when after we looked at the first 150 bytes 589007da58SMichael Große if(isset($call[3]) && $call[3] > 150) { 5928b818ceSAndreas Gohr break; 6028b818ceSAndreas Gohr } 6128b818ceSAndreas Gohr } 6228b818ceSAndreas Gohr 6328b818ceSAndreas Gohr // insert our own call after the found position 6428b818ceSAndreas Gohr array_splice( 6528b818ceSAndreas Gohr $event->data->calls, 6628b818ceSAndreas Gohr $ins+1, 6728b818ceSAndreas Gohr 0, 6828b818ceSAndreas Gohr array( 6928b818ceSAndreas Gohr array( 7082c064c1SAndreas Gohr 'plugin', 7182c064c1SAndreas Gohr array( 725a1eab78SAndreas Gohr 'struct_output', array('pos' => $pos), DOKU_LEXER_SPECIAL, '' 7382c064c1SAndreas Gohr ), 7482c064c1SAndreas Gohr $pos 7528b818ceSAndreas Gohr ) 7628b818ceSAndreas Gohr ) 7782c064c1SAndreas Gohr ); 7882c064c1SAndreas Gohr } 7982c064c1SAndreas Gohr 80*3851b2fbSAnna Dabrowska /** 81*3851b2fbSAnna Dabrowska * If the page has a schema assigned, add its struct data 82*3851b2fbSAnna Dabrowska * to dw2pdf's template replacements 83*3851b2fbSAnna Dabrowska * 84*3851b2fbSAnna Dabrowska * @param Doku_Event $event 85*3851b2fbSAnna Dabrowska * @param $param 86*3851b2fbSAnna Dabrowska */ 87*3851b2fbSAnna Dabrowska public function replace_dw2pdf(Doku_Event $event, $param) 88*3851b2fbSAnna Dabrowska { 89*3851b2fbSAnna Dabrowska if (!$event->data['id'] || !page_exists($event->data['id'])) return; 90*3851b2fbSAnna Dabrowska 91*3851b2fbSAnna Dabrowska /** @var helper_plugin_struct $helper */ 92*3851b2fbSAnna Dabrowska $helper = plugin_load('helper', 'struct'); 93*3851b2fbSAnna Dabrowska $data = $helper->getData($event->data['id']); 94*3851b2fbSAnna Dabrowska 95*3851b2fbSAnna Dabrowska if(!$data) return; 96*3851b2fbSAnna Dabrowska 97*3851b2fbSAnna Dabrowska foreach ($data as $schema => $fields) { 98*3851b2fbSAnna Dabrowska foreach ($fields as $field => $value) { 99*3851b2fbSAnna Dabrowska $placeholder = sprintf('@%s_%s_%s@', self::DW2PDF_PLACEHOLDER_PREFIX, $schema, $field); 100*3851b2fbSAnna Dabrowska $event->data['replace'][$placeholder] = is_array($value) ? implode(', ', $value) : $value; 101*3851b2fbSAnna Dabrowska } 102*3851b2fbSAnna Dabrowska } 103*3851b2fbSAnna Dabrowska } 104*3851b2fbSAnna Dabrowska 105*3851b2fbSAnna Dabrowska /** 106*3851b2fbSAnna Dabrowska * Remove struct placeholders still present after replacement. 107*3851b2fbSAnna Dabrowska * Requested data was not found. 108*3851b2fbSAnna Dabrowska * 109*3851b2fbSAnna Dabrowska * @param Doku_Event $event 110*3851b2fbSAnna Dabrowska * @param $param 111*3851b2fbSAnna Dabrowska */ 112*3851b2fbSAnna Dabrowska public function cleanup_dw2pdf(Doku_Event $event, $param) 113*3851b2fbSAnna Dabrowska { 114*3851b2fbSAnna Dabrowska $pattern = '~@' . self::DW2PDF_PLACEHOLDER_PREFIX . '_[^@]+?@~'; 115*3851b2fbSAnna Dabrowska $event->data['content'] = preg_replace($pattern, '', $event->data['content']); 116*3851b2fbSAnna Dabrowska } 117*3851b2fbSAnna Dabrowska 11882c064c1SAndreas Gohr} 11982c064c1SAndreas Gohr 12082c064c1SAndreas Gohr// vim:ts=4:sw=4:et: 121