1<?php
2/**
3 * DokuWiki Plugin dnsresolver (Syntax Component)
4 *
5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6 * @author  George Pirogov <i1557@yandex.ru>
7 */
8
9// must be run within Dokuwiki
10if (!defined('DOKU_INC')) die();
11
12if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
13require_once(DOKU_PLUGIN.'syntax.php');
14require_once(DOKU_INC.'inc/infoutils.php');
15
16
17class syntax_plugin_dnsresolver extends DokuWiki_Syntax_Plugin
18{
19
20    // возвращаем тип плагина
21    public function getType()
22    {
23        return 'substition';
24    }
25
26    // возвращаем уникальный номер плагина
27    public function getSort()
28    {
29        return 66;
30    }
31
32    // регистрация шаблона в парсере
33    public function connectTo($mode)
34    {
35        $this->Lexer->addEntryPattern('<dns>', $mode, 'plugin_dnsresolver');
36    }
37
38    public function postConnect()
39    {
40        $this->Lexer->addExitPattern('</dns>','plugin_dnsresolver');
41    }
42
43    // Метод handle() создаёт инструкции отображения для собственного синтаксического состояния
44    public function handle($match, $state, $pos, Doku_Handler &$handler)
45    {
46        switch ( $state )
47        {
48              case DOKU_LEXER_ENTER:
49              $data = array();
50              return $data;
51              break;
52
53              case DOKU_LEXER_UNMATCHED:
54        	  return array('dnsname' => $match);
55              break;
56
57              case DOKU_LEXER_EXIT:
58              $data = array();
59              return $data;
60              break;
61        }
62
63        $data = array();
64        return $data;
65    }
66
67    // функция отображения контента
68    public function render($mode, Doku_Renderer &$renderer, $data)
69    {
70        if ( $mode != 'xhtml' ) return false;
71
72        global $ID;
73
74        // получаем переданный параметр
75        $dnsname = $data['dnsname'];
76
77        // получаем @PAGE@ и @NS@
78        $PAGE = noNS($ID);
79        $NS = getNS($ID);
80        if ( strpos($NS, ':') )
81        {
82            $NS = substr( strrchr($NS, ':'), 1);
83        }
84
85        // делаем подстановки @NS@ и @PAGE@
86        $dnsname = str_replace("@NS@", $NS, $dnsname);
87        $dnsname = str_replace("@PAGE@", $PAGE, $dnsname);
88
89        // resolve dns
90		$result = dns_get_record($dnsname);
91
92        // вывод подготовленных данных
93        $content = $result[0][ip];
94        $renderer->doc .= $content;
95
96        return true;
97
98    } // function render
99
100}
101