liquid_feedback_frontend

annotate app/main/draft/diff.lua @ 792:8dbf04a404e7

Optical enhancements
author bsw
date Fri Jun 29 00:49:09 2012 +0200 (2012-06-29)
parents f49cdfb72567
children 3b74187efaa3
rev   line source
bsw@2 1 local old_draft_id = param.get("old_draft_id", atom.integer)
bsw@2 2 local new_draft_id = param.get("new_draft_id", atom.integer)
bsw@2 3
bsw@10 4 if not old_draft_id or not new_draft_id then
bsw@10 5 slot.put( _"Please choose two versions of the draft to compare")
bsw@10 6 return
bsw@10 7 end
bsw@10 8
bsw@10 9 if old_draft_id == new_draft_id then
bsw@10 10 slot.put( _"Please choose two different versions of the draft to compare")
bsw@10 11 return
bsw@10 12 end
bsw@10 13
bsw@2 14 if old_draft_id > new_draft_id then
bsw@2 15 local tmp = old_draft_id
bsw@2 16 old_draft_id = new_draft_id
bsw@2 17 new_draft_id = tmp
bsw@2 18 end
bsw@2 19
bsw@2 20 local old_draft = Draft:by_id(old_draft_id)
bsw@2 21 local new_draft = Draft:by_id(new_draft_id)
bsw@2 22
poelzi@160 23 execute.view{
poelzi@160 24 module = "draft",
poelzi@160 25 view = "_head",
poelzi@160 26 params = { draft = new_draft}
poelzi@160 27 }
poelzi@159 28
bsw@727 29 ui.title(_"Diff")
poelzi@159 30
poelzi@159 31 if app.session.member_id and not new_draft.initiative.revoked then
poelzi@159 32 local supporter = Supporter:new_selector():add_where{"member_id = ?", app.session.member_id}:count()
poelzi@159 33 if supporter then
poelzi@159 34 ui.container{
poelzi@159 35 attr = { class = "draft_updated_info" },
poelzi@159 36 content = function()
poelzi@159 37 slot.put(_"The draft of this initiative has been updated!")
poelzi@159 38 slot.put(" ")
poelzi@159 39 ui.link{
poelzi@159 40 text = _"Refresh support to current draft",
poelzi@159 41 module = "initiative",
poelzi@159 42 action = "add_support",
poelzi@159 43 id = new_draft.initiative.id,
poelzi@159 44 routing = {
poelzi@159 45 default = {
poelzi@159 46 mode = "redirect",
poelzi@159 47 module = "initiative",
poelzi@159 48 view = "show",
poelzi@159 49 id = new_draft.initiative.id
poelzi@159 50 }
poelzi@159 51 }
poelzi@159 52 }
poelzi@159 53 end
poelzi@159 54 }
poelzi@159 55 end
poelzi@159 56 end
poelzi@159 57
bsw@95 58 local old_draft_content = string.gsub(string.gsub(old_draft.content, "\n", " ###ENTER###\n"), " ", "\n")
bsw@95 59 local new_draft_content = string.gsub(string.gsub(new_draft.content, "\n", " ###ENTER###\n"), " ", "\n")
bsw@95 60
bsw@2 61 local key = multirand.string(26, "123456789bcdfghjklmnpqrstvwxyz");
bsw@2 62
bsw@2 63 local old_draft_filename = encode.file_path(request.get_app_basepath(), 'tmp', "diff-" .. key .. "-old.tmp")
bsw@2 64 local new_draft_filename = encode.file_path(request.get_app_basepath(), 'tmp', "diff-" .. key .. "-new.tmp")
bsw@2 65
bsw@2 66 local old_draft_file = assert(io.open(old_draft_filename, "w"))
bsw@95 67 old_draft_file:write(old_draft_content)
bsw@2 68 old_draft_file:write("\n")
bsw@2 69 old_draft_file:close()
bsw@2 70
bsw@2 71 local new_draft_file = assert(io.open(new_draft_filename, "w"))
bsw@95 72 new_draft_file:write(new_draft_content)
bsw@2 73 new_draft_file:write("\n")
bsw@2 74 new_draft_file:close()
bsw@2 75
bsw@728 76 local output, err, status = extos.pfilter(nil, "sh", "-c", "diff -U 1000000000 '" .. old_draft_filename .. "' '" .. new_draft_filename .. "' | grep -v ^--- | grep -v ^+++ | grep -v ^@")
bsw@2 77
bsw@2 78 os.remove(old_draft_filename)
bsw@2 79 os.remove(new_draft_filename)
bsw@2 80
bsw@95 81 local last_state = "first_run"
bsw@95 82
bsw@95 83 local function process_line(line)
bsw@95 84 local state_char = string.sub(line, 1, 1)
bsw@95 85 local state
bsw@95 86 if state_char == "+" then
bsw@95 87 state = "added"
bsw@95 88 elseif state_char == "-" then
bsw@95 89 state = "removed"
bsw@95 90 elseif state_char == " " then
bsw@95 91 state = "unchanged"
bsw@95 92 end
bsw@95 93 local state_changed = false
bsw@95 94 if state ~= last_state then
bsw@95 95 if last_state ~= "first_run" then
bsw@95 96 slot.put("</span> ")
bsw@95 97 end
bsw@95 98 last_state = state
bsw@95 99 state_changed = true
bsw@95 100 slot.put("<span class=\"diff_" .. tostring(state) .. "\">")
bsw@95 101 end
bsw@95 102
bsw@95 103 line = string.sub(line, 2, #line)
bsw@95 104 if line ~= "###ENTER###" then
bsw@95 105 if not state_changed then
bsw@95 106 slot.put(" ")
bsw@95 107 end
bsw@95 108 slot.put(line)
bsw@95 109 else
bsw@95 110 slot.put("<br />")
bsw@95 111 end
bsw@95 112 end
bsw@95 113
bsw@2 114 if not status then
bsw@2 115 ui.field.text{ value = _"The drafts do not differ" }
bsw@2 116 else
bsw@95 117 ui.container{
bsw@95 118 tag = "div",
bsw@95 119 attr = { class = "diff" },
bsw@95 120 content = function()
bsw@95 121 output = output:gsub("[^\n\r]+", function(line)
bsw@95 122 process_line(line)
bsw@95 123 end)
bsw@2 124 end
bsw@95 125 }
bsw@2 126 end
bsw@2 127

Impressum / About Us