commit 3c9b62a69d894b5ea020c18d0bec676dc00fe378
Author: Guillaume Munch <[email protected]>
Date:   Tue Nov 3 11:47:25 2015 -0500

    Layout format update: AddToToc, IsTocCaption, OutlinerName
    
    Preliminary work for addressing #7790. Thanks to Richard for providing 
initial
    files this is based on.
    
    Adding to TextClass:
        OutlinerName <string> <string>
        (the second string is translated)
    e.g.:
        OutlinerName thm "Definitions & Theorems"
    
    Adding to Layout:
        AddToToc <string>     (default "", means no)
        IsTocCaption <bool>   (default 0)
    e.g.:
        AddToToc thm
        IsTocCaption 1
    
    Adding to InsetLayout:
        AddToToc <string>     (default "", means no)
        IsTocCaption <bool>   (default 0)
    e.g.:
        AddToToc literate
    
    Adding to inset arguments:
        IsTocCaption <bool>   (default 0)

diff --git a/lib/scripts/layout2layout.py b/lib/scripts/layout2layout.py
index 48a1e03..a87c300 100644
--- a/lib/scripts/layout2layout.py
+++ b/lib/scripts/layout2layout.py
@@ -193,6 +193,11 @@ import os, re, string, sys
 # New Layout tag "ProvideStyle"
 # Change "IfStyle" to "ModifyStyle"
 
+# Incremented to format 59, 22 November 2015 by gm
+# New Tag "OutlinerName"
+# New Layout tags "AddToToc", "IsTocCaption"
+# New Layout argument tag "IsTocCaption"
+
 # Do not forget to document format change in Customization
 # Manual (section "Declaring a new text class").
 
@@ -200,7 +205,7 @@ import os, re, string, sys
 # development/tools/updatelayouts.py script to update all
 # layout files to the new format.
 
-currentFormat = 58
+currentFormat = 59
 
 
 def usage(prog_name):
@@ -425,6 +430,10 @@ def convert(lines):
                 i += 1
             continue
 
+        if format == 58:
+            # nothing to do.
+            i += 1
+            continue
 
         if format == 57:
             match = re_IfStyle.match(lines[i])
diff --git a/po/lyx_pot.py b/po/lyx_pot.py
index c92939c..432a126 100755
--- a/po/lyx_pot.py
+++ b/po/lyx_pot.py
@@ -84,6 +84,7 @@ def layouts_l10n(input_files, output, base, 
layouttranslations):
     # match LabelString, EndLabelString, LabelStringAppendix and maybe others 
but no comments
     LabelString = re.compile(r'^[^#]*LabelString\S*\s+(.*\S)\s*$', 
re.IGNORECASE)
     MenuString = re.compile(r'^[^#]*MenuString\S*\s+(.*\S)\s*$', re.IGNORECASE)
+    OutlinerName = 
re.compile(r'^[^#]*OutlinerName\s+(\S+|\"[^\"]*\")\s+(\S+|\"[^\"]*\")\s*$', 
re.IGNORECASE)
     Tooltip = re.compile(r'^\s*Tooltip\S*\s+(.*\S)\s*$', re.IGNORECASE)
     GuiName = re.compile(r'^\s*GuiName\s+(.*\S)\s*$', re.IGNORECASE)
     ListName = re.compile(r'^\s*ListName\s+(.*\S)\s*$', re.IGNORECASE)
@@ -250,6 +251,12 @@ def layouts_l10n(input_files, output, base, 
layouttranslations):
                 if not layouttranslations:
                     writeString(out, src, base, lineno, string)
                 continue
+            res = OutlinerName.search(line)
+            if res != None:
+                string = res.group(2)
+                if not layouttranslations:
+                    writeString(out, src, base, lineno, string)
+                continue
             res = Tooltip.search(line)
             if res != None:
                 string = res.group(1)
