X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=c3889fd2c4182516bf337c69e059495c9f581362;hb=c88e7a7ef66a880b5fb6166ff9151001269bc7cd;hp=6ea0ee5dc2c8b4e94e07f14204e834ca16538d8b;hpb=6add1994c75c0f3e0db50ab6c94ac3b73deb1561;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index 6ea0ee5dc2..c3889fd2c4 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -15,18 +15,17 @@ #include "Layout.h" #include "TextClass.h" #include "Lexer.h" -#include "debug.h" +#include "Font.h" +#include "support/debug.h" #include "support/lstrings.h" +#include -namespace lyx { - -using support::subst; -using support::trim; +using namespace std; +using namespace lyx::support; -using std::endl; -using std::string; +namespace lyx { /// Special value of toclevel for layouts that to not belong in a TOC const int Layout::NOT_IN_TOC = -1000; @@ -38,6 +37,7 @@ enum LayoutTags { LT_ALIGNPOSSIBLE, LT_MARGIN, LT_BOTTOMSEP, + LT_CATEGORY, LT_COMMANDDEPTH, LT_COPYSTYLE, LT_DEPENDSON, @@ -82,6 +82,7 @@ enum LayoutTags { LT_PARSKIP, //LT_PLAIN, LT_PREAMBLE, + LT_REQUIRES, LT_RIGHTMARGIN, LT_SPACING, LT_TOPSEP, @@ -94,8 +95,7 @@ enum LayoutTags { ///////////////////// -// Constructor for layout -Layout::Layout () +Layout::Layout() { margintype = MARGIN_STATIC; latextype = LATEX_PARAGRAPH; @@ -103,10 +103,10 @@ Layout::Layout () optionalargs = 0; needprotect = false; keepempty = false; - font = Font(Font::ALL_INHERIT); - labelfont = Font(Font::ALL_INHERIT); - resfont = Font(Font::ALL_SANE); - reslabelfont = Font(Font::ALL_SANE); + font = inherit_font; + labelfont = inherit_font; + resfont = sane_font; + reslabelfont = sane_font; nextnoindent = false; parskip = 0.0; itemsep = 0; @@ -115,7 +115,7 @@ Layout::Layout () labelbottomsep = 0.0; parsep = 0; align = LYX_ALIGN_BLOCK; - alignpossible = LYX_ALIGN_BLOCK; + alignpossible = LYX_ALIGN_NONE | LYX_ALIGN_LAYOUT; labeltype = LABEL_NO_LABEL; endlabeltype = END_LABEL_NO_LABEL; // Should or should not. That is the question. @@ -131,14 +131,14 @@ Layout::Layout () } -// Reads a layout definition from file bool Layout::read(Lexer & lexrc, TextClass const & tclass) { // This table is sorted alphabetically [asierra 30March96] - keyword_item layoutTags[] = { + LexerKeyword layoutTags[] = { { "align", LT_ALIGN }, { "alignpossible", LT_ALIGNPOSSIBLE }, { "bottomsep", LT_BOTTOMSEP }, + { "category", LT_CATEGORY }, { "commanddepth", LT_COMMANDDEPTH }, { "copystyle", LT_COPYSTYLE }, { "dependson", LT_DEPENDSON }, @@ -181,6 +181,7 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) { "parskip", LT_PARSKIP }, { "passthru", LT_PASS_THRU }, { "preamble", LT_PREAMBLE }, + { "requires", LT_REQUIRES }, { "rightmargin", LT_RIGHTMARGIN }, { "spacing", LT_SPACING }, { "textfont", LT_TEXTFONT }, @@ -190,7 +191,7 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) bool error = false; bool finished = false; - lexrc.pushTable(layoutTags, LT_INTITLE); + lexrc.pushTable(layoutTags); // parse style section while (!finished && lexrc.isOK() && !error) { int le = lexrc.lex(); @@ -210,28 +211,29 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) finished = true; break; + case LT_CATEGORY: + if (lexrc.next()) + category_ = lexrc.getDocString(); + break; + case LT_COPYSTYLE: // initialize with a known style if (lexrc.next()) { - string const style = subst(lexrc.getString(), + docstring const style = subst(lexrc.getDocString(), '_', ' '); if (tclass.hasLayout(style)) { - string const tmpname = name_; - this->operator=(*tclass[style]); + docstring const tmpname = name_; + this->operator=(tclass[style]); name_ = tmpname; } else { lyxerr << "Cannot copy unknown style `" - << style << "'\n" + << to_utf8(style) << "'\n" << "All layouts so far:" << endl; - TextClass::const_iterator it = - tclass.begin(); - TextClass::const_iterator end = - tclass.end(); - for (; it != end; ++it) { - lyxerr << (*it)->name() - << 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'"); @@ -241,16 +243,18 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) case LT_OBSOLETEDBY: // replace with a known style if (lexrc.next()) { - string const style = lexrc.getString(); + docstring const style = + subst(lexrc.getDocString(), '_', ' '); if (tclass.hasLayout(style)) { - string const tmpname = name_; - this->operator=(*tclass[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 `" << style << '\'' << endl; + lyxerr << "Cannot replace with unknown style `" + << to_utf8(style) << '\'' << endl; //lexrc.printError("Cannot replace with" // " unknown style " @@ -261,7 +265,7 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) case LT_DEPENDSON: if (lexrc.next()) - depends_on_ = lexrc.getString(); + depends_on_ = subst(lexrc.getDocString(), '_', ' '); break; case LT_MARGIN: // margin style definition. @@ -310,16 +314,16 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) break; case LT_FONT: - font.lyxRead(lexrc); - labelfont= font; + font = lyxRead(lexrc, font); + labelfont = font; break; case LT_TEXTFONT: - font.lyxRead(lexrc); + font = lyxRead(lexrc, font); break; case LT_LABELFONT: - labelfont.lyxRead(lexrc); + labelfont = lyxRead(lexrc, labelfont); break; case LT_NEXTNOINDENT: // Indent next paragraph? @@ -373,22 +377,22 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) case LT_LEFTMARGIN: // left margin type if (lexrc.next()) - leftmargin = lexrc.getString(); + leftmargin = lexrc.getDocString(); break; case LT_RIGHTMARGIN: // right margin type if (lexrc.next()) - rightmargin = lexrc.getString(); + rightmargin = lexrc.getDocString(); break; case LT_LABELINDENT: // label indenting flag if (lexrc.next()) - labelindent = lexrc.getString(); + labelindent = lexrc.getDocString(); break; case LT_PARINDENT: // paragraph indent. flag if (lexrc.next()) - parindent = lexrc.getString(); + parindent = lexrc.getDocString(); break; case LT_PARSKIP: // paragraph skip size @@ -418,7 +422,7 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) case LT_LABELSEP: // label separator if (lexrc.next()) { - labelsep = subst(lexrc.getString(), 'x', ' '); + labelsep = from_utf8(subst(lexrc.getString(), 'x', ' ')); } break; @@ -484,15 +488,23 @@ bool Layout::read(Lexer & lexrc, TextClass const & tclass) case LT_SPACING: // setspace.sty readSpacing(lexrc); break; + + case LT_REQUIRES: + lexrc.eatLine(); + vector const req = + getVectorFromString(lexrc.getString()); + requires_.insert(req.begin(), req.end()); + break; + } } lexrc.popTable(); - return error; + return !error; } -enum AlignTags { +enum { AT_BLOCK = 1, AT_LEFT, AT_RIGHT, @@ -500,10 +512,9 @@ enum AlignTags { AT_LAYOUT }; - void Layout::readAlign(Lexer & lexrc) { - keyword_item alignTags[] = { + LexerKeyword alignTags[] = { { "block", AT_BLOCK }, { "center", AT_CENTER }, { "layout", AT_LAYOUT }, @@ -511,7 +522,7 @@ void Layout::readAlign(Lexer & lexrc) { "right", AT_RIGHT } }; - PushPopHelper pph(lexrc, alignTags, AT_LAYOUT); + PushPopHelper pph(lexrc, alignTags); int le = lexrc.lex(); switch (le) { case Lexer::LEX_UNDEF: @@ -519,7 +530,7 @@ void Layout::readAlign(Lexer & lexrc) return; default: break; }; - switch (static_cast(le)) { + switch (le) { case AT_BLOCK: align = LYX_ALIGN_BLOCK; break; @@ -541,7 +552,7 @@ void Layout::readAlign(Lexer & lexrc) void Layout::readAlignPossible(Lexer & lexrc) { - keyword_item alignTags[] = { + LexerKeyword alignTags[] = { { "block", AT_BLOCK }, { "center", AT_CENTER }, { "layout", AT_LAYOUT }, @@ -549,9 +560,9 @@ void Layout::readAlignPossible(Lexer & lexrc) { "right", AT_RIGHT } }; - lexrc.pushTable(alignTags, AT_LAYOUT); - alignpossible = LYX_ALIGN_NONE; - int lineno = lexrc.getLineNo(); + lexrc.pushTable(alignTags); + alignpossible = LYX_ALIGN_NONE | LYX_ALIGN_LAYOUT; + int lineno = lexrc.lineNumber(); do { int le = lexrc.lex(); switch (le) { @@ -560,7 +571,7 @@ void Layout::readAlignPossible(Lexer & lexrc) continue; default: break; }; - switch (static_cast(le)) { + switch (le) { case AT_BLOCK: alignpossible |= LYX_ALIGN_BLOCK; break; @@ -577,41 +588,41 @@ void Layout::readAlignPossible(Lexer & lexrc) alignpossible |= LYX_ALIGN_LAYOUT; break; } - } while (lineno == lexrc.getLineNo()); + } while (lineno == lexrc.lineNumber()); lexrc.popTable(); } -enum LabelTypeTags { - LA_NO_LABEL = 1, - LA_MANUAL, - LA_TOP_ENVIRONMENT, - LA_CENTERED_TOP_ENVIRONMENT, - LA_STATIC, - LA_SENSITIVE, - LA_COUNTER, - LA_ENUMERATE, - LA_ITEMIZE, - LA_BIBLIO -}; - - void Layout::readLabelType(Lexer & lexrc) { - keyword_item labelTypeTags[] = { - { "bibliography", LA_BIBLIO }, - { "centered_top_environment", LA_CENTERED_TOP_ENVIRONMENT }, - { "counter", LA_COUNTER }, - { "enumerate", LA_ENUMERATE }, - { "itemize", LA_ITEMIZE }, - { "manual", LA_MANUAL }, - { "no_label", LA_NO_LABEL }, - { "sensitive", LA_SENSITIVE }, - { "static", LA_STATIC }, - { "top_environment", LA_TOP_ENVIRONMENT } + enum { + LA_NO_LABEL = 1, + LA_MANUAL, + LA_TOP_ENVIRONMENT, + LA_CENTERED_TOP_ENVIRONMENT, + LA_STATIC, + LA_SENSITIVE, + LA_COUNTER, + LA_ENUMERATE, + LA_ITEMIZE, + LA_BIBLIO }; - PushPopHelper pph(lexrc, labelTypeTags, LA_BIBLIO); + + LexerKeyword labelTypeTags[] = { + { "bibliography", LA_BIBLIO }, + { "centered_top_environment", LA_CENTERED_TOP_ENVIRONMENT }, + { "counter", LA_COUNTER }, + { "enumerate", LA_ENUMERATE }, + { "itemize", LA_ITEMIZE }, + { "manual", LA_MANUAL }, + { "no_label", LA_NO_LABEL }, + { "sensitive", LA_SENSITIVE }, + { "static", LA_STATIC }, + { "top_environment", LA_TOP_ENVIRONMENT } + }; + + PushPopHelper pph(lexrc, labelTypeTags); int le = lexrc.lex(); switch (le) { case Lexer::LEX_UNDEF: @@ -619,7 +630,7 @@ void Layout::readLabelType(Lexer & lexrc) return; default: break; } - switch (static_cast(le)) { + switch (le) { case LA_NO_LABEL: labeltype = LABEL_NO_LABEL; break; @@ -654,22 +665,16 @@ void Layout::readLabelType(Lexer & lexrc) } -namespace { - -keyword_item endlabelTypeTags[] = { - { "box", END_LABEL_BOX }, - { "filled_box", END_LABEL_FILLED_BOX }, - { "no_label", END_LABEL_NO_LABEL }, - { "static", END_LABEL_STATIC } -}; - -} // namespace anon - - void Layout::readEndLabelType(Lexer & lexrc) { - PushPopHelper pph(lexrc, endlabelTypeTags, - END_LABEL_ENUM_LAST-END_LABEL_ENUM_FIRST+1); + static LexerKeyword endlabelTypeTags[] = { + { "box", END_LABEL_BOX }, + { "filled_box", END_LABEL_FILLED_BOX }, + { "no_label", END_LABEL_NO_LABEL }, + { "static", END_LABEL_STATIC } + }; + + PushPopHelper pph(lexrc, endlabelTypeTags); int le = lexrc.lex(); switch (le) { case Lexer::LEX_UNDEF: @@ -679,7 +684,7 @@ void Layout::readEndLabelType(Lexer & lexrc) case END_LABEL_BOX: case END_LABEL_FILLED_BOX: case END_LABEL_NO_LABEL: - endlabeltype = static_cast(le); + endlabeltype = static_cast(le); break; default: lyxerr << "Unhandled value " << le @@ -691,7 +696,7 @@ void Layout::readEndLabelType(Lexer & lexrc) void Layout::readMargin(Lexer & lexrc) { - keyword_item marginTags[] = { + LexerKeyword marginTags[] = { { "dynamic", MARGIN_DYNAMIC }, { "first_dynamic", MARGIN_FIRST_DYNAMIC }, { "manual", MARGIN_MANUAL }, @@ -699,7 +704,7 @@ void Layout::readMargin(Lexer & lexrc) { "static", MARGIN_STATIC } }; - PushPopHelper pph(lexrc, marginTags, MARGIN_RIGHT_ADDRESS_BOX); + PushPopHelper pph(lexrc, marginTags); int le = lexrc.lex(); switch (le) { @@ -711,7 +716,7 @@ void Layout::readMargin(Lexer & lexrc) case MARGIN_DYNAMIC: case MARGIN_FIRST_DYNAMIC: case MARGIN_RIGHT_ADDRESS_BOX: - margintype = static_cast(le); + margintype = static_cast(le); break; default: lyxerr << "Unhandled value " << le @@ -723,7 +728,7 @@ void Layout::readMargin(Lexer & lexrc) void Layout::readLatexType(Lexer & lexrc) { - keyword_item latexTypeTags[] = { + LexerKeyword latexTypeTags[] = { { "bib_environment", LATEX_BIB_ENVIRONMENT }, { "command", LATEX_COMMAND }, { "environment", LATEX_ENVIRONMENT }, @@ -732,7 +737,7 @@ void Layout::readLatexType(Lexer & lexrc) { "paragraph", LATEX_PARAGRAPH } }; - PushPopHelper pph(lexrc, latexTypeTags, LATEX_LIST_ENVIRONMENT); + PushPopHelper pph(lexrc, latexTypeTags); int le = lexrc.lex(); switch (le) { case Lexer::LEX_UNDEF: @@ -744,7 +749,7 @@ void Layout::readLatexType(Lexer & lexrc) case LATEX_ITEM_ENVIRONMENT: case LATEX_BIB_ENVIRONMENT: case LATEX_LIST_ENVIRONMENT: - latextype = static_cast(le); + latextype = static_cast(le); break; default: lyxerr << "Unhandled value " << le @@ -754,24 +759,23 @@ void Layout::readLatexType(Lexer & lexrc) } -enum SpacingTags { - ST_SPACING_SINGLE = 1, - ST_SPACING_ONEHALF, - ST_SPACING_DOUBLE, - ST_OTHER -}; - - void Layout::readSpacing(Lexer & lexrc) { - keyword_item spacingTags[] = { + enum { + ST_SPACING_SINGLE = 1, + ST_SPACING_ONEHALF, + ST_SPACING_DOUBLE, + ST_OTHER + }; + + LexerKeyword spacingTags[] = { {"double", ST_SPACING_DOUBLE }, {"onehalf", ST_SPACING_ONEHALF }, {"other", ST_OTHER }, {"single", ST_SPACING_SINGLE } }; - PushPopHelper pph(lexrc, spacingTags, ST_OTHER); + PushPopHelper pph(lexrc, spacingTags); int le = lexrc.lex(); switch (le) { case Lexer::LEX_UNDEF: @@ -779,7 +783,7 @@ void Layout::readSpacing(Lexer & lexrc) return; default: break; } - switch (static_cast(le)) { + switch (le) { case ST_SPACING_SINGLE: spacing.set(Spacing::Single); break; @@ -797,28 +801,48 @@ void Layout::readSpacing(Lexer & lexrc) } -string const & Layout::name() const +docstring const & Layout::name() const { return name_; } -void Layout::setName(string const & n) +void Layout::setName(docstring const & name) { - name_ = n; + name_ = name; } -string const & Layout::obsoleted_by() const +docstring const & Layout::obsoleted_by() const { return obsoleted_by_; } -string const & Layout::depends_on() const +docstring const & Layout::depends_on() const { return depends_on_; } +bool Layout::operator==(Layout const & rhs) const +{ + // This is enough for the applications we actually make, + // at least at the moment. But we could check more. + return name() == rhs.name() + && latexname() == rhs.latexname() + && latextype == rhs.latextype; +} + + +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