commit 8c14d9e0413978aa11f581e9c6f2d0587bb0b189
Author: Enrico Forestieri <for...@lyx.org>
Date:   Sun Sep 25 08:20:34 2016 +0200

    Correctly track opened polyglossia languages
    
    A language switch may also occur outside of output_latex.cpp, apparently.
---
 src/Font.cpp         |    3 +++
 src/OutputParams.cpp |    3 ++-
 src/OutputParams.h   |   10 ++++++++++
 src/Paragraph.cpp    |    2 ++
 src/output_latex.cpp |   25 +++++++++++++++++++++++++
 src/output_latex.h   |    8 ++++++++
 6 files changed, 50 insertions(+), 1 deletions(-)

diff --git a/src/Font.cpp b/src/Font.cpp
index 0ca4080..f6eb6b9 100644
--- a/src/Font.cpp
+++ b/src/Font.cpp
@@ -287,6 +287,7 @@ int Font::latexWriteStartChanges(odocstream & os, 
BufferParams const & bparams,
                        tmp += "{";
                        os << from_ascii(tmp);
                        count += tmp.length();
+                       
runparams.pushPolyglossiaLang(language()->polyglossia());
                } else if (language()->encoding()->package() != Encoding::CJK) {
                        os << '{';
                        count += 1;
@@ -545,6 +546,8 @@ int Font::latexWriteEndChanges(otexstream & os, 
BufferParams const & bparams,
            && language()->encoding()->package() != Encoding::CJK) {
                os << '}';
                ++count;
+               if (runparams.use_polyglossia)
+                       runparams.popPolyglossiaLang();
        }
 
        return count;
diff --git a/src/OutputParams.cpp b/src/OutputParams.cpp
index 20c3a65..2b4c9d9 100644
--- a/src/OutputParams.cpp
+++ b/src/OutputParams.cpp
@@ -21,7 +21,8 @@ namespace lyx {
 OutputParams::OutputParams(Encoding const * enc)
        : flavor(LATEX), math_flavor(NotApplicable), nice(false), 
is_child(false),
          moving_arg(false), intitle(false), inulemcmd(0), local_font(0), 
master_language(0),
-         encoding(enc), free_spacing(false), use_babel(false), 
use_polyglossia(false),
+         encoding(enc), pushPolyglossiaLang(0), popPolyglossiaLang(0),
+         free_spacing(false), use_babel(false), use_polyglossia(false),
          use_indices(false), use_japanese(false), linelen(0), depth(0),
          exportdata(new ExportData),
          inComment(false), inTableCell(NO), inFloat(NONFLOAT),
diff --git a/src/OutputParams.h b/src/OutputParams.h
index 3914617..4927085 100644
--- a/src/OutputParams.h
+++ b/src/OutputParams.h
@@ -141,6 +141,16 @@ public:
         */
        mutable Encoding const * encoding;
 
+       /** Pointer to a function for registering a language switch
+           when using polyglossia.
+       */
+       mutable void (* pushPolyglossiaLang)(std::string const & lang_name);
+
+       /** Pointer to a function for unregistering  the last language
+           switch when using polyglossia.
+       */
+       mutable void (* popPolyglossiaLang)();
+
        /** free_spacing == true means that the inset is in a free-spacing
            paragraph.
        */
diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp
index 94cf931..fd0f7fa 100644
--- a/src/Paragraph.cpp
+++ b/src/Paragraph.cpp
@@ -2441,6 +2441,8 @@ void Paragraph::latex(BufferParams const & bparams,
                                                        running_lang);
                                os << from_ascii(end_tag);
                                column += end_tag.length();
+                               if (runparams.use_polyglossia)
+                                       runparams.popPolyglossiaLang();
                }
 
                // Switch file encoding if necessary (and allowed)
diff --git a/src/output_latex.cpp b/src/output_latex.cpp
index b584626..0875fbf 100644
--- a/src/output_latex.cpp
+++ b/src/output_latex.cpp
@@ -478,6 +478,24 @@ void getArgInsets(otexstream & os, OutputParams const & 
runparams, Layout::LaTeX
 } // namespace anon
 
 
+void pushPolyglossiaLang(string const & lang_name)
+{
+       OutputState * state = getOutputState();
+
+       state->lang_switch_depth_.push(state->nest_level_);
+       state->open_polyglossia_lang_.push(lang_name);
+}
+
+
+void popPolyglossiaLang()
+{
+       OutputState * state = getOutputState();
+
+       state->lang_switch_depth_.pop();
+       state->open_polyglossia_lang_.pop();
+}
+
+
 void latexArgInsets(Paragraph const & par, otexstream & os,
        OutputParams const & runparams, Layout::LaTeXArgMap const & latexargs, 
string const & prefix)
 {
@@ -1265,8 +1283,15 @@ void latexParagraphs(Buffer const & buf,
                          : subst(lang_begin_command, "$$lang", mainlang);
                os << bc;
                os << '\n';
+               if (runparams.use_polyglossia) {
+                       state->lang_switch_depth_.push(state->nest_level_);
+                       state->open_polyglossia_lang_.push(mainlang);
+               }
        }
 
+       runparams.pushPolyglossiaLang = pushPolyglossiaLang;
+       runparams.popPolyglossiaLang = popPolyglossiaLang;
+
        ParagraphList const & paragraphs = text.paragraphs();
 
        if (runparams.par_begin == runparams.par_end) {
diff --git a/src/output_latex.h b/src/output_latex.h
index 8bfeb6a..71af322 100644
--- a/src/output_latex.h
+++ b/src/output_latex.h
@@ -29,6 +29,14 @@ class Paragraph;
 class OutputParams;
 class Text;
 
+/** Register a language switch when using polyglossia.
+ */
+void pushPolyglossiaLang(std::string const & lang);
+
+/** Unregister the last language switch when using polyglossia.
+ */
+void popPolyglossiaLang();
+
 /** Export optional and required arguments of the paragraph \p par.
     Non-existing required arguments are output empty: {}.
  */

Reply via email to