> The traditional solution to such
> problems was to use the OutputParams struct and to add there whatever
> variable is necessary. Is it really unfeasible here?
I never though of that because OutputParams (such as nice, linelen) is
used to control how output is generated, not to collect errors. Of
course, because OutputParams is passed along the export process, it
can be used for such purposes, but I would not recommend it.
Attached please find an updated patch with the renamed exception.
Bo
Index: src/Paragraph.cpp
===================================================================
--- src/Paragraph.cpp (revision 22192)
+++ src/Paragraph.cpp (working copy)
@@ -2229,10 +2229,18 @@
rp.free_spacing = style->free_spacing;
rp.local_font = &font;
rp.intitle = style->intitle;
- pimpl_->simpleTeXSpecialChars(buf, bparams, os,
+
+ try {
+ pimpl_->simpleTeXSpecialChars(buf, bparams, os,
texrow, rp, running_font,
basefont, outerfont, open_font,
runningChange, *style, i, column, c);
+ } catch (EncodingException & e) {
+ // add location information and throw again.
+ e.par_id = id();
+ e.pos = i;
+ throw(e);
+ }
// Set the encoding to that returned from simpleTeXSpecialChars (see
// comment for encoding member in OutputParams.h)
Index: src/Encoding.cpp
===================================================================
--- src/Encoding.cpp (revision 22192)
+++ src/Encoding.cpp (working copy)
@@ -251,6 +251,18 @@
} // namespace anon
+EncodingException::EncodingException(char_type c)
+ : failed_char(c), par_id(0), pos(0)
+{
+}
+
+
+const char * EncodingException::what() const throw()
+{
+ return "Could not find LaTeX command for a character";
+}
+
+
Encoding::Encoding(string const & n, string const & l, string const & i,
bool f, Encoding::Package p)
: Name_(n), LatexName_(l), iconvName_(i), fixedwidth_(f), package_(p)
@@ -325,10 +337,7 @@
// c cannot be encoded in this encoding
CharInfoMap::const_iterator const it = unicodesymbols.find(c);
if (it == unicodesymbols.end())
- lyxerr << "Could not find LaTeX command for character 0x"
- << std::hex << c << std::dec
- << ".\nLaTeX export will fail."
- << endl;
+ throw EncodingException(c);
else
return it->second.command;
}
Index: src/Buffer.cpp
===================================================================
--- src/Buffer.cpp (revision 22192)
+++ src/Buffer.cpp (working copy)
@@ -938,17 +938,30 @@
if (!openFileWrite(ofs, fname))
return false;
+ ErrorList & errorList = pimpl_->errorLists["Export"];
+ errorList.clear();
bool failed_export = false;
try {
writeLaTeXSource(ofs, original_path,
runparams, output_preamble, output_body);
}
+ catch (EncodingException & e) {
+ docstring msg = _("Could not find LaTeX command for character '%'");
+ msg[msg.size() - 2] = e.failed_char;
+ errorList.push_back(ErrorItem(msg, _("Some characters of your document are probably not "
+ "representable in the chosen encoding.\n"
+ "Changing the document encoding to utf8 could help."),
+ e.par_id, e.pos, e.pos + 1));
+ failed_export = true;
+ }
catch (iconv_codecvt_facet_exception & e) {
- lyxerr << "Caught iconv exception: " << e.what() << endl;
+ errorList.push_back(ErrorItem(_("iconv conversion failed"),
+ _(e.what()), -1, 0, 0));
failed_export = true;
}
catch (std::exception const & e) {
- lyxerr << "Caught \"normal\" exception: " << e.what() << endl;
+ errorList.push_back(ErrorItem(_("conversion failed"),
+ _(e.what()), -1, 0, 0));
failed_export = true;
}
catch (...) {
@@ -962,15 +975,8 @@
failed_export = true;
lyxerr << "File '" << fname << "' was not closed properly." << endl;
}
-
- if (failed_export) {
- Alert::error(_("Encoding error"),
- _("Some characters of your document are probably not "
- "representable in the chosen encoding.\n"
- "Changing the document encoding to utf8 could help."));
- return false;
- }
- return true;
+ errors("Export");
+ return !failed_export;
}
Index: src/Encoding.h
===================================================================
--- src/Encoding.h (revision 22192)
+++ src/Encoding.h (working copy)
@@ -24,7 +24,18 @@
class LaTeXFeatures;
+class EncodingException : public std::exception {
+public:
+ EncodingException(char_type c);
+ virtual ~EncodingException() throw() {}
+ virtual const char * what() const throw();
+ char_type failed_char;
+ int par_id;
+ pos_type pos;
+};
+
+
///
class Encoding {
public:
Index: status.15x
===================================================================
--- status.15x (revision 22192)
+++ status.15x (working copy)
@@ -29,9 +29,10 @@
* USER INTERFACE
+- An dialog is displayed if some character can not be encoded properly. The
+ offending character will be highlighted. (BUG3511)
-
* DOCUMENT INPUT/OUTPUT