X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLayout.cpp;h=a57a28e813a317f2aa0ca9a5d178124379ac7ab5;hb=ec3aed75ad965160a96547b7e36c924c5df7a91b;hp=b2d4d2e273edf688fafe62cacc2d6c77488cab9f;hpb=0940cd77d441938c8ea0849a213b869c8e5f9d74;p=lyx.git diff --git a/src/Layout.cpp b/src/Layout.cpp index b2d4d2e273..a57a28e813 100644 --- a/src/Layout.cpp +++ b/src/Layout.cpp @@ -13,6 +13,7 @@ #include #include "Layout.h" +#include "Encoding.h" #include "FontInfo.h" #include "Language.h" #include "Lexer.h" @@ -47,18 +48,11 @@ enum LayoutTags { LT_COPYSTYLE, LT_DEPENDSON, LT_OBSOLETEDBY, - //LT_EMPTY, LT_END, - //LT_ENVIRONMENT_DEFAULT, - //LT_FANCYHDR, - LT_FILL_BOTTOM, - LT_FILL_TOP, - //LT_FIRST_COUNTER, LT_FONT, LT_FREE_SPACING, LT_PASS_THRU, LT_PARBREAK_IS_NEWLINE, - //LT_HEADINGS, LT_ITEMSEP, LT_KEEPEMPTY, LT_LABEL_BOTTOMSEP, @@ -83,7 +77,6 @@ enum LayoutTags { LT_PARINDENT, LT_PARSEP, LT_PARSKIP, - //LT_PLAIN, LT_PREAMBLE, LT_LANGPREAMBLE, LT_BABELPREAMBLE, @@ -141,8 +134,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; @@ -173,8 +164,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 }, @@ -184,7 +173,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 }, @@ -234,6 +223,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) bool error = false; bool finished = false; lex.pushTable(layoutTags); + // parse style section while (!finished && lex.isOK() && !error) { int le = lex.lex(); @@ -242,7 +232,8 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) case Lexer::LEX_FEOF: continue; - case Lexer::LEX_UNDEF: // parse error + case Lexer::LEX_UNDEF: + // parse error lex.printError("Unknown layout tag `$$Token'"); error = true; continue; @@ -251,7 +242,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) break; } switch (static_cast(le)) { - case LT_END: // end of structure + case LT_END: finished = true; break; @@ -259,7 +250,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) lex >> category_; break; - case LT_COPYSTYLE: { // initialize with a known style + case LT_COPYSTYLE: { docstring style; lex >> style; style = subst(style, '_', ' '); @@ -280,7 +271,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) break; } - case LT_OBSOLETEDBY: { // replace with a known style + case LT_OBSOLETEDBY: { docstring style; lex >> style; style = subst(style, '_', ' '); @@ -307,11 +298,11 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) depends_on_ = subst(depends_on_, '_', ' '); break; - case LT_MARGIN: // margin style definition. + case LT_MARGIN: readMargin(lex); break; - case LT_LATEXTYPE: // LaTeX style definition. + case LT_LATEXTYPE: readLatexType(lex); break; @@ -356,7 +347,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) labelfont = lyxRead(lex, labelfont); break; - case LT_NEXTNOINDENT: // Indent next paragraph? + case LT_NEXTNOINDENT: lex >> nextnoindent; break; @@ -405,71 +396,64 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) readEndLabelType(lex); break; - case LT_LEFTMARGIN: // left margin type + case LT_LEFTMARGIN: lex >> leftmargin; break; - case LT_RIGHTMARGIN: // right margin type + case LT_RIGHTMARGIN: lex >> rightmargin; break; - case LT_LABELINDENT: // label indenting flag + case LT_LABELINDENT: lex >> labelindent; break; - case LT_PARINDENT: // paragraph indent. flag + case LT_PARINDENT: lex >> parindent; break; - case LT_PARSKIP: // paragraph skip size + case LT_PARSKIP: lex >> parskip; break; - case LT_ITEMSEP: // item separation size + case LT_ITEMSEP: lex >> itemsep; break; - case LT_TOPSEP: // top separation size + case LT_TOPSEP: lex >> topsep; break; - case LT_BOTTOMSEP: // bottom separation size + case LT_BOTTOMSEP: lex >> bottomsep; break; - case LT_LABEL_BOTTOMSEP: // label bottom separation size + case LT_LABEL_BOTTOMSEP: lex >> labelbottomsep; break; - case LT_LABELSEP: // label separator + case LT_LABELSEP: lex >> labelsep; labelsep = subst(labelsep, 'x', ' '); break; - case LT_PARSEP: // par. separation size + case LT_PARSEP: 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? + case LT_NEWLINE: lex >> newline_allowed; break; - case LT_ALIGN: // paragraph align + case LT_ALIGN: readAlign(lex); break; - case LT_ALIGNPOSSIBLE: // paragraph allowed align + + case LT_ALIGNPOSSIBLE: readAlignPossible(lex); break; - case LT_LABELSTRING: // label string definition + case LT_LABELSTRING: // FIXME: this means LT_ENDLABELSTRING may only // occur after LT_LABELSTRING lex >> labelstring_; @@ -477,26 +461,26 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) labelstring_appendix_ = labelstring_; break; - case LT_ENDLABELSTRING: // endlabel string definition + case LT_ENDLABELSTRING: lex >> endlabelstring_; endlabelstring_ = trim(endlabelstring_); break; - case LT_LABELSTRING_APPENDIX: // label string appendix definition + case LT_LABELSTRING_APPENDIX: lex >> labelstring_appendix_; labelstring_appendix_ = trim(labelstring_appendix_); break; - case LT_LABELCOUNTER: // name of counter to use + case LT_LABELCOUNTER: lex >> counter; counter = trim(counter); break; - case LT_FREE_SPACING: // Allow for free spacing. + case LT_FREE_SPACING: lex >> free_spacing; break; - case LT_PASS_THRU: // Allow for pass thru. + case LT_PASS_THRU: lex >> pass_thru; break; @@ -504,7 +488,7 @@ bool Layout::read(Lexer & lex, TextClass const & tclass) lex >> parbreak_is_newline; break; - case LT_SPACING: // setspace.sty + case LT_SPACING: readSpacing(lex); break; @@ -577,8 +561,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; } @@ -877,17 +861,27 @@ void Layout::readSpacing(Lexer & lex) namespace { -docstring const i18npreamble(Language const * lang, docstring const & templ) +docstring const i18npreamble(Language const * lang, Encoding const & enc, + 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() 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) @@ -895,14 +889,19 @@ 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; + 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.latexChar(name[i], true)[0] != name[i]) { + encodable = false; + break; + } } + 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 @@ -912,15 +911,17 @@ docstring const i18npreamble(Language const * lang, docstring const & templ) } -docstring const Layout::langpreamble(Language const * lang) const +docstring const Layout::langpreamble(Language const * lang, + Encoding const & enc, bool const polyglossia) const { - return i18npreamble(lang, langpreamble_); + return i18npreamble(lang, enc, langpreamble_, polyglossia); } -docstring const Layout::babelpreamble(Language const * lang) const +docstring const Layout::babelpreamble(Language const * lang, + Encoding const & enc, bool const polyglossia) const { - return i18npreamble(lang, babelpreamble_); + return i18npreamble(lang, enc, babelpreamble_, polyglossia); }