Exemplo n.º 1
0
void InsetTOC::makeTOCWithDepth(XHTMLStream & xs, 
		Toc const & toc, OutputParams const & op) const
{
	Toc::const_iterator it = toc.begin();
	Toc::const_iterator const en = toc.end();
	int lastdepth = 0;
	for (; it != en; ++it) {
		// do not output entries that are not actually included in the output,
		// e.g., stuff in non-active branches or notes or whatever.
		if (!it->isOutput())
			continue;

		// First, we need to manage increases and decreases of depth
		// If there's no depth to deal with, we artifically set it to 1.
		int const depth = it->depth();
		
		// Ignore stuff above the tocdepth
		if (depth > buffer().params().tocdepth)
			continue;
		
		if (depth > lastdepth) {
			xs << html::CR();
			// open as many tags as we need to open to get to this level
			// this includes the tag for the current level
			for (int i = lastdepth + 1; i <= depth; ++i) {
				stringstream attr;
				attr << "class='lyxtoc-" << i << "'";
				xs << html::StartTag("div", attr.str()) << html::CR();
			}
			lastdepth = depth;
		}
		else if (depth < lastdepth) {
			// close as many as we have to close to get back to this level
			// this includes closing the last tag at this level
			for (int i = lastdepth; i >= depth; --i) 
				xs << html::EndTag("div") << html::CR();
			// now open our tag
			stringstream attr;
			attr << "class='lyxtoc-" << depth << "'";
			xs << html::StartTag("div", attr.str()) << html::CR();
			lastdepth = depth;
		} else {
			// no change of level, so close and open
			xs << html::EndTag("div") << html::CR();
			stringstream attr;
			attr << "class='lyxtoc-" << depth << "'";
			xs << html::StartTag("div", attr.str()) << html::CR();
		}
		
		// Now output TOC info for this entry
		Paragraph const & par = it->dit().innerParagraph();
		makeTOCEntry(xs, par, op);
	}
	for (int i = lastdepth; i > 0; --i) 
		xs << html::EndTag("div") << html::CR();
}
Exemplo n.º 2
0
docstring InsetTOC::xhtml(XHTMLStream &, OutputParams const & op) const
{
	Layout const & lay = buffer().params().documentClass().htmlTOCLayout();
	string const & tocclass = lay.defaultCSSClass();
	string const tocattr = "class='tochead " + tocclass + "'";
	
	// we'll use our own stream, because we are going to defer everything.
	// that's how we deal with the fact that we're probably inside a standard
	// paragraph, and we don't want to be.
	odocstringstream ods;
	XHTMLStream xs(ods);

	Toc const & toc = buffer().tocBackend().toc("tableofcontents");
	if (toc.empty())
		return docstring();

	xs << html::StartTag("div", "class='toc'");

	// Title of TOC
	Language const * lang = buffer().params().language;
	static string toctitle = N_("Table of Contents");
	docstring title = lang 
			? translateIfPossible(from_ascii(toctitle), lang->code())
			: translateIfPossible(from_ascii(toctitle));
	xs << html::StartTag("div", tocattr)
		 << title
		 << html::EndTag("div");

	// Output of TOC
	Toc::const_iterator it = toc.begin();
	Toc::const_iterator const en = toc.end();
	int lastdepth = 0;
	for (; it != en; ++it) {
		// First, we need to manage increases and decreases of depth
		int const depth = it->depth();
		
		// Ignore stuff above the tocdepth
		if (depth > buffer().params().tocdepth)
			continue;
		
		if (depth > lastdepth) {
			xs.cr();
			// open as many tags as we need to open to get to this level
			// this includes the tag for the current level
			for (int i = lastdepth + 1; i <= depth; ++i) {
				stringstream attr;
				attr << "class='lyxtoc-" << i << "'";
				xs << html::StartTag("div", attr.str());
			}
			lastdepth = depth;
		}
		else if (depth < lastdepth) {
			// close as many as we have to close to get back to this level
			// this includes closing the last tag at this level
			for (int i = lastdepth; i >= depth; --i) 
				xs << html::EndTag("div");
			// now open our tag
			stringstream attr;
			attr << "class='lyxtoc-" << depth << "'";
			xs << html::StartTag("div", attr.str());
			lastdepth = depth;
		} else {
			// no change of level, so close and open
			xs << html::EndTag("div");
			stringstream attr;
			attr << "class='lyxtoc-" << depth << "'";
			xs << html::StartTag("div", attr.str());
		}
		
		// Now output TOC info for this entry
		Paragraph const & par = it->dit().innerParagraph();
		// First the label, if there is one
		docstring const & label = par.params().labelString();
		if (!label.empty())
			xs << label << " ";
		// Now the content of the TOC entry, taken from the paragraph itself
		OutputParams ours = op;
		ours.for_toc = true;
		Font const dummy;
		par.simpleLyXHTMLOnePar(buffer(), xs, ours, dummy);
		xs << " ";
		// Now a link to that paragraph
		string const parattr = "href='#" + par.magicLabel() + "' class='tocarrow'";
		xs << html::StartTag("a", parattr);
		// FIXME XHTML 
		// There ought to be a simple way to customize this.
		// Maybe if we had an InsetLayout for TOC...
		xs << XHTMLStream::NextRaw() << "&gt;";
		xs << html::EndTag("a");		
	}
	for (int i = lastdepth; i > 0; --i) 
		xs << html::EndTag("div");
	xs << html::EndTag("div");
	return ods.str();
}