* new feature: regular expressions (based on posix regex)

* bugfix: based on regex, \labels inside sections/chapters etc
          are now correctly handled (ie, html-anchors above <h1> etc)
* improved layout for pkgdesc
This commit is contained in:
Andreas Meyer 2006-04-11 22:08:32 +00:00
parent 64a4aba329
commit 3e9da694df
11 changed files with 321 additions and 76 deletions

2
.gitattributes vendored
View File

@ -1056,6 +1056,8 @@ Manual_tools/src/latex_converter_config/gif/cc_wp.gif -text svneol=unset#unset
Manual_tools/src/latex_converter_config/gif/cc_wr.gif -text svneol=unset#unset Manual_tools/src/latex_converter_config/gif/cc_wr.gif -text svneol=unset#unset
Manual_tools/src/latex_converter_config/gif/cc_zeta.gif -text svneol=unset#unset Manual_tools/src/latex_converter_config/gif/cc_zeta.gif -text svneol=unset#unset
Manual_tools/src/mstring.doc -text Manual_tools/src/mstring.doc -text
Manual_tools/src/regex++.C -text
Manual_tools/src/regex_dictionary.C -text
Manual_tools/sty/eps_tabs/cc_Class.eps -text Manual_tools/sty/eps_tabs/cc_Class.eps -text
Manual_tools/sty/eps_tabs/cc_Class.pdf -text svneol=unset#unset Manual_tools/sty/eps_tabs/cc_Class.pdf -text svneol=unset#unset
Manual_tools/sty/eps_tabs/cc_Concept.eps -text Manual_tools/sty/eps_tabs/cc_Concept.eps -text

View File

@ -136,7 +136,9 @@ OBJHTML = lexer.o \
cpp_formatting.o \ cpp_formatting.o \
input.o \ input.o \
output.o \ output.o \
cc_extract_html.o cc_extract_html.o \
regex++.o \
regex_dictionary.o
OBJIMAGES = cc_extract_images_lexer.C cc_extract_images.o OBJIMAGES = cc_extract_images_lexer.C cc_extract_images.o

View File

