*/
// must be run within Dokuwiki
if (!defined('DOKU_INC')) die();
if (!defined('DOKU_LF')) define('DOKU_LF', "\n");
if (!defined('DOKU_TAB')) define('DOKU_TAB', "\t");
if (!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once DOKU_PLUGIN.'syntax.php';
class syntax_plugin_ipmap_rendertables extends DokuWiki_Syntax_Plugin {
function getType(){ return 'formatting'; }
function getAllowedTypes() { return array('formatting','container', 'substition', 'disabled'); }
function getSort(){ return 158; }
function connectTo($mode) {
// $this->Lexer->addSpecialPattern('',$mode,'plugin_ipmap_rendertables');
/* $this->Lexer->addEntryPattern('(?=.*?)',$mode,'plugin_ipmap_rendertables'); */
$this->Lexer->addEntryPattern('.*',$mode,'plugin_ipmap_rendertables');
}
function postConnect() {
$this->Lexer->addExitPattern('','plugin_ipmap_rendertables');
}
function handle($match, $state, $pos, Doku_Handler $handler){
switch ($state) {
case DOKU_LEXER_ENTER :
list($ip, $net,$subnet) = preg_split("/\//u", substr($match, 7, -1), 3);
return array($state, array($ip, $net, $subnet,strip_tags($match)));
case DOKU_LEXER_UNMATCHED : return array($state, $match);
case DOKU_LEXER_EXIT : return array($state, '');
}
return array();
}
function render($mode, Doku_Renderer $renderer, $data) {
global $in;
if($mode == 'xhtml'){
list($state,$match) = $data;
switch ($state) {
case DOKU_LEXER_ENTER :
list($ip, $net, $subnet,$data) = $match;
$unused = array();
$renderer->doc .= p_render('xhtml',p_get_instructions($this->_maketables($ip, $net, $subnet, $data)), $unused);
break;
case DOKU_LEXER_UNMATCHED : break;
case DOKU_LEXER_EXIT : break;
}
return true;
}
return false;
}
function _maketables($ip, $net, $subnet, $data){
$subnet = explode(">",$subnet);
$subnet = $subnet[0];
$x = array(
9 => 8,
8 => 8,
7 => 8,
6 => 8,
5 => 8,
4 => 4,
3 => 4,
2 => 2
);
$y = array(
9 => 64,
8 => 32,
7 => 16,
6 => 8,
5 => 4,
4 => 4,
3 => 2,
2 => 2
);
$subnetsr=array();
$subnets = explode("*",$data);
foreach ($subnets as &$value) {
$subnetu = explode("-",$value);
$subneta = explode("/",trim($subnetu[0]));
$subnetsr[$subneta[0]] = array("Mask" => $subneta[1], "Desc" => trim($subnetu[1]));
}
$diff = $subnet - $net;
$rightbits = 32 - $subnet;
for($z = 0; $z < ($rightbits); ++$z) {
$rightb .= "1";
}
$dright = bindec($rightb);
$width=$x[$diff];
$height=$y[$diff];
$dip = ip2long($ip);
for($z = 0; $z < ($width); ++$z) {
$endrow .= "^";
}
$first = 1;
/* Are we the first cell in a row - dodgy. */
$output = "^ [[..:main|UP]] " . $endrow."\n";
for($i = 0; $i < ($width*$height); ++$i) {
if (($dip + $i * ($dright + 1) > $lasts + $drights ) or ($lasts + $drights == 0)) {
$ipout = long2ip($dip + $i * ($dright + 1));
$desc = $subnetsr[$ipout]['Desc'];
$mask = $subnetsr[$ipout]['Mask'];
if ($mask){
$rightbs = "";
$rightbitss = 32 - $mask;
for($z = 0; $z < ($rightbitss); ++$z) {
$rightbs .= "1";
}
$drights = bindec($rightbs);
$sout = $mask;
$lasts = $dip + $i * ($dright + 1);
$lastsb = $ipout;
} else {
$sout = "$subnet";
}
}
if ($desc){
if ((long2ip($dip + $i * ($dright + 1)) == $ipout) or ($first == 1)){
$output .= "^ [[.:$ipout\_$sout:main|$ipout/$sout]] \\\\ " . "$desc" . " ";
$first = 0;
} else {
$output .= "|";
}
} else {
if ((long2ip($dip + $i * ($dright + 1)) == $ipout) or ($first == 1)){
$output .= "| $ipout/$sout ";
$first = 0;
} else {
$output .= "|";
}
}
if (($i + 1)% $width == 0){
$output .= "|\n";
$first = 1;
}
}
return($output);
}
}
// vim:ts=4:sw=4:et:enc=utf-8: