Module:Cite tweet

From Fanverse
Jump to navigation Jump to search

Documentation for this module may be created at Module:Cite tweet/doc

local TwitterSnowflake = require('Module:TwitterSnowflake')

local err_msgs_t = {
	' <kbd>&#124;date=</kbd> / <kbd>&#124;number=</kbd> mismatch;',
	' <kbd>&#124;date=</kbd> required;',
	' Invalid <kbd>&#124;number=</kbd>;',
	' Missing or empty <kbd>&#124;number=</kbd>;',
	' Missing or empty <kbd>&#124;user=</kbd>;'
}


local function suppress_url_in_title(frame, title)
	local schemes = {
		'https://',
		'http://',
		'ftp://',
	}

	if title then
		for _, scheme in ipairs(schemes) do
			title = title:gsub(
				scheme,
				frame:callParserFunction('#tag', {'nowiki', scheme})
			)
		end
	end

	return title
end


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

	cite_args_t.url = 'https://x.com/'

	if not args_t.user then
		table.insert(errors_t, err_msgs_t[5])
	end

	if not args_t.date and not args_t.number then
		err_msg_index = 4

	elseif args_t.number then

		if tonumber(args_t.number) then
			cite_args_t.date =
				args_t.date or
				TwitterSnowflake.snowflakeToDate{
					args = { id_str = args_t.number }
				}

			cite_args_t.number = args_t.number

			if args_t.user then
				cite_args_t.url =
					cite_args_t.url .. args_t.user .. '/status/' .. args_t.number
			end

		else
			err_msg_index = 3
		end

	elseif args_t.date then
		cite_args_t.date = args_t.date
		err_msg_index = 4
	end


	if err_msg_index then
		table.insert(errors_t, err_msgs_t[err_msg_index])
		return
	end


	err_msg_index = TwitterSnowflake.datecheck({
		args = {
			id_str = args_t.number or '',
			date = args_t.date or '',
			error1 = 1,
			error2 = 2,
			error3 = 3
		}
	})


	if err_msg_index == 2 then
		cite_args_t.date = nil
	end

	if err_msg_index then
		table.insert(errors_t, err_msgs_t[err_msg_index])
	end
end



local function main(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 (social media)|Tweet]]',
		location = args_t.location,
		['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 = {
		'<span class="cs1-visible-error citation-comment"> <kbd>{{[[Template:Cite tweet|Cite tweet]]}}</kbd>:'
	}


	date_number_url_get(args_t, cite_args_t, errors_t)


	local author =
		((cite_args_t.last1 and cite_args_t.first1) and cite_args_t.last1 .. ', ' .. cite_args_t.first1)
		or (cite_args_t.last1 and cite_args_t.last1)
		or (cite_args_t.author1 and cite_args_t.author1:gsub('^%(%((.+)%)%)$', '%1'))


	if author and args_t.user then
		cite_args_t['author-mask'] = author .. ' [@' .. args_t.user .. ']'

	elseif args_t.user then
		cite_args_t.author1 = '((' .. args_t.user .. '))'
		cite_args_t['author-mask'] = '@' .. args_t.user

	else
		cite_args_t.author1 = nil
	end


	local rendering = require('Module:Citation/CS1')._citation(nil, cite_args_t, {CitationClass = 'web'})


	if errors_t[2] then

		if rendering:find('cs1-visible-error', 1, true) then
			errors_t[1] = errors_t[1]:gsub('> <', '>; <')
		end

		errors_t[#errors_t] =
			errors_t[#errors_t]:gsub(
				';$',
				' ([[Template:Cite_tweet#Error_detection|help]])'
			)

		table.insert(errors_t, '</span>')


		if mw.title.getCurrentTitle():inNamespace(0) then
			table.insert(errors_t, '[[Category:Cite tweet templates with errors]]')
		end


		rendering = rendering .. table.concat(errors_t)
	end

	return rendering
end



return {
	main = main,
	[''] = main
}