diff --git a/sourcing/static/js/xanaedit.js b/sourcing/static/js/xanaedit.js new file mode 100644 index 0000000..3e117fe --- /dev/null +++ b/sourcing/static/js/xanaedit.js @@ -0,0 +1,112 @@ +'use strict'; + +function common_start(a, b) { + for(var i = 0; i < a.length; i++) + if(a[i] != b[i]) + return i; + return a.length +} + +function common_end(a, b) { + var min_len = Math.min(a.length, b.length); + + for(var i = 1; i < min_len + 1; i++) + if(a[a.length - i] != b[b.length - i]) + return i - 1; + return min_len; +} + +var editor = document.getElementById("editor"); +var changes = document.getElementById("changes"); + +var edits = []; + +editor.value = text;; + +function update_list_of_edits() { + changes.innerHTML = null; + edits.forEach(function(edit) { + var update; + var start = edit.start + 1; + if (edit.op == 'insert') { + update = start + ' insert: [' + edit.new + ']'; + } else if (edit.op == 'delete') { + update = start + ' delete: [' + edit.old + ']'; + } else if (edit.op == 'replace') { + update = start + ' replace: [' + edit.old + '] with [' + edit.new + ']'; + } + var div = document.createElement("div"); + div.innerHTML = update; + changes.append(div); + }); +} + +function update_buttons () { + if(edits.length) { + $('.save-btn').prop('disabled', false); + $('#cancel-btn').text('cancel edits'); + } else { + $('.save-btn').prop('disabled', true); + $('#cancel-btn').text('back to view page'); + } +} + +function update(e) { + var current = editor.value; + if (current == text) // no change + return + + var start = common_start(text, current); + var end = common_end(text.substring(start), current.substring(start)); + + var old_text = text.slice(start, text.length - end); + var new_text = current.slice(start, current.length - end); + text = current; + + // var div = document.createElement("div"); + var prev_edit = edits[edits.length - 1]; + if (old_text && !new_text) { // delete + if (prev_edit && prev_edit.op == 'delete' && prev_edit.start == start + 1) { + prev_edit.start = start; + prev_edit.old = old_text + prev_edit.old; + } else if (prev_edit && prev_edit.op == 'delete' && prev_edit.start == start) { + prev_edit.old += old_text; + } else if (prev_edit && prev_edit.op == 'insert' && + start - prev_edit.new.length + old_text.length == prev_edit.start && + prev_edit.new.endsWith(old_text)) { + if (prev_edit.new == old_text) { + edits.splice(-1, 1); + } else { + prev_edit.new = prev_edit.new.slice(0, prev_edit.new.length - old_text.length); + } + } else { + edits.push({'op': 'delete', 'start': start, 'old': old_text}); + } + // div.innerHTML = start + ' delete: [' + old_text + ']'; + } else if (!old_text && new_text) { // insert + if (prev_edit && prev_edit.op == 'insert' && prev_edit.start == start - prev_edit.new.length) { + prev_edit.new += new_text; + } else { + edits.push({'op': 'insert', 'start': start, 'new': new_text}); + } + // div.innerHTML = start + ' insert: [' + new_text + ']'; + } else { // replace + edits.push({'op': 'replace', 'start': start, 'new': new_text, 'old': old_text}); + // div.innerHTML = start + ' replace [' + old_text + '] with [' + new_text + ']'; + } + // changes.append(div); + + + $('input#edits').val(JSON.stringify(edits)); + + update_list_of_edits(); + update_buttons(); +} + +update_buttons(); +editor.addEventListener("input", update, false); + +$('#save-btn').click(function(e) { + e.preventDefault(); + console.log('save'); +}); diff --git a/sourcing/templates/view.html b/sourcing/templates/view.html index b69e5a5..e47dd8e 100644 --- a/sourcing/templates/view.html +++ b/sourcing/templates/view.html @@ -113,7 +113,7 @@
Edit EDL - Xanaedit text + Xanaedit text Reorder paragraphs
diff --git a/sourcing/templates/xanaedit.html b/sourcing/templates/xanaedit.html new file mode 100644 index 0000000..be2f2ee --- /dev/null +++ b/sourcing/templates/xanaedit.html @@ -0,0 +1,39 @@ +{% extends "base.html" %} +{% from "form/controls.html" import render_field %} + +{% block title %}xanaedit {{ doc.title() }}{% endblock %} + +{% block content %} + +