Fix encoding issues in bibitems (bug #6534)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_1_6_X@33458 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Spitzmüller 2010-02-13 08:40:10 +00:00
parent e5560ed838
commit ef1f3ec29e
7 changed files with 90 additions and 7 deletions

View File

@ -472,6 +472,16 @@ docstring const BiblioInfo::getInfo(docstring const & key) const
}
bool const BiblioInfo::isBibtex(docstring const & key) const
{
BiblioInfo::const_iterator it = find(key);
if (it == end())
return false;
return it->second.isBibtex();
}
vector<docstring> const BiblioInfo::getCiteStrings(
docstring const & key, Buffer const & buf) const
{

View File

@ -53,6 +53,8 @@ public:
/// constructor that sets the entryType
BibTeXInfo(docstring const & key, docstring const & type);
///
bool isBibtex() const { return is_bibtex_; }
///
bool hasField(docstring const & field) const;
/// return the short form of an authorlist
docstring const getAbbreviatedAuthor() const;
@ -126,6 +128,9 @@ public:
/// Empty if no info exists.
/// Note that this will retrieve data from the crossref as needed.
docstring const getInfo(docstring const & key) const;
/// Is this a reference from a bibtex database
/// or from a bibliography environment?
bool const isBibtex(docstring const & key) const;
/**
* "Translates" the available Citation Styles into strings for a given key,

View File

@ -20,10 +20,12 @@
#include "BufferView.h"
#include "Counters.h"
#include "DispatchResult.h"
#include "Encoding.h"
#include "FuncRequest.h"
#include "InsetIterator.h"
#include "InsetList.h"
#include "Lexer.h"
#include "OutputParams.h"
#include "Paragraph.h"
#include "ParagraphList.h"
#include "TextClass.h"
@ -31,6 +33,7 @@
#include "frontends/alert.h"
#include "support/convert.h"
#include "support/debug.h"
#include "support/docstream.h"
#include "support/gettext.h"
#include "support/lstrings.h"
@ -170,8 +173,48 @@ int InsetBibitem::plaintext(odocstream & os, OutputParams const &) const
}
int InsetBibitem::latex(odocstream & os, OutputParams const & runparams) const
{
docstring cmd = '\\' + from_ascii(defaultCommand());
docstring uncodable;
if (!getParam("label").empty()) {
cmd += '[';
docstring orig = getParam("label");
for (size_t n = 0; n < orig.size(); ++n) {
try {
cmd += runparams.encoding->latexChar(orig[n]);
} catch (EncodingException & /* e */) {
LYXERR0("Uncodable character in bibitem!");
if (runparams.dryrun) {
cmd += "<" + _("LyX Warning: ")
+ _("uncodable character") + " '";
cmd += docstring(1, orig[n]);
cmd += "'>";
} else
uncodable += orig[n];
}
}
cmd += ']';
}
cmd += '{' + escape(getParam("key")) + '}';
os << cmd;
if (!uncodable.empty()) {
// issue a warning about omitted characters
// FIXME: should be passed to the error dialog
frontend::Alert::warning(_("Uncodable characters in bibliography item"),
bformat(_("The following characters in one of the bibliography items are\n"
"not representable in the current encoding and have been omitted:\n%1$s."),
uncodable));
}
return 0;
}
// ale070405
docstring bibitemWidest(Buffer const & buffer)
docstring bibitemWidest(Buffer const & buffer, OutputParams const & runparams)
{
int w = 0;
@ -228,8 +271,23 @@ docstring bibitemWidest(Buffer const & buffer)
w = wx;
}
if (bitem && !bitem->bibLabel().empty())
return bitem->bibLabel();
if (bitem && !bitem->bibLabel().empty()) {
docstring lbl = bitem->bibLabel();
docstring latex_lbl;
for (size_t n = 0; n < lbl.size(); ++n) {
try {
latex_lbl += runparams.encoding->latexChar(lbl[n]);
} catch (EncodingException & /* e */) {
if (runparams.dryrun) {
latex_lbl += "<" + _("LyX Warning: ")
+ _("uncodable character") + " '";
latex_lbl += docstring(1, lbl[n]);
latex_lbl += "'>";
}
}
}
return latex_lbl;
}
return from_ascii("99");
}

View File

@ -61,6 +61,8 @@ private:
///
int plaintext(odocstream &, OutputParams const &) const;
///
int latex(odocstream &, OutputParams const &) const;
///
virtual void fillWithBibKeys(BiblioInfo &, InsetIterator const &) const;
/// Update the counter of this inset
virtual void updateLabels(ParIterator const &);
@ -71,7 +73,7 @@ private:
///
Inset * clone() const { return new InsetBibitem(*this); }
friend docstring bibitemWidest(Buffer const & buffer);
friend docstring bibitemWidest(Buffer const & buffer, OutputParams const &);
/// The label that is set by updateLabels
docstring autolabel_;
///
@ -80,7 +82,7 @@ private:
/// Return the widest label in the Bibliography.
docstring bibitemWidest(Buffer const &);
docstring bibitemWidest(Buffer const &, OutputParams const &);
} // namespace lyx

View File

@ -517,6 +517,7 @@ void InsetCitation::tocString(odocstream & os) const
int InsetCitation::latex(odocstream & os, OutputParams const &) const
{
CiteEngine cite_engine = buffer().params().citeEngine();
BiblioInfo const & bi = buffer().masterBibInfo();
// FIXME UNICODE
docstring const cite_str = from_utf8(
asValidLatexCommand(getCmdName(), cite_engine));
@ -530,7 +531,11 @@ int InsetCitation::latex(odocstream & os, OutputParams const &) const
else if (!after.empty())
os << '[' << after << ']';
os << '{' << cleanupWhitespace(getParam("key")) << '}';
if (!bi.isBibtex(getParam("key")))
// escape chars with bibitems
os << '{' << escape(cleanupWhitespace(getParam("key"))) << '}';
else
os << '{' << cleanupWhitespace(getParam("key")) << '}';
return 0;
}

View File

@ -189,7 +189,7 @@ TeXEnvironment(Buffer const & buf,
<< "}\n";
} else if (style.labeltype == LABEL_BIBLIO) {
// ale970405
os << '{' << bibitemWidest(buf) << "}\n";
os << '{' << bibitemWidest(buf, runparams) << "}\n";
} else
os << from_ascii(style.latexparam()) << '\n';
texrow.newline();

View File

@ -100,6 +100,9 @@ What's new
- Fix the import of tex files with multi-byte characters in
the preamble (bug 6365).
- Fix encoding problem in bibliography items that broke the compilation
of documents (bug 6534).
- Allow using single quotes in filenames (bug 4063).