345 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			345 lines
		
	
	
		
			8.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
|   | <?php | ||
|  | /* | ||
|  | SVG to dojox.gfx Parser | ||
|  | Copyright (C) 2009  Aaron Lindsay <aclindsay@aclindsay.com> | ||
|  | 
 | ||
|  | 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 Street, Fifth Floor, Boston, MA  02110-1301, USA. | ||
|  | */ | ||
|  | 
 | ||
|  | require_once("parser/Parser.php"); | ||
|  | 
 | ||
|  | $requestData = ''; | ||
|  | if (isset($_SERVER['CONTENT_LENGTH']) && $_SERVER['CONTENT_LENGTH'] > 0) { | ||
|  | 	$httpContent = fopen('php://input', 'r'); | ||
|  | 	while ($data = fread($httpContent, 1024)) { | ||
|  | 		$requestData .= $data; | ||
|  | 	} | ||
|  | 	fclose($httpContent); | ||
|  | } | ||
|  | 
 | ||
|  | if ($requestData == '') | ||
|  | 	exit; | ||
|  | 
 | ||
|  | $parser = new Parser(); | ||
|  | $svg = $parser->parse($requestData); | ||
|  | 
 | ||
|  | //first, create javascript objects for all the gradients
 | ||
|  | $linearGradients = $svg->getCompleteLinearGradients(); | ||
|  | $radialGradients = $svg->getCompleteRadialGradients(); | ||
|  | $paths = $svg->getPaths(); | ||
|  | $rects = $svg->getRectangles(); | ||
|  | $circles = $svg->getCircles(); | ||
|  | $ellipses = $svg->getEllipses(); | ||
|  | $lines = $svg->getLines(); | ||
|  | $polylines = $svg->getPolylines(); | ||
|  | $texts = $svg->getTexts(); | ||
|  | 
 | ||
|  | echo "/*
 | ||
|  | SVG to dojox.gfx Parser | ||
|  | Copyright (C) 2009  Aaron Lindsay <aclindsay@aclindsay.com> | ||
|  | 
 | ||
|  | 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 Street, Fifth Floor, Boston, MA  02110-1301, USA. | ||
|  | */\n\n";
 | ||
|  | echo "//set 'g' equal to the dojo group you want to add this drawing as...\n//ex. var g = surface.createGroup()\n\n"; | ||
|  | 
 | ||
|  | //echo all the linear gradients
 | ||
|  | foreach ($linearGradients as $gradient) { | ||
|  | 	//make sure the gradient has its transform(s) applied
 | ||
|  | 	if (!$gradient->transformsApplied()) | ||
|  | 		$gradient->applyTransforms(); | ||
|  | 	 | ||
|  | 	echo "var gradient".$gradient->getId()." = {\n"; | ||
|  | 	echo "\ttype: \"linear\",\n"; | ||
|  | 	echo "\tx1: ".$gradient->getX1().", y1: ".$gradient->getY1().",\n"; | ||
|  | 	echo "\tx2: ".$gradient->getX2().", y2: ".$gradient->getY2().",\n"; | ||
|  | 	echo "\tcolors: [\n"; | ||
|  | 	 | ||
|  | 	$stops = $gradient->getStops(); | ||
|  | 	for ($i = 0; $i < count($stops)-1; $i++) { | ||
|  | 		echo "\t\t{offset: ".$stops[$i]->getOffset().", color: \"".$stops[$i]->getColor()."\"},\n"; | ||
|  | 	} | ||
|  | 	echo "\t\t{offset: ".$stops[count($stops)-1]->getOffset().", color: \"".$stops[count($stops)-1]->getColor()."\"}\n"; | ||
|  | 	echo "\t]\n"; | ||
|  | 	echo "};\n"; | ||
|  | } | ||
|  | 
 | ||
|  | //now, do the same for all the radial gradients
 | ||