@ -27,6 +27,8 @@
#include <sstream> #include <sstream>
#include <cassert> #include <cassert>
#include <regex_dictionary.h>
#include <map> #include <map>
typedef std::map< string, string, Case_insensitive_string_greater_than > String_map; typedef std::map< string, string, Case_insensitive_string_greater_than > String_map;
@ -1082,9 +1084,9 @@ string // macro
handle_chapter( const string&, string param[], size_t n, size_t opt) { handle_chapter( const string&, string param[], size_t n, size_t opt) {
NParamCheck( 1, 0); NParamCheck( 1, 0);
push_current_output(); push_current_output();
string chapter_title( param[0]); //string chapter_title( param[0]);
crop_string( chapter_title); //crop_string( chapter_title);
remove_separator( chapter_title); //remove_separator( chapter_title);
string new_main_filename; string new_main_filename;
string new_main_filepath = macroX( "\\lciInputPath"); string new_main_filepath = macroX( "\\lciInputPath");
@ -1345,6 +1347,32 @@ sorted_map_is_empty( const string&, string param[], size_t n, size_t opt) {
} }
/* regular expressions */
string
handle_regex_register( const string&, string param[], size_t n, size_t opt) {
NParamCheck( 2, 0);
regex_register( param[0], param[1] );
return string();
}
string
handle_regex_does_match( const string&, string param[], size_t n, size_t opt) {
NParamCheck( 2, 0);
if( regex_does_match( param[0], param[1] ) )
return string("\\lcTrue");
else
return string("\\lcFalse");
}
string
handle_regex_result( const string&, string param[], size_t n, size_t opt) {
NParamCheck( 1, 0);
unsigned int index = atoi( param[0].c_str() );
return regex_get_submatch(index);
}
// Initialize // Initialize
// ====================================================================== // ======================================================================
void init_internal_macros() { void init_internal_macros() {
@ -1422,7 +1450,7 @@ void init_internal_macros() {
insertInternalGlobalMacro( "\\lciIfFileExists", if_file_exists, 1); insertInternalGlobalMacro( "\\lciIfFileExists", if_file_exists, 1);
insertInternalGlobalMacro( "\\lciCopyFile", copy_file, 2); insertInternalGlobalMacro( "\\lciCopyFile", copy_file, 2);
insertInternalGlobalMacro( "\\lciChapter", handle_chapter, 1); insertInternalGlobalMacro( "\\lciChapter", handle_chapter, 0);
insertInternalGlobalMacro( "\\lciPopOutput", pop_output, 0); insertInternalGlobalMacro( "\\lciPopOutput", pop_output, 0);
insertInternalGlobalMacro( "\\lciPushOutput", push_output, 1); insertInternalGlobalMacro( "\\lciPushOutput", push_output, 1);
@ -1435,6 +1463,10 @@ void init_internal_macros() {
insertInternalGlobalMacro( "\\lciIncludeOnly", handle_include_only, 1); insertInternalGlobalMacro( "\\lciIncludeOnly", handle_include_only, 1);
insertInternalGlobalMacro( "\\lciIfToBeIncluded", handle_to_be_included, 1); insertInternalGlobalMacro( "\\lciIfToBeIncluded", handle_to_be_included, 1);
insertInternalGlobalMacro( "\\lciToHtmlWidth", to_html_width, 1); insertInternalGlobalMacro( "\\lciToHtmlWidth", to_html_width, 1);
insertInternalGlobalMacro( "\\lciRegexRegister", handle_regex_register, 2 );
insertInternalGlobalMacro( "\\lcRegexDoesMatch", handle_regex_does_match, 2 );
insertInternalGlobalMacro( "\\lcRegexResult", handle_regex_result, 1 );
} }
// EOF // // EOF //

View File

@ -32,7 +32,6 @@
\newcommand{\ccAuto}{\lcAuto} \newcommand{\ccAuto}{\lcAuto}
% ########################################################################### % ###########################################################################
% | % |
% | o % | o
@ -987,6 +986,12 @@
\newcommand{\lciFlushPkgDescription}[2]{% \newcommand{\lciFlushPkgDescription}[2]{%
\lciFlushPkgDescriptionX{#X1}{#X2}{\ccValueofPkgName}% \lciFlushPkgDescriptionX{#X1}{#X2}{\ccValueofPkgName}%
} }
\newcommand{\lciCheckForLabelInsideHeadingX}[2]{%
\lciCheckForLabelInsideHeading{#XC1}{#2}{\lciLocalVariableLabel}%
\lciLocalVariableLabel%
}
\newcommand{\lciFlushPkgDescriptionX}[3]{% \newcommand{\lciFlushPkgDescriptionX}[3]{%
\lciIfEmpty{#X3}{}{% \lciIfEmpty{#X3}{}{%
\lciIfEmpty{\lciCurrentPartName}{}{% \lciIfEmpty{\lciCurrentPartName}{}{%
@ -994,24 +999,20 @@
\gdef\lciCurrentPartName{}% \gdef\lciCurrentPartName{}%
}% }%
\lciPushOutput{description}% \lciPushOutput{description}%
\lcRawHtml{<h3>}\ccValueofPkgName\lcRawHtml{</h3>} \lcRawHtml{<tr><td colspan="3">}%
\lcRawHtml{<table><tr valign="top"><td }% \lciCheckForLabelInsideHeadingX{\ccValueofPkgName}{\lciCurrentPackageName}%
%\lciPkgDescriptionIsOddEntry \lcRawHtml{<h3>}\lciCurrentPackageName\lcRawHtml{</h3></td></tr>}
% {\lcRawHtml{ bgcolor="#C0C0C0" }} %\lcRawHtml{<TABLE>}
% {} \lcRawHtml{<tr valign="top"><td width="75\%">}
\lcRawHtml{width="58\%">}
\ccValueofPkgSummary \ccValueofPkgSummary
%\lcRawHtml{</td><td width="4\%">} \lcRawHtml{</td><td width="2\%">}
\lcRawHtml{</td><td }% \lcRawHtml{</td><td width="23\%">}
%\lciPkgDescriptionIsOddEntry
% {}
% {\lcRawHtml{ bgcolor="#C0C0C0" }}
\lcRawHtml{width="38\%">}
\ccValueofPkgMaturity \ccValueofPkgMaturity
\ccValueofPkgDependsOn \ccValueofPkgDependsOn
\ccValueofPkgLicense \ccValueofPkgLicense
\lcRawHtml{<a href="#C1">User Manual</a> &nbsp; <a href="#C2">Reference Manual</a>} \lcRawHtml{<a href="#C1">User Manual</a> &nbsp; <a href="#C2">Reference Manual</a>}
\lcRawHtml{</td></td></table>} \lcRawHtml{</td></td>}
%\lcRawHtml{</table>}
\lciPopOutput% \lciPopOutput%
\gdef\ccValueofPkgName{}% \gdef\ccValueofPkgName{}%
%\lciPkgDescriptionIsOddEntry %\lciPkgDescriptionIsOddEntry
@ -1052,6 +1053,7 @@
\lciSortedMapClear{TocReferenceLinks} \lciSortedMapClear{TocReferenceLinks}
} }
} }
% ___________________________________________________________________________ % ___________________________________________________________________________
% ########################################################################### % ###########################################################################
% | EOF % | EOF

View File

@ -70,8 +70,7 @@ l% ___________________________________________________________________________
% |#########################################################################| % |#########################################################################|
% Load latex_to_html.sty that provides the basic converter capabilities.
% redefined in latex_to_html.sty
\newcommand{\lcFalse}[2]{#2} \newcommand{\lcFalse}[2]{#2}
\newcommand{\lcTrue}[2]{#1} \newcommand{\lcTrue}[2]{#1}
@ -95,6 +94,37 @@ l% ___________________________________________________________________________
\newcommand{\lcStyleFile}[1]{\lciInputStyleFile{\lciConfigPath}{#XC1}} \newcommand{\lcStyleFile}[1]{\lciInputStyleFile{\lciConfigPath}{#XC1}}
\newcommand{\lciInputStyleFile}[2]{\lciInclude{#XC1#C2.sty}} \newcommand{\lciInputStyleFile}[2]{\lciInclude{#XC1#C2.sty}}
} }
% ___________________________________________________________________________
% ###########################################################################
% | Regular Expressions
% ###########################################################################
\newcommand{\lcRegexRegister}[1]{%
\def\lciRegexNameToBeRegistered{#1}%
\lciParseUntilDelimiter{\lciRegexRegisterX}}
\newcommand{\lciRegexRegisterX}[1]{\lciRegexRegisterXX{\lciRegexNameToBeRegistered}{#1}}
\newcommand{\lciRegexRegisterXX}[2]{\lciRegexRegister{#XC1}{#C2}}
\lcRegexRegister{checkforlabel}@(.+)(\\label[^\}]+\})(.*)@
\newcommand{\lciCheckForLabelInsideHeading}[3]{%
\lcRegexDoesMatch{checkforlabel}{#1}{%
% xdef doesnt work, either ..
\gdef#2{\lcRegexResult{1}\lcRegexResult{3}}%
\gdef#3{\lcRegexResult{2}}
}{%
\gdef#2{#1}%
\gdef#3{}%
}%
}%
% Load latex_to_html.sty that provides the basic converter capabilities.
% redefined in latex_to_html.sty
\lcStyleFile{latex_to_html} \lcStyleFile{latex_to_html}
% print own release number % print own release number
@ -196,6 +226,7 @@ l% ___________________________________________________________________________
\lciHtmlFileHeader{Package Description}% \lciHtmlFileHeader{Package Description}%
\lciHtmlNavigationTop \lciHtmlNavigationTop
\lcRawHtml{<H1>Package Description</H1>} \lcRawHtml{<H1>Package Description</H1>}
\lcRawHtml{<table>}
\lciPopOutput% \lciPopOutput%
}{% }{%
% print remaining footnotes at the end of the conversion % print remaining footnotes at the end of the conversion
@ -211,6 +242,7 @@ l% ___________________________________________________________________________
\lciOpenTmpFile{\lciIndexHeader}\lciIndexFileHeader\lciCloseFile \lciOpenTmpFile{\lciIndexHeader}\lciIndexFileHeader\lciCloseFile
\lciOpenTmpFile{\lciIndexFooter}\lciIndexFileFooter\lciCloseFile \lciOpenTmpFile{\lciIndexFooter}\lciIndexFileFooter\lciCloseFile
\lciPushOutput{description}% \lciPushOutput{description}%
\lcRawHtml{</table>}
\lciHtmlNavigationBottom \lciHtmlNavigationBottom
\lciHtmlFileFooter% \lciHtmlFileFooter%
\lciPopOutput% \lciPopOutput%
@ -1087,14 +1119,18 @@ l% ___________________________________________________________________________
\gdef{\lciIfHtmlLinks}{\lcTrue}% \gdef{\lciIfHtmlLinks}{\lcTrue}%
\gdef{\lciIfHtmlIndex}{\lcTrue}% \gdef{\lciIfHtmlIndex}{\lcTrue}%
\refstepcounter{chapter}% \refstepcounter{chapter}%
\lciChapter{#1}% does also a PushOutput
\lciCheckForLabelInsideHeading{#1}%
{\lciLocalVariableChapterNameTOC}%
{\lciLocalVariableLabel}%
\lciChapter% does also a PushOutput
% cross linking rules % cross linking rules
\lciPushOutput{anchor}% \lciPushOutput{anchor}%
\lcRawHtml{i Next_chapter_link_}\value{part}\_\value{chapter}% \lcRawHtml{i Next_chapter_link_}\value{part}\_\value{chapter}%
\lcRawHtml{ <div class="NavNext"><hr> Next chapter: <a href="}% \lcRawHtml{ <div class="NavNext"><hr> Next chapter: <a href="}%
\lcRawHtmlExpanded{\lciReplaceWithCurrentPathToken}% \lcRawHtmlExpanded{\lciReplaceWithCurrentPathToken}%
\lcRawHtmlExpanded{\lciOutputBasename}% \lcRawHtmlExpanded{\lciOutputBasename}%
\lcRawHtml{">}#1\lcRawHtml{</a> \lcRawHtml{">}\lciLocalVariableChapterNameTOC\lcRawHtml{</a>
}% }%
\lcRawHtml{i Up_chapter_link_}\value{part}\_\value{chapter}% \lcRawHtml{i Up_chapter_link_}\value{part}\_\value{chapter}%
\lcRawHtml{ <a href="}% \lcRawHtml{ <a href="}%
@ -1111,14 +1147,14 @@ l% ___________________________________________________________________________
% however, setting this to a default of TRUE at the beginning of each % however, setting this to a default of TRUE at the beginning of each
% chapter seems safe. % chapter seems safe.
% file header % file header
\lciHtmlFileHeader{#1}% \lciHtmlFileHeader{\lciLocalVariableChapterNameTOC}%
\lciHtmlNavigationTop \lciHtmlNavigationTop
\lciIfLessExpanded{\lciCountersecnumdepth}{0}% \lciIfLessExpanded{\lciCountersecnumdepth}{0}%
{% {%
\lciHtmlChapterToc{\thechapter}{#1}% \lciHtmlChapterToc{\thechapter}{\lciLocalVariableChapterNameTOC}%
\lciHtmlChapterHeader{#2}% \lciHtmlChapterHeader{#2}%
}{% }{%
\lciHtmlChapterToc{\thechapter}{\thechapter~~~#1}% \lciHtmlChapterToc{\thechapter}{\thechapter~~~\lciLocalVariableChapterNameTOC}%
\lciHtmlChapterHeader{Chapter \thechapter\\#2}% \lciHtmlChapterHeader{Chapter \thechapter\\#2}%
}% }%
} }
@ -1150,6 +1186,7 @@ l% ___________________________________________________________________________
\newcommand{\section@om}{% \newcommand{\section@om}{%
\lciEndSection \lciEndSection
\refstepcounter{section}% \refstepcounter{section}%
\lciLocalVariableLabel
\lciIfLessExpanded{\lciCountersecnumdepth}{1}{% \lciIfLessExpanded{\lciCountersecnumdepth}{1}{%
\lciHtmlSectionToc{\thesection}{#1}% \lciHtmlSectionToc{\thesection}{#1}%
\lciHtmlSectionHeader{#2}}% \lciHtmlSectionHeader{#2}}%

View File

@ -432,19 +432,26 @@
\newcommand{\lciHtmlPartPkgDesciption}[1]{ \newcommand{\lciHtmlPartPkgDesciption}[1]{
\lciPushOutput{description} \lciPushOutput{description}
\lcRawHtml{ \lcRawHtml{
<table width="100\%" border="0" cellspacing="0" cellpadding="0"><tr><td> <tr><td colspan="3">
<h2 class="PkgDescPart"><br>}#XC1\lcRawHtml{</h1> <h2 class="PkgDescPart"><br>}#XC1\lcRawHtml{</h1>
</td></tr></table>} </td></tr>}
\lciPopOutput \lciPopOutput
} }
% Args: <header-text> % Args: <header-text>
\newcommand{\lciHtmlChapterHeader}[1]{\lcRawHtml{ \newcommand{\lciHtmlChapterHeader}[1]{
<h1>}#C1\lcRawHtml{</h1> \lciCheckForLabelInsideHeading{#C1}%
{\lciLocalVariableChapterName}%
{\lciLocalVariableLabel}%
\lciLocalVariableLabel
\lcRawHtml{<h1>}\lciLocalVariableChapterName\lcRawHtml{</h1>
}} }}
% Args: <anchor-counter> <toc-entry>: Respect secnumdepth counter. % Args: <anchor-counter> <toc-entry>: Respect secnumdepth counter.
\newcommand{\lciHtmlChapterToc}[2]{% \newcommand{\lciHtmlChapterToc}[2]{%
%\lciCheckForLabelInsideHeading{#2}%
% {\lciLocalVariableChapterName}%
% {\lciLocalVariableLabel}%
\lciIfEmpty{#C1}{}{\lciIfLessExpanded{\lciCountertocdepth}{0}{}{% \lciIfEmpty{#C1}{}{\lciIfLessExpanded{\lciCountertocdepth}{0}{}{%
\lcRawHtml{<a name="Chapter_}#C1\lcRawHtml{"></a>}}} \lcRawHtml{<a name="Chapter_}#C1\lcRawHtml{"></a>}}}
\lciIfLessExpanded{\lciCountertocdepth}{0}{}{% \lciIfLessExpanded{\lciCountertocdepth}{0}{}{%
@ -454,7 +461,7 @@
% \lcRawHtml{##Chapter_}#C1 % omit anchor, we start at the page top % \lcRawHtml{##Chapter_}#C1 % omit anchor, we start at the page top
\lcRawHtml{ <tr><td class="TocChapter" colspan="6"> \lcRawHtml{ <tr><td class="TocChapter" colspan="6">
<!-- --------------------------------------------------- --> <!-- --------------------------------------------------- -->
<a class="TocLinkChapter" href="}\lcRawHtmlExpanded{\lciOut}% <a class="TocLinkChapter" href="}\lcRawHtmlExpanded{\lciOut}% \lciLocalVariableChapterName
\lcRawHtml{" \lcRawHtml{"
>}#C2\lcRawHtml{</a> >}#C2\lcRawHtml{</a>
</td></tr> </td></tr>
@ -464,12 +471,20 @@
% Args: <header-text>: % Args: <header-text>:
\newcommand{\lciHtmlSectionHeader}[1]{\lcRawHtml{ \newcommand{\lciHtmlSectionHeader}[1]{%
<h2>}#C1\lcRawHtml{</h2> \lciCheckForLabelInsideHeading{#C1}%
}} {\lciLocalVariableSectionName}%
{\lciLocalVariableLabel}%
\lciLocalVariableLabel
\lcRawHtml{<h2>}\lciLocalVariableSectionName\lcRawHtml{</h2>
}
}
% Args: <anchor-counter> <toc-entry>: Respect secnumdepth counter. % Args: <anchor-counter> <toc-entry>: Respect secnumdepth counter.
\newcommand{\lciHtmlSectionToc}[2]{% \newcommand{\lciHtmlSectionToc}[2]{%
\lciCheckForLabelInsideHeading{#C2}%
{\lciLocalVariableSectionName}%
{\lciLocalVariableLabel}%
\lciIfLessExpanded{\lciCountertocdepth}{1}{}{% \lciIfLessExpanded{\lciCountertocdepth}{1}{}{%
\lcRawHtml{<a name="Section_}#C1\lcRawHtml{"></a>} \lcRawHtml{<a name="Section_}#C1\lcRawHtml{"></a>}
\edef\lciOut{\lciOutputFilename}% \edef\lciOut{\lciOutputFilename}%
@ -480,16 +495,16 @@
\lcRawHtml{ <td class="TocSection" colspan="5"> \lcRawHtml{ <td class="TocSection" colspan="5">
<a class="TocLinkSection" href="}\lcRawHtmlExpanded{\lciOut}% <a class="TocLinkSection" href="}\lcRawHtmlExpanded{\lciOut}%
\lcRawHtml{##Section_}#C1\lcRawHtml{" \lcRawHtml{##Section_}#C1\lcRawHtml{"
>}#C2\lcRawHtml{</a> >}\lciLocalVariableSectionName\lcRawHtml{</a>
</td> </td>
</tr> </tr>
}% }%
\lciPopOutput}} \lciPopOutput}}
% Args: <header-text>: % Args: <header-text>:
\newcommand{\lciHtmlReferenceHeader}[1]{\lcRawHtml{ \newcommand{\lciHtmlReferenceHeader}[1]{
<h2>}#C1\lcRawHtml{</h2> \lcRawHtml{<h2>}#C1\lcRawHtml{</h2>}
}} }
% Args: <anchor-counter> <toc-entry>: Respect secnumdepth counter. % Args: <anchor-counter> <toc-entry>: Respect secnumdepth counter.
\newcommand{\lciHtmlReferenceToc}[2]{% \newcommand{\lciHtmlReferenceToc}[2]{%
@ -514,13 +529,20 @@
% Args: <anchor-counter> <header-text>: if anchor counter is empty, no % Args: <anchor-counter> <header-text>: if anchor counter is empty, no
% anchor is defined. Respect secnumdepth counter. % anchor is defined. Respect secnumdepth counter.
\newcommand{\lciHtmlSubsectionHeader}[2]{% \newcommand{\lciHtmlSubsectionHeader}[2]{%
\lciCheckForLabelInsideHeading{#C2}%
{\lciLocalVariableSubSectionName}%
{\lciLocalVariableLabel}%
\lciLocalVariableLabel
\lciIfEmpty{#C1}{}{\lciIfLessExpanded{\lciCountertocdepth}{2}{}{% \lciIfEmpty{#C1}{}{\lciIfLessExpanded{\lciCountertocdepth}{2}{}{%
\lcRawHtml{<a name="Subsection_}#C1\lcRawHtml{"></a>}}}\lcRawHtml{ \lcRawHtml{<a name="Subsection_}#C1\lcRawHtml{"></a>}}}\lcRawHtml{
<h3>}#C2\lcRawHtml{</h3> <h3>}\lciLocalVariableSubSectionName\lcRawHtml{</h3>
}} }}
% Args: <anchor-counter> <toc-entry> % Args: <anchor-counter> <toc-entry>
\newcommand{\lciHtmlSubsectionToc}[2]{% \newcommand{\lciHtmlSubsectionToc}[2]{%
\lciCheckForLabelInsideHeading{#C2}%
{\lciLocalVariableSubSectionName}%
{\lciLocalVariableLabel}%
\lciIfLessExpanded{\lciCountertocdepth}{2}{}{% \lciIfLessExpanded{\lciCountertocdepth}{2}{}{%
\edef\lciOut{\lciOutputFilename}% \edef\lciOut{\lciOutputFilename}%
\lciPushOutput{toc}% \lciPushOutput{toc}%
@ -529,8 +551,7 @@
}\lciTocIndentWidth\lciTocIndentWidth }\lciTocIndentWidth\lciTocIndentWidth
\lcRawHtml{ <td class="TocSubsection" colspan="4"> \lcRawHtml{ <td class="TocSubsection" colspan="4">
<a class="TocLinkSubsection" href="}\lcRawHtmlExpanded{\lciOut}% <a class="TocLinkSubsection" href="}\lcRawHtmlExpanded{\lciOut}%
\lcRawHtml{##Subsection_}#C1\lcRawHtml{" \lcRawHtml{##Subsection_}#C1\lcRawHtml{">}\lciLocalVariableSubSectionName\lcRawHtml{</a>
>}#C2\lcRawHtml{</a>
</td> </td>
</tr> </tr>
}% }%

View File

@ -1,17 +1,17 @@
#!/bin/bash #!/bin/bash
# ************************************************************************** # **************************************************************************
# #
# latex_to_html # latex_to_html
# =================== # ===================
# LaTeX to HTML converter. General purpose converter (with some # LaTeX to HTML converter. General purpose converter (with some
# limitations), but particularly specialized in converting manuals # limitations), but particularly specialized in converting manuals
# with C++ specifications written with the cc_manual.sty. # with C++ specifications written with the cc_manual.sty.
# #
# Conversion works in two steps: First all TeX files are converted into # Conversion works in two steps: First all TeX files are converted into
# HTML. Meanwhile the necessary information for the cross links is # HTML. Meanwhile the necessary information for the cross links is
# collected as set of rules. In the second step the hyperlinks # collected as set of rules. In the second step the hyperlinks
# are generated for all HTML files. # are generated for all HTML files.
# #
# Besides programs and scripts distributed with this LaTeX converter, # Besides programs and scripts distributed with this LaTeX converter,
# the following programs are necessary to run the converter # the following programs are necessary to run the converter
# #
@ -24,7 +24,7 @@
# Peter Hachenberger and Lutz Kettner # Peter Hachenberger and Lutz Kettner
# Revision : $Id$ # Revision : $Id$
# Date : $Date$ # Date : $Date$
# #
# ************************************************************************** # **************************************************************************
# allow wildcard file expansions to become empty if nothing matches # allow wildcard file expansions to become empty if nothing matches
@ -58,7 +58,7 @@ fi
# The header files within the \ccInclude macro can be linked to the original # The header files within the \ccInclude macro can be linked to the original
# header files if the -header option is given to the cc_extract_html program. # header files if the -header option is given to the cc_extract_html program.
# The environment variable LATEX_CONV_HEADER is used as default. # The environment variable LATEX_CONV_HEADER is used as default.
# If it is not set, the default setting is empty and include files are not # If it is not set, the default setting is empty and include files are not
# linked. # linked.
# LATEX_CONV_HEADER="" # LATEX_CONV_HEADER=""
@ -177,7 +177,7 @@ lgout() {
else else
Buf="$@" Buf="$@"
declare -i len2=$CurrentLen+${#Buf} declare -i len2=$CurrentLen+${#Buf}
if [ $len2 -gt 78 ]; then if [ $len2 -gt 78 ]; then
echo "" echo ""
echo "" >> $LogFile echo "" >> $LogFile
fi fi
@ -214,7 +214,7 @@ error() {
if [ $CurrentLen -gt 0 ]; then echo ""; fi if [ $CurrentLen -gt 0 ]; then echo ""; fi
echo "${ErrorColor}ERROR: $@${ResetColor}" 1>&2 echo "${ErrorColor}ERROR: $@${ResetColor}" 1>&2
fi fi
if [ $CurrentLen -gt 0 ]; then if [ $CurrentLen -gt 0 ]; then
echo "" >> $LogFile echo "" >> $LogFile
fi fi
echo "ERROR: $@" >> $LogFile echo "ERROR: $@" >> $LogFile
@ -237,7 +237,7 @@ error_usage() {
echo "${ErrorColor}ERROR: $@${ResetColor}" 1>&2 echo "${ErrorColor}ERROR: $@${ResetColor}" 1>&2
usage 1>&2 usage 1>&2
fi fi
if [ $CurrentLen -gt 0 ]; then if [ $CurrentLen -gt 0 ]; then
echo "" >> $LogFile echo "" >> $LogFile
fi fi
echo "ERROR: $@" >> $LogFile echo "ERROR: $@" >> $LogFile
@ -301,9 +301,9 @@ print_time() {
run_command() { run_command() {
ExitCode=0 ExitCode=0
cmd=${@//(/\\(}; cmd=${@//(/\\(};
cmd=${cmd//)/\\)}; cmd=${cmd//)/\\)};
if [ $Quiet -eq 0 ] ; then if [ $Quiet -eq 0 ] ; then
{ {
if ! eval "$cmd" 2>&1 ; then if ! eval "$cmd" 2>&1 ; then
# We need to set ExitCode=1, but that won't work with that pipe. # We need to set ExitCode=1, but that won't work with that pipe.
# Instead we touch a file and test that later. # Instead we touch a file and test that later.
@ -324,7 +324,7 @@ run_command() {
if [ -r $LogFile.tmp ]; then if [ -r $LogFile.tmp ]; then
# copy temp logfile to final logfile and remove escape sequences (color) # copy temp logfile to final logfile and remove escape sequences (color)
cat $LogFile.tmp | sed 's/[[][0-9]*m//g' >> $LogFile cat $LogFile.tmp | sed 's/[[][0-9]*m//g' >> $LogFile
if grep -i '^error' $LogFile.tmp > /dev/null ; then if grep -i '^error' $LogFile.tmp > /dev/null ; then
ErrorInLogfile=1 ErrorInLogfile=1
fi fi
rm $LogFile.tmp rm $LogFile.tmp
@ -342,9 +342,9 @@ anchor_filter() {
cat cc_anchor_rules.stage_1 \ cat cc_anchor_rules.stage_1 \
cc_anchor_rules.stage_2 \ cc_anchor_rules.stage_2 \
cc_anchor_rules.stage_3 \ cc_anchor_rules.stage_3 \
| sed 's/REPLACE_WITH_CURRENT_PATH//g' > cc_anchor_rules | sed 's/REPLACE_WITH_CURRENT_PATH//g' > cc_anchor_rules
cc_anchor_filter cc_anchor_rules $1 cc_anchor_filter cc_anchor_rules $1
} }
#---------------------------------------------------------------------# #---------------------------------------------------------------------#
@ -367,8 +367,8 @@ convert() {
# relative path, can be empty. If not empty, it has a trailing '/'. # relative path, can be empty. If not empty, it has a trailing '/'.
PathName=${1%$BaseName} PathName=${1%$BaseName}
if [ "$PathName" != "" ]; then if [ "$PathName" != "" ]; then
if [[ $PathName == /* ]]; then if [[ $PathName == /* ]]; then
error 3 "LaTeX filename must be given with a relative path." error 3 "LaTeX filename must be given with a relative path."
fi fi
${MakePath} ${TmpDir}/${PathName} ${MakePath} ${TmpDir}/${PathName}
@ -408,7 +408,7 @@ convert() {
for dir in ${AllSubDirs} ; do for dir in ${AllSubDirs} ; do
cd $dir cd $dir
cat cc_anchor_rules.stage_1 | sed 's/\[cccbegin\]//g' | sed 's/\[cccend\]//g' > cc_anchor_rules.stage_1.tmp cat cc_anchor_rules.stage_1 | sed 's/\[cccbegin\]//g' | sed 's/\[cccend\]//g' > cc_anchor_rules.stage_1.tmp
mv cc_anchor_rules.stage_1.tmp cc_anchor_rules.stage_1 mv cc_anchor_rules.stage_1.tmp cc_anchor_rules.stage_1
cd ${TmpDir} cd ${TmpDir}
done done
@ -496,9 +496,9 @@ convert() {
cd ${TmpDir} cd ${TmpDir}
lgout -n "]" lgout -n "]"
done done
cd $CurrentDir cd $CurrentDir
# Copy cascaded style sheet (CSS) file # Copy cascaded style sheet (CSS) file
# ------------------------------------------------------- # -------------------------------------------------------
lgout -n "copying CSS file" lgout -n "copying CSS file"
@ -527,7 +527,7 @@ convert() {
fi fi
# copy user images first # copy user images first
ImageFiles=`\cat *.html | cc_extract_images | \sort | \uniq` ImageFiles=`\cat *.html | cc_extract_images | \sort | \uniq`
for f in $ImageFiles ; do for f in $ImageFiles ; do
ImageSearchPath="." ImageSearchPath="."
if [ ! -r ${CurrentDir}/${dir}/${f} ]; then if [ ! -r ${CurrentDir}/${dir}/${f} ]; then
@ -537,7 +537,7 @@ convert() {
ImageBase=${f##*/} ImageBase=${f##*/}
# relative path, can be empty. If not empty, trailing '/'. # relative path, can be empty. If not empty, trailing '/'.
ImagePath=${f%$ImageBase} ImagePath=${f%$ImageBase}
if [ "$ImagePath" != "" ]; then if [ "$ImagePath" != "" ]; then
if [ ! -d $ImagePath ]; then ${MakePath} ${ImagePath} ; fi if [ ! -d $ImagePath ]; then ${MakePath} ${ImagePath} ; fi
if [ ! -d $ImagePath ]; then if [ ! -d $ImagePath ]; then
error noexit "failed to create directory for image '$f'." error noexit "failed to create directory for image '$f'."
@ -646,7 +646,7 @@ fi
# Parse command line parameters # Parse command line parameters
# ----------------------------- # -----------------------------
if [ $# -eq 0 ]; then if [ $# -eq 0 ]; then
usage usage
exit 1 exit 1
fi fi
@ -654,7 +654,7 @@ InFiles=""
while [ $# -gt 0 ]; do while [ $# -gt 0 ]; do
case "$1" in case "$1" in
-h | --help) -h | --help)
usage usage
exit 0 exit 0
;; ;;
@ -676,60 +676,60 @@ while [ $# -gt 0 ]; do
;; ;;
-config) -config)
shift shift
if [[ $# -lt 1 || ! -d $1 ]]; then if [[ $# -lt 1 || ! -d $1 ]]; then
error_usage 1 "-config needs a valid directory as parameter." error_usage 1 "-config needs a valid directory as parameter."
fi fi
ConfigPath="$1" ConfigPath="$1"
;; ;;
-tmp) -tmp)
shift shift
if [[ $# -lt 1 || ! -d $1 ]]; then if [[ $# -lt 1 || ! -d $1 ]]; then
error_usage 1 "-tmp needs a valid directory as parameter." error_usage 1 "-tmp needs a valid directory as parameter."
fi fi
TmpPath="$1" TmpPath="$1"
;; ;;
-o) -o)
shift shift
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
error_usage 1 "-o needs an additional parameter." error_usage 1 "-o needs an additional parameter."
fi fi
if [ ! -d $1 ]; then ${MakePath} $1 ; fi if [ ! -d $1 ]; then ${MakePath} $1 ; fi
if [ ! -d $1 ]; then if [ ! -d $1 ]; then
error_usage 1 "-o needs a directory as parameter. Cannot create it." error_usage 1 "-o needs a directory as parameter. Cannot create it."
fi fi
OutDir="$1" OutDir="$1"
;; ;;
-header | -cgal_dir) # -cgal_dir remains for backwards compatibility -header | -cgal_dir) # -cgal_dir remains for backwards compatibility
shift shift
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
error_usage 1 "-header needs an additional parameter." error_usage 1 "-header needs an additional parameter."
fi fi
CppHeader="-header $1" CppHeader="-header $1"
;; ;;
-date) -date)
shift shift
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
error_usage 1 "-date needs an additional parameter." error_usage 1 "-date needs an additional parameter."
fi fi
LATEX_CONV_DATE="$1" LATEX_CONV_DATE="$1"
;; ;;
-release) -release)
shift shift
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
error_usage 1 "-release needs an additional parameter." error_usage 1 "-release needs an additional parameter."
fi fi
LATEX_CONV_RELEASE="$1" LATEX_CONV_RELEASE="$1"
;; ;;
-title) -title)
shift shift
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
error_usage 1 "-title needs an additional parameter." error_usage 1 "-title needs an additional parameter."
fi fi
LATEX_CONV_TITLE="$1" LATEX_CONV_TITLE="$1"
;; ;;
-author) -author)
shift shift
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
error_usage 1 "-author needs an additional parameter." error_usage 1 "-author needs an additional parameter."
fi fi
LATEX_CONV_AUTHOR="$1" LATEX_CONV_AUTHOR="$1"
@ -752,7 +752,7 @@ while [ $# -gt 0 ]; do
;; ;;
-sty) -sty)
shift shift
if [ $# -lt 1 ]; then if [ $# -lt 1 ]; then
error_usage 1 "-sty needs an additional parameter." error_usage 1 "-sty needs an additional parameter."
fi fi
ExtractOptions = "$ExtractOptions -sty $1" ExtractOptions = "$ExtractOptions -sty $1"
@ -803,7 +803,7 @@ ConfigGif="${ConfigPath}/gif"
# --------------------------------------------------------------- # ---------------------------------------------------------------
if [ "$OutDir" == "html" ]; then if [ "$OutDir" == "html" ]; then
if [ ! -d $OutDir ]; then ${MakePath} $OutDir ; fi if [ ! -d $OutDir ]; then ${MakePath} $OutDir ; fi
if [ ! -d $OutDir ]; then if [ ! -d $OutDir ]; then
error_usage 1 "Cannot create default output directory './html/' ." error_usage 1 "Cannot create default output directory './html/' ."
fi fi
fi fi
@ -834,7 +834,7 @@ TmpDir=$PWD
cd ${CurrentDir} cd ${CurrentDir}
# convert two path variables for use with Cygwin # convert two path variables for use with Cygwin
if eval cygpath -i > /dev/null 2>&1 ; then if eval cygpath -i > /dev/null 2>&1 ; then
TmpDir=`cygpath -m $TmpDir` TmpDir=`cygpath -m $TmpDir`
LATEX_CONV_CONFIG=`cygpath -m $LATEX_CONV_CONFIG` LATEX_CONV_CONFIG=`cygpath -m $LATEX_CONV_CONFIG`
fi fi

View File

@ -0,0 +1,72 @@
#include <iostream>
#include <mstring.h>
#include <cassert>
#include "regex++.h"
using namespace std;
const unsigned int maxgroups = 20;
vector<string>
Regular_expression::submatch(maxgroups);
Regular_expression::Regular_expression( const char* rx )
{ init( rx ); }
Regular_expression::Regular_expression( const string& rx )
{ init( rx.c_str() ); }
void
Regular_expression::init( const char* rx ) {
assert( rx != NULL );
if( regcomp( &regex, rx, REG_EXTENDED ) != REG_NOERROR ) {
std::cout << "!! Error: regex compilation error" << std::endl;
exit(1);
}
regmatch = ( regmatch_t* ) malloc ( maxgroups * sizeof ( regmatch_t ) );
assert( regmatch != NULL );
}
Regular_expression::~Regular_expression() {
if( regmatch != NULL ) {
regfree ( &regex );
free ( regmatch );
}
}
bool
Regular_expression::match( const string& s ) {
assert( regmatch != NULL );
if( regexec( &regex, s.c_str(), maxgroups, regmatch, 0 ) == REG_NOERROR ) {
int so, eo;
for ( unsigned int i = 0; i < maxgroups; i++ ) {
so = regmatch[ i ].rm_so;
eo = regmatch[ i ].rm_eo;
if ( so != -1 )
submatch[ i ] = s.substr ( so, eo - so );
else
submatch[ i ] = "";
}
return true;
}
return false;
}
bool
Regular_expression::match( const char *s )
{ return Regular_expression::match( string( s ) ); }
const string&
Regular_expression::get_match( unsigned int num ) {
static string emptystring;
if( num >= maxgroups ) {
std::cerr << "!! warning: accessing bad regex submatch #" << num << std::endl;
return emptystring;
}
return submatch[num];
}

View File

@ -0,0 +1,37 @@
#ifndef REGEXPP_H
#define REGEXPP_H
#include <sys/types.h>
#include <regex.h>
#include <mstring.h>
#include <vector>
struct Regular_expression {
struct Exception {};
Regular_expression() : regmatch(NULL) {}
Regular_expression( const string& rx );
Regular_expression( const char* rx );
~Regular_expression();
void init( const char *rx );
bool match( const string& s );
bool match( const char* s );
static const string& get_match( unsigned int num );
protected:
static vector <string> submatch;
regex_t regex;
regmatch_t *regmatch;
};
#endif

View File

@ -0,0 +1,30 @@
#include <regex_dictionary.h>
#include <regex++.h>
#include <iostream>
using namespace std;
typedef hash_map< string, Regular_expression > Regex_map;
static Regex_map regex_map;
void
regex_register( const string& name, const string &regex ) {
regex_map[name].init( regex.c_str() );
//std::cerr << "!! Warning: registered name=[" << name << "] regex=[" << regex << "]" << std::endl;
}
bool
regex_does_match( const string& name, const string& text ) {
bool result = regex_map[name].match( text );
std::cerr << "!! checking " << name << " against " << text << " yields: " << result << std::endl;
std::cerr << "match1 : " << regex_get_submatch(1) << std::endl;
std::cerr << "match2 : " << regex_get_submatch(2) << std::endl;
std::cerr << "match3 : " << regex_get_submatch(3) << std::endl;
return result;
}
const string&
regex_get_submatch( unsigned int num ) {
return Regular_expression::get_match( num );
}

View File

@ -0,0 +1,10 @@
#ifndef REGEX_DICTIONARY_H
#define REGEX_DICTIONARY_H
#include <mstring.h>
void regex_register( const string& name, const string &regex );
bool regex_does_match( const string& name, const string& text );
const string& regex_get_submatch( unsigned int num );
#endif