X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetNomencl.cpp;h=880f0fff52aec86df97c015b3ef9995e00c6af15;hb=83f214d636bff1c7eee6b99eb3293f064591429a;hp=d73b701f2929dab14b57304b3fdf2cedbb38f0d3;hpb=e9cbe2f80f766d3a31891840915e2dc311ac516d;p=lyx.git diff --git a/src/insets/InsetNomencl.cpp b/src/insets/InsetNomencl.cpp index d73b701f29..880f0fff52 100644 --- a/src/insets/InsetNomencl.cpp +++ b/src/insets/InsetNomencl.cpp @@ -16,19 +16,27 @@ #include "InsetNote.h" #include "Buffer.h" +#include "Cursor.h" #include "DispatchResult.h" #include "Font.h" +#include "Encoding.h" #include "FuncRequest.h" #include "FuncStatus.h" #include "InsetIterator.h" #include "InsetList.h" +#include "Language.h" #include "LaTeXFeatures.h" #include "Length.h" -#include "MetricsInfo.h" +#include "LyX.h" +#include "OutputParams.h" +#include "output_xhtml.h" #include "sgml.h" +#include "texstream.h" +#include "TocBackend.h" #include "frontends/FontMetrics.h" +#include "support/debug.h" #include "support/docstream.h" #include "support/gettext.h" #include "support/lstrings.h" @@ -45,8 +53,8 @@ namespace lyx { // ///////////////////////////////////////////////////////////////////// -InsetNomencl::InsetNomencl(InsetCommandParams const & p) - : InsetCommand(p, "nomenclature"), +InsetNomencl::InsetNomencl(Buffer * buf, InsetCommandParams const & p) + : InsetCommand(buf, p), nomenclature_entry_id(sgml::uniqueID(from_ascii("nomen"))) {} @@ -56,8 +64,13 @@ ParamInfo const & InsetNomencl::findInfo(string const & /* cmdName */) static ParamInfo param_info_; if (param_info_.empty()) { param_info_.add("prefix", ParamInfo::LATEX_OPTIONAL); - param_info_.add("symbol", ParamInfo::LATEX_REQUIRED); - param_info_.add("description", ParamInfo::LATEX_REQUIRED); + param_info_.add("symbol", ParamInfo::LATEX_REQUIRED, + ParamInfo::ParamHandling(ParamInfo::HANDLING_LATEXIFY + | ParamInfo::HANDLING_INDEX_ESCAPE)); + param_info_.add("description", ParamInfo::LATEX_REQUIRED, + ParamInfo::ParamHandling(ParamInfo::HANDLING_LATEXIFY + | ParamInfo::HANDLING_INDEX_ESCAPE)); + param_info_.add("literal", ParamInfo::LYX_INTERNAL); } return param_info_; } @@ -66,12 +79,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; } @@ -87,6 +96,14 @@ docstring InsetNomencl::toolTip(BufferView const & /*bv*/, int /*x*/, int /*y*/) } +int InsetNomencl::plaintext(odocstringstream & os, + OutputParams const &, size_t) const +{ + docstring s = "[" + getParam("symbol") + ": " + getParam("description") + "]"; + os << s; + return s.size(); +} + int InsetNomencl::docbook(odocstream & os, OutputParams const &) const { @@ -97,6 +114,12 @@ int InsetNomencl::docbook(odocstream & os, OutputParams const &) const } +docstring InsetNomencl::xhtml(XHTMLStream &, OutputParams const &) const +{ + return docstring(); +} + + int InsetNomencl::docbookGlossary(odocstream & os) const { os << "\n" @@ -114,6 +137,17 @@ int InsetNomencl::docbookGlossary(odocstream & os) const void InsetNomencl::validate(LaTeXFeatures & features) const { features.require("nomencl"); + InsetCommand::validate(features); +} + + +void InsetNomencl::addToToc(DocIterator const & cpit, bool output_active, + UpdateType, TocBackend & backend) const +{ + docstring const str = getParam("symbol"); + TocBuilder & b = backend.builder("nomencl"); + b.pushItem(cpit, str, output_active); + b.pop(); } @@ -123,14 +157,14 @@ void InsetNomencl::validate(LaTeXFeatures & features) const // ///////////////////////////////////////////////////////////////////// -InsetPrintNomencl::InsetPrintNomencl(InsetCommandParams const & p) - : InsetCommand(p, "nomencl_print") +InsetPrintNomencl::InsetPrintNomencl(Buffer * buf, InsetCommandParams const & p) + : InsetCommand(buf, p) {} ParamInfo const & InsetPrintNomencl::findInfo(string const & /* cmdName */) { - // The symbol width is set via nomencl's \nomlabelwidth in + // The symbol width is set via nomencl's \nomlabelwidth in // InsetPrintNomencl::latex and not as optional parameter of // \printnomenclature static ParamInfo param_info_; @@ -151,19 +185,110 @@ 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) { + switch (cmd.action()) { case LFUN_INSET_MODIFY: { InsetCommandParams p(NOMENCL_PRINT_CODE); // FIXME UNICODE - InsetCommand::string2params("nomencl_print", - to_utf8(cmd.argument()), p); + InsetCommand::string2params(to_utf8(cmd.argument()), p); if (p.getCmdName().empty()) { - cur.noUpdate(); + cur.noScreenUpdate(); break; } + + cur.recordUndo(); setParams(p); break; } @@ -178,7 +303,7 @@ void InsetPrintNomencl::doDispatch(Cursor & cur, FuncRequest & cmd) bool InsetPrintNomencl::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { - switch (cmd.action) { + switch (cmd.action()) { case LFUN_INSET_DIALOG_UPDATE: case LFUN_INSET_MODIFY: @@ -191,7 +316,8 @@ bool InsetPrintNomencl::getStatus(Cursor & cur, FuncRequest const & cmd, } - +// 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 { os << "\n"; @@ -217,7 +343,7 @@ int InsetPrintNomencl::docbook(odocstream & os, OutputParams const &) const namespace { -docstring nomenclWidest(Buffer const & buffer) +docstring nomenclWidest(Buffer const & buffer, OutputParams const & runparams) { // nomenclWidest() determines and returns the widest used // nomenclature symbol in the document @@ -238,12 +364,16 @@ docstring nomenclWidest(Buffer const & buffer) if (inset->lyxCode() != NOMENCL_CODE) continue; nomencl = static_cast(inset); - docstring const symbol = - nomencl->getParam("symbol"); + // Use proper formatting. We do not escape makeindex chars here + docstring const symbol = nomencl ? + nomencl->params().prepareCommand(runparams, nomencl->getParam("symbol"), + ParamInfo::HANDLING_LATEXIFY) + : docstring(); // This is only an approximation, // but the best we can get. - int const wx = - theFontMetrics(Font()).width(symbol); + int const wx = use_gui ? + theFontMetrics(Font()).width(symbol) : + symbol.size(); if (wx > w) { w = wx; symb = symbol; @@ -253,29 +383,20 @@ docstring nomenclWidest(Buffer const & buffer) // return the widest (or an empty) string return symb; } -} +} // namespace -int InsetPrintNomencl::latex(odocstream & os, OutputParams const &) const +void InsetPrintNomencl::latex(otexstream & os, OutputParams const & runparams_in) const { - int lines = 0; + OutputParams runparams = runparams_in; if (getParam("set_width") == "auto") { - docstring widest = nomenclWidest(buffer()); - // set the label width via nomencl's command - // \nomlabelwidth. This must be output before the command - // \printnomenclature + docstring widest = nomenclWidest(buffer(), runparams); + // Set the label width via nomencl's command \nomlabelwidth. + // This must be output before the command \printnomenclature if (!widest.empty()) { - // assure that the width is never below the - // predefined value of 1 cm - // FIXME: Why this? os << "\\settowidth{\\nomlabelwidth}{" << widest << "}\n"; - os << "\\ifthenelse{%\n"; - os << "\\lengthtest{\\nomlabelwidth < 1cm}}\n"; - os << " {\\setlength{\\nomlabelwidth}{1cm}}\n"; - os << " {}\n"; - lines += 5; } } else if (getParam("set_width") == "custom") { // custom length as optional arg of \printnomenclature @@ -285,20 +406,19 @@ int InsetPrintNomencl::latex(odocstream & os, OutputParams const &) const << from_ascii(getCmdName()) << '[' << from_ascii(width) - << "]{}"; - return lines; + << "]" + << termcmd; + return; } // output the command \printnomenclature - os << getCommand(); - return lines; + os << getCommand(runparams); } void InsetPrintNomencl::validate(LaTeXFeatures & features) const { + features.useInsetLayout(getLayout()); features.require("nomencl"); - // needed for InsetPrintNomencl::latex - features.require("ifthen"); } @@ -308,9 +428,9 @@ InsetCode InsetPrintNomencl::lyxCode() const } -docstring InsetPrintNomencl::contextMenu(BufferView const &, int, int) const +string InsetPrintNomencl::contextMenuName() const { - return from_ascii("context-nomenclprint"); + return "context-nomenclprint"; }