]> git.lyx.org Git - lyx.git/blobdiff - src/tex2lyx/table.C
Removed all redundant using directives from the source.
[lyx.git] / src / tex2lyx / table.C
index 3e1b694a007a8c5992d3c7d944f3cbd6d847bcd9..7b02cf3d79a2d9a98b61ada778d7f5bacca2d95e 100644 (file)
@@ -1,5 +1,12 @@
-/** The .tex to .lyx converter
-    \author André Pönitz (2003)
+/**
+ * \file table.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author André Pönitz
+ * \author Jean-Marc Lasgouttes
+ *
+ * Full author contact details are available in file CREDITS.
  */
 
 // {[(
@@ -13,6 +20,7 @@
 #include <iostream>
 #include <sstream>
 #include <vector>
+#include <map>
 
 using std::cerr;
 using std::endl;
@@ -24,6 +32,10 @@ using std::vector;
 
 #include "mathed/math_gridinfo.h"
 
+// filled in preamble.C
+std::map<char, int> special_columns;
+
+
 namespace {
 
 int string2int(string const & s, int deflt = 0)
@@ -56,7 +68,6 @@ string read_hlines(Parser & p)
 }
 
 
-
 /* rather brutish way to code table structure in a string:
 
   \begin{tabular}{ccc}
@@ -125,7 +136,19 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
                                break;
                        }
                        default:
-                               cerr << "ignoring special separator '" << t << "'\n";
+                               if (special_columns.find(t.character()) != special_columns.end()) {
+                                       ColInfo ci;
+                                       ci.align = 'c';
+                                       ci.special += t.character();
+                                       int const nargs = special_columns[t.character()];
+                                       for (int i = 0; i < nargs; ++i)
+                                               ci.special += "{" + p.verbatim_item() + "}"; 
+                                       //cerr << "handling special column '" << t << "' " << nargs
+                                       //      << "  '" << ci.special << "'\n";
+                                       colinfo.push_back(ci);
+                               } else {
+                                       cerr << "ignoring special separator '" << t << "'\n";
+                               }
                                break;
                        }
        }
@@ -264,7 +287,8 @@ void handle_hline_below(RowInfo & ri, vector<CellInfo> & ci)
 }
 
 
-void handle_tabular(Parser & p, ostream & os)
+void handle_tabular(Parser & p, ostream & os,
+                   Context & context)
 {
        string posopts = p.getOpt();
        if (posopts.size())
@@ -379,7 +403,9 @@ void handle_tabular(Parser & p, ostream & os)
                                handle_colalign(p, t);
                                cellinfo[row][col].multi     = 1;
                                cellinfo[row][col].align     = t.front().align;
-                               cellinfo[row][col].content   = parse_text(p, FLAG_ITEM, false);
+                               ostringstream os;
+                               parse_text_in_inset(p, os, FLAG_ITEM, false, context);
+                               cellinfo[row][col].content   = os.str();
                                cellinfo[row][col].leftline  |= t.front().leftline;
                                cellinfo[row][col].rightline |= t.front().rightline;
 
@@ -396,7 +422,12 @@ void handle_tabular(Parser & p, ostream & os)
 
                        } else {        
                                // FLAG_END is a hack, we need to read all of it
-                               cellinfo[row][col].content = parse_text(p, FLAG_END, false);
+                               cellinfo[row][col].leftline = colinfo[col].leftline;
+                               cellinfo[row][col].rightline = colinfo[col].rightline;
+                               cellinfo[row][col].align = colinfo[col].align;
+                               ostringstream os;
+                               parse_text_in_inset(p, os, FLAG_CELL, false, context);
+                               cellinfo[row][col].content   = os.str();
                        }
                }
 
@@ -416,19 +447,23 @@ void handle_tabular(Parser & p, ostream & os)
 
        //cerr << "// output what we have\n";
        // output what we have
-       os << "<lyxtabular version=\"3\" rows=\"" << rowinfo.size()
+       os << "\n<lyxtabular version=\"3\" rows=\"" << rowinfo.size()
                 << "\" columns=\"" << colinfo.size() << "\">\n"
                 << "<features>\n";
 
        //cerr << "// after header\n";
        for (size_t col = 0; col < colinfo.size(); ++col) {
-               os << "<column alignment=\"" << colinfo[col].align << "\"";
-               if (colinfo[col].rightline)
-                       os << " rightline=\"true\"";
+               os << "<column alignment=\""
+                  << verbose_align(colinfo[col].align) << "\"";
+               os << " valignment=\"top\"";
                if (colinfo[col].leftline)
                        os << " leftline=\"true\"";
-               os << " valignment=\"top\"";
-               os << " width=\"" << colinfo[col].width << "\"";
+               if (colinfo[col].rightline)
+                       os << " rightline=\"true\"";
+               if (colinfo[col].width.size())
+                       os << " width=\"" << colinfo[col].width << "\"";
+               if (colinfo[col].special.size())
+                       os << " special=\"" << colinfo[col].special << "\"";
                os << ">\n";
        }
        //cerr << "// after cols\n";
@@ -445,27 +480,27 @@ void handle_tabular(Parser & p, ostream & os)
                        os << "<cell";
                        if (cell.multi)
                                os << " multicolumn=\"" << cell.multi << "\"";
-                       if (cell.leftline)
-                               os << " leftline=\"true\"";
-                       if (cell.rightline)
-                               os << " rightline=\"true\"";
+                       os << " alignment=\"" << verbose_align(cell.align) 
+                          << "\""
+                          << " valignment=\"top\"";
                        if (cell.topline)
                                os << " topline=\"true\"";
                        if (cell.bottomline)
                                os << " bottomline=\"true\"";
+                       if (cell.leftline)
+                               os << " leftline=\"true\"";
+                       if (cell.rightline)
+                               os << " rightline=\"true\"";
                        //cerr << "\nrow: " << row << " col: " << col;
                        //if (cell.topline)
                        //      cerr << " topline=\"true\"";
                        //if (cell.bottomline)
                        //      cerr << " bottomline=\"true\"";
-                       os << " alignment=\"" << verbose_align(cell.align) << "\""
-                                << " valignment=\"top\""
-                                << " usebox=\"none\""
-                                << ">"
-                          << "\n\\begin_inset Text"
-                          << "\n\n\\layout Standard\n\n"
+                       os << " usebox=\"none\""
+                          << ">"
+                          << "\n\\begin_inset Text\n"
                           << cell.content
-                          << "\n\\end_inset\n\n"
+                          << "\n\\end_inset \n"
                           << "</cell>\n";
                }
                os << "</row>\n";