Fix a long-standing FIXME by resetting only the counter for top-level

sectioning when we see an appendix. This fixes bug #8271, whose root
cause was the fact that we were resetting all the counters inside ERT.
This commit is contained in:
Richard Heck 2012-07-21 14:14:12 -04:00
parent 6335d93643
commit 894569e601
4 changed files with 39 additions and 26 deletions

View File

@ -4301,9 +4301,11 @@ void Buffer::Impl::setLabel(ParIterator & it, UpdateType utype) const
Counters & counters = textclass.counters();
if (par.params().startOfAppendix()) {
// FIXME: only the counter corresponding to toplevel
// sectioning should be reset
counters.reset();
// We want to reset the counter corresponding to toplevel sectioning
Layout const & lay = textclass.getTOCLayout();
docstring const cnt = lay.counter;
if (!cnt.empty())
counters.reset(cnt);
counters.appendix(true);
}
par.params().appendix(counters.appendix());

View File

@ -1507,27 +1507,32 @@ bool DocumentClass::hasTocLevels() const
}
Layout const & DocumentClass::getTOCLayout() const
{
// we're going to look for the layout with the minimum toclevel
TextClass::LayoutList::const_iterator lit = begin();
TextClass::LayoutList::const_iterator const len = end();
int minlevel = 1000;
Layout const * lay = NULL;
for (; lit != len; ++lit) {
int const level = lit->toclevel;
// we don't want Part
if (level == Layout::NOT_IN_TOC || level < 0 || level >= minlevel)
continue;
lay = &*lit;
minlevel = level;
}
if (lay)
return *lay;
// hmm. that is very odd, so we'll do our best.
return operator[](defaultLayoutName());
}
Layout const & DocumentClass::htmlTOCLayout() const
{
if (html_toc_section_.empty()) {
// we're going to look for the layout with the minimum toclevel
TextClass::LayoutList::const_iterator lit = begin();
TextClass::LayoutList::const_iterator const len = end();
int minlevel = 1000;
Layout const * lay = NULL;
for (; lit != len; ++lit) {
int const level = lit->toclevel;
// we don't want Part
if (level == Layout::NOT_IN_TOC || level < 0 || level >= minlevel)
continue;
lay = &*lit;
minlevel = level;
}
if (lay)
html_toc_section_ = lay->name();
else
// hmm. that is very odd, so we'll do our best
html_toc_section_ = defaultLayoutName();
html_toc_section_ = getTOCLayout().name();
}
return operator[](html_toc_section_);
}

View File

@ -419,6 +419,8 @@ public:
docstring const & htmlpreamble() const { return htmlpreamble_; }
///
docstring const & htmlstyles() const { return htmlstyles_; }
///
Layout const & getTOCLayout() const;
/// the paragraph style to use for TOCs, Bibliography, etc
/// we will attempt to calculate this if it was not given
Layout const & htmlTOCLayout() const;

View File

@ -967,11 +967,15 @@ void xhtmlParagraphs(Text const & text,
while (bpit < epit) {
ParagraphList::const_iterator par = paragraphs.constIterator(bpit);
if (par->params().startOfAppendix()) {
// FIXME: only the counter corresponding to toplevel
// sectioning should be reset
Counters & cnts = buf.masterBuffer()->params().documentClass().counters();
cnts.reset();
cnts.appendix(true);
// We want to reset the counter corresponding to toplevel sectioning
Layout const & lay =
buf.masterBuffer()->params().documentClass().getTOCLayout();
docstring const cnt = lay.counter;
if (!cnt.empty()) {
Counters const & cnts =
buf.masterBuffer()->params().documentClass().counters();
cnts.reset(cnt);
}
}
Layout const & style = par->layout();
ParagraphList::const_iterator const lastpar = par;