From: Fletcher T. Penney Date: Wed, 5 Jul 2017 18:32:45 +0000 (-0400) Subject: ADDED: Add odt and fodt formats; disable odf format for consistency X-Git-Tag: 6.1.0^2~3 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=58a2f305053a85fd017e9fe44ceaf8745695d18d;p=multimarkdown ADDED: Add odt and fodt formats; disable odf format for consistency --- diff --git a/CMakeLists.txt b/CMakeLists.txt index c61406c..78c4066 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -183,6 +183,7 @@ set(src_files Sources/libMultiMarkdown/critic_markup.c Sources/libMultiMarkdown/d_string.c Sources/libMultiMarkdown/epub.c + Sources/libMultiMarkdown/fodt.c Sources/libMultiMarkdown/html.c Sources/libMultiMarkdown/latex.c Sources/libMultiMarkdown/lexer.c @@ -191,6 +192,8 @@ set(src_files Sources/libMultiMarkdown/mmd.c Sources/libMultiMarkdown/odf.c Sources/libMultiMarkdown/object_pool.c + Sources/libMultiMarkdown/opendocument.c + Sources/libMultiMarkdown/opendocument-content.c Sources/libMultiMarkdown/parser.c Sources/libMultiMarkdown/rng.c Sources/libMultiMarkdown/scanners.c @@ -212,6 +215,7 @@ set(header_files Sources/libMultiMarkdown/critic_markup.h Sources/libMultiMarkdown/include/d_string.h Sources/libMultiMarkdown/epub.h + Sources/libMultiMarkdown/fodt.h Sources/libMultiMarkdown/html.h Sources/libMultiMarkdown/latex.h Sources/libMultiMarkdown/lexer.h @@ -221,6 +225,8 @@ set(header_files Sources/libMultiMarkdown/mmd.h Sources/libMultiMarkdown/odf.c Sources/libMultiMarkdown/object_pool.h + Sources/libMultiMarkdown/opendocument.h + Sources/libMultiMarkdown/opendocument-content.h Sources/libMultiMarkdown/scanners.h Sources/libMultiMarkdown/stack.h Sources/libMultiMarkdown/textbundle.c @@ -630,7 +636,7 @@ ADD_MMD_TEST(mmd-6-compat "-c" MMD6Tests htmlc) ADD_MMD_TEST(mmd-6-latex "-t latex" MMD6Tests tex) -ADD_MMD_TEST(mmd-6-odf "-t odf" MMD6Tests fodt) +ADD_MMD_TEST(mmd-6-odf "-t fodt" MMD6Tests fodt) ADD_MMD_TEST(mmd-6-critic-accept "-a" CriticMarkup htmla) diff --git a/Sources/libMultiMarkdown/fodt.c b/Sources/libMultiMarkdown/fodt.c new file mode 100644 index 0000000..61e0cff --- /dev/null +++ b/Sources/libMultiMarkdown/fodt.c @@ -0,0 +1,2031 @@ +/** + + MultiMarkdown -- Lightweight markup processor to produce HTML, LaTeX, and more. + + @file fodt.c + + @brief Convert token tree to Flat OpenDocument (ODF/FODT) output + + + @author Fletcher T. Penney + @bug + +**/ + +/* + + Copyright © 2016 - 2017 Fletcher T. Penney. + + + The `MultiMarkdown 6` project is released under the MIT License.. + + GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project: + + https://github.com/fletcher/MultiMarkdown-4/ + + MMD 4 is released under both the MIT License and GPL. + + + CuTest is released under the zlib/libpng license. See CuTest.c for the + text of the license. + + + ## The MIT License ## + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +*/ + + +#include +#include +#include +#include + +#include "char.h" +#include "i18n.h" +#include "fodt.h" +#include "parser.h" +#include "scanners.h" + +#define print(x) d_string_append(out, x) +#define print_const(x) d_string_append_c_array(out, x, sizeof(x) - 1) +#define print_char(x) d_string_append_c(out, x) +#define printf(...) d_string_append_printf(out, __VA_ARGS__) +#define print_token(t) d_string_append_c_array(out, &(source[t->start]), t->len) +#define print_localized(x) mmd_print_localized_char_odf(out, x, scratch) + + +/// strdup() not available on all platforms +static char * my_strdup(const char * source) { + char * result = malloc(strlen(source) + 1); + + if (result) { + strcpy(result, source); + } + + return result; +} + + +void mmd_print_char_odf(DString * out, char c) { + switch (c) { + case '"': + print_const("""); + break; + case '&': + print_const("&"); + break; + case '<': + print_const("<"); + break; + case '>': + print_const(">"); + break; + case '\t': + print_const(""); + default: + print_char(c); + break; + } +} + + +void mmd_print_string_odf(DString * out, const char * str) { + if (str == NULL) + return; + + while (*str != '\0') { + mmd_print_char_odf(out, *str); + str++; + } +} + + +void mmd_print_localized_char_odf(DString * out, unsigned short type, scratch_pad * scratch) { + switch (type) { + case DASH_N: + print_const("–"); + break; + case DASH_M: + print_const("—"); + break; + case ELLIPSIS: + print_const("…"); + break; + case APOSTROPHE: + print_const("’"); + break; + case QUOTE_LEFT_SINGLE: + switch (scratch->quotes_lang) { + case SWEDISH: + print( "’"); + break; + case FRENCH: + print_const("'"); + break; + case GERMAN: + print_const("‚"); + break; + case GERMANGUILL: + print_const("›"); + break; + default: + print_const("‘"); + } + break; + case QUOTE_RIGHT_SINGLE: + switch (scratch->quotes_lang) { + case GERMAN: + print_const("‘"); + break; + case GERMANGUILL: + print_const("‹"); + break; + default: + print_const("’"); + } + break; + case QUOTE_LEFT_DOUBLE: + switch (scratch->quotes_lang) { + case DUTCH: + case GERMAN: + print_const("„"); + break; + case GERMANGUILL: + print_const("»"); + break; + case FRENCH: + print_const("«"); + break; + case SWEDISH: + print( "”"); + break; + default: + print_const("“"); + } + break; + case QUOTE_RIGHT_DOUBLE: + switch (scratch->quotes_lang) { + case GERMAN: + print_const("“"); + break; + case GERMANGUILL: + print_const("«"); + break; + case FRENCH: + print_const("»"); + break; + case SWEDISH: + case DUTCH: + default: + print_const("”"); + } + break; + } +} + + +void mmd_export_link_odf(DString * out, const char * source, token * text, link * link, scratch_pad * scratch) { + if (link->url) { + print_const("url); + print_const("\""); + } else + print_const("title && link->title[0] != '\0') { + print_const(" office:name=\""); + mmd_print_string_odf(out, link->title); + print_const("\""); + } + + print_const(">"); + + // If we're printing contents of bracket as text, then ensure we include it all + if (text && text->child && text->child->len > 1) { + text->child->next->start--; + text->child->next->len++; + } + + mmd_export_token_tree_odf(out, source, text->child, scratch); + + print_const(""); +} + + +static char * correct_dimension_units(char *original) { + char *result; + int i; + + result = my_strdup(original); + + for (i = 0; result[i]; i++) + result[i] = tolower(result[i]); + + if (strstr(&result[strlen(result)-2],"px")) { + result[strlen(result)-2] = '\0'; + strcat(result, "pt"); + } + + return result; +} + + +void mmd_export_image_odf(DString * out, const char * source, token * text, link * link, scratch_pad * scratch, bool is_figure) { + attr * a = link->attributes; + char * height = NULL; + char * width = NULL; + + print_const("key) == 0) { + height = correct_dimension_units(a->value); + } else if (strcmp("width", a->key) == 0) { + width = correct_dimension_units(a->value); + } + + a = a->next; + } + + if (width) { + printf(" svg:width=\"%s\">\n", width); + } else { + print_const(" svg:width=\"95%\">\n"); + } + + print_const("url) + printf(">\nurl); + + print_const(" xlink:type=\"simple\" xlink:show=\"embed\" xlink:actuate=\"onLoad\" draw:filter-name=\"<All formats>\"/>\n"); + + if (is_figure) { + if (text) { + print_const("\nFigure Update Fields to calculate numbers: "); + mmd_export_token_tree_odf(out, source, text->child, scratch); + print_const(""); + } + } + + print_const("\n\n"); + + scratch->padded = 1; +} + + + +void mmd_export_toc_entry_odf(DString * out, const char * source, scratch_pad * scratch, size_t * counter, short level) { + token * entry, * next; + short entry_level, next_level; + char * temp_char; + + // Iterate over tokens + while (*counter < scratch->header_stack->size) { + // Get token for header + entry = stack_peek_index(scratch->header_stack, *counter); + entry_level = raw_level_for_header(entry); + + if (entry_level >= level) { + // This entry is a direct descendant of the parent + temp_char = label_from_header(source, entry); + printf("", temp_char); + mmd_export_token_tree_odf(out, source, entry->child, scratch); + print_const(" 1\n"); + + if (*counter < scratch->header_stack->size - 1) { + next = stack_peek_index(scratch->header_stack, *counter + 1); + next_level = next->type - BLOCK_H1 + 1; + if (next_level > entry_level) { + // This entry has children + (*counter)++; + mmd_export_toc_entry_odf(out, source, scratch, counter, entry_level + 1); + } + } + + free(temp_char); + } else if (entry_level < level ) { + // If entry < level, exit this level + // Decrement counter first, so that we can test it again later + (*counter)--; + break; + } + + // Increment counter + (*counter)++; + } +} + +void mmd_export_toc_odf(DString * out, const char * source, scratch_pad * scratch) { + size_t counter = 0; + + // TODO: Could use LC to internationalize this + print_const("\n"); + print_const("\n"); + print_const("Table of Contents\n"); + print_const("\n\n"); + print_const("\n"); + print_const("Table of Contents\n"); + print_const("\n"); + + mmd_export_toc_entry_odf(out, source, scratch, &counter, 0); + + print_const("\n\n\n"); +} + + +void mmd_export_token_odf(DString * out, const char * source, token * t, scratch_pad * scratch) { + if (t == NULL) + return; + + short temp_short; + short temp_short2; + short temp_short3; + link * temp_link = NULL; + char * temp_char = NULL; + char * temp_char2 = NULL; + bool temp_bool = 0; + token * temp_token = NULL; + footnote * temp_note = NULL; + + switch (t->type) { + case DOC_START_TOKEN: + mmd_export_token_tree_odf(out, source, t->child, scratch); + break; + case AMPERSAND: + case AMPERSAND_LONG: + print_const("&"); + break; + case ANGLE_LEFT: + print_const("<"); + break; + case ANGLE_RIGHT: + print_const(">"); + break; + case APOSTROPHE: + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(APOSTROPHE); + } + break; + case BACKTICK: + if (t->mate == NULL) + print_token(t); + else if (t->mate->type == QUOTE_RIGHT_ALT) + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(QUOTE_LEFT_DOUBLE); + } + else if (t->start < t->mate->start) { + print_const(""); + } else { + print_const(""); + } + break; + case BLOCK_BLOCKQUOTE: + pad(out, 2, scratch); + scratch->padded = 2; + temp_short2 = scratch->odf_para_type; + + scratch->odf_para_type = BLOCK_BLOCKQUOTE; + + mmd_export_token_tree_odf(out, source, t->child, scratch); + scratch->padded = 0; + scratch->odf_para_type = temp_short2; + break; + case BLOCK_CODE_FENCED: + pad(out, 2, scratch); + + temp_char = get_fence_language_specifier(t->child->child, source); + + if (temp_char) { + if (strncmp("{=", temp_char, 2) == 0) { + // Raw source + if (raw_filter_text_matches(temp_char, FORMAT_ODT)) { + switch (t->child->tail->type) { + case LINE_FENCE_BACKTICK_3: + case LINE_FENCE_BACKTICK_4: + case LINE_FENCE_BACKTICK_5: + temp_token = t->child->tail; + break; + default: + temp_token = NULL; + } + if (temp_token) { + d_string_append_c_array(out, &source[t->child->next->start], temp_token->start - t->child->next->start); + scratch->padded = 1; + } else { + d_string_append_c_array(out, &source[t->child->start + t->child->len], t->start + t->len - t->child->next->start); + scratch->padded = 0; + } + } + + break; + } + } + + free(temp_char); + + print_const(""); + mmd_export_token_tree_odf_raw(out, source, t->child->next, scratch); + print_const(""); + scratch->padded = 0; + break; + case BLOCK_CODE_INDENTED: + pad(out, 2, scratch); + print_const(""); + mmd_export_token_tree_odf_raw(out, source, t->child, scratch); + print_const(""); + scratch->padded = 0; + break; + case BLOCK_DEFINITION: + pad(out, 2, scratch); + temp_short2 = scratch->odf_para_type; + scratch->odf_para_type = BLOCK_DEFINITION; + + temp_short = scratch->list_is_tight; + if (!(t->child->next && (t->child->next->type == BLOCK_EMPTY) && t->child->next->next)) + scratch->list_is_tight = true; + + if (t->child && t->child->type != BLOCK_PARA) { + print_const(""); + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const(""); + } else { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + scratch->padded = 0; + + scratch->list_is_tight = temp_short; + scratch->odf_para_type = temp_short2; + break; + case BLOCK_DEFLIST: + pad(out, 2, scratch); + + // Group consecutive definition lists into a single list. + // lemon's LALR(1) parser can't properly handle this (to my understanding). + +// if (!(t->prev && (t->prev->type == BLOCK_DEFLIST))) +// print_const("
\n"); + + scratch->padded = 2; + + mmd_export_token_tree_odf(out, source, t->child, scratch); + pad(out, 1, scratch); + +// if (!(t->next && (t->next->type == BLOCK_DEFLIST))) +// print_const("
\n"); + + scratch->padded = 1; + break; + case BLOCK_EMPTY: + break; + case BLOCK_H1: + case BLOCK_H2: + case BLOCK_H3: + case BLOCK_H4: + case BLOCK_H5: + case BLOCK_H6: + case BLOCK_SETEXT_1: + case BLOCK_SETEXT_2: + pad(out, 2, scratch); + switch (t->type) { + case BLOCK_SETEXT_1: + temp_short = 1; + break; + case BLOCK_SETEXT_2: + temp_short = 2; + break; + default: + temp_short = t->type - BLOCK_H1 + 1; + } + + printf("", temp_short + scratch->base_header_level - 1); + + if (scratch->extensions & EXT_NO_LABELS) { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } else { + temp_char = label_from_header(source, t); + printf("", temp_char); + mmd_export_token_tree_odf(out, source, t->child, scratch); + //printf("", temp_char); + free(temp_char); + } + + print_const(""); + scratch->padded = 0; + break; + case BLOCK_HR: + pad(out, 2, scratch); + print_const(""); + scratch->padded = 0; + break; + case BLOCK_HTML: + // Don't print HTML + break; + case BLOCK_LIST_BULLETED_LOOSE: + case BLOCK_LIST_BULLETED: + temp_short = scratch->list_is_tight; + switch (t->type) { + case BLOCK_LIST_BULLETED_LOOSE: + scratch->list_is_tight = false; + break; + case BLOCK_LIST_BULLETED: + scratch->list_is_tight = true; + break; + } + pad(out, 2, scratch); + print_const(""); + scratch->padded = 1; + mmd_export_token_tree_odf(out, source, t->child, scratch); + pad(out, 2, scratch); + print_const(""); + scratch->padded = 0; + scratch->list_is_tight = temp_short; + break; + case BLOCK_LIST_ENUMERATED_LOOSE: + case BLOCK_LIST_ENUMERATED: + temp_short = scratch->list_is_tight; + switch (t->type) { + case BLOCK_LIST_ENUMERATED_LOOSE: + scratch->list_is_tight = false; + break; + case BLOCK_LIST_ENUMERATED: + scratch->list_is_tight = true; + break; + } + pad(out, 2, scratch); + print_const(""); + scratch->padded = 1; + mmd_export_token_tree_odf(out, source, t->child, scratch); + pad(out, 2, scratch); + print_const(""); + scratch->padded = 0; + scratch->list_is_tight = temp_short; + break; + case BLOCK_LIST_ITEM: + pad(out, 2, scratch); + print_const("\n"); + scratch->padded = 2; + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const(""); + scratch->padded = 0; + break; + case BLOCK_LIST_ITEM_TIGHT: + pad(out, 2, scratch); + print_const("\n"); + + if (t->child && t->child->type != BLOCK_PARA) + print_const("\n"); + + scratch->padded = 2; + mmd_export_token_tree_odf(out, source, t->child, scratch); + + if (t->child && t->child->type != BLOCK_PARA) + print_const(""); + + print_const(""); + scratch->padded = 0; + break; + case BLOCK_META: + break; + case BLOCK_PARA: + pad(out, 2, scratch); + print_const("odf_para_type) { + case BLOCK_BLOCKQUOTE: + case BLOCK_DEFINITION: + print_const(" text:style-name=\"Quotations\">"); + break; + case PAIR_BRACKET_ABBREVIATION: + case PAIR_BRACKET_CITATION: + case PAIR_BRACKET_FOOTNOTE: + case PAIR_BRACKET_GLOSSARY: + print_const(" text:style-name=\"Footnote\">"); + break; + default: + print_const(" text:style-name=\"Standard\">"); + break; + } + + mmd_export_token_tree_odf(out, source, t->child, scratch); + + print_const(""); + scratch->padded = 0; + break; + case BLOCK_TABLE: + pad(out, 2, scratch); + print_const("\n"); + + scratch->padded = 2; + read_table_column_alignments(source, t, scratch); + + for (int i = 0; i < scratch->table_column_count; ++i) + { + print_const("\n"); +// switch (scratch->table_alignment[i]) { +// case 'l': +// print_const("\n"); +// break; +// case 'L': +// print_const("\n"); +// break; +// case 'r': +// print_const("\n"); +// break; +// case 'R': +// print_const("\n"); +// break; +// case 'c': +// print_const("\n"); +// break; +// case 'C': +// print_const("\n"); +// break; +// default: +// print_const("\n"); +// break; +// } + } + scratch->padded = 1; + + mmd_export_token_tree_odf(out, source, t->child, scratch); + pad(out, 1, scratch); + print_const("\n"); + + // Are we followed by a caption? + if (table_has_caption(t)) { + temp_token = t->next->child; + + if (temp_token->next && + temp_token->next->type == PAIR_BRACKET) { + temp_token = temp_token->next; + } + + temp_char = label_from_token(source, temp_token); + printf("Table Update Fields to calculate numbers:", temp_char); + + t->next->child->child->type = TEXT_EMPTY; + t->next->child->child->mate->type = TEXT_EMPTY; + mmd_export_token_tree_odf(out, source, t->next->child->child, scratch); + + printf("\n", temp_char); + + free(temp_char); + temp_short = 1; + } else { + temp_short = 0; + } + + scratch->padded = 0; + scratch->skip_token = temp_short; + + break; + case BLOCK_TABLE_HEADER: + pad(out, 2, scratch); + scratch->in_table_header = 1; + mmd_export_token_tree_odf(out, source, t->child, scratch); + scratch->in_table_header = 0; + scratch->padded = 1; + break; + case BLOCK_TABLE_SECTION: + pad(out, 2, scratch); + scratch->padded = 2; + mmd_export_token_tree_odf(out, source, t->child, scratch); + scratch->padded = 0; + break; + case BLOCK_TOC: + pad(out, 2, scratch); + + mmd_export_toc_odf(out, source, scratch); + + scratch->padded = 1; + break; + case BLOCK_TERM: + pad(out, 2, scratch); + print_const(""); + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const("\n"); + scratch->padded = 2; + break; + case BRACE_DOUBLE_LEFT: + print_const("{{"); + break; + case BRACE_DOUBLE_RIGHT: + print_const("}}"); + break; + case BRACKET_ABBREVIATION_LEFT: + print_const("[>"); + break; + case BRACKET_CITATION_LEFT: + print_const("[#"); + break; + case BRACKET_LEFT: + print_const("["); + break; + case BRACKET_RIGHT: + print_const("]"); + break; + case BRACKET_VARIABLE_LEFT: + print_const("[\%"); + break; + case COLON: + print_char(':'); + break; + case CRITIC_ADD_OPEN: + print_const("{++"); + break; + case CRITIC_ADD_CLOSE: + print_const("++}"); + break; + case CRITIC_COM_OPEN: + print_const("{>>"); + break; + case CRITIC_COM_CLOSE: + print_const("<<}"); + break; + case CRITIC_DEL_OPEN: + print_const("{--"); + break; + case CRITIC_DEL_CLOSE: + print_const("--}"); + break; + case CRITIC_HI_OPEN: + print_const("{=="); + break; + case CRITIC_HI_CLOSE: + print_const("==}"); + break; + case CRITIC_SUB_OPEN: + print_const("{~~"); + break; + case CRITIC_SUB_DIV: + print_const("~>"); + break; + case CRITIC_SUB_CLOSE: + print_const("~~}"); + break; + case DASH_M: + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(DASH_M); + } + break; + case DASH_N: + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(DASH_N); + } + break; + case ELLIPSIS: + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(ELLIPSIS); + } + break; + case EMPH_START: + print_const(""); + break; + case EMPH_STOP: + print_const(""); + break; + case EQUAL: + print_char('='); + break; + case ESCAPED_CHARACTER: + if (!(scratch->extensions & EXT_COMPATIBILITY) && + (source[t->start + 1] == ' ')) { + print_const(" "); // This is a non-breaking space character + } else { + mmd_print_char_odf(out, source[t->start + 1]); + } + break; + case HASH1: + case HASH2: + case HASH3: + case HASH4: + case HASH5: + case HASH6: + print_token(t); + break; + case HTML_ENTITY: + print_const("&"); + d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1); + break; + case HTML_COMMENT_START: + if (!(scratch->extensions & EXT_SMART)) { + print_const("<!--"); + } else { + print_const("<!"); + print_localized(DASH_N); + } + break; + case HTML_COMMENT_STOP: + if (!(scratch->extensions & EXT_SMART)) { + print_const("-->"); + } else { + print_localized(DASH_N); + print_const(">"); + } + break; + case INDENT_SPACE: + print_char(' '); + break; + case INDENT_TAB: + print_const(""); + break; + case LINE_LIST_BULLETED: + case LINE_LIST_ENUMERATED: + mmd_export_token_tree_odf(out, source, t->child, scratch); + break; + case MANUAL_LABEL: + case MARKER_BLOCKQUOTE: + case MARKER_H1: + case MARKER_H2: + case MARKER_H3: + case MARKER_H4: + case MARKER_H5: + case MARKER_H6: + case MARKER_LIST_BULLET: + case MARKER_LIST_ENUMERATOR: + break; + case MATH_BRACKET_OPEN: + if (t->mate) { + print_const("\\["); + } else + print_const("\\["); + break; + case MATH_BRACKET_CLOSE: + if (t->mate) { + print_const("\\]"); + } else + print_const("\\]"); + break; + case MATH_DOLLAR_SINGLE: + if (t->mate) { + (t->start < t->mate->start) ? ( print_const("\\(") ) : ( print_const("\\)") ); + } else { + print_const("$"); + } + break; + case MATH_DOLLAR_DOUBLE: + if (t->mate) { + (t->start < t->mate->start) ? ( print_const("\\[") ) : ( print_const("\\]") ); + } else { + print_const("$$"); + } + break; + case MATH_PAREN_OPEN: + if (t->mate) { + print_const("\\("); + } else + print_const("\\("); + break; + case MATH_PAREN_CLOSE: + if (t->mate) { + print_const("\\)"); + } else + print_const("\\)"); + break; + case NON_INDENT_SPACE: + print_char(' '); + break; + case PAIR_ANGLE: + temp_char = url_accept(source, t->start + 1, t->len - 2, NULL, true); + + if (temp_char) { + print_const(""); + mmd_print_string_odf(out, temp_char); + print_const(""); + } else if (scan_html(&source[t->start])) { + // We ignore HTML blocks + if (scan_html_comment(&source[t->start])) { + // But allow HTML comments as raw LaTeX + d_string_append_c_array(out, &source[t->start + 4], t->len - 4 - 3); + } + } else { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + + free(temp_char); + break; + case PAIR_BACKTICK: + // Strip leading whitespace + switch (t->child->next->type) { + case TEXT_NL: + case INDENT_TAB: + case INDENT_SPACE: + case NON_INDENT_SPACE: + t->child->next->type = TEXT_EMPTY; + break; + case TEXT_PLAIN: + while (t->child->next->len && char_is_whitespace(source[t->child->next->start])) { + t->child->next->start++; + t->child->next->len--; + } + break; + } + + // Strip trailing whitespace + switch (t->child->mate->prev->type) { + case TEXT_NL: + case INDENT_TAB: + case INDENT_SPACE: + case NON_INDENT_SPACE: + t->child->mate->prev->type = TEXT_EMPTY; + break; + case TEXT_PLAIN: + while (t->child->mate->prev->len && char_is_whitespace(source[t->child->mate->prev->start + t->child->mate->prev->len - 1])) { + t->child->mate->prev->len--; + } + break; + } + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + + if (t->next && t->next->type == PAIR_RAW_FILTER) { + // Raw text? + if (raw_filter_matches(t->next, source, FORMAT_FODT)) { + d_string_append_c_array(out, &(source[t->child->start + t->child->len]), t->child->mate->start - t->child->start - t->child->len); + } + // Skip over PAIR_RAW_FILTER + scratch->skip_token = 1; + break; + } + + print_const(""); + mmd_export_token_tree_odf_raw(out, source, t->child, scratch); + print_const(""); + break; + case PAIR_BRACE: + case PAIR_BRACES: + mmd_export_token_tree_odf(out, source, t->child, scratch); + break; + case PAIR_BRACKET: + if ((scratch->extensions & EXT_NOTES) && + (t->next && t->next->type == PAIR_BRACKET_CITATION)) { + goto parse_citation; + } + + case PAIR_BRACKET_IMAGE: + parse_brackets(source, scratch, t, &temp_link, &temp_short, &temp_bool); + + if (temp_link) { + if (t->type == PAIR_BRACKET) { + // Link + mmd_export_link_odf(out, source, t, temp_link, scratch); + } else { + // Image -- should it be a figure (e.g. image is only thing in paragraph)? + temp_token = t->next; + + if (temp_token && + ((temp_token->type == PAIR_BRACKET) || + (temp_token->type == PAIR_PAREN))) { + temp_token = temp_token->next; + } + + if (temp_token && temp_token->type == TEXT_NL) + temp_token = temp_token->next; + + if (temp_token && temp_token->type == TEXT_LINEBREAK) + temp_token = temp_token->next; + + if (t->prev || temp_token) { + mmd_export_image_odf(out, source, t, temp_link, scratch, false); + } else { + mmd_export_image_odf(out, source, t, temp_link, scratch, true); + } + } + + if (temp_bool) { + link_free(temp_link); + } + + scratch->skip_token = temp_short; + + return; + } + + // No links exist, so treat as normal + mmd_export_token_tree_odf(out, source, t->child, scratch); + break; + case PAIR_BRACKET_CITATION: + parse_citation: + temp_bool = true; // Track whether this is regular vs 'not cited' + temp_token = t; // Remember whether we need to skip ahead + + if (scratch->extensions & EXT_NOTES) { + // Note-based syntax enabled + + if (t->type == PAIR_BRACKET) { + // This is a locator for a subsequent citation (e.g. `[foo][#bar]`) + temp_char = text_inside_pair(source, t); + temp_char2 = label_from_string(temp_char); + + if (strcmp(temp_char2, "notcited") == 0) { + free(temp_char); + temp_char = my_strdup(""); + temp_bool = false; + } + + free(temp_char2); + + // Move ahead to actual citation + t = t->next; + } else { + // This is the actual citation (e.g. `[#foo]`) + // No locator + temp_char = my_strdup(""); + } + + // Classify this use + temp_short2 = scratch->used_citations->size; + citation_from_bracket(source, scratch, t, &temp_short); + + if (temp_short == -1) { + // This instance is not properly formed + print_const("[#"); + mmd_export_token_tree_odf(out, source, t->child->next, scratch); + print_const("]"); + + free(temp_char); + break; + } + + + temp_short3 = scratch->odf_para_type; + scratch->odf_para_type = PAIR_BRACKET_FOOTNOTE; + + if (temp_bool) { + // This is a regular citation + + if (temp_char[0] == '\0') { + // No locator + + if (temp_short2 == scratch->used_citations->size) { + // This is a re-use of a previously used note + print_const("%d", temp_short, temp_short); + } else { + // This is the first time this note was used + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); + + mmd_export_token_tree_odf(out, source, temp_note->content, scratch); + print_const(""); + } + } else { + // Locator present + + if (temp_short2 == scratch->used_citations->size) { + // This is a re-use of a previously used note + print_const("%d", temp_short, temp_short); + } else { + // This is the first time this note was used + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); + + mmd_export_token_tree_odf(out, source, temp_note->content, scratch); + print_const(""); + } + } + } else { + if (temp_short2 == scratch->used_citations->size) { + // This is a re-use of a previously used note + } else { + // This is the first time this note was used + // TODO: Not sure how to add an endnote without inserting a marker in the text + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); + + mmd_export_token_tree_odf(out, source, temp_note->content, scratch); + print_const(""); + } + } + + if (temp_token != t) { + // Skip citation on next pass + scratch->skip_token = 1; + } + + scratch->odf_para_type = temp_short3; + + free(temp_char); + } else { + // Note-based syntax disabled + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_BRACKET_FOOTNOTE: + if (scratch->extensions & EXT_NOTES) { + // Note-based syntax enabled + + // Classify this use + temp_short2 = scratch->used_footnotes->size; + footnote_from_bracket(source, scratch, t, &temp_short); + + if (temp_short == -1) { + // This instance is not properly formed + print_const("[?"); + mmd_export_token_tree_odf(out, source, t->child->next, scratch); + print_const("]"); + break; + } + + temp_short3 = scratch->odf_para_type; + scratch->odf_para_type = PAIR_BRACKET_FOOTNOTE; + + if (temp_short2 == scratch->used_footnotes->size) { + // This is a re-use of a previously used note + + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_footnotes, temp_short - 1); + + mmd_export_token_tree_odf(out, source, temp_note->content, scratch); + print_const(""); + } else { + // This is the first time this note was used + + // This is a new footnote + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_footnotes, temp_short - 1); + + mmd_export_token_tree_odf(out, source, temp_note->content, scratch); + print_const(""); + } + + scratch->odf_para_type = temp_short3; + } else { + // Note-based syntax disabled + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_BRACKET_ABBREVIATION: + // Which might also be an "auto-tagged" abbreviation + if (scratch->extensions & EXT_NOTES) { + // Note-based syntax enabled + + // Classify this use + temp_short2 = scratch->used_abbreviations->size; + temp_short3 = scratch->inline_abbreviations_to_free->size; + abbreviation_from_bracket(source, scratch, t, &temp_short); + + if (temp_short == -1) { + // This instance is not properly formed + print_const("[>"); + mmd_export_token_tree_odf(out, source, t->child->next, scratch); + print_const("]"); + break; + } + + // Get instance of the note used + temp_note = stack_peek_index(scratch->used_abbreviations, temp_short - 1); + + if (t->child) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + } + + if (temp_short2 == scratch->used_abbreviations->size) { + // This is a re-use of a previously used note + + if (temp_short3 == scratch->inline_abbreviations_to_free->size) { + // This is a reference definition + mmd_print_string_odf(out, temp_note->label_text); +// mmd_export_token_tree_odf(out, source, t->child, scratch); + } else { + // This is an inline definition + mmd_print_string_odf(out, temp_note->label_text); +// mmd_export_token_tree_odf(out, source, t->child, scratch); + } + } else { + // This is the first time this note was used + temp_short2 = scratch->odf_para_type; + scratch->odf_para_type = PAIR_BRACKET_ABBREVIATION; + + if (temp_short3 == scratch->inline_abbreviations_to_free->size) { + // This is a reference definition + mmd_print_string_odf(out, temp_note->clean_text); + print_const(" ("); + mmd_print_string_odf(out, temp_note->label_text); + print_const(")"); + } else { + // This is an inline definition + mmd_print_string_odf(out, temp_note->clean_text); + print_const(" ("); + mmd_print_string_odf(out, temp_note->label_text); + print_const(")"); + } + + scratch->odf_para_type = temp_short2; + } + } else { + // Note-based syntax disabled + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_BRACKET_GLOSSARY: + // Which might also be an "auto-tagged" glossary + if (scratch->extensions & EXT_NOTES) { + // Note-based syntax enabled + + // Classify this use + temp_short2 = scratch->used_glossaries->size; + glossary_from_bracket(source, scratch, t, &temp_short); + + if (temp_short == -1) { + // This instance is not properly formed + print_const("[?"); + mmd_export_token_tree_odf(out, source, t->child->next, scratch); + print_const("]"); + break; + } + + // Get instance of the note used + temp_note = stack_peek_index(scratch->used_glossaries, temp_short - 1); + + temp_short3 = scratch->odf_para_type; + scratch->odf_para_type = PAIR_BRACKET_GLOSSARY; + + if (temp_short2 == scratch->used_glossaries->size) { + // This is a re-use of a previously used note + + mmd_print_string_odf(out, temp_note->clean_text); + } else { + // This is the first time this note was used + + mmd_print_string_odf(out, temp_note->clean_text); + + printf("", temp_short); + mmd_export_token_tree_odf(out, source, temp_note->content, scratch); + print_const(""); + } + + scratch->odf_para_type = temp_short3; + } else { + // Note-based syntax disabled + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_BRACKET_VARIABLE: + temp_char = text_inside_pair(source, t); + temp_char2 = extract_metadata(scratch, temp_char); + + if (temp_char2) + mmd_print_string_odf(out, temp_char2); + else + mmd_export_token_tree_odf(out, source, t->child, scratch); + + // Don't free temp_char2 (it belongs to meta *) + free(temp_char); + break; + case PAIR_CRITIC_ADD: + // Ignore if we're rejecting + if (scratch->extensions & EXT_CRITIC_REJECT) + break; + if (scratch->extensions & EXT_CRITIC) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + if (scratch->extensions & EXT_CRITIC_ACCEPT) { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } else { + print_const(""); + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const(""); + } + } else { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_CRITIC_DEL: + // Ignore if we're accepting + if (scratch->extensions & EXT_CRITIC_ACCEPT) + break; + if (scratch->extensions & EXT_CRITIC) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + if (scratch->extensions & EXT_CRITIC_REJECT) { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } else { + print_const(""); + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const(""); + } + } else { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_CRITIC_COM: + // Ignore if we're rejecting or accepting + if ((scratch->extensions & EXT_CRITIC_REJECT) || + (scratch->extensions & EXT_CRITIC_ACCEPT)) + break; + if (scratch->extensions & EXT_CRITIC) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + print_const(""); + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const(""); + } else { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_CRITIC_HI: + // Ignore if we're rejecting or accepting + if ((scratch->extensions & EXT_CRITIC_REJECT) || + (scratch->extensions & EXT_CRITIC_ACCEPT)) + break; + if (scratch->extensions & EXT_CRITIC) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + print_const(""); + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const(""); + } else { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case CRITIC_SUB_DIV_A: + print_const("~"); + break; + case CRITIC_SUB_DIV_B: + print_const(">"); + break; + case PAIR_CRITIC_SUB_DEL: + if ((scratch->extensions & EXT_CRITIC) && + (t->next) && + (t->next->type == PAIR_CRITIC_SUB_ADD)) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + if (scratch->extensions & EXT_CRITIC_ACCEPT) { + + } else if (scratch->extensions & EXT_CRITIC_REJECT) { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } else { + print_const(""); + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const(""); + } + } else { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_CRITIC_SUB_ADD: + if ((scratch->extensions & EXT_CRITIC) && + (t->prev) && + (t->prev->type == PAIR_CRITIC_SUB_DEL)) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + if (scratch->extensions & EXT_CRITIC_REJECT) { + + } else if (scratch->extensions & EXT_CRITIC_ACCEPT) { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } else { + print_const(""); + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const(""); + } + } else { + mmd_export_token_tree_odf(out, source, t->child, scratch); + } + break; + case PAIR_HTML_COMMENT: + break; + case PAIR_EMPH: + case PAIR_MATH: + case PAIR_PAREN: + case PAIR_QUOTE_DOUBLE: + case PAIR_QUOTE_SINGLE: + case PAIR_STAR: + case PAIR_STRONG: + case PAIR_SUBSCRIPT: + case PAIR_SUPERSCRIPT: + case PAIR_UL: + mmd_export_token_tree_odf(out, source, t->child, scratch); + break; + case PAREN_LEFT: + print_char('('); + break; + case PAREN_RIGHT: + print_char(')'); + break; + case PIPE: + print_token(t); + break; + case PLUS: + print_char('+'); + break; + case QUOTE_SINGLE: + if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) + print_const("'"); + else + (t->start < t->mate->start) ? ( print_localized(QUOTE_LEFT_SINGLE) ) : ( print_localized(QUOTE_RIGHT_SINGLE) ); + break; + case QUOTE_DOUBLE: + if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) + print_const("""); + else + (t->start < t->mate->start) ? ( print_localized(QUOTE_LEFT_DOUBLE) ) : ( print_localized(QUOTE_RIGHT_DOUBLE) ); + break; + case QUOTE_RIGHT_ALT: + if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) + print_const("''"); + else + print_localized(QUOTE_RIGHT_DOUBLE); + break; + case SLASH: + print_char('/'); + break; + case STAR: + print_char('*'); + break; + case STRONG_START: + print_const(""); + break; + case STRONG_STOP: + print_const(""); + break; + case SUBSCRIPT: + if (t->mate) { + (t->start < t->mate->start) ? (print_const("")) : (print_const("")); + } else if (t->len != 1) { + print_const(""); + mmd_export_token_odf(out, source, t->child, scratch); + print_const(""); + } else { + print_const("~"); + } + break; + case SUPERSCRIPT: + if (t->mate) { + (t->start < t->mate->start) ? (print_const("")) : (print_const("")); + } else if (t->len != 1) { + print_const(""); + mmd_export_token_odf(out, source, t->child, scratch); + print_const(""); + } else { + print_const("^"); + } + break; + case TABLE_CELL: + print_const("next && t->next->type == TABLE_DIVIDER) { + if (t->next->len > 1) { + printf(" table:number-columns-spanned=\"%d\"", t->next->len); + } + } + + if (scratch->in_table_header) { + print_const(">\n\ntable_alignment[scratch->table_cell_count]) { + case 'l': + case 'L': + default: + print_const(" text:style-name=\"MMD-Table\""); + break; + case 'r': + case 'R': + print_const(" text:style-name=\"MMD-Table-Right\""); + break; + case 'c': + case 'C': + print_const(" text:style-name=\"MMD-Table-Center\""); + break; + } + } + + print_const(">"); + mmd_export_token_tree_odf(out, source, t->child, scratch); + + print_const("\n\n"); + + if (t->next) + scratch->table_cell_count += t->next->len; + else + scratch->table_cell_count++; + + break; + case TABLE_DIVIDER: + break; + case TABLE_ROW: + print_const("\n"); + scratch->table_cell_count = 0; + mmd_export_token_tree_odf(out, source, t->child, scratch); + print_const("\n"); + break; + case TEXT_EMPTY: + break; + case TEXT_LINEBREAK: + if (t->next) { + print_const("\n"); + scratch->padded = 0; + } + break; + case TEXT_NL: + if (t->next) + print_char('\n'); + break; + case RAW_FILTER_LEFT: + case TEXT_BACKSLASH: + case TEXT_BRACE_LEFT: + case TEXT_BRACE_RIGHT: + case TEXT_HASH: + case TEXT_NUMBER_POSS_LIST: + case TEXT_PERCENT: + case TEXT_PERIOD: + case TEXT_PLAIN: + case TOC: + case UL: + print_token(t); + break; + default: + fprintf(stderr, "Unknown token type: %d\n", t->type); + token_describe(t, source); + break; + } +} + + +void mmd_export_token_tree_odf(DString * out, const char * source, token * t, scratch_pad * scratch) { + + // Prevent stack overflow with "dangerous" input causing extreme recursion + if (scratch->recurse_depth == kMaxExportRecursiveDepth) { + return; + } + + scratch->recurse_depth++; + + while (t != NULL) { + if (scratch->skip_token) { + scratch->skip_token--; + } else { + mmd_export_token_odf(out, source, t, scratch); + } + + t = t->next; + } + + scratch->recurse_depth--; +} + + +void mmd_export_token_odf_raw(DString * out, const char * source, token * t, scratch_pad * scratch) { + if (t == NULL) + return; + + switch (t->type) { + case AMPERSAND: + print_const("&"); + break; + case AMPERSAND_LONG: + print_const("&amp;"); + break; + case ANGLE_RIGHT: + print_const(">"); + break; + case ANGLE_LEFT: + print_const("<"); + break; + case ESCAPED_CHARACTER: + print_const("\\"); + mmd_print_char_odf(out, source[t->start + 1]); + break; + case HTML_ENTITY: + print_const("&"); + d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1); + break; + case INDENT_TAB: + print_const(""); + break; + case QUOTE_DOUBLE: + print_const("""); + break; + case CODE_FENCE: + if (t->next) + t->next->type = TEXT_EMPTY; + case TEXT_EMPTY: + break; + case TEXT_NL: + print_const(""); + break; + default: + if (t->child) + mmd_export_token_tree_odf_raw(out, source, t->child, scratch); + else + print_token(t); + break; + } +} + + +void mmd_export_token_tree_odf_raw(DString * out, const char * source, token * t, scratch_pad * scratch) { + while (t != NULL) { + if (scratch->skip_token) { + scratch->skip_token--; + } else { + mmd_export_token_odf_raw(out, source, t, scratch); + } + + t = t->next; + } +} + + +void mmd_start_complete_odf(DString * out, const char * source, scratch_pad * scratch) { + print_const("\n" \ +"\n"); + + /* Font Declarations */ + print_const("\n" \ + " \n" \ + "\n"); + + /* Append basic style information */ + print_const("\n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + "" \ + " " \ + " \n" \ + "\n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + " \n" \ + " \n" \ + "\n"); + + /* Automatic style information */ + print_const("" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + "\n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + " Bibliography\n" \ + " \n" \ + " \n"); + + // Iterate over metadata keys + meta * m; + + if (scratch->meta_hash) + print_const("\n"); + + for (m = scratch->meta_hash; m != NULL; m = m->hh.next) { + if (strcmp(m->key, "baseheaderlevel") == 0) { + } else if (strcmp(m->key, "bibliostyle") == 0) { + } else if (strcmp(m->key, "bibtex") == 0) { + } else if (strcmp(m->key, "css") == 0) { + } else if (strcmp(m->key, "htmlfooter") == 0) { + } else if (strcmp(m->key, "htmlheader") == 0) { + } else if (strcmp(m->key, "htmlheaderlevel") == 0) { + } else if (strcmp(m->key, "language") == 0) { + } else if (strcmp(m->key, "latexbegin") == 0) { + } else if (strcmp(m->key, "latexconfig") == 0) { + } else if (strcmp(m->key, "latexfooter") == 0) { + } else if (strcmp(m->key, "latexheaderlevel") == 0) { + } else if (strcmp(m->key, "latexinput") == 0) { + } else if (strcmp(m->key, "latexleader") == 0) { + } else if (strcmp(m->key, "latexmode") == 0) { + } else if (strcmp(m->key, "mmdfooter") == 0) { + } else if (strcmp(m->key, "mmdheader") == 0) { + } else if (strcmp(m->key, "quoteslanguage") == 0) { + } else if (strcmp(m->key, "title") == 0) { + print_const("\t"); + mmd_print_string_odf(out, m->value); + print_const("\n"); + } else if (strcmp(m->key, "transcludebase") == 0) { + } else if (strcmp(m->key, "xhtmlheader") == 0) { + print(m->value); + print_char('\n'); + } else if (strcmp(m->key, "xhtmlheaderlevel") == 0) { + } else { + print_const("\tkey); + print_const("\">"); + mmd_print_string_odf(out, m->value); + print_const("\n"); + } + } + + if (scratch->meta_hash) + print_const("\n"); + + print_const("\n\n"); +} + + +void mmd_end_complete_odf(DString * out, const char * source, scratch_pad * scratch) { + pad(out, 1, scratch); + print_const("\n\n"); +} + diff --git a/Sources/libMultiMarkdown/fodt.h b/Sources/libMultiMarkdown/fodt.h new file mode 100644 index 0000000..0f4ff93 --- /dev/null +++ b/Sources/libMultiMarkdown/fodt.h @@ -0,0 +1,81 @@ +/** + + MultiMarkdown -- Lightweight markup processor to produce HTML, odf, and more. + + @file fodt.h + + @brief Convert token tree to Flat OpenDocument (ODF/FODT) output + + + @author Fletcher T. Penney + @bug + +**/ + +/* + + Copyright © 2016 - 2017 Fletcher T. Penney. + + + The `MultiMarkdown 6` project is released under the MIT License.. + + GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project: + + https://github.com/fletcher/MultiMarkdown-4/ + + MMD 4 is released under both the MIT License and GPL. + + + CuTest is released under the zlib/libpng license. See CuTest.c for the + text of the license. + + + ## The MIT License ## + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +*/ + + +#ifndef FODT_MULTIMARKDOWN_H +#define FODT_MULTIMARKDOWN_H + + +#include "d_string.h" +#include "token.h" +#include "writer.h" + +void mmd_export_token_odf(DString * out, const char * source, token * t, scratch_pad * scratch); +void mmd_export_token_tree_odf(DString * out, const char * source, token * t, scratch_pad * scratch); + +void mmd_export_token_odf_raw(DString * out, const char * source, token * t, scratch_pad * scratch); +void mmd_export_token_tree_odf_raw(DString * out, const char * source, token * t, scratch_pad * scratch); + +void mmd_export_citation_list_odf(DString * out, const char * source, scratch_pad * scratch); +void mmd_export_footnote_list_odf(DString * out, const char * source, scratch_pad * scratch); + +void mmd_start_complete_odf(DString * out, const char * source, scratch_pad * scratch); +void mmd_end_complete_odf(DString * out, const char * source, scratch_pad * scratch); + +void mmd_export_citation_list_odf(DString * out, const char * source, scratch_pad * scratch); + + +#endif diff --git a/Sources/libMultiMarkdown/include/libMultiMarkdown.h b/Sources/libMultiMarkdown/include/libMultiMarkdown.h index 95778e0..ef3301a 100644 --- a/Sources/libMultiMarkdown/include/libMultiMarkdown.h +++ b/Sources/libMultiMarkdown/include/libMultiMarkdown.h @@ -478,7 +478,8 @@ enum output_format { FORMAT_LATEX, FORMAT_BEAMER, FORMAT_MEMOIR, - FORMAT_ODF, + FORMAT_FODT, + FORMAT_ODT, FORMAT_MMD, FORMAT_TEXTBUNDLE, FORMAT_TEXTBUNDLE_COMPRESSED, diff --git a/Sources/libMultiMarkdown/mmd.c b/Sources/libMultiMarkdown/mmd.c index 6413675..9215b4b 100644 --- a/Sources/libMultiMarkdown/mmd.c +++ b/Sources/libMultiMarkdown/mmd.c @@ -64,6 +64,7 @@ #include "libMultiMarkdown.h" #include "mmd.h" #include "object_pool.h" +#include "opendocument.h" #include "parser.h" #include "scanners.h" #include "stack.h" @@ -2310,6 +2311,16 @@ DString * mmd_engine_convert_to_data(mmd_engine * e, short format, const char * case FORMAT_TEXTBUNDLE_COMPRESSED: result = textbundle_create(output->str, e, directory); + d_string_free(output, true); + break; + case FORMAT_ODT: + result = opendocument_text_create(output->str, e, directory); + + d_string_free(output, true); + break; + case FORMAT_FODT: + result = opendocument_flat_text_create(output->str, e, directory); + d_string_free(output, true); break; default: diff --git a/Sources/libMultiMarkdown/odf.c b/Sources/libMultiMarkdown/odf.c index 0a8063a..61290cb 100644 --- a/Sources/libMultiMarkdown/odf.c +++ b/Sources/libMultiMarkdown/odf.c @@ -4,7 +4,7 @@ @file odf.c - @brief Convert token tree to Flat OpenDocument (ODF/FODT) output + @brief @author Fletcher T. Penney @@ -29,6 +29,24 @@ CuTest is released under the zlib/libpng license. See CuTest.c for the text of the license. + uthash library: + Copyright (c) 2005-2016, Troy D. Hanson + + Licensed under Revised BSD license + + miniz library: + Copyright 2013-2014 RAD Game Tools and Valve Software + Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC + + Licensed under the MIT license + + argtable3 library: + Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + + All rights reserved. + + Licensed under the Revised BSD License + ## The MIT License ## @@ -51,1981 +69,49 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - - -#include -#include -#include -#include - -#include "char.h" -#include "i18n.h" -#include "odf.h" -#include "parser.h" -#include "scanners.h" - -#define print(x) d_string_append(out, x) -#define print_const(x) d_string_append_c_array(out, x, sizeof(x) - 1) -#define print_char(x) d_string_append_c(out, x) -#define printf(...) d_string_append_printf(out, __VA_ARGS__) -#define print_token(t) d_string_append_c_array(out, &(source[t->start]), t->len) -#define print_localized(x) mmd_print_localized_char_odf(out, x, scratch) - - -/// strdup() not available on all platforms -static char * my_strdup(const char * source) { - char * result = malloc(strlen(source) + 1); - - if (result) { - strcpy(result, source); - } - - return result; -} - - -void mmd_print_char_odf(DString * out, char c) { - switch (c) { - case '"': - print_const("""); - break; - case '&': - print_const("&"); - break; - case '<': - print_const("<"); - break; - case '>': - print_const(">"); - break; - case '\t': - print_const(""); - default: - print_char(c); - break; - } -} - - -void mmd_print_string_odf(DString * out, const char * str) { - if (str == NULL) - return; - - while (*str != '\0') { - mmd_print_char_odf(out, *str); - str++; - } -} - - -void mmd_print_localized_char_odf(DString * out, unsigned short type, scratch_pad * scratch) { - switch (type) { - case DASH_N: - print_const("–"); - break; - case DASH_M: - print_const("—"); - break; - case ELLIPSIS: - print_const("…"); - break; - case APOSTROPHE: - print_const("’"); - break; - case QUOTE_LEFT_SINGLE: - switch (scratch->quotes_lang) { - case SWEDISH: - print( "’"); - break; - case FRENCH: - print_const("'"); - break; - case GERMAN: - print_const("‚"); - break; - case GERMANGUILL: - print_const("›"); - break; - default: - print_const("‘"); - } - break; - case QUOTE_RIGHT_SINGLE: - switch (scratch->quotes_lang) { - case GERMAN: - print_const("‘"); - break; - case GERMANGUILL: - print_const("‹"); - break; - default: - print_const("’"); - } - break; - case QUOTE_LEFT_DOUBLE: - switch (scratch->quotes_lang) { - case DUTCH: - case GERMAN: - print_const("„"); - break; - case GERMANGUILL: - print_const("»"); - break; - case FRENCH: - print_const("«"); - break; - case SWEDISH: - print( "”"); - break; - default: - print_const("“"); - } - break; - case QUOTE_RIGHT_DOUBLE: - switch (scratch->quotes_lang) { - case GERMAN: - print_const("“"); - break; - case GERMANGUILL: - print_const("«"); - break; - case FRENCH: - print_const("»"); - break; - case SWEDISH: - case DUTCH: - default: - print_const("”"); - } - break; - } -} - - -void mmd_export_link_odf(DString * out, const char * source, token * text, link * link, scratch_pad * scratch) { - if (link->url) { - print_const("url); - print_const("\""); - } else - print_const("
title && link->title[0] != '\0') { - print_const(" office:name=\""); - mmd_print_string_odf(out, link->title); - print_const("\""); - } - - print_const(">"); - - // If we're printing contents of bracket as text, then ensure we include it all - if (text && text->child && text->child->len > 1) { - text->child->next->start--; - text->child->next->len++; - } - - mmd_export_token_tree_odf(out, source, text->child, scratch); - - print_const(""); -} - - -static char * correct_dimension_units(char *original) { - char *result; - int i; - - result = my_strdup(original); - for (i = 0; result[i]; i++) - result[i] = tolower(result[i]); - - if (strstr(&result[strlen(result)-2],"px")) { - result[strlen(result)-2] = '\0'; - strcat(result, "pt"); - } - - return result; -} - - -void mmd_export_image_odf(DString * out, const char * source, token * text, link * link, scratch_pad * scratch, bool is_figure) { - attr * a = link->attributes; - char * height = NULL; - char * width = NULL; - - print_const("key) == 0) { - height = correct_dimension_units(a->value); - } else if (strcmp("width", a->key) == 0) { - width = correct_dimension_units(a->value); - } - - a = a->next; - } - - if (width) { - printf(" svg:width=\"%s\">\n", width); - } else { - print_const(" svg:width=\"95%\">\n"); - } - - print_const("url) - printf(">\nurl); - - print_const(" xlink:type=\"simple\" xlink:show=\"embed\" xlink:actuate=\"onLoad\" draw:filter-name=\"<All formats>\"/>\n"); - - if (is_figure) { - if (text) { - print_const("\nFigure Update Fields to calculate numbers: "); - mmd_export_token_tree_odf(out, source, text->child, scratch); - print_const(""); - } - } - - print_const("\n\n"); - - scratch->padded = 1; -} - - - -void mmd_export_toc_entry_odf(DString * out, const char * source, scratch_pad * scratch, size_t * counter, short level) { - token * entry, * next; - short entry_level, next_level; - char * temp_char; - - // Iterate over tokens - while (*counter < scratch->header_stack->size) { - // Get token for header - entry = stack_peek_index(scratch->header_stack, *counter); - entry_level = raw_level_for_header(entry); - - if (entry_level >= level) { - // This entry is a direct descendant of the parent - temp_char = label_from_header(source, entry); - printf("", temp_char); - mmd_export_token_tree_odf(out, source, entry->child, scratch); - print_const(" 1\n"); - - if (*counter < scratch->header_stack->size - 1) { - next = stack_peek_index(scratch->header_stack, *counter + 1); - next_level = next->type - BLOCK_H1 + 1; - if (next_level > entry_level) { - // This entry has children - (*counter)++; - mmd_export_toc_entry_odf(out, source, scratch, counter, entry_level + 1); - } - } - - free(temp_char); - } else if (entry_level < level ) { - // If entry < level, exit this level - // Decrement counter first, so that we can test it again later - (*counter)--; - break; - } - - // Increment counter - (*counter)++; - } -} - -void mmd_export_toc_odf(DString * out, const char * source, scratch_pad * scratch) { - size_t counter = 0; - - // TODO: Could use LC to internationalize this - print_const("\n"); - print_const("\n"); - print_const("Table of Contents\n"); - print_const("\n\n"); - print_const("\n"); - print_const("Table of Contents\n"); - print_const("\n"); - - mmd_export_toc_entry_odf(out, source, scratch, &counter, 0); - - print_const("\n\n\n"); -} - - -void mmd_export_token_odf(DString * out, const char * source, token * t, scratch_pad * scratch) { - if (t == NULL) - return; - - short temp_short; - short temp_short2; - short temp_short3; - link * temp_link = NULL; - char * temp_char = NULL; - char * temp_char2 = NULL; - bool temp_bool = 0; - token * temp_token = NULL; - footnote * temp_note = NULL; - - switch (t->type) { - case DOC_START_TOKEN: - mmd_export_token_tree_odf(out, source, t->child, scratch); - break; - case AMPERSAND: - case AMPERSAND_LONG: - print_const("&"); - break; - case ANGLE_LEFT: - print_const("<"); - break; - case ANGLE_RIGHT: - print_const(">"); - break; - case APOSTROPHE: - if (!(scratch->extensions & EXT_SMART)) { - print_token(t); - } else { - print_localized(APOSTROPHE); - } - break; - case BACKTICK: - if (t->mate == NULL) - print_token(t); - else if (t->mate->type == QUOTE_RIGHT_ALT) - if (!(scratch->extensions & EXT_SMART)) { - print_token(t); - } else { - print_localized(QUOTE_LEFT_DOUBLE); - } - else if (t->start < t->mate->start) { - print_const(""); - } else { - print_const(""); - } - break; - case BLOCK_BLOCKQUOTE: - pad(out, 2, scratch); - scratch->padded = 2; - temp_short2 = scratch->odf_para_type; - - scratch->odf_para_type = BLOCK_BLOCKQUOTE; - - mmd_export_token_tree_odf(out, source, t->child, scratch); - scratch->padded = 0; - scratch->odf_para_type = temp_short2; - break; - case BLOCK_CODE_FENCED: - pad(out, 2, scratch); - - temp_char = get_fence_language_specifier(t->child->child, source); - - if (temp_char) { - if (strncmp("{=", temp_char, 2) == 0) { - // Raw source - if (raw_filter_text_matches(temp_char, FORMAT_HTML)) { - switch (t->child->tail->type) { - case LINE_FENCE_BACKTICK_3: - case LINE_FENCE_BACKTICK_4: - case LINE_FENCE_BACKTICK_5: - temp_token = t->child->tail; - break; - default: - temp_token = NULL; - } - if (temp_token) { - d_string_append_c_array(out, &source[t->child->next->start], temp_token->start - t->child->next->start); - scratch->padded = 1; - } else { - d_string_append_c_array(out, &source[t->child->start + t->child->len], t->start + t->len - t->child->next->start); - scratch->padded = 0; - } - } - - break; - } - } - - free(temp_char); - - print_const(""); - mmd_export_token_tree_odf_raw(out, source, t->child->next, scratch); - print_const(""); - scratch->padded = 0; - break; - case BLOCK_CODE_INDENTED: - pad(out, 2, scratch); - print_const(""); - mmd_export_token_tree_odf_raw(out, source, t->child, scratch); - print_const(""); - scratch->padded = 0; - break; - case BLOCK_DEFINITION: - pad(out, 2, scratch); - temp_short2 = scratch->odf_para_type; - scratch->odf_para_type = BLOCK_DEFINITION; - - temp_short = scratch->list_is_tight; - if (!(t->child->next && (t->child->next->type == BLOCK_EMPTY) && t->child->next->next)) - scratch->list_is_tight = true; - - if (t->child && t->child->type != BLOCK_PARA) { - print_const(""); - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const(""); - } else { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - scratch->padded = 0; - - scratch->list_is_tight = temp_short; - scratch->odf_para_type = temp_short2; - break; - case BLOCK_DEFLIST: - pad(out, 2, scratch); - - // Group consecutive definition lists into a single list. - // lemon's LALR(1) parser can't properly handle this (to my understanding). - -// if (!(t->prev && (t->prev->type == BLOCK_DEFLIST))) -// print_const("
\n"); + ## Revised BSD License ## + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR + PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - scratch->padded = 2; - - mmd_export_token_tree_odf(out, source, t->child, scratch); - pad(out, 1, scratch); - -// if (!(t->next && (t->next->type == BLOCK_DEFLIST))) -// print_const("
\n"); - - scratch->padded = 1; - break; - case BLOCK_EMPTY: - break; - case BLOCK_H1: - case BLOCK_H2: - case BLOCK_H3: - case BLOCK_H4: - case BLOCK_H5: - case BLOCK_H6: - case BLOCK_SETEXT_1: - case BLOCK_SETEXT_2: - pad(out, 2, scratch); - switch (t->type) { - case BLOCK_SETEXT_1: - temp_short = 1; - break; - case BLOCK_SETEXT_2: - temp_short = 2; - break; - default: - temp_short = t->type - BLOCK_H1 + 1; - } - - printf("", temp_short + scratch->base_header_level - 1); - - if (scratch->extensions & EXT_NO_LABELS) { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } else { - temp_char = label_from_header(source, t); - printf("", temp_char); - mmd_export_token_tree_odf(out, source, t->child, scratch); - //printf("", temp_char); - free(temp_char); - } - - print_const(""); - scratch->padded = 0; - break; - case BLOCK_HR: - pad(out, 2, scratch); - print_const(""); - scratch->padded = 0; - break; - case BLOCK_HTML: - // Don't print HTML - break; - case BLOCK_LIST_BULLETED_LOOSE: - case BLOCK_LIST_BULLETED: - temp_short = scratch->list_is_tight; - switch (t->type) { - case BLOCK_LIST_BULLETED_LOOSE: - scratch->list_is_tight = false; - break; - case BLOCK_LIST_BULLETED: - scratch->list_is_tight = true; - break; - } - pad(out, 2, scratch); - print_const(""); - scratch->padded = 1; - mmd_export_token_tree_odf(out, source, t->child, scratch); - pad(out, 2, scratch); - print_const(""); - scratch->padded = 0; - scratch->list_is_tight = temp_short; - break; - case BLOCK_LIST_ENUMERATED_LOOSE: - case BLOCK_LIST_ENUMERATED: - temp_short = scratch->list_is_tight; - switch (t->type) { - case BLOCK_LIST_ENUMERATED_LOOSE: - scratch->list_is_tight = false; - break; - case BLOCK_LIST_ENUMERATED: - scratch->list_is_tight = true; - break; - } - pad(out, 2, scratch); - print_const(""); - scratch->padded = 1; - mmd_export_token_tree_odf(out, source, t->child, scratch); - pad(out, 2, scratch); - print_const(""); - scratch->padded = 0; - scratch->list_is_tight = temp_short; - break; - case BLOCK_LIST_ITEM: - pad(out, 2, scratch); - print_const("\n"); - scratch->padded = 2; - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const(""); - scratch->padded = 0; - break; - case BLOCK_LIST_ITEM_TIGHT: - pad(out, 2, scratch); - print_const("\n"); - - if (t->child && t->child->type != BLOCK_PARA) - print_const("\n"); - - scratch->padded = 2; - mmd_export_token_tree_odf(out, source, t->child, scratch); - - if (t->child && t->child->type != BLOCK_PARA) - print_const(""); - - print_const(""); - scratch->padded = 0; - break; - case BLOCK_META: - break; - case BLOCK_PARA: - pad(out, 2, scratch); - print_const("odf_para_type) { - case BLOCK_BLOCKQUOTE: - case BLOCK_DEFINITION: - print_const(" text:style-name=\"Quotations\">"); - break; - case PAIR_BRACKET_ABBREVIATION: - case PAIR_BRACKET_CITATION: - case PAIR_BRACKET_FOOTNOTE: - case PAIR_BRACKET_GLOSSARY: - print_const(" text:style-name=\"Footnote\">"); - break; - default: - print_const(" text:style-name=\"Standard\">"); - break; - } - - mmd_export_token_tree_odf(out, source, t->child, scratch); - - print_const(""); - scratch->padded = 0; - break; - case BLOCK_TABLE: - pad(out, 2, scratch); - print_const("\n"); - - scratch->padded = 2; - read_table_column_alignments(source, t, scratch); - - for (int i = 0; i < scratch->table_column_count; ++i) - { - print_const("\n"); -// switch (scratch->table_alignment[i]) { -// case 'l': -// print_const("\n"); -// break; -// case 'L': -// print_const("\n"); -// break; -// case 'r': -// print_const("\n"); -// break; -// case 'R': -// print_const("\n"); -// break; -// case 'c': -// print_const("\n"); -// break; -// case 'C': -// print_const("\n"); -// break; -// default: -// print_const("\n"); -// break; -// } - } - scratch->padded = 1; - - mmd_export_token_tree_odf(out, source, t->child, scratch); - pad(out, 1, scratch); - print_const("\n"); - - // Are we followed by a caption? - if (table_has_caption(t)) { - temp_token = t->next->child; - - if (temp_token->next && - temp_token->next->type == PAIR_BRACKET) { - temp_token = temp_token->next; - } - temp_char = label_from_token(source, temp_token); - printf("Table Update Fields to calculate numbers:", temp_char); - - t->next->child->child->type = TEXT_EMPTY; - t->next->child->child->mate->type = TEXT_EMPTY; - mmd_export_token_tree_odf(out, source, t->next->child->child, scratch); - - printf("\n", temp_char); - - free(temp_char); - temp_short = 1; - } else { - temp_short = 0; - } - - scratch->padded = 0; - scratch->skip_token = temp_short; - - break; - case BLOCK_TABLE_HEADER: - pad(out, 2, scratch); - scratch->in_table_header = 1; - mmd_export_token_tree_odf(out, source, t->child, scratch); - scratch->in_table_header = 0; - scratch->padded = 1; - break; - case BLOCK_TABLE_SECTION: - pad(out, 2, scratch); - scratch->padded = 2; - mmd_export_token_tree_odf(out, source, t->child, scratch); - scratch->padded = 0; - break; - case BLOCK_TOC: - pad(out, 2, scratch); - - mmd_export_toc_odf(out, source, scratch); - - scratch->padded = 1; - break; - case BLOCK_TERM: - pad(out, 2, scratch); - print_const(""); - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const("\n"); - scratch->padded = 2; - break; - case BRACE_DOUBLE_LEFT: - print_const("{{"); - break; - case BRACE_DOUBLE_RIGHT: - print_const("}}"); - break; - case BRACKET_ABBREVIATION_LEFT: - print_const("[>"); - break; - case BRACKET_CITATION_LEFT: - print_const("[#"); - break; - case BRACKET_LEFT: - print_const("["); - break; - case BRACKET_RIGHT: - print_const("]"); - break; - case BRACKET_VARIABLE_LEFT: - print_const("[\%"); - break; - case COLON: - print_char(':'); - break; - case CRITIC_ADD_OPEN: - print_const("{++"); - break; - case CRITIC_ADD_CLOSE: - print_const("++}"); - break; - case CRITIC_COM_OPEN: - print_const("{>>"); - break; - case CRITIC_COM_CLOSE: - print_const("<<}"); - break; - case CRITIC_DEL_OPEN: - print_const("{--"); - break; - case CRITIC_DEL_CLOSE: - print_const("--}"); - break; - case CRITIC_HI_OPEN: - print_const("{=="); - break; - case CRITIC_HI_CLOSE: - print_const("==}"); - break; - case CRITIC_SUB_OPEN: - print_const("{~~"); - break; - case CRITIC_SUB_DIV: - print_const("~>"); - break; - case CRITIC_SUB_CLOSE: - print_const("~~}"); - break; - case DASH_M: - if (!(scratch->extensions & EXT_SMART)) { - print_token(t); - } else { - print_localized(DASH_M); - } - break; - case DASH_N: - if (!(scratch->extensions & EXT_SMART)) { - print_token(t); - } else { - print_localized(DASH_N); - } - break; - case ELLIPSIS: - if (!(scratch->extensions & EXT_SMART)) { - print_token(t); - } else { - print_localized(ELLIPSIS); - } - break; - case EMPH_START: - print_const(""); - break; - case EMPH_STOP: - print_const(""); - break; - case EQUAL: - print_char('='); - break; - case ESCAPED_CHARACTER: - if (!(scratch->extensions & EXT_COMPATIBILITY) && - (source[t->start + 1] == ' ')) { - print_const(" "); // This is a non-breaking space character - } else { - mmd_print_char_odf(out, source[t->start + 1]); - } - break; - case HASH1: - case HASH2: - case HASH3: - case HASH4: - case HASH5: - case HASH6: - print_token(t); - break; - case HTML_ENTITY: - print_const("&"); - d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1); - break; - case HTML_COMMENT_START: - if (!(scratch->extensions & EXT_SMART)) { - print_const("<!--"); - } else { - print_const("<!"); - print_localized(DASH_N); - } - break; - case HTML_COMMENT_STOP: - if (!(scratch->extensions & EXT_SMART)) { - print_const("-->"); - } else { - print_localized(DASH_N); - print_const(">"); - } - break; - case INDENT_SPACE: - print_char(' '); - break; - case INDENT_TAB: - print_const(""); - break; - case LINE_LIST_BULLETED: - case LINE_LIST_ENUMERATED: - mmd_export_token_tree_odf(out, source, t->child, scratch); - break; - case MANUAL_LABEL: - case MARKER_BLOCKQUOTE: - case MARKER_H1: - case MARKER_H2: - case MARKER_H3: - case MARKER_H4: - case MARKER_H5: - case MARKER_H6: - case MARKER_LIST_BULLET: - case MARKER_LIST_ENUMERATOR: - break; - case MATH_BRACKET_OPEN: - if (t->mate) { - print_const("\\["); - } else - print_const("\\["); - break; - case MATH_BRACKET_CLOSE: - if (t->mate) { - print_const("\\]"); - } else - print_const("\\]"); - break; - case MATH_DOLLAR_SINGLE: - if (t->mate) { - (t->start < t->mate->start) ? ( print_const("\\(") ) : ( print_const("\\)") ); - } else { - print_const("$"); - } - break; - case MATH_DOLLAR_DOUBLE: - if (t->mate) { - (t->start < t->mate->start) ? ( print_const("\\[") ) : ( print_const("\\]") ); - } else { - print_const("$$"); - } - break; - case MATH_PAREN_OPEN: - if (t->mate) { - print_const("\\("); - } else - print_const("\\("); - break; - case MATH_PAREN_CLOSE: - if (t->mate) { - print_const("\\)"); - } else - print_const("\\)"); - break; - case NON_INDENT_SPACE: - print_char(' '); - break; - case PAIR_ANGLE: - temp_char = url_accept(source, t->start + 1, t->len - 2, NULL, true); - - if (temp_char) { - print_const(""); - mmd_print_string_odf(out, temp_char); - print_const(""); - } else if (scan_html(&source[t->start])) { - // We ignore HTML blocks - if (scan_html_comment(&source[t->start])) { - // But allow HTML comments as raw LaTeX - d_string_append_c_array(out, &source[t->start + 4], t->len - 4 - 3); - } - } else { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - - free(temp_char); - break; - case PAIR_BACKTICK: - // Strip leading whitespace - switch (t->child->next->type) { - case TEXT_NL: - case INDENT_TAB: - case INDENT_SPACE: - case NON_INDENT_SPACE: - t->child->next->type = TEXT_EMPTY; - break; - case TEXT_PLAIN: - while (t->child->next->len && char_is_whitespace(source[t->child->next->start])) { - t->child->next->start++; - t->child->next->len--; - } - break; - } - - // Strip trailing whitespace - switch (t->child->mate->prev->type) { - case TEXT_NL: - case INDENT_TAB: - case INDENT_SPACE: - case NON_INDENT_SPACE: - t->child->mate->prev->type = TEXT_EMPTY; - break; - case TEXT_PLAIN: - while (t->child->mate->prev->len && char_is_whitespace(source[t->child->mate->prev->start + t->child->mate->prev->len - 1])) { - t->child->mate->prev->len--; - } - break; - } - t->child->type = TEXT_EMPTY; - t->child->mate->type = TEXT_EMPTY; - - if (t->next && t->next->type == PAIR_RAW_FILTER) { - // Raw text? - if (raw_filter_matches(t->next, source, FORMAT_ODF)) { - d_string_append_c_array(out, &(source[t->child->start + t->child->len]), t->child->mate->start - t->child->start - t->child->len); - } - // Skip over PAIR_RAW_FILTER - scratch->skip_token = 1; - break; - } - - print_const(""); - mmd_export_token_tree_odf_raw(out, source, t->child, scratch); - print_const(""); - break; - case PAIR_BRACE: - case PAIR_BRACES: - mmd_export_token_tree_odf(out, source, t->child, scratch); - break; - case PAIR_BRACKET: - if ((scratch->extensions & EXT_NOTES) && - (t->next && t->next->type == PAIR_BRACKET_CITATION)) { - goto parse_citation; - } - - case PAIR_BRACKET_IMAGE: - parse_brackets(source, scratch, t, &temp_link, &temp_short, &temp_bool); - - if (temp_link) { - if (t->type == PAIR_BRACKET) { - // Link - mmd_export_link_odf(out, source, t, temp_link, scratch); - } else { - // Image -- should it be a figure (e.g. image is only thing in paragraph)? - temp_token = t->next; - - if (temp_token && - ((temp_token->type == PAIR_BRACKET) || - (temp_token->type == PAIR_PAREN))) { - temp_token = temp_token->next; - } - - if (temp_token && temp_token->type == TEXT_NL) - temp_token = temp_token->next; - - if (temp_token && temp_token->type == TEXT_LINEBREAK) - temp_token = temp_token->next; - - if (t->prev || temp_token) { - mmd_export_image_odf(out, source, t, temp_link, scratch, false); - } else { - mmd_export_image_odf(out, source, t, temp_link, scratch, true); - } - } - - if (temp_bool) { - link_free(temp_link); - } - - scratch->skip_token = temp_short; - - return; - } - - // No links exist, so treat as normal - mmd_export_token_tree_odf(out, source, t->child, scratch); - break; - case PAIR_BRACKET_CITATION: - parse_citation: - temp_bool = true; // Track whether this is regular vs 'not cited' - temp_token = t; // Remember whether we need to skip ahead - - if (scratch->extensions & EXT_NOTES) { - // Note-based syntax enabled - - if (t->type == PAIR_BRACKET) { - // This is a locator for a subsequent citation (e.g. `[foo][#bar]`) - temp_char = text_inside_pair(source, t); - temp_char2 = label_from_string(temp_char); - - if (strcmp(temp_char2, "notcited") == 0) { - free(temp_char); - temp_char = my_strdup(""); - temp_bool = false; - } - - free(temp_char2); - - // Move ahead to actual citation - t = t->next; - } else { - // This is the actual citation (e.g. `[#foo]`) - // No locator - temp_char = my_strdup(""); - } - - // Classify this use - temp_short2 = scratch->used_citations->size; - citation_from_bracket(source, scratch, t, &temp_short); - - if (temp_short == -1) { - // This instance is not properly formed - print_const("[#"); - mmd_export_token_tree_odf(out, source, t->child->next, scratch); - print_const("]"); - - free(temp_char); - break; - } - - - temp_short3 = scratch->odf_para_type; - scratch->odf_para_type = PAIR_BRACKET_FOOTNOTE; - - if (temp_bool) { - // This is a regular citation - - if (temp_char[0] == '\0') { - // No locator - - if (temp_short2 == scratch->used_citations->size) { - // This is a re-use of a previously used note - print_const("%d", temp_short, temp_short); - } else { - // This is the first time this note was used - printf("", temp_short); - temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); - - mmd_export_token_tree_odf(out, source, temp_note->content, scratch); - print_const(""); - } - } else { - // Locator present - - if (temp_short2 == scratch->used_citations->size) { - // This is a re-use of a previously used note - print_const("%d", temp_short, temp_short); - } else { - // This is the first time this note was used - printf("", temp_short); - temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); - - mmd_export_token_tree_odf(out, source, temp_note->content, scratch); - print_const(""); - } - } - } else { - if (temp_short2 == scratch->used_citations->size) { - // This is a re-use of a previously used note - } else { - // This is the first time this note was used - // TODO: Not sure how to add an endnote without inserting a marker in the text - printf("", temp_short); - temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); - - mmd_export_token_tree_odf(out, source, temp_note->content, scratch); - print_const(""); - } - } - - if (temp_token != t) { - // Skip citation on next pass - scratch->skip_token = 1; - } - - scratch->odf_para_type = temp_short3; - - free(temp_char); - } else { - // Note-based syntax disabled - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_BRACKET_FOOTNOTE: - if (scratch->extensions & EXT_NOTES) { - // Note-based syntax enabled - - // Classify this use - temp_short2 = scratch->used_footnotes->size; - footnote_from_bracket(source, scratch, t, &temp_short); - - if (temp_short == -1) { - // This instance is not properly formed - print_const("[?"); - mmd_export_token_tree_odf(out, source, t->child->next, scratch); - print_const("]"); - break; - } - - temp_short3 = scratch->odf_para_type; - scratch->odf_para_type = PAIR_BRACKET_FOOTNOTE; - - if (temp_short2 == scratch->used_footnotes->size) { - // This is a re-use of a previously used note - - printf("", temp_short); - temp_note = stack_peek_index(scratch->used_footnotes, temp_short - 1); - - mmd_export_token_tree_odf(out, source, temp_note->content, scratch); - print_const(""); - } else { - // This is the first time this note was used - - // This is a new footnote - printf("", temp_short); - temp_note = stack_peek_index(scratch->used_footnotes, temp_short - 1); - - mmd_export_token_tree_odf(out, source, temp_note->content, scratch); - print_const(""); - } - - scratch->odf_para_type = temp_short3; - } else { - // Note-based syntax disabled - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_BRACKET_ABBREVIATION: - // Which might also be an "auto-tagged" abbreviation - if (scratch->extensions & EXT_NOTES) { - // Note-based syntax enabled - - // Classify this use - temp_short2 = scratch->used_abbreviations->size; - temp_short3 = scratch->inline_abbreviations_to_free->size; - abbreviation_from_bracket(source, scratch, t, &temp_short); - - if (temp_short == -1) { - // This instance is not properly formed - print_const("[>"); - mmd_export_token_tree_odf(out, source, t->child->next, scratch); - print_const("]"); - break; - } - - // Get instance of the note used - temp_note = stack_peek_index(scratch->used_abbreviations, temp_short - 1); - - if (t->child) { - t->child->type = TEXT_EMPTY; - t->child->mate->type = TEXT_EMPTY; - } - - if (temp_short2 == scratch->used_abbreviations->size) { - // This is a re-use of a previously used note - - if (temp_short3 == scratch->inline_abbreviations_to_free->size) { - // This is a reference definition - mmd_print_string_odf(out, temp_note->label_text); -// mmd_export_token_tree_odf(out, source, t->child, scratch); - } else { - // This is an inline definition - mmd_print_string_odf(out, temp_note->label_text); -// mmd_export_token_tree_odf(out, source, t->child, scratch); - } - } else { - // This is the first time this note was used - temp_short2 = scratch->odf_para_type; - scratch->odf_para_type = PAIR_BRACKET_ABBREVIATION; - - if (temp_short3 == scratch->inline_abbreviations_to_free->size) { - // This is a reference definition - mmd_print_string_odf(out, temp_note->clean_text); - print_const(" ("); - mmd_print_string_odf(out, temp_note->label_text); - print_const(")"); - } else { - // This is an inline definition - mmd_print_string_odf(out, temp_note->clean_text); - print_const(" ("); - mmd_print_string_odf(out, temp_note->label_text); - print_const(")"); - } - - scratch->odf_para_type = temp_short2; - } - } else { - // Note-based syntax disabled - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_BRACKET_GLOSSARY: - // Which might also be an "auto-tagged" glossary - if (scratch->extensions & EXT_NOTES) { - // Note-based syntax enabled - - // Classify this use - temp_short2 = scratch->used_glossaries->size; - glossary_from_bracket(source, scratch, t, &temp_short); - - if (temp_short == -1) { - // This instance is not properly formed - print_const("[?"); - mmd_export_token_tree_odf(out, source, t->child->next, scratch); - print_const("]"); - break; - } - - // Get instance of the note used - temp_note = stack_peek_index(scratch->used_glossaries, temp_short - 1); - - temp_short3 = scratch->odf_para_type; - scratch->odf_para_type = PAIR_BRACKET_GLOSSARY; - - if (temp_short2 == scratch->used_glossaries->size) { - // This is a re-use of a previously used note - - mmd_print_string_odf(out, temp_note->clean_text); - } else { - // This is the first time this note was used - - mmd_print_string_odf(out, temp_note->clean_text); - - printf("", temp_short); - mmd_export_token_tree_odf(out, source, temp_note->content, scratch); - print_const(""); - } - - scratch->odf_para_type = temp_short3; - } else { - // Note-based syntax disabled - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_BRACKET_VARIABLE: - temp_char = text_inside_pair(source, t); - temp_char2 = extract_metadata(scratch, temp_char); - - if (temp_char2) - mmd_print_string_odf(out, temp_char2); - else - mmd_export_token_tree_odf(out, source, t->child, scratch); - - // Don't free temp_char2 (it belongs to meta *) - free(temp_char); - break; - case PAIR_CRITIC_ADD: - // Ignore if we're rejecting - if (scratch->extensions & EXT_CRITIC_REJECT) - break; - if (scratch->extensions & EXT_CRITIC) { - t->child->type = TEXT_EMPTY; - t->child->mate->type = TEXT_EMPTY; - if (scratch->extensions & EXT_CRITIC_ACCEPT) { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } else { - print_const(""); - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const(""); - } - } else { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_CRITIC_DEL: - // Ignore if we're accepting - if (scratch->extensions & EXT_CRITIC_ACCEPT) - break; - if (scratch->extensions & EXT_CRITIC) { - t->child->type = TEXT_EMPTY; - t->child->mate->type = TEXT_EMPTY; - if (scratch->extensions & EXT_CRITIC_REJECT) { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } else { - print_const(""); - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const(""); - } - } else { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_CRITIC_COM: - // Ignore if we're rejecting or accepting - if ((scratch->extensions & EXT_CRITIC_REJECT) || - (scratch->extensions & EXT_CRITIC_ACCEPT)) - break; - if (scratch->extensions & EXT_CRITIC) { - t->child->type = TEXT_EMPTY; - t->child->mate->type = TEXT_EMPTY; - print_const(""); - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const(""); - } else { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_CRITIC_HI: - // Ignore if we're rejecting or accepting - if ((scratch->extensions & EXT_CRITIC_REJECT) || - (scratch->extensions & EXT_CRITIC_ACCEPT)) - break; - if (scratch->extensions & EXT_CRITIC) { - t->child->type = TEXT_EMPTY; - t->child->mate->type = TEXT_EMPTY; - print_const(""); - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const(""); - } else { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case CRITIC_SUB_DIV_A: - print_const("~"); - break; - case CRITIC_SUB_DIV_B: - print_const(">"); - break; - case PAIR_CRITIC_SUB_DEL: - if ((scratch->extensions & EXT_CRITIC) && - (t->next) && - (t->next->type == PAIR_CRITIC_SUB_ADD)) { - t->child->type = TEXT_EMPTY; - t->child->mate->type = TEXT_EMPTY; - if (scratch->extensions & EXT_CRITIC_ACCEPT) { - - } else if (scratch->extensions & EXT_CRITIC_REJECT) { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } else { - print_const(""); - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const(""); - } - } else { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_CRITIC_SUB_ADD: - if ((scratch->extensions & EXT_CRITIC) && - (t->prev) && - (t->prev->type == PAIR_CRITIC_SUB_DEL)) { - t->child->type = TEXT_EMPTY; - t->child->mate->type = TEXT_EMPTY; - if (scratch->extensions & EXT_CRITIC_REJECT) { - - } else if (scratch->extensions & EXT_CRITIC_ACCEPT) { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } else { - print_const(""); - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const(""); - } - } else { - mmd_export_token_tree_odf(out, source, t->child, scratch); - } - break; - case PAIR_HTML_COMMENT: - break; - case PAIR_EMPH: - case PAIR_MATH: - case PAIR_PAREN: - case PAIR_QUOTE_DOUBLE: - case PAIR_QUOTE_SINGLE: - case PAIR_STAR: - case PAIR_STRONG: - case PAIR_SUBSCRIPT: - case PAIR_SUPERSCRIPT: - case PAIR_UL: - mmd_export_token_tree_odf(out, source, t->child, scratch); - break; - case PAREN_LEFT: - print_char('('); - break; - case PAREN_RIGHT: - print_char(')'); - break; - case PIPE: - print_token(t); - break; - case PLUS: - print_char('+'); - break; - case QUOTE_SINGLE: - if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) - print_const("'"); - else - (t->start < t->mate->start) ? ( print_localized(QUOTE_LEFT_SINGLE) ) : ( print_localized(QUOTE_RIGHT_SINGLE) ); - break; - case QUOTE_DOUBLE: - if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) - print_const("""); - else - (t->start < t->mate->start) ? ( print_localized(QUOTE_LEFT_DOUBLE) ) : ( print_localized(QUOTE_RIGHT_DOUBLE) ); - break; - case QUOTE_RIGHT_ALT: - if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) - print_const("''"); - else - print_localized(QUOTE_RIGHT_DOUBLE); - break; - case SLASH: - print_char('/'); - break; - case STAR: - print_char('*'); - break; - case STRONG_START: - print_const(""); - break; - case STRONG_STOP: - print_const(""); - break; - case SUBSCRIPT: - if (t->mate) { - (t->start < t->mate->start) ? (print_const("")) : (print_const("")); - } else if (t->len != 1) { - print_const(""); - mmd_export_token_odf(out, source, t->child, scratch); - print_const(""); - } else { - print_const("~"); - } - break; - case SUPERSCRIPT: - if (t->mate) { - (t->start < t->mate->start) ? (print_const("")) : (print_const("")); - } else if (t->len != 1) { - print_const(""); - mmd_export_token_odf(out, source, t->child, scratch); - print_const(""); - } else { - print_const("^"); - } - break; - case TABLE_CELL: - print_const("next && t->next->type == TABLE_DIVIDER) { - if (t->next->len > 1) { - printf(" table:number-columns-spanned=\"%d\"", t->next->len); - } - } - - if (scratch->in_table_header) { - print_const(">\n\ntable_alignment[scratch->table_cell_count]) { - case 'l': - case 'L': - default: - print_const(" text:style-name=\"MMD-Table\""); - break; - case 'r': - case 'R': - print_const(" text:style-name=\"MMD-Table-Right\""); - break; - case 'c': - case 'C': - print_const(" text:style-name=\"MMD-Table-Center\""); - break; - } - } - - print_const(">"); - mmd_export_token_tree_odf(out, source, t->child, scratch); - - print_const("\n\n"); - - if (t->next) - scratch->table_cell_count += t->next->len; - else - scratch->table_cell_count++; - - break; - case TABLE_DIVIDER: - break; - case TABLE_ROW: - print_const("\n"); - scratch->table_cell_count = 0; - mmd_export_token_tree_odf(out, source, t->child, scratch); - print_const("\n"); - break; - case TEXT_EMPTY: - break; - case TEXT_LINEBREAK: - if (t->next) { - print_const("\n"); - scratch->padded = 0; - } - break; - case TEXT_NL: - if (t->next) - print_char('\n'); - break; - case RAW_FILTER_LEFT: - case TEXT_BACKSLASH: - case TEXT_BRACE_LEFT: - case TEXT_BRACE_RIGHT: - case TEXT_HASH: - case TEXT_NUMBER_POSS_LIST: - case TEXT_PERCENT: - case TEXT_PERIOD: - case TEXT_PLAIN: - case TOC: - case UL: - print_token(t); - break; - default: - fprintf(stderr, "Unknown token type: %d\n", t->type); - token_describe(t, source); - break; - } -} - - -void mmd_export_token_tree_odf(DString * out, const char * source, token * t, scratch_pad * scratch) { - - // Prevent stack overflow with "dangerous" input causing extreme recursion - if (scratch->recurse_depth == kMaxExportRecursiveDepth) { - return; - } - - scratch->recurse_depth++; - - while (t != NULL) { - if (scratch->skip_token) { - scratch->skip_token--; - } else { - mmd_export_token_odf(out, source, t, scratch); - } - - t = t->next; - } - - scratch->recurse_depth--; -} - - -void mmd_export_token_odf_raw(DString * out, const char * source, token * t, scratch_pad * scratch) { - if (t == NULL) - return; - - switch (t->type) { - case AMPERSAND: - print_const("&"); - break; - case AMPERSAND_LONG: - print_const("&amp;"); - break; - case ANGLE_RIGHT: - print_const(">"); - break; - case ANGLE_LEFT: - print_const("<"); - break; - case ESCAPED_CHARACTER: - print_const("\\"); - mmd_print_char_odf(out, source[t->start + 1]); - break; - case HTML_ENTITY: - print_const("&"); - d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1); - break; - case INDENT_TAB: - print_const(""); - break; - case QUOTE_DOUBLE: - print_const("""); - break; - case CODE_FENCE: - if (t->next) - t->next->type = TEXT_EMPTY; - case TEXT_EMPTY: - break; - case TEXT_NL: - print_const(""); - break; - default: - if (t->child) - mmd_export_token_tree_odf_raw(out, source, t->child, scratch); - else - print_token(t); - break; - } -} - - -void mmd_export_token_tree_odf_raw(DString * out, const char * source, token * t, scratch_pad * scratch) { - while (t != NULL) { - if (scratch->skip_token) { - scratch->skip_token--; - } else { - mmd_export_token_odf_raw(out, source, t, scratch); - } - - t = t->next; - } -} - - -void mmd_start_complete_odf(DString * out, const char * source, scratch_pad * scratch) { - print_const("\n" \ -"\n"); - - /* Font Declarations */ - print_const("\n" \ - " \n" \ - "\n"); - - /* Append basic style information */ - print_const("\n" \ - "\n" \ - " \n" \ - " \n" \ - "\n" \ - " \n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - " \n" \ - "\n" \ - "" \ - " " \ - " \n" \ - "\n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - "\n" \ - " \n" \ - " \n" \ - "\n"); - - /* Automatic style information */ - print_const("" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - "\n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - "\n" \ - "\n" \ - "\n" \ - "\n" \ - "\n" \ - " \n" \ - "\n" \ - "\n" \ - "\n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - " \n" \ - "\n" \ - "\n" \ - " \n" \ - " \n" \ - " Bibliography\n" \ - " \n" \ - " \n"); - - // Iterate over metadata keys - meta * m; - - if (scratch->meta_hash) - print_const("\n"); +*/ - for (m = scratch->meta_hash; m != NULL; m = m->hh.next) { - if (strcmp(m->key, "baseheaderlevel") == 0) { - } else if (strcmp(m->key, "bibliostyle") == 0) { - } else if (strcmp(m->key, "bibtex") == 0) { - } else if (strcmp(m->key, "css") == 0) { - } else if (strcmp(m->key, "htmlfooter") == 0) { - } else if (strcmp(m->key, "htmlheader") == 0) { - } else if (strcmp(m->key, "htmlheaderlevel") == 0) { - } else if (strcmp(m->key, "language") == 0) { - } else if (strcmp(m->key, "latexbegin") == 0) { - } else if (strcmp(m->key, "latexconfig") == 0) { - } else if (strcmp(m->key, "latexfooter") == 0) { - } else if (strcmp(m->key, "latexheaderlevel") == 0) { - } else if (strcmp(m->key, "latexinput") == 0) { - } else if (strcmp(m->key, "latexleader") == 0) { - } else if (strcmp(m->key, "latexmode") == 0) { - } else if (strcmp(m->key, "mmdfooter") == 0) { - } else if (strcmp(m->key, "mmdheader") == 0) { - } else if (strcmp(m->key, "quoteslanguage") == 0) { - } else if (strcmp(m->key, "title") == 0) { - print_const("\t"); - mmd_print_string_odf(out, m->value); - print_const("\n"); - } else if (strcmp(m->key, "transcludebase") == 0) { - } else if (strcmp(m->key, "xhtmlheader") == 0) { - print(m->value); - print_char('\n'); - } else if (strcmp(m->key, "xhtmlheaderlevel") == 0) { - } else { - print_const("\tkey); - print_const("\">"); - mmd_print_string_odf(out, m->value); - print_const("\n"); - } - } - if (scratch->meta_hash) - print_const("\n"); +#include "odf.h" - print_const("\n\n"); +static int void_function(void) { + return 0; } +#ifdef TEST +static void Test_void_function(CuTest* tc) { + int test = void_function(); -void mmd_end_complete_odf(DString * out, const char * source, scratch_pad * scratch) { - pad(out, 1, scratch); - print_const("\n\n"); + CuAssertIntEquals(tc, 0, test); } - +#endif diff --git a/Sources/libMultiMarkdown/odf.h b/Sources/libMultiMarkdown/odf.h index 0d69030..8dc7d01 100644 --- a/Sources/libMultiMarkdown/odf.h +++ b/Sources/libMultiMarkdown/odf.h @@ -1,10 +1,10 @@ /** - MultiMarkdown -- Lightweight markup processor to produce HTML, odf, and more. + MultiMarkdown -- Lightweight markup processor to produce HTML, LaTeX, and more. @file odf.h - @brief Convert token tree to Flat OpenDocument (ODF/FODT) output + @brief @author Fletcher T. Penney @@ -29,6 +29,24 @@ CuTest is released under the zlib/libpng license. See CuTest.c for the text of the license. + uthash library: + Copyright (c) 2005-2016, Troy D. Hanson + + Licensed under Revised BSD license + + miniz library: + Copyright 2013-2014 RAD Game Tools and Valve Software + Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC + + Licensed under the MIT license + + argtable3 library: + Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + + All rights reserved. + + Licensed under the Revised BSD License + ## The MIT License ## @@ -51,6 +69,35 @@ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + ## Revised BSD License ## + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR + PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ @@ -58,24 +105,12 @@ #ifndef ODF_MULTIMARKDOWN_H #define ODF_MULTIMARKDOWN_H +#ifdef TEST +#include "CuTest.h" +#endif -#include "d_string.h" -#include "token.h" -#include "writer.h" - -void mmd_export_token_odf(DString * out, const char * source, token * t, scratch_pad * scratch); -void mmd_export_token_tree_odf(DString * out, const char * source, token * t, scratch_pad * scratch); - -void mmd_export_token_odf_raw(DString * out, const char * source, token * t, scratch_pad * scratch); -void mmd_export_token_tree_odf_raw(DString * out, const char * source, token * t, scratch_pad * scratch); - -void mmd_export_citation_list_odf(DString * out, const char * source, scratch_pad * scratch); -void mmd_export_footnote_list_odf(DString * out, const char * source, scratch_pad * scratch); - -void mmd_start_complete_odf(DString * out, const char * source, scratch_pad * scratch); -void mmd_end_complete_odf(DString * out, const char * source, scratch_pad * scratch); - -void mmd_export_citation_list_odf(DString * out, const char * source, scratch_pad * scratch); +/// This is a sample function with a doxygen description. +// void void_f(void); #endif diff --git a/Sources/libMultiMarkdown/opendocument-content.c b/Sources/libMultiMarkdown/opendocument-content.c new file mode 100644 index 0000000..e3f5d77 --- /dev/null +++ b/Sources/libMultiMarkdown/opendocument-content.c @@ -0,0 +1,1734 @@ +/** + + MultiMarkdown -- Lightweight markup processor to produce HTML, LaTeX, and more. + + @file opendocument-content.c + + @brief Create the body content for OpenDocument files + + + @author Fletcher T. Penney + @bug + +**/ + +/* + + Copyright © 2016 - 2017 Fletcher T. Penney. + + + The `MultiMarkdown 6` project is released under the MIT License.. + + GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project: + + https://github.com/fletcher/MultiMarkdown-4/ + + MMD 4 is released under both the MIT License and GPL. + + + CuTest is released under the zlib/libpng license. See CuTest.c for the + text of the license. + + uthash library: + Copyright (c) 2005-2016, Troy D. Hanson + + Licensed under Revised BSD license + + miniz library: + Copyright 2013-2014 RAD Game Tools and Valve Software + Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC + + Licensed under the MIT license + + argtable3 library: + Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + + All rights reserved. + + Licensed under the Revised BSD License + + + ## The MIT License ## + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + ## Revised BSD License ## + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR + PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ + +#include +#include +#include +#include + +#include "char.h" +#include "opendocument-content.h" +#include "parser.h" +#include "scanners.h" + + +#define print(x) d_string_append(out, x) +#define print_const(x) d_string_append_c_array(out, x, sizeof(x) - 1) +#define print_char(x) d_string_append_c(out, x) +#define printf(...) d_string_append_printf(out, __VA_ARGS__) +#define print_token(t) d_string_append_c_array(out, &(source[t->start]), t->len) +#define print_localized(x) mmd_print_localized_char_opendocument(out, x, scratch) + + +/// strdup() not available on all platforms +static char * my_strdup(const char * source) { + char * result = malloc(strlen(source) + 1); + + if (result) { + strcpy(result, source); + } + + return result; +} + + +void mmd_print_char_opendocument(DString * out, char c) { + switch (c) { + case '"': + print_const("""); + break; + case '&': + print_const("&"); + break; + case '<': + print_const("<"); + break; + case '>': + print_const(">"); + break; + case '\t': + print_const(""); + default: + print_char(c); + break; + } +} + + +void mmd_print_string_opendocument(DString * out, const char * str) { + if (str == NULL) + return; + + while (*str != '\0') { + mmd_print_char_opendocument(out, *str); + str++; + } +} + + +void mmd_print_localized_char_opendocument(DString * out, unsigned short type, scratch_pad * scratch) { + switch (type) { + case DASH_N: + print_const("–"); + break; + case DASH_M: + print_const("—"); + break; + case ELLIPSIS: + print_const("…"); + break; + case APOSTROPHE: + print_const("’"); + break; + case QUOTE_LEFT_SINGLE: + switch (scratch->quotes_lang) { + case SWEDISH: + print( "’"); + break; + case FRENCH: + print_const("'"); + break; + case GERMAN: + print_const("‚"); + break; + case GERMANGUILL: + print_const("›"); + break; + default: + print_const("‘"); + } + break; + case QUOTE_RIGHT_SINGLE: + switch (scratch->quotes_lang) { + case GERMAN: + print_const("‘"); + break; + case GERMANGUILL: + print_const("‹"); + break; + default: + print_const("’"); + } + break; + case QUOTE_LEFT_DOUBLE: + switch (scratch->quotes_lang) { + case DUTCH: + case GERMAN: + print_const("„"); + break; + case GERMANGUILL: + print_const("»"); + break; + case FRENCH: + print_const("«"); + break; + case SWEDISH: + print( "”"); + break; + default: + print_const("“"); + } + break; + case QUOTE_RIGHT_DOUBLE: + switch (scratch->quotes_lang) { + case GERMAN: + print_const("“"); + break; + case GERMANGUILL: + print_const("«"); + break; + case FRENCH: + print_const("»"); + break; + case SWEDISH: + case DUTCH: + default: + print_const("”"); + } + break; + } +} + + +void mmd_export_token_opendocument_raw(DString * out, const char * source, token * t, scratch_pad * scratch) { + if (t == NULL) + return; + + switch (t->type) { + case AMPERSAND: + print_const("&"); + break; + case AMPERSAND_LONG: + print_const("&amp;"); + break; + case ANGLE_RIGHT: + print_const(">"); + break; + case ANGLE_LEFT: + print_const("<"); + break; + case ESCAPED_CHARACTER: + print_const("\\"); + mmd_print_char_opendocument(out, source[t->start + 1]); + break; + case HTML_ENTITY: + print_const("&"); + d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1); + break; + case INDENT_TAB: + print_const(""); + break; + case QUOTE_DOUBLE: + print_const("""); + break; + case CODE_FENCE: + if (t->next) + t->next->type = TEXT_EMPTY; + case TEXT_EMPTY: + break; + case TEXT_NL: + print_const(""); + break; + default: + if (t->child) + mmd_export_token_tree_opendocument_raw(out, source, t->child, scratch); + else + print_token(t); + break; + } +} + + +void mmd_export_token_tree_opendocument_raw(DString * out, const char * source, token * t, scratch_pad * scratch) { + while (t != NULL) { + if (scratch->skip_token) { + scratch->skip_token--; + } else { + mmd_export_token_opendocument_raw(out, source, t, scratch); + } + + t = t->next; + } +} + + +void mmd_export_link_opendocument(DString * out, const char * source, token * text, link * link, scratch_pad * scratch) { + if (link->url) { + print_const("url); + print_const("\""); + } else + print_const("
title && link->title[0] != '\0') { + print_const(" office:name=\""); + mmd_print_string_opendocument(out, link->title); + print_const("\""); + } + + print_const(">"); + + // If we're printing contents of bracket as text, then ensure we include it all + if (text && text->child && text->child->len > 1) { + text->child->next->start--; + text->child->next->len++; + } + + mmd_export_token_tree_opendocument(out, source, text->child, scratch); + + print_const(""); +} + + +static char * correct_dimension_units(char *original) { + char *result; + int i; + + result = my_strdup(original); + + for (i = 0; result[i]; i++) + result[i] = tolower(result[i]); + + if (strstr(&result[strlen(result)-2],"px")) { + result[strlen(result)-2] = '\0'; + strcat(result, "pt"); + } + + return result; +} + + +void mmd_export_image_opendocument(DString * out, const char * source, token * text, link * link, scratch_pad * scratch, bool is_figure) { + attr * a = link->attributes; + char * height = NULL; + char * width = NULL; + + print_const("key) == 0) { + height = correct_dimension_units(a->value); + } else if (strcmp("width", a->key) == 0) { + width = correct_dimension_units(a->value); + } + + a = a->next; + } + + if (width) { + printf(" svg:width=\"%s\">\n", width); + } else { + print_const(" svg:width=\"95%\">\n"); + } + + print_const("url) + printf(">\nurl); + + print_const(" xlink:type=\"simple\" xlink:show=\"embed\" xlink:actuate=\"onLoad\" draw:filter-name=\"<All formats>\"/>\n"); + + if (is_figure) { + if (text) { + print_const("\nFigure Update Fields to calculate numbers: "); + mmd_export_token_tree_opendocument(out, source, text->child, scratch); + print_const(""); + } + } + + print_const("\n\n"); + + scratch->padded = 1; +} + + +void mmd_export_toc_entry_opendocument(DString * out, const char * source, scratch_pad * scratch, size_t * counter, short level) { + token * entry, * next; + short entry_level, next_level; + char * temp_char; + + // Iterate over tokens + while (*counter < scratch->header_stack->size) { + // Get token for header + entry = stack_peek_index(scratch->header_stack, *counter); + entry_level = raw_level_for_header(entry); + + if (entry_level >= level) { + // This entry is a direct descendant of the parent + temp_char = label_from_header(source, entry); + printf("", temp_char); + mmd_export_token_tree_opendocument(out, source, entry->child, scratch); + print_const(" 1\n"); + + if (*counter < scratch->header_stack->size - 1) { + next = stack_peek_index(scratch->header_stack, *counter + 1); + next_level = next->type - BLOCK_H1 + 1; + if (next_level > entry_level) { + // This entry has children + (*counter)++; + mmd_export_toc_entry_opendocument(out, source, scratch, counter, entry_level + 1); + } + } + + free(temp_char); + } else if (entry_level < level ) { + // If entry < level, exit this level + // Decrement counter first, so that we can test it again later + (*counter)--; + break; + } + + // Increment counter + (*counter)++; + } +} + + +void mmd_export_toc_opendocument(DString * out, const char * source, scratch_pad * scratch) { + size_t counter = 0; + + // TODO: Could use LC to internationalize this + print_const("\n"); + print_const("\n"); + print_const("Table of Contents\n"); + print_const("\n\n"); + print_const("\n"); + print_const("Table of Contents\n"); + print_const("\n"); + + mmd_export_toc_entry_opendocument(out, source, scratch, &counter, 0); + + print_const("\n\n\n"); +} + + + +void mmd_export_token_opendocument(DString * out, const char * source, token * t, scratch_pad * scratch) { + if (t == NULL) + return; + + short temp_short; + short temp_short2; + short temp_short3; + link * temp_link = NULL; + char * temp_char = NULL; + char * temp_char2 = NULL; + bool temp_bool = 0; + token * temp_token = NULL; + footnote * temp_note = NULL; + + switch (t->type) { + case DOC_START_TOKEN: + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + break; + case AMPERSAND: + case AMPERSAND_LONG: + print_const("&"); + break; + case ANGLE_LEFT: + print_const("<"); + break; + case ANGLE_RIGHT: + print_const(">"); + break; + case APOSTROPHE: + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(APOSTROPHE); + } + break; + case BACKTICK: + if (t->mate == NULL) + print_token(t); + else if (t->mate->type == QUOTE_RIGHT_ALT) + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(QUOTE_LEFT_DOUBLE); + } + else if (t->start < t->mate->start) { + print_const(""); + } else { + print_const(""); + } + break; + case BLOCK_BLOCKQUOTE: + pad(out, 2, scratch); + scratch->padded = 2; + temp_short2 = scratch->odf_para_type; + + scratch->odf_para_type = BLOCK_BLOCKQUOTE; + + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + scratch->padded = 0; + scratch->odf_para_type = temp_short2; + break; + case BLOCK_CODE_FENCED: + pad(out, 2, scratch); + + temp_char = get_fence_language_specifier(t->child->child, source); + + if (temp_char) { + if (strncmp("{=", temp_char, 2) == 0) { + // Raw source + if (raw_filter_text_matches(temp_char, FORMAT_ODT)) { + switch (t->child->tail->type) { + case LINE_FENCE_BACKTICK_3: + case LINE_FENCE_BACKTICK_4: + case LINE_FENCE_BACKTICK_5: + temp_token = t->child->tail; + break; + default: + temp_token = NULL; + } + if (temp_token) { + d_string_append_c_array(out, &source[t->child->next->start], temp_token->start - t->child->next->start); + scratch->padded = 1; + } else { + d_string_append_c_array(out, &source[t->child->start + t->child->len], t->start + t->len - t->child->next->start); + scratch->padded = 0; + } + } + + break; + } + } + + free(temp_char); + + print_const(""); + mmd_export_token_tree_opendocument_raw(out, source, t->child->next, scratch); + print_const(""); + scratch->padded = 0; + break; + case BLOCK_CODE_INDENTED: + pad(out, 2, scratch); + print_const(""); + mmd_export_token_tree_opendocument_raw(out, source, t->child, scratch); + print_const(""); + scratch->padded = 0; + break; + case BLOCK_DEFINITION: + pad(out, 2, scratch); + temp_short2 = scratch->odf_para_type; + scratch->odf_para_type = BLOCK_DEFINITION; + + temp_short = scratch->list_is_tight; + if (!(t->child->next && (t->child->next->type == BLOCK_EMPTY) && t->child->next->next)) + scratch->list_is_tight = true; + + if (t->child && t->child->type != BLOCK_PARA) { + print_const(""); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const(""); + } else { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + scratch->padded = 0; + + scratch->list_is_tight = temp_short; + scratch->odf_para_type = temp_short2; + break; + case BLOCK_DEFLIST: + pad(out, 2, scratch); + + // Group consecutive definition lists into a single list. + // lemon's LALR(1) parser can't properly handle this (to my understanding). + +// if (!(t->prev && (t->prev->type == BLOCK_DEFLIST))) +// print_const("
\n"); + + scratch->padded = 2; + + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + pad(out, 1, scratch); + +// if (!(t->next && (t->next->type == BLOCK_DEFLIST))) +// print_const("
\n"); + + scratch->padded = 1; + break; + case BLOCK_EMPTY: + break; + case BLOCK_H1: + case BLOCK_H2: + case BLOCK_H3: + case BLOCK_H4: + case BLOCK_H5: + case BLOCK_H6: + case BLOCK_SETEXT_1: + case BLOCK_SETEXT_2: + pad(out, 2, scratch); + switch (t->type) { + case BLOCK_SETEXT_1: + temp_short = 1; + break; + case BLOCK_SETEXT_2: + temp_short = 2; + break; + default: + temp_short = t->type - BLOCK_H1 + 1; + } + + printf("", temp_short + scratch->base_header_level - 1); + + if (scratch->extensions & EXT_NO_LABELS) { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } else { + temp_char = label_from_header(source, t); + printf("", temp_char); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + //printf("", temp_char); + free(temp_char); + } + + print_const(""); + scratch->padded = 0; + break; + case BLOCK_HR: + pad(out, 2, scratch); + print_const(""); + scratch->padded = 0; + break; + case BLOCK_HTML: + // Don't print HTML + break; + case BLOCK_LIST_BULLETED_LOOSE: + case BLOCK_LIST_BULLETED: + temp_short = scratch->list_is_tight; + switch (t->type) { + case BLOCK_LIST_BULLETED_LOOSE: + scratch->list_is_tight = false; + break; + case BLOCK_LIST_BULLETED: + scratch->list_is_tight = true; + break; + } + pad(out, 2, scratch); + print_const(""); + scratch->padded = 1; + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + pad(out, 2, scratch); + print_const(""); + scratch->padded = 0; + scratch->list_is_tight = temp_short; + break; + case BLOCK_LIST_ENUMERATED_LOOSE: + case BLOCK_LIST_ENUMERATED: + temp_short = scratch->list_is_tight; + switch (t->type) { + case BLOCK_LIST_ENUMERATED_LOOSE: + scratch->list_is_tight = false; + break; + case BLOCK_LIST_ENUMERATED: + scratch->list_is_tight = true; + break; + } + pad(out, 2, scratch); + print_const(""); + scratch->padded = 1; + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + pad(out, 2, scratch); + print_const(""); + scratch->padded = 0; + scratch->list_is_tight = temp_short; + break; + case BLOCK_LIST_ITEM: + pad(out, 2, scratch); + print_const("\n"); + scratch->padded = 2; + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const(""); + scratch->padded = 0; + break; + case BLOCK_LIST_ITEM_TIGHT: + pad(out, 2, scratch); + print_const("\n"); + + if (t->child && t->child->type != BLOCK_PARA) + print_const("\n"); + + scratch->padded = 2; + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + + if (t->child && t->child->type != BLOCK_PARA) + print_const(""); + + print_const(""); + scratch->padded = 0; + break; + case BLOCK_META: + break; + case BLOCK_PARA: + pad(out, 2, scratch); + print_const("odf_para_type) { + case BLOCK_BLOCKQUOTE: + case BLOCK_DEFINITION: + print_const(" text:style-name=\"Quotations\">"); + break; + case PAIR_BRACKET_ABBREVIATION: + case PAIR_BRACKET_CITATION: + case PAIR_BRACKET_FOOTNOTE: + case PAIR_BRACKET_GLOSSARY: + print_const(" text:style-name=\"Footnote\">"); + break; + default: + print_const(" text:style-name=\"Standard\">"); + break; + } + + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + + print_const(""); + scratch->padded = 0; + break; + case BLOCK_TABLE: + pad(out, 2, scratch); + print_const("\n"); + + scratch->padded = 2; + read_table_column_alignments(source, t, scratch); + + for (int i = 0; i < scratch->table_column_count; ++i) + { + print_const("\n"); +// switch (scratch->table_alignment[i]) { +// case 'l': +// print_const("\n"); +// break; +// case 'L': +// print_const("\n"); +// break; +// case 'r': +// print_const("\n"); +// break; +// case 'R': +// print_const("\n"); +// break; +// case 'c': +// print_const("\n"); +// break; +// case 'C': +// print_const("\n"); +// break; +// default: +// print_const("\n"); +// break; +// } + } + scratch->padded = 1; + + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + pad(out, 1, scratch); + print_const("\n"); + + // Are we followed by a caption? + if (table_has_caption(t)) { + temp_token = t->next->child; + + if (temp_token->next && + temp_token->next->type == PAIR_BRACKET) { + temp_token = temp_token->next; + } + + temp_char = label_from_token(source, temp_token); + printf("Table Update Fields to calculate numbers:", temp_char); + + t->next->child->child->type = TEXT_EMPTY; + t->next->child->child->mate->type = TEXT_EMPTY; + mmd_export_token_tree_opendocument(out, source, t->next->child->child, scratch); + + printf("\n", temp_char); + + free(temp_char); + temp_short = 1; + } else { + temp_short = 0; + } + + scratch->padded = 0; + scratch->skip_token = temp_short; + + break; + case BLOCK_TABLE_HEADER: + pad(out, 2, scratch); + scratch->in_table_header = 1; + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + scratch->in_table_header = 0; + scratch->padded = 1; + break; + case BLOCK_TABLE_SECTION: + pad(out, 2, scratch); + scratch->padded = 2; + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + scratch->padded = 0; + break; + case BLOCK_TOC: + pad(out, 2, scratch); + + mmd_export_toc_opendocument(out, source, scratch); + + scratch->padded = 1; + break; + case BLOCK_TERM: + pad(out, 2, scratch); + print_const(""); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const("\n"); + scratch->padded = 2; + break; + case BRACE_DOUBLE_LEFT: + print_const("{{"); + break; + case BRACE_DOUBLE_RIGHT: + print_const("}}"); + break; + case BRACKET_ABBREVIATION_LEFT: + print_const("[>"); + break; + case BRACKET_CITATION_LEFT: + print_const("[#"); + break; + case BRACKET_LEFT: + print_const("["); + break; + case BRACKET_RIGHT: + print_const("]"); + break; + case BRACKET_VARIABLE_LEFT: + print_const("[\%"); + break; + case COLON: + print_char(':'); + break; + case CRITIC_ADD_OPEN: + print_const("{++"); + break; + case CRITIC_ADD_CLOSE: + print_const("++}"); + break; + case CRITIC_COM_OPEN: + print_const("{>>"); + break; + case CRITIC_COM_CLOSE: + print_const("<<}"); + break; + case CRITIC_DEL_OPEN: + print_const("{--"); + break; + case CRITIC_DEL_CLOSE: + print_const("--}"); + break; + case CRITIC_HI_OPEN: + print_const("{=="); + break; + case CRITIC_HI_CLOSE: + print_const("==}"); + break; + case CRITIC_SUB_OPEN: + print_const("{~~"); + break; + case CRITIC_SUB_DIV: + print_const("~>"); + break; + case CRITIC_SUB_CLOSE: + print_const("~~}"); + break; + case DASH_M: + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(DASH_M); + } + break; + case DASH_N: + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(DASH_N); + } + break; + case ELLIPSIS: + if (!(scratch->extensions & EXT_SMART)) { + print_token(t); + } else { + print_localized(ELLIPSIS); + } + break; + case EMPH_START: + print_const(""); + break; + case EMPH_STOP: + print_const(""); + break; + case EQUAL: + print_char('='); + break; + case ESCAPED_CHARACTER: + if (!(scratch->extensions & EXT_COMPATIBILITY) && + (source[t->start + 1] == ' ')) { + print_const(" "); // This is a non-breaking space character + } else { + mmd_print_char_opendocument(out, source[t->start + 1]); + } + break; + case HASH1: + case HASH2: + case HASH3: + case HASH4: + case HASH5: + case HASH6: + print_token(t); + break; + case HTML_ENTITY: + print_const("&"); + d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1); + break; + case HTML_COMMENT_START: + if (!(scratch->extensions & EXT_SMART)) { + print_const("<!--"); + } else { + print_const("<!"); + print_localized(DASH_N); + } + break; + case HTML_COMMENT_STOP: + if (!(scratch->extensions & EXT_SMART)) { + print_const("-->"); + } else { + print_localized(DASH_N); + print_const(">"); + } + break; + case INDENT_SPACE: + print_char(' '); + break; + case INDENT_TAB: + print_const(""); + break; + case LINE_LIST_BULLETED: + case LINE_LIST_ENUMERATED: + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + break; + case MANUAL_LABEL: + case MARKER_BLOCKQUOTE: + case MARKER_H1: + case MARKER_H2: + case MARKER_H3: + case MARKER_H4: + case MARKER_H5: + case MARKER_H6: + case MARKER_LIST_BULLET: + case MARKER_LIST_ENUMERATOR: + break; + case MATH_BRACKET_OPEN: + if (t->mate) { + print_const("\\["); + } else + print_const("\\["); + break; + case MATH_BRACKET_CLOSE: + if (t->mate) { + print_const("\\]"); + } else + print_const("\\]"); + break; + case MATH_DOLLAR_SINGLE: + if (t->mate) { + (t->start < t->mate->start) ? ( print_const("\\(") ) : ( print_const("\\)") ); + } else { + print_const("$"); + } + break; + case MATH_DOLLAR_DOUBLE: + if (t->mate) { + (t->start < t->mate->start) ? ( print_const("\\[") ) : ( print_const("\\]") ); + } else { + print_const("$$"); + } + break; + case MATH_PAREN_OPEN: + if (t->mate) { + print_const("\\("); + } else + print_const("\\("); + break; + case MATH_PAREN_CLOSE: + if (t->mate) { + print_const("\\)"); + } else + print_const("\\)"); + break; + case NON_INDENT_SPACE: + print_char(' '); + break; + case PAIR_ANGLE: + temp_char = url_accept(source, t->start + 1, t->len - 2, NULL, true); + + if (temp_char) { + print_const(""); + mmd_print_string_opendocument(out, temp_char); + print_const(""); + } else if (scan_html(&source[t->start])) { + // We ignore HTML blocks + if (scan_html_comment(&source[t->start])) { + // But allow HTML comments as raw LaTeX + d_string_append_c_array(out, &source[t->start + 4], t->len - 4 - 3); + } + } else { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + + free(temp_char); + break; + case PAIR_BACKTICK: + // Strip leading whitespace + switch (t->child->next->type) { + case TEXT_NL: + case INDENT_TAB: + case INDENT_SPACE: + case NON_INDENT_SPACE: + t->child->next->type = TEXT_EMPTY; + break; + case TEXT_PLAIN: + while (t->child->next->len && char_is_whitespace(source[t->child->next->start])) { + t->child->next->start++; + t->child->next->len--; + } + break; + } + + // Strip trailing whitespace + switch (t->child->mate->prev->type) { + case TEXT_NL: + case INDENT_TAB: + case INDENT_SPACE: + case NON_INDENT_SPACE: + t->child->mate->prev->type = TEXT_EMPTY; + break; + case TEXT_PLAIN: + while (t->child->mate->prev->len && char_is_whitespace(source[t->child->mate->prev->start + t->child->mate->prev->len - 1])) { + t->child->mate->prev->len--; + } + break; + } + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + + if (t->next && t->next->type == PAIR_RAW_FILTER) { + // Raw text? + if (raw_filter_matches(t->next, source, FORMAT_FODT)) { + d_string_append_c_array(out, &(source[t->child->start + t->child->len]), t->child->mate->start - t->child->start - t->child->len); + } + // Skip over PAIR_RAW_FILTER + scratch->skip_token = 1; + break; + } + + print_const(""); + mmd_export_token_tree_opendocument_raw(out, source, t->child, scratch); + print_const(""); + break; + case PAIR_BRACE: + case PAIR_BRACES: + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + break; + case PAIR_BRACKET: + if ((scratch->extensions & EXT_NOTES) && + (t->next && t->next->type == PAIR_BRACKET_CITATION)) { + goto parse_citation; + } + + case PAIR_BRACKET_IMAGE: + parse_brackets(source, scratch, t, &temp_link, &temp_short, &temp_bool); + + if (temp_link) { + if (t->type == PAIR_BRACKET) { + // Link + mmd_export_link_opendocument(out, source, t, temp_link, scratch); + } else { + // Image -- should it be a figure (e.g. image is only thing in paragraph)? + temp_token = t->next; + + if (temp_token && + ((temp_token->type == PAIR_BRACKET) || + (temp_token->type == PAIR_PAREN))) { + temp_token = temp_token->next; + } + + if (temp_token && temp_token->type == TEXT_NL) + temp_token = temp_token->next; + + if (temp_token && temp_token->type == TEXT_LINEBREAK) + temp_token = temp_token->next; + + if (t->prev || temp_token) { + mmd_export_image_opendocument(out, source, t, temp_link, scratch, false); + } else { + mmd_export_image_opendocument(out, source, t, temp_link, scratch, true); + } + } + + if (temp_bool) { + link_free(temp_link); + } + + scratch->skip_token = temp_short; + + return; + } + + // No links exist, so treat as normal + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + break; + case PAIR_BRACKET_CITATION: + parse_citation: + temp_bool = true; // Track whether this is regular vs 'not cited' + temp_token = t; // Remember whether we need to skip ahead + + if (scratch->extensions & EXT_NOTES) { + // Note-based syntax enabled + + if (t->type == PAIR_BRACKET) { + // This is a locator for a subsequent citation (e.g. `[foo][#bar]`) + temp_char = text_inside_pair(source, t); + temp_char2 = label_from_string(temp_char); + + if (strcmp(temp_char2, "notcited") == 0) { + free(temp_char); + temp_char = my_strdup(""); + temp_bool = false; + } + + free(temp_char2); + + // Move ahead to actual citation + t = t->next; + } else { + // This is the actual citation (e.g. `[#foo]`) + // No locator + temp_char = my_strdup(""); + } + + // Classify this use + temp_short2 = scratch->used_citations->size; + citation_from_bracket(source, scratch, t, &temp_short); + + if (temp_short == -1) { + // This instance is not properly formed + print_const("[#"); + mmd_export_token_tree_opendocument(out, source, t->child->next, scratch); + print_const("]"); + + free(temp_char); + break; + } + + + temp_short3 = scratch->odf_para_type; + scratch->odf_para_type = PAIR_BRACKET_FOOTNOTE; + + if (temp_bool) { + // This is a regular citation + + if (temp_char[0] == '\0') { + // No locator + + if (temp_short2 == scratch->used_citations->size) { + // This is a re-use of a previously used note + print_const("%d", temp_short, temp_short); + } else { + // This is the first time this note was used + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); + + mmd_export_token_tree_opendocument(out, source, temp_note->content, scratch); + print_const(""); + } + } else { + // Locator present + + if (temp_short2 == scratch->used_citations->size) { + // This is a re-use of a previously used note + print_const("%d", temp_short, temp_short); + } else { + // This is the first time this note was used + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); + + mmd_export_token_tree_opendocument(out, source, temp_note->content, scratch); + print_const(""); + } + } + } else { + if (temp_short2 == scratch->used_citations->size) { + // This is a re-use of a previously used note + } else { + // This is the first time this note was used + // TODO: Not sure how to add an endnote without inserting a marker in the text + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_citations, temp_short - 1); + + mmd_export_token_tree_opendocument(out, source, temp_note->content, scratch); + print_const(""); + } + } + + if (temp_token != t) { + // Skip citation on next pass + scratch->skip_token = 1; + } + + scratch->odf_para_type = temp_short3; + + free(temp_char); + } else { + // Note-based syntax disabled + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_BRACKET_FOOTNOTE: + if (scratch->extensions & EXT_NOTES) { + // Note-based syntax enabled + + // Classify this use + temp_short2 = scratch->used_footnotes->size; + footnote_from_bracket(source, scratch, t, &temp_short); + + if (temp_short == -1) { + // This instance is not properly formed + print_const("[?"); + mmd_export_token_tree_opendocument(out, source, t->child->next, scratch); + print_const("]"); + break; + } + + temp_short3 = scratch->odf_para_type; + scratch->odf_para_type = PAIR_BRACKET_FOOTNOTE; + + if (temp_short2 == scratch->used_footnotes->size) { + // This is a re-use of a previously used note + + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_footnotes, temp_short - 1); + + mmd_export_token_tree_opendocument(out, source, temp_note->content, scratch); + print_const(""); + } else { + // This is the first time this note was used + + // This is a new footnote + printf("", temp_short); + temp_note = stack_peek_index(scratch->used_footnotes, temp_short - 1); + + mmd_export_token_tree_opendocument(out, source, temp_note->content, scratch); + print_const(""); + } + + scratch->odf_para_type = temp_short3; + } else { + // Note-based syntax disabled + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_BRACKET_ABBREVIATION: + // Which might also be an "auto-tagged" abbreviation + if (scratch->extensions & EXT_NOTES) { + // Note-based syntax enabled + + // Classify this use + temp_short2 = scratch->used_abbreviations->size; + temp_short3 = scratch->inline_abbreviations_to_free->size; + abbreviation_from_bracket(source, scratch, t, &temp_short); + + if (temp_short == -1) { + // This instance is not properly formed + print_const("[>"); + mmd_export_token_tree_opendocument(out, source, t->child->next, scratch); + print_const("]"); + break; + } + + // Get instance of the note used + temp_note = stack_peek_index(scratch->used_abbreviations, temp_short - 1); + + if (t->child) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + } + + if (temp_short2 == scratch->used_abbreviations->size) { + // This is a re-use of a previously used note + + if (temp_short3 == scratch->inline_abbreviations_to_free->size) { + // This is a reference definition + mmd_print_string_opendocument(out, temp_note->label_text); +// mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } else { + // This is an inline definition + mmd_print_string_opendocument(out, temp_note->label_text); +// mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + } else { + // This is the first time this note was used + temp_short2 = scratch->odf_para_type; + scratch->odf_para_type = PAIR_BRACKET_ABBREVIATION; + + if (temp_short3 == scratch->inline_abbreviations_to_free->size) { + // This is a reference definition + mmd_print_string_opendocument(out, temp_note->clean_text); + print_const(" ("); + mmd_print_string_opendocument(out, temp_note->label_text); + print_const(")"); + } else { + // This is an inline definition + mmd_print_string_opendocument(out, temp_note->clean_text); + print_const(" ("); + mmd_print_string_opendocument(out, temp_note->label_text); + print_const(")"); + } + + scratch->odf_para_type = temp_short2; + } + } else { + // Note-based syntax disabled + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_BRACKET_GLOSSARY: + // Which might also be an "auto-tagged" glossary + if (scratch->extensions & EXT_NOTES) { + // Note-based syntax enabled + + // Classify this use + temp_short2 = scratch->used_glossaries->size; + glossary_from_bracket(source, scratch, t, &temp_short); + + if (temp_short == -1) { + // This instance is not properly formed + print_const("[?"); + mmd_export_token_tree_opendocument(out, source, t->child->next, scratch); + print_const("]"); + break; + } + + // Get instance of the note used + temp_note = stack_peek_index(scratch->used_glossaries, temp_short - 1); + + temp_short3 = scratch->odf_para_type; + scratch->odf_para_type = PAIR_BRACKET_GLOSSARY; + + if (temp_short2 == scratch->used_glossaries->size) { + // This is a re-use of a previously used note + + mmd_print_string_opendocument(out, temp_note->clean_text); + } else { + // This is the first time this note was used + + mmd_print_string_opendocument(out, temp_note->clean_text); + + printf("", temp_short); + mmd_export_token_tree_opendocument(out, source, temp_note->content, scratch); + print_const(""); + } + + scratch->odf_para_type = temp_short3; + } else { + // Note-based syntax disabled + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_BRACKET_VARIABLE: + temp_char = text_inside_pair(source, t); + temp_char2 = extract_metadata(scratch, temp_char); + + if (temp_char2) + mmd_print_string_opendocument(out, temp_char2); + else + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + + // Don't free temp_char2 (it belongs to meta *) + free(temp_char); + break; + case PAIR_CRITIC_ADD: + // Ignore if we're rejecting + if (scratch->extensions & EXT_CRITIC_REJECT) + break; + if (scratch->extensions & EXT_CRITIC) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + if (scratch->extensions & EXT_CRITIC_ACCEPT) { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } else { + print_const(""); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const(""); + } + } else { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_CRITIC_DEL: + // Ignore if we're accepting + if (scratch->extensions & EXT_CRITIC_ACCEPT) + break; + if (scratch->extensions & EXT_CRITIC) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + if (scratch->extensions & EXT_CRITIC_REJECT) { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } else { + print_const(""); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const(""); + } + } else { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_CRITIC_COM: + // Ignore if we're rejecting or accepting + if ((scratch->extensions & EXT_CRITIC_REJECT) || + (scratch->extensions & EXT_CRITIC_ACCEPT)) + break; + if (scratch->extensions & EXT_CRITIC) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + print_const(""); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const(""); + } else { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_CRITIC_HI: + // Ignore if we're rejecting or accepting + if ((scratch->extensions & EXT_CRITIC_REJECT) || + (scratch->extensions & EXT_CRITIC_ACCEPT)) + break; + if (scratch->extensions & EXT_CRITIC) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + print_const(""); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const(""); + } else { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case CRITIC_SUB_DIV_A: + print_const("~"); + break; + case CRITIC_SUB_DIV_B: + print_const(">"); + break; + case PAIR_CRITIC_SUB_DEL: + if ((scratch->extensions & EXT_CRITIC) && + (t->next) && + (t->next->type == PAIR_CRITIC_SUB_ADD)) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + if (scratch->extensions & EXT_CRITIC_ACCEPT) { + + } else if (scratch->extensions & EXT_CRITIC_REJECT) { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } else { + print_const(""); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const(""); + } + } else { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_CRITIC_SUB_ADD: + if ((scratch->extensions & EXT_CRITIC) && + (t->prev) && + (t->prev->type == PAIR_CRITIC_SUB_DEL)) { + t->child->type = TEXT_EMPTY; + t->child->mate->type = TEXT_EMPTY; + if (scratch->extensions & EXT_CRITIC_REJECT) { + + } else if (scratch->extensions & EXT_CRITIC_ACCEPT) { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } else { + print_const(""); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const(""); + } + } else { + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + } + break; + case PAIR_HTML_COMMENT: + break; + case PAIR_EMPH: + case PAIR_MATH: + case PAIR_PAREN: + case PAIR_QUOTE_DOUBLE: + case PAIR_QUOTE_SINGLE: + case PAIR_STAR: + case PAIR_STRONG: + case PAIR_SUBSCRIPT: + case PAIR_SUPERSCRIPT: + case PAIR_UL: + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + break; + case PAREN_LEFT: + print_char('('); + break; + case PAREN_RIGHT: + print_char(')'); + break; + case PIPE: + print_token(t); + break; + case PLUS: + print_char('+'); + break; + case QUOTE_SINGLE: + if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) + print_const("'"); + else + (t->start < t->mate->start) ? ( print_localized(QUOTE_LEFT_SINGLE) ) : ( print_localized(QUOTE_RIGHT_SINGLE) ); + break; + case QUOTE_DOUBLE: + if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) + print_const("""); + else + (t->start < t->mate->start) ? ( print_localized(QUOTE_LEFT_DOUBLE) ) : ( print_localized(QUOTE_RIGHT_DOUBLE) ); + break; + case QUOTE_RIGHT_ALT: + if ((t->mate == NULL) || (!(scratch->extensions & EXT_SMART))) + print_const("''"); + else + print_localized(QUOTE_RIGHT_DOUBLE); + break; + case SLASH: + print_char('/'); + break; + case STAR: + print_char('*'); + break; + case STRONG_START: + print_const(""); + break; + case STRONG_STOP: + print_const(""); + break; + case SUBSCRIPT: + if (t->mate) { + (t->start < t->mate->start) ? (print_const("")) : (print_const("")); + } else if (t->len != 1) { + print_const(""); + mmd_export_token_opendocument(out, source, t->child, scratch); + print_const(""); + } else { + print_const("~"); + } + break; + case SUPERSCRIPT: + if (t->mate) { + (t->start < t->mate->start) ? (print_const("")) : (print_const("")); + } else if (t->len != 1) { + print_const(""); + mmd_export_token_opendocument(out, source, t->child, scratch); + print_const(""); + } else { + print_const("^"); + } + break; + case TABLE_CELL: + print_const("next && t->next->type == TABLE_DIVIDER) { + if (t->next->len > 1) { + printf(" table:number-columns-spanned=\"%d\"", t->next->len); + } + } + + if (scratch->in_table_header) { + print_const(">\n\ntable_alignment[scratch->table_cell_count]) { + case 'l': + case 'L': + default: + print_const(" text:style-name=\"MMD-Table\""); + break; + case 'r': + case 'R': + print_const(" text:style-name=\"MMD-Table-Right\""); + break; + case 'c': + case 'C': + print_const(" text:style-name=\"MMD-Table-Center\""); + break; + } + } + + print_const(">"); + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + + print_const("\n\n"); + + if (t->next) + scratch->table_cell_count += t->next->len; + else + scratch->table_cell_count++; + + break; + case TABLE_DIVIDER: + break; + case TABLE_ROW: + print_const("\n"); + scratch->table_cell_count = 0; + mmd_export_token_tree_opendocument(out, source, t->child, scratch); + print_const("\n"); + break; + case TEXT_EMPTY: + break; + case TEXT_LINEBREAK: + if (t->next) { + print_const("\n"); + scratch->padded = 0; + } + break; + case TEXT_NL: + if (t->next) + print_char('\n'); + break; + case RAW_FILTER_LEFT: + case TEXT_BACKSLASH: + case TEXT_BRACE_LEFT: + case TEXT_BRACE_RIGHT: + case TEXT_HASH: + case TEXT_NUMBER_POSS_LIST: + case TEXT_PERCENT: + case TEXT_PERIOD: + case TEXT_PLAIN: + case TOC: + case UL: + print_token(t); + break; + default: + fprintf(stderr, "Unknown token type: %d\n", t->type); + token_describe(t, source); + break; + } +} + + +void mmd_export_token_tree_opendocument(DString * out, const char * source, token * t, scratch_pad * scratch) { + + // Prevent stack overflow with "dangerous" input causing extreme recursion + if (scratch->recurse_depth == kMaxExportRecursiveDepth) { + return; + } + + scratch->recurse_depth++; + + while (t != NULL) { + if (scratch->skip_token) { + scratch->skip_token--; + } else { + mmd_export_token_opendocument(out, source, t, scratch); + } + + t = t->next; + } + + scratch->recurse_depth--; +} + diff --git a/Sources/libMultiMarkdown/opendocument-content.h b/Sources/libMultiMarkdown/opendocument-content.h new file mode 100644 index 0000000..e99eed2 --- /dev/null +++ b/Sources/libMultiMarkdown/opendocument-content.h @@ -0,0 +1,134 @@ +/** + + MultiMarkdown -- Lightweight markup processor to produce HTML, LaTeX, and more. + + @file opendocument-content.h + + @brief + + + @author Fletcher T. Penney + @bug + +**/ + +/* + + Copyright © 2016 - 2017 Fletcher T. Penney. + + + The `MultiMarkdown 6` project is released under the MIT License.. + + GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project: + + https://github.com/fletcher/MultiMarkdown-4/ + + MMD 4 is released under both the MIT License and GPL. + + + CuTest is released under the zlib/libpng license. See CuTest.c for the + text of the license. + + uthash library: + Copyright (c) 2005-2016, Troy D. Hanson + + Licensed under Revised BSD license + + miniz library: + Copyright 2013-2014 RAD Game Tools and Valve Software + Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC + + Licensed under the MIT license + + argtable3 library: + Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + + All rights reserved. + + Licensed under the Revised BSD License + + + ## The MIT License ## + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + ## Revised BSD License ## + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR + PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ + + +#ifndef OPENDOCUMENT_CONTENT_MULTIMARKDOWN_H +#define OPENDOCUMENT_CONTENT_MULTIMARKDOWN_H + +#include "writer.h" + +void mmd_print_char_opendocument(DString * out, char c); +void mmd_print_string_opendocument(DString * out, const char * str); +void mmd_print_localized_char_opendocument(DString * out, unsigned short type, scratch_pad * scratch); + +void mmd_export_token_opendocument_raw(DString * out, const char * source, token * t, scratch_pad * scratch); + +void mmd_export_link_opendocument(DString * out, const char * source, token * text, link * link, scratch_pad * scratch); +void mmd_export_image_opendocument(DString * out, const char * source, token * text, link * link, scratch_pad * scratch, bool is_figure); + + +void mmd_export_token_opendocument(DString * out, const char * source, token * t, scratch_pad * scratch); +void mmd_export_token_tree_opendocument(DString * out, const char * source, token * t, scratch_pad * scratch); + +void mmd_export_token_opendocument_raw(DString * out, const char * source, token * t, scratch_pad * scratch); +void mmd_export_token_tree_opendocument_raw(DString * out, const char * source, token * t, scratch_pad * scratch); + +void mmd_export_citation_list_opendocument(DString * out, const char * source, scratch_pad * scratch); +void mmd_export_footnote_list_opendocument(DString * out, const char * source, scratch_pad * scratch); + +void mmd_start_complete_opendocument(DString * out, const char * source, scratch_pad * scratch); +void mmd_end_complete_opendocument(DString * out, const char * source, scratch_pad * scratch); + +void mmd_export_citation_list_opendocument(DString * out, const char * source, scratch_pad * scratch); + +#endif diff --git a/Sources/libMultiMarkdown/opendocument.c b/Sources/libMultiMarkdown/opendocument.c new file mode 100644 index 0000000..920cc8c --- /dev/null +++ b/Sources/libMultiMarkdown/opendocument.c @@ -0,0 +1,817 @@ +/** + + MultiMarkdown -- Lightweight markup processor to produce HTML, LaTeX, and more. + + @file opendocument.c + + @brief + + + @author Fletcher T. Penney + @bug + +**/ + +/* + + Copyright © 2016 - 2017 Fletcher T. Penney. + + + The `MultiMarkdown 6` project is released under the MIT License.. + + GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project: + + https://github.com/fletcher/MultiMarkdown-4/ + + MMD 4 is released under both the MIT License and GPL. + + + CuTest is released under the zlib/libpng license. See CuTest.c for the + text of the license. + + uthash library: + Copyright (c) 2005-2016, Troy D. Hanson + + Licensed under Revised BSD license + + miniz library: + Copyright 2013-2014 RAD Game Tools and Valve Software + Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC + + Licensed under the MIT license + + argtable3 library: + Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + + All rights reserved. + + Licensed under the Revised BSD License + + + ## The MIT License ## + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + ## Revised BSD License ## + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR + PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ + + +#include "miniz.h" +#include "opendocument.h" +#include "opendocument-content.h" +#include "writer.h" +#include "zip.h" + +#define print(x) d_string_append(out, x) +#define print_const(x) d_string_append_c_array(out, x, sizeof(x) - 1) +#define print_char(x) d_string_append_c(out, x) +#define printf(...) d_string_append_printf(out, __VA_ARGS__) +#define print_token(t) d_string_append_c_array(out, &(source[t->start]), t->len) +#define print_localized(x) mmd_print_localized_char_html(out, x, scratch) + + +/// strdup() not available on all platforms +static char * my_strdup(const char * source) { + char * result = malloc(strlen(source) + 1); + + if (result) { + strcpy(result, source); + } + + return result; +} + + +/// Create metadata for OpenDocument +char * opendocument_metadata(mmd_engine * e, scratch_pad * scratch) { + DString * out = d_string_new(""); + meta * m; + + d_string_append(out, "\n"); + + // Iterate through metadata keys + for (m = scratch->meta_hash; m != NULL; m = m->hh.next) { + if (strcmp(m->key, "author") == 0) { + print_const("\t"); + mmd_print_string_opendocument(out, m->value); + print_const("\n"); + } else if (strcmp(m->key, "baseheaderlevel") == 0) { + } else if (strcmp(m->key, "bibliostyle") == 0) { + } else if (strcmp(m->key, "bibtex") == 0) { + } else if (strcmp(m->key, "css") == 0) { + } else if (strcmp(m->key, "htmlfooter") == 0) { + } else if (strcmp(m->key, "htmlheader") == 0) { + } else if (strcmp(m->key, "htmlheaderlevel") == 0) { + } else if (strcmp(m->key, "language") == 0) { + } else if (strcmp(m->key, "latexbegin") == 0) { + } else if (strcmp(m->key, "latexconfig") == 0) { + } else if (strcmp(m->key, "latexfooter") == 0) { + } else if (strcmp(m->key, "latexheaderlevel") == 0) { + } else if (strcmp(m->key, "latexinput") == 0) { + } else if (strcmp(m->key, "latexleader") == 0) { + } else if (strcmp(m->key, "latexmode") == 0) { + } else if (strcmp(m->key, "mmdfooter") == 0) { + } else if (strcmp(m->key, "mmdheader") == 0) { + } else if (strcmp(m->key, "quoteslanguage") == 0) { + } else if (strcmp(m->key, "title") == 0) { + print_const("\t"); + mmd_print_string_opendocument(out, m->value); + print_const("\n"); + } else if (strcmp(m->key, "transcludebase") == 0) { + } else if (strcmp(m->key, "xhtmlheader") == 0) { + } else if (strcmp(m->key, "xhtmlheaderlevel") == 0) { + } else { + print_const("\tkey); + print_const("\">"); + mmd_print_string_opendocument(out, m->value); + print_const("\n"); + } + } + + d_string_append(out, ""); + + char * result = out->str; + d_string_free(out, false); + return result; +} + + +/// Create full metadata file for OpenDocument +char * opendocument_metadata_file(mmd_engine * e, scratch_pad * scratch) { + DString * out = d_string_new(""); + + char * meta = opendocument_metadata(e, scratch); + + // Open + d_string_append(out, "\n"); + d_string_append(out, "\n"); + + // Metadata + d_string_append(out, meta); + + // Close + d_string_append(out, "\n"); + + // Cleanup + free(meta); + char * result = out->str; + d_string_free(out, false); + return result; +} + + +/// Create default style information for OpenDocument +char * opendocument_style(int format) { + DString * out = d_string_new(""); + + /* Font Declarations */ + print_const("\n" \ + " \n" \ + "\n"); + + /* Append basic style information */ + print_const("\n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + "\n" \ + "" \ + " " \ + " \n" \ + "\n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + " \n" \ + " \n" \ + "\n"); + + /* Automatic style information */ + print_const("" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + "\n" \ + "\n" \ + "\n" \ + " \n" \ + "\n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + " \n" \ + "\n" \ + "\n" \ + " \n" \ + " \n" \ + " Bibliography\n" \ + " \n" \ + " \n"); + + char * result = out->str; + d_string_free(out, false); + return result; +} + + +/// Create full style file for OpenDocument +char * opendocument_style_file(int format) { + DString * out = d_string_new(""); + + char * style = opendocument_style(format); + + // Open + d_string_append(out, "\n"); + + print_const("\n"); + + // Styles + d_string_append(out, style); + + // Close + d_string_append(out, "\n"); + + // Cleanup + free(style); + char * result = out->str; + d_string_free(out, false); + return result; +} + + +/// Create full settings file for OpenDocument +char * opendocument_settings_file(int format) { + return my_strdup(" "); +} + + +/// Create manifest file for OpenDocument +char * opendocument_manifest_file(mmd_engine * e, int format) { + DString * out = d_string_new(""); + + char * style = opendocument_style(format); + + // Open + print_const("\n"); + print_const("\n"); + + // Files + switch (format) { + case FORMAT_ODT: + print_const("\t\n"); + break; + } + + print_const("\t\n"); + print_const("\t\n"); + print_const("\t\n"); + print_const("\t\n"); + + // Close + print_const("\n"); + + // Cleanup + free(style); + char * result = out->str; + d_string_free(out, false); + return result; +} + + +/// Create common elements of an OpenDocument zip file +mz_zip_archive * opendocument_core_zip(mmd_engine * e, int format) { + // Initialize zip archive + mz_zip_archive * zip = malloc(sizeof(mz_zip_archive)); + zip_new_archive(zip); + + mz_bool status; + char * data; + size_t len; + + scratch_pad * scratch = scratch_pad_new(e, format); + + + // Add mimetype + char mime[100]; + + switch (format) { + case FORMAT_ODT: + strcpy(mime, "application/vnd.oasis.opendocument.text"); + break; + } + + len = strlen(mime); + status = mz_zip_writer_add_mem(zip, "mimetype", mime, len, MZ_NO_COMPRESSION); + if (!status) { + fprintf(stderr, "Error adding mimetype to zip.\n"); + } + + + // Create metadata file + data = opendocument_metadata_file(e, scratch); + len = strlen(data); + status = mz_zip_writer_add_mem(zip, "meta.xml", data, len, MZ_BEST_COMPRESSION); + free(data); + if (!status) { + fprintf(stderr, "Error adding metadata to zip.\n"); + } + + + // Create styles file + data = opendocument_style_file(format); + len = strlen(data); + status = mz_zip_writer_add_mem(zip, "styles.xml", data, len, MZ_BEST_COMPRESSION); + free(data); + if (!status) { + fprintf(stderr, "Error adding styles to zip.\n"); + } + + + // Create settings file + data = opendocument_settings_file(format); + len = strlen(data); + status = mz_zip_writer_add_mem(zip, "settings.xml", data, len, MZ_BEST_COMPRESSION); + free(data); + if (!status) { + fprintf(stderr, "Error adding settings to zip.\n"); + } + + + // Create directories + status = mz_zip_writer_add_mem(zip, "META-INF/", NULL, 0, MZ_BEST_COMPRESSION); + if (!status) { + fprintf(stderr, "Error adding directory to zip.\n"); + } + +// status = mz_zip_writer_add_mem(zip, "Pictures/", NULL, 0, MZ_BEST_COMPRESSION); + if (!status) { + fprintf(stderr, "Error adding directory to zip.\n"); + } + + + // Create manifest file + data = opendocument_manifest_file(e, format); + len = strlen(data); + status = mz_zip_writer_add_mem(zip, "META-INF/manifest.xml", data, len, MZ_BEST_COMPRESSION); + free(data); + if (!status) { + fprintf(stderr, "Error adding manifest to zip.\n"); + } + + + // Clean up + scratch_pad_free(scratch); + + return zip; +} + + +/// Add shared office:document config +void opendocument_document_attr(DString * out) { + print_const("xmlns:office=\"urn:oasis:names:tc:opendocument:xmlns:office:1.0\"\n" \ + "xmlns:style=\"urn:oasis:names:tc:opendocument:xmlns:style:1.0\"\n" \ + "xmlns:text=\"urn:oasis:names:tc:opendocument:xmlns:text:1.0\"\n" \ + "xmlns:table=\"urn:oasis:names:tc:opendocument:xmlns:table:1.0\"\n" \ + "xmlns:draw=\"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0\"\n" \ + "xmlns:fo=\"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\"\n" \ + "xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n" \ + "xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n" \ + "xmlns:meta=\"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\"\n" \ + "xmlns:number=\"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\"\n" \ + "xmlns:svg=\"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0\"\n" \ + "xmlns:chart=\"urn:oasis:names:tc:opendocument:xmlns:chart:1.0\"\n" \ + "xmlns:dr3d=\"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0\"\n" \ + "xmlns:math=\"http://www.w3.org/1998/Math/MathML\"\n" \ + "xmlns:form=\"urn:oasis:names:tc:opendocument:xmlns:form:1.0\"\n" \ + "xmlns:script=\"urn:oasis:names:tc:opendocument:xmlns:script:1.0\"\n" \ + "xmlns:ooo=\"http://openoffice.org/2004/office\"\n" \ + "xmlns:ooow=\"http://openoffice.org/2004/writer\"\n" \ + "xmlns:oooc=\"http://openoffice.org/2004/calc\"\n" \ + "xmlns:dom=\"http://www.w3.org/2001/xml-events\"\n" \ + "xmlns:xforms=\"http://www.w3.org/2002/xforms\"\n" \ + "xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"\n" \ + "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" \ + "xmlns:rpt=\"http://openoffice.org/2005/report\"\n" \ + "xmlns:of=\"urn:oasis:names:tc:opendocument:xmlns:of:1.2\"\n" \ + "xmlns:xhtml=\"http://www.w3.org/1999/xhtml\"\n" \ + "xmlns:grddl=\"http://www.w3.org/2003/g/data-view#\"\n" \ + "xmlns:officeooo=\"http://openoffice.org/2009/office\"\n" \ + "xmlns:tableooo=\"http://openoffice.org/2009/table\"\n" \ + "xmlns:drawooo=\"http://openoffice.org/2010/draw\"\n" \ + "xmlns:calcext=\"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0\"\n" \ + "xmlns:loext=\"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0\"\n" \ + "xmlns:field=\"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0\"\n" \ + "xmlns:formx=\"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0\"\n" \ + "xmlns:css3t=\"http://www.w3.org/TR/css3-text/\"\n" \ + "office:version=\"1.2\""); +} + + +/// Create full content file +char * opendocument_content_file(const char * body, int format) { + DString * out = d_string_new(""); + + // Open + print_const("\n"); + print_const("\n\n"); + + switch (format) { + case FORMAT_ODT: + print_const("\n"); + break; + } + + // Body + d_string_append(out, body); + + // Close + switch (format) { + case FORMAT_ODT: + print_const("\n"); + break; + } + + d_string_append(out, "\n\n\n"); + + // Cleanup + char * result = out->str; + d_string_free(out, false); + return result; +} + + +/// Create OpenDocument text file +DString * opendocument_core_flat_create(const char * body, mmd_engine * e, int format) { + DString * out = d_string_new(""); + char * text; + + print_const("\n"); + print_const("\n"); + break; + } + + scratch_pad * scratch = scratch_pad_new(e, format); + + // Add styles + text = opendocument_style(format); + d_string_append(out, text); + free(text); + + // Add metadata + text = opendocument_metadata(e, scratch); + d_string_append(out, text); + free(text); + + + // Add body + print_const("\n\n\n"); + d_string_append(out, body); + print_const("\n\n\n\n"); + + + // Cleanup + scratch_pad_free(scratch); + + return out; +} + + +/// Create OpenDocument zip file version +DString * opendocument_core_file_create(const char * body, mmd_engine * e, const char * directory, int format) { + DString * result = d_string_new(""); + + // Add common core elements + mz_zip_archive * zip = opendocument_core_zip(e, format); + + mz_bool status; + char * data; + size_t len; + + + // Create content file + data = opendocument_content_file(body, format); + len = strlen(data); + status = mz_zip_writer_add_mem(zip, "content.xml", data, len, MZ_BEST_COMPRESSION); + free(data); + if (!status) { + fprintf(stderr, "Error adding content.xml to zip.\n"); + } + + + // TODO: Add image assets + + // Clean up + free(result->str); + + status = mz_zip_writer_finalize_heap_archive(zip, (void **) &(result->str), &(result->currentStringLength)); + if (!status) { + fprintf(stderr, "Error finalizing zip archive.\n"); + } + + return result; +} + + +/// Create OpenDocument flat text file (single xml file) +DString * opendocument_flat_text_create(const char * body, mmd_engine * e, const char * directory) { + return opendocument_core_flat_create(body, e, FORMAT_FODT); +} + + +/// Create OpenDocument text file (zipped package) +DString * opendocument_text_create(const char * body, mmd_engine * e, const char * directory) { + return opendocument_core_file_create(body, e, directory, FORMAT_ODT); +} + diff --git a/Sources/libMultiMarkdown/opendocument.h b/Sources/libMultiMarkdown/opendocument.h new file mode 100644 index 0000000..c7abb02 --- /dev/null +++ b/Sources/libMultiMarkdown/opendocument.h @@ -0,0 +1,118 @@ +/** + + MultiMarkdown -- Lightweight markup processor to produce HTML, LaTeX, and more. + + @file opendocument.h + + @brief Common Utilities for various OpenDocument export types + + + @author Fletcher T. Penney + @bug + +**/ + +/* + + Copyright © 2016 - 2017 Fletcher T. Penney. + + + The `MultiMarkdown 6` project is released under the MIT License.. + + GLibFacade.c and GLibFacade.h are from the MultiMarkdown v4 project: + + https://github.com/fletcher/MultiMarkdown-4/ + + MMD 4 is released under both the MIT License and GPL. + + + CuTest is released under the zlib/libpng license. See CuTest.c for the + text of the license. + + uthash library: + Copyright (c) 2005-2016, Troy D. Hanson + + Licensed under Revised BSD license + + miniz library: + Copyright 2013-2014 RAD Game Tools and Valve Software + Copyright 2010-2014 Rich Geldreich and Tenacious Software LLC + + Licensed under the MIT license + + argtable3 library: + Copyright (C) 1998-2001,2003-2011,2013 Stewart Heitmann + + All rights reserved. + + Licensed under the Revised BSD License + + + ## The MIT License ## + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + + ## Revised BSD License ## + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES LOSS OF USE, DATA, OR + PROFITS OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +*/ + + +#ifndef OPENDOCUMENT_MULTIMARKDOWN_H +#define OPENDOCUMENT_MULTIMARKDOWN_H + +#include "d_string.h" +#include "mmd.h" +#include "writer.h" + +char * opendocument_metadata(mmd_engine * e, scratch_pad * scratch); + + +DString * opendocument_flat_text_create(const char * body, mmd_engine * e, const char * directory); +DString * opendocument_text_create(const char * body, mmd_engine * e, const char * directory); + +#endif diff --git a/Sources/libMultiMarkdown/transclude.c b/Sources/libMultiMarkdown/transclude.c index 644e68a..51adec6 100644 --- a/Sources/libMultiMarkdown/transclude.c +++ b/Sources/libMultiMarkdown/transclude.c @@ -394,7 +394,7 @@ void mmd_transclude_source(DString * source, const char * search_path, const cha case FORMAT_MEMOIR: d_string_append(file_path, ".tex"); break; - case FORMAT_ODF: + case FORMAT_FODT: d_string_append(file_path, ".fodt"); break; default: diff --git a/Sources/libMultiMarkdown/writer.c b/Sources/libMultiMarkdown/writer.c index c420f8d..4095243 100644 --- a/Sources/libMultiMarkdown/writer.c +++ b/Sources/libMultiMarkdown/writer.c @@ -68,7 +68,7 @@ #include "latex.h" #include "memoir.h" #include "mmd.h" -#include "odf.h" +#include "opendocument-content.h" #include "scanners.h" #include "token.h" #include "uuid.h" @@ -1529,7 +1529,8 @@ void process_metadata_stack(mmd_engine * e, scratch_pad * scratch) { (scratch->output_format == FORMAT_MEMOIR)) header_level = atoi(m->value); } else if (strcmp(m->key, "odfheaderlevel") == 0) { - if (scratch->output_format == FORMAT_ODF) + if ((scratch->output_format == FORMAT_ODT) || + (scratch->output_format == FORMAT_FODT)) header_level = atoi(m->value); } else if (strcmp(m->key, "language") == 0) { temp_char = label_from_string(m->value); @@ -1793,12 +1794,14 @@ void mmd_engine_export_token_tree(DString * out, mmd_engine * e, short format) { mmd_end_complete_latex(out, e->dstr->str, scratch); break; - case FORMAT_ODF: - mmd_start_complete_odf(out, e->dstr->str, scratch); + case FORMAT_ODT: + scratch->store_assets = true; + case FORMAT_FODT: +// mmd_start_complete_odf(out, e->dstr->str, scratch); - mmd_export_token_tree_odf(out, e->dstr->str, e->root, scratch); + mmd_export_token_tree_opendocument(out, e->dstr->str, e->root, scratch); - mmd_end_complete_odf(out, e->dstr->str, scratch); +// mmd_end_complete_odf(out, e->dstr->str, scratch); break; } @@ -2454,8 +2457,9 @@ bool raw_filter_text_matches(char * pattern, short format) { if (strstr(pattern, "html")) return true; break; - case FORMAT_ODF: - if (strstr(pattern, "odf")) + case FORMAT_ODT: + case FORMAT_FODT: + if (strstr(pattern, "odt")) return true; break; case FORMAT_EPUB: diff --git a/Sources/multimarkdown/main.c b/Sources/multimarkdown/main.c index a478900..60bc180 100644 --- a/Sources/multimarkdown/main.c +++ b/Sources/multimarkdown/main.c @@ -154,7 +154,7 @@ int main(int argc, char** argv) { a_rem2 = arg_rem("", ""), - a_format = arg_str0("t", "to", "FORMAT", "convert to FORMAT, FORMAT = html|latex|beamer|memoir|mmd|odf|epub|bundle|bundlezip"), + a_format = arg_str0("t", "to", "FORMAT", "convert to FORMAT, FORMAT = html|latex|beamer|memoir|mmd|odt|fodt|epub|bundle|bundlezip"), a_o = arg_file0("o", "output", "FILE", "send output to FILE"), a_rem3 = arg_rem("",""), @@ -277,8 +277,10 @@ int main(int argc, char** argv) { format = FORMAT_MEMOIR; else if (strcmp(a_format->sval[0], "mmd") == 0) format = FORMAT_MMD; - else if (strcmp(a_format->sval[0], "odf") == 0) - format = FORMAT_ODF; + else if (strcmp(a_format->sval[0], "odt") == 0) + format = FORMAT_ODT; + else if (strcmp(a_format->sval[0], "fodt") == 0) + format = FORMAT_FODT; else if (strcmp(a_format->sval[0], "epub") == 0) format = FORMAT_EPUB; else if (strcmp(a_format->sval[0], "bundle") == 0) @@ -343,9 +345,12 @@ int main(int argc, char** argv) { case FORMAT_MEMOIR: output_filename = filename_with_extension(a_file->filename[i], ".tex"); break; - case FORMAT_ODF: + case FORMAT_FODT: output_filename = filename_with_extension(a_file->filename[i], ".fodt"); break; + case FORMAT_ODT: + output_filename = filename_with_extension(a_file->filename[i], ".odt"); + break; case FORMAT_MMD: output_filename = filename_with_extension(a_file->filename[i], ".mmdtext"); break; diff --git a/tests/MMD6Tests/Abbreviations.fodt b/tests/MMD6Tests/Abbreviations.fodt index 03c46f0..c0497de 100644 --- a/tests/MMD6Tests/Abbreviations.fodt +++ b/tests/MMD6Tests/Abbreviations.fodt @@ -1,39 +1,41 @@ +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> Bibliography + + Markdown: Syntax diff --git a/tests/MMD6Tests/Math.fodt b/tests/MMD6Tests/Math.fodt index e6d74cf..a512bf8 100644 --- a/tests/MMD6Tests/Math.fodt +++ b/tests/MMD6Tests/Math.fodt @@ -1,39 +1,41 @@ +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> bar *foo* + diff --git a/tests/MMD6Tests/Nested Lists.fodt b/tests/MMD6Tests/Nested Lists.fodt index edca335..8a2b5c8 100644 --- a/tests/MMD6Tests/Nested Lists.fodt +++ b/tests/MMD6Tests/Nested Lists.fodt @@ -1,39 +1,41 @@ +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text">

*foo*{=latex}

-

*foo*{=odf}

+

*foo*{=odt}

*foo*{=*}

@@ -22,7 +22,7 @@ latex config: article

{=latex} *foo*

-

{=odf} +

{=odt} *foo*

{=*} diff --git a/tests/MMD6Tests/Raw Source.text b/tests/MMD6Tests/Raw Source.text index ef70c7d..06f7011 100644 --- a/tests/MMD6Tests/Raw Source.text +++ b/tests/MMD6Tests/Raw Source.text @@ -7,7 +7,7 @@ latex config: article `*foo*`{=latex} -`*foo*`{=odf} +`*foo*`{=odt} `*foo*`{=*} @@ -25,7 +25,7 @@ latex config: article *foo* ``` -```{=odf} +```{=odt} *foo* ``` diff --git a/tests/MMD6Tests/Reference Footnotes.fodt b/tests/MMD6Tests/Reference Footnotes.fodt index 5bd69a6..bf930c6 100644 --- a/tests/MMD6Tests/Reference Footnotes.fodt +++ b/tests/MMD6Tests/Reference Footnotes.fodt @@ -1,39 +1,41 @@ +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text"> +xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" +xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" +xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" +xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" +xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" +xmlns:xlink="http://www.w3.org/1999/xlink" +xmlns:dc="http://purl.org/dc/elements/1.1/" +xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" +xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" +xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" +xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" +xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" +xmlns:math="http://www.w3.org/1998/Math/MathML" +xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" +xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" +xmlns:ooo="http://openoffice.org/2004/office" +xmlns:ooow="http://openoffice.org/2004/writer" +xmlns:oooc="http://openoffice.org/2004/calc" +xmlns:dom="http://www.w3.org/2001/xml-events" +xmlns:xforms="http://www.w3.org/2002/xforms" +xmlns:xsd="http://www.w3.org/2001/XMLSchema" +xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +xmlns:rpt="http://openoffice.org/2005/report" +xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" +xmlns:xhtml="http://www.w3.org/1999/xhtml" +xmlns:grddl="http://www.w3.org/2003/g/data-view#" +xmlns:officeooo="http://openoffice.org/2009/office" +xmlns:tableooo="http://openoffice.org/2009/table" +xmlns:drawooo="http://openoffice.org/2010/draw" +xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" +xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" +xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" +xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0" +xmlns:css3t="http://www.w3.org/TR/css3-text/" +office:version="1.2" +office:mimetype="application/vnd.oasis.opendocument.text">