[LyX/master] DocBook: in bibliographies, fix support for editors.

Thibaut Cuvelier tcuvelier at lyx.org
Mon Feb 26 15:10:01 UTC 2024


commit 2be72a1534af143bda34b382189198667c10136b
Author: Thibaut Cuvelier <tcuvelier at lyx.org>
Date:   Mon Feb 26 15:50:12 2024 +0100

    DocBook: in bibliographies, fix support for editors.
    
    Also, add TODOs for similar problems lurking around.
---
 autotests/export/docbook/basic.xml | 57 +++++++++++++++++++-------------------
 src/insets/InsetBibtex.cpp         | 38 ++++++++++++++++++++++++-
 2 files changed, 65 insertions(+), 30 deletions(-)

diff --git a/autotests/export/docbook/basic.xml b/autotests/export/docbook/basic.xml
index b589ee63b9..87c951f359 100644
--- a/autotests/export/docbook/basic.xml
+++ b/autotests/export/docbook/basic.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!-- This DocBook file was created by LyX 2.4.0dev
   See https://www.lyx.org/ for more information -->
-<article xml:lang="en_US" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2">
+<article xml:lang="en-US" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:m="http://www.w3.org/1998/Math/MathML" xmlns:xi="http://www.w3.org/2001/XInclude" version="5.2">
 <info>
 <title>I am a title</title>
 <author>
@@ -24,43 +24,39 @@
 <m:math display="inline">
  
 <m:mrow>
- <m:mrow>
-  <m:mspace width="6px"/>
-  <m:mi>w</m:mi>
-  <m:mi>i</m:mi>
-  <m:mi>t</m:mi>
-  <m:mi>h</m:mi>
-  <m:mspace width="6px"/>
-  <m:mi>a</m:mi>
-  <m:mspace width="6px"/>
-  <m:mi>f</m:mi>
-  <m:mi>o</m:mi>
-  <m:mi>r</m:mi>
-  <m:mi>m</m:mi>
-  <m:mi>u</m:mi>
-  <m:mi>l</m:mi>
-  <m:mi>a</m:mi>
- </m:mrow>
+ <m:mspace width="6px"/>
+ <m:mi>w</m:mi>
+ <m:mi>i</m:mi>
+ <m:mi>t</m:mi>
+ <m:mi>h</m:mi>
+ <m:mspace width="6px"/>
+ <m:mi>a</m:mi>
+ <m:mspace width="6px"/>
+ <m:mi>f</m:mi>
+ <m:mi>o</m:mi>
+ <m:mi>r</m:mi>
+ <m:mi>m</m:mi>
+ <m:mi>u</m:mi>
+ <m:mi>l</m:mi>
+ <m:mi>a</m:mi>
 </m:mrow>
 </m:math>
 </inlineequation>. </para>
 </blockquote>
-<para>Now, we're outside quotes.</para>
+<para>Now, we’re outside quotes.</para>
 <informalequation>
 <alt role='tex'>Formula!</alt>
 <m:math display="block">
  
 <m:mrow>
- <m:mrow>
-  <m:mi>F</m:mi>
-  <m:mi>o</m:mi>
-  <m:mi>r</m:mi>
-  <m:mi>m</m:mi>
-  <m:mi>u</m:mi>
-  <m:mi>l</m:mi>
-  <m:mi>a</m:mi>
-  <m:mo>!</m:mo>
- </m:mrow>
+ <m:mi>F</m:mi>
+ <m:mi>o</m:mi>
+ <m:mi>r</m:mi>
+ <m:mi>m</m:mi>
+ <m:mi>u</m:mi>
+ <m:mi>l</m:mi>
+ <m:mi>a</m:mi>
+ <m:mo>!</m:mo>
 </m:mrow>
 </m:math>
 </informalequation>
@@ -420,6 +416,9 @@ I am no more code. </para>
 </personname>
 </author>
 </authorgroup>
+<editor>
+<personname>The editor</personname>
+</editor>
 <bibliomisc role="note">An optional note</bibliomisc>
 </biblioentry>
 <biblioentry xml:id="small">
diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp
index b073f619e6..6d38631f81 100644
--- a/src/insets/InsetBibtex.cpp
+++ b/src/insets/InsetBibtex.cpp
@@ -1128,6 +1128,7 @@ void InsetBibtex::docbook(XMLStream & xs, OutputParams const &) const
 	        make_pair("url", "uri")
 	};
 	// Relations between documents.
+	// TODO: some elements should be mutually exclusive; right now, all of them are output.
 	vector<pair<string, string>> relations = { // <bibtex, docbook biblioset relation>
 	        make_pair("journal", "journal"),
 	        make_pair("journaltitle", "journal"),
@@ -1144,9 +1145,11 @@ void InsetBibtex::docbook(XMLStream & xs, OutputParams const &) const
 	toDocBookTag["fullnames:author"] = "SPECIFIC"; // No direct translation to DocBook: <authorgroup>.
 	toDocBookTag["publisher"] = "SPECIFIC"; // No direct translation to DocBook: <publisher>.
 	toDocBookTag["address"] = "SPECIFIC"; // No direct translation to DocBook: <publisher>.
-	toDocBookTag["editor"] = "editor";
+	toDocBookTag["editor"] = "SPECIFIC";  // No direct translation to DocBook: <editor><personname/orgname>.
+	toDocBookTag["fullbynames:editor"] = "SPECIFIC";  // No direct translation to DocBook: <editor><personname/orgname>.
 	toDocBookTag["institution"] = "SPECIFIC"; // No direct translation to DocBook: <org>.
 
+	// TODO: some elements should be mutually exclusive; right now, all of them are output.
 	toDocBookTag["title"] = "title";
 	toDocBookTag["fulltitle"] = "title";
 	toDocBookTag["quotetitle"] = "title";
@@ -1159,6 +1162,7 @@ void InsetBibtex::docbook(XMLStream & xs, OutputParams const &) const
 	toDocBookTag["year"] = "SPECIFIC"; // No direct translation to DocBook: <pubdate>.
 	toDocBookTag["month"] = "SPECIFIC"; // No direct translation to DocBook: <pubdate>.
 
+	// TODO: some elements should be mutually exclusive; right now, all of them are output.
 	toDocBookTag["journal"] = "SPECIFIC"; // No direct translation to DocBook: <biblioset>.
 	toDocBookTag["journaltitle"] = "SPECIFIC"; // No direct translation to DocBook: <biblioset>.
 	toDocBookTag["fulljournaltitle"] = "SPECIFIC"; // No direct translation to DocBook: <biblioset>.
@@ -1359,6 +1363,38 @@ void InsetBibtex::docbook(XMLStream & xs, OutputParams const &) const
 				eraseTag("fullnames:author");
 			}
 
+			// <editor>
+			// Example: http://tdg.docbook.org/tdg/5.1/editor.html
+			if (hasTag("editor") || hasTag("fullbynames:editor")) {
+				// If several editor tags are present, only output one.
+				const docstring editorName = getTag(hasTag("editor") ? "editor" : "fullbynames:editor");
+
+				// Arbitrarily decide that the editor is always a person. There is no reliable information in the input
+				// to make the distinction between a person (<personname>) and an organisation (<orgname>).
+				xs << xml::StartTag("editor");
+				xs << xml::CR();
+				xs << xml::StartTag("personname");
+				xs << editorName;
+				xs << xml::EndTag("personname");
+				xs << xml::CR();
+				xs << xml::EndTag("editor");
+				xs << xml::CR();
+
+				if (hasTag("editor") && hasTag("fullbynames:editor")) {
+					xs << XMLStream::ESCAPE_NONE <<
+							from_utf8("<!-- Several editor tags in the reference. Other editor tag: ") +
+							getTag("fullbynames:editor") + from_utf8(" -->\n");
+				}
+
+				// Erase all editor tags that might be present, even if only one is output.
+				if (hasTag("editor")) {
+					eraseTag("editor");
+				}
+				if (hasTag("fullbynames:editor")) {
+					eraseTag("fullbynames:editor");
+				}
+			}
+
 			// <abstract>
 			if (hasTag("abstract")) {
 				// Split the paragraphs on new line.


More information about the lyx-cvs mailing list