git-svn-id: svn://10.65.10.50/branches/R_10_00@23289 c028cbd2-c16b-5b4b-a496-9718f37d4682
1212 lines
28 KiB
C++
1212 lines
28 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: xlputils.cpp
|
|
// Purpose: Converts Latex to obsolete XLP format
|
|
// Author: Julian Smart
|
|
// Modified by: Wlodzimiez ABX Skiba 2003/2004 Unicode support
|
|
// Ron Lee
|
|
// Created: 7.9.93
|
|
// RCS-ID: $Id: xlputils.cpp 35650 2005-09-23 12:56:45Z MR $
|
|
// Copyright: (c) Julian Smart
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#ifndef WX_PRECOMP
|
|
#endif
|
|
|
|
#include "tex2any.h"
|
|
#include "tex2rtf.h"
|
|
#include <ctype.h>
|
|
|
|
#if !WXWIN_COMPATIBILITY_2_4
|
|
static inline wxChar* copystring(const wxChar* s)
|
|
{ return wxStrcpy(new wxChar[wxStrlen(s) + 1], s); }
|
|
#endif
|
|
|
|
long currentBlockId = -1;
|
|
static TexChunk *descriptionItemArg = NULL;
|
|
static int indentLevel = 0;
|
|
static int noColumns = 0;
|
|
static int currentTab = 0;
|
|
static bool tableVerticalLineLeft = false;
|
|
static bool tableVerticalLineRight = false;
|
|
static bool inTable = false;
|
|
static int citeCount = 1;
|
|
wxList hyperLinks(wxKEY_INTEGER);
|
|
wxList hyperLabels(wxKEY_STRING);
|
|
FILE *Index = NULL;
|
|
|
|
|
|
extern wxHashTable TexReferences;
|
|
|
|
|
|
void PadToTab(int tabPos)
|
|
{
|
|
int currentCol = GetCurrentColumn();
|
|
for (int i = currentCol; i < tabPos; i++)
|
|
TexOutput(_T(" "), true);
|
|
}
|
|
|
|
static long xlpBlockId = 0;
|
|
long NewBlockId(void)
|
|
{
|
|
return xlpBlockId ++;
|
|
}
|
|
|
|
// Called on start/end of macro examination
|
|
void XLPOnMacro(int macroId, int no_args, bool start)
|
|
{
|
|
wxChar buf[100];
|
|
switch (macroId)
|
|
{
|
|
case ltCHAPTER:
|
|
case ltCHAPTERSTAR:
|
|
case ltCHAPTERHEADING:
|
|
{
|
|
if (!start)
|
|
{
|
|
sectionNo = 0;
|
|
figureNo = 0;
|
|
subsectionNo = 0;
|
|
subsubsectionNo = 0;
|
|
if (macroId != ltCHAPTERSTAR)
|
|
chapterNo ++;
|
|
|
|
SetCurrentOutputs(Contents, Chapters);
|
|
long id1 = NewBlockId();
|
|
currentBlockId = NewBlockId();
|
|
|
|
startedSections = true;
|
|
wxFprintf(Contents, _T("\\hy-%d{%ld}{"), hyBLOCK_SMALL_HEADING, id1);
|
|
wxFprintf(Chapters, _T("\n\\hy-%d{%ld}{"), hyBLOCK_LARGE_VISIBLE_SECTION, currentBlockId);
|
|
wxFprintf(Index, _T("%ld %ld\n"), id1, currentBlockId);
|
|
|
|
OutputCurrentSection(); // Repeat section header
|
|
|
|
wxFprintf(Contents, _T("}\n\n"));
|
|
wxFprintf(Chapters, _T("}\n\n"));
|
|
SetCurrentOutput(Chapters);
|
|
wxChar *topicName = FindTopicName(GetNextChunk());
|
|
hyperLabels.Append(topicName, (wxObject *)currentBlockId);
|
|
}
|
|
break;
|
|
}
|
|
case ltSECTION:
|
|
case ltSECTIONSTAR:
|
|
case ltSECTIONHEADING:
|
|
case ltGLOSS:
|
|
{
|
|
if (!start)
|
|
{
|
|
subsectionNo = 0;
|
|
subsubsectionNo = 0;
|
|
|
|
if (macroId != ltSECTIONSTAR)
|
|
sectionNo ++;
|
|
|
|
SetCurrentOutputs(Chapters, Sections);
|
|
long id1 = NewBlockId();
|
|
currentBlockId = NewBlockId();
|
|
|
|
startedSections = true;
|
|
|
|
if (DocumentStyle == LATEX_ARTICLE)
|
|
wxFprintf(Contents, _T("\\hy-%d{%ld}{"), hyBLOCK_LARGE_HEADING, id1);
|
|
else
|
|
wxFprintf(Chapters, _T("\\hy-%d{%ld}{"), hyBLOCK_BOLD, id1);
|
|
wxFprintf(Sections, _T("\n\\hy-%d{%ld}{"), hyBLOCK_LARGE_VISIBLE_SECTION, currentBlockId);
|
|
wxFprintf(Index, _T("%ld %ld\n"), id1, currentBlockId);
|
|
|
|
OutputCurrentSection(); // Repeat section header
|
|
|
|
if (DocumentStyle == LATEX_ARTICLE)
|
|
wxFprintf(Contents, _T("}\n\n"));
|
|
else
|
|
wxFprintf(Chapters, _T("}\n\n"));
|
|
wxFprintf(Sections, _T("}\n\n"));
|
|
SetCurrentOutput(Sections);
|
|
wxChar *topicName = FindTopicName(GetNextChunk());
|
|
hyperLabels.Append(topicName, (wxObject *)currentBlockId);
|
|
}
|
|
break;
|
|
}
|
|
case ltSUBSECTION:
|
|
case ltSUBSECTIONSTAR:
|
|
case ltMEMBERSECTION:
|
|
case ltFUNCTIONSECTION:
|
|
{
|
|
if (!start)
|
|
{
|
|
subsubsectionNo = 0;
|
|
|
|
if (macroId != ltSUBSECTIONSTAR)
|
|
subsectionNo ++;
|
|
|
|
SetCurrentOutputs(Sections, Subsections);
|
|
long id1 = NewBlockId();
|
|
currentBlockId = NewBlockId();
|
|
wxFprintf(Sections, _T("\\hy-%d{%ld}{"), hyBLOCK_BOLD, id1);
|
|
wxFprintf(Subsections, _T("\n\\hy-%d{%ld}{"), hyBLOCK_LARGE_VISIBLE_SECTION, currentBlockId);
|
|
wxFprintf(Index, _T("%ld %ld\n"), id1, currentBlockId);
|
|
|
|
OutputCurrentSection(); // Repeat section header
|
|
|
|
wxFprintf(Sections, _T("}\n\n"));
|
|
wxFprintf(Subsections, _T("}\n\n"));
|
|
SetCurrentOutput(Subsections);
|
|
wxChar *topicName = FindTopicName(GetNextChunk());
|
|
hyperLabels.Append(topicName, (wxObject *)currentBlockId);
|
|
}
|
|
break;
|
|
}
|
|
case ltSUBSUBSECTION:
|
|
case ltSUBSUBSECTIONSTAR:
|
|
{
|
|
if (!start)
|
|
{
|
|
if (macroId != ltSUBSUBSECTIONSTAR)
|
|
subsubsectionNo ++;
|
|
|
|
SetCurrentOutputs(Subsections, Subsubsections);
|
|
long id1 = NewBlockId();
|
|
currentBlockId = NewBlockId();
|
|
wxFprintf(Subsections, _T("\\hy-%d{%ld}{"), hyBLOCK_BOLD, id1);
|
|
wxFprintf(Subsubsections, _T("\n\\hy-%d{%ld}{"), hyBLOCK_LARGE_VISIBLE_SECTION, currentBlockId);
|
|
wxFprintf(Index, _T("%ld %ld\n"), id1, currentBlockId);
|
|
|
|
OutputCurrentSection(); // Repeat section header
|
|
|
|
wxFprintf(Subsections, _T("}\n\n"));
|
|
wxFprintf(Subsubsections, _T("}\n\n"));
|
|
SetCurrentOutput(Subsubsections);
|
|
wxChar *topicName = FindTopicName(GetNextChunk());
|
|
hyperLabels.Append(topicName, (wxObject *)currentBlockId);
|
|
}
|
|
break;
|
|
}
|
|
case ltFUNC:
|
|
case ltPFUNC:
|
|
case ltMEMBER:
|
|
{
|
|
SetCurrentOutput(Subsections);
|
|
if (start)
|
|
{
|
|
long id = NewBlockId();
|
|
wxFprintf(Subsections, _T("\\hy-%d{%ld}{"), hyBLOCK_BOLD, id);
|
|
}
|
|
else
|
|
wxFprintf(Subsections, _T("}"));
|
|
break;
|
|
}
|
|
case ltVOID:
|
|
// if (start)
|
|
// TexOutput(_T("void"), true);
|
|
break;
|
|
case ltBACKSLASHCHAR:
|
|
if (start)
|
|
TexOutput(_T("\n"), true);
|
|
break;
|
|
case ltPAR:
|
|
{
|
|
if (start)
|
|
{
|
|
if (ParSkip > 0)
|
|
TexOutput(_T("\n"), true);
|
|
TexOutput(_T("\n"), true);
|
|
}
|
|
break;
|
|
}
|
|
case ltRMFAMILY:
|
|
case ltTEXTRM:
|
|
case ltRM:
|
|
{
|
|
break;
|
|
}
|
|
case ltTEXTBF:
|
|
case ltBFSERIES:
|
|
case ltBF:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar buf[100];
|
|
long id = NewBlockId();
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_BOLD, id);
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}"));
|
|
break;
|
|
}
|
|
case ltTEXTIT:
|
|
case ltITSHAPE:
|
|
case ltIT:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar buf[100];
|
|
long id = NewBlockId();
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_ITALIC, id);
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}"));
|
|
break;
|
|
}
|
|
case ltTTFAMILY:
|
|
case ltTEXTTT:
|
|
case ltTT:
|
|
{
|
|
if (start)
|
|
{
|
|
long id = NewBlockId();
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_TELETYPE, id);
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}"));
|
|
break;
|
|
}
|
|
case ltSMALL:
|
|
{
|
|
if (start)
|
|
{
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_SMALL_TEXT, NewBlockId());
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}"));
|
|
break;
|
|
}
|
|
case ltTINY:
|
|
{
|
|
if (start)
|
|
{
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_SMALL_TEXT, NewBlockId());
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}"));
|
|
break;
|
|
}
|
|
case ltNORMALSIZE:
|
|
{
|
|
if (start)
|
|
{
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_NORMAL, NewBlockId());
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}"));
|
|
break;
|
|
}
|
|
case ltlarge:
|
|
{
|
|
if (start)
|
|
{
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_SMALL_HEADING, NewBlockId());
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}\n"));
|
|
break;
|
|
}
|
|
case ltLARGE:
|
|
{
|
|
if (start)
|
|
{
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_LARGE_HEADING, NewBlockId());
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}\n"));
|
|
break;
|
|
}
|
|
case ltITEMIZE:
|
|
case ltENUMERATE:
|
|
case ltDESCRIPTION:
|
|
case ltTWOCOLLIST:
|
|
{
|
|
if (start)
|
|
{
|
|
// tabCount ++;
|
|
|
|
// if (indentLevel > 0)
|
|
// TexOutput(_T("\\par\\par\n"));
|
|
indentLevel ++;
|
|
int listType;
|
|
if (macroId == ltENUMERATE)
|
|
listType = LATEX_ENUMERATE;
|
|
else if (macroId == ltITEMIZE)
|
|
listType = LATEX_ITEMIZE;
|
|
else
|
|
listType = LATEX_DESCRIPTION;
|
|
itemizeStack.Insert(new ItemizeStruc(listType));
|
|
|
|
}
|
|
else
|
|
{
|
|
indentLevel --;
|
|
|
|
if (itemizeStack.GetFirst())
|
|
{
|
|
ItemizeStruc *struc = (ItemizeStruc *)itemizeStack.GetFirst()->GetData();
|
|
delete struc;
|
|
delete itemizeStack.GetFirst();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ltITEM:
|
|
{
|
|
wxNode *node = itemizeStack.GetFirst();
|
|
if (node)
|
|
{
|
|
ItemizeStruc *struc = (ItemizeStruc *)node->GetData();
|
|
if (!start)
|
|
{
|
|
struc->currentItem += 1;
|
|
wxChar indentBuf[30];
|
|
|
|
switch (struc->listType)
|
|
{
|
|
case LATEX_ENUMERATE:
|
|
{
|
|
wxSnprintf(indentBuf, sizeof(indentBuf), _T("\\hy-%d{%ld}{%d.} "),
|
|
hyBLOCK_BOLD, NewBlockId(), struc->currentItem);
|
|
TexOutput(indentBuf);
|
|
break;
|
|
}
|
|
case LATEX_ITEMIZE:
|
|
{
|
|
wxSnprintf(indentBuf, sizeof(indentBuf), _T("\\hy-%d{%ld}{o} "),
|
|
hyBLOCK_BOLD, NewBlockId());
|
|
TexOutput(indentBuf);
|
|
break;
|
|
}
|
|
default:
|
|
case LATEX_DESCRIPTION:
|
|
{
|
|
if (descriptionItemArg)
|
|
{
|
|
wxSnprintf(indentBuf, sizeof(indentBuf), _T("\\hy-%d{%ld}{"),
|
|
hyBLOCK_BOLD, NewBlockId());
|
|
TexOutput(indentBuf);
|
|
TraverseChildrenFromChunk(descriptionItemArg);
|
|
TexOutput(_T("} "));
|
|
descriptionItemArg = NULL;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ltMAKETITLE:
|
|
{
|
|
if (start && DocumentTitle && DocumentAuthor)
|
|
{
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_LARGE_HEADING, NewBlockId());
|
|
TexOutput(buf);
|
|
TraverseChildrenFromChunk(DocumentTitle);
|
|
TexOutput(_T("}\n\n"));
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_SMALL_HEADING, NewBlockId());
|
|
TexOutput(buf);
|
|
TraverseChildrenFromChunk(DocumentAuthor);
|
|
TexOutput(_T("}\n\n"));
|
|
if (DocumentDate)
|
|
{
|
|
TraverseChildrenFromChunk(DocumentDate);
|
|
TexOutput(_T("\n"));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ltTABLEOFCONTENTS:
|
|
{
|
|
if (start)
|
|
{
|
|
FILE *fd = wxFopen(ContentsName, _T("r"));
|
|
if (fd)
|
|
{
|
|
int ch = getc(fd);
|
|
while (ch != EOF)
|
|
{
|
|
wxPutc(ch, Chapters);
|
|
ch = getc(fd);
|
|
}
|
|
fclose(fd);
|
|
}
|
|
else
|
|
{
|
|
TexOutput(_T("RUN TEX2RTF AGAIN FOR CONTENTS PAGE\n"));
|
|
OnInform(_T("Run Tex2RTF again to include contents page."));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
case ltHARDY:
|
|
{
|
|
if (start)
|
|
TexOutput(_T("HARDY"), true);
|
|
break;
|
|
}
|
|
case ltWXCLIPS:
|
|
{
|
|
if (start)
|
|
TexOutput(_T("wxCLIPS"), true);
|
|
break;
|
|
}
|
|
case ltVERBATIM:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar buf[100];
|
|
long id = NewBlockId();
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_TELETYPE, id);
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}"));
|
|
break;
|
|
}
|
|
case ltHRULE:
|
|
{
|
|
if (start)
|
|
{
|
|
TexOutput(_T("\n------------------------------------------------------------------"), true);
|
|
}
|
|
break;
|
|
}
|
|
case ltHLINE:
|
|
{
|
|
if (start)
|
|
{
|
|
TexOutput(_T("--------------------------------------------------------------------------------"), true);
|
|
}
|
|
break;
|
|
}
|
|
case ltSPECIALAMPERSAND:
|
|
{
|
|
if (start)
|
|
{
|
|
currentTab ++;
|
|
int tabPos = (80/noColumns)*currentTab;
|
|
PadToTab(tabPos);
|
|
}
|
|
break;
|
|
}
|
|
case ltTABULAR:
|
|
case ltSUPERTABULAR:
|
|
{
|
|
if (start)
|
|
{
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_TELETYPE, NewBlockId());
|
|
TexOutput(buf);
|
|
}
|
|
else
|
|
TexOutput(_T("}"));
|
|
break;
|
|
}
|
|
case ltNUMBEREDBIBITEM:
|
|
{
|
|
if (!start)
|
|
TexOutput(_T("\n\n"), true);
|
|
break;
|
|
}
|
|
case ltCAPTION:
|
|
case ltCAPTIONSTAR:
|
|
{
|
|
if (start)
|
|
{
|
|
figureNo ++;
|
|
|
|
wxChar figBuf[40];
|
|
if (DocumentStyle != LATEX_ARTICLE)
|
|
wxSnprintf(figBuf, sizeof(figBuf), _T("Figure %d.%d: "), chapterNo, figureNo);
|
|
else
|
|
wxSnprintf(figBuf, sizeof(figBuf), _T("Figure %d: "), figureNo);
|
|
|
|
TexOutput(figBuf);
|
|
}
|
|
else
|
|
{
|
|
wxChar *topicName = FindTopicName(GetNextChunk());
|
|
|
|
AddTexRef(topicName, NULL, NULL,
|
|
((DocumentStyle != LATEX_ARTICLE) ? chapterNo : figureNo),
|
|
((DocumentStyle != LATEX_ARTICLE) ? figureNo : 0));
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
DefaultOnMacro(macroId, no_args, start);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool XLPOnArgument(int macroId, int arg_no, bool start)
|
|
{
|
|
wxChar buf[300];
|
|
switch (macroId)
|
|
{
|
|
case ltCHAPTER:
|
|
case ltCHAPTERSTAR:
|
|
case ltCHAPTERHEADING:
|
|
case ltSECTION:
|
|
case ltSECTIONSTAR:
|
|
case ltSECTIONHEADING:
|
|
case ltSUBSECTION:
|
|
case ltSUBSECTIONSTAR:
|
|
case ltSUBSUBSECTION:
|
|
case ltSUBSUBSECTIONSTAR:
|
|
case ltGLOSS:
|
|
case ltMEMBERSECTION:
|
|
case ltFUNCTIONSECTION:
|
|
{
|
|
if (!start && (arg_no == 1))
|
|
currentSection = GetArgChunk();
|
|
return false;
|
|
}
|
|
case ltFUNC:
|
|
{
|
|
if (!start && (arg_no == 1))
|
|
TexOutput(_T(" "), true);
|
|
if (start && (arg_no == 3))
|
|
TexOutput(_T("("), true);
|
|
if (!start && (arg_no == 3))
|
|
TexOutput(_T(")"), true);
|
|
break;
|
|
}
|
|
case ltPFUNC:
|
|
{
|
|
if (!start && (arg_no == 1))
|
|
TexOutput(_T(" "), true);
|
|
|
|
if (start && (arg_no == 2))
|
|
TexOutput(_T("(*"), true);
|
|
if (!start && (arg_no == 2))
|
|
TexOutput(_T(")"), true);
|
|
|
|
if (start && (arg_no == 3))
|
|
TexOutput(_T("("), true);
|
|
if (!start && (arg_no == 3))
|
|
TexOutput(_T(")"), true);
|
|
break;
|
|
}
|
|
case ltCLIPSFUNC:
|
|
{
|
|
if (!start && (arg_no == 1))
|
|
TexOutput(_T(" "), true);
|
|
if (start && (arg_no == 2))
|
|
{
|
|
TexOutput(_T("("), true);
|
|
long id = NewBlockId();
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_BOLD, id);
|
|
TexOutput(buf);
|
|
}
|
|
if (!start && (arg_no == 2))
|
|
{
|
|
TexOutput(_T("}"));
|
|
}
|
|
if (!start && (arg_no == 3))
|
|
TexOutput(_T(")"), true);
|
|
break;
|
|
}
|
|
case ltPARAM:
|
|
{
|
|
if (start && (arg_no == 2))
|
|
{
|
|
long id = NewBlockId();
|
|
wxSnprintf(buf, sizeof(buf), _T(" \\hy-%d{%ld}{"), hyBLOCK_BOLD, id);
|
|
TexOutput(buf);
|
|
}
|
|
if (!start && (arg_no == 2))
|
|
{
|
|
TexOutput(_T("}"));
|
|
}
|
|
break;
|
|
}
|
|
case ltCPARAM:
|
|
{
|
|
if (start && (arg_no == 2))
|
|
{
|
|
long id = NewBlockId();
|
|
wxSnprintf(buf, sizeof(buf), _T(" \\hy-%d{%ld}{"), hyBLOCK_BOLD, id);
|
|
TexOutput(buf);
|
|
}
|
|
if (!start && (arg_no == 2))
|
|
{
|
|
TexOutput(_T("}"));
|
|
}
|
|
break;
|
|
}
|
|
case ltMEMBER:
|
|
{
|
|
if (!start && (arg_no == 1))
|
|
TexOutput(_T(" "), true);
|
|
break;
|
|
}
|
|
case ltLABEL:
|
|
{
|
|
return false;
|
|
}
|
|
case ltREF:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *sec = NULL;
|
|
|
|
wxChar *refName = GetArgData();
|
|
if (refName)
|
|
{
|
|
TexRef *texRef = FindReference(refName);
|
|
if (texRef)
|
|
{
|
|
sec = texRef->sectionNumber;
|
|
}
|
|
}
|
|
if (sec)
|
|
{
|
|
TexOutput(sec);
|
|
}
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
case ltHELPREF:
|
|
case ltHELPREFN:
|
|
case ltPOPREF:
|
|
{
|
|
if (arg_no == 1)
|
|
{
|
|
if (start)
|
|
{
|
|
currentBlockId = NewBlockId();
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{"), hyBLOCK_RED_ITALIC, currentBlockId);
|
|
TexOutput(buf);
|
|
}
|
|
else TexOutput(_T("}"));
|
|
}
|
|
if (arg_no == 2)
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *label = GetArgData();
|
|
hyperLinks.Append(currentBlockId, (wxObject *)copystring(label));
|
|
}
|
|
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
case ltURLREF:
|
|
{
|
|
if (arg_no == 1)
|
|
{
|
|
return true;
|
|
}
|
|
else if (arg_no == 2)
|
|
{
|
|
if (start)
|
|
TexOutput(_T(" ("));
|
|
else
|
|
TexOutput(_T(")"));
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
case ltITEM:
|
|
{
|
|
if (start && IsArgOptional())
|
|
{
|
|
descriptionItemArg = GetArgChunk();
|
|
return false;
|
|
}
|
|
break;
|
|
}
|
|
case ltTABULAR:
|
|
case ltSUPERTABULAR:
|
|
{
|
|
if (arg_no == 1)
|
|
{
|
|
if (start)
|
|
{
|
|
inTable = true;
|
|
tableVerticalLineLeft = false;
|
|
tableVerticalLineRight = false;
|
|
|
|
wxChar *alignString = copystring(GetArgData());
|
|
|
|
// Count the number of columns
|
|
noColumns = 0;
|
|
int len = wxStrlen(alignString);
|
|
if (len > 0)
|
|
{
|
|
if (alignString[0] == '|')
|
|
tableVerticalLineLeft = true;
|
|
if (alignString[len-1] == '|')
|
|
tableVerticalLineRight = true;
|
|
}
|
|
|
|
for (int i = 0; i < len; i++)
|
|
if (isalpha(alignString[i]))
|
|
noColumns ++;
|
|
|
|
/*
|
|
// Experimental
|
|
TexOutput(_T("\\brdrt\\brdrs"));
|
|
if (tableVerticalLineLeft)
|
|
TexOutput(_T("\\brdrl\\brdrs"));
|
|
if (tableVerticalLineRight)
|
|
TexOutput(_T("\\brdrr\\brdrs"));
|
|
*/
|
|
|
|
// Calculate a rough size for each column
|
|
// int tabPos = 80/noColumns;
|
|
currentTab = 0;
|
|
|
|
return false;
|
|
}
|
|
}
|
|
else if (arg_no == 2 && !start)
|
|
{
|
|
inTable = false;
|
|
}
|
|
else if (arg_no == 2 && start)
|
|
return true;
|
|
break;
|
|
}
|
|
case ltMARGINPAR:
|
|
case ltMARGINPAREVEN:
|
|
case ltMARGINPARODD:
|
|
case ltNORMALBOX:
|
|
case ltNORMALBOXD:
|
|
{
|
|
if (start)
|
|
{
|
|
TexOutput(_T("----------------------------------------------------------------------\n"), true);
|
|
return true;
|
|
}
|
|
else
|
|
TexOutput(_T("\n----------------------------------------------------------------------\n"), true);
|
|
break;
|
|
}
|
|
case ltBIBITEM:
|
|
{
|
|
wxChar buf[100];
|
|
if (arg_no == 1 && start)
|
|
{
|
|
wxChar *citeKey = GetArgData();
|
|
TexRef *ref = (TexRef *)TexReferences.Get(citeKey);
|
|
if (ref)
|
|
{
|
|
if (ref->sectionNumber) delete[] ref->sectionNumber;
|
|
wxSnprintf(buf, sizeof(buf), _T("[%d]"), citeCount);
|
|
ref->sectionNumber = copystring(buf);
|
|
}
|
|
|
|
wxSnprintf(buf, sizeof(buf), _T("\\hy-%d{%ld}{[%d]} "), hyBLOCK_BOLD, NewBlockId(), citeCount);
|
|
TexOutput(buf);
|
|
citeCount ++;
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
case ltTHEBIBLIOGRAPHY:
|
|
{
|
|
if (start && (arg_no == 1))
|
|
{
|
|
citeCount = 1;
|
|
|
|
SetCurrentOutput(Chapters);
|
|
|
|
SetCurrentOutputs(Contents, Chapters);
|
|
long id1 = NewBlockId();
|
|
long id2 = NewBlockId();
|
|
wxFprintf(Contents, _T("\\hy-%d{%ld}{%s}\n"), hyBLOCK_SMALL_HEADING, id1, ReferencesNameString);
|
|
wxFprintf(Chapters, _T("\\hy-%d{%ld}{%s}\n\n\n"), hyBLOCK_LARGE_VISIBLE_SECTION, id2, ReferencesNameString);
|
|
wxFprintf(Index, _T("%ld %ld\n"), id1, id2);
|
|
|
|
SetCurrentOutput(Chapters);
|
|
return false;
|
|
}
|
|
if (!start && (arg_no == 2))
|
|
{
|
|
}
|
|
return true;
|
|
}
|
|
case ltTWOCOLITEM:
|
|
case ltTWOCOLITEMRULED:
|
|
{
|
|
if (start && (arg_no == 2))
|
|
TexOutput(_T("\n "));
|
|
|
|
if (!start && (arg_no == 2))
|
|
TexOutput(_T("\n"));
|
|
return true;
|
|
}
|
|
/*
|
|
* Accents
|
|
*
|
|
*/
|
|
case ltACCENT_GRAVE:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *val = GetArgData();
|
|
if (val)
|
|
{
|
|
switch (val[0])
|
|
{
|
|
case _T('a'):
|
|
TexOutput(_T("a"));
|
|
break;
|
|
case _T('e'):
|
|
TexOutput(_T("e"));
|
|
break;
|
|
case _T('i'):
|
|
TexOutput(_T("i"));
|
|
break;
|
|
case _T('o'):
|
|
TexOutput(_T("o"));
|
|
break;
|
|
case _T('u'):
|
|
TexOutput(_T("u"));
|
|
break;
|
|
case _T('A'):
|
|
TexOutput(_T("a"));
|
|
break;
|
|
case _T('E'):
|
|
TexOutput(_T("E"));
|
|
break;
|
|
case _T('I'):
|
|
TexOutput(_T("I"));
|
|
break;
|
|
case _T('O'):
|
|
TexOutput(_T("O"));
|
|
break;
|
|
case _T('U'):
|
|
TexOutput(_T("U"));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
case ltACCENT_ACUTE:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *val = GetArgData();
|
|
if (val)
|
|
{
|
|
switch (val[0])
|
|
{
|
|
case _T('a'):
|
|
TexOutput(_T("a"));
|
|
break;
|
|
case _T('e'):
|
|
TexOutput(_T("e"));
|
|
break;
|
|
case _T('i'):
|
|
TexOutput(_T("i"));
|
|
break;
|
|
case _T('o'):
|
|
TexOutput(_T("o"));
|
|
break;
|
|
case _T('u'):
|
|
TexOutput(_T("u"));
|
|
break;
|
|
case _T('y'):
|
|
TexOutput(_T("y"));
|
|
break;
|
|
case _T('A'):
|
|
TexOutput(_T("A"));
|
|
break;
|
|
case _T('E'):
|
|
TexOutput(_T("E"));
|
|
break;
|
|
case _T('I'):
|
|
TexOutput(_T("I"));
|
|
break;
|
|
case _T('O'):
|
|
TexOutput(_T("O"));
|
|
break;
|
|
case _T('U'):
|
|
TexOutput(_T("U"));
|
|
break;
|
|
case _T('Y'):
|
|
TexOutput(_T("Y"));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
case ltACCENT_CARET:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *val = GetArgData();
|
|
if (val)
|
|
{
|
|
switch (val[0])
|
|
{
|
|
case _T('a'):
|
|
TexOutput(_T("a"));
|
|
break;
|
|
case _T('e'):
|
|
TexOutput(_T("e"));
|
|
break;
|
|
case _T('i'):
|
|
TexOutput(_T("i"));
|
|
break;
|
|
case _T('o'):
|
|
TexOutput(_T("o"));
|
|
break;
|
|
case _T('u'):
|
|
TexOutput(_T("u"));
|
|
break;
|
|
case _T('A'):
|
|
TexOutput(_T("A"));
|
|
break;
|
|
case _T('E'):
|
|
TexOutput(_T("E"));
|
|
break;
|
|
case _T('I'):
|
|
TexOutput(_T("I"));
|
|
break;
|
|
case _T('O'):
|
|
TexOutput(_T("O"));
|
|
break;
|
|
case _T('U'):
|
|
TexOutput(_T("U"));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
case ltACCENT_TILDE:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *val = GetArgData();
|
|
if (val)
|
|
{
|
|
switch (val[0])
|
|
{
|
|
case _T('a'):
|
|
TexOutput(_T("a"));
|
|
break;
|
|
case _T(' '):
|
|
TexOutput(_T("~"));
|
|
break;
|
|
case _T('n'):
|
|
TexOutput(_T("n"));
|
|
break;
|
|
case _T('o'):
|
|
TexOutput(_T("o"));
|
|
break;
|
|
case _T('A'):
|
|
TexOutput(_T("A"));
|
|
break;
|
|
case _T('N'):
|
|
TexOutput(_T("N"));
|
|
break;
|
|
case _T('O'):
|
|
TexOutput(_T("O"));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
case ltACCENT_UMLAUT:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *val = GetArgData();
|
|
if (val)
|
|
{
|
|
switch (val[0])
|
|
{
|
|
case _T('a'):
|
|
TexOutput(_T("a"));
|
|
break;
|
|
case _T('e'):
|
|
TexOutput(_T("e"));
|
|
break;
|
|
case _T('i'):
|
|
TexOutput(_T("i"));
|
|
break;
|
|
case _T('o'):
|
|
TexOutput(_T("o"));
|
|
break;
|
|
case _T('u'):
|
|
TexOutput(_T("u"));
|
|
break;
|
|
case _T('y'):
|
|
TexOutput(_T("y"));
|
|
break;
|
|
case _T('A'):
|
|
TexOutput(_T("A"));
|
|
break;
|
|
case _T('E'):
|
|
TexOutput(_T("E"));
|
|
break;
|
|
case _T('I'):
|
|
TexOutput(_T("I"));
|
|
break;
|
|
case _T('O'):
|
|
TexOutput(_T("O"));
|
|
break;
|
|
case _T('U'):
|
|
TexOutput(_T("U"));
|
|
break;
|
|
case _T('Y'):
|
|
TexOutput(_T("Y"));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
case ltACCENT_DOT:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *val = GetArgData();
|
|
if (val)
|
|
{
|
|
switch (val[0])
|
|
{
|
|
case _T('a'):
|
|
TexOutput(_T("a"));
|
|
break;
|
|
case _T('A'):
|
|
TexOutput(_T("A"));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
case ltACCENT_CADILLA:
|
|
{
|
|
if (start)
|
|
{
|
|
wxChar *val = GetArgData();
|
|
if (val)
|
|
{
|
|
switch (val[0])
|
|
{
|
|
case _T('c'):
|
|
TexOutput(_T("c"));
|
|
break;
|
|
case _T('C'):
|
|
TexOutput(_T("C"));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
default:
|
|
{
|
|
return DefaultOnArgument(macroId, arg_no, start);
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool XLPGo(void)
|
|
{
|
|
xlpBlockId = 0;
|
|
|
|
if (!InputFile.empty() && !OutputFile.empty())
|
|
{
|
|
Contents = wxFopen(TmpContentsName, _T("w"));
|
|
Chapters = wxFopen(_T("chapters.xlp"), _T("w"));
|
|
Sections = wxFopen(_T("sections.xlp"), _T("w"));
|
|
Subsections = wxFopen(_T("subsections.xlp"), _T("w"));
|
|
Subsubsections = wxFopen(_T("subsubsections.xlp"), _T("w"));
|
|
Index = wxFopen(_T("index.xlp"), _T("w"));
|
|
|
|
// Insert invisible section marker at beginning
|
|
wxFprintf(Chapters, _T("\\hy-%d{%ld}{%s}\n"),
|
|
hyBLOCK_INVISIBLE_SECTION, NewBlockId(), _T("\n"));
|
|
|
|
wxFprintf(Contents, _T("\\hy-%d{%ld}{%s}\n\n"),
|
|
// hyBLOCK_LARGE_HEADING, NewBlockId(), "\n\n%s\n\n", ContentsNameString);
|
|
hyBLOCK_LARGE_HEADING, NewBlockId(), ContentsNameString);
|
|
|
|
SetCurrentOutput(Chapters);
|
|
|
|
wxFprintf(Index, _T("\n\\hyindex{\n\"%s\"\n"),
|
|
contentsString ? contentsString : _T("WXHELPCONTENTS"));
|
|
TraverseDocument();
|
|
|
|
wxNode *node = hyperLinks.GetFirst();
|
|
while (node)
|
|
{
|
|
long from = node->GetKeyInteger();
|
|
wxChar *label = (wxChar *)node->GetData();
|
|
wxNode *otherNode = hyperLabels.Find(label);
|
|
if (otherNode)
|
|
{
|
|
long to = (long)otherNode->GetData();
|
|
wxFprintf(Index, _T("%ld %ld\n"), from, to);
|
|
}
|
|
node = node->GetNext();
|
|
}
|
|
|
|
wxFprintf(Index, _T("}\n"));
|
|
|
|
fclose(Contents); Contents = NULL;
|
|
fclose(Chapters); Chapters = NULL;
|
|
fclose(Sections); Sections = NULL;
|
|
fclose(Subsections); Subsections = NULL;
|
|
fclose(Subsubsections); Subsubsections = NULL;
|
|
fclose(Index); Index = NULL;
|
|
|
|
if (wxFileExists(ContentsName)) wxRemoveFile(ContentsName);
|
|
|
|
if (!wxRenameFile(TmpContentsName, ContentsName))
|
|
{
|
|
wxCopyFile(TmpContentsName, ContentsName);
|
|
wxRemoveFile(TmpContentsName);
|
|
}
|
|
|
|
wxConcatFiles(_T("chapters.xlp"), _T("sections.xlp"), _T("tmp2.xlp"));
|
|
wxConcatFiles(_T("tmp2.xlp"), _T("subsections.xlp"), _T("tmp1.xlp"));
|
|
wxConcatFiles(_T("tmp1.xlp"), _T("subsubsections.xlp"), _T("tmp2.xlp"));
|
|
wxConcatFiles(_T("tmp2.xlp"), _T("index.xlp"), OutputFile);
|
|
|
|
wxRemoveFile(_T("tmp1.xlp"));
|
|
wxRemoveFile(_T("tmp2.xlp"));
|
|
|
|
wxRemoveFile(_T("chapters.xlp"));
|
|
wxRemoveFile(_T("sections.xlp"));
|
|
wxRemoveFile(_T("subsections.xlp"));
|
|
wxRemoveFile(_T("subsubsections.xlp"));
|
|
wxRemoveFile(_T("index.xlp"));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|