vector<string> const getEnvPath(string const & name) { string const env_var = getEnv(name); string const separator(1, os::path_separator()); return getVectorFromString(env_var, separator); }
QStringList texFileList(QString const & filename) { QStringList list; FileName const file = libFileSearch(QString(), filename); if (file.empty()) return list; // FIXME Unicode. vector<docstring> doclist = getVectorFromString(file.fileContents("UTF-8"), from_ascii("\n")); // Normalise paths like /foo//bar ==> /foo/bar QSet<QString> set; for (size_t i = 0; i != doclist.size(); ++i) { QString file = toqstr(doclist[i]); file.replace("\r", ""); while (file.contains("//")) file.replace("//", "/"); if (!file.isEmpty()) set.insert(file); } // remove duplicates return QList<QString>::fromSet(set); }
docstring InsetCitation::toolTip(BufferView const & bv, int, int) const { Buffer const & buf = bv.buffer(); // Only after the buffer is loaded from file... if (!buf.isFullyLoaded()) return docstring(); BiblioInfo const & bi = buf.masterBibInfo(); if (bi.empty()) return _("No bibliography defined!"); docstring const & key = getParam("key"); if (key.empty()) return _("No citations selected!"); vector<docstring> keys = getVectorFromString(key); vector<docstring>::const_iterator it = keys.begin(); vector<docstring>::const_iterator en = keys.end(); docstring tip; for (; it != en; ++it) { docstring const key_info = bi.getInfo(*it, buffer()); if (key_info.empty()) continue; if (!tip.empty()) tip += "\n"; tip += wrap(key_info, -4); } return tip; }
void prependEnvPath(string const & name, string const & prefix) { string const separator(1, os::path_separator()); vector<string> reversed_tokens = getVectorFromString(prefix, separator); vector<string> env_var = getEnvPath(name); // Prepend each new element to the list, removing identical elements // that occur later in the list. typedef vector<string>::const_reverse_iterator token_iterator; token_iterator it = reversed_tokens.rbegin(); token_iterator const end = reversed_tokens.rend(); for (; it != end; ++it) { vector<string>::iterator remove_it = remove(env_var.begin(), env_var.end(), *it); env_var.erase(remove_it, env_var.end()); env_var.insert(env_var.begin(), *it); } setEnvPath(name, env_var); }
docstring InsetCitation::complexLabel(bool for_xhtml) const { Buffer const & buf = buffer(); // Only start the process off after the buffer is loaded from file. if (!buf.isFullyLoaded()) return docstring(); BiblioInfo const & biblist = buf.masterBibInfo(); if (biblist.empty()) return docstring(); docstring const & key = getParam("key"); if (key.empty()) return _("No citations selected!"); // We don't currently use the full or forceUCase fields. string cite_type = getCmdName(); 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 const & before = getParam("before"); docstring const & after = getParam("after"); // FIXME: allow to add cite macros /* buffer().params().documentClass().addCiteMacro("!textbefore", to_utf8(before)); buffer().params().documentClass().addCiteMacro("!textafter", to_utf8(after)); */ docstring label; vector<docstring> keys = getVectorFromString(key); label = biblist.getLabel(keys, buffer(), cite_type, for_xhtml, UINT_MAX, before, after); return label; }
bool InsetCitation::addKey(string const & key) { docstring const ukey = from_utf8(key); docstring const & curkeys = getParam("key"); if (curkeys.empty()) { setParam("key", ukey); cache.recalculate = true; return true; } vector<docstring> keys = getVectorFromString(curkeys); vector<docstring>::const_iterator it = keys.begin(); vector<docstring>::const_iterator en = keys.end(); for (; it != en; ++it) { if (*it == ukey) { LYXERR0("Key " << key << " already present."); return false; } } keys.push_back(ukey); setParam("key", getStringFromVector(keys)); cache.recalculate = true; return true; }
docstring InsetCitation::complexLabel(bool for_xhtml) const { Buffer const & buf = buffer(); // Only start the process off after the buffer is loaded from file. if (!buf.isFullyLoaded()) return docstring(); BiblioInfo const & biblist = buf.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> CiteEngine const engine = buffer().params().citeEngine(); // We don't currently use the full or forceUCase fields. string cite_type = asValidLatexCommand(getCmdName(), 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 const & before = getParam("before"); 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 const & after = getParam("after"); 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(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_AUTHORYEAR: label += author + op_str + before_str + wrapCitation(*it, year, for_xhtml) + cp + sep_str; break; case ENGINE_NATBIB_NUMERICAL: 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 == ENGINE_NATBIB_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_AUTHORYEAR: label += author + ' ' + before_str + wrapCitation(*it, year, for_xhtml) + sep_str; break; case ENGINE_NATBIB_NUMERICAL: 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_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; }