Jump to content

Module:TwitterSnowflake and Module:TwitterSnowflake/sandbox: Difference between pages

(Difference between pages)
Page 1
Page 2
Content deleted Content added
Fix a Lua error appearing on pages such as August 11 when there's no date
 
sync
 
Line 1: Line 1:
local p = {}
local p = {}
local TwitterSnowflake = require('Module:TwitterSnowflake')
local CiteWeb = require('Module:Cite web')['']


local function _if(arg)
local Date = require('Module:Date')._Date
return arg and arg ~= '' or nil
end


function p.snowflakeToDate(frame)
p.main = function(frame)
local format = frame.args.format or "%B %e, %Y"
frame.args = frame:getParent().args
return p[''](frame)
local epoch = tonumber(frame.args.epoch) or 1288834974
local id_str = frame.args.id_str
if type(id_str) ~= "string" then error("bad argument #1 (expected string, got " .. type(id_str) .. ")", 2) end
if type(format) ~= "string" then error("bad argument #2 (expected string, got " .. type(format) .. ")", 2) end
if type(epoch) ~= "number" then error("bad argument #3 (expected number, got " .. type(epoch) .. ")", 2) end
local hi, lo = 0, 0
local hiexp = 1
local two32 = 2^32
for c in id_str:gmatch(".") do
lo = lo * 10 + c
if lo >= two32 then
hi, lo = hi * 10^hiexp + math.floor(lo / two32), lo % two32
hiexp = 1
else hiexp = hiexp + 1 end
end
hi = hi * 10^(hiexp-1)
local timestamp = math.floor((hi * 1024 + math.floor(lo / 4194304)) / 1000) + epoch
return os.date(format, timestamp)
end
end


function p.getDate(frame)
p[''] = function(frame)
local args = frame.args
-- just pass frame directly to snowflakeToDate, this wraps it but the args are the same plus
local cite_args = {
if (frame.args.id_str):match("%D") then -- not a number, so return -2
url = 'https://twitter.com/' .. ((args.user and args.number) and (args.user .. '/status/' .. args.number) or ''),
return -2
title = (args.title or ''):gsub('https*://', ''),
['script-title'] = args['script-title'],
['trans-title'] = args['trans-title'],
language = args.language,
['author-link'] = args['author-link'] or args.authorlink,
others = _if(args.retweet) and ('Retweeted by ' .. args.retweet),
via = args.link == 'no' and 'Twitter' or '[[Twitter]]',
type = 'Tweet',
location = args.location,
['access-date'] = args['access-date'] or args.accessdate,
['archive-date'] = args['archive-date'] or args.archivedate,
['archive-url'] = args['archive-url'] or args.archiveurl,
['url-status'] = args['url-status'] or args['dead-url'] or args.deadurl,
quote = args.quote,
ref = args.ref,
df = args.df
}
if _if(args.last1 or args.last) then
cite_args.author = (args.last1 or args.last) ..
(_if(args.first1 or args.first) and (', ' .. (args.first1 or args.first)) or '') ..
' [@' .. (args.user or '') .. ']'
elseif _if(args.author1 or args.author) then
cite_args.author = (args.author1 or args.author) .. ' [@' .. (args.user or '') .. ']'
elseif _if(args['author-link']) then
cite_args.author = args['author-link'] .. ' [@' .. (args.user or '') .. ']'
else
cite_args.author = '@' .. (args.user or '')
end
end
if cite_args.author:find ('[Tt]witter') then
frame.args.format = "%B %e, %Y"
cite_args.author = '((' .. cite_args.author .. '))'
if frame.args.date then
frame.args.date = mw.ustring.gsub(frame.args.date, "(%d%d%d%d)%a", "%1")
end
end
frame.args.epoch = tonumber(frame.args.epoch) or 1288834974
if _if(tonumber(args.number)) then
cite_args.date = args.date or (_if(args.number) and TwitterSnowflake.snowflakeToDate{ args = {id_str = args.number} })
local epochdate = Date(os.date("%B %e, %Y", frame.args.epoch))
else
local twitterdate = Date(p.snowflakeToDate(frame))
cite_args.date = args.date
if twitterdate == epochdate then -- created before epoch, so can't determine the date
return -1
end
end
local date = Date(frame.args.date) or 0 -- if we error here, then an input of no date causes an error, which is contrary to the entire way {{TwitterSnowflake/datecheck}} works
frame.args = cite_args
return date - twitterdate
local output = CiteWeb(frame)
end
frame.args = args

local function abs_datediff(x)
-- Error checking
if type(x) == 'number' then return math.abs(x) end
local error_template = '<span class="cs1-visible-error citation-comment">%s</span>'
return math.abs(x.age_days)
local errors = {}
end
if not (_if(args.title) or _if(args['script-title']) or args.user or args.number or args.date) then

-- No title; error message is provided by CS1 module.
function p.datecheck(frame)
errors[1] = ';'
local args = frame.args
if not (args.date and args.id_str) then
error('Must define date and id_str, even if they are blank.')
end
end
if not _if(args.user) then
local errors = {
errors[1 + #errors] = ' Missing or empty <kbd>&#124;user=</kbd>;'
args.error1 or 'Date mismatch of two or more days',
end
args.error2 or 'No date, and posted before November 4, 2010',
if not _if(args.number) then
args.error3 or 'Invalid id_str'
errors[1 + #errors] = ' Missing or empty <kbd>&#124;number=</kbd>;'
}
if mw.title.getCurrentTitle():inNamespace(0) and args.error_cat then
for i = 1, 3 do errors[i] = errors[i] .. '[[' .. args.error_cat .. ']]' end
end
end
errors[1 + #errors] = TwitterSnowflake.datecheck{ args = {
if not args.date:match('^%s*$') then -- #if:{{{date|}}}
id_str = args.number or '',
local testResult = p.getDate{ args = { date = args.date, id_str = args.id_str }}
date = args.date or '',
if testResult == -2 then return errors[3] end
error1 = ' <kbd>&#124;date=</kbd> mismatches calculated date from <kbd>&#124;number=</kbd> by two or more days;',
if abs_datediff(testResult) > 1 then return errors[1] end
error2 = ' Missing or empty <kbd>&#124;date=</kbd>, and posted before November 4, 2010;',
elseif not args.id_str:match('^%s*$') then
error3 = ' Invalid <kbd>&#124;number=</kbd> parameter;'
local testResult = p.getDate{ args = { id_str = args.id_str }}
}}
if testResult == -1 then return errors[2] end
if testResult == -2 then return errors[3] end
if errors[1] then
local last = errors[#errors]
errors[#errors] = last:sub(1, #last - 1) .. ' ([[Template:Cite_tweet#Error_detection|help]])'
local error_out = error_template:rep(#errors):format(unpack(errors))
if mw.title.getCurrentTitle():inNamespace(0) then
error_out = error_out .. '[[Category:Cite tweet templates with errors]]'
end
output = output .. error_out
end
end
return output
end
end