X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=ff123dc32ef74c84eb76b00956dfdec4b67026c3;hb=5887601f6836ebf6f2b16cc7587a98cc3aa6c391;hp=f3af6986157156d6653baf834e263ce8e7ba8673;hpb=0eb651a2cf6c8c4d39e461748292ffe4e69f2386;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index f3af698615..ff123dc32e 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -20,6 +20,7 @@ #include "TextClass.h" #include "support/debug.h" +#include "support/docstream.h" #include "support/lassert.h" #include "support/lstrings.h" #include "support/Messages.h" @@ -31,7 +32,7 @@ using namespace lyx::support; namespace lyx { -/// Special value of toclevel for layouts that to not belong in a TOC +/// Special value of toclevel for layouts that do not belong to a TOC const int Layout::NOT_IN_TOC = -1000; // The order of the LayoutTags enum is no more important. [asierra300396] @@ -40,6 +41,8 @@ enum LayoutTags { LT_ALIGN = 1, LT_ALIGNPOSSIBLE, LT_ARGUMENT, + LT_AUTONESTS, + LT_AUTONESTEDBY, LT_MARGIN, LT_BOTTOMSEP, LT_CATEGORY, @@ -72,6 +75,8 @@ enum LayoutTags { LT_LATEXTYPE, LT_LEFTDELIM, LT_LEFTMARGIN, + LT_NEED_CPROTECT, + LT_NEED_MBOXPROTECT, LT_NEED_PROTECT, LT_NEWLINE, LT_NEXTNOINDENT, @@ -95,18 +100,45 @@ enum LayoutTags { LT_HTMLITEM, LT_HTMLITEMATTR, LT_HTMLLABEL, - LT_HTMLLABELATTR, + LT_HTMLLABELATTR, LT_HTMLLABELFIRST, LT_HTMLPREAMBLE, LT_HTMLSTYLE, LT_HTMLFORCECSS, + LT_DOCBOOKTAG, + LT_DOCBOOKATTR, + LT_DOCBOOKTAGTYPE, + LT_DOCBOOKINNERATTR, + LT_DOCBOOKINNERTAG, + LT_DOCBOOKINNERTAGTYPE, + LT_DOCBOOKININFO, + LT_DOCBOOKABSTRACT, + LT_DOCBOOKWRAPPERTAG, + LT_DOCBOOKWRAPPERATTR, + LT_DOCBOOKWRAPPERTAGTYPE, + LT_DOCBOOKWRAPPERMERGEWITHPREVIOUS, + LT_DOCBOOKSECTION, + LT_DOCBOOKSECTIONTAG, + LT_DOCBOOKITEMWRAPPERTAG, + LT_DOCBOOKITEMWRAPPERATTR, + LT_DOCBOOKITEMWRAPPERTAGTYPE, + LT_DOCBOOKITEMTAG, + LT_DOCBOOKITEMATTR, + LT_DOCBOOKITEMTAGTYPE, + LT_DOCBOOKITEMLABELTAG, + LT_DOCBOOKITEMLABELATTR, + LT_DOCBOOKITEMLABELTAGTYPE, + LT_DOCBOOKITEMINNERTAG, + LT_DOCBOOKITEMINNERATTR, + LT_DOCBOOKITEMINNERTAGTYPE, + LT_DOCBOOKFORCEABSTRACTTAG, LT_INPREAMBLE, LT_HTMLTITLE, LT_SPELLCHECK, LT_REFPREFIX, LT_RESETARGS, LT_RESUMECOUNTER, - LT_STEPMASTERCOUNTER, + LT_STEPPARENTCOUNTER, LT_RIGHTDELIM, LT_FORCELOCAL, LT_TOGGLE_INDENT, @@ -118,16 +150,18 @@ enum LayoutTags { ///////////////////// Layout::Layout() - : add_to_toc_(false), is_toc_caption_(false) + : add_to_toc_(false), is_toc_caption_(true) { unknown_ = false; margintype = MARGIN_STATIC; latextype = LATEX_PARAGRAPH; resumecounter = false; - stepmastercounter = false; + stepparentcounter = false; intitle = false; inpreamble = false; needprotect = false; + needcprotect = false; + needmboxprotect = false; keepempty = false; font = inherit_font; labelfont = inherit_font; @@ -155,6 +189,9 @@ Layout::Layout() htmllabelfirst_ = false; htmlforcecss_ = false; htmltitle_ = false; + docbookabstract_ = false; + docbookwrappermergewithprevious_ = false; + docbooksection_ = false; spellcheck = true; forcelocal = 0; itemcommand_ = "item"; @@ -163,15 +200,15 @@ Layout::Layout() } -bool Layout::read(Lexer & lex, TextClass const & tclass) +bool Layout::read(Lexer & lex, TextClass const & tclass, bool validating) { // If this is an empty layout, or if no force local version is set, // we know that we will not discard the stuff to read if (forcelocal == 0) - return readIgnoreForcelocal(lex, tclass); + return readIgnoreForcelocal(lex, tclass, validating); Layout tmp(*this); tmp.forcelocal = 0; - bool const ret = tmp.readIgnoreForcelocal(lex, tclass); + bool const ret = tmp.readIgnoreForcelocal(lex, tclass, validating); // Keep the stuff if // - the read version is higher // - both versions are infinity (arbitrary decision) @@ -183,7 +220,8 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) } -bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) +bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass, + bool validating) { // This table is sorted alphabetically [asierra 30March96] LexerKeyword layoutTags[] = { @@ -191,12 +229,40 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) { "align", LT_ALIGN }, { "alignpossible", LT_ALIGNPOSSIBLE }, { "argument", LT_ARGUMENT }, + { "autonests", LT_AUTONESTS }, { "babelpreamble", LT_BABELPREAMBLE }, { "bottomsep", LT_BOTTOMSEP }, { "category", LT_CATEGORY }, { "commanddepth", LT_COMMANDDEPTH }, { "copystyle", LT_COPYSTYLE }, { "dependson", LT_DEPENDSON }, + { "docbookabstract", LT_DOCBOOKABSTRACT }, + { "docbookattr", LT_DOCBOOKATTR }, + { "docbookforceabstracttag", LT_DOCBOOKFORCEABSTRACTTAG }, + { "docbookininfo", LT_DOCBOOKININFO }, + { "docbookinnerattr", LT_DOCBOOKINNERATTR }, + { "docbookinnertag", LT_DOCBOOKINNERTAG }, + { "docbookinnertagtype", LT_DOCBOOKINNERTAGTYPE }, + { "docbookitemattr", LT_DOCBOOKITEMATTR }, + { "docbookiteminnerattr", LT_DOCBOOKITEMINNERATTR }, + { "docbookiteminnertag", LT_DOCBOOKITEMINNERTAG }, + { "docbookiteminnertagtype", LT_DOCBOOKITEMINNERTAGTYPE }, + { "docbookitemlabelattr", LT_DOCBOOKITEMLABELATTR }, + { "docbookitemlabeltag", LT_DOCBOOKITEMLABELTAG }, + { "docbookitemlabeltagtype", LT_DOCBOOKITEMLABELTAGTYPE }, + { "docbookitemtag", LT_DOCBOOKITEMTAG }, + { "docbookitemtagtype", LT_DOCBOOKITEMTAGTYPE }, + { "docbookitemwrapperattr", LT_DOCBOOKITEMWRAPPERATTR }, + { "docbookitemwrappertag", LT_DOCBOOKITEMWRAPPERTAG }, + { "docbookitemwrappertagtype", LT_DOCBOOKITEMWRAPPERTAGTYPE }, + { "docbooksection", LT_DOCBOOKSECTION }, + { "docbooksectiontag", LT_DOCBOOKSECTIONTAG }, + { "docbooktag", LT_DOCBOOKTAG }, + { "docbooktagtype", LT_DOCBOOKTAGTYPE }, + { "docbookwrapperattr", LT_DOCBOOKWRAPPERATTR }, + { "docbookwrappermergewithprevious", LT_DOCBOOKWRAPPERMERGEWITHPREVIOUS }, + { "docbookwrappertag", LT_DOCBOOKWRAPPERTAG }, + { "docbookwrappertagtype", LT_DOCBOOKWRAPPERTAGTYPE }, { "end", LT_END }, { "endlabelstring", LT_ENDLABELSTRING }, { "endlabeltype", LT_ENDLABELTYPE }, @@ -217,6 +283,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) { "innertag", LT_INNERTAG }, { "inpreamble", LT_INPREAMBLE }, { "intitle", LT_INTITLE }, + { "isautonestedby", LT_AUTONESTEDBY }, { "istoccaption", LT_ISTOCCAPTION }, { "itemcommand", LT_ITEMCOMMAND }, { "itemsep", LT_ITEMSEP }, @@ -238,6 +305,8 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) { "leftdelim", LT_LEFTDELIM }, { "leftmargin", LT_LEFTMARGIN }, { "margin", LT_MARGIN }, + { "needcprotect", LT_NEED_CPROTECT }, + { "needmboxprotect", LT_NEED_MBOXPROTECT }, { "needprotect", LT_NEED_PROTECT }, { "newline", LT_NEWLINE }, { "nextnoindent", LT_NEXTNOINDENT }, @@ -258,7 +327,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) { "rightmargin", LT_RIGHTMARGIN }, { "spacing", LT_SPACING }, { "spellcheck", LT_SPELLCHECK }, - { "stepmastercounter", LT_STEPMASTERCOUNTER }, + { "stepparentcounter", LT_STEPPARENTCOUNTER }, { "textfont", LT_TEXTFONT }, { "toclevel", LT_TOCLEVEL }, { "toggleindent", LT_TOGGLE_INDENT }, @@ -283,7 +352,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) error = true; continue; - default: + default: break; } switch (static_cast(le)) { @@ -328,7 +397,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) if (obsoleted_by().empty()) obsoleted_by_ = style; } else { - LYXERR0("Cannot replace with unknown style `" + LYXERR0("Cannot replace with unknown style `" << style << '\''); //lex.printError("Cannot replace with" @@ -370,6 +439,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) latexargs_.clear(); itemargs_.clear(); postcommandargs_.clear(); + listpreamble_.clear(); } break; @@ -377,18 +447,26 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) lex >> resumecounter; break; - case LT_STEPMASTERCOUNTER: - lex >> stepmastercounter; + case LT_STEPPARENTCOUNTER: + lex >> stepparentcounter; break; case LT_ARGUMENT: - readArgument(lex); + readArgument(lex, validating); break; case LT_NEED_PROTECT: lex >> needprotect; break; + case LT_NEED_CPROTECT: + lex >> needcprotect; + break; + + case LT_NEED_MBOXPROTECT: + lex >> needmboxprotect; + break; + case LT_KEEPEMPTY: lex >> keepempty; break; @@ -465,15 +543,15 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) break; case LT_PREAMBLE: - preamble_ = from_utf8(lex.getLongString("EndPreamble")); + preamble_ = lex.getLongString(from_ascii("EndPreamble")); break; case LT_LANGPREAMBLE: - langpreamble_ = from_utf8(lex.getLongString("EndLangPreamble")); + langpreamble_ = lex.getLongString(from_ascii("EndLangPreamble")); break; case LT_BABELPREAMBLE: - babelpreamble_ = from_utf8(lex.getLongString("EndBabelPreamble")); + babelpreamble_ = lex.getLongString(from_ascii("EndBabelPreamble")); break; case LT_LABELTYPE: @@ -536,7 +614,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_ALIGN: readAlign(lex); break; - + case LT_ALIGNPOSSIBLE: readAlignPossible(lex); break; @@ -545,23 +623,19 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) // FIXME: this means LT_LABELSTRING_APPENDIX may only // occur after LT_LABELSTRING lex >> labelstring_; - labelstring_ = trim(labelstring_); labelstring_appendix_ = labelstring_; break; case LT_ENDLABELSTRING: - lex >> endlabelstring_; - endlabelstring_ = trim(endlabelstring_); + lex >> endlabelstring_; break; case LT_LABELSTRING_APPENDIX: - lex >> labelstring_appendix_; - labelstring_appendix_ = trim(labelstring_appendix_); + lex >> labelstring_appendix_; break; case LT_LABELCOUNTER: - lex >> counter; - counter = trim(counter); + lex >> counter; break; case LT_PAR_GROUP: @@ -592,10 +666,34 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) lex.eatLine(); vector const req = getVectorFromString(lex.getString(true)); - requires_.insert(req.begin(), req.end()); + required_.insert(req.begin(), req.end()); + break; + } + + case LT_AUTONESTS: { + docstring autonest = lex.getLongString(from_ascii("EndAutoNests")); + autonest = subst(autonest, from_ascii("\n"), docstring()); + autonest = subst(autonest, from_ascii("\t"), docstring()); + autonest = subst(autonest, from_ascii("\""), docstring()); + autonest = subst(autonest, '_', ' '); + vector const autonests = + getVectorFromString(autonest, from_ascii(","), false, true); + autonests_.insert(autonests.begin(), autonests.end()); + break; + } + + case LT_AUTONESTEDBY: { + docstring autonest = lex.getLongString(from_ascii("EndIsAutoNestedBy")); + autonest = subst(autonest, from_ascii("\n"), docstring()); + autonest = subst(autonest, from_ascii("\t"), docstring()); + autonest = subst(autonest, from_ascii("\""), docstring()); + autonest = subst(autonest, '_', ' '); + vector const autonests = + getVectorFromString(autonest, from_ascii(","), false, true); + autonested_by_.insert(autonests.begin(), autonests.end()); break; } - + case LT_REFPREFIX: { docstring arg; lex >> arg; @@ -609,7 +707,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_HTMLTAG: lex >> htmltag_; break; - + case LT_HTMLATTR: lex >> htmlattr_; break; @@ -617,25 +715,25 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_HTMLITEM: lex >> htmlitemtag_; break; - + case LT_HTMLITEMATTR: lex >> htmlitemattr_; break; - + case LT_HTMLLABEL: lex >> htmllabeltag_; break; - case LT_HTMLLABELATTR: + case LT_HTMLLABELATTR: lex >> htmllabelattr_; break; case LT_HTMLLABELFIRST: lex >> htmllabelfirst_; break; - + case LT_HTMLSTYLE: - htmlstyle_ = from_utf8(lex.getLongString("EndHTMLStyle")); + htmlstyle_ = lex.getLongString(from_ascii("EndHTMLStyle")); break; case LT_HTMLFORCECSS: @@ -643,13 +741,121 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) break; case LT_HTMLPREAMBLE: - htmlpreamble_ = from_utf8(lex.getLongString("EndPreamble")); + htmlpreamble_ = lex.getLongString(from_ascii("EndPreamble")); break; - + case LT_HTMLTITLE: lex >> htmltitle_; break; + case LT_DOCBOOKTAG: + lex >> docbooktag_; + break; + + case LT_DOCBOOKATTR: + lex >> docbookattr_; + break; + + case LT_DOCBOOKTAGTYPE: + lex >> docbooktagtype_; + break; + + case LT_DOCBOOKINNERTAG: + lex >> docbookinnertag_; + break; + + case LT_DOCBOOKINNERATTR: + lex >> docbookinnerattr_; + break; + + case LT_DOCBOOKINNERTAGTYPE: + lex >> docbookinnertagtype_; + break; + + case LT_DOCBOOKFORCEABSTRACTTAG: + lex >> docbookforceabstracttag_; + break; + + case LT_DOCBOOKININFO: + lex >> docbookininfo_; + break; + + case LT_DOCBOOKABSTRACT: + lex >> docbookabstract_; + break; + + case LT_DOCBOOKWRAPPERTAG: + lex >> docbookwrappertag_; + break; + + case LT_DOCBOOKWRAPPERATTR: + lex >> docbookwrapperattr_; + break; + + case LT_DOCBOOKWRAPPERTAGTYPE: + lex >> docbookwrappertagtype_; + break; + + case LT_DOCBOOKWRAPPERMERGEWITHPREVIOUS: + lex >> docbookwrappermergewithprevious_; + break; + + case LT_DOCBOOKSECTION: + lex >> docbooksection_; + break; + + case LT_DOCBOOKSECTIONTAG: + lex >> docbooksectiontag_; + break; + + case LT_DOCBOOKITEMWRAPPERTAG: + lex >> docbookitemwrappertag_; + break; + + case LT_DOCBOOKITEMWRAPPERATTR: + lex >> docbookitemwrapperattr_; + break; + + case LT_DOCBOOKITEMWRAPPERTAGTYPE: + lex >> docbookitemwrappertagtype_; + break; + + case LT_DOCBOOKITEMTAG: + lex >> docbookitemtag_; + break; + + case LT_DOCBOOKITEMATTR: + lex >> docbookitemattr_; + break; + + case LT_DOCBOOKITEMTAGTYPE: + lex >> docbookitemtagtype_; + break; + + case LT_DOCBOOKITEMLABELTAG: + lex >> docbookitemlabeltag_; + break; + + case LT_DOCBOOKITEMLABELATTR: + lex >> docbookitemlabelattr_; + break; + + case LT_DOCBOOKITEMLABELTAGTYPE: + lex >> docbookitemlabeltagtype_; + break; + + case LT_DOCBOOKITEMINNERTAG: + lex >> docbookiteminnertag_; + break; + + case LT_DOCBOOKITEMINNERATTR: + lex >> docbookiteminnerattr_; + break; + + case LT_DOCBOOKITEMINNERTAGTYPE: + lex >> docbookiteminnertagtype_; + break; + case LT_SPELLCHECK: lex >> spellcheck; break; @@ -969,23 +1175,26 @@ void Layout::readSpacing(Lexer & lex) } -void Layout::readArgument(Lexer & lex) +void Layout::readArgument(Lexer & lex, bool validating) { - latexarg arg; - // writeArgument() makes use of these default values - arg.mandatory = false; - arg.autoinsert = false; - arg.insertcotext = false; - bool error = false; - bool finished = false; - arg.font = inherit_font; - arg.labelfont = inherit_font; - arg.is_toc_caption = false; - string id; - lex >> id; + if (!lex.next()) { + LYXERR0("Unable to read argument ID!"); + return; + } + string const id = lex.getString(); + bool const itemarg = prefixIs(id, "item:"); bool const postcmd = prefixIs(id, "post:"); + bool const listpreamble = prefixIs(id, "listpreamble:"); + + LaTeXArgMap & lam = itemarg ? itemargs_ : + (postcmd ? postcommandargs_ : + (listpreamble ? listpreamble_ : + latexargs_)); + latexarg & arg = lam[id]; + bool error = false; + bool finished = false; while (!finished && lex.isOK() && !error) { lex.next(); string const tok = ascii_lowercase(lex.getString()); @@ -1030,10 +1239,13 @@ void Layout::readArgument(Lexer & lex) arg.tooltip = lex.getDocString(); } else if (tok == "requires") { lex.next(); - arg.requires = lex.getString(); + arg.required = lex.getString(); } else if (tok == "decoration") { lex.next(); arg.decoration = lex.getString(); + } else if (tok == "newlinecmd") { + lex.next(); + arg.newlinecmd = lex.getString(); } else if (tok == "font") { arg.font = lyxRead(lex, arg.font); } else if (tok == "labelfont") { @@ -1041,22 +1253,40 @@ void Layout::readArgument(Lexer & lex) } else if (tok == "passthruchars") { lex.next(); arg.pass_thru_chars = lex.getDocString(); + } else if (tok == "passthru") { + lex.next(); + docstring value = lex.getDocString(); + if (value == "true" || value == "1") + arg.passthru = PT_TRUE; + else if (value == "false" || value == "0") + arg.passthru = PT_FALSE; + else + arg.passthru = PT_INHERITED; } else if (tok == "istoccaption") { lex.next(); arg.is_toc_caption = lex.getBool(); + } else if (tok == "freespacing") { + lex.next(); + arg.free_spacing = lex.getBool(); + } else if (tok == "docbooktag") { + lex.next(); + arg.docbooktag = lex.getDocString(); + } else if (tok == "docbookattr") { + lex.next(); + arg.docbookattr = lex.getDocString(); + } else if (tok == "docbooktagtype") { + lex.next(); + arg.docbooktagtype = lex.getDocString(); } else { lex.printError("Unknown tag"); error = true; } } - if (arg.labelstring.empty()) + if (!validating && arg.labelstring.empty()) { LYXERR0("Incomplete Argument definition!"); - else if (itemarg) - itemargs_[id] = arg; - else if (postcmd) - postcommandargs_[id] = arg; - else - latexargs_[id] = arg; + // remove invalid definition + lam.erase(id); + } } @@ -1087,16 +1317,31 @@ void writeArgument(ostream & os, string const & id, Layout::latexarg const & arg os << "\t\tPresetArg \"" << to_utf8(arg.presetarg) << "\"\n"; if (!arg.tooltip.empty()) os << "\t\tToolTip \"" << to_utf8(arg.tooltip) << "\"\n"; - if (!arg.requires.empty()) - os << "\t\tRequires \"" << arg.requires << "\"\n"; + if (!arg.required.empty()) + os << "\t\tRequires \"" << arg.required << "\"\n"; if (!arg.decoration.empty()) os << "\t\tDecoration \"" << arg.decoration << "\"\n"; + if (!arg.newlinecmd.empty()) + os << "\t\tNewlineCmd \"" << arg.newlinecmd << "\"\n"; if (arg.font != inherit_font) lyxWrite(os, arg.font, "Font", 2); if (arg.labelfont != inherit_font) lyxWrite(os, arg.labelfont, "LabelFont", 2); + switch (arg.passthru) { + case PT_TRUE: + os << "\t\tPassThru true\n"; + break; + case PT_FALSE: + os << "\t\tPassThru false\n"; + break; + case PT_INHERITED: + os << "\t\tPassThru inherited\n"; + break; + } if (!arg.pass_thru_chars.empty()) os << "\t\tPassThruChars \"" << to_utf8(arg.pass_thru_chars) << "\"\n"; + if (arg.free_spacing) + os << "\t\tFreeSpacing " << arg.free_spacing << "\n"; os << "\tEndArgument\n"; } @@ -1155,7 +1400,7 @@ void Layout::write(ostream & os) const "\tInPreamble " << inpreamble << "\n" "\tTocLevel " << toclevel << "\n" "\tResumeCounter " << resumecounter << "\n" - "\tStepMasterCounter " << stepmastercounter << '\n'; + "\tStepParentCounter " << stepparentcounter << '\n'; // ResetArgs does not make sense here for (LaTeXArgMap::const_iterator it = latexargs_.begin(); it != latexargs_.end(); ++it) @@ -1166,7 +1411,12 @@ void Layout::write(ostream & os) const for (LaTeXArgMap::const_iterator it = postcommandargs_.begin(); it != postcommandargs_.end(); ++it) writeArgument(os, it->first, it->second); + for (LaTeXArgMap::const_iterator it = listpreamble_.begin(); + it != listpreamble_.end(); ++it) + writeArgument(os, it->first, it->second); os << "\tNeedProtect " << needprotect << "\n" + "\tNeedCProtect " << needcprotect << "\n" + "\tNeedMBoxProtect " << needmboxprotect << "\n" "\tKeepEmpty " << keepempty << '\n'; if (labelfont == font) lyxWrite(os, font, "Font", 1); @@ -1360,16 +1610,36 @@ void Layout::write(ostream & os) const case Spacing::Default: break; } - if (!requires_.empty()) { + if (!required_.empty()) { os << "\tRequires "; - for (set::const_iterator it = requires_.begin(); - it != requires_.end(); ++it) { - if (it != requires_.begin()) + for (set::const_iterator it = required_.begin(); + it != required_.end(); ++it) { + if (it != required_.begin()) os << ','; os << *it; } os << '\n'; } + if (!autonests_.empty()) { + os << "\tAutoNests\n\t"; + for (set::const_iterator it = autonests_.begin(); + it != autonests_.end(); ++it) { + if (it != autonests_.begin()) + os << ','; + os << to_utf8(*it); + } + os << "\n\tEndAutoNests\n"; + } + if (!autonested_by_.empty()) { + os << "\tIsAutoNestedBy\n\t\t"; + for (set::const_iterator it = autonested_by_.begin(); + it != autonested_by_.end(); ++it) { + if (it != autonested_by_.begin()) + os << ','; + os << to_utf8(*it); + } + os << "\n\tEndIsAutoNestedBy\n"; + } if (refprefix.empty()) os << "\tRefPrefix OFF\n"; else @@ -1396,18 +1666,78 @@ void Layout::write(ostream & os) const os << "\tHTMLPreamble\n" << to_utf8(rtrim(htmlpreamble_, "\n")) << "\n\tEndPreamble\n"; - os << "\tHTMLTitle " << htmltitle_ << "\n" - "\tSpellcheck " << spellcheck << "\n" + os << "\tHTMLTitle " << htmltitle_ << "\n"; + if(!docbooktag_.empty()) + os << "\tDocBookTag " << docbooktag_ << '\n'; + if(!docbookattr_.empty()) + os << "\tDocBookAttr \"" << docbookattr_ << "\"\n"; + if(!docbooktagtype_.empty()) + os << "\tDocBookTagType " << docbooktagtype_ << '\n'; + if(!docbookinnertag_.empty()) + os << "\tDocBookInnerTag " << docbookinnertag_ << '\n'; + if(!docbookinnerattr_.empty()) + os << "\tDocBookInnerAttr \"" << docbookinnerattr_ << "\"\n"; + if(!docbookinnertagtype_.empty()) + os << "\tDocBookInnerTagType " << docbookinnertagtype_ << '\n'; + if(!docbookininfo_.empty()) + os << "\tDocBookInInfo " << docbookininfo_ << '\n'; + os << "\tDocBookAbstract " << docbookabstract_ << '\n'; + if(!docbookwrappertag_.empty()) + os << "\tDocBookWrapperTag " << docbookwrappertag_ << '\n'; + if(!docbookwrapperattr_.empty()) + os << "\tDocBookWrapperAttr " << docbookwrapperattr_ << '\n'; + if(!docbookwrappertagtype_.empty()) + os << "\tDocBookWrapperTagType " << docbookwrappertagtype_ << '\n'; + os << "\tDocBookSection " << docbooksection_ << '\n'; + if(!docbooksectiontag_.empty()) + os << "\tDocBookSectionTag " << docbooksectiontag_ << '\n'; + if(!docbookitemtag_.empty()) + os << "\tDocBookItemTag " << docbookitemtag_ << '\n'; + if(!docbookitemattr_.empty()) + os << "\tDocBookItemAttr " << docbookitemattr_ << '\n'; + if(!docbookitemtagtype_.empty()) + os << "\tDocBookItemTagType " << docbookitemtagtype_ << '\n'; + if(!docbookitemwrappertag_.empty()) + os << "\tDocBookItemWrapperTag " << docbookitemwrappertag_ << '\n'; + if(!docbookitemwrapperattr_.empty()) + os << "\tDocBookItemWrapperAttr " << docbookitemwrapperattr_ << '\n'; + if(!docbookitemwrappertagtype_.empty()) + os << "\tDocBookItemWrapperTagType " << docbookitemwrappertagtype_ << '\n'; + os << "\tDocBookWrapperMergeWithPrevious " << docbookwrappermergewithprevious_ << '\n'; + if(!docbookitemlabeltag_.empty()) + os << "\tDocBookItemLabelTag " << docbookitemlabeltag_ << '\n'; + if(!docbookitemlabelattr_.empty()) + os << "\tDocBookItemLabelAttr " << docbookitemlabelattr_ << '\n'; + if(!docbookitemlabeltagtype_.empty()) + os << "\tDocBookItemLabelTagType " << docbookitemlabeltagtype_ << '\n'; + if(!docbookiteminnertag_.empty()) + os << "\tDocBookItemInnerTag " << docbookiteminnertag_ << '\n'; + if(!docbookiteminnerattr_.empty()) + os << "\tDocBookItemInnerAttr " << docbookiteminnerattr_ << '\n'; + if(!docbookiteminnertagtype_.empty()) + os << "\tDocBookItemInnerTagType " << docbookiteminnertagtype_ << '\n'; + if(!docbookforceabstracttag_.empty()) + os << "\tDocBookForceAbstractTag " << docbookforceabstracttag_ << '\n'; + os << "\tSpellcheck " << spellcheck << "\n" "\tForceLocal " << forcelocal << "\n" "End\n"; } +bool Layout::hasArgs() const +{ + return !latexargs_.empty() || !postcommandargs_.empty() || + !itemargs_.empty() || !listpreamble_.empty(); +} + + Layout::LaTeXArgMap Layout::args() const { LaTeXArgMap args = latexargs_; if (!postcommandargs_.empty()) args.insert(postcommandargs_.begin(), postcommandargs_.end()); + if (!listpreamble_.empty()) + args.insert(listpreamble_.begin(), listpreamble_.end()); if (!itemargs_.empty()) args.insert(itemargs_.begin(), itemargs_.end()); return args; @@ -1448,56 +1778,51 @@ int Layout::requiredArgs() const } -string const & Layout::htmltag() const -{ +string const & Layout::htmltag() const +{ if (htmltag_.empty()) htmltag_ = "div"; return htmltag_; } -string const & Layout::htmlattr() const -{ +string const & Layout::htmlattr() const +{ if (htmlattr_.empty()) htmlattr_ = "class=\"" + defaultCSSClass() + "\""; - return htmlattr_; + return htmlattr_; } -string const & Layout::htmlitemtag() const -{ +string const & Layout::htmlitemtag() const +{ if (htmlitemtag_.empty()) htmlitemtag_ = "div"; - return htmlitemtag_; + return htmlitemtag_; } -string const & Layout::htmlitemattr() const -{ +string const & Layout::htmlitemattr() const +{ if (htmlitemattr_.empty()) htmlitemattr_ = "class=\"" + defaultCSSItemClass() + "\""; - return htmlitemattr_; + return htmlitemattr_; } -string const & Layout::htmllabeltag() const -{ - if (htmllabeltag_.empty()) { - if (labeltype != LABEL_ABOVE && - labeltype != LABEL_CENTERED) +string const & Layout::htmllabeltag() const +{ + if (htmllabeltag_.empty()) htmllabeltag_ = "span"; - else - htmllabeltag_ = "div"; - } - return htmllabeltag_; + return htmllabeltag_; } -string const & Layout::htmllabelattr() const -{ +string const & Layout::htmllabelattr() const +{ if (htmllabelattr_.empty()) htmllabelattr_ = "class=\"" + defaultCSSLabelClass() + "\""; - return htmllabelattr_; + return htmllabelattr_; } @@ -1505,7 +1830,7 @@ docstring Layout::htmlstyle() const { if (!htmlstyle_.empty() && !htmlforcecss_) return htmlstyle_; - if (htmldefaultstyle_.empty()) + if (htmldefaultstyle_.empty()) makeDefaultCSS(); docstring retval = htmldefaultstyle_; if (!htmlstyle_.empty()) @@ -1515,7 +1840,7 @@ docstring Layout::htmlstyle() const string Layout::defaultCSSClass() const -{ +{ if (!defaultcssclass_.empty()) return defaultcssclass_; docstring d; @@ -1541,6 +1866,197 @@ string Layout::defaultCSSClass() const } +string const & Layout::docbooktag() const +{ + if (docbooktag_.empty()) { + if (to_ascii(name_) == "Plain Layout") + docbooktag_ = "para"; + else // No sensible default value, unhappily... + docbooktag_ = to_utf8(name_); + } + return docbooktag_; +} + + +string const & Layout::docbookattr() const +{ + // Perfectly OK to return no attributes, so docbookattr_ does not need to be filled. + return docbookattr_; +} + + +bool isValidTagType(std::string const & type) +{ + return !(type.empty() || (type != "block" && type != "paragraph" && type != "inline")); +} + + +string const & Layout::docbooktagtype() const +{ + if (!isValidTagType(docbooktagtype_)) + docbooktagtype_ = "block"; + return docbooktagtype_; +} + + +string const & Layout::docbookinnertag() const +{ + if (docbookinnertag_.empty()) + docbookinnertag_ = "NONE"; + return docbookinnertag_; +} + + +string const & Layout::docbookinnerattr() const +{ + return docbookinnerattr_; +} + + +string const & Layout::docbookinnertagtype() const +{ + if (!isValidTagType(docbookinnertagtype_)) + docbookinnertagtype_ = "block"; + return docbookinnertagtype_; +} + + +string const & Layout::docbookininfo() const +{ + // Indeed, a trilean. Only titles should be "maybe": otherwise, metadata is "always", content is "never". + if (docbookininfo_.empty() || (docbookininfo_ != "never" && docbookininfo_ != "always" && docbookininfo_ != "maybe")) + docbookininfo_ = "never"; + return docbookininfo_; +} + + +string const & Layout::docbookwrappertag() const +{ + if (docbookwrappertag_.empty()) + docbookwrappertag_ = "NONE"; + return docbookwrappertag_; +} + + +string const & Layout::docbookwrapperattr() const +{ + return docbookwrapperattr_; +} + + +string const & Layout::docbookwrappertagtype() const +{ + if (!isValidTagType(docbookwrappertagtype_)) + docbookwrappertagtype_ = "block"; + return docbookwrappertagtype_; +} + + +string const & Layout::docbooksectiontag() const +{ + if (docbooksectiontag_.empty()) + docbooksectiontag_ = "section"; + return docbooksectiontag_; +} + + +string const & Layout::docbookitemwrappertag() const +{ + if (docbookitemwrappertag_.empty()) + docbookitemwrappertag_ = "NONE"; + return docbookitemwrappertag_; +} + + +string const & Layout::docbookitemwrapperattr() const +{ + return docbookitemwrapperattr_; +} + + +string const & Layout::docbookitemwrappertagtype() const +{ + if (!isValidTagType(docbookitemwrappertagtype_)) + docbookitemwrappertagtype_ = "block"; + return docbookitemwrappertagtype_; +} + + +string const & Layout::docbookitemtag() const +{ + if (docbookitemtag_.empty()) + docbookitemtag_ = "NONE"; + return docbookitemtag_; +} + + +string const & Layout::docbookitemattr() const +{ + return docbookitemattr_; +} + + +string const & Layout::docbookitemtagtype() const +{ + if (!isValidTagType(docbookitemtagtype_)) + docbookitemtagtype_ = "block"; + return docbookitemtagtype_; +} + + +string const & Layout::docbookitemlabeltag() const +{ + if (docbookitemlabeltag_.empty()) + docbookitemlabeltag_ = "NONE"; + return docbookitemlabeltag_; +} + + +string const & Layout::docbookitemlabelattr() const +{ + return docbookitemlabelattr_; +} + + +string const & Layout::docbookitemlabeltagtype() const +{ + if (!isValidTagType(docbookitemlabeltagtype_)) + docbookitemlabeltagtype_ = "block"; + return docbookitemlabeltagtype_; +} + + +string const & Layout::docbookiteminnertag() const +{ + if (docbookiteminnertag_.empty()) + docbookiteminnertag_ = "NONE"; + return docbookiteminnertag_; +} + + +string const & Layout::docbookiteminnerattr() const +{ + return docbookiteminnerattr_; +} + + +string const & Layout::docbookiteminnertagtype() const +{ + if (!isValidTagType(docbookiteminnertagtype_)) + docbookiteminnertagtype_ = "block"; + return docbookiteminnertagtype_; +} + + +std::string const & Layout::docbookforceabstracttag() const +{ + if (docbookforceabstracttag_.empty()) + docbookforceabstracttag_ = "NONE"; + return docbookforceabstracttag_; +} + + + namespace { string makeMarginValue(char const * side, double d) @@ -1550,19 +2066,19 @@ string makeMarginValue(char const * side, double d) return os.str(); } -} +} // namespace void Layout::makeDefaultCSS() const { // this never needs to be redone, since reloading layouts will // wipe out what we did before. - if (!htmldefaultstyle_.empty()) + if (!htmldefaultstyle_.empty()) return; - + // main font htmldefaultstyle_ = font.asCSS(); - + // bottom margins string tmp; if (topsep > 0) @@ -1570,7 +2086,7 @@ void Layout::makeDefaultCSS() const if (bottomsep > 0) tmp += makeMarginValue("bottom", bottomsep); if (!leftmargin.empty()) { - // we can't really do what LyX does with the margin, so + // we can't really do what LyX does with the margin, so // we'll just figure out how many characters it is int const len = leftmargin.length(); tmp += makeMarginValue("left", len); @@ -1579,7 +2095,7 @@ void Layout::makeDefaultCSS() const int const len = rightmargin.length(); tmp += makeMarginValue("right", len); } - + if (!tmp.empty()) { if (!htmldefaultstyle_.empty()) htmldefaultstyle_ += from_ascii("\n"); @@ -1594,21 +2110,21 @@ void Layout::makeDefaultCSS() const // wrap up what we have, if anything if (!htmldefaultstyle_.empty()) - htmldefaultstyle_ = + htmldefaultstyle_ = from_ascii(htmltag() + "." + defaultCSSClass() + " {\n") + htmldefaultstyle_ + from_ascii("\n}\n"); - + if (labeltype == LABEL_NO_LABEL || htmllabeltag() == "NONE") return; - + docstring labelCSS; - + // label font if (labelfont != font) labelCSS = labelfont.asCSS() + from_ascii("\n"); if (labeltype == LABEL_CENTERED) labelCSS += from_ascii("text-align: center;\n"); - + if (!labelCSS.empty()) htmldefaultstyle_ += from_ascii(htmllabeltag() + "." + defaultCSSLabelClass() + " {\n") +