]> git.lyx.org Git - lyx.git/blobdiff - src/Layout.cpp
Revert "DocBook: add a layout tag to tell whether an item is the abstract or not."
[lyx.git] / src / Layout.cpp
index 0a783d0aad1542fb5e2124be8c62521dd2716b3c..eeb58d04527246aa1cb01c697de99808d8f35555 100644 (file)
@@ -31,7 +31,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]
@@ -74,6 +74,8 @@ enum LayoutTags {
        LT_LATEXTYPE,
        LT_LEFTDELIM,
        LT_LEFTMARGIN,
+       LT_NEED_CPROTECT,
+       LT_NEED_MBOXPROTECT,
        LT_NEED_PROTECT,
        LT_NEWLINE,
        LT_NEXTNOINDENT,
@@ -102,6 +104,22 @@ enum LayoutTags {
        LT_HTMLPREAMBLE,
        LT_HTMLSTYLE,
        LT_HTMLFORCECSS,
+       LT_DOCBOOKTAG,
+       LT_DOCBOOKATTR,
+       LT_DOCBOOKININFO,
+       LT_DOCBOOKWRAPPERTAG,
+       LT_DOCBOOKWRAPPERATTR,
+       LT_DOCBOOKWRAPPERMERGEWITHPREVIOUS,
+       LT_DOCBOOKSECTIONTAG,
+       LT_DOCBOOKITEMWRAPPERTAG,
+       LT_DOCBOOKITEMWRAPPERATTR,
+       LT_DOCBOOKITEMTAG,
+       LT_DOCBOOKITEMATTR,
+       LT_DOCBOOKITEMLABELTAG,
+       LT_DOCBOOKITEMLABELATTR,
+       LT_DOCBOOKITEMINNERTAG,
+       LT_DOCBOOKITEMINNERATTR,
+       LT_DOCBOOKFORCEABSTRACTTAG,
        LT_INPREAMBLE,
        LT_HTMLTITLE,
        LT_SPELLCHECK,
@@ -120,7 +138,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;
@@ -130,6 +148,8 @@ Layout::Layout()
        intitle = false;
        inpreamble = false;
        needprotect = false;
+       needcprotect = false;
+       needmboxprotect = false;
        keepempty = false;
        font = inherit_font;
        labelfont = inherit_font;
@@ -157,6 +177,7 @@ Layout::Layout()
        htmllabelfirst_ = false;
        htmlforcecss_ = false;
        htmltitle_ = false;
+       docbookwrappermergewithprevious_ = false;
        spellcheck = true;
        forcelocal = 0;
        itemcommand_ = "item";
@@ -200,6 +221,22 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                { "commanddepth",   LT_COMMANDDEPTH },
                { "copystyle",      LT_COPYSTYLE },
                { "dependson",      LT_DEPENDSON },
+               { "docbookattr",             LT_DOCBOOKATTR },
+               { "docbookforceabstracttag", LT_DOCBOOKFORCEABSTRACTTAG },
+               { "docbookininfo",           LT_DOCBOOKININFO },
+               { "docbookitemattr",         LT_DOCBOOKITEMATTR },
+               { "docbookiteminnerattr",    LT_DOCBOOKITEMINNERATTR },
+               { "docbookiteminnertag",     LT_DOCBOOKITEMINNERTAG },
+               { "docbookitemlabelattr",    LT_DOCBOOKITEMLABELATTR },
+               { "docbookitemlabeltag",     LT_DOCBOOKITEMLABELTAG },
+               { "docbookitemtag",          LT_DOCBOOKITEMTAG },
+               { "docbookitemwrapperattr",  LT_DOCBOOKITEMWRAPPERATTR },
+               { "docbookitemwrappertag",   LT_DOCBOOKITEMWRAPPERTAG },
+               { "docbooksectiontag",       LT_DOCBOOKSECTIONTAG },
+               { "docbooktag",              LT_DOCBOOKTAG },
+               { "docbookwrapperattr",      LT_DOCBOOKWRAPPERATTR },
+               { "docbookwrappermergewithprevious", LT_DOCBOOKWRAPPERMERGEWITHPREVIOUS },
+               { "docbookwrappertag",       LT_DOCBOOKWRAPPERTAG },
                { "end",            LT_END },
                { "endlabelstring", LT_ENDLABELSTRING },
                { "endlabeltype",   LT_ENDLABELTYPE },
@@ -242,6 +279,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 },
@@ -374,6 +413,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                                latexargs_.clear();
                                itemargs_.clear();
                                postcommandargs_.clear();
+                               listpreamble_.clear();
                        }
                        break;
 
