]> git.lyx.org Git - lyx.git/blobdiff - src/Layout.cpp
Fix broken layout file syntax
[lyx.git] / src / Layout.cpp
index bd4c08bee42fa9884d9f08f0f6a472e22d5e59d7..a2c98ac4610fb3d6dd94322b85837816a9462f0f 100644 (file)
@@ -24,7 +24,6 @@
 #include "support/lassert.h"
 #include "support/lstrings.h"
 #include "support/Messages.h"
-#include "support/regex.h"
 #include "support/textutils.h"
 
 
@@ -41,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,
@@ -68,7 +68,6 @@ enum LayoutTags {
        LT_ENDLABELTYPE,
        LT_LATEXNAME,
        LT_LATEXPARAM,
-       LT_OPTARGS,
        LT_LATEXTYPE,
        LT_LEFTMARGIN,
        LT_NEED_PROTECT,
@@ -102,7 +101,7 @@ enum LayoutTags {
        LT_HTMLTITLE,
        LT_SPELLCHECK,
        LT_REFPREFIX,
-       LT_REQARGS,
+       LT_RESETARGS,
        LT_INTITLE // keep this last!
 };
 
@@ -144,8 +143,6 @@ Layout::Layout()
        htmlforcecss_ = false;
        htmltitle_ = false;
        spellcheck = true;
-       optargs = 0;
-       reqargs = 0;
 }
 
 
@@ -155,6 +152,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 },
@@ -202,7 +200,6 @@ bool Layout::read(Lexer & lex, TextClass const & tclass)
                { "newline",        LT_NEWLINE },
                { "nextnoindent",   LT_NEXTNOINDENT },
                { "obsoletedby",    LT_OBSOLETEDBY },
-               { "optionalargs",   LT_OPTARGS },
                { "parbreakisnewline", LT_PARBREAK_IS_NEWLINE },
                { "parindent",      LT_PARINDENT },
                { "parsep",         LT_PARSEP },
@@ -210,8 +207,8 @@ 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 },
                { "rightmargin",    LT_RIGHTMARGIN },
                { "spacing",        LT_SPACING },
                { "spellcheck",     LT_SPELLCHECK },
@@ -318,12 +315,15 @@ 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();
                        break;
 
-               case LT_REQARGS:
-                       lex >> reqargs;
+               case LT_ARGUMENT:
+                       readArgument(lex);
                        break;
 
                case LT_NEED_PROTECT:
@@ -859,69 +859,73 @@ void Layout::readSpacing(Lexer & lex)
 }
 
 
