X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetQuotes.cpp;h=1295f27f0753e0949fa11144ea9f9ddc4f193345;hb=9c4929ca406091267dafa40f5e083a27db046bf6;hp=d27b12541401922431c320baeeae75fb2a246fc1;hpb=b83564d82cbf5ffab48715293df03b6b6284c1b5;p=lyx.git diff --git a/src/insets/InsetQuotes.cpp b/src/insets/InsetQuotes.cpp index d27b125414..1295f27f07 100644 --- a/src/insets/InsetQuotes.cpp +++ b/src/insets/InsetQuotes.cpp @@ -16,12 +16,14 @@ #include "BufferParams.h" #include "BufferView.h" #include "Dimension.h" +#include "Font.h" #include "Language.h" #include "LaTeXFeatures.h" #include "Lexer.h" #include "LyXRC.h" #include "MetricsInfo.h" #include "OutputParams.h" +#include "output_xhtml.h" #include "frontends/FontMetrics.h" #include "frontends/Painter.h" @@ -40,7 +42,7 @@ namespace { /* codes used to read/write quotes to LyX files * e ``english'' - * s ''spanish'' + * s ''swedish'' * g ,,german`` * p ,,polish'' * f <> @@ -88,29 +90,31 @@ char const * const latex_quote_babel[2][5] = { } // namespace anon -InsetQuotes::InsetQuotes(Buffer const & buf, string const & str) +InsetQuotes::InsetQuotes(Buffer * buf, string const & str) : Inset(buf) { parseString(str); - setBuffer(const_cast(buf)); } -InsetQuotes::InsetQuotes(Buffer const & buf, char_type c) - : language_(buf.params().quotes_language), times_(buf.params().quotes_times) +InsetQuotes::InsetQuotes(Buffer * buf, char_type c) : Inset(buf) { + if (buf) { + language_ = buf->params().quotes_language; + times_ = buf->params().quotes_times; + } setSide(c); - setBuffer(const_cast(buf)); } -InsetQuotes::InsetQuotes(Buffer const & buf, char_type c, QuoteTimes t) - : language_(buf.params().quotes_language), times_(t) +InsetQuotes::InsetQuotes(Buffer * buf, char_type c, QuoteTimes t) + : Inset(buf), times_(t) { + if (buf) + language_ = buf->params().quotes_language; setSide(c); - setBuffer(const_cast(buf)); } -docstring InsetQuotes::name() const +docstring InsetQuotes::layoutName() const { return from_ascii("Quotes"); } @@ -182,12 +186,14 @@ void InsetQuotes::parseString(string const & s) docstring InsetQuotes::displayString() const { - Language const * loclang = buffer().params().language; + Language const * loclang = + isBufferValid() ? buffer().params().language : 0; int const index = quote_index[side_][language_]; docstring retdisp = docstring(1, display_quote_char[times_][index]); // in french, spaces are added inside double quotes - if (times_ == DoubleQuotes && prefixIs(loclang->code(), "fr")) { + // FIXME: this should be done by a separate quote type. + if (times_ == DoubleQuotes && loclang && prefixIs(loclang->code(), "fr")) { if (side_ == LeftQuote) retdisp += ' '; else @@ -224,14 +230,15 @@ void InsetQuotes::draw(PainterInfo & pi, int x, int y) const { // FIXME: should we add a language or a font parameter member? docstring const text = displayString(); - + FontInfo font = pi.base.font; + font.setPaintColor(pi.textColor(font.realColor())); if (text.length() == 2 && text[0] == text[1]) { - pi.pain.text(x, y, text[0], pi.base.font); - int const t = theFontMetrics(pi.base.font) + pi.pain.text(x, y, text[0], font); + int const t = theFontMetrics(font) .width(','); - pi.pain.text(x + t, y, text[0], pi.base.font); + pi.pain.text(x + t, y, text[0], font); } else { - pi.pain.text(x, y, text, pi.base.font); + pi.pain.text(x, y, text, font); } } @@ -255,35 +262,39 @@ void InsetQuotes::read(Lexer & lex) } -int InsetQuotes::latex(odocstream & os, OutputParams const & runparams) const +void InsetQuotes::latex(otexstream & os, OutputParams const & runparams) const { const int quoteind = quote_index[side_][language_]; string qstr; if (language_ == FrenchQuotes && times_ == DoubleQuotes - && prefixIs(runparams.local_font->language()->code(), "fr")) { + && prefixIs(runparams.local_font->language()->code(), "fr") + && !runparams.use_polyglossia) { if (side_ == LeftQuote) qstr = "\\og "; //the spaces are important here else qstr = " \\fg{}"; //and here - } else if (lyxrc.fontenc == "T1") { + } else if (lyxrc.fontenc == "T1" && !runparams.use_polyglossia) { qstr = latex_quote_t1[times_][quoteind]; #ifdef DO_USE_DEFAULT_LANGUAGE } else if (doclang == "default") { #else } else if (!runparams.use_babel) { #endif + // these are also used by polyglossia qstr = latex_quote_ot1[times_][quoteind]; } else { qstr = latex_quote_babel[times_][quoteind]; } // Always guard against unfortunate ligatures (!` ?`) - if (prefixIs(qstr, "`")) - qstr.insert(0, "{}"); + if (prefixIs(qstr, "`")) { + char_type const lastchar = os.lastChar(); + if (lastchar == '!' || lastchar == '?') + qstr.insert(0, "{}"); + } os << from_ascii(qstr); - return 0; } @@ -312,12 +323,25 @@ int InsetQuotes::docbook(odocstream & os, OutputParams const &) const } -void InsetQuotes::tocString(odocstream & os) const +docstring InsetQuotes::xhtml(XHTMLStream & xs, OutputParams const & op) const +{ + docbook(xs.os(), op); + return docstring(); +} + + +void InsetQuotes::toString(odocstream & os) const { os << displayString(); } +void InsetQuotes::forToc(docstring & os, size_t) const +{ + os += displayString(); +} + + void InsetQuotes::validate(LaTeXFeatures & features) const { bool const use_babel = features.useBabel();