X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FParagraph.cpp;h=6410d570853afec660e81ff245edbe423ec354ee;hb=4cb209b121430b38606932e31d2659bd7ed57447;hp=5fdfb157d0e8cb64e2110977a1e8fb8b5c477687;hpb=0b2fae66e32bb626611e7ce055c2cd8f41d6e151;p=lyx.git diff --git a/src/Paragraph.cpp b/src/Paragraph.cpp index 5fdfb157d0..6410d57085 100644 --- a/src/Paragraph.cpp +++ b/src/Paragraph.cpp @@ -913,7 +913,7 @@ int Paragraph::Private::latexSurrogatePair(BufferParams const & bparams, if (runparams.local_font) fontenc = runparams.local_font->language()->fontenc(bparams); else - fontenc = runparams.main_fontenc; + fontenc = bparams.language->fontenc(bparams); docstring scriptmacro; docstring cb; if (script == "textgreek" || script == "textcyrillic") { @@ -1234,10 +1234,7 @@ void Paragraph::Private::latexSpecialChar(otexstream & os, pos_type end_pos, unsigned int & column) { - // With polyglossia, brackets and stuff need not be reversed - // in RTL scripts (see bug #8251) - char_type const c = (runparams.use_polyglossia) ? - owner_->getUChar(bparams, i) : text_[i]; + char_type const c = owner_->getUChar(bparams, runparams, i); if (style.pass_thru || runparams.pass_thru || contains(style.pass_thru_chars, c) @@ -1395,10 +1392,7 @@ void Paragraph::Private::latexSpecialChar(otexstream & os, } } string fontenc; - if (running_font.language()->lang() == bparams.language->lang()) - fontenc = runparams.main_fontenc; - else - fontenc = running_font.language()->fontenc(bparams); + fontenc = running_font.language()->fontenc(bparams); // "Script chars" need to embraced in \textcyrillic and \textgreek notwithstanding // whether they are encodable or not (it only depends on the font encoding) if (!runparams.isFullUnicode() && Encodings::isKnownScriptChar(c, script)) { @@ -1794,7 +1788,9 @@ void Paragraph::write(ostream & os, BufferParams const & bparams, void Paragraph::validate(LaTeXFeatures & features) const { d->validate(features); - if (needsCProtection()) + bool fragile = features.runparams().moving_arg; + fragile |= layout().needprotect; + if (needsCProtection(fragile)) features.require("cprotect"); } @@ -1998,32 +1994,60 @@ Font const Paragraph::getLayoutFont } -char_type Paragraph::getUChar(BufferParams const & bparams, pos_type pos) const +char_type Paragraph::getUChar(BufferParams const & bparams, + OutputParams const & rp, + pos_type pos) const { char_type c = d->text_[pos]; + + // Return unchanged character in LTR languages. if (!getFontSettings(bparams, pos).isRightToLeft()) return c; - // FIXME: The arabic special casing is due to the difference of arabic - // round brackets input introduced in r18599. Check if this should be - // unified with Hebrew or at least if all bracket types should be - // handled the same (file format change in either case). + // FIXME This is a complete mess due to all the language-specific + // special cases. We need to unify this eventually, but this + // requires a file format change and some thought. + // We also need to unify the input of parentheses in different RTL + // languages. Currently, some have their own methods (Arabic: + // 18599/lyxsvn, Hebrew: e5f42f67d/lyxgit), some don't (Urdu, Syriac). + // Also note that the representation in the LyX file is probably wrong + // (see FIXME in TextMetrics::breakRow). + // Most likely, we should simply rely on Qt's unicode handling here. string const & lang = getFontSettings(bparams, pos).language()->lang(); - bool const arabic = lang == "arabic_arabtex" || lang == "arabic_arabi" - || lang == "farsi"; + + // With polyglossia, brackets and stuff need not be reversed in RTL scripts + // FIXME: The special casing for Hebrew parens is due to the special + // handling on input (for Hebrew in e5f42f67d/lyxgit); see #8251. char_type uc = c; + if (rp.use_polyglossia) { + switch (c) { + case '(': + if (lang == "hebrew") + uc = ')'; + break; + case ')': + if (lang == "hebrew") + uc = '('; + break; + } + return uc; + } + + // In the following languages, brackets don't need to be reversed. + // Furthermore, in arabic_arabi, they are transformed to Arabic + // Ornate Parentheses (dunno if this is really wanted) + bool const reversebrackets = lang != "arabic_arabtex" + && lang != "arabic_arabi" + && lang != "farsi"; + switch (c) { - case '(': - uc = arabic ? c : ')'; - break; - case ')': - uc = arabic ? c : '('; - break; case '[': - uc = ']'; + if (reversebrackets) + uc = ']'; break; case ']': - uc = '['; + if (reversebrackets) + uc = '['; break; case '{': uc = '}'; @@ -2359,13 +2383,13 @@ int Paragraph::Private::startTeXParParams(BufferParams const & bparams, case LYX_ALIGN_DECIMAL: break; case LYX_ALIGN_LEFT: { - if (owner_->getParLanguage(bparams)->babel() != "hebrew") + if (!owner_->getParLanguage(bparams)->rightToLeft()) corrected_env(os, begin_tag, "flushleft", code, lastpar, column); else corrected_env(os, begin_tag, "flushright", code, lastpar, column); break; } case LYX_ALIGN_RIGHT: { - if (owner_->getParLanguage(bparams)->babel() != "hebrew") + if (!owner_->getParLanguage(bparams)->rightToLeft()) corrected_env(os, begin_tag, "flushright", code, lastpar, column); else corrected_env(os, begin_tag, "flushleft", code, lastpar, column); @@ -2417,13 +2441,13 @@ bool Paragraph::Private::endTeXParParams(BufferParams const & bparams, case LYX_ALIGN_DECIMAL: break; case LYX_ALIGN_LEFT: { - if (owner_->getParLanguage(bparams)->babel() != "hebrew") + if (!owner_->getParLanguage(bparams)->rightToLeft()) output = corrected_env(os, end_tag, "flushleft", code, lastpar, col); else output = corrected_env(os, end_tag, "flushright", code, lastpar, col); break; } case LYX_ALIGN_RIGHT: { - if (owner_->getParLanguage(bparams)->babel() != "hebrew") + if (!owner_->getParLanguage(bparams)->rightToLeft()) output = corrected_env(os, end_tag, "flushright", code, lastpar, col); else output = corrected_env(os, end_tag, "flushleft", code, lastpar, col); @@ -3388,7 +3412,8 @@ docstring Paragraph::simpleLyXHTMLOnePar(Buffer const & buf, retval += inset->xhtml(xs, np); } } else { - char_type c = getUChar(buf.masterBuffer()->params(), i); + char_type c = getUChar(buf.masterBuffer()->params(), + runparams, i); xs << c; } font_old = font.fontInfo(); @@ -3478,7 +3503,7 @@ bool Paragraph::isHardHyphenOrApostrophe(pos_type pos) const } -bool Paragraph::needsCProtection() const +bool Paragraph::needsCProtection(bool const fragile) const { // first check the layout of the paragraph, but only in insets InsetText const * textinset = inInset().asInsetText(); @@ -3506,7 +3531,7 @@ bool Paragraph::needsCProtection() const // now check whether we have insets that need cprotection pos_type size = d->text_.size(); for (pos_type i = 0; i < size; ++i) - if (isInset(i) && getInset(i)->needsCProtection(maintext)) + if (isInset(i) && getInset(i)->needsCProtection(maintext, fragile)) return true; return false; @@ -4232,6 +4257,9 @@ SpellChecker::Result Paragraph::spellCheck(pos_type & from, pos_type & to, docstring word = asString(from, to, AS_STR_INSETS | AS_STR_SKIPDELETE); Language * lang = d->getSpellLanguage(from); + if (getFontSettings(d->inset_owner_->buffer().params(), from).fontInfo().nospellcheck() == FONT_ON) + return result; + wl = WordLangTuple(word, lang); if (word.empty())