GraphvizFormatter : Adds support of graphviz inline syntax
Author : Tam Kien Duong - nicky@deveha.com - development's page
Graphviz is a very nice tool to produce and generate graphs. It's maye be usefull to let user create directly graph to illustrate the content (or import figures from documents). This extension aims to provide a support of graphviz graph language description.
Requirements
- Functional installation of Graphviz
Installation
- Copy the graphviz.php file (code below) in the formatters directory
If you're using URL Rewriting, don't forget to add a rule in your .htaccess file.
RewriteCond %{REQUEST_FILENAME} !uploads/.*$
How to use it
%%(graphviz)
digraph G {Hello->World}
%%
digraph G {Hello->World}
%%
To Do
- Improve the code. It needs serious refactoring (object modelisation, etc)
- Cache generate images. Right now, the images are generate constantly what can causes some troubles.
- Delete unpublished graphs
- ACL Support (waiting the next Wikka version)
Live Test
Some live tests are available on the development's page.
The Code
graphviz.php (line 1)
- <?php
- #
- # WikkaWiki Formatter to display graphviz-graphs
- #
- # $Id: $
- #
- # Copyright (C) 2007, Tam Kien Duong http://cendres.net
- #
- # This file is Free Software.
- #
- # It is licensed under the following three licenses as alternatives:
- # 1. GNU Lesser General Public License (LGPL) V2.1 or any newer version
- # 2. GNU General Public License (GPL) V2 or any newer version
- # 3. Apache License, V2.0 or any newer version
- #
- # You may not use this file except in compliance with at least one of
- # the above three licenses.
- #
- # This file is based on Sebastian Dietzold Graphviz extension for WackoWiki
- # https://wiki.imise.uni-leipzig.de/Projects/WackoTuning?v=xii#h702-8
- # if set to "" we test is the file in PATH
- $GraphVizSettings['bindir'] = "";
- $GraphVizSettings['filedir'] = $this->config["upload_path"];
- # check, if there should be another tool than dot used
- else $bin = "dot";
- $GraphVizSettings['bin'] = $GraphVizSettings['bindir'] . $bin;
- # write graphviz code to temporary text-file
- ### here starts the big code block ###
- ## step 1: convert the source-code to generated source code
- $cmd = $GraphVizSettings['bin']." -Tdot -o $tmpname.dot $tmpname 2>&1";
- $cmdOut = `{$cmd}`;
- if ($cmdOut != "")
- {
- echo "<i>$cmdOut</i><br/>";
- }
- else
- {
- # extract the name of the graph (second string in first line)
- # the basename is generated in the same way like the upload-handler do this
- $fname = $GraphVizSettings['filedir'] .'/'.$this->page['tag'].'/'.$gname;
- if(!file_exists($GraphVizSettings['filedir'] .'/'.$this->page['tag'])) mkdir($GraphVizSettings['filedir'] .'/'.$this->page['tag']);
- ## step 2: prepare and run the image command and put the image in the upload dir
- $imagecmd = $GraphVizSettings['bin']." -Tpng -o $fname.png $tmpname.dot";
- $cmdOut = `{$imagecmd}`;
- $imgurl = $this->config["base_url"].$GraphVizSettings['filedir'] .'/'.$this->page['tag'].'/'.$gname.".png";
- ## step 3: prepare and run the map command
- $mapcmd = $GraphVizSettings['bin']." -Tcmap $tmpname.dot";
- $map = `{$mapcmd}`;
- if ($map == "")
- {
- # output without no image map
- echo "<img border=\"0\" src=\"$imgurl\">\n";
- }
- else
- {
- # output with image map
- echo "<map name=\"$gname\">$map</map>";
- echo "<img border=\"0\" usemap=\"#$gname\" src=\"$imgurl\">\n";
- }
- # clear the directory and vars
- }
- ?>
CategoryDevelopmentFormatters
Do I need to put specific permissions on graphiz.php?
!! Oh the wrong name is on the page, should be graphviz.php. One problem solved by trying to report it. I'll try to edit that on the page.
rename, reload page...
Warning: mkdir() [function.mkdir]: Permission denied in /var/www/localhost/htdocs/wikka/formatters/graphviz.php on line 59
So maybe permissions do need to be changed. Or should I just create the directory manually and not worry about it?
I don't know "who" to make the directory writable to. Changing owner/group from root/root to (whatever the rest of the wikka subdir is) didn't help.
Looks like I need the directions on UploadsDirectorySetup. :) Since it also applies to the files action, I think.
1. "uploads" writeable by root:root only. changed owner to apache
2. while having the 'delete temps' lines commented out, found out my graphviz wasn't compiled with PNG support. Since I wanted PNGs, I recompiled, but it'd probably be easier to use GIF instead if you don't care. As best as I could tell this error message is completely suppressed by the above code, it was blatant when I tried it on the command line though.
3. Instead of reading g.png from "uploads/PageName" attempted to load to infinite depth "uploads/PageName/images/PageName/images/PageName/images/PageName/images/.../g.png" obviously this is mod_rewrite's fault. This was fixed by adding a new .htaccess file in "uploads" that didn't rewrite names of existing files/directories and 403'd non-existent, which then I edited again to redirect the 403 to HomePage. I'm certain there's a better way to to this, but it worked. (I'm somewhat currious where 'images' came from in the above path.)
When I tried to set this up; I was using the 1.1.6.4-rc1. When I got it all straighten out today, I started with upgrading to 1.1.6.4, that helped so far as I had to remake the uploads directory and reset it's owner first.
The above code makes it look like that is possible, but since I don't know PHP, I don't know how to get the above
(isset($options['neato']))
line to be true. How would the codeblock go? Where do I stick neato in the codeblock?
%%(neato)
...
%%
instead of
%%(graphviz)
...
%%
as necessary.