Техническая часть:GraphViz (исходники)

Материал из WEBI

Перейти к: навигация, поиск

Про классический GraphViz, его установку и использование сказано в статье Техническая часть:GraphViz. Тут приведены наши изменения этого модуля и комментарии к ним.

Содержание

Русский GraphViz

Версия 1.0

Основана на создании картинки в svg и последующей конвертации ее в png.

Код

Требует чтобы были установлены:

  • Установленный интерпретатор dot.
    О том как это сделать на Unix (в худшем случае): Сборка Graphviz
  • Установленный конвертер из svg в png.
    Про работу с svg подробно сказано тут Manual:Image Administration/ru.
    Мы используем Батик.

Установка

Все требования должны быть удовлетворены до начала установки. Вы должны создать Graphviz*.php в директорию $mediawiki/extensions. Скопируйте в него приведенный ниже код с необходимыми изменениями. Задайте согласно настройкам вашей системы и устновкам

  • $wgGraphVizSettings->dotCommand = "/usr/bin/dot"
  • $wgGraphVizSettings->convertCommand = "java -jar /usr/bin/batik-rasterizer.jar"

Здесь параметры даны исключительно для примера

Код

PHP:


<?php

# w-495. Народная собственность!

# Код построен на основе CoffMan GraphViz.
# Для использования, включите этот файл в LocalSettings.php
# Для конфигурации отредактируйте $wgGraphVizSettings ниже включения по тексту программы.

class GraphVizSettings {
	/**
	 * Настройки GraphViz
	*/
	var $dotCommand;
	var $convertCommand;
};

$wgGraphVizSettings = new GraphVizSettings;
	/*
		Значения по умолчанию :
	*/
	$wgGraphVizSettings->dotCommand = "dot";
	$wgGraphVizSettings->convertCommand = "java -jar batik-rasterizer.jar";


$wgExtensionFunctions[] = "wfGraphVizExtension";
	# добавим элемент к функциям расширения

function wfGraphVizExtension() {
	/**
	 * Инициализирует расширение.
	*/
	
	global $wgParser;
	$wgParser->setHook( "graphviz", "renderGraphviz" );
}

function renderGraphviz( $dotcode )
{
	/**
	 * Обрабатывает и отображает GraphViz код
	*/
	
	/*Используем из глобального пространства имен*/
	global $IP;
	global $wgUploadDirectory;
	global $wgUploadPath;
	global $wgGraphVizSettings;
	global $wgArticlePath;
	global $wgTmpDirectory;
	
	
	$hash = md5( $dotcode );
		# получим имя файла как его md5
	$dest = $wgUploadDirectory."/graphviz/";
		# получим путь к папке к файлу
		
	if ( ! is_dir( $dest ) ) 
	{ 
		# если нет папки ~~./graphviz создадим ее
		mkdir( $dest, 0777 ); 
			
	}
	if ( ! is_dir( $wgTmpDirectory ) ) 
	{ 
		# если нет папки ~~./tmp создадим ее
		mkdir( $wgTmpDirectory, 0777 ); 
	}

	$fname = $dest . $hash;
		# полное имя файла состоит из пути к папке graphviz и md5 файла
	
	
	if ( ! ( (file_exists( $fname.".png" ) &&  file_exists( $fname.".svg" )) || file_exists( $fname.".err" ) ) )
	{
		$handle = fopen($fname, "w");
		fwrite($handle, $dotcode);
		fclose($handle);
			# открыли файл, записали dot-код, pfrhskb файл.

		/* формируем строки для выполнения в shell */
		$cmdline_dot = wfEscapeShellArg( $wgGraphVizSettings->dotCommand) . 
			" -Tsvg -o " . 
			wfEscapeShellArg( $fname. ".svg") . 
			" " . 
			wfEscapeShellArg( $fname ) ;
			
		$cmdline_convert =  $wgGraphVizSettings->convertCommand . 
			" ".
			#"java -jar /home/virtwww/w_2in2-ru_7a1aa86f/src/batik/batik-1.7/batik-rasterizer.jar ". 
			wfEscapeShellArg( $fname. ".svg");
		
		$cmdline_dot_map = wfEscapeShellArg( $wgGraphVizSettings->dotCommand) . 
			" -Tcmapx -o " . 
			wfEscapeShellArg( $fname. ".map") . 
			" " .
			wfEscapeShellArg( $fname ) ;
		  
		/* выполняем строки выше в shell */
		$returned_dot = exec ($cmdline_dot);
		$returned_convert = exec ($cmdline_convert);
		$returned_dot_map = exec ($cmdline_dot_map);
		
		unlink($fname); 
			# удалим файл и исходным текстом
	}
	
	@$err=file_get_contents( $fname.".err" ); 

	if ( $err != "" ) {
		/*
			Если есть ошибка
		*/
		$txt = "<div id=\"toc\"><tt>$err</tt></div>";
	} else {
		/*
			Если все ок
		*/
		@$map = file_get_contents( $fname.".map" );
		$map=preg_replace("#<ma(.*)>#"," ",$map);
		$map=str_replace("</map>","",$map);

		$space = "nbsp";

		$txt = 	"<map name=\"$hash\">{$map}</map>" .
			"<img .
				"src=\"{$wgUploadPath}/graphviz/{$hash}.png\" .
				"alt=\"Картинка не отобразилась не сработал png-конвертор\"  
			"/>" .
			"&" . $space . ";".
			"<a href=\"{$wgUploadPath}/graphviz/{$hash}.svg\" >[svg]</a>";							
	}
	return $txt;
}
?>

Личные инструменты