more Lexer;

also move tex2lyx specific code to tex2lyx


git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@24129 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
André Pönitz 2008-04-05 19:01:43 +00:00
parent c9052c48a5
commit 835d051ae3
7 changed files with 178 additions and 217 deletions

View File

@ -131,7 +131,7 @@ Layout::Layout()
}
bool Layout::read(Lexer & lexrc, TextClass const & tclass)
bool Layout::read(Lexer & lex, TextClass const & tclass)
{
// This table is sorted alphabetically [asierra 30March96]
LexerKeyword layoutTags[] = {
@ -191,17 +191,17 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass)
bool error = false;
bool finished = false;
lexrc.pushTable(layoutTags);
lex.pushTable(layoutTags);
// parse style section
while (!finished && lexrc.isOK() && !error) {
int le = lexrc.lex();
while (!finished && lex.isOK() && !error) {
int le = lex.lex();
// See comment in LyXRC.cpp.
switch (le) {
case Lexer::LEX_FEOF:
continue;
case Lexer::LEX_UNDEF: // parse error
lexrc.printError("Unknown layout tag `$$Token'");
lex.printError("Unknown layout tag `$$Token'");
error = true;
continue;
default: break;
@ -212,293 +212,264 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass)
break;
case LT_CATEGORY:
if (lexrc.next())
category_ = lexrc.getDocString();
lex >> category_;
break;
case LT_COPYSTYLE: // initialize with a known style
if (lexrc.next()) {
docstring const style = subst(lexrc.getDocString(),
'_', ' ');
case LT_COPYSTYLE: { // initialize with a known style
docstring style;
lex >> style;
style = subst(style, '_', ' ');
if (tclass.hasLayout(style)) {
docstring const tmpname = name_;
this->operator=(tclass[style]);
name_ = tmpname;
} else {
lyxerr << "Cannot copy unknown style `"
<< to_utf8(style) << "'\n"
<< "All layouts so far:"
<< endl;
DocumentClass::const_iterator lit = tclass.begin();
DocumentClass::const_iterator len = tclass.end();
for (; lit != len; ++lit)
lyxerr << to_utf8(lit->name()) << endl;
if (tclass.hasLayout(style)) {
docstring const tmpname = name_;
this->operator=(tclass[style]);
name_ = tmpname;
} else {
lyxerr << "Cannot copy unknown style `"
<< to_utf8(style) << "'\n"
<< "All layouts so far:"
<< endl;
DocumentClass::const_iterator lit = tclass.begin();
DocumentClass::const_iterator len = tclass.end();
for (; lit != len; ++lit)
lyxerr << to_utf8(lit->name()) << endl;
//lexrc.printError("Cannot copy known "
// "style `$$Token'");
}
//lex.printError("Cannot copy known "
// "style `$$Token'");
}
break;
}
case LT_OBSOLETEDBY: // replace with a known style
if (lexrc.next()) {
docstring const style =
subst(lexrc.getDocString(), '_', ' ');
case LT_OBSOLETEDBY: { // replace with a known style
docstring style;
lex >> style;
style = subst(style, '_', ' ');
if (tclass.hasLayout(style)) {
docstring const tmpname = name_;
this->operator=(tclass[style]);
name_ = tmpname;
if (obsoleted_by().empty())
obsoleted_by_ = style;
} else {
lyxerr << "Cannot replace with unknown style `"
<< to_utf8(style) << '\'' << endl;
if (tclass.hasLayout(style)) {
docstring const tmpname = name_;
this->operator=(tclass[style]);
name_ = tmpname;
if (obsoleted_by().empty())
obsoleted_by_ = style;
} else {
lyxerr << "Cannot replace with unknown style `"
<< to_utf8(style) << '\'' << endl;
//lexrc.printError("Cannot replace with"
// " unknown style "
// "`$$Token'");
}
//lex.printError("Cannot replace with"
// " unknown style "
// "`$$Token'");
}
break;
}
case LT_DEPENDSON:
if (lexrc.next())
depends_on_ = subst(lexrc.getDocString(), '_', ' ');
lex >> depends_on_;
depends_on_ = subst(depends_on_, '_', ' ');
break;
case LT_MARGIN: // margin style definition.
readMargin(lexrc);
readMargin(lex);
break;
case LT_LATEXTYPE: // LaTeX style definition.
readLatexType(lexrc);
readLatexType(lex);
break;
case LT_LATEXHEADER: // header for environments
lexrc.next();
latexheader = lexrc.getString();
lex >> latexheader;
break;
case LT_LATEXFOOTER: // footer for environments
lexrc.next();
latexfooter = lexrc.getString();
lex >> latexfooter;
break;
case LT_LATEXPARAGRAPH:
lexrc.next();
latexparagraph = lexrc.getString();
lex >> latexparagraph;
break;
case LT_INTITLE:
intitle = lexrc.next() && lexrc.getInteger();
lex >> intitle;
break;
case LT_TOCLEVEL:
lexrc.next();
toclevel = lexrc.getInteger();
lex >> toclevel;
break;
case LT_OPTARGS:
if (lexrc.next())
optionalargs = lexrc.getInteger();
lex >> optionalargs ;
break;
case LT_NEED_PROTECT:
needprotect = lexrc.next() && lexrc.getInteger();
lex >> needprotect;
break;
case LT_KEEPEMPTY:
keepempty = lexrc.next() && lexrc.getInteger();
lex >> keepempty;
break;
case LT_FONT:
font = lyxRead(lexrc, font);
font = lyxRead(lex, font);
labelfont = font;
break;
case LT_TEXTFONT:
font = lyxRead(lexrc, font);
font = lyxRead(lex, font);
break;
case LT_LABELFONT:
labelfont = lyxRead(lexrc, labelfont);
labelfont = lyxRead(lex, labelfont);
break;
case LT_NEXTNOINDENT: // Indent next paragraph?
if (lexrc.next() && lexrc.getInteger())
nextnoindent = true;
else
nextnoindent = false;
lex >> nextnoindent;
break;
case LT_COMMANDDEPTH:
lexrc.next();
commanddepth = lexrc.getInteger();
lex >> commanddepth;
break;
case LT_LATEXNAME:
if (lexrc.next())
latexname_ = lexrc.getString();
lex >> latexname_;
break;
case LT_LATEXPARAM:
if (lexrc.next())
latexparam_ = subst(lexrc.getString(), "&quot;", "\"");
lex >> latexparam_;
latexparam_ = subst(latexparam_, "&quot;", "\"");
break;
case LT_INNERTAG:
if (lexrc.next())
innertag_ = lexrc.getString();
lex >> innertag_;
break;
case LT_LABELTAG:
if (lexrc.next())
labeltag_ = lexrc.getString();
lex >> labeltag_;
break;
case LT_ITEMTAG:
if (lexrc.next())
itemtag_ = lexrc.getString();
lex >> itemtag_;
break;
case LT_PREAMBLE:
preamble_ = from_utf8(lexrc.getLongString("EndPreamble"));
preamble_ = from_utf8(lex.getLongString("EndPreamble"));
break;
case LT_LABELTYPE:
readLabelType(lexrc);
readLabelType(lex);
break;
case LT_ENDLABELTYPE:
readEndLabelType(lexrc);
readEndLabelType(lex);
break;
case LT_LEFTMARGIN: // left margin type
if (lexrc.next())
leftmargin = lexrc.getDocString();
lex >> leftmargin;
break;
case LT_RIGHTMARGIN: // right margin type
if (lexrc.next())
rightmargin = lexrc.getDocString();
lex >> rightmargin;
break;
case LT_LABELINDENT: // label indenting flag
if (lexrc.next())
labelindent = lexrc.getDocString();
lex >> labelindent;
break;
case LT_PARINDENT: // paragraph indent. flag
if (lexrc.next())
parindent = lexrc.getDocString();
lex >> parindent;
break;
case LT_PARSKIP: // paragraph skip size
if (lexrc.next())
parskip = lexrc.getFloat();
lex >> parskip;
break;
case LT_ITEMSEP: // item separation size
if (lexrc.next())
itemsep = lexrc.getFloat();
lex >> itemsep;
break;
case LT_TOPSEP: // top separation size
if (lexrc.next())
topsep = lexrc.getFloat();
lex >> topsep;
break;
case LT_BOTTOMSEP: // bottom separation size
if (lexrc.next())
bottomsep = lexrc.getFloat();
lex >> bottomsep;
break;
case LT_LABEL_BOTTOMSEP: // label bottom separation size
if (lexrc.next())
labelbottomsep = lexrc.getFloat();
lex >> labelbottomsep;
break;
case LT_LABELSEP: // label separator
if (lexrc.next()) {
labelsep = from_utf8(subst(lexrc.getString(), 'x', ' '));
}
lex >> labelsep;
labelsep = subst(labelsep, 'x', ' ');
break;
case LT_PARSEP: // par. separation size
if (lexrc.next())
parsep = lexrc.getFloat();
lex >> parsep;
break;
case LT_FILL_TOP: // fill top flag
if (lexrc.next())
fill_top = lexrc.getInteger();
lex >> fill_top;
break;
case LT_FILL_BOTTOM: // fill bottom flag
if (lexrc.next())
fill_bottom = lexrc.getInteger();
lex >> fill_bottom;
break;
case LT_NEWLINE: // newlines allowed?
if (lexrc.next())
newline_allowed = lexrc.getInteger();
lex >> newline_allowed;
break;
case LT_ALIGN: // paragraph align
readAlign(lexrc);
readAlign(lex);
break;
case LT_ALIGNPOSSIBLE: // paragraph allowed align
readAlignPossible(lexrc);
readAlignPossible(lex);
break;
case LT_LABELSTRING: // label string definition
if (lexrc.next()) {
labelstring_ = trim(lexrc.getDocString());
labelstring_appendix_ = labelstring_;
}
// FIXME: this means LT_ENDLABELSTRING may only
// occur after LT_LABELSTRING
lex >> labelstring_;
labelstring_ = trim(labelstring_);
labelstring_appendix_ = labelstring_;
break;
case LT_ENDLABELSTRING: // endlabel string definition
if (lexrc.next())
endlabelstring_ = trim(lexrc.getDocString());
lex >> endlabelstring_;
endlabelstring_ = trim(endlabelstring_);
break;
case LT_LABELSTRING_APPENDIX: // label string appendix definition
if (lexrc.next())
labelstring_appendix_ = trim(lexrc.getDocString());
lex >> labelstring_appendix_;
labelstring_appendix_ = trim(labelstring_appendix_);
break;
case LT_LABELCOUNTER: // name of counter to use
if (lexrc.next())
counter = lyx::from_ascii(trim(lexrc.getString()));
lex >> counter;
counter = trim(counter);
break;
case LT_FREE_SPACING: // Allow for free spacing.
if (lexrc.next())
free_spacing = lexrc.getInteger();
lex >> free_spacing;
break;
case LT_PASS_THRU: // Allow for pass thru.
if (lexrc.next())
pass_thru = lexrc.getInteger();
lex >> pass_thru;
break;
case LT_SPACING: // setspace.sty
readSpacing(lexrc);
readSpacing(lex);
break;
case LT_REQUIRES:
lexrc.eatLine();
lex.eatLine();
vector<string> const req =
getVectorFromString(lexrc.getString());
getVectorFromString(lex.getString());
requires_.insert(req.begin(), req.end());
break;
}
}
lexrc.popTable();
lex.popTable();
return !error;
}
@ -512,21 +483,23 @@ enum {
AT_LAYOUT
};
void Layout::readAlign(Lexer & lexrc)
{
LexerKeyword alignTags[] = {
{ "block", AT_BLOCK },
{ "center", AT_CENTER },
{ "layout", AT_LAYOUT },
{ "left", AT_LEFT },
{ "right", AT_RIGHT }
};
PushPopHelper pph(lexrc, alignTags);
int le = lexrc.lex();
LexerKeyword alignTags[] = {
{ "block", AT_BLOCK },
{ "center", AT_CENTER },
{ "layout", AT_LAYOUT },
{ "left", AT_LEFT },
{ "right", AT_RIGHT }
};
void Layout::readAlign(Lexer & lex)
{
PushPopHelper pph(lex, alignTags);
int le = lex.lex();
switch (le) {
case Lexer::LEX_UNDEF:
lexrc.printError("Unknown alignment `$$Token'");
lex.printError("Unknown alignment `$$Token'");
return;
default: break;
};
@ -550,24 +523,16 @@ void Layout::readAlign(Lexer & lexrc)
}
void Layout::readAlignPossible(Lexer & lexrc)
void Layout::readAlignPossible(Lexer & lex)
{
LexerKeyword alignTags[] = {
{ "block", AT_BLOCK },
{ "center", AT_CENTER },
{ "layout", AT_LAYOUT },
{ "left", AT_LEFT },
{ "right", AT_RIGHT }
};
lexrc.pushTable(alignTags);
lex.pushTable(alignTags);
alignpossible = LYX_ALIGN_NONE | LYX_ALIGN_LAYOUT;
int lineno = lexrc.lineNumber();
int lineno = lex.lineNumber();
do {
int le = lexrc.lex();
int le = lex.lex();
switch (le) {
case Lexer::LEX_UNDEF:
lexrc.printError("Unknown alignment `$$Token'");
lex.printError("Unknown alignment `$$Token'");
continue;
default: break;
};
@ -588,12 +553,12 @@ void Layout::readAlignPossible(Lexer & lexrc)
alignpossible |= LYX_ALIGN_LAYOUT;
break;
}
} while (lineno == lexrc.lineNumber());
lexrc.popTable();
} while (lineno == lex.lineNumber());
lex.popTable();
}
void Layout::readLabelType(Lexer & lexrc)
void Layout::readLabelType(Lexer & lex)
{
enum {
LA_NO_LABEL = 1,
@ -622,11 +587,11 @@ void Layout::readLabelType(Lexer & lexrc)
{ "top_environment", LA_TOP_ENVIRONMENT }
};
PushPopHelper pph(lexrc, labelTypeTags);
int le = lexrc.lex();
PushPopHelper pph(lex, labelTypeTags);
int le = lex.lex();
switch (le) {
case Lexer::LEX_UNDEF:
lexrc.printError("Unknown labeltype tag `$$Token'");
lex.printError("Unknown labeltype tag `$$Token'");
return;
default: break;
}
@ -665,7 +630,7 @@ void Layout::readLabelType(Lexer & lexrc)
}
void Layout::readEndLabelType(Lexer & lexrc)
void Layout::readEndLabelType(Lexer & lex)
{
static LexerKeyword endlabelTypeTags[] = {
{ "box", END_LABEL_BOX },
@ -674,11 +639,11 @@ void Layout::readEndLabelType(Lexer & lexrc)
{ "static", END_LABEL_STATIC }
};
PushPopHelper pph(lexrc, endlabelTypeTags);
int le = lexrc.lex();
PushPopHelper pph(lex, endlabelTypeTags);
int le = lex.lex();
switch (le) {
case Lexer::LEX_UNDEF:
lexrc.printError("Unknown labeltype tag `$$Token'");
lex.printError("Unknown labeltype tag `$$Token'");
break;
case END_LABEL_STATIC:
case END_LABEL_BOX:
@ -687,14 +652,14 @@ void Layout::readEndLabelType(Lexer & lexrc)
endlabeltype = static_cast<EndLabelType>(le);
break;
default:
lyxerr << "Unhandled value " << le
<< " in Layout::readEndLabelType." << endl;
LYXERR0("Unhandled value " << le
<< " in Layout::readEndLabelType.");
break;
}
}
void Layout::readMargin(Lexer & lexrc)
void Layout::readMargin(Lexer & lex)
{
LexerKeyword marginTags[] = {
{ "dynamic", MARGIN_DYNAMIC },
@ -704,12 +669,12 @@ void Layout::readMargin(Lexer & lexrc)
{ "static", MARGIN_STATIC }
};
PushPopHelper pph(lexrc, marginTags);
PushPopHelper pph(lex, marginTags);
int le = lexrc.lex();
int le = lex.lex();
switch (le) {
case Lexer::LEX_UNDEF:
lexrc.printError("Unknown margin type tag `$$Token'");
lex.printError("Unknown margin type tag `$$Token'");
return;
case MARGIN_STATIC:
case MARGIN_MANUAL:
@ -726,7 +691,7 @@ void Layout::readMargin(Lexer & lexrc)
}
void Layout::readLatexType(Lexer & lexrc)
void Layout::readLatexType(Lexer & lex)
{
LexerKeyword latexTypeTags[] = {
{ "bib_environment", LATEX_BIB_ENVIRONMENT },
@ -737,11 +702,11 @@ void Layout::readLatexType(Lexer & lexrc)
{ "paragraph", LATEX_PARAGRAPH }
};
PushPopHelper pph(lexrc, latexTypeTags);
int le = lexrc.lex();
PushPopHelper pph(lex, latexTypeTags);
int le = lex.lex();
switch (le) {
case Lexer::LEX_UNDEF:
lexrc.printError("Unknown latextype tag `$$Token'");
lex.printError("Unknown latextype tag `$$Token'");
return;
case LATEX_PARAGRAPH:
case LATEX_COMMAND:
@ -759,7 +724,7 @@ void Layout::readLatexType(Lexer & lexrc)
}
void Layout::readSpacing(Lexer & lexrc)
void Layout::readSpacing(Lexer & lex)
{
enum {
ST_SPACING_SINGLE = 1,
@ -775,11 +740,11 @@ void Layout::readSpacing(Lexer & lexrc)
{"single", ST_SPACING_SINGLE }
};
PushPopHelper pph(lexrc, spacingTags);
int le = lexrc.lex();
PushPopHelper pph(lex, spacingTags);
int le = lex.lex();
switch (le) {
case Lexer::LEX_UNDEF:
lexrc.printError("Unknown spacing token `$$Token'");
lex.printError("Unknown spacing token `$$Token'");
return;
default: break;
}
@ -794,8 +759,8 @@ void Layout::readSpacing(Lexer & lexrc)
spacing.set(Spacing::Double);
break;
case ST_OTHER:
lexrc.next();
spacing.set(Spacing::Other, lexrc.getString());
lex.next();
spacing.set(Spacing::Other, lex.getString());
break;
}
}
@ -835,14 +800,4 @@ bool Layout::operator==(Layout const & rhs) const
}
Layout * Layout::forCaption()
{
Layout * lay = new Layout();
lay->name_ = from_ascii("Caption");
lay->latexname_ = "caption";
lay->latextype = LATEX_COMMAND;
lay->optionalargs = 1;
return lay;
}
} // namespace lyx

