]> git.lyx.org Git - lyx.git/blobdiff - src/Changes.cpp
Update my email and status.
[lyx.git] / src / Changes.cpp
index 34db257f583b2d63b24cf3b8f7682ec1cc73aac5..766b698a3ab6019fee063a62c6a0cfca40dc17ac 100644 (file)
 #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>
 
@@ -256,7 +261,7 @@ Change const & Changes::lookup(pos_type const pos) const
 }
 
 
-bool Changes::isFullyDeleted(pos_type start, pos_type end) const
+bool Changes::isDeleted(pos_type start, pos_type end) const
 {
        ChangeTable::const_iterator it = table_.begin();
        ChangeTable::const_iterator const itend = table_.end();
@@ -334,8 +339,54 @@ void Changes::merge()
 }
 
 
-int Changes::latexMarkChange(odocstream & os, BufferParams const & bparams,
-                            Change const & oldChange, Change const & change)
+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
+       pair<docstring, docstring> author_latexed =
+               runparams.encoding->latexString(author, runparams.dryrun);
+       if (!author_latexed.second.empty()) {
+               LYXERR0("Omitting uncodable characters '"
+                       << author_latexed.second
+                       << "' in change author name!");
+               uncodable_author = author;
+       }
+       ods << author_latexed.first << "}{" << 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 the following glyphs that\n"
+                                 "cannot be represented in the current encoding: %2$s.\n"
+                                 "These glyphs will be omitted in the exported LaTeX file.\n\n"
+                                 "Choose an appropriate document encoding (such as utf8)\n"
+                                 "or change the spelling of the author name."),
+                               uncodable_author, author_latexed.second));
+               warned_author = uncodable_author;
+       }
+
+       return ods.str();
+}
+
+} //namespace anon
+
+
+int Changes::latexMarkChange(otexstream & os, BufferParams const & bparams,
+                            Change const & oldChange, Change const & change,
+                            OutputParams const & runparams)
 {
        if (!bparams.outputChanges || oldChange == change)
                return 0;
@@ -343,33 +394,34 @@ 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'
-
-       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();
-       }
+       // remove trailing '\n'
+       chgTime.erase(chgTime.end() - 1);
+
+       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;
 }
 
 
-void Changes::lyxMarkChange(ostream & os, int & column,
+void Changes::lyxMarkChange(ostream & os, BufferParams const & bparams, int & column,
                            Change const & old, Change const & change)
 {
        if (old == change)
@@ -377,22 +429,22 @@ void Changes::lyxMarkChange(ostream & os, int & column,
 
        column = 0;
 
+       int const buffer_id = bparams.authors().get(change.author).bufferId();
+
        switch (change.type) {
                case Change::UNCHANGED:
                        os << "\n\\change_unchanged\n";
                        break;
 
-               case Change::DELETED: {
-                       os << "\n\\change_deleted " << change.author
+               case Change::DELETED:
+                       os << "\n\\change_deleted " << buffer_id
                                << " " << change.changetime << "\n";
                        break;
-               }
 
-               case Change::INSERTED: {
-                       os << "\n\\change_inserted " << change.author
+               case Change::INSERTED:
+                       os << "\n\\change_inserted " << buffer_id
                                << " " << change.changetime << "\n";
                        break;
-               }
        }
 }
 
@@ -442,14 +494,16 @@ void Changes::addToToc(DocIterator const & cdit, Buffer const & buffer) const
                Toc::iterator it = change_list.item(0, author);
                if (it == change_list.end()) {
                        change_list.push_back(TocItem(dit, 0, author));
-                       change_list.push_back(TocItem(dit, 1, str));
+                       change_list.push_back(TocItem(dit, 1, str,
+                               support::wrapParas(str, 4)));
                        continue;
                }
                for (++it; it != change_list.end(); ++it) {
                        if (it->depth() == 0 && it->str() != author)
                                break;
                }
-               change_list.insert(it, TocItem(dit, 1, str));
+               change_list.insert(it, TocItem(dit, 1, str,
+                       support::wrapParas(str, 4)));
        }
 }