]> git.lyx.org Git - lyx.git/blobdiff - src/Paragraph.cpp
TR1: move TR1 check to config.h / buildsystem
[lyx.git] / src / Paragraph.cpp
index 31c5fb7c782f900d7fc54094984bc3bcf4fcd6c1..150c28d6a9adafe53b8be2cdc7d224dbf3d297e9 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 {
@@ -1080,10 +1079,16 @@ void Paragraph::Private::validate(LaTeXFeatures & features) const
                Font f;
                TexRow tr;
                odocstringstream ods;
-               owner_->latex(bp, f, ods, tr, features.runparams());
-               docstring d = ods.str();
-               if (!d.empty())
-                       features.addPreambleSnippet(to_utf8(d));
+               // we have to provide all the optional arguments here, even though
+               // the last one is the only one we care about.
+               owner_->latex(bp, f, ods, tr, features.runparams(), 0, -1, true);
+               docstring const d = ods.str();
+               if (!d.empty()) {
+                       // this will have "{" at the beginning, but not at the end
+                       string const content = to_utf8(d);
+                       string const cmd = layout_->latexname();
+                       features.addPreambleSnippet("\\" + cmd + content + "}");
+               }
        }
        
        if (features.runparams().flavor == OutputParams::HTML 
@@ -1850,6 +1855,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 +1876,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 +1925,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 +1946,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;
@@ -1971,26 +1980,24 @@ int Paragraph::Private::endTeXParParams(BufferParams const & bparams,
 
 
 // This one spits out the text of the paragraph
-bool Paragraph::latex(BufferParams const & bparams,
+void Paragraph::latex(BufferParams const & bparams,
        Font const & outerfont,
        odocstream & os, TexRow & texrow,
        OutputParams const & runparams,
-       int start_pos, int end_pos) const
+       int start_pos, int end_pos, bool force) const
 {
        LYXERR(Debug::LATEX, "Paragraph::latex...     " << this);
 
-       if (layout().inpreamble)
-               return true;
-
-       bool return_value = false;
-
-       bool const allowcust = allowParagraphCustomization();
-
        // FIXME This check should not be needed. Perhaps issue an
        // error if it triggers.
        Layout const & style = inInset().forcePlainLayout() ?
                bparams.documentClass().plainLayout() : *d->layout_;
 
+       if (!force && style.inpreamble)
+               return;
+
+       bool const allowcust = allowParagraphCustomization();
+
        // Current base font for all inherited font changes, without any
        // change caused by an individual character, except for the language:
        // It is set to the language of the first character.
@@ -2225,9 +2232,8 @@ bool Paragraph::latex(BufferParams const & bparams,
        if (open_font) {
 #ifdef FIXED_LANGUAGE_END_DETECTION
                if (next_) {
-                       running_font
-                               .latexWriteEndChanges(os, bparams, runparams,
-                                       basefont,
+                       running_font.latexWriteEndChanges(os, bparams,
+                                       runparams, basefont,
                                        next_->getFont(bparams, 0, outerfont));
                } else {
                        running_font.latexWriteEndChanges(os, bparams,
@@ -2248,7 +2254,6 @@ bool Paragraph::latex(BufferParams const & bparams,
        // Needed if there is an optional argument but no contents.
        if (body_pos > 0 && body_pos == size()) {
                os << "}]~";
-               return_value = false;
        }
 
        if (allowcust && d->endTeXParParams(bparams, os, texrow, runparams)
@@ -2259,7 +2264,6 @@ bool Paragraph::latex(BufferParams const & bparams,
        }
 
        LYXERR(Debug::LATEX, "Paragraph::latex... done " << this);
-       return return_value;
 }
 
 
@@ -2641,8 +2645,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 +3074,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 +3126,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 +3149,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,11 +3176,18 @@ 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);
+       // 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
@@ -3181,12 +3199,17 @@ bool Paragraph::spellCheck(pos_type & from, pos_type & to, WordLangTuple & wl,
                lang->setVariety(lang_variety);
        }
        wl = WordLangTuple(word, lang);
-       SpellChecker::Result res = speller->check(wl);
+       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;