X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=4813854b48aa59d03c35c30a148e4d4cdc2eaf86;hb=279e656d6a7c4ee3647752cba8b9aa7d6ec6e0c2;hp=7893c5fe7e6cd8a3d3cfa35551087fa4b3ed8e4a;hpb=1f945177b9628b213c60872df88f2d155c3d6c54;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index 7893c5fe7e..4813854b48 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -40,6 +40,8 @@ enum LayoutTags { LT_ALIGN = 1, LT_ALIGNPOSSIBLE, LT_ARGUMENT, + LT_AUTONESTS, + LT_AUTONESTEDBY, LT_MARGIN, LT_BOTTOMSEP, LT_CATEGORY, @@ -95,7 +97,7 @@ enum LayoutTags { LT_HTMLITEM, LT_HTMLITEMATTR, LT_HTMLLABEL, - LT_HTMLLABELATTR, + LT_HTMLLABELATTR, LT_HTMLLABELFIRST, LT_HTMLPREAMBLE, LT_HTMLSTYLE, @@ -118,7 +120,7 @@ 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; @@ -191,6 +193,7 @@ 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 }, @@ -217,6 +220,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 }, @@ -283,7 +287,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) error = true; continue; - default: + default: break; } switch (static_cast(le)) { @@ -328,7 +332,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" @@ -536,7 +540,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_ALIGN: readAlign(lex); break; - + case LT_ALIGNPOSSIBLE: readAlignPossible(lex); break; @@ -545,23 +549,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: @@ -595,7 +595,31 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) requires_.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 +633,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_HTMLTAG: lex >> htmltag_; break; - + case LT_HTMLATTR: lex >> htmlattr_; break; @@ -617,23 +641,23 @@ 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_ = lex.getLongString(from_ascii("EndHTMLStyle")); break; @@ -645,7 +669,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_HTMLPREAMBLE: htmlpreamble_ = lex.getLongString(from_ascii("EndPreamble")); break; - + case LT_HTMLTITLE: lex >> htmltitle_; break; @@ -981,6 +1005,7 @@ void Layout::readArgument(Lexer & lex) arg.font = inherit_font; arg.labelfont = inherit_font; arg.is_toc_caption = false; + arg.passthru = PT_INHERITED; string id; lex >> id; bool const itemarg = prefixIs(id, "item:"); @@ -1041,6 +1066,15 @@ 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(); @@ -1095,6 +1129,17 @@ void writeArgument(ostream & os, string const & id, Layout::latexarg const & arg 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"; os << "\tEndArgument\n"; @@ -1370,6 +1415,26 @@ void Layout::write(ostream & os) const } 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"; + 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\tIsAutoNestedBy\n"; + } if (refprefix.empty()) os << "\tRefPrefix OFF\n"; else @@ -1403,6 +1468,13 @@ void Layout::write(ostream & os) const } +bool Layout::hasArgs() const +{ + return !latexargs_.empty() || !postcommandargs_.empty() || + !itemargs_.empty(); +} + + Layout::LaTeXArgMap Layout::args() const { LaTeXArgMap args = latexargs_; @@ -1448,56 +1520,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 +1572,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 +1582,7 @@ docstring Layout::htmlstyle() const string Layout::defaultCSSClass() const -{ +{ if (!defaultcssclass_.empty()) return defaultcssclass_; docstring d; @@ -1550,19 +1617,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 +1637,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 +1646,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 +1661,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") +