-namespace {
-
-docstring const i18npreamble(Language const * lang, Encoding const & enc,
-                            docstring const & templ, bool const polyglossia)
+void Layout::readArgument(Lexer & lex)
 {
-       if (templ.empty())
-               return templ;
-
-       string preamble = polyglossia ?
-               subst(to_utf8(templ), "$$lang", lang->polyglossia()) :
-               subst(to_utf8(templ), "$$lang", lang->babel());
-
-#ifdef TEX2LYX
-       // tex2lyx does not have getMessages()
-       LASSERT(false, /**/);
-       (void)enc;
-#else
-       string const langenc = lang->encoding()->iconvName();
-       string const texenc = lang->encoding()->latexName();
-       string const bufenc = enc.iconvName();
-       // First and second character of plane 15 (Private Use Area)
-       string const s1 = "\xf3\xb0\x80\x80"; // U+F0000
-       string const s2 = "\xf3\xb0\x80\x81"; // U+F0001
-       // FIXME UNICODE
-       // lyx::regex is not unicode-safe.
-       // Should use QRegExp or (boost::u32regex, but that requires ICU)
-       static regex const reg("_\\(([^\\)]+)\\)");
-       smatch sub;
-       while (regex_search(preamble, sub, reg)) {
-               string const key = sub.str(1);
-               docstring const name = lang->translateLayout(key);
-               // Check whether name can be encoded in the buffer encoding
-               bool encodable = true;
-               for (size_t i = 0; i < name.size(); ++i) {
-                       if (!enc.encodable(name[i])) {
-                               encodable = false;
-                               break;
-                       }
+       latexarg arg;
+       arg.mandatory = false;
+       bool error = false;
+       bool finished = false;
+       unsigned int nr;
+       lex >> nr;
+       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 == "mandatory") {
+                       lex.next();
+                       arg.mandatory = lex.getBool();
+               } else if (tok == "leftdelim") {
+                       lex.next();
+                       arg.ldelim = lex.getDocString();
+               } else if (tok == "rightdelim") {
+                       lex.next();
+                       arg.rdelim = lex.getDocString();
+               } else if (tok == "tooltip") {
+                       lex.next();
+                       arg.tooltip = lex.getDocString();
+               } else if (tok == "requires") {
+                       lex.next();
+                       arg.requires = lex.getString();
+               } else {
+                       lex.printError("Unknown tag");
+                       error = true;
                }
-               string const translated = encodable ? to_utf8(name)
-                       : "\\inputencoding{" + texenc + "}"
-                               + s1 + langenc + s2 + to_utf8(name)
-                               + s1 + bufenc + s2;
-               preamble = subst(preamble, sub.str(), translated);
        }
-#endif
-       return from_utf8(preamble);
-}
-
+       if (arg.labelstring.empty())
+               LYXERR0("Incomplete Argument definition!");
+       else
+               latexargs_[nr] = arg;
 }
 
 
-docstring const Layout::langpreamble(Language const * lang,
-                       Encoding const & enc, bool const polyglossia) const
+int Layout::optArgs() const
 {
-       return i18npreamble(lang, enc, langpreamble_, polyglossia);
+       int nr = 0;
+       LaTeXArgMap::const_iterator it = latexargs_.begin();
+       for (; it != latexargs_.end(); ++it) {
+               if (!(*it).second.mandatory)
+                       ++nr;
+       }
+       return nr;
 }
 
 
-docstring const Layout::babelpreamble(Language const * lang,
-                       Encoding const & enc, bool const polyglossia) const
+int Layout::requiredArgs() const
 {
-       return i18npreamble(lang, enc, babelpreamble_, polyglossia);
+       int nr = 0;
+       LaTeXArgMap::const_iterator it = latexargs_.begin();
+       for (; it != latexargs_.end(); ++it) {
+               if ((*it).second.mandatory)
+                       ++nr;
+       }
+       return nr;
 }
 
 
@@ -978,7 +982,8 @@ string const & Layout::htmllabelattr() const
 }
 
 
-docstring Layout::htmlstyle() const {
+docstring Layout::htmlstyle() const
+{
        if (!htmlstyle_.empty() && !htmlforcecss_)
                return htmlstyle_;
        if (htmldefaultstyle_.empty()) 
@@ -1006,7 +1011,7 @@ string Layout::defaultCSSClass() const
                                d = from_ascii("lyx_");
                        else
                                d += '_';
-               } else if (islower(c))
+               } else if (isLower(c))
                        d += c;
                else
                        // this is slow, so do it only if necessary
@@ -1018,15 +1023,19 @@ string Layout::defaultCSSClass() const
 
 
 namespace {
-       string makeMarginValue(char const * side, double d) {
-               ostringstream os;
-               os << "margin-" << side << ": " << d << "ex;\n";
-               return os.str();
-       }
+
+string makeMarginValue(char const * side, double d)
+{
+       ostringstream os;
+       os << "margin-" << side << ": " << d << "ex;\n";
+       return os.str();
 }
 
+}
 
-void Layout::makeDefaultCSS() const {
+
+void Layout::makeDefaultCSS() const
+{
        // this never needs to be redone, since reloading layouts will
        // wipe out what we did before.
        if (!htmldefaultstyle_.empty())