]> git.lyx.org Git - lyx.git/blobdiff - src/BiblioInfo.cpp
installer: further preparation
[lyx.git] / src / BiblioInfo.cpp
index 84ea4f035f4241bef40b625a0e432e931ed1e2f5..3298990a00d4e8a7486efa6c1f8eba3f2d094d69 100644 (file)
@@ -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"
@@ -369,9 +370,10 @@ string parseEmbeddedOption(string const & format, string & ifelsepart)
                LYXERR0("ERROR! Couldn't parse `" << format <<"'.");
                return format;
        }
-       LASSERT(rest.size() <= format.size(), /* */);
+       LASSERT(rest.size() <= format.size(),
+               { ifelsepart = ""; return format; });
        ifelsepart = format.substr(0, format.size() - rest.size());
-               return rest;
+       return rest;
 }
 
 
@@ -653,56 +655,70 @@ 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 == "modifier" && modifier_ != 0)
+                       ret = modifier_;
+               else if (key == "numericallabel")
+                       ret = cite_number_;
+               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();
+       }
+       if (cleanit)
+               return html::cleanAttr(ret);
+
        return ret;
 }
 
@@ -969,7 +985,7 @@ void BiblioInfo::makeCitationLabels(Buffer const & buf)
 {
        collectCitedEntries(buf);
        CiteEngineType const engine_type = buf.params().citeEngineType();
-       bool const numbers = (engine_type == ENGINE_TYPE_NUMERICAL);
+       bool const numbers = (engine_type & ENGINE_TYPE_NUMERICAL);
 
        int keynumber = 0;
        char modifier = 0;