+docstring InsetFloatList::xhtml(XHTMLStream &, OutputParams const & op) const {
+ FloatList const & floats = buffer().params().documentClass().floats();
+ FloatList::const_iterator cit = floats[to_ascii(getParam("type"))];
+
+ if (cit == floats.end()) {
+ LYXERR0("Unknown float type `" << getParam("type") << "' in IFL::xhtml.");
+ return docstring();
+ }
+
+ string toctype;
+ docstring toclabel;
+ // FIXME
+ // Other builtin floats should be handled here. But I'm not sure if that is
+ // even possible yet, since I'm not sure if we have a TOC for such things.
+ // If so, then they should define ListName, as non-builtin floats do, and
+ // then we can use that.
+ // Really, all floats should define that.
+ if (cit->second.isPredefined()) {
+ // Only two different types allowed here:
+ string const type = cit->second.floattype();
+ if (type == "table") {
+ toctype = "table";
+ toclabel = translateIfPossible(from_ascii("List of Tables"),
+ op.local_font->language()->lang());
+ } else if (type == "figure") {
+ toctype = "figure";
+ toclabel = translateIfPossible(from_ascii("List of Figures"),
+ op.local_font->language()->lang());
+ } else {
+ LYXERR0("Unknown Builtin Float!");
+ return docstring();
+ }
+ } else {
+ toctype = to_utf8(getParam("type"));
+ toclabel = translateIfPossible(from_utf8(cit->second.listName()),
+ op.local_font->language()->lang());
+ }
+
+ shared_ptr<Toc const> toc = buffer().tocBackend().toc(toctype);
+ if (toc->empty())
+ return docstring();
+
+ // we want to look like a chapter, section, or whatever.
+ // so we're going to look for the layout with the minimum toclevel
+ // number > 0---because we don't want Part.
+ // we'll take the first one, just because.
+ // FIXME This could be specified in the layout file.
+ DocumentClass const & dc = buffer().params().documentClass();
+ TextClass::LayoutList::const_iterator lit = dc.begin();
+ TextClass::LayoutList::const_iterator len = dc.end();
+ int minlevel = 1000;
+ Layout const * lay = NULL;
+ for (; lit != len; ++lit) {
+ int const level = lit->toclevel;
+ if (level > 0 && (level == Layout::NOT_IN_TOC || level >= minlevel))
+ continue;
+ lay = &*lit;
+ minlevel = level;
+ }
+
+ string const tocclass = lay ? " " + lay->defaultCSSClass(): "";
+ string const tocattr = "class='tochead toc-" + toctype + 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);
+
+ InsetLayout const & il = getLayout();
+ string const & tag = il.htmltag();
+ xs << html::StartTag("div", "class='toc toc-floats'");
+ xs << html::StartTag(tag, tocattr)
+ << toclabel
+ << html::EndTag(tag);
+
+ Toc::const_iterator it = toc->begin();
+ Toc::const_iterator const en = toc->end();
+ for (; it != en; ++it) {
+ if (it->str().empty())
+ continue;
+ Paragraph const & par = it->dit().innerParagraph();
+ string const attr = "class='lyxtoc-floats lyxtoc-" + toctype + "'";
+ xs << html::StartTag("div", attr);
+ string const parattr = "href='#" + par.magicLabel() + "' class='lyxtoc-floats'";
+ xs << html::StartTag("a", parattr)
+ << it->str()
+ << html::EndTag("a");
+ xs << html::EndTag("div");
+ }
+ xs << html::EndTag("div");
+ return ods.str();
+}
+
+