liquid_feedback_frontend

diff app/main/draft/diff.lua @ 2:5c601807d397

Version alpha3

Dark green part of issue supporter bargraph represents all satisfied supporters, regardless of having seen the latest draft

Wiki formatting for drafts

Showing differences between two drafts of the same initiative

Display of outgoing delegation chains

Many other improvements
author bsw
date Mon Nov 23 12:00:00 2009 +0100 (2009-11-23)
parents
children 72c5e0ee7c98
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/app/main/draft/diff.lua	Mon Nov 23 12:00:00 2009 +0100
     1.3 @@ -0,0 +1,93 @@
     1.4 +slot.put_into("title", _"Diff")
     1.5 +
     1.6 +local old_draft_id = param.get("old_draft_id", atom.integer)
     1.7 +local new_draft_id = param.get("new_draft_id", atom.integer)
     1.8 +
     1.9 +if old_draft_id > new_draft_id then
    1.10 +  local tmp = old_draft_id
    1.11 +  old_draft_id = new_draft_id
    1.12 +  new_draft_id = tmp
    1.13 +end
    1.14 +
    1.15 +local old_draft = Draft:by_id(old_draft_id)
    1.16 +local new_draft = Draft:by_id(new_draft_id)
    1.17 +
    1.18 +local key = multirand.string(26, "123456789bcdfghjklmnpqrstvwxyz");
    1.19 +
    1.20 +local old_draft_filename = encode.file_path(request.get_app_basepath(), 'tmp', "diff-" .. key .. "-old.tmp")
    1.21 +local new_draft_filename = encode.file_path(request.get_app_basepath(), 'tmp', "diff-" .. key .. "-new.tmp")
    1.22 +
    1.23 +local old_draft_file = assert(io.open(old_draft_filename, "w"))
    1.24 +old_draft_file:write(old_draft.content)
    1.25 +old_draft_file:write("\n")
    1.26 +old_draft_file:close()
    1.27 +
    1.28 +local new_draft_file = assert(io.open(new_draft_filename, "w"))
    1.29 +new_draft_file:write(new_draft.content)
    1.30 +new_draft_file:write("\n")
    1.31 +new_draft_file:close()
    1.32 +
    1.33 +local output, err, status = os.pfilter(nil, "sh", "-c", "diff -U 100000 '" .. old_draft_filename .. "' '" .. new_draft_filename .. "' | grep -v ^--- | grep -v ^+++ | grep -v ^@")
    1.34 +
    1.35 +os.remove(old_draft_filename)
    1.36 +os.remove(new_draft_filename)
    1.37 +
    1.38 +if not status then
    1.39 +  ui.field.text{ value = _"The drafts do not differ" }
    1.40 +else
    1.41 +  slot.put('<table class="diff">')
    1.42 +  slot.put('<tr><th width="50%">' .. _"Old draft revision" .. '</th><th width="50%">' .. _"New draft revision" .. '</th></tr>')
    1.43 +  local last_state = "unchanged"
    1.44 +  local lines = {}
    1.45 +  local removed_lines = nil
    1.46 +  output = output .. " "
    1.47 +  output = output:gsub("[^\n\r]+", function(line)
    1.48 +    local state = "unchanged"
    1.49 +    local char = line:sub(1,1)
    1.50 +    line = line:sub(2)
    1.51 +    state = "unchanged"
    1.52 +    if char == "-" then
    1.53 +      state = "-"
    1.54 +    elseif char == "+" then
    1.55 +      state = "+"
    1.56 +    end
    1.57 +    if last_state == "unchanged" then
    1.58 +      if state == "unchanged" then
    1.59 +        lines[#lines+1] = line
    1.60 +      elseif (state == "-") or (state == "+") then
    1.61 +        local text = table.concat(lines, "<br />")
    1.62 +        slot.put("<tr><td>", text, "</td><td>", text, "</td></tr>")
    1.63 +        lines = { line }
    1.64 +      end
    1.65 +    elseif last_state == "-" then
    1.66 +      if state == "-" then
    1.67 +        lines[#lines+1] = line
    1.68 +      elseif state == "+" then
    1.69 +        removed_lines = lines
    1.70 +        lines = { line }
    1.71 +      elseif state == "unchanged" then
    1.72 +        local text = table.concat(lines,"<br />")
    1.73 +        slot.put('<tr><td class="removed">', text, "</td><td></td></tr>")
    1.74 +        lines = { line }
    1.75 +      end
    1.76 +    elseif last_state == "+" then
    1.77 +      if state == "+" then
    1.78 +        lines[#lines+1] = line
    1.79 +      elseif (state == "-") or (state == "unchanged") then
    1.80 +        if removed_lines then
    1.81 +          local text = table.concat(lines, "<br />")
    1.82 +          local removed_text = table.concat(removed_lines, "<br />")
    1.83 +          slot.put('<tr><td class="removed">', removed_text, '</td><td class="added">', text, "</td></tr>")
    1.84 +        else
    1.85 +          local text = table.concat(lines, "<br />")
    1.86 +          slot.put('<tr><td></td><td class="added">', text, "</td></tr>")
    1.87 +        end
    1.88 +        removed_lines = nil
    1.89 +        lines = { line }
    1.90 +      end
    1.91 +    end
    1.92 +    last_state = state
    1.93 +  end)
    1.94 +  slot.put("</table>")
    1.95 +end 
    1.96 +

Impressum / About Us