Mô đun:Chú thích tweet

local p = {}
local TwitterSnowflake = require('Mô đun:TwitterSnowflake')
local CiteWeb = require('Mô đun:Chú thích web')[]
local replace_vietnamese_date = require('Mô đun:Citation/CS1/Date validation').replace_vietnamese_date

local err_msgs_t = { -- a sequence of snowflake date error messages; all must be terminated with a semicolon (;)
' &124;date= / &124;number= không khớp;', -- [1]
' Cần &124;date=;', -- [2]
' &124;number= không hợp lệ;', -- [3]
' &124;number= thiếu hoặc bị trống;', -- [4]
' &124;user= thiếu hoặc bị trống;' -- [5]
}

--------------------------------------------------------------------------------------------------

p.main = function(frame)
return p[](frame)
end

--title=, |script-title=, and |trans-title= parameters so that
won't emit 'External link in |title=' error messages when rendered In the redering, urls are correctly
formed as they were in the original tweet. The function looks for valid schemes and then wraps them in
.. tags.

local function suppress_url_in_title (frame, title)
local schemes = { -- schemes commonly found in tweets
'https://',
'http://',
'ftp://',
}

if title then -- when there is a title, suppress any urls with known schemes; abandon else
for _, scheme in ipairs (schemes) do -- spin through the list of schemes looking for a match
title = title:gsub (scheme, frame:callParserFunction ('tag', {'nowiki', scheme})); -- replace the scheme with its nowiki'd form (a strip marker)
end
end

return title; -- done; return modified or not
end

--date= and |number= parameter values if present. Extract date from |number= and compare to |date=.

contruct |url= for from the base url and |number= and |user=

returns nothing; adds date, number, url to ; adds error message(s) to .

local function date_number_url_get (args_t, cite_args_t, errors_t)
local err_msg_index;

cite_args_t.url = 'https://x.com/'; -- initialize with minimal base url because requires |url=
if not args_t.user then
table.insert (errors_t, err_msgs_t[5]); -- error: missing or empty |user=
end

if not args_t.date and not args_t.number then
err_msg_index = 4; -- error: missing or empty |number=
elseif tonumber (args_t.number) then -- |number= without |date=? use number
if tonumber(args_t.number) then
cite_args_t.date = args_t.date or (args_t.number and TwitterSnowflake.snowflakeToDate{ args = {id_str = args_t.number} });
else
cite_args_t.date = args_t.date;
end
cite_args_t.number = args_t.number;

if args_t.user then -- |number= appears to have a valid value; if |user= has a value
cite_args_t.url = cite_args_t.url .. args_t.user .. '/status/' .. args_t.number; -- construct |url= for
end
elseif args_t.number then -- |number= with a value that can't be converted to a number; invalid
err_msg_index = 3; -- error: invalid number (couldn't convert to number)
elseif not args_t.number then -- |date= without |number= use date
cite_args_t.date = args_t.date; -- |date= has a value, use it
err_msg_index = 4; -- error: missing or empty |number=
end

if err_msg_index then
table.insert (errors_t, err_msgs_t[err_msg_index]); -- invalid number or missing necessary parameters so abandon
return;
end

if args_t.date then
replace_vietnamese_date(args_t.date);
return;
end

err_msg_index = TwitterSnowflake.datecheck ({ args = { -- returns error message index number on error; nil else
id_str = args_t.number or ,
date = args_t.date or ,
error1 = 1, -- these numbers are indexes into to override snowflake default error messages
error2 = 2, -- done this way to avoid long string comparison looking for
error3 = 3 -- the undated-pre-twitter-epoch-post message
}});

if 2 == err_msg_index then -- when no date and posted before twitter epoch
cite_args_t.date = nil; -- suppress default date because should not claim in its own voice that the undated post was posted 2010-11-04
end

table.insert (errors_t, err_msgs_t[err_msg_index]); -- add error message
end

----------------------------------------------------------------------------------------------------

construct parameter set for from parameters; do some error checking

p[] = function(frame)
local args_t = require ('Module:Arguments').getArgs (frame);

local cite_args_t = {
title = suppress_url_in_title (frame, args_t.title),
['script-title'] = suppress_url_in_title (frame, args_t['script-title']),
['trans-title'] = suppress_url_in_title (frame, args_t['trans-title']),
language = args_t.language,
last1 = args_t.last1 or args_t.last,
first1 = args_t.first1 or args_t.first,
author1 = args_t.author1 or args_t.author,
['author-link'] = args_t['author-link'] or args_t.authorlink,
others = args_t.retweet and ('Retweeted by ' .. args_t.retweet),
via = args_t.link == 'no' and 'Twitter' or 'Twitter',
type = args_t.link == 'no' and 'Tweet' or 'Tweet',
location = args_t.location, -- why |location=? tweets are online; there is no publication place
['access-date'] = args_t['access-date'] or args_t.accessdate,
['archive-date'] = args_t['archive-date'] or args_t.archivedate,
['archive-url'] = args_t['archive-url'] or args_t.archiveurl,
['url-status'] = args_t['url-status'],
['url-access'] = args_t['url-access'],
quote = args_t.quote,
ref = args_t.ref,
df = args_t.df,
mode = args_t.mode
}

local errors_t = {' :'}; -- initialize sequence of error messages with style tag
date_number_url_get (args_t, cite_args_t, errors_t); -- add |date=, |number=, |url= to

local author = ((cite_args_t.last1 and cite_args_t.first1) and cite_args_t.last1 .. ', ' .. cite_args_t.first1) or -- concatenate |last= with |first= for |author-mask=
(cite_args_t.last1 and cite_args_t.last1) or -- only |last= for |author-mask=
(cite_args_t.author1 and cite_args_t.author1:gsub('^%(%((.+)%)%)$', '%1')); -- |author= or |author1= stripped of accept-as-written markup for |author-mask=

if author and args_t.user then
cite_args_t['author-mask'] = author .. ' [@' .. (args_t.user or ) .. ']' -- concatenate and |user= into |author-mask=
elseif args_t.user then
cite_args_t.author1 = '((' .. args_t.user .. '))'; -- just the user name for cs1|2 metadata
cite_args_t['author-mask'] = '@' .. args_t.user; -- make a mask for display
else -- here when neither nor |user=
cite_args_t.author1 = nil; -- so unset
end

frame.args = cite_args_t; -- overwrite frame arguments
local rendering = CiteWeb (frame); -- render the template

---------- error messaging ----------
if errors_t[2] then -- errors_t[2] nil when no errors
if rendering:find ('cs1-visible-error', 1, true) then -- rendered with errors will have this string
errors_t[1] = errors_t[1]:gsub ('> ; '); -- close style span tag
if mw.title.getCurrentTitle():inNamespace (0) then -- mainspace only
table.insert (errors_t, ); -- add error category
end

rendering = rendering .. table.concat (errors_t); -- append error messaging, help links and catagories
end
return rendering;
end

return p