mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-22 01:59:02 +00:00
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
This commit is contained in:
parent
93893396e4
commit
74a1666531
@ -246,3 +246,9 @@ End
|
|||||||
# Pure 7bit ASCII encoding (partially hardcoded in LyX)
|
# Pure 7bit ASCII encoding (partially hardcoded in LyX)
|
||||||
Encoding ascii ascii "ASCII" ascii fixed none
|
Encoding ascii ascii "ASCII" ascii fixed none
|
||||||
End
|
End
|
||||||
|
|
||||||
|
# Semantic encodings
|
||||||
|
|
||||||
|
# Inherit encoding of the context (used by verbatim)
|
||||||
|
Encoding inherit inherit "" "" fixed none
|
||||||
|
End
|
||||||
|
@ -65,6 +65,8 @@
|
|||||||
# * Encoding is the default encoding used with TeX fonts.
|
# * Encoding is the default encoding used with TeX fonts.
|
||||||
# It is only used if Document > Settings > Language > Encoding
|
# It is only used if Document > Settings > Language > Encoding
|
||||||
# is set to "Language Default" and "use non-TeX fonts" is FALSE.
|
# 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
|
# * InternalEncoding is used to tell LyX that babel internally sets a
|
||||||
# non-standard font encoding (such as hebrew to LHE or greek to LGR).
|
# 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
|
# If True, LyX cares for characters/macros that do not exist in
|
||||||
@ -100,13 +102,13 @@ Language ignore
|
|||||||
GuiName "Ignore"
|
GuiName "Ignore"
|
||||||
BabelName ignore
|
BabelName ignore
|
||||||
PolyglossiaName ignore
|
PolyglossiaName ignore
|
||||||
Encoding iso8859-1
|
Encoding inherit
|
||||||
LangCode ignore
|
LangCode ignore
|
||||||
End
|
End
|
||||||
|
|
||||||
Language latex
|
Language latex
|
||||||
GuiName "LaTeX"
|
GuiName "LaTeX"
|
||||||
Encoding iso8859-1
|
Encoding inherit
|
||||||
LangCode latex
|
LangCode latex
|
||||||
End
|
End
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@
|
|||||||
#include "Cursor.h"
|
#include "Cursor.h"
|
||||||
#include "CutAndPaste.h"
|
#include "CutAndPaste.h"
|
||||||
#include "DispatchResult.h"
|
#include "DispatchResult.h"
|
||||||
#include "Encoding.h"
|
|
||||||
#include "Font.h"
|
#include "Font.h"
|
||||||
#include "FuncCode.h"
|
#include "FuncCode.h"
|
||||||
#include "FuncRequest.h"
|
#include "FuncRequest.h"
|
||||||
@ -2138,22 +2137,6 @@ docstring Cursor::getPossibleLabel() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Encoding const * Cursor::getEncoding() const
|
|
||||||
{
|
|
||||||
if (empty())
|
|
||||||
return 0;
|
|
||||||
BufferParams const & bp = bv().buffer().params();
|
|
||||||
if (bp.useNonTeXFonts)
|
|
||||||
return encodings.fromLyXName("utf8-plain");
|
|
||||||
|
|
||||||
CursorSlice const & sl = innerTextSlice();
|
|
||||||
Text const & text = *sl.text();
|
|
||||||
Font font = text.getPar(sl.pit()).getFont(bp, sl.pos(),
|
|
||||||
text.outerFont(sl.pit()));
|
|
||||||
return font.language()->encoding();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Cursor::undispatched() const
|
void Cursor::undispatched() const
|
||||||
{
|
{
|
||||||
disp_.dispatched(false);
|
disp_.dispatched(false);
|
||||||
|
@ -72,7 +72,6 @@ class Row;
|
|||||||
|
|
||||||
// these should go
|
// these should go
|
||||||
class InsetMathUnknown;
|
class InsetMathUnknown;
|
||||||
class Encoding;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class describes the position of a cursor within a document,
|
* This class describes the position of a cursor within a document,
|
||||||
@ -546,8 +545,6 @@ public:
|
|||||||
int macroNamePos();
|
int macroNamePos();
|
||||||
/// can we enter the inset?
|
/// can we enter the inset?
|
||||||
bool openable(MathAtom const &) const;
|
bool openable(MathAtom const &) const;
|
||||||
///
|
|
||||||
Encoding const * getEncoding() const;
|
|
||||||
/// font at cursor position
|
/// font at cursor position
|
||||||
Font getFont() const;
|
Font getFont() const;
|
||||||
};
|
};
|
||||||
|
@ -15,7 +15,11 @@
|
|||||||
#include "DocIterator.h"
|
#include "DocIterator.h"
|
||||||
|
|
||||||
#include "Buffer.h"
|
#include "Buffer.h"
|
||||||
|
#include "BufferParams.h"
|
||||||
|
#include "Encoding.h"
|
||||||
|
#include "Font.h"
|
||||||
#include "InsetList.h"
|
#include "InsetList.h"
|
||||||
|
#include "Language.h"
|
||||||
#include "Paragraph.h"
|
#include "Paragraph.h"
|
||||||
#include "LyXRC.h"
|
#include "LyXRC.h"
|
||||||
#include "Text.h"
|
#include "Text.h"
|
||||||
@ -688,6 +692,33 @@ void DocIterator::append(DocIterator::idx_type idx, pos_type pos)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Encoding const * DocIterator::getEncoding() const
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
return 0;
|
||||||
|
BufferParams const & bp = buffer()->params();
|
||||||
|
if (bp.useNonTeXFonts)
|
||||||
|
return encodings.fromLyXName("utf8-plain");
|
||||||
|
|
||||||
|
CursorSlice const & sl = innerTextSlice();
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ostream & operator<<(ostream & os, DocIterator const & dit)
|
ostream & operator<<(ostream & os, DocIterator const & dit)
|
||||||
{
|
{
|
||||||
for (size_t i = 0, n = dit.depth(); i != n; ++i)
|
for (size_t i = 0, n = dit.depth(); i != n; ++i)
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
namespace lyx {
|
namespace lyx {
|
||||||
|
|
||||||
class DocIterator;
|
class DocIterator;
|
||||||
|
class Encoding;
|
||||||
class LyXErr;
|
class LyXErr;
|
||||||
class MathAtom;
|
class MathAtom;
|
||||||
class Paragraph;
|
class Paragraph;
|
||||||
@ -257,6 +258,9 @@ public:
|
|||||||
/// push one CursorSlice on top and set its index and position
|
/// push one CursorSlice on top and set its index and position
|
||||||
void append(idx_type idx, pos_type pos);
|
void append(idx_type idx, pos_type pos);
|
||||||
|
|
||||||
|
///
|
||||||
|
Encoding const * getEncoding() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class InsetIterator;
|
friend class InsetIterator;
|
||||||
friend DocIterator doc_iterator_begin(Buffer const * buf, Inset const * inset);
|
friend DocIterator doc_iterator_begin(Buffer const * buf, Inset const * inset);
|
||||||
|
13
src/Text.cpp
13
src/Text.cpp
@ -933,15 +933,12 @@ bool canInsertChar(Cursor const & cur, char_type c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Prevent to insert uncodable characters in verbatim and ERT
|
// Prevent to insert uncodable characters in verbatim and ERT.
|
||||||
// (workaround for bug 9012)
|
// The encoding is inherited from the context here.
|
||||||
// Don't do it for listings inset, since InsetListings::latex() tries
|
if (par.isPassThru() && cur.getEncoding()) {
|
||||||
// to switch to a usable encoding which works in many cases (bug 9102).
|
Encoding const * e = cur.getEncoding();
|
||||||
if (par.isPassThru() && cur.inset().lyxCode() != LISTINGS_CODE &&
|
|
||||||
cur.current_font.language()) {
|
|
||||||
Encoding const * e = cur.current_font.language()->encoding();
|
|
||||||
if (!e->encodable(c)) {
|
if (!e->encodable(c)) {
|
||||||
cur.message(_("Character is uncodable in verbatim paragraphs."));
|
cur.message(_("Character is uncodable in this verbatim context."));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1076,11 +1076,10 @@ GuiDocument::GuiDocument(GuiView & lv)
|
|||||||
// Always put the default encoding in the first position.
|
// Always put the default encoding in the first position.
|
||||||
langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
|
langModule->encodingCO->addItem(qt_("Language Default (no inputenc)"));
|
||||||
QStringList encodinglist;
|
QStringList encodinglist;
|
||||||
Encodings::const_iterator it = encodings.begin();
|
for (auto const & encvar : encodings) {
|
||||||
Encodings::const_iterator const end = encodings.end();
|
if (!encvar.unsafe() && !encvar.guiName().empty())
|
||||||
for (; it != end; ++it)
|
encodinglist.append(qt_(encvar.guiName()));
|
||||||
if (!it->unsafe())
|
}
|
||||||
encodinglist.append(qt_(it->guiName()));
|
|
||||||
encodinglist.sort();
|
encodinglist.sort();
|
||||||
langModule->encodingCO->addItems(encodinglist);
|
langModule->encodingCO->addItems(encodinglist);
|
||||||
|
|
||||||
|
@ -1488,7 +1488,7 @@ pair<bool, int> switchEncoding(odocstream & os, BufferParams const & bparams,
|
|||||||
// * with useNonTeXFonts: "utf8plain",
|
// * with useNonTeXFonts: "utf8plain",
|
||||||
// * with XeTeX and TeX fonts: "ascii" (inputenc fails),
|
// * with XeTeX and TeX fonts: "ascii" (inputenc fails),
|
||||||
// * with LuaTeX and TeX fonts: only one encoding accepted by luainputenc.
|
// * 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);
|
return make_pair(false, 0);
|
||||||
|
|
||||||
Encoding const & oldEnc = *runparams.encoding;
|
Encoding const & oldEnc = *runparams.encoding;
|
||||||
|
Loading…
Reference in New Issue
Block a user