liquid_feedback_frontend

annotate app/main/draft/diff.lua @ 118:93f4e465b50d

add initiator support in delegation

if a delegation is issued from the initiative view, the initiators
from that one are added to the delegation target list. this makes it easier to delegate to the author without the need to add him to the contact list.
author Daniel Poelzleithner <poelzi@poelzi.org>
date Mon Sep 20 20:32:04 2010 +0200 (2010-09-20)
parents 6a12fb7e4963
children 5d797c6706d5
rev   line source
bsw@2 1 slot.put_into("title", _"Diff")
bsw@2 2
bsw@2 3 local old_draft_id = param.get("old_draft_id", atom.integer)
bsw@2 4 local new_draft_id = param.get("new_draft_id", atom.integer)
bsw@2 5
bsw@10 6 if not old_draft_id or not new_draft_id then
bsw@10 7 slot.put( _"Please choose two versions of the draft to compare")
bsw@10 8 return
bsw@10 9 end
bsw@10 10
bsw@10 11 if old_draft_id == new_draft_id then
bsw@10 12 slot.put( _"Please choose two different versions of the draft to compare")
bsw@10 13 return
bsw@10 14 end
bsw@10 15
bsw@2 16 if old_draft_id > new_draft_id then
bsw@2 17 local tmp = old_draft_id
bsw@2 18 old_draft_id = new_draft_id
bsw@2 19 new_draft_id = tmp
bsw@2 20 end
bsw@2 21
bsw@2 22 local old_draft = Draft:by_id(old_draft_id)
bsw@2 23 local new_draft = Draft:by_id(new_draft_id)
bsw@2 24
bsw@95 25 local old_draft_content = string.gsub(string.gsub(old_draft.content, "\n", " ###ENTER###\n"), " ", "\n")
bsw@95 26 local new_draft_content = string.gsub(string.gsub(new_draft.content, "\n", " ###ENTER###\n"), " ", "\n")
bsw@95 27
bsw@2 28 local key = multirand.string(26, "123456789bcdfghjklmnpqrstvwxyz");
bsw@2 29
bsw@2 30 local old_draft_filename = encode.file_path(request.get_app_basepath(), 'tmp', "diff-" .. key .. "-old.tmp")
bsw@2 31 local new_draft_filename = encode.file_path(request.get_app_basepath(), 'tmp', "diff-" .. key .. "-new.tmp")
bsw@2 32
bsw@2 33 local old_draft_file = assert(io.open(old_draft_filename, "w"))
bsw@95 34 old_draft_file:write(old_draft_content)
bsw@2 35 old_draft_file:write("\n")
bsw@2 36 old_draft_file:close()
bsw@2 37
bsw@2 38 local new_draft_file = assert(io.open(new_draft_filename, "w"))
bsw@95 39 new_draft_file:write(new_draft_content)
bsw@2 40 new_draft_file:write("\n")
bsw@2 41 new_draft_file:close()
bsw@2 42
bsw@95 43 local output, err, status = os.pfilter(nil, "sh", "-c", "diff -U 1000000000 '" .. old_draft_filename .. "' '" .. new_draft_filename .. "' | grep -v ^--- | grep -v ^+++ | grep -v ^@")
bsw@2 44
bsw@2 45 os.remove(old_draft_filename)
bsw@2 46 os.remove(new_draft_filename)
bsw@2 47
bsw@95 48 local last_state = "first_run"
bsw@95 49
bsw@95 50 local function process_line(line)
bsw@95 51 local state_char = string.sub(line, 1, 1)
bsw@95 52 local state
bsw@95 53 if state_char == "+" then
bsw@95 54 state = "added"
bsw@95 55 elseif state_char == "-" then
bsw@95 56 state = "removed"
bsw@95 57 elseif state_char == " " then
bsw@95 58 state = "unchanged"
bsw@95 59 end
bsw@95 60 local state_changed = false
bsw@95 61 if state ~= last_state then
bsw@95 62 if last_state ~= "first_run" then
bsw@95 63 slot.put("</span> ")
bsw@95 64 end
bsw@95 65 last_state = state
bsw@95 66 state_changed = true
bsw@95 67 slot.put("<span class=\"diff_" .. tostring(state) .. "\">")
bsw@95 68 end
bsw@95 69
bsw@95 70 line = string.sub(line, 2, #line)
bsw@95 71 if line ~= "###ENTER###" then
bsw@95 72 if not state_changed then
bsw@95 73 slot.put(" ")
bsw@95 74 end
bsw@95 75 slot.put(line)
bsw@95 76 else
bsw@95 77 slot.put("<br />")
bsw@95 78 end
bsw@95 79 end
bsw@95 80
bsw@2 81 if not status then
bsw@2 82 ui.field.text{ value = _"The drafts do not differ" }
bsw@2 83 else
bsw@95 84 ui.container{
bsw@95 85 tag = "div",
bsw@95 86 attr = { class = "diff" },
bsw@95 87 content = function()
bsw@95 88 output = output:gsub("[^\n\r]+", function(line)
bsw@95 89 process_line(line)
bsw@95 90 end)
bsw@2 91 end
bsw@95 92 }
bsw@2 93 end
bsw@2 94

Impressum / About Us