X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetQuotes.cpp;h=122266d8081beab35aa10312baff19cb92f1b1ed;hb=d6f1915684328c6e3fe61c6eef8846b5cabec334;hp=50b9ec18080daa473771ff79eb9a172e594c52e9;hpb=9d0ea8aeff32833a90b3fe64df0c5518a9e241be;p=lyx.git diff --git a/src/insets/InsetQuotes.cpp b/src/insets/InsetQuotes.cpp index 50b9ec1808..122266d808 100644 --- a/src/insets/InsetQuotes.cpp +++ b/src/insets/InsetQuotes.cpp @@ -15,7 +15,6 @@ #include "Buffer.h" #include "BufferParams.h" #include "BufferView.h" -#include "support/debug.h" #include "Dimension.h" #include "Language.h" #include "LaTeXFeatures.h" @@ -27,20 +26,16 @@ #include "frontends/FontMetrics.h" #include "frontends/Painter.h" +#include "support/debug.h" #include "support/docstring.h" #include "support/docstream.h" #include "support/lstrings.h" +using namespace std; +using namespace lyx::support; namespace lyx { -using support::prefixIs; - -using std::endl; -using std::string; -using std::ostream; - - namespace { /* codes used to read/write quotes to LyX files @@ -59,6 +54,12 @@ char const * const times_char = "sd"; // List of known quote chars char const * const quote_char = ",'`<>"; +// Unicode characters needed by each quote type +char_type const display_quote_char[2][5] = { + { 0x201a, 0x2019, 0x2018, 0x2039, 0x203a}, + { 0x201e, 0x201d, 0x201c, 0x00ab, 0x00bb} +}; + // Index of chars used for the quote. Index is [side, language] int quote_index[2][6] = { { 2, 1, 0, 0, 3, 4 }, // "'',,<>" @@ -87,29 +88,25 @@ char const * const latex_quote_babel[2][5] = { } // namespace anon -InsetQuotes::InsetQuotes(string const & str) +InsetQuotes::InsetQuotes(Buffer const & buf, string const & str) { parseString(str); + setBuffer(const_cast(buf)); } - -InsetQuotes::InsetQuotes(quote_language l, quote_side s, quote_times t) - : language_(l), side_(s), times_(t) -{ -} - - -InsetQuotes::InsetQuotes(char_type c, BufferParams const & params) - : language_(params.quotes_language), times_(params.quotes_times) +InsetQuotes::InsetQuotes(Buffer const & buf, char_type c) + : language_(buf.params().quotes_language), times_(buf.params().quotes_times) { - getPosition(c); + setSide(c); + setBuffer(const_cast(buf)); } -InsetQuotes::InsetQuotes(char_type c, quote_language l, quote_times t) - : language_(l), times_(t) +InsetQuotes::InsetQuotes(Buffer const & buf, char_type c, QuoteTimes t) + : language_(buf.params().quotes_language), times_(t) { - getPosition(c); + setSide(c); + setBuffer(const_cast(buf)); } @@ -119,17 +116,17 @@ docstring InsetQuotes::name() const } -void InsetQuotes::getPosition(char_type c) +void InsetQuotes::setSide(char_type c) { // Decide whether left or right switch (c) { case ' ': case '(': case '[': - side_ = LeftQ; // left quote + side_ = LeftQuote; // left quote break; default: - side_ = RightQ; // right quote + side_ = RightQuote; // right quote } } @@ -147,80 +144,51 @@ void InsetQuotes::parseString(string const & s) for (i = 0; i < 6; ++i) { if (str[0] == language_char[i]) { - language_ = quote_language(i); + language_ = QuoteLanguage(i); break; } } if (i >= 6) { lyxerr << "ERROR (InsetQuotes::InsetQuotes):" " bad language specification." << endl; - language_ = EnglishQ; + language_ = EnglishQuotes; } for (i = 0; i < 2; ++i) { if (str[1] == side_char[i]) { - side_ = quote_side(i); + side_ = QuoteSide(i); break; } } if (i >= 2) { lyxerr << "ERROR (InsetQuotes::InsetQuotes):" " bad side specification." << endl; - side_ = LeftQ; + side_ = LeftQuote; } for (i = 0; i < 2; ++i) { if (str[2] == times_char[i]) { - times_ = quote_times(i); + times_ = QuoteTimes(i); break; } } if (i >= 2) { lyxerr << "ERROR (InsetQuotes::InsetQuotes):" " bad times specification." << endl; - times_ = DoubleQ; + times_ = DoubleQuotes; } } -docstring const InsetQuotes::dispString(Language const * loclang) const +docstring InsetQuotes::displayString() const { - string disp; - disp += quote_char[quote_index[side_][language_]]; - if (times_ == DoubleQ) - disp += disp; - - - docstring retdisp; - if (disp == "<<") - retdisp = docstring(1, 0x00ab); //'«'; - else if (disp == ">>") - retdisp = docstring(1, 0x00bb); //'»'; -#if 0 - // The below are supposed to work, but something fails. - else if (disp == ",,") - retdisp = docstring(1, 0x201e); - else if (disp == "''") - retdisp == docstring(1, 0x201d); - else if (disp == "``") - retdisp == docstring(1, 0x201c); - else if (disp == "<") - retdisp = docstring(1, 0x2039); - else if (disp == ">") - retdisp = docstring(1, 0x203a); - else if (disp == ",") - retdisp = docstring(1, 0x201a); - else if (disp == "'") - retdisp = docstring(1, 0x2019); - else if (disp == "`") - retdisp = docstring(1, 0x2018); -#endif - else - retdisp = from_ascii(disp); + Language const * loclang = buffer().params().language; + 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_ == DoubleQ && prefixIs(loclang->code(), "fr")) { - if (side_ == LeftQ) + if (times_ == DoubleQuotes && prefixIs(loclang->code(), "fr")) { + if (side_ == LeftQuote) retdisp += ' '; else retdisp.insert(size_t(0), 1, ' '); @@ -240,8 +208,7 @@ void InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const dim.wid = 0; // FIXME: should we add a language or a font parameter member? - docstring const text = dispString( - mi.base.bv->buffer().params().language); + docstring const text = displayString(); for (string::size_type i = 0; i < text.length(); ++i) { if (text[i] == ' ') dim.wid += fm.width('i'); @@ -256,8 +223,7 @@ void InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const void InsetQuotes::draw(PainterInfo & pi, int x, int y) const { // FIXME: should we add a language or a font parameter member? - docstring const text = dispString( - pi.base.bv->buffer().params().language); + docstring const text = displayString(); if (text.length() == 2 && text[0] == text[1]) { pi.pain.text(x, y, text[0], pi.base.font); @@ -270,7 +236,7 @@ void InsetQuotes::draw(PainterInfo & pi, int x, int y) const } -void InsetQuotes::write(Buffer const &, ostream & os) const +void InsetQuotes::write(ostream & os) const { string text; text += language_char[language_]; @@ -280,26 +246,23 @@ void InsetQuotes::write(Buffer const &, ostream & os) const } -void InsetQuotes::read(Buffer const &, Lexer & lex) +void InsetQuotes::read(Lexer & lex) { + lex.setContext("InsetQuotes::read"); lex.next(); parseString(lex.getString()); - lex.next(); - if (lex.getString() != "\\end_inset") { - lex.printError("Missing \\end_inset at this point"); - } + lex >> "\\end_inset"; } -int InsetQuotes::latex(Buffer const &, odocstream & os, - OutputParams const & runparams) const +int InsetQuotes::latex(odocstream & os, OutputParams const & runparams) const { const int quoteind = quote_index[side_][language_]; string qstr; - if (language_ == FrenchQ && times_ == DoubleQ + if (language_ == FrenchQuotes && times_ == DoubleQuotes && prefixIs(runparams.local_font->language()->code(), "fr")) { - if (side_ == LeftQ) + if (side_ == LeftQuote) qstr = "\\og "; //the spaces are important here else qstr = " \\fg{}"; //and here @@ -324,25 +287,23 @@ int InsetQuotes::latex(Buffer const &, odocstream & os, } -int InsetQuotes::plaintext(Buffer const & buf, odocstream & os, - OutputParams const &) const +int InsetQuotes::plaintext(odocstream & os, OutputParams const &) const { - docstring const str = dispString(buf.params().language); + docstring const str = displayString(); os << str; return str.size(); } -int InsetQuotes::docbook(Buffer const &, odocstream & os, - OutputParams const &) const +int InsetQuotes::docbook(odocstream & os, OutputParams const &) const { - if (times_ == DoubleQ) { - if (side_ == LeftQ) + if (times_ == DoubleQuotes) { + if (side_ == LeftQuote) os << "“"; else os << "”"; } else { - if (side_ == LeftQ) + if (side_ == LeftQuote) os << "‘"; else os << "’"; @@ -351,9 +312,9 @@ int InsetQuotes::docbook(Buffer const &, odocstream & os, } -void InsetQuotes::textString(Buffer const & buf, odocstream & os) const +void InsetQuotes::textString(odocstream & os) const { - os << dispString(buf.params().language); + os << displayString(); } @@ -368,7 +329,7 @@ void InsetQuotes::validate(LaTeXFeatures & features) const if (!use_babel #endif && lyxrc.fontenc != "T1") { - if (times_ == SingleQ) + if (times_ == SingleQuotes) switch (type) { case ',': features.require("quotesinglbase"); break; case '<': features.require("guilsinglleft"); break; @@ -385,11 +346,4 @@ void InsetQuotes::validate(LaTeXFeatures & features) const } } - -Inset * InsetQuotes::clone() const -{ - return new InsetQuotes(language_, side_, times_); -} - - } // namespace lyx