xref: /plugin/dokucrypt3/syntax.php (revision 97c734d516051c5b55fc0c340717b771d97a295d)
1*97c734d5Sternite<?php
2*97c734d5Sternite/**
3*97c734d5Sternite * Plugin DokuCrypt2: Enables client side encryption
4*97c734d5Sternite *
5*97c734d5Sternite * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6*97c734d5Sternite * @author     Scott Moser <smoser@brickies.net>, Maintainer Sherri W. ( contact me at syntaxseed.com)
7*97c734d5Sternite */
8*97c734d5Sternite
9*97c734d5Sternite// must be run within Dokuwiki
10*97c734d5Sterniteif (!defined('DOKU_INC')) {
11*97c734d5Sternite    die();
12*97c734d5Sternite}
13*97c734d5Sternite
14*97c734d5Sterniteif (!defined('DOKU_PLUGIN')) {
15*97c734d5Sternite    define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
16*97c734d5Sternite}
17*97c734d5Sterniterequire_once(DOKU_PLUGIN.'syntax.php');
18*97c734d5Sternite
19*97c734d5Sternite/**
20*97c734d5Sternite * All DokuWiki plugins to extend the parser/rendering mechanism
21*97c734d5Sternite * need to inherit from this class
22*97c734d5Sternite */
23*97c734d5Sterniteclass syntax_plugin_dokucrypt2 extends DokuWiki_Syntax_Plugin
24*97c734d5Sternite{
25*97c734d5Sternite    public $curNum=0;
26*97c734d5Sternite    public $curLock=0;
27*97c734d5Sternite    /**
28*97c734d5Sternite     * return some info
29*97c734d5Sternite     */
30*97c734d5Sternite    public function getInfo()
31*97c734d5Sternite    {
32*97c734d5Sternite        return array(
33*97c734d5Sternite            'author' => 'Scott Moser, Maintainer Sherri Wheeler',
34*97c734d5Sternite            'email'  => 'Twitter @SyntaxSeed or http://SyntaxSeed.com',
35*97c734d5Sternite            'date'   => '2024-05-01',
36*97c734d5Sternite            'name'   => 'Client Side Encryption Plugin',
37*97c734d5Sternite            'desc'   => 'Client side cryptography enabling encrypting blocks of text within a wiki page.',
38*97c734d5Sternite            'url'    => 'https://www.dokuwiki.org/plugin:dokucrypt2',
39*97c734d5Sternite        );
40*97c734d5Sternite    }
41*97c734d5Sternite
42*97c734d5Sternite    public function getType()
43*97c734d5Sternite    {
44*97c734d5Sternite        return 'protected';
45*97c734d5Sternite    }
46*97c734d5Sternite    public function getAllowedTypes()
47*97c734d5Sternite    {
48*97c734d5Sternite        return array();
49*97c734d5Sternite    }
50*97c734d5Sternite    public function getSort()
51*97c734d5Sternite    {
52*97c734d5Sternite        return 999;
53*97c734d5Sternite    }
54*97c734d5Sternite    public function connectTo($mode)
55*97c734d5Sternite    {
56*97c734d5Sternite        $this->Lexer->addEntryPattern(
57*97c734d5Sternite            '<ENCRYPTED.*?>(?=.*?</ENCRYPTED>)',
58*97c734d5Sternite            $mode,
59*97c734d5Sternite            'plugin_dokucrypt2'
60*97c734d5Sternite        );
61*97c734d5Sternite    }
62*97c734d5Sternite    public function postConnect()
63*97c734d5Sternite    {
64*97c734d5Sternite        $this->Lexer->addExitPattern('</ENCRYPTED>', 'plugin_dokucrypt2');
65*97c734d5Sternite    }
66*97c734d5Sternite
67*97c734d5Sternite    /**
68*97c734d5Sternite     * Handle the match
69*97c734d5Sternite     */
70*97c734d5Sternite    public function handle($match, $state, $pos, Doku_Handler $handler)
71*97c734d5Sternite    {
72*97c734d5Sternite        switch ($state) {
73*97c734d5Sternite          case DOKU_LEXER_ENTER:
74*97c734d5Sternite                // parse something like <ENCRYPTED> or <ENCRYPTED LOCK=foo>
75*97c734d5Sternite                $attr=array( "lock" => "default", "collapsed" => "1" );
76*97c734d5Sternite                if (($x=strpos($match, "LOCK="))!==false) {
77*97c734d5Sternite                    $x+=strlen("LOCK=");
78*97c734d5Sternite                    if (($end=strpos($match, " ", $x))!==false) {
79*97c734d5Sternite                        $len=$end-$x;
80*97c734d5Sternite                    } else {
81*97c734d5Sternite                        $len=-1;
82*97c734d5Sternite                    }
83*97c734d5Sternite                    $attr["lock"]=substr($match, $x, $len);
84*97c734d5Sternite                }
85*97c734d5Sternite                if (($x=strpos($match, "COLLAPSED="))!==false) {
86*97c734d5Sternite                    $x+=strlen("COLLAPSED=");
87*97c734d5Sternite                    if (($end=strpos($match, " ", $x))!==false) {
88*97c734d5Sternite                        $len=$end-$x;
89*97c734d5Sternite                    } else {
90*97c734d5Sternite                        $len=-1;
91*97c734d5Sternite                    }
92*97c734d5Sternite                    $attr["collapsed"]=substr($match, $x, $len);
93*97c734d5Sternite                }
94*97c734d5Sternite                return(array($state,$attr));
95*97c734d5Sternite          case DOKU_LEXER_UNMATCHED:  return array($state, $match);
96*97c734d5Sternite          case DOKU_LEXER_EXIT:       return array($state, '');
97*97c734d5Sternite        }
98*97c734d5Sternite        return array();
99*97c734d5Sternite    }
100*97c734d5Sternite
101*97c734d5Sternite    /**
102*97c734d5Sternite     * Create output
103*97c734d5Sternite     */
104*97c734d5Sternite    public function render($mode, Doku_Renderer $renderer, $data)
105*97c734d5Sternite    {
106*97c734d5Sternite        if ($mode == 'xhtml') {
107*97c734d5Sternite            list($state, $match) = $data;
108*97c734d5Sternite            switch ($state) {
109*97c734d5Sternite              case DOKU_LEXER_ENTER:
110*97c734d5Sternite                $this->curLock=$match;
111*97c734d5Sternite                break;
112*97c734d5Sternite              case DOKU_LEXER_UNMATCHED:
113*97c734d5Sternite                $curid = "crypto_decrypted_" . $this->curNum;
114*97c734d5Sternite
115*97c734d5Sternite                $renderer->doc.="<a id='$curid" . "_atag' " .
116*97c734d5Sternite                  "class='wikilink1 dokucrypt2dec JSnocheck' " .
117*97c734d5Sternite                  "href=\"javascript:toggleCryptDiv(" .
118*97c734d5Sternite                  "'$curid','" . $this->curLock["lock"] . "','" .
119*97c734d5Sternite                  htmlspecialchars(str_replace("\n", "\\n", $match)) . "');\">" .
120*97c734d5Sternite                  "Decrypt Encrypted Text</a>" .
121*97c734d5Sternite                  "&nbsp;&nbsp;[<a class='wikilink1 dokucrypt2toggle JSnocheck' " .
122*97c734d5Sternite                  "href=\"javascript:toggleElemVisibility('$curid');\">" .
123*97c734d5Sternite                  "Toggle Visible</a>]\n" .
124*97c734d5Sternite                  "<PRE id='$curid' class='dokucrypt2pre' style=\"" .
125*97c734d5Sternite                     (($this->curLock["collapsed"] == 1) ?
126*97c734d5Sternite                        "visibility:hidden;position:absolute;white-space:pre-wrap;word-wrap: break-word;" :
127*97c734d5Sternite                        "visibility:visible;position:relative;white-space:pre-wrap;word-wrap: break-word;") .
128*97c734d5Sternite                  "\">". htmlspecialchars($match)."</PRE>";
129*97c734d5Sternite                $this->curNum++;
130*97c734d5Sternite                break;
131*97c734d5Sternite              case DOKU_LEXER_EXIT:
132*97c734d5Sternite                break;
133*97c734d5Sternite            }
134*97c734d5Sternite            return true;
135*97c734d5Sternite        }
136*97c734d5Sternite        return false;
137*97c734d5Sternite    }
138*97c734d5Sternite}
139