| 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 
 |