Module:Cite tweet
Appearance
From Wikipedia, the free encyclopedia
This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing.
Page template-protected This module is currently protected from editing.
See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected.
See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected.
Warning This Lua module is used on approximately 46,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them.
This module depends on the following other modules:
Usage
This template implements {{Cite tweet }}, as {{#invoke:Cite tweet|main}}.
In templates, or in articles which cannot otherwise fit within the WP:PEIS limit, the module may be called directly as {{#invoke:Cite tweet|main|<normal arguments for cite tweet>}}: i.e. exactly the same as {{Cite tweet }} except for the extra first positional parameter.
In all normal articles use {{Cite tweet}} instead, per Wikipedia:Template namespace#Modules.
The above documentation is transcluded from Module:Cite tweet/doc. (edit | history)
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
Editors can experiment in this module's sandbox (edit | diff) and testcases (create) pages.
Subpages of this module.
localTwitterSnowflake=require('Module:TwitterSnowflake') localerr_msgs_t={-- a sequence of snowflake date error messages; all must be terminated with a semicolon (;) ' <kbd>|date=</kbd> / <kbd>|number=</kbd> mismatch;',-- [1] ' <kbd>|date=</kbd> required;',-- [2] ' Invalid <kbd>|number=</kbd>;',-- [3] ' Missing or empty <kbd>|number=</kbd>;',-- [4] ' Missing or empty <kbd>|user=</kbd>;'-- [5] } --[[--------------------------< 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. ]] localfunctionsuppress_url_in_title(frame,title) localschemes={-- schemes commonly found in tweets 'https://', 'http://', 'ftp://', } iftitlethen-- when there is a title, suppress any urls with known schemes; abandon else for_,schemeinipairs(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 returntitle;-- 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>. ]] localfunctiondate_number_url_get(args_t,cite_args_t,errors_t) localerr_msg_index; cite_args_t.url='https://x.com/';-- initialize with minimal base url because {{cite web}} requires |url= ifnotargs_t.userthen table.insert(errors_t,err_msgs_t[5]);-- error: missing or empty |user= end ifnotargs_t.dateandnotargs_t.numberthen err_msg_index=4;-- error: missing or empty |number= elseiftonumber(args_t.number)then-- |number= without |date=? use number iftonumber(args_t.number)then cite_args_t.date=args_t.dateor(args_t.numberandTwitterSnowflake.snowflakeToDate{args={id_str=args_t.number}}); else cite_args_t.date=args_t.date; end cite_args_t.number=args_t.number; ifargs_t.userthen-- |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 elseifargs_t.numberthen-- |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) elseifnotargs_t.numberthen-- |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 iferr_msg_indexthen 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.numberor'', date=args_t.dateor'', 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 }}); if2==err_msg_indexthen-- 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 --[[--------------------------< M A I N >---------------------------------------------------------------------- construct parameter set for {{cite web}} from {{cite tweet}} parameters; do some error checking ]] localfunctionmain(frame) localargs_t=require('Module:Arguments').getArgs(frame); localcite_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.last1orargs_t.last, first1=args_t.first1orargs_t.first, author1=args_t.author1orargs_t.author, ['author-link']=args_t['author-link']orargs_t.authorlink, others=args_t.retweetand('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,-- why |location=? tweets are online; there is no publication place ['access-date']=args_t['access-date']orargs_t.accessdate, ['archive-date']=args_t['archive-date']orargs_t.archivedate, ['archive-url']=args_t['archive-url']orargs_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 } localerrors_t={'<span class="cs1-visible-error citation-comment"> <kbd>{{[[Template: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> localauthor=((cite_args_t.last1andcite_args_t.first1)andcite_args_t.last1..', '..cite_args_t.first1)or-- concatenate |last= with |first= for |author-mask= (cite_args_t.last1andcite_args_t.last1)or-- only |last= for |author-mask= (cite_args_t.author1andcite_args_t.author1:gsub('^%(%((.+)%)%)$','%1'));-- |author= or |author1= stripped of accept-as-written markup for |author-mask= ifauthorandargs_t.userthen cite_args_t['author-mask']=author..' [@'..(args_t.useror'')..']'-- concatenate <author> and |user= into |author-mask= elseifargs_t.userthen 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 localrendering=require('Module:Citation/CS1')._citation(nil,cite_args_t,{CitationClass='web'}); ---------- error messaging ---------- iferrors_t[2]then-- errors_t[2] nil when no errors ifrendering: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(';$',' ([[Template:Cite_tweet#Error_detection|help]])');-- replace trailing semicolon with help link table.insert(errors_t,'</span>');-- close style span tag ifmw.title.getCurrentTitle():inNamespace(0)then-- mainspace only table.insert(errors_t,'[[Category:Cite tweet templates with errors]]');-- add error category end rendering=rendering..table.concat(errors_t);-- append error messaging, help links and catagories end returnrendering; end --[[--------------------------< E X P O R T S >---------------------------------------------------------------- ]] return{ main=main,-- entry points; {{#invoke:cite tweet|main|...}} is preferred ['']=main,-- but {{#invoke:cite tweet||...}} is also acceptable }