X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=005acb22581fddc7a122312216e812cfdc023c23;hb=a41d589e851a956ff27235841e6330bab552c0fe;hp=b7b7d1db8236bab800b734eca351295314b99beb;hpb=fdbe775b9f5468e8f53dc83a66583f412b5970fb;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index b7b7d1db82..005acb2258 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, @@ -51,6 +53,7 @@ enum LayoutTags { LT_FONT, LT_FREE_SPACING, LT_PASS_THRU, + LT_PASS_THRU_CHARS, LT_PARBREAK_IS_NEWLINE, LT_ITEMCOMMAND, LT_ITEMSEP, @@ -74,6 +77,7 @@ enum LayoutTags { LT_NEED_PROTECT, LT_NEWLINE, LT_NEXTNOINDENT, + LT_PAR_GROUP, LT_PARINDENT, LT_PARSEP, LT_PARSKIP, @@ -93,7 +97,7 @@ enum LayoutTags { LT_HTMLITEM, LT_HTMLITEMATTR, LT_HTMLLABEL, - LT_HTMLLABELATTR, + LT_HTMLLABELATTR, LT_HTMLLABELFIRST, LT_HTMLPREAMBLE, LT_HTMLSTYLE, @@ -103,18 +107,26 @@ enum LayoutTags { LT_SPELLCHECK, LT_REFPREFIX, LT_RESETARGS, + LT_RESUMECOUNTER, + LT_STEPMASTERCOUNTER, LT_RIGHTDELIM, LT_FORCELOCAL, + LT_TOGGLE_INDENT, + LT_ADDTOTOC, + LT_ISTOCCAPTION, LT_INTITLE // keep this last! }; ///////////////////// Layout::Layout() + : add_to_toc_(false), is_toc_caption_(true) { unknown_ = false; margintype = MARGIN_STATIC; latextype = LATEX_PARAGRAPH; + resumecounter = false; + stepmastercounter = false; intitle = false; inpreamble = false; needprotect = false; @@ -148,6 +160,8 @@ Layout::Layout() spellcheck = true; forcelocal = 0; itemcommand_ = "item"; + toggle_indent = ITOGGLE_DOCUMENT_DEFAULT; + par_group_ = false; } @@ -175,9 +189,11 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) { // This table is sorted alphabetically [asierra 30March96] LexerKeyword layoutTags[] = { + { "addtotoc", LT_ADDTOTOC }, { "align", LT_ALIGN }, { "alignpossible", LT_ALIGNPOSSIBLE }, { "argument", LT_ARGUMENT }, + { "autonests", LT_AUTONESTS }, { "babelpreamble", LT_BABELPREAMBLE }, { "bottomsep", LT_BOTTOMSEP }, { "category", LT_CATEGORY }, @@ -204,6 +220,8 @@ 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 }, { "itemtag", LT_ITEMTAG }, @@ -228,21 +246,26 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) { "newline", LT_NEWLINE }, { "nextnoindent", LT_NEXTNOINDENT }, { "obsoletedby", LT_OBSOLETEDBY }, + { "paragraphgroup", LT_PAR_GROUP }, { "parbreakisnewline", LT_PARBREAK_IS_NEWLINE }, { "parindent", LT_PARINDENT }, { "parsep", LT_PARSEP }, { "parskip", LT_PARSKIP }, { "passthru", LT_PASS_THRU }, + { "passthruchars", LT_PASS_THRU_CHARS }, { "preamble", LT_PREAMBLE }, { "refprefix", LT_REFPREFIX }, { "requires", LT_REQUIRES }, { "resetargs", LT_RESETARGS }, + { "resumecounter", LT_RESUMECOUNTER }, { "rightdelim", LT_RIGHTDELIM }, { "rightmargin", LT_RIGHTMARGIN }, { "spacing", LT_SPACING }, { "spellcheck", LT_SPELLCHECK }, + { "stepmastercounter", LT_STEPMASTERCOUNTER }, { "textfont", LT_TEXTFONT }, { "toclevel", LT_TOCLEVEL }, + { "toggleindent", LT_TOGGLE_INDENT }, { "topsep", LT_TOPSEP } }; @@ -264,7 +287,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) error = true; continue; - default: + default: break; } switch (static_cast(le)) { @@ -309,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" @@ -354,6 +377,14 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) } break; + case LT_RESUMECOUNTER: + lex >> resumecounter; + break; + + case LT_STEPMASTERCOUNTER: + lex >> stepmastercounter; + break; + case LT_ARGUMENT: readArgument(lex); break; @@ -383,6 +414,19 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) lex >> nextnoindent; break; + case LT_TOGGLE_INDENT: { + string tog; + lex >> tog; + tog = support::ascii_lowercase(tog); + if (tog == "always") + toggle_indent = ITOGGLE_ALWAYS; + else if (tog == "never") + toggle_indent = ITOGGLE_NEVER; + else + toggle_indent = ITOGGLE_DOCUMENT_DEFAULT; + break; + } + case LT_COMMANDDEPTH: lex >> commanddepth; break; @@ -425,15 +469,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: @@ -496,7 +540,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_ALIGN: readAlign(lex); break; - + case LT_ALIGNPOSSIBLE: readAlignPossible(lex); break; @@ -505,23 +549,23 @@ 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: + lex >> par_group_; break; case LT_FREE_SPACING: @@ -532,6 +576,10 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) lex >> pass_thru; break; + case LT_PASS_THRU_CHARS: + lex >> pass_thru_chars; + break; + case LT_PARBREAK_IS_NEWLINE: lex >> parbreak_is_newline; break; @@ -542,12 +590,36 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_REQUIRES: { lex.eatLine(); - vector const req = - getVectorFromString(lex.getString()); + vector const req = + getVectorFromString(lex.getString(true)); requires_.insert(req.begin(), req.end()); break; } - + + case LT_AUTONESTS: { + docstring const autonest = + subst(subst(subst(lex.getLongString(from_ascii("EndAutoNests")), + from_ascii("\n"), docstring()), + from_ascii(" "), docstring()), + from_ascii("\t"), docstring()); + vector const autonests = + getVectorFromString(autonest); + autonests_.insert(autonests.begin(), autonests.end()); + break; + } + + case LT_AUTONESTEDBY: { + docstring const autonest = + subst(subst(subst(lex.getLongString(from_ascii("EndIsAutoNestedBy")), + from_ascii("\n"), docstring()), + from_ascii(" "), docstring()), + from_ascii("\t"), docstring()); + vector const autonests = + getVectorFromString(autonest); + autonested_by_.insert(autonests.begin(), autonests.end()); + break; + } + case LT_REFPREFIX: { docstring arg; lex >> arg; @@ -561,7 +633,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_HTMLTAG: lex >> htmltag_; break; - + case LT_HTMLATTR: lex >> htmlattr_; break; @@ -569,25 +641,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: @@ -595,9 +667,9 @@ 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; @@ -609,6 +681,16 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass) case LT_FORCELOCAL: lex >> forcelocal; break; + + case LT_ADDTOTOC: + lex >> toc_type_; + add_to_toc_ = !toc_type_.empty(); + break; + + case LT_ISTOCCAPTION: + lex >> is_toc_caption_; + break; + } } lex.popTable(); @@ -853,12 +935,15 @@ void Layout::readLatexType(Lexer & lex) return; case LATEX_PARAGRAPH: case LATEX_COMMAND: - case LATEX_ENVIRONMENT: case LATEX_ITEM_ENVIRONMENT: - case LATEX_BIB_ENVIRONMENT: case LATEX_LIST_ENVIRONMENT: latextype = static_cast(le); break; + case LATEX_ENVIRONMENT: + case LATEX_BIB_ENVIRONMENT: + latextype = static_cast(le); + par_group_ = true; + break; default: LYXERR0("Unhandled value " << le); break; @@ -914,10 +999,13 @@ void Layout::readArgument(Lexer & lex) // 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; + arg.passthru = PT_INHERITED; string id; lex >> id; bool const itemarg = prefixIs(id, "item:"); @@ -943,6 +1031,9 @@ void Layout::readArgument(Lexer & lex) } else if (tok == "autoinsert") { lex.next(); arg.autoinsert = lex.getBool(); + } else if (tok == "insertcotext") { + lex.next(); + arg.insertcotext = lex.getBool(); } else if (tok == "leftdelim") { lex.next(); arg.ldelim = lex.getDocString(); @@ -972,6 +1063,21 @@ void Layout::readArgument(Lexer & lex) arg.font = lyxRead(lex, arg.font); } else if (tok == "labelfont") { arg.labelfont = lyxRead(lex, arg.labelfont); + } 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 { lex.printError("Unknown tag"); error = true; @@ -999,6 +1105,8 @@ void writeArgument(ostream & os, string const & id, Layout::latexarg const & arg os << "\t\tMandatory " << arg.mandatory << '\n'; if (arg.autoinsert) os << "\t\tAutoinsert " << arg.autoinsert << '\n'; + if (arg.insertcotext) + os << "\t\tInsertCotext " << arg.insertcotext << '\n'; if (!arg.ldelim.empty()) os << "\t\tLeftDelim \"" << to_utf8(subst(arg.ldelim, from_ascii("\n"), from_ascii("
"))) @@ -1021,13 +1129,26 @@ 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"; } void Layout::write(ostream & os) const { - os << "Style " << to_utf8(name_) << '\n'; + os << "Style \"" << to_utf8(name_) << "\"\n"; if (!category_.empty() && obsoleted_by_.empty()) os << "\tCategory \"" << to_utf8(category_) << "\"\n"; // Can't deduce Copystyle here :-( @@ -1077,7 +1198,9 @@ void Layout::write(ostream & os) const } os << "\tInTitle " << intitle << "\n" "\tInPreamble " << inpreamble << "\n" - "\tTocLevel " << toclevel << '\n'; + "\tTocLevel " << toclevel << "\n" + "\tResumeCounter " << resumecounter << "\n" + "\tStepMasterCounter " << stepmastercounter << '\n'; // ResetArgs does not make sense here for (LaTeXArgMap::const_iterator it = latexargs_.begin(); it != latexargs_.end(); ++it) @@ -1177,6 +1300,7 @@ void Layout::write(ostream & os) const os << "\tEndLabelType Static\n"; break; } + os << "\tParagraphGroup \"" << par_group_ << "\"\n"; if (!leftmargin.empty()) os << "\tLeftMargin \"" << to_utf8(leftmargin) << "\"\n"; if (!rightmargin.empty()) @@ -1221,8 +1345,6 @@ void Layout::write(ostream & os) const bool first = true; os << "\tAlignPossible"; if (alignpossible & LYX_ALIGN_BLOCK) { - if (!first) - os << ','; os << " Block"; first = false; } @@ -1264,6 +1386,8 @@ void Layout::write(ostream & os) const os << "\tLabelCounter \"" << to_utf8(counter) << "\"\n"; os << "\tFreeSpacing " << free_spacing << '\n'; os << "\tPassThru " << pass_thru << '\n'; + if (!pass_thru_chars.empty()) + os << "\tPassThruChars " << to_utf8(pass_thru_chars) << '\n'; os << "\tParbreakIsNewline " << parbreak_is_newline << '\n'; switch (spacing.getSpace()) { case Spacing::Double: @@ -1291,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 @@ -1324,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_; @@ -1369,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_; } @@ -1426,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()) @@ -1436,7 +1582,7 @@ docstring Layout::htmlstyle() const string Layout::defaultCSSClass() const -{ +{ if (!defaultcssclass_.empty()) return defaultcssclass_; docstring d; @@ -1471,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) @@ -1491,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); @@ -1500,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"); @@ -1515,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") +