* Paragraph:

- simpleTeXOnePar(): renamed to latex(), beginning of de-spaghettization by truly splitting inset and character cases.
- appendChar(), appendString(): new method for buffer reading.



git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21117 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Abdelrazak Younes 2007-10-22 13:09:16 +00:00
parent e820c448a0
commit e6f059a132
5 changed files with 88 additions and 61 deletions

View File

@ -73,7 +73,7 @@ public:
/** Current stream encoding. Only used for LaTeX.
This must be set to the document encoding (via the constructor)
before output starts. Afterwards it must be kept up to date for
each single character (\see Paragraph::simpleTeXOnePar).
each single character (\sa Paragraph::latex).
This does also mean that you need to set it back if you use a
copy (e.g. in insets): \code
int InsetFoo::latex(..., OutputParams const & runparams_in) const

View File

@ -99,7 +99,7 @@ public:
/// \return whether a surrogate pair was output.
bool simpleTeXBlanks(Encoding const &,
odocstream &, TexRow & texrow,
pos_type & i,
pos_type i,
unsigned int & column,
Font const & font,
Layout const & style);
@ -110,7 +110,7 @@ public:
int knownLangChars(odocstream & os, value_type c, string & preamble,
Change &, Encoding const &, pos_type &);
///
void simpleTeXSpecialChars(Buffer const &, BufferParams const &,
void latexInset(Buffer const &, BufferParams const &,
odocstream &,
TexRow & texrow, OutputParams &,
Font & running_font,
@ -120,17 +120,17 @@ public:
Change & running_change,
Layout const & style,
pos_type & i,
unsigned int & column, value_type const c);
unsigned int & column);
///
void simpleTeXSpecialChar(
void latexSpecialChar(
odocstream & os,
OutputParams & runparams,
Font & running_font,
Change & running_change,
Layout const & style,
pos_type & i,
unsigned int & column,
value_type const c);
unsigned int & column);
///
void validate(LaTeXFeatures & features,
@ -489,7 +489,7 @@ int Paragraph::Private::latexSurrogatePair(odocstream & os, value_type c,
bool Paragraph::Private::simpleTeXBlanks(Encoding const & encoding,
odocstream & os, TexRow & texrow,
pos_type & i,
pos_type i,
unsigned int & column,
Font const & font,
Layout const & style)
@ -502,7 +502,6 @@ bool Paragraph::Private::simpleTeXBlanks(Encoding const & encoding,
if (Encodings::isCombiningChar(next)) {
// This space has an accent, so we must always output it.
column += latexSurrogatePair(os, ' ', next, encoding) - 1;
++i;
return true;
}
}
@ -614,7 +613,7 @@ bool Paragraph::Private::isTextAt(string const & str, pos_type pos) const
}
void Paragraph::Private::simpleTeXSpecialChars(Buffer const & buf,
void Paragraph::Private::latexInset(Buffer const & buf,
BufferParams const & bparams,
odocstream & os,
TexRow & texrow,
@ -626,32 +625,16 @@ void Paragraph::Private::simpleTeXSpecialChars(Buffer const & buf,
Change & running_change,
Layout const & style,
pos_type & i,
unsigned int & column,
value_type const c)
unsigned int & column)
{
if (style.pass_thru) {
if (c != Paragraph::META_INSET) {
if (c != '\0')
// FIXME UNICODE: This can fail if c cannot
// be encoded in the current encoding.
os.put(c);
} else
owner_->getInset(i)->plaintext(buf, os, runparams);
return;
}
// 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 != Paragraph::META_INSET) {
simpleTeXSpecialChar(os, runparams, running_font, running_change,
i, column, c);
return;
}
Inset * inset = owner_->getInset(i);
BOOST_ASSERT(inset);
if (style.pass_thru) {
inset->plaintext(buf, os, runparams);
return;
}
// FIXME: move this to InsetNewline::latex
if (inset->lyxCode() == NEWLINE_CODE) {
// newlines are handled differently here than
@ -766,15 +749,25 @@ void Paragraph::Private::simpleTeXSpecialChars(Buffer const & buf,
}
void Paragraph::Private::simpleTeXSpecialChar(
void Paragraph::Private::latexSpecialChar(
odocstream & os,
OutputParams & runparams,
Font & running_font,
Change & running_change,
Layout const & style,
pos_type & i,
unsigned int & column,
value_type const c)
unsigned int & column)
{
value_type const c = getChar(i);
if (style.pass_thru) {
if (c != '\0')
// FIXME UNICODE: This can fail if c cannot
// be encoded in the current encoding.
os.put(c);
return;
}
if (runparams.verbatim) {
os.put(c);
return;
@ -1145,6 +1138,33 @@ void Paragraph::insert(pos_type start, docstring const & str,
}
void Paragraph::appendChar(value_type c, Font const & font,
Change const & change)
{
// track change
d->changes_.insert(change, text_.size());
// when appending characters, no need to update tables
text_.push_back(c);
setFont(text_.size() - 1, font);
}
void Paragraph::appendString(docstring const & s, Font const & font,
Change const & change)
{
size_t end = s.size();
// FIXME: Optimize this!
text_.reserve(text_.size() + end);
for (pos_type i = 0; i != end; ++i) {
// track change
d->changes_.insert(change, i);
// when appending characters, no need to update tables
text_.push_back(s[i]);
setFont(i, font);
}
}
void Paragraph::insertChar(pos_type pos, Paragraph::value_type c,
bool trackChanges)
{
@ -1746,7 +1766,7 @@ int Paragraph::endTeXParParams(BufferParams const & bparams,
// This one spits out the text of the paragraph
bool Paragraph::simpleTeXOnePar(Buffer const & buf,
bool Paragraph::latex(Buffer const & buf,
BufferParams const & bparams,
Font const & outerfont,
odocstream & os, TexRow & texrow,
@ -1868,8 +1888,6 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
++column;
value_type const c = getChar(i);
// Fully instantiated font
Font const font = getFont(bparams, i, outerfont);
@ -1899,6 +1917,8 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
}
}
value_type const c = getChar(i);
// Do we need to change font?
if ((font != running_font ||
font.language() != running_font.language()) &&
@ -1921,21 +1941,22 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
}
if (c == ' ') {
// FIXME: integrate this case in latexSpecialChar
// Do not print the separation of the optional argument
// if style->pass_thru is false. This works because
// simpleTeXSpecialChars ignores spaces if
// latexSpecialChar ignores spaces if
// style->pass_thru is false.
if (i != body_pos - 1) {
if (d->simpleTeXBlanks(
*(runparams.encoding), os, texrow,
i, column, font, *style))
i, column, font, *style)) {
// A surrogate pair was output. We
// must not call simpleTeXSpecialChars
// in this iteration, since
// simpleTeXBlanks incremented i, and
// simpleTeXSpecialChars would output
// must not call latexSpecialChar
// in this iteration, since it would output
// the combining character again.
++i;
continue;
}
}
}
@ -1943,10 +1964,18 @@ bool Paragraph::simpleTeXOnePar(Buffer const & buf,
rp.free_spacing = style->free_spacing;
rp.local_font = &font;
rp.intitle = style->intitle;
d->simpleTeXSpecialChars(buf, bparams, os,
// 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 == Paragraph::META_INSET)
d->latexInset(buf, bparams, os,
texrow, rp, running_font,
basefont, outerfont, open_font,
runningChange, *style, i, column, c);
runningChange, *style, i, column);
else
d->latexSpecialChar(os, rp, running_font, runningChange,
*style, i, column);
// Set the encoding to that returned from simpleTeXSpecialChars (see
// comment for encoding member in OutputParams.h)

View File

@ -128,7 +128,7 @@ public:
///
bool simpleTeXOnePar(Buffer const &, BufferParams const &,
bool latex(Buffer const &, BufferParams const &,
Font const & outerfont, odocstream &,
TexRow & texrow, OutputParams const &) const;
@ -292,6 +292,12 @@ public:
///
void insert(pos_type pos, docstring const & str,
Font const & font, Change const & change);
///
void appendString(docstring const & s, Font const & font,
Change const & change);
///
void appendChar(value_type c, Font const & font, Change const & change);
///
void insertChar(pos_type pos, value_type c, bool trackChanges);
///

View File

@ -102,17 +102,9 @@ void readParToken(Buffer const & buf, Paragraph & par, Lexer & lex,
BufferParams const & bp = buf.params();
if (token[0] != '\\') {
#if 0
string::const_iterator cit = token.begin();
for (; cit != token.end(); ++cit)
par.insertChar(par.size(), (*cit), font, change);
#else
docstring dstr = lex.getDocString();
docstring::const_iterator cit = dstr.begin();
docstring::const_iterator cend = dstr.end();
for (; cit != cend; ++cit)
par.insertChar(par.size(), *cit, font, change);
#endif
par.appendString(dstr, font, change);
} else if (token == "\\begin_layout") {
lex.eatLine();
docstring layoutname = lex.getDocString();
@ -216,12 +208,12 @@ void readParToken(Buffer const & buf, Paragraph & par, Lexer & lex,
// Insets don't make sense in a free-spacing context! ---Kayvan
if (par.isFreeSpacing()) {
if (token == "\\InsetSpace")
par.insertChar(par.size(), ' ', font, change);
par.appendChar(' ', font, change);
else if (lex.isOK()) {
lex.next();
string const next_token = lex.getString();
if (next_token == "\\-")
par.insertChar(par.size(), '-', font, change);
par.appendChar('-', font, change);
else {
lex.printError("Token `$$Token' "
"is in free space "
@ -239,7 +231,7 @@ void readParToken(Buffer const & buf, Paragraph & par, Lexer & lex,
font, change);
}
} else if (token == "\\backslash") {
par.insertChar(par.size(), '\\', font, change);
par.appendChar('\\', font, change);
} else if (token == "\\newline") {
auto_ptr<Inset> inset(new InsetNewline);
inset->read(buf, lex);

View File

@ -441,7 +441,7 @@ TeXOnePar(Buffer const & buf,
// FIXME UNICODE
os << from_utf8(everypar);
bool need_par = pit->simpleTeXOnePar(buf, bparams, outerfont,
bool need_par = pit->latex(buf, bparams, outerfont,
os, texrow, runparams);
// Make sure that \\par is done with the font of the last