diff --git a/src/Layout.cpp b/src/Layout.cpp
index 0fdb341..db8c317 100644
--- a/src/Layout.cpp
+++ b/src/Layout.cpp
@@ -108,12 +108,15 @@ enum LayoutTags {
        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_(false)
 {
        unknown_ = false;
        margintype = MARGIN_STATIC;
@@ -180,6 +183,7 @@ 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 },
@@ -209,6 +213,7 @@ bool Layout::readIgnoreForcelocal(Lexer & lex, TextClass 
const & tclass)
                { "innertag",       LT_INNERTAG },
                { "inpreamble",     LT_INPREAMBLE },
                { "intitle",        LT_INTITLE },
+               { "istoccaption",   LT_ISTOCCAPTION },
                { "itemcommand",    LT_ITEMCOMMAND },
                { "itemsep",        LT_ITEMSEP },
                { "itemtag",        LT_ITEMTAG },
@@ -638,6 +643,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();
@@ -951,6 +966,7 @@ void Layout::readArgument(Lexer & lex)
        bool finished = false;
        arg.font = inherit_font;
        arg.labelfont = inherit_font;
+       arg.is_toc_caption = false;
        string id;
        lex >> id;
        bool const itemarg = prefixIs(id, "item:");
@@ -1011,6 +1027,9 @@ void Layout::readArgument(Lexer & lex)
                } else if (tok == "passthruchars") {
                        lex.next();
                        arg.pass_thru_chars = lex.getDocString();
+               } else if (tok == "istoccaption") {
+                       lex.next();
+                       arg.is_toc_caption = lex.getBool();
                } else {
                        lex.printError("Unknown tag");
                        error = true;
diff --git a/src/Layout.h b/src/Layout.h
index 091e319..273a361 100644
--- a/src/Layout.h
+++ b/src/Layout.h
@@ -106,6 +106,7 @@ public:
                bool autoinsert;
                bool insertcotext;
                docstring pass_thru_chars;
+               bool is_toc_caption;
        };
        ///
        typedef std::map<std::string, latexarg> LaTeXArgMap;
@@ -203,6 +204,12 @@ public:
                        || labeltype == LABEL_CENTERED
                  || labeltype == LABEL_BIBLIO;
        }
+       ///
+       bool addToToc() const { return add_to_toc_; }
+       ///
+       std::string tocType() const { return toc_type_; }
+       ///
+       bool isTocCaption() const { return is_toc_caption_; }
 
        ///
        bool operator==(Layout const &) const;
@@ -459,8 +466,15 @@ private:
        LaTeXArgMap postcommandargs_;
        ///
        LaTeXArgMap itemargs_;
+       ///
+       bool add_to_toc_;
+       ///
+       std::string toc_type_;
+       ///
+       bool is_toc_caption_;
 };
 
+
 } // namespace lyx
 
 #endif
diff --git a/src/TextClass.cpp b/src/TextClass.cpp
index 0ee74a7..c6f3ee0 100644
--- a/src/TextClass.cpp
+++ b/src/TextClass.cpp
@@ -61,7 +61,7 @@ namespace lyx {
 // You should also run the development/tools/updatelayouts.py script,
 // to update the format of all of our layout files.
 //
-int const LAYOUT_FORMAT = 58; // rgh: ProvideStyle
+int const LAYOUT_FORMAT = 59; //gm: OutlinerName, AddToToc, IsTocCaption
 
 namespace {
 
@@ -213,7 +213,8 @@ enum TextClassTags {
        TC_CITEENGINETYPE,
        TC_CITEFORMAT,
        TC_DEFAULTBIBLIO,
-       TC_FULLAUTHORLIST
+       TC_FULLAUTHORLIST,
+       TC_OUTLINERNAME
 };
 
 
@@ -249,6 +250,7 @@ LexerKeyword textClassTags[] = {
        { "nofloat",           TC_NOFLOAT },
        { "noinsetlayout",     TC_NOINSETLAYOUT },
        { "nostyle",           TC_NOSTYLE },
+       { "outlinername",      TC_OUTLINERNAME },
        { "outputformat",      TC_OUTPUTFORMAT },
        { "outputtype",        TC_OUTPUTTYPE },
        { "packageoptions",    TC_PKGOPTS },
@@ -801,6 +803,10 @@ TextClass::ReturnValues TextClass::read(Lexer & lexrc, 
ReadType rt)
                                floatlist_.erase(nofloat);
                        }
                        break;
+
+               case TC_OUTLINERNAME:
+                       error = !readOutlinerName(lexrc);
+                       break;
                } // end of switch
 
                // Note that this is triggered the first time through the loop 
unless
@@ -1295,6 +1301,39 @@ bool TextClass::readFloat(Lexer & lexrc)
 }
 
 
