X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetQuotes.cpp;h=122266d8081beab35aa10312baff19cb92f1b1ed;hb=d6f1915684328c6e3fe61c6eef8846b5cabec334;hp=0077bc56ccb94f40ce34a2bbfa0614755ee3e22f;hpb=db8c16d554ebb1dcb319e44d318572de6eff024b;p=lyx.git diff --git a/src/insets/InsetQuotes.cpp b/src/insets/InsetQuotes.cpp index 0077bc56cc..122266d808 100644 --- a/src/insets/InsetQuotes.cpp +++ b/src/insets/InsetQuotes.cpp @@ -54,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 }, // "'',,<>" @@ -82,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)); } @@ -114,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 } } @@ -142,81 +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 InsetQuotes::dispString() const +docstring InsetQuotes::displayString() const { Language const * loclang = buffer().params().language; - 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); + 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, ' '); @@ -236,7 +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(); + docstring const text = displayString(); for (string::size_type i = 0; i < text.length(); ++i) { if (text[i] == ' ') dim.wid += fm.width('i'); @@ -251,7 +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(); + docstring const text = displayString(); if (text.length() == 2 && text[0] == text[1]) { pi.pain.text(x, y, text[0], pi.base.font); @@ -276,12 +248,10 @@ void InsetQuotes::write(ostream & os) const 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"; } @@ -290,9 +260,9 @@ 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 @@ -319,7 +289,7 @@ int InsetQuotes::latex(odocstream & os, OutputParams const & runparams) const int InsetQuotes::plaintext(odocstream & os, OutputParams const &) const { - docstring const str = dispString(); + docstring const str = displayString(); os << str; return str.size(); } @@ -327,13 +297,13 @@ int InsetQuotes::plaintext(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 << "’"; @@ -344,7 +314,7 @@ int InsetQuotes::docbook(odocstream & os, OutputParams const &) const void InsetQuotes::textString(odocstream & os) const { - os << dispString(); + os << displayString(); } @@ -359,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; @@ -376,11 +346,4 @@ void InsetQuotes::validate(LaTeXFeatures & features) const } } - -Inset * InsetQuotes::clone() const -{ - return new InsetQuotes(language_, side_, times_); -} - - } // namespace lyx