some common structures in extra file

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6857 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2003-04-25 15:54:29 +00:00
parent 63febc852e
commit 00e9ff93fb
11 changed files with 107 additions and 165 deletions

View File

@ -75,6 +75,7 @@ libmathed_la_SOURCES = \
math_fracinset.h \ math_fracinset.h \
math_fracbase.C \ math_fracbase.C \
math_fracbase.h \ math_fracbase.h \
math_gridinfo.h \
math_gridinset.C \ math_gridinset.C \
math_gridinset.h \ math_gridinset.h \
math_hullinset.C \ math_hullinset.C \

View File

@ -16,7 +16,7 @@ void MathErtInset::metrics(MetricsInfo & mi) const
{ {
FontSetChanger dummy(mi.base, "lyxert"); FontSetChanger dummy(mi.base, "lyxert");
MathTextInset::metrics(mi); MathTextInset::metrics(mi);
cache_.colinfo_[0].align_ = 'l'; cache_.colinfo_[0].align = 'l';
metricsMarkers2(); metricsMarkers2();
} }

View File

@ -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

View 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 int MathGridInset::RowInfo::skipPixels() const
{ {
return crskip_.inBP(); 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) MathGridInset::MathGridInset(char v, string const & h)
: MathNestInset(guessColumns(h)), : MathNestInset(1), rowinfo_(1), colinfo_(1), cellinfo_(1)
rowinfo_(2),
colinfo_(guessColumns(h) + 1),
cellinfo_(1 * guessColumns(h))
{ {
setDefaults(); setDefaults();
valign(v); valign(v);
@ -119,11 +89,7 @@ MathGridInset::MathGridInset(char v, string const & h)
MathGridInset::MathGridInset() MathGridInset::MathGridInset()
: MathNestInset(1), : MathNestInset(1), rowinfo_(1), colinfo_(1), cellinfo_(1), v_align_('c')
rowinfo_(1 + 1),
colinfo_(1 + 1),
cellinfo_(1),
v_align_('c')
{ {
setDefaults(); setDefaults();
} }
@ -131,10 +97,7 @@ MathGridInset::MathGridInset()
MathGridInset::MathGridInset(col_type m, row_type n) MathGridInset::MathGridInset(col_type m, row_type n)
: MathNestInset(m * n), : MathNestInset(m * n),
rowinfo_(n + 1), rowinfo_(n), colinfo_(m), cellinfo_(m * n), v_align_('c')
colinfo_(m + 1),
cellinfo_(m * n),
v_align_('c')
{ {
setDefaults(); 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) MathGridInset::MathGridInset(col_type m, row_type n, char v, string const & h)
: MathNestInset(m * n), : MathNestInset(m * n),
rowinfo_(n + 1), rowinfo_(n), colinfo_(m), cellinfo_(m * n), v_align_(v)
colinfo_(m + 1),
cellinfo_(m * n),
v_align_(v)
{ {
setDefaults(); setDefaults();
valign(v); valign(v);
@ -179,7 +139,7 @@ void MathGridInset::setDefaults()
//if (nrows() <= 0) //if (nrows() <= 0)
// lyxerr << "positive number of rows expected\n"; // lyxerr << "positive number of rows expected\n";
for (col_type col = 0; col < ncols(); ++col) { for (col_type col = 0; col < ncols(); ++col) {
colinfo_[col].align_ = defaultColAlign(col); colinfo_[col].align = defaultColAlign(col);
colinfo_[col].skip_ = defaultColSpace(col); colinfo_[col].skip_ = defaultColSpace(col);
} }
} }
@ -189,13 +149,13 @@ void MathGridInset::halign(string const & hh)
{ {
col_type col = 0; col_type col = 0;
for (string::const_iterator it = hh.begin(); it != hh.end(); ++it) { for (string::const_iterator it = hh.begin(); it != hh.end(); ++it) {
if (col >= ncols()) if (col == ncols())
break; addCol(ncols() - 1);
char c = *it; char c = *it;
if (c == '|') { if (c == '|') {
colinfo_[col].lines_++; colinfo_[col].lines_++;
} else if (c == 'c' || c == 'l' || c == 'r') { } else if (c == 'c' || c == 'l' || c == 'r') {
colinfo_[col].align_ = c; colinfo_[col].align = c;
++col; ++col;
colinfo_[col].lines_ = 0; colinfo_[col].lines_ = 0;
} else { } 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) void MathGridInset::halign(char h, col_type col)
{ {
colinfo_[col].align_ = h; colinfo_[col].align = h;
} }
char MathGridInset::halign(col_type col) const 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; string res;
for (col_type col = 0; col < ncols(); ++col) { for (col_type col = 0; col < ncols(); ++col) {
res += string(colinfo_[col].lines_, '|'); res += string(colinfo_[col].lines_, '|');
res += colinfo_[col].align_; res += colinfo_[col].align;
} }
return res + string(colinfo_[ncols()].lines_, '|'); return res + string(colinfo_[ncols()].lines_, '|');
} }
@ -660,7 +607,7 @@ void MathGridInset::addCol(col_type newcol)
ColInfo inf; ColInfo inf;
inf.skip_ = defaultColSpace(newcol); inf.skip_ = defaultColSpace(newcol);
inf.align_ = defaultColAlign(newcol); inf.align = defaultColAlign(newcol);
colinfo_.insert(colinfo_.begin() + newcol, inf); colinfo_.insert(colinfo_.begin() + newcol, inf);
} }
@ -707,7 +654,7 @@ int MathGridInset::cellXOffset(idx_type idx) const
{ {
col_type c = col(idx); col_type c = col(idx);
int x = colinfo_[c].offset_; int x = colinfo_[c].offset_;
char align = colinfo_[c].align_; char align = colinfo_[c].align;
if (align == 'r' || align == 'R') if (align == 'r' || align == 'R')
x += colinfo_[c].width_ - cell(idx).width(); x += colinfo_[c].width_ - cell(idx).width();
if (align == 'c' || align == 'C') if (align == 'c' || align == 'C')

View File

@ -5,6 +5,7 @@
#include "math_nestinset.h" #include "math_nestinset.h"
#include "vspace.h" #include "vspace.h"
#include "LString.h" #include "LString.h"
#include "math_gridinfo.h"
/** Gridded math inset base class. /** Gridded math inset base class.
@ -20,15 +21,8 @@ class MathGridInset : public MathNestInset {
public: public:
/// additional per-cell information /// additional per-cell information
struct CellInfo { struct CellInfo : public ::CellInfo {
/// /// fixed glue
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
mutable int glue_; mutable int glue_;
/// ///
mutable pos_type begin_; mutable pos_type begin_;
@ -37,45 +31,45 @@ public:
}; };
/// additional per-row information /// additional per-row information
struct RowInfo { struct RowInfo : public ::RowInfo {
/// ///
RowInfo(); RowInfo()
: lines_(0), skip_(0)
{}
/// ///
int skipPixels() const; 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 /// cached descent
mutable int descent_; mutable int descent_;
/// cached ascent /// cached ascent
mutable int ascent_; mutable int ascent_;
/// cached offset /// cached offset
mutable int 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 // additional per-row information
struct ColInfo { struct ColInfo : public ::ColInfo {
/// ///
ColInfo(); ColInfo()
/// currently possible: 'l', 'c', 'r' : lines_(0), skip_(0)
char align_; {}
/// cache for drawing /// cache for drawing
int h_offset; int lines_;
/// additional amount to be skipped on screen
int skip_;
/// cached width /// cached width
mutable int width_; mutable int width_;
/// cached offset /// cached offset
mutable int 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: public:
@ -220,8 +214,6 @@ protected:
virtual string eolString(row_type row, bool fragile = false) const; virtual string eolString(row_type row, bool fragile = false) const;
/// returns proper 'end of column' code for LaTeX /// returns proper 'end of column' code for LaTeX
virtual string eocString(col_type col, col_type lastcol) const; 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 /// splits cells and shifts right part to the next cell
void splitCell(idx_type &, pos_type & pos); void splitCell(idx_type &, pos_type & pos);

View File

@ -137,6 +137,9 @@ void parse_math(Parser & p, ostream & os, unsigned flags, const mode_type mode)
} }
else if (t.cs() == "[") { else if (t.cs() == "[") {
// special handling of a few common SW user quirks
p.skip_spaces();
//if (p.next_token().cs() ==
os << "\\["; os << "\\[";
parse_math(p, os, FLAG_EQUATION, MATH_MODE); parse_math(p, os, FLAG_EQUATION, MATH_MODE);
os << "\\]"; os << "\\]";

View File

@ -23,44 +23,10 @@ using std::ostringstream;
using std::string; using std::string;
using std::vector; using std::vector;
#include "mathed/math_gridinfo.h"
namespace { 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) int string2int(string const & s, int deflt = 0)
{ {
istringstream is(s); istringstream is(s);
@ -73,7 +39,7 @@ int string2int(string const & s, int deflt = 0)
string read_hlines(Parser & p) string read_hlines(Parser & p)
{ {
ostringstream os; ostringstream os;
p.skipSpaces(); p.skip_spaces();
while (p.good()) { while (p.good()) {
if (p.next_token().cs() == "hline") { if (p.next_token().cs() == "hline") {
p.get_token(); p.get_token();
@ -83,7 +49,7 @@ string read_hlines(Parser & p)
os << "\\cline{" << p.verbatim_item() << "}"; os << "\\cline{" << p.verbatim_item() << "}";
} else } else
break; break;
p.skipSpaces(); p.skip_spaces();
}; };
//cerr << "read_hlines(), read: '" << os.str() << "'\n"; //cerr << "read_hlines(), read: '" << os.str() << "'\n";
//cerr << "read_hlines(), next token: " << p.next_token() << "\n"; //cerr << "read_hlines(), next token: " << p.next_token() << "\n";
@ -111,24 +77,13 @@ char const TAB = '\001';
char const LINE = '\002'; char const LINE = '\002';
char const HLINE = '\004'; 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) void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
{ {
if (p.get_token().cat() != catBegin) if (p.get_token().cat() != catBegin)
cerr << "wrong syntax for table column alignment. '{' expected\n"; cerr << "wrong syntax for table column alignment. '{' expected\n";
string nextalign = "block"; char nextalign = 'b';
bool leftline = false; bool leftline = false;
for (Token t=p.get_token(); p.good() && t.cat() != catEnd; t = p.get_token()){ for (Token t=p.get_token(); p.good() && t.cat() != catEnd; t = p.get_token()){
#ifdef FILEDEBUG #ifdef FILEDEBUG
@ -140,7 +95,7 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
case 'l': case 'l':
case 'r': { case 'r': {
ColInfo ci; ColInfo ci;
ci.align = get_align(t.character()); ci.align = t.character();
if (colinfo.size() && colinfo.back().rightline > 1) { if (colinfo.size() && colinfo.back().rightline > 1) {
ci.leftline = true; ci.leftline = true;
--colinfo.back().rightline; --colinfo.back().rightline;
@ -152,7 +107,7 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
colinfo.push_back(ColInfo()); colinfo.push_back(ColInfo());
colinfo.back().align = nextalign; colinfo.back().align = nextalign;
colinfo.back().width = p.verbatim_item(); colinfo.back().width = p.verbatim_item();
nextalign = "block"; nextalign = 'b';
break; break;
case '|': case '|':
if (colinfo.empty()) if (colinfo.empty())
@ -163,9 +118,9 @@ void handle_colalign(Parser & p, vector<ColInfo> & colinfo)
case '>': { case '>': {
string s = p.verbatim_item(); string s = p.verbatim_item();
if (s == "\\raggedleft ") if (s == "\\raggedleft ")
nextalign = "left"; nextalign = 'l';
else if (s == "\\raggedright ") else if (s == "\\raggedright ")
nextalign = "right"; nextalign = 'r';
else else
cerr << "unknown '>' column '" << s << "'\n"; cerr << "unknown '>' column '" << s << "'\n";
break; 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" || t.cs() == "\\") {
//else if (t.cs() == "tabularnewline") {
// stuff before the line break // stuff before the line break
// and look ahead for stuff after the line break // and look ahead for stuff after the line break
os << HLINE << hlines << HLINE << LINE << read_hlines(p) << HLINE; 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) { cell < cells.size() && col < colinfo.size(); ++col, ++cell) {
//cerr << "cell content: '" << cells[cell] << "'\n"; //cerr << "cell content: '" << cells[cell] << "'\n";
Parser p(cells[cell]); Parser p(cells[cell]);
p.skipSpaces(); p.skip_spaces();
//cells[cell] << "'\n"; //cells[cell] << "'\n";
if (p.next_token().cs() == "multicolumn") { if (p.next_token().cs() == "multicolumn") {
// how many cells? // 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) { for (size_t i = 0; i < ncells - 1 && col < colinfo.size(); ++i) {
++col; ++col;
cellinfo[row][col].multi = 2; cellinfo[row][col].multi = 2;
cellinfo[row][col].align = "center"; cellinfo[row][col].align = 'c';
} }
// more than one line on the right? // more than one line on the right?
@ -505,7 +459,7 @@ void handle_tabular(Parser & p, ostream & os)
// cerr << " topline=\"true\""; // cerr << " topline=\"true\"";
//if (cell.bottomline) //if (cell.bottomline)
// cerr << " bottomline=\"true\""; // cerr << " bottomline=\"true\"";
os << " alignment=\"" << cell.align << "\"" os << " alignment=\"" << verbose_align(cell.align) << "\""
<< " valignment=\"top\"" << " valignment=\"top\""
<< " usebox=\"none\"" << " usebox=\"none\""
<< ">" << ">"

View File

@ -40,7 +40,7 @@ void handle_comment(Parser & p)
s += t.asString(); s += t.asString();
} }
//cerr << "comment: " << s << "\n"; //cerr << "comment: " << s << "\n";
p.skipSpaces(); p.skip_spaces();
} }

View File

@ -166,7 +166,7 @@ Token const & Parser::get_token()
} }
void Parser::skipSpaces() void Parser::skip_spaces()
{ {
while (1) { while (1) {
if (next_token().cat() == catSpace || next_token().cat() == catNewline) if (next_token().cat() == catSpace || next_token().cat() == catNewline)
@ -202,7 +202,7 @@ char Parser::getChar()
string Parser::getArg(char left, char right) string Parser::getArg(char left, char right)
{ {
skipSpaces(); skip_spaces();
string result; string result;
char c = getChar(); char c = getChar();
@ -341,7 +341,7 @@ string Parser::verbatim_item()
{ {
if (!good()) if (!good())
error("stream bad"); error("stream bad");
skipSpaces(); skip_spaces();
if (next_token().cat() == catBegin) { if (next_token().cat() == catBegin) {
Token t = get_token(); // skip brace Token t = get_token(); // skip brace
string res; string res;

View File

@ -128,7 +128,7 @@ public:
/// ///
Token const & get_token(); Token const & get_token();
/// skips spaces if any /// skips spaces if any
void skipSpaces(); void skip_spaces();
/// ///
void lex(string const & s); void lex(string const & s);
/// ///

View File

@ -332,7 +332,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
} }
else if (t.cs() == "item") { else if (t.cs() == "item") {
p.skipSpaces(); p.skip_spaces();
string s; string s;
if (p.next_token().character() == '[') { if (p.next_token().character() == '[') {
p.get_token(); // eat '[' p.get_token(); // eat '['
@ -350,7 +350,7 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer)
} }
else if (t.cs() == "par") { else if (t.cs() == "par") {
p.skipSpaces(); p.skip_spaces();
if (p.next_token().cs() != "\\begin") if (p.next_token().cs() != "\\begin")
handle_par(os); handle_par(os);
//cerr << "next token: '" << p.next_token().cs() << "'\n"; //cerr << "next token: '" << p.next_token().cs() << "'\n";