Модуль:Cite tweet
Документація модуля[перегляд] [редагувати] [історія] [очистити кеш]
Цей модуль позначений як К:реліз, готовий до загального вжитку (47). Він досягнув стадії готовності й вважається, що вільний від помилок і може використовуватись всюди, де знадобиться. Його можна вживати на допоміжних сторінках та інших сторінках Вікіпедії як можливість для навчання новачків. Аби зменшити навантаження на сервери та некоректний показ сторінок, його можна вдосконалювати в рамцях чернеткового тестування[en], а не з застосуванням спроб і помилок. |
Цей модуль залежить від наступних модулів: |
Використання
Цей модуль впроваджує роботу {{Cite tweet}}, через {{#invoke:Cite tweet|main}}.
У шаблонах або в статтях, що не можуть інакше вміститися в ліміт розміру розкритих включень[en], можна напряму викликати модуль як {{#invoke:Cite tweet||звичайні параметри шаблону cite tweet}}
: так само як і {{Cite tweet}} окрім першого пустого параметра.
У всіх інших звичайних статтях використовуйте {{Cite tweet}}
натомість, відповідно до Вікіпедія:Простір назв шаблонів#Модулі.
Документація вище включена з Модуль:Cite tweet/документація. (ред. | історія) Дописувачі можуть експериментувати на підсторінках пісочниці (ред. | різн.) та тести (створити) цього модуля. Будь ласка, додавайте категорії до підсторінки /документація. Підсторінки цієї сторінки. |
local p = {}
local TwitterSnowflake = require('Module:TwitterSnowflake')
local CiteWeb = require('Module:Cite web')['']
local err_msgs_t = { -- a sequence of snowflake date error messages; all must be terminated with a semicolon (;)
' Розбіжність дати в параметрах <kbd>|date=</kbd> / <kbd>|number=</kbd>;', -- [1]
' Вимагається параметр <kbd>|date=</kbd>;', -- [2]
' Недійсне значення параметра <kbd>|number=</kbd>;', -- [3]
' Відсутній або пустий параметр <kbd>|number=</kbd>;', -- [4]
' Відсутній або пустий параметр <kbd>|user=</kbd>;', -- [5]
' Перевірте значення дати у: <kbd>|date=</kbd>;' -- [6]
}
--[[--------------------------< M A I N >----------------------------------------------------------------------
]]
p.main = function(frame)
return p[''](frame)
end
--[[--------------------------< S U P P R E S S _ U R L _ I N _ T I T L E >------------------------------------
This function searches for and suppresses urls in |title=, |script-title=, and |trans-title= parameters so that
{{cite web}} 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
<nowiki>..</nowiki> 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 <title> modified or not
end
--[[--------------------------< D A T E _ N U M B E R _ U R L _ G E T >----------------------------------------
extract |date= and |number= parameter values if present. Extract date from |number= and compare to |date=.
contruct |url= for {{cite web}} from the base url and |number= and |user=
returns nothing; adds date, number, url to <cite_args_t>; adds error message(s) to <errors_t>.
]]
local function date_number_url_get (args_t, cite_args_t, errors_t)
local err_msg_index;
cite_args_t.url = 'https://twitter.com/'; -- initialize with minimal base url because {{cite web}} 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
cite_args_t.date = TwitterSnowflake.snowflakeToDate ({ args = {id_str = args_t.number} }); -- sets cite_args_t.date post-date or to 'November 4, 2010' when tweet posted before that date
-- 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 {{cite web}}
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
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 <err_msgs_t> 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
error4 = 6 -- date in unsupported format
}});
if 2 == err_msg_index then -- when no date and posted before twitter epoch
cite_args_t.date = nil; -- suppress default date because {{cite tweet}} 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
--[[--------------------------< p[''] >------------------------------------------------------------------------
construct parameter set for {{cite web}} from {{cite tweet}} parameters; do some error checking
]]
p[''] = function(frame)
local args_t = require ('Module:Arguments').getArgs (frame);
--Нижче переприсвоєння параметрів для підтримки україномовних параметрів
args_t.date = args_t.date or args_t['дата']
args_t.user = args_t.user or args_t['користувач']
args_t.number = args_t.number or args_t['номер']
args_t.retweet = args_t.retweet or args_t['ретвіт'] -- краще тут переприсвоїти ніж потім двічі писати цей код
args_t.link = args_t.link or args_t['посилання'] -- така ж ситуації і для посилання
if not (args_t.date == nil or args_t.date == '') then
args_t.date = args_t.date:gsub(" року", "") -- прибираємо слово «року» разом із пробілом, щоб не заважав перевіряти дату (в TwitterSnowflake ширша перевірка на неправильний формат здійснюється)
end
local is_link_true = (args_t.link == 'no' or args_t.link == 'ні') -- отримуємо булеве значення тут, що додати підтримку слова «ні»
local cite_args_t = {
title = suppress_url_in_title (frame, args_t.title or args_t['назва']),
['script-title'] = suppress_url_in_title (frame, args_t['script-title'] or args_t['переклад-назви']),
['trans-title'] = suppress_url_in_title (frame, args_t['trans-title'] or args_t['письмо-назви']),
language = args_t.language or args_t['мовою'] or args_t['мова'],
last1 = args_t.last1 or args_t.last or args_t['прізвище'] or args_t['прізвище1'],
first1 = args_t.first1 or args_t.first or args_t['ім\'я'] or args_t['ім\'я1'],
author1 = args_t.author1 or args_t.author or args_t['автор'] or args_t['автор1'],
['author-link'] = args_t['author-link'] or args_t.authorlink or args_t['автор-посилання'],
others = args_t.retweet and ('Ретвіт від ' .. args_t.retweet),
via = is_link_true and 'Твіттер' or '[[Твіттер]]',
type = 'Твіт',
location = args_t.location or args_t['розташування'], -- why |location=? tweets are online; there is no publication place
['access-date'] = args_t['access-date'] or args_t.accessdate or args_t['дата-доступу'],
['archive-date'] = args_t['archive-date'] or args_t.archivedate or args_t['дата-архіву'],
['archive-url'] = args_t['archive-url'] or args_t.archiveurl or args_t['url-архіву'],
['url-status'] = args_t['url-status'] or args_t['статус-url'],
['dead-url'] = args_t['dead-url'] or args_t.deadurl or args_t['мертвий-url'],
quote = args_t.quote or args_t['цитата'],
ref = args_t.ref or args_t['якірець'],
df = args_t.df or args_t['фд'],
mode = args_t.mode or args_t['режим']
}
local errors_t = {'<span class="cs1-visible-error citation-comment"> <kbd>{{[[Шаблон:Cite tweet|Cite tweet]]}}</kbd>:'}; -- initialize sequence of error messages with style tag
date_number_url_get (args_t, cite_args_t, errors_t); -- add |date=, |number=, |url= to <cite_args_t>
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 <author> 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 <author> 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 {{cite web}} with errors will have this string
errors_t[1] = errors_t[1]:gsub ('> <', '>; <'); -- insert semicolon to terminate cs1|2 error message string
end
errors_t[#errors_t] = errors_t[#errors_t]:gsub (';$',' ([[Шаблон:Cite_tweet#Помилки|довідка]])'); -- replace trailing semicolon with help link
table.insert (errors_t, '</span>'); -- close style span tag
if mw.title.getCurrentTitle():inNamespace (0) then -- mainspace only
table.insert (errors_t, '[[Категорія:Шаблони Cite tweet з помилками]]'); -- add error category
end
rendering = rendering .. table.concat (errors_t); -- append error messaging, help links and catagories
end
return rendering;
end
return p