summaryrefslogtreecommitdiff
path: root/src/buffer_utils.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2020-01-02 21:13:43 +1100
committerMaxime Coste <mawww@kakoune.org>2020-01-02 21:13:43 +1100
commit43dc494e5cfac649c8f242b940a656adcae906db (patch)
treeb73d5cbb3e05b4d35b9d3cedc16bc60586c79531 /src/buffer_utils.cc
parentf2159750d28153b68b244d2bdcc3905e0efa425d (diff)
parentb03b51d27ace58cc17eb8a3aec99fa20dd3209ab (diff)
Merge remote-tracking branch 'eraserhd/history-api'
Diffstat (limited to 'src/buffer_utils.cc')
-rw-r--r--src/buffer_utils.cc43
1 files changed, 43 insertions, 0 deletions
diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc
index c3f8a7ba..fe1a4fa7 100644
--- a/src/buffer_utils.cc
+++ b/src/buffer_utils.cc
@@ -219,4 +219,47 @@ void write_to_debug_buffer(StringView str)
}
}
+InplaceString<23> to_string(Buffer::HistoryId id)
+{
+ if (id == Buffer::HistoryId::Invalid) {
+ InplaceString<23> res;
+ res.m_data[0] = '-';
+ res.m_length = 1;
+ return res;
+ } else {
+ return to_string(static_cast<size_t>(id));
+ }
+}
+
+String format_modification(const Buffer::Modification& modification, Quoting quoting)
+{
+ auto quote = quoter(quoting);
+ return quote(format("{}{}.{}|{}",
+ modification.type == Buffer::Modification::Type::Insert ? '+' : '-',
+ modification.coord.line, modification.coord.column,
+ modification.content->strview()));
+}
+
+String history_as_string(const Vector<Buffer::HistoryNode>& history, Quoting quoting)
+{
+ auto format_history_node = [&](const Buffer::HistoryNode& node) {
+ auto seconds = std::chrono::duration_cast<std::chrono::seconds>(node.committed.time_since_epoch());
+ return format("{} {} {}{}{}",
+ node.parent,
+ seconds.count(),
+ node.redo_child,
+ node.undo_group.empty() ? "" : " ",
+ undo_group_as_string(node.undo_group, quoting));
+ };
+ return join(history |transform(format_history_node), ' ', false);
+}
+
+String undo_group_as_string(const Buffer::UndoGroup& undo_group, Quoting quoting)
+{
+ auto modification_as_string = [&](const Buffer::Modification& modification) {
+ return format_modification(modification, quoting);
+ };
+ return join(undo_group |transform(modification_as_string), ' ', false);
+}
+
}