+bool TextClass::readOutlinerName(Lexer & lexrc)
+{
+       std::string type;
+       docstring name;
+       if (lexrc.next())
+               type = lexrc.getString();
+       else {
+               lexrc.printError("No type given for OutlinerName: `$$Token'.");
+               return false;
+       }
+       if (lexrc.next())
+               name = lexrc.getDocString();
+       else {
+               lexrc.printError("No name given for OutlinerName: `$$Token'.");
+               return false;
+       }
+       outliner_names_[type] = name;
+    return true;
+}
+
+
+docstring TextClass::outlinerName(std::string const & type) const
+{
+       std::map<std::string,docstring>::const_iterator const it
+               = outliner_names_.find(type);
+       if (it == outliner_names_.end()) {
+               LYXERR0("Missing OutlinerName for " << type << "!");
+               return from_utf8(type);
+       } else
+               return it->second;
+}
+
+
 string const & TextClass::prerequisites(string const & sep) const
 {
        if (contains(prerequisites_, ',')) {
diff --git a/src/TextClass.h b/src/TextClass.h
index 0a075dd..94fe003 100644
--- a/src/TextClass.h
+++ b/src/TextClass.h
@@ -199,6 +199,8 @@ public:
        OutputType outputType() const { return outputType_; }
        /// Can be latex, docbook ... (the name of a format)
        std::string outputFormat() const { return outputFormat_; }
+       ///
+       docstring outlinerName(std::string const & type) const;
 protected:
        /// Protect construction
        TextClass();
@@ -327,6 +329,8 @@ protected:
        bool cite_full_author_list_;
        /// The possible citation styles
        std::map<CiteEngineType, std::vector<CitationStyle> > cite_styles_;
+       ///
+       std::map<std::string, docstring> outliner_names_;
 private:
        ///////////////////////////////////////////////////////////////////
        // helper routines for reading layout files
@@ -359,6 +363,8 @@ private:
        int readCiteEngineType(Lexer &) const;
        ///
        bool readCiteFormat(Lexer &);
+       ///
+       bool readOutlinerName(Lexer &);
 };
 
 
diff --git a/src/TocBackend.cpp b/src/TocBackend.cpp
index 5599e1f..9bd435f 100644
--- a/src/TocBackend.cpp
+++ b/src/TocBackend.cpp
@@ -32,6 +32,7 @@
 #include "support/convert.h"
 #include "support/debug.h"
 #include "support/docstream.h"
+#include "support/gettext.h"
 #include "support/lassert.h"
 #include "support/lstrings.h"
 
@@ -362,4 +363,11 @@ void TocBackend::writePlaintextTocList(string const & type,
 }
 
 
+docstring TocBackend::outlinerName(std::string const & type) const
+{
+       return translateIfPossible(
+           buffer_->params().documentClass().outlinerName(type));
+}
+
+
 } // namespace lyx
diff --git a/src/TocBackend.h b/src/TocBackend.h
index e18f1bc..d5dfae4 100644
--- a/src/TocBackend.h
+++ b/src/TocBackend.h
@@ -221,6 +221,8 @@ public:
        ///
        void writePlaintextTocList(std::string const & type,
                odocstringstream & os, size_t max_length) const;
+       ///
+       docstring outlinerName(std::string const & type) const;
 
 private:
        ///
diff --git a/src/insets/InsetLayout.cpp b/src/insets/InsetLayout.cpp
index 9e03fcb..7291a60 100644
--- a/src/insets/InsetLayout.cpp
+++ b/src/insets/InsetLayout.cpp
@@ -44,7 +44,7 @@ InsetLayout::InsetLayout() :
        freespacing_(false), keepempty_(false), forceltr_(false),
        forceownlines_(false), needprotect_(false), intoc_(false),
        spellcheck_(true), resetsfont_(false), display_(true),
