TextContainer text_;
typedef set<docstring> Words;
+ typedef map<Language, Words> LangWordsMap;
///
- map<Language, Words> words_;
+ LangWordsMap words_;
///
Layout const * layout_;
};
}
if (tmp) {
- for (int j = 0; j < tmp; ++j)
- texrow.newline();
-
+ texrow.newlines(tmp);
texrow.start(owner_->id(), i + 1);
column = 0;
} else {
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
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:
case LYX_ALIGN_BLOCK:
case LYX_ALIGN_LAYOUT:
case LYX_ALIGN_SPECIAL:
+ case LYX_ALIGN_DECIMAL:
break;
case LYX_ALIGN_LEFT: {
string output;
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:
case LYX_ALIGN_BLOCK:
case LYX_ALIGN_LAYOUT:
case LYX_ALIGN_SPECIAL:
+ case LYX_ALIGN_DECIMAL:
break;
case LYX_ALIGN_LEFT: {
string output;
// 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.
unsigned int column = 0;
if (body_pos > 0) {
- os << '[';
- column += 1;
+ // the optional argument is kept in curly brackets in
+ // case it contains a ']'
+ os << "[{";
+ column += 2;
basefont = getLabelFont(bparams, outerfont);
} else {
basefont = getLayoutFont(bparams, outerfont);
runparams);
runningChange = Change(Change::UNCHANGED);
- os << "] ";
- column +=2;
+ os << "}] ";
+ column +=3;
}
if (style.isCommand()) {
os << '{';
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,
// Needed if there is an optional argument but no contents.
if (body_pos > 0 && body_pos == size()) {
- os << "]~";
- return_value = false;
+ os << "}]~";
}
if (allowcust && d->endTeXParParams(bparams, os, texrow, runparams)
}
LYXERR(Debug::LATEX, "Paragraph::latex... done " << this);
- return return_value;
}
bool Paragraph::isMultiLingual(BufferParams const & bparams) const
{
- Language const * doc_language = bparams.language;
+ Language const * doc_language = bparams.language;
FontList::const_iterator cit = d->fontlist_.begin();
FontList::const_iterator end = d->fontlist_.end();
}
+void Paragraph::getLanguages(std::set<Language const *> & languages) const
+{
+ FontList::const_iterator cit = d->fontlist_.begin();
+ FontList::const_iterator end = d->fontlist_.end();
+
+ for (; cit != end; ++cit) {
+ Language const * lang = cit->font().language();
+ if (lang != ignore_language &&
+ lang != latex_language)
+ languages.insert(lang);
+ }
+}
+
+
docstring Paragraph::asString(int options) const
{
return asString(0, size(), options);
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) {
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();
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())
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);
}
}
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;