X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Flyxlayout.C;h=fc691697f7c0abb7a19f9e020024aa32fa337f53;hb=2e57f2ff0ae7cd4a6efbf634ffe6d2f4379d9cfc;hp=0fd63445cc3e80c19d84a4b21ec0b8e799253bb2;hpb=b9288969ec06caa3d7b1e9d4eb7937c1e029b44f;p=lyx.git diff --git a/src/lyxlayout.C b/src/lyxlayout.C index 0fd63445cc..fc691697f7 100644 --- a/src/lyxlayout.C +++ b/src/lyxlayout.C @@ -1,9 +1,8 @@ - /* This file is part of - * ====================================================== - * + * ====================================================== + * * LyX, The Document Processor - * + * * Copyright 1995 Matthias Ettrich * Copyright 1995-2001 The LyX Team. * @@ -12,10 +11,6 @@ #include -#ifdef __GNUG__ -#pragma implementation -#endif - #include "lyxlayout.h" #include "lyxtextclass.h" #include "lyxlex.h" @@ -23,56 +18,63 @@ #include "support/lstrings.h" +using namespace lyx::support; + using std::endl; // The order of the LayoutTags enum is no more important. [asierra300396] // Tags indexes. enum LayoutTags { - LT_ALIGN = 1, - LT_ALIGNPOSSIBLE, - LT_MARGIN, - LT_BOTTOMSEP, - LT_COPYSTYLE, - LT_OBSOLETEDBY, + LT_ALIGN = 1, + LT_ALIGNPOSSIBLE, + LT_MARGIN, + LT_BOTTOMSEP, + LT_COPYSTYLE, + LT_DEPENDSON, + LT_OBSOLETEDBY, //LT_EMPTY, - LT_END, - //LT_ENVIRONMENT_DEFAULT, + LT_END, + //LT_ENVIRONMENT_DEFAULT, //LT_FANCYHDR, - LT_FILL_BOTTOM, - LT_FILL_TOP, + LT_FILL_BOTTOM, + LT_FILL_TOP, //LT_FIRST_COUNTER, - LT_FONT, - LT_FREE_SPACING, + LT_FONT, + LT_FREE_SPACING, LT_PASS_THRU, //LT_HEADINGS, - LT_ITEMSEP, - LT_KEEPEMPTY, - LT_LABEL_BOTTOMSEP, - LT_LABELFONT, + LT_ITEMSEP, + LT_KEEPEMPTY, + LT_LABEL_BOTTOMSEP, + LT_LABELFONT, LT_TEXTFONT, - LT_LABELINDENT, - LT_LABELSEP, - LT_LABELSTRING, - LT_LABELSTRING_APPENDIX, + LT_LABELINDENT, + LT_LABELSEP, + LT_LABELSTRING, + LT_LABELSTRING_APPENDIX, LT_LABELTYPE, LT_ENDLABELSTRING, LT_ENDLABELTYPE, - LT_LATEXNAME, - LT_LATEXPARAM, - LT_LATEXTYPE, - LT_LEFTMARGIN, - LT_NEED_PROTECT, - LT_NEWLINE, - LT_NEXTNOINDENT, - LT_PARINDENT, - LT_PARSEP, - LT_PARSKIP, + LT_LATEXNAME, + LT_LATEXPARAM, + LT_OPTARGS, + LT_LATEXTYPE, + LT_LATEXHEADER, + LT_LATEXFOOTER, + LT_LATEXPARAGRAPH, + LT_LEFTMARGIN, + LT_NEED_PROTECT, + LT_NEWLINE, + LT_NEXTNOINDENT, + LT_PARINDENT, + LT_PARSEP, + LT_PARSKIP, //LT_PLAIN, - LT_PREAMBLE, - LT_RIGHTMARGIN, - LT_SPACING, - LT_TOPSEP, - LT_INTITLE + LT_PREAMBLE, + LT_RIGHTMARGIN, + LT_SPACING, + LT_TOPSEP, + LT_INTITLE }; ///////////////////// @@ -83,6 +85,7 @@ LyXLayout::LyXLayout () margintype = MARGIN_STATIC; latextype = LATEX_PARAGRAPH; intitle = false; + optionalargs = 0; needprotect = false; keepempty = false; font = LyXFont(LyXFont::ALL_INHERIT); @@ -107,6 +110,7 @@ LyXLayout::LyXLayout () newline_allowed = true; free_spacing = false; pass_thru = false; + is_environment = false; } @@ -115,45 +119,50 @@ bool LyXLayout::Read (LyXLex & lexrc, LyXTextClass const & tclass) { // This table is sorted alphabetically [asierra 30March96] keyword_item layoutTags[] = { - { "align", LT_ALIGN }, - { "alignpossible", LT_ALIGNPOSSIBLE }, - { "bottomsep", LT_BOTTOMSEP }, - { "copystyle", LT_COPYSTYLE }, - { "end", LT_END }, - { "endlabelstring", LT_ENDLABELSTRING }, - { "endlabeltype", LT_ENDLABELTYPE }, - { "fill_bottom", LT_FILL_BOTTOM }, - { "fill_top", LT_FILL_TOP }, - { "font", LT_FONT }, - { "freespacing", LT_FREE_SPACING }, - { "intitle", LT_INTITLE }, - { "itemsep", LT_ITEMSEP }, - { "keepempty", LT_KEEPEMPTY }, - { "labelbottomsep", LT_LABEL_BOTTOMSEP }, - { "labelfont", LT_LABELFONT }, - { "labelindent", LT_LABELINDENT }, - { "labelsep", LT_LABELSEP }, - { "labelstring", LT_LABELSTRING }, - { "labelstringappendix", LT_LABELSTRING_APPENDIX }, - { "labeltype", LT_LABELTYPE }, - { "latexname", LT_LATEXNAME }, - { "latexparam", LT_LATEXPARAM }, - { "latextype", LT_LATEXTYPE }, - { "leftmargin", LT_LEFTMARGIN }, - { "margin", LT_MARGIN }, - { "needprotect", LT_NEED_PROTECT }, - { "newline", LT_NEWLINE }, - { "nextnoindent", LT_NEXTNOINDENT }, - { "obsoletedby", LT_OBSOLETEDBY }, - { "parindent", LT_PARINDENT }, - { "parsep", LT_PARSEP }, - { "parskip", LT_PARSKIP }, - { "passthru", LT_PASS_THRU }, - { "preamble", LT_PREAMBLE }, - { "rightmargin", LT_RIGHTMARGIN }, - { "spacing", LT_SPACING }, - { "textfont", LT_TEXTFONT }, - { "topsep", LT_TOPSEP } + { "align", LT_ALIGN }, + { "alignpossible", LT_ALIGNPOSSIBLE }, + { "bottomsep", LT_BOTTOMSEP }, + { "copystyle", LT_COPYSTYLE }, + { "dependson", LT_DEPENDSON }, + { "end", LT_END }, + { "endlabelstring", LT_ENDLABELSTRING }, + { "endlabeltype", LT_ENDLABELTYPE }, + { "fill_bottom", LT_FILL_BOTTOM }, + { "fill_top", LT_FILL_TOP }, + { "font", LT_FONT }, + { "freespacing", LT_FREE_SPACING }, + { "intitle", LT_INTITLE }, + { "itemsep", LT_ITEMSEP }, + { "keepempty", LT_KEEPEMPTY }, + { "labelbottomsep", LT_LABEL_BOTTOMSEP }, + { "labelfont", LT_LABELFONT }, + { "labelindent", LT_LABELINDENT }, + { "labelsep", LT_LABELSEP }, + { "labelstring", LT_LABELSTRING }, + { "labelstringappendix", LT_LABELSTRING_APPENDIX }, + { "labeltype", LT_LABELTYPE }, + { "latexfooter", LT_LATEXFOOTER }, + { "latexheader", LT_LATEXHEADER }, + { "latexname", LT_LATEXNAME }, + { "latexparagraph", LT_LATEXPARAGRAPH }, + { "latexparam", LT_LATEXPARAM }, + { "latextype", LT_LATEXTYPE }, + { "leftmargin", LT_LEFTMARGIN }, + { "margin", LT_MARGIN }, + { "needprotect", LT_NEED_PROTECT }, + { "newline", LT_NEWLINE }, + { "nextnoindent", LT_NEXTNOINDENT }, + { "obsoletedby", LT_OBSOLETEDBY }, + { "optionalargs", LT_OPTARGS }, + { "parindent", LT_PARINDENT }, + { "parsep", LT_PARSEP }, + { "parskip", LT_PARSKIP }, + { "passthru", LT_PASS_THRU }, + { "preamble", LT_PREAMBLE }, + { "rightmargin", LT_RIGHTMARGIN }, + { "spacing", LT_SPACING }, + { "textfont", LT_TEXTFONT }, + { "topsep", LT_TOPSEP } }; bool error = false; @@ -165,12 +174,12 @@ bool LyXLayout::Read (LyXLex & lexrc, LyXTextClass const & tclass) // See comment in lyxrc.C. switch (le) { case LyXLex::LEX_FEOF: - continue; + continue; case LyXLex::LEX_UNDEF: // parse error lexrc.printError("Unknown layout tag `$$Token'"); error = true; - continue; + continue; default: break; } switch (static_cast(le)) { @@ -179,22 +188,27 @@ bool LyXLayout::Read (LyXLex & lexrc, LyXTextClass const & tclass) break; case LT_COPYSTYLE: // initialize with a known style - if (lexrc.next()) { + if (lexrc.next()) { string const style = lexrc.getString(); - + if (tclass.hasLayout(style)) { string const tmpname = name_; - this->operator=(tclass[style]); + this->operator=(*tclass[style]); name_ = tmpname; } else { - lyxerr << "Cannot copy unknown style `" << style << "'" << endl; - LyXTextClass::const_iterator it = tclass.begin(); - LyXTextClass::const_iterator end = tclass.end(); - lyxerr << "All layouts so far:" << endl; + lyxerr << "Cannot copy unknown style `" + << style << "'\n" + << "All layouts so far:" + << endl; + LyXTextClass::const_iterator it = + tclass.begin(); + LyXTextClass::const_iterator end = + tclass.end(); for (; it != end; ++it) { - lyxerr << it->name() << endl; + lyxerr << (*it)->name() + << endl; } - + //lexrc.printError("Cannot copy known " // "style `$$Token'"); } @@ -202,41 +216,68 @@ bool LyXLayout::Read (LyXLex & lexrc, LyXTextClass const & tclass) break; case LT_OBSOLETEDBY: // replace with a known style - if (lexrc.next()) { + if (lexrc.next()) { string const style = lexrc.getString(); - + if (tclass.hasLayout(style)) { string const tmpname = name_; - this->operator=(tclass[style]); + this->operator=(*tclass[style]); name_ = tmpname; if (obsoleted_by().empty()) obsoleted_by_ = style; } else { - lyxerr << "Cannot replace with unknown style `" << style << "'" << endl; - - //lexrc.printError("Cannot replace with" + lyxerr << "Cannot replace with unknown style `" << style << '\'' << endl; + + //lexrc.printError("Cannot replace with" // " unknown style " // "`$$Token'"); } } break; - case LT_MARGIN: // Margin style definition. + case LT_DEPENDSON: + if (lexrc.next()) { + depends_on_ = lexrc.getString(); + } + break; + + case LT_MARGIN: // margin style definition. readMargin(lexrc); break; - case LT_LATEXTYPE: // Latex style definition. + case LT_LATEXTYPE: // LaTeX style definition. readLatexType(lexrc); break; + case LT_LATEXHEADER: // header for environments + lexrc.next(); + latexheader = lexrc.getString(); + break; + + case LT_LATEXFOOTER: // footer for environments + lexrc.next(); + latexfooter = lexrc.getString(); + break; + + case LT_LATEXPARAGRAPH: + lexrc.next(); + latexparagraph = lexrc.getString(); + break; + case LT_INTITLE: intitle = lexrc.next() && lexrc.getInteger(); break; - + + case LT_OPTARGS: + if (lexrc.next()) { + optionalargs = lexrc.getInteger(); + } + break; + case LT_NEED_PROTECT: needprotect = lexrc.next() && lexrc.getInteger(); break; - + case LT_KEEPEMPTY: keepempty = lexrc.next() && lexrc.getInteger(); break; @@ -262,10 +303,10 @@ bool LyXLayout::Read (LyXLex & lexrc, LyXTextClass const & tclass) break; case LT_LATEXNAME: - if (lexrc.next()) - latexname_ = lexrc.getString(); + if (lexrc.next()) + latexname_ = lexrc.getString(); break; - + case LT_LATEXPARAM: if (lexrc.next()) latexparam_ = lexrc.getString(); @@ -282,11 +323,11 @@ bool LyXLayout::Read (LyXLex & lexrc, LyXTextClass const & tclass) case LT_ENDLABELTYPE: readEndLabelType(lexrc); break; - + case LT_LEFTMARGIN: // left margin type - if (lexrc.next()) + if (lexrc.next()) leftmargin = lexrc.getString(); - break; + break; case LT_RIGHTMARGIN: // right margin type if (lexrc.next()) @@ -363,17 +404,17 @@ bool LyXLayout::Read (LyXLex & lexrc, LyXTextClass const & tclass) case LT_LABELSTRING: // label string definition if (lexrc.next()) - labelstring_ = lexrc.getString(); + labelstring_ = trim(lexrc.getString()); break; case LT_ENDLABELSTRING: // endlabel string definition if (lexrc.next()) - endlabelstring_ = lexrc.getString(); + endlabelstring_ = trim(lexrc.getString()); break; case LT_LABELSTRING_APPENDIX: // label string appendix definition if (lexrc.next()) - labelstring_appendix_ = lexrc.getString(); + labelstring_appendix_ = trim(lexrc.getString()); break; case LT_FREE_SPACING: // Allow for free spacing. @@ -420,7 +461,7 @@ void LyXLayout::readAlign(LyXLex & lexrc) switch (le) { case LyXLex::LEX_UNDEF: lexrc.printError("Unknown alignment `$$Token'"); - return; + return; default: break; }; switch (static_cast(le)) { @@ -461,7 +502,7 @@ void LyXLayout::readAlignPossible(LyXLex & lexrc) switch (le) { case LyXLex::LEX_UNDEF: lexrc.printError("Unknown alignment `$$Token'"); - continue; + continue; default: break; }; switch (static_cast(le)) { @@ -512,7 +553,7 @@ void LyXLayout::readLabelType(LyXLex & lexrc) keyword_item labelTypeTags[] = { { "bibliography", LA_BIBLIO }, { "centered_top_environment", LA_CENTERED_TOP_ENVIRONMENT }, - { "counter_chapter", LA_COUNTER_CHAPTER }, + { "counter_chapter", LA_COUNTER_CHAPTER }, { "counter_enumi", LA_COUNTER_ENUMI }, { "counter_enumii", LA_COUNTER_ENUMII }, { "counter_enumiii", LA_COUNTER_ENUMIII }, @@ -527,14 +568,14 @@ void LyXLayout::readLabelType(LyXLex & lexrc) { "sensitive", LA_SENSITIVE }, { "static", LA_STATIC }, { "top_environment", LA_TOP_ENVIRONMENT } -}; + }; pushpophelper pph(lexrc, labelTypeTags, LA_BIBLIO); int le = lexrc.lex(); switch (le) { case LyXLex::LEX_UNDEF: lexrc.printError("Unknown labeltype tag `$$Token'"); - return; + return; default: break; } switch (static_cast(le)) { @@ -663,6 +704,7 @@ void LyXLayout::readMargin(LyXLex & lexrc) void LyXLayout::readLatexType(LyXLex & lexrc) { keyword_item latexTypeTags[] = { + { "bib_environment", LATEX_BIB_ENVIRONMENT }, { "command", LATEX_COMMAND }, { "environment", LATEX_ENVIRONMENT }, { "item_environment", LATEX_ITEM_ENVIRONMENT }, @@ -680,6 +722,7 @@ void LyXLayout::readLatexType(LyXLex & lexrc) case LATEX_COMMAND: case LATEX_ENVIRONMENT: case LATEX_ITEM_ENVIRONMENT: + case LATEX_BIB_ENVIRONMENT: case LATEX_LIST_ENVIRONMENT: latextype = static_cast(le); break; @@ -750,3 +793,9 @@ string const & LyXLayout::obsoleted_by() const { return obsoleted_by_; } + + +string const & LyXLayout::depends_on() const +{ + return depends_on_; +}