Fix bug #7663: Misparsing of description \item with spaces

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@40182 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Georg Baum 2011-11-13 10:40:07 +00:00
parent d139b234b2
commit 2a216184c4
3 changed files with 37 additions and 13 deletions

View File

@ -2311,6 +2311,10 @@ void Paragraph::latex(BufferParams const & bparams,
if (body_pos > 0) {
// the optional argument is kept in curly brackets in
// case it contains a ']'
// This is not strictly needed, but if this is changed it
// would be a file format change, and tex2lyx would need
// to be adjusted, since it unconditionally removes the
// braces when it parses \item.
os << "[{";
column += 2;
basefont = getLabelFont(bparams, outerfont);

View File

@ -277,6 +277,10 @@ What else? Well, we have descriptions:
\begin{description}
\item[ABC] first item
\item[BCD] second one
\item[{x y z}] with space
\item % hi there
[{x y % bla
z}] and with comments
\end{description}
labelings:
\begin{lyxlist}{00.00.0000}

View File

@ -2179,16 +2179,15 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
}
else if (t.cs() == "item") {
p.skip_spaces();
string s;
bool optarg = false;
if (p.next_token().cat() != catEscape &&
p.next_token().character() == '[') {
p.get_token(); // eat '['
s = parse_text_snippet(p, FLAG_BRACK_LAST,
outer, context);
optarg = true;
}
bool const optarg = p.hasOpt();
if (optarg) {
// FIXME: This swallows comments, but we cannot use
// eat_whitespace() since we must not output
// anything before the item.
s = p.getArg('[', ']');
} else
p.skip_spaces(false);
context.set_item();
context.check_layout(os);
if (context.has_item) {
@ -2204,13 +2203,30 @@ void parse_text(Parser & p, ostream & os, unsigned flags, bool outer,
if (context.layout->labeltype != LABEL_MANUAL) {
// LyX does not support \item[\mybullet]
// in itemize environments
handle_ert(os, "[", context);
os << s;
handle_ert(os, "]", context);
Parser p2(s + ']');
os << parse_text_snippet(p2,
FLAG_BRACK_LAST, outer, context);
} else if (!s.empty()) {
// LyX adds braces around the argument,
// so we need to remove them here.
if (s.size() > 2 && s[0] == '{' &&
s[s.size()-1] == '}')
s = s.substr(1, s.size()-2);
// If the argument contains a space we
// must put it into ERT: Otherwise LyX
// would misinterpret the space as
// item delimiter (bug 7663)
if (contains(s, ' ')) {
handle_ert(os, s, context);
} else {
Parser p2(s + ']');
os << parse_text_snippet(p2,
FLAG_BRACK_LAST,
outer, context);
}
// The space is needed to separate the
// item from the rest of the sentence.
os << s << ' ';
os << ' ';
eat_whitespace(p, os, context, false);
}
}