Ok :) Should I simply revert everything I have shipped and start over?
It's not like it's a huge amount of work lost and it still was educational anyway and starting to pick out the changes probably takes longer than going from scratch. G On Fri, Apr 24, 2015 at 5:09 PM, Peter Kelly <kelly...@gmail.com> wrote: > Also, the odf directory should not go under DocFormats/filters/ooxml/src. > > There’s already a DocFormats/filters/odf/src directory with some files in > it, including class definitions for ODFPackage, ODFSheet and the like. > > I’ll try to find some time over the weekend to help you get up with an > appropriate structure with a bunch of TODOs in the code. > > -- > Dr. Peter M. Kelly > kelly...@gmail.com > http://www.kellypmk.net/ > > PGP key: http://www.kellypmk.net/pgp-key <http://www.kellypmk.net/pgp-key> > (fingerprint 5435 6718 59F0 DD1F BFA0 5E46 2523 BAA1 44AE 2966) > > > On 24 Apr 2015, at 8:31 pm, g...@apache.org wrote: > > > > Repository: incubator-corinthia > > Updated Branches: > > refs/heads/master ff322cb4f -> 83720d9dd > > > > > > Copy parts of src/word/lenses to src/odf/lenses/. > > > > * DocFormats/filters/odf/src/text/ODFText.c > > > > (ODFTextGet): Uncomment section. Function now 'works'. > > > > * DocFormats/filters/ooxml/CMakeLists.txt > > > > (set): Add new group: GroupOOXMLODFLenses. > > Add files: src/odf/lenses/ODFField.* > > > > (add_library): Add groups GroupOOXMODF and GroupOOXMLODFLenses. > > > > * DocFormats/filters/ooxml/src/odf/ODFConverter.c > > > > (#include): Add temporary stdio.h for easy debugging. > > > > (WordConverterGetConcrete): Change Error message. Add temporary > > magic number in lieu of OFFICE_DOCUMENT not seeming to be the > > right choice. Move commmenting out below ODF_simplifyFields() > > call. > > > > * DocFormats/filters/ooxml/src/odf/lenses/ODFField.h > > > > (): New file. String replaced copy of /word/lenses/ > > > > * DocFormats/filters/ooxml/src/odf/lenses/ODFField.c > > > > (): New file. String replaced copy of /word/lenses/ > > > > > > Project: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/repo > > Commit: > http://git-wip-us.apache.org/repos/asf/incubator-corinthia/commit/83720d9d > > Tree: > http://git-wip-us.apache.org/repos/asf/incubator-corinthia/tree/83720d9d > > Diff: > http://git-wip-us.apache.org/repos/asf/incubator-corinthia/diff/83720d9d > > > > Branch: refs/heads/master > > Commit: 83720d9ddad4d1021e3cf0b416ebd7a761771cae > > Parents: ff322cb > > Author: Gabriela Gibson <g...@apache.org> > > Authored: Fri Apr 24 14:31:43 2015 +0100 > > Committer: Gabriela Gibson <g...@apache.org> > > Committed: Fri Apr 24 14:31:43 2015 +0100 > > > > ---------------------------------------------------------------------- > > DocFormats/filters/odf/src/text/ODFText.c | 4 +- > > DocFormats/filters/ooxml/CMakeLists.txt | 10 +- > > DocFormats/filters/ooxml/src/odf/ODFConverter.c | 13 +- > > .../filters/ooxml/src/odf/lenses/ODFField.c | 494 +++++++++++++++++++ > > .../filters/ooxml/src/odf/lenses/ODFField.h | 27 + > > 5 files changed, 540 insertions(+), 8 deletions(-) > > ---------------------------------------------------------------------- > > > > > > > http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/83720d9d/DocFormats/filters/odf/src/text/ODFText.c > > ---------------------------------------------------------------------- > > diff --git a/DocFormats/filters/odf/src/text/ODFText.c > b/DocFormats/filters/odf/src/text/ODFText.c > > index 683e2d6..417aea9 100644 > > --- a/DocFormats/filters/odf/src/text/ODFText.c > > +++ b/DocFormats/filters/odf/src/text/ODFText.c > > @@ -41,7 +41,7 @@ DFDocument *ODFTextGet(DFStorage *concreteStorage, > DFStorage *abstractStorage, c > > ok = 1; > > > > end: > > - /* > > + > > ODFPackageRelease(odfPackage); > > if (ok) { > > return htmlDoc; > > @@ -50,7 +50,7 @@ end: > > DFDocumentRelease(htmlDoc); > > return NULL; > > } > > - */ > > + > > return NULL; > > } > > > > > > > http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/83720d9d/DocFormats/filters/ooxml/CMakeLists.txt > > ---------------------------------------------------------------------- > > diff --git a/DocFormats/filters/ooxml/CMakeLists.txt > b/DocFormats/filters/ooxml/CMakeLists.txt > > index 4696309..3ba0b01 100644 > > --- a/DocFormats/filters/ooxml/CMakeLists.txt > > +++ b/DocFormats/filters/ooxml/CMakeLists.txt > > @@ -29,6 +29,13 @@ set(GroupOOXMLODF > > src/odf/ODFConverter.c > > src/odf/ODFConverter.h) > > > > +### > > +## group ooxml odf lenses objects > > +### > > +set(GroupOOXMLODFLenses > > + src/odf/lenses/ODFField.c > > + src/odf/lenses/ODFField.h) > > + > > > > ### > > ## group ooxml word objects > > @@ -160,7 +167,8 @@ add_library(ooxml OBJECT > > ${GroupOOXMLWordFormatting} > > ${GroupOOXMLWordLenses} > > ${GroupOOXMLWordTests} > > - ${GroupOOXMLODF}) > > + ${GroupOOXMLODF} > > + ${GroupOOXMLODFLenses}) > > > > source_group(src\\common FILES ${GroupOOXMLCommon}) > > source_group(src\\word FILES ${GroupOOXMLWord}) > > > > > http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/83720d9d/DocFormats/filters/ooxml/src/odf/ODFConverter.c > > ---------------------------------------------------------------------- > > diff --git a/DocFormats/filters/ooxml/src/odf/ODFConverter.c > b/DocFormats/filters/ooxml/src/odf/ODFConverter.c > > index c7d79e8..3a21567 100644 > > --- a/DocFormats/filters/ooxml/src/odf/ODFConverter.c > > +++ b/DocFormats/filters/ooxml/src/odf/ODFConverter.c > > @@ -54,6 +54,8 @@ > > #include <stdlib.h> > > #include <string.h> > > > > +// 1i: debugging include --- remove > > +#include <stdio.h> > > /* > > static int isWhitespaceRun(DFNode *run) > > { > > @@ -688,20 +690,21 @@ DFNode *WordConverterGetConcrete(WordPutData *put, > DFNode *abstract) > > > > int ODFConverterGet(DFDocument *html, DFStorage *abstractStorage, > ODFPackage *package, const char *idPrefix, DFError **error) > > { > > - // 1i: contentDoc is a crude guess here. > > if (package->contentDoc == NULL) { > > - DFErrorFormat(error,"document.xml not found"); > > + DFErrorFormat(error,"content.xml not found"); > > return 0; > > } > > > > - // 1i: asssuming that OFFIC means AOO and so the WORD_DOCUMENT > equivalent is OFFICE_DOCUMENT > > - DFNode *odfDocument = > DFChildWithTag(package->contentDoc->docNode,OFFICE_DOCUMENT); > > + // 1i: this line needs work on the xml tags. > > + printf("OFFICE_DOCUMENT is %d\n", OFFICE_DOCUMENT); > > + DFNode *odfDocument = > DFChildWithTag(package->contentDoc->docNode,1469 /* magic number for what I > found in gdb */); > > if (odfDocument == NULL) { > > DFErrorFormat(error,"odf:document not found"); > > return 0; > > } > > + > > + int haveFields = ODF_simplifyFields(package); > > /* > > - int haveFields = Word_simplifyFields(package); > > Word_mergeRuns(package); > > > > WordConverter *converter = > WordConverterNew(html,abstractStorage,package,idPrefix); > > > > > http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/83720d9d/DocFormats/filters/ooxml/src/odf/lenses/ODFField.c > > ---------------------------------------------------------------------- > > diff --git a/DocFormats/filters/ooxml/src/odf/lenses/ODFField.c > b/DocFormats/filters/ooxml/src/odf/lenses/ODFField.c > > new file mode 100644 > > index 0000000..e7abf45 > > --- /dev/null > > +++ b/DocFormats/filters/ooxml/src/odf/lenses/ODFField.c > > @@ -0,0 +1,494 @@ > > +// Licensed to the Apache Software Foundation (ASF) under one > > +// or more contributor license agreements. See the NOTICE file > > +// distributed with this work for additional information > > +// regarding copyright ownership. The ASF licenses this file > > +// to you under the Apache License, Version 2.0 (the > > +// "License"); you may not use this file except in compliance > > +// with the License. You may obtain a copy of the License at > > +// > > +// http://www.apache.org/licenses/LICENSE-2.0 > > +// > > +// Unless required by applicable law or agreed to in writing, > > +// software distributed under the License is distributed on an > > +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > +// KIND, either express or implied. See the License for the > > +// specific language governing permissions and limitations > > +// under the License. > > + > > +#include "DFPlatform.h" > > +#include "ODFField.h" > > +/* > > +#include "ODFLenses.h" > > +#include "ODFBookmark.h" > > +#include "ODFObjects.h" > > +#include "ODFPackage.h" > > +#include "ODFCaption.h" > > +*/ > > + > > +#include "DFDOM.h" > > +#include "DFXML.h" > > +#include "DFString.h" > > +#include "DFArray.h" > > +#include "DFCommon.h" > > +#include <assert.h> > > +#include <ctype.h> > > +#include <stdlib.h> > > +#include <string.h> > > + > > +/* > > +static void ODFFieldPut(ODFPutData *put, DFNode *abstract, DFNode > *concrete); > > + > > +const char **ODF_parseField(const char *str) > > +{ > > + size_t len = strlen(str); > > + DFArray *components = DFArrayNew((DFCopyFunction)xstrdup,free); > > + > > + size_t start = 0; > > + int inString = 0; > > + for (size_t pos = 0; pos <= len; pos++) { > > + if (inString) { > > + if ((pos == len) || (str[pos] == '"')) { > > + char *comp = DFSubstring(str,start,pos); > > + DFArrayAppend(components,(char *)comp); > > + free(comp); > > + start = pos+1; > > + inString = 0; > > + } > > + } > > + else { > > + if ((pos == len) || isspace(str[pos])) { > > + if (pos > start) { > > + char *comp = DFSubstring(str,start,pos); > > + DFArrayAppend(components,(char *)comp); > > + free(comp); > > + } > > + start = pos+1; > > + } > > + else if (str[pos] == '"') { > > + inString = 1; > > + start = pos+1; > > + } > > + } > > + } > > + > > + const char **result = DFStringArrayFlatten(components); > > + DFArrayRelease(components); > > + return result; > > +} > > + > > > +//////////////////////////////////////////////////////////////////////////////////////////////////// > > +// > // > > +// DOM helper methods > // > > +// > // > > > +//////////////////////////////////////////////////////////////////////////////////////////////////// > > + > > +typedef struct { > > + DFNode *commonAncestor; > > + DFNode *beginAncestor; > > + DFNode *endAncestor; > > +} CommonAncestorInfo; > > + > > +static CommonAncestorInfo findCommonAncestor(DFNode *beginNode, DFNode > *endNode) > > +{ > > + CommonAncestorInfo info = { NULL, NULL, NULL }; > > + for (DFNode *beginA = beginNode; beginA != NULL; beginA = > beginA->parent) { > > + for (DFNode *endA = endNode; endA != NULL; endA = endA->parent) > { > > + if (beginA->parent == endA->parent) { > > + info.commonAncestor = beginA->parent; > > + info.beginAncestor = beginA; > > + info.endAncestor = endA; > > + return info; > > + } > > + } > > + } > > + return info; > > +} > > + > > +static void removeNodes(DFNode *beginNode, DFNode *endNode) > > +{ > > + CommonAncestorInfo common = findCommonAncestor(beginNode,endNode); > > + assert(common.commonAncestor != NULL); > > + assert(common.beginAncestor != NULL); > > + assert(common.endAncestor != NULL); > > + > > + DFNode *begin = beginNode; > > + while (begin != common.beginAncestor) { > > + DFNode *parent = begin->parent; > > + if (begin->next != NULL) > > + DFRemoveNode(begin->next); > > + else > > + begin = parent; > > + } > > + > > + DFNode *end = endNode; > > + while (end != common.endAncestor) { > > + DFNode *parent = end->parent; > > + if (end->prev != NULL) > > + DFRemoveNode(end->prev); > > + else > > + end = parent; > > + } > > + > > + if (common.beginAncestor != common.endAncestor) { > > + while (common.beginAncestor->next != common.endAncestor) > > + DFRemoveNode(common.beginAncestor->next); > > + } > > + > > + while ((beginNode != NULL) && (beginNode->first == NULL) && > (beginNode->tag != WORD_DOCUMENT)) { > > + DFNode *parent = beginNode->parent; > > + DFRemoveNode(beginNode); > > + beginNode = parent; > > + } > > + > > + while ((endNode != NULL) && (endNode->first == NULL) && > (endNode->tag != WORD_DOCUMENT)) { > > + DFNode *parent = endNode->parent; > > + DFRemoveNode(endNode); > > + endNode = parent; > > + } > > +} > > +*/ > > > +//////////////////////////////////////////////////////////////////////////////////////////////////// > > +// > // > > +// ODFSimplification > // > > +// > // > > > +//////////////////////////////////////////////////////////////////////////////////////////////////// > > + > > +typedef struct ODFSimplification { > > + DFBuffer *instrText; > > + DFNode *beginNode; > > + DFNode *endNode; > > + int haveFields; > > + int inSeparate; > > + int depth; > > +} ODFSimplification; > > + > > +static void replaceField(ODFSimplification *simp) > > +{ > > + assert(simp->instrText != NULL); > > + assert(simp->beginNode != NULL); > > + assert(simp->endNode != NULL); > > + > > + if ((simp->beginNode->parent->tag == WORD_R) && > (simp->endNode->parent->tag == WORD_R)) { > > + DFNode *beginRun = simp->beginNode->parent; > > + > > + DFNode *simple = > DFCreateElement(simp->beginNode->doc,WORD_FLDSIMPLE); > > + DFSetAttribute(simple,WORD_INSTR,simp->instrText->data); > > + DFInsertBefore(beginRun->parent,simple,beginRun); > > + // 1i: plug in later > > + //removeNodes(simp->beginNode,simp->endNode); > > + } > > + > > + DFBufferRelease(simp->instrText); > > + simp->instrText = NULL; > > + simp->beginNode = NULL; > > + simp->endNode = NULL; > > + > > + simp->haveFields = 1; > > +} > > + > > +static void simplifyRecursive(ODFSimplification *simp, DFNode *node) > > +{ > > + switch (node->tag) { > > + case WORD_FLDCHAR: { > > + const char *type = DFGetAttribute(node,WORD_FLDCHARTYPE); > > + if (DFStringEquals(type,"begin")) { > > + if (simp->depth == 0) { > > + DFBufferRelease(simp->instrText); > > + simp->instrText = DFBufferNew(); > > + simp->beginNode = node; > > + simp->endNode = NULL; > > + simp->inSeparate = 0; > > + } > > + simp->depth++; > > + } > > + else if (DFStringEquals(type,"end") && (simp->depth > 0)) { > > + simp->depth--; > > + if (simp->depth == 0) { > > + simp->endNode = node; > > + replaceField(simp); > > + } > > + } > > + else if (DFStringEquals(type,"separate")) { > > + if (simp->depth == 1) > > + simp->inSeparate = 1; > > + } > > + break; > > + } > > + case WORD_INSTRTEXT: { > > + if ((simp->depth == 1) && !simp->inSeparate) { > > + char *value = DFNodeTextToString(node); > > + DFBufferFormat(simp->instrText,"%s",value); > > + free(value); > > + } > > + break; > > + } > > + } > > + > > + DFNode *next; > > + for (DFNode *child = node->first; child != NULL; child = next) { > > + next = child->next; > > + simplifyRecursive(simp,child); > > + } > > +} > > + > > +int ODF_simplifyFields(ODFPackage *package) > > +{ > > + ODFSimplification simp; > > + bzero(&simp,sizeof(ODFSimplification)); > > + simplifyRecursive(&simp,package->contentDoc->docNode); > > + DFBufferRelease(simp.instrText); > > + return simp.haveFields; > > +} > > + > > > +//////////////////////////////////////////////////////////////////////////////////////////////////// > > +// > // > > +// ODFFieldLens > // > > +// > // > > > +//////////////////////////////////////////////////////////////////////////////////////////////////// > > +/* > > +typedef enum { > > + ODFRefUnknown, > > + ODFRefNum, > > + ODFRefText, > > + ODFRefDirection, > > + ODFRefCaptionText, > > + ODFRefLabelNum, > > +} ODFRefType; > > + > > +static const char *ODFRefTypeClassName(ODFRefType refType) > > +{ > > + switch (refType) { > > + case ODFRefText: > > + return DFRefTextClass; > > + case ODFRefDirection: > > + return DFRefDirectionClass; > > + case ODFRefCaptionText: > > + return DFRefCaptionTextClass; > > + case ODFRefLabelNum: > > + return DFRefLabelNumClass; > > + case ODFRefNum: > > + default: > > + return DFRefNumClass; > > + } > > +} > > + > > +static ODFRefType ODFRefTypeGet(const char **args, ODFBookmark > *bookmark) > > +{ > > + size_t argCount = DFStringArrayCount(args); > > + ODFRefType type = ODFRefText; > > + > > + for (size_t argno = 2; argno < argCount; argno++) { > > + const char *arg = args[argno]; > > + if (!strcmp(arg,"\\r")) > > + type = ODFRefNum; // Numbered reference (normal) > > + else if (!strcmp(arg,"\\n")) > > + type = ODFRefNum; // Numbered reference (no context) > > + else if (!strcmp(arg,"\\w")) > > + type = ODFRefNum; // Numbered reference (full context) > > + else if (!strcmp(arg,"\\p")) > > + type = ODFRefDirection; > > + } > > + > > + if ((bookmark->type == ODFBookmarkTable) || > > + (bookmark->type == ODFBookmarkFigure) || > > + (bookmark->type == ODFBookmarkEquation)) { > > + if (type == ODFRefText) { > > + DFNode *p = ODFFindContainingParagraph(bookmark->element); > > + if (p != NULL) { > > + CaptionParts parts = > ODFBookmarkGetCaptionParts(bookmark); > > + > > + if (parts.beforeNum && !parts.num && !parts.afterNum) > > + type = ODFRefCaptionText; > > + else if (parts.beforeNum && parts.num && > !parts.afterNum) > > + type = ODFRefLabelNum; > > + } > > + } > > + } > > + > > + return type; > > +} > > + > > +static DFNode *ODFFieldGet(ODFGetData *get, DFNode *concrete) > > +{ > > + if (concrete->tag != WORD_FLDSIMPLE) > > + return NULL;; > > + > > + const char *instr = DFGetAttribute(concrete,WORD_INSTR); > > + if (instr != NULL) { > > + const char **args = ODF_parseField(instr); > > + size_t argCount = DFStringArrayCount(args); > > + > > + if ((argCount >= 2) && !strcmp(args[0],"REF")) { > > + ODFBookmark *bookmark = > ODFObjectsBookmarkWithName(get->conv->objects,args[1]); > > + if ((bookmark != NULL) && (bookmark->target != NULL)) { > > + > > + ODFRefType type = ODFRefTypeGet(args,bookmark); > > + > > + DFNode *a = > ODFConverterCreateAbstract(get,HTML_A,concrete); > > + > DFFormatAttribute(a,HTML_HREF,"#%s%u",get->conv->idPrefix,bookmark->target->seqNo); > > + DFSetAttribute(a,HTML_CLASS,ODFRefTypeClassName(type)); > > + > > + free(args); > > + return a; > > + } > > + } > > + else if ((argCount >= 1) && !strcmp(args[0],"TOC")) { > > + > > + if ((argCount >= 2) && !strcmp(args[1],"\\o")) { > > + DFNode *nav = > ODFConverterCreateAbstract(get,HTML_NAV,concrete); > > + DFSetAttribute(nav,HTML_CLASS,DFTableOfContentsClass); > > + free(args); > > + return nav; > > + } > > + else if ((argCount >= 3) && !strcmp(args[1],"\\c")) { > > + // FIXME: The names "Figure" and "Table" here will be > different if the document > > + // was created in a language other than English. We > need to look through the > > + // document to figure out which counter names are used > in captions adjacent to > > + // figures and tables to know what the counter names > used in the document > > + // actually are. > > + > > + // Another option might be just to collect a static > list of names used in all the > > + // major languages and base the detection on that. > These would need to be checked > > + // with multiple versions of word, as the names used > could in theory change > > + // between releases. > > + > > + // We should keep track of a set of "document > parameters", which record the names > > + // used for figure and table counters, as well as the > prefixes used on numbered > > + // figures and tables. The latter would correspond to > the content property of the > > + // caption::before and figcaption::before CSS rules. > > + > > + if (!strcmp(args[2],"Figure")) { > > + DFNode *nav = > ODFConverterCreateAbstract(get,HTML_NAV,concrete); > > + DFSetAttribute(nav,HTML_CLASS,DFListOfFiguresClass); > > + free(args); > > + return nav; > > + } > > + else if (!strcmp(args[2],"Table")) { > > + DFNode *nav = > ODFConverterCreateAbstract(get,HTML_NAV,concrete); > > + DFSetAttribute(nav,HTML_CLASS,DFListOfTablesClass); > > + free(args); > > + return nav; > > + } > > + } > > + } > > + > > + DFNode *span = > ODFConverterCreateAbstract(get,HTML_SPAN,concrete); > > + DFSetAttribute(span,HTML_CLASS,DFFieldClass); > > + DFNode *text = DFCreateTextNode(get->conv->html,instr); > > + DFAppendChild(span,text); > > + free(args); > > + return span; > > + } > > + return NULL; > > +} > > + > > +static int ODFFieldIsVisible(ODFPutData *put, DFNode *concrete) > > +{ > > + return 1; > > +} > > + > > +static DFNode *ODFFieldCreate(ODFPutData *put, DFNode *abstract) > > +{ > > + DFNode *concrete = DFCreateElement(put->contentDoc,WORD_FLDSIMPLE); > > + // fldSimple elements are required to have an instr attribute (even > if it's empty), so set > > + // it here in case update doesn't change it for some reason > > + DFSetAttribute(concrete,WORD_INSTR,""); > > + ODFFieldPut(put,abstract,concrete); > > + put->conv->haveFields = 1; > > + return concrete; > > +} > > + > > +static const char *bookmarkNameForHtmlId(ODFConverter *converter, const > char *htmlId, const char *refClass) > > +{ > > + DFNode *htmlElem = DFElementForIdAttr(converter->html,htmlId); > > + if (htmlElem == NULL) > > + return NULL; > > + switch (htmlElem->tag) { > > + case HTML_H1: > > + case HTML_H2: > > + case HTML_H3: > > + case HTML_H4: > > + case HTML_H5: > > + case HTML_H6: { > > + DFNode *labelSpan = htmlElem->first; > > + if ((labelSpan == NULL) || (labelSpan->tag != HTML_SPAN)) > > + return NULL;; > > + const char *labelClass = > DFGetAttribute(labelSpan,HTML_CLASS); > > + if (!DFStringEquals(labelClass,DFBookmarkClass)) > > + return NULL; > > + return DFGetAttribute(labelSpan,WORD_NAME); > > + } > > + case HTML_FIGURE: > > + case HTML_TABLE: { > > + ODFCaption *caption = > ODFObjectsCaptionForTarget(converter->objects,htmlElem); > > + if (caption == NULL) > > + return NULL; > > + if (DFStringEquals(refClass,DFRefTextClass) && > (caption->textBookmark != NULL)) > > + return caption->textBookmark->bookmarkName; > > + else if (DFStringEquals(refClass,DFRefLabelNumClass) && > (caption->labelNumBookmark != NULL)) > > + return caption->labelNumBookmark->bookmarkName; > > + else if (DFStringEquals(refClass,DFRefCaptionTextClass) && > (caption->captionTextBookmark != NULL)) > > + return caption->captionTextBookmark->bookmarkName; > > + else if (caption->textBookmark != NULL) > > + return caption->textBookmark->bookmarkName; // default > is entire caption > > + } > > + default: > > + return NULL; > > + } > > +} > > + > > +static void ODFFieldPut(ODFPutData *put, DFNode *abstract, DFNode > *concrete) > > +{ > > + switch (abstract->tag) { > > + case HTML_SPAN: { > > + const char *className = DFGetAttribute(abstract,HTML_CLASS); > > + if (!DFStringEquals(className,DFFieldClass)) > > + return; > > + char *text = DFNodeTextToString(abstract); > > + DFSetAttribute(concrete,WORD_INSTR,text); > > + free(text); > > + break; > > + } > > + case HTML_A: { > > + const char *href = DFGetAttribute(abstract,HTML_HREF); > > + if ((href == NULL) || (href[0] != '#')) > > + return;; > > + > > + const char *targetId = &href[1]; > > + const char *className = DFGetAttribute(abstract,HTML_CLASS); > > + if (className == NULL) > > + className = "";; > > + const char *bookmarkName = > bookmarkNameForHtmlId(put->conv,targetId,className); > > + if (bookmarkName == NULL) > > + return;; > > + > > + DFNode *htmlElem = > DFElementForIdAttr(put->conv->html,targetId); > > + if ((htmlElem != NULL) && ((htmlElem->tag == HTML_TABLE) || > (htmlElem->tag == HTML_FIGURE))) { > > + if (!DFStringEquals(className,DFRefTextClass) && > > + !DFStringEquals(className,DFRefLabelNumClass) && > > + !DFStringEquals(className,DFRefCaptionTextClass)) > > + className = DFRefTextClass; > > + } > > + > > + if (DFStringEquals(className,DFRefTextClass) || > > + DFStringEquals(className,DFRefLabelNumClass) || > > + DFStringEquals(className,DFRefCaptionTextClass)) > > + DFFormatAttribute(concrete,WORD_INSTR," REF %s \\h > ",bookmarkName); > > + else if (DFStringEquals(className,DFRefDirectionClass)) > > + DFFormatAttribute(concrete,WORD_INSTR," REF %s \\p \\h > ",bookmarkName); > > + else > > + DFFormatAttribute(concrete,WORD_INSTR," REF %s \\r \\h > ",bookmarkName); > > + break; > > + } > > + } > > +} > > + > > +ODFLens ODFFieldLens = { > > + .isVisible = ODFFieldIsVisible, > > + .get = ODFFieldGet, > > + .put = ODFFieldPut, > > + .create = ODFFieldCreate, > > + .remove = NULL, // LENS FIXME > > +}; > > + > > +*/ > > > > > http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/83720d9d/DocFormats/filters/ooxml/src/odf/lenses/ODFField.h > > ---------------------------------------------------------------------- > > diff --git a/DocFormats/filters/ooxml/src/odf/lenses/ODFField.h > b/DocFormats/filters/ooxml/src/odf/lenses/ODFField.h > > new file mode 100644 > > index 0000000..99e4252 > > --- /dev/null > > +++ b/DocFormats/filters/ooxml/src/odf/lenses/ODFField.h > > @@ -0,0 +1,27 @@ > > +// Licensed to the Apache Software Foundation (ASF) under one > > +// or more contributor license agreements. See the NOTICE file > > +// distributed with this work for additional information > > +// regarding copyright ownership. The ASF licenses this file > > +// to you under the Apache License, Version 2.0 (the > > +// "License"); you may not use this file except in compliance > > +// with the License. You may obtain a copy of the License at > > +// > > +// http://www.apache.org/licenses/LICENSE-2.0 > > +// > > +// Unless required by applicable law or agreed to in writing, > > +// software distributed under the License is distributed on an > > +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > > +// KIND, either express or implied. See the License for the > > +// specific language governing permissions and limitations > > +// under the License. > > + > > +#ifndef DocFormats_ODFField_h > > +#define DocFormats_ODFField_h > > + > > +#include "ODFPackage.h" > > + > > +const char **ODF_parseField(const char *cstr); > > + > > +int ODF_simplifyFields(ODFPackage *package); > > + > > +#endif > > > > -- Visit my Coding Diary: http://gabriela-gibson.blogspot.com/