X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Finsets%2FInsetNomencl.cpp;h=f7f740aa6f4673fbde19818cee36ff27f2141c11;hb=c9d9309c1ecffa218dee04ce4f7991ed4fc0c9bb;hp=57f38647d0d845ded7a2b7f25b962dc70abd7054;hpb=6d41db574d47e6429fa1a27a68e76ad6254d7033;p=lyx.git diff --git a/src/insets/InsetNomencl.cpp b/src/insets/InsetNomencl.cpp index 57f38647d0..f7f740aa6f 100644 --- a/src/insets/InsetNomencl.cpp +++ b/src/insets/InsetNomencl.cpp @@ -16,6 +16,7 @@ #include "InsetNote.h" #include "Buffer.h" +#include "Cursor.h" #include "DispatchResult.h" #include "Font.h" #include "Encoding.h" @@ -23,15 +24,18 @@ #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 "TocBackend.h" #include "frontends/FontMetrics.h" +#include "support/debug.h" #include "support/docstream.h" #include "support/gettext.h" #include "support/lstrings.h" @@ -49,7 +53,7 @@ namespace lyx { ///////////////////////////////////////////////////////////////////// InsetNomencl::InsetNomencl(Buffer * buf, InsetCommandParams const & p) - : InsetCommand(buf, p, "nomenclature"), + : InsetCommand(buf, p), nomenclature_entry_id(sgml::uniqueID(from_ascii("nomen"))) {} @@ -128,6 +132,13 @@ void InsetNomencl::validate(LaTeXFeatures & features) const } +void InsetNomencl::addToToc(DocIterator const & cpit, bool output_active) const +{ + docstring const str = getParam("symbol"); + buffer().tocBackend().toc("nomencl").push_back(TocItem(cpit, 0, str, output_active)); +} + + ///////////////////////////////////////////////////////////////////// // // InsetPrintNomencl @@ -135,7 +146,7 @@ void InsetNomencl::validate(LaTeXFeatures & features) const ///////////////////////////////////////////////////////////////////// InsetPrintNomencl::InsetPrintNomencl(Buffer * buf, InsetCommandParams const & p) - : InsetCommand(buf, p, "nomencl_print") + : InsetCommand(buf, p) {} @@ -162,19 +173,110 @@ docstring InsetPrintNomencl::screenLabel() const } +struct NomenclEntry { + NomenclEntry() {} + 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 +{ + Toc const & 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; } @@ -189,7 +291,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: @@ -202,12 +304,8 @@ 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 { os << "\n"; @@ -272,28 +370,20 @@ docstring nomenclWidest(Buffer const & buffer, OutputParams const & runparams) return symb; // we have to encode the string properly - docstring latex_symb; - for (size_t n = 0; n < symb.size(); ++n) { - try { - latex_symb += runparams.encoding->latexChar(symb[n]); - } catch (EncodingException & /* e */) { - if (runparams.dryrun) { - latex_symb += "<" + _("LyX Warning: ") - + _("uncodable character") + " '"; - latex_symb += docstring(1, symb[n]); - latex_symb += "'>"; - } - } - } - return latex_symb; + pair latex_symb = + runparams.encoding->latexString(symb, runparams.dryrun); + if (!latex_symb.second.empty()) + LYXERR0("Omitting uncodable characters '" + << latex_symb.second + << "' in nomencl widest string!"); + return latex_symb.first; } } // namespace anon -int InsetPrintNomencl::latex(odocstream & os, OutputParams const & runparams_in) const +void InsetPrintNomencl::latex(otexstream & os, OutputParams const & runparams_in) const { OutputParams runparams = runparams_in; - int lines = 0; if (getParam("set_width") == "auto") { docstring widest = nomenclWidest(buffer(), runparams); // Set the label width via nomencl's command \nomlabelwidth. @@ -302,7 +392,6 @@ int InsetPrintNomencl::latex(odocstream & os, OutputParams const & runparams_in) os << "\\settowidth{\\nomlabelwidth}{" << widest << "}\n"; - ++lines; } } else if (getParam("set_width") == "custom") { // custom length as optional arg of \printnomenclature @@ -313,11 +402,10 @@ int InsetPrintNomencl::latex(odocstream & os, OutputParams const & runparams_in) << '[' << from_ascii(width) << "]{}"; - return lines; + return; } // output the command \printnomenclature os << getCommand(runparams); - return lines; } @@ -333,9 +421,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"; }