From: Juergen Spitzmueller Date: Sun, 24 Dec 2017 16:10:42 +0000 (+0100) Subject: Introduce "inherit" encoding for latex_language X-Git-Tag: lyx-2.4.0dev-acb2ca7b~4138 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;ds=sidebyside;h=931f87f5089dfaa4ad3f4858d5bb8e51cbdbb2b1;p=features.git Introduce "inherit" encoding for latex_language This gets rid of the hardcoded latin1 encoding for verbatim. Instead, verbatim now inherits the encoding from the context, which is what is actually wanted here. Fixes: #9012, #9258 --- diff --git a/lib/encodings b/lib/encodings index 924c996b96..c43f638028 100644 --- a/lib/encodings +++ b/lib/encodings @@ -246,3 +246,9 @@ End # Pure 7bit ASCII encoding (partially hardcoded in LyX) Encoding ascii ascii "ASCII" ascii fixed none End + +# Semantic encodings + +# Inherit encoding of the context (used by verbatim) +Encoding inherit inherit "" "" fixed none +End diff --git a/lib/languages b/lib/languages index 282d902c78..4c3b49b2ac 100644 --- a/lib/languages +++ b/lib/languages @@ -65,6 +65,8 @@ # * Encoding is the default encoding used with TeX fonts. # It is only used if Document > Settings > Language > Encoding # is set to "Language Default" and "use non-TeX fonts" is FALSE. +# Encoding "inherit" means: keep encoding of the context (used by +# latex_language). # * InternalEncoding is used to tell LyX that babel internally sets a # non-standard font encoding (such as hebrew to LHE or greek to LGR). # If True, LyX cares for characters/macros that do not exist in @@ -100,13 +102,13 @@ Language ignore GuiName "Ignore" BabelName ignore PolyglossiaName ignore - Encoding iso8859-1 + Encoding inherit LangCode ignore End Language latex GuiName "LaTeX" - Encoding iso8859-1 + Encoding inherit LangCode latex End diff --git a/src/DocIterator.cpp b/src/DocIterator.cpp index 58b91dff36..8f4021404c 100644 --- a/src/DocIterator.cpp +++ b/src/DocIterator.cpp @@ -721,6 +721,17 @@ Encoding const * DocIterator::getEncoding() const Text const & text = *sl.text(); Font font = text.getPar(sl.pit()).getFont(bp, sl.pos(), text.outerFont(sl.pit())); + Encoding const * enc = font.language()->encoding(); + if (enc->name() == "inherit") { + size_t const n = depth(); + for (size_t i = 0; i < n; ++i) { + Text const & otext = *slices_[i].text(); + Font ofont = otext.getPar(slices_[i].pit()).getFont(bp, slices_[i].pos(), + otext.outerFont(slices_[i].pit())); + if (ofont.language()->encoding()->name() != "inherit") + return ofont.language()->encoding(); + } + } return font.language()->encoding(); } diff --git a/src/Text.cpp b/src/Text.cpp index 84f7857678..001aca5ded 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -933,15 +933,12 @@ bool canInsertChar(Cursor const & cur, char_type c) } } - // Prevent to insert uncodable characters in verbatim and ERT - // (workaround for bug 9012) - // Don't do it for listings inset, since InsetListings::latex() tries - // to switch to a usable encoding which works in many cases (bug 9102). - if (par.isPassThru() && cur.inset().lyxCode() != LISTINGS_CODE && - cur.current_font.language()) { - Encoding const * e = cur.current_font.language()->encoding(); + // Prevent to insert uncodable characters in verbatim and ERT. + // The encoding is inherited from the context here. + if (par.isPassThru() && cur.getEncoding()) { + Encoding const * e = cur.getEncoding(); if (!e->encodable(c)) { - cur.message(_("Character is uncodable in verbatim paragraphs.")); + cur.message(_("Character is uncodable in this verbatim context.")); return false; } } diff --git a/src/frontends/qt4/GuiDocument.cpp b/src/frontends/qt4/GuiDocument.cpp index e6217f5cb3..36f9fa4c06 100644 --- a/src/frontends/qt4/GuiDocument.cpp +++ b/src/frontends/qt4/GuiDocument.cpp @@ -1079,7 +1079,7 @@ GuiDocument::GuiDocument(GuiView & lv) Encodings::const_iterator it = encodings.begin(); Encodings::const_iterator const end = encodings.end(); for (auto const & encvar : encodings) { - if (!encvar.unsafe()) + if (!encvar.unsafe() && !encvar.guiName().empty()) encodinglist.append(qt_(encvar.guiName())); } encodinglist.sort(); diff --git a/src/output_latex.cpp b/src/output_latex.cpp index 5bb21cc2ac..5cac0ad89f 100644 --- a/src/output_latex.cpp +++ b/src/output_latex.cpp @@ -1530,7 +1530,7 @@ pair switchEncoding(odocstream & os, BufferParams const & bparams, // * with useNonTeXFonts: "utf8plain", // * with XeTeX and TeX fonts: "ascii" (inputenc fails), // * with LuaTeX and TeX fonts: only one encoding accepted by luainputenc. - if (runparams.isFullUnicode()) + if (runparams.isFullUnicode() || newEnc.name() == "inherit") return make_pair(false, 0); Encoding const & oldEnc = *runparams.encoding;