mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-09 18:31:04 +00:00
Links between citations and bibliography entries were broken in XHTML
output, due to failure to clean the ids in the new citation stuff. I've solved this by allowing the citation format information to contain keys of the form "clean:key". This signals that we are to apply the html::cleanAttr() function to the key before returning it. I.e., we strip non-alphanumeric stuff, basically.
This commit is contained in:
parent
54cff4129f
commit
4df02801a6
@ -27,7 +27,7 @@ CiteFormat default
|
|||||||
!sep ,
|
!sep ,
|
||||||
!close ]
|
!close ]
|
||||||
|
|
||||||
!startlink {!<a href='#LyXCite-%key%'>!}
|
!startlink {!<a href='#LyXCite-%clean:key%'>!}
|
||||||
!endlink {!</a>!}
|
!endlink {!</a>!}
|
||||||
|
|
||||||
!cite %!startlink%{%label%[[%label%]][[#%key%]]}%!endlink%%!nextcite%
|
!cite %!startlink%{%label%[[%label%]][[#%key%]]}%!endlink%%!nextcite%
|
||||||
|
@ -58,7 +58,7 @@ CiteFormat authoryear
|
|||||||
!sep ;
|
!sep ;
|
||||||
!close )
|
!close )
|
||||||
|
|
||||||
!startlink {!<a href='#LyXCite-%key%'>!}
|
!startlink {!<a href='#LyXCite-%clean:key%'>!}
|
||||||
!endlink {!</a>!}
|
!endlink {!</a>!}
|
||||||
|
|
||||||
!cite %!startlink%%!shortauthor%%!endlink%%!textbefore2%%!textafter2%%!nextcite%
|
!cite %!startlink%%!shortauthor%%!endlink%%!textbefore2%%!textafter2%%!nextcite%
|
||||||
|
@ -49,7 +49,7 @@ CiteFormat default
|
|||||||
!sep ,
|
!sep ,
|
||||||
!close ]
|
!close ]
|
||||||
|
|
||||||
!startlink {!<a href='#LyXCite-%key%'>!}
|
!startlink {!<a href='#LyXCite-%clean:key%'>!}
|
||||||
!endlink {!</a>!}
|
!endlink {!</a>!}
|
||||||
|
|
||||||
!nextauthor {%next%[[%!sep% %!startlink%%!abbrvauthor%%!endlink%%!nextauthor%]]}
|
!nextauthor {%next%[[%!sep% %!startlink%%!abbrvauthor%%!endlink%%!nextauthor%]]}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "Encoding.h"
|
#include "Encoding.h"
|
||||||
#include "InsetIterator.h"
|
#include "InsetIterator.h"
|
||||||
#include "Language.h"
|
#include "Language.h"
|
||||||
|
#include "output_xhtml.h"
|
||||||
#include "Paragraph.h"
|
#include "Paragraph.h"
|
||||||
#include "TextClass.h"
|
#include "TextClass.h"
|
||||||
#include "TocBackend.h"
|
#include "TocBackend.h"
|
||||||
@ -653,56 +654,67 @@ docstring const & BibTeXInfo::operator[](string const & field) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
docstring BibTeXInfo::getValueForKey(string const & key, Buffer const & buf,
|
docstring BibTeXInfo::getValueForKey(string const & oldkey, Buffer const & buf,
|
||||||
docstring const & before, docstring const & after, docstring const & dialog,
|
docstring const & before, docstring const & after, docstring const & dialog,
|
||||||
BibTeXInfo const * const xref) const
|
BibTeXInfo const * const xref) const
|
||||||
{
|
{
|
||||||
|
string key = oldkey;
|
||||||
|
bool cleanit = false;
|
||||||
|
if (prefixIs(oldkey, "clean:")) {
|
||||||
|
key = oldkey.substr(6);
|
||||||
|
cleanit = true;
|
||||||
|
}
|
||||||
|
|
||||||
docstring ret = operator[](key);
|
docstring ret = operator[](key);
|
||||||
if (ret.empty() && xref)
|
if (ret.empty() && xref)
|
||||||
ret = (*xref)[key];
|
ret = (*xref)[key];
|
||||||
if (!ret.empty())
|
if (ret.empty()) {
|
||||||
return ret;
|
// some special keys
|
||||||
// some special keys
|
// FIXME: dialog, textbefore and textafter have nothing to do with this
|
||||||
// FIXME: dialog, textbefore and textafter have nothing to do with this
|
if (key == "dialog")
|
||||||
if (key == "dialog")
|
ret = dialog;
|
||||||
return dialog;
|
else if (key == "entrytype")
|
||||||
else if (key == "entrytype")
|
ret = entry_type_;
|
||||||
return entry_type_;
|
else if (key == "key")
|
||||||
else if (key == "key")
|
ret = bib_key_;
|
||||||
return bib_key_;
|
else if (key == "label")
|
||||||
else if (key == "label")
|
ret = label_;
|
||||||
return label_;
|
else if (key == "abbrvauthor")
|
||||||
else if (key == "abbrvauthor")
|
// Special key to provide abbreviated author names.
|
||||||
// Special key to provide abbreviated author names.
|
ret = getAbbreviatedAuthor(buf, false);
|
||||||
return getAbbreviatedAuthor(buf, false);
|
else if (key == "shortauthor")
|
||||||
else if (key == "shortauthor")
|
// When shortauthor is not defined, jurabib automatically
|
||||||
// When shortauthor is not defined, jurabib automatically
|
// provides jurabib-style abbreviated author names. We do
|
||||||
// provides jurabib-style abbreviated author names. We do
|
// this as well.
|
||||||
// this as well.
|
ret = getAbbreviatedAuthor(buf, true);
|
||||||
return getAbbreviatedAuthor(buf, true);
|
else if (key == "shorttitle") {
|
||||||
else if (key == "shorttitle") {
|
// When shorttitle is not defined, jurabib uses for `article'
|
||||||
// When shorttitle is not defined, jurabib uses for `article'
|
// and `periodical' entries the form `journal volume [year]'
|
||||||
// and `periodical' entries the form `journal volume [year]'
|
// and for other types of entries it uses the `title' field.
|
||||||
// and for other types of entries it uses the `title' field.
|
if (entry_type_ == "article" || entry_type_ == "periodical")
|
||||||
if (entry_type_ == "article" || entry_type_ == "periodical")
|
ret = operator[]("journal") + " " + operator[]("volume")
|
||||||
return operator[]("journal") + " " + operator[]("volume")
|
+ " [" + operator[]("year") + "]";
|
||||||
+ " [" + operator[]("year") + "]";
|
else
|
||||||
else
|
ret = operator[]("title");
|
||||||
return operator[]("title");
|
} else if (key == "bibentry") {
|
||||||
} else if (key == "bibentry") {
|
// Special key to provide the full bibliography entry: see getInfo()
|
||||||
// Special key to provide the full bibliography entry: see getInfo()
|
CiteEngineType const engine_type = buf.params().citeEngineType();
|
||||||
CiteEngineType const engine_type = buf.params().citeEngineType();
|
DocumentClass const & dc = buf.params().documentClass();
|
||||||
DocumentClass const & dc = buf.params().documentClass();
|
string const & format = dc.getCiteFormat(engine_type, to_utf8(entry_type_));
|
||||||
string const & format = dc.getCiteFormat(engine_type, to_utf8(entry_type_));
|
int counter = 0;
|
||||||
int counter = 0;
|
ret = expandFormat(format, xref, counter, buf,
|
||||||
return expandFormat(format, xref, counter, buf,
|
docstring(), docstring(), docstring(), false);
|
||||||
docstring(), docstring(), docstring(), false);
|
} else if (key == "textbefore")
|
||||||
} else if (key == "textbefore")
|
ret = before;
|
||||||
return before;
|
else if (key == "textafter")
|
||||||
else if (key == "textafter")
|
ret = after;
|
||||||
return after;
|
else if (key == "year")
|
||||||
else if (key == "year")
|
ret = getYear();
|
||||||
return getYear();
|
}
|
||||||
|
LYXERR0(ret);
|
||||||
|
if (cleanit)
|
||||||
|
return html::cleanAttr(ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,7 +221,7 @@ inline docstring wrapCitation(docstring const & key,
|
|||||||
return content;
|
return content;
|
||||||
// we have to do the escaping here, because we will ultimately
|
// we have to do the escaping here, because we will ultimately
|
||||||
// write this as a raw string, so as not to escape the tags.
|
// write this as a raw string, so as not to escape the tags.
|
||||||
return "<a href='#LyXCite-" + key + "'>" +
|
return "<a href='#LyXCite-" + html::cleanAttr(key) + "'>" +
|
||||||
html::htmlize(content, XHTMLStream::ESCAPE_ALL) + "</a>";
|
html::htmlize(content, XHTMLStream::ESCAPE_ALL) + "</a>";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user