X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/6c155d33875eb3641bf845fbac186c1b5470708e..b271d60d6a009930d80092a8cb534a5df19fc99b:/utils/tex2rtf/src/htmlutil.cpp?ds=sidebyside diff --git a/utils/tex2rtf/src/htmlutil.cpp b/utils/tex2rtf/src/htmlutil.cpp index a286f46279..b68d0b5b2f 100644 --- a/utils/tex2rtf/src/htmlutil.cpp +++ b/utils/tex2rtf/src/htmlutil.cpp @@ -2,17 +2,14 @@ // Name: htmlutil.cpp // Purpose: Converts Latex to HTML // Author: Julian Smart -// Modified by: +// Modified by: Wlodzimierz ABX Skiba 2003/2004 Unicode support +// Ron Lee // Created: 7.9.93 // RCS-ID: $Id$ // Copyright: (c) Julian Smart // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -23,9 +20,13 @@ #ifndef WX_PRECOMP #endif +#include "wx/arrstr.h" + #include "tex2any.h" #include "tex2rtf.h" #include "table.h" +#include +#define HTML_FILENAME_PATTERN _T("%s_%s.html") #if !WXWIN_COMPATIBILITY_2_4 static inline wxChar* copystring(const wxChar* s) @@ -34,10 +35,13 @@ static inline wxChar* copystring(const wxChar* s) extern wxHashTable TexReferences; +extern int passNumber; extern void DecToHex(int, wxChar *); void GenerateHTMLIndexFile(wxChar *fname); +bool PrimaryAnchorOfTheFile( wxChar *file, wxChar *label ); + void GenerateHTMLWorkshopFiles(wxChar *fname); void HTMLWorkshopAddToContents(int level, wxChar *s, wxChar *file); void HTMLWorkshopStartContents(); @@ -67,18 +71,18 @@ FILE *FrameContents = NULL; FILE *Titlepage = NULL; // FILE *FrameTitlepage = NULL; int fileId = 0; -bool subsectionStarted = FALSE; +bool subsectionStarted = false; // Which column of a row are we in? (Assumes no nested tables, of course) int currentColumn = 0; // Are we in verbatim mode? If so, format differently. -static bool inVerbatim = FALSE; +static bool inVerbatim = false; // Need to know whether we're in a table or figure for benefit // of listoffigures/listoftables -static bool inFigure = FALSE; -static bool inTable = FALSE; +static bool inFigure = false; +static bool inTable = false; // This is defined in the Tex2Any library. extern wxChar *BigBuffer; @@ -175,12 +179,17 @@ void SetCurrentSubsubsectionName(wxChar *s, wxChar *file) SetCurrentTopic(s); } + +// mapping between fileId and filenames if truncateFilenames=false: +static wxArrayString gs_filenames; + + /* * Close former filedescriptor and reopen using another filename. * */ -void ReopenFile(FILE **fd, wxChar **fileName) +void ReopenFile(FILE **fd, wxChar **fileName, const wxChar *label) { if (*fd) { @@ -190,9 +199,16 @@ void ReopenFile(FILE **fd, wxChar **fileName) fileId ++; wxChar buf[400]; if (truncateFilenames) - wxSprintf(buf, _T("%s%d.htm"), FileRoot, fileId); + { + wxSnprintf(buf, sizeof(buf), _T("%s%d.htm"), FileRoot, fileId); + } else - wxSprintf(buf, _T("%s%d.html"), FileRoot, fileId); + { + if (fileId == 1) + gs_filenames.Add(wxEmptyString); + wxSnprintf(buf, sizeof(buf), HTML_FILENAME_PATTERN, FileRoot, label); + gs_filenames.Add(buf); + } if (*fileName) delete[] *fileName; *fileName = copystring(wxFileNameFromPath(buf)); *fd = wxFopen(buf, _T("w")); @@ -240,10 +256,10 @@ void ReopenSectionContentsFile(void) void ProcessText2HTML(TexChunk *chunk) { - bool changed = FALSE; + bool changed = false; int ptr = 0; int i = 0; - char ch = 1; + wxChar ch = 1; int len = wxStrlen(chunk->value); while (ch != 0) { @@ -256,35 +272,35 @@ void ProcessText2HTML(TexChunk *chunk) { BigBuffer[ptr] = 0; wxStrcat(BigBuffer, _T("

\n\n")); ptr += 5; i += 2; - changed = TRUE; + changed = true; } - else if (!inVerbatim && ch == '`' && (len >= i+1 && chunk->value[i+1] == '`')) + else if (!inVerbatim && ch == _T('`') && (len >= i+1 && chunk->value[i+1] == '`')) { BigBuffer[ptr] = '"'; ptr ++; i += 2; - changed = TRUE; + changed = true; } - else if (!inVerbatim && ch == '`') // Change ` to ' + else if (!inVerbatim && ch == _T('`')) // Change ` to ' { BigBuffer[ptr] = 39; ptr ++; i += 1; - changed = TRUE; + changed = true; } - else if (ch == '<') // Change < to < + else if (ch == _T('<')) // Change < to < { BigBuffer[ptr] = 0; wxStrcat(BigBuffer, _T("<")); ptr += 4; i += 1; - changed = TRUE; + changed = true; } - else if (ch == '>') // Change > to > + else if (ch == _T('>')) // Change > to > { BigBuffer[ptr] = 0; wxStrcat(BigBuffer, _T(">")); ptr += 4; i += 1; - changed = TRUE; + changed = true; } else { @@ -325,7 +341,7 @@ void Text2HTML(TexChunk *chunk) return; if (def && (def->macroId == ltVERBATIM || def->macroId == ltVERB || def->macroId == ltSPECIAL)) - inVerbatim = TRUE; + inVerbatim = true; wxNode *node = chunk->children.GetFirst(); while (node) @@ -336,7 +352,7 @@ void Text2HTML(TexChunk *chunk) } if (def && (def->macroId == ltVERBATIM || def->macroId == ltVERB || def->macroId == ltSPECIAL)) - inVerbatim = FALSE; + inVerbatim = false; break; } @@ -384,7 +400,9 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, { // contentsReference = "\"Contents\""; contentsReference = contentsReferenceBuf; - wxSprintf(contentsReference, _T("\"Contents\""), ConvertCase(_T("contents.gif"))); + wxSnprintf(contentsReference, sizeof(contentsReferenceBuf), + _T("\"Contents\""), + ConvertCase(_T("contents.gif"))); } wxChar *upReference; // no need to initialize because always assigned below @@ -394,7 +412,9 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, { // upReference = "\"Up\""; upReference = upReferenceBuf; - wxSprintf(upReference, _T("\"Up\""), ConvertCase(_T("up.gif"))); + wxSnprintf(upReference, sizeof(upReferenceBuf), + _T("\"Up\""), + ConvertCase(_T("up.gif"))); } wxChar *backReference; // no need to initialize because always assigned below @@ -404,7 +424,9 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, { // backReference = "\"Previous\""; backReference = backReferenceBuf; - wxSprintf(backReference, _T("\"Previous\""), ConvertCase(_T("back.gif"))); + wxSnprintf(backReference, sizeof(backReferenceBuf), + _T("\"Previous\""), + ConvertCase(_T("back.gif"))); } wxChar *forwardReference; // no need to initialize because always assigned below @@ -414,7 +436,9 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, { // forwardReference = "\"Next\""; forwardReference = forwardReferenceBuf; - wxSprintf(forwardReference, _T("\"Next\""), ConvertCase(_T("forward.gif"))); + wxSnprintf(forwardReference, sizeof(forwardReferenceBuf), + _T("\"Next\""), + ConvertCase(_T("forward.gif"))); } TexOutput(_T("

