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
= 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());
295 #if defined(__WXMSW__) && !defined(NO_GUI)
297 Tex2RTFLastStatus
[0] = 0; // DDE connection return value
298 TheTex2RTFServer
= new Tex2RTFServer
;
299 TheTex2RTFServer
->Create(_T("TEX2RTF"));
302 TexInitialize(BufSize
);
303 ResetContentsLevels(0);
311 // Create the main frame window
312 frame
= new MyFrame(NULL
, wxID_ANY
, _T("Tex2RTF"), wxDefaultPosition
, wxSize(400, 300));
313 frame
->CreateStatusBar(2);
316 // TODO: uncomment this when we have tex2rtf.xpm
317 frame
->SetIcon(wxICON(tex2rtf
));
321 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), wxFileNameFromPath(InputFile
));
322 frame
->SetTitle(buf
);
326 wxMenu
*file_menu
= new wxMenu
;
327 file_menu
->Append(TEX_GO
, _T("&Go"), _T("Run converter"));
328 file_menu
->Append(TEX_SET_INPUT
, _T("Set &Input File"), _T("Set the LaTeX input file"));
329 file_menu
->Append(TEX_SET_OUTPUT
, _T("Set &Output File"), _T("Set the output file"));
330 file_menu
->AppendSeparator();
331 file_menu
->Append(TEX_VIEW_LATEX
, _T("View &LaTeX File"), _T("View the LaTeX input file"));
332 file_menu
->Append(TEX_VIEW_OUTPUT
, _T("View Output &File"), _T("View output file"));
333 file_menu
->Append(TEX_SAVE_FILE
, _T("&Save log file"), _T("Save displayed text into file"));
334 file_menu
->AppendSeparator();
335 file_menu
->Append(TEX_QUIT
, _T("E&xit"), _T("Exit Tex2RTF"));
337 wxMenu
*macro_menu
= new wxMenu
;
339 macro_menu
->Append(TEX_LOAD_CUSTOM_MACROS
, _T("&Load Custom Macros"), _T("Load custom LaTeX macro file"));
340 macro_menu
->Append(TEX_VIEW_CUSTOM_MACROS
, _T("View &Custom Macros"), _T("View custom LaTeX macros"));
342 wxMenu
*mode_menu
= new wxMenu
;
344 mode_menu
->Append(TEX_MODE_RTF
, _T("Output linear &RTF"), _T("Wordprocessor-compatible RTF"));
345 mode_menu
->Append(TEX_MODE_WINHELP
, _T("Output &WinHelp RTF"), _T("WinHelp-compatible RTF"));
346 mode_menu
->Append(TEX_MODE_HTML
, _T("Output &HTML"), _T("HTML World Wide Web hypertext file"));
347 mode_menu
->Append(TEX_MODE_XLP
, _T("Output &XLP"), _T("wxHelp hypertext help file"));
349 wxMenu
*options_menu
= new wxMenu
;
351 options_menu
->Append(TEX_OPTIONS_CURLEY_BRACE
, _T("Curley brace matching"), _T("Checks for mismatched curley braces"),true);
352 options_menu
->Append(TEX_OPTIONS_SYNTAX_CHECKING
, _T("Syntax checking"), _T("Syntax checking for common errors"),true);
354 options_menu
->Check(TEX_OPTIONS_CURLEY_BRACE
, checkCurleyBraces
);
355 options_menu
->Check(TEX_OPTIONS_SYNTAX_CHECKING
, checkSyntax
);
357 wxMenu
*help_menu
= new wxMenu
;
359 help_menu
->Append(TEX_HELP
, _T("&Help"), _T("Tex2RTF Contents Page"));
360 help_menu
->Append(TEX_ABOUT
, _T("&About Tex2RTF"), _T("About Tex2RTF"));
362 menuBar
= new wxMenuBar
;
363 menuBar
->Append(file_menu
, _T("&File"));
364 menuBar
->Append(macro_menu
, _T("&Macros"));
365 menuBar
->Append(mode_menu
, _T("&Conversion Mode"));
366 menuBar
->Append(options_menu
, _T("&Options"));
367 menuBar
->Append(help_menu
, _T("&Help"));
369 frame
->SetMenuBar(menuBar
);
370 frame
->textWindow
= new wxTextCtrl(frame
, wxID_ANY
, _T(""), wxDefaultPosition
, wxDefaultSize
, wxTE_READONLY
|wxTE_MULTILINE
);
372 (*frame
->textWindow
) << _T("Welcome to Tex2RTF.\n");
376 #if wxUSE_MS_HTML_HELP && !defined(__WXUNIVERSAL__)
377 HelpInstance
= new wxCHMHelpController
;
379 HelpInstance
= new wxHtmlHelpController
;
381 HelpInstance
->Initialize(_T("tex2rtf"));
385 * Read macro/initialisation file
389 wxString path
= TexPathList
.FindValidPath(MacroFile
);
391 ReadCustomMacros((wxChar
*)path
.c_str());
393 wxStrcpy(buf
, _T("In "));
395 if (winHelp
&& (convertMode
== TEX_RTF
))
396 wxStrcat(buf
, _T("WinHelp RTF"));
397 else if (!winHelp
&& (convertMode
== TEX_RTF
))
398 wxStrcat(buf
, _T("linear RTF"));
399 else if (convertMode
== TEX_HTML
) wxStrcat(buf
, _T("HTML"));
400 else if (convertMode
== TEX_XLP
) wxStrcat(buf
, _T("XLP"));
401 wxStrcat(buf
, _T(" mode."));
402 frame
->SetStatusText(buf
, 1);
411 * Read macro/initialisation file
415 wxString path
= TexPathList
.FindValidPath(MacroFile
);
417 ReadCustomMacros((wxChar
*)path
.c_str());
427 OnExit(); // Do cleanup since OnExit won't be called now
436 wxNode
*node
= CustomMacroList
.GetFirst();
439 CustomMacro
*macro
= (CustomMacro
*)node
->GetData();
442 node
= CustomMacroList
.GetFirst();
444 MacroDefs
.BeginFind();
445 wxHashTable::Node
* mNode
= MacroDefs
.Next();
448 TexMacroDef
* def
= (TexMacroDef
*) mNode
->GetData();
450 mNode
= MacroDefs
.Next();
454 delete TheTex2RTFServer
;
469 delete currentArgData
;
470 currentArgData
= NULL
;
484 delete TexTmpBibName
;
485 TexTmpBibName
= NULL
;
499 delete TmpContentsName
;
500 TmpContentsName
= NULL
;
502 if (TmpFrameContentsName
)
504 delete TmpFrameContentsName
;
505 TmpFrameContentsName
= NULL
;
507 if (WinHelpContentsFileName
)
509 delete WinHelpContentsFileName
;
510 WinHelpContentsFileName
= NULL
;
534 delete [] BibliographyStyleString
;
535 delete [] DocumentStyleString
;
536 delete [] bitmapMethod
;
537 delete [] backgroundColourString
;
538 delete [] ContentsNameString
;
539 delete [] AbstractNameString
;
540 delete [] GlossaryNameString
;
541 delete [] ReferencesNameString
;
542 delete [] FiguresNameString
;
543 delete [] TablesNameString
;
544 delete [] FigureNameString
;
545 delete [] TableNameString
;
546 delete [] IndexNameString
;
547 delete [] ChapterNameString
;
548 delete [] SectionNameString
;
549 delete [] SubsectionNameString
;
550 delete [] SubsubsectionNameString
;
551 delete [] UpNameString
;
553 delete[] winHelpTitle
;
555 // TODO: this simulates zero-memory leaks!
556 // Otherwise there are just too many...
558 #if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
559 wxDebugContext::SetCheckpoint();
566 void ShowOptions(void)
569 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF version %.2f"), versionNo
);
571 OnInform(_T("Usage: tex2rtf [input] [output] [switches]\n"));
572 OnInform(_T("where valid switches are"));
574 OnInform(_T(" -interactive"));
576 OnInform(_T(" -bufsize <size in K>"));
577 OnInform(_T(" -charset <pc | pca | ansi | mac> (default ansi)"));
578 OnInform(_T(" -twice"));
579 OnInform(_T(" -sync"));
580 OnInform(_T(" -checkcurleybraces"));
581 OnInform(_T(" -checksyntax"));
582 OnInform(_T(" -macros <filename>"));
583 OnInform(_T(" -winhelp"));
584 OnInform(_T(" -rtf"));
585 OnInform(_T(" -html"));
586 OnInform(_T(" -xlp\n"));
591 BEGIN_EVENT_TABLE(MyFrame
, wxFrame
)
592 EVT_CLOSE(MyFrame::OnCloseWindow
)
593 EVT_MENU(TEX_QUIT
, MyFrame::OnExit
)
594 EVT_MENU(TEX_GO
, MyFrame::OnGo
)
595 EVT_MENU(TEX_SET_INPUT
, MyFrame::OnSetInput
)
596 EVT_MENU(TEX_SET_OUTPUT
, MyFrame::OnSetOutput
)
597 EVT_MENU(TEX_SAVE_FILE
, MyFrame::OnSaveFile
)
598 EVT_MENU(TEX_VIEW_LATEX
, MyFrame::OnViewLatex
)
599 EVT_MENU(TEX_VIEW_OUTPUT
, MyFrame::OnViewOutput
)
600 EVT_MENU(TEX_VIEW_CUSTOM_MACROS
, MyFrame::OnShowMacros
)
601 EVT_MENU(TEX_LOAD_CUSTOM_MACROS
, MyFrame::OnLoadMacros
)
602 EVT_MENU(TEX_MODE_RTF
, MyFrame::OnModeRTF
)
603 EVT_MENU(TEX_MODE_WINHELP
, MyFrame::OnModeWinHelp
)
604 EVT_MENU(TEX_MODE_HTML
, MyFrame::OnModeHTML
)
605 EVT_MENU(TEX_MODE_XLP
, MyFrame::OnModeXLP
)
606 EVT_MENU(TEX_OPTIONS_CURLEY_BRACE
, MyFrame::OnOptionsCurleyBrace
)
607 EVT_MENU(TEX_OPTIONS_SYNTAX_CHECKING
, MyFrame::OnOptionsSyntaxChecking
)
608 EVT_MENU(TEX_HELP
, MyFrame::OnHelp
)
609 EVT_MENU(TEX_ABOUT
, MyFrame::OnAbout
)
612 // My frame constructor
613 MyFrame::MyFrame(wxFrame
*frame
, wxWindowID id
, const wxString
& title
, const wxPoint
& pos
, const wxSize
& size
):
614 wxFrame(frame
, id
, title
, pos
, size
)
617 void MyFrame::OnCloseWindow(wxCloseEvent
& WXUNUSED(event
))
619 if (!stopRunning
&& !OkToClose
)
631 void MyFrame::OnExit(wxCommandEvent
& WXUNUSED(event
))
637 void MyFrame::OnGo(wxCommandEvent
& WXUNUSED(event
))
641 menuBar
->EnableTop(0, false);
642 menuBar
->EnableTop(1, false);
643 menuBar
->EnableTop(2, false);
644 menuBar
->EnableTop(3, false);
651 SetStatusText(_T("Build aborted!"));
653 errBuf
.Printf(_T("\nErrors encountered during this pass: %lu\n"), errorCount
);
654 OnInform((wxChar
*)errBuf
.c_str());
658 if (runTwice
&& !stopRunning
)
663 menuBar
->EnableTop(0, true);
664 menuBar
->EnableTop(1, true);
665 menuBar
->EnableTop(2, true);
666 menuBar
->EnableTop(3, true);
669 void MyFrame::OnSetInput(wxCommandEvent
& WXUNUSED(event
))
671 ChooseInputFile(true);
674 void MyFrame::OnSetOutput(wxCommandEvent
& WXUNUSED(event
))
676 ChooseOutputFile(true);
679 void MyFrame::OnSaveFile(wxCommandEvent
& WXUNUSED(event
))
681 wxString s
= wxFileSelector(_T("Save text to file"), _T(""), _T(""), _T("txt"), _T("*.txt"));
684 textWindow
->SaveFile(s
);
686 wxSnprintf(buf
, sizeof(buf
), _T("Saved text to %s"), (const wxChar
*) s
.c_str());
687 frame
->SetStatusText(buf
, 0);
691 void MyFrame::OnViewOutput(wxCommandEvent
& WXUNUSED(event
))
694 if (OutputFile
&& wxFileExists(OutputFile
))
696 textWindow
->LoadFile(OutputFile
);
698 wxString
str(wxFileNameFromPath(OutputFile
));
699 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), (const wxChar
*) str
.c_str());
700 frame
->SetTitle(buf
);
704 void MyFrame::OnViewLatex(wxCommandEvent
& WXUNUSED(event
))
707 if (InputFile
&& wxFileExists(InputFile
))
709 textWindow
->LoadFile(InputFile
);
711 wxString
str(wxFileNameFromPath(OutputFile
));
712 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), (const wxChar
*) str
.c_str());
713 frame
->SetTitle(buf
);
717 void MyFrame::OnLoadMacros(wxCommandEvent
& WXUNUSED(event
))
720 wxString s
= wxFileSelector(_T("Choose custom macro file"), wxPathOnly(MacroFile
), wxFileNameFromPath(MacroFile
), _T("ini"), _T("*.ini"));
721 if (s
!= _T("") && wxFileExists(s
))
723 MacroFile
= copystring(s
);
724 ReadCustomMacros((wxChar
*)s
.c_str());
729 void MyFrame::OnShowMacros(wxCommandEvent
& WXUNUSED(event
))
736 void MyFrame::OnModeRTF(wxCommandEvent
& WXUNUSED(event
))
738 convertMode
= TEX_RTF
;
742 SetStatusText(_T("In linear RTF mode."), 1);
745 void MyFrame::OnModeWinHelp(wxCommandEvent
& WXUNUSED(event
))
747 convertMode
= TEX_RTF
;
751 SetStatusText(_T("In WinHelp RTF mode."), 1);
754 void MyFrame::OnModeHTML(wxCommandEvent
& WXUNUSED(event
))
756 convertMode
= TEX_HTML
;
760 SetStatusText(_T("In HTML mode."), 1);
763 void MyFrame::OnModeXLP(wxCommandEvent
& WXUNUSED(event
))
765 convertMode
= TEX_XLP
;
768 SetStatusText(_T("In XLP mode."), 1);
771 void MyFrame::OnOptionsCurleyBrace(wxCommandEvent
& WXUNUSED(event
))
773 checkCurleyBraces
= !checkCurleyBraces
;
774 if (checkCurleyBraces
)
776 SetStatusText(_T("Checking curley braces: YES"), 1);
780 SetStatusText(_T("Checking curley braces: NO"), 1);
785 void MyFrame::OnOptionsSyntaxChecking(wxCommandEvent
& WXUNUSED(event
))
787 checkSyntax
= !checkSyntax
;
790 SetStatusText(_T("Checking syntax: YES"), 1);
794 SetStatusText(_T("Checking syntax: NO"), 1);
799 void MyFrame::OnHelp(wxCommandEvent
& WXUNUSED(event
))
802 HelpInstance
->LoadFile();
803 HelpInstance
->DisplayContents();
807 void MyFrame::OnAbout(wxCommandEvent
& WXUNUSED(event
))
811 wxChar
*platform
= _T(" (32-bit)");
814 wxChar
*platform
= _T(" (16-bit)");
816 wxChar
*platform
= _T("");
819 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
);
820 wxMessageBox(buf
, _T("About Tex2RTF"));
823 void ChooseInputFile(bool force
)
825 if (force
|| !InputFile
)
827 wxString s
= wxFileSelector(_T("Choose LaTeX input file"), wxPathOnly(InputFile
), wxFileNameFromPath(InputFile
), _T("tex"), _T("*.tex"));
830 // Different file, so clear index entries.
832 ResetContentsLevels(0);
836 InputFile
= copystring(s
);
837 wxString str
= wxFileNameFromPath(InputFile
);
839 buf
.Printf(_T("Tex2RTF [%s]"), str
.c_str());
840 frame
->SetTitle((wxChar
*)buf
.c_str());
846 void ChooseOutputFile(bool force
)
848 wxChar extensionBuf
[10];
850 wxStrcpy(wildBuf
, _T("*."));
853 path
= wxPathOnly(OutputFile
);
855 path
= wxPathOnly(InputFile
);
861 wxStrcpy(extensionBuf
, _T("rtf"));
862 wxStrcat(wildBuf
, _T("rtf"));
867 wxStrcpy(extensionBuf
, _T("xlp"));
868 wxStrcat(wildBuf
, _T("xlp"));
873 wxStrcpy(extensionBuf
, _T("html"));
874 wxStrcat(wildBuf
, _T("html"));
878 if (force
|| !OutputFile
)
880 wxString s
= wxFileSelector(_T("Choose output file"), path
, wxFileNameFromPath(OutputFile
),
881 extensionBuf
, wildBuf
);
883 OutputFile
= copystring(s
);
895 if (!InputFile
|| !OutputFile
|| stopRunning
)
902 wxString str
= wxFileNameFromPath(InputFile
);
904 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), (const wxChar
*) str
);
905 frame
->SetTitle(buf
);
911 // Find extension-less filename
912 wxStrcpy(FileRoot
, OutputFile
);
913 StripExtension(FileRoot
);
915 if (truncateFilenames
&& convertMode
== TEX_HTML
)
917 // Truncate to five characters. This ensures that
918 // we can generate DOS filenames such as thing999. But 1000 files
919 // may not be enough, of course...
920 wxChar
* sName
= wxFileNameFromPath( FileRoot
); // this Julian's method is non-destructive reference
923 if(wxStrlen( sName
) > 5)
924 sName
[5] = '\0'; // that should do!
927 wxSnprintf(ContentsName
, 300, _T("%s.con"), FileRoot
);
928 wxSnprintf(TmpContentsName
, 300, _T("%s.cn1"), FileRoot
);
929 wxSnprintf(TmpFrameContentsName
, 300, _T("%s.frc"), FileRoot
);
930 wxSnprintf(WinHelpContentsFileName
, 300, _T("%s.cnt"), FileRoot
);
931 wxSnprintf(RefFileName
, 300, _T("%s.ref"), FileRoot
);
933 TexPathList
.EnsureFileAccessible(InputFile
);
936 wxString s
= TexPathList
.FindValidPath(_T("bullet.bmp"));
939 wxString str
= wxFileNameFromPath(s
);
940 bulletFile
= copystring(str
);
944 if (wxFileExists(RefFileName
))
945 ReadTexReferences(RefFileName
);
947 bool success
= false;
949 if (InputFile
&& OutputFile
)
951 if (!wxFileExists(InputFile
))
953 OnError(_T("Cannot open input file!"));
961 buf
.Printf(_T("Working, pass %d...Click CLOSE to abort"), passNumber
);
962 frame
->SetStatusText((wxChar
*)buf
.c_str());
966 OnInform(_T("Reading LaTeX file..."));
967 TexLoadFile(InputFile
);
996 OnInform(_T("*** Aborted by user."));
1004 WriteTexReferences(RefFileName
);
1006 startedSections
= false;
1010 long tim
= wxGetElapsedTime();
1011 buf
.Printf(_T("Finished PASS #%d in %ld seconds.\n"), passNumber
, (long)(tim
/1000.0));
1012 OnInform((wxChar
*)buf
.c_str());
1016 buf
.Printf(_T("Errors encountered during this pass: %lu\n"), errorCount
);
1017 OnInform((wxChar
*)buf
.c_str());
1022 buf
.Printf(_T("Done, %d %s."), passNumber
, (passNumber
> 1) ? _T("passes") : _T("pass"));
1023 frame
->SetStatusText((wxChar
*)buf
.c_str());
1026 buf
.Printf(_T("Done, %d %s."), passNumber
, (passNumber
> 1) ? _T("passes") : _T("pass"));
1027 OnInform((wxChar
*)buf
.c_str());
1030 buf
.Printf(_T("Errors encountered during this pass: %lu\n"), errorCount
);
1031 OnInform((wxChar
*)buf
.c_str());
1041 startedSections
= false;
1044 frame
->SetStatusText(_T("Aborted by user."));
1047 OnInform(_T("Sorry, unsuccessful."));
1052 void OnError(const wxChar
*msg
)
1054 wxString msg_string
= msg
;
1058 wxSTD cerr
<< "Error: " << msg_string
.mb_str() << "\n";
1061 if (isInteractive
&& frame
)
1062 (*frame
->textWindow
) << _T("Error: ") << msg
<< _T("\n");
1066 wxSTD cerr
<< "Error: " << msg_string
.mb_str() << "\n";
1078 void OnInform(const wxChar
*msg
)
1080 wxString msg_string
= msg
;
1082 wxSTD cout
<< msg_string
.mb_str() << "\n";
1085 if (isInteractive
&& frame
)
1086 (*frame
->textWindow
) << msg
<< _T("\n");
1087 /* This whole block of code is just wrong I think. It would behave
1088 completely wrong under anything other than MSW due to the ELSE
1089 with no statement, and the cout calls would fail under MSW, as
1090 the code in this block is compiled if !NO_GUI This code has been
1091 here since v1.1 of this file too. - gt
1095 wxSTD cout << msg_string.mb_str() << "\n";
1110 void OnMacro(int macroId
, int no_args
, bool start
)
1112 switch (convertMode
)
1116 RTFOnMacro(macroId
, no_args
, start
);
1121 XLPOnMacro(macroId
, no_args
, start
);
1126 HTMLOnMacro(macroId
, no_args
, start
);
1132 bool OnArgument(int macroId
, int arg_no
, bool start
)
1134 switch (convertMode
)
1138 return RTFOnArgument(macroId
, arg_no
, start
);
1143 return XLPOnArgument(macroId
, arg_no
, start
);
1148 return HTMLOnArgument(macroId
, arg_no
, start
);
1158 #if defined(__WXMSW__) && !defined(NO_GUI)
1164 wxConnectionBase
*Tex2RTFServer::OnAcceptConnection(const wxString
& topic
)
1166 if (topic
== _T("TEX2RTF"))
1169 ipc_buffer
= new wxChar
[1000];
1171 return new Tex2RTFConnection(ipc_buffer
, 4000);
1181 Tex2RTFConnection::Tex2RTFConnection(wxChar
*buf
, int size
):wxDDEConnection(buf
, size
)
1185 Tex2RTFConnection::~Tex2RTFConnection(void)
1189 bool SplitCommand(wxChar
*data
, wxChar
*firstArg
, wxChar
*secondArg
)
1195 // Find first argument (command name)
1198 if (data
[i
] == ' ' || data
[i
] == 0)
1202 firstArg
[i
] = data
[i
];
1209 // Find second argument
1212 while (data
[i
] != 0)
1214 secondArg
[j
] = data
[i
];
1223 bool Tex2RTFConnection::OnExecute(const wxString
& WXUNUSED(topic
), wxChar
*data
, int WXUNUSED(size
), wxIPCFormat
WXUNUSED(format
))
1225 wxStrcpy(Tex2RTFLastStatus
, _T("OK"));
1227 wxChar firstArg
[50];
1228 wxChar secondArg
[300];
1229 if (SplitCommand(data
, firstArg
, secondArg
))
1231 bool hasArg
= (wxStrlen(secondArg
) > 0);
1232 if (wxStrcmp(firstArg
, _T("INPUT")) == 0 && hasArg
)
1234 if (InputFile
) delete[] InputFile
;
1235 InputFile
= copystring(secondArg
);
1239 wxString str
= wxFileNameFromPath(InputFile
);
1240 wxSnprintf(buf
, sizeof(buf
), _T("Tex2RTF [%s]"), (const wxChar
*) str
);
1241 frame
->SetTitle(buf
);
1244 else if (wxStrcmp(firstArg
, _T("OUTPUT")) == 0 && hasArg
)
1246 if (OutputFile
) delete[] OutputFile
;
1247 OutputFile
= copystring(secondArg
);
1249 else if (wxStrcmp(firstArg
, _T("GO")) == 0)
1251 wxStrcpy(Tex2RTFLastStatus
, _T("WORKING"));
1253 wxStrcpy(Tex2RTFLastStatus
, _T("CONVERSION ERROR"));
1255 wxStrcpy(Tex2RTFLastStatus
, _T("OK"));
1257 else if (wxStrcmp(firstArg
, _T("EXIT")) == 0)
1259 if (frame
) frame
->Close();
1261 else if (wxStrcmp(firstArg
, _T("MINIMIZE")) == 0 || wxStrcmp(firstArg
, _T("ICONIZE")) == 0)
1264 frame
->Iconize(true);
1266 else if (wxStrcmp(firstArg
, _T("SHOW")) == 0 || wxStrcmp(firstArg
, _T("RESTORE")) == 0)
1270 frame
->Iconize(false);
1276 // Try for a setting
1277 wxStrcpy(Tex2RTFLastStatus
, RegisterSetting(firstArg
, secondArg
, false));
1279 if (frame
&& wxStrcmp(firstArg
, _T("conversionMode")) == 0)
1282 wxStrcpy(buf
, _T("In "));
1284 if (winHelp
&& (convertMode
== TEX_RTF
))
1285 wxStrcat(buf
, _T("WinHelp RTF"));
1286 else if (!winHelp
&& (convertMode
== TEX_RTF
))
1287 wxStrcat(buf
, _T("linear RTF"));
1288 else if (convertMode
== TEX_HTML
) wxStrcat(buf
, _T("HTML"));
1289 else if (convertMode
== TEX_XLP
) wxStrcat(buf
, _T("XLP"));
1290 wxStrcat(buf
, _T(" mode."));
1291 frame
->SetStatusText(buf
, 1);
1299 wxChar
*Tex2RTFConnection::OnRequest(const wxString
& WXUNUSED(topic
), const wxString
& WXUNUSED(item
), int *WXUNUSED(size
), wxIPCFormat
WXUNUSED(format
))
1301 return Tex2RTFLastStatus
;
1308 //void wxObject::Dump(wxSTD ostream& str)
1310 // if (GetClassInfo() && GetClassInfo()->GetClassName())
1311 // str << GetClassInfo()->GetClassName();
1313 // str << "unknown object class";