]> git.lyx.org Git - lyx.git/blobdiff - src/Layout.cpp
Update my email and status.
[lyx.git] / src / Layout.cpp
index 97594b706e0991c594450251e2ae58be061db2b5..1eaa38aa5fa3b495a590ba70f858bfa736a6eb47 100644 (file)
@@ -40,6 +40,7 @@ const int Layout::NOT_IN_TOC = -1000;
 enum LayoutTags {
        LT_ALIGN = 1,
        LT_ALIGNPOSSIBLE,
+       LT_ARGUMENT,
        LT_MARGIN,
        LT_BOTTOMSEP,
        LT_CATEGORY,
@@ -52,6 +53,7 @@ enum LayoutTags {
        LT_FREE_SPACING,
        LT_PASS_THRU,
        LT_PARBREAK_IS_NEWLINE,
+       LT_ITEMCOMMAND,
        LT_ITEMSEP,
        LT_KEEPEMPTY,
        LT_LABEL_BOTTOMSEP,
@@ -67,8 +69,8 @@ enum LayoutTags {
        LT_ENDLABELTYPE,
        LT_LATEXNAME,
        LT_LATEXPARAM,
-       LT_OPTARGS,
        LT_LATEXTYPE,
+       LT_LEFTDELIM,
        LT_LEFTMARGIN,
        LT_NEED_PROTECT,
        LT_NEWLINE,
@@ -101,7 +103,8 @@ enum LayoutTags {
        LT_HTMLTITLE,
        LT_SPELLCHECK,
        LT_REFPREFIX,
-       LT_REQARGS,
+       LT_RESETARGS,
+       LT_RIGHTDELIM,
        LT_INTITLE // keep this last!
 };
 
@@ -143,8 +146,7 @@ Layout::Layout()
        htmlforcecss_ = false;
        htmltitle_ = false;
        spellcheck = true;
-       optargs = 0;
-       reqargs = 0;
+       itemcommand_ = "item";
 }
 
 
@@ -154,6 +156,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
        LexerKeyword layoutTags[] = {
                { "align",          LT_ALIGN },
                { "alignpossible",  LT_ALIGNPOSSIBLE },
+               { "argument",       LT_ARGUMENT },
                { "babelpreamble",  LT_BABELPREAMBLE },
                { "bottomsep",      LT_BOTTOMSEP },
                { "category",       LT_CATEGORY },
@@ -179,6 +182,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                { "innertag",       LT_INNERTAG },
                { "inpreamble",     LT_INPREAMBLE },
                { "intitle",        LT_INTITLE },
+               { "itemcommand",    LT_ITEMCOMMAND },
                { "itemsep",        LT_ITEMSEP },
                { "itemtag",        LT_ITEMTAG },
                { "keepempty",      LT_KEEPEMPTY },
@@ -195,13 +199,13 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                { "latexname",      LT_LATEXNAME },
                { "latexparam",     LT_LATEXPARAM },
                { "latextype",      LT_LATEXTYPE },
+               { "leftdelim",      LT_LEFTDELIM },
                { "leftmargin",     LT_LEFTMARGIN },
                { "margin",         LT_MARGIN },
                { "needprotect",    LT_NEED_PROTECT },
                { "newline",        LT_NEWLINE },
                { "nextnoindent",   LT_NEXTNOINDENT },
                { "obsoletedby",    LT_OBSOLETEDBY },
-               { "optionalargs",   LT_OPTARGS },
                { "parbreakisnewline", LT_PARBREAK_IS_NEWLINE },
                { "parindent",      LT_PARINDENT },
                { "parsep",         LT_PARSEP },
@@ -209,8 +213,9 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                { "passthru",       LT_PASS_THRU },
                { "preamble",       LT_PREAMBLE },
                { "refprefix",      LT_REFPREFIX },
-               { "requiredargs",   LT_REQARGS },
                { "requires",       LT_REQUIRES },
+               { "resetargs",      LT_RESETARGS },
+               { "rightdelim",     LT_RIGHTDELIM },
                { "rightmargin",    LT_RIGHTMARGIN },
                { "spacing",        LT_SPACING },
                { "spellcheck",     LT_SPELLCHECK },
@@ -317,12 +322,17 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                        lex >> toclevel;
                        break;
 
-               case LT_OPTARGS:
-                       lex >> optargs;
+               case LT_RESETARGS:
+                       bool reset;
+                       lex >> reset;
+                       if (reset) {
+                               latexargs_.clear();
+                               itemargs_.clear();
+                       }
                        break;
 
-               case LT_REQARGS:
-                       lex >> reqargs;
+               case LT_ARGUMENT:
+                       readArgument(lex);
                        break;
 
                case LT_NEED_PROTECT:
@@ -363,6 +373,18 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                        latexparam_ = subst(latexparam_, """, "\"");
                        break;
 
+               case LT_LEFTDELIM:
+                       lex >> leftdelim_;
+                       leftdelim_ = support::subst(leftdelim_, from_ascii("<br/>"),
+                                                   from_ascii("\n"));
+                       break;
+
+               case LT_RIGHTDELIM:
+                       lex >> rightdelim_;
+                       rightdelim_ = support::subst(rightdelim_, from_ascii("<br/>"),
+                                                    from_ascii("\n"));
+                       break;
+
                case LT_INNERTAG:
                        lex >> innertag_;
                        break;
@@ -375,6 +397,10 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                        lex >> itemtag_;
                        break;
 
+               case LT_ITEMCOMMAND:
+                       lex >> itemcommand_;
+                       break;
+
                case LT_PREAMBLE:
                        preamble_ = from_utf8(lex.getLongString("EndPreamble"));
                        break;
@@ -858,6 +884,127 @@ void Layout::readSpacing(Lexer & lex)
 }
 
 
+void Layout::readArgument(Lexer & lex)
+{
+       latexarg arg;
+       arg.mandatory = false;
+       arg.autoinsert = false;
+       bool error = false;
+       bool finished = false;
+       arg.font = inherit_font;
+       arg.labelfont = inherit_font;
+       string id;
+       lex >> id;
+       bool const itemarg = prefixIs(id, "item:");
+       bool const postcmd = prefixIs(id, "post:");
+
+       while (!finished && lex.isOK() && !error) {
+               lex.next();
+               string const tok = ascii_lowercase(lex.getString());
+
+               if (tok.empty()) {
+                       continue;
+               } else if (tok == "endargument") {
+                       finished = true;
+               } else if (tok == "labelstring") {
+                       lex.next();
+                       arg.labelstring = lex.getDocString();
+               } else if (tok == "menustring") {
+                       lex.next();
+                       arg.menustring = lex.getDocString();
+               } else if (tok == "mandatory") {
+                       lex.next();
+                       arg.mandatory = lex.getBool();
+               } else if (tok == "autoinsert") {
+                       lex.next();
+                       arg.autoinsert = lex.getBool();
+               } else if (tok == "leftdelim") {
+                       lex.next();
+                       arg.ldelim = lex.getDocString();
+                       arg.ldelim = support::subst(arg.ldelim, from_ascii("<br/>"),
+                                                   from_ascii("\n"));
+               } else if (tok == "rightdelim") {
+                       lex.next();
+                       arg.rdelim = lex.getDocString();
+                       arg.rdelim = support::subst(arg.rdelim, from_ascii("<br/>"),
+                                                   from_ascii("\n"));
+               } else if (tok == "presetarg") {
+                       lex.next();
+                       arg.presetarg = lex.getDocString();
+               } else if (tok == "tooltip") {
+                       lex.next();
+                       arg.tooltip = lex.getDocString();
+               } else if (tok == "requires") {
+                       lex.next();
+                       arg.requires = lex.getString();
+               } else if (tok == "decoration") {
+                       lex.next();
+                       arg.decoration = lex.getString();
+               } else if (tok == "font") {
+                       arg.font = lyxRead(lex, arg.font);
+               } else if (tok == "labelfont") {
+                       arg.labelfont = lyxRead(lex, arg.labelfont);
+               } else {
+                       lex.printError("Unknown tag");
+                       error = true;
+               }
+       }
+       if (arg.labelstring.empty())
+               LYXERR0("Incomplete Argument definition!");
+       else if (itemarg)
+               itemargs_[id] = arg;
+       else if (postcmd)
+               postcommandargs_[id] = arg;
+       else
+               latexargs_[id] = arg;
+}
+
+
+Layout::LaTeXArgMap Layout::args() const
+{
+       LaTeXArgMap args = latexargs_;
+       if (!postcommandargs_.empty())
+               args.insert(postcommandargs_.begin(), postcommandargs_.end());
+       if (!itemargs_.empty())
+               args.insert(itemargs_.begin(), itemargs_.end());
+       return args;
+}
+
+
+int Layout::optArgs() const
+{
+       int nr = 0;
+       LaTeXArgMap::const_iterator it = latexargs_.begin();
+       for (; it != latexargs_.end(); ++it) {
+               if (!(*it).second.mandatory)
+                       ++nr;
+       }
+       LaTeXArgMap::const_iterator iit = postcommandargs_.begin();
+       for (; iit != postcommandargs_.end(); ++iit) {
+               if (!(*iit).second.mandatory)
+                       ++nr;
+       }
+       return nr;
+}
+
+
+int Layout::requiredArgs() const
+{
+       int nr = 0;
+       LaTeXArgMap::const_iterator it = latexargs_.begin();
+       for (; it != latexargs_.end(); ++it) {
+               if ((*it).second.mandatory)
+                       ++nr;
+       }
+       LaTeXArgMap::const_iterator iit = postcommandargs_.begin();
+       for (; iit != postcommandargs_.end(); ++iit) {
+               if (!(*iit).second.mandatory)
+                       ++nr;
+       }
+       return nr;
+}
+
+
 string const & Layout::htmltag() const 
 { 
        if (htmltag_.empty())