|  | foreach ($radialGradients as $gradient) { | ||
|  | 	//make sure the gradient has its transform(s) applied
 | ||
|  | 	if (!$gradient->transformsApplied()) | ||
|  | 		$gradient->applyTransforms(); | ||
|  | 		 | ||
|  | 	echo "var gradient".$gradient->getId()." = {\n"; | ||
|  | 	echo "\ttype: \"radial\",\n"; | ||
|  | 	echo "\tcx: ".$gradient->getCx().", cy: ".$gradient->getCy().",\n"; | ||
|  | 	echo "\tr: ".$gradient->getR().",\n"; | ||
|  | 	echo "\tfx: ".$gradient->getFx().", fy: ".$gradient->getFy().",\n"; | ||
|  | 	echo "\tcolors: [\n"; | ||
|  | 	 | ||
|  | 	$stops = $gradient->getStops(); | ||
|  | 	for ($i = 0; $i < count($stops)-1; $i++) { | ||
|  | 		echo "\t\t{offset: ".$stops[$i]->getOffset().", color: \"".$stops[$i]->getColor()."\"},\n"; | ||
|  | 	} | ||
|  | 	echo "\t\t{offset: ".$stops[count($stops)-1]->getOffset().", color: \"".$stops[count($stops)-1]->getColor()."\"}\n"; | ||
|  | 	echo "\t]\n"; | ||
|  | 	echo "};\n"; | ||
|  | } | ||
|  | 
 | ||
|  | //now, get all the paths
 | ||
|  | foreach ($paths as $path) { | ||
|  | 	echo "g.createPath({type: \"path\", path: \"".$path->getPath()."\"})"; | ||
|  | 	addFill($path); | ||
|  | 	addStroke($path); | ||
|  | 	addTransform($path); | ||
|  | 	echo ";\n"; | ||
|  | } | ||
|  | 
 | ||
|  | //and all rectangles
 | ||
|  | foreach ($rects as $rect) { | ||
|  | 	echo "g.createRect({type: \"rect\", x: ".$rect->getX().", y: ".$rect->getY().", height: ".$rect->getHeight().", width: ".$rect->getWidth().", r: ".$rect->getR()."})"; | ||
|  | 	addFill($rect); | ||
|  | 	addStroke($rect); | ||
|  | 	addTransform($rect); | ||
|  | 
 | ||
|  | 	echo ";\n"; | ||
|  | } | ||
|  | 
 | ||
|  | //and all circles
 | ||
|  | foreach ($circles as $circle) { | ||
|  | 	echo "g.createCircle({type: \"circle\", cx:".$circle->getCx().", cy:".$circle->getCy().", r: ".$circle->getR()."})"; | ||
|  | 	addFill($circle); | ||
|  | 	addStroke($circle); | ||
|  | 	addTransform($circle); | ||
|  | 
 | ||
|  | 	echo ";\n"; | ||
|  | } | ||
|  | 
 | ||
|  | //and all ellipses
 | ||
|  | foreach ($ellipses as $ellipse) { | ||
|  | 	echo "g.createEllipse({type: \"ellipse\", cx:".$ellipse->getCx().", cy:".$ellipse->getCy().", rx: ".$ellipse->getRx().", ry: ".$ellipse->getRy()."})"; | ||
|  | 	addFill($ellipse); | ||
|  | 	addStroke($ellipse); | ||
|  | 	addTransform($ellipse); | ||
|  | 
 | ||
|  | 	echo ";\n"; | ||
|  | } | ||
|  | 
 | ||
|  | //and all lines
 | ||
|  | foreach ($lines as $line) { | ||
|  | 	echo "g.createLine({type: \"line\", x1:".$line->getX1().", y1:".$line->getY1().", x2:".$line->getX2().", y2:".$line->getY2()."})"; | ||
|  | 	addStroke($line); | ||
|  | 	addTransform($line); | ||
|  | 	echo ";\n"; | ||
|  | } | ||
|  | 
 | ||
|  | //and all polylines
 | ||
|  | foreach ($polylines as $polyline) { | ||
|  | 	echo "//TODO - implement polylines\n"; | ||
|  | } | ||
|  | 
 | ||
|  | //and all texts
 | ||
|  | foreach ($texts as $text) { | ||
|  | 	echo "g.createText({type: \"text\", x: ".$text->getX().", y: ".$text->getY().", text: \"".$text->getText()."\", align: \"".$text->getTextAnchor()."\", decoration: \"".$text->getTextDecoration()."\"})"; | ||
|  | 	addFill($text); | ||
|  | 	addStroke($text); | ||
|  | 	addTransform($text); | ||
|  | 	echo ";\n"; | ||
|  | } | ||
|  | 
 | ||