View File

@ -234,10 +234,12 @@ public:
/// until it has proper support for the caption inset (JMarc)
static Layout * forCaption();
private:
/// Name of the layout/paragraph environment
docstring name_;
/// LaTeX name for environment
std::string latexname_;
private:
/** Name of an layout that has replaced this layout.
This is used to rename a layout, while keeping backward
compatibility
@ -250,8 +252,6 @@ private:
*/
docstring depends_on_;
/// LaTeX name for environment
std::string latexname_;
/// Label string. "Abstract", "Reference", "Caption"...
docstring labelstring_;
///

View File

@ -24,7 +24,7 @@ namespace lyx {
namespace {
void begin_layout(ostream & os, LayoutPtr const & layout, TeXFont const & font,
void begin_layout(ostream & os, Layout const * const & layout, TeXFont const & font,
TeXFont const & normalfont)
{
os << "\n\\begin_layout " << to_utf8(layout->name()) << "\n";
@ -84,7 +84,7 @@ bool Context::empty = true;
Context::Context(bool need_layout_,
TeX2LyXDocClass const & textclass_,
LayoutPtr layout_, LayoutPtr parent_layout_,
Layout const * layout_, Layout const * parent_layout_,
TeXFont font_)
: need_layout(need_layout_),
need_end_layout(false), need_end_deeper(false),

View File

@ -78,8 +78,8 @@ class Context {
public:
Context(bool need_layout_,
TeX2LyXDocClass const & textclass_,
LayoutPtr layout_ = LayoutPtr(),
LayoutPtr parent_layout_= LayoutPtr(),
Layout const * layout_ = 0,
Layout const * parent_layout_= 0,
TeXFont font_ = TeXFont());
~Context();
@ -142,9 +142,9 @@ public:
/// The textclass of the document. Could actually be a global variable
TeX2LyXDocClass const & textclass;
/// The layout of the current paragraph
LayoutPtr layout;
Layout const * layout;
/// The layout of the outer paragraph (for environment layouts)
LayoutPtr parent_layout;
Layout const * parent_layout;
/// font attributes of this context
TeXFont font;
/// font attributes of normal text

View File

@ -40,10 +40,6 @@ using namespace lyx::support::os;
namespace lyx {
// Hacks to allow the thing to link in the lyxlayout stuff
LayoutPtr captionlayout;
string const trim(string const & a, char const * p)
{
// BOOST_ASSERT(p);
@ -400,7 +396,6 @@ void tex2lyx(istream & is, ostream & os)
stringstream ss;
TeX2LyXDocClass textclass;
parse_preamble(p, ss, documentclass, textclass);
captionlayout = LayoutPtr(Layout::forCaption());
active_environments.push_back("document");
Context context(true, textclass);

View File

@ -26,8 +26,6 @@ namespace lyx {
namespace support { class FileName; }
typedef Layout const * LayoutPtr;
class Context;
/// A trivial subclass, just to give us a public default constructor
@ -40,7 +38,6 @@ void parse_preamble(Parser & p, std::ostream & os,
/// used packages with options
extern std::map<std::string, std::vector<std::string> > used_packages;
extern LayoutPtr captionlayout;
/// in text.cpp
std::string translate_len(std::string const &);

View File

@ -424,23 +424,37 @@ void handle_comment(ostream & os, string const & s, Context & context)
}
LayoutPtr findLayout(TextClass const & textclass, string const & name)
Layout const * findLayout(TextClass const & textclass, string const & name)
{
DocumentClass::const_iterator lit = textclass.begin();
DocumentClass::const_iterator len = textclass.end();
for (; lit != len; ++lit)
if (lit->latexname() == name)
return &*lit;
return LayoutPtr();
return 0;
}
void eat_whitespace(Parser &, ostream &, Context &, bool);
Layout * captionlayout()
{
static Layout * lay = 0;
if (!lay) {
lay = new Layout;
lay->name_ = from_ascii("Caption");
lay->latexname_ = "caption";
lay->latextype = LATEX_COMMAND;
lay->optionalargs = 1;
}
return lay;
}
void output_command_layout(ostream & os, Parser & p, bool outer,
Context & parent_context,
LayoutPtr newlayout)
Layout const * newlayout)
{
parent_context.check_end_layout(os);
Context context(true, parent_context.textclass, newlayout,
@ -696,7 +710,7 @@ void parse_unknown_environment(Parser & p, string const & name, ostream & os,
void parse_environment(Parser & p, ostream & os, bool outer,
Context & parent_context)
{
LayoutPtr newlayout;
Layout const * newlayout;
string const name = p.getArg('{', '}');
const bool is_starred = suffixIs(name, '*');
string const unstarred_name = rtrim(name, "*");
@ -1105,7 +1119,7 @@ void parse_noweb(Parser & p, ostream & os, Context & context)
void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
Context & context)
{
LayoutPtr newlayout;
Layout const * newlayout = 0;
// store the current selectlanguage to be used after \foreignlanguage
string selectlang;
// Store the latest bibliographystyle (needed for bibtex inset)
@ -1539,9 +1553,9 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
// Special handling for \caption
// FIXME: remove this when InsetCaption is supported.
else if (context.new_layout_allowed &&
t.cs() == captionlayout->latexname()) {
t.cs() == captionlayout()->latexname()) {
output_command_layout(os, p, outer, context,
captionlayout);
captionlayout());
p.skip_spaces();
}