X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FText3.cpp;h=3e6fdf0e14e62634173830b242372aa160a48a51;hb=2de30c62f8d671a8c8d4d52a6a7310e2c5ca84de;hp=b9619bfbb1ca75c30989a04c0cf7ddcfcce47742;hpb=237193f8a888777192981136469a5d4febb8e9d8;p=lyx.git diff --git a/src/Text3.cpp b/src/Text3.cpp index b9619bfbb1..3e6fdf0e14 100644 --- a/src/Text3.cpp +++ b/src/Text3.cpp @@ -1548,11 +1548,40 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) while (pos > 0 && par.isDeleted(pos - 1)) --pos; + bool const inner = (cmd.getArg(0) == "single" || cmd.getArg(0) == "inner"); + + // Guess quote side. + // A space triggers an opening quote. This is passed if the preceding + // char/inset is a space or at paragraph start. char_type c = ' '; - if (pos > 0 && (!cur.prevInset() || !cur.prevInset()->isSpace())) - c = par.getChar(pos - 1); - InsetQuotesParams::QuoteLevel const quote_level = - (cmd.getArg(0) == "single" || cmd.getArg(0) == "inner") + if (pos > 0 && !par.isSpace(pos - 1)) { + if (cur.prevInset() && cur.prevInset()->lyxCode() == QUOTE_CODE) { + // If an opening double quotation mark precedes, and this + // is a single quote, make it opening as well + InsetQuotes & ins = + static_cast(*cur.prevInset()); + string const type = ins.getType(); + if (!suffixIs(type, "ld") || !inner) + c = par.getChar(pos - 1); + } + else if (!cur.prevInset() + || (cur.prevInset() && cur.prevInset()->isChar())) + // If a char precedes, pass that and let InsetQuote decide + c = par.getChar(pos - 1); + else { + while (pos > 0) { + if (par.getInset(pos - 1) + && !par.getInset(pos - 1)->isPartOfTextSequence()) { + // skip "invisible" insets + --pos; + continue; + } + c = par.getChar(pos - 1); + break; + } + } + } + InsetQuotesParams::QuoteLevel const quote_level = inner ? InsetQuotesParams::SecondaryQuotes : InsetQuotesParams::PrimaryQuotes; cur.insert(new InsetQuotes(cur.buffer(), c, quote_level, cmd.getArg(1), cmd.getArg(2))); cur.buffer()->updateBuffer(); @@ -1746,13 +1775,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd) } case LFUN_HREF_INSERT: { - // FIXME If we're actually given an argument, shouldn't - // we use it, whether or not we have a selection? docstring content = cmd.argument(); - if (cur.selection()) { + if (content.empty() && cur.selection()) content = cur.selectionAsString(false); - cutSelection(cur, true, false); - } InsetCommandParams p(HYPERLINK_CODE); if (!content.empty()){