")); @@ -430,13 +454,17 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, { wxChar buf1[80]; wxStrcpy(buf1, ConvertCase(wxFileNameFromPath(FileRoot))); - wxSprintf(buf, _T("\n%s "), buf1, ConvertCase(_T("htm")), contentsReference); + wxSnprintf(buf, sizeof(buf), + _T("\n%s "), + buf1, ConvertCase(_T("htm")), contentsReference); } else { wxChar buf1[80]; wxStrcpy(buf1, ConvertCase(wxFileNameFromPath(FileRoot))); - wxSprintf(buf, _T("\n%s "), buf1, ConvertCase(_T("_contents.html")), contentsReference); + wxSnprintf(buf, sizeof(buf), + _T("\n%s "), + buf1, ConvertCase(_T("_contents.html")), contentsReference); } // TexOutput(_T("")); TexOutput(buf); @@ -449,10 +477,14 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, if (upLabel && upFilename) { - if (wxStrlen(upLabel) > 0) - wxSprintf(buf, _T("<A HREF=\"%s#%s\">%s</A> "), ConvertCase(upFilename), upLabel, upReference); + if ( (wxStrlen(upLabel) > 0) && !PrimaryAnchorOfTheFile(upFilename, upLabel) ) + wxSnprintf(buf, sizeof(buf), + _T("<A HREF=\"%s#%s\">%s</A> "), + ConvertCase(upFilename), upLabel, upReference); else - wxSprintf(buf, _T("<A HREF=\"%s\">%s</A> "), ConvertCase(upFilename), upReference); + wxSnprintf(buf, sizeof(buf), + _T("<A HREF=\"%s\">%s</A> "), + ConvertCase(upFilename), upReference); if (wxStrcmp(upLabel, _T("contents")) == 0) { // TexOutput(_T("<NOFRAMES>")); @@ -470,7 +502,14 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, if (previousLabel && previousFilename) { - wxSprintf(buf, _T("<A HREF=\"%s#%s\">%s</A> "), ConvertCase(previousFilename), previousLabel, backReference); + if (PrimaryAnchorOfTheFile(previousFilename, previousLabel)) + wxSnprintf(buf, sizeof(buf), + _T("<A HREF=\"%s\">%s</A> "), + ConvertCase(previousFilename), backReference); + else + wxSnprintf(buf, sizeof(buf), + _T("<A HREF=\"%s#%s\">%s</A> "), + ConvertCase(previousFilename), previousLabel, backReference); if (wxStrcmp(previousLabel, _T("contents")) == 0) { // TexOutput(_T("<NOFRAMES>")); @@ -483,7 +522,7 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, else { // A placeholder so the buttons don't keep moving position - wxSprintf(buf, _T("%s "), backReference); + wxSnprintf(buf, sizeof(buf), _T("%s "), backReference); TexOutput(buf); } @@ -517,13 +556,20 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, if (nextLabel && nextFilename) { - wxSprintf(buf, _T("<A HREF=\"%s#%s\">%s</A> "), ConvertCase(nextFilename), nextLabel, forwardReference); + if (PrimaryAnchorOfTheFile(nextFilename, nextLabel)) + wxSnprintf(buf, sizeof(buf), + _T("<A HREF=\"%s\">%s</A> "), + ConvertCase(nextFilename), forwardReference); + else + wxSnprintf(buf, sizeof(buf), + _T("<A HREF=\"%s#%s\">%s</A> "), + ConvertCase(nextFilename), nextLabel, forwardReference); TexOutput(buf); } else { // A placeholder so the buttons don't keep moving position - wxSprintf(buf, _T("%s "), forwardReference); + wxSnprintf(buf, sizeof(buf), _T("%s "), forwardReference); TexOutput(buf); } @@ -555,13 +601,13 @@ wxChar *ParseColourString(wxChar *bkStr, bool *isPicture) wxString token1 = tok.GetNextToken(); if (!tok.HasMoreTokens()) { - *isPicture = TRUE; + *isPicture = true; return resStr; } else { wxString token2 = tok.GetNextToken(); - *isPicture = FALSE; + *isPicture = false; if (tok.HasMoreTokens()) { wxString token3 = tok.GetNextToken(); @@ -608,18 +654,18 @@ void OutputBodyStart(void) TexOutput(_T("\n<BODY")); if (backgroundImageString) { - bool isPicture = FALSE; + bool isPicture = false; wxChar *s = ParseColourString(backgroundImageString, &isPicture); if (s) { TexOutput(_T(" BACKGROUND=\"")); - TexOutput(s); + TexOutput(s); TexOutput(_T("\"")); } } if (backgroundColourString) { - bool isPicture = FALSE; + bool isPicture = false; wxChar *s = ParseColourString(backgroundColourString, &isPicture); if (s) { @@ -631,7 +677,7 @@ void OutputBodyStart(void) // Set foreground text colour, if one is specified if (textColourString) { - bool isPicture = FALSE; + bool isPicture = false; wxChar *s = ParseColourString(textColourString, &isPicture); if (s) { @@ -641,7 +687,7 @@ void OutputBodyStart(void) // Set link text colour, if one is specified if (linkColourString) { - bool isPicture = FALSE; + bool isPicture = false; wxChar *s = ParseColourString(linkColourString, &isPicture); if (s) { @@ -651,7 +697,7 @@ void OutputBodyStart(void) // Set followed link text colour, if one is specified if (followedLinkColourString) { - bool isPicture = FALSE; + bool isPicture = false; wxChar *s = ParseColourString(followedLinkColourString, &isPicture); if (s) { @@ -700,10 +746,10 @@ void HTMLOnMacro(int macroId, int no_args, bool start) chapterNo ++; SetCurrentOutput(NULL); - startedSections = TRUE; + startedSections = true; wxChar *topicName = FindTopicName(GetNextChunk()); - ReopenFile(&Chapters, &ChaptersName); + ReopenFile(&Chapters, &ChaptersName, topicName); AddTexRef(topicName, ChaptersName, ChapterNameString); SetCurrentChapterName(topicName, ChaptersName); @@ -719,9 +765,9 @@ void HTMLOnMacro(int macroId, int no_args, bool start) wxChar titleBuf[200]; if (truncateFilenames) - wxSprintf(titleBuf, _T("%s.htm"), wxFileNameFromPath(FileRoot)); + wxSnprintf(titleBuf, sizeof(titleBuf), _T("%s.htm"), wxFileNameFromPath(FileRoot)); else - wxSprintf(titleBuf, _T("%s_contents.html"), wxFileNameFromPath(FileRoot)); + wxSnprintf(titleBuf, sizeof(titleBuf), _T("%s_contents.html"), wxFileNameFromPath(FileRoot)); wxFprintf(Chapters, _T("<A NAME=\"%s\"></A>"), topicName); @@ -729,12 +775,18 @@ void HTMLOnMacro(int macroId, int no_args, bool start) lastTopic, lastFileName, // Last topic topicName, ChaptersName); // This topic - wxFprintf(Contents, _T("\n<LI><A HREF=\"%s#%s\">"), ConvertCase(ChaptersName), topicName); + if(PrimaryAnchorOfTheFile(ChaptersName, topicName)) + wxFprintf(Contents, _T("\n<LI><A HREF=\"%s\">"), ConvertCase(ChaptersName)); + else + wxFprintf(Contents, _T("\n<LI><A HREF=\"%s#%s\">"), ConvertCase(ChaptersName), topicName); if (htmlFrameContents && FrameContents) { SetCurrentOutput(FrameContents); - wxFprintf(FrameContents, _T("\n<LI><A HREF=\"%s#%s\" TARGET=\"mainwindow\">"), ConvertCase(ChaptersName), topicName); + if(PrimaryAnchorOfTheFile(ChaptersName, topicName)) + wxFprintf(FrameContents, _T("\n<LI><A HREF=\"%s\" TARGET=\"mainwindow\">"), ConvertCase(ChaptersName)); + else + wxFprintf(FrameContents, _T("\n<LI><A HREF=\"%s#%s\" TARGET=\"mainwindow\">"), ConvertCase(ChaptersName), topicName); OutputCurrentSection(); wxFprintf(FrameContents, _T("</A>\n")); } @@ -765,16 +817,16 @@ void HTMLOnMacro(int macroId, int no_args, bool start) { subsectionNo = 0; subsubsectionNo = 0; - subsectionStarted = FALSE; + subsectionStarted = false; if (macroId != ltSECTIONSTAR) sectionNo ++; SetCurrentOutput(NULL); - startedSections = TRUE; + startedSections = true; wxChar *topicName = FindTopicName(GetNextChunk()); - ReopenFile(&Sections, &SectionsName); + ReopenFile(&Sections, &SectionsName, topicName); AddTexRef(topicName, SectionsName, SectionNameString); SetCurrentSectionName(topicName, SectionsName); @@ -796,9 +848,19 @@ void HTMLOnMacro(int macroId, int no_args, bool start) SetCurrentOutputs(jumpFrom, Sections); if (DocumentStyle == LATEX_ARTICLE) - wxFprintf(jumpFrom, _T("\n<LI><A HREF=\"%s#%s\">"), ConvertCase(SectionsName), topicName); + { + if(PrimaryAnchorOfTheFile(SectionsName, topicName)) + wxFprintf(jumpFrom, _T("\n<LI><A HREF=\"%s\">"), ConvertCase(SectionsName)); + else + wxFprintf(jumpFrom, _T("\n<LI><A HREF=\"%s#%s\">"), ConvertCase(SectionsName), topicName); + } else - wxFprintf(jumpFrom, _T("\n<A HREF=\"%s#%s\"><B>"), ConvertCase(SectionsName), topicName); + { + if(PrimaryAnchorOfTheFile(SectionsName, topicName)) + wxFprintf(jumpFrom, _T("\n<A HREF=\"%s\"><B>"), ConvertCase(SectionsName)); + else + wxFprintf(jumpFrom, _T("\n<A HREF=\"%s#%s\"><B>"), ConvertCase(SectionsName), topicName); + } wxFprintf(Sections, _T("\n<H2>")); OutputCurrentSection(); @@ -839,6 +901,8 @@ void HTMLOnMacro(int macroId, int no_args, bool start) if ( combineSubSections && !subsectionStarted ) { + fflush(Sections); + // Read old .con file in at this point wxChar buf[256]; wxStrcpy(buf, CurrentSectionFile); @@ -850,7 +914,7 @@ void HTMLOnMacro(int macroId, int no_args, bool start) int ch = getc(fd); while (ch != EOF) { - putc(ch, Sections); + wxPutc(ch, Sections); ch = getc(fd); } fclose(fd); @@ -861,21 +925,21 @@ void HTMLOnMacro(int macroId, int no_args, bool start) ReopenSectionContentsFile(); } - startedSections = TRUE; - subsectionStarted = TRUE; + startedSections = true; + subsectionStarted = true; wxChar *topicName = FindTopicName(GetNextChunk()); if ( !combineSubSections ) { SetCurrentOutput(NULL); - ReopenFile(&Subsections, &SubsectionsName); + ReopenFile(&Subsections, &SubsectionsName, topicName); AddTexRef(topicName, SubsectionsName, SubsectionNameString); SetCurrentSubsectionName(topicName, SubsectionsName); if (htmlWorkshopFiles) HTMLWorkshopAddToContents(2, topicName, SubsectionsName); SetCurrentOutput(Subsections); - HTMLHead(); + HTMLHead(); TexOutput(_T("<title>")); OutputCurrentSection(); TexOutput(_T("</title></head>\n")); @@ -887,7 +951,10 @@ void HTMLOnMacro(int macroId, int no_args, bool start) topicName, SubsectionsName); // This topic SetCurrentOutputs(Sections, Subsections); - wxFprintf(Sections, _T("\n<A HREF=\"%s#%s\"><B>"), ConvertCase(SubsectionsName), topicName); + if(PrimaryAnchorOfTheFile(SubsectionsName, topicName)) + wxFprintf(Sections, _T("\n<A HREF=\"%s\"><B>"), ConvertCase(SubsectionsName)); + else + wxFprintf(Sections, _T("\n<A HREF=\"%s#%s\"><B>"), ConvertCase(SubsectionsName), topicName); wxFprintf(Subsections, _T("\n<H3>")); OutputCurrentSection(); @@ -943,20 +1010,20 @@ void HTMLOnMacro(int macroId, int no_args, bool start) if (macroId != ltSUBSUBSECTIONSTAR) subsubsectionNo ++; - startedSections = TRUE; + startedSections = true; wxChar *topicName = FindTopicName(GetNextChunk()); if ( !combineSubSections ) { SetCurrentOutput(NULL); - ReopenFile(&Subsubsections, &SubsubsectionsName); + ReopenFile(&Subsubsections, &SubsubsectionsName, topicName); AddTexRef(topicName, SubsubsectionsName, SubsubsectionNameString); SetCurrentSubsubsectionName(topicName, SubsubsectionsName); if (htmlWorkshopFiles) HTMLWorkshopAddToContents(3, topicName, SubsubsectionsName); SetCurrentOutput(Subsubsections); - HTMLHead(); + HTMLHead(); TexOutput(_T("<title>")); OutputCurrentSection(); TexOutput(_T("</title></head>\n")); @@ -969,7 +1036,10 @@ void HTMLOnMacro(int macroId, int no_args, bool start) topicName, SubsubsectionsName); // This topic SetCurrentOutputs(Subsections, Subsubsections); - wxFprintf(Subsections, _T("\n<A HREF=\"%s#%s\"><B>"), ConvertCase(SubsubsectionsName), topicName); + if(PrimaryAnchorOfTheFile(SubsubsectionsName, topicName)) + wxFprintf(Subsections, _T("\n<A HREF=\"%s\"><B>"), ConvertCase(SubsubsectionsName)); + else + wxFprintf(Subsections, _T("\n<A HREF=\"%s#%s\"><B>"), ConvertCase(SubsubsectionsName), topicName); wxFprintf(Subsubsections, _T("\n<H3>")); OutputCurrentSection(); @@ -1082,9 +1152,9 @@ void HTMLOnMacro(int macroId, int no_args, bool start) wxChar buf[100]; if (TableData[currentColumn].justification == 'c') - wxSprintf(buf, _T("\n<TD ALIGN=CENTER>")); + wxSnprintf(buf, sizeof(buf), _T("\n<TD ALIGN=CENTER>")); else if (TableData[currentColumn].justification == 'r') - wxSprintf(buf, _T("\n<TD ALIGN=RIGHT>")); + wxSnprintf(buf, sizeof(buf), _T("\n<TD ALIGN=RIGHT>")); else if (TableData[currentColumn].absWidth) { // Convert from points * 20 into pixels. @@ -1093,12 +1163,12 @@ void HTMLOnMacro(int macroId, int no_args, bool start) // Say the display is 100 DPI (dots/pixels per inch). // There are 72 pts to the inch. So 1pt = 1/72 inch, or 100 * 1/72 dots. int pixels = (int)(points * 100.0 / 72.0); - wxSprintf(buf, _T("<TD ALIGN=CENTER WIDTH=%d>"), pixels); + wxSnprintf(buf, sizeof(buf), _T("<TD ALIGN=CENTER WIDTH=%d>"), pixels); } else - wxSprintf(buf, _T("\n<TD ALIGN=LEFT>")); + wxSnprintf(buf, sizeof(buf), _T("\n<TD ALIGN=LEFT>")); TexOutput(buf); - OutputFont(); + OutputFont(); } else TexOutput(_T("&amp;")); @@ -1131,9 +1201,9 @@ void HTMLOnMacro(int macroId, int no_args, bool start) // Start new row and cell, setting alignment for the first cell. wxChar buf[100]; if (TableData[currentColumn].justification == 'c') - wxSprintf(buf, _T("<TR>\n<TD ALIGN=CENTER>")); + wxSnprintf(buf, sizeof(buf), _T("<TR>\n<TD ALIGN=CENTER>")); else if (TableData[currentColumn].justification == 'r') - wxSprintf(buf, _T("<TR>\n<TD ALIGN=RIGHT>")); + wxSnprintf(buf, sizeof(buf), _T("<TR>\n<TD ALIGN=RIGHT>")); else if (TableData[currentColumn].absWidth) { // Convert from points * 20 into pixels. @@ -1142,12 +1212,12 @@ void HTMLOnMacro(int macroId, int no_args, bool start) // Say the display is 100 DPI (dots/pixels per inch). // There are 72 pts to the inch. So 1pt = 1/72 inch, or 100 * 1/72 dots. int pixels = (int)(points * 100.0 / 72.0); - wxSprintf(buf, _T("<TR>\n<TD ALIGN=CENTER WIDTH=%d>"), pixels); + wxSnprintf(buf, sizeof(buf), _T("<TR>\n<TD ALIGN=CENTER WIDTH=%d>"), pixels); } else - wxSprintf(buf, _T("<TR>\n<TD ALIGN=LEFT>")); + wxSnprintf(buf, sizeof(buf), _T("<TR>\n<TD ALIGN=LEFT>")); TexOutput(buf); - OutputFont(); + OutputFont(); } else { @@ -1170,10 +1240,11 @@ void HTMLOnMacro(int macroId, int no_args, bool start) { if (start) { - if (inVerbatim) + #if (1) // if(inVerbatim) TexOutput(_T("~")); - else + #else TexOutput(_T(" ")); + #endif } break; } @@ -1249,7 +1320,7 @@ void HTMLOnMacro(int macroId, int no_args, bool start) TexOutput(_T("\n<TABLE>\n")); else { TexOutput(_T("\n</TABLE>\n")); - // DHS + // DHS TwoColWidthA = -1; TwoColWidthB = -1; } @@ -1286,7 +1357,7 @@ void HTMLOnMacro(int macroId, int no_args, bool start) if (start) { wxChar buf[100]; - wxSprintf(buf, _T("<PRE>\n")); + wxSnprintf(buf, sizeof(buf), _T("<PRE>\n")); TexOutput(buf); } else TexOutput(_T("</PRE>\n")); @@ -1439,13 +1510,13 @@ void HTMLOnMacro(int macroId, int no_args, bool start) case ltCOPYRIGHT: { if (start) - TexOutput(_T("&copy;"), TRUE); + TexOutput(_T("&copy;"), true); break; } case ltREGISTERED: { if (start) - TexOutput(_T("&reg;"), TRUE); + TexOutput(_T("&reg;"), true); break; } // Arrows @@ -1613,16 +1684,22 @@ void HTMLOnMacro(int macroId, int no_args, bool start) { if (start) { + // NB: if this is uncommented, the table of contents + // completely disappears. If left commented, it's in the wrong + // place. + //fflush(Titlepage); + FILE *fd = wxFopen(ContentsName, _T("r")); if (fd) { int ch = getc(fd); while (ch != EOF) { - putc(ch, Titlepage); + wxPutc(ch, Titlepage); ch = getc(fd); } fclose(fd); + fflush(Titlepage); } else { @@ -1668,18 +1745,18 @@ void HTMLOnMacro(int macroId, int no_args, bool start) figureNo ++; if (DocumentStyle != LATEX_ARTICLE) - wxSprintf(figBuf, _T("%s %d.%d: "), FigureNameString, chapterNo, figureNo); + wxSnprintf(figBuf, sizeof(figBuf), _T("%s %d.%d: "), FigureNameString, chapterNo, figureNo); else - wxSprintf(figBuf, _T("%s %d: "), FigureNameString, figureNo); + wxSnprintf(figBuf, sizeof(figBuf), _T("%s %d: "), FigureNameString, figureNo); } else { tableNo ++; if (DocumentStyle != LATEX_ARTICLE) - wxSprintf(figBuf, _T("%s %d.%d: "), TableNameString, chapterNo, tableNo); + wxSnprintf(figBuf, sizeof(figBuf), _T("%s %d.%d: "), TableNameString, chapterNo, tableNo); else - wxSprintf(figBuf, _T("%s %d: "), TableNameString, tableNo); + wxSnprintf(figBuf, sizeof(figBuf), _T("%s %d: "), TableNameString, tableNo); } TexOutput(figBuf); @@ -1706,14 +1783,14 @@ void HTMLOnMacro(int macroId, int no_args, bool start) } case ltFIGURE: { - if (start) inFigure = TRUE; - else inFigure = FALSE; + if (start) inFigure = true; + else inFigure = false; break; } case ltTABLE: { - if (start) inTable = TRUE; - else inTable = FALSE; + if (start) inTable = true; + else inTable = false; break; } default: @@ -1721,7 +1798,74 @@ void HTMLOnMacro(int macroId, int no_args, bool start) break; } } - +/* CheckTypeRef() + + should be called at of argument which usually is + type declaration which propably contains name of + documented class + + examples: + HTMLOnArgument + - ltFUNC, + - ltPARAM + - ltCPARAM + + checks: GetArgData() if contains Type Declaration + and can be referenced to some file + prints: + before<a href="xxx&yyy">type</a>after + + returns: + false - if no reference was found + true - if reference was found and HREF printed +*/ +static bool CheckTypeRef() +{ + wxString typeDecl = GetArgData(); + if( !typeDecl.empty() ) { + typeDecl.Replace(wxT("\\"),wxT("")); + wxString label = typeDecl; + label.Replace(wxT("const"),wxT("")); + label.Replace(wxT("virtual"),wxT("")); + label.Replace(wxT("static"),wxT("")); + label.Replace(wxT("extern"),wxT("")); + label = label.BeforeFirst('&'); + label = label.BeforeFirst(wxT('*')); + label = label.BeforeFirst(wxT('\\')); + label.Trim(true); label.Trim(false); + wxString typeName = label; + label.MakeLower(); + TexRef *texRef = FindReference((wxChar*)label.c_str()); + + if (texRef && texRef->refFile && wxStrcmp(texRef->refFile, _T("??")) != 0) { + int a = typeDecl.Find(typeName); + wxString before = typeDecl.Mid( 0, a ); + wxString after = typeDecl.Mid( a+typeName.Length() ); + //wxFprintf(stderr,wxT("%s <%s> %s to ... %s#%s !!!!\n"), + // before.c_str(), + // typeName.c_str(), + // after.c_str(), + // texRef->refFile,label.c_str()); + TexOutput(before); + TexOutput(_T("<A HREF=\"")); + TexOutput(texRef->refFile); + TexOutput(_T("#")); + TexOutput(label); + TexOutput(wxT("\">")); + TexOutput(typeName); + TexOutput(wxT("</A>")); + TexOutput(after); + return true; + } else { + //wxFprintf(stderr,wxT("'%s' from (%s) -> label %s NOT FOUND\n"), + // typeName.c_str(), + // typeDecl.c_str(), + // label.c_str()); + return false; + } + } + return false; +} // Called on start/end of argument examination bool HTMLOnArgument(int macroId, int arg_no, bool start) { @@ -1743,12 +1887,17 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { if (!start && (arg_no == 1)) currentSection = GetArgChunk(); - return FALSE; + return false; } case ltFUNC: { - if (start && (arg_no == 1)) + if (start && (arg_no == 1)) { TexOutput(_T("<B>")); + if( CheckTypeRef() ) { + TexOutput(_T("</B> ")); + return false; + } + } if (!start && (arg_no == 1)) TexOutput(_T("</B> ")); @@ -1809,27 +1958,21 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) break; } case ltPARAM: - { - if (start && (arg_no == 1)) - TexOutput(_T("<B>")); - if (!start && (arg_no == 1)) - TexOutput(_T("</B>")); - if (start && (arg_no == 2)) - { - TexOutput(_T("<I>")); - } - if (!start && (arg_no == 2)) - { - TexOutput(_T("</I>")); - } - break; - } case ltCPARAM: { - if (start && (arg_no == 1)) - TexOutput(_T("<B>")); - if (!start && (arg_no == 1)) - TexOutput(_T("</B> ")); // This is the difference from param - one space! + const wxChar* pend = macroId == ltCPARAM ? + _T("</B> ") : _T("</B>"); + if( arg_no == 1) { + if( start ) { + TexOutput(_T("<B>")); + if( CheckTypeRef() ) { + TexOutput(pend); + return false; + } + } else { + TexOutput(pend); + } + } if (start && (arg_no == 2)) { TexOutput(_T("<I>")); @@ -1868,19 +2011,19 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { TexOutput(sec); } - return FALSE; + return false; } break; } case ltURLREF: { if (IsArgOptional()) - return FALSE; + return false; else if ((GetNoArgs() - arg_no) == 1) { if (start) helpRefText = GetArgChunk(); - return FALSE; + return false; } else if ((GetNoArgs() - arg_no) == 0) // Arg = 2, or 3 if first is optional { @@ -1888,18 +2031,19 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { TexChunk *ref = GetArgChunk(); TexOutput(_T("<A HREF=\"")); - inVerbatim = TRUE; + inVerbatim = true; TraverseChildrenFromChunk(ref); - inVerbatim = FALSE; + inVerbatim = false; TexOutput(_T("\">")); if (helpRefText) TraverseChildrenFromChunk(helpRefText); TexOutput(_T("</A>")); } - return FALSE; + return false; } break; } + case ltHELPREF: case ltHELPREFN: case ltPOPREF: @@ -1908,13 +2052,13 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { if (start) helpRefFilename = GetArgChunk(); - return FALSE; + return false; } if ((GetNoArgs() - arg_no) == 1) { if (start) helpRefText = GetArgChunk(); - return FALSE; + return false; } else if ((GetNoArgs() - arg_no) == 0) // Arg = 2, or 3 if first is optional { @@ -1935,16 +2079,20 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) // If a filename is supplied, use it, otherwise try to // use the filename associated with the reference (from this document). if (helpRefFilename) - { + { TraverseChildrenFromChunk(helpRefFilename); TexOutput(_T("#")); - } + TexOutput(refName); + } else if (refFilename) - { + { TexOutput(ConvertCase(refFilename)); - TexOutput(_T("#")); - } - TexOutput(refName); + if(!PrimaryAnchorOfTheFile(texRef->refFile, refName)) + { + TexOutput(_T("#")); + TexOutput(refName); + } + } TexOutput(_T("\">")); if (helpRefText) TraverseChildrenFromChunk(helpRefText); @@ -1956,14 +2104,20 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) TraverseChildrenFromChunk(helpRefText); if (!ignoreBadRefs) TexOutput(_T(" (REF NOT FOUND)")); - wxString errBuf; - errBuf.Printf(_T("Warning: unresolved reference '%s'"), refName); - OnInform((wxChar *)errBuf.c_str()); + + // for launching twice do not warn in preparation pass + if ((passNumber == 1 && !runTwice) || + (passNumber == 2 && runTwice)) + { + wxString errBuf; + errBuf.Printf(_T("Warning: unresolved reference '%s'"), refName); + OnInform((wxChar *)errBuf.c_str()); + } } } else TexOutput(_T("??")); } - return FALSE; + return false; } break; } @@ -2023,26 +2177,26 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) // If we have found the existing filename, make the inline // image point to the original file (could be PS, for example) if (originalFilename && (wxStrcmp(inlineFilename, originalFilename) != 0)) - { + { TexOutput(_T("<A HREF=\"")); TexOutput(ConvertCase(originalFilename)); TexOutput(_T("\">")); TexOutput(_T("<img src=\"")); TexOutput(ConvertCase(wxFileNameFromPath(inlineFilename))); TexOutput(_T("\"")); - TexOutput(alignment); + TexOutput(alignment); TexOutput(_T("></A>")); - } + } else #endif - { + { TexOutput(_T("<img src=\"")); TexOutput(ConvertCase(wxFileNameFromPath(inlineFilename))); TexOutput(_T("\"")); - TexOutput(alignment); + TexOutput(alignment); TexOutput(_T(">")); delete[] inlineFilename; - } + } } else { @@ -2050,12 +2204,12 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) TexOutput(_T("<A HREF=\"")); TexOutput(ConvertCase(wxFileNameFromPath(filename))); TexOutput(_T("\">Picture</A>\n")); - wxSprintf(buf, _T("Warning: could not find an inline XBM/GIF for %s."), filename); + wxSnprintf(buf, sizeof(buf), _T("Warning: could not find an inline XBM/GIF for %s."), filename); OnInform(buf); } } } - return FALSE; + return false; } // First arg is PSBOX spec (ignored), second is image file, third is map name. case ltIMAGEMAP: @@ -2082,14 +2236,14 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) if (f == _T("")) { wxChar buf[300]; - wxSprintf(buf, _T("Warning: could not find an inline XBM/GIF for %s."), filename); + wxSnprintf(buf, sizeof(buf), _T("Warning: could not find an inline XBM/GIF for %s."), filename); OnInform(buf); } delete[] filename; if (imageFile) delete[] imageFile; imageFile = NULL; - if (!f.IsEmpty()) + if (!f.empty()) { imageFile = copystring(f); } @@ -2126,15 +2280,15 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) imageFile = NULL; } } - return FALSE; + return false; } case ltINDENTED : { if ( arg_no == 1 ) - return FALSE; + return false; else { - return TRUE; + return true; } } case ltITEM: @@ -2142,9 +2296,9 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) if (start) { descriptionItemArg = GetArgChunk(); - return FALSE; + return false; } - return TRUE; + return true; } case ltTWOCOLITEM: case ltTWOCOLITEMRULED: @@ -2159,31 +2313,40 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { if ( start ) { // DHS - if (TwoColWidthA > -1) { + if (TwoColWidthA > -1) + { wxChar buf[100]; - wxSprintf(buf,_T("\n<TR><TD VALIGN=TOP WIDTH=%d>\n"),TwoColWidthA); + wxSnprintf(buf, sizeof(buf), _T("\n<TR><TD VALIGN=TOP WIDTH=%d>\n"),TwoColWidthA); TexOutput(buf); - } else + } + else + { TexOutput(_T("\n<TR><TD VALIGN=TOP>\n")); - OutputFont(); + } + OutputFont(); } else TexOutput(_T("\n</FONT></TD>\n")); } if (arg_no == 2) { // DHS - if ( start ) { - if (TwoColWidthB > -1) { + if ( start ) + { + if (TwoColWidthB > -1) + { wxChar buf[100]; - wxSprintf(buf,_T("\n<TD VALIGN=TOP WIDTH=%d>\n"),TwoColWidthB); + wxSnprintf(buf, sizeof(buf), _T("\n<TD VALIGN=TOP WIDTH=%d>\n"),TwoColWidthB); TexOutput(buf); - } else - TexOutput(_T("\n<TD VALIGN=TOP>\n")); - OutputFont(); + } + else + { + TexOutput(_T("\n<TD VALIGN=TOP>\n")); + } + OutputFont(); } else TexOutput(_T("\n</FONT></TD></TR>\n")); } - return TRUE; + return true; } case ltNUMBEREDBIBITEM: { @@ -2205,18 +2368,18 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) if (ref) { if (ref->sectionNumber) delete[] ref->sectionNumber; - wxSprintf(buf, _T("[%d]"), citeCount); + wxSnprintf(buf, sizeof(buf), _T("[%d]"), citeCount); ref->sectionNumber = copystring(buf); } - wxSprintf(buf, _T("\n<DT> [%d] "), citeCount); + wxSnprintf(buf, sizeof(buf), _T("\n<DT> [%d] "), citeCount); TexOutput(buf); citeCount ++; - return FALSE; + return false; } if (arg_no == 2 && !start) TexOutput(_T("<P>\n")); - return TRUE; + return true; } case ltMARGINPAR: case ltMARGINPARODD: @@ -2227,7 +2390,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) if (start) { TexOutput(_T("<HR>\n")); - return TRUE; + return true; } else TexOutput(_T("<HR><P>\n")); @@ -2242,7 +2405,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) float points = ParseUnitArgument(val); TwoColWidthA = (int)((points * 100.0) / 72.0); } - return FALSE; + return false; } // DHS case ltTWOCOLWIDTHB: @@ -2253,7 +2416,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) float points = ParseUnitArgument(val); TwoColWidthB = (int)((points * 100.0) / 72.0); } - return FALSE; + return false; } /* * Accents @@ -2303,7 +2466,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } } } - return FALSE; + return false; } case ltACCENT_ACUTE: { @@ -2355,7 +2518,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } } } - return FALSE; + return false; } case ltACCENT_CARET: { @@ -2401,7 +2564,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } } } - return FALSE; + return false; } case ltACCENT_TILDE: { @@ -2438,7 +2601,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } } } - return FALSE; + return false; } case ltACCENT_UMLAUT: { @@ -2490,7 +2653,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } } } - return FALSE; + return false; } case ltACCENT_DOT: { @@ -2512,7 +2675,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } } } - return FALSE; + return false; } case ltBACKGROUND: { @@ -2521,7 +2684,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) wxChar *val = GetArgData(); if (val) { - bool isPicture = FALSE; + bool isPicture = false; ParseColourString(val, &isPicture); if (isPicture) { @@ -2537,7 +2700,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } } } - return FALSE; + return false; } case ltBACKGROUNDIMAGE: { @@ -2551,7 +2714,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) backgroundImageString = copystring(val); } } - return FALSE; + return false; } case ltBACKGROUNDCOLOUR: { @@ -2565,7 +2728,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) backgroundColourString = copystring(val); } } - return FALSE; + return false; } case ltTEXTCOLOUR: { @@ -2579,7 +2742,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) textColourString = copystring(val); } } - return FALSE; + return false; } case ltLINKCOLOUR: { @@ -2593,7 +2756,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) linkColourString = copystring(val); } } - return FALSE; + return false; } case ltFOLLOWEDLINKCOLOUR: { @@ -2607,7 +2770,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) followedLinkColourString = copystring(val); } } - return FALSE; + return false; } case ltACCENT_CADILLA: { @@ -2629,16 +2792,16 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } } } - return FALSE; + return false; } /* case ltFOOTNOTE: case ltFOOTNOTEPOPUP: { if (arg_no == 1) - return TRUE; + return true; else - return FALSE; + return false; break; } */ @@ -2650,10 +2813,10 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) if (start) { currentRowNumber = 0; - inTabular = TRUE; - startRows = TRUE; - tableVerticalLineLeft = FALSE; - tableVerticalLineRight = FALSE; + inTabular = true; + startRows = true; + tableVerticalLineLeft = false; + tableVerticalLineRight = false; wxChar *alignString = copystring(GetArgData()); ParseTableArgument(alignString); @@ -2665,12 +2828,12 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) if (compatibilityMode) { TexOutput(_T("<TR>\n<TD>")); - OutputFont(); + OutputFont(); /* for (int i = 0; i < noColumns; i++) { currentWidth += TableData[i].width; - wxSprintf(buf, _T("\\cellx%d"), currentWidth); + wxSnprintf(buf, sizeof(buf), _T("\\cellx%d"), currentWidth); TexOutput(buf); } TexOutput(_T("\\pard\\intbl\n")); @@ -2678,13 +2841,13 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } delete[] alignString; - return FALSE; + return false; } } else if (arg_no == 2 && !start) { TexOutput(_T("</TABLE>\n")); - inTabular = FALSE; + inTabular = false; } break; } @@ -2692,7 +2855,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { if (start && (arg_no == 1)) { - ReopenFile(&Chapters, &ChaptersName); + ReopenFile(&Chapters, &ChaptersName, _T("bibliography")); AddTexRef(_T("bibliography"), ChaptersName, _T("bibliography")); SetCurrentSubsectionName(_T("bibliography"), ChaptersName); @@ -2702,9 +2865,9 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) wxChar titleBuf[150]; if (truncateFilenames) - wxSprintf(titleBuf, _T("%s.htm"), wxFileNameFromPath(FileRoot)); + wxSnprintf(titleBuf, sizeof(titleBuf), _T("%s.htm"), wxFileNameFromPath(FileRoot)); else - wxSprintf(titleBuf, _T("%s_contents.html"), wxFileNameFromPath(FileRoot)); + wxSnprintf(titleBuf, sizeof(titleBuf), _T("%s_contents.html"), wxFileNameFromPath(FileRoot)); HTMLHead(); TexOutput(_T("<title>")); @@ -2718,18 +2881,21 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) _T("bibliography"), ChaptersName); // This topic SetCurrentOutputs(Contents, Chapters); - wxFprintf(Contents, _T("\n<LI><A HREF=\"%s#%s\">"), ConvertCase(ChaptersName), "bibliography"); + if(PrimaryAnchorOfTheFile(ChaptersName, _T("bibliography"))) + wxFprintf(Contents, _T("\n<LI><A HREF=\"%s\">"), ConvertCase(ChaptersName)); + else + wxFprintf(Contents, _T("\n<LI><A HREF=\"%s#%s\">"), ConvertCase(ChaptersName), _T("bibliography")); wxFprintf(Contents, _T("%s</A>\n"), ReferencesNameString); wxFprintf(Chapters, _T("</H2>\n</A>\n")); SetCurrentOutput(Chapters); - return FALSE; + return false; } if (!start && (arg_no == 2)) { } - return TRUE; + return true; } case ltINDEX: { @@ -2744,7 +2910,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) AddKeyWordForTopic(CurrentTopic, buf, currentFileName); } } - return FALSE; + return false; } case ltFCOL: // case ltBCOL: @@ -2761,7 +2927,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { wxStrcpy(buf2, _T("#000000")); wxChar buf[100]; - wxSprintf(buf, _T("Could not find colour name %s"), name); + wxSnprintf(buf, sizeof(buf), _T("Could not find colour name %s"), name); OnError(buf); } TexOutput(_T("<FONT COLOR=\"")); @@ -2771,7 +2937,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } case 2: { - return TRUE; + return true; } default: break; @@ -2781,14 +2947,14 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { if (arg_no == 2) TexOutput(_T("</FONT>")); } - return FALSE; + return false; } case ltINSERTATLEVEL: { // This macro allows you to insert text at a different level // from the current level, e.g. into the Sections from within a subsubsection. if (useWord) - return FALSE; + return false; static int currentLevelNo = 1; static FILE* oldLevelFile = Chapters; if (start) @@ -2833,16 +2999,16 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } if (outputFile) CurrentOutput1 = outputFile; - return FALSE; + return false; } case 2: { - return TRUE; + return true; } default: break; } - return TRUE; + return true; } else { @@ -2850,233 +3016,233 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { CurrentOutput1 = oldLevelFile; } - return TRUE; + return true; } } default: return DefaultOnArgument(macroId, arg_no, start); } - return TRUE; + return true; } bool HTMLGo(void) { - fileId = 0; - inVerbatim = FALSE; - indentLevel = 0; - inTabular = FALSE; - startRows = FALSE; - tableVerticalLineLeft = FALSE; - tableVerticalLineRight = FALSE; - noColumns = 0; - - if (InputFile && OutputFile) - { - // Do some HTML-specific transformations on all the strings, - // recursively - Text2HTML(GetTopLevelChunk()); - - wxChar buf[300]; - if (truncateFilenames) - wxSprintf(buf, _T("%s.htm"), FileRoot); - else - wxSprintf(buf, _T("%s_contents.html"), FileRoot); - if (TitlepageName) delete[] TitlepageName; - TitlepageName = copystring(buf); - Titlepage = wxFopen(buf, _T("w")); + fileId = 0; + inVerbatim = false; + indentLevel = 0; + inTabular = false; + startRows = false; + tableVerticalLineLeft = false; + tableVerticalLineRight = false; + noColumns = 0; - if (truncateFilenames) - wxSprintf(buf, _T("%s_fc.htm"), FileRoot); - else - wxSprintf(buf, _T("%s_fcontents.html"), FileRoot); + if (!InputFile.empty() && !OutputFile.empty()) + { + // Do some HTML-specific transformations on all the strings, + // recursively + Text2HTML(GetTopLevelChunk()); - contentsFrameName = copystring(buf); + wxChar buf[300]; + if (truncateFilenames) + wxSnprintf(buf, sizeof(buf), _T("%s.htm"), FileRoot); + else + wxSnprintf(buf, sizeof(buf), _T("%s_contents.html"), FileRoot); + if (TitlepageName) delete[] TitlepageName; + TitlepageName = copystring(buf); + Titlepage = wxFopen(buf, _T("w")); - Contents = wxFopen(TmpContentsName, _T("w")); + if (truncateFilenames) + wxSnprintf(buf, sizeof(buf), _T("%s_fc.htm"), FileRoot); + else + wxSnprintf(buf, sizeof(buf), _T("%s_fcontents.html"), FileRoot); - if (htmlFrameContents) - { -// FrameContents = wxFopen(TmpFrameContentsName, _T("w")); - FrameContents = wxFopen(contentsFrameName, _T("w")); - wxFprintf(FrameContents, _T("<HTML>\n<UL>\n")); - } + contentsFrameName = copystring(buf); - if (!Titlepage || !Contents) - { - OnError(_T("Cannot open output file!")); - return FALSE; - } - AddTexRef(_T("contents"), wxFileNameFromPath(TitlepageName), ContentsNameString); + Contents = wxFopen(TmpContentsName, _T("w")); - wxFprintf(Contents, _T("<P><P><H2>%s</H2><P><P>\n"), ContentsNameString); + if (htmlFrameContents) + { +// FrameContents = wxFopen(TmpFrameContentsName, _T("w")); + FrameContents = wxFopen(contentsFrameName, _T("w")); + wxFprintf(FrameContents, _T("<HTML>\n<UL>\n")); + } - wxFprintf(Contents, _T("<UL>\n")); + if (!Titlepage || !Contents) + { + OnError(_T("Cannot open output file!")); + return false; + } + AddTexRef(_T("contents"), wxFileNameFromPath(TitlepageName), ContentsNameString); - SetCurrentOutput(Titlepage); - if (htmlWorkshopFiles) HTMLWorkshopStartContents(); - OnInform(_T("Converting...")); + wxFprintf(Contents, _T("<P><P><H2>%s</H2><P><P>\n"), ContentsNameString); - TraverseDocument(); - wxFprintf(Contents, _T("</UL>\n\n")); + wxFprintf(Contents, _T("<UL>\n")); -// SetCurrentOutput(Titlepage); - fclose(Titlepage); + SetCurrentOutput(Titlepage); + if (htmlWorkshopFiles) HTMLWorkshopStartContents(); + OnInform(_T("Converting...")); - if (Contents) - { -// wxFprintf(Titlepage, _T("\n</BODY></HTML>\n")); - fclose(Contents); - Contents = NULL; - } + TraverseDocument(); + wxFprintf(Contents, _T("</UL>\n\n")); - if (FrameContents) - { - wxFprintf(FrameContents, _T("\n</UL>\n")); - wxFprintf(FrameContents, _T("</HTML>\n")); - fclose(FrameContents); - FrameContents = NULL; - } +// SetCurrentOutput(Titlepage); + fclose(Titlepage); - if (Chapters) - { - wxFprintf(Chapters, _T("\n</FONT></BODY></HTML>\n")); - fclose(Chapters); - Chapters = NULL; - } - if (Sections) - { - wxFprintf(Sections, _T("\n</FONT></BODY></HTML>\n")); - fclose(Sections); - Sections = NULL; - } - if (Subsections && !combineSubSections) - { - wxFprintf(Subsections, _T("\n</FONT></BODY></HTML>\n")); - fclose(Subsections); - Subsections = NULL; - } - if (Subsubsections && !combineSubSections) - { - wxFprintf(Subsubsections, _T("\n</FONT></BODY></HTML>\n")); - fclose(Subsubsections); - Subsubsections = NULL; - } - if ( SectionContentsFD ) - { - fclose(SectionContentsFD); - SectionContentsFD = NULL; - } + if (Contents) + { +// wxFprintf(Titlepage, _T("\n</BODY></HTML>\n")); + fclose(Contents); + Contents = NULL; + } - // Create a temporary file for the title page header, add some info, - // and concat the titlepage just generated. - // This is necessary in order to put the title of the document - // at the TOP of the file within <HEAD>, even though we only find out - // what it is later on. - FILE *tmpTitle = wxFopen(_T("title.tmp"), _T("w")); - if (tmpTitle) - { - if (DocumentTitle) - { - SetCurrentOutput(tmpTitle); - HTMLHead(); - TexOutput(_T("\n<HEAD><TITLE>")); - TraverseChildrenFromChunk(DocumentTitle); - TexOutput(_T("</TITLE></HEAD>\n")); - } - else - { - SetCurrentOutput(tmpTitle); - HTMLHeadTo(tmpTitle); - if (contentsString) - wxFprintf(tmpTitle, _T("<TITLE>%s</TITLE></HEAD>\n\n"), contentsString); - else - wxFprintf(tmpTitle, _T("<TITLE>%s</TITLE></HEAD>\n\n"), wxFileNameFromPath(FileRoot)); - } + if (FrameContents) + { + wxFprintf(FrameContents, _T("\n</UL>\n")); + wxFprintf(FrameContents, _T("</HTML>\n")); + fclose(FrameContents); + FrameContents = NULL; + } - // Output frame information - if (htmlFrameContents) - { - wxChar firstFileName[300]; - if (truncateFilenames) - wxSprintf(firstFileName, _T("%s1.htm"), FileRoot); - else - wxSprintf(firstFileName, _T("%s1.html"), FileRoot); + if (Chapters) + { + wxFprintf(Chapters, _T("\n</FONT></BODY></HTML>\n")); + fclose(Chapters); + Chapters = NULL; + } + if (Sections) + { + wxFprintf(Sections, _T("\n</FONT></BODY></HTML>\n")); + fclose(Sections); + Sections = NULL; + } + if (Subsections && !combineSubSections) + { + wxFprintf(Subsections, _T("\n</FONT></BODY></HTML>\n")); + fclose(Subsections); + Subsections = NULL; + } + if (Subsubsections && !combineSubSections) + { + wxFprintf(Subsubsections, _T("\n</FONT></BODY></HTML>\n")); + fclose(Subsubsections); + Subsubsections = NULL; + } + if ( SectionContentsFD ) + { + fclose(SectionContentsFD); + SectionContentsFD = NULL; + } - wxFprintf(tmpTitle, _T("<FRAMESET COLS=\"30%%,70%%\">\n")); + // Create a temporary file for the title page header, add some info, + // and concat the titlepage just generated. + // This is necessary in order to put the title of the document + // at the TOP of the file within <HEAD>, even though we only find out + // what it is later on. + FILE *tmpTitle = wxFopen(_T("title.tmp"), _T("w")); + if (tmpTitle) + { + if (DocumentTitle) + { + SetCurrentOutput(tmpTitle); + HTMLHead(); + TexOutput(_T("\n<TITLE>")); + TraverseChildrenFromChunk(DocumentTitle); + TexOutput(_T("</TITLE></HEAD>\n")); + } + else + { + SetCurrentOutput(tmpTitle); + HTMLHeadTo(tmpTitle); + if (contentsString) + wxFprintf(tmpTitle, _T("<TITLE>%s</TITLE></HEAD>\n\n"), contentsString); + else + wxFprintf(tmpTitle, _T("<TITLE>%s</TITLE></HEAD>\n\n"), wxFileNameFromPath(FileRoot)); + } - wxFprintf(tmpTitle, _T("<FRAME SRC=\"%s\">\n"), ConvertCase(wxFileNameFromPath(contentsFrameName))); - wxFprintf(tmpTitle, _T("<FRAME SRC=\"%s\" NAME=\"mainwindow\">\n"), ConvertCase(wxFileNameFromPath(firstFileName))); - wxFprintf(tmpTitle, _T("</FRAMESET>\n")); + // Output frame information + if (htmlFrameContents) + { + wxChar firstFileName[300]; + if (truncateFilenames) + wxSnprintf(firstFileName, sizeof(firstFileName), _T("%s1.htm"), FileRoot); + else + wxStrcpy(firstFileName, gs_filenames[1].c_str()); - wxFprintf(tmpTitle, _T("<NOFRAMES>\n")); - } + wxFprintf(tmpTitle, _T("<FRAMESET COLS=\"30%%,70%%\">\n")); - // Output <BODY...> to temporary title page - OutputBodyStart(); + wxFprintf(tmpTitle, _T("<FRAME SRC=\"%s\">\n"), ConvertCase(wxFileNameFromPath(contentsFrameName))); + wxFprintf(tmpTitle, _T("<FRAME SRC=\"%s\" NAME=\"mainwindow\">\n"), ConvertCase(wxFileNameFromPath(firstFileName))); + wxFprintf(tmpTitle, _T("</FRAMESET>\n")); - // Concat titlepage - FILE *fd = wxFopen(TitlepageName, _T("r")); - if (fd) - { - int ch = getc(fd); - while (ch != EOF) - { - putc(ch, tmpTitle); - ch = getc(fd); - } - fclose(fd); - } + wxFprintf(tmpTitle, _T("<NOFRAMES>\n")); + } - wxFprintf(tmpTitle, _T("\n</FONT></BODY>\n")); + // Output <BODY...> to temporary title page + OutputBodyStart(); + fflush(tmpTitle); - if (htmlFrameContents) - { - wxFprintf(tmpTitle, _T("\n\n")); - } - wxFprintf(tmpTitle, _T("\n\n")); + // Concat titlepage + FILE *fd = wxFopen(TitlepageName, _T("r")); + if (fd) + { + int ch = getc(fd); + while (ch != EOF) + { + wxPutc(ch, tmpTitle); + ch = getc(fd); + } + fclose(fd); + } - fclose(tmpTitle); - if (wxFileExists(TitlepageName)) wxRemoveFile(TitlepageName); - if (!wxRenameFile(_T("title.tmp"), TitlepageName)) - { - wxCopyFile(_T("title.tmp"), TitlepageName); - wxRemoveFile(_T("title.tmp")); - } - } + wxFprintf(tmpTitle, _T("\n\n")); + + if (htmlFrameContents) + { + wxFprintf(tmpTitle, _T("\n\n")); + } + wxFprintf(tmpTitle, _T("\n\n")); - if (lastFileName) delete[] lastFileName; - lastFileName = NULL; - if (lastTopic) delete[] lastTopic; - lastTopic = NULL; + fclose(tmpTitle); + if (wxFileExists(TitlepageName)) wxRemoveFile(TitlepageName); + if (!wxRenameFile(_T("title.tmp"), TitlepageName)) + { + wxCopyFile(_T("title.tmp"), TitlepageName); + wxRemoveFile(_T("title.tmp")); + } + } - if (wxFileExists(ContentsName)) wxRemoveFile(ContentsName); + if (lastFileName) delete[] lastFileName; + lastFileName = NULL; + if (lastTopic) delete[] lastTopic; + lastTopic = NULL; - if (!wxRenameFile(TmpContentsName, ContentsName)) - { - wxCopyFile(TmpContentsName, ContentsName); - wxRemoveFile(TmpContentsName); - } + if (wxFileExists(ContentsName)) wxRemoveFile(ContentsName); - // Generate .htx file if requested - if (htmlIndex) - { - wxChar htmlIndexName[300]; - wxSprintf(htmlIndexName, _T("%s.htx"), FileRoot); - GenerateHTMLIndexFile(htmlIndexName); - } + if (!wxRenameFile(TmpContentsName, ContentsName)) + { + wxCopyFile(TmpContentsName, ContentsName); + wxRemoveFile(TmpContentsName); + } - // Generate HTML Help Workshop files if requested - if (htmlWorkshopFiles) - { - HTMLWorkshopEndContents(); - GenerateHTMLWorkshopFiles(FileRoot); - } + // Generate .htx file if requested + if (htmlIndex) + { + wxChar htmlIndexName[300]; + wxSnprintf(htmlIndexName, sizeof(htmlIndexName), _T("%s.htx"), FileRoot); + GenerateHTMLIndexFile(htmlIndexName); + } + // Generate HTML Help Workshop files if requested + if (htmlWorkshopFiles) + { + HTMLWorkshopEndContents(); + GenerateHTMLWorkshopFiles(FileRoot); + } - return TRUE; - } + return true; + } - return FALSE; + return false; } // Output .htx index file @@ -3087,7 +3253,7 @@ void GenerateHTMLIndexFile(wxChar *fname) return; TopicTable.BeginFind(); - wxNode *node = TopicTable.Next(); + wxHashTable::Node *node = TopicTable.Next(); while (node) { TexTopic *texTopic = (TexTopic *)node->GetData(); @@ -3123,7 +3289,7 @@ void GenerateHTMLWorkshopFiles(wxChar *fname) /* Generate project file : */ - wxSprintf(buf, _T("%s.hhp"), fname); + wxSnprintf(buf, sizeof(buf), _T("%s.hhp"), fname); f = wxFopen(buf, _T("wt")); wxFprintf(f, _T("[OPTIONS]\n") @@ -3160,16 +3326,16 @@ void GenerateHTMLWorkshopFiles(wxChar *fname) wxFprintf(f, _T("%s\n"), wxFileNameFromPath(TitlepageName)); for (int i = 1; i <= fileId; i++) { if (truncateFilenames) - wxSprintf(buf, _T("%s%d.htm"), wxFileNameFromPath(FileRoot), i); + wxSnprintf(buf, sizeof(buf), _T("%s%d.htm"), wxFileNameFromPath(FileRoot), i); else - wxSprintf(buf, _T("%s%d.html"), wxFileNameFromPath(FileRoot), i); + wxStrcpy(buf, wxFileNameFromPath(gs_filenames[i].c_str())); wxFprintf(f, _T("%s\n"), buf); } fclose(f); /* Generate index file : */ - wxSprintf(buf, _T("%s.hhk"), fname); + wxSnprintf(buf, sizeof(buf), _T("%s.hhk"), fname); f = wxFopen(buf, _T("wt")); wxFprintf(f, @@ -3187,7 +3353,7 @@ void GenerateHTMLWorkshopFiles(wxChar *fname) _T("\n")); - fclose(HTMLWorkshopContents); + for (int i = HTMLWorkshopLastLevel; i >= 0; i--) + wxFprintf(HTMLWorkshopContents, _T("\n")); + fclose(HTMLWorkshopContents); +} + + +bool PrimaryAnchorOfTheFile( wxChar *file, wxChar *label ) +{ + wxString file_label; + file_label.Printf( HTML_FILENAME_PATTERN, FileRoot, label ); + return file_label.IsSameAs( file , false ); }