* Licence details can be found in the file COPYING.
*
* \author Asger Alstrup
- * \author Lars Gullik Bjønnes
+ * \author Lars Gullik Bjønnes
* \author Jean-Marc Lasgouttes
* \author Angus Leeming
* \author John Levon
- * \author André Pönitz
+ * \author André Pönitz
* \author Dekel Tsur
- * \author Jürgen Vigna
+ * \author Jürgen Vigna
*
* Full author contact details are available in file CREDITS.
*/
}
bool close = false;
- odocstringstream ods;
+ odocstream::pos_type const len = os.tellp();
if (inset->forceLTR()
&& running_font.isRightToLeft()
// ERT is an exception, it should be output with no decorations at all
&& inset->lyxCode() != ERT_CODE) {
if (running_font.language()->lang() == "farsi")
- ods << "\\beginL{}";
+ os << "\\beginL{}";
else
- ods << "\\L{";
+ os << "\\L{";
close = true;
}
if (open_font && inset->noFontChange()) {
bool closeLanguage = arabtex
|| basefont.isRightToLeft() == running_font.isRightToLeft();
- unsigned int count = running_font.latexWriteEndChanges(ods,
+ unsigned int count = running_font.latexWriteEndChanges(os,
bparams, runparams, basefont, basefont, closeLanguage);
column += count;
// if any font properties were closed, update the running_font,
int tmp;
try {
- tmp = inset->latex(ods, runparams);
+ tmp = inset->latex(os, runparams);
} catch (EncodingException & e) {
// add location information and throw again.
e.par_id = id_;
if (close) {
if (running_font.language()->lang() == "farsi")
- ods << "\\endL{}";
+ os << "\\endL{}";
else
- ods << '}';
+ os << '}';
}
- os << ods.str();
-
if (tmp) {
for (int j = 0; j < tmp; ++j)
texrow.newline();
texrow.start(owner_->id(), i + 1);
column = 0;
} else {
- column += ods.str().size();
+ column += os.tellp() - len;
}
if (owner_->lookupChange(i).type == Change::DELETED)
return;
}
- if (lyxrc.fontenc == "T1" && latexSpecialT1(c, os, i, column))
+ // If T1 font encoding is used, use the special
+ // characters it provides.
+ // NOTE: some languages reset the font encoding
+ // internally
+ if (!running_font.language()->internalFontEncoding()
+ && lyxrc.fontenc == "T1" && latexSpecialT1(c, os, i, column))
return;
+ // \tt font needs special treatment
if (running_font.fontInfo().family() == TYPEWRITER_FAMILY
&& latexSpecialTypewriter(c, os, i, column))
return;
column += 17;
break;
- case '*': case '[':
+ case '*':
+ case '[':
+ case ']':
// avoid being mistaken for optional arguments
os << '{';
os.put(c);
d->text_.append(s);
// FIXME: Optimize this!
- for (pos_type i = oldsize; i != newsize; ++i) {
+ for (size_t i = oldsize; i != newsize; ++i) {
// track change
d->changes_.insert(change, i);
}
// This one spits out the text of the paragraph
bool Paragraph::latex(BufferParams const & bparams,
- Font const & outerfont,
- odocstream & os, TexRow & texrow,
- OutputParams const & runparams) const
+ Font const & outerfont,
+ odocstream & os, TexRow & texrow,
+ OutputParams const & runparams,
+ int start_pos, int end_pos) const
{
LYXERR(Debug::LATEX, "Paragraph::latex... " << this);
if (!runparams.verbatim &&
runparams.encoding->package() != Encoding::none &&
font.language()->encoding()->package() != Encoding::none) {
- odocstringstream ods;
- pair<bool, int> const enc_switch = switchEncoding(ods, bparams,
+ pair<bool, int> const enc_switch = switchEncoding(os, bparams,
runparams, *(font.language()->encoding()));
- os << ods.str();
if (enc_switch.first) {
column += enc_switch.second;
runparams.encoding = font.language()->encoding();
os << fontchange;
}
- if (c == ' ') {
+ // FIXME: think about end_pos implementation...
+ if (c == ' ' && i >= start_pos && (end_pos == -1 || i < end_pos)) {
// FIXME: integrate this case in latexSpecialChar
// Do not print the separation of the optional argument
// if style.pass_thru is false. This works because
// Two major modes: LaTeX or plain
// Handle here those cases common to both modes
// and then split to handle the two modes separately.
- if (c == META_INSET)
- d->latexInset(bparams, os,
- texrow, rp, running_font,
- basefont, outerfont, open_font,
- runningChange, style, i, column);
- else {
- try {
- d->latexSpecialChar(os, rp, running_font, runningChange,
- style, i, column);
- } catch (EncodingException & e) {
+ if (c == META_INSET) {
+ if (i >= start_pos && (end_pos == -1 || i < end_pos)) {
+ d->latexInset(bparams, os,
+ texrow, rp, running_font,
+ basefont, outerfont, open_font,
+ runningChange, style, i, column);
+ }
+ } else {
+ if (i >= start_pos && (end_pos == -1 || i < end_pos)) {
+ try {
+ d->latexSpecialChar(os, rp, running_font, runningChange,
+ style, i, column);
+ } catch (EncodingException & e) {
if (runparams.dryrun) {
os << "<" << _("LyX Warning: ")
<< _("uncodable character") << " '";
}
}
}
+ }
// Set the encoding to that returned from latexSpecialChar (see
// comment for encoding member in OutputParams.h)
}
+docstring Paragraph::stringify(pos_type beg, pos_type end, int options, OutputParams & runparams) const
+{
+ odocstringstream os;
+
+ if (beg == 0
+ && options & AS_STR_LABEL
+ && !d->params_.labelString().empty())
+ os << d->params_.labelString() << ' ';
+
+ for (pos_type i = beg; i < end; ++i) {
+ char_type const c = d->text_[i];
+ if (isPrintable(c) || c == '\t'
+ || (c == '\n' && options & AS_STR_NEWLINES))
+ os.put(c);
+ else if (c == META_INSET && options & AS_STR_INSETS) {
+ getInset(i)->plaintext(os, runparams);
+ }
+ }
+
+ return os.str();
+}
+
+
void Paragraph::setInsetOwner(Inset const * inset)
{
d->inset_owner_ = inset;