anchor.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. <?php
  2. if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../').'/');
  3. if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
  4. require_once(DOKU_PLUGIN.'syntax.php');
  5. class syntax_plugin_bbcodeextensions_anchor extends DokuWiki_Syntax_Plugin {
  6. function getType() { return 'disabled'; }
  7. function getPType() { return 'normal'; }
  8. function getAllowedTypes() { return array('disabled'); }
  9. function getSort() { return 110; }
  10. function connectTo($mode){
  11. $this->Lexer->addSpecialPattern('\[a\][0-9a-zA-Z_\-:]+?\[/a\]', $mode, 'plugin_bbcodeextensions_anchor');
  12. }
  13. function handle($match, $state, $pos, Doku_Handler $handler) {
  14. switch ($state) {
  15. case DOKU_LEXER_ENTER :
  16. return array($state, $match);
  17. case DOKU_LEXER_UNMATCHED :
  18. return array($state, $match);
  19. case DOKU_LEXER_EXIT :
  20. return array($state, '');
  21. case DOKU_LEXER_SPECIAL :
  22. return array($state, $match);
  23. }
  24. return array();
  25. }
  26. function render($mode, Doku_Renderer $renderer, $data) {
  27. list ($state, $match) = $data;
  28. switch ($state) {
  29. case DOKU_LEXER_ENTER :
  30. break;
  31. //case DOKU_LEXER_UNMATCHED :
  32. case DOKU_LEXER_SPECIAL :
  33. if(in_array($mode, ['xhtml', 's5'], true)) {
  34. $match= substr($match, 3, -4);
  35. $match= $renderer->_xmlEntities($match); // htmlspecialchars($match);
  36. $renderer->doc .= '<a id="'. $match. '" name="'. $match. '"></a>';
  37. } else
  38. if ($mode==='text') {
  39. $renderer->doc .= $this->getConf('anchor_symbol');
  40. $renderer->doc .= '['. $match. ']';
  41. } else {
  42. $renderer->doc .= '#['. $match. '] ';
  43. }
  44. break;
  45. case DOKU_LEXER_EXIT:
  46. break;
  47. }
  48. return false;
  49. }
  50. }