<?php
/**
 * DokuWiki Plugin passwordgrey (Syntax Component)
 *
 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
 * @author  Michael Schreiber <m.schreiber@creatronics.de>
 */

// must be run within Dokuwiki
if (!defined('DOKU_INC')) {
  die();
}

class syntax_plugin_passwordgrey_passwordgrey extends DokuWiki_Syntax_Plugin {
  /**
   * @return string Syntax mode type
   */
  public function getType() {
    return 'formatting';
  }

  /**
   * @return string Paragraph type
   */
  public function getPType() {
    return 'normal';
  }

  /**
   * @return int Sort order - Low numbers go before high numbers
   */
  public function getSort() {
    return 158;
  }

  /**
   * Connect lookup pattern to lexer.
   *
   * @param string $mode Parser mode
   */
  public function connectTo($mode) {
    $this->Lexer->addEntryPattern('<pwd>(?=.*?</pwd>)', $mode, 'plugin_passwordgrey_passwordgrey');
  }

  public function postConnect() {
    $this->Lexer->addExitPattern('</pwd>', 'plugin_passwordgrey_passwordgrey');
  }

  /**
   * Handle matches of the passwordgrey syntax
   *
   * @param string $match The match of the syntax
   * @param int $state The state of the handler
   * @param int $pos The position in the document
   * @param Doku_Handler $handler The handler
   *
   * @return array Data for the renderer
   */
  public function handle($match, $state, $pos, Doku_Handler $handler) {
    switch ($state) {
      case DOKU_LEXER_ENTER :
      {

        return array($state, array('color:lightgrey', ''));
      }

      case DOKU_LEXER_UNMATCHED :
        return array($state, $match);
      case DOKU_LEXER_EXIT :
        return array($state, '');
    }
    return array();
  }

  /**
   * Render xhtml output or metadata
   *
   * @param string $mode Renderer mode (supported modes: xhtml)
   * @param Doku_Renderer $renderer The renderer
   * @param array $data The data from the handler() function
   *
   * @return bool If rendering was successful.
   */
  public function render($mode, Doku_Renderer $renderer, $data) {
    if ($mode == 'xhtml') {
      $r = rand(0, 100000);
      list($state, $match) = $data;
      switch ($state) {
        case DOKU_LEXER_ENTER :
          list($color, $background) = $match;

          $renderer->doc .= '<label class="passwordgrey"><span style= "font-weight:bold" class="passwordgrey">';

          break;

        case DOKU_LEXER_UNMATCHED :
          $renderer->doc .= $renderer->_xmlEntities($match);
          break;
        case DOKU_LEXER_EXIT :
        {
          $renderer->doc .= '</span></label>';
          break;
        }
      }
      return true;
    }
    if ($mode == 'odt') {
      list($state, $match) = $data;
      switch ($state) {
        case DOKU_LEXER_ENTER :
          list($color, $background) = $match;
          if (class_exists('ODTDocument')) {
            $renderer->_odtSpanOpenUseCSS(NULL, 'style="' . $color . ' ' . $background . '"');
          }
          break;

        case DOKU_LEXER_UNMATCHED :
          $renderer->cdata($match);
          break;

        case DOKU_LEXER_EXIT :
          if (class_exists('ODTDocument')) {
            $renderer->_odtSpanClose();
          }
          break;
      }
      return true;
    }
    return false;
  }
}
