- // 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;