#include "support/lstrings.h"
#include "support/Messages.h"
#include "support/textutils.h"
-#include "support/unicode.h"
#include <sstream>
#include <vector>
}
-bool Paragraph::isMergedOnEndOfParDeletion(bool trackChanges) const {
+bool Paragraph::isMergedOnEndOfParDeletion(bool trackChanges) const
+{
// keep the logic here in sync with the logic of eraseChars()
-
- if (!trackChanges) {
+ if (!trackChanges)
return true;
- }
-
- Change change = d->changes_.lookup(size());
+ Change const change = d->changes_.lookup(size());
return change.type == Change::INSERTED && change.author == 0;
}
if (change.type != Change::DELETED) {
for (pos_type pos = 0; pos < size(); ++pos) {
- if (isInset(pos))
- getInset(pos)->setChange(change);
+ if (Inset * inset = getInset(pos))
+ inset->setChange(change);
}
}
}
void Paragraph::setChange(pos_type pos, Change const & change)
{
BOOST_ASSERT(pos >= 0 && pos <= size());
-
d->changes_.set(change, pos);
// see comment in setChange(Change const &) above
-
- if (change.type != Change::DELETED &&
- pos < size() && isInset(pos)) {
- getInset(pos)->setChange(change);
- }
+ if (change.type != Change::DELETED && pos < size())
+ if (Inset * inset = getInset(pos))
+ inset->setChange(change);
}
Change const & Paragraph::lookupChange(pos_type pos) const
{
BOOST_ASSERT(pos >= 0 && pos <= size());
-
return d->changes_.lookup(pos);
}
switch (lookupChange(pos).type) {
case Change::UNCHANGED:
// accept changes in nested inset
- if (pos < size() && isInset(pos))
- getInset(pos)->acceptChanges(bparams);
-
+ if (Inset * inset = getInset(pos))
+ inset->acceptChanges(bparams);
break;
case Change::INSERTED:
d->changes_.set(Change(Change::UNCHANGED), pos);
// also accept changes in nested inset
- if (pos < size() && isInset(pos)) {
- getInset(pos)->acceptChanges(bparams);
- }
+ if (Inset * inset = getInset(pos))
+ inset->acceptChanges(bparams);
break;
case Change::DELETED:
switch (lookupChange(pos).type) {
case Change::UNCHANGED:
// reject changes in nested inset
- if (pos < size() && isInset(pos)) {
- getInset(pos)->rejectChanges(bparams);
- }
+ if (Inset * inset = getInset(pos))
+ inset->rejectChanges(bparams);
break;
case Change::INSERTED:
// then the layouts
features.useLayout(layout.name());
- if (!layout.requires().empty()) {
- vector<string> req = layout.requires();
- for (vector<string>::const_iterator it = req.begin();
- it != req.end(); ++it) {
- features.require(*it);
- }
- }
// then the fonts
fontlist_.validate(features);
char_type const c = d->text_[i];
switch (c) {
case META_INSET:
- {
- Inset const * inset = getInset(i);
- if (inset)
+ if (Inset const * inset = getInset(i)) {
if (inset->directWrite()) {
// international char, let it write
// code directly so it's shorter in
os << "\n\\end_inset\n\n";
column = 0;
}
- }
- break;
+ }
+ break;
case '\\':
os << "\n\\backslash\n";
column = 0;
}
// this check is to amend a bug. LyX sometimes
// inserts '\0' this could cause problems.
- if (c != '\0') {
- vector<char> tmp = ucs4_to_utf8(c);
- tmp.push_back('\0');
- os << &tmp[0];
- } else
+ if (c != '\0')
+ os << to_utf8(docstring(1, c));
+ else
lyxerr << "ERROR (Paragraph::writeFile):"
" NULL char in structure." << endl;
++column;
bool Paragraph::emptyTag() const
{
for (pos_type i = 0; i < size(); ++i) {
- if (isInset(i)) {
- Inset const * inset = getInset(i);
+ if (Inset const * inset = getInset(i)) {
InsetCode lyx_code = inset->lyxCode();
if (lyx_code != TOC_CODE &&
lyx_code != INCLUDE_CODE &&
string Paragraph::getID(Buffer const & buf, OutputParams const & runparams) const
{
for (pos_type i = 0; i < size(); ++i) {
- if (isInset(i)) {
- Inset const * inset = getInset(i);
+ if (Inset const * inset = getInset(i)) {
InsetCode lyx_code = inset->lyxCode();
if (lyx_code == LABEL_CODE) {
InsetLabel const * const il = static_cast<InsetLabel const *>(inset);
return "id='" + to_utf8(sgml::cleanID(buf, runparams, id)) + "'";
}
}
-
}
return string();
}
{
pos_type i;
for (i = 0; i < size(); ++i) {
- if (isInset(i)) {
- Inset const * inset = getInset(i);
+ if (Inset const * inset = getInset(i)) {
inset->docbook(buf, os, runparams);
} else {
char_type c = d->text_[i];
}
}
- if (isInset(i)) {
- Inset const * inset = getInset(i);
+ if (Inset const * inset = getInset(i)) {
inset->docbook(buf, os, runparams);
} else {
char_type c = d->text_[i];
bool Paragraph::isHfill(pos_type pos) const
{
- return isInset(pos) && getInset(pos)->lyxCode() == HFILL_CODE;
+ Inset const * inset = getInset(pos);
+ return inset && inset->lyxCode() == HFILL_CODE;
}
bool Paragraph::isNewline(pos_type pos) const
{
- return isInset(pos) && getInset(pos)->lyxCode() == NEWLINE_CODE;
+ Inset const * inset = getInset(pos);
+ return inset && inset->lyxCode() == NEWLINE_CODE;
}
bool Paragraph::isLineSeparator(pos_type pos) const
{
char_type const c = d->text_[pos];
- return isLineSeparatorChar(c)
- || (c == META_INSET && getInset(pos) &&
- getInset(pos)->isLineSeparator());
+ if (isLineSeparatorChar(c))
+ return true;
+ Inset const * inset = getInset(pos);
+ return inset && inset->isLineSeparator();
}
/// Used by the spellchecker
bool Paragraph::isLetter(pos_type pos) const
{
- if (isInset(pos))
- return getInset(pos)->isLetter();
+ if (Inset const * inset = getInset(pos))
+ return inset->isLetter();
char_type const c = d->text_[pos];
return isLetterChar(c) || isDigit(c);
}
Inset * Paragraph::getInset(pos_type pos)
{
- return d->insetlist_.get(pos);
+ return (pos < pos_type(d->text_.size()) && d->text_[pos] == META_INSET)
+ ? d->insetlist_.get(pos) : 0;
}
Inset const * Paragraph::getInset(pos_type pos) const
{
- return d->insetlist_.get(pos);
+ return (pos < pos_type(d->text_.size()) && d->text_[pos] == META_INSET)
+ ? d->insetlist_.get(pos) : 0;
}
void Paragraph::changeCase(BufferParams const & bparams, pos_type pos,
- pos_type right, TextCase action)
+ pos_type & right, TextCase action)
{
// process sequences of modified characters; in change
// tracking mode, this approach results in much better