xref: /plugin/mizarverifiabledocs/syntax.php (revision 6b7e227ce526b3ffe234cde59c47249d4e050425)
1*6b7e227cSYamadaMiz<?php
2*6b7e227cSYamadaMiz/**
3*6b7e227cSYamadaMiz * DokuWiki Plugin Mizar proof checker (Syntax Component)
4*6b7e227cSYamadaMiz *
5*6b7e227cSYamadaMiz * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6*6b7e227cSYamadaMiz * @author  Yamada, M. <yamadam@mizar.work>
7*6b7e227cSYamadaMiz */
8*6b7e227cSYamadaMizclass syntax_plugin_mizarproofchecker extends \dokuwiki\Extension\SyntaxPlugin {
9*6b7e227cSYamadaMiz    /** @inheritDoc */
10*6b7e227cSYamadaMiz    public function getType() {
11*6b7e227cSYamadaMiz        return 'substition';
12*6b7e227cSYamadaMiz    }
13*6b7e227cSYamadaMiz
14*6b7e227cSYamadaMiz    /** @inheritDoc */
15*6b7e227cSYamadaMiz    public function getPType() {
16*6b7e227cSYamadaMiz        return 'block';
17*6b7e227cSYamadaMiz    }
18*6b7e227cSYamadaMiz
19*6b7e227cSYamadaMiz    /** @inheritDoc */
20*6b7e227cSYamadaMiz    public function getSort() {
21*6b7e227cSYamadaMiz        return 195;
22*6b7e227cSYamadaMiz    }
23*6b7e227cSYamadaMiz
24*6b7e227cSYamadaMiz    /** @inheritDoc */
25*6b7e227cSYamadaMiz    public function connectTo($mode) {
26*6b7e227cSYamadaMiz        $this->Lexer->addSpecialPattern('<mizar\s+[^>]+>.*?</mizar>', $mode, 'plugin_mizarproofchecker');
27*6b7e227cSYamadaMiz    }
28*6b7e227cSYamadaMiz
29*6b7e227cSYamadaMiz    public function handle($match, $state, $pos, Doku_Handler $handler) {
30*6b7e227cSYamadaMiz        preg_match('/<mizar\s+([^>]+)>(.*?)<\/mizar>/s', $match, $matches);
31*6b7e227cSYamadaMiz        $filename = htmlspecialchars(trim($matches[1]));
32*6b7e227cSYamadaMiz        $content  = htmlspecialchars(trim($matches[2]));
33*6b7e227cSYamadaMiz        return array($state, $filename, $content);
34*6b7e227cSYamadaMiz    }
35*6b7e227cSYamadaMiz
36*6b7e227cSYamadaMiz    public function render($mode, Doku_Renderer $renderer, $data) {
37*6b7e227cSYamadaMiz        static $mizarCounter = 0; // 一意のカウンターを追加
38*6b7e227cSYamadaMiz        list($state,$filename, $content) = $data;
39*6b7e227cSYamadaMiz        $mizarId = 'mizarBlock' . $mizarCounter++; // 一意のIDを生成
40*6b7e227cSYamadaMiz
41*6b7e227cSYamadaMiz        if ($mode == 'xhtml') {
42*6b7e227cSYamadaMiz            // ボタンやエディタのHTMLを生成
43*6b7e227cSYamadaMiz            $renderer->doc .= '<div class="mizarWrapper" id="' . $mizarId . '">'; // ラッパーdivを追加
44*6b7e227cSYamadaMiz            $renderer->doc .= '<div id="copyMessage" style="display:none;">コンテンツがクリップボードにコピーされました。</div>';
45*6b7e227cSYamadaMiz            $renderer->doc .= '<dl class="file">';
46*6b7e227cSYamadaMiz            $renderer->doc .= '<button id="myEditorButton' . $mizarId . '">Editor</button>';
47*6b7e227cSYamadaMiz            $renderer->doc .= '<button id="verifyButton' . $mizarId . '" style="display:none;">mizf</button>';
48*6b7e227cSYamadaMiz            $renderer->doc .= '<button id="clearButton' . $mizarId . '" style="display:none;">clear</button>';
49*6b7e227cSYamadaMiz            $renderer->doc .= '<dt><a href="#" onclick="return copyToClipboard(\'' . $mizarId . '\');" title="クリックしてコンテンツをコピー" class="mediafile mf_miz clipboard-icon">' . $filename . '</a></dt>';
50*6b7e227cSYamadaMiz            // エディタ用のコンテナを準備
51*6b7e227cSYamadaMiz            $renderer->doc .= '<dd><div id="editorContainer' . $mizarId . '" class="editor-container" data-content="' . htmlspecialchars($content) . '"></div></dd>';
52*6b7e227cSYamadaMiz            $renderer->doc .= '</dl>';
53*6b7e227cSYamadaMiz            $renderer->doc .= '<div id="output' . $mizarId . '" style="padding: 10px; border: 1px solid #ccc; margin-top: 10px; white-space: pre-wrap; display: none;"></div>';
54*6b7e227cSYamadaMiz            $renderer->doc .= '<script type="text/javascript" src="' . DOKU_BASE . 'lib/plugins/mizarproofchecker/dist/script.js"></script>';
55*6b7e227cSYamadaMiz            $renderer->doc .= '</div>'; // ラッパーdivを閉じる
56*6b7e227cSYamadaMiz        } else {
57*6b7e227cSYamadaMiz            $renderer->doc .= "<mizar $filename>$content</mizar>";
58*6b7e227cSYamadaMiz        }
59*6b7e227cSYamadaMiz        return true;
60*6b7e227cSYamadaMiz    }
61*6b7e227cSYamadaMiz}