diff options
| author | Bob Jamison <ishmalius@gmail.com> | 2006-04-12 19:47:37 +0000 |
|---|---|---|
| committer | ishmal <ishmal@users.sourceforge.net> | 2006-04-12 19:47:37 +0000 |
| commit | 8e27c3045674406bbedd98021cbcda180d197c1a (patch) | |
| tree | aab0927c8dc4060c0ec951f83fb7052d0bbf0839 /src/extension/internal/odf.cpp | |
| parent | _desktop was not init'ed, sometimes leading to crashes on doubleclick (diff) | |
| download | inkscape-8e27c3045674406bbedd98021cbcda180d197c1a.tar.gz inkscape-8e27c3045674406bbedd98021cbcda180d197c1a.zip | |
WIP commit
(bzr r499)
Diffstat (limited to 'src/extension/internal/odf.cpp')
| -rw-r--r-- | src/extension/internal/odf.cpp | 250 |
1 files changed, 249 insertions, 1 deletions
diff --git a/src/extension/internal/odf.cpp b/src/extension/internal/odf.cpp index 5c07d89ee..97e58600d 100644 --- a/src/extension/internal/odf.cpp +++ b/src/extension/internal/odf.cpp @@ -43,10 +43,19 @@ #include "libnr/n-art-bpath.h" #include "extension/system.h" -#include "io/sys.h" +#include "xml/repr.h" +#include "xml/attribute-record.h" +#include <vector> + +#include "dom/dom.h" #include "dom/util/ziptool.h" + +//# Shorthand notation +typedef org::w3c::dom::DOMString DOMString; + + namespace Inkscape { namespace Extension @@ -55,10 +64,123 @@ namespace Internal { + + +class ImageInfo +{ +public: + + ImageInfo(const DOMString &nameArg, + const DOMString &newNameArg, + const std::vector<unsigned char> &bufArg) + { + name = nameArg; + newName = newNameArg; + buf = bufArg; + } + + virtual ~ImageInfo() + {} + + DOMString getName() + { + return name; + } + + DOMString getNewName() + { + return newName; + } + + + std::vector<unsigned char> getBuf() + { + return buf; + } + + DOMString name; + DOMString newName; + std::vector<unsigned char>buf; + +}; + + +class StyleInfo +{ +public: + + StyleInfo(const DOMString &nameArg, const DOMString &styleArg) + { + name = nameArg; + style = styleArg; + fill = "none"; + stroke = "none"; + } + + virtual ~StyleInfo() + {} + + DOMString getName() + { + return name; + } + + DOMString getCssStyle() + { + return cssStyle; + } + + DOMString getStroke() + { + return stroke; + } + + DOMString getStrokeColor() + { + return strokeColor; + } + + DOMString getStrokeWidth() + { + return strokeWidth; + } + + + DOMString getFill() + { + return fill; + } + + DOMString getFillColor() + { + return fillColor; + } + + DOMString name; + DOMString style; + DOMString cssStyle; + DOMString stroke; + DOMString strokeColor; + DOMString strokeWidth; + DOMString fill; + DOMString fillColor; + +}; + + //######################################################################## //# O U T P U T //######################################################################## +void OdfOutput::po(char *str) +{ + if (str) + while (*str) + outs.put(*str++); +} + + + /** * Make sure that we are in the database @@ -76,6 +198,129 @@ OdfOutput::check (Inkscape::Extension::Extension *module) +/** + * This function searches the Repr tree recursively from the given node, + * and adds refs to all nodes with the given name, to the result vector + */ +void +OdfOutput::preprocess(Inkscape::XML::Node *node) +{ + //Look for style values in the svg element + Inkscape::Util::List<Inkscape::XML::AttributeRecord const> attr = + node->attributeList(); + for ( ; attr ; ++attr) + { + DOMString attrName = (const char *)attr->key; + DOMString attrValue = (const char *)attr->value; + StyleInfo si(attrName, attrValue); + /* + if (styleTable.find(styleValue) != styleTable.end()) + { + g_message("duplicate style"); + } + else + { + char buf[16]; + snprintf(buf, 15, "style%d", styleIndex++); + std::string styleName = buf; + //Map from value-->name . Looks backwards, i know + styleTable[styleValue] = styleName; + g_message("mapping '%s' to '%s'", + styleValue.c_str(), styleName.c_str()); + } + */ + } + + + + for (Inkscape::XML::Node *child = node->firstChild() ; + child ; child = child->next()) + preprocess(child); +} + + +/** + * This function searches the Repr tree recursively from the given node, + * and adds refs to all nodes with the given name, to the result vector + */ +void +OdfOutput::preprocess(SPDocument *doc) +{ + styleTable.clear(); + styleIndex = 0; + preprocess(doc->rroot); + + outs.clear(); + + po("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); + po("<office:document-content\n"); + po(" xmlns:office=\"urn:oasis:names:tc:opendocument:xmlns:office:1.0\"\n"); + po(" xmlns:style=\"urn:oasis:names:tc:opendocument:xmlns:style:1.0\"\n"); + po(" xmlns:text=\"urn:oasis:names:tc:opendocument:xmlns:text:1.0\"\n"); + po(" xmlns:table=\"urn:oasis:names:tc:opendocument:xmlns:table:1.0\"\n"); + po(" xmlns:draw=\"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0\"\n"); + po(" xmlns:fo=\"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\"\n"); + po(" xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n"); + po(" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n"); + po(" xmlns:meta=\"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\"\n"); + po(" xmlns:number=\"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\"\n"); + po(" xmlns:presentation=\"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0\"\n"); + po(" xmlns:svg=\"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0\"\n"); + po(" xmlns:chart=\"urn:oasis:names:tc:opendocument:xmlns:chart:1.0\"\n"); + po(" xmlns:dr3d=\"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0\"\n"); + po(" xmlns:math=\"http://www.w3.org/1998/Math/MathML\"\n"); + po(" xmlns:form=\"urn:oasis:names:tc:opendocument:xmlns:form:1.0\"\n"); + po(" xmlns:script=\"urn:oasis:names:tc:opendocument:xmlns:script:1.0\"\n"); + po(" xmlns:ooo=\"http://openoffice.org/2004/office\"\n"); + po(" xmlns:ooow=\"http://openoffice.org/2004/writer\"\n"); + po(" xmlns:oooc=\"http://openoffice.org/2004/calc\"\n"); + po(" xmlns:dom=\"http://www.w3.org/2001/xml-events\"\n"); + po(" xmlns:xforms=\"http://www.w3.org/2002/xforms\"\n"); + po(" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n"); + po(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n"); + po(" xmlns:smil=\"urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0\"\n"); + po(" xmlns:anim=\"urn:oasis:names:tc:opendocument:xmlns:animation:1.0\"\n"); + po(" office:version=\"1.0\">\n"); + po("\n"); + po("\n"); + po("<office:scripts/>\n"); + po("<office:automatic-styles>\n"); + po("<style:style style:name=\"dp1\" style:family=\"drawing-page\"/>\n"); + po("<style:style style:name=\"grx1\" style:family=\"graphic\" style:parent-style-name=\"standard\">\n"); + po(" <style:graphic-properties draw:stroke=\"none\" draw:fill=\"solid\" draw:textarea-horizontal-align=\"center\" draw:textarea-vertical-align=\"middle\" draw:color-mode=\"standard\" draw:luminance=\"0%\" draw:contrast=\"0%\" draw:gamma=\"100%\" draw:red=\"0%\" draw:green=\"0%\" draw:blue=\"0%\" fo:clip=\"rect(0cm 0cm 0cm 0cm)\" draw:image-opacity=\"100%\" style:mirror=\"none\"/>\n"); + po("</style:style>\n"); + po("<style:style style:name=\"P1\" style:family=\"paragraph\">\n"); + po(" <style:paragraph-properties fo:text-align=\"center\"/>\n"); + po("</style:style>\n"); + + //## Dump our style table + /* + std::map<std::string, std::string>::iterator iter; + for (iter = styleTable.begin() ; iter != styleTable.end() ; iter++) + { + po("<style:style style:name=\"%s\"", iter->second); + po(" style:family=\"graphic\" style:parent-style-name=\"standard\">\n"); + po(" <style:graphic-properties"); + po(" draw:fill=\"" + s.getFill() + "\""); + if (!s.getFill().equals("none")) + po(" draw:fill-color=\"" + s.getFillColor() + "\""); + po(" draw:stroke=\"" + s.getStroke() + "\""); + if (!s.getStroke().equals("none")) + { + po(" svg:stroke-width=\"" + s.getStrokeWidth() + "\""); + po(" svg:stroke-color=\"" + s.getStrokeColor() + "\""); + } + po("/>\n"); + po("</style:style>\n"); + } + */ + po("</office:automatic-styles>\n"); + po("\n"); + +} + + + /** * This function searches the Repr tree recursively from the given node, @@ -103,6 +348,9 @@ findElementsByTagName(std::vector<Inkscape::XML::Node *> &results, void OdfOutput::save(Inkscape::Extension::Output *mod, SPDocument *doc, gchar const *uri) { + //# Preprocess the style entries. ODF does not put styles + //# directly on elements. Rather, it uses class IDs. + preprocess(doc); ZipFile zipFile; zipFile.writeFile(uri); } |
