SiteGraph source

<?php //
/* * SiteGraph.php - A MediaWiki tag extension for adding site graphs based on GraphViz. * @author Kenneth L. Root * @version 1.0.0 * @copyright Copyright (C) 2007-2009 Kenneth L. Root * @license GNU General Public License (https://www.gnu.org/licenses/gpl.txt) * ----------------------------------------------------------------------- * Description: *     This is a MediaWiki extension which a site graph utilizing the *     GraphViz plugin and program. * * Installation: *     1. Place this in a directory (SiteGraph) under $IP/extensions *     2. Enable the extension by adding this line to your LocalSettings.php: *        require_once('extensions/SiteGraph/SiteGraph.php'); * * Usage: *     Once installed, you may utilize SiteGraph by adding the <sitegraph> tag. * * Example: * * <sitegraph type="digraph" layout="neato"> * graph [ *   center=true, *   fontname="Verdana", *   bgcolor="transparent", *   truecolor="true", *   fontsize=12, *   overlap="orthoyx", *   splines="true", *   pack="true", *   sep="0.1", *   dpi=62, *   ratio="compress", *   epsilon="0.001", * ]; * * edge [ *   fontsize=12, *   arrowsize=0.5, *   len=0.5 * ]; * * node [ *   fontsize=12, *   shape="plaintext", *   height=0.25, *   width=0.25, *   fontcolor=blue, * ]; * </sitegraph> * * Version Notes: *     version 1.0.0: *     Initial release. * ----------------------------------------------------------------------- * Copyright (c) 2007-2009 Kenneth L. Root * *    This program is free software: you can redistribute it and/or modify *    it under the terms of the GNU General Public License as published by *    the Free Software Foundation, either version 3 of the License, or *    (at your option) any later version. * *    This program is distributed in the hope that it will be useful, *    but WITHOUT ANY WARRANTY; without even the implied warranty of *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *    GNU General Public License for more details. * *    You should have received a copy of the GNU General Public License *    along with this program.  If not, see <https://www.gnu.org/licenses/>. * ----------------------------------------------------------------------- */
if (!defined('MEDIAWIKI')) {  die( "This file is part of MediaWiki and is not a valid entry point\n" );}
$wgExtensionFunctions[] = 'SiteGraph_init';$wgExtensionCredits['parserhook'][] = array(  'name' => 'SiteGraph',  'version' => '1.0.0',  'author' => '[https://the-b.org/ Kenny Root]',  'url' => 'https://the-b.org/SiteGraph',  'description' => 'Create a sitemap graph through GraphViz.',);
/** * Sets up the SiteGraph Parser hook and system messages */function SiteGraph_init() {  global $wgParser, $wgMessageCache;  $wgParser->setHook( 'sitegraph', 'SiteGraph_render' );}
function SiteGraph_render($text, $params = array(), &$parser) {  global $wgContLang, $wgOut;
  $dbr = wfGetDB(DB_SLAVE);  list($page, $pagelinks) = $dbr->tableNamesN('page', 'pagelinks');
  $type = "graph";  if (array_key_exists('type', $params))        $type = $params['type'];
  $layout = "dot";  if (array_key_exists('layout', $params))        $layout = $params['layout'];
  $html = array();  $html[] = "<graphviz layout='$layout'>$type A {";  $html[] = $text;
  $res = $dbr->query("SELECT    page_namespace AS namespace,    page_title AS title    FROM $page    WHERE page_namespace = ".NS_MAIN."    AND page_is_redirect = 0");  $num = $dbr->numRows($res);
  for ($i = 0; $i < $num && $row = $dbr->fetchObject($res); $i++) {    $title = Title::makeTitleSafe($row->namespace, $row->title);    $html[] = "\"". $row->title ."\" [label=\"" . htmlspecialchars($wgContLang->convert($title->getPrefixedText())) . "\" URL=\"/" . $row->title . "\"];";  }
  $res = $dbr->query("SELECT    page1.page_namespace AS namespace1,    page1.page_title AS title1,    page2.page_namespace AS namespace2,    page2.page_title AS title2    FROM page page1    LEFT JOIN pagelinks link1 ON page1.page_id = link1.pl_from    LEFT JOIN page page2 ON link1.pl_title = page2.page_title    LEFT JOIN pagelinks link2 ON page2.page_id = link2.pl_from    WHERE link2.pl_title = page1.page_title    AND page1.page_title < page2.page_title    AND (page1.page_namespace = ".NS_MAIN." OR page1.page_namespace >= 100)    AND (page2.page_namespace = ".NS_MAIN." OR page2.page_namespace >= 100)    AND page1.page_is_redirect = 0    AND page2.page_is_redirect = 0");  $num = $dbr->numRows($res);
  for ($i = 0; $i < $num && $row = $dbr->fetchObject($res); $i++) {    $html[] = "\"". $row->title1 ."\" -> \"". $row->title2 ."\" [dir=\"both\"];";  }
  $res = $dbr->query("SELECT DISTINCT    page1.page_namespace AS namespace1,    page1.page_title AS title1,    page2.page_namespace AS namespace2,    page2.page_title AS title2    FROM page page1    INNER JOIN pagelinks link1 ON page1.page_id = link1.pl_from    INNER JOIN page page2 ON link1.pl_title = page2.page_title    LEFT JOIN pagelinks link2 ON ((page2.page_id = link2.pl_from) AND (page1.page_title = link2.pl_title))    WHERE link2.pl_from IS NULL    AND page1.page_id <> page2.page_id    AND (page1.page_namespace = 0 OR page1.page_namespace >= 102)    AND (page2.page_namespace = 0 OR page2.page_namespace >= 102)    AND page1.page_is_redirect = 0 AND page2.page_is_redirect = 0;");  $num = $dbr->numRows($res);
  if ($type == "graph")        $connector = "--";  else        $connector = "->";
  for ($i = 0; $i < $num && $row = $dbr->fetchObject($res); $i++) {    $html[] = "\"". $row->title1 ."\" ". $connector ." \"". $row->title2 ."\";";  }
  $html[] = "}</graphviz>";
  return '<!-- ENCODED_SITEGRAPH '. base64_encode(implode($html, "\n")) . ' -->';}
if (!function_exists('processSiteGraphOutput')) {    $wgHooks['ParserAfterTidy'][] = 'processSiteGraphOutput';    function processSiteGraphOutput(&$out, &$text) {        global $wgOut;
        # Find all hidden content and restore to normal        $matches = array();        $nmatch = preg_match_all(            '/<!-- ENCODED_SITEGRAPH ([0-9a-zA-Z\\+]+=*) -->/esm',            $text,            $matches,            PREG_SET_ORDER);
        for ($i = 0; $i < $nmatch; $i++) {            $text = str_replace(                $matches[$i][0],                $wgOut->parse(base64_decode($matches[$i][1])),                $text);        }        return true;    }}

Kenny Root

Copyright © Kenny Root. All rights reserved.