<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl">
	<id>https://wiki-raamsdonk.nl/index.php?action=history&amp;feed=atom&amp;title=Module%3ADiff</id>
	<title>Module:Diff - Bewerkingsoverzicht</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-raamsdonk.nl/index.php?action=history&amp;feed=atom&amp;title=Module%3ADiff"/>
	<link rel="alternate" type="text/html" href="https://wiki-raamsdonk.nl/index.php?title=Module:Diff&amp;action=history"/>
	<updated>2026-04-10T03:34:24Z</updated>
	<subtitle>Bewerkingsoverzicht voor deze pagina op de wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://wiki-raamsdonk.nl/index.php?title=Module:Diff&amp;diff=128359&amp;oldid=prev</id>
		<title>Colani: 1 versie geïmporteerd: Category:Commons templates-i18n</title>
		<link rel="alternate" type="text/html" href="https://wiki-raamsdonk.nl/index.php?title=Module:Diff&amp;diff=128359&amp;oldid=prev"/>
		<updated>2024-07-29T10:01:42Z</updated>

		<summary type="html">&lt;p&gt;1 versie geïmporteerd: Category:Commons templates-i18n&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nieuwe pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-----------------------------------------------------------------------------&lt;br /&gt;
-- Provides functions for diffing text.&lt;br /&gt;
--&lt;br /&gt;
-- (c) 2007, 2008  Yuri Takhteyev (yuri@freewisdom.org)&lt;br /&gt;
-- (c) 2007 Hisham Muhammad&lt;br /&gt;
-- &lt;br /&gt;
-- 2013-, Adapted to MediaWiki&amp;#039;s Lua system originally by User:Ebrahim&lt;br /&gt;
--&lt;br /&gt;
-- License: MIT/X, see http://sputnik.freewisdom.org/en/License&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local SKIP_SEPARATOR = true  -- a constant&lt;br /&gt;
&lt;br /&gt;
-- token statuses&lt;br /&gt;
local IN   = &amp;quot;in&amp;quot;&lt;br /&gt;
local OUT  = &amp;quot;out&amp;quot;&lt;br /&gt;
local SAME = &amp;quot;same&amp;quot;&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
-- Split a string into tokens.  (Adapted from Gavin Kistner&amp;#039;s split on&lt;br /&gt;
-- http://lua-users.org/wiki/SplitJoin.&lt;br /&gt;
--&lt;br /&gt;
-- @param text           A string to be split.&lt;br /&gt;
-- @param separator      [optional] the separator pattern (defaults to any&lt;br /&gt;
--                       white space - %s+).&lt;br /&gt;
-- @param skip_separator [optional] don&amp;#039;t include the sepator in the results.     &lt;br /&gt;
-- @return               A list of tokens.&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
local function split(text, separator, skip_separator)&lt;br /&gt;
   separator = separator or &amp;quot;%s+&amp;quot;&lt;br /&gt;
   local parts = {}  &lt;br /&gt;
   local start = 1&lt;br /&gt;
   local split_start, split_end = mw.ustring.find(text, separator, start)&lt;br /&gt;
   while split_start do&lt;br /&gt;
      table.insert(parts, mw.ustring.sub(text, start, split_start-1))&lt;br /&gt;
      if not skip_separator then&lt;br /&gt;
         table.insert(parts, mw.ustring.sub(text, split_start, split_end))&lt;br /&gt;
      end&lt;br /&gt;
      start = split_end + 1&lt;br /&gt;
      split_start, split_end = mw.ustring.find(text, separator, start)&lt;br /&gt;
   end&lt;br /&gt;
   if mw.ustring.sub(text, start) ~= &amp;quot;&amp;quot; then&lt;br /&gt;
      table.insert(parts, mw.ustring.sub(text, start))&lt;br /&gt;
   end&lt;br /&gt;
   return parts&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
-- Derives the longest common subsequence of two strings.  This is a faster&lt;br /&gt;
-- implementation than one provided by stdlib.  Submitted by Hisham Muhammad. &lt;br /&gt;
-- The algorithm was taken from:&lt;br /&gt;
-- http://en.wikibooks.org/wiki/Algorithm_implementation/Strings/Longest_common_subsequence&lt;br /&gt;
--&lt;br /&gt;
-- @param t1             the first string.&lt;br /&gt;
-- @param t2             the second string.&lt;br /&gt;
-- @return               the least common subsequence as a matrix.&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
local function quick_LCS(t1, t2)&lt;br /&gt;
   local m = #t1&lt;br /&gt;
   local n = #t2&lt;br /&gt;
&lt;br /&gt;
   -- Build matrix on demand&lt;br /&gt;
   local C = {}&lt;br /&gt;
   local setmetatable = setmetatable&lt;br /&gt;
   local mt_tbl = {&lt;br /&gt;
      __index = function(t, k)&lt;br /&gt;
         t[k] = 0&lt;br /&gt;
         return 0&lt;br /&gt;
      end&lt;br /&gt;
   }&lt;br /&gt;
   local mt_C = {&lt;br /&gt;
      __index = function(t, k)&lt;br /&gt;
         local tbl = {}&lt;br /&gt;
         setmetatable(tbl, mt_tbl)&lt;br /&gt;
         t[k] = tbl&lt;br /&gt;
         return tbl&lt;br /&gt;
      end&lt;br /&gt;
   }&lt;br /&gt;
   setmetatable(C, mt_C)&lt;br /&gt;
   local max = math.max&lt;br /&gt;
   for i = 1, m+1 do&lt;br /&gt;
      local ci1 = C[i+1]&lt;br /&gt;
      local ci = C[i]&lt;br /&gt;
      for j = 1, n+1 do&lt;br /&gt;
         if t1[i-1] == t2[j-1] then&lt;br /&gt;
            ci1[j+1] = ci[j] + 1&lt;br /&gt;
         else&lt;br /&gt;
            ci1[j+1] = max(ci1[j], ci[j+1])&lt;br /&gt;
         end&lt;br /&gt;
      end&lt;br /&gt;
   end&lt;br /&gt;
   return C&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
-- Formats an inline diff as HTML, with &amp;lt;ins&amp;gt; and &amp;lt;del&amp;gt; tags.&lt;br /&gt;
-- &lt;br /&gt;
-- @param tokens         a table of {token, status} pairs.&lt;br /&gt;
-- @return               an HTML string.&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
local function format_as_html(tokens)&lt;br /&gt;
   local diff_buffer = &amp;quot;&amp;quot;&lt;br /&gt;
   local token, status&lt;br /&gt;
   for i, token_record in ipairs(tokens) do&lt;br /&gt;
      token = mw.text.nowiki(token_record[1])&lt;br /&gt;
      status = token_record[2]&lt;br /&gt;
      if status == &amp;quot;in&amp;quot; then&lt;br /&gt;
         diff_buffer = diff_buffer..&amp;#039;&amp;lt;ins&amp;gt;&amp;#039;..token..&amp;#039;&amp;lt;/ins&amp;gt;&amp;#039;&lt;br /&gt;
      elseif status == &amp;quot;out&amp;quot; then&lt;br /&gt;
         diff_buffer = diff_buffer..&amp;#039;&amp;lt;del&amp;gt;&amp;#039;..token..&amp;#039;&amp;lt;/del&amp;gt;&amp;#039;&lt;br /&gt;
      else &lt;br /&gt;
         diff_buffer = diff_buffer..token&lt;br /&gt;
      end&lt;br /&gt;
   end&lt;br /&gt;
   return diff_buffer&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
-- Returns a diff of two strings as a list of pairs, where the first value&lt;br /&gt;
-- represents a token and the second the token&amp;#039;s status (&amp;quot;same&amp;quot;, &amp;quot;in&amp;quot;, &amp;quot;out&amp;quot;).&lt;br /&gt;
--&lt;br /&gt;
-- @param old             The &amp;quot;old&amp;quot; text string&lt;br /&gt;
-- @param new             The &amp;quot;new&amp;quot; text string&lt;br /&gt;
-- @param separator      [optional] the separator pattern (defaults ot any&lt;br /&gt;
--                       white space).&lt;br /&gt;
-- @return               A list of annotated tokens.&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
local function diff(old, new, separator)&lt;br /&gt;
   assert(old); assert(new)&lt;br /&gt;
   new = split(new, separator); old = split(old, separator)&lt;br /&gt;
&lt;br /&gt;
   -- First, compare the beginnings and ends of strings to remove the common&lt;br /&gt;
   -- prefix and suffix.  Chances are, there is only a small number of tokens&lt;br /&gt;
   -- in the middle that differ, in which case  we can save ourselves a lot&lt;br /&gt;
   -- in terms of LCS computation.&lt;br /&gt;
   local prefix = &amp;quot;&amp;quot; -- common text in the beginning&lt;br /&gt;
   local suffix = &amp;quot;&amp;quot; -- common text in the end&lt;br /&gt;
   while old[1] and old[1] == new[1] do&lt;br /&gt;
      local token = table.remove(old, 1)&lt;br /&gt;
      table.remove(new, 1)&lt;br /&gt;
      prefix = prefix..token&lt;br /&gt;
   end&lt;br /&gt;
   while old[#old] and old[#old] == new[#new] do&lt;br /&gt;
      local token = table.remove(old)&lt;br /&gt;
      table.remove(new)&lt;br /&gt;
      suffix = token..suffix&lt;br /&gt;
   end&lt;br /&gt;
&lt;br /&gt;
   -- Setup a table that will store the diff (an upvalue for get_diff). We&amp;#039;ll&lt;br /&gt;
   -- store it in the reverse order to allow for tail calls.  We&amp;#039;ll also keep&lt;br /&gt;
   -- in this table functions to handle different events.&lt;br /&gt;
   local rev_diff = {&lt;br /&gt;
      put  = function(self, token, type) table.insert(self, {token,type}) end,&lt;br /&gt;
      ins  = function(self, token) self:put(token, IN) end,&lt;br /&gt;
      del  = function(self, token) self:put(token, OUT) end,&lt;br /&gt;
      same = function(self, token) if token then self:put(token, SAME) end end,&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
   -- Put the suffix as the first token (we are storing the diff in the&lt;br /&gt;
   -- reverse order)&lt;br /&gt;
&lt;br /&gt;
   rev_diff:same(suffix)&lt;br /&gt;
&lt;br /&gt;
   -- Define a function that will scan the LCS matrix backwards and build the&lt;br /&gt;
   -- diff output recursively.&lt;br /&gt;
   local function get_diff(C, old, new, i, j)&lt;br /&gt;
      local old_i = old[i]&lt;br /&gt;
      local new_j = new[j]&lt;br /&gt;
      if i &amp;gt;= 1 and j &amp;gt;= 1 and old_i == new_j then&lt;br /&gt;
         rev_diff:same(old_i)&lt;br /&gt;
         return get_diff(C, old, new, i-1, j-1)&lt;br /&gt;
      else&lt;br /&gt;
         local Cij1 = C[i][j-1]&lt;br /&gt;
         local Ci1j = C[i-1][j]&lt;br /&gt;
         if j &amp;gt;= 1 and (i == 0 or Cij1 &amp;gt;= Ci1j) then&lt;br /&gt;
            rev_diff:ins(new_j)&lt;br /&gt;
            return get_diff(C, old, new, i, j-1)&lt;br /&gt;
         elseif i &amp;gt;= 1 and (j == 0 or Cij1 &amp;lt; Ci1j) then&lt;br /&gt;
            rev_diff:del(old_i)&lt;br /&gt;
            return get_diff(C, old, new, i-1, j)&lt;br /&gt;
         end&lt;br /&gt;
      end&lt;br /&gt;
   end&lt;br /&gt;
   -- Then call it.&lt;br /&gt;
   get_diff(quick_LCS(old, new), old, new, #old + 1, #new + 1)&lt;br /&gt;
&lt;br /&gt;
   -- Put the prefix in at the end&lt;br /&gt;
   rev_diff:same(prefix)&lt;br /&gt;
&lt;br /&gt;
   -- Reverse the diff.&lt;br /&gt;
   local diff = {}&lt;br /&gt;
&lt;br /&gt;
   for i = #rev_diff, 1, -1 do&lt;br /&gt;
      table.insert(diff, rev_diff[i])&lt;br /&gt;
   end&lt;br /&gt;
   diff.to_html = format_as_html&lt;br /&gt;
   return diff&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
-- Wiki diff style, currently just for a line&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
local function wikiDiff(old, new, separator, opts)&lt;br /&gt;
  opts = opts or {}&lt;br /&gt;
  local tokens = diff(old, new, separator)&lt;br /&gt;
  local root = mw.html.create(&amp;#039;&amp;#039;)&lt;br /&gt;
  root:wikitext(mw.getCurrentFrame():extensionTag(&amp;#039;templatestyles&amp;#039;, &amp;#039;&amp;#039;, {src = &amp;#039;Module:Diff/styles.css&amp;#039;}))&lt;br /&gt;
&lt;br /&gt;
  local token, status&lt;br /&gt;
&lt;br /&gt;
  -- Override default border-width for browsers that support them.&lt;br /&gt;
  -- Needed for RTL support; forbidden in TemplateStyles.&lt;br /&gt;
  local tdSharedStyle = &amp;#039;border-inline-end-width: 1px; border-inline-start-width: 4px;&amp;#039;&lt;br /&gt;
    &lt;br /&gt;
  local is_different = false&lt;br /&gt;
  for _, token_record in ipairs(tokens) do&lt;br /&gt;
    if token_record[2] ~= SAME then&lt;br /&gt;
      is_different = true&lt;br /&gt;
      break&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local tbl = root:tag(&amp;#039;table&amp;#039;):attr(&amp;#039;lang&amp;#039;, &amp;#039;&amp;#039;):addClass(&amp;#039;diff&amp;#039;)&lt;br /&gt;
  if (opts.oldTitle or opts.newTitle) then&lt;br /&gt;
    local tr = tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
    tr:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
      :attr(&amp;#039;scope&amp;#039;, &amp;#039;col&amp;#039;)&lt;br /&gt;
      :attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;)&lt;br /&gt;
      :wikitext(opts.oldTitle)&lt;br /&gt;
    tr:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
      :attr(&amp;#039;scope&amp;#039;, &amp;#039;col&amp;#039;)&lt;br /&gt;
      :attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;)&lt;br /&gt;
      :wikitext(opts.newTitle)&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  local tr = tbl:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
  tr:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
    :addClass(&amp;#039;diff-marker&amp;#039;)&lt;br /&gt;
    :wikitext(is_different and &amp;#039;−&amp;#039; or &amp;#039;&amp;amp;#160;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
  local deleted = tr&lt;br /&gt;
    :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
      :cssText(tdSharedStyle)&lt;br /&gt;
      :addClass(is_different and &amp;#039;diff-deletedline&amp;#039; or &amp;#039;diff-context&amp;#039;)&lt;br /&gt;
      :tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
  for i, token_record in ipairs(tokens) do&lt;br /&gt;
    token = mw.text.nowiki(token_record[1])&lt;br /&gt;
    status = token_record[2]&lt;br /&gt;
    if status == OUT then&lt;br /&gt;
      deleted&lt;br /&gt;
        :tag(&amp;#039;del&amp;#039;)&lt;br /&gt;
          :addClass(&amp;#039;diffchange&amp;#039;)&lt;br /&gt;
          :addClass(&amp;#039;diffchange-inline&amp;#039;)&lt;br /&gt;
          :wikitext(token)&lt;br /&gt;
    elseif status == SAME then&lt;br /&gt;
      deleted:wikitext(token)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  tr:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
    :addClass(&amp;#039;diff-marker&amp;#039;)&lt;br /&gt;
    :wikitext(is_different and &amp;#039;+&amp;#039; or &amp;#039;&amp;amp;#160;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
  local inserted = tr&lt;br /&gt;
    :tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
      :cssText(tdSharedStyle)&lt;br /&gt;
      :addClass(is_different and &amp;#039;diff-addedline&amp;#039; or &amp;#039;diff-context&amp;#039;)&lt;br /&gt;
      :tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
  for i, token_record in ipairs(tokens) do&lt;br /&gt;
    token = mw.text.nowiki(token_record[1])&lt;br /&gt;
    status = token_record[2]&lt;br /&gt;
    if status == IN then&lt;br /&gt;
      inserted&lt;br /&gt;
        :tag(&amp;#039;ins&amp;#039;)&lt;br /&gt;
          :addClass(&amp;#039;diffchange&amp;#039;)&lt;br /&gt;
          :addClass(&amp;#039;diffchange-inline&amp;#039;)&lt;br /&gt;
          :wikitext(token)&lt;br /&gt;
    elseif status == SAME then&lt;br /&gt;
      inserted:wikitext(token)&lt;br /&gt;
    end&lt;br /&gt;
  end&lt;br /&gt;
&lt;br /&gt;
  return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyVal(val)&lt;br /&gt;
	if ((type(val) == &amp;#039;string&amp;#039;) and (val == &amp;#039;&amp;#039;)) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function main(frame)&lt;br /&gt;
	local args = frame.args&lt;br /&gt;
	local pargs = (frame:getParent() or {}).args or {}&lt;br /&gt;
	return wikiDiff(&lt;br /&gt;
		mw.text.unstrip(mw.text.decode(args[1])),&lt;br /&gt;
		mw.text.unstrip(mw.text.decode(args[2])),&lt;br /&gt;
		frame.args[3] or &amp;#039;[%s%.:-]+&amp;#039;,&lt;br /&gt;
		{&lt;br /&gt;
			oldTitle = tidyVal(args[&amp;#039;1title&amp;#039;]) or tidyVal(pargs[&amp;#039;1title&amp;#039;]),&lt;br /&gt;
			newTitle = tidyVal(args[&amp;#039;2title&amp;#039;]) or tidyVal(pargs[&amp;#039;2title&amp;#039;]),&lt;br /&gt;
		}&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
  diff = diff,&lt;br /&gt;
  wikiDiff = wikiDiff,&lt;br /&gt;
  main = main&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Colani</name></author>
	</entry>
</feed>