]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
* InsetListings.cpp:
[lyx.git] / src / Paragraph.cpp
index a45e71b52be3ea74a6843fab0d94e6db308ebc04..5ec2adfeefed9fc0f8c8d613900dd631441e5588 100644 (file)
@@ -208,8 +208,9 @@ public:
        TextContainer text_;
        
        typedef set<docstring> Words;
+       typedef map<Language, Words> LangWordsMap;
        ///
-       map<Language, Words> words_;
+       LangWordsMap words_;
        ///
        Layout const * layout_;
 };
@@ -846,9 +847,7 @@ void Paragraph::Private::latexInset(
        }
 
        if (tmp) {
-               for (int j = 0; j < tmp; ++j)
-                       texrow.newline();
-
+               texrow.newlines(tmp);
                texrow.start(owner_->id(), i + 1);
                column = 0;
        } else {
@@ -1850,6 +1849,7 @@ int Paragraph::Private::startTeXParParams(BufferParams const & bparams,
        case LYX_ALIGN_BLOCK:
        case LYX_ALIGN_LAYOUT:
        case LYX_ALIGN_SPECIAL:
+       case LYX_ALIGN_DECIMAL:
                break;
        case LYX_ALIGN_LEFT:
        case LYX_ALIGN_RIGHT:
@@ -1870,6 +1870,7 @@ int Paragraph::Private::startTeXParParams(BufferParams const & bparams,
        case LYX_ALIGN_BLOCK:
        case LYX_ALIGN_LAYOUT:
        case LYX_ALIGN_SPECIAL:
+       case LYX_ALIGN_DECIMAL:
                break;
        case LYX_ALIGN_LEFT: {
                string output;
@@ -1918,6 +1919,7 @@ int Paragraph::Private::endTeXParParams(BufferParams const & bparams,
        case LYX_ALIGN_BLOCK:
        case LYX_ALIGN_LAYOUT:
        case LYX_ALIGN_SPECIAL:
+       case LYX_ALIGN_DECIMAL:
                break;
        case LYX_ALIGN_LEFT:
        case LYX_ALIGN_RIGHT:
@@ -1938,6 +1940,7 @@ int Paragraph::Private::endTeXParParams(BufferParams const & bparams,
        case LYX_ALIGN_BLOCK:
        case LYX_ALIGN_LAYOUT:
        case LYX_ALIGN_SPECIAL:
+       case LYX_ALIGN_DECIMAL:
                break;
        case LYX_ALIGN_LEFT: {
                string output;
@@ -2641,8 +2644,8 @@ docstring Paragraph::asString(pos_type beg, pos_type end, int options) const
        odocstringstream os;
 
        if (beg == 0 
-               && options & AS_STR_LABEL
-               && !d->params_.labelString().empty())
+           && options & AS_STR_LABEL
+           && !d->params_.labelString().empty())
                os << d->params_.labelString() << ' ';
 
        for (pos_type i = beg; i < end; ++i) {
@@ -3070,11 +3073,13 @@ bool Paragraph::isSeparator(pos_type pos) const
 
 void Paragraph::deregisterWords()
 {
-       map<Language, Private::Words>::const_iterator itl;
-       Private::Words::const_iterator it;
-       for (itl = d->words_.begin(); itl != d->words_.end(); ++itl) {
+       Private::LangWordsMap::const_iterator itl = d->words_.begin();
+       Private::LangWordsMap::const_iterator ite = d->words_.end();
+       for (; itl != ite; ++itl) {
                WordList * wl = theWordList(itl->first);
-               for (it = (itl->second).begin(); it != (itl->second).end(); ++it)
+               Private::Words::const_iterator it = (itl->second).begin();
+               Private::Words::const_iterator et = (itl->second).end();
+               for (; it != et; ++it)
                        wl->remove(*it);
        }
        d->words_.clear();
@@ -3120,13 +3125,16 @@ void Paragraph::locateWord(pos_type & from, pos_type & to,
 
 void Paragraph::collectWords()
 {
+       // This is the value that needs to be exposed in the preferences
+       // to resolve bug #6760.
+       static int minlength = 6;
        pos_type n = size();
        for (pos_type pos = 0; pos < n; ++pos) {
                if (isWordSeparator(pos))
                        continue;
                pos_type from = pos;
                locateWord(from, pos, WHOLE_WORD);
-               if (pos - from >= 6) {
+               if (pos - from >= minlength) {
                        docstring word = asString(from, pos, AS_STR_NONE);
                        FontList::const_iterator cit = d->fontlist_.fontIterator(pos);
                        if (cit == d->fontlist_.end())
@@ -3140,11 +3148,13 @@ void Paragraph::collectWords()
 
 void Paragraph::registerWords()
 {
-       map<Language, Private::Words>::const_iterator itl;
-       Private::Words::const_iterator it;
-       for (itl = d->words_.begin(); itl != d->words_.end(); ++itl) {
+       Private::LangWordsMap::const_iterator itl = d->words_.begin();
+       Private::LangWordsMap::const_iterator ite = d->words_.end();
+       for (; itl != ite; ++itl) {
                WordList * wl = theWordList(itl->first);
-               for (it = (itl->second).begin(); it != (itl->second).end(); ++it)
+               Private::Words::const_iterator it = (itl->second).begin();
+               Private::Words::const_iterator et = (itl->second).end();
+               for (; it != et; ++it)
                        wl->insert(*it);
        }
 }
@@ -3165,28 +3175,40 @@ bool Paragraph::spellCheck(pos_type & from, pos_type & to, WordLangTuple & wl,
        if (!speller)
                return false;
 
+       if (!d->layout_->spellcheck || !inInset().allowSpellCheck())
+               return false;
+
        locateWord(from, to, WHOLE_WORD);
        if (from == to || from >= pos_type(d->text_.size()))
                return false;
 
        docstring word = asString(from, to, AS_STR_INSETS);
-       string lang_code;
-       string lang_variety;
-       if (!lyxrc.spellchecker_alt_lang.empty())
-               lang_variety = split(lyxrc.spellchecker_alt_lang, lang_code, '-');
-       else {
-             lang_code = getFontSettings(
-                   d->inset_owner_->buffer().params(), from).language()->code();
-             lang_variety = getFontSettings(
-                   d->inset_owner_->buffer().params(), from).language()->variety();
-       }
-       wl = WordLangTuple(word, lang_code, lang_variety);
-       SpellChecker::Result res = speller->check(wl);
+       // Ignore words with digits
+       // FIXME: make this customizable
+       // (note that hunspell ignores words with digits by default)
+       bool const ignored = hasDigit(word);
+       Language * lang = const_cast<Language *>(getFontSettings(
+                   d->inset_owner_->buffer().params(), from).language());
+       if (lang == d->inset_owner_->buffer().params().language
+           && !lyxrc.spellchecker_alt_lang.empty()) {
+               string lang_code;
+               string const lang_variety =
+                       split(lyxrc.spellchecker_alt_lang, lang_code, '-');
+               lang->setCode(lang_code);
+               lang->setVariety(lang_variety);
+       }
+       wl = WordLangTuple(word, lang);
+       SpellChecker::Result res = ignored ?
+               SpellChecker::OK : speller->check(wl);
+#if 0
+// FIXME: the code below makes aspell abort if a word in an unknown
+//       language is checked.
        // Just ignore any error that the spellchecker reports.
        // FIXME: we should through out an exception and catch it in the GUI to
        // display the error.
        if (!speller->error().empty())
                return false;
+#endif
 
        bool const misspelled = res != SpellChecker::OK
                && res != SpellChecker::IGNORED_WORD;