- // Only start the process off after the buffer is loaded from file.
- if (!buffer.isFullyLoaded())
- return docstring();
-
- BiblioInfo const & biblist = buffer.masterBibInfo();
- if (biblist.empty())
- return docstring();
-
- // the natbib citation-styles
- // CITET: author (year)
- // CITEP: (author,year)
- // CITEALT: author year
- // CITEALP: author, year
- // CITEAUTHOR: author
- // CITEYEAR: year
- // CITEYEARPAR: (year)
- // jurabib supports these plus
- // CITE: author/<before field>
-
- // We don't currently use the full or forceUCase fields.
- string cite_type = asValidLatexCommand(citeType, engine);
- if (cite_type[0] == 'C')
- //If we were going to use them, this would mean ForceUCase
- cite_type = string(1, 'c') + cite_type.substr(1);
- if (cite_type[cite_type.size() - 1] == '*')
- //and this would mean FULL
- cite_type = cite_type.substr(0, cite_type.size() - 1);
-
- docstring before_str;
- if (!before.empty()) {
- // In CITET and CITEALT mode, the "before" string is
- // attached to the label associated with each and every key.
- // In CITEP, CITEALP and CITEYEARPAR mode, it is attached
- // to the front of the whole only.
- // In other modes, it is not used at all.
- if (cite_type == "citet" ||
- cite_type == "citealt" ||
- cite_type == "citep" ||
- cite_type == "citealp" ||
- cite_type == "citeyearpar")
- before_str = before + ' ';
- // In CITE (jurabib), the "before" string is used to attach
- // the annotator (of legal texts) to the author(s) of the
- // first reference.
- else if (cite_type == "cite")
- before_str = '/' + before;
- }
-
- docstring after_str;
- // The "after" key is appended only to the end of the whole.
- if (cite_type == "nocite")
- after_str = " (" + _("not cited") + ')';
- else if (!after.empty()) {
- after_str = ", " + after;
- }
-
- // One day, these might be tunable (as they are in BibTeX).
- char op, cp; // opening and closing parenthesis.
- const char * sep; // punctuation mark separating citation entries.
- if (engine == ENGINE_BASIC) {
- op = '[';
- cp = ']';
- sep = ",";
- } else {
- op = '(';
- cp = ')';
- sep = ";";
- }
-
- docstring const op_str = ' ' + docstring(1, op);
- docstring const cp_str = docstring(1, cp) + ' ';
- docstring const sep_str = from_ascii(sep) + ' ';
-
- docstring label;
- vector<docstring> keys = getVectorFromString(keyList);
- 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));
-
- // Something isn't right. Fail safely.
- if (author.empty() || year.empty())
- return docstring();
-
- // authors1/<before>; ... ;
- // authors_last, <after>
- if (cite_type == "cite") {
- if (engine == ENGINE_BASIC) {
- label += *it + sep_str;
- } else if (engine == ENGINE_JURABIB) {
- if (it == keys.begin())
- label += author + before_str + sep_str;
- else
- label += author + 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_AUTHORYEAR:
- label += author + op_str + before_str +
- year + cp + sep_str;
- break;
- case ENGINE_NATBIB_NUMERICAL:
- label += author + op_str + before_str + '#' + *it + cp + sep_str;
- break;
- case ENGINE_JURABIB:
- label += before_str + author + op_str +
- year + cp + sep_str;
- break;
- case ENGINE_BASIC:
- break;
- }
-
- // author, year; author, year; ...
- } else if (cite_type == "citep" ||
- cite_type == "citealp") {
- if (engine == ENGINE_NATBIB_NUMERICAL) {
- label += *it + sep_str;
- } else {
- label += author + ", " + year + sep_str;
- }
-
- // (authors1 <before> year;
- // authors_last <before> year, <after>)
- } else if (cite_type == "citealt") {
- switch (engine) {
- case ENGINE_NATBIB_AUTHORYEAR:
- label += author + ' ' + before_str +
- year + sep_str;
- break;
- case ENGINE_NATBIB_NUMERICAL:
- label += author + ' ' + before_str + '#' + *it + sep_str;
- break;
- case ENGINE_JURABIB:
- label += before_str + author + ' ' +
- year + sep_str;
- break;
- case ENGINE_BASIC:
- break;
- }
-
- // author; author; ...
- } else if (cite_type == "citeauthor") {
- label += author + sep_str;
-
- // year; year; ...
- } else if (cite_type == "citeyear" ||
- cite_type == "citeyearpar") {
- label += year + 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_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;
- }
-
- if (cite_type == "citep" || cite_type == "citeyearpar" ||
- (cite_type == "cite" && engine == ENGINE_BASIC) )
- label = op + label + cp;
-
- return label;