]> git.lyx.org Git - lyx.git/commitdiff
XHTML output for lists of figures, tables, etc.
authorRichard Heck <rgheck@comcast.net>
Fri, 1 Jan 2010 02:41:26 +0000 (02:41 +0000)
committerRichard Heck <rgheck@comcast.net>
Fri, 1 Jan 2010 02:41:26 +0000 (02:41 +0000)
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
src/insets/InsetFloatList.h

index a62d02053be3cc1cde74ea282f8eb6b2e22d016c..23796fcf7d966785683b14b7103e8d2149295384 100644 (file)
@@ -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() << "&seArr;"
+                  << EndTag("a");
+               xs << EndTag("div");
+       }
+       xs << EndTag("div");
+       return ods.str();
+}
+
+
 void InsetFloatList::validate(LaTeXFeatures & features) const
 {
        features.useFloat(to_ascii(getParam("type")));
index 6cb03196f60b47633ecae2fb8e82275b0362fba4..3d9e444a1c2cf6faa75bd4d9bf7f37abaf1ad109 100644 (file)
@@ -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: