X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=fd4709e35659bf8927e4974b014f3efc588b5a14;hb=8b7584846c4e1a9c87a004fab479722fee7e3013;hp=ae045f130fd3519956085b0c7d9f7e27bb96d81d;hpb=1832a388c5495210c30acb134414dd5b2edf3e7d;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index ae045f130f..fd4709e356 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -13,17 +13,18 @@ #include #include "Layout.h" +#include "FontInfo.h" #include "Language.h" -#include "TextClass.h" #include "Lexer.h" -#include "FontInfo.h" +#include "output_xhtml.h" +#include "TextClass.h" -#include "support/Messages.h" #include "support/debug.h" #include "support/lassert.h" #include "support/lstrings.h" +#include "support/Messages.h" -#include +#include "support/regex.h" using namespace std; using namespace lyx::support; @@ -55,6 +56,7 @@ enum LayoutTags { LT_FONT, LT_FREE_SPACING, LT_PASS_THRU, + LT_PARBREAK_IS_NEWLINE, //LT_HEADINGS, LT_ITEMSEP, LT_KEEPEMPTY, @@ -104,6 +106,9 @@ enum LayoutTags { LT_HTMLFORCECSS, LT_INPREAMBLE, LT_HTMLTITLE, + LT_SPELLCHECK, + LT_REFPREFIX, + LT_REQARGS, LT_INTITLE // keep this last! }; @@ -116,7 +121,6 @@ Layout::Layout() latextype = LATEX_PARAGRAPH; intitle = false; inpreamble = false; - optionalargs = 0; needprotect = false; keepempty = false; font = inherit_font; @@ -141,11 +145,15 @@ Layout::Layout() newline_allowed = true; free_spacing = false; pass_thru = false; + parbreak_is_newline = false; toclevel = NOT_IN_TOC; commanddepth = 0; htmllabelfirst_ = false; htmlforcecss_ = false; htmltitle_ = false; + spellcheck = true; + optargs = 0; + reqargs = 0; } @@ -205,14 +213,18 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) { "nextnoindent", LT_NEXTNOINDENT }, { "obsoletedby", LT_OBSOLETEDBY }, { "optionalargs", LT_OPTARGS }, + { "parbreakisnewline", LT_PARBREAK_IS_NEWLINE }, { "parindent", LT_PARINDENT }, { "parsep", LT_PARSEP }, { "parskip", LT_PARSKIP }, { "passthru", LT_PASS_THRU }, { "preamble", LT_PREAMBLE }, + { "refprefix", LT_REFPREFIX }, + { "requiredargs", LT_REQARGS }, { "requires", LT_REQUIRES }, { "rightmargin", LT_RIGHTMARGIN }, { "spacing", LT_SPACING }, + { "spellcheck", LT_SPELLCHECK }, { "textfont", LT_TEXTFONT }, { "toclevel", LT_TOCLEVEL }, { "topsep", LT_TOPSEP } @@ -315,7 +327,11 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) break; case LT_OPTARGS: - lex >> optionalargs ; + lex >> optargs; + break; + + case LT_REQARGS: + lex >> reqargs; break; case LT_NEED_PROTECT: @@ -483,6 +499,10 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) lex >> pass_thru; break; + case LT_PARBREAK_IS_NEWLINE: + lex >> parbreak_is_newline; + break; + case LT_SPACING: // setspace.sty readSpacing(lex); break; @@ -494,6 +514,16 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) requires_.insert(req.begin(), req.end()); break; } + + case LT_REFPREFIX: { + docstring arg; + lex >> arg; + if (arg == "OFF") + refprefix.clear(); + else + refprefix = arg; + break; + } case LT_HTMLTAG: lex >> htmltag_; @@ -529,6 +559,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) case LT_HTMLFORCECSS: lex >> htmlforcecss_; + break; case LT_HTMLPREAMBLE: htmlpreamble_ = from_utf8(lex.getLongString("EndPreamble")); @@ -537,11 +568,21 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) case LT_HTMLTITLE: lex >> htmltitle_; break; + + case LT_SPELLCHECK: + lex >> spellcheck; + break; } } lex.popTable(); + // make sure we only have inpreamble = true for commands + if (inpreamble && latextype != LATEX_COMMAND) { + LYXERR0("InPreamble not permitted except with Command-type layouts."); + LYXERR0("Layout name: " << name()); + inpreamble = false; + } - return !error; + return finished && !error; } @@ -847,11 +888,11 @@ docstring const i18npreamble(Language const * lang, docstring const & templ) LASSERT(false, /**/); #else // FIXME UNICODE - // boost::regex is not unicode-safe. + // lyx::regex is not unicode-safe. // Should use QRegExp or (boost::u32regex, but that requires ICU) - static boost::regex const reg("_\\(([^\\)]+)\\)"); - boost::smatch sub; - while (boost::regex_search(preamble, sub, reg)) { + static regex const reg("_\\(([^\\)]+)\\)"); + smatch sub; + while (regex_search(preamble, sub, reg)) { string const key = sub.str(1); string translated; if (isAscii(key)) @@ -916,8 +957,13 @@ string const & Layout::htmlitemattr() const string const & Layout::htmllabeltag() const { - if (htmllabeltag_.empty()) - htmllabeltag_ = "span"; + if (htmllabeltag_.empty()) { + if (labeltype != LABEL_TOP_ENVIRONMENT && + labeltype != LABEL_CENTERED_TOP_ENVIRONMENT) + htmllabeltag_ = "span"; + else + htmllabeltag_ = "div"; + } return htmllabeltag_; } @@ -963,27 +1009,77 @@ string Layout::defaultCSSClass() const } -// NOTE There is a whole ton of stuff that could go into this. -// Things like bottomsep, topsep, and parsep could become various -// sorts of margins or padding, for example. But for now we are -// going to keep it simple. +namespace { + string makeMarginValue(char const * side, double d) { + ostringstream os; + os << "margin-" << side << ": " << d << "ex;\n"; + return os.str(); + } +} + + void Layout::makeDefaultCSS() const { // this never needs to be redone, since reloading layouts will // wipe out what we did before. if (!htmldefaultstyle_.empty()) return; - docstring const mainfontCSS = font.asCSS(); - if (!mainfontCSS.empty()) + + // main font + htmldefaultstyle_ = font.asCSS(); + + // bottom margins + string tmp; + if (topsep > 0) + tmp += makeMarginValue("top", topsep); + if (bottomsep > 0) + tmp += makeMarginValue("bottom", bottomsep); + if (!leftmargin.empty()) { + // we can't really do what LyX does with the margin, so + // we'll just figure out how many characters it is + int const len = leftmargin.length(); + tmp += makeMarginValue("left", len); + } + if (!rightmargin.empty()) { + int const len = rightmargin.length(); + tmp += makeMarginValue("right", len); + } + + if (!tmp.empty()) { + if (!htmldefaultstyle_.empty()) + htmldefaultstyle_ += from_ascii("\n"); + htmldefaultstyle_ += from_ascii(tmp); + } + +// tex2lyx does not see output_xhtml.cpp +#ifndef TEX2LYX + // alignment + string where = alignmentToCSS(align); + if (!where.empty()) { + htmldefaultstyle_ += from_ascii("text-align: " + where + ";\n"); + } +#endif + + // wrap up what we have, if anything + if (!htmldefaultstyle_.empty()) htmldefaultstyle_ = from_ascii(htmltag() + "." + defaultCSSClass() + " {\n") + - mainfontCSS + from_ascii("\n}\n"); - if (labelfont == font || htmllabeltag() == "NONE") + htmldefaultstyle_ + from_ascii("\n}\n"); + + if (labeltype == LABEL_NO_LABEL || htmllabeltag() == "NONE") return; - docstring const labelfontCSS = labelfont.asCSS(); - if (!labelfontCSS.empty()) + + docstring labelCSS; + + // label font + if (labelfont != font) + labelCSS = labelfont.asCSS() + from_ascii("\n"); + if (labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) + labelCSS += from_ascii("text-align: center;\n"); + + if (!labelCSS.empty()) htmldefaultstyle_ += from_ascii(htmllabeltag() + "." + defaultCSSLabelClass() + " {\n") + - labelfontCSS + from_ascii("\n}\n"); + labelCSS + from_ascii("\n}\n"); }