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

View File

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

View File

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

View File

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

View File

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

View File

@ -26,8 +26,6 @@ namespace lyx {
namespace support { class FileName; } namespace support { class FileName; }
typedef Layout const * LayoutPtr;
class Context; class Context;
/// A trivial subclass, just to give us a public default constructor /// 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 /// used packages with options
extern std::map<std::string, std::vector<std::string> > used_packages; extern std::map<std::string, std::vector<std::string> > used_packages;
extern LayoutPtr captionlayout;
/// in text.cpp /// in text.cpp
std::string translate_len(std::string const &); 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 lit = textclass.begin();
DocumentClass::const_iterator len = textclass.end(); DocumentClass::const_iterator len = textclass.end();
for (; lit != len; ++lit) for (; lit != len; ++lit)
if (lit->latexname() == name) if (lit->latexname() == name)
return &*lit; return &*lit;
return LayoutPtr(); return 0;
} }
void eat_whitespace(Parser &, ostream &, Context &, bool); 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, void output_command_layout(ostream & os, Parser & p, bool outer,
Context & parent_context, Context & parent_context,
LayoutPtr newlayout) Layout const * newlayout)
{ {
parent_context.check_end_layout(os); parent_context.check_end_layout(os);
Context context(true, parent_context.textclass, newlayout, 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, void parse_environment(Parser & p, ostream & os, bool outer,
Context & parent_context) Context & parent_context)
{ {
LayoutPtr newlayout; Layout const * newlayout;
string const name = p.getArg('{', '}'); string const name = p.getArg('{', '}');
const bool is_starred = suffixIs(name, '*'); const bool is_starred = suffixIs(name, '*');
string const unstarred_name = rtrim(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, void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
Context & context) Context & context)
{ {
LayoutPtr newlayout; Layout const * newlayout = 0;
// store the current selectlanguage to be used after \foreignlanguage // store the current selectlanguage to be used after \foreignlanguage
string selectlang; string selectlang;
// Store the latest bibliographystyle (needed for bibtex inset) // 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 // Special handling for \caption
// FIXME: remove this when InsetCaption is supported. // FIXME: remove this when InsetCaption is supported.
else if (context.new_layout_allowed && else if (context.new_layout_allowed &&
t.cs() == captionlayout->latexname()) { t.cs() == captionlayout()->latexname()) {
output_command_layout(os, p, outer, context, output_command_layout(os, p, outer, context,
captionlayout); captionlayout());
p.skip_spaces(); p.skip_spaces();
} }