Code

Rearrange to enable code that does not directly rely on lcms.
[inkscape.git] / src / dom / svgreader.cpp
index 7ebde97aededa5a38a6bd1674a898b396bd5989b..ea4392f50fb494f0b1c0745956421690677dab03 100644 (file)
@@ -40,7 +40,6 @@
 
 #include <stdarg.h>
 
-#define SVG_NAMESPACE "http://www.w3.org/2000/svg"
 
 namespace org
 {
@@ -60,10 +59,10 @@ namespace svg
 /**
  *
  */
-void SvgReader::error(char const *fmt, ...)
+void SVGReader::error(char const *fmt, ...)
 {
     va_list args;
-    fprintf(stderr, "SvgReader:error:");
+    fprintf(stderr, "SVGReader:error: ");
     va_start(args, fmt);
     vfprintf(stderr, fmt, args);
     va_end(args) ;
@@ -71,15 +70,31 @@ void SvgReader::error(char const *fmt, ...)
 }
 
 
+/**
+ *
+ */
+void SVGReader::trace(char const *fmt, ...)
+{
+    va_list args;
+    fprintf(stdout, "SVGReader: ");
+    va_start(args, fmt);
+    vfprintf(stdout, fmt, args);
+    va_end(args) ;
+    fprintf(stdout, "\n");
+}
+
+
 
 //#########################################################################
 //# P A R S I N G
 //#########################################################################
 
+
+
 /**
  *  Get the character at the position and record the fact
  */
-XMLCh SvgReader::get(int p)
+XMLCh SVGReader::get(int p)
 {
     if (p >= parselen)
         return 0;
@@ -95,7 +110,7 @@ XMLCh SvgReader::get(int p)
  *  Test if the given substring exists at the given position
  *  in parsebuf.  Use get() in case of out-of-bounds
  */
-bool SvgReader::match(int pos, char const *str)
+bool SVGReader::match(int pos, char const *str)
 {
     while (*str)
        {
@@ -108,7 +123,7 @@ bool SvgReader::match(int pos, char const *str)
 /**
  *
  */
-int SvgReader::skipwhite(int p)
+int SVGReader::skipwhite(int p)
 {
   while (p < parselen)
     {
@@ -168,7 +183,7 @@ int SvgReader::skipwhite(int p)
 /**
  * get a word from the buffer
  */
-int SvgReader::getWord(int p, DOMString &result)
+int SVGReader::getWord(int p, DOMString &result)
 {
     XMLCh ch = get(p);
     if (!uni_is_letter(ch))
@@ -201,7 +216,7 @@ int SvgReader::getWord(int p, DOMString &result)
 /**
  * get a word from the buffer
  */
-int SvgReader::getNumber(int p0, double &result)
+int SVGReader::getNumber(int p0, double &result)
 {
     int p=p0;
 
@@ -255,7 +270,7 @@ int SvgReader::getNumber(int p0, double &result)
 /**
  * get a word from the buffer
  */
-int SvgReader::getNumber(int p0, double &result)
+int SVGReader::getNumber(int p0, double &result)
 {
     int p=p0;
 
@@ -284,7 +299,7 @@ int SvgReader::getNumber(int p0, double &result)
 }
 
 
-bool SvgReader::parseTransform(const DOMString &str)
+bool SVGReader::parseTransform(const DOMString &str)
 {
     parsebuf = str;
     parselen = str.size();
@@ -599,10 +614,15 @@ bool SvgReader::parseTransform(const DOMString &str)
 /**
  *
  */
-bool SvgReader::parseElement(SVGElementImplPtr parent,
+bool SVGReader::parseElement(SVGElementImplPtr parent,
                              ElementImplPtr sourceElem)
 {
-    if (!parent || !sourceElem)
+    if (!parent)
+        {
+        error("NULL dest element");
+        return false;
+        }
+    if (!sourceElem)
         {
         error("NULL source element");
         return false;
@@ -612,96 +632,19 @@ bool SvgReader::parseElement(SVGElementImplPtr parent,
     //printf("namespaceURI:%s\n", namespaceURI.c_str());
     DOMString tagName      = sourceElem->getTagName();
     printf("tag name:%s\n", tagName.c_str());
-
-    ElementImplPtr newElement = NULL;
-    if (namespaceURI != SVG_NAMESPACE)
-        {
-        newElement = new SVGSVGElementImpl();
-        newElement->assign(*sourceElem);
-        parent->appendChild(newElement);
-        }
-    else //## SVG!!
+    ElementPtr newElement = doc->createElementNS(namespaceURI, tagName);
+    if (!newElement)
         {
+               return false;
+               }
+       NamedNodeMap &attrs = sourceElem->getAttributes();
+       for (unsigned int i=0 ; i<attrs.getLength() ; i++)
+           {
+           NodePtr n = attrs.item(i);
+           newElement->setAttribute(n->getNodeName(), n->getNodeValue());//should be exception here
+               }
+       parent->appendChild(newElement);
 
-        //####################################################
-        //## ATTRIBUTES
-        //####################################################
-        DOMString style = sourceElem->getAttribute("style");
-        if (style.size() > 0)
-            {
-            css::CssParser parser;
-            style.insert(0, "{");
-            style.append("}");
-            //printf("CSS:%s\n", style.c_str());
-            if (!parser.parse(style))
-                {
-                error("parsing style attribute");
-                }
-            else
-                {
-                //printf("##parsed!\n");
-                }
-            }
-
-        DOMString transform = sourceElem->getAttribute("transform");
-        if (transform.size() > 0)
-            {
-            if (!parseTransform(transform))
-                {
-                error("parsing transform attribute");
-                }
-            else
-                {
-                //printf("##parsed!\n");
-                }
-            }
-
-        //####################################################
-        //## ELEMENT - SPECIFIC
-        //####################################################
-        if (tagName == "svg")
-            {
-            newElement = new SVGSVGElementImpl();
-            newElement->assign(*sourceElem);
-            parent->appendChild(newElement);
-            }
-        else if (tagName == "title")
-            {
-            newElement = new SVGTitleElementImpl();
-            newElement->assign(*sourceElem);
-            parent->appendChild(newElement);
-            }
-        else if (tagName == "desc")
-            {
-            newElement = new SVGDescElementImpl();
-            newElement->assign(*sourceElem);
-            parent->appendChild(newElement);
-            }
-        else if (tagName == "defs")
-            {
-            newElement = new SVGDefsElementImpl();
-            newElement->assign(*sourceElem);
-            parent->appendChild(newElement);
-            }
-        else if (tagName == "style")
-            {
-            newElement = new SVGStyleElementImpl();
-            newElement->assign(*sourceElem);
-            parent->appendChild(newElement);
-            }
-        else if (tagName == "g")
-            {
-            newElement = new SVGGElementImpl();
-            newElement->assign(*sourceElem);
-            parent->appendChild(newElement);
-            }
-        else if (tagName == "path")
-            {
-            newElement = new SVGPathElementImpl();
-            newElement->assign(*sourceElem);
-            parent->appendChild(newElement);
-            }
-        }
 
     NodeList children = sourceElem->getChildNodes();
     int nodeCount = children.getLength();
@@ -732,7 +675,7 @@ bool SvgReader::parseElement(SVGElementImplPtr parent,
 /**
  *
  */
-SVGDocumentPtr SvgReader::parse(const DocumentPtr src)
+SVGDocumentPtr SVGReader::parse(const DocumentPtr src)
 {
     if (!src)
         {
@@ -743,8 +686,8 @@ SVGDocumentPtr SvgReader::parse(const DocumentPtr src)
     DOMImplementationImpl impl;
     doc = new SVGDocumentImpl(&impl, SVG_NAMESPACE, "svg" , NULL);
 
-    SVGElementImplPtr destElem = dynamic_cast<SVGElementImpl *>(doc->getRootElement().get());
-    ElementImplPtr    srcElem  = dynamic_cast<ElementImpl *>(src->getDocumentElement().get());
+    SVGElementImplPtr destElem = dynamic_pointer_cast<SVGElementImpl, SVGElement>(doc->getRootElement());
+    ElementImplPtr    srcElem  = dynamic_pointer_cast<ElementImpl, Element>(src->getDocumentElement());
     if (!parseElement(destElem, srcElem))
         {
         return NULL;
@@ -758,7 +701,7 @@ SVGDocumentPtr SvgReader::parse(const DocumentPtr src)
 /**
  *
  */
-SVGDocumentPtr SvgReader::parse(const DOMString &buf)
+SVGDocumentPtr SVGReader::parse(const DOMString &buf)
 {
     /* remember, smartptrs are null-testable*/
     SVGDocumentPtr svgdoc;
@@ -777,7 +720,7 @@ SVGDocumentPtr SvgReader::parse(const DOMString &buf)
 /**
  *
  */
-SVGDocumentPtr SvgReader::parseFile(const DOMString &fileName)
+SVGDocumentPtr SVGReader::parseFile(const DOMString &fileName)
 {
     /* remember, smartptrs are null-testable*/
     SVGDocumentPtr svgdoc;
@@ -785,6 +728,7 @@ SVGDocumentPtr SvgReader::parseFile(const DOMString &fileName)
     DocumentPtr doc = parser.parseFile(fileName);
     if (!doc)
         {
+        error("Could not load xml doc");
         return svgdoc;
         }
     svgdoc = parse(doc);