]> git.lyx.org Git - lyx.git/blobdiff - src/BiblioInfo.cpp
remove bogus comment
[lyx.git] / src / BiblioInfo.cpp
index 2460c487d0323acfcadc7d6aa1f26a38530e501a..70127798522effae211a946b48d67658c7600892 100644 (file)
@@ -466,18 +466,26 @@ docstring parseOptions(docstring const & format, string & optkey,
 
 } // anon namespace
 
-
+/* FIXME
+Bug #9131 revealed an oddity in how we are generating citation information
+when more than one key is given. We end up building a longer and longer format 
+string as we go, which we then have to re-parse, over and over and over again,
+rather than generating the information for the individual keys and then putting
+all of that together. We do that to deal with the way separators work, from what
+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,
                BibTeXInfo const * const xref, int & counter, Buffer const & buf,
                docstring before, docstring after, docstring dialog, bool next) const
 {
        // incorrect use of macros could put us in an infinite loop
-       static int max_passes = 5000;
+       static int const max_passes = 5000;
        // the use of overly large keys can lead to performance problems, due
        // to eventual attempts to convert LaTeX macros to unicode. See bug
        // #8944. This is perhaps not the best solution, but it will have to
        // do for now.
-       static size_t max_keysize = 128;
+       static size_t const max_keysize = 128;
        odocstringstream ret; // return value
        string key;
        bool scanning_key = false;
@@ -488,7 +496,7 @@ docstring BibTeXInfo::expandFormat(docstring const & format,
        // we'll remove characters from the front of fmt as we
        // deal with them
        while (!fmt.empty()) {
-               if (counter++ > max_passes) {
+               if (counter > max_passes) {
                        LYXERR0("Recursion limit reached while parsing `"
                                << format << "'.");
                        return _("ERROR!");
@@ -506,6 +514,7 @@ docstring BibTeXInfo::expandFormat(docstring const & format,
                                        string const val =
                                                buf.params().documentClass().getCiteMacro(engine_type, key);
                                        fmt = from_utf8(val) + fmt.substr(1);
+                                       counter += 1;
                                        continue;
                                } else if (key[0] == '_') {
                                        // a translatable bit
@@ -550,12 +559,15 @@ docstring BibTeXInfo::expandFormat(docstring const & format,
                                                getValueForKey(optkey, buf, before, after, dialog, xref);
                                        if (optkey == "next" && next)
                                                ret << ifpart; // without expansion
-                                       else if (!val.empty())
-                                               ret << expandFormat(ifpart, xref, counter, buf,
+                                       else if (!val.empty()) {
+                                               int newcounter = 0;
+                                               ret << expandFormat(ifpart, xref, newcounter, buf,
                                                        before, after, dialog, next);
-                                       else if (!elsepart.empty())
-                                               ret << expandFormat(elsepart, xref, counter, buf,
+                                       } else if (!elsepart.empty()) {
+                                               int newcounter = 0;
+                                               ret << expandFormat(elsepart, xref, newcounter, buf,
                                                        before, after, dialog, next);
+                                       }
                                        // fmt will have been shortened for us already
                                        continue;
                                }
@@ -624,19 +636,25 @@ docstring const & BibTeXInfo::getInfo(BibTeXInfo const * const xref,
        info_ = expandFormat(format, xref, counter, buf,
                docstring(), docstring(), docstring(), false);
 
-       if (!info_.empty()) {
+       if (info_.empty()) {
+               // this probably shouldn't happen
+               return info_;
+       }
+
+       if (richtext) {
                info_richtext_ = convertLaTeXCommands(processRichtext(info_, true));
-               info_ = convertLaTeXCommands(processRichtext(info_, false));
-               if (richtext)
-                       return info_richtext_;
+               return info_richtext_;
        }
+
+       info_ = convertLaTeXCommands(processRichtext(info_, false));
        return info_;
 }
 
 
 docstring const BibTeXInfo::getLabel(BibTeXInfo const * const xref,
        Buffer const & buf, docstring const & format, bool richtext,
-       docstring before, docstring after, docstring dialog, bool next) const
+       docstring const & before, docstring const & after, 
+       docstring const & dialog, bool next) const
 {
        docstring loclabel;
 
@@ -872,10 +890,19 @@ docstring const BiblioInfo::getInfo(docstring const & key,
 }
 
 
-docstring const BiblioInfo::getLabel(vector<docstring> const & keys,
-       Buffer const & buf, string const & style, bool richtext,
-       docstring const & before, docstring const & after, docstring const & dialog) const
+docstring const BiblioInfo::getLabel(vector<docstring> keys,
+       Buffer const & buf, string const & style, bool for_xhtml,
+       size_t max_size, docstring const & before, docstring const & after,
+       docstring const & dialog) const
 {
+       // shorter makes no sense
+       LASSERT(max_size >= 16, max_size = 16);
+
+       // we can't display more than 10 of these, anyway
+       bool const too_many_keys = keys.size() > 10;
+       if (too_many_keys)
+               keys.resize(10);
+
        CiteEngineType const engine_type = buf.params().citeEngineType();
        DocumentClass const & dc = buf.params().documentClass();
        docstring const & format = from_utf8(dc.getCiteFormat(engine_type, style, "cite"));
@@ -897,8 +924,17 @@ docstring const BiblioInfo::getLabel(vector<docstring> const & keys,
                                        xrefptr = &(xrefit->second);
                        }
                }
-               ret = data.getLabel(xrefptr, buf, ret, richtext,
-                       before, after, dialog, key+1 != ken);
+               ret = data.getLabel(xrefptr, buf, ret, for_xhtml,
+                       before, after, dialog, key + 1 != ken);
+       }
+
+       if (ret.size() > max_size) {
+               ret.resize(max_size - 3);
+               ret += "...";
+       } else if (too_many_keys) {
+               if (ret.size() > max_size - 3)
+                       ret.resize(max_size - 3);
+               ret += "...";
        }
        return ret;
 }
@@ -906,7 +942,9 @@ docstring const BiblioInfo::getLabel(vector<docstring> const & keys,
 
 bool BiblioInfo::isBibtex(docstring const & key) const
 {
-       BiblioInfo::const_iterator it = find(key);
+       docstring key1;
+       split(key, key1, ',');
+       BiblioInfo::const_iterator it = find(key1);
        if (it == end())
                return false;
        return it->second.isBibTeX();
@@ -915,8 +953,8 @@ bool BiblioInfo::isBibtex(docstring const & key) const
 
 vector<docstring> const BiblioInfo::getCiteStrings(
        vector<docstring> const & keys, vector<CitationStyle> const & styles,
-       Buffer const & buf, bool richtext, docstring const & before,
-       docstring const & after, docstring const & dialog) const
+       Buffer const & buf, docstring const & before,
+       docstring const & after, docstring const & dialog, size_t max_size) const
 {
        if (empty())
                return vector<docstring>();
@@ -925,7 +963,7 @@ vector<docstring> const BiblioInfo::getCiteStrings(
        vector<docstring> vec(styles.size());
        for (size_t i = 0; i != vec.size(); ++i) {
                style = styles[i].cmd;
-               vec[i] = getLabel(keys, buf, style, richtext, before, after, dialog);
+               vec[i] = getLabel(keys, buf, style, false, max_size, before, after, dialog);
        }
 
        return vec;