X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FAuthor.cpp;h=3d03fe71131ada993ade5301978261f1acbfa772;hb=04eef3480faffb98b87f23cf39c09f2bb3c71173;hp=d4061c64eaa1a879e50254aef89fd4646969bd81;hpb=0bd907b7b830485d1768ce8e86b170b3da73af94;p=lyx.git diff --git a/src/Author.cpp b/src/Author.cpp index d4061c64ea..3d03fe7113 100644 --- a/src/Author.cpp +++ b/src/Author.cpp @@ -12,6 +12,8 @@ #include "Author.h" +#include "support/convert.h" +#include "support/gettext.h" #include "support/lassert.h" #include "support/lstrings.h" @@ -36,9 +38,30 @@ static int computeHash(docstring const & name, Author::Author(docstring const & name, docstring const & email) - : name_(name), email_(email), used_(true) + : name_(name), email_(email), used_(true), + buffer_id_(computeHash(name, email)) +{} + + +Author::Author(int buffer_id) + : name_(convert(buffer_id)), email_(docstring()), used_(false), + buffer_id_(buffer_id) +{} + + +docstring Author::nameAndEmail() const { - buffer_id_ = computeHash(name_, email_); + if (email().empty()) + return name(); + else + return bformat(_("%1$s[[name]] (%2$s[[email]])"), name(), email()); +} + + +bool Author::valid() const +{ + //this cannot be equal if the buffer_id was produced by the hash function. + return name_ != convert(buffer_id_); } @@ -51,8 +74,9 @@ bool operator==(Author const & l, Author const & r) ostream & operator<<(ostream & os, Author const & a) { // FIXME UNICODE - os << a.buffer_id_ << " \"" << to_utf8(a.name_) - << "\" " << to_utf8(a.email_); + os << a.buffer_id_ << " \"" << to_utf8(a.name_) << "\""; + if (!a.email_.empty()) + os << " " << to_utf8(a.email_); return os; } @@ -77,34 +101,42 @@ bool author_smaller(Author const & lhs, Author const & rhs) AuthorList::AuthorList() - : last_id_(0) {} int AuthorList::record(Author const & a) { + bool const valid = a.valid(); // If we record an author which equals the current // author, we copy the buffer_id, so that it will // keep the same id in the file. - if (!authors_.empty() && a == authors_[0]) + if (valid && !authors_.empty() && a == authors_[0]) authors_[0].setBufferId(a.bufferId()); - Authors::const_iterator it(authors_.begin()); - Authors::const_iterator itend(authors_.end()); - for (int i = 0; it != itend; ++it, ++i) { - if (*it == a) - return i; + Authors::const_iterator it = authors_.begin(); + Authors::const_iterator const beg = it; + Authors::const_iterator const end = authors_.end(); + for (; it != end; ++it) { + if (valid && *it == a) + return it - beg; + if (it->bufferId() == a.bufferId()) { + int id = it - beg; + if (!it->valid()) + // we need to handle the case of a valid author being registred + // after an invalid one. For instance, because "buffer-reload" + // does not clear the buffer's author list. + record(id, a); + return id; + } } authors_.push_back(a); - return last_id_++; + return authors_.size() - 1; } void AuthorList::record(int id, Author const & a) { - // LASSERT: What should we do here? - LASSERT(unsigned(id) < authors_.size(), /**/); - + LBUFERR(unsigned(id) < authors_.size()); authors_[id] = a; } @@ -118,7 +150,6 @@ void AuthorList::recordCurrentAuthor(Author const & a) Author const & AuthorList::get(int id) const { - // authors_[0] is guaranteed to exist LASSERT(id < (int)authors_.size() , return authors_[0]); return authors_[id]; } @@ -149,11 +180,11 @@ ostream & operator<<(ostream & os, AuthorList const & a) sorted.sort(); AuthorList::Authors::const_iterator a_it = sorted.begin(); - AuthorList::Authors::const_iterator a_end = sorted.end(); - - for (a_it = sorted.begin(); a_it != a_end; ++a_it) { - if (a_it->used()) - os << "\\author " << *a_it << "\n"; + AuthorList::Authors::const_iterator const a_end = sorted.end(); + + for (; a_it != a_end; ++a_it) { + if (a_it->used() && a_it->valid()) + os << "\\author " << *a_it << "\n"; } return os; }