diff options
| author | Maxime Coste <mawww@kakoune.org> | 2020-01-02 21:13:43 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2020-01-02 21:13:43 +1100 |
| commit | 43dc494e5cfac649c8f242b940a656adcae906db (patch) | |
| tree | b73d5cbb3e05b4d35b9d3cedc16bc60586c79531 /src/buffer_utils.cc | |
| parent | f2159750d28153b68b244d2bdcc3905e0efa425d (diff) | |
| parent | b03b51d27ace58cc17eb8a3aec99fa20dd3209ab (diff) | |
Merge remote-tracking branch 'eraserhd/history-api'
Diffstat (limited to 'src/buffer_utils.cc')
| -rw-r--r-- | src/buffer_utils.cc | 43 |
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); +} + } |
