1 /////////////////////////////////////////////////////////////////////////////
3 // Purpose: Converts Latex to linear/WinHelp RTF, HTML, wxHelp.
4 // Author: Julian Smart
5 // Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support
9 // Copyright: (c) Julian Smart
10 // Licence: wxWindows licence
11 /////////////////////////////////////////////////////////////////////////////
14 #pragma implementation
17 // For compilers that support precompilation, includes "wx.h".
18 #include "wx/wxprec.h"
27 #include "wx/textctrl.h"
28 #include "wx/filedlg.h"
29 #include "wx/msgdlg.h"
36 #include "wx/cshelp.h"
37 #include "wx/helphtml.h"
39 #include "wx/msw/helpchm.h"
41 #include "wx/html/helpctrl.h"
60 #if (defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)) && !defined(NO_GUI)
61 #include "tex2rtf.xpm"
64 #if !WXWIN_COMPATIBILITY_2_4
65 static inline wxChar
* copystring(const wxChar
* s
)
66 { return wxStrcpy(new wxChar
[wxStrlen(s
) + 1], s
); }
69 const float versionNo
= (float)TEX2RTF_VERSION_NUMBER
;
71 TexChunk
*currentMember
= NULL
;
72 bool startedSections
= false;
73 wxChar
*contentsString
= NULL
;
74 bool suppressNameDecoration
= false;
75 bool OkToClose
= true;
77 unsigned long errorCount
= 0;
81 extern wxChar
*BigBuffer
;
82 extern wxChar
*TexFileRoot
;
83 extern wxChar
*TexBibName
; // Bibliography output file name
84 extern wxChar
*TexTmpBibName
; // Temporary bibliography output file name
85 extern wxList ColourTable
;
86 extern TexChunk
*TopLevel
;
89 wxHelpControllerBase
*HelpInstance
= NULL
;
93 static wxChar
*ipc_buffer
= NULL
;
94 static wxChar Tex2RTFLastStatus
[100];
95 Tex2RTFServer
*TheTex2RTFServer
= NULL
;
100 wxChar
*bulletFile
= NULL
;
102 FILE *Contents
= NULL
; // Contents page
103 FILE *Chapters
= NULL
; // Chapters (WinHelp RTF) or rest of file (linear RTF)
104 FILE *Sections
= NULL
;
105 FILE *Subsections
= NULL
;
106 FILE *Subsubsections
= NULL
;
108 FILE *WinHelpContentsFile
= NULL
;
110 wxChar
*InputFile
= NULL
;
111 wxChar
*OutputFile
= NULL
;
112 wxChar
*MacroFile
= copystring(_T("tex2rtf.ini"));
114 wxChar
*FileRoot
= NULL
;
115 wxChar
*ContentsName
= NULL
; // Contents page from last time around
116 wxChar
*TmpContentsName
= NULL
; // Current contents page
117 wxChar
*TmpFrameContentsName
= NULL
; // Current frame contents page
118 wxChar
*WinHelpContentsFileName
= NULL
; // WinHelp .cnt file
119 wxChar
*RefFileName
= NULL
; // Reference file name
121 wxChar
*RTFCharset
= copystring(_T("ansi"));
124 int BufSize
= 100; // Size of buffer in K
130 void ShowOptions(void);
132 wxChar wxTex2RTFBuffer
[1500];
135 IMPLEMENT_APP_CONSOLE(MyApp
)
137 wxMenuBar
*menuBar
= NULL
;
138 MyFrame
*frame
= NULL
;
139 // DECLARE_APP(MyApp)
143 // `Main program' equivalent, creating windows and returning main app frame
146 // Use default list of macros defined in tex2any.cc
147 DefineDefaultMacros();
148 AddMacroDef(ltHARDY
, _T("hardy"), 0);
150 FileRoot
= new wxChar
[300];
151 ContentsName
= new wxChar
[300];
152 TmpContentsName
= new wxChar
[300];
153 TmpFrameContentsName
= new wxChar
[300];
154 WinHelpContentsFileName
= new wxChar
[300];
155 RefFileName
= new wxChar
[300];
157 ColourTable
.DeleteContents(true);
161 // Read input/output files
164 if (argv
[1][0] != '-')
171 if (argv
[2][0] != '-')
173 OutputFile
= argv
[2];
181 if (!InputFile
|| !OutputFile
)
183 wxSTD cout
<< "Tex2RTF: input or output file is missing.\n";
191 TexPathList
.EnsureFileAccessible(InputFile
);
193 if (!InputFile
|| !OutputFile
)
194 isInteractive
= true;
197 for (i
= n
; i
< argc
;)
199 if (wxStrcmp(argv
[i
], _T("-winhelp")) == 0)
202 convertMode
= TEX_RTF
;
206 else if (wxStrcmp(argv
[i
], _T("-interactive")) == 0)
209 isInteractive
= true;
212 else if (wxStrcmp(argv
[i
], _T("-sync")) == 0) // Don't yield
217 else if (wxStrcmp(argv
[i
], _T("-rtf")) == 0)
220 convertMode
= TEX_RTF
;
222 else if (wxStrcmp(argv
[i
], _T("-html")) == 0)
225 convertMode
= TEX_HTML
;
227 else if (wxStrcmp(argv
[i
], _T("-xlp")) == 0)
230 convertMode
= TEX_XLP
;
232 else if (wxStrcmp(argv
[i
], _T("-twice")) == 0)
237 else if (wxStrcmp(argv
[i
], _T("-macros")) == 0)
242 MacroFile
= copystring(argv
[i
]);
246 else if (wxStrcmp(argv
[i
], _T("-bufsize")) == 0)
251 BufSize
= wxAtoi(argv
[i
]);
255 else if (wxStrcmp(argv
[i
], _T("-charset")) == 0)
262 if (wxStrcmp(s
, _T("ansi")) == 0 || wxStrcmp(s
, _T("pc")) == 0 || wxStrcmp(s
, _T("mac")) == 0 ||
263 wxStrcmp(s
, _T("pca")) == 0)
264 RTFCharset
= copystring(s
);
267 OnError(_T("Incorrect argument for -charset"));
272 else if (wxStrcmp(argv
[i
], _T("-checkcurleybraces")) == 0)
275 checkCurleyBraces
= true;
277 else if (wxStrcmp(argv
[i
], _T("-checksyntax")) == 0)
285 buf
.Printf(_T("Invalid switch %s.\n"), argv
[i
]);
286 OnError((wxChar
*)buf
.c_str());
296 #if defined(__WXMSW__) && !defined(NO_GUI)
298 Tex2RTFLastStatus
[0] = 0; // DDE connection return value
299 TheTex2RTFServer
= new Tex2RTFServer
;
300 TheTex2RTFServer
->Create(_T("TEX2RTF"));
303 TexInitialize(BufSize
);
304 ResetContentsLevels(0);
312 // Create the main frame window
313 frame
= new MyFrame(NULL
, wxID_ANY
, _T("Tex2RTF"), wxDefaultPosition
, wxSize(400, 300));
314 frame
->CreateStatusBar(2);
317 // TODO: uncomment this when we have tex2rtf.xpm
318 frame
->SetIcon(wxICON(tex2rtf
));
322 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), wxFileNameFromPath(InputFile
));
323 frame
->SetTitle(buf
);
327 wxMenu
*file_menu
= new wxMenu
;
328 file_menu
->Append(TEX_GO
, _T("&Go"), _T("Run converter"));
329 file_menu
->Append(TEX_SET_INPUT
, _T("Set &Input File"), _T("Set the LaTeX input file"));
330 file_menu
->Append(TEX_SET_OUTPUT
, _T("Set &Output File"), _T("Set the output file"));
331 file_menu
->AppendSeparator();
332 file_menu
->Append(TEX_VIEW_LATEX
, _T("View &LaTeX File"), _T("View the LaTeX input file"));
333 file_menu
->Append(TEX_VIEW_OUTPUT
, _T("View Output &File"), _T("View output file"));
334 file_menu
->Append(TEX_SAVE_FILE
, _T("&Save log file"), _T("Save displayed text into file"));
335 file_menu
->AppendSeparator();
336 file_menu
->Append(TEX_QUIT
, _T("E&xit"), _T("Exit Tex2RTF"));
338 wxMenu
*macro_menu
= new wxMenu
;
340 macro_menu
->Append(TEX_LOAD_CUSTOM_MACROS
, _T("&Load Custom Macros"), _T("Load custom LaTeX macro file"));
341 macro_menu
->Append(TEX_VIEW_CUSTOM_MACROS
, _T("View &Custom Macros"), _T("View custom LaTeX macros"));
343 wxMenu
*mode_menu
= new wxMenu
;
345 mode_menu
->Append(TEX_MODE_RTF
, _T("Output linear &RTF"), _T("Wordprocessor-compatible RTF"));
346 mode_menu
->Append(TEX_MODE_WINHELP
, _T("Output &WinHelp RTF"), _T("WinHelp-compatible RTF"));
347 mode_menu
->Append(TEX_MODE_HTML
, _T("Output &HTML"), _T("HTML World Wide Web hypertext file"));
348 mode_menu
->Append(TEX_MODE_XLP
, _T("Output &XLP"), _T("wxHelp hypertext help file"));
350 wxMenu
*options_menu
= new wxMenu
;
352 options_menu
->Append(TEX_OPTIONS_CURLEY_BRACE
, _T("Curley brace matching"), _T("Checks for mismatched curley braces"),true);
353 options_menu
->Append(TEX_OPTIONS_SYNTAX_CHECKING
, _T("Syntax checking"), _T("Syntax checking for common errors"),true);
355 options_menu
->Check(TEX_OPTIONS_CURLEY_BRACE
, checkCurleyBraces
);
356 options_menu
->Check(TEX_OPTIONS_SYNTAX_CHECKING
, checkSyntax
);
358 wxMenu
*help_menu
= new wxMenu
;
360 help_menu
->Append(TEX_HELP
, _T("&Help"), _T("Tex2RTF Contents Page"));
361 help_menu
->Append(TEX_ABOUT
, _T("&About Tex2RTF"), _T("About Tex2RTF"));
363 menuBar
= new wxMenuBar
;
364 menuBar
->Append(file_menu
, _T("&File"));
365 menuBar
->Append(macro_menu
, _T("&Macros"));
366 menuBar
->Append(mode_menu
, _T("&Conversion Mode"));
367 menuBar
->Append(options_menu
, _T("&Options"));
368 menuBar
->Append(help_menu
, _T("&Help"));
370 frame
->SetMenuBar(menuBar
);
371 frame
->textWindow
= new wxTextCtrl(frame
, wxID_ANY
, _T(""), wxDefaultPosition
, wxDefaultSize
, wxTE_READONLY
|wxTE_MULTILINE
);
373 (*frame
->textWindow
) << _T("Welcome to Tex2RTF.\n");
377 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
378 HelpInstance
= new wxCHMHelpController
;
380 HelpInstance
= new wxHtmlHelpController
;
382 HelpInstance
->Initialize(_T("tex2rtf"));
386 * Read macro/initialisation file
390 wxString path
= TexPathList
.FindValidPath(MacroFile
);
392 ReadCustomMacros((wxChar
*)path
.c_str());
394 wxStrcpy(buf
, _T("In "));
396 if (winHelp
&& (convertMode
== TEX_RTF
))
397 wxStrcat(buf
, _T("WinHelp RTF"));
398 else if (!winHelp
&& (convertMode
== TEX_RTF
))
399 wxStrcat(buf
, _T("linear RTF"));
400 else if (convertMode
== TEX_HTML
) wxStrcat(buf
, _T("HTML"));
401 else if (convertMode
== TEX_XLP
) wxStrcat(buf
, _T("XLP"));
402 wxStrcat(buf
, _T(" mode."));
403 frame
->SetStatusText(buf
, 1);
412 * Read macro/initialisation file
416 wxString path
= TexPathList
.FindValidPath(MacroFile
);
418 ReadCustomMacros((wxChar
*)path
.c_str());
428 OnExit(); // Do cleanup since OnExit won't be called now
437 wxNode
*node
= CustomMacroList
.GetFirst();
440 CustomMacro
*macro
= (CustomMacro
*)node
->GetData();
443 node
= CustomMacroList
.GetFirst();
445 MacroDefs
.BeginFind();
446 wxHashTable::Node
* mNode
= MacroDefs
.Next();
449 TexMacroDef
* def
= (TexMacroDef
*) mNode
->GetData();
451 mNode
= MacroDefs
.Next();
455 delete TheTex2RTFServer
;
470 delete currentArgData
;
471 currentArgData
= NULL
;
485 delete TexTmpBibName
;
486 TexTmpBibName
= NULL
;
500 delete TmpContentsName
;
501 TmpContentsName
= NULL
;
503 if (TmpFrameContentsName
)
505 delete TmpFrameContentsName
;
506 TmpFrameContentsName
= NULL
;
508 if (WinHelpContentsFileName
)
510 delete WinHelpContentsFileName
;
511 WinHelpContentsFileName
= NULL
;
535 delete [] BibliographyStyleString
;
536 delete [] DocumentStyleString
;
537 delete [] bitmapMethod
;
538 delete [] backgroundColourString
;
539 delete [] ContentsNameString
;
540 delete [] AbstractNameString
;
541 delete [] GlossaryNameString
;
542 delete [] ReferencesNameString
;
543 delete [] FiguresNameString
;
544 delete [] TablesNameString
;
545 delete [] FigureNameString
;
546 delete [] TableNameString
;
547 delete [] IndexNameString
;
548 delete [] ChapterNameString
;
549 delete [] SectionNameString
;
550 delete [] SubsectionNameString
;
551 delete [] SubsubsectionNameString
;
552 delete [] UpNameString
;
554 delete[] winHelpTitle
;
556 // TODO: this simulates zero-memory leaks!
557 // Otherwise there are just too many...
559 #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
560 wxDebugContext::SetCheckpoint();
567 void ShowOptions(void)
570 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF version %.2f"), versionNo
);
572 OnInform(_T("Usage: tex2rtf [input] [output] [switches]\n"));
573 OnInform(_T("where valid switches are"));
575 OnInform(_T(" -interactive"));
577 OnInform(_T(" -bufsize <size in K>"));
578 OnInform(_T(" -charset <pc | pca | ansi | mac> (default ansi)"));
579 OnInform(_T(" -twice"));
580 OnInform(_T(" -sync"));
581 OnInform(_T(" -checkcurleybraces"));
582 OnInform(_T(" -checksyntax"));
583 OnInform(_T(" -macros <filename>"));
584 OnInform(_T(" -winhelp"));
585 OnInform(_T(" -rtf"));
586 OnInform(_T(" -html"));
587 OnInform(_T(" -xlp\n"));
592 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
593 EVT_CLOSE(MyFrame::OnCloseWindow
)
594 EVT_MENU(TEX_QUIT
, MyFrame::OnExit
)
595 EVT_MENU(TEX_GO
, MyFrame::OnGo
)
596 EVT_MENU(TEX_SET_INPUT
, MyFrame::OnSetInput
)
597 EVT_MENU(TEX_SET_OUTPUT
, MyFrame::OnSetOutput
)
598 EVT_MENU(TEX_SAVE_FILE
, MyFrame::OnSaveFile
)
599 EVT_MENU(TEX_VIEW_LATEX
, MyFrame::OnViewLatex
)
600 EVT_MENU(TEX_VIEW_OUTPUT
, MyFrame::OnViewOutput
)
601 EVT_MENU(TEX_VIEW_CUSTOM_MACROS
, MyFrame::OnShowMacros
)
602 EVT_MENU(TEX_LOAD_CUSTOM_MACROS
, MyFrame::OnLoadMacros
)
603 EVT_MENU(TEX_MODE_RTF
, MyFrame::OnModeRTF
)
604 EVT_MENU(TEX_MODE_WINHELP
, MyFrame::OnModeWinHelp
)
605 EVT_MENU(TEX_MODE_HTML
, MyFrame::OnModeHTML
)
606 EVT_MENU(TEX_MODE_XLP
, MyFrame::OnModeXLP
)
607 EVT_MENU(TEX_OPTIONS_CURLEY_BRACE
, MyFrame::OnOptionsCurleyBrace
)
608 EVT_MENU(TEX_OPTIONS_SYNTAX_CHECKING
, MyFrame::OnOptionsSyntaxChecking
)
609 EVT_MENU(TEX_HELP
, MyFrame::OnHelp
)
610 EVT_MENU(TEX_ABOUT
, MyFrame::OnAbout
)
613 // My frame constructor
614 MyFrame::MyFrame(wxFrame
*frame
, wxWindowID id
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
615 wxFrame(frame
, id
, title
, pos
, size
)
618 void MyFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
620 if (!stopRunning
&& !OkToClose
)
632 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
))
638 void MyFrame::OnGo(wxCommandEvent
& WXUNUSED(event
))
642 menuBar
->EnableTop(0, false);
643 menuBar
->EnableTop(1, false);
644 menuBar
->EnableTop(2, false);
645 menuBar
->EnableTop(3, false);
652 SetStatusText(_T("Build aborted!"));
654 errBuf
.Printf(_T("\nErrors encountered during this pass: %lu\n"), errorCount
);
655 OnInform((wxChar
*)errBuf
.c_str());
659 if (runTwice
&& !stopRunning
)
664 menuBar
->EnableTop(0, true);
665 menuBar
->EnableTop(1, true);
666 menuBar
->EnableTop(2, true);
667 menuBar
->EnableTop(3, true);
670 void MyFrame::OnSetInput(wxCommandEvent
& WXUNUSED(event
))
672 ChooseInputFile(true);
675 void MyFrame::OnSetOutput(wxCommandEvent
& WXUNUSED(event
))
677 ChooseOutputFile(true);
680 void MyFrame::OnSaveFile(wxCommandEvent
& WXUNUSED(event
))
682 wxString s
= wxFileSelector(_T("Save text to file"), _T(""), _T(""), _T("txt"), _T("*.txt"));
685 textWindow
->SaveFile(s
);
687 wxSnprintf(buf
, sizeof(buf
), _T("Saved text to %s"), (const wxChar
*) s
.c_str());
688 frame
->SetStatusText(buf
, 0);
692 void MyFrame::OnViewOutput(wxCommandEvent
& WXUNUSED(event
))
695 if (OutputFile
&& wxFileExists(OutputFile
))
697 textWindow
->LoadFile(OutputFile
);
699 wxString
str(wxFileNameFromPath(OutputFile
));
700 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), (const wxChar
*) str
.c_str());
701 frame
->SetTitle(buf
);
705 void MyFrame::OnViewLatex(wxCommandEvent
& WXUNUSED(event
))
708 if (InputFile
&& wxFileExists(InputFile
))
710 textWindow
->LoadFile(InputFile
);
712 wxString
str(wxFileNameFromPath(OutputFile
));
713 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), (const wxChar
*) str
.c_str());
714 frame
->SetTitle(buf
);
718 void MyFrame::OnLoadMacros(wxCommandEvent
& WXUNUSED(event
))
721 wxString s
= wxFileSelector(_T("Choose custom macro file"), wxPathOnly(MacroFile
), wxFileNameFromPath(MacroFile
), _T("ini"), _T("*.ini"));
722 if (s
!= _T("") && wxFileExists(s
))
724 MacroFile
= copystring(s
);
725 ReadCustomMacros((wxChar
*)s
.c_str());
730 void MyFrame::OnShowMacros(wxCommandEvent
& WXUNUSED(event
))
737 void MyFrame::OnModeRTF(wxCommandEvent
& WXUNUSED(event
))
739 convertMode
= TEX_RTF
;
743 SetStatusText(_T("In linear RTF mode."), 1);
746 void MyFrame::OnModeWinHelp(wxCommandEvent
& WXUNUSED(event
))
748 convertMode
= TEX_RTF
;
752 SetStatusText(_T("In WinHelp RTF mode."), 1);
755 void MyFrame::OnModeHTML(wxCommandEvent
& WXUNUSED(event
))
757 convertMode
= TEX_HTML
;
761 SetStatusText(_T("In HTML mode."), 1);
764 void MyFrame::OnModeXLP(wxCommandEvent
& WXUNUSED(event
))
766 convertMode
= TEX_XLP
;
769 SetStatusText(_T("In XLP mode."), 1);
772 void MyFrame::OnOptionsCurleyBrace(wxCommandEvent
& WXUNUSED(event
))
774 checkCurleyBraces
= !checkCurleyBraces
;
775 if (checkCurleyBraces
)
777 SetStatusText(_T("Checking curley braces: YES"), 1);
781 SetStatusText(_T("Checking curley braces: NO"), 1);
786 void MyFrame::OnOptionsSyntaxChecking(wxCommandEvent
& WXUNUSED(event
))
788 checkSyntax
= !checkSyntax
;
791 SetStatusText(_T("Checking syntax: YES"), 1);
795 SetStatusText(_T("Checking syntax: NO"), 1);
800 void MyFrame::OnHelp(wxCommandEvent
& WXUNUSED(event
))
803 HelpInstance
->LoadFile();
804 HelpInstance
->DisplayContents();
808 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
812 wxChar
*platform
= _T(" (32-bit)");
815 wxChar
*platform
= _T(" (16-bit)");
817 wxChar
*platform
= _T("");
820 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF Version %.2f%s\nLaTeX to RTF, WinHelp, and HTML Conversion\n\n(c) Julian Smart, George Tasker and others, 1999-2002"), versionNo
, platform
);
821 wxMessageBox(buf
, _T("About Tex2RTF"));
824 void ChooseInputFile(bool force
)
826 if (force
|| !InputFile
)
828 wxString s
= wxFileSelector(_T("Choose LaTeX input file"), wxPathOnly(InputFile
), wxFileNameFromPath(InputFile
), _T("tex"), _T("*.tex"));
831 // Different file, so clear index entries.
833 ResetContentsLevels(0);
837 InputFile
= copystring(s
);
838 wxString str
= wxFileNameFromPath(InputFile
);
840 buf
.Printf(_T("Tex2RTF [%s]"), str
.c_str());
841 frame
->SetTitle((wxChar
*)buf
.c_str());
847 void ChooseOutputFile(bool force
)
849 wxChar extensionBuf
[10];
851 wxStrcpy(wildBuf
, _T("*."));
854 path
= wxPathOnly(OutputFile
);
856 path
= wxPathOnly(InputFile
);
862 wxStrcpy(extensionBuf
, _T("rtf"));
863 wxStrcat(wildBuf
, _T("rtf"));
868 wxStrcpy(extensionBuf
, _T("xlp"));
869 wxStrcat(wildBuf
, _T("xlp"));
874 wxStrcpy(extensionBuf
, _T("html"));
875 wxStrcat(wildBuf
, _T("html"));
879 if (force
|| !OutputFile
)
881 wxString s
= wxFileSelector(_T("Choose output file"), path
, wxFileNameFromPath(OutputFile
),
882 extensionBuf
, wildBuf
);
884 OutputFile
= copystring(s
);
896 if (!InputFile
|| !OutputFile
|| stopRunning
)
903 wxString str
= wxFileNameFromPath(InputFile
);
905 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), (const wxChar
*) str
);
906 frame
->SetTitle(buf
);
912 // Find extension-less filename
913 wxStrcpy(FileRoot
, OutputFile
);
914 StripExtension(FileRoot
);
916 if (truncateFilenames
&& convertMode
== TEX_HTML
)
918 // Truncate to five characters. This ensures that
919 // we can generate DOS filenames such as thing999. But 1000 files
920 // may not be enough, of course...
921 wxChar
* sName
= wxFileNameFromPath( FileRoot
); // this Julian's method is non-destructive reference
924 if(wxStrlen( sName
) > 5)
925 sName
[5] = '\0'; // that should do!
928 wxSnprintf(ContentsName
, 300, _T("%s.con"), FileRoot
);
929 wxSnprintf(TmpContentsName
, 300, _T("%s.cn1"), FileRoot
);
930 wxSnprintf(TmpFrameContentsName
, 300, _T("%s.frc"), FileRoot
);
931 wxSnprintf(WinHelpContentsFileName
, 300, _T("%s.cnt"), FileRoot
);
932 wxSnprintf(RefFileName
, 300, _T("%s.ref"), FileRoot
);
934 TexPathList
.EnsureFileAccessible(InputFile
);
937 wxString s
= TexPathList
.FindValidPath(_T("bullet.bmp"));
940 wxString str
= wxFileNameFromPath(s
);
941 bulletFile
= copystring(str
);
945 if (wxFileExists(RefFileName
))
946 ReadTexReferences(RefFileName
);
948 bool success
= false;
950 if (InputFile
&& OutputFile
)
952 if (!wxFileExists(InputFile
))
954 OnError(_T("Cannot open input file!"));
962 buf
.Printf(_T("Working, pass %d...Click CLOSE to abort"), passNumber
);
963 frame
->SetStatusText((wxChar
*)buf
.c_str());
967 OnInform(_T("Reading LaTeX file..."));
968 TexLoadFile(InputFile
);
997 OnInform(_T("*** Aborted by user."));
1005 WriteTexReferences(RefFileName
);
1007 startedSections
= false;
1011 long tim
= wxGetElapsedTime();
1012 buf
.Printf(_T("Finished PASS #%d in %ld seconds.\n"), passNumber
, (long)(tim
/1000.0));
1013 OnInform((wxChar
*)buf
.c_str());
1017 buf
.Printf(_T("Errors encountered during this pass: %lu\n"), errorCount
);
1018 OnInform((wxChar
*)buf
.c_str());
1023 buf
.Printf(_T("Done, %d %s."), passNumber
, (passNumber
> 1) ? _T("passes") : _T("pass"));
1024 frame
->SetStatusText((wxChar
*)buf
.c_str());
1027 buf
.Printf(_T("Done, %d %s."), passNumber
, (passNumber
> 1) ? _T("passes") : _T("pass"));
1028 OnInform((wxChar
*)buf
.c_str());
1031 buf
.Printf(_T("Errors encountered during this pass: %lu\n"), errorCount
);
1032 OnInform((wxChar
*)buf
.c_str());
1042 startedSections
= false;
1045 frame
->SetStatusText(_T("Aborted by user."));
1048 OnInform(_T("Sorry, unsuccessful."));
1053 void OnError(const wxChar
*msg
)
1055 wxString msg_string
= msg
;
1059 wxSTD cerr
<< "Error: " << msg_string
.mb_str() << "\n";
1062 if (isInteractive
&& frame
)
1063 (*frame
->textWindow
) << _T("Error: ") << msg
<< _T("\n");
1067 wxSTD cerr
<< "Error: " << msg_string
.mb_str() << "\n";
1079 void OnInform(const wxChar
*msg
)
1081 wxString msg_string
= msg
;
1083 wxSTD cout
<< msg_string
.mb_str() << "\n";
1086 if (isInteractive
&& frame
)
1087 (*frame
->textWindow
) << msg
<< _T("\n");
1088 /* This whole block of code is just wrong I think. It would behave
1089 completely wrong under anything other than MSW due to the ELSE
1090 with no statement, and the cout calls would fail under MSW, as
1091 the code in this block is compiled if !NO_GUI This code has been
1092 here since v1.1 of this file too. - gt
1096 wxSTD cout << msg_string.mb_str() << "\n";
1111 void OnMacro(int macroId
, int no_args
, bool start
)
1113 switch (convertMode
)
1117 RTFOnMacro(macroId
, no_args
, start
);
1122 XLPOnMacro(macroId
, no_args
, start
);
1127 HTMLOnMacro(macroId
, no_args
, start
);
1133 bool OnArgument(int macroId
, int arg_no
, bool start
)
1135 switch (convertMode
)
1139 return RTFOnArgument(macroId
, arg_no
, start
);
1144 return XLPOnArgument(macroId
, arg_no
, start
);
1149 return HTMLOnArgument(macroId
, arg_no
, start
);
1159 #if defined(__WXMSW__) && !defined(NO_GUI)
1165 wxConnectionBase
*Tex2RTFServer::OnAcceptConnection(const wxString
& topic
)
1167 if (topic
== _T("TEX2RTF"))
1170 ipc_buffer
= new wxChar
[1000];
1172 return new Tex2RTFConnection(ipc_buffer
, 4000);
1182 Tex2RTFConnection::Tex2RTFConnection(wxChar
*buf
, int size
):wxDDEConnection(buf
, size
)
1186 Tex2RTFConnection::~Tex2RTFConnection(void)
1190 bool SplitCommand(wxChar
*data
, wxChar
*firstArg
, wxChar
*secondArg
)
1196 // Find first argument (command name)
1199 if (data
[i
] == ' ' || data
[i
] == 0)
1203 firstArg
[i
] = data
[i
];
1210 // Find second argument
1213 while (data
[i
] != 0)
1215 secondArg
[j
] = data
[i
];
1224 bool Tex2RTFConnection::OnExecute(const wxString
& WXUNUSED(topic
), wxChar
*data
, int WXUNUSED(size
), wxIPCFormat
WXUNUSED(format
))
1226 wxStrcpy(Tex2RTFLastStatus
, _T("OK"));
1228 wxChar firstArg
[50];
1229 wxChar secondArg
[300];
1230 if (SplitCommand(data
, firstArg
, secondArg
))
1232 bool hasArg
= (wxStrlen(secondArg
) > 0);
1233 if (wxStrcmp(firstArg
, _T("INPUT")) == 0 && hasArg
)
1235 if (InputFile
) delete[] InputFile
;
1236 InputFile
= copystring(secondArg
);
1240 wxString str
= wxFileNameFromPath(InputFile
);
1241 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), (const wxChar
*) str
);
1242 frame
->SetTitle(buf
);
1245 else if (wxStrcmp(firstArg
, _T("OUTPUT")) == 0 && hasArg
)
1247 if (OutputFile
) delete[] OutputFile
;
1248 OutputFile
= copystring(secondArg
);
1250 else if (wxStrcmp(firstArg
, _T("GO")) == 0)
1252 wxStrcpy(Tex2RTFLastStatus
, _T("WORKING"));
1254 wxStrcpy(Tex2RTFLastStatus
, _T("CONVERSION ERROR"));
1256 wxStrcpy(Tex2RTFLastStatus
, _T("OK"));
1258 else if (wxStrcmp(firstArg
, _T("EXIT")) == 0)
1260 if (frame
) frame
->Close();
1262 else if (wxStrcmp(firstArg
, _T("MINIMIZE")) == 0 || wxStrcmp(firstArg
, _T("ICONIZE")) == 0)
1265 frame
->Iconize(true);
1267 else if (wxStrcmp(firstArg
, _T("SHOW")) == 0 || wxStrcmp(firstArg
, _T("RESTORE")) == 0)
1271 frame
->Iconize(false);
1277 // Try for a setting
1278 wxStrcpy(Tex2RTFLastStatus
, RegisterSetting(firstArg
, secondArg
, false));
1280 if (frame
&& wxStrcmp(firstArg
, _T("conversionMode")) == 0)
1283 wxStrcpy(buf
, _T("In "));
1285 if (winHelp
&& (convertMode
== TEX_RTF
))
1286 wxStrcat(buf
, _T("WinHelp RTF"));
1287 else if (!winHelp
&& (convertMode
== TEX_RTF
))
1288 wxStrcat(buf
, _T("linear RTF"));
1289 else if (convertMode
== TEX_HTML
) wxStrcat(buf
, _T("HTML"));
1290 else if (convertMode
== TEX_XLP
) wxStrcat(buf
, _T("XLP"));
1291 wxStrcat(buf
, _T(" mode."));
1292 frame
->SetStatusText(buf
, 1);
1300 wxChar
*Tex2RTFConnection::OnRequest(const wxString
& WXUNUSED(topic
), const wxString
& WXUNUSED(item
), int *WXUNUSED(size
), wxIPCFormat
WXUNUSED(format
))
1302 return Tex2RTFLastStatus
;
1309 //void wxObject::Dump(wxSTD ostream& str)
1311 // if (GetClassInfo() && GetClassInfo()->GetClassName())
1312 // str << GetClassInfo()->GetClassName();
1314 // str << "unknown object class";