📄 xml.c
字号:
vAddCombinedTag(pDiag, TAG_TITLE, NULL); } vAddStartTag(pDiag, TAG_PARA, NULL);} /* end of vStartOfParagraphXML *//* * Create an end of a paragraph * Only for paragraph level one and for titles */voidvEndOfParagraphXML(diagram_type *pDiag, UINT uiMaxLevel){ UCHAR ucTopTag; fail(pDiag == NULL); if (uiParagraphLevel > uiMaxLevel) { DBG_DEC(uiParagraphLevel); return; } for(;;) { ucTopTag = ucReadStack(); switch (ucTopTag) { case TAG_EMPHASIS: fail(!bEmphasisOpen); vAddEndTag(pDiag, TAG_EMPHASIS); break; case TAG_SUPERSCRIPT: fail(!bSuperscriptOpen); vAddEndTag(pDiag, TAG_SUPERSCRIPT); break; case TAG_SUBSCRIPT: fail(!bSubscriptOpen); vAddEndTag(pDiag, TAG_SUBSCRIPT); break; case TAG_TITLE: fail(!bTitleOpen); vAddEndTag(pDiag, TAG_TITLE); return; case TAG_PARA: fail(uiParagraphLevel == 0); vAddEndTag(pDiag, TAG_PARA); return; case TAG_TBODY: case TAG_TGROUP: case TAG_INFORMALTABLE: fail(!bTableOpen); vAddEndTag(pDiag, ucTopTag); break; case TAG_NOTAG: DBG_FIXME(); werr(1, "Impossible tag sequence, unable to continue"); break; default: DBG_DEC(ucTopTag); DBG_MSG_C((size_t)ucTopTag < elementsof(atDocBookTags), atDocBookTags[(UINT)ucTopTag].szTagname); return; } }} /* end of vEndOfParagraphXML *//* * Create an end of a page */voidvEndOfPageXML(diagram_type *pDiag){ if (bTableOpen || usHeaderLevelCurrent == 0) { /* No beginpage in a table or outside a chapter */ return; } if (bTitleOpen) { /* A beginpage is not allowed when in a title */ /* So start a new paragraph */ vEndOfParagraphXML(pDiag, UINT_MAX); vStartOfParagraphXML(pDiag, UINT_MAX); return; } vAddCombinedTag(pDiag, TAG_BEGINPAGE, NULL);} /* end of vEndOfPageXML *//* * vCloseHeaderLevels - close the specified header levels */static voidvCloseHeaderLevels(diagram_type *pDiag, USHORT usIstd){ BOOL bNotReady; UCHAR ucTopTag; DBG_MSG("vCloseHeaderLevels"); DBG_DEC(usIstd); DBG_DEC(usHeaderLevelCurrent); vStackTrace(); bNotReady = TRUE; do { ucTopTag = ucReadStack(); switch (ucTopTag) { case TAG_TITLE: case TAG_PARA: vAddEndTag(pDiag, ucTopTag); break; default: bNotReady = FALSE; break; } } while (bNotReady); vStackTrace(); while (usHeaderLevelCurrent >= usIstd) { if (bEmptyHeaderLevel) { vAddCombinedTag(pDiag, TAG_PARA, NULL); bEmptyHeaderLevel = FALSE; } switch (usHeaderLevelCurrent) { case 1: vAddEndTag(pDiag, TAG_CHAPTER); break; case 2: vAddEndTag(pDiag, TAG_SECT1); break; case 3: vAddEndTag(pDiag, TAG_SECT2); break; case 4: vAddEndTag(pDiag, TAG_SECT3); break; case 5: vAddEndTag(pDiag, TAG_SECT4); break; case 6: vAddEndTag(pDiag, TAG_SECT5); break; default: DBG_DEC(usHeaderLevelCurrent); DBG_FIXME(); return; } } DBG_DEC(usHeaderLevelCurrent); vStackTrace();} /* end of vCloseHeaderLevels *//* * vSetHeadersXML - set the headers */voidvSetHeadersXML(diagram_type *pDiag, USHORT usIstd){ fail(pDiag == NULL); if (usIstd == 0 || usIstd > 6) { DBG_DEC_C(usIstd != 0 && usIstd <= 9, usIstd); return; } DBG_DEC(usIstd); if (bTableOpen || uiListLevel != 0) { /* No headers when you're in a table or in a list */ return; } /* Close levels */ vCloseHeaderLevels(pDiag, usIstd); DBG_DEC(usHeaderLevelCurrent); /* Open levels */ while (usHeaderLevelCurrent < usIstd) { switch (usHeaderLevelCurrent) { case 0: vAddStartTag(pDiag, TAG_CHAPTER, NULL); break; case 1: vAddStartTag(pDiag, TAG_SECT1, NULL); break; case 2: vAddStartTag(pDiag, TAG_SECT2, NULL); break; case 3: vAddStartTag(pDiag, TAG_SECT3, NULL); break; case 4: vAddStartTag(pDiag, TAG_SECT4, NULL); break; case 5: vAddStartTag(pDiag, TAG_SECT5, NULL); break; default: DBG_DEC(usHeaderLevelCurrent); DBG_FIXME(); return; } fail(usIstd == 0); /* The next paragraph should be a title */ if (usHeaderLevelCurrent < usIstd) { /* This chapter level is not in the Word document */ vAddCombinedTag(pDiag, TAG_TITLE, NULL); } else { vAddStartTag(pDiag, TAG_TITLE, NULL); } }} /* end of vSetHeadersXML *//* * Create a start of a list */voidvStartOfListXML(diagram_type *pDiag, UCHAR ucNFC, BOOL bIsEndOfTable){ const char *szAttr; UCHAR ucTag; fail(pDiag == NULL); if (bIsEndOfTable) { /* FIXME: until a list in a table is allowed */ vEndOfTableXML(pDiag); } if (bTableOpen) { /* FIXME: a list in a table should be allowed */ return; } if (usHeaderLevelCurrent == 0) { /* No list without an open header */ vAddStartTag(pDiag, TAG_CHAPTER, NULL); /* Dummy title */ vAddCombinedTag(pDiag, TAG_TITLE, NULL); } switch (ucNFC) { case LIST_ARABIC_NUM: case LIST_ORDINAL_NUM: case LIST_NUMBER_TXT: case LIST_ORDINAL_TXT: case LIST_OUTLINE_NUM: ucTag = TAG_ORDEREDLIST; szAttr = "numeration='arabic'"; break; case LIST_UPPER_ROMAN: ucTag = TAG_ORDEREDLIST; szAttr = "numeration='upperroman'"; break; case LIST_LOWER_ROMAN: ucTag = TAG_ORDEREDLIST; szAttr = "numeration='lowerroman'"; break; case LIST_UPPER_ALPHA: ucTag = TAG_ORDEREDLIST; szAttr = "numeration='upperalpha'"; break; case LIST_LOWER_ALPHA: ucTag = TAG_ORDEREDLIST; szAttr = "numeration='loweralpha'"; break; case LIST_SPECIAL: case LIST_SPECIAL2: case LIST_BULLETS: ucTag = TAG_ITEMIZEDLIST; szAttr = "mark='bullet'"; break; default: ucTag = TAG_ORDEREDLIST; szAttr = "numeration='arabic'"; DBG_HEX(ucNFC); DBG_FIXME(); break; } vAddStartTag(pDiag, ucTag, szAttr);} /* end of vStartOfListXML *//* * Create an end of a list */voidvEndOfListXML(diagram_type *pDiag){ fail(pDiag == NULL); if (bTableOpen) { /* FIXME: a list in a table should be allowed */ return; } if (uiListLevel != 0) { vStackTrace(); vAddEndTagsUntil2(pDiag, TAG_ITEMIZEDLIST, TAG_ORDEREDLIST); vStackTrace(); }} /* end of vEndOfListXML *//* * Create a start of a list item */voidvStartOfListItemXML(diagram_type *pDiag, BOOL bNoMarks){ const char *szAttr; UCHAR ucTopTag; fail(pDiag == NULL); if (bTableOpen) { /* FIXME: a list in a table should be allowed */ return; } ucTopTag = ucReadStack(); if (ucTopTag != TAG_ITEMIZEDLIST && ucTopTag != TAG_ORDEREDLIST) { /* Must end a previous list item first */ vAddEndTagsUntil1(pDiag, TAG_LISTITEM); } DBG_DEC_C(ucReadStack() != TAG_ITEMIZEDLIST && ucReadStack() != TAG_ORDEREDLIST, ucReadStack()); /* Start a new list item */ szAttr = bNoMarks ? "override='none'" : NULL; vAddStartTag(pDiag, TAG_LISTITEM, szAttr); /* Start a new paragraph (independant of level) */ vAddStartTag(pDiag, TAG_PARA, NULL);} /* end of vStartOfListItemXML *//* * Create a start of a table */static voidvStartOfTable(diagram_type *pDiag, UCHAR ucBorderInfo){ const char *szFrame; BOOL bNotReady; UCHAR ucTopTag; char cColSep, cRowSep; char szAttr[40]; fail(pDiag == NULL); /* Close elements that cannot contain a table */ bNotReady = TRUE; do { ucTopTag = ucReadStack(); switch (ucTopTag) { case TAG_TITLE: fail(!bTitleOpen); vAddEndTag(pDiag, TAG_TITLE); break; case TAG_EMPHASIS: fail(!bEmphasisOpen); vAddEndTag(pDiag, TAG_EMPHASIS); break; case TAG_SUPERSCRIPT: fail(!bSuperscriptOpen); vAddEndTag(pDiag, TAG_SUPERSCRIPT); break; case TAG_SUBSCRIPT: fail(!bSubscriptOpen); vAddEndTag(pDiag, TAG_SUBSCRIPT); break; default: bNotReady = FALSE; break; } } while (bNotReady); /* Create table attributes */ switch (ucBorderInfo) { case TABLE_BORDER_TOP: szFrame = "top"; break; case TABLE_BORDER_LEFT|TABLE_BORDER_RIGHT: szFrame = "sides"; break; case TABLE_BORDER_TOP|TABLE_BORDER_BOTTOM: szFrame = "topbot"; break; case TABLE_BORDER_BOTTOM: szFrame = "bottom"; break; case TABLE_BORDER_TOP|TABLE_BORDER_LEFT| TABLE_BORDER_BOTTOM|TABLE_BORDER_RIGHT: szFrame = "all"; break; default: szFrame = "none"; break; } cColSep = bIsTableBorderLeft(ucBorderInfo) || bIsTableBorderRight(ucBorderInfo) ? '1' : '0'; cRowSep = bIsTableBorderTop(ucBorderInfo) || bIsTableBorderBottom(ucBorderInfo) ? '1' : '0'; sprintf(szAttr, "frame='%.6s' colsep='%c' rowsep='%c'", szFrame, cColSep, cRowSep); if (usHeaderLevelCurrent == 0) { /* No table without an open header */ vAddStartTag(pDiag, TAG_CHAPTER, NULL); /* Dummy title */ vAddCombinedTag(pDiag, TAG_TITLE, NULL); } vAddStartTag(pDiag, TAG_INFORMALTABLE, szAttr);} /* end of vStartOfTable *//* * Create a start of a table group */static voidvStartOfTableGroup(diagram_type *pDiag, int iNbrOfColumns, const short *asColumnWidth){ double dWidth; int iIndex; char szCols[6 + 3 * sizeof(int) + 1 + 1]; char szColWidth[10 + 3 * sizeof(short) + 3 + 3 + 1]; fail(iNbrOfColumns < 1); fail(asColumnWidth == NULL); sprintf(szCols, "cols='%d'", iNbrOfColumns); vAddStartTag(pDiag, TAG_TGROUP, szCols); for (iIndex= 0; iIndex < iNbrOfColumns; iIndex++) { fail(asColumnWidth[iIndex] < 0); dWidth = dTwips2Points(asColumnWidth[iIndex]); if (dWidth <= 1.0) { strcpy(szColWidth, "colwidth='1.00pt'"); } else { sprintf(szColWidth, "colwidth='%.2fpt'", dWidth); } vAddCombinedTag(pDiag, TAG_COLSPEC, szColWidth); }} /* end of vStartOfTableGroup *//* * Create an end of a table */voidvEndOfTableXML(diagram_type *pDiag){ fail(pDiag == NULL); if (bTableOpen) { vAddEndTag(pDiag, TAG_TBODY); vAddEndTag(pDiag, TAG_TGROUP); vAddEndTag(pDiag, TAG_INFORMALTABLE); }} /* end of vEndOfTableXML *//* * Add a table row */voidvAddTableRowXML(diagram_type *pDiag, char **aszColTxt, int iNbrOfColumns, const short *asColumnWidth, UCHAR ucBorderInfo){ size_t tCount, tStringLength; int iIndex; fail(pDiag == NULL); fail(pDiag->pOutFile == NULL); fail(aszColTxt == NULL); fail(iNbrOfColumns < 1); fail(asColumnWidth == NULL); if (iNbrOfColumns != iTableColumnsCurrent) { /* A new number of columns */ /* End the old table body and table group (if they exist) */ vAddEndTagOptional(pDiag, TAG_TBODY); vAddEndTagOptional(pDiag, TAG_TGROUP); if (!bTableOpen) { /* No table yet. Start a new table */ vStartOfTable(pDiag, ucBorderInfo); } /* Start a new table group and a new table body */ vStartOfTableGroup(pDiag, iNbrOfColumns, asColumnWidth); vAddStartTag(pDiag, TAG_TBODY, NULL); iTableColumnsCurrent = iNbrOfColumns; } /* Add the table row */ vAddStartTag(pDiag, TAG_ROW, NULL); for (iIndex = 0; iIndex < iNbrOfColumns; iIndex++) { /* Add a table cell */ fail(aszColTxt[iIndex] == NULL); vAddStartTag(pDiag, TAG_ENTRY, NULL); tStringLength = strlen(aszColTxt[iIndex]); for (tCount = 0; tCount < tStringLength; tCount++) { vPrintChar(pDiag, aszColTxt[iIndex][tCount]); } vAddEndTag(pDiag, TAG_ENTRY); } vAddEndTag(pDiag, TAG_ROW);} /* end of vAddTableRowXML */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -