1*007225e5Sgerardnico<?php 2*007225e5Sgerardnico 3*007225e5Sgerardnico// implementation of 4*007225e5Sgerardnico// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/cite 5*007225e5Sgerardnico 6*007225e5Sgerardnico// must be run within Dokuwiki 7*007225e5Sgerardnicouse ComboStrap\HeaderUtility; 8*007225e5Sgerardnicouse ComboStrap\TitleUtility; 9*007225e5Sgerardnicouse ComboStrap\PluginUtility; 10*007225e5Sgerardnicouse ComboStrap\StringUtility; 11*007225e5Sgerardnicouse ComboStrap\Tag; 12*007225e5Sgerardnico 13*007225e5Sgerardnicorequire_once(__DIR__ . '/../class/HeaderUtility.php'); 14*007225e5Sgerardnico 15*007225e5Sgerardnicoif (!defined('DOKU_INC')) die(); 16*007225e5Sgerardnico 17*007225e5Sgerardnico 18*007225e5Sgerardnicoclass syntax_plugin_combo_header extends DokuWiki_Syntax_Plugin 19*007225e5Sgerardnico{ 20*007225e5Sgerardnico 21*007225e5Sgerardnico 22*007225e5Sgerardnico function getType() 23*007225e5Sgerardnico { 24*007225e5Sgerardnico return 'formatting'; 25*007225e5Sgerardnico } 26*007225e5Sgerardnico 27*007225e5Sgerardnico /** 28*007225e5Sgerardnico * How Dokuwiki will add P element 29*007225e5Sgerardnico * 30*007225e5Sgerardnico * * 'normal' - The plugin can be used inside paragraphs (inline) 31*007225e5Sgerardnico * * 'block' - Open paragraphs need to be closed before plugin output - block should not be inside paragraphs 32*007225e5Sgerardnico * * 'stack' - Special case. Plugin wraps other paragraphs. - Stacks can contain paragraphs 33*007225e5Sgerardnico * 34*007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::getPType() 35*007225e5Sgerardnico */ 36*007225e5Sgerardnico function getPType() 37*007225e5Sgerardnico { 38*007225e5Sgerardnico return 'normal'; 39*007225e5Sgerardnico } 40*007225e5Sgerardnico 41*007225e5Sgerardnico function getAllowedTypes() 42*007225e5Sgerardnico { 43*007225e5Sgerardnico return array('substition', 'formatting', 'disabled'); 44*007225e5Sgerardnico } 45*007225e5Sgerardnico 46*007225e5Sgerardnico function getSort() 47*007225e5Sgerardnico { 48*007225e5Sgerardnico return 201; 49*007225e5Sgerardnico } 50*007225e5Sgerardnico 51*007225e5Sgerardnico 52*007225e5Sgerardnico function connectTo($mode) 53*007225e5Sgerardnico { 54*007225e5Sgerardnico 55*007225e5Sgerardnico $this->Lexer->addEntryPattern(PluginUtility::getContainerTagPattern(HeaderUtility::HEADER), $mode, PluginUtility::getModeForComponent($this->getPluginComponent())); 56*007225e5Sgerardnico } 57*007225e5Sgerardnico 58*007225e5Sgerardnico public function postConnect() 59*007225e5Sgerardnico { 60*007225e5Sgerardnico $this->Lexer->addExitPattern('</' . HeaderUtility::HEADER . '>', PluginUtility::getModeForComponent($this->getPluginComponent())); 61*007225e5Sgerardnico } 62*007225e5Sgerardnico 63*007225e5Sgerardnico function handle($match, $state, $pos, Doku_Handler $handler) 64*007225e5Sgerardnico { 65*007225e5Sgerardnico 66*007225e5Sgerardnico switch ($state) { 67*007225e5Sgerardnico 68*007225e5Sgerardnico case DOKU_LEXER_ENTER: 69*007225e5Sgerardnico $tagAttributes = PluginUtility::getTagAttributes($match); 70*007225e5Sgerardnico $htmlAttributes = $tagAttributes; 71*007225e5Sgerardnico $tag = new Tag(HeaderUtility::HEADER, $tagAttributes, $state, $handler->calls); 72*007225e5Sgerardnico $parent = $tag->getParent(); 73*007225e5Sgerardnico $parentName = ""; 74*007225e5Sgerardnico $html = ""; 75*007225e5Sgerardnico if ($parent != null) { 76*007225e5Sgerardnico $parentName = $parent->getName(); 77*007225e5Sgerardnico switch ($parentName) { 78*007225e5Sgerardnico case syntax_plugin_combo_blockquote::TAG: 79*007225e5Sgerardnico case syntax_plugin_combo_card::TAG: 80*007225e5Sgerardnico PluginUtility::addClass2Attributes("card-header", $htmlAttributes); 81*007225e5Sgerardnico $inlineAttributes = PluginUtility::array2HTMLAttributes($htmlAttributes); 82*007225e5Sgerardnico $html = "<div {$inlineAttributes}>" . DOKU_LF; 83*007225e5Sgerardnico break; 84*007225e5Sgerardnico } 85*007225e5Sgerardnico } 86*007225e5Sgerardnico return array( 87*007225e5Sgerardnico PluginUtility::STATE => $state, 88*007225e5Sgerardnico PluginUtility::ATTRIBUTES => $tagAttributes, 89*007225e5Sgerardnico PluginUtility::PAYLOAD => $html, 90*007225e5Sgerardnico PluginUtility::PARENT_TAG => $parentName 91*007225e5Sgerardnico ); 92*007225e5Sgerardnico 93*007225e5Sgerardnico case DOKU_LEXER_UNMATCHED : 94*007225e5Sgerardnico return array( 95*007225e5Sgerardnico PluginUtility::STATE => $state, 96*007225e5Sgerardnico PluginUtility::PAYLOAD => $match); 97*007225e5Sgerardnico 98*007225e5Sgerardnico case DOKU_LEXER_EXIT : 99*007225e5Sgerardnico $html = "</div>"; 100*007225e5Sgerardnico $tag = new Tag(HeaderUtility::HEADER, array(), $state, $handler->calls); 101*007225e5Sgerardnico $parent = $tag->getParent(); 102*007225e5Sgerardnico if ($parent != null) { 103*007225e5Sgerardnico switch ($parent->getName()) { 104*007225e5Sgerardnico case syntax_plugin_combo_blockquote::TAG: 105*007225e5Sgerardnico $html .= syntax_plugin_combo_blockquote::CARD_BODY_BLOCKQUOTE_OPEN_TAG; 106*007225e5Sgerardnico break; 107*007225e5Sgerardnico case syntax_plugin_combo_card::TAG: 108*007225e5Sgerardnico $html .= syntax_plugin_combo_card::CARD_BODY; 109*007225e5Sgerardnico break; 110*007225e5Sgerardnico } 111*007225e5Sgerardnico } 112*007225e5Sgerardnico return array( 113*007225e5Sgerardnico PluginUtility::STATE => $state, 114*007225e5Sgerardnico PluginUtility::PAYLOAD => $html 115*007225e5Sgerardnico ); 116*007225e5Sgerardnico 117*007225e5Sgerardnico 118*007225e5Sgerardnico } 119*007225e5Sgerardnico return array(); 120*007225e5Sgerardnico 121*007225e5Sgerardnico } 122*007225e5Sgerardnico 123*007225e5Sgerardnico /** 124*007225e5Sgerardnico * Render the output 125*007225e5Sgerardnico * @param string $format 126*007225e5Sgerardnico * @param Doku_Renderer $renderer 127*007225e5Sgerardnico * @param array $data - what the function handle() return'ed 128*007225e5Sgerardnico * @return boolean - rendered correctly? (however, returned value is not used at the moment) 129*007225e5Sgerardnico * @see DokuWiki_Syntax_Plugin::render() 130*007225e5Sgerardnico * 131*007225e5Sgerardnico * 132*007225e5Sgerardnico */ 133*007225e5Sgerardnico function render($format, Doku_Renderer $renderer, $data) 134*007225e5Sgerardnico { 135*007225e5Sgerardnico 136*007225e5Sgerardnico if ($format == 'xhtml') { 137*007225e5Sgerardnico 138*007225e5Sgerardnico /** @var Doku_Renderer_xhtml $renderer */ 139*007225e5Sgerardnico $state = $data[PluginUtility::STATE]; 140*007225e5Sgerardnico switch ($state) { 141*007225e5Sgerardnico 142*007225e5Sgerardnico case DOKU_LEXER_ENTER: 143*007225e5Sgerardnico $parent = $data[PluginUtility::PARENT_TAG]; 144*007225e5Sgerardnico switch ($parent) { 145*007225e5Sgerardnico case syntax_plugin_combo_blockquote::TAG: 146*007225e5Sgerardnico StringUtility::rtrim($renderer->doc, syntax_plugin_combo_blockquote::CARD_BODY_BLOCKQUOTE_OPEN_TAG); 147*007225e5Sgerardnico break; 148*007225e5Sgerardnico case syntax_plugin_combo_card::TAG: 149*007225e5Sgerardnico StringUtility::rtrim($renderer->doc, syntax_plugin_combo_card::CARD_BODY); 150*007225e5Sgerardnico break; 151*007225e5Sgerardnico } 152*007225e5Sgerardnico $renderer->doc .= $data[PluginUtility::PAYLOAD]; 153*007225e5Sgerardnico break; 154*007225e5Sgerardnico 155*007225e5Sgerardnico case DOKU_LEXER_UNMATCHED : 156*007225e5Sgerardnico $renderer->doc .= PluginUtility::escape($data[PluginUtility::PAYLOAD]); 157*007225e5Sgerardnico break; 158*007225e5Sgerardnico 159*007225e5Sgerardnico case DOKU_LEXER_EXIT: 160*007225e5Sgerardnico $renderer->doc .= $data[PluginUtility::PAYLOAD]; 161*007225e5Sgerardnico break; 162*007225e5Sgerardnico 163*007225e5Sgerardnico 164*007225e5Sgerardnico } 165*007225e5Sgerardnico } 166*007225e5Sgerardnico // unsupported $mode 167*007225e5Sgerardnico return false; 168*007225e5Sgerardnico } 169*007225e5Sgerardnico 170*007225e5Sgerardnico 171*007225e5Sgerardnico} 172*007225e5Sgerardnico 173