X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=2ff77edafcb82ef36e2dea01e762f576441cc779;hb=ee0860e403d144308b1cdcb0ef223bc34008c64b;hp=904911b1e15e10a79a06155b6da42ec42afacfd7;hpb=08ba2b9b450f3b4f8a720a5a0fa59b186fe3d1af;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index 904911b1e1..2ff77edafc 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -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,8 +68,8 @@ enum LayoutTags { LT_ENDLABELTYPE, LT_LATEXNAME, LT_LATEXPARAM, - LT_OPTARGS, LT_LATEXTYPE, + LT_LEFTDELIM, LT_LEFTMARGIN, LT_NEED_PROTECT, LT_NEWLINE, @@ -102,7 +102,8 @@ enum LayoutTags { LT_HTMLTITLE, LT_SPELLCHECK, LT_REFPREFIX, - LT_REQARGS, + LT_RESETARGS, + LT_RIGHTDELIM, LT_INTITLE // keep this last! }; @@ -144,8 +145,6 @@ Layout::Layout() htmlforcecss_ = false; htmltitle_ = false; spellcheck = true; - optargs = 0; - reqargs = 0; } @@ -155,6 +154,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 }, @@ -196,13 +196,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 }, @@ -210,8 +210,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 }, @@ -318,12 +319,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: @@ -364,6 +370,18 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) latexparam_ = subst(latexparam_, """, "\""); break; + case LT_LEFTDELIM: + lex >> leftdelim_; + leftdelim_ = support::subst(leftdelim_, from_ascii("
"), + from_ascii("\n")); + break; + + case LT_RIGHTDELIM: + lex >> rightdelim_; + rightdelim_ = support::subst(rightdelim_, from_ascii("
"), + from_ascii("\n")); + break; + case LT_INNERTAG: lex >> innertag_; break; @@ -859,64 +877,90 @@ void Layout::readSpacing(Lexer & lex) } -namespace { - -docstring const i18npreamble(Language const * lang, Encoding const & enc, - docstring const & templ, bool const polyglossia, - bool const unicode) +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); - string translated = to_utf8(lang->translateLayout(key)); - if (!unicode && langenc != bufenc) - translated = "\\inputencoding{" + texenc + "}" - + s1 + langenc + s2 + translated - + s1 + bufenc + s2; - preamble = subst(preamble, sub.str(), translated); - } -#endif - return from_utf8(preamble); -} + latexarg arg; + arg.mandatory = 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:"); + + 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(); + arg.ldelim = support::subst(arg.ldelim, from_ascii("
"), + from_ascii("\n")); + } else if (tok == "rightdelim") { + lex.next(); + arg.rdelim = lex.getDocString(); + arg.rdelim = support::subst(arg.rdelim, from_ascii("
"), + from_ascii("\n")); + } 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 + latexargs_[id] = arg; } -docstring const Layout::langpreamble(Language const * lang, - Encoding const & enc, bool const polyglossia, - bool const unicode) const +int Layout::optArgs() const { - return i18npreamble(lang, enc, langpreamble_, polyglossia, unicode); + 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, - bool const unicode) const +int Layout::requiredArgs() const { - return i18npreamble(lang, enc, babelpreamble_, polyglossia, unicode); + int nr = 0; + LaTeXArgMap::const_iterator it = latexargs_.begin(); + for (; it != latexargs_.end(); ++it) { + if ((*it).second.mandatory) + ++nr; + } + return nr; } @@ -973,7 +1017,8 @@ string const & Layout::htmllabelattr() const } -docstring Layout::htmlstyle() const { +docstring Layout::htmlstyle() const +{ if (!htmlstyle_.empty() && !htmlforcecss_) return htmlstyle_; if (htmldefaultstyle_.empty()) @@ -1001,7 +1046,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 @@ -1013,15 +1058,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())