]> git.lyx.org Git - lyx.git/blobdiff - src/Layout.cpp
listerrors.lyx : Update a link.
[lyx.git] / src / Layout.cpp
index b2d4d2e273edf688fafe62cacc2d6c77488cab9f..80393cb982fa447838f25c630ad46122f6a51555 100644 (file)
@@ -13,6 +13,7 @@
 #include <config.h>
 
 #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<LayoutTags>(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,11 @@ 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));
+               if (langenc != bufenc)
+                       translated = "\\inputencoding{" + texenc + "}"
+                               + s1 + langenc + s2 + translated
+                               + s1 + bufenc + s2;
                preamble = subst(preamble, sub.str(), translated);
        }
 #endif
@@ -912,15 +903,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);
 }