Module:TwitterSnowflake and Module:TwitterSnowflake/sandbox: Difference between pages
Appearance
(Difference between pages)
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 |
|||
p.main = function(frame) |
|||
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 |
||
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 |
||
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>|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>|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>|date=</kbd> mismatches calculated date from <kbd>|number=</kbd> by two or more days;', |
|||
if abs_datediff(testResult) > 1 then return errors[1] end |
|||
error2 = ' Missing or empty <kbd>|date=</kbd>, and posted before November 4, 2010;', |
|||
elseif not args.id_str:match('^%s*$') then |
|||
error3 = ' Invalid <kbd>|number=</kbd> parameter;' |
|||
local testResult = p.getDate{ args = { id_str = args.id_str }} |
|||
}} |
|||
if testResult == -1 then return errors[2] 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 |
||