1*e66c86a2SRobert Weinmeister<?php 2*e66c86a2SRobert Weinmeister 3*e66c86a2SRobert Weinmeister/** 4*e66c86a2SRobert Weinmeister * DokuWiki Plugin VegaLite (Syntax Component) 5*e66c86a2SRobert Weinmeister * 6*e66c86a2SRobert Weinmeister * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 7*e66c86a2SRobert Weinmeister * @author Robert Weinmeister <develop@weinmeister.org> 8*e66c86a2SRobert Weinmeister */ 9*e66c86a2SRobert Weinmeister 10*e66c86a2SRobert Weinmeisterdeclare(strict_types=1); 11*e66c86a2SRobert Weinmeister 12*e66c86a2SRobert Weinmeisterif (!defined('DOKU_INC')) 13*e66c86a2SRobert Weinmeister{ 14*e66c86a2SRobert Weinmeister die(); 15*e66c86a2SRobert Weinmeister} 16*e66c86a2SRobert Weinmeister 17*e66c86a2SRobert Weinmeisteruse dokuwiki\Parsing\Parser; 18*e66c86a2SRobert Weinmeister 19*e66c86a2SRobert Weinmeisterclass syntax_plugin_vegalite extends \dokuwiki\Extension\SyntaxPlugin 20*e66c86a2SRobert Weinmeister{ 21*e66c86a2SRobert Weinmeister /** @inheritDoc */ 22*e66c86a2SRobert Weinmeister function getType(): string { 23*e66c86a2SRobert Weinmeister return 'container'; 24*e66c86a2SRobert Weinmeister } 25*e66c86a2SRobert Weinmeister 26*e66c86a2SRobert Weinmeister /** @inheritDoc */ 27*e66c86a2SRobert Weinmeister function getSort(): int { 28*e66c86a2SRobert Weinmeister return 150; 29*e66c86a2SRobert Weinmeister } 30*e66c86a2SRobert Weinmeister 31*e66c86a2SRobert Weinmeister /** 32*e66c86a2SRobert Weinmeister * Entry pattern for Vega-Lite 33*e66c86a2SRobert Weinmeister * 34*e66c86a2SRobert Weinmeister * @param string $mode Parser mode 35*e66c86a2SRobert Weinmeister * @return void 36*e66c86a2SRobert Weinmeister */ 37*e66c86a2SRobert Weinmeister public function connectTo($mode): void { 38*e66c86a2SRobert Weinmeister $this->Lexer->addEntryPattern( 39*e66c86a2SRobert Weinmeister '<vegalite.*?>(?=.*?</vegalite>)', 40*e66c86a2SRobert Weinmeister $mode, 41*e66c86a2SRobert Weinmeister 'plugin_vegalite'); 42*e66c86a2SRobert Weinmeister } 43*e66c86a2SRobert Weinmeister 44*e66c86a2SRobert Weinmeister /** 45*e66c86a2SRobert Weinmeister * Exit pattern for Vega-Lite 46*e66c86a2SRobert Weinmeister * 47*e66c86a2SRobert Weinmeister * @return void 48*e66c86a2SRobert Weinmeister */ 49*e66c86a2SRobert Weinmeister function postConnect(): void { 50*e66c86a2SRobert Weinmeister $this->Lexer->addExitPattern( 51*e66c86a2SRobert Weinmeister '</vegalite>', 52*e66c86a2SRobert Weinmeister 'plugin_vegalite' 53*e66c86a2SRobert Weinmeister ); 54*e66c86a2SRobert Weinmeister } 55*e66c86a2SRobert Weinmeister 56*e66c86a2SRobert Weinmeister /** 57*e66c86a2SRobert Weinmeister * Handles the matched text based on the lexer state 58*e66c86a2SRobert Weinmeister * 59*e66c86a2SRobert Weinmeister * @param string $match Matched text from the lexer 60*e66c86a2SRobert Weinmeister * @param int $state Current lexer state (DOKU_LEXER_ENTER, DOKU_LEXER_UNMATCHED, DOKU_LEXER_EXIT) 61*e66c86a2SRobert Weinmeister * @param Doku_Handler $handler DokuWiki handler instance 62*e66c86a2SRobert Weinmeister * @return array Array with the state and processed match 63*e66c86a2SRobert Weinmeister */ 64*e66c86a2SRobert Weinmeister function handle($match, $state, $pos, Doku_Handler $handler): array { 65*e66c86a2SRobert Weinmeister return [$state, $match]; 66*e66c86a2SRobert Weinmeister } 67*e66c86a2SRobert Weinmeister 68*e66c86a2SRobert Weinmeister /** 69*e66c86a2SRobert Weinmeister * Render xhtml output or metadata 70*e66c86a2SRobert Weinmeister */ 71*e66c86a2SRobert Weinmeister function render($mode, Doku_Renderer $renderer, $indata) 72*e66c86a2SRobert Weinmeister { 73*e66c86a2SRobert Weinmeister if($mode == 'xhtml'){ 74*e66c86a2SRobert Weinmeister list($state, $match) = $indata; 75*e66c86a2SRobert Weinmeister switch ($state) { 76*e66c86a2SRobert Weinmeister case DOKU_LEXER_ENTER: 77*e66c86a2SRobert Weinmeister $values = explode(" ", $match); 78*e66c86a2SRobert Weinmeister $divwidth = count($values) < 2 ? 'auto' : $values[1]; 79*e66c86a2SRobert Weinmeister $divheight = count($values) < 3 ? 'auto' : substr($values[2], 0, -1); 80*e66c86a2SRobert Weinmeister 81*e66c86a2SRobert Weinmeister $this->vegaliteContent .= '<div id="vegalite" class="vegalite" style="position: relative; width:'.$divwidth.'; height:'.$divheight.'"></div>' . "\r\n"; 82*e66c86a2SRobert Weinmeister break; 83*e66c86a2SRobert Weinmeister case DOKU_LEXER_UNMATCHED: 84*e66c86a2SRobert Weinmeister $this->vegaliteContent .= 85*e66c86a2SRobert Weinmeister'<script type="text/javascript"> 86*e66c86a2SRobert Weinmeister var yourVlSpec = ' . $match . "; 87*e66c86a2SRobert Weinmeister vegaEmbed('#vegalite', yourVlSpec); 88*e66c86a2SRobert Weinmeister</script>"; 89*e66c86a2SRobert Weinmeister break; 90*e66c86a2SRobert Weinmeister case DOKU_LEXER_EXIT: 91*e66c86a2SRobert Weinmeister $this->vegaliteContent .= ""; 92*e66c86a2SRobert Weinmeister 93*e66c86a2SRobert Weinmeister $renderer->doc .= $this->vegaliteContent; 94*e66c86a2SRobert Weinmeister $this->vegaliteContent = ''; 95*e66c86a2SRobert Weinmeister break; 96*e66c86a2SRobert Weinmeister } 97*e66c86a2SRobert Weinmeister return true; 98*e66c86a2SRobert Weinmeister } 99*e66c86a2SRobert Weinmeister return false; 100*e66c86a2SRobert Weinmeister } 101*e66c86a2SRobert Weinmeister}