if (range_.first > pos) {
range_.first += offset;
range_.last += offset;
- } else if (range_.last > pos) {
+ } else if (range_.last >= pos) {
range_.last += offset;
}
}
int prev_rows = os.texrow().rows();
try {
+ runparams.lastid = id_;
+ runparams.lastpos = i;
inset->latex(os, runparams);
} catch (EncodingException & e) {
// add location information and throw again.
char_type const c = text_[i];
if (style.pass_thru || runparams.pass_thru) {
- if (c != '\0')
- // FIXME UNICODE: This can fail if c cannot
- // be encoded in the current encoding.
+ if (c != '\0') {
+ Encoding const * const enc = runparams.encoding;
+ if (enc && enc->latexChar(c, true).empty())
+ throw EncodingException(c);
os.put(c);
+ }
return;
}
runparams);
}
- Change const & change = runparams.inDeletedInset ? runparams.changeOfDeletedInset
- : lookupChange(i);
+ Change const & change = runparams.inDeletedInset
+ ? runparams.changeOfDeletedInset : lookupChange(i);
if (bparams.outputChanges && runningChange != change) {
if (open_font) {
if (pos == size())
return true;
char_type const c = d->text_[pos];
+ // if we have a hard hyphen (no en- or emdash),
+ // we pass this to the spell checker
+ if (c == '-') {
+ int j = pos + 1;
+ if ((j == size() || d->text_[j] != '-')
+ && (pos == 0 || d->text_[pos - 1] != '-'))
+ return false;
+ }
// We want to pass the ' and escape chars to the spellchecker
static docstring const quote = from_utf8(lyxrc.spellchecker_esc_chars + '\'');
return (!isLetterChar(c) && !isDigitASCII(c) && !contains(quote, c));
int i = 0;
pos_type const parsize = d->text_.size();
for (i = 0; i < strsize && pos < parsize; ++i, ++pos) {
- // Ignore ligature break and hyphenation chars while searching
+ // Ignore "invisible" letters such as ligature breaks
+ // and hyphenation chars while searching
while (pos < parsize - 1 && isInset(pos)) {
- const InsetSpecialChar *isc = dynamic_cast<const InsetSpecialChar*>(getInset(pos));
- if (isc == 0
- || (isc->kind() != InsetSpecialChar::HYPHENATION
- && isc->kind() != InsetSpecialChar::LIGATURE_BREAK))
+ odocstringstream os;
+ getInset(pos)->toString(os);
+ if (!getInset(pos)->isLetter() || !os.str().empty())
break;
pos++;
}
return result;
if (needsSpellCheck() || check_learned) {
+ pos_type end = to;
if (!d->ignoreWord(word)) {
bool const trailing_dot = to < size() && d->text_[to] == '.';
result = speller->check(wl);
word << "\" [" <<
from << ".." << to << "]");
} else {
- // spell check with dot appended failed
+ // spell check with dot appended failed too
// restore original word/lang value
word = asString(from, to, AS_STR_INSETS | AS_STR_SKIPDELETE);
wl = WordLangTuple(word, lang);
}
}
}
- d->setMisspelled(from, to, result);
+ if (!SpellChecker::misspelled(result)) {
+ // area up to the begin of the next word is not misspelled
+ while (end < size() && isWordSeparator(end))
+ ++end;
+ }
+ d->setMisspelled(from, end, result);
} else {
result = d->speller_state_.getState(from);
}
- bool const misspelled_ = SpellChecker::misspelled(result) ;
- if (misspelled_ && do_suggestion)
- speller->suggest(wl, suggestions);
- else if (misspelled_)
+ if (do_suggestion)
+ suggestions.clear();
+
+ if (SpellChecker::misspelled(result)) {
LYXERR(Debug::GUI, "misspelled word: \"" <<
word << "\" [" <<
from << ".." << to << "]");
- else
- suggestions.clear();
-
+ if (do_suggestion)
+ speller->suggest(wl, suggestions);
+ }
return result;
}
bool Paragraph::isMisspelled(pos_type pos, bool check_boundary) const
{
bool result = SpellChecker::misspelled(d->speller_state_.getState(pos));
- if (result || pos <= 0 || pos >= size())
+ if (result || pos <= 0 || pos > size())
return result;
- if (check_boundary && isWordSeparator(pos))
+ if (check_boundary && (pos == size() || isWordSeparator(pos)))
result = SpellChecker::misspelled(d->speller_state_.getState(pos - 1));
return result;
}