X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetNomencl.cpp;h=2595b14a6992b35f04797aae1888718bbc58b53d;hb=860accd01fb8115ec7c6ad80b054f1046e19c62f;hp=6a02271612041c353808b44f54e6bac8ecf8491e;hpb=410c716bf703dae98c2064d555b9e2b7678555ee;p=lyx.git diff --git a/src/insets/InsetNomencl.cpp b/src/insets/InsetNomencl.cpp index 6a02271612..2595b14a69 100644 --- a/src/insets/InsetNomencl.cpp +++ b/src/insets/InsetNomencl.cpp @@ -24,12 +24,14 @@ #include "FuncStatus.h" #include "InsetIterator.h" #include "InsetList.h" +#include "Language.h" #include "LaTeXFeatures.h" #include "Length.h" #include "LyX.h" #include "OutputParams.h" #include "output_xhtml.h" #include "sgml.h" +#include "texstream.h" #include "TocBackend.h" #include "frontends/FontMetrics.h" @@ -74,12 +76,8 @@ ParamInfo const & InsetNomencl::findInfo(string const & /* cmdName */) docstring InsetNomencl::screenLabel() const { size_t const maxLabelChars = 25; - docstring label = _("Nom: ") + getParam("symbol"); - if (label.size() > maxLabelChars) { - label.erase(maxLabelChars - 3); - label += "..."; - } + support::truncateWithEllipsis(label, maxLabelChars); return label; } @@ -131,10 +129,11 @@ void InsetNomencl::validate(LaTeXFeatures & features) const } -void InsetNomencl::addToToc(DocIterator const & cpit, bool output_active) const +void InsetNomencl::addToToc(DocIterator const & cpit, bool output_active, + UpdateType) const { docstring const str = getParam("symbol"); - buffer().tocBackend().toc("nomencl").push_back(TocItem(cpit, 0, str, output_active)); + buffer().tocBackend().toc("nomencl")->push_back(TocItem(cpit, 0, str, output_active)); } @@ -172,6 +171,96 @@ docstring InsetPrintNomencl::screenLabel() const } +struct NomenclEntry { + NomenclEntry() : par(0) {} + NomenclEntry(docstring s, docstring d, Paragraph const * p) + : symbol(s), desc(d), par(p) + {} + + docstring symbol; + docstring desc; + Paragraph const * par; +}; + + +typedef map EntryMap; + + +docstring InsetPrintNomencl::xhtml(XHTMLStream &, OutputParams const & op) const +{ + shared_ptr toc = buffer().tocBackend().toc("nomencl"); + + EntryMap entries; + Toc::const_iterator it = toc->begin(); + Toc::const_iterator const en = toc->end(); + for (; it != en; ++it) { + DocIterator dit = it->dit(); + Paragraph const & par = dit.innerParagraph(); + Inset const * inset = par.getInset(dit.top().pos()); + if (!inset) + return docstring(); + InsetCommand const * ic = inset->asInsetCommand(); + if (!ic) + return docstring(); + + // FIXME We need a link to the paragraph here, so we + // need some kind of struct. + docstring const symbol = ic->getParam("symbol"); + docstring const desc = ic->getParam("description"); + docstring const prefix = ic->getParam("prefix"); + docstring const sortas = prefix.empty() ? symbol : prefix; + + entries[sortas] = NomenclEntry(symbol, desc, &par); + } + + if (entries.empty()) + return docstring(); + + // 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(); + docstring toclabel = translateIfPossible(from_ascii("Nomenclature"), + op.local_font->language()->lang()); + + xs << html::StartTag("div", "class='nomencl'") + << html::StartTag(tag, "class='nomencl'") + << toclabel + << html::EndTag(tag) + << html::CR() + << html::StartTag("dl") + << html::CR(); + + EntryMap::const_iterator eit = entries.begin(); + EntryMap::const_iterator const een = entries.end(); + for (; eit != een; ++eit) { + NomenclEntry const & ne = eit->second; + string const parid = ne.par->magicLabel(); + xs << html::StartTag("dt") + << html::StartTag("a", "href='#" + parid + "' class='nomencl'") + << ne.symbol + << html::EndTag("a") + << html::EndTag("dt") + << html::CR() + << html::StartTag("dd") + << ne.desc + << html::EndTag("dd") + << html::CR(); + } + + xs << html::EndTag("dl") + << html::CR() + << html::EndTag("div") + << html::CR(); + + return ods.str(); +} + + void InsetPrintNomencl::doDispatch(Cursor & cur, FuncRequest & cmd) { switch (cmd.action()) { @@ -213,12 +302,6 @@ bool InsetPrintNomencl::getStatus(Cursor & cur, FuncRequest const & cmd, } -docstring InsetPrintNomencl::xhtml(XHTMLStream &, OutputParams const &) const -{ - return docstring(); -} - - // FIXME This should be changed to use the TOC. Perhaps // that could be done when XHTML output is added. int InsetPrintNomencl::docbook(odocstream & os, OutputParams const &) const