X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b63b07a809f9a3d22596d4971ef5c8971153823a..0ffc92133bd05ff86fa5947e14c211f75fec9b2b:/utils/tex2rtf/src/htmlutil.cpp diff --git a/utils/tex2rtf/src/htmlutil.cpp b/utils/tex2rtf/src/htmlutil.cpp index cc8187395f..b68d0b5b2f 100644 --- a/utils/tex2rtf/src/htmlutil.cpp +++ b/utils/tex2rtf/src/htmlutil.cpp @@ -2,7 +2,7 @@ // Name: htmlutil.cpp // Purpose: Converts Latex to HTML // Author: Julian Smart -// Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support +// Modified by: Wlodzimierz ABX Skiba 2003/2004 Unicode support // Ron Lee // Created: 7.9.93 // RCS-ID: $Id$ @@ -10,10 +10,6 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -29,6 +25,8 @@ #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) @@ -37,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(); @@ -205,7 +206,7 @@ void ReopenFile(FILE **fd, wxChar **fileName, const wxChar *label) { if (fileId == 1) gs_filenames.Add(wxEmptyString); - wxSnprintf(buf, sizeof(buf), _T("%s_%s.html"), FileRoot, label); + wxSnprintf(buf, sizeof(buf), HTML_FILENAME_PATTERN, FileRoot, label); gs_filenames.Add(buf); } if (*fileName) delete[] *fileName; @@ -258,7 +259,7 @@ void ProcessText2HTML(TexChunk *chunk) bool changed = false; int ptr = 0; int i = 0; - char ch = 1; + wxChar ch = 1; int len = wxStrlen(chunk->value); while (ch != 0) { @@ -273,19 +274,19 @@ void ProcessText2HTML(TexChunk *chunk) i += 2; 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; } - else if (!inVerbatim && ch == '`') // Change ` to ' + else if (!inVerbatim && ch == _T('`')) // Change ` to ' { BigBuffer[ptr] = 39; ptr ++; i += 1; changed = true; } - else if (ch == '<') // Change < to < + else if (ch == _T('<')) // Change < to < { BigBuffer[ptr] = 0; wxStrcat(BigBuffer, _T("<")); @@ -293,7 +294,7 @@ void ProcessText2HTML(TexChunk *chunk) i += 1; changed = true; } - else if (ch == '>') // Change > to > + else if (ch == _T('>')) // Change > to > { BigBuffer[ptr] = 0; wxStrcat(BigBuffer, _T(">")); @@ -476,7 +477,7 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, if (upLabel && upFilename) { - if (wxStrlen(upLabel) > 0) + if ( (wxStrlen(upLabel) > 0) && !PrimaryAnchorOfTheFile(upFilename, upLabel) ) wxSnprintf(buf, sizeof(buf), _T("%s "), ConvertCase(upFilename), upLabel, upReference); @@ -501,9 +502,14 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, if (previousLabel && previousFilename) { - wxSnprintf(buf, sizeof(buf), - _T("%s "), - ConvertCase(previousFilename), previousLabel, backReference); + if (PrimaryAnchorOfTheFile(previousFilename, previousLabel)) + wxSnprintf(buf, sizeof(buf), + _T("%s "), + ConvertCase(previousFilename), backReference); + else + wxSnprintf(buf, sizeof(buf), + _T("%s "), + ConvertCase(previousFilename), previousLabel, backReference); if (wxStrcmp(previousLabel, _T("contents")) == 0) { // TexOutput(_T("")); @@ -550,9 +556,14 @@ void AddBrowseButtons(wxChar *upLabel, wxChar *upFilename, if (nextLabel && nextFilename) { - wxSnprintf(buf, sizeof(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 @@ -648,7 +659,7 @@ void OutputBodyStart(void) if (s) { TexOutput(_T(" BACKGROUND=\"")); - TexOutput(s); + TexOutput(s); TexOutput(_T("\"")); } } @@ -764,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")); } @@ -831,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(); @@ -874,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); @@ -885,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); @@ -910,7 +939,7 @@ void HTMLOnMacro(int macroId, int no_args, bool start) if (htmlWorkshopFiles) HTMLWorkshopAddToContents(2, topicName, SubsectionsName); SetCurrentOutput(Subsections); - HTMLHead(); + HTMLHead(); TexOutput(_T("<title>")); OutputCurrentSection(); TexOutput(_T("</title></head>\n")); @@ -922,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(); @@ -991,7 +1023,7 @@ void HTMLOnMacro(int macroId, int no_args, bool start) if (htmlWorkshopFiles) HTMLWorkshopAddToContents(3, topicName, SubsubsectionsName); SetCurrentOutput(Subsubsections); - HTMLHead(); + HTMLHead(); TexOutput(_T("<title>")); OutputCurrentSection(); TexOutput(_T("</title></head>\n")); @@ -1004,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(); @@ -1133,7 +1168,7 @@ void HTMLOnMacro(int macroId, int no_args, bool start) else wxSnprintf(buf, sizeof(buf), _T("\n<TD ALIGN=LEFT>")); TexOutput(buf); - OutputFont(); + OutputFont(); } else TexOutput(_T("&amp;")); @@ -1182,7 +1217,7 @@ void HTMLOnMacro(int macroId, int no_args, bool start) else wxSnprintf(buf, sizeof(buf), _T("<TR>\n<TD ALIGN=LEFT>")); TexOutput(buf); - OutputFont(); + OutputFont(); } else { @@ -1285,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; } @@ -1649,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 { @@ -1757,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) { @@ -1783,8 +1891,13 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } 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> ")); @@ -1845,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>")); @@ -1936,6 +2043,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) } break; } + case ltHELPREF: case ltHELPREFN: case ltPOPREF: @@ -1971,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); @@ -1992,9 +2104,15 @@ 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("??")); @@ -2059,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 { @@ -2125,7 +2243,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) if (imageFile) delete[] imageFile; imageFile = NULL; - if (!f.IsEmpty()) + if (!f.empty()) { imageFile = copystring(f); } @@ -2195,27 +2313,36 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { if ( start ) { // DHS - if (TwoColWidthA > -1) { + if (TwoColWidthA > -1) + { wxChar buf[100]; 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]; 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")); } @@ -2701,7 +2828,7 @@ 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++) { @@ -2754,7 +2881,10 @@ 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")); @@ -2797,7 +2927,7 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) { wxStrcpy(buf2, _T("#000000")); wxChar buf[100]; - wxSnprintf(buf, sizeof(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=\"")); @@ -2897,222 +3027,222 @@ bool HTMLOnArgument(int macroId, int arg_no, bool start) 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) - 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")); + fileId = 0; + inVerbatim = false; + indentLevel = 0; + inTabular = false; + startRows = false; + tableVerticalLineLeft = false; + tableVerticalLineRight = false; + noColumns = 0; - if (truncateFilenames) - wxSnprintf(buf, sizeof(buf), _T("%s_fc.htm"), FileRoot); - else - wxSnprintf(buf, sizeof(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) - wxSnprintf(firstFileName, sizeof(firstFileName), _T("%s1.htm"), FileRoot); - else - wxStrcpy(firstFileName, gs_filenames[1].c_str()); + 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 (lastFileName) delete[] lastFileName; - lastFileName = NULL; - if (lastTopic) delete[] lastTopic; - lastTopic = NULL; + if (htmlFrameContents) + { + wxFprintf(tmpTitle, _T("\n\n")); + } + wxFprintf(tmpTitle, _T("\n\n")); - if (wxFileExists(ContentsName)) wxRemoveFile(ContentsName); + fclose(tmpTitle); + if (wxFileExists(TitlepageName)) wxRemoveFile(TitlepageName); + if (!wxRenameFile(_T("title.tmp"), TitlepageName)) + { + wxCopyFile(_T("title.tmp"), TitlepageName); + wxRemoveFile(_T("title.tmp")); + } + } - if (!wxRenameFile(TmpContentsName, ContentsName)) - { - wxCopyFile(TmpContentsName, ContentsName); - wxRemoveFile(TmpContentsName); - } + if (lastFileName) delete[] lastFileName; + lastFileName = NULL; + if (lastTopic) delete[] lastTopic; + lastTopic = NULL; - // Generate .htx file if requested - if (htmlIndex) - { - wxChar htmlIndexName[300]; - wxSnprintf(htmlIndexName, sizeof(htmlIndexName), _T("%s.htx"), FileRoot); - GenerateHTMLIndexFile(htmlIndexName); - } + if (wxFileExists(ContentsName)) wxRemoveFile(ContentsName); - // Generate HTML Help Workshop files if requested - if (htmlWorkshopFiles) - { - HTMLWorkshopEndContents(); - GenerateHTMLWorkshopFiles(FileRoot); - } + if (!wxRenameFile(TmpContentsName, ContentsName)) + { + wxCopyFile(TmpContentsName, ContentsName); + wxRemoveFile(TmpContentsName); + } + // Generate .htx file if requested + if (htmlIndex) + { + wxChar htmlIndexName[300]; + wxSnprintf(htmlIndexName, sizeof(htmlIndexName), _T("%s.htx"), FileRoot); + GenerateHTMLIndexFile(htmlIndexName); + } - return true; - } + // Generate HTML Help Workshop files if requested + if (htmlWorkshopFiles) + { + HTMLWorkshopEndContents(); + GenerateHTMLWorkshopFiles(FileRoot); + } - return false; + return true; + } + + return false; } // Output .htx index file @@ -3123,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(); @@ -3223,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 ); }