xref: /plugin/mizarverifiabledocs/syntax.php (revision 1a91113b0094ce6ce10091527b530187a60781d5)
16b7e227cSYamadaMiz<?php
2*1a91113bSYamada, M.// SPDX-License-Identifier: GPL-2.0-or-later
3*1a91113bSYamada, M.// SPDX-FileCopyrightText: 2024-2025 Yamada, M.
4*1a91113bSYamada, M.// DokuWiki Plugin Mizar Verifiable Docs (Syntax Component)
5*1a91113bSYamada, M.
6b68e3724SYamadaMizclass syntax_plugin_mizarverifiabledocs extends \dokuwiki\Extension\SyntaxPlugin {
76b7e227cSYamadaMiz    /** @inheritDoc */
86b7e227cSYamadaMiz    public function getType() {
96b7e227cSYamadaMiz        return 'substition';
106b7e227cSYamadaMiz    }
116b7e227cSYamadaMiz
126b7e227cSYamadaMiz    /** @inheritDoc */
136b7e227cSYamadaMiz    public function getPType() {
146b7e227cSYamadaMiz        return 'block';
156b7e227cSYamadaMiz    }
166b7e227cSYamadaMiz
176b7e227cSYamadaMiz    /** @inheritDoc */
186b7e227cSYamadaMiz    public function getSort() {
196b7e227cSYamadaMiz        return 195;
206b7e227cSYamadaMiz    }
216b7e227cSYamadaMiz
226b7e227cSYamadaMiz    /** @inheritDoc */
236b7e227cSYamadaMiz    public function connectTo($mode) {
24b68e3724SYamadaMiz        $this->Lexer->addSpecialPattern('<mizar\s+[^>]+>.*?</mizar>', $mode, 'plugin_mizarverifiabledocs');
256b7e227cSYamadaMiz    }
266b7e227cSYamadaMiz
276b7e227cSYamadaMiz    public function handle($match, $state, $pos, Doku_Handler $handler) {
286b7e227cSYamadaMiz        preg_match('/<mizar\s+([^>]+)>(.*?)<\/mizar>/s', $match, $matches);
296b7e227cSYamadaMiz        $filename = htmlspecialchars(trim($matches[1]));
306b7e227cSYamadaMiz        $content  = htmlspecialchars(trim($matches[2]));
316b7e227cSYamadaMiz        return array($state, $filename, $content);
326b7e227cSYamadaMiz    }
336b7e227cSYamadaMiz
346b7e227cSYamadaMiz    public function render($mode, Doku_Renderer $renderer, $data) {
3508219f34SYamadaMiz        // xhtml以外のモードはスキップ
3608219f34SYamadaMiz        if ($mode != 'xhtml') {
3708219f34SYamadaMiz            return false;
3808219f34SYamadaMiz        }
396b7e227cSYamadaMiz        static $mizarCounter = 0; // 一意のカウンターを追加
406b7e227cSYamadaMiz        list($state,$filename, $content) = $data;
4108219f34SYamadaMiz        $mizarId = 'mizarBlock' . $mizarCounter;
4208219f34SYamadaMiz        $blockNumber = $mizarCounter + 1;        // 表示用の番号 (1, 2, 3,...)
4308219f34SYamadaMiz        $mizarCounter++; // カウンターをインクリメント
446b7e227cSYamadaMiz
456b7e227cSYamadaMiz        if ($mode == 'xhtml') {
466b7e227cSYamadaMiz            // ボタンやエディタのHTMLを生成
479fc5dc4bSYamadaMiz            $renderer->doc .= '<div class="mizarWrapper" id="' . $mizarId . '">';
486b7e227cSYamadaMiz            $renderer->doc .= '<dl class="file">';
499fc5dc4bSYamadaMiz            $renderer->doc .= '<button class="copy-button" data-mizarid="' . $mizarId . '">Copy</button>';
509fc5dc4bSYamadaMiz            $renderer->doc .= '<button id="resetButton' . $mizarId . '" class="reset-button">Reset</button>';
519fc5dc4bSYamadaMiz            $renderer->doc .= '<button id="editButton' . $mizarId . '" class="edit-button">Edit</button>';
52f9af2148SYamadaMiz            $renderer->doc .= '<button id="compileButton' . $mizarId . '" class="compile-button">Compile</button>';
534f65af2cSYamadaMiz            $renderer->doc .= '<button id="hideButton' . $mizarId . '" class="hide-button">Hide</button>';
543f7dd076SYamadaMiz            $renderer->doc .= '<button id="graphButton' . $mizarId . '" class="graph-button">Graph</button>';   // ★追加
554f65af2cSYamadaMiz            $renderer->doc .= '<button id="showButton' . $mizarId . '" class="show-button">Show</button>';
569fc5dc4bSYamadaMiz
5708219f34SYamadaMiz            $renderer->doc .= '<dt>'
5808219f34SYamadaMiz                . '<a href="#" onclick="createMizarFile(\'' . $filename . '\'); return false;" '
5908219f34SYamadaMiz                . ' title="クリックしてコンテンツをダウンロード" class="file-download">'
6008219f34SYamadaMiz                . $filename. '(' . $blockNumber . ') '
6108219f34SYamadaMiz                . '</a>'
6208219f34SYamadaMiz                . '</dt>';
6308219f34SYamadaMiz
649fc5dc4bSYamadaMiz            $renderer->doc .= '<dd><div class="editor-container" data-content="' . htmlspecialchars($content) . '"></div></dd>';
656b7e227cSYamadaMiz            $renderer->doc .= '</dl>';
665cbf3a53SYamadaMiz            $renderer->doc .= '<div id="output' . $mizarId . '" class="output"></div>';
67668cfaceSYamadaMiz            $renderer->doc .= '<script type="module" src="' . DOKU_BASE . 'lib/plugins/mizarverifiabledocs/dist/script.js"></script>';
689fc5dc4bSYamadaMiz            $renderer->doc .= '</div>';
696b7e227cSYamadaMiz        } else {
706b7e227cSYamadaMiz            $renderer->doc .= "<mizar $filename>$content</mizar>";
716b7e227cSYamadaMiz        }
726b7e227cSYamadaMiz        return true;
736b7e227cSYamadaMiz    }
746b7e227cSYamadaMiz}
75