xref: /plugin/dokucrypt3/syntax.php (revision 797968255e9ba6155195c27ffca9f6fce5f65776)
197c734d5Sternite<?php
297c734d5Sternite/**
3*79796825Sternite * Plugin dokucrypt3: Enables client side encryption
497c734d5Sternite *
597c734d5Sternite * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
697c734d5Sternite * @author     Scott Moser <smoser@brickies.net>, Maintainer Sherri W. ( contact me at syntaxseed.com)
797c734d5Sternite */
897c734d5Sternite
997c734d5Sternite// must be run within Dokuwiki
1097c734d5Sterniteif (!defined('DOKU_INC')) {
1197c734d5Sternite    die();
1297c734d5Sternite}
1397c734d5Sternite
1497c734d5Sterniteif (!defined('DOKU_PLUGIN')) {
1597c734d5Sternite    define('DOKU_PLUGIN', DOKU_INC.'lib/plugins/');
1697c734d5Sternite}
1797c734d5Sterniterequire_once(DOKU_PLUGIN.'syntax.php');
1897c734d5Sternite
1997c734d5Sternite/**
2097c734d5Sternite * All DokuWiki plugins to extend the parser/rendering mechanism
2197c734d5Sternite * need to inherit from this class
2297c734d5Sternite */
23*79796825Sterniteclass syntax_plugin_dokucrypt3 extends DokuWiki_Syntax_Plugin
2497c734d5Sternite{
2597c734d5Sternite    public $curNum=0;
2697c734d5Sternite    public $curLock=0;
2797c734d5Sternite    /**
2897c734d5Sternite     * return some info
2997c734d5Sternite     */
3097c734d5Sternite    public function getInfo()
3197c734d5Sternite    {
3297c734d5Sternite        return array(
3397c734d5Sternite            'author' => 'Scott Moser, Maintainer Sherri Wheeler',
3497c734d5Sternite            'email'  => 'Twitter @SyntaxSeed or http://SyntaxSeed.com',
3597c734d5Sternite            'date'   => '2024-05-01',
3697c734d5Sternite            'name'   => 'Client Side Encryption Plugin',
3797c734d5Sternite            'desc'   => 'Client side cryptography enabling encrypting blocks of text within a wiki page.',
38*79796825Sternite            'url'    => 'https://www.dokuwiki.org/plugin:dokucrypt3',
3997c734d5Sternite        );
4097c734d5Sternite    }
4197c734d5Sternite
4297c734d5Sternite    public function getType()
4397c734d5Sternite    {
4497c734d5Sternite        return 'protected';
4597c734d5Sternite    }
4697c734d5Sternite    public function getAllowedTypes()
4797c734d5Sternite    {
4897c734d5Sternite        return array();
4997c734d5Sternite    }
5097c734d5Sternite    public function getSort()
5197c734d5Sternite    {
5297c734d5Sternite        return 999;
5397c734d5Sternite    }
5497c734d5Sternite    public function connectTo($mode)
5597c734d5Sternite    {
5697c734d5Sternite        $this->Lexer->addEntryPattern(
5797c734d5Sternite            '<ENCRYPTED.*?>(?=.*?</ENCRYPTED>)',
5897c734d5Sternite            $mode,
59*79796825Sternite            'plugin_dokucrypt3'
6097c734d5Sternite        );
6197c734d5Sternite    }
6297c734d5Sternite    public function postConnect()
6397c734d5Sternite    {
64*79796825Sternite        $this->Lexer->addExitPattern('</ENCRYPTED>', 'plugin_dokucrypt3');
6597c734d5Sternite    }
6697c734d5Sternite
6797c734d5Sternite    /**
6897c734d5Sternite     * Handle the match
6997c734d5Sternite     */
7097c734d5Sternite    public function handle($match, $state, $pos, Doku_Handler $handler)
7197c734d5Sternite    {
7297c734d5Sternite        switch ($state) {
7397c734d5Sternite          case DOKU_LEXER_ENTER:
7497c734d5Sternite                // parse something like <ENCRYPTED> or <ENCRYPTED LOCK=foo>
7597c734d5Sternite                $attr=array( "lock" => "default", "collapsed" => "1" );
7697c734d5Sternite                if (($x=strpos($match, "LOCK="))!==false) {
7797c734d5Sternite                    $x+=strlen("LOCK=");
7897c734d5Sternite                    if (($end=strpos($match, " ", $x))!==false) {
7997c734d5Sternite                        $len=$end-$x;
8097c734d5Sternite                    } else {
8197c734d5Sternite                        $len=-1;
8297c734d5Sternite                    }
8397c734d5Sternite                    $attr["lock"]=substr($match, $x, $len);
8497c734d5Sternite                }
8597c734d5Sternite                if (($x=strpos($match, "COLLAPSED="))!==false) {
8697c734d5Sternite                    $x+=strlen("COLLAPSED=");
8797c734d5Sternite                    if (($end=strpos($match, " ", $x))!==false) {
8897c734d5Sternite                        $len=$end-$x;
8997c734d5Sternite                    } else {
9097c734d5Sternite                        $len=-1;
9197c734d5Sternite                    }
9297c734d5Sternite                    $attr["collapsed"]=substr($match, $x, $len);
9397c734d5Sternite                }
9497c734d5Sternite                return(array($state,$attr));
9597c734d5Sternite          case DOKU_LEXER_UNMATCHED:  return array($state, $match);
9697c734d5Sternite          case DOKU_LEXER_EXIT:       return array($state, '');
9797c734d5Sternite        }
9897c734d5Sternite        return array();
9997c734d5Sternite    }
10097c734d5Sternite
10197c734d5Sternite    /**
10297c734d5Sternite     * Create output
10397c734d5Sternite     */
10497c734d5Sternite    public function render($mode, Doku_Renderer $renderer, $data)
10597c734d5Sternite    {
10697c734d5Sternite        if ($mode == 'xhtml') {
10797c734d5Sternite            list($state, $match) = $data;
10897c734d5Sternite            switch ($state) {
10997c734d5Sternite              case DOKU_LEXER_ENTER:
11097c734d5Sternite                $this->curLock=$match;
11197c734d5Sternite                break;
11297c734d5Sternite              case DOKU_LEXER_UNMATCHED:
11397c734d5Sternite                $curid = "crypto_decrypted_" . $this->curNum;
11497c734d5Sternite
11597c734d5Sternite                $renderer->doc.="<a id='$curid" . "_atag' " .
116*79796825Sternite                  "class='wikilink1 dokucrypt3dec JSnocheck' " .
11797c734d5Sternite                  "href=\"javascript:toggleCryptDiv(" .
11897c734d5Sternite                  "'$curid','" . $this->curLock["lock"] . "','" .
11997c734d5Sternite                  htmlspecialchars(str_replace("\n", "\\n", $match)) . "');\">" .
12097c734d5Sternite                  "Decrypt Encrypted Text</a>" .
121*79796825Sternite                  "&nbsp;&nbsp;[<a class='wikilink1 dokucrypt3toggle JSnocheck' " .
12297c734d5Sternite                  "href=\"javascript:toggleElemVisibility('$curid');\">" .
12397c734d5Sternite                  "Toggle Visible</a>]\n" .
124*79796825Sternite                  "<PRE id='$curid' class='dokucrypt3pre' style=\"" .
12597c734d5Sternite                     (($this->curLock["collapsed"] == 1) ?
12697c734d5Sternite                        "visibility:hidden;position:absolute;white-space:pre-wrap;word-wrap: break-word;" :
12797c734d5Sternite                        "visibility:visible;position:relative;white-space:pre-wrap;word-wrap: break-word;") .
12897c734d5Sternite                  "\">". htmlspecialchars($match)."</PRE>";
12997c734d5Sternite                $this->curNum++;
13097c734d5Sternite                break;
13197c734d5Sternite              case DOKU_LEXER_EXIT:
13297c734d5Sternite                break;
13397c734d5Sternite            }
13497c734d5Sternite            return true;
13597c734d5Sternite        }
13697c734d5Sternite        return false;
13797c734d5Sternite    }
13897c734d5Sternite}
139