Fix some quote inset bugs:

* Adjoining closing Single + double quote becomes double + single quote
  (for English, Swedish and German, LaTeX export as ''').

* French double quotes are converted to << >> in the LaTeX file and to
  double inverted question/interrogation marks in the output, if the font
  encoding is set to [None] or OT1 but the global default is T1. (test
  for lyxrc.fontenc instead of the document-specific fontenc setting in
  InsetQuotes.cpp).

* Quote type ignored for LyXHTML: always "English" quotes used.

See #10451
This commit is contained in:
Juergen Spitzmueller 2016-12-07 15:37:03 +01:00
parent 8d247e2407
commit 6c4c164531
3 changed files with 32 additions and 15 deletions

View File

@ -87,6 +87,12 @@ char const * const latex_quote_babel[2][5] = {
{ "\\glqq ", "''", "``", "\\flqq{}", "\\frqq{}" } { "\\glqq ", "''", "``", "\\flqq{}", "\\frqq{}" }
}; };
char const * const html_quote[2][5] = {
{ "&sbquo;", "&rsquo;", "&lsquo;",
"&lsaquo;", "&rsaquo;" },
{ "&bdquo;", "&rdquo;", "&ldquo;", "&laquo;", "&raquo;" }
};
} // namespace anon } // namespace anon
@ -98,8 +104,15 @@ InsetQuotes::InsetQuotes(Buffer * buf, string const & str) : Inset(buf)
InsetQuotes::InsetQuotes(Buffer * buf, char_type c, QuoteTimes t) InsetQuotes::InsetQuotes(Buffer * buf, char_type c, QuoteTimes t)
: Inset(buf), times_(t) : Inset(buf), times_(t)
{ {
if (buf) if (buf) {
language_ = buf->params().quotes_language; language_ = buf->params().quotes_language;
fontenc_ = (buf->params().fontenc == "global")
? lyxrc.fontenc : buf->params().fontenc;
} else {
language_ = EnglishQuotes;
fontenc_ = lyxrc.fontenc;
}
setSide(c); setSide(c);
} }
@ -264,7 +277,7 @@ void InsetQuotes::latex(otexstream & os, OutputParams const & runparams) const
qstr = "\\og "; //the spaces are important here qstr = "\\og "; //the spaces are important here
else else
qstr = " \\fg{}"; //and here qstr = " \\fg{}"; //and here
} else if (lyxrc.fontenc == "T1" && !runparams.use_polyglossia) { } else if (fontenc_ == "T1" && !runparams.use_polyglossia) {
qstr = latex_quote_t1[times_][quoteind]; qstr = latex_quote_t1[times_][quoteind];
#ifdef DO_USE_DEFAULT_LANGUAGE #ifdef DO_USE_DEFAULT_LANGUAGE
} else if (doclang == "default") { } else if (doclang == "default") {
@ -277,12 +290,14 @@ void InsetQuotes::latex(otexstream & os, OutputParams const & runparams) const
qstr = latex_quote_babel[times_][quoteind]; qstr = latex_quote_babel[times_][quoteind];
} }
// Always guard against unfortunate ligatures (!` ?`) // Always guard against unfortunate ligatures (!` ?` `` '' ,, << >>)
if (prefixIs(qstr, "`")) {
char_type const lastchar = os.lastChar(); char_type const lastchar = os.lastChar();
if (prefixIs(qstr, "`")) {
if (lastchar == '!' || lastchar == '?') if (lastchar == '!' || lastchar == '?')
qstr.insert(0, "{}"); qstr.insert(0, "{}");
} }
if (qstr[1] == lastchar)
qstr.insert(0, "{}");
os << from_ascii(qstr); os << from_ascii(qstr);
} }
@ -298,16 +313,8 @@ int InsetQuotes::plaintext(odocstringstream & os,
docstring InsetQuotes::getQuoteEntity() const { docstring InsetQuotes::getQuoteEntity() const {
if (times_ == DoubleQuotes) { const int quoteind = quote_index[side_][language_];
if (side_ == LeftQuote) return from_ascii(html_quote[times_][quoteind]);
return from_ascii("&ldquo;");
else
return from_ascii("&rdquo;");
}
if (side_ == LeftQuote)
return from_ascii("&lsquo;");
else
return from_ascii("&rsquo;");
} }
@ -346,7 +353,7 @@ void InsetQuotes::validate(LaTeXFeatures & features) const
#else #else
if (!features.useBabel() if (!features.useBabel()
#endif #endif
&& lyxrc.fontenc != "T1") { && fontenc_ != "T1") {
if (times_ == SingleQuotes) if (times_ == SingleQuotes)
switch (type) { switch (type) {
case ',': features.require("quotesinglbase"); break; case ',': features.require("quotesinglbase"); break;

View File

@ -116,6 +116,8 @@ private:
QuoteSide side_; QuoteSide side_;
/// ///
QuoteTimes times_; QuoteTimes times_;
///
std::string fontenc_;
}; };
} // namespace lyx } // namespace lyx

View File

@ -100,6 +100,14 @@ What's new
- Correct encoding for Baltic languages like Lithuanian (bug 10474). - Correct encoding for Baltic languages like Lithuanian (bug 10474).
- Fix some quote inset bugs (bug 10451):
# Adjoining closing Single + double quote becomes double + single quote
(for English, Swedish and German).
# French double quotes are converted to << >> in the LaTeX file and to double
inverted question/interrogation marks in the output, if the font encoding is
set to [None] or OT1 but the global default is T1.
# Quote type ignored for LyXHTML: always "English" quotes used.
* LYX2LYX * LYX2LYX