From 0153a52b5717457adc4ead5d3e809f59a71d2350 Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Mon, 14 Mar 2005 17:34:57 +0000 Subject: [PATCH] Don't crash on nested tables anymore git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9716 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/tex2lyx/ChangeLog | 5 +++++ src/tex2lyx/table.C | 14 ++++++++------ src/tex2lyx/texparser.C | 31 +++++++++++++++++++++++++++++++ src/tex2lyx/texparser.h | 6 ++++++ 4 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/tex2lyx/ChangeLog b/src/tex2lyx/ChangeLog index 628b7752c2..3d62b3b72f 100644 --- a/src/tex2lyx/ChangeLog +++ b/src/tex2lyx/ChangeLog @@ -1,3 +1,8 @@ +2005-03-11 Georg Baum + + * table.C (parse_table): handle nested tables + * texparser.[Ch] (verbatimEnvironment): new + 2005-03-07 Georg Baum * table.C (verbose_valign): new diff --git a/src/tex2lyx/table.C b/src/tex2lyx/table.C index 10d0bf7eb2..5cc0422d03 100644 --- a/src/tex2lyx/table.C +++ b/src/tex2lyx/table.C @@ -653,6 +653,7 @@ void parse_table(Parser & p, ostream & os, bool is_long_tabular, if (n.cat() == catMath) { // TeX's $$...$$ syntax for displayed math os << "\\["; + // This does only work because parse_math outputs TeX parse_math(p, os, FLAG_SIMPLE, MATH_MODE); os << "\\]"; p.get_token(); // skip the second '$' token @@ -660,6 +661,7 @@ void parse_table(Parser & p, ostream & os, bool is_long_tabular, // simple $...$ stuff p.putback(); os << '$'; + // This does only work because parse_math outputs TeX parse_math(p, os, FLAG_SIMPLE, MATH_MODE); os << '$'; } @@ -699,12 +701,14 @@ void parse_table(Parser & p, ostream & os, bool is_long_tabular, else if (t.cs() == "(") { os << "\\("; + // This does only work because parse_math outputs TeX parse_math(p, os, FLAG_SIMPLE2, MATH_MODE); os << "\\)"; } else if (t.cs() == "[") { os << "\\["; + // This does only work because parse_math outputs TeX parse_math(p, os, FLAG_EQUATION, MATH_MODE); os << "\\]"; } @@ -713,12 +717,10 @@ void parse_table(Parser & p, ostream & os, bool is_long_tabular, string const name = p.getArg('{', '}'); active_environments.push_back(name); os << "\\begin{" << name << '}'; - if (is_math_env(name)) { - parse_math(p, os, FLAG_END, MATH_MODE); - } else { - parse_table(p, os, is_long_tabular, pos, - FLAG_END); - } + // treat the nested environment as a block, don't + // parse &, \\ etc, because they don't belong to our + // table if they appear. + os << p.verbatimEnvironment(name); os << "\\end{" << name << '}'; active_environments.pop_back(); } diff --git a/src/tex2lyx/texparser.C b/src/tex2lyx/texparser.C index 8a17a47d33..bdfea89a53 100644 --- a/src/tex2lyx/texparser.C +++ b/src/tex2lyx/texparser.C @@ -20,6 +20,7 @@ using std::endl; using std::fill; using std::istream; using std::istringstream; +using std::ostringstream; using std::ostream; using std::string; @@ -323,6 +324,36 @@ string Parser::getOpt() } +string const Parser::verbatimEnvironment(string const & name) +{ + if (!good()) + return string(); + + ostringstream os; + for (Token t = get_token(); good(); t = get_token()) { + if (t.cat() == catBegin) { + putback(); + os << '{' << verbatim_item() << '}'; + } else if (t.asInput() == "\\begin") { + string const env = getArg('{', '}'); + os << "\\begin{" << env << '}' + << verbatimEnvironment(env) + << "\\end{" << env << '}'; + } else if (t.asInput() == "\\end") { + string const end = getArg('{', '}'); + if (end != name) + cerr << "\\end{" << end + << "} does not match \\begin{" << name + << "}." << endl; + return os.str(); + } else + os << t.asInput(); + } + cerr << "unexpected end of input" << endl; + return os.str(); +} + + void Parser::tokenize(istream & is) { static bool init_done = false; diff --git a/src/tex2lyx/texparser.h b/src/tex2lyx/texparser.h index 0fc250e14f..b8107f75db 100644 --- a/src/tex2lyx/texparser.h +++ b/src/tex2lyx/texparser.h @@ -150,6 +150,12 @@ public: std::string getFullOpt(); /// \returns getArg('[', ']') including the brackets std::string getOpt(); + /*! + * \returns the contents of the environment \p name. + * \begin{name} must be parsed already, \end{name} + * is parsed but not returned. + */ + std::string const verbatimEnvironment(std::string const & name); /// Returns the character of the current token and increments the token position. char getChar(); /// -- 2.39.2