xref: /plugin/embeddedphp/syntax/phpinline.php (revision 69545d0161305db22a8268d9c5f15bb89be93fa2)
12e6b7ea4Sfiwswe<?php
22e6b7ea4Sfiwswe/**
32e6b7ea4Sfiwswe * DokuWiki Plugin embeddedphp (Syntax Component)
42e6b7ea4Sfiwswe *
52e6b7ea4Sfiwswe * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
62e6b7ea4Sfiwswe * @author	fiwswe <dwplugin@fwml.de>
72e6b7ea4Sfiwswe */
8*69545d01Sfiwswe
92e6b7ea4Sfiwsweclass syntax_plugin_embeddedphp_phpinline extends \dokuwiki\Extension\SyntaxPlugin
102e6b7ea4Sfiwswe{
112e6b7ea4Sfiwswe	/**
122e6b7ea4Sfiwswe	 * Return the tag this plugin instance reacts to
132e6b7ea4Sfiwswe	 *
142e6b7ea4Sfiwswe	 * @return string
152e6b7ea4Sfiwswe	 */
16*69545d01Sfiwswe	protected function GetTag(): string
172e6b7ea4Sfiwswe	{
182e6b7ea4Sfiwswe		return 'php';
192e6b7ea4Sfiwswe	}
202e6b7ea4Sfiwswe
212e6b7ea4Sfiwswe	/** @inheritDoc */
222e6b7ea4Sfiwswe	public function getType()
232e6b7ea4Sfiwswe	{
24*69545d01Sfiwswe		return 'protected';
252e6b7ea4Sfiwswe	}
262e6b7ea4Sfiwswe
272e6b7ea4Sfiwswe	/** @inheritDoc */
282e6b7ea4Sfiwswe	public function getSort()
292e6b7ea4Sfiwswe	{
302e6b7ea4Sfiwswe		// The default <php>/<PHP> handler up to "Igor" has priority 180. By setting a
312e6b7ea4Sfiwswe		// lower priority we override the built-in functionality.
322e6b7ea4Sfiwswe		return 179;
332e6b7ea4Sfiwswe	}
342e6b7ea4Sfiwswe
352e6b7ea4Sfiwswe	/*
362e6b7ea4Sfiwswe	 * Return the plugin Lexer mode
372e6b7ea4Sfiwswe	 *
382e6b7ea4Sfiwswe	 * @return string
392e6b7ea4Sfiwswe	 */
40*69545d01Sfiwswe	protected function getPluginModeName(): string
412e6b7ea4Sfiwswe	{
422e6b7ea4Sfiwswe		return 'plugin_'.$this->getPluginName().'_'.$this->getPluginComponent();
432e6b7ea4Sfiwswe	}
442e6b7ea4Sfiwswe
452e6b7ea4Sfiwswe	/** @inheritDoc */
462e6b7ea4Sfiwswe	public function connectTo($mode)
472e6b7ea4Sfiwswe	{
48*69545d01Sfiwswe		$p = '<'.$this->GetTag().'\b>(?=.*?</'.$this->GetTag().'>)';
492e6b7ea4Sfiwswe		$m = $this->getPluginModeName();
502e6b7ea4Sfiwswe		$this->Lexer->addEntryPattern($p, $mode, $m);
512e6b7ea4Sfiwswe	}
522e6b7ea4Sfiwswe
532e6b7ea4Sfiwswe	/** @inheritDoc */
542e6b7ea4Sfiwswe	public function postConnect()
552e6b7ea4Sfiwswe	{
562e6b7ea4Sfiwswe		$p = '</'.$this->GetTag().'>';
572e6b7ea4Sfiwswe		$m = $this->getPluginModeName();
582e6b7ea4Sfiwswe		$this->Lexer->addExitPattern($p, $m);
592e6b7ea4Sfiwswe	}
602e6b7ea4Sfiwswe
612e6b7ea4Sfiwswe	/** @inheritDoc */
622e6b7ea4Sfiwswe	public function handle($match, $state, $pos, Doku_Handler $handler)
632e6b7ea4Sfiwswe	{
64*69545d01Sfiwswe		global $INPUT;
65*69545d01Sfiwswe
662e6b7ea4Sfiwswe		// If we are parsing a submitted comment. Executing embedded PHP in comments is
672e6b7ea4Sfiwswe		// not a good idea!
68*69545d01Sfiwswe		if ($INPUT->has('comment')) {
692e6b7ea4Sfiwswe			return false;
702e6b7ea4Sfiwswe		}
712e6b7ea4Sfiwswe
722e6b7ea4Sfiwswe		switch($state) {
732e6b7ea4Sfiwswe			case DOKU_LEXER_UNMATCHED :
742e6b7ea4Sfiwswe				// Return the data needed in $this->render() as an array:
752e6b7ea4Sfiwswe				return [$state, $match];
762e6b7ea4Sfiwswe		}
772e6b7ea4Sfiwswe
782e6b7ea4Sfiwswe		return false;
792e6b7ea4Sfiwswe	}
802e6b7ea4Sfiwswe
812e6b7ea4Sfiwswe	/** @inheritDoc */
822e6b7ea4Sfiwswe	public function render($mode, Doku_Renderer $renderer, $data)
832e6b7ea4Sfiwswe	{
842e6b7ea4Sfiwswe		if ($mode === 'xhtml') {
852e6b7ea4Sfiwswe			if (is_array($data) && (count($data) > 1)) {
862e6b7ea4Sfiwswe				$this->php($data[1], $renderer);
872e6b7ea4Sfiwswe
882e6b7ea4Sfiwswe				return true;
892e6b7ea4Sfiwswe			}
902e6b7ea4Sfiwswe		}
912e6b7ea4Sfiwswe
922e6b7ea4Sfiwswe		return false;
932e6b7ea4Sfiwswe	}
942e6b7ea4Sfiwswe
952e6b7ea4Sfiwswe	/**
962e6b7ea4Sfiwswe	 * Determine whether embedding PHP code is allowed
972e6b7ea4Sfiwswe	 *
982e6b7ea4Sfiwswe	 * @return	bool	true if executing embedded PHP code is allowed
992e6b7ea4Sfiwswe	 */
100*69545d01Sfiwswe	protected function allowEmbedding(): bool
1012e6b7ea4Sfiwswe	{
1022e6b7ea4Sfiwswe		$allow = ($this->getConf('embedphpok') == 1) &&
1032e6b7ea4Sfiwswe				 ($this->getConf('privatewiki') == 1);
1042e6b7ea4Sfiwswe
1052e6b7ea4Sfiwswe		return $allow;
1062e6b7ea4Sfiwswe	}
1072e6b7ea4Sfiwswe
1082e6b7ea4Sfiwswe	/**
1092e6b7ea4Sfiwswe	 * Execute PHP code if allowed
1102e6b7ea4Sfiwswe	 *
1112e6b7ea4Sfiwswe	 * @param  string $text				 PHP code that is either executed or printed
1122e6b7ea4Sfiwswe	 * @param  Doku_Renderer $renderer	 Renderer used for output
1132e6b7ea4Sfiwswe	 */
114*69545d01Sfiwswe	protected function php($text, Doku_Renderer $renderer): void
115*69545d01Sfiwswe	{
1162e6b7ea4Sfiwswe		if ($this->allowEmbedding()) {
1172e6b7ea4Sfiwswe			ob_start();
1182e6b7ea4Sfiwswe			eval($text);
1192e6b7ea4Sfiwswe			$o = ob_get_contents();
1202e6b7ea4Sfiwswe			if (!empty($o)) {
1212e6b7ea4Sfiwswe				if ($this->isBlockElement()) {
1222e6b7ea4Sfiwswe					$renderer->doc .= '<div class="embeddedphp">'.$o.'</div>';
1232e6b7ea4Sfiwswe				} else {
1242e6b7ea4Sfiwswe					$renderer->doc .= '<span class="embeddedphp">'.$o.'</span>';
1252e6b7ea4Sfiwswe				}
1262e6b7ea4Sfiwswe			}
1272e6b7ea4Sfiwswe			ob_end_clean();
1282e6b7ea4Sfiwswe		} else {
129*69545d01Sfiwswe			$wrapper = $this->isBlockElement() ? 'pre' : 'code';
1302e6b7ea4Sfiwswe			$renderer->doc .= /*'###.get_class($this)'.*/p_xhtml_cached_geshi($text, 'php', $wrapper);
1312e6b7ea4Sfiwswe		}
1322e6b7ea4Sfiwswe	}
1332e6b7ea4Sfiwswe
1342e6b7ea4Sfiwswe	/**
1352e6b7ea4Sfiwswe	 * Generic test to differentiate between inline and block modes
1362e6b7ea4Sfiwswe	 *
1372e6b7ea4Sfiwswe	 * @return bool true if this generates a block element, false otherwise.
1382e6b7ea4Sfiwswe	 */
139*69545d01Sfiwswe	protected function isBlockElement(): bool
1402e6b7ea4Sfiwswe	{
1412e6b7ea4Sfiwswe		return false;
1422e6b7ea4Sfiwswe	}
1432e6b7ea4Sfiwswe}
1442e6b7ea4Sfiwswe
145