وحدة:Clickable button 2

-- This module implements {{clickable button 2}}.

local yesno = require('Module:Yesno')
local delink = require('Module:Delink')._delink

local p = {}

function p.main(frame)
 local getArgs = require('Module:Arguments').getArgs
 local args = getArgs(frame)
 return p._main(args)
end

function p._main(args)
 -- If first arg or a url is not provided,
 -- but we have a second arg, make a button.
 -- Otherwise, return nothing.
 args.originalInput = args[1]
 args[1] = delink({args[1]})
 if args[1] == "" then
  args[1] = nil
 end

 if not args[1] and not args.url then
  if args[2] then
   p.nolink = true
  else
   return ''
  end
 end

 local data = p.makeLinkData(args)
 local link = p.renderLink(args.originalInput, data)
 local trackingCategories = p.renderTrackingCategories(args)
 return link .. trackingCategories
end

function p.makeLinkData(args)
 local data = {}

 -- Get the link and display values,
 -- and find whether we are outputting
 -- a wikilink or a URL.
 if args.url then
  data.isUrl = true
  data.link = args.url
  if args[1] then
   data.display = args[1]
  elseif args[2] then
   data.display = args[2]
  else
   data.display = args.url
   p.urlisdisplay = true
  end
 else
  data.isUrl = false
  p.urlisdisplay = false
  data.link = args[1]
  if args[2] then
   data.display = args[2]
  else
   data.display = args[1]
  end
  if args[1] and args[1]:find('http') then
   data.isUrl = true
  end
 end
	
 if yesno(args.link) == false then
  p.nolink = true
 end

 -- Colours
 -- For the merge with {{clickable button}}
 local colour = args.color and args.color:lower()

 -- Classes
 local class = args.class and args.class:lower()
 data.classes = {}
 if class == 'ui-button-green'
  or class == 'ui-button-blue'
  or class == 'ui-button-red'
 then
  table.insert(
   data.classes,
   'submit ui-button ui-widget ui-state-default ui-corner-all'
    .. ' ui-button-text-only ui-button-text'
  )
 else
  table.insert(data.classes, 'mw-ui-button')
 end
	
 -- If class is unset, then let color determine class
 if not class then
  if colour == 'blue' then
   class = 'mw-ui-progressive'
  elseif colour == 'red' then
   class = 'mw-ui-destructive'
  elseif colour == 'green' then
   class = 'mw-ui-constructive'
  end
 end
	
 if class then
  table.insert(data.classes, class)
 end

 -- Styles
 do
  --[[
  -- Check whether we are on the same page as we have specified in
  -- args[1], but not if we are using a URL link, as then args[1] is only
  -- a display value. If we are currently on the page specified in
  -- args[1] make the button colour darker so that it stands out from
  -- other buttons on the page.
  --]]
  local success, linkTitle, currentTitle
  if not data.isUrl then
   currentTitle = mw.title.getCurrentTitle()
   success, linkTitle = pcall(mw.title.new, args[1])
  elseif p.urlisdisplay then
   currentTitle = mw.title.getCurrentTitle()
  end
  if success
   and linkTitle
   and mw.title.equals(currentTitle, linkTitle)
   and not p.urlisdisplay
  then
   if class == 'ui-button-blue'
    or class == 'mw-ui-progressive'
    or class == 'mw-ui-constructive'
   then
    data.backgroundColor = '#2962CB'
    data.color = '#fff'
   elseif class == 'ui-button-green' then
    data.backgroundColor = '#008B6D'
   elseif class == 'ui-button-red' or class == 'mw-ui-destructive' then
    data.backgroundColor = '#A6170F'
   else
    data.backgroundColor = '#CCC'
    data.color = '#666'
   end
  elseif p.urlisdisplay then
   data.dummyLink = tostring(currentTitle)
  end
  -- Add user-specified styles.
  data.style = args.style
 end

 -- Collect all `data-*` attributes
 data.dataAttributes = {}
 for key, value in pairs(args) do
  if type(key) == 'string' and key:match("^data%-") then
   data.dataAttributes[key] = value
  end
 end
 
 return data
end

function p.renderLink(originalInput, data)
 -- Render the display span tag.
 local display
 do
  local displaySpan = mw.html.create('span')
  for i, class in ipairs(data.classes or {}) do
   displaySpan:addClass(class)
  end

  displaySpan
   :css{
    ['background-color'] = data.backgroundColor,
    color = data.color
   }
  if data.style then
   displaySpan:cssText(data.style)
  end
  displaySpan:wikitext(data.display)

  -- Add data-* attributes
  for key, value in pairs(data.dataAttributes) do
   displaySpan:attr(key, value)
  end

  display = tostring(displaySpan)
 end

 -- Render the link
 local link
 if originalInput and originalInput:find('|') then
  link = string.format('[[%s|%s]]', delink({originalInput, wikilinks = 'target'}), display)
 elseif p.nolink then
  if p.urlisdisplay then
   link = string.format('[[%s|%s]]', data.dummyLink, display)
  else
   link = string.format('%s', display)
  end
 else
  if data.isUrl then
   link = string.format('[%s %s]', data.link, display)
  else
   link = string.format('[[%s |%s]]', data.link, display)
  end
 end

 return string.format('<span class="plainlinks clickbutton">%s</span>', link)
end

function p.renderTrackingCategories(args)
 if yesno(args.category) == false then
  return ''
 end
 local class = args.class and args.class:lower()
 if class == 'ui-button-green'
  or class == 'ui-button-blue'
  or class == 'ui-button-red'
 then
  return '[[تصنيف:صفحات تستخدم نمط قديم لزر واجهة المستخدم]]'
 else
  return ''
 end
end

return p