mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-12-22 21:21:32 +00:00
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:
parent
60dca30530
commit
3b6931719a
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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()) {
|
||||
|
Loading…
Reference in New Issue
Block a user