Difference between revisions of "Inline SVG extension"
| Line 123: | Line 123: | ||
==SVG Browser Test== | ==SVG Browser Test== | ||
You can see the images here even if your browser does not support SVG. | |||
[[Image:example1.svg]] | [[Image:example1.svg]] | ||
| Line 130: | Line 130: | ||
[[Image:example3.svg]] | [[Image:example3.svg]] | ||
Then, if you see the same images below, then your browser supports SVG. | |||
[[Category:Mediawiki_Extensions]] | [[Category:Mediawiki_Extensions]] | ||
Revision as of 07:13, 12 March 2006
Following is a very simple piece of work. Feel free to comment, particularly about alternative approaches and so on.
Purpose & Quick Howto
To enable including in-line svg code in a wiki document, using client browser's capability (native as in mozilla firefox or with a plug-in as in internet explorer and Adobe's SVG plugin).
Do I need this extension
Probably not! You can achieve the same results using standard mediawiki tools
- Upload the svg file as an image
- Then use it in an [[Image:foobar]] tag. It works for many browsers.
And if you want to play it safe (remember many old browsers might not support svg format!)
- Use SVG Extension by User:Coffman. It renders gif or png directly, which works in every browser.
Howto
Follow the steps below:
- Cut and paste the source code below in to a file named SVGtag.php in your extensions directory
- Call SVGtag.php by adding following line to the end of LocalSettings.php
include("extensions/SVGtag.php"); - Include svg code as follows:
<svgcode calling_arguments>
<svg various arguments come here> svg code here </svg> </svgcode>
- For example
<svgcode width="300" height="200" version="1.1">
- For example
<svg version="1.1" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="300" height="200"
viewBox="0 0 300 350" >
<rect x="0.5" y="0.5" fill="#FFFFFF" stroke="#000000" width="250" height="175"/> </svg>
</svgcode>
See the bottom of this article to see whether your browser support svg.
Background
See Also: SVG
In a perfect world, there is no need to use fancy method to incorporate a SVG script to a web page. However, the conflicts in various browser standards make the waters muddy. There are several methods to do this, depending on targeted browser, but nothing works perfectly for everything[1]. The best compromise seems to be having the svg code in a separate file and include that file in a special object/embed/iframe tag. the latter seems to work best in both worlds (i.e. Mozilla, native svg rendering and IE assisted by Adobe SVG plug in.
<iframe src="file.svg" width="500" height="500"> </iframe>
can show a properly formatted svg file in most of the modern browsers.
How it works
(see metawikipedia:Write_your_own_MediaWiki_extension first.)
- The extension registers a hook to Mediawiki wgParser requesting it to run returnSVGtagged function whenever
<svgtag> blah blah </svgtag>
is found in the code, using 'blah blah' (code between <svgtag> and </svgtag> as the argument. - returnSVGtagged function does the following
- Creates a unique file name based on MD5 checksum of the svg code in the argument.
- Checks whether a file by that name exists
- if no
- create a new file under that name with svg code as argument
- end if
- return a iframe tag calling the unique file name.
Source Code
<?php
#----------------------------------------------------------------------------
#Copyright 2006 Assela Pathirana
#----------------------------------------------------------------------------
# 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#-------------------------------------------------------------------------------
# Inspired by svgextension.
#-------------------------------------------------------------------------------
$wgExtensionFunctions[] = "wfSVGtag";
function wfSVGtag() {
global $wgParser;
$wgParser->setHook( "svgcode", "returnSVGtagged" );
}
function returnSVGtagged( $code, $argv)
{
global $wgUploadDirectory, $wgUploadPath, $IP, $wgArticlePath, $wgTmpDirectory;
$hash = md5( $code );
$tmploc="/svgcode/";
$extension=".svg";
$svgversion=$argv["version"];
$boxwidth=$argv["width"];
$boxheight=$argv["height"];
if (!is_numeric($boxwidth)){
$boxwidth="500";
}
if (!is_numeric($boxheight)){
$boxheight="500";
}
if ($svgversion==""){
$svgversion='1.1';
}
$svgversion2=str_replace(".","",$svgversion);
$dest = $wgUploadDirectory.$tmploc;
$path= $wgUploadPath.$tmploc;
if ( ! is_dir( $dest ) ) { mkdir( $dest, 0777 ); }
if ( ! is_dir( $wgTmpDirectory ) ) { mkdir( $wgTmpDirectory, 0777 ); }
$outfile = $dest . $hash.$extension;
$pname = $path . $hash.$extension;
if ( ! file_exists( $outfile ) ) {
$ptr = fopen($outfile, "w");
$header=
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG '.$svgversion.'//EN" "http://www.w3.org/Graphics/SVG/'.$svgversion.
'/DTD/svg'.$svgversion2.'.dtd" [ <!ENTITY ns_svg "http://www.w3.org/2000/svg">'.
'<!ENTITY ns_xlink "http://www.w3.org/1999/xlink"> ]>';
fwrite($ptr, $header);
fwrite($ptr, $code);
fclose($ptr);
}
$txt = "<iframe src=$pname width='".$boxwidth."' height='".$boxheight."' ></iframe>";
return $txt;
}
?>
SVG Browser Test
You can see the images here even if your browser does not support SVG.
Then, if you see the same images below, then your browser supports SVG.