* Licence details can be found in the file COPYING.
*
* \author Alejandro Aguilar Sierra
- * \author Richard Heck (BibTeX parser improvements)
+ * \author Richard Kimberly Heck (BibTeX parser improvements)
* \author Jürgen Spitzmüller
*
* Full author contact details are available in file CREDITS.
#include "LaTeXFeatures.h"
#include "output_latex.h"
#include "xml.h"
-#include "OutputParams.h"
#include "PDFOptions.h"
#include "texstream.h"
#include "TextClass.h"
#include "support/ExceptionMessage.h"
#include "support/FileNameList.h"
#include "support/filetools.h"
-#include "support/regex.h"
#include "support/gettext.h"
#include "support/lstrings.h"
#include "support/os.h"
#include <limits>
#include <map>
+#include <regex>
#include <utility>
#include <iostream>
vector<pair<docstring, string>> const dbs =
buffer().prepareBibFilePaths(runparams, getBibFiles(), false);
vector<docstring> db_out;
+ db_out.reserve(dbs.size());
for (pair<docstring, string> const & db : dbs)
db_out.push_back(db.first);
// Style options
// FIXME XHTML
// It'd be better to be able to get this from an InsetLayout, but at present
// InsetLayouts do not seem really to work for things that aren't InsetTexts.
- if (features.runparams().flavor == OutputParams::HTML)
+ if (features.runparams().flavor == Flavor::Html)
features.addCSSSnippet("div.bibtexentry { margin-left: 2em; text-indent: -2em; }\n"
"span.bibtexlabel:before{ content: \"[\"; }\n"
"span.bibtexlabel:after{ content: \"] \"; }");
// We could output more information here, e.g., what databases are included
// and information about options. But I don't necessarily see any reason to
// do this right now.
- if (op.for_tooltip || op.for_toc || op.for_search) {
+ if (op.for_tooltip || op.for_toc || op.find_effective()) {
os << '[' << reflabel << ']' << '\n';
return PLAINTEXT_NEWLINE;
}
docstring const reflabel = buffer().B_("References");
+ // Check that the bibliography is not empty, to ensure that the document is valid.
+ if (cites.empty()) {
+ xs << XMLStream::ESCAPE_NONE << "<!-- The bibliography is empty! -->";
+ xs << xml::CR();
+ return;
+ }
+
// Tell BiblioInfo our purpose (i.e. generate HTML rich text).
CiteItem ci;
ci.context = CiteItem::Export;
xs << xml::CR();
xs << xml::StartTag("title");
xs << reflabel;
- xs << xml::EndTag("title") << xml::CR();
+ xs << xml::EndTag("title");
+ xs << xml::CR();
// Translation between keys in each entry and DocBook tags.
// IDs for publications; list: http://tdg.docbook.org/tdg/5.2/biblioid.html.
auto vit = cites.begin();
auto ven = cites.end();
- if (vit == ven) {
- xs << XMLStream::ESCAPE_NONE << "<!-- No entry in the bibliography. -->";
- }
-
for (; vit != ven; ++vit) {
- BiblioInfo::const_iterator const biit = bibinfo.find(*vit);
+ auto const biit = bibinfo.find(*vit);
if (biit == bibinfo.end())
continue;
string html = to_utf8(bibinfo.getInfo(entry.key(), buffer(), ci));
regex tagRegex("<span class=\"bib-([^\"]*)\">([^<]*)</span>");
smatch match;
- auto tagIt = std::sregex_iterator(html.cbegin(), html.cend(), tagRegex, regex_constants::match_default);
- auto tagEnd = std::sregex_iterator();
+ auto tagIt = sregex_iterator(html.cbegin(), html.cend(), tagRegex, regex_constants::match_default);
+ auto tagEnd = sregex_iterator();
map<string, string> delayedTags;
// Read all tags from HTML and convert those that have a 1:1 matching.
xs << xml::StartTag(toDocBookTag[match[1]]);
xs << from_utf8(match[2].str());
xs << xml::EndTag(toDocBookTag[match[1]]);
+ xs << xml::CR();
}
} else {
LYXERR0("The BibTeX field " << match[1].str() << " is unknown.");
if (! delayedTags.empty()) {
unsigned long remainingTags = delayedTags.size(); // Used as a workaround. With GCC 7, when erasing all
// elements one by one, some elements may still pop in later on (even though they were deleted previously).
- auto hasTag = [&delayedTags](string key) { return delayedTags.find(key) != delayedTags.end(); };
- auto getTag = [&delayedTags](string key) { return from_utf8(delayedTags[key]); };
- auto eraseTag = [&delayedTags, &remainingTags](string key) {
+ auto hasTag = [&delayedTags](const string & key) { return delayedTags.find(key) != delayedTags.end(); };
+ auto getTag = [&delayedTags](const string & key) { return from_utf8(delayedTags[key]); };
+ auto eraseTag = [&delayedTags, &remainingTags](const string & key) {
remainingTags -= 1;
delayedTags.erase(key);
};
xs << xml::StartTag("keywordset") << xml::CR();
for (auto & kw: keywords) {
kw.erase(kw.begin(), std::find_if(kw.begin(), kw.end(),
- [](int c) {return !std::isspace(c);}));
+ [](char_type c) {return !lyx::isSpace(c);}));
xs << xml::StartTag("keyword");
xs << kw;
xs << xml::EndTag("keyword");
// Footer for bibliography.
xs << xml::EndTag("bibliography");
+ xs << xml::CR();
}