1 <?php
2 
3 /**
4  * DokuWiki Plugin diagrams (Helper Component)
5  *
6  * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7  * @author  Innovakom + CosmoCode <dokuwiki@cosmocode.de>
8  */
9 class helper_plugin_diagrams extends \dokuwiki\Extension\Plugin
10 {
11     /**
12      * Check if the given file is a diagrams.net diagram
13      *
14      * @param string $file
15      * @return bool
16      */
17     public function isDiagramFile($file)
18     {
19         $svg = file_get_contents($file, false, null, 0, 500);
20         return $this->isDiagram($svg);
21     }
22 
23     /**
24      * Check if the given SVG is a diagrams.net diagram
25      *
26      * This is done by ensuring that the service host is part of the SVG header
27      *
28      * @param string $svg The raw SVG data (first 500 bytes are enough)
29      * @return bool
30      */
31     public function isDiagram($svg)
32     {
33         $svg = substr($svg, 0, 500); // makes checking a tiny bit faster
34         $svg = preg_replace('/<\?xml.*?>/', '', $svg);
35         $svg = preg_replace('/<!--.*?-->/', '', $svg);
36         $svg = preg_replace('/<!DOCTYPE.*?>/', '', $svg);
37         $svg = ltrim($svg);
38 
39         if (empty($svg) || substr($svg, 0, 4) !== '<svg') return false;
40         $confServiceUrl = $this->getConf('service_url'); // like "https://diagrams.xyz.org/?embed=1&..."
41         $serviceHost = parse_url($confServiceUrl, PHP_URL_HOST); // Host-Portion of the Url, e.g. "diagrams.xyz.org"
42         return strpos($svg, 'embed.diagrams.net') || strpos($svg, 'draw.io') || strpos($svg, $serviceHost);
43     }
44 }
45