From 492663987948a391361c324336454bf6733a23b2 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Fri, 1 Jan 2010 02:41:26 +0000 Subject: [PATCH] XHTML output for lists of figures, tables, etc. Thanks to Abdel for making this so easy. I'm just stealing the TOCs on the sidebar. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@32734 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/insets/InsetFloatList.cpp | 90 +++++++++++++++++++++++++++++++++++ src/insets/InsetFloatList.h | 4 +- 2 files changed, 93 insertions(+), 1 deletion(-) diff --git a/src/insets/InsetFloatList.cpp b/src/insets/InsetFloatList.cpp index a62d02053b..23796fcf7d 100644 --- a/src/insets/InsetFloatList.cpp +++ b/src/insets/InsetFloatList.cpp @@ -21,6 +21,8 @@ #include "LaTeXFeatures.h" #include "Lexer.h" #include "MetricsInfo.h" +#include "Paragraph.h" +#include "output_xhtml.h" #include "TextClass.h" #include "TocBackend.h" @@ -150,6 +152,94 @@ int InsetFloatList::plaintext(odocstream & os, OutputParams const &) const } +docstring InsetFloatList::xhtml(XHTMLStream &, OutputParams const &) 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; + if (cit->second.builtin()) { + // Only two different types allowed here: + string const type = cit->second.type(); + if (type == "table") { + toctype = "table"; + toclabel = _("List of Tables"); + } else if (type == "figure") { + toctype = "figure"; + toclabel = _("List of Figures"); + } else { + LYXERR0("Unknown Builtin Float!"); + return docstring(); + } + } else { + toctype = to_utf8(getParam("type")); + toclabel = buffer().B_(cit->second.listName()); + } + + // FIXME Do we need to check if it exists? If so, we need a new + // routine in TocBackend to do that. + 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); + + xs << StartTag("div", "class='toc'"); + xs << StartTag("div", tocattr) + << toclabel + << EndTag("div"); + + Toc::const_iterator it = toc.begin(); + Toc::const_iterator const en = toc.end(); + for (; it != en; ++it) { + Paragraph const & par = it->dit().innerParagraph(); + string const attr = "class='lyxtoc-" + toctype + "'"; + Font const dummy; + xs << StartTag("div", attr); + string const parattr = "href='#" + par.magicLabel() + "' class='tocarrow'"; + xs << it->str() << " " + << StartTag("a", parattr) + // FIXME XHTML + // There ought to be a simple way to customize this. + << XHTMLStream::NextRaw() << "⇘" + << EndTag("a"); + xs << EndTag("div"); + } + xs << EndTag("div"); + return ods.str(); +} + + void InsetFloatList::validate(LaTeXFeatures & features) const { features.useFloat(to_ascii(getParam("type"))); diff --git a/src/insets/InsetFloatList.h b/src/insets/InsetFloatList.h index 6cb03196f6..3d9e444a1c 100644 --- a/src/insets/InsetFloatList.h +++ b/src/insets/InsetFloatList.h @@ -43,11 +43,13 @@ public: /// int plaintext(odocstream &, OutputParams const & runparams) const; /// + docstring xhtml(XHTMLStream &, OutputParams const &) const; + /// void validate(LaTeXFeatures & features) const; /// static ParamInfo const & findInfo(std::string const &); /// - static std::string defaultCommand() { return "listoftables"; }; + static std::string defaultCommand() { return "listoftables"; } /// static bool isCompatibleCommand(std::string const & s); private: -- 2.39.2