|  | function addFont($shape) { | ||
|  | 	$putComma = false; | ||
|  | 
 | ||
|  | 	//get the font family, if available
 | ||
|  | 	$family = $shape->getStyle("font-family"); | ||
|  | 	if ($family != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setFont({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		echo "family: \"".$family."\""; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//get the font variant, if available
 | ||
|  | 	$variant = $shape->getStyle("font-variant"); | ||
|  | 	if ($variant != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setFont({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		echo "variant: \"".$variant."\""; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//get the font size, if available
 | ||
|  | 	$size = $shape->getStyle("font-size"); | ||
|  | 	if ($size != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setFont({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		echo "size: \"".$size."\""; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//get the font style, if available
 | ||
|  | 	$style = $shape->getStyle("font-style"); | ||
|  | 	if ($style != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setFont({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		echo "style: \"".$style."\""; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//get the font weight, if available
 | ||
|  | 	$weight = $shape->getStyle("font-weight"); | ||
|  | 	if ($weight != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setFont({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		echo "style: \"".$weight."\""; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if ($putComma) | ||
|  | 		echo "})"; | ||
|  | } | ||
|  | 
 | ||
|  | function addFill($shape) { | ||
|  | 	$fill = $shape->getStyle("fill"); | ||
|  | 	if ($fill == null) | ||
|  | 		return; | ||
|  | 
 | ||
|  | 	if (ereg("url\(.*\)", $fill)) { | ||
|  | 		$parts = split("[\(\)]", $fill); | ||
|  | 		$url = trim($parts[1], "#"); | ||
|  | 		echo ".setFill(gradient".$url.")"; | ||
|  | 	} else if (ereg("#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})", $fill)) { | ||
|  | 		echo ".setFill(\"".$fill."\")"; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | function addStroke($shape) { | ||
|  | 	$putComma = false; | ||
|  | 
 | ||
|  | 	//get the stroke width, if available
 | ||
|  | 	$width = $shape->getStyle("stroke-width"); | ||
|  | 	if ($width != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setStroke({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		$width = trim($width, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"); | ||
|  | 		echo "width: $width"; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//get the stroke color, if available
 | ||
|  | 	$color = $shape->getStyle("stroke"); | ||
|  | 	if ($color != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setStroke({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		echo "color: \"".$color."\""; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//get the stroke cap, if available
 | ||
|  | 	$cap = $shape->getStyle("stroke-linecap"); | ||
|  | 	if ($cap != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setStroke({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		echo "cap: \"$cap\"";
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//get the line join, if available
 | ||
|  | 	$join = $shape->getStyle("stroke-linejoin"); | ||
|  | 	if ($join != null) { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setStroke({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if ($join == "miter") | ||
|  | 			echo "join: 4"; | ||
|  | 		else | ||
|  | 			echo "join: \"$join\"";
 | ||
|  | 	} | ||
|  | 
 | ||
|  | 	//if any kind of dash is made in SVG, convert it to 'style: "Dash"' in dojox.gfx
 | ||
|  | 	$style = $shape->getStyle("stroke-dasharray"); | ||
|  | 	if ($style != null && $style != 'none') { | ||
|  | 		if ($putComma) | ||
|  | 			echo ","; | ||
|  | 		else { | ||
|  | 			echo ".setStroke({"; | ||
|  | 			$putComma = true; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		echo "style: \"Dash\""; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	if ($putComma) | ||
|  | 		echo "})"; | ||
|  | } | ||
|  | 
 | ||
|  | function addTransform($shape) { | ||
|  | 	//echo "\n==== transform:";
 | ||
|  | 	//var_dump($shape->getTransform());
 | ||
|  | 	$transform = $shape->getTransform(); | ||
|  | 	if (!$transform->isIdentity()) { | ||
|  | 		echo ".setTransform({xx:".$transform->getXx().", xy:".$transform->getXy().", dx:".$transform->getDx().", yy:".$transform->getYy().", yx:".$transform->getYx().", dy:".$transform->getDy()."})"; | ||
|  | 	} | ||
|  | } | ||
|  | 
 | ||
|  | ?>
 |