\ntotal: $count page(s) on this site.\n
\n";
// ツリー作成
$nodes = array();
foreach ($pages as $page)
{
$nodes[$page] = & new MapNode($page,$reverse);
}
if ($reverse)
{
$keys = array_keys($nodes);
sort($keys);
$alone = array();
$retval['body'] .= "\n";
foreach ($keys as $page)
{
if (count($nodes[$page]->rels))
{
$retval['body'] .= $nodes[$page]->toString($nodes,1,$nodes[$page]->parent_id);
}
else
{
$alone[] = $page;
}
}
$retval['body'] .= "
\n";
if (count($alone))
{
$retval['body'] .= "
\nno link from anywhere in this site.
\n";
$retval['body'] .= "\n";
foreach ($alone as $page)
{
$retval['body'] .= $nodes[$page]->toString($nodes,1,$nodes[$page]->parent_id);
}
$retval['body'] .= "
\n";
}
}
else
{
$nodes[$refer]->chain($nodes);
$retval['body'] .= "\n".$nodes[$refer]->toString($nodes)."
\n";
$retval['body'] .= "
not related from ".htmlspecialchars($refer)."
\n";
$keys = array_keys($nodes);
sort($keys);
$retval['body'] .= "\n";
foreach ($keys as $page)
{
if (!$nodes[$page]->done)
{
$nodes[$page]->chain($nodes);
$retval['body'] .= $nodes[$page]->toString($nodes,1,$nodes[$page]->parent_id);
}
}
$retval['body'] .= "
\n";
}
// 終了
return $retval;
}
class MapNode
{
var $page;
var $is_page;
var $link;
var $id;
var $rels;
var $parent_id = 0;
var $done;
function MapNode($page,$reverse=FALSE)
{
global $script;
static $id = 0;
$this->page = $page;
$this->is_page = is_page($page);
$this->cache = CACHE_DIR.encode($page);
$this->done = !$this->is_page;
$this->link = make_pagelink($page);
$this->id = ++$id;
$this->rels = $reverse ? $this->ref() : $this->rel();
$mark = $reverse ? '' : '+';
$this->mark = "id}\" href=\"$script?plugin=map&refer=".rawurlencode($this->page)."\">$mark";
}
function ref()
{
$refs = array();
if (file_exists($this->cache.'.ref'))
{
foreach (file($this->cache.'.ref') as $line)
{
$ref = explode("\t",$line);
$refs[] = $ref[0];
}
sort($refs);
}
return $refs;
}
function rel()
{
$rels = array();
if (file_exists($this->cache.'.rel'))
{
$file = file($this->cache.'.rel');
$rels = explode("\t",trim($file[0]));
sort($rels);
}
return $rels;
}
function chain(&$nodes)
{
if ($this->done)
{
return;
}
$this->done = TRUE;
if ($this->parent_id == 0)
{
$this->parent_id = -1;
}
foreach ($this->rels as $page)
{
if (!array_key_exists($page,$nodes))
{
$nodes[$page] = &new MapNode($page);
}
if ($nodes[$page]->parent_id == 0)
{
$nodes[$page]->parent_id = $this->id;
}
}
foreach ($this->rels as $page)
{
$nodes[$page]->chain($nodes);
}
}
function toString(&$nodes,$level=1,$parent_id=-1)
{
$indent = str_repeat(' ',$level);
if (!$this->is_page)
{
return $indent."{$this->link}\n";
}
else if ($this->parent_id != $parent_id)
{
return $indent."{$this->link}id}\">...\n";
}
$retval = $indent."{$this->mark}{$this->link}\n";
if (count($this->rels))
{
$childs = array();
$level += 2;
foreach ($this->rels as $page)
{
if ($this->parent_id != $nodes[$page]->id)
{
$childs[] = $nodes[$page]->toString($nodes,$level,$this->id);
}
}
if (count($childs))
{
$retval .= $indent." \n".join('',$childs).$indent."
\n";
}
}
$retval .= $indent."\n";
return $retval;
}
}
?>