]> git.lyx.org Git - lyx.git/blobdiff - src/Layout.cpp
Correctly set language after intitle paragraphs
[lyx.git] / src / Layout.cpp
index f9d181db73c611b2ee0ec4771ccd4e2484de9224..3c1a9bd955515d321e847e1a7c408a50e59de9f8 100644 (file)
@@ -40,6 +40,8 @@ enum LayoutTags {
        LT_ALIGN = 1,
        LT_ALIGNPOSSIBLE,
        LT_ARGUMENT,
+       LT_AUTONESTS,
+       LT_AUTONESTEDBY,
        LT_MARGIN,
        LT_BOTTOMSEP,
        LT_CATEGORY,
@@ -72,6 +74,8 @@ enum LayoutTags {
        LT_LATEXTYPE,
        LT_LEFTDELIM,
        LT_LEFTMARGIN,
+       LT_NEED_CPROTECT,
+       LT_NEED_MBOXPROTECT,
        LT_NEED_PROTECT,
        LT_NEWLINE,
        LT_NEXTNOINDENT,
@@ -118,7 +122,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;
@@ -128,6 +132,8 @@ Layout::Layout()
        intitle = false;
        inpreamble = false;
        needprotect = false;
+       needcprotect = false;
+       needmboxprotect = false;
        keepempty = false;
        font = inherit_font;
        labelfont = inherit_font;
@@ -191,6 +197,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 +224,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 +246,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 },
@@ -370,6 +380,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                                latexargs_.clear();
                                itemargs_.clear();
                                postcommandargs_.clear();
+                               listpreamble_.clear();
                        }
                        break;
 
@@ -389,6 +400,14 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                        lex >> needprotect;
                        break;
 
+               case LT_NEED_CPROTECT:
+                       lex >> needcprotect;
+                       break;
+
+               case LT_NEED_MBOXPROTECT:
+                       lex >> needmboxprotect;
+                       break;
+
                case LT_KEEPEMPTY:
                        lex >> keepempty;
                        break;
@@ -545,23 +564,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_);
                        break;
 
                case LT_LABELSTRING_APPENDIX:
                        lex >> labelstring_appendix_;
-                       labelstring_appendix_ = trim(labelstring_appendix_);
                        break;
 
                case LT_LABELCOUNTER:
                        lex >> counter;
-                       counter = trim(counter);
                        break;
 
                case LT_PAR_GROUP:
@@ -596,6 +611,30 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                        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<docstring> 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<docstring> const autonests =
+                               getVectorFromString(autonest, from_ascii(","), false, true);
+                       autonested_by_.insert(autonests.begin(), autonests.end());
+                       break;
+               }
+
                case LT_REFPREFIX: {
                        docstring arg;
                        lex >> arg;
@@ -974,18 +1013,22 @@ void Layout::readArgument(Lexer & lex)
        latexarg arg;
        // writeArgument() makes use of these default values
        arg.mandatory = false;
+       arg.nodelims = false;
        arg.autoinsert = false;
        arg.insertcotext = false;
+       arg.insertonnewline = false;
        bool error = false;
        bool finished = false;
        arg.font = inherit_font;
        arg.labelfont = inherit_font;
        arg.is_toc_caption = false;
        arg.passthru = PT_INHERITED;
+       arg.free_spacing = false;
        string id;
        lex >> id;
        bool const itemarg = prefixIs(id, "item:");
        bool const postcmd = prefixIs(id, "post:");
+       bool const listpreamble = prefixIs(id, "listpreamble:");
 
        while (!finished && lex.isOK() && !error) {
                lex.next();
@@ -1035,6 +1078,9 @@ void Layout::readArgument(Lexer & lex)
                } 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") {
@@ -1054,6 +1100,9 @@ void Layout::readArgument(Lexer & lex)
                } else if (tok == "istoccaption") {
                        lex.next();
                        arg.is_toc_caption = lex.getBool();
+               } else if (tok == "freespacing") {
+                       lex.next();
+                       arg.free_spacing = lex.getBool();
                } else {
                        lex.printError("Unknown tag");
                        error = true;
@@ -1065,7 +1114,11 @@ void Layout::readArgument(Lexer & lex)
                itemargs_[id] = arg;
        else if (postcmd)
                postcommandargs_[id] = arg;
-       else
+       else if (listpreamble) {
+               // list preamble has no delimiters by default
+               arg.nodelims = true;
+               listpreamble_[id] = arg;
+       } else
                latexargs_[id] = arg;
 }
 
@@ -1101,6 +1154,8 @@ void writeArgument(ostream & os, string const & id, Layout::latexarg const & arg
                os << "\t\tRequires \"" << arg.requires << "\"\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)
@@ -1118,6 +1173,8 @@ void writeArgument(ostream & os, string const & id, Layout::latexarg const & arg
        }
        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";
 }
 
@@ -1187,7 +1244,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);
@@ -1391,6 +1453,26 @@ void Layout::write(ostream & os) const
                }
                os << '\n';
        }
+       if (!autonests_.empty()) {
+               os << "\tAutoNests\n\t";
+               for (set<docstring>::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<docstring>::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
@@ -1427,7 +1509,7 @@ void Layout::write(ostream & os) const
 bool Layout::hasArgs() const
 {
        return !latexargs_.empty() || !postcommandargs_.empty() ||
-               !itemargs_.empty();
+               !itemargs_.empty() || !listpreamble_.empty();
 }
 
 
@@ -1436,6 +1518,8 @@ 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;
@@ -1510,13 +1594,8 @@ string const & Layout::htmlitemattr() const
 
 string const & Layout::htmllabeltag() const
 {
-       if (htmllabeltag_.empty()) {
-               if (labeltype != LABEL_ABOVE &&
-                   labeltype != LABEL_CENTERED)
+       if (htmllabeltag_.empty())
                        htmllabeltag_ = "span";
-               else
-                       htmllabeltag_ = "div";
-       }
        return htmllabeltag_;
 }