Assure the author is encoded correctly in the LaTeX output of change tracking markup (bug 6225).

Patch reviewed by Jean-Marc.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@31602 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Jürgen Spitzmüller 2009-10-12 16:22:05 +00:00
parent 60dca30530
commit 3b6931719a
3 changed files with 87 additions and 22 deletions

View File

@ -17,13 +17,18 @@
#include "Author.h"
#include "Buffer.h"
#include "BufferParams.h"
#include "Encoding.h"
#include "LaTeXFeatures.h"
#include "OutputParams.h"
#include "Paragraph.h"
#include "TocBackend.h"
#include "support/debug.h"
#include "support/gettext.h"
#include "support/lassert.h"
#include "support/lstrings.h"
#include "frontends/alert.h"
#include <ostream>
@ -334,8 +339,61 @@ void Changes::merge()
}
namespace {
docstring getLaTeXMarkup(docstring const macro, docstring const author,
docstring const chgTime,
OutputParams const & runparams)
{
if (macro.empty())
return docstring();
static docstring warned_author = docstring();
docstring uncodable_author = warned_author;
odocstringstream ods;
ods << macro;
// convert utf8 author name to something representable
// in the current encoding
docstring author_latexed;
for (size_t n = 0; n < author.size(); ++n) {
try {
author_latexed += runparams.encoding->latexChar(author[n]);
} catch (EncodingException & /* e */) {
if (runparams.dryrun) {
ods << "<" << _("LyX Warning: ")
<< _("uncodable character") << " '";
ods.put(author[n]);
ods << "'>";
} else {
LYXERR0("Ommitting uncodable character '"
<< docstring(1, author[n])
<< "' in change author name!");
uncodable_author = author;
}
}
}
ods << author_latexed << "}{" << chgTime << "}{";
// warn user (once) if we found uncodable glyphs.
if (uncodable_author != warned_author) {
frontend::Alert::warning(_("Uncodable character in author name"),
support::bformat(_("The author name '%1$s',\n"
"used for change tracking, contains glyphs that cannot be\n"
"represented in the current encoding. The respective glyphs\n"
"will be ommitted in the exported LaTeX file.\n\n"
"Chose an appropriate document encoding (such as utf8)\n"
"or change the spelling of the author name."), uncodable_author));
warned_author = uncodable_author;
}
return ods.str();
}
} //namespace anon
int Changes::latexMarkChange(odocstream & os, BufferParams const & bparams,
Change const & oldChange, Change const & change)
Change const & oldChange, Change const & change,
OutputParams const & runparams)
{
if (!bparams.outputChanges || oldChange == change)
return 0;
@ -343,27 +401,28 @@ int Changes::latexMarkChange(odocstream & os, BufferParams const & bparams,
int column = 0;
if (oldChange.type != Change::UNCHANGED) {
os << '}'; // close \lyxadded or \lyxdeleted
// close \lyxadded or \lyxdeleted
os << '}';
column++;
}
docstring chgTime;
chgTime += ctime(&change.changetime);
chgTime.erase(chgTime.end() - 1); // remove trailing '\n'
// remove trailing '\n'
chgTime.erase(chgTime.end() - 1);
if (change.type == Change::DELETED) {
docstring str = "\\lyxdeleted{" +
bparams.authors().get(change.author).name() + "}{" +
chgTime + "}{";
os << str;
column += str.size();
} else if (change.type == Change::INSERTED) {
docstring str = "\\lyxadded{" +
bparams.authors().get(change.author).name() + "}{" +
chgTime + "}{";
os << str;
column += str.size();
}
docstring macro_beg;
if (change.type == Change::DELETED)
macro_beg = from_ascii("\\lyxdeleted{");
else if (change.type == Change::INSERTED)
macro_beg = from_ascii("\\lyxadded{");
docstring str = getLaTeXMarkup(macro_beg,
bparams.authors().get(change.author).name(),
chgTime, runparams);
os << str;
column += str.size();
return column;
}

View File

@ -17,6 +17,7 @@
#include "Color.h"
#include "support/docstream.h"
#include "support/strfwd.h"
#include "support/types.h"
#include "support/lyxtime.h"
@ -29,6 +30,7 @@ namespace lyx {
class AuthorList;
class Buffer;
class DocIterator;
class OutputParams;
class Change {
public:
@ -97,12 +99,13 @@ public:
bool isChanged(pos_type start, pos_type end) const;
/// return true if the whole range is deleted
bool isDeleted(pos_type start, pos_type end) const;
bool isDeleted(pos_type start, pos_type end) const;
/// output latex to mark a transition between two change types
/// returns length of text outputted
static int latexMarkChange(odocstream & os, BufferParams const & bparams,
Change const & oldChange, Change const & change);
Change const & oldChange, Change const & change,
OutputParams const & runparams);
/// output .lyx file format for transitions between changes
static void lyxMarkChange(std::ostream & os, BufferParams const & bparams,

View File

@ -771,7 +771,7 @@ void Paragraph::Private::latexInset(
if (inset->canTrackChanges()) {
column += Changes::latexMarkChange(os, bparams, running_change,
Change(Change::UNCHANGED));
Change(Change::UNCHANGED), runparams);
running_change = Change(Change::UNCHANGED);
}
@ -1988,7 +1988,8 @@ bool Paragraph::latex(BufferParams const & bparams,
running_font = basefont;
column += Changes::latexMarkChange(os, bparams,
runningChange, Change(Change::UNCHANGED));
runningChange, Change(Change::UNCHANGED),
runparams);
runningChange = Change(Change::UNCHANGED);
os << "] ";
@ -2017,7 +2018,8 @@ bool Paragraph::latex(BufferParams const & bparams,
basefont = getLayoutFont(bparams, outerfont);
running_font = basefont;
column += Changes::latexMarkChange(os, bparams, runningChange, change);
column += Changes::latexMarkChange(os, bparams, runningChange,
change, runparams);
runningChange = change;
}
@ -2179,7 +2181,8 @@ bool Paragraph::latex(BufferParams const & bparams,
#endif
}
column += Changes::latexMarkChange(os, bparams, runningChange, Change(Change::UNCHANGED));
column += Changes::latexMarkChange(os, bparams, runningChange,
Change(Change::UNCHANGED), runparams);
// Needed if there is an optional argument but no contents.
if (body_pos > 0 && body_pos == size()) {