liquid_feedback_frontend

annotate app/main/draft/diff.lua @ 112:29519f2f9929

static links allow only one tab opened at the same time
author jorges
date Sun Sep 19 16:00:38 2010 +0200 (2010-09-19)
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