]> git.saurik.com Git - wxWidgets.git/blame - utils/tex2rtf/src/tex2rtf.cpp
Deprecated lib tweaks
[wxWidgets.git] / utils / tex2rtf / src / tex2rtf.cpp
CommitLineData
9a29912f
JS
1/////////////////////////////////////////////////////////////////////////////
2// Name: tex2rtf.cpp
3// Purpose: Converts Latex to linear/WinHelp RTF, HTML, wxHelp.
4// Author: Julian Smart
5// Modified by:
6// Created: 7.9.93
7// RCS-ID: $Id$
8// Copyright: (c) Julian Smart
9// Licence: wxWindows licence
10/////////////////////////////////////////////////////////////////////////////
11
12#ifdef __GNUG__
13#pragma implementation
14#endif
15
16// For compilers that support precompilation, includes "wx.h".
17#include "wx/wxprec.h"
18
19#ifdef __BORLANDC__
20#pragma hdrstop
21#endif
22
23#ifndef WX_PRECOMP
24#include "wx/wx.h"
25#endif
26
27#ifndef NO_GUI
4538b3f1
GD
28#include "wx/help.h"
29#include "wx/timer.h"
9a29912f
JS
30#endif
31
ffaaaacb 32#if defined(NO_GUI) || defined(__UNIX__)
9a29912f
JS
33#if wxUSE_IOSTREAMH
34#include <iostream.h>
35#include <fstream.h>
36#else
37#include <iostream>
38#include <fstream>
39#endif
40#endif
41
42#include <ctype.h>
43#include <stdlib.h>
44#include "tex2any.h"
45#include "tex2rtf.h"
46#include "rtfutils.h"
56d34922 47#include "symbols.h"
9a29912f 48
610c6ded 49#if (defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__)) && !defined(NO_GUI)
9a29912f
JS
50#include "tex2rtf.xpm"
51#endif
52
56d34922 53const float versionNo = TEX2RTF_VERSION_NUMBER;
9a29912f
JS
54
55TexChunk *currentMember = NULL;
56bool startedSections = FALSE;
57char *contentsString = NULL;
58bool suppressNameDecoration = FALSE;
59bool OkToClose = TRUE;
60int passNumber = 1;
63ad540d 61int errorCount = 0;
9a29912f
JS
62
63#ifndef NO_GUI
ffaaaacb 64
71599f0a
GT
65extern char *BigBuffer;
66extern char *TexFileRoot;
67extern char *TexBibName; // Bibliography output file name
68extern char *TexTmpBibName; // Temporary bibliography output file name
69extern wxList ColourTable;
70extern TexChunk *TopLevel;
3924dd22
GT
71extern char *PageStyle;
72extern char *BibliographyStyleString;
73extern char *DocumentStyleString;
74extern char *bitmapMethod;
75extern char *backgroundColourString;
76extern char *ContentsNameString;
77extern char *AbstractNameString;
78extern char *GlossaryNameString;
79extern char *ReferencesNameString;
80extern char *FiguresNameString;
81extern char *TablesNameString;
82extern char *FigureNameString;
83extern char *TableNameString;
84extern char *IndexNameString;
85extern char *ChapterNameString;
86extern char *SectionNameString;
87extern char *SubsectionNameString;
88extern char *SubsubsectionNameString;
89extern char *UpNameString;
90
91
71599f0a 92
ffaaaacb 93#if wxUSE_HELP
9a29912f 94wxHelpController *HelpInstance = NULL;
ffaaaacb 95#endif // wxUSE_HELP
9a29912f
JS
96
97#ifdef __WXMSW__
98static char *ipc_buffer = NULL;
99static char Tex2RTFLastStatus[100];
100Tex2RTFServer *TheTex2RTFServer = NULL;
101#endif
102#endif
103
104char *bulletFile = NULL;
105
106FILE *Contents = NULL; // Contents page
107FILE *Chapters = NULL; // Chapters (WinHelp RTF) or rest of file (linear RTF)
108FILE *Sections = NULL;
109FILE *Subsections = NULL;
110FILE *Subsubsections = NULL;
111FILE *Popups = NULL;
112FILE *WinHelpContentsFile = NULL;
113
114char *InputFile = NULL;
115char *OutputFile = NULL;
116char *MacroFile = copystring("tex2rtf.ini");
117
118char *FileRoot = NULL;
119char *ContentsName = NULL; // Contents page from last time around
120char *TmpContentsName = NULL; // Current contents page
121char *TmpFrameContentsName = NULL; // Current frame contents page
122char *WinHelpContentsFileName = NULL; // WinHelp .cnt file
ad781c23 123char *RefFileName = NULL; // Reference file name
9a29912f
JS
124
125char *RTFCharset = copystring("ansi");
126
127#ifdef __WXMSW__
128int BufSize = 100; // Size of buffer in K
129#else
130int BufSize = 500;
131#endif
132
133bool Go(void);
134void ShowOptions(void);
135
aed3314d 136char wxTex2RTFBuffer[1500];
c4c794e1 137
aed3314d 138#ifdef NO_GUI
c4c794e1 139
9a29912f
JS
140int main(int argc, char **argv)
141#else
142wxMenuBar *menuBar = NULL;
143MyFrame *frame = NULL;
144
145// DECLARE_APP(MyApp)
146IMPLEMENT_APP(MyApp)
147
148// `Main program' equivalent, creating windows and returning main app frame
149bool MyApp::OnInit()
150#endif
151{
152 // Use default list of macros defined in tex2any.cc
153 DefineDefaultMacros();
154 AddMacroDef(ltHARDY, "hardy", 0);
155
156 FileRoot = new char[300];
157 ContentsName = new char[300];
158 TmpContentsName = new char[300];
159 TmpFrameContentsName = new char[300];
160 WinHelpContentsFileName = new char[300];
ad781c23 161 RefFileName = new char[300];
9a29912f 162
71599f0a
GT
163 ColourTable.DeleteContents(TRUE);
164
9a29912f 165 int n = 1;
ffaaaacb 166
9a29912f
JS
167 // Read input/output files
168 if (argc > 1)
169 {
170 if (argv[1][0] != '-')
171 {
172 InputFile = argv[1];
173 n ++;
174
175 if (argc > 2)
176 {
177 if (argv[2][0] != '-')
178 {
179 OutputFile = argv[2];
180 n ++;
181 }
182 }
183 }
184 }
185
186#ifdef NO_GUI
187 if (!InputFile || !OutputFile)
188 {
219f4a6d 189 wxSTD cout << "Tex2RTF: input or output file is missing.\n";
9a29912f
JS
190 ShowOptions();
191 exit(1);
192 }
c4c794e1 193
9a29912f
JS
194#endif
195 if (InputFile)
196 {
197 TexPathList.EnsureFileAccessible(InputFile);
198 }
199 if (!InputFile || !OutputFile)
200 isInteractive = TRUE;
201
f6bcfd97
BP
202 int i;
203 for (i = n; i < argc;)
9a29912f
JS
204 {
205 if (strcmp(argv[i], "-winhelp") == 0)
206 {
207 i ++;
208 convertMode = TEX_RTF;
209 winHelp = TRUE;
210 }
211#ifndef NO_GUI
212 else if (strcmp(argv[i], "-interactive") == 0)
213 {
214 i ++;
215 isInteractive = TRUE;
216 }
217#endif
218 else if (strcmp(argv[i], "-sync") == 0) // Don't yield
219 {
220 i ++;
221 isSync = TRUE;
222 }
223 else if (strcmp(argv[i], "-rtf") == 0)
224 {
225 i ++;
226 convertMode = TEX_RTF;
227 }
228 else if (strcmp(argv[i], "-html") == 0)
229 {
230 i ++;
231 convertMode = TEX_HTML;
232 }
233 else if (strcmp(argv[i], "-xlp") == 0)
234 {
235 i ++;
236 convertMode = TEX_XLP;
237 }
238 else if (strcmp(argv[i], "-twice") == 0)
239 {
240 i ++;
241 runTwice = TRUE;
242 }
243 else if (strcmp(argv[i], "-macros") == 0)
244 {
245 i ++;
246 if (i < argc)
247 {
248 MacroFile = copystring(argv[i]);
249 i ++;
250 }
251 }
252 else if (strcmp(argv[i], "-bufsize") == 0)
253 {
254 i ++;
255 if (i < argc)
256 {
257 BufSize = atoi(argv[i]);
258 i ++;
259 }
260 }
261 else if (strcmp(argv[i], "-charset") == 0)
262 {
263 i ++;
264 if (i < argc)
265 {
266 char *s = argv[i];
267 i ++;
268 if (strcmp(s, "ansi") == 0 || strcmp(s, "pc") == 0 || strcmp(s, "mac") == 0 ||
269 strcmp(s, "pca") == 0)
270 RTFCharset = copystring(s);
271 else
272 {
273 OnError("Incorrect argument for -charset");
3f8e5072 274 return FALSE;
9a29912f
JS
275 }
276 }
277 }
fad535ee
GT
278 else if (strcmp(argv[i], "-checkcurleybraces") == 0)
279 {
280 i ++;
281 checkCurleyBraces = TRUE;
282 }
283 else if (strcmp(argv[i], "-checksyntax") == 0)
284 {
285 i ++;
286 checkSyntax = TRUE;
287 }
9a29912f
JS
288 else
289 {
63ad540d
GT
290 wxString buf;
291 buf.Printf("Invalid switch %s.\n", argv[i]);
292 OnError((char *)buf.c_str());
9a29912f
JS
293 i++;
294#ifdef NO_GUI
295 ShowOptions();
296 exit(1);
297#endif
3f8e5072 298 return FALSE;
9a29912f
JS
299 }
300 }
301
302#if defined(__WXMSW__) && !defined(NO_GUI)
303 wxDDEInitialize();
304 Tex2RTFLastStatus[0] = 0; // DDE connection return value
305 TheTex2RTFServer = new Tex2RTFServer;
306 TheTex2RTFServer->Create("TEX2RTF");
307#endif
308
309#if defined(__WXMSW__) && defined(__WIN16__)
310 // Limit to max Windows array size
311 if (BufSize > 64) BufSize = 64;
312#endif
313
314 TexInitialize(BufSize);
315 ResetContentsLevels(0);
316
317#ifndef NO_GUI
318
319 if (isInteractive)
320 {
321 char buf[100];
322
323 // Create the main frame window
324 frame = new MyFrame(NULL, -1, "Tex2RTF", wxPoint(-1, -1), wxSize(400, 300));
325 frame->CreateStatusBar(2);
326
327 // Give it an icon
328 // TODO: uncomment this when we have tex2rtf.xpm
329 frame->SetIcon(wxICON(tex2rtf));
330
331 if (InputFile)
332 {
2b5f62a0 333 sprintf(buf, "Tex2RTF [%s]", wxFileNameFromPath(InputFile));
9a29912f
JS
334 frame->SetTitle(buf);
335 }
336
337 // Make a menubar
338 wxMenu *file_menu = new wxMenu;
339 file_menu->Append(TEX_GO, "&Go", "Run converter");
340 file_menu->Append(TEX_SET_INPUT, "Set &Input File", "Set the LaTeX input file");
341 file_menu->Append(TEX_SET_OUTPUT, "Set &Output File", "Set the output file");
342 file_menu->AppendSeparator();
343 file_menu->Append(TEX_VIEW_LATEX, "View &LaTeX File", "View the LaTeX input file");
344 file_menu->Append(TEX_VIEW_OUTPUT, "View Output &File", "View output file");
345 file_menu->Append(TEX_SAVE_FILE, "&Save log file", "Save displayed text into file");
346 file_menu->AppendSeparator();
347 file_menu->Append(TEX_QUIT, "E&xit", "Exit Tex2RTF");
348
349 wxMenu *macro_menu = new wxMenu;
350
351 macro_menu->Append(TEX_LOAD_CUSTOM_MACROS, "&Load Custom Macros", "Load custom LaTeX macro file");
352 macro_menu->Append(TEX_VIEW_CUSTOM_MACROS, "View &Custom Macros", "View custom LaTeX macros");
353
354 wxMenu *mode_menu = new wxMenu;
355
356 mode_menu->Append(TEX_MODE_RTF, "Output linear &RTF", "Wordprocessor-compatible RTF");
357 mode_menu->Append(TEX_MODE_WINHELP, "Output &WinHelp RTF", "WinHelp-compatible RTF");
358 mode_menu->Append(TEX_MODE_HTML, "Output &HTML", "HTML World Wide Web hypertext file");
359 mode_menu->Append(TEX_MODE_XLP, "Output &XLP", "wxHelp hypertext help file");
360
fad535ee
GT
361 wxMenu *options_menu = new wxMenu;
362
363 options_menu->Append(TEX_OPTIONS_CURELY_BRACE, "Curley brace matching", "Checks for mismatched curley braces",TRUE);
364 options_menu->Append(TEX_OPTIONS_SYNTAX_CHECKING, "Syntax checking", "Syntax checking for common errors",TRUE);
365
366 options_menu->Check(TEX_OPTIONS_CURELY_BRACE, checkCurleyBraces);
367 options_menu->Check(TEX_OPTIONS_SYNTAX_CHECKING, checkSyntax);
368
9a29912f
JS
369 wxMenu *help_menu = new wxMenu;
370
371 help_menu->Append(TEX_HELP, "&Help", "Tex2RTF Contents Page");
372 help_menu->Append(TEX_ABOUT, "&About Tex2RTF", "About Tex2RTF");
373
374 menuBar = new wxMenuBar;
375 menuBar->Append(file_menu, "&File");
376 menuBar->Append(macro_menu, "&Macros");
377 menuBar->Append(mode_menu, "&Conversion Mode");
fad535ee 378 menuBar->Append(options_menu, "&Options");
9a29912f
JS
379 menuBar->Append(help_menu, "&Help");
380
381 frame->SetMenuBar(menuBar);
382 frame->textWindow = new wxTextCtrl(frame, -1, "", wxPoint(-1, -1), wxSize(-1, -1), wxTE_READONLY|wxTE_MULTILINE);
383
56d34922 384 (*frame->textWindow) << "Welcome to Tex2RTF.\n";
ffaaaacb 385// ShowOptions();
9a29912f 386
ffaaaacb 387#if wxUSE_HELP
9a29912f
JS
388 HelpInstance = new wxHelpController();
389 HelpInstance->Initialize("tex2rtf");
ffaaaacb 390#endif // wxUSE_HELP
9a29912f
JS
391
392 /*
393 * Read macro/initialisation file
394 *
395 */
ffaaaacb 396
9a29912f
JS
397 wxString path;
398 if ((path = TexPathList.FindValidPath(MacroFile)) != "")
399 ReadCustomMacros((char*) (const char*) path);
400
401 strcpy(buf, "In ");
402
403 if (winHelp && (convertMode == TEX_RTF))
404 strcat(buf, "WinHelp RTF");
405 else if (!winHelp && (convertMode == TEX_RTF))
406 strcat(buf, "linear RTF");
407 else if (convertMode == TEX_HTML) strcat(buf, "HTML");
408 else if (convertMode == TEX_XLP) strcat(buf, "XLP");
409 strcat(buf, " mode.");
410 frame->SetStatusText(buf, 1);
ffaaaacb 411
9a29912f
JS
412 frame->Show(TRUE);
413 return TRUE;
414 }
415 else
416#endif // NO_GUI
417 {
418 /*
419 * Read macro/initialisation file
420 *
421 */
ffaaaacb 422
9a29912f
JS
423 wxString path;
424 if ((path = TexPathList.FindValidPath(MacroFile)) != "")
425 ReadCustomMacros((char*) (const char*) path);
426
427 Go();
3924dd22
GT
428 if (runTwice)
429 {
430 Go();
431 }
9a29912f
JS
432#ifdef NO_GUI
433 return 0;
434#else
435 return NULL;
436#endif
437 }
438
439#ifndef NO_GUI
440 // Return the main frame window
441 return TRUE;
442#else
443 return FALSE;
444#endif
445}
446
c4c794e1 447#ifndef NO_GUI
9a29912f
JS
448int MyApp::OnExit()
449{
450 wxNode *node = CustomMacroList.First();
451 while (node)
452 {
453 CustomMacro *macro = (CustomMacro *)node->Data();
454 delete macro;
455 delete node;
456 node = CustomMacroList.First();
457 }
458 MacroDefs.BeginFind();
459 node = MacroDefs.Next();
460 while (node)
461 {
462 TexMacroDef* def = (TexMacroDef*) node->Data();
463 delete def;
464 node = MacroDefs.Next();
465 }
466 MacroDefs.Clear();
467#ifdef __WXMSW__
468 delete TheTex2RTFServer;
23016fdd 469 wxDDECleanUp();
9a29912f 470#endif
ffaaaacb
VZ
471
472#if wxUSE_HELP
9a29912f 473 delete HelpInstance;
ffaaaacb 474#endif // wxUSE_HELP
9a29912f 475
71599f0a
GT
476 if (BigBuffer)
477 {
478 delete BigBuffer;
479 BigBuffer = NULL;
480 }
481 if (currentArgData)
482 {
483 delete currentArgData;
484 currentArgData = NULL;
485 }
486 if (TexFileRoot)
487 {
488 delete TexFileRoot;
489 TexFileRoot = NULL;
490 }
491 if (TexBibName)
492 {
493 delete TexBibName;
494 TexBibName = NULL;
495 }
496 if (TexTmpBibName)
497 {
498 delete TexTmpBibName;
499 TexTmpBibName = NULL;
500 }
501 if (FileRoot)
502 {
503 delete FileRoot;
504 FileRoot = NULL;
505 }
506 if (ContentsName)
507 {
508 delete ContentsName;
509 ContentsName = NULL;
510 }
511 if (TmpContentsName)
512 {
513 delete TmpContentsName;
514 TmpContentsName = NULL;
515 }
516 if (TmpFrameContentsName)
517 {
518 delete TmpFrameContentsName;
519 TmpFrameContentsName = NULL;
520 }
521 if (WinHelpContentsFileName)
522 {
523 delete WinHelpContentsFileName;
524 WinHelpContentsFileName = NULL;
525 }
ad781c23 526 if (RefFileName)
71599f0a 527 {
ad781c23
GD
528 delete RefFileName;
529 RefFileName = NULL;
71599f0a
GT
530 }
531 if (TopLevel)
532 {
533 delete TopLevel;
534 TopLevel = NULL;
535 }
536 if (MacroFile)
537 {
538 delete MacroFile;
539 MacroFile = NULL;
540 }
541 if (RTFCharset)
542 {
543 delete RTFCharset;
544 RTFCharset = NULL;
545 }
546
3924dd22
GT
547 delete [] PageStyle;
548 delete [] BibliographyStyleString;
549 delete [] DocumentStyleString;
550 delete [] bitmapMethod;
551 delete [] backgroundColourString;
552 delete [] ContentsNameString;
553 delete [] AbstractNameString;
554 delete [] GlossaryNameString;
555 delete [] ReferencesNameString;
556 delete [] FiguresNameString;
557 delete [] TablesNameString;
558 delete [] FigureNameString;
559 delete [] TableNameString;
560 delete [] IndexNameString;
561 delete [] ChapterNameString;
562 delete [] SectionNameString;
563 delete [] SubsectionNameString;
564 delete [] SubsubsectionNameString;
565 delete [] UpNameString;
566 if (winHelpTitle)
567 delete[] winHelpTitle;
568
9a29912f
JS
569 // TODO: this simulates zero-memory leaks!
570 // Otherwise there are just too many...
12a44087 571#ifndef __WXGTK__
fad535ee 572#if (defined(__WXDEBUG__) && wxUSE_MEMORY_TRACING) || wxUSE_DEBUG_CONTEXT
9a29912f 573 wxDebugContext::SetCheckpoint();
fad535ee 574#endif
12a44087 575#endif
9a29912f
JS
576
577 return 0;
578}
c4c794e1 579#endif
9a29912f
JS
580void ShowOptions(void)
581{
582 char buf[100];
583 sprintf(buf, "Tex2RTF version %.2f", versionNo);
584 OnInform(buf);
585 OnInform("Usage: tex2rtf [input] [output] [switches]\n");
586 OnInform("where valid switches are");
610c6ded 587#ifndef NO_GUI
9a29912f 588 OnInform(" -interactive");
610c6ded 589#endif
9a29912f
JS
590 OnInform(" -bufsize <size in K>");
591 OnInform(" -charset <pc | pca | ansi | mac> (default ansi)");
592 OnInform(" -twice");
593 OnInform(" -sync");
8efab359
VZ
594 OnInform(" -checkcurleybraces");
595 OnInform(" -checksyntax");
9a29912f
JS
596 OnInform(" -macros <filename>");
597 OnInform(" -winhelp");
598 OnInform(" -rtf");
599 OnInform(" -html");
600 OnInform(" -xlp\n");
601}
602
603#ifndef NO_GUI
604
605BEGIN_EVENT_TABLE(MyFrame, wxFrame)
606 EVT_CLOSE(MyFrame::OnCloseWindow)
607 EVT_MENU(TEX_QUIT, MyFrame::OnExit)
608 EVT_MENU(TEX_GO, MyFrame::OnGo)
609 EVT_MENU(TEX_SET_INPUT, MyFrame::OnSetInput)
610 EVT_MENU(TEX_SET_OUTPUT, MyFrame::OnSetOutput)
611 EVT_MENU(TEX_SAVE_FILE, MyFrame::OnSaveFile)
612 EVT_MENU(TEX_VIEW_LATEX, MyFrame::OnViewLatex)
613 EVT_MENU(TEX_VIEW_OUTPUT, MyFrame::OnViewOutput)
614 EVT_MENU(TEX_VIEW_CUSTOM_MACROS, MyFrame::OnShowMacros)
615 EVT_MENU(TEX_LOAD_CUSTOM_MACROS, MyFrame::OnLoadMacros)
616 EVT_MENU(TEX_MODE_RTF, MyFrame::OnModeRTF)
617 EVT_MENU(TEX_MODE_WINHELP, MyFrame::OnModeWinHelp)
618 EVT_MENU(TEX_MODE_HTML, MyFrame::OnModeHTML)
619 EVT_MENU(TEX_MODE_XLP, MyFrame::OnModeXLP)
fad535ee
GT
620 EVT_MENU(TEX_OPTIONS_CURELY_BRACE, MyFrame::OnOptionsCurleyBrace)
621 EVT_MENU(TEX_OPTIONS_SYNTAX_CHECKING, MyFrame::OnOptionsSyntaxChecking)
9a29912f
JS
622 EVT_MENU(TEX_HELP, MyFrame::OnHelp)
623 EVT_MENU(TEX_ABOUT, MyFrame::OnAbout)
624END_EVENT_TABLE()
625
626// My frame constructor
627MyFrame::MyFrame(wxFrame *frame, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size):
628 wxFrame(frame, id, title, pos, size)
629{}
630
631void MyFrame::OnCloseWindow(wxCloseEvent& event)
632{
633 if (!stopRunning && !OkToClose)
634 {
635 stopRunning = TRUE;
636 runTwice = FALSE;
637 return;
638 }
639 else if (OkToClose)
640 {
9a29912f
JS
641 this->Destroy();
642 }
643}
644
645void MyFrame::OnExit(wxCommandEvent& event)
646{
71599f0a
GT
647 Close();
648// this->Destroy();
9a29912f
JS
649}
650
651void MyFrame::OnGo(wxCommandEvent& event)
652{
f6bcfd97 653 passNumber = 1;
63ad540d 654 errorCount = 0;
9a29912f
JS
655 menuBar->EnableTop(0, FALSE);
656 menuBar->EnableTop(1, FALSE);
657 menuBar->EnableTop(2, FALSE);
658 menuBar->EnableTop(3, FALSE);
659 textWindow->Clear();
660 Tex2RTFYield(TRUE);
661 Go();
662
04b9c5bb
GT
663 if (stopRunning)
664 {
665 SetStatusText("Build aborted!");
666 wxString errBuf;
667 errBuf.Printf("\nErrors encountered during this pass: %lu\n", errorCount);
668 OnInform((char *)errBuf.c_str());
669 }
670
671
672 if (runTwice && !stopRunning)
9a29912f
JS
673 {
674 Tex2RTFYield(TRUE);
675 Go();
676 }
677 menuBar->EnableTop(0, TRUE);
678 menuBar->EnableTop(1, TRUE);
679 menuBar->EnableTop(2, TRUE);
680 menuBar->EnableTop(3, TRUE);
681}
682
683void MyFrame::OnSetInput(wxCommandEvent& event)
684{
685 ChooseInputFile(TRUE);
686}
687
688void MyFrame::OnSetOutput(wxCommandEvent& event)
689{
690 ChooseOutputFile(TRUE);
691}
692
693void MyFrame::OnSaveFile(wxCommandEvent& event)
694{
695 wxString s = wxFileSelector("Save text to file", "", "", "txt", "*.txt");
696 if (s != "")
697 {
698 textWindow->SaveFile(s);
699 char buf[350];
700 sprintf(buf, "Saved text to %s", (const char*) s);
701 frame->SetStatusText(buf, 0);
702 }
703}
704
705void MyFrame::OnViewOutput(wxCommandEvent& event)
706{
707 ChooseOutputFile();
708 if (OutputFile && wxFileExists(OutputFile))
709 {
710 textWindow->LoadFile(OutputFile);
711 char buf[300];
712 wxString str(wxFileNameFromPath(OutputFile));
713 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
714 frame->SetTitle(buf);
715 }
716}
717
718void MyFrame::OnViewLatex(wxCommandEvent& event)
719{
720 ChooseInputFile();
721 if (InputFile && wxFileExists(InputFile))
722 {
723 textWindow->LoadFile(InputFile);
724 char buf[300];
725 wxString str(wxFileNameFromPath(OutputFile));
726 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
727 frame->SetTitle(buf);
728 }
729}
730
731void MyFrame::OnLoadMacros(wxCommandEvent& event)
732{
733 textWindow->Clear();
734 wxString s = wxFileSelector("Choose custom macro file", wxPathOnly(MacroFile), wxFileNameFromPath(MacroFile), "ini", "*.ini");
735 if (s != "" && wxFileExists(s))
736 {
737 MacroFile = copystring(s);
738 ReadCustomMacros((char*) (const char*) s);
739 ShowCustomMacros();
740 }
741}
742
743void MyFrame::OnShowMacros(wxCommandEvent& event)
744{
745 textWindow->Clear();
746 Tex2RTFYield(TRUE);
747 ShowCustomMacros();
748}
749
750void MyFrame::OnModeRTF(wxCommandEvent& event)
751{
752 convertMode = TEX_RTF;
753 winHelp = FALSE;
754 InputFile = NULL;
755 OutputFile = NULL;
756 SetStatusText("In linear RTF mode.", 1);
757}
758
759void MyFrame::OnModeWinHelp(wxCommandEvent& event)
760{
761 convertMode = TEX_RTF;
762 winHelp = TRUE;
763 InputFile = NULL;
764 OutputFile = NULL;
765 SetStatusText("In WinHelp RTF mode.", 1);
766}
767
768void MyFrame::OnModeHTML(wxCommandEvent& event)
769{
770 convertMode = TEX_HTML;
771 winHelp = FALSE;
772 InputFile = NULL;
773 OutputFile = NULL;
774 SetStatusText("In HTML mode.", 1);
775}
776
777void MyFrame::OnModeXLP(wxCommandEvent& event)
778{
779 convertMode = TEX_XLP;
780 InputFile = NULL;
781 OutputFile = NULL;
782 SetStatusText("In XLP mode.", 1);
783}
784
fad535ee
GT
785void MyFrame::OnOptionsCurleyBrace(wxCommandEvent& event)
786{
787 checkCurleyBraces = !checkCurleyBraces;
788 if (checkCurleyBraces)
789 {
790 SetStatusText("Checking curley braces: YES", 1);
791 }
792 else
793 {
794 SetStatusText("Checking curley braces: NO", 1);
795 }
796}
797
798
799void MyFrame::OnOptionsSyntaxChecking(wxCommandEvent& event)
800{
801 checkSyntax = !checkSyntax;
802 if (checkSyntax)
803 {
804 SetStatusText("Checking syntax: YES", 1);
805 }
806 else
807 {
808 SetStatusText("Checking syntax: NO", 1);
809 }
810}
811
812
9a29912f
JS
813void MyFrame::OnHelp(wxCommandEvent& event)
814{
ffaaaacb 815#if wxUSE_HELP
9a29912f
JS
816 HelpInstance->LoadFile();
817 HelpInstance->DisplayContents();
ffaaaacb 818#endif // wxUSE_HELP
9a29912f
JS
819}
820
821void MyFrame::OnAbout(wxCommandEvent& event)
822{
823 char buf[300];
824#ifdef __WIN32__
825 char *platform = " (32-bit)";
826#else
827#ifdef __WXMSW__
828 char *platform = " (16-bit)";
829#else
830 char *platform = "";
831#endif
832#endif
56d34922 833 sprintf(buf, "Tex2RTF Version %.2f%s\nLaTeX to RTF, WinHelp, and HTML Conversion\n\n(c) Julian Smart, George Tasker and others, 1999-2002", versionNo, platform);
9a29912f
JS
834 wxMessageBox(buf, "About Tex2RTF");
835}
836
837void ChooseInputFile(bool force)
838{
839 if (force || !InputFile)
840 {
841 wxString s = wxFileSelector("Choose LaTeX input file", wxPathOnly(InputFile), wxFileNameFromPath(InputFile), "tex", "*.tex");
842 if (s != "")
843 {
844 // Different file, so clear index entries.
845 ClearKeyWordTable();
846 ResetContentsLevels(0);
847 passNumber = 1;
63ad540d
GT
848 errorCount = 0;
849
9a29912f
JS
850 InputFile = copystring(s);
851 wxString str = wxFileNameFromPath(InputFile);
63ad540d
GT
852 wxString buf;
853 buf.Printf("Tex2RTF [%s]", str.c_str());
854 frame->SetTitle((char *)buf.c_str());
9a29912f
JS
855 OutputFile = NULL;
856 }
857 }
858}
859
860void ChooseOutputFile(bool force)
861{
862 char extensionBuf[10];
863 char wildBuf[10];
864 strcpy(wildBuf, "*.");
aed0ed3c 865 wxString path;
9a29912f
JS
866 if (OutputFile)
867 path = wxPathOnly(OutputFile);
868 else if (InputFile)
869 path = wxPathOnly(InputFile);
ffaaaacb 870
9a29912f
JS
871 switch (convertMode)
872 {
873 case TEX_RTF:
874 {
875 strcpy(extensionBuf, "rtf");
876 strcat(wildBuf, "rtf");
877 break;
878 }
879 case TEX_XLP:
880 {
881 strcpy(extensionBuf, "xlp");
882 strcat(wildBuf, "xlp");
883 break;
884 }
885 case TEX_HTML:
886 {
887#if defined(__WXMSW__) && defined(__WIN16__)
888 strcpy(extensionBuf, "htm");
889 strcat(wildBuf, "htm");
890#else
891 strcpy(extensionBuf, "html");
892 strcat(wildBuf, "html");
893#endif
894 break;
895 }
896 }
897 if (force || !OutputFile)
898 {
899 wxString s = wxFileSelector("Choose output file", path, wxFileNameFromPath(OutputFile),
900 extensionBuf, wildBuf);
901 if (s != "")
902 OutputFile = copystring(s);
903 }
904}
905#endif
906
907bool Go(void)
908{
909#ifndef NO_GUI
910 ChooseInputFile();
911 ChooseOutputFile();
912#endif
913
04b9c5bb 914 if (!InputFile || !OutputFile || stopRunning)
9a29912f
JS
915 return FALSE;
916
917#ifndef NO_GUI
918 if (isInteractive)
919 {
920 char buf[300];
921 wxString str = wxFileNameFromPath(InputFile);
922
923 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
924 frame->SetTitle(buf);
925 }
926
927 wxStartTimer();
928#endif
929
930 // Find extension-less filename
931 strcpy(FileRoot, OutputFile);
932 StripExtension(FileRoot);
933
934 if (truncateFilenames && convertMode == TEX_HTML)
935 {
936 // Truncate to five characters. This ensures that
937 // we can generate DOS filenames such as thing999. But 1000 files
938 // may not be enough, of course...
939 char* sName = wxFileNameFromPath( FileRoot); // this Julian's method is non-destructive reference
940
941 if(sName)
942 if(strlen( sName) > 5)
943 sName[5] = '\0'; // that should do!
944 }
ffaaaacb 945
9a29912f
JS
946 sprintf(ContentsName, "%s.con", FileRoot);
947 sprintf(TmpContentsName, "%s.cn1", FileRoot);
948 sprintf(TmpFrameContentsName, "%s.frc", FileRoot);
949 sprintf(WinHelpContentsFileName, "%s.cnt", FileRoot);
ad781c23 950 sprintf(RefFileName, "%s.ref", FileRoot);
9a29912f
JS
951
952 TexPathList.EnsureFileAccessible(InputFile);
953 if (!bulletFile)
954 {
955 wxString s = TexPathList.FindValidPath("bullet.bmp");
956 if (s != "")
957 {
958 wxString str = wxFileNameFromPath(s);
959 bulletFile = copystring(str);
960 }
961 }
962
ad781c23
GD
963 if (wxFileExists(RefFileName))
964 ReadTexReferences(RefFileName);
ffaaaacb 965
9a29912f
JS
966 bool success = FALSE;
967
968 if (InputFile && OutputFile)
969 {
2b5f62a0 970 if (!wxFileExists(InputFile))
9a29912f
JS
971 {
972 OnError("Cannot open input file!");
973 TexCleanUp();
974 return FALSE;
975 }
976#ifndef NO_GUI
977 if (isInteractive)
978 {
63ad540d 979 wxString buf;
fad535ee 980 buf.Printf("Working, pass %d...Click CLOSE to abort", passNumber);
63ad540d 981 frame->SetStatusText((char *)buf.c_str());
9a29912f
JS
982 }
983#endif
984 OkToClose = FALSE;
985 OnInform("Reading LaTeX file...");
986 TexLoadFile(InputFile);
987
04b9c5bb 988 if (stopRunning)
e4941e3d
GT
989 {
990 OkToClose = TRUE;
04b9c5bb 991 return FALSE;
e4941e3d 992 }
04b9c5bb 993
9a29912f
JS
994 switch (convertMode)
995 {
996 case TEX_RTF:
997 {
998 success = RTFGo();
999 break;
1000 }
1001 case TEX_XLP:
1002 {
1003 success = XLPGo();
1004 break;
1005 }
1006 case TEX_HTML:
1007 {
1008 success = HTMLGo();
1009 break;
1010 }
1011 }
1012 }
1013 if (stopRunning)
1014 {
1015 OnInform("*** Aborted by user.");
1016 success = FALSE;
1017 stopRunning = FALSE;
e4941e3d 1018 OkToClose = TRUE;
9a29912f
JS
1019 }
1020
1021 if (success)
1022 {
ad781c23 1023 WriteTexReferences(RefFileName);
9a29912f
JS
1024 TexCleanUp();
1025 startedSections = FALSE;
1026
63ad540d 1027 wxString buf;
9a29912f
JS
1028#ifndef NO_GUI
1029 long tim = wxGetElapsedTime();
63ad540d
GT
1030 buf.Printf("Finished PASS #%d in %ld seconds.\n", passNumber, (long)(tim/1000.0));
1031 OnInform((char *)buf.c_str());
1032
1033 if (errorCount)
1034 {
1035 buf.Printf("Errors encountered during this pass: %lu\n", errorCount);
1036 OnInform((char *)buf.c_str());
1037 }
1038
9a29912f
JS
1039 if (isInteractive)
1040 {
63ad540d
GT
1041 buf.Printf("Done, %d %s.", passNumber, (passNumber > 1) ? "passes" : "pass");
1042 frame->SetStatusText((char *)buf.c_str());
9a29912f
JS
1043 }
1044#else
63ad540d
GT
1045 buf.Printf("Done, %d %s.", passNumber, (passNumber > 1) ? "passes" : "pass");
1046 OnInform((char *)buf.c_str());
1047 if (errorCount)
1048 {
1049 buf.Printf("Errors encountered during this pass: %lu\n", errorCount);
1050 OnInform((char *)buf.c_str());
1051 }
9a29912f
JS
1052#endif
1053 passNumber ++;
63ad540d 1054 errorCount = 0;
9a29912f
JS
1055 OkToClose = TRUE;
1056 return TRUE;
1057 }
1058
1059 TexCleanUp();
1060 startedSections = FALSE;
1061
8efab359 1062#ifndef NO_GUI
fad535ee 1063 frame->SetStatusText("Aborted by user.");
8efab359 1064#endif // GUI
fad535ee 1065
9a29912f
JS
1066 OnInform("Sorry, unsuccessful.");
1067 OkToClose = TRUE;
1068 return FALSE;
1069}
1070
4538b3f1 1071void OnError(const char *msg)
9a29912f 1072{
63ad540d
GT
1073 errorCount++;
1074
9a29912f 1075#ifdef NO_GUI
219f4a6d
GD
1076 wxSTD cerr << "Error: " << msg << "\n";
1077 wxSTD cerr.flush();
9a29912f 1078#else
3f8e5072 1079 if (isInteractive && frame)
9a29912f
JS
1080 (*frame->textWindow) << "Error: " << msg << "\n";
1081 else
1082#ifdef __UNIX__
1083 {
219f4a6d
GD
1084 wxSTD cerr << "Error: " << msg << "\n";
1085 wxSTD cerr.flush();
9a29912f
JS
1086 }
1087#endif
63ad540d 1088
9a29912f 1089#ifdef __WXMSW__
11611a62 1090 wxLogError(msg);
9a29912f
JS
1091#endif
1092 Tex2RTFYield(TRUE);
1093#endif // NO_GUI
1094}
1095
4538b3f1 1096void OnInform(const char *msg)
9a29912f
JS
1097{
1098#ifdef NO_GUI
219f4a6d
GD
1099 wxSTD cout << msg << "\n";
1100 wxSTD cout.flush();
9a29912f 1101#else
3f8e5072 1102 if (isInteractive && frame)
9a29912f 1103 (*frame->textWindow) << msg << "\n";
fad535ee
GT
1104/* This whole block of code is just wrong I think. It would behave
1105 completely wrong under anything other than MSW due to the ELSE
1106 with no statement, and the cout calls would fail under MSW, as
1107 the code in this block is compiled if !NO_GUI This code has been
1108 here since v1.1 of this file too. - gt
9a29912f
JS
1109 else
1110#ifdef __WXMSW__
1111 {
219f4a6d
GD
1112 wxSTD cout << msg << "\n";
1113 wxSTD cout.flush();
9a29912f
JS
1114 }
1115#endif
1116#ifdef __WXMSW__
1117 {}
1118#endif
fad535ee 1119*/
9a29912f
JS
1120 if (isInteractive)
1121 {
1122 Tex2RTFYield(TRUE);
1123 }
1124#endif // NO_GUI
1125}
1126
1127void OnMacro(int macroId, int no_args, bool start)
1128{
1129 switch (convertMode)
1130 {
1131 case TEX_RTF:
1132 {
1133 RTFOnMacro(macroId, no_args, start);
1134 break;
1135 }
1136 case TEX_XLP:
1137 {
1138 XLPOnMacro(macroId, no_args, start);
1139 break;
1140 }
1141 case TEX_HTML:
1142 {
1143 HTMLOnMacro(macroId, no_args, start);
1144 break;
1145 }
1146 }
1147}
1148
1149bool OnArgument(int macroId, int arg_no, bool start)
1150{
1151 switch (convertMode)
1152 {
1153 case TEX_RTF:
1154 {
1155 return RTFOnArgument(macroId, arg_no, start);
1156 break;
1157 }
1158 case TEX_XLP:
1159 {
1160 return XLPOnArgument(macroId, arg_no, start);
1161 break;
1162 }
1163 case TEX_HTML:
1164 {
1165 return HTMLOnArgument(macroId, arg_no, start);
1166 break;
1167 }
1168 }
1169 return TRUE;
1170}
1171
1172/*
1173 * DDE Stuff
1174 */
1175#if defined(__WXMSW__) && !defined(NO_GUI)
1176
1177/*
1178 * Server
1179 */
1180
1181wxConnectionBase *Tex2RTFServer::OnAcceptConnection(const wxString& topic)
1182{
1183 if (topic == "TEX2RTF")
1184 {
1185 if (!ipc_buffer)
1186 ipc_buffer = new char[1000];
ffaaaacb 1187
9a29912f
JS
1188 return new Tex2RTFConnection(ipc_buffer, 4000);
1189 }
1190 else
1191 return NULL;
1192}
1193
1194 /*
1195 * Connection
1196 */
ffaaaacb 1197
9a29912f
JS
1198Tex2RTFConnection::Tex2RTFConnection(char *buf, int size):wxDDEConnection(buf, size)
1199{
1200}
1201
1202Tex2RTFConnection::~Tex2RTFConnection(void)
1203{
1204}
1205
1206bool SplitCommand(char *data, char *firstArg, char *secondArg)
1207{
1208 firstArg[0] = 0;
1209 secondArg[0] = 0;
1210 int i = 0;
1211 int len = strlen(data);
1212 bool stop = FALSE;
1213 // Find first argument (command name)
1214 while (!stop)
1215 {
1216 if (data[i] == ' ' || data[i] == 0)
1217 stop = TRUE;
1218 else
1219 {
1220 firstArg[i] = data[i];
1221 i ++;
1222 }
1223 }
1224 firstArg[i] = 0;
1225 if (data[i] == ' ')
1226 {
1227 // Find second argument
1228 i ++;
1229 int j = 0;
1230 while (data[i] != 0)
1231 {
1232 secondArg[j] = data[i];
1233 i ++;
1234 j ++;
1235 }
1236 secondArg[j] = 0;
1237 }
1238 return TRUE;
1239}
1240
1241bool Tex2RTFConnection::OnExecute(const wxString& topic, char *data, int size, int format)
1242{
1243 strcpy(Tex2RTFLastStatus, "OK");
1244
1245 char firstArg[50];
1246 char secondArg[300];
1247 if (SplitCommand(data, firstArg, secondArg))
1248 {
1249 bool hasArg = (strlen(secondArg) > 0);
1250 if (strcmp(firstArg, "INPUT") == 0 && hasArg)
1251 {
1252 if (InputFile) delete[] InputFile;
1253 InputFile = copystring(secondArg);
1254 if (frame)
1255 {
1256 char buf[100];
1257 wxString str = wxFileNameFromPath(InputFile);
1258 sprintf(buf, "Tex2RTF [%s]", (const char*) str);
1259 frame->SetTitle(buf);
1260 }
1261 }
1262 else if (strcmp(firstArg, "OUTPUT") == 0 && hasArg)
1263 {
1264 if (OutputFile) delete[] OutputFile;
1265 OutputFile = copystring(secondArg);
1266 }
1267 else if (strcmp(firstArg, "GO") == 0)
1268 {
1269 strcpy(Tex2RTFLastStatus, "WORKING");
1270 if (!Go())
1271 strcpy(Tex2RTFLastStatus, "CONVERSION ERROR");
1272 else
1273 strcpy(Tex2RTFLastStatus, "OK");
1274 }
1275 else if (strcmp(firstArg, "EXIT") == 0)
1276 {
e3065973 1277 if (frame) frame->Close();
9a29912f
JS
1278 }
1279 else if (strcmp(firstArg, "MINIMIZE") == 0 || strcmp(firstArg, "ICONIZE") == 0)
1280 {
1281 if (frame)
1282 frame->Iconize(TRUE);
1283 }
1284 else if (strcmp(firstArg, "SHOW") == 0 || strcmp(firstArg, "RESTORE") == 0)
1285 {
1286 if (frame)
1287 {
1288 frame->Iconize(FALSE);
1289 frame->Show(TRUE);
1290 }
1291 }
1292 else
1293 {
1294 // Try for a setting
1295 strcpy(Tex2RTFLastStatus, RegisterSetting(firstArg, secondArg, FALSE));
1296#ifndef NO_GUI
1297 if (frame && strcmp(firstArg, "conversionMode") == 0)
1298 {
1299 char buf[100];
1300 strcpy(buf, "In ");
1301
1302 if (winHelp && (convertMode == TEX_RTF))
1303 strcat(buf, "WinHelp RTF");
1304 else if (!winHelp && (convertMode == TEX_RTF))
1305 strcat(buf, "linear RTF");
1306 else if (convertMode == TEX_HTML) strcat(buf, "HTML");
1307 else if (convertMode == TEX_XLP) strcat(buf, "XLP");
1308 strcat(buf, " mode.");
1309 frame->SetStatusText(buf, 1);
1310 }
1311#endif
1312 }
1313 }
1314 return TRUE;
1315}
1316
1317char *Tex2RTFConnection::OnRequest(const wxString& topic, const wxString& item, int *size, int format)
1318{
1319 return Tex2RTFLastStatus;
1320}
1321
1322#endif
1323
c4c794e1 1324#ifndef NO_GUI
17867d61 1325#ifndef __WXGTK__
dd107c50 1326//void wxObject::Dump(wxSTD ostream& str)
7cf496bf
RS
1327//{
1328// if (GetClassInfo() && GetClassInfo()->GetClassName())
1329// str << GetClassInfo()->GetClassName();
1330// else
1331// str << "unknown object class";
1332//}
1333#endif
17867d61 1334#endif