-       forcelocalfontswitch_(false)
+       forcelocalfontswitch_(false), add_to_toc_(false), is_toc_caption_(false)
 {
        labelfont_.setColor(Color_error);
 }
@@ -80,6 +80,7 @@ InsetLayout::InsetLaTeXType translateLaTeXType(std::string 
const & str)
 bool InsetLayout::read(Lexer & lex, TextClass const & tclass)
 {
        enum {
+               IL_ADDTOTOC,
                IL_ARGUMENT,
                IL_BABELPREAMBLE,
                IL_BGCOLOR,
@@ -106,6 +107,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & 
tclass)
                IL_HTMLSTYLE,
                IL_HTMLPREAMBLE,
                IL_INTOC,
+               IL_ISTOCCAPTION,
                IL_LABELFONT,
                IL_LABELSTRING,
                IL_LANGPREAMBLE,
@@ -133,6 +135,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & 
tclass)
 
 
        LexerKeyword elementTags[] = {
+               { "addtotoc", IL_ADDTOTOC },
                { "argument", IL_ARGUMENT },
                { "babelpreamble", IL_BABELPREAMBLE },
                { "bgcolor", IL_BGCOLOR },
@@ -160,6 +163,7 @@ bool InsetLayout::read(Lexer & lex, TextClass const & 
tclass)
                { "htmlstyle", IL_HTMLSTYLE },
                { "htmltag", IL_HTMLTAG },
                { "intoc", IL_INTOC },
+               { "istoccaption", IL_ISTOCCAPTION },
                { "keepempty", IL_KEEPEMPTY },
                { "labelfont", IL_LABELFONT },
                { "labelstring", IL_LABELSTRING },
@@ -454,6 +458,13 @@ bool InsetLayout::read(Lexer & lex, TextClass const & 
tclass)
                case IL_DISPLAY:
                        lex >> display_;
                        break;
+               case IL_ADDTOTOC:
+                       lex >> toc_type_;
+                       add_to_toc_ = !toc_type_.empty();
+                       break;
+               case IL_ISTOCCAPTION:
+                       lex >> is_toc_caption_;
+                       break;
                case IL_END:
                        getout = true;
                        break;
@@ -569,6 +580,7 @@ void InsetLayout::readArgument(Lexer & lex)
        bool finished = false;
        arg.font = inherit_font;
        arg.labelfont = inherit_font;
+       arg.is_toc_caption = false;
        string nr;
        lex >> nr;
        bool const postcmd = prefixIs(nr, "post:");
@@ -630,6 +642,9 @@ void InsetLayout::readArgument(Lexer & lex)
                } else if (tok == "passthruchars") {
                        lex.next();
                        arg.pass_thru_chars = lex.getDocString();
+               } else if (tok == "istoccaption") {
+                       lex.next();
+                       arg.is_toc_caption = lex.getBool();
                } else {
                        lex.printError("Unknown tag");
                        error = true;
diff --git a/src/insets/InsetLayout.h b/src/insets/InsetLayout.h
index 9589fad..c1bbe5c 100644
--- a/src/insets/InsetLayout.h
+++ b/src/insets/InsetLayout.h
@@ -181,6 +181,12 @@ public:
        bool forcelocalfontswitch() const { return forcelocalfontswitch_; }
        ///
        docstring const & obsoleted_by() const { return obsoleted_by_; }
+       ///
+       bool addToToc() const { return add_to_toc_; }
+       ///
+       std::string tocType() const { return toc_type_; }
+       ///
+       bool isTocCaption() const { return is_toc_caption_; }
 private:
        ///
        void makeDefaultCSS() const;
@@ -296,6 +302,12 @@ private:
        Layout::LaTeXArgMap latexargs_;
        ///
        Layout::LaTeXArgMap postcommandargs_;
+       ///
+       bool add_to_toc_;
+       ///
+       std::string toc_type_;
+       ///
+       bool is_toc_caption_;
 };
 
 ///

Reply via email to