You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@corinthia.apache.org by gb...@apache.org on 2015/05/23 01:20:19 UTC
incubator-corinthia git commit: Tables, headers, lists, bold, italic,
underline.
Repository: incubator-corinthia
Updated Branches:
refs/heads/odf-filter-attempt2 f60c7ce9c -> 295caa80b
Tables, headers, lists, bold, italic, underline.
Tables, headers and lists are working albeit in a very rudimentary
fashion.
Regards bold, italic and underline, nothing is what I expected --
everything seems to be out of sync.
I expected a node list of the shape:
HTML_I
DOM_TEXT
HTML_B
DOM_TEXT
...
Where I am assuming that eventually the HTML tag is used to wrap the
next DOM_TEXT up, with something of the shape like:
<i>DOM_TEXT</i>
<b>DOM_TEXT</b>
...
But nodes get produced that do not seem to have this ordering.
-----------------------------------------------------------
Code changes:
-----------------------------------------------------------
Personal small samples this code should cover (mostly):
* sample/documents/odf/Table.odt
* sample/documents/odf/bold-italic-underlined.odt
* sample/documents/odf/headers.odt
* sample/documents/odf/lists.odt
* .gitignore
Add emacs and patch exclusions.
* CMakeLists.txt
Add -DCOLOR=1 to gcc cmd, so I can read the long output easier.
Colors will be removed again, but it makes it much easier to spot
things (for me)
* DocFormats/core/src/xml/DFNameMap.c
Reason: Needed to access DFNameMap but could not do so because it
was defined inside this file. Move to the header file.
(HASH_TABLE_SIZE): Remove.
(DFNameEntry): Remove.
(DFNameHashTable): Remove.
(DFNameMap): Remove.
* DocFormats/core/src/xml/DFNameMap.h
(HASH_TABLE_SIZE): Add.
(DFNameEntry): Add.
(DFNameHashTable): Add.
(DFNameMap): Add..
* DocFormats/filters/odf/CMakeLists.txt
(set): Add temporary color.* files.
* DocFormats/filters/odf/src/text/ODFText.c
(ODFTextGet): Put in a better structure.
* DocFormats/filters/odf/src/text/color.h
* DocFormats/filters/odf/src/text/color.c
ANSI colors for easier debugging of long lists of text.
* DocFormats/filters/odf/src/text/gbg_test.c
(#include) "DFNameMap.h"
(find_HTML): Add lots of switch cases and a structure that reports
missing tags and prints them as ready code to stdout.
(show_nodes): dev tool -- print all the nodes.
(print_node_info): dev tool -- print everything possible about a node.
(node_id_info): dev tool -- print minimalist info about a node.
(missing_tag_info): dev tool -- create minimalist char* about a
missing node.
(print_line): dev tool -- 3 styles of printed lines, to make
recognition easier.
* DocFormats/filters/odf/src/text/gbg_test.h
(#define) TAG_NOT_FOUND: New tag that has never been seen before.
TAG_NOT_MATCHED: Known tag that has no HTML match yet.
(various): prototype definitions for gbg_test.c
Project: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/commit/295caa80
Tree: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/tree/295caa80
Diff: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/diff/295caa80
Branch: refs/heads/odf-filter-attempt2
Commit: 295caa80be4cfc37e0e7bdd4aa3fcc6ad7b1a1b6
Parents: f60c7ce
Author: Gabriela Gibson <gb...@apache.org>
Authored: Sat May 23 00:21:12 2015 +0100
Committer: Gabriela Gibson <gb...@apache.org>
Committed: Sat May 23 00:21:12 2015 +0100
----------------------------------------------------------------------
.gitignore | 5 +
CMakeLists.txt | 3 +-
DocFormats/core/src/xml/DFNameMap.c | 25 -
DocFormats/core/src/xml/DFNameMap.h | 37 +-
DocFormats/filters/odf/CMakeLists.txt | 1 +
DocFormats/filters/odf/src/text/ODFText.c | 61 +-
DocFormats/filters/odf/src/text/color.c | 31 +
DocFormats/filters/odf/src/text/color.h | 26 +-
DocFormats/filters/odf/src/text/gbg_test.c | 584 ++++++++-----------
DocFormats/filters/odf/src/text/gbg_test.h | 31 +-
sample/documents/odf/Table.odt | Bin 0 -> 8998 bytes
sample/documents/odf/bold-italic-underlined.odt | Bin 0 -> 8975 bytes
sample/documents/odf/headers.odt | Bin 0 -> 9780 bytes
sample/documents/odf/lists.odt | Bin 0 -> 9506 bytes
14 files changed, 407 insertions(+), 397 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/.gitignore
----------------------------------------------------------------------
diff --git a/.gitignore b/.gitignore
index 3d66e2c..f5c656a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -196,6 +196,11 @@ ClientBin/
*.pfx
*.publishsettings
node_modules/
+TAGS
+*.patch
+
+# Emacs
+*#*
# RIA/Silverlight projects
Generated_Code/
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3fdf6ca..09d1df0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -36,7 +36,8 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
- set(CMAKE_C_FLAGS "-std=c99 -D_GNU_SOURCE -g -fPIC")
+ set(CMAKE_C_FLAGS "-std=c99 -D_GNU_SOURCE -g -fPIC -DCOLOR_ON=1")
+### set(CMAKE_C_FLAGS "-std=c99 -D_GNU_SOURCE -g -fPIC ")
set(LIBS ${LIBS} m pthread xml2 z SDL2 SDL2_image)
endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/DocFormats/core/src/xml/DFNameMap.c
----------------------------------------------------------------------
diff --git a/DocFormats/core/src/xml/DFNameMap.c b/DocFormats/core/src/xml/DFNameMap.c
index eb5d868..9f37868 100644
--- a/DocFormats/core/src/xml/DFNameMap.c
+++ b/DocFormats/core/src/xml/DFNameMap.c
@@ -33,20 +33,6 @@ static void NameMap_staticInit();
// //
////////////////////////////////////////////////////////////////////////////////////////////////////
-#define HASH_TABLE_SIZE 983
-
-typedef struct DFNameEntry {
- char *name;
- char *URI;
- Tag tag;
- unsigned int namespaceID;
- TagDecl tagDecl;
- struct DFNameEntry *next;
-} DFNameEntry;
-
-typedef struct DFNameHashTable {
- DFNameEntry *bins[HASH_TABLE_SIZE];
-} DFNameHashTable;
static uint32_t DFNameHashTableHash(const char *name, const char *URI)
{
@@ -182,17 +168,6 @@ DFNameHashTable *defaultTagsByNameURI = NULL;
static void DFNameMapAddNamespace(DFNameMap *map, NamespaceID nsId, const char *URI, const char *prefix);
-struct DFNameMap {
- DFHashTable *namespacesByID; // NSNumber -> NamespaceInfo
- DFHashTable *namespacesByURI; // NSString -> NamespaceInfo
- DFHashTable *tagsByID; // NSNumber -> TagInfo
-
-
- DFNameHashTable *localTagsByNameURI;
- NamespaceID nextNamespaceId;
- Tag nextTag;
-};
-
DFNameMap *DFNameMapNew(void)
{
DFNameMap *map = (DFNameMap *)xcalloc(1,sizeof(DFNameMap));
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/DocFormats/core/src/xml/DFNameMap.h
----------------------------------------------------------------------
diff --git a/DocFormats/core/src/xml/DFNameMap.h b/DocFormats/core/src/xml/DFNameMap.h
index 1a8c76b..6348631 100644
--- a/DocFormats/core/src/xml/DFNameMap.h
+++ b/DocFormats/core/src/xml/DFNameMap.h
@@ -20,6 +20,7 @@
#include "DFXMLNamespaces.h"
#include "DFXMLNames.h"
+#include "DFHashTable.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// //
@@ -27,8 +28,40 @@
// //
////////////////////////////////////////////////////////////////////////////////////////////////////
-/** TODO */
-typedef struct DFNameMap DFNameMap;
+
+/** TODO ...? :) (1i: Maybe done?)
+*
+* 1i: Moved this section from DFNameMap.c
+*/
+#define HASH_TABLE_SIZE 983 // 1i: why is this not in DFHashTable.h?
+
+typedef struct DFNameEntry {
+ char *name;
+ char *URI;
+ Tag tag;
+ unsigned int namespaceID;
+ TagDecl tagDecl;
+ struct DFNameEntry *next;
+} DFNameEntry;
+
+typedef struct DFNameHashTable {
+ DFNameEntry *bins[HASH_TABLE_SIZE];
+} DFNameHashTable;
+
+typedef struct DFNameMap DFNameMap; // 1i: this was here already.
+
+struct DFNameMap {
+ DFHashTable *namespacesByID; // NSNumber -> NamespaceInfo
+ DFHashTable *namespacesByURI; // NSString -> NamespaceInfo
+ DFHashTable *tagsByID; // NSNumber -> TagInfo
+
+
+ DFNameHashTable *localTagsByNameURI;
+ NamespaceID nextNamespaceId;
+ Tag nextTag;
+};
+
+/* 1i: end of move section */
DFNameMap *DFNameMapNew(void);
void DFNameMapFree(DFNameMap *map);
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/DocFormats/filters/odf/CMakeLists.txt
----------------------------------------------------------------------
diff --git a/DocFormats/filters/odf/CMakeLists.txt b/DocFormats/filters/odf/CMakeLists.txt
index af02635..521b915 100644
--- a/DocFormats/filters/odf/CMakeLists.txt
+++ b/DocFormats/filters/odf/CMakeLists.txt
@@ -27,6 +27,7 @@ set(GroupSrc
set(GroupSrcText
src/text/color.h
+ src/text/color.c
src/text/gbg_test.h
src/text/gbg_test.c
src/text/ODFText.h
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/DocFormats/filters/odf/src/text/ODFText.c
----------------------------------------------------------------------
diff --git a/DocFormats/filters/odf/src/text/ODFText.c b/DocFormats/filters/odf/src/text/ODFText.c
index 7749b9c..4ef0068 100644
--- a/DocFormats/filters/odf/src/text/ODFText.c
+++ b/DocFormats/filters/odf/src/text/ODFText.c
@@ -35,25 +35,42 @@ typedef struct {
DFHashTable *htmlIdByNumId;
} ODFPutData;
+// I'm not sure what ODFTextConverter ise used here for.
static void traverseContent(ODFTextConverter *conv, DFNode *odfNode, DFNode *htmlNode)
{
- DFNode *child;
-
for (DFNode *odfChild = odfNode->first; odfChild != NULL; odfChild = odfChild->next) {
- if (odfChild->tag == 2) { // we have some text here.
- child = DFCreateChildElement(htmlNode, odfChild->tag);
- child->value = xstrdup(odfChild->value);
+
+ if (odfChild->tag == DOM_TEXT) { // we have some text or a text modfier here.
+ // DFNode *check =
+ DFCreateChildTextNode(htmlNode, odfChild->value);
+ printf(YELLOW "DOM_TEXT: %s \n" RESET,
+ odfChild->value
+ );
+
+ // print_node_info(check);
+ // print_line(1);
}
else {
- Tag newTag = locate_HTML(odfChild);
- if (newTag) { // we find an already mapped ODF -> HTML tag
- child = DFCreateChildElement(htmlNode, newTag);
+ Tag newTag = find_HTML(odfChild, htmlNode);
+ if (newTag == TAG_NOT_FOUND) {
+ // We found a new tag that we need to add to
+ // find_HTML(), which reports this to stdout
+ // currently.
+ ;
+ }
+ else if (newTag == TAG_NOT_MATCHED) {
+ // we find tag that we have not managed to match, but
+ // that is in find_HTML() already.
+
+ DFCreateChildTextNode(htmlNode, missing_tag_info(odfChild));
+ ;
+ }
+ else if (!newTag) {
+ ; // we added an attribute node already in find_HTML (for now)
+ // DFNode *newChild = DFCreateChildElement(htmlNode, newTag);
}
- else { // We found a missing tag
- child = DFCreateChildElement(htmlNode, 0);
- child->value = printMissingTag(odfChild->tag);
- if (odfChild->attrs)
- DFSetAttribute(child, odfChild->attrs->tag, odfChild->attrs->value);
+ else {
+ DFCreateChildElement(htmlNode, newTag);
}
}
traverseContent(conv,odfChild,htmlNode);
@@ -80,20 +97,34 @@ DFDocument *ODFTextGet(DFStorage *concreteStorage, DFStorage *abstractStorage, c
body = DFCreateChildElement(html->root, HTML_BODY);
conv = ODFTextConverterNew(html, abstractStorage, package, idPrefix);
+ printf(YELLOW
+ "============================================================\n"
+ "Showing ODF nodes prior to the traverseContent function\n"
+ "============================================================\n"
+ RESET);
+
+ show_nodes(package->contentDoc->root);
+
+ 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);
- printf(GREEN
+ // uncomment to see the result. (spammy!)
+ printf(GREEN
"============================================================\n"
- "Showing the result of the traverseContent function\n"
+ "Showing HTML nodes after the traverseContent function\n"
"============================================================\n"
RESET);
show_nodes(body);
+
// TODO: Once this basic traversal is implemented and is capable of producing paragraphs,
// tables, lists, and spans, add ids to the HTML elements as they are created. That is, set
// the id attribute of each new HTML element to a string containing the idPrefix followed by
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/DocFormats/filters/odf/src/text/color.c
----------------------------------------------------------------------
diff --git a/DocFormats/filters/odf/src/text/color.c b/DocFormats/filters/odf/src/text/color.c
new file mode 100644
index 0000000..993cffd
--- /dev/null
+++ b/DocFormats/filters/odf/src/text/color.c
@@ -0,0 +1,31 @@
+#include "color.h"
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+char *show_color(char *color, const char* str)
+{
+ char *r;
+ if (COLOR_ON) {
+ size_t len = strlen (str) + 2 * COLOR_SIZEOF + 1;
+ r = malloc(len);
+ snprintf (r, len, "%s%s%s", color, str, RESET);
+ }
+ else {
+ size_t len = strlen (str) + 1;
+ r = malloc(len);
+ snprintf (r, len, "%s", str);
+ }
+
+ return r;
+}
+
+char *red(const char *str) { return show_color(RED, str); }
+char *blue(const char *str) { return show_color(BLUE, str); }
+char *green(const char *str) { return show_color(GREEN, str); }
+char *yellow(const char *str) { return show_color(YELLOW, str); }
+char *cyan(const char *str) { return show_color(CYAN, str); }
+char *magenta(const char *str) { return show_color(MAGENTA, str); }
+
+
+
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/DocFormats/filters/odf/src/text/color.h
----------------------------------------------------------------------
diff --git a/DocFormats/filters/odf/src/text/color.h b/DocFormats/filters/odf/src/text/color.h
index d82d5ef..3dc3b69 100644
--- a/DocFormats/filters/odf/src/text/color.h
+++ b/DocFormats/filters/odf/src/text/color.h
@@ -1,5 +1,19 @@
#ifndef __COLOR_H
#define __COLOR_H
+//
+#ifndef COLOR_ON
+#define COLOR_ON 0
+#define RED ""
+#define GREEN ""
+#define YELLOW ""
+#define BLUE ""
+#define MAGENTA ""
+#define CYAN ""
+#define RESET ""
+#define COLOR_SIZEOF 0
+//
+#else // let's light the X-mas tree!
+//
#define RED "\x1b[31m"
#define GREEN "\x1b[32m"
#define YELLOW "\x1b[33m"
@@ -7,4 +21,14 @@
#define MAGENTA "\x1b[35m"
#define CYAN "\x1b[36m"
#define RESET "\x1b[0m"
-#endif
+#define COLOR_SIZEOF 8
+#endif // COLOR_ON
+//
+#endif // __COLOR_H
+
+char *red(const char *str);
+char *blue(const char *str);
+char *green(const char *str);
+char *yellow(const char *str);
+char *cyan(const char *str);
+char *magenta(const char *str);
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/DocFormats/filters/odf/src/text/gbg_test.c
----------------------------------------------------------------------
diff --git a/DocFormats/filters/odf/src/text/gbg_test.c b/DocFormats/filters/odf/src/text/gbg_test.c
index 41abd91..fae6c42 100644
--- a/DocFormats/filters/odf/src/text/gbg_test.c
+++ b/DocFormats/filters/odf/src/text/gbg_test.c
@@ -7,373 +7,289 @@
#include <string.h>
#include <stdlib.h>
#include "DFXMLNames.h"
+#include "DFNameMap.h"
#include "color.h"
#include "gbg_test.h"
-#define HTML_VARIOUS 4444444 // one ODF key mapping to various HTML keys
-#define ENDMARKER 555555
-ODF_to_HTML_key ODF_to_HTML_keys [] = {
- { 1, HTML_A, no_op},
- { 1, HTML_ABBR, no_op},
- { 1, HTML_ABOUT, no_op},
- { 1, HTML_ACCEPT, no_op},
- { 1, HTML_ACCEPT_CHARSET, no_op},
- { 1, HTML_ACCESSKEY, no_op},
- { 1, HTML_ACTION, no_op},
- { 1, HTML_ADDRESS, no_op},
- { 1, HTML_ALT, no_op},
- { 1, HTML_AREA, no_op},
- { 1, HTML_ARTICLE, no_op},
- { 1, HTML_ASIDE, no_op},
- { 1, HTML_ASYNC, no_op},
- { 1, HTML_AUDIO, no_op},
- { 1, HTML_AUTOCOMPLETE, no_op},
- { 1, HTML_AUTOFOCUS, no_op},
- { 1, HTML_AUTOPLAY, no_op},
- { 1, HTML_B, no_op},
- { 1, HTML_BASE, no_op},
- { 1, HTML_BDI, no_op},
- { 1, HTML_BDO, no_op},
- { 1, HTML_BLOCKQUOTE, no_op},
- { OFFICE_BODY, HTML_BODY, no_op },
- { 1, HTML_BR, no_op },
- { 1, HTML_BUTTON, no_op},
- { 1, HTML_CANVAS, no_op},
- { 1, HTML_CAPTION, no_op},
- { 1, HTML_CHALLENGE, no_op},
- { 1, HTML_CHARSET, no_op},
- { 1, HTML_CHECKED, no_op},
- { 1, HTML_CITE, no_op},
- { 1, HTML_CLASS, no_op},
- { 1, HTML_CODE, no_op},
- { 1, HTML_COL, no_op},
- { 1, HTML_COLGROUP, no_op},
- { 1, HTML_COLS, no_op},
- { 1, HTML_COLSPAN, no_op},
- { 1, HTML_COMMAND, no_op},
- { 1, HTML_CONTENT, no_op},
- { 1, HTML_CONTENTEDITABLE, no_op},
- { 1, HTML_CONTEXTMENU, no_op},
- { 1, HTML_CONTROLS, no_op},
- { 1, HTML_COORDS, no_op},
- { 1, HTML_CROSSORIGIN, no_op},
- { 1, HTML_DATA, no_op},
- { 1, HTML_DATALIST, no_op},
- { 1, HTML_DATATYPE, no_op},
- { 1, HTML_DATETIME, no_op},
- { 1, HTML_DD, no_op},
- { 1, HTML_DEFAULT, no_op},
- { 1, HTML_DEFER, no_op},
- { 1, HTML_DEL, no_op},
- { 1, HTML_DETAILS, no_op},
- { 1, HTML_DFN, no_op},
- { 1, HTML_DIALOG, no_op},
- { 1, HTML_DIR, no_op},
- { 1, HTML_DIRNAME, no_op},
- { 1, HTML_DISABLED, no_op},
- { 1, HTML_DIV, no_op},
- { 1, HTML_DL, no_op},
- { 1, HTML_DOWNLOAD, no_op},
- { 1, HTML_DRAGGABLE, no_op},
- { 1, HTML_DROPZONE, no_op},
- { 1, HTML_DT, no_op},
- { 1, HTML_EM, no_op},
- { 1, HTML_EMBED, no_op},
- { 1, HTML_EMBED, no_op},
- { 1, HTML_ENCTYPE, no_op},
- { 1, HTML_FIELDSET, no_op},
- { 1, HTML_FIGCAPTION, no_op},
- { 1, HTML_FIGURE, no_op},
- { 1, HTML_FOOTER, no_op},
- { 1, HTML_FOR, no_op},
- { 1, HTML_FORM, no_op},
- { 1, HTML_FORMACTION, no_op},
- { 1, HTML_FORMENCTYPE, no_op},
- { 1, HTML_FORMMETHOD, no_op},
- { 1, HTML_FORMNOVALIDATE, no_op},
- { 1, HTML_FORMTARGET, no_op},
- { TEXT_H, HTML_VARIOUS, text_h },
- { 1, HTML_HEAD, no_op},
- { 1, HTML_HEADER, no_op},
- { 1, HTML_HEADERS, no_op},
- { 1, HTML_HEIGHT, no_op},
- { 1, HTML_HGROUP, no_op},
- { 1, HTML_HIDDEN, no_op},
- { 1, HTML_HIGH, no_op},
- { 1, HTML_HR, no_op},
- { 1, HTML_HREF, no_op},
- { 1, HTML_HREFLANG, no_op},
- { 1, HTML_HTML, no_op},
- { 1, HTML_HTTP_EQUIV, no_op},
- { 1, HTML_I, no_op},
- { 1, HTML_ICON, no_op},
- { 1, HTML_ID, no_op},
- { 1, HTML_IFRAME, no_op},
- { 1, HTML_IMG, no_op},
- { 1, HTML_INERT, no_op},
- { 1, HTML_INPUT, no_op},
- { 1, HTML_INPUTMODE, no_op},
- { 1, HTML_INS, no_op},
- { 1, HTML_ISMAP, no_op},
- { 1, HTML_ITEMID, no_op},
- { 1, HTML_ITEMPROP, no_op},
- { 1, HTML_ITEMREF, no_op},
- { 1, HTML_ITEMSCOPE, no_op},
- { 1, HTML_ITEMTYPE, no_op},
- { 1, HTML_KBD, no_op},
- { 1, HTML_KEYGEN, no_op},
- { 1, HTML_KEYTYPE, no_op},
- { 1, HTML_KIND, no_op},
- { 1, HTML_LABEL, no_op},
- { 1, HTML_LANG, no_op},
- { 1, HTML_LEGEND, no_op},
- { 1, HTML_LI, no_op},
- { 1, HTML_LINK, no_op},
- { 1, HTML_LIST, no_op},
- { 1, HTML_LOOP, no_op},
- { 1, HTML_LOW, no_op},
- { 1, HTML_MANIFEST, no_op},
- { 1, HTML_MAP, no_op},
- { 1, HTML_MARK, no_op},
- { 1, HTML_MAX, no_op},
- { 1, HTML_MAXLENGTH, no_op},
- { 1, HTML_MEDIA, no_op},
- { 1, HTML_MEDIAGROUP, no_op},
- { 1, HTML_MENU, no_op},
- { 1, HTML_META, no_op},
- { 1, HTML_METER, no_op},
- { 1, HTML_METHOD, no_op},
- { 1, HTML_MIN, no_op},
- { 1, HTML_MULTIPLE, no_op},
- { 1, HTML_MUTED, no_op},
- { 1, HTML_NAME, no_op},
- { 1, HTML_NAV, no_op},
- { 1, HTML_NOSCRIPT, no_op},
- { 1, HTML_NOVALIDATE, no_op},
- { 1, HTML_OBJECT, no_op},
- { 1, HTML_OL, no_op},
- { 1, HTML_ONABORT, no_op},
- { 1, HTML_ONAFTERPRINT, no_op},
- { 1, HTML_ONBEFOREPRINT, no_op},
- { 1, HTML_ONBEFOREUNLOAD, no_op},
- { 1, HTML_ONBLUR, no_op},
- { 1, HTML_ONCANCEL, no_op},
- { 1, HTML_ONCANPLAY, no_op},
- { 1, HTML_ONCANPLAYTHROUGH, no_op},
- { 1, HTML_ONCHANGE, no_op},
- { 1, HTML_ONCLICK, no_op},
- { 1, HTML_ONCLOSE, no_op},
- { 1, HTML_ONCONTEXTMENU, no_op},
- { 1, HTML_ONCUECHANGE, no_op},
- { 1, HTML_ONDBLCLICK, no_op},
- { 1, HTML_ONDRAG, no_op},
- { 1, HTML_ONDRAGEND, no_op},
- { 1, HTML_ONDRAGENTER, no_op},
- { 1, HTML_ONDRAGLEAVE, no_op},
- { 1, HTML_ONDRAGOVER, no_op},
- { 1, HTML_ONDRAGSTART, no_op},
- { 1, HTML_ONDROP, no_op},
- { 1, HTML_ONDURATIONCHANGE, no_op},
- { 1, HTML_ONEMPTIED, no_op},
- { 1, HTML_ONENDED, no_op},
- { 1, HTML_ONERROR, no_op},
- { 1, HTML_ONFOCUS, no_op},
- { 1, HTML_ONHASHCHANGE, no_op},
- { 1, HTML_ONINPUT, no_op},
- { 1, HTML_ONINVALID, no_op},
- { 1, HTML_ONKEYDOWN, no_op},
- { 1, HTML_ONKEYPRESS, no_op},
- { 1, HTML_ONKEYUP, no_op},
- { 1, HTML_ONLOAD, no_op},
- { 1, HTML_ONLOADEDDATA, no_op},
- { 1, HTML_ONLOADEDMETADATA, no_op},
- { 1, HTML_ONLOADSTART, no_op},
- { 1, HTML_ONMESSAGE, no_op},
- { 1, HTML_ONMOUSEDOWN, no_op},
- { 1, HTML_ONMOUSEMOVE, no_op},
- { 1, HTML_ONMOUSEOUT, no_op},
- { 1, HTML_ONMOUSEOVER, no_op},
- { 1, HTML_ONMOUSEUP, no_op},
- { 1, HTML_ONMOUSEWHEEL, no_op},
- { 1, HTML_ONOFFLINE, no_op},
- { 1, HTML_ONONLINE, no_op},
- { 1, HTML_ONPAGEHIDE, no_op},
- { 1, HTML_ONPAGESHOW, no_op},
- { 1, HTML_ONPAUSE, no_op},
- { 1, HTML_ONPLAY, no_op},
- { 1, HTML_ONPLAYING, no_op},
- { 1, HTML_ONPOPSTATE, no_op},
- { 1, HTML_ONPROGRESS, no_op},
- { 1, HTML_ONRATECHANGE, no_op},
- { 1, HTML_ONRESET, no_op},
- { 1, HTML_ONRESIZE, no_op},
- { 1, HTML_ONSCROLL, no_op},
- { 1, HTML_ONSEEKED, no_op},
- { 1, HTML_ONSEEKING, no_op},
- { 1, HTML_ONSELECT, no_op},
- { 1, HTML_ONSHOW, no_op},
- { 1, HTML_ONSTALLED, no_op},
- { 1, HTML_ONSTORAGE, no_op},
- { 1, HTML_ONSUBMIT, no_op},
- { 1, HTML_ONSUSPEND, no_op},
- { 1, HTML_ONTIMEUPDATE, no_op},
- { 1, HTML_ONUNLOAD, no_op},
- { 1, HTML_ONVOLUMECHANGE, no_op},
- { 1, HTML_ONWAITING, no_op},
- { 1, HTML_OPEN, no_op},
- { 1, HTML_OPTGROUP, no_op},
- { 1, HTML_OPTIMUM, no_op},
- { 1, HTML_OPTION, no_op},
- { 1, HTML_OUTPUT, no_op},
- { TEXT_P, HTML_P, no_op},
- { 1, HTML_PARAM, no_op},
- { 1, HTML_PATTERN, no_op},
- { 1, HTML_PING, no_op},
- { 1, HTML_PLACEHOLDER, no_op},
- { 1, HTML_POSTER, no_op},
- { 1, HTML_PRE, no_op},
- { 1, HTML_PRELOAD, no_op},
- { 1, HTML_PROGRESS, no_op},
- { 1, HTML_PROPERTY, no_op},
- { 1, HTML_Q, no_op},
- { 1, HTML_RADIOGROUP, no_op},
- { 1, HTML_READONLY, no_op},
- { 1, HTML_REL, no_op},
- { 1, HTML_REQUIRED, no_op},
- { 1, HTML_REVERSED, no_op},
- { 1, HTML_ROWS, no_op},
- { 1, HTML_ROWSPAN, no_op},
- { 1, HTML_RP, no_op},
- { 1, HTML_RT, no_op},
- { 1, HTML_RUBY, no_op},
- { 1, HTML_S, no_op},
- { 1, HTML_SAMP, no_op},
- { 1, HTML_SANDBOX, no_op},
- { 1, HTML_SCOPE, no_op},
- { 1, HTML_SCOPED, no_op},
- { OFFICE_SCRIPT, HTML_SCRIPT, no_op},
- { 1, HTML_SEAMLESS, no_op},
- { 1, HTML_SECTION, no_op},
- { 1, HTML_SELECT, no_op},
- { 1, HTML_SELECTED, no_op},
- { 1, HTML_SHAPE, no_op},
- { 1, HTML_SIZE, no_op},
- { 1, HTML_SIZES, no_op},
- { 1, HTML_SMALL, no_op},
- { 1, HTML_SOURCE, no_op},
- { 1, HTML_SPAN, no_op},
- { 1, HTML_SPELLCHECK, no_op},
- { 1, HTML_SRC, no_op},
- { 1, HTML_SRCDOC, no_op},
- { 1, HTML_SRCLANG, no_op},
- { 1, HTML_START, no_op},
- { 1, HTML_STEP, no_op},
- { 1, HTML_STRONG, no_op},
- { STYLE_STYLE, HTML_STYLE, no_op },
- { 1, HTML_SUB, no_op },
- { 1, HTML_SUMMARY, no_op},
- { 1, HTML_SUP, no_op},
- { 1, HTML_TABINDEX, no_op},
- { 1, HTML_TABLE, no_op},
- { 1, HTML_TARGET, no_op},
- { 1, HTML_TBODY, no_op},
- { 1, HTML_TD, no_op},
- { OFFICE_TEXT, HTML_TEXTAREA, no_op },
- { 1, HTML_TFOOT, no_op },
- { 1, HTML_TH, no_op},
- { 1, HTML_THEAD, no_op},
- { 1, HTML_TIME, no_op},
- { 1, HTML_TITLE, no_op},
- { 1, HTML_TR, no_op},
- { 1, HTML_TRACK, no_op},
- { 1, HTML_TRANSLATE, no_op},
- { 1, HTML_TYPE, no_op},
- { 1, HTML_TYPEMUSTMATCH, no_op},
- { 1, HTML_U, no_op},
- { 1, HTML_UL, no_op},
- { 1, HTML_USEMAP, no_op},
- { 1, HTML_VALUE, no_op},
- { 1, HTML_VAR, no_op},
- { 1, HTML_VIDEO, no_op},
- { 1, HTML_WBR, no_op},
- { 1, HTML_WIDTH, no_op},
- { 1, HTML_WRAP, no_op},
- { 0,ENDMARKER, no_op},
-};
-
-Tag no_op(DFNode *node)
-{
- return 0;
-}
+/*
+ G: Advice I have still to cover:
+ ================================
-Tag text_h(DFNode *node)
-{
- char *s = node->attrs->value;
- if ((int)s[11] > 55 || strlen(s) == 13)
- return HTML_H6;
- else
- return HTML_H1 + (int)s[11] - 49;
-}
+ printNode:
+
+ The attrs field of the DFNode struct is an array, not a single
+ object. It contains attrsCount elements. Accessing it in the way that
+ printNode does is incorrect for two reasons:
+
+ 1) The fact that attrs is non-NULL doesn’t necessarily mean that the
+ node has attributes. It’s possible that it did at one point have
+ attributes, but those were all removed. In such a case, attrsCount
+ will be zero, but attrs will still be non-NULL. Have a look at the
+ implementation of DFGetAttribute, DFSetAttribute, DFRemoveAttribute in
+ DFDOM.c to see how attrs, attrsCount, and attrsAlloc are used.
+
+ 2) If there are multiple attributes, this will only print the first.
+
+ To go through all the attributes and print out their tags & values,
+ you would use a loop:
+
+
+ You can also use DFGetAttribute if you want to already know the tag
+ you are looking for (e.g. TEXT_OUTLINE_LEVEL). This function will
+ return NULL if the attribute does not exist, or the attribute value if
+ it does.
+
+
+ > Tag text_h(DFNode *node)
+ > {
+ > char *s = node->attrs->value;
+
+Referencing node->attrs->value is incorrect, as you don’t know
+whether the node will have any attributes, and it if does, whether the
+style name (which is what I assume you’re looking for here) will
+happen to be the first one. DFGetAttribute(node,TEXT_STYLE_NAME) is
+how you would get this reliably.
+
+G: Does not always happen so :( see TEXT_H entry for a failure
+(probably on my part :-)
-Tag locate_HTML(DFNode *odfNode)
+ // TODO: Once this basic traversal is implemented and is capable of producing paragraphs,
+ // tables, lists, and spans, add ids to the HTML elements as they are created. That is, set
+ // the id attribute of each new HTML element to a string containing the idPrefix followed by
+
+Q: what is that idPrefix thing and how do I find/generate this?
+
+ // the seqNo field of the node in contentDoc from which the HTML element was generated.
+
+Q: As in: adjust the automatic counter that works currently? Ok, but
+it'll leave holes in the count :(
+
+Note: I still found the translateXMLEnumName array informative, so I
+put it back again as a dev aid.
+
+*/
+
+/**
+ * Temp function: Collect all the possible translations from ODF to
+ * HTML. Will probably still change shape a lot.
+ *
+ * Input: DFNode from ODF document that is currently being examined.
+ *
+ * Returns: Tag with HTMl value or TAG_NOT_MATCHED, or, writes code to
+ * screen that can be added to the switch function. (see default: )
+ */
+Tag find_HTML(DFNode *odfNode, DFNode *htmlNode)
{
- int index = (int)odfNode->tag;
-
- if (index > -1) {
- for (int i = 0; ODF_to_HTML_keys[i].HTML_KEY != ENDMARKER; i++) {
- if (ODF_to_HTML_keys[i].ODF_KEY == index) {
- if (odfNode->attrs)
- return ODF_to_HTML_keys[i].attribute_function(odfNode);
- else
- return ODF_to_HTML_keys[i].HTML_KEY;
+ // I added a couple of #defines for dev purposes.
+ //
+ // TAG_NOT_MATCHED shows me stuff I know about but haven't managed
+ // to match up.
+ //
+ // default sends back TAG_NOT_FOUND and so catches new tags and
+ // helpfully prints out code for adding to the switch statement
+ // ;-)
+ //
+ // for some weird reason, c-mode in emacs gives me a funky
+ // indentation in switch functions. I'll fix it once this
+ // function settled.
+
+ printf(MAGENTA "find_HTML(): TAG NAME: %s Value: %d \n" RESET,
+ translateXMLEnumName[odfNode->tag],
+ odfNode->tag
+ );
+
+ switch(odfNode->tag) {
+
+ case TEXT_H : { //headers h1 - h6, h7+ returns as p
+
+ const char* s = DFGetAttribute(odfNode,TEXT_STYLE_NAME);
+
+ // Grab the very last digit. If it's a 0-5 we have a proper
+ // header, otherwise, we have heading 6-10.
+ int s_val = atoi(&s[strlen(s)-1]) - 1;
+ if (s_val >= 0 && s_val < 6)
+ return HTML_H1 + s_val;
+ else
+ return HTML_P;
+ }
+ // paragraph
+ case TEXT_P : { return HTML_P; }
+
+ // lists
+ case TEXT_LIST : { return HTML_LIST; }
+ case TEXT_LIST_ITEM : { return HTML_LI; }
+
+ // tables
+ case TABLE_TABLE : { return HTML_TABLE; }
+ case TABLE_TABLE_COLUMN : { return HTML_COL; }
+ case TABLE_TABLE_ROW : { return HTML_ROWS; }
+
+ case TABLE_TABLE_CELL : { return TAG_NOT_MATCHED; }
+ case STYLE_TABLE_CELL_PROPERTIES : { return TAG_NOT_MATCHED; }
+ case STYLE_TABLE_COLUMN_PROPERTIES : { return TAG_NOT_MATCHED; }
+ case STYLE_TABLE_PROPERTIES : { return TAG_NOT_MATCHED; }
+
+ case STYLE_TEXT_PROPERTIES : {
+
+ // no output:
+ // const char* s = DFGetAttribute(odfNode,STYLE_TEXT_PROPERTIES);
+ const char* s = DFGetAttribute(odfNode,DOM_TEXT);
+
+ for (int i = 0; i < odfNode->attrsCount; i++) {
+
+ if (odfNode->attrs[i].tag == FO_FONT_WEIGHT
+ && !strcmp("bold",odfNode->attrs[i].value)) {
+ DFCreateChildElement(htmlNode, HTML_B);
+ return 0;
+ }
+
+ if (odfNode->attrs[i].tag == FO_FONT_STYLE
+ && !strcmp("italic",odfNode->attrs[i].value)) {
+ DFCreateChildElement(htmlNode, HTML_I);
+ return 0;
+ }
+
+ if (odfNode->attrs[i].tag == STYLE_TEXT_UNDERLINE_STYLE) {
+ DFCreateChildElement(htmlNode, HTML_U);
+ return 0;
}
- }
+
+ printf(RED "Failure: " RESET
+ "tag %u tag name %s value %s\n",
+ odfNode->attrs[i].tag,
+ translateXMLEnumName[odfNode->attrs[i].tag],
+ odfNode->attrs[i].value);
+ }
+
+ return TAG_NOT_MATCHED;
+ }
+ // document
+ case OFFICE_AUTOMATIC_STYLES : { return TAG_NOT_MATCHED; }
+ case OFFICE_BODY : { return TAG_NOT_MATCHED; }
+ case OFFICE_FONT_FACE_DECLS : { return TAG_NOT_MATCHED; }
+ case OFFICE_SCRIPTS : { return TAG_NOT_MATCHED; }
+ case OFFICE_TEXT : { return TAG_NOT_MATCHED; }
+
+ // fonts, styles'n'things.
+ case STYLE_FONT_FACE : { return TAG_NOT_MATCHED; }
+ case STYLE_STYLE : { return TAG_NOT_MATCHED; }
+ case TEXT_SEQUENCE_DECL : { return TAG_NOT_MATCHED; }
+ case TEXT_SEQUENCE_DECLS : { return TAG_NOT_MATCHED; }
+
+ default: {
+ // rm foo.html; make ; ./bin/dfconvert get bin/lists.odt foo.html | sort -u
+ // ... because we are too lazy to type.
+ printf("case %s : { return TAG_NOT_MATCHED; }\n",
+ translateXMLEnumName[odfNode->tag]);
+ return TAG_NOT_FOUND;
+ }
}
- return 0;
}
-
+/**
+ * Dev tool: List all the nodes following the given one.
+ */
void show_nodes(DFNode *odfNode)
{
for (DFNode *odfChild = odfNode->first; odfChild != NULL; odfChild = odfChild->next) {
- printNode(odfChild);
+ print_node_info(odfChild);
+ print_line(0);
}
}
-void printNode(DFNode *n)
+/**
+ * Dev tool: List everything about a Node that's fit to print..
+ */
+void print_node_info(DFNode *n)
{
if (n == NULL) return;
- if (n->tag) printf("Tag tag: %zu\n",n->tag);
+ if (n->tag) printf("Tag tag: %zu name = %s\n",n->tag, translateXMLEnumName[n->tag]);
printf("unsigned int seqNo: %d\n",n->seqNo);
// printf("struct DFDocument *doc: %p\n",n->doc);
if (n->js) printf("void *js: %p\n",n->js);
if (n->changed) printf("int changed: %d\n",n->changed);
if (n->childrenChanged) printf("int childrenChanged %d\n",n->childrenChanged);
if (n->seqNoHashNext) printf("DFNode *seqNoHashNext %p\n", n->seqNoHashNext);
+
+ DFNameMap *map = n->doc->map;
+ const TagDecl *td = DFNameMapNameForTag(map,n->tag);
+ const NamespaceDecl *ns = DFNameMapNamespaceForID(map,td->namespaceID);
+
+ // Attributes
+ if (n->tag >= MIN_ELEMENT_TAG) {
+ for (unsigned int i = 0; i < n->attrsCount; i++) {
+ Tag t = n->attrs[i].tag;
+ const TagDecl *attrDecl = DFNameMapNameForTag(map,t);
+ printf("iteration %d === tag: %d name: %s namespaceID = %d localName = %s\n",
+ i, t, translateXMLEnumName[t],
+ td->namespaceID,
+ td->localName);
+ }
+ }
+ if (ns->namespaceURI) printf("namespace URI = %s\n",ns->namespaceURI);
+ if (td->localName) printf("local name = %s\n",td->localName);
+ if (n->attrsCount) printf(RED "unsigned int attrsCount: %d \n" RESET,n->attrsCount);
if (n->attrs) {
- printf("DFAttribute *attrs: %p ",n->attrs);
- printf(", Tag tags: %zu ",n->attrs->tag);
- printf(", char *value: %s ",n->attrs->value);
- printf("HTML TAG = %d ", n->attrs->tag);
- if (n->tag)
- printf("%s ", translateXMLEnumName[locate_HTML(n)]);
- printf("\n");
+ // printf("DFAttribute *attrs: %p ",n->attrs);
+ if (n->attrs->tag) printf(", Tag tags: %zu ",n->attrs->tag);
+ if (n->attrs->value) printf(", char *value: %s ",n->attrs->value);
+ printf(" Tag Name = %s\n", translateXMLEnumName[n->attrs->tag]);
+ }
+
+ for (int i = 0; i < n->attrsCount; i++) {
+ printf(BLUE "attrsCount %d tag %u value %s\n" RESET,
+ i, n->attrs[i].tag,n->attrs[i].value);
}
- if (n->attrsCount) printf("unsigned int attrsCount: %d\n",n->attrsCount);
+
if (n->attrsAlloc) printf("unsigned int attrsAlloc: %d\n", n->attrsAlloc);
if (n->target) printf("char *target: %s\n", n->target);
if (n->value) printf("char *value: %s\n", n->value);
- if (n->tag > 2)
- printf("Tag Text = %s\n", translateXMLEnumName[n->tag]);
- printf("================================================================================================\n");
}
-char *printMissingTag(Tag tag)
+/**
+ * Dev tool: List less info about a node than print_node_info().
+ */
+char *node_id_info(DFNode *node)
{
- char *s = translateXMLEnumName[tag];
- int len = strlen(s)+14+20;
+ const char *local_name = DFNodeName(node);
+ //const char *namespace_URI = DFNodeURI(node);
+ const char *enum_name = translateXMLEnumName[node->tag];
+ int len = strlen (local_name) + strlen(enum_name) + 30; //strlen( namespace_URI)+30;
char *r = malloc(len);
- snprintf(r, len, "%s Missing tag: %s %s",RED, s, RESET);
+ snprintf(r, len, "Tag name = %s DFNodeName: %s",
+ // " DFNodeURI: %s",
+ enum_name,
+ local_name
+ //namespace_URI
+ );
return r;
}
+
+/**
+ * Dev tool: List some info about a missing tag, alone with some high
+ * lighting for easy viewing spotting.
+ */
+char *missing_tag_info(DFNode *node)
+{
+ char *inform = red("Tag not matched: ");
+ char *facts = node_id_info(node);
+ int len = strlen(inform)+strlen(facts)+2;
+ char *r = malloc(len);
+ snprintf(r, len, "%s%s", inform, facts);
+ return r;
+}
+
+/**
+ * Dev tool: A selection of snazzy lines because I watched too many serger vids.
+ */
+void print_line(int style)
+{
+ if (!style)
+ printf("=============================================================\n");
+ else if (style == 1)
+ printf("=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n");
+ else if (style == 2)
+ printf("=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=\n");
+}
+
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/DocFormats/filters/odf/src/text/gbg_test.h
----------------------------------------------------------------------
diff --git a/DocFormats/filters/odf/src/text/gbg_test.h b/DocFormats/filters/odf/src/text/gbg_test.h
index 7158744..636165f 100644
--- a/DocFormats/filters/odf/src/text/gbg_test.h
+++ b/DocFormats/filters/odf/src/text/gbg_test.h
@@ -1,30 +1,21 @@
#ifndef GBG_TEST_H
#define GBG_TEST_H
-void printNode(DFNode *node); // temp func, just for some convenience
+#define TAG_NOT_FOUND 4040404
+#define TAG_NOT_MATCHED 777777
-Tag locate_HTML(DFNode *odfNode);
+Tag find_HTML(DFNode *odfNode, DFNode *htmlNode);
+void print_node_info(DFNode *node);
+void show_nodes(DFNode *node);
+char *node_id_info(DFNode *node);
+char *missing_tag_info(DFNode *node);
+void print_line(int style);
-// show all the nodes in a node list
-void show_nodes(DFNode *node);
-
-char *printMissingTag(Tag tag);
-
-// list of functions in ODF_TO_HTML_KEY []
-Tag no_op(DFNode *node);
-Tag text_h(DFNode *node);
-
-// it may be that the Tag Attribute is not needed.
-typedef struct {
- Tag ODF_KEY;
- Tag HTML_KEY;
- Tag (*attribute_function)(DFNode*);
-} ODF_to_HTML_key;
static char* translateXMLEnumName[] = {
"one",
"two",
- "three",
+ "DOM_TEXT",
"four",
"five",
"six",
@@ -3376,6 +3367,8 @@ static char* translateXMLEnumName[] = {
"XML_LANG",
"XML_SPACE",
"PREDEFINED_TAG_COUNT",
-};
+}
+;
+
#endif
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/sample/documents/odf/Table.odt
----------------------------------------------------------------------
diff --git a/sample/documents/odf/Table.odt b/sample/documents/odf/Table.odt
new file mode 100644
index 0000000..8f708a7
Binary files /dev/null and b/sample/documents/odf/Table.odt differ
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/sample/documents/odf/bold-italic-underlined.odt
----------------------------------------------------------------------
diff --git a/sample/documents/odf/bold-italic-underlined.odt b/sample/documents/odf/bold-italic-underlined.odt
new file mode 100644
index 0000000..be14136
Binary files /dev/null and b/sample/documents/odf/bold-italic-underlined.odt differ
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/sample/documents/odf/headers.odt
----------------------------------------------------------------------
diff --git a/sample/documents/odf/headers.odt b/sample/documents/odf/headers.odt
new file mode 100644
index 0000000..c5e1870
Binary files /dev/null and b/sample/documents/odf/headers.odt differ
http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/295caa80/sample/documents/odf/lists.odt
----------------------------------------------------------------------
diff --git a/sample/documents/odf/lists.odt b/sample/documents/odf/lists.odt
new file mode 100644
index 0000000..7a42f8c
Binary files /dev/null and b/sample/documents/odf/lists.odt differ