#include "LyX.h"
#include "OutputParams.h"
#include "output_xhtml.h"
+#include "Paragraph.h"
#include "ParIterator.h"
#include "sgml.h"
#include "texstream.h"
InsetRef::InsetRef(Buffer * buf, InsetCommandParams const & p)
- : InsetCommand(buf, p), broken_(false)
+ : InsetCommand(buf, p), broken_(false), active_(true)
{}
InsetRef::InsetRef(InsetRef const & ir)
- : InsetCommand(ir), broken_(false)
+ : InsetCommand(ir), broken_(false), active_(true)
{}
void InsetRef::updateBuffer(ParIterator const & it, UpdateType, bool const /*deleted*/)
{
docstring const & ref = getParam("reference");
+
+ // Check if this one is active (i.e., neither deleted with change-tracking
+ // nor in an inset that does not produce output, such as notes or inactive branches)
+ Paragraph const & para = it.paragraph();
+ active_ = !para.isDeleted(it.pos()) && para.inInset().producesOutput();
+ // If not, check whether we are in a deleted/non-outputting inset
+ if (active_) {
+ for (size_type sl = 0 ; sl < it.depth() ; ++sl) {
+ Paragraph const & outer_par = it[sl].paragraph();
+ if (outer_par.isDeleted(it[sl].pos())
+ || !outer_par.inInset().producesOutput()) {
+ active_ = false;
+ break;
+ }
+ }
+ }
+
// register this inset into the buffer reference cache.
buffer().addReference(ref, this, it);
screen_label_ = label;
broken_ = false;
+ setBroken(broken_);
}
void InsetRef::addToToc(DocIterator const & cpit, bool output_active,
- UpdateType, TocBackend & backend) const
+ UpdateType, TocBackend & backend) const
{
+ active_ = output_active;
docstring const & label = getParam("reference");
if (buffer().insetLabel(label)) {
broken_ = !buffer().activeLabel(label);
+ setBroken(broken_);
+ if (broken_ && output_active) {
+ shared_ptr<Toc> toc2 = backend.toc("brokenrefs");
+ toc2->push_back(TocItem(cpit, 0, screenLabel(), output_active));
+ }
// This InsetRef has already been taken care of in InsetLabel::addToToc().
return;
}
// It seems that this reference does not point to any valid label.
-
broken_ = true;
+ setBroken(broken_);
shared_ptr<Toc> toc = backend.toc("label");
toc->push_back(TocItem(cpit, 0, screenLabel(), output_active));
+ shared_ptr<Toc> toc2 = backend.toc("brokenrefs");
+ toc2->push_back(TocItem(cpit, 0, screenLabel(), output_active));
}
docstring InsetRef::getTOCString() const
{
+ docstring const & label = getParam("reference");
+ if (buffer().insetLabel(label))
+ broken_ = !buffer().activeLabel(label) && active_;
+ else
+ broken_ = active_;
return tooltip_.empty() ? screenLabel() : tooltip_;
}