commit e3020a6b2d240d0e1ae2aec8dfd754f6cd64dee1 Author: Thibaut Cuvelier <tcuvel...@lyx.org> Date: Fri Mar 1 12:55:40 2024 +0100
DocBook: support bookauthor in bibliographies. --- autotests/export/docbook/basic.bib | 11 +++++++++++ autotests/export/docbook/basic.lyx | 2 +- autotests/export/docbook/basic.xml | 31 +++++++++++++++++++++++++++++-- src/insets/InsetBibtex.cpp | 25 ++++++++++++++++++++++--- 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/autotests/export/docbook/basic.bib b/autotests/export/docbook/basic.bib index 88a9fe7b14..b106326c4d 100644 --- a/autotests/export/docbook/basic.bib +++ b/autotests/export/docbook/basic.bib @@ -107,3 +107,14 @@ volume = {MCMXCVII}, month = 7, note = {An optional note} } + +@incollection{Foucault:Kritik-EN92, + author = {Foucault, Michel}, + title = {What is Critique?}, + bookauthor = {Foucault, Michel}, + booktitle = {The Politics of Truth}, + pages = {41-82}, + publisher = {Semiotext(e)}, + address = {Los Angeles}, + year = {1997} +} diff --git a/autotests/export/docbook/basic.lyx b/autotests/export/docbook/basic.lyx index d1078b9721..83b907fb54 100644 --- a/autotests/export/docbook/basic.lyx +++ b/autotests/export/docbook/basic.lyx @@ -876,7 +876,7 @@ Many things, \begin_inset CommandInset citation LatexCommand cite -key "article,book,booklet,conference,inbook,incollection" +key "article,book,booklet,conference,inbook,incollection,Foucault:Kritik-EN92" literal "false" \end_inset diff --git a/autotests/export/docbook/basic.xml b/autotests/export/docbook/basic.xml index 2248a2cbf4..cafbe46547 100644 --- a/autotests/export/docbook/basic.xml +++ b/autotests/export/docbook/basic.xml @@ -264,7 +264,7 @@ I am no more code. </para> <section> <title>I am the sixth section and I really like bibliographies</title> <para>This text has references. First reference: <biblioref linkend="big" />. Second reference: <biblioref linkend="small" />. Both at the same time: <biblioref linkend="big" />, <biblioref linkend="small" />. A book: <biblioref linkend="Gro60" />. </para> -<para>Many things, just testing for completeness: <biblioref linkend="article" />, <biblioref linkend="book" />, <biblioref linkend="booklet" />, <biblioref linkend="conference" />, <biblioref linkend="inbook" />, <biblioref linkend="incollection" />. </para> +<para>Many things, just testing for completeness: <biblioref linkend="article" />, <biblioref linkend="book" />, <biblioref linkend="booklet" />, <biblioref linkend="conference" />, <biblioref linkend="inbook" />, <biblioref linkend="incollection" />, <biblioref linkend="Foucault.Kritik-EN92" />. </para> </section> <section> <title>I am the seventh section and I deal with indices</title> @@ -358,12 +358,17 @@ I am no more code. </para> </biblioentry> <biblioentry xml:id="inbook"> <title>The title of the work</title> +<volumenum>4</volumenum> +<edition>3</edition> <artpagenums>201-213</artpagenums> <bibliomisc role="type">inbook</bibliomisc> <publisher> <publishername>The name of the publisher</publishername> -</publisher> +<address>The address of the publisher</address></publisher> <pubdate>1993</pubdate> +<biblioset relation="book"> +<title></title> +</biblioset> <authorgroup> <author> <personname> @@ -372,6 +377,7 @@ I am no more code. </para> </personname> </author> </authorgroup> +<bibliomisc role="note">An optional note</bibliomisc> </biblioentry> <biblioentry xml:id="incollection"> <title>The title of the work</title> @@ -399,6 +405,27 @@ I am no more code. </para> </editor> <bibliomisc role="note">An optional note</bibliomisc> </biblioentry> +<biblioentry xml:id="Foucault.Kritik-EN92"> +<title>What is Critique?</title> +<artpagenums>41-82</artpagenums> +<bibliomisc role="type">incollection</bibliomisc> +<publisher> +<publishername>Semiotext(e)</publishername> +<address>Los Angeles</address></publisher> +<pubdate>1997</pubdate> +<biblioset relation="book"> +<title>The Politics of Truth</title> +</biblioset> +<authorgroup> +<author> +<personname> +<firstname>Michel</firstname> +<surname>Foucault</surname> +</personname> +</author> +</authorgroup> +<!-- Several author tags in the reference. Other editor tag: fullbynames:bookauthor. Corresponding value: Michel Foucault --> +</biblioentry> <biblioentry xml:id="small"> <title>A small paper</title> <volumenum>-1</volumenum> diff --git a/src/insets/InsetBibtex.cpp b/src/insets/InsetBibtex.cpp index 2e6f7f7fb7..b4bf535014 100644 --- a/src/insets/InsetBibtex.cpp +++ b/src/insets/InsetBibtex.cpp @@ -1142,6 +1142,7 @@ void InsetBibtex::docbook(XMLStream & xs, OutputParams const &) const // Store the mapping between BibTeX and DocBook. map<string, string> toDocBookTag; toDocBookTag["fullnames:author"] = "SPECIFIC"; // No direct translation to DocBook: <authorgroup>. + toDocBookTag["fullbynames:bookauthor"] = "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"] = "SPECIFIC"; // No direct translation to DocBook: <editor><personname/orgname>. @@ -1401,11 +1402,29 @@ void InsetBibtex::docbook(XMLStream & xs, OutputParams const &) const // <authorgroup> // Example: http://tdg.docbook.org/tdg/5.1/authorgroup.html - if (hasTag("fullnames:author")) { + if (hasTag("fullnames:author") || hasTag("fullbynames:bookauthor")) { + // If several author tags are present, only output one. + const docstring authorName = getTag( + hasTag("fullnames:author") ? "fullnames:author" : "fullbynames:bookauthor"); + // Perform full parsing of the BibTeX string, dealing with the many corner cases that might // be encountered. - authorsToDocBookAuthorGroup(getTag("fullnames:author"), xs, buffer()); - eraseTag("fullnames:author"); + authorsToDocBookAuthorGroup(authorName, xs, buffer()); + + if (hasTag("fullnames:author") && hasTag("fullbynames:bookauthor")) { + xs << XMLStream::ESCAPE_NONE << + from_utf8("<!-- Several author tags in the reference. Other editor tag: ") + + from_utf8("fullbynames:bookauthor. Corresponding value: ") + + getTag("fullbynames:bookauthor") + from_utf8(" -->\n"); + } + + // Erase all author tags that might be present, even if only one is output. + if (hasTag("fullnames:author")) { + eraseTag("fullnames:author"); + } + if (hasTag("fullbynames:bookauthor")) { + eraseTag("fullbynames:bookauthor"); + } } // <editor> -- lyx-cvs mailing list lyx-cvs@lists.lyx.org http://lists.lyx.org/mailman/listinfo/lyx-cvs