]> git.lyx.org Git - features.git/commitdiff
Don't crash on nested tables anymore
authorGeorg Baum <Georg.Baum@post.rwth-aachen.de>
Mon, 14 Mar 2005 17:34:57 +0000 (17:34 +0000)
committerGeorg Baum <Georg.Baum@post.rwth-aachen.de>
Mon, 14 Mar 2005 17:34:57 +0000 (17:34 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@9716 a592a061-630c-0410-9148-cb99ea01b6c8

src/tex2lyx/ChangeLog
src/tex2lyx/table.C
src/tex2lyx/texparser.C
src/tex2lyx/texparser.h

index 628b7752c2708c7d2dbd62546ab6e43cdf56ece4..3d62b3b72f7f9d810c31526d513eabd5a0465e2d 100644 (file)
@@ -1,3 +1,8 @@
+2005-03-11  Georg Baum  <Georg.Baum@post.rwth-aachen.de>
+
+       * table.C (parse_table): handle nested tables
+       * texparser.[Ch] (verbatimEnvironment): new
+
 2005-03-07  Georg Baum  <Georg.Baum@post.rwth-aachen.de>
 
        * table.C (verbose_valign): new
index 10d0bf7eb211ab81c13f4ed83c4742d0d1105ef7..5cc0422d0341ca07b46e51cd0ca6d4191cabce74 100644 (file)
@@ -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();
                }
index 8a17a47d33b897e9cd34a09e17790148c87cf153..bdfea89a5357358bb9bc5f4ff6e4495f985adbec 100644 (file)
@@ -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;
index 0fc250e14f11a29b0c1aa463705c4b968b6d194a..b8107f75db6d815bcac7b0e712565c3663c4c3fc 100644 (file)
@@ -150,6 +150,12 @@ public:
        std::string getFullOpt();
        /// \returns getArg('[', ']') including the brackets
        std::string getOpt();
+       /*!
+        * \returns the contents of the environment \p name.
+        * <tt>\begin{name}</tt> must be parsed already, <tt>\end{name}</tt>
+        * 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();
        ///