From 1d63d7838261922a03ef21ba42ce94cc2311d101 Mon Sep 17 00:00:00 2001 From: Juergen Spitzmueller Date: Fri, 28 Sep 2012 16:04:04 +0200 Subject: [PATCH] Working attempt at fixing #8357 in branch --- src/insets/InsetHyperlink.cpp | 39 ++++++++++++++++++++++++++++++++++- status.20x | 2 ++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/insets/InsetHyperlink.cpp b/src/insets/InsetHyperlink.cpp index e87103ac13..daaa8700d6 100644 --- a/src/insets/InsetHyperlink.cpp +++ b/src/insets/InsetHyperlink.cpp @@ -15,6 +15,7 @@ #include "Buffer.h" #include "DispatchResult.h" +#include "Encoding.h" #include "Format.h" #include "FuncRequest.h" #include "FuncStatus.h" @@ -22,12 +23,15 @@ #include "OutputParams.h" #include "output_xhtml.h" +#include "support/debug.h" #include "support/docstream.h" #include "support/FileName.h" #include "support/filetools.h" #include "support/gettext.h" #include "support/lstrings.h" +#include "frontends/alert.h" + using namespace std; using namespace lyx::support; @@ -185,7 +189,40 @@ void InsetHyperlink::latex(otexstream & os, (pos = name.find('~', i)) != string::npos; i = pos + 1) name.replace(pos, 1, sim); - + docstring name_latex; + docstring uncodable; + // validate encoding + for (size_t n = 0; n < name.size(); ++n) { + try { + char_type const c = name[n]; + docstring const latex = runparams.encoding->latexChar(c); + name_latex += latex; + if (latex.length() > 1 && latex[latex.length() - 1] != '}') { + // Prevent eating of a following + // space or command corruption by + // following characters + name_latex += "{}"; + } + } catch (EncodingException & /* e */) { + LYXERR0("Uncodable character in href inset!"); + if (runparams.dryrun) { + name_latex += "<" + _("LyX Warning: ") + + _("uncodable character") + " '"; + name_latex += docstring(1, name[n]); + name_latex += "'>"; + } else + uncodable += name[n]; + } + } + if (!uncodable.empty()) { + // issue a warning about omitted characters + // FIXME: should be passed to the error dialog + frontend::Alert::warning(_("Uncodable characters"), + bformat(_("The following characters that are used in the href inset are not\n" + "representable in the current encoding and therefore have been omitted:\n%1$s."), + uncodable)); + } + name = name_latex; } // end if (!name.empty()) if (runparams.moving_arg) diff --git a/status.20x b/status.20x index 739846f04d..6e60d8d9c1 100644 --- a/status.20x +++ b/status.20x @@ -86,6 +86,8 @@ What's new - Export correct language change commands if document contains different CJK languages (bug 8215). +- Fix encoding problems in hyperlink name field (bug 8357). + - Fix bug that Elsevier documents became uncompilable when using refstyle for cross-references.