]> git.lyx.org Git - features.git/commitdiff
some common structures in extra file
authorAndré Pönitz <poenitz@gmx.net>
Fri, 25 Apr 2003 15:54:29 +0000 (15:54 +0000)
committerAndré Pönitz <poenitz@gmx.net>
Fri, 25 Apr 2003 15:54:29 +0000 (15:54 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6857 a592a061-630c-0410-9148-cb99ea01b6c8

src/mathed/Makefile.am
src/mathed/math_ertinset.C
src/mathed/math_gridinfo.h [new file with mode: 0644]
src/mathed/math_gridinset.C
src/mathed/math_gridinset.h
src/tex2lyx/math.C
src/tex2lyx/table.C
src/tex2lyx/tex2lyx.C
src/tex2lyx/texparser.C
src/tex2lyx/texparser.h
src/tex2lyx/text.C

index a10edf4fe96345448e9ee27cd1365b93effcbf86..423995cbb83828ffcf68365c1107bae1fe92da76 100644 (file)
@@ -75,6 +75,7 @@ libmathed_la_SOURCES = \
        math_fracinset.h \
        math_fracbase.C \
        math_fracbase.h \
+       math_gridinfo.h \
        math_gridinset.C \
        math_gridinset.h \
        math_hullinset.C \
index eeeca0c9e4ba06904c1c0e835564b9166a1b7d69..7bc02997767b2cf0e1ccebdee8c5d0e0f6123921 100644 (file)
@@ -16,7 +16,7 @@ void MathErtInset::metrics(MetricsInfo & mi) const
 {
        FontSetChanger dummy(mi.base, "lyxert");
        MathTextInset::metrics(mi);
-       cache_.colinfo_[0].align_ = 'l';
+       cache_.colinfo_[0].align = 'l';
        metricsMarkers2();
 }
 
diff --git a/src/mathed/math_gridinfo.h b/src/mathed/math_gridinfo.h
new file mode 100644 (file)
index 0000000..076df24
--- /dev/null
@@ -0,0 +1,45 @@
+#ifndef MATH_GRIDINFO_H
+#define MATH_GRIDINFO_H
+
+struct ColInfo
+{
+       ColInfo() : rightline(0), leftline(false) {}
+       char   align;      // column alignment
+       string width;      // column width
+       int    rightline;  // a line on the right?
+       bool   leftline;
+};
+
+
+struct RowInfo
+{
+       RowInfo() : topline(false), bottomline(false) {} 
+       bool topline;     // horizontal line above
+       int  bottomline;  // horizontal line below
+};
+
+
+struct CellInfo
+{
+       CellInfo()
+               : multi(0), leftline(false), rightline(false),
+          topline(false), bottomline(false)
+       {}
+
+       string content;    // cell content
+       int multi;         // multicolumn flag
+       char align;        // cell alignment
+       bool leftline;     // do we have a line on the left?
+       bool rightline;    // do we have a line on the right?
+       bool topline;        // do we have a line above?
+       bool bottomline;   // do we have a line below?
+};
+
+
+inline char const * verbose_align(char c)
+{
+       return c == 'c' ? "center" : c == 'r' ? "right" : c == 'l' ? "left" : "none";
+}
+
+
+#endif
index 61729990cbd7b51307c2c768ac7a80a340ab27d2..ccf1c7b4863b5ce757b8d76ad7a67c7fd76bc2b7 100644 (file)
@@ -68,25 +68,6 @@ int extractInt(istream & is)
 }
 
 
