small parser fixes

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@6326 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2003-03-03 17:49:26 +00:00
parent ca4efc12c2
commit b366633564
3 changed files with 95 additions and 25 deletions

View File

@ -989,6 +989,7 @@ void Parser::parse1(MathGridInset & grid, unsigned flags,
else if (t.cs() == "begin") {
string const name = getArg('{', '}');
skipSpaces();
if (name == "array" || name == "subarray") {
string const valign = parse_verbatim_option() + 'c';
@ -1001,7 +1002,7 @@ void Parser::parse1(MathGridInset & grid, unsigned flags,
string const valign = parse_verbatim_option() + 'c';
string const halign = parse_verbatim_item();
cell->push_back(MathAtom(new MathTabularInset(name, valign[0], halign)));
parse2(cell->back(), FLAG_END, mode, false);
parse2(cell->back(), FLAG_END, MathInset::TEXT_MODE, false);
}
else if (name == "split" || name == "cases" ||

View File

@ -10,6 +10,7 @@
#include <cctype>
#include <fstream>
#include <iostream>
#include <map>
#include <stack>
#include <string>
#include <vector>
@ -28,6 +29,7 @@ using std::ios;
using std::ifstream;
using std::istream;
using std::istringstream;
using std::map;
using std::ostream;
using std::ostringstream;
using std::stack;
@ -37,7 +39,7 @@ using std::vector;
namespace {
void parse(Parser & p, ostream & os, unsigned flags, mode_type mode);
void parse(Parser & p, ostream & os, unsigned flags, const mode_type mode);
char const OPEN = '<';
char const CLOSE = '>';
@ -135,7 +137,7 @@ string cap(string s)
}
string const trim(string const & a, char const * p = " ")
string const trim(string const & a, char const * p = " \t\n\r")
{
// lyx::Assert(p);
@ -153,7 +155,7 @@ string const trim(string const & a, char const * p = " ")
}
void split(string const & s, vector<string> & result, char delim)
void split(string const & s, vector<string> & result, char delim = ',')
{
istringstream is(s);
string t;
@ -162,6 +164,22 @@ void split(string const & s, vector<string> & result, char delim)
}
// splits "x=z, y=b" into a map
map<string, string> split_map(string const & s)
{
map<string, string> res;
vector<string> v;
split(s, v);
for (size_t i = 0; i < v.size(); ++i) {
size_t const pos = v[i].find('=');
string const index = v[i].substr(0, pos);
string const value = v[i].substr(pos + 1, string::npos);
res[trim(index)] = trim(value);
}
return res;
}
string join(vector<string> const & input, char delim)
{
ostringstream os;
@ -415,7 +433,7 @@ void end_preamble(ostream & os)
}
void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
void parse(Parser & p, ostream & os, unsigned flags, const mode_type mode)
{
while (p.good()) {
Token const & t = p.getToken();
@ -533,39 +551,39 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
}
else if (t.cat() == catBegin) {
if (mode == MATH_MODE)
os << '{';
else
if (mode == TEXT_MODE)
handle_tex(os, "{");
else
os << '{';
}
else if (t.cat() == catEnd) {
if (flags & FLAG_BRACE_LAST)
return;
if (mode == MATH_MODE)
os << '}';
else
if (mode == TEXT_MODE)
handle_tex(os, "}");
else
os << '}';
}
else if (t.cat() == catAlign) {
if (mode == MATH_MODE)
os << t.character();
else
if (mode == TEXT_MODE)
os << TAB;
else
os << t.character();
}
else if (t.cs() == "tabularnewline") {
if (mode == MATH_MODE)
os << t.asInput();
else
if (mode == TEXT_MODE)
os << LINE;
else
os << t.asInput();
}
else if (t.cs() == "\\" && mode == MATH_MODE)
os << t.asInput();
else if (t.cs() == "\\" && curr_env() == "tabular")
else if (t.cs() == "\\" && mode == TEXT_MODE && curr_env() == "tabular")
os << LINE;
else if (t.character() == ']' && (flags & FLAG_BRACK_LAST)) {
@ -612,6 +630,11 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
string const body = p.verbatimItem();
// only non-lyxspecific stuff
if (name != "\\noun " && name != "\\tabularnewline ") {
ostringstream ss;
ss << '\\' << t.cs() << '{' << name << '}'
<< opts << '{' << body << "}\n";
handle_tex(os, ss.str());
/*
ostream & out = in_preamble ? h_preamble : os;
if (!in_preamble)
begin_inset(os, "FormulaMacro\n");
@ -619,6 +642,7 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
<< opts << "{" << body << "}\n";
if (!in_preamble)
end_inset(os);
*/
}
}
@ -658,6 +682,7 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
active_environments.push(name);
if (name == "document") {
end_preamble(os);
os << "\n\n\\layout Standard\n\n";
parse(p, os, FLAG_END, mode);
} else if (name == "abstract") {
handle_par(os);
@ -669,15 +694,18 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
os << "\\end{" << name << "}";
end_inset(os);
} else if (name == "tabular") {
if (mode == TEXT_MODE)
if (mode == TEXT_MODE)
handle_tabular(p, os, mode);
else {
os << "\\begin{" << name << "}";
parse(p, os, FLAG_END, MATHTEXT_MODE);
os << "\\end{" << name << "}";
}
} else if (name == "table") {
begin_inset(os, "Float table\n");
} else if (name == "table" || name == "figure") {
string opts = p.getOpt();
begin_inset(os, "Float " + name + "\n");
if (opts.size())
os << "placement " << opts << '\n';
os << "wide false\n"
<< "collapsed false\n"
<< "\n"
@ -688,7 +716,7 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
p.verbatimItem(); // swallow next arg
parse(p, os, FLAG_END, mode);
os << "\n\\layout Standard\n\n";
} else if (mode == MATH_MODE) {
} else if (mode == MATH_MODE || mode == MATHTEXT_MODE) {
os << "\\begin{" << name << "}";
parse(p, os, FLAG_END, mode);
os << "\\end{" << name << "}";
@ -823,6 +851,19 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
}
os << "\n\n\\layout " << cap(name) << "\n\n";
parse(p, os, FLAG_ITEM, mode);
os << "\n\n\\layout Standard\n\n";
}
else if (t.cs() == "includegraphics") {
map<string, string> opts = split_map(p.getArg('[', ']'));
string name = p.verbatimItem();
begin_inset(os, "Graphics ");
os << "\n\tfilename " << name << '\n';
if (opts.find("width") != opts.end())
os << "\twidth " << opts["width"] << '\n';
if (opts.find("height") != opts.end())
os << "\theight " << opts["height"] << '\n';
end_inset(os);
}
else if (t.cs() == "makeindex" || t.cs() == "maketitle")
@ -883,6 +924,20 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
else if (t.cs() == "&" && mode == TEXT_MODE)
os << '&';
else if (t.cs() == "\"") {
string const name = p.verbatimItem();
if (name == "a") os << 'ä';
else if (name == "o") os << 'ö';
else if (name == "u") os << 'ü';
else if (name == "A") os << 'Ä';
else if (name == "O") os << 'Ö';
else if (name == "U") os << 'Ü';
else handle_ert(os, "\"{" + name + "}");
}
else if (t.cs() == "ss")
os << "ß";
else if (t.cs() == "input")
handle_tex(os, "\\input{" + p.verbatimItem() + "}\n");
@ -898,8 +953,11 @@ void parse(Parser & p, ostream & os, unsigned flags, mode_type mode)
}
else {
if (mode == MATH_MODE)
//cerr << "#: " << t << " mode: " << mode << endl;
if (mode == MATH_MODE || mode == MATHTEXT_MODE) {
os << t.asInput();
//cerr << "#: writing: '" << t.asInput() << "'\n";
}
else if (in_preamble)
h_preamble << t.asInput();
else {

View File

@ -49,6 +49,9 @@ void catInit()
theCatcode[13] = catIgnore;
theCatcode['~'] = catActive;
theCatcode['%'] = catComment;
// This is wrong!
theCatcode['@'] = catLetter;
}
}
@ -149,8 +152,15 @@ Token const & Parser::getToken()
void Parser::skipSpaces()
{
while (nextToken().cat() == catSpace || nextToken().cat() == catNewline)
getToken();
while (1) {
if (nextToken().cat() == catSpace || nextToken().cat() == catNewline)
getToken();
else if (nextToken().cat() == catComment)
while (nextToken().cat() != catNewline)
getToken();
else
break;
}
}
@ -312,6 +322,7 @@ string Parser::verbatimItem()
{
if (!good())
error("stream bad");
skipSpaces();
if (nextToken().cat() == catBegin) {
Token t = getToken(); // skip brace
string res;