@@ -393,6 +433,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;
@@ -592,30 +640,30 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                        lex.eatLine();
                        vector<string> const req =
                                getVectorFromString(lex.getString(true));
-                       requires_.insert(req.begin(), req.end());
+                       required_.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());
+                       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);
+                               getVectorFromString(autonest, from_ascii(","), false, true);
                        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());
+                       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);
+                               getVectorFromString(autonest, from_ascii(","), false, true);
                        autonested_by_.insert(autonests.begin(), autonests.end());
                        break;
                }
@@ -674,6 +722,70 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass const & tclass)
                        lex >> htmltitle_;
                        break;
 
+               case LT_DOCBOOKTAG:
+                       lex >> docbooktag_;
+                       break;
+
+               case LT_DOCBOOKATTR:
+                       lex >> docbookattr_;
+                       break;
+
+               case LT_DOCBOOKFORCEABSTRACTTAG:
+                       lex >> docbookforceabstracttag_;
+                       break;
+
+               case LT_DOCBOOKININFO:
+                       lex >> docbookininfo_;
+                       break;
+
+               case LT_DOCBOOKWRAPPERTAG:
+                       lex >> docbookwrappertag_;
+                       break;
+
+               case LT_DOCBOOKWRAPPERATTR:
+                       lex >> docbookwrapperattr_;
+                       break;
+
+               case LT_DOCBOOKWRAPPERMERGEWITHPREVIOUS:
+                       lex >> docbookwrappermergewithprevious_;
+                       break;
+
+               case LT_DOCBOOKSECTIONTAG:
+                       lex >> docbooksectiontag_;
+                       break;
+
+        case LT_DOCBOOKITEMWRAPPERTAG:
+            lex >> docbookitemwrappertag_;
+            break;
+
+        case LT_DOCBOOKITEMWRAPPERATTR:
+                       lex >> docbookitemwrapperattr_;
+                       break;
+
+               case LT_DOCBOOKITEMTAG:
+                       lex >> docbookitemtag_;
+                       break;
+
+               case LT_DOCBOOKITEMATTR:
+                       lex >> docbookitemattr_;
+                       break;
+
+               case LT_DOCBOOKITEMLABELTAG:
+                       lex >> docbookitemlabeltag_;
+                       break;
+
+               case LT_DOCBOOKITEMLABELATTR:
+                       lex >> docbookitemlabelattr_;
+                       break;
+
+               case LT_DOCBOOKITEMINNERTAG:
+                       lex >> docbookiteminnertag_;
+                       break;
+
+               case LT_DOCBOOKITEMINNERATTR:
+                       lex >> docbookiteminnerattr_;
+                       break;
+
                case LT_SPELLCHECK:
                        lex >> spellcheck;
                        break;
@@ -998,18 +1110,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();
@@ -1055,10 +1171,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") {
@@ -1078,6 +1197,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;
@@ -1089,7 +1211,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;
 }
 
@@ -1121,10 +1247,12 @@ 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)
@@ -1142,6 +1270,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";
 }
 
@@ -1211,7 +1341,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);
@@ -1405,11 +1540,11 @@ void Layout::write(ostream & os) const
        case Spacing::Default:
                break;
        }
-       if (!requires_.empty()) {
+       if (!required_.empty()) {
                os << "\tRequires ";
-               for (set<string>::const_iterator it = requires_.begin();
-                    it != requires_.end(); ++it) {
-                       if (it != requires_.begin())
+               for (set<string>::const_iterator it = required_.begin();
+                    it != required_.end(); ++it) {
+                       if (it != required_.begin())
                                os << ',';
                        os << *it;
                }
@@ -1426,14 +1561,14 @@ void Layout::write(ostream & os) const
                os << "\n\tEndAutoNests\n";
        }
        if (!autonested_by_.empty()) {
-               os << "\tIsAutoNestedBy\n\t";
+               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\tIsAutoNestedBy\n";
+               os << "\n\tEndIsAutoNestedBy\n";
        }
        if (refprefix.empty())
                os << "\tRefPrefix OFF\n";
@@ -1461,8 +1596,39 @@ 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(!docbookininfo_.empty())
+               os << "\tDocBookInInfo " << docbookininfo_ << '\n';
+       if(!docbookwrappertag_.empty())
+               os << "\tDocBookWrapperTag " << docbookwrappertag_ << '\n';
+       if(!docbookwrapperattr_.empty())
+               os << "\tDocBookWrapperAttr " << docbookwrapperattr_ << '\n';
+       if(!docbooksectiontag_.empty())
+               os << "\tDocBookSectionTag " << docbooksectiontag_ << '\n';
+       if(!docbookitemtag_.empty())
+               os << "\tDocBookItemTag " << docbookitemtag_ << '\n';
+       if(!docbookitemattr_.empty())
+               os << "\tDocBookItemAttr " << docbookitemattr_ << '\n';
+       if(!docbookitemwrappertag_.empty())
+               os << "\tDocBookItemWrapperTag " << docbookitemwrappertag_ << '\n';
+       if(!docbookitemwrapperattr_.empty())
+               os << "\tDocBookItemWrapperAttr " << docbookitemwrapperattr_ << '\n';
+       os << "\tDocBookItemWrapperMergeWithPrevious " << docbookwrappermergewithprevious_ << '\n';
+       if(!docbookitemlabeltag_.empty())
+               os << "\tDocBookItemLabelTag " << docbookitemlabeltag_ << '\n';
+       if(!docbookitemlabelattr_.empty())
+               os << "\tDocBookItemLabelAttr " << docbookitemlabelattr_ << '\n';
+       if(!docbookiteminnertag_.empty())
+               os << "\tDocBookItemInnerTag " << docbookiteminnertag_ << '\n';
+       if(!docbookiteminnerattr_.empty())
+               os << "\tDocBookItemInnerAttr " << docbookiteminnerattr_ << '\n';
+       if(!docbookforceabstracttag_.empty())
+               os << "\tDocBookForceAbstractTag " << docbookforceabstracttag_ << '\n';
+       os << "\tSpellcheck " << spellcheck << "\n"
              "\tForceLocal " << forcelocal << "\n"
              "End\n";
 }
@@ -1471,7 +1637,7 @@ void Layout::write(ostream & os) const
 bool Layout::hasArgs() const
 {
        return !latexargs_.empty() || !postcommandargs_.empty() ||
-               !itemargs_.empty();
+               !itemargs_.empty() || !listpreamble_.empty();
 }
 
 
@@ -1480,6 +1646,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;
@@ -1608,6 +1776,116 @@ string Layout::defaultCSSClass() const
 }
 
 
+string const & Layout::docbooktag() const
+{
+       // No sensible default value, unhappily...
+       if (docbooktag_.empty())
+               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_;
+}
+
+
+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::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::docbookitemtag() const
+{
+    return docbookitemtag_;
+}
+
+
+string const & Layout::docbookitemattr() const
+{
+    return docbookitemattr_;
+}
+
+
+string const & Layout::docbookitemlabeltag() const
+{
+       if (docbookitemlabeltag_.empty())
+               docbookitemlabeltag_ = "NONE";
+       return docbookitemlabeltag_;
+}
+
+
+string const & Layout::docbookitemlabelattr() const
+{
+       return docbookitemlabelattr_;
+}
+
+
+string const & Layout::docbookiteminnertag() const
+{
+       if (docbookiteminnertag_.empty())
+               docbookiteminnertag_ = "NONE";
+       return docbookiteminnertag_;
+}
+
+
+string const & Layout::docbookiteminnerattr() const
+{
+       return docbookiteminnerattr_;
+}
+
+
+std::string const & Layout::docbookforceabstracttag() const
+{
+       if (docbookforceabstracttag_.empty())
+               docbookforceabstracttag_ = "NONE";
+       return docbookforceabstracttag_;
+}
+
+
+
 namespace {
 
 string makeMarginValue(char const * side, double d)