1<?php
2if (!class_exists('PlantUmlDiagram')) {
3    class PlantUmlDiagram {
4        private $markup;
5        private $encoded;
6        private $basePath;
7
8        public function __construct($markup,$plantUmlUrl) {
9            $this->markup = nl2br($markup);
10            $this->encoded = $this->encodep($markup);
11            $this->basePath = $plantUmlUrl;
12        }
13
14        public function getMarkup() {
15            return $this->markup;
16        }
17
18        /**
19         * Get the SVG code
20         *
21         * @return string
22         */
23        public function getSVG()
24        {
25            return (new DokuHTTPClient())->get($this->getSVGDiagramUrl());
26        }
27
28        public function getSVGDiagramUrl() {
29            return $this->basePath."svg/".$this->encoded;
30        }
31
32        public function getPNGDiagramUrl() {
33            return $this->basePath."png/".$this->encoded;
34        }
35
36        public function getTXTDiagramUrl() {
37            return $this->basePath."txt/".$this->encoded;
38        }
39
40        private function encodep($text) {
41            $compressed = gzdeflate($text, 9);
42            return $this->encode64($compressed);
43       }
44
45        private function encode6bit($b) {
46            if ($b < 10) {
47                 return chr(48 + $b);
48            }
49            $b -= 10;
50            if ($b < 26) {
51                 return chr(65 + $b);
52            }
53            $b -= 26;
54            if ($b < 26) {
55                 return chr(97 + $b);
56            }
57            $b -= 26;
58            if ($b == 0) {
59                 return '-';
60            }
61            if ($b == 1) {
62                 return '_';
63            }
64            return '?';
65       }
66
67        private function append3bytes($b1, $b2, $b3) {
68            $c1 = $b1 >> 2;
69            $c2 = (($b1 & 0x3) << 4) | ($b2 >> 4);
70            $c3 = (($b2 & 0xF) << 2) | ($b3 >> 6);
71            $c4 = $b3 & 0x3F;
72            $r = "";
73            $r .= $this->encode6bit($c1 & 0x3F);
74            $r .= $this->encode6bit($c2 & 0x3F);
75            $r .= $this->encode6bit($c3 & 0x3F);
76            $r .= $this->encode6bit($c4 & 0x3F);
77            return $r;
78       }
79
80        private function encode64($c) {
81            $str = "";
82            $len = strlen($c);
83            for ($i = 0; $i < $len; $i+=3) {
84                   if ($i+2==$len) {
85                         $str .= $this->append3bytes(ord(substr($c, $i, 1)), ord(substr($c, $i+1, 1)), 0);
86                   } else if ($i+1==$len) {
87                         $str .= $this->append3bytes(ord(substr($c, $i, 1)), 0, 0);
88                   } else {
89                         $str .= $this->append3bytes(ord(substr($c, $i, 1)), ord(substr($c, $i+1, 1)),
90                             ord(substr($c, $i+2, 1)));
91                   }
92            }
93            return $str;
94       }
95    }
96}
97
98?>
99