- vector<docstring> keys = getVectorFromString(getParam("key"));
- vector<docstring>::const_iterator it = keys.begin();
- vector<docstring>::const_iterator end = keys.end();
- for (; it != end; ++it) {
- // get the bibdata corresponding to the key
- docstring const author = biblist.getAbbreviatedAuthor(*it);
- docstring const year = biblist.getYear(*it, for_xhtml);
- docstring const citenum = for_xhtml ? biblist.getCiteNumber(*it) : *it;
-
- if (author.empty() || year.empty())
- // We can't construct a "complex" label without that info.
- // So fail safely.
- return docstring();
-
- // authors1/<before>; ... ;
- // authors_last, <after>
- if (cite_type == "cite") {
- if (engine == ENGINE_BASIC) {
- label += wrapCitation(*it, citenum, for_xhtml) + sep_str;
- } else if (engine == ENGINE_JURABIB) {
- if (it == keys.begin())
- label += wrapCitation(*it, author, for_xhtml) + before_str + sep_str;
- else
- label += wrapCitation(*it, author, for_xhtml) + sep_str;
- }
- }
- // nocite
- else if (cite_type == "nocite") {
- label += *it + sep_str;
- }
- // (authors1 (<before> year); ... ;
- // authors_last (<before> year, <after>)
- else if (cite_type == "citet") {
- switch (engine) {
- case ENGINE_NATBIB:
- if (engine_type == ENGINE_TYPE_AUTHORYEAR)
- label += author + op_str + before_str +
- wrapCitation(*it, year, for_xhtml) + cp + sep_str;
- else
- label += author + op_str + before_str +
- wrapCitation(*it, citenum, for_xhtml) + cp + sep_str;
- break;
- case ENGINE_JURABIB:
- label += before_str + author + op_str +
- wrapCitation(*it, year, for_xhtml) + cp + sep_str;
- break;
- case ENGINE_BASIC:
- break;
- }
- }
- // author, year; author, year; ...
- else if (cite_type == "citep" ||
- cite_type == "citealp") {
- if (engine_type == ENGINE_TYPE_NUMERICAL) {
- label += wrapCitation(*it, citenum, for_xhtml) + sep_str;
- } else {
- label += wrapCitation(*it, author + ", " + year, for_xhtml) + sep_str;
- }
-
- }
- // (authors1 <before> year;
- // authors_last <before> year, <after>)
- else if (cite_type == "citealt") {
- switch (engine) {
- case ENGINE_NATBIB:
- if (engine_type == ENGINE_TYPE_AUTHORYEAR)
- label += author + ' ' + before_str +
- wrapCitation(*it, year, for_xhtml) + sep_str;
- else
- label += author + ' ' + before_str + '#' +
- wrapCitation(*it, citenum, for_xhtml) + sep_str;
- break;
- case ENGINE_JURABIB:
- label += before_str +
- wrapCitation(*it, author + ' ' + year, for_xhtml) + sep_str;
- break;
- case ENGINE_BASIC:
- break;
- }
-
-
- }
- // author; author; ...
- else if (cite_type == "citeauthor") {
- label += wrapCitation(*it, author, for_xhtml) + sep_str;
- }
- // year; year; ...
- else if (cite_type == "citeyear" ||
- cite_type == "citeyearpar") {
- label += wrapCitation(*it, year, for_xhtml) + sep_str;
- }
- }
- label = rtrim(rtrim(label), sep);
-
- if (!after_str.empty()) {
- if (cite_type == "citet") {
- // insert "after" before last ')'
- label.insert(label.size() - 1, after_str);
- } else {
- bool const add =
- !(engine == ENGINE_NATBIB &&
- engine_type == ENGINE_TYPE_NUMERICAL &&
- (cite_type == "citeauthor" ||
- cite_type == "citeyear"));
- if (add)
- label += after_str;
- }
- }
-
- if (!before_str.empty() && (cite_type == "citep" ||
- cite_type == "citealp" ||
- cite_type == "citeyearpar")) {
- label = before_str + label;
+ vector<docstring> keys = getVectorFromString(key);
+ CitationStyle cs = getCitationStyle(buffer().masterParams(),
+ cite_type, buffer().masterParams().citeStyles());
+ bool const qualified = cs.hasQualifiedList
+ && (keys.size() > 1
+ || !getParam("pretextlist").empty()
+ || !getParam("posttextlist").empty());
+ map<docstring, docstring> pres = getQualifiedLists(getParam("pretextlist"));
+ map<docstring, docstring> posts = getQualifiedLists(getParam("posttextlist"));
+
+ CiteItem ci;
+ ci.textBefore = getParam("before");
+ ci.textAfter = getParam("after");
+ ci.forceUpperCase = uppercase;
+ ci.Starred = starred;
+ ci.max_size = UINT_MAX;
+ ci.isQualified = qualified;
+ ci.pretexts = pres;
+ ci.posttexts = posts;
+ if (for_xhtml) {
+ ci.max_key_size = UINT_MAX;
+ ci.context = CiteItem::Export;