static WordRefType WordRefTypeGet(const char **args, WordBookmark *bookmark) { size_t argCount = DFStringArrayCount(args); WordRefType type = WordRefText; for (size_t argno = 2; argno < argCount; argno++) { const char *arg = args[argno]; if (!strcmp(arg,"\\r")) type = WordRefNum; // Numbered reference (normal) else if (!strcmp(arg,"\\n")) type = WordRefNum; // Numbered reference (no context) else if (!strcmp(arg,"\\w")) type = WordRefNum; // Numbered reference (full context) else if (!strcmp(arg,"\\p")) type = WordRefDirection; } if ((bookmark->type == WordBookmarkTable) || (bookmark->type == WordBookmarkFigure) || (bookmark->type == WordBookmarkEquation)) { if (type == WordRefText) { DFNode *p = WordFindContainingParagraph(bookmark->element); if (p != NULL) { CaptionParts parts = WordBookmarkGetCaptionParts(bookmark); if (parts.beforeNum && !parts.num && !parts.afterNum) type = WordRefCaptionText; else if (parts.beforeNum && parts.num && !parts.afterNum) type = WordRefLabelNum; } } } return type; }
static void findTargetAndType(WordBookmark *bookmark, WordSheet *sheet) { if (DFStringEquals(bookmark->bookmarkName,"_GoBack")) { bookmark->type = WordBookmarkCursor; bookmark->target = NULL; return; } // FIXME: Check if the following line is still relevant with the new bookmarks model assert(bookmark->element != NULL); DFNode *p = WordFindContainingParagraph(bookmark->element); if (p == NULL) return; DFNode *pPr = DFChildWithTag(p,WORD_PPR); if (pPr == NULL) return; DFNode *pStyle = DFChildWithTag(pPr,WORD_PSTYLE); if (pStyle == NULL) return; const char *styleId = DFGetAttribute(pStyle,WORD_VAL); if (styleId == NULL) return; WordStyle *style = WordSheetStyleForTypeId(sheet,"paragraph",styleId); if ((style != NULL) && isHeadingOutlineLvl(style->outlineLvl)) { bookmark->type = WordBookmarkHeading; bookmark->target = p; } else if (DFStringEquals(styleId,"Caption")) { DFNode *prev = findPreviousElement(p); if (prev == NULL) return; if (prev->tag == WORD_TBL) { bookmark->type = WordBookmarkTable; bookmark->target = prev; } else if (Word_isFigureParagraph(prev)) { bookmark->type = WordBookmarkFigure; bookmark->target = prev; } else if (Word_isEquationParagraph(prev)) { bookmark->type = WordBookmarkEquation; bookmark->target = prev; } } }