X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=983c53e7a3922783a3f8e9b9739311f9dac1d2f1;hb=b65d0c087bc8cc61ec898210852c7ea39ab64ee4;hp=06a6f64d456323f5d7842717331637b6d67aa6b7;hpb=36765b8e2109ad05c529076e6f91ede4ac57e293;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index 06a6f64d45..983c53e7a3 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -13,17 +13,19 @@ #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/debug.h" #include "support/lassert.h" #include "support/lstrings.h" #include "support/Messages.h" - #include "support/regex.h" +#include "support/textutils.h" + using namespace std; using namespace lyx::support; @@ -49,8 +51,6 @@ enum LayoutTags { LT_END, //LT_ENVIRONMENT_DEFAULT, //LT_FANCYHDR, - LT_FILL_BOTTOM, - LT_FILL_TOP, //LT_FIRST_COUNTER, LT_FONT, LT_FREE_SPACING, @@ -139,8 +139,6 @@ Layout::Layout() endlabeltype = END_LABEL_NO_LABEL; // Should or should not. That is the question. // spacing.set(Spacing::OneHalf); - fill_top = false; - fill_bottom = false; newline_allowed = true; free_spacing = false; pass_thru = false; @@ -171,8 +169,6 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) { "end", LT_END }, { "endlabelstring", LT_ENDLABELSTRING }, { "endlabeltype", LT_ENDLABELTYPE }, - { "fill_bottom", LT_FILL_BOTTOM }, - { "fill_top", LT_FILL_TOP }, { "font", LT_FONT }, { "freespacing", LT_FREE_SPACING }, { "htmlattr", LT_HTMLATTR }, @@ -182,7 +178,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) { "htmllabel", LT_HTMLLABEL }, { "htmllabelattr", LT_HTMLLABELATTR }, { "htmllabelfirst", LT_HTMLLABELFIRST }, - { "htmlpremable", LT_HTMLPREAMBLE }, + { "htmlpreamble", LT_HTMLPREAMBLE }, { "htmlstyle", LT_HTMLSTYLE }, { "htmltag", LT_HTMLTAG }, { "htmltitle", LT_HTMLTITLE }, @@ -448,14 +444,6 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) lex >> parsep; break; - case LT_FILL_TOP: // fill top flag - lex >> fill_top; - break; - - case LT_FILL_BOTTOM: // fill bottom flag - lex >> fill_bottom; - break; - case LT_NEWLINE: // newlines allowed? lex >> newline_allowed; break; @@ -575,8 +563,8 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) } 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."); + if (inpreamble && latextype != LATEX_COMMAND && latextype != LATEX_PARAGRAPH) { + LYXERR0("InPreamble not permitted except with command and paragraph layouts."); LYXERR0("Layout name: " << name()); inpreamble = false; } @@ -875,12 +863,14 @@ void Layout::readSpacing(Lexer & lex) namespace { -docstring const i18npreamble(Language const * lang, docstring const & templ) +docstring const i18npreamble(Language const * lang, docstring const & templ, bool const polyglossia) { if (templ.empty()) return templ; - string preamble = subst(to_utf8(templ), "$$lang", lang->babel()); + string preamble = polyglossia ? + subst(to_utf8(templ), "$$lang", lang->polyglossia()) : + subst(to_utf8(templ), "$$lang", lang->babel()); #ifdef TEX2LYX // tex2lyx does not have getMessages() @@ -893,14 +883,7 @@ docstring const i18npreamble(Language const * lang, docstring const & templ) smatch sub; while (regex_search(preamble, sub, reg)) { string const key = sub.str(1); - string translated; - if (isAscii(key)) - translated = to_utf8(getMessages(lang->code()).get(key)); - else { - lyxerr << "Warning: not translating `" << key - << "' because it is not pure ASCII." << endl; - translated = key; - } + string translated = to_utf8(lang->translateLayout(key)); preamble = subst(preamble, sub.str(), translated); } #endif @@ -910,15 +893,15 @@ docstring const i18npreamble(Language const * lang, docstring const & templ) } -docstring const Layout::langpreamble(Language const * lang) const +docstring const Layout::langpreamble(Language const * lang, bool const polyglossia) const { - return i18npreamble(lang, langpreamble_); + return i18npreamble(lang, langpreamble_, polyglossia); } -docstring const Layout::babelpreamble(Language const * lang) const +docstring const Layout::babelpreamble(Language const * lang, bool const polyglossia) const { - return i18npreamble(lang, babelpreamble_); + return i18npreamble(lang, babelpreamble_, polyglossia); } @@ -956,8 +939,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_; } @@ -990,23 +978,29 @@ string Layout::defaultCSSClass() const docstring::const_iterator it = name().begin(); docstring::const_iterator en = name().end(); for (; it != en; ++it) { - if (!isalpha(*it)) - continue; - if (islower(*it)) - d += *it; - else - d += lowercase(*it); + char_type const c = *it; + if (!isAlphaASCII(c)) { + if (d.empty()) + // make sure we don't start with an underscore, + // as that sometimes causes problems. + d = from_ascii("lyx_"); + else + d += '_'; + } else if (islower(c)) + d += c; + else + // this is slow, so do it only if necessary + d += lowercase(c); } - // are there other characters we need to remove? defaultcssclass_ = to_utf8(d); return defaultcssclass_; } namespace { - string makeMarginValue(double d) { + string makeMarginValue(char const * side, double d) { ostringstream os; - os << d << "ex"; + os << "margin-" << side << ": " << d << "ex;\n"; return os.str(); } } @@ -1021,17 +1015,37 @@ void Layout::makeDefaultCSS() const { // main font htmldefaultstyle_ = font.asCSS(); - // top and bottom margins + // bottom margins string tmp; if (topsep > 0) - tmp += "margin-top: " + makeMarginValue(topsep) + ";\n"; + tmp += makeMarginValue("top", topsep); if (bottomsep > 0) - tmp += "margin-bottom: " + makeMarginValue(bottomsep) + ";\n"; + 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()) @@ -1039,15 +1053,21 @@ void Layout::makeDefaultCSS() const { from_ascii(htmltag() + "." + defaultCSSClass() + " {\n") + htmldefaultstyle_ + from_ascii("\n}\n"); - if (labelfont == font || htmllabeltag() == "NONE") + if (labeltype == LABEL_NO_LABEL || htmllabeltag() == "NONE") return; + docstring labelCSS; + // label font - docstring const labelfontCSS = labelfont.asCSS(); - if (!labelfontCSS.empty()) + 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"); }