Author: forenr
Date: Sun Oct  9 16:45:51 2011
New Revision: 39823
URL: http://www.lyx.org/trac/changeset/39823

Log:
Refine fix for bug #7800. Also allow setting the document encoding to
an encoding different from the automatically chosen one.

Modified:
   lyx-devel/trunk/src/LaTeXFeatures.cpp
   lyx-devel/trunk/src/Layout.cpp
   lyx-devel/trunk/src/Layout.h

Modified: lyx-devel/trunk/src/LaTeXFeatures.cpp
==============================================================================
--- lyx-devel/trunk/src/LaTeXFeatures.cpp       Sun Oct  9 06:43:38 2011        
(r39822)
+++ lyx-devel/trunk/src/LaTeXFeatures.cpp       Sun Oct  9 16:45:51 2011        
(r39823)
@@ -1164,18 +1164,18 @@
 namespace {
 docstring const getFloatI18nPreamble(docstring const & type,
                        docstring const & name, Language const * lang,
-                       Language const * buflang, bool const polyglossia)
+                       Encoding const & enc, bool const polyglossia)
 {
        docstring const language = polyglossia ? from_ascii(lang->polyglossia())
                                               : from_ascii(lang->babel());
-       docstring const enc = from_ascii(lang->encoding()->iconvName());
+       docstring const langenc = from_ascii(lang->encoding()->iconvName());
        docstring const texenc = from_ascii(lang->encoding()->latexName());
-       docstring const bufenc = from_ascii(buflang->encoding()->iconvName());
-       docstring const translated = (enc == bufenc) ? name
+       docstring const bufenc = from_ascii(enc.iconvName());
+       docstring const s1 = docstring(1, 0xF0000);
+       docstring const s2 = docstring(1, 0xF0001);
+       docstring const translated = (langenc == bufenc) ? name
                : from_ascii("\\inputencoding{") + texenc + from_ascii("}")
-                       + docstring(1, 0xF0000) + enc + docstring(1, 0xF0001)
-                       + translated
-                       + docstring(1, 0xF0000) + bufenc + docstring(1, 
0xF0001);
+                       + s1 + langenc + s2 + translated + s1 + bufenc + s2;
 
        odocstringstream os;
        os << "\\addto\\captions" << language
@@ -1199,18 +1199,19 @@
        for (; cit != end; ++cit) {
                // language dependent commands (once per document)
                snippets.insert(tclass[*cit].langpreamble(buffer().language(),
-                                                         use_polyglossia));
+                                               buffer().params().encoding(),
+                                               use_polyglossia));
                // commands for language changing (for multilanguage documents)
                if ((use_babel || use_polyglossia) && !UsedLanguages_.empty()) {
                        snippets.insert(tclass[*cit].babelpreamble(
-                                                       buffer().language(),
-                                                       buffer().language(),
-                                                       use_polyglossia));
+                                               buffer().language(),
+                                               buffer().params().encoding(),
+                                               use_polyglossia));
                        for (lang_it lit = lbeg; lit != lend; ++lit)
                                snippets.insert(tclass[*cit].babelpreamble(
-                                                       *lit,
-                                                       buffer().language(),
-                                                       use_polyglossia));
+                                               *lit,
+                                               buffer().params().encoding(),
+                                               use_polyglossia));
                }
        }
        if ((use_babel || use_polyglossia) && !UsedLanguages_.empty()) {
@@ -1229,8 +1230,9 @@
                        // (that differs from the source)
                        if (flname != name)
                                snippets.insert(getFloatI18nPreamble(
-                                       type, name, buffer().language(),
-                                       buffer().language(), use_polyglossia));
+                                               type, name, buffer().language(),
+                                               buffer().params().encoding(),
+                                               use_polyglossia));
                        for (lang_it lit = lbeg; lit != lend; ++lit) {
                                string const code = (*lit)->code();
                                name = (*lit)->translateLayout(fl.name());
@@ -1243,9 +1245,9 @@
                                        (flname != name || contains(code, 
"en"));
                                if (have_translation)
                                        snippets.insert(getFloatI18nPreamble(
-                                                       type, name, *lit,
-                                                       buffer().language(),
-                                                       use_polyglossia));
+                                               type, name, *lit,
+                                               buffer().params().encoding(),
+                                               use_polyglossia));
                        }
                }
        }

Modified: lyx-devel/trunk/src/Layout.cpp
==============================================================================
--- lyx-devel/trunk/src/Layout.cpp      Sun Oct  9 06:43:38 2011        (r39822)
+++ lyx-devel/trunk/src/Layout.cpp      Sun Oct  9 16:45:51 2011        (r39823)
@@ -861,7 +861,7 @@
 
 namespace {
 
-docstring const i18npreamble(Language const * lang, Language const * buflang,
+docstring const i18npreamble(Language const * lang, Encoding const & enc,
                             docstring const & templ, bool const polyglossia)
 {
        if (templ.empty())
@@ -875,9 +875,9 @@
        // tex2lyx does not have getMessages()
        LASSERT(false, /**/);
 #else
-       string const enc = lang->encoding()->iconvName();
+       string const langenc = lang->encoding()->iconvName();
        string const texenc = lang->encoding()->latexName();
-       string const bufenc = buflang->encoding()->iconvName();
+       string const bufenc = enc.iconvName();
        // First and second character of plane 15 (Private Use Area)
        char const s1[5] = {0xf3, 0xb0, 0x80, 0x80, 0x00}; // U+F0000
        char const s2[5] = {0xf3, 0xb0, 0x80, 0x81, 0x00}; // U+F0001
@@ -889,9 +889,9 @@
        while (regex_search(preamble, sub, reg)) {
                string const key = sub.str(1);
                string translated = to_utf8(lang->translateLayout(key));
-               if (enc != bufenc)
+               if (langenc != bufenc)
                        translated = "\\inputencoding{" + texenc + "}"
-                               + string(s1) + enc + string(s2) + translated
+                               + string(s1) + langenc + string(s2) + translated
                                + string(s1) + bufenc + string(s2);
                preamble = subst(preamble, sub.str(), translated);
        }
@@ -902,16 +902,17 @@
 }
 
 
-docstring const Layout::langpreamble(Language const * lang, bool const 
polyglossia) const
+docstring const Layout::langpreamble(Language const * lang,
+                       Encoding const & enc, bool const polyglossia) const
 {
-       return i18npreamble(lang, lang, langpreamble_, polyglossia);
+       return i18npreamble(lang, enc, langpreamble_, polyglossia);
 }
 
 
 docstring const Layout::babelpreamble(Language const * lang,
-                       Language const * buflang, bool const polyglossia) const
+                       Encoding const & enc, bool const polyglossia) const
 {
-       return i18npreamble(lang, buflang, babelpreamble_, polyglossia);
+       return i18npreamble(lang, enc, babelpreamble_, polyglossia);
 }
 
 

Modified: lyx-devel/trunk/src/Layout.h
==============================================================================
--- lyx-devel/trunk/src/Layout.h        Sun Oct  9 06:43:38 2011        (r39822)
+++ lyx-devel/trunk/src/Layout.h        Sun Oct  9 16:45:51 2011        (r39823)
@@ -14,6 +14,7 @@
 #ifndef LAYOUT_H
 #define LAYOUT_H
 
+#include "Encoding.h"
 #include "FontInfo.h"
 #include "LayoutEnums.h"
 #include "Spacing.h"
@@ -95,10 +96,10 @@
        docstring const & preamble() const { return preamble_; }
        /// Get language dependent macro definitions needed for this layout
        /// for language \p lang
-       docstring const langpreamble(Language const * lang, bool const 
polyglossia) const;
+       docstring const langpreamble(Language const * lang, Encoding const & 
enc, bool const polyglossia) const;
        /// Get language and babel dependent macro definitions needed for
        /// this layout for language \p lang
-       docstring const babelpreamble(Language const * lang, Language const * 
buflang, bool const polyglossia) const;
+       docstring const babelpreamble(Language const * lang, Encoding const & 
enc, bool const polyglossia) const;
        ///
        std::set<std::string> const & requires() const { return requires_; }
        ///

Reply via email to