diff --git a/lib/layouts/basic.module b/lib/layouts/basic.module
index 525f625860..5cd393babd 100644
--- a/lib/layouts/basic.module
+++ b/lib/layouts/basic.module
@@ -27,7 +27,7 @@ CiteFormat default
!sep ,
!close ]
- !startlink {!!}
+ !startlink {!!}
!endlink {!!}
!cite %!startlink%{%label%[[%label%]][[#%key%]]}%!endlink%%!nextcite%
diff --git a/lib/layouts/jurabib.module b/lib/layouts/jurabib.module
index 156f1ea618..2b0357d850 100644
--- a/lib/layouts/jurabib.module
+++ b/lib/layouts/jurabib.module
@@ -58,7 +58,7 @@ CiteFormat authoryear
!sep ;
!close )
- !startlink {!!}
+ !startlink {!!}
!endlink {!!}
!cite %!startlink%%!shortauthor%%!endlink%%!textbefore2%%!textafter2%%!nextcite%
diff --git a/lib/layouts/natbib.module b/lib/layouts/natbib.module
index e99b4ab4f8..ba028c012d 100644
--- a/lib/layouts/natbib.module
+++ b/lib/layouts/natbib.module
@@ -49,7 +49,7 @@ CiteFormat default
!sep ,
!close ]
- !startlink {!!}
+ !startlink {!!}
!endlink {!!}
!nextauthor {%next%[[%!sep% %!startlink%%!abbrvauthor%%!endlink%%!nextauthor%]]}
diff --git a/src/BiblioInfo.cpp b/src/BiblioInfo.cpp
index 84ea4f035f..14c365032b 100644
--- a/src/BiblioInfo.cpp
+++ b/src/BiblioInfo.cpp
@@ -20,6 +20,7 @@
#include "Encoding.h"
#include "InsetIterator.h"
#include "Language.h"
+#include "output_xhtml.h"
#include "Paragraph.h"
#include "TextClass.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,
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);
if (ret.empty() && xref)
ret = (*xref)[key];
- if (!ret.empty())
- return ret;
- // some special keys
- // FIXME: dialog, textbefore and textafter have nothing to do with this
- if (key == "dialog")
- return dialog;
- else if (key == "entrytype")
- return entry_type_;
- else if (key == "key")
- return bib_key_;
- else if (key == "label")
- return label_;
- else if (key == "abbrvauthor")
- // Special key to provide abbreviated author names.
- return getAbbreviatedAuthor(buf, false);
- else if (key == "shortauthor")
- // When shortauthor is not defined, jurabib automatically
- // provides jurabib-style abbreviated author names. We do
- // this as well.
- return getAbbreviatedAuthor(buf, true);
- else if (key == "shorttitle") {
- // When shorttitle is not defined, jurabib uses for `article'
- // and `periodical' entries the form `journal volume [year]'
- // and for other types of entries it uses the `title' field.
- if (entry_type_ == "article" || entry_type_ == "periodical")
- return operator[]("journal") + " " + operator[]("volume")
- + " [" + operator[]("year") + "]";
- else
- return operator[]("title");
- } else if (key == "bibentry") {
- // Special key to provide the full bibliography entry: see getInfo()
- CiteEngineType const engine_type = buf.params().citeEngineType();
- DocumentClass const & dc = buf.params().documentClass();
- string const & format = dc.getCiteFormat(engine_type, to_utf8(entry_type_));
- int counter = 0;
- return expandFormat(format, xref, counter, buf,
- docstring(), docstring(), docstring(), false);
- } else if (key == "textbefore")
- return before;
- else if (key == "textafter")
- return after;
- else if (key == "year")
- return getYear();
+ if (ret.empty()) {
+ // some special keys
+ // FIXME: dialog, textbefore and textafter have nothing to do with this
+ if (key == "dialog")
+ ret = dialog;
+ else if (key == "entrytype")
+ ret = entry_type_;
+ else if (key == "key")
+ ret = bib_key_;
+ else if (key == "label")
+ ret = label_;
+ else if (key == "abbrvauthor")
+ // Special key to provide abbreviated author names.
+ ret = getAbbreviatedAuthor(buf, false);
+ else if (key == "shortauthor")
+ // When shortauthor is not defined, jurabib automatically
+ // provides jurabib-style abbreviated author names. We do
+ // this as well.
+ ret = getAbbreviatedAuthor(buf, true);
+ else if (key == "shorttitle") {
+ // When shorttitle is not defined, jurabib uses for `article'
+ // and `periodical' entries the form `journal volume [year]'
+ // and for other types of entries it uses the `title' field.
+ if (entry_type_ == "article" || entry_type_ == "periodical")
+ ret = operator[]("journal") + " " + operator[]("volume")
+ + " [" + operator[]("year") + "]";
+ else
+ ret = operator[]("title");
+ } else if (key == "bibentry") {
+ // Special key to provide the full bibliography entry: see getInfo()
+ CiteEngineType const engine_type = buf.params().citeEngineType();
+ DocumentClass const & dc = buf.params().documentClass();
+ string const & format = dc.getCiteFormat(engine_type, to_utf8(entry_type_));
+ int counter = 0;
+ ret = expandFormat(format, xref, counter, buf,
+ docstring(), docstring(), docstring(), false);
+ } else if (key == "textbefore")
+ ret = before;
+ else if (key == "textafter")
+ ret = after;
+ else if (key == "year")
+ ret = getYear();
+ }
+ LYXERR0(ret);
+ if (cleanit)
+ return html::cleanAttr(ret);
+
return ret;
}
diff --git a/src/insets/InsetCitation.cpp b/src/insets/InsetCitation.cpp
index b21ae6ae39..c0e61798a8 100644
--- a/src/insets/InsetCitation.cpp
+++ b/src/insets/InsetCitation.cpp
@@ -221,7 +221,7 @@ inline docstring wrapCitation(docstring const & key,
return content;
// we have to do the escaping here, because we will ultimately
// write this as a raw string, so as not to escape the tags.
- return "" +
+ return "" +
html::htmlize(content, XHTMLStream::ESCAPE_ALL) + "";
}