Ozgur Ugras BARAN wrote:

Hi Ugras,

> Attached is <ugly>patch</ugly> for docbook glossaries export. Missing
> features are:
> 
> - glossary entries in insets does not appear in glossary. I couldn't
> find a "chic" way to include those.. (the current one is not so chic
> anyway.. ) Any ideas??

Yes, see patch.

> - prefix is not working, therefore, you cannot change the sorting.
> (any idea how to do it?)

No. I ignored that for now.

> - possible performance problems. (not tested)

I took your idea and pushed it a bit further. You do not need to go through
the paragraph list of the buffer, we have a nice insetiterator that you can
use directly, and that will go in nested insets.
Then you forgot to create a reference to the glossary entry. I did that (and
fixed the return value of the docbook() methods - they return the number of
newlines).
I am going to commit the attached now.


Georg
Index: src/insets/insetnomencl.h
===================================================================
--- src/insets/insetnomencl.h	(Revision 15837)
+++ src/insets/insetnomencl.h	(Arbeitskopie)
@@ -38,10 +38,14 @@ public:
 	///
 	int docbook(Buffer const &, odocstream &,
 		    OutputParams const &) const;
+	///
+	int docbookGlossary(odocstream &) const;
 private:
 	virtual std::auto_ptr<InsetBase> doClone() const {
 		return std::auto_ptr<InsetBase>(new InsetNomencl(params()));
 	}
+	/// unique id for this glossary entry for docbook export
+	docstring glossary_entry_id;
 };
 
 
Index: src/insets/insetnomencl.C
===================================================================
--- src/insets/insetnomencl.C	(Revision 15837)
+++ src/insets/insetnomencl.C	(Arbeitskopie)
@@ -11,10 +11,13 @@
 #include <config.h>
 
 #include "insetnomencl.h"
+#include "insetnote.h"
 
+#include "buffer.h"
 #include "dispatchresult.h"
 #include "funcrequest.h"
 #include "gettext.h"
+#include "insetiterator.h"
 #include "LaTeXFeatures.h"
 #include "metricsinfo.h"
 #include "sgml.h"
@@ -26,7 +29,8 @@ using std::string;
 
 
 InsetNomencl::InsetNomencl(InsetCommandParams const & p)
-	: InsetCommand(p, "nomenclature")
+	: glossary_entry_id(sgml::uniqueID(from_ascii("gloss"))),
+	  InsetCommand(p, "nomenclature")
 {}
 
 
@@ -36,22 +40,30 @@ docstring const InsetNomencl::getScreenL
 }
 
 
-int InsetNomencl::docbook(Buffer const &, odocstream & os,
-			OutputParams const &) const
+int InsetNomencl::docbook(Buffer const & buf, odocstream & os,
+		OutputParams const & params) const
 {
-	// FIXME: This does not work, because the entry needs to be put
-	// in the glossary.
-#if 0
-	os << "<glossentry><glossterm>"
+	os << "<glossterm linkend=\"" << glossary_entry_id << "\">"
 	   << sgml::escapeString(getParam("symbol"))
-	   << "</glossterm><glossdef><para>"
-	   << sgml::escapeString(getParam("description"))
-	   << "</para></glossdef></glossentry>";
-#endif
+	   << "</glossterm>";
 	return 0;
 }
 
 
+int InsetNomencl::docbookGlossary(odocstream & os) const
+{
+	os << "<glossentry id=\"" << glossary_entry_id << "\">\n"
+	   << "<glossterm>"
+	   << sgml::escapeString(getParam("symbol"))
+	   << "</glossterm>\n"
+	   << "<glossdef><para>"
+	   << sgml::escapeString(getParam("description"))
+	   << "</para></glossdef>\n"
+	   <<"</glossentry>\n";
+	return 4;
+}
+
+
 void InsetNomencl::validate(LaTeXFeatures & features) const
 {
 	features.require("nomencl");
@@ -75,12 +87,28 @@ docstring const InsetPrintNomencl::getSc
 }
 
 
-int InsetPrintNomencl::docbook(Buffer const &, odocstream & os,
-		OutputParams const &) const
+int InsetPrintNomencl::docbook(Buffer const & buf, odocstream & os,
+		OutputParams const & params) const
 {
-	// FIXME This does not work, we need to define the entries here.
-	//os << "<glossary><glossary/>";
-	return 0;
+	os << "<glossary>\n";
+	int newlines = 2;
+	for (InsetIterator it = inset_iterator_begin(buf.inset()); it;) {
+		if (it->lyxCode() == InsetBase::NOMENCL_CODE) {
+			newlines += static_cast<InsetNomencl const &>(*it).docbookGlossary(os);
+			++it;
+		} else if(it->lyxCode() == InsetBase::NOTE_CODE &&
+		          static_cast<InsetNote const &>(*it).params().type == InsetNoteParams::Note) {
+			// Don't output anything nested in note insets
+			size_t const depth = it.depth();
+			++it;
+			while (it.depth() > depth)
+				++it;
+		} else {
+			++it;
+		}
+	}
+	os << "</glossary>\n";
+	return newlines;
 }
 
 

Reply via email to