-//////////////////////////////////////////////////////////////
-
-
-MathGridInset::CellInfo::CellInfo()
-       : dummy_(false)
-{}
-
-
-
-
-//////////////////////////////////////////////////////////////
-
-
-MathGridInset::RowInfo::RowInfo()
-       : lines_(0), skip_(0)
-{}
-
-
-
 int MathGridInset::RowInfo::skipPixels() const
 {
        return crskip_.inBP();
@@ -94,22 +75,11 @@ int MathGridInset::RowInfo::skipPixels() const
 
 
 
-//////////////////////////////////////////////////////////////
-
-
-MathGridInset::ColInfo::ColInfo()
-       : align_('c'), leftline_(false), rightline_(false), lines_(0)
-{}
-
-
 //////////////////////////////////////////////////////////////
 
 
 MathGridInset::MathGridInset(char v, string const & h)
-       : MathNestInset(guessColumns(h)),
-         rowinfo_(2),
-         colinfo_(guessColumns(h) + 1),
-         cellinfo_(1 * guessColumns(h))
+       : MathNestInset(1), rowinfo_(1), colinfo_(1), cellinfo_(1)
 {
        setDefaults();
        valign(v);
@@ -119,11 +89,7 @@ MathGridInset::MathGridInset(char v, string const & h)
 
 
 MathGridInset::MathGridInset()
-       : MathNestInset(1),
-         rowinfo_(1 + 1),
-               colinfo_(1 + 1),
-               cellinfo_(1),
-               v_align_('c')
+       : MathNestInset(1), rowinfo_(1), colinfo_(1), cellinfo_(1), v_align_('c')
 {
        setDefaults();
 }
@@ -131,10 +97,7 @@ MathGridInset::MathGridInset()
 
 MathGridInset::MathGridInset(col_type m, row_type n)
        : MathNestInset(m * n),
-         rowinfo_(n + 1),
-               colinfo_(m + 1),
-               cellinfo_(m * n),
-               v_align_('c')
+         rowinfo_(n), colinfo_(m), cellinfo_(m * n), v_align_('c')
 {
        setDefaults();
 }
@@ -142,10 +105,7 @@ MathGridInset::MathGridInset(col_type m, row_type n)
 
 MathGridInset::MathGridInset(col_type m, row_type n, char v, string const & h)
        : MathNestInset(m * n),
-         rowinfo_(n + 1),
-         colinfo_(m + 1),
-               cellinfo_(m * n),
-               v_align_(v)
+         rowinfo_(n), colinfo_(m), cellinfo_(m * n), v_align_(v)
 {
        setDefaults();
        valign(v);
@@ -179,8 +139,8 @@ void MathGridInset::setDefaults()
        //if (nrows() <= 0)
        //      lyxerr << "positive number of rows expected\n";
        for (col_type col = 0; col < ncols(); ++col) {
-               colinfo_[col].align_ = defaultColAlign(col);
-               colinfo_[col].skip_  = defaultColSpace(col);
+               colinfo_[col].align = defaultColAlign(col);
+                       colinfo_[col].skip_ = defaultColSpace(col);
        }
 }
 
@@ -189,13 +149,13 @@ void MathGridInset::halign(string const & hh)
 {
        col_type col = 0;
        for (string::const_iterator it = hh.begin(); it != hh.end(); ++it) {
-               if (col >= ncols())
-                       break;
+               if (col == ncols())
+                       addCol(ncols() - 1);
                char c = *it;
                if (c == '|') {
                        colinfo_[col].lines_++;
                } else if (c == 'c' || c == 'l' || c == 'r') {
-                       colinfo_[col].align_ = c;
+                       colinfo_[col].align = c;
                        ++col;
                        colinfo_[col].lines_ = 0;
                } else {
@@ -213,29 +173,16 @@ void MathGridInset::halign(string const & hh)
 }
 
 
-MathGridInset::col_type MathGridInset::guessColumns(string const & hh) const
-{
-       col_type col = 0;
-       for (string::const_iterator it = hh.begin(); it != hh.end(); ++it)
-               if (*it == 'c' || *it == 'l' || *it == 'r')
-                       ++col;
-       // let's have at least one column, even if we did not recognize its
-       // alignment
-       if (col == 0)
-               col = 1;
-       return col;
-}
-
 
 void MathGridInset::halign(char h, col_type col)
 {
-       colinfo_[col].align_ = h;
+       colinfo_[col].align = h;
 }
 
 
 char MathGridInset::halign(col_type col) const
 {
-       return colinfo_[col].align_;
+       return colinfo_[col].align;
 }
 
 
@@ -244,7 +191,7 @@ string MathGridInset::halign() const
        string res;
        for (col_type col = 0; col < ncols(); ++col) {
                res += string(colinfo_[col].lines_, '|');
-               res += colinfo_[col].align_;
+               res += colinfo_[col].align;
        }
        return res + string(colinfo_[ncols()].lines_, '|');
 }
@@ -659,8 +606,8 @@ void MathGridInset::addCol(col_type newcol)
        swap(cellinfo_, new_cellinfo);
 
        ColInfo inf;
-       inf.skip_  = defaultColSpace(newcol);
-       inf.align_ = defaultColAlign(newcol);
+       inf.skip_ = defaultColSpace(newcol);
+       inf.align = defaultColAlign(newcol);
        colinfo_.insert(colinfo_.begin() + newcol, inf);
 }
 
@@ -707,7 +654,7 @@ int MathGridInset::cellXOffset(idx_type idx) const
 {
        col_type c = col(idx);
        int x = colinfo_[c].offset_;
-       char align = colinfo_[c].align_;
+       char align = colinfo_[c].align;
        if (align == 'r' || align == 'R')
                x += colinfo_[c].width_ - cell(idx).width();
        if (align == 'c' || align == 'C')
index 1beffcb7c1e8c97fec72e1f73a98c59498f58623..9fd17f07406dbbddb1a02d2b5c8e4df3cd275d94 100644 (file)
@@ -5,6 +5,7 @@
 #include "math_nestinset.h"
 #include "vspace.h"
 #include "LString.h"
+#include "math_gridinfo.h"
 
 
 /** Gridded math inset base class.
@@ -20,15 +21,8 @@ class MathGridInset : public MathNestInset {
 public:
 
        /// additional per-cell information
-       struct CellInfo {
-               ///
-               CellInfo();
-               /// a dummy cell before a multicolumn cell
-               int dummy_;
-               /// special multi colums alignment
-               string align_;
-               /// these should be a per-cell property, but ok to have it here
-               /// for single-column grids like paragraphs
+       struct CellInfo : public ::CellInfo {
+               /// fixed glue
                mutable int glue_;
                ///
                mutable pos_type begin_;
@@ -37,45 +31,45 @@ public:
        };
 
        /// additional per-row information
-       struct RowInfo {
+       struct RowInfo : public ::RowInfo {
                ///
-               RowInfo();
+               RowInfo()
+                       : lines_(0), skip_(0)
+               {}
+
                ///
                int skipPixels() const;
+               /// how many hlines above this row?
+               int lines_;
+               /// parameter to the line break
+               LyXLength crskip_;
+               /// extra distance between lines on screen
+               int skip_;
+
                /// cached descent
                mutable int descent_;
                /// cached ascent
                mutable int ascent_;
                /// cached offset
                mutable int offset_;
-               /// how many hlines above this row?
-               int lines_;
-               /// parameter to the line break
-               LyXLength crskip_;
-               /// extra distance between lines
-               int skip_;
        };
 
        // additional per-row information
-       struct ColInfo {
+       struct ColInfo : public ::ColInfo {
                ///
-               ColInfo();
-               /// currently possible: 'l', 'c', 'r'
-               char align_;
+               ColInfo()
+                       : lines_(0), skip_(0)
+               {}
+
                /// cache for drawing
-               int h_offset;
+               int lines_;
+               /// additional amount to be skipped on screen
+               int skip_;
+
                /// cached width
                mutable int width_;
                /// cached offset
                mutable int offset_;
-               /// do we need a line to the left?
-               bool leftline_;
-               /// do we need a line to the right?
-               bool rightline_;
-               /// how many lines to the left of this column?
-               int lines_;
-               /// additional amount to be skipped when drawing
-               int skip_;
        };
 
 public:
@@ -220,8 +214,6 @@ protected:
        virtual string eolString(row_type row, bool fragile = false) const;
        /// returns proper 'end of column' code for LaTeX
        virtual string eocString(col_type col, col_type lastcol) const;
-       /// extract number of columns from alignment string
-       col_type guessColumns(string const & halign) const;
        /// splits cells and shifts right part to the next cell
        void splitCell(idx_type &, pos_type & pos);
 
index c053437e3836290cad346abf1e200173fb9890ad..dca219677d39f3155f84f571f0160ad58e407210 100644 (file)
@@ -137,6 +137,9 @@ void parse_math(Parser & p, ostream & os, unsigned flags, const mode_type mode)
                }
 
                else if (t.cs() == "[") {
+                       // special handling of a few common SW user quirks
+                       p.skip_spaces();
+                       //if (p.next_token().cs() == 
                        os << "\\[";
                        parse_math(p, os, FLAG_EQUATION, MATH_MODE);
                        os << "\\]";
index 1159e5083e8c347f3f722a3a5bce3a787e3d30f6..fc9c63dcf190937904cadefd793a7497120917a3 100644 (file)
@@ -23,44 +23,10 @@ using std::ostringstream;
 using std::string;
 using std::vector;
 
+#include "mathed/math_gridinfo.h"
 
 namespace {
 
-struct ColInfo
-{
-       ColInfo() : rightline(0), leftline(false) {}
-       string align;      // column alignment
-       string width;      // column width
-       int    rightline;  // a line on the right?
-       bool   leftline;
-};
-
-
-struct RowInfo
-{
-       RowInfo() : topline(false), bottomline(false) {} 
-       bool topline;     // horizontal line above
-       int  bottomline;  // horizontal line below
-};
-
-
-struct CellInfo
-{
-       CellInfo()
-               : multi(0), leftline(false), rightline(false),
-          topline(false), bottomline(false)
-       {}
-
-       string content;    // cell content
-       int multi;         // multicolumn flag
-       string align;      // cell alignment
-       bool leftline;     // do we have a line on the left?
-       bool rightline;    // do we have a line on the right?
-       bool topline;        // do we have a line above?
-       bool bottomline;   // do we have a line below?
-};
-
-
 int string2int(string const & s, int deflt = 0)
 {
        istringstream is(s);
@@ -73,7 +39,7 @@ int string2int(string const & s, int deflt = 0)
 string read_hlines(Parser & p)
 {
        ostringstream os;
-       p.skipSpaces();
+       p.skip_spaces();
        while (p.good()) {
                if (p.next_token().cs() == "hline") {
                        p.get_token();
@@ -83,7 +49,7 @@ string read_hlines(Parser & p)
                        os << "\\cline{" << p.verbatim_item() << "}";
                } else
                        break;
-               p.skipSpaces();
+               p.skip_spaces();
        };
        //cerr << "read_hlines(), read: '" << os.str() << "'\n";
        //cerr << "read_hlines(), next token: " << p.next_token() << "\n";
@@ -111,24 +77,13 @@ char const TAB   = '\001';
 char const LINE  = '\002';
 char const HLINE = '\004';
 
-string get_align(char c)
-{
-       switch (c) {
-               case 'c': return "center";
-               case 'l': return "left";
-               case 'r': return "right";
-               case 'b': return "block";
-       }
-       return "center";
-}
-
 
 void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
 {
        if (p.get_token().cat() != catBegin)
                cerr << "wrong syntax for table column alignment. '{' expected\n";
 
-       string nextalign = "block";
+       char nextalign = 'b';
        bool leftline = false;
        for (Token t=p.get_token(); p.good() && t.cat() != catEnd; t = p.get_token()){
 #ifdef FILEDEBUG
@@ -140,7 +95,7 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
                        case 'l':
                        case 'r': {
                                ColInfo ci;
-                               ci.align = get_align(t.character());
+                               ci.align = t.character();
                                if (colinfo.size() && colinfo.back().rightline > 1) {
                                        ci.leftline = true;
                                        --colinfo.back().rightline;
@@ -152,7 +107,7 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
                                colinfo.push_back(ColInfo());
                                colinfo.back().align = nextalign;
                                colinfo.back().width = p.verbatim_item();
-                               nextalign = "block";
+                               nextalign = 'b';
                                break;
                        case '|':
                                if (colinfo.empty())
@@ -163,9 +118,9 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
                        case '>': {
                                string s = p.verbatim_item();
                                if (s == "\\raggedleft ")
-                                       nextalign = "left";
+                                       nextalign = 'l';
                                else if (s == "\\raggedright ")
-                                       nextalign = "right";
+                                       nextalign = 'r';
                                else
                                        cerr << "unknown '>' column '" << s << "'\n";
                                break;
@@ -242,7 +197,6 @@ void parse_table(Parser & p, ostream & os, unsigned flags)
                }
 
                else if (t.cs() == "tabularnewline" || t.cs() == "\\") {
-               //else if (t.cs() == "tabularnewline") {
                        // stuff before the line break
                        // and look ahead for stuff after the line break
                        os << HLINE << hlines << HLINE << LINE << read_hlines(p) << HLINE;
@@ -414,7 +368,7 @@ void handle_tabular(Parser & p, ostream & os)
                                cell < cells.size() && col < colinfo.size(); ++col, ++cell) {
                        //cerr << "cell content: '" << cells[cell] << "'\n";
                        Parser p(cells[cell]);
-                       p.skipSpaces(); 
+                       p.skip_spaces();        
                        //cells[cell] << "'\n";
                        if (p.next_token().cs() == "multicolumn") {
                                // how many cells?
@@ -434,7 +388,7 @@ void handle_tabular(Parser & p, ostream & os)
                                for (size_t i = 0; i < ncells - 1 && col < colinfo.size(); ++i) {
                                        ++col;
                                        cellinfo[row][col].multi = 2;
-                                       cellinfo[row][col].align = "center";
+                                       cellinfo[row][col].align = 'c';
                                }
 
                                // more than one line on the right?
@@ -505,7 +459,7 @@ void handle_tabular(Parser & p, ostream & os)
                        //      cerr << " topline=\"true\"";
                        //if (cell.bottomline)
                        //      cerr << " bottomline=\"true\"";
-                       os << " alignment=\"" << cell.align << "\""
+                       os << " alignment=\"" << verbose_align(cell.align) << "\""
                                 << " valignment=\"top\""
                                 << " usebox=\"none\""
                                 << ">"
index fb29085ec507cca9a1aa0377484508e4e9b6676e..7b2e7b2a84de20591ab24c44adef34d6ce762906 100644 (file)
@@ -40,7 +40,7 @@ void handle_comment(Parser & p)
                s += t.asString();
        }
        //cerr << "comment: " << s << "\n";
-       p.skipSpaces();
+       p.skip_spaces();
 }
 
 
index d1014f71c602288ed6fee5565308c08831401f6f..44007dba0046aeaaa5910541cfdc21437a2fef96 100644 (file)
@@ -166,7 +166,7 @@ Token const & Parser::get_token()
 }
 
 
-void Parser::skipSpaces()
+void Parser::skip_spaces()
 {
        while (1) {
                if (next_token().cat() == catSpace || next_token().cat() == catNewline)
@@ -202,7 +202,7 @@ char Parser::getChar()
 
 string Parser::getArg(char left, char right)
 {
-       skipSpaces();
+       skip_spaces();
 
        string result;
        char c = getChar();
@@ -341,7 +341,7 @@ string Parser::verbatim_item()
 {
        if (!good())
                error("stream bad");
-       skipSpaces();
+       skip_spaces();
        if (next_token().cat() == catBegin) {
                Token t = get_token(); // skip brace
                string res;
index 4370a550a57aeb6be9b22393529ba291f6358515..a755ac482cbd14c7db076186345eec4ada921643 100644 (file)
@@ -128,7 +128,7 @@ public:
        ///
        Token const & get_token();
        /// skips spaces if any
-       void skipSpaces();
+       void skip_spaces();
        ///
        void lex(string const & s);
        ///
index 9fd9a024eb28a90ad4fccdda1daa169b695d0ce0..ec10d5cd976d7f93a255e2d762e6f5a29ee53ebf 100644 (file)
@@ -332,7 +332,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
                }
 
                else if (t.cs() == "item") {
-                       p.skipSpaces();
+                       p.skip_spaces();
                        string s; 
                        if (p.next_token().character() == '[') {
                                p.get_token(); // eat '['
@@ -350,7 +350,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
                }
 
                else if (t.cs() == "par") {
-                       p.skipSpaces();
+                       p.skip_spaces();
                        if (p.next_token().cs() != "\\begin")
                                handle_par(os);
                        //cerr << "next token: '" << p.next_token().cs() << "'\n";