Hi Gabriela, attached is a patch that reorganises the ODF world to be more like the way Word documents are processed.
I changed to the top level from operations to use an ODFGet. Which in turn
uses an ODFConverter. The heart of the ODFGet function is
ODFConverter *converter =
ODFConverterNew(html,abstractStorage,package,idPrefix);
//Get the styles data
//CSSSheetRelease(converter->styleSheet);
converter->styleSheet = ODFParseStyles(converter);
//Convert the content.xml to an html beastie
ODFTextGet(converter);
char *cssText = CSSSheetCopyCSSText(converter->styleSheet);
HTMLAddInternalStyleSheet(converter->html, cssText);
HTML_safeIndent(converter->html->docNode,0);
Which parses for styles as I did before ( so still needs some work).
Then calls an edited ODFTextGet - which is much as it was.
The code has just been twisted around to match the structure of the word
world.
Which means I can't help thinking that we could/should abstract out the
common aspects of converters.
It converts the headers.odt document to an html which shows the headers ok.
I also attached my version of headers.odt since I changed some of the
styles to try and emphasize their differences.
I hope it makes sense to you and that your patch tool can digest it.
--
Cheers,
Ian C
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 655fe6b..55b7843 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -63,4 +63,4 @@ add_subdirectory(DocFormats)
add_subdirectory(consumers/dftest/src)
add_subdirectory(consumers/dfconvert/src)
add_subdirectory(consumers/dfutil/src)
-add_subdirectory(consumers/corinthia/src)
+#add_subdirectory(consumers/corinthia/src)
diff --git a/DocFormats/api/src/Operations.c b/DocFormats/api/src/Operations.c
index f605ad8..5b71d50 100644
--- a/DocFormats/api/src/Operations.c
+++ b/DocFormats/api/src/Operations.c
@@ -21,7 +21,7 @@
#include "DFString.h"
#include <DocFormats/DFStorage.h>
#include "Word.h"
-#include "ODFText.h"
+#include "ODF.h"
#include "DFHTML.h"
#include "DFDOM.h"
#include "DFXML.h"
@@ -242,10 +242,10 @@ int DFGet(DFConcreteDocument *concrete,
error);
break;
case DFFileFormatOdt:
- htmlDoc = ODFTextGet(concrete->storage,
- abstract->storage,
- idPrefix,
- error);
+ htmlDoc = ODFGet(concrete->storage,
+ abstract->storage,
+ idPrefix,
+ error);
break;
default:
DFErrorFormat(error,"Unsupported file format");
@@ -308,11 +308,11 @@ int DFPut(DFConcreteDocument *concreteDoc,
error);
break;
case DFFileFormatOdt:
- ok = ODFTextPut(concreteDoc->storage,
- abstractDoc->storage,
- abstractDoc->htmlDoc,
- idPrefix,
- error);
+ ok = ODFPut(concreteDoc->storage,
+ abstractDoc->storage,
+ abstractDoc->htmlDoc,
+ idPrefix,
+ error);
break;
default:
DFErrorFormat(error,"Unsupported file format");
@@ -340,7 +340,7 @@ int DFCreate(DFConcreteDocument *concreteDoc,
error);
break;
case DFFileFormatOdt:
- ok = ODFTextCreate(concreteDoc->storage,
+ ok = ODFCreate(concreteDoc->storage,
abstractDoc->storage,
abstractDoc->htmlDoc,
error);
diff --git a/DocFormats/filters/odf/CMakeLists.txt
b/DocFormats/filters/odf/CMakeLists.txt
index 521b915..72153aa 100644
--- a/DocFormats/filters/odf/CMakeLists.txt
+++ b/DocFormats/filters/odf/CMakeLists.txt
@@ -22,6 +22,10 @@ set(GroupSrc
src/ODFManifest.h
src/ODFPackage.c
src/ODFPackage.h
+ src/ODFConverter.c
+ src/ODFConverter.h
+ src/ODFStyles.c
+ src/ODFStyles.h
src/ODFSheet.c
src/ODFSheet.h)
diff --git a/DocFormats/filters/odf/src/ODF.c b/DocFormats/filters/odf/src/ODF.c
index f2091de..aea9176 100644
--- a/DocFormats/filters/odf/src/ODF.c
+++ b/DocFormats/filters/odf/src/ODF.c
@@ -18,3 +18,49 @@
#include "DFPlatform.h"
#include "ODF.h"
#include "DFCommon.h"
+#include "ODFConverter.h"
+
+#include <stdio.h>
+
+DFDocument *ODFGet(DFStorage *concreteStorage, DFStorage *abstractStorage,
const char *idPrefix, DFError **error)
+{
+ int ok = 0;
+ DFDocument *html = NULL;
+ ODFPackage *package = NULL;
+
+
+ ODFConverter *conv = NULL;
+
+ printf("ODFGet\n");
+
+ package = ODFPackageOpenFrom(concreteStorage, error);
+ if (package == NULL)
+ goto end;
+
+ printf("ODFGet\n");
+ html = DFDocumentNewWithRoot(HTML_HTML);
+
+ if(ODFConverterGet(html, abstractStorage, package, idPrefix, error) == 0)
+ goto end;
+
+ ok = 1;
+
+end:
+ ODFPackageRelease(package);
+ if (!ok) {
+ DFDocumentRelease(html);
+ return NULL;
+ }
+ return html;
+}
+
+int ODFPut(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument
*htmlDoc, const char *idPrefix, DFError **error)
+{
+ //TBD
+}
+
+int ODFCreate(DFStorage *concreteStorage, DFStorage *abstractStorage,
DFDocument *htmlDoc, DFError **error)
+{
+ //TBD
+
+}
\ No newline at end of file
diff --git a/DocFormats/filters/odf/src/ODF.h b/DocFormats/filters/odf/src/ODF.h
index b9afb52..e5ee24c 100644
--- a/DocFormats/filters/odf/src/ODF.h
+++ b/DocFormats/filters/odf/src/ODF.h
@@ -18,6 +18,14 @@
#ifndef DocFormats_ODF_h
#define DocFormats_ODF_h
+#include <DocFormats/DFError.h>
+#include <DocFormats/DFStorage.h>
+
#include "ODFPackage.h"
+DFDocument *ODFGet(DFStorage *concreteStorage, DFStorage *abstractStorage,
const char *idPrefix, DFError **error);
+int ODFPut(DFStorage *concreteStorage, DFStorage *abstractStorage, DFDocument
*htmlDoc, const char *idPrefix, DFError **error);
+int ODFCreate(DFStorage *concreteStorage, DFStorage *abstractStorage,
DFDocument *htmlDoc, DFError **error);
+
+
#endif
diff --git a/DocFormats/filters/odf/src/ODFPackage.c
b/DocFormats/filters/odf/src/ODFPackage.c
index 3507586..e559c3c 100644
--- a/DocFormats/filters/odf/src/ODFPackage.c
+++ b/DocFormats/filters/odf/src/ODFPackage.c
@@ -93,9 +93,6 @@ ODFPackage *ODFPackageOpenNew(DFStorage *storage, DFError
**error)
ODFManifestAddEntry(package->manifest,"settings.xml","text/xml",NULL);
ODFManifestAddEntry(package->manifest,"styles.xml","text/xml",NULL);
- // Setup ODF objects
- package->sheet = ODFSheetNew(package->stylesDoc,package->contentDoc);
-
return package;
}
@@ -106,21 +103,28 @@ ODFPackage *ODFPackageOpenFrom(DFStorage *storage,
DFError **error)
package->storage = DFStorageRetain(storage);
// Read XML documents
- if ((package->contentDoc = readDocument(package,"content.xml",error)) ==
NULL)
+ if ((package->contentDoc = readDocument(package,"content.xml",error)) ==
NULL) {
+ DFErrorFormat(error,"Unable to read content.xml");
goto end;
- if ((package->metaDoc = readDocument(package,"meta.xml",error)) == NULL)
+ }
+ if ((package->metaDoc = readDocument(package,"meta.xml",error)) == NULL) {
+ DFErrorFormat(error,"Unable to read meta.xml");
goto end;
- if ((package->settingsDoc = readDocument(package,"settings.xml",error)) ==
NULL)
+ }
+ if ((package->settingsDoc = readDocument(package,"settings.xml",error)) ==
NULL) {
+ DFErrorFormat(error,"Unable to read settings.xml");
goto end;
- if ((package->stylesDoc = readDocument(package,"styles.xml",error)) ==
NULL)
+ }
+ if ((package->stylesDoc = readDocument(package,"styles.xml",error)) ==
NULL) {
+ DFErrorFormat(error,"Unable to read styles.xml");
goto end;
+ }
// Read manifest
- if ((package->manifest = readManifest(package,error)) == NULL)
+ if ((package->manifest = readManifest(package,error)) == NULL) {
+ DFErrorFormat(error,"Unable to read manifest.xml");
goto end;
-
- // Setup ODF objects
- package->sheet = ODFSheetNew(package->stylesDoc,package->contentDoc);
+ }
return package;
@@ -143,7 +147,6 @@ void ODFPackageRelease(ODFPackage *package)
DFStorageRelease(package->storage);
ODFManifestRelease(package->manifest);
- ODFSheetRelease(package->sheet);
DFDocumentRelease(package->contentDoc);
DFDocumentRelease(package->metaDoc);
DFDocumentRelease(package->settingsDoc);
diff --git a/DocFormats/filters/odf/src/ODFPackage.h
b/DocFormats/filters/odf/src/ODFPackage.h
index e56ebc2..3db01b6 100644
--- a/DocFormats/filters/odf/src/ODFPackage.h
+++ b/DocFormats/filters/odf/src/ODFPackage.h
@@ -22,7 +22,6 @@
#include <DocFormats/DFError.h>
#include <DocFormats/DFStorage.h>
#include "ODFManifest.h"
-#include "ODFSheet.h"
typedef struct ODFPackage ODFPackage;
@@ -34,7 +33,7 @@ struct ODFPackage {
DFDocument *settingsDoc;
DFDocument *stylesDoc;
ODFManifest *manifest;
- ODFSheet *sheet;
+
};
ODFPackage *ODFPackageOpenNew(DFStorage *storage, DFError **error);
diff --git a/DocFormats/filters/odf/src/ODFSheet.c
b/DocFormats/filters/odf/src/ODFSheet.c
index c2ea092..609bca5 100644
--- a/DocFormats/filters/odf/src/ODFSheet.c
+++ b/DocFormats/filters/odf/src/ODFSheet.c
@@ -24,35 +24,6 @@
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
-// ODFStyle
//
-//
//
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-ODFStyle *ODFStyleNew()
-{
- ODFStyle *style = (ODFStyle *)xcalloc(1,sizeof(ODFStyle));
- style->retainCount = 1;
- return style;
-}
-
-ODFStyle *ODFStyleRetain(ODFStyle *style)
-{
- if (style != NULL)
- style->retainCount++;
- return style;
-}
-
-void ODFStyleRelease(ODFStyle *style)
-{
- if ((style == NULL) || (--style->retainCount > 0))
- return;
-
- free(style->selector);
- free(style);
-}
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-//
//
// ODFSheet
//
//
//
////////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/DocFormats/filters/odf/src/ODFSheet.h
b/DocFormats/filters/odf/src/ODFSheet.h
index eee9697..faeb00c 100644
--- a/DocFormats/filters/odf/src/ODFSheet.h
+++ b/DocFormats/filters/odf/src/ODFSheet.h
@@ -20,24 +20,7 @@
#include <DocFormats/DFXMLForward.h>
#include "DFTypes.h"
-
-////////////////////////////////////////////////////////////////////////////////////////////////////
-//
//
-// ODFStyle
//
-//
//
-////////////////////////////////////////////////////////////////////////////////////////////////////
-
-typedef struct ODFStyle ODFStyle;
-
-struct ODFStyle {
- size_t retainCount;
- DFNode *element;
- char *selector;
-};
-
-ODFStyle *ODFStyleNew();
-ODFStyle *ODFStyleRetain(ODFStyle *style);
-void ODFStyleRelease(ODFStyle *style);
+#include "ODFStyles.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
//
//
diff --git a/DocFormats/filters/odf/src/text/ODFText.c
b/DocFormats/filters/odf/src/text/ODFText.c
index 4ef0068..ebfb531 100644
--- a/DocFormats/filters/odf/src/text/ODFText.c
+++ b/DocFormats/filters/odf/src/text/ODFText.c
@@ -21,6 +21,9 @@
#include "ODFPackage.h"
#include "ODFTextConverter.h"
#include "DFDOM.h"
+#include "DFHTML.h"
+#include "DFHTMLNormalization.h"
+#include "CSS.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -36,13 +39,13 @@ typedef struct {
} ODFPutData;
// I'm not sure what ODFTextConverter ise used here for.
-static void traverseContent(ODFTextConverter *conv, DFNode *odfNode, DFNode
*htmlNode)
+static void traverseContent(ODFConverter *conv, DFNode *odfNode, DFNode
*htmlNode)
{
for (DFNode *odfChild = odfNode->first; odfChild != NULL; odfChild =
odfChild->next) {
if (odfChild->tag == DOM_TEXT) { // we have some text or a text
modfier here.
// DFNode *check =
- DFCreateChildTextNode(htmlNode, odfChild->value);
+// DFCreateChildTextNode(htmlNode, odfChild->value);
printf(YELLOW "DOM_TEXT: %s \n" RESET,
odfChild->value
);
@@ -70,8 +73,33 @@ static void traverseContent(ODFTextConverter *conv, DFNode
*odfNode, DFNode *htm
// DFNode *newChild = DFCreateChildElement(htmlNode, newTag);
}
else {
- DFCreateChildElement(htmlNode, newTag);
- }
+ //what do we have here
+
+ DFNode *node = NULL;
+ const char * styleName =
DFGetAttribute(odfChild,TEXT_STYLE_NAME);
+ const char * outlevel =
DFGetAttribute(odfChild,TEXT_OUTLINE_LEVEL);
+ if(outlevel != NULL) {
+ int s_val = atoi(&outlevel[strlen(outlevel)-1]) - 1;
+ //if (s_val >= 0 && s_val < 6) {
+ // HTML_H1 + s_val;
+ //}
+ node = DFCreateChildElement(htmlNode, HTML_H1 + s_val);
+ } else {
+ node = DFCreateChildElement(htmlNode, HTML_P);
+ }
+ printf("Found style name %s\n", styleName);
+ DFSetAttribute(node, HTML_CLASS, styleName);
//DFGetAttribute(odfNode,TEXT_STYLE_NAME));
+ for (DFNode *domChild = odfChild->first; domChild != NULL;
domChild = domChild->next)
+ {
+ if (domChild->tag == DOM_TEXT) { // we have some text or a
text modfier here.
+ // DFNode *check =
+ DFCreateChildTextNode(node, domChild->value);
+ printf(YELLOW "DOM_TEXT: %s \n" RESET,
+ domChild->value
+ );
+ }
+ }
+ }
}
traverseContent(conv,odfChild,htmlNode);
}
@@ -81,40 +109,29 @@ static void traverseContent(ODFTextConverter *conv, DFNode
*odfNode, DFNode *htm
// split it up into several functions
}
-DFDocument *ODFTextGet(DFStorage *concreteStorage, DFStorage *abstractStorage,
const char *idPrefix, DFError **error)
+DFDocument *ODFTextGet(ODFConverter *converter)
{
- int ok = 0;
- DFDocument *html = NULL;
- ODFPackage *package = NULL;
- ODFTextConverter *conv = NULL;
- DFNode *body = NULL;
-
- package = ODFPackageOpenFrom(concreteStorage, error);
- if (package == NULL)
- goto end;
-
- html = DFDocumentNewWithRoot(HTML_HTML);
- body = DFCreateChildElement(html->root, HTML_BODY);
- conv = ODFTextConverterNew(html, abstractStorage, package, idPrefix);
+ print_line(2);
+ print_line(2);
+ print_line(2);
printf(YELLOW
"============================================================\n"
- "Showing ODF nodes prior to the traverseContent function\n"
+ "Showing ODF content nodes prior to the traverseContent function\n"
"============================================================\n"
RESET);
- show_nodes(package->contentDoc->root);
-
+ show_nodes(converter->package->contentDoc->root, 0);
print_line(2);
print_line(2);
print_line(2);
+
// TODO: Traverse the DOM tree of package->contentDoc, adding elements to
the HTML document.
// contentDoc is loaded from content.xml, and represents the most
important information in
// the document, i.e. the text, tables, lists, etc.
- traverseContent(conv, package->contentDoc->root, body);
-
+ traverseContent(converter, converter->package->contentDoc->root,
converter->body);
// uncomment to see the result. (spammy!)
printf(GREEN
"============================================================\n"
@@ -122,7 +139,7 @@ DFDocument *ODFTextGet(DFStorage *concreteStorage,
DFStorage *abstractStorage, c
"============================================================\n"
RESET);
- show_nodes(body);
+ show_nodes(converter->body, 0);
// TODO: Once this basic traversal is implemented and is capable of
producing paragraphs,
@@ -136,17 +153,6 @@ DFDocument *ODFTextGet(DFStorage *concreteStorage,
DFStorage *abstractStorage, c
//
// See WordConverterCreateAbstract and WordConverterGetConcrete for how
this is done in the
// Word filter.
-
- ok = 1;
-
- end:
- ODFPackageRelease(package);
- ODFTextConverterRelease(conv);
- if (!ok) {
- DFDocumentRelease(html);
- return NULL;
- }
- return html;
}
int ODFTextPut(DFStorage *concreteStorage, DFStorage *abstractStorage,
DFDocument *htmlDoc, const char *idPrefix, DFError **error)
diff --git a/DocFormats/filters/odf/src/text/ODFText.h
b/DocFormats/filters/odf/src/text/ODFText.h
index 70486ab..a69779d 100644
--- a/DocFormats/filters/odf/src/text/ODFText.h
+++ b/DocFormats/filters/odf/src/text/ODFText.h
@@ -22,7 +22,9 @@
#include <DocFormats/DFStorage.h>
#include <DocFormats/DFXMLForward.h>
-DFDocument *ODFTextGet(DFStorage *concreteStorage, DFStorage *abstractStorage,
const char *idPrefix, DFError **error);
+#include "ODFConverter.h"
+
+DFDocument *ODFTextGet(ODFConverter *converter);
int ODFTextPut(DFStorage *concreteStorage, DFStorage *abstractStorage,
DFDocument *htmlDoc, const char *idPrefix, DFError **error);
int ODFTextCreate(DFStorage *concreteStorage, DFStorage *abstractStorage,
DFDocument *htmlDoc, DFError **error);
diff --git a/DocFormats/filters/odf/src/text/gbg_test.c
b/DocFormats/filters/odf/src/text/gbg_test.c
index fae6c42..79afde8 100644
--- a/DocFormats/filters/odf/src/text/gbg_test.c
+++ b/DocFormats/filters/odf/src/text/gbg_test.c
@@ -3,6 +3,9 @@
#include "ODFPackage.h"
#include "ODFTextConverter.h"
#include "DFDOM.h"
+
+#include "CSS.h"
+#include "CSSSheet.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
@@ -189,11 +192,144 @@ Tag find_HTML(DFNode *odfNode, DFNode *htmlNode)
/**
* Dev tool: List all the nodes following the given one.
*/
-void show_nodes(DFNode *odfNode)
+void show_nodes(DFNode *odfNode, int level)
+{
+ printf("Level: %d\n",level);
+ level++;
+ print_node_info(odfNode);
+ for (DFNode *odfChild = odfNode->first; odfChild != NULL; odfChild =
odfChild->next) {
+ walkChildren(odfChild, level);
+ }
+}
+
+/**
+ * Dev tool: List all the nodes following the given one.
+ */
+void walkChildren(DFNode *odfNode, int level)
{
+ printf("Level: %d\n",level);
+ level++;
+ print_node_info(odfNode);
for (DFNode *odfChild = odfNode->first; odfChild != NULL; odfChild =
odfChild->next) {
- print_node_info(odfChild);
- print_line(0);
+ walkChildren(odfChild, level);
+ }
+}
+
+/**
+ * Dev tool: List all the nodes below the given one.
+ */
+/*void show_nodes(DFNode *odfNode, int level)
+{
+ DFNode *nextNode = odfNode;
+ do {
+ print_node_info(nextNode);
+ nextNode = DFNextNode(nextNode);
+ }while(nextNode != NULL);
+}*/
+
+//give me the styles document
+void buildCSS_Styles(CSSSheet * cssSheet, DFNode *odfNode)
+{
+ //walk through the nodes
+ // go to the office:styles can we find it?
+ //iterate each style:style
+ // make a css
+ // dip down to get its attributes
+ printf("buildCSS_Styles\n");
+ printf("name = %s\n", translateXMLEnumName[odfNode->tag]);
+
+ //manually play with the functions first
+
+
+/* CSSStyle* cssStyle = CSSSheetLookupElement(cssSheet,
+ "elementName",
+ "className",
+ 1,
+ 0);
+ CSSProperties * localproperties = CSSStyleRule(cssStyle);
+ CSSPut(localproperties,"font-weight","bold");*/
+
+
+
+ for (DFNode *odfChild = odfNode->first; odfChild != NULL; odfChild =
odfChild->next)
+ {
+ if(odfChild->tag == OFFICE_STYLES)
+ {
+ printf("Processing office styles\n");
+ for (DFNode *styleNode = odfChild->first; styleNode != NULL;
styleNode = styleNode->next)
+ {
+ if(styleNode->tag == STYLE_STYLE)
+ {
+ for (unsigned int i = 0; i < styleNode->attrsCount; i++)
+ {
+ Tag t = styleNode->attrs[i].tag;
+ if(t == STYLE_NAME)
+ {
+ printf("Create CSS Properties for %s\n",
styleNode->attrs[i].value);
+
+ //if this is a heading look for the
TEXT_OUTLINE_LEVEL
+
+ // use the attrbute fetch thing...
+ const char* outlevel = DFGetAttribute(styleNode,
STYLE_DEFAULT_OUTLINE_LEVEL);
+ CSSStyle* cssStyle = NULL;
+ if(outlevel != NULL) {
+ char hlevel[4] = "h";
+ hlevel[1] = outlevel[0];
+ hlevel[2] = 0;
+
+ cssStyle = CSSSheetLookupElement(cssSheet,
+
hlevel,
+
styleNode->attrs[i].value,
+ 1,
+ 0);
+ } else {
+ cssStyle = CSSSheetLookupElement(cssSheet,
+ "div",
+
styleNode->attrs[i].value,
+ 1,
+ 0);
+ }
+ for (DFNode *styleInfo = styleNode->first;
styleInfo != NULL; styleInfo = styleInfo->next)
+ {
+ if(styleInfo->tag == STYLE_TEXT_PROPERTIES)
+ {
+ //just looking for bolds as a first cut
+ for (unsigned int i = 0; i <
styleInfo->attrsCount; i++)
+ {
+ Tag t = styleInfo->attrs[i].tag;
+ switch(t)
+ {
+ case FO_FONT_WEIGHT:
+ {
+ CSSProperties *
localproperties = CSSStyleRule(cssStyle);
+
CSSPut(localproperties,"font-weight",styleInfo->attrs[i].value);
+ break;
+ }
+ case FO_FONT_SIZE:
+ {
+ CSSProperties *
localproperties = CSSStyleRule(cssStyle);
+
CSSPut(localproperties,"font-size",styleInfo->attrs[i].value);
+ break;
+ }
+ case STYLE_FONT_NAME:
+ {
+ CSSProperties *
localproperties = CSSStyleRule(cssStyle);
+
CSSPut(localproperties,"font-family",styleInfo->attrs[i].value);
+ break;
+ }
+ }
+ }
+ }
+ else if(styleInfo->tag ==
STYLE_PARAGRAPH_PROPERTIES)
+ {
+ //TBD
+ }
+ }
+ }
+ }
+ }
+ }
+ }
}
}
diff --git a/DocFormats/filters/odf/src/text/gbg_test.h
b/DocFormats/filters/odf/src/text/gbg_test.h
index 636165f..3645c8e 100644
--- a/DocFormats/filters/odf/src/text/gbg_test.h
+++ b/DocFormats/filters/odf/src/text/gbg_test.h
@@ -3,10 +3,14 @@
#define TAG_NOT_FOUND 4040404
#define TAG_NOT_MATCHED 777777
+#include "CSS.h"
+#include "CSSSheet.h"
Tag find_HTML(DFNode *odfNode, DFNode *htmlNode);
void print_node_info(DFNode *node);
-void show_nodes(DFNode *node);
+void show_nodes(DFNode *node, int level);
+void walkChildren(DFNode *odfNode, int level);
+void buildCSS_Styles(CSSSheet * cssSheet, DFNode *odfNode);
char *node_id_info(DFNode *node);
char *missing_tag_info(DFNode *node);
void print_line(int style);
headers.odt
Description: application/vnd.oasis.opendocument.text
