📄 xml.c
字号:
* vAddEndTag - add the specified end tag to the file */static voidvAddEndTag(diagram_type *pDiag, UCHAR ucTag){ UCHAR ucTopTag; fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); fail((size_t)ucTag >= elementsof(atDocBookTags));#if defined(DEBUG) ucTopTag = ucReadStack(); if (ucTag != ucTopTag) { DBG_DEC(ucTag); DBG_MSG(atDocBookTags[(UINT)ucTag].szTagname); vStackTrace(); }#endif /* DEBUG */ ucTopTag = ucPopStack(); fail((size_t)ucTopTag >= elementsof(atDocBookTags)); if (ucTag != ucTopTag) { DBG_DEC(ucTag); DBG_DEC(ucTopTag); DBG_FIXME(); werr(1, "Impossible tag sequence, unable to continue"); } if (atDocBookTags[(UINT)ucTag].bAddNewlineEnd) { fprintf(pDiag->pOutFile, "\n"); vPrintLevel(pDiag->pOutFile); } fprintf(pDiag->pOutFile, "</%s>", atDocBookTags[(UINT)ucTag].szTagname); if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) { fprintf(pDiag->pOutFile, "\n"); pDiag->lXleft = 0; } /* Set global variables */ switch (ucTag) { case TAG_CHAPTER: usHeaderLevelCurrent = 0; break; case TAG_SECT1: usHeaderLevelCurrent = 1; break; case TAG_SECT2: usHeaderLevelCurrent = 2; break; case TAG_SECT3: usHeaderLevelCurrent = 3; break; case TAG_SECT4: usHeaderLevelCurrent = 4; break; case TAG_SECT5: usHeaderLevelCurrent = 5; break; case TAG_TITLE: bTitleOpen = FALSE; break; case TAG_FOOTNOTE: bFootnoteOpen = FALSE; break; case TAG_PARA: uiParagraphLevel--; break; case TAG_EMPHASIS: bEmphasisOpen = FALSE; break; case TAG_SUPERSCRIPT: bSuperscriptOpen = FALSE; break; case TAG_ITEMIZEDLIST: case TAG_ORDEREDLIST: uiListLevel--; break; case TAG_SUBSCRIPT: bSubscriptOpen = FALSE; break; case TAG_INFORMALTABLE: bTableOpen = FALSE; iTableColumnsCurrent = 0; break; default: break; }} /* end of vAddEndTag *//* * vAddEndTagOptional - add the specified end tag to the file if needed */static voidvAddEndTagOptional(diagram_type *pDiag, UCHAR ucTag){ UCHAR ucTopTag; ucTopTag = ucReadStack(); if (ucTag == ucTopTag) { vAddEndTag(pDiag, ucTag); }} /* end of vAddEndTagOptional *//* * vAddCombinedTag - add the specified start and end tag to the file */static voidvAddCombinedTag(diagram_type *pDiag, UCHAR ucTag, const char *szAttribute){ fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); fail((size_t)ucTag >= elementsof(atDocBookTags)); if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) { fprintf(pDiag->pOutFile, "\n"); vPrintLevel(pDiag->pOutFile); } if (szAttribute == NULL || szAttribute[0] == '\0') { fprintf(pDiag->pOutFile, "<%s/>", atDocBookTags[(UINT)ucTag].szTagname); } else { fprintf(pDiag->pOutFile, "<%s %s/>", atDocBookTags[(UINT)ucTag].szTagname, szAttribute); } if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) { fprintf(pDiag->pOutFile, "\n"); pDiag->lXleft = 0; }} /* end of vAddCombinedTag *//* * vAddEndTagsUntil2 - add end tags until one the specified tags is seen */static voidvAddEndTagsUntil2(diagram_type *pDiag, UCHAR ucTag1, UCHAR ucTag2){ UCHAR ucTopTag; do { ucTopTag = ucReadStack(); switch (ucTopTag) { case TAG_CHAPTER: case TAG_SECT1: case TAG_SECT2: case TAG_SECT3: case TAG_SECT4: case TAG_SECT5: if (bEmptyHeaderLevel) { /* * An empty chapter is legal in Word, * but not in DocBook. */ vAddCombinedTag(pDiag, TAG_PARA, NULL); bEmptyHeaderLevel = FALSE; } break; case TAG_ITEMIZEDLIST: case TAG_ORDEREDLIST: if (bEmptyListLevel) { /* * A list without items is legal in Word, * but not in DocBook. (Nor are empty items) */ vAddStartTag(pDiag, TAG_LISTITEM, NULL); vAddCombinedTag(pDiag, TAG_PARA, NULL); vAddEndTag(pDiag, TAG_LISTITEM); bEmptyListLevel = FALSE; } break; default: break; } vAddEndTag(pDiag, ucTopTag); } while (ucTopTag != ucTag1 && ucTopTag != ucTag2);} /* end of vAddEndTagsUntil2 *//* * vCreateBookIntro - create title and bookinfo */voidvCreateBookIntro(diagram_type *pDiag, int iVersion){ const char *szTitle, *szSubject, *szAuthor; const char *szLastSaveDtm, *szCompany; const char *szLanguage; char szTmp[13]; fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); fail(iVersion < 0); fail(eEncoding == encoding_neutral); iWordVersion = iVersion; bOldMacFile = bIsOldMacFile(); szTitle = szGetTitle(); szSubject = szGetSubject(); szAuthor = szGetAuthor(); szLastSaveDtm = szGetLastSaveDtm(); szCompany = szGetCompany(); /* Start Book */ szLanguage = szGetLanguage(); if (szLanguage != NULL) { DBG_MSG(szLanguage); sprintf(szTmp, "lang='%.5s'", szLanguage); szLanguage = szTmp; } vAddStartTag(pDiag, TAG_BOOK, szLanguage); /* Book title */ if (szTitle != NULL && szTitle[0] != '\0') { vAddStartTag(pDiag, TAG_TITLE, NULL); vPrintSpecialString(pDiag, szTitle); vAddEndTag(pDiag, TAG_TITLE); } /* Bookinfo */ if ((szTitle != NULL && szTitle[0] != '\0') || (szSubject != NULL && szSubject[0] != '\0') || (szAuthor != NULL && szAuthor[0] != '\0') || (szLastSaveDtm != NULL && szLastSaveDtm[0] != '\0') || (szCompany != NULL && szCompany[0] != '\0')) { vAddStartTag(pDiag, TAG_BOOKINFO, NULL); if (szTitle != NULL && szTitle[0] != '\0') { vAddStartTag(pDiag, TAG_TITLE, NULL); vPrintSpecialString(pDiag, szTitle); vAddEndTag(pDiag, TAG_TITLE); } if (szSubject != NULL && szSubject[0] != '\0') { vAddStartTag(pDiag, TAG_SUBTITLE, NULL); vPrintSpecialString(pDiag, szSubject); vAddEndTag(pDiag, TAG_SUBTITLE); } if (szAuthor != NULL && szAuthor[0] != '\0') { vAddStartTag(pDiag, TAG_AUTHOR, NULL); vAddStartTag(pDiag, TAG_SURNAME, NULL); vPrintSpecialString(pDiag, szAuthor); vAddEndTag(pDiag, TAG_SURNAME); vAddEndTag(pDiag, TAG_AUTHOR); } if (szLastSaveDtm != NULL && szLastSaveDtm[0] != '\0') { vAddStartTag(pDiag, TAG_DATE, NULL); vPrintSpecialString(pDiag, szLastSaveDtm); vAddEndTag(pDiag, TAG_DATE); } if (szCompany != NULL && szCompany[0] != '\0') { vAddStartTag(pDiag, TAG_CORPNAME, NULL); vPrintSpecialString(pDiag, szCompany); vAddEndTag(pDiag, TAG_CORPNAME); } vAddEndTag(pDiag, TAG_BOOKINFO); }} /* end of vCreateBookIntro *//* * vPrologueXML - perform the XML initialization */voidvPrologueXML(diagram_type *pDiag, const options_type *pOptions){ fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); fail(pOptions == NULL);#if defined(DEBUG) vCheckTagTable();#endif /* DEBUG */ /* Set global variables to their start values */ eEncoding = pOptions->eEncoding; bEmphasisOpen = FALSE; bSuperscriptOpen = FALSE; bSubscriptOpen = FALSE; bTitleOpen = FALSE; bTableOpen = FALSE; bFootnoteOpen = FALSE; uiParagraphLevel = 0; uiListLevel = 0; bEmptyListLevel = TRUE; usHeaderLevelCurrent = 0; bEmptyHeaderLevel = TRUE; iTableColumnsCurrent = 0; uiFootnoteNumber = 0; pDiag->lXleft = 0; pDiag->lYtop = 0; /* Create an empty stack */ tStacksize = INITIAL_STACK_SIZE; aucStack = xcalloc(tStacksize, sizeof(UCHAR)); tStackNextFree = 0;} /* end of vPrologueXML *//* * vEpilogueXML - clean up after everything is done */voidvEpilogueXML(diagram_type *pDiag){ vStackTrace(); vAddEndTagsUntil1(pDiag, TAG_BOOK); vStackTrace(); /* Destroy the stack */ fail(tStackNextFree != 0); tStacksize = 0; aucStack = xfree(aucStack); tStackNextFree = 0;} /* end of vEpilogueXML *//* * vPrintXML - print a XML string */static voidvPrintXML(diagram_type *pDiag, const char *szString, size_t tStringLength, USHORT usFontstyle){ const char *szAttr; int iCount; size_t tNextFree; BOOL bNotReady, bEmphasisNew, bSuperscriptNew, bSubscriptNew; UCHAR ucTopTag, aucStorage[3]; fail(szString == NULL); if (szString == NULL || szString[0] == '\0' || tStringLength == 0) { return; } if (tStringLength == 1 && szString[0] == FOOTNOTE_OR_ENDNOTE) { /* Don't do anything special for just a single footnote */ bEmphasisNew = FALSE; bSuperscriptNew = FALSE; bSubscriptNew = FALSE; } else { /* Situation normal */ bEmphasisNew = bIsBold(usFontstyle) || bIsItalic(usFontstyle) || bIsUnderline(usFontstyle) || bIsStrike(usFontstyle); bSuperscriptNew = bIsSuperscript(usFontstyle); bSubscriptNew = bIsSubscript(usFontstyle); } /* End what has to be ended (or more to keep the stack happy) */ tNextFree = 0; bNotReady = TRUE; do { ucTopTag = ucReadStack(); switch (ucTopTag) { case TAG_EMPHASIS: fail(!bEmphasisOpen); if (bEmphasisNew) { aucStorage[tNextFree++] = ucTopTag; } vAddEndTag(pDiag, ucTopTag); break; case TAG_SUPERSCRIPT: fail(!bSuperscriptOpen); if (bSuperscriptNew) { aucStorage[tNextFree++] = ucTopTag; } vAddEndTag(pDiag, ucTopTag); break; case TAG_SUBSCRIPT: fail(!bSubscriptOpen); if (bSubscriptNew) { aucStorage[tNextFree++] = ucTopTag; } vAddEndTag(pDiag, ucTopTag); break; default: bNotReady = FALSE; break; } fail(tNextFree > elementsof(aucStorage)); fail(bNotReady && tNextFree == elementsof(aucStorage)); } while (bNotReady); /* Just te make sure */ vStartOfParagraphXML(pDiag, 1); /* Restart to keep the stack happy */ for (iCount = (int)tNextFree - 1; iCount > 0; iCount--) { vAddStartTag(pDiag, aucStorage[iCount], NULL); } /* Start what has to be started */ if (bEmphasisNew && !bEmphasisOpen) { if (bIsBold(usFontstyle)) { szAttr = "role='bold'"; } else if (bIsItalic(usFontstyle)) { szAttr = NULL; } else if (bIsUnderline(usFontstyle)) { szAttr = "role='underline'"; } else if (bIsStrike(usFontstyle)) { szAttr = "role='strikethrough'"; } else { szAttr = NULL; } vAddStartTag(pDiag, TAG_EMPHASIS, szAttr); } if (bSuperscriptNew && !bSuperscriptOpen) { vAddStartTag(pDiag, TAG_SUPERSCRIPT, NULL); } if (bSubscriptNew && !bSubscriptOpen) { vAddStartTag(pDiag, TAG_SUBSCRIPT, NULL); } /* The print the string */ for (iCount = 0; iCount < (int)tStringLength; iCount++) { vPrintChar(pDiag, szString[iCount]); }} /* end of vPrintXML *//* * vMove2NextLineXML - move to the next line */voidvMove2NextLineXML(diagram_type *pDiag){ fail(pDiag == NULL); /* if (uiParagraphLevel != 0) { We need something like HTML's <BR> tag } */} /* end of vMove2NextLineXML *//* * vSubstringXML - put a sub string into a diagram */voidvSubstringXML(diagram_type *pDiag, const char *szString, size_t tStringLength, long lStringWidth, USHORT usFontstyle){ fail(pDiag == NULL || szString == NULL); fail(pDiag->pOutFile == NULL); fail(pDiag->lXleft < 0); fail(tStringLength != strlen(szString)); if (szString[0] == '\0' || tStringLength == 0) { return; } vPrintXML(pDiag, szString, tStringLength, usFontstyle); pDiag->lXleft += lStringWidth;} /* end of vSubstringXML *//* * Create an start of a paragraph * Only works on paragraph level one, because Word doesn't allow paragraphs * in paragraphs. Other paragraph levels result from DocBooks special needs. */voidvStartOfParagraphXML(diagram_type *pDiag, UINT uiMaxLevel){ fail(pDiag == NULL); if (uiParagraphLevel >= uiMaxLevel || bTitleOpen) { /* In Word a title is just a paragraph */ return; } if (uiListLevel != 0 && bEmptyListLevel) { /* No paragraphs in a list before the first listitem */ return; } if (usHeaderLevelCurrent == 0) { /* No paragraphs without an open header */ vAddStartTag(pDiag, TAG_CHAPTER, NULL); /* Dummy title */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -