using support::ascii_lowercase;
using support::contains;
+using support::FileName;
using support::getStringFromVector;
using support::getVectorFromString;
using support::ltrim;
namespace {
-string const getNatbibLabel(Buffer const & buffer,
+docstring const getNatbibLabel(Buffer const & buffer,
string const & citeType, string const & keyList,
- string const & before, string const & after,
+ docstring const & before, docstring const & after,
biblio::CiteEngine engine)
{
// Only start the process off after the buffer is loaded from file.
if (!buffer.fully_loaded())
- return string();
+ return docstring();
// Cache the labels
typedef std::map<Buffer const *, biblio::InfoMap> CachedMap;
static CachedMap cached_keys;
// and cache the timestamp of the bibliography files.
- static std::map<string, time_t> bibfileStatus;
+ static std::map<FileName, time_t> bibfileStatus;
biblio::InfoMap infomap;
- vector<string> const & bibfilesCache = buffer.getBibfilesCache();
+ vector<FileName> const & bibfilesCache = buffer.getBibfilesCache();
// compare the cached timestamps with the actual ones.
bool changed = false;
- for (vector<string>::const_iterator it = bibfilesCache.begin();
+ for (vector<FileName>::const_iterator it = bibfilesCache.begin();
it != bibfilesCache.end(); ++ it) {
- string const f = *it;
+ FileName const f = *it;
try {
- std::time_t lastw = fs::last_write_time(f);
+ std::time_t lastw = fs::last_write_time(f.toFilesystemEncoding());
if (lastw != bibfileStatus[f]) {
changed = true;
bibfileStatus[f] = lastw;
}
// build the keylist only if the bibfiles have been changed
- if (cached_keys.empty() || bibfileStatus.empty() || changed) {
- typedef vector<std::pair<string, string> > InfoType;
+ if (cached_keys[&buffer].empty() || bibfileStatus.empty() || changed) {
+ typedef vector<std::pair<string, docstring> > InfoType;
InfoType bibkeys;
buffer.fillWithBibKeys(bibkeys);
infomap = cached_keys[&buffer];
if (infomap.empty())
- return string();
+ return docstring();
// the natbib citation-styles
// CITET: author (year)
if (cite_type[cite_type.size() - 1] == '*')
cite_type = cite_type.substr(0, cite_type.size() - 1);
- string before_str;
+ 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.
before_str = '/' + before;
}
- string after_str;
+ docstring after_str;
if (!after.empty()) {
// The "after" key is appended only to the end of the whole.
after_str = ", " + after;
// puctuation mark separating citation entries.
char const * const sep = ";";
- string const op_str(' ' + string(1, op));
- string const cp_str(string(1, cp) + ' ');
- string const sep_str(string(sep) + ' ');
+ docstring const op_str(' ' + docstring(1, op));
+ docstring const cp_str(docstring(1, cp) + ' ');
+ docstring const sep_str(from_ascii(sep) + ' ');
- string label;
+ docstring label;
vector<string> keys = getVectorFromString(keyList);
vector<string>::const_iterator it = keys.begin();
vector<string>::const_iterator end = keys.end();
for (; it != end; ++it) {
// get the bibdata corresponding to the key
- string const author(biblio::getAbbreviatedAuthor(infomap, *it));
- string const year(biblio::getYear(infomap, *it));
+ docstring const author(biblio::getAbbreviatedAuthor(infomap, *it));
+ docstring const year(biblio::getYear(infomap, *it));
// Something isn't right. Fail safely.
if (author.empty() || year.empty())
- return string();
+ return docstring();
// authors1/<before>; ... ;
// authors_last, <after>
year + cp + sep_str;
break;
case biblio::ENGINE_NATBIB_NUMERICAL:
+ // FIXME UNICODE
label += author + op_str + before_str +
- '#' + *it + cp + sep_str;
+ '#' + from_utf8(*it) + cp + sep_str;
break;
case biblio::ENGINE_JURABIB:
label += before_str + author + op_str +
} else if (cite_type == "citep" ||
cite_type == "citealp") {
if (engine == biblio::ENGINE_NATBIB_NUMERICAL) {
- label += *it + sep_str;
+ // FIXME UNICODE
+ label += from_utf8(*it) + sep_str;
} else {
label += author + ", " + year + sep_str;
}
year + sep_str;
break;
case biblio::ENGINE_NATBIB_NUMERICAL:
+ // FIXME UNICODE
label += author + ' ' + before_str +
- '#' + *it + sep_str;
+ '#' + from_utf8(*it) + sep_str;
break;
case biblio::ENGINE_JURABIB:
label += before_str + author + ' ' +
}
if (cite_type == "citep" || cite_type == "citeyearpar")
- label = string(1, op) + label + string(1, cp);
+ label = op + label + cp;
return label;
}
-string const getBasicLabel(string const & keyList, string const & after)
+docstring const getBasicLabel(docstring const & keyList, docstring const & after)
{
- string keys(keyList);
- string label;
+ docstring keys(keyList);
+ docstring label;
if (contains(keys, ',')) {
// Final comma allows while loop to cover all keys
keys = ltrim(split(keys, label, ',')) + ',';
while (contains(keys, ',')) {
- string key;
+ docstring key;
keys = ltrim(split(keys, key, ','));
label += ", " + key;
}
docstring const InsetCitation::generateLabel(Buffer const & buffer) const
{
- string const before = getSecOptions();
- string const after = getOptions();
+ docstring const before = getParam("before");
+ docstring const after = getParam("after");
- string label;
- biblio::CiteEngine const engine = buffer.params().cite_engine;
+ docstring label;
+ biblio::CiteEngine const engine = buffer.params().getEngine();
if (engine != biblio::ENGINE_BASIC) {
- label = getNatbibLabel(buffer, getCmdName(), getContents(),
+ // FIXME UNICODE
+ label = getNatbibLabel(buffer, getCmdName(), to_utf8(getParam("key")),
before, after, engine);
}
// Fallback to fail-safe
if (label.empty()) {
- label = getBasicLabel(getContents(), after);
+ label = getBasicLabel(getParam("key"), after);
}
- // FIXME UNICODE
- return from_utf8(label);
+ return label;
}
docstring const InsetCitation::getScreenLabel(Buffer const & buffer) const
{
- biblio::CiteEngine const engine = biblio::getEngine(buffer);
+ biblio::CiteEngine const engine = buffer.params().getEngine();
if (cache.params == params() && cache.engine == engine)
return cache.screen_label;
int InsetCitation::plaintext(Buffer const & buffer, odocstream & os,
OutputParams const &) const
{
+ docstring str;
+
if (cache.params == params() &&
- cache.engine == biblio::getEngine(buffer))
- os << cache.generated_label;
+ cache.engine == buffer.params().getEngine())
+ str = cache.generated_label;
else
- os << generateLabel(buffer);
- return 0;
+ str = generateLabel(buffer);
+
+ os << str;
+ return str.size();
}
namespace {
-string const cleanupWhitespace(string const & citelist)
+docstring const cleanupWhitespace(docstring const & citelist)
{
- string::const_iterator it = citelist.begin();
- string::const_iterator end = citelist.end();
+ docstring::const_iterator it = citelist.begin();
+ docstring::const_iterator end = citelist.end();
// Paranoia check: make sure that there is no whitespace in here
// -- at least not behind commas or at the beginning
- string result;
- char last = ',';
+ docstring result;
+ char_type last = ',';
for (; it != end; ++it) {
if (*it != ' ')
last = *it;
// end anon namyspace
}
-int InsetCitation::docbook(Buffer const &, odocstream & os, OutputParams const &) const
+int InsetCitation::docbook(Buffer const &, odocstream & os,
+ OutputParams const &) const
{
- // FIXME UNICODE
os << "<citation>"
- << from_ascii(cleanupWhitespace(getContents()))
+ << cleanupWhitespace(getParam("key"))
<< "</citation>";
return 0;
}
// citations and then changes his mind, turning natbib support off. The output
// should revert to \cite[]{}
int InsetCitation::latex(Buffer const & buffer, odocstream & os,
- OutputParams const &) const
+ OutputParams const &) const
{
- biblio::CiteEngine const cite_engine = buffer.params().cite_engine;
+ biblio::CiteEngine cite_engine = buffer.params().getEngine();
// FIXME UNICODE
docstring const cite_str = from_utf8(
biblio::asValidLatexCommand(getCmdName(), cite_engine));
else if (!after.empty())
os << '[' << after << ']';
- // FIXME UNICODE
- os << '{' << from_utf8(cleanupWhitespace(getContents())) << '}';
+ os << '{' << cleanupWhitespace(getParam("key")) << '}';
return 0;
}
void InsetCitation::validate(LaTeXFeatures & features) const
{
- switch (features.bufferParams().cite_engine) {
+ switch (features.bufferParams().getEngine()) {
case biblio::ENGINE_BASIC:
break;
case biblio::ENGINE_NATBIB_AUTHORYEAR: