#include "insets/InsetBibitem.h"
#include "insets/InsetLabel.h"
+#include "insets/InsetSpecialChar.h"
#include "support/debug.h"
#include "support/docstring_list.h"
texrow.start(owner_->id(), i + 1);
column = 0;
} else {
- column += os.tellp() - len;
+ column += (unsigned int)(os.tellp() - len);
}
if (owner_->isDeleted(i))
void Paragraph::Private::validate(LaTeXFeatures & features) const
{
if (layout_->inpreamble && inset_owner_) {
+ bool const is_command = layout_->latextype == LATEX_COMMAND;
Buffer const & buf = inset_owner_->buffer();
BufferParams const & bp = buf.params();
Font f;
TexRow tr;
+ // Using a string stream here circumvents the encoding
+ // switching machinery of odocstream. Therefore the
+ // output is wrong if this paragraph contains content
+ // that needs to switch encoding.
odocstringstream ods;
- // we have to provide all the optional arguments here, even though
- // the last one is the only one we care about.
+ if (is_command) {
+ ods << '\\' << from_ascii(layout_->latexname());
+ // we have to provide all the optional arguments here, even though
+ // the last one is the only one we care about.
+ // Separate handling of optional argument inset.
+ if (layout_->optargs != 0 || layout_->reqargs != 0)
+ latexArgInsets(*owner_, ods, features.runparams(),
+ layout_->reqargs, layout_->optargs);
+ else
+ ods << from_ascii(layout_->latexparam());
+ }
+ docstring::size_type const length = ods.str().length();
+ // this will output "{" at the beginning, but not at the end
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 (ods.str().length() > length) {
+ if (is_command)
+ ods << '}';
+ string const snippet = to_utf8(ods.str());
+ features.addPreambleSnippet(snippet);
}
}
open_font = false;
}
+ string const running_lang = runparams.use_polyglossia ?
+ running_font.language()->polyglossia() : running_font.language()->babel();
// close babel's font environment before opening CJK.
- if (!running_font.language()->babel().empty() &&
+ string const lang_end_command = runparams.use_polyglossia ?
+ "\\end{$$lang}" : lyxrc.language_command_end;
+ if (!running_lang.empty() &&
font.language()->encoding()->package() == Encoding::CJK) {
- string end_tag = subst(lyxrc.language_command_end,
+ string end_tag = subst(lang_end_command,
"$$lang",
- running_font.language()->babel());
+ running_lang);
os << from_ascii(end_tag);
column += end_tag.length();
}
if (allowcust && d->endTeXParParams(bparams, os, texrow, runparams)
&& runparams.encoding != prev_encoding) {
runparams.encoding = prev_encoding;
- if (!bparams.useXetex)
+ if (!runparams.isFullUnicode())
os << setEncoding(prev_encoding->iconvName());
}
Inset const * inset = getInset(i);
if (inset) {
- InsetCommand const * ic = inset->asInsetCommand();
- InsetLayout const & il = inset->getLayout();
- InsetMath const * im = inset->asInsetMath();
- if (!runparams.for_toc
- || im || il.isInToc() || (ic && ic->isInToc())) {
+ if (!runparams.for_toc || inset->isInToc()) {
OutputParams np = runparams;
- if (!il.htmlisblock())
+ if (!inset->getLayout().htmlisblock())
np.html_in_par = true;
retval += inset->xhtml(xs, np);
}
// We don't want to escape the entities. Note that
// it is safe to do this, since str can otherwise
// only be "-". E.g., it can't be "<".
- xs << XHTMLStream::NextRaw() << str;
+ xs << XHTMLStream::ESCAPE_NONE << str;
} else
xs << c;
}
{
// FIXME From JS:
// This is getting more and more a mess. ...We really should clean
- // up this bibitem issue for 1.6. See also bug 2743.
+ // up this bibitem issue for 1.6.
// Add bibitem insets if necessary
if (d->layout_->labeltype != LABEL_BIBLIO)
InsetList::iterator end = d->insetlist_.end();
for (; it != end; ++it)
if (it->inset->lyxCode() == BIBITEM_CODE
- && it->pos > 0) {
- InsetBibitem * olditem = static_cast<InsetBibitem *>(it->inset);
+ && it->pos > 0) {
+ InsetCommand * olditem = it->inset->asInsetCommand();
oldkey = olditem->getParam("key");
oldlabel = olditem->getParam("label");
erasedInsetPosition = it->pos;
// There was an InsetBibitem at the beginning and we did have to
// erase one. So we give its properties to the beginning inset.
if (hasbibitem) {
- InsetBibitem * inset =
- static_cast<InsetBibitem *>(d->insetlist_.begin()->inset);
+ InsetCommand * inset = d->insetlist_.begin()->inset->asInsetCommand();
if (!oldkey.empty())
inset->setParam("key", oldkey);
inset->setParam("label", oldlabel);
if (!oldkey.empty())
inset->setParam("key", oldkey);
inset->setParam("label", oldlabel);
- insertInset(0, static_cast<Inset *>(inset),
+ insertInset(0, inset,
Change(track_changes ? Change::INSERTED : Change::UNCHANGED));
return 1;
}
-bool Paragraph::find(docstring const & str, bool cs, bool mw,
- pos_type pos, bool del) const
+int Paragraph::find(docstring const & str, bool cs, bool mw,
+ pos_type start_pos, bool del) const
{
+ pos_type pos = start_pos;
int const strsize = str.length();
int i = 0;
pos_type const parsize = d->text_.size();
- for (i = 0; pos + i < parsize; ++i) {
- if (i >= strsize)
- break;
- if (cs && str[i] != d->text_[pos + i])
+ for (i = 0; i < strsize && pos < parsize; ++i, ++pos) {
+ // Ignore ligature break 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))
+ break;
+ pos++;
+ }
+ if (cs && str[i] != d->text_[pos])
break;
- if (!cs && uppercase(str[i]) != uppercase(d->text_[pos + i]))
+ if (!cs && uppercase(str[i]) != uppercase(d->text_[pos]))
break;
- if (!del && isDeleted(pos + i))
+ if (!del && isDeleted(pos))
break;
}
if (i != strsize)
- return false;
+ return 0;
// if necessary, check whether string matches word
if (mw) {
- if (pos > 0 && !isWordSeparator(pos - 1))
- return false;
- if (pos + strsize < parsize
- && !isWordSeparator(pos + strsize))
- return false;
+ if (start_pos > 0 && !isWordSeparator(start_pos - 1))
+ return 0;
+ if (pos < parsize
+ && !isWordSeparator(pos))
+ return 0;
}
- return true;
+ return pos - start_pos;
}