]> git.lyx.org Git - lyx.git/blobdiff - src/BiblioInfo.cpp
Correct Right Arrow key processing in Modules list
[lyx.git] / src / BiblioInfo.cpp
index c723b9ad398465f483b5a24d399042ffd9a0f61e..e37d56389a7efda7cbd3e148881314753a293e96 100644 (file)
@@ -22,7 +22,7 @@
 #include "Encoding.h"
 #include "InsetIterator.h"
 #include "Language.h"
-#include "output_xhtml.h"
+#include "xml.h"
 #include "Paragraph.h"
 #include "TextClass.h"
 #include "TocBackend.h"
@@ -223,7 +223,7 @@ name_parts nameParts(docstring const & iname)
 }
 
 
-docstring constructName(docstring const & name, string const scheme)
+docstring constructName(docstring const & name, string const scheme)
 {
        // re-constructs a name from name parts according
        // to a given scheme
@@ -313,7 +313,7 @@ vector<docstring> const getAuthors(docstring const & author)
 }
 
 
-bool multipleAuthors(docstring const author)
+bool multipleAuthors(docstring const author)
 {
        return getAuthors(author).size() > 1;
 }
@@ -776,7 +776,7 @@ I can tell, but it still feels like a hack. Fixing this would require quite a
 bit of work, however.
 */
 docstring BibTeXInfo::expandFormat(docstring const & format,
-               BibTeXInfoList const xrefs, int & counter, Buffer const & buf,
+               BibTeXInfoList const xrefs, int & counter, Buffer const & buf,
                CiteItem const & ci, bool next, bool second) const
 {
        // incorrect use of macros could put us in an infinite loop
@@ -926,7 +926,7 @@ docstring BibTeXInfo::expandFormat(docstring const & format,
 }
 
 
-docstring const & BibTeXInfo::getInfo(BibTeXInfoList const xrefs,
+docstring const & BibTeXInfo::getInfo(BibTeXInfoList const xrefs,
        Buffer const & buf, CiteItem const & ci) const
 {
        bool const richtext = ci.richtext;
@@ -1000,7 +1000,7 @@ docstring const & BibTeXInfo::operator[](string const & field) const
 
 
 docstring BibTeXInfo::getValueForKey(string const & oldkey, Buffer const & buf,
-       CiteItem const & ci, BibTeXInfoList const xrefs, size_t maxsize) const
+       CiteItem const & ci, BibTeXInfoList const xrefs, size_t maxsize) const
 {
        // anything less is pointless
        LASSERT(maxsize >= 16, maxsize = 16);
@@ -1013,11 +1013,10 @@ docstring BibTeXInfo::getValueForKey(string const & oldkey, Buffer const & buf,
 
        docstring ret = operator[](key);
        if (ret.empty() && !xrefs.empty()) {
-               vector<BibTeXInfo const *>::const_iterator it = xrefs.begin();
-               vector<BibTeXInfo const *>::const_iterator en = xrefs.end();
-               for (; it != en; ++it) {
-                       if (*it && !(**it)[key].empty()) {
-                               ret = (**it)[key];
+               // xr is a (reference to a) BibTeXInfo const *
+               for (auto const & xr : xrefs) {
+                       if (xr && !(*xr)[key].empty()) {
+                               ret = (*xr)[key];
                                break;
                        }
                }
@@ -1160,7 +1159,7 @@ docstring BibTeXInfo::getValueForKey(string const & oldkey, Buffer const & buf,
        }
 
        if (cleanit)
-               ret = html::cleanAttr(ret);
+               ret = xml::cleanAttr(ret);
 
        // make sure it is not too big
        support::truncateWithEllipsis(ret, maxsize);
@@ -1177,13 +1176,9 @@ docstring BibTeXInfo::getValueForKey(string const & oldkey, Buffer const & buf,
 namespace {
 
 // A functor for use with sort, leading to case insensitive sorting
-class compareNoCase: public binary_function<docstring, docstring, bool>
-{
-public:
-       bool operator()(docstring const & s1, docstring const & s2) const {
-               return compare_no_case(s1, s2) < 0;
-       }
-};
+bool compareNoCase(const docstring & a, const docstring & b) {
+       return compare_no_case(a, b) < 0;
+}
 
 } // namespace
 
@@ -1210,10 +1205,7 @@ vector<docstring> const BiblioInfo::getXRefs(BibTeXInfo const & data, bool const
        // XData field can consist of a comma-separated list of keys
        vector<docstring> const xdatakeys = getVectorFromString(data["xdata"]);
        if (!xdatakeys.empty()) {
-               vector<docstring>::const_iterator xit = xdatakeys.begin();
-               vector<docstring>::const_iterator xen = xdatakeys.end();
-               for (; xit != xen; ++xit) {
-                       docstring const xdatakey = *xit;
+               for (auto const & xdatakey : xdatakeys) {
                        result.push_back(xdatakey);
                        BiblioInfo::const_iterator it = find(xdatakey);
                        if (it != end()) {
@@ -1231,10 +1223,9 @@ vector<docstring> const BiblioInfo::getXRefs(BibTeXInfo const & data, bool const
 vector<docstring> const BiblioInfo::getKeys() const
 {
        vector<docstring> bibkeys;
-       BiblioInfo::const_iterator it  = begin();
-       for (; it != end(); ++it)
-               bibkeys.push_back(it->first);
-       sort(bibkeys.begin(), bibkeys.end(), compareNoCase());
+       for (auto const & bi : *this)
+               bibkeys.push_back(bi.first);
+       sort(bibkeys.begin(), bibkeys.end(), &compareNoCase);
        return bibkeys;
 }
 
@@ -1242,10 +1233,8 @@ vector<docstring> const BiblioInfo::getKeys() const
 vector<docstring> const BiblioInfo::getFields() const
 {
        vector<docstring> bibfields;
-       set<docstring>::const_iterator it = field_names_.begin();
-       set<docstring>::const_iterator end = field_names_.end();
-       for (; it != end; ++it)
-               bibfields.push_back(*it);
+       for (auto const & fn : field_names_)
+               bibfields.push_back(fn);
        sort(bibfields.begin(), bibfields.end());
        return bibfields;
 }
@@ -1254,10 +1243,8 @@ vector<docstring> const BiblioInfo::getFields() const
 vector<docstring> const BiblioInfo::getEntries() const
 {
        vector<docstring> bibentries;
-       set<docstring>::const_iterator it = entry_types_.begin();
-       set<docstring>::const_iterator end = entry_types_.end();
-       for (; it != end; ++it)
-               bibentries.push_back(*it);
+       for (auto const & et : entry_types_)
+               bibentries.push_back(et);
        sort(bibentries.begin(), bibentries.end());
        return bibentries;
 }
@@ -1330,7 +1317,6 @@ docstring const BiblioInfo::getInfo(docstring const & key,
                return docstring(_("Bibliography entry not found!"));
        BibTeXInfo const & data = it->second;
        BibTeXInfoList xrefptrs;
-       vector<docstring> const xrefs = getXRefs(data);
        for (docstring const & xref : getXRefs(data)) {
                BiblioInfo::const_iterator const xrefit = find(xref);
                if (xrefit != end())
@@ -1368,7 +1354,7 @@ docstring const BiblioInfo::getLabel(vector<docstring> keys,
        for (int i = 0; key != ken; ++key, ++i) {
                handled_keys.push_back(*key);
                int n = 0;
-               for (auto const k : handled_keys) {
+               for (auto const k : handled_keys) {
                        if (k == *key)
                                ++n;
                }
@@ -1459,13 +1445,11 @@ void BiblioInfo::collectCitedEntries(Buffer const & buf)
        // FIXME We may want to collect these differently, in the first case,
        // so that we might have them in order of appearance.
        set<docstring> citekeys;
-       shared_ptr<Toc const> toc = buf.tocBackend().toc("citation");
-       Toc::const_iterator it = toc->begin();
-       Toc::const_iterator const en = toc->end();
-       for (; it != en; ++it) {
-               if (it->str().empty())
+       Toc const & toc = *buf.tocBackend().toc("citation");
+       for (auto const & t : toc) {
+               if (t.str().empty())
                        continue;
-               vector<docstring> const keys = getVectorFromString(it->str());
+               vector<docstring> const keys = getVectorFromString(t.str());
                citekeys.insert(keys.begin(), keys.end());
        }
        if (citekeys.empty())
@@ -1475,10 +1459,8 @@ void BiblioInfo::collectCitedEntries(Buffer const & buf)
        // We will now convert it to a list of the BibTeXInfo objects used in
        // this document...
        vector<BibTeXInfo const *> bi;
-       set<docstring>::const_iterator cit = citekeys.begin();
-       set<docstring>::const_iterator const cen = citekeys.end();
-       for (; cit != cen; ++cit) {
-               BiblioInfo::const_iterator const bt = find(*cit);
+       for (auto const & ck : citekeys) {
+               BiblioInfo::const_iterator const bt = find(ck);
                if (bt == end() || !bt->second.isBibTeX())
                        continue;
                bi.push_back(&(bt->second));
@@ -1487,10 +1469,9 @@ void BiblioInfo::collectCitedEntries(Buffer const & buf)
        sort(bi.begin(), bi.end(), lSorter);
 
        // Now we can write the sorted keys
-       vector<BibTeXInfo const *>::const_iterator bit = bi.begin();
-       vector<BibTeXInfo const *>::const_iterator ben = bi.end();
-       for (; bit != ben; ++bit)
-               cited_entries_.push_back((*bit)->key());
+       // b is a BibTeXInfo const *
+       for (auto const & b : bi)
+               cited_entries_.push_back(b->key());
 }
 
 
@@ -1507,10 +1488,9 @@ void BiblioInfo::makeCitationLabels(Buffer const & buf)
        // modifiers, like "1984a"
        map<docstring, BibTeXInfo>::iterator last = bimap_.end();
 
-       vector<docstring>::const_iterator it = cited_entries_.begin();
-       vector<docstring>::const_iterator const en = cited_entries_.end();
-       for (; it != en; ++it) {
-               map<docstring, BibTeXInfo>::iterator const biit = bimap_.find(*it);
+       // add letters to years
+       for (auto const & ce : cited_entries_) {
+               map<docstring, BibTeXInfo>::iterator const biit = bimap_.find(ce);
                // this shouldn't happen, but...
                if (biit == bimap_.end())
                        // ...fail gracefully, anyway.
@@ -1545,9 +1525,8 @@ void BiblioInfo::makeCitationLabels(Buffer const & buf)
                }
        }
        // Set the labels
-       it = cited_entries_.begin();
-       for (; it != en; ++it) {
-               map<docstring, BibTeXInfo>::iterator const biit = bimap_.find(*it);
+       for (auto const & ce : cited_entries_) {
+               map<docstring, BibTeXInfo>::iterator const biit = bimap_.find(ce);
                // this shouldn't happen, but...
                if (biit == bimap_.end())
                        // ...fail gracefully, anyway.
@@ -1559,7 +1538,7 @@ void BiblioInfo::makeCitationLabels(Buffer const & buf)
                        docstring const auth = entry.getAuthorOrEditorList(&buf, false);
                        // we do it this way so as to access the xref, if necessary
                        // note that this also gives us the modifier
-                       docstring const year = getYear(*it, buf, true);
+                       docstring const year = getYear(ce, buf, true);
                        if (!auth.empty() && !year.empty())
                                entry.label(auth + ' ' + year);
                        else
@@ -1612,4 +1591,77 @@ string citationStyleToString(const CitationStyle & cs, bool const latex)
        return cmd;
 }
 
+
+docstring authorsToDocBookAuthorGroup(docstring const & authorsString, XMLStream & xs, Buffer const & buf)
+{
+       // This function closely mimics getAuthorList, but produces DocBook instead of text.
+       // It has been greatly simplified, as the complete list of authors is always produced. No separators are required,
+       // as the output has a database-like shape.
+       // constructName has also been merged within, as it becomes really simple and leads to no copy-paste.
+
+       if (authorsString.empty()) {
+               return docstring();
+       }
+
+       // Split the input list of authors into individual authors.
+       vector<docstring> const authors = getAuthors(authorsString);
+
+       // Retrieve the "et al." variation.
+       string const etal = buf.params().documentClass().getCiteMacro(buf.params().citeEngineType(), "_etal");
+
+       // Output the list of authors.
+       xs << xml::StartTag("authorgroup");
+       auto it = authors.cbegin();
+       auto en = authors.cend();
+       for (size_t i = 0; it != en; ++it, ++i) {
+               xs << xml::StartTag("author");
+               xs << xml::CR();
+               xs << xml::StartTag("personname");
+               xs << xml::CR();
+               docstring name = *it;
+
+               // All authors go in a <personname>. If more structure is known, use it; otherwise (just "et al."), print it as such.
+               if (name == "others") {
+                       xs << buf.B_(etal);
+               } else {
+                       name_parts parts = nameParts(name);
+                       if (! parts.prefix.empty()) {
+                               xs << xml::StartTag("honorific");
+                               xs << parts.prefix;
+                               xs << xml::EndTag("honorific");
+                               xs << xml::CR();
+                       }
+                       if (! parts.prename.empty()) {
+                               xs << xml::StartTag("firstname");
+                               xs << parts.prename;
+                               xs << xml::EndTag("firstname");
+                               xs << xml::CR();
+                       }
+                       if (! parts.surname.empty()) {
+                               xs << xml::StartTag("surname");
+                               xs << parts.surname;
+                               xs << xml::EndTag("surname");
+                               xs << xml::CR();
+                       }
+                       if (! parts.suffix.empty()) {
+                               xs << xml::StartTag("othername", "role=\"suffix\"");
+                               xs << parts.suffix;
+                               xs << xml::EndTag("othername");
+                               xs << xml::CR();
+                       }
+               }
+
+               xs << xml::EndTag("personname");
+               xs << xml::CR();
+               xs << xml::EndTag("author");
+               xs << xml::CR();
+
+               // Could add an affiliation after <personname>, but not stored in BibTeX.
+       }
+       xs << xml::EndTag("authorgroup");
+       xs << xml::CR();
+
+       return docstring();
+}
+
 } // namespace lyx