Wikipedia
ibawiki
https://iba.wikipedia.org/wiki/Lambar_Keterubah
MediaWiki 1.47.0-wmf.5
first-letter
Media
Spesyel
Randau
Penggena
Randau penggena
Wikipedia
Randau Wikipedia
Fail
Randau fail
MediaWiki
Randau MediaWiki
Templat
Randau templat
Bantu
Randau bantu
Kategori
Randau kategori
TimedText
TimedText talk
Modul
Randau modul
Acara
Perbincangan acara
Modul:Citation/CS1/Configuration
828
856
19249
15697
2026-06-09T13:18:26Z
Song GK
9
19249
Scribunto
text/plain
local lang_obj = mw.language.getContentLanguage(); -- make a language object for the local language; used here for languages and dates
--[[--------------------------< S E T T I N G S >--------------------------------------------------------------
boolean settings used to control various things. these setting located here to make them easy to find
]]
-- these settings local to this module only
local local_digits_from_mediawiki = false; -- for i18n; when true, module fills date_names['local_digits'] from MediaWiki; manual fill required else; always false at en.wiki
local local_date_names_from_mediawiki = false; -- for i18n; when true, module fills date_names['local']['long'] and date_names['local']['short'] from MediaWiki;
-- manual translation required else; ; always false at en.wiki
-- these settings exported to other modules
local use_identifier_redirects = true; -- when true use redirect name for identifier label links; always true at en.wiki
local local_lang_cat_enable = false; -- when true categorizes pages where |language=<local wiki's language>; always false at en.wiki
local date_name_auto_xlate_enable = false; -- when true translates English month-names to the local-wiki's language month names; always false at en.wiki
local date_digit_auto_xlate_enable = false; -- when true translates Western date digit to the local-wiki's language digits (date_names['local_digits']); always false at en.wiki
local enable_sort_keys = true; -- when true module adds namespace sort keys to error and maintenance category links
--[[--------------------------< U N C A T E G O R I Z E D _ N A M E S P A C E S >------------------------------
List of namespaces identifiers for namespaces that will not be included in citation error categories.
Same as setting notracking = true by default.
For wikis that have a current version of Module:cs1 documentation support, this #invoke will return an unordered
list of namespace names and their associated identifiers:
{{#invoke:cs1 documentation support|uncategorized_namespace_lister|all=<anything>}}
]]
local uncategorized_namespaces_t = {[2]=true}; -- init with user namespace id
for k, _ in pairs (mw.site.talkNamespaces) do -- add all talk namespace ids
uncategorized_namespaces_t[k] = true;
end
local uncategorized_subpages = {'/[Ss]andbox', '/[Tt]estcases', '/[^/]*[Ll]og', '/[Aa]rchive'}; -- list of Lua patterns found in page names of pages we should not categorize
--[[
at en.wiki Greek characters are used as sort keys for certain items in a category so that those items are
placed at the end of a category page. See Wikipedia:Categorization#Sort_keys. That works well for en.wiki
because English is written using the Latn script. This may not work well for other languages. At en.wiki it
is desireable to place content from certain namespaces at the end of a category listing so the module adds sort
keys to error and maintenance category links when rendering a cs1|2 template on a page in that namespace.
i18n: if this does not work well for your language, set <enable_sort_keys> to false.
]]
local name_space_sort_keys = { -- sort keys to be used with these namespaces:
[4] = 'ω', -- wikipedia; omega
[10] = 'τ', -- template; tau
[118] = 'Δ', -- draft; delta
['other'] = 'ο', -- all other non-talk namespaces except main (article); omicron
}
--[[--------------------------< M E S S A G E S >--------------------------------------------------------------
Translation table
The following contains fixed text that may be output as part of a citation.
This is separated from the main body to aid in future translations of this
module.
]]
local messages = {
['agency'] = '$1 $2', -- $1 is sepc, $2 is agency
['archived-dead'] = 'Archived from $1 on $2',
['archived-live'] = '$1 from the original on $2',
['archived-unfit'] = 'Archived from the original on ',
['archived'] = 'Archived',
['by'] = 'By', -- contributions to authored works: introduction, foreword, afterword
['cartography'] = 'Cartography by $1',
['editor'] = 'ed.',
['editors'] = 'eds.',
['edition'] = '($1 ed.)',
['episode'] = 'Episode $1',
['et al'] = 'et al.',
['in'] = 'In', -- edited works
['inactive'] = 'inactive',
['inset'] = '$1 inset',
['interview'] = 'Interviewed by $1',
['mismatch'] = '<code class="cs1-code">|$1=</code> / <code class="cs1-code">|$2=</code> mismatch', -- $1 is year param name; $2 is date param name
['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]: $1',
['notitle'] = 'No title', -- for |title=(()) and (in the future) |title=none
['original'] = 'the original',
['origdate'] = ' [$1]',
['published'] = ' (published $1)',
['retrieved'] = 'Retrieved $1',
['season'] = 'Season $1',
['section'] = '§ $1',
['sections'] = '§§ $1',
['series'] = '$1 $2', -- $1 is sepc, $2 is series
['seriesnum'] = 'Series $1',
['translated'] = 'Translated by $1',
['type'] = ' ($1)', -- for titletype
['written'] = 'Written at $1',
['vol'] = '$1 Vol. $2', -- $1 is sepc; bold journal style volume is in presentation{}
['vol-no'] = '$1 Vol. $2, no. $3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization)
['issue'] = '$1 No. $2', -- $1 is sepc
['art'] = '$1 Art. $2', -- $1 is sepc; for {{cite conference}} only
['vol-art'] = '$1 Vol. $2, art. $3', -- sepc, volume, article-number; for {{cite conference}} only
['j-vol'] = '$1 $2', -- sepc, volume; bold journal volume is in presentation{}
['j-issue'] = ' ($1)',
['j-article-num'] = ' $1', -- TODO: any punctuation here? static text?
['nopp'] = '$1 $2'; -- page(s) without prefix; $1 is sepc
['p-prefix'] = "$1 p. $2", -- $1 is sepc
['pp-prefix'] = "$1 pp. $2", -- $1 is sepc
['j-page(s)'] = ': $1', -- same for page and pages
['sheet'] = '$1 Sheet $2', -- $1 is sepc
['sheets'] = '$1 Sheets $2', -- $1 is sepc
['j-sheet'] = ': Sheet $1',
['j-sheets'] = ': Sheets $1',
['language'] = '(in $1)',
['via'] = " – via $1",
['event'] = 'Event occurs at',
['minutes'] = 'minutes in',
-- Determines the location of the help page
['help page link'] = 'Help:CS1 errors',
['help page label'] = 'help',
-- categories
['cat wikilink'] = '[[Category:$1]]', -- $1 is the category name
['cat wikilink sk'] = '[[Category:$1|$2]]', -- $1 is the category name; $2 is namespace sort key
[':cat wikilink'] = '[[:Category:$1|link]]', -- category name as maintenance message wikilink; $1 is the category name
-- Internal errors (should only occur if configuration is bad)
['undefined_error'] = 'Called with an undefined error condition',
['unknown_ID_key'] = 'Unrecognized ID key: ', -- an ID key in id_handlers not found in ~/Identifiers func_map{}
['unknown_ID_access'] = 'Unrecognized ID access keyword: ', -- an ID access keyword in id_handlers not found in keywords_lists['id-access']{}
['unknown_argument_map'] = 'Argument map not defined for this variable',
['bare_url_no_origin'] = 'Bare URL found but origin indicator is nil or empty',
['warning_msg_e'] = '<span style="color:#d33">One or more <code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code> templates have errors</span>; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).'; -- $1 is template link
['warning_msg_m'] = '<span style="color:#3a3">One or more <code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code> templates have maintenance messages</span>; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).'; -- $1 is template link
}
--[[--------------------------< C I T A T I O N _ C L A S S _ M A P >------------------------------------------
this table maps the value assigned to |CitationClass= in the cs1|2 templates to the canonical template name when
the value assigned to |CitationClass= is different from the canonical template name. |CitationClass= values are
used as class attributes in the <cite> tag that encloses the citation so these names may not contain spaces while
the canonical template name may. These names are used in warning_msg_e and warning_msg_m to create links to the
template's documentation when an article is displayed in preview mode.
Most cs1|2 template |CitationClass= values at en.wiki match their canonical template names so are not listed here.
]]
local citation_class_map_t = { -- TODO: if kept, these and all other config.CitationClass 'names' require some sort of i18n
['arxiv'] = 'arXiv',
['audio-visual'] = 'AV media',
['AV-media-notes'] = 'AV media notes',
['biorxiv'] = 'bioRxiv',
['citeseerx'] = 'CiteSeerX',
['encyclopaedia'] = 'encyclopedia',
['mailinglist'] = 'mailing list',
['medrxiv'] = 'medRxiv',
['pressrelease'] = 'press release',
['ssrn'] = 'SSRN',
['techreport'] = 'tech report',
}
--[=[-------------------------< E T _ A L _ P A T T E R N S >--------------------------------------------------
This table provides Lua patterns for the phrase "et al" and variants in name text
(author, editor, etc.). The main module uses these to identify and emit the 'etal' message.
]=]
local et_al_patterns = {
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][%.;,\"']*$", -- variations on the 'et al' theme
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][Ii][AaIi][Ee]?[%.;,\"']*$", -- variations on the 'et alia', 'et alii' and 'et aliae' themes (false positive 'et aliie' unlikely to match)
"[;,]? *%f[%a]and [Oo]thers", -- an alternative to et al.
"%[%[ *[Ee][Tt]%.? *[Aa][Ll]%.? *%]%]", -- a wikilinked form
"%(%( *[Ee][Tt]%.? *[Aa][Ll]%.? *%)%)", -- a double-bracketed form (to counter partial removal of ((...)) syntax)
"[%(%[] *[Ee][Tt]%.? *[Aa][Ll]%.? *[%)%]]", -- a bracketed form
}
--[[--------------------------< P R E S E N T A T I O N >------------------------
Fixed presentation markup. Originally part of citation_config.messages it has
been moved into its own, more semantically correct place.
]]
local presentation =
{
-- .citation-comment class is specified at Help:CS1_errors#Controlling_error_message_display
['hidden-error'] = '<span class="cs1-hidden-error citation-comment">$1</span>',
['visible-error'] = '<span class="cs1-visible-error citation-comment">$1</span>',
['hidden-maint'] = '<span class="cs1-maint citation-comment">$1</span>',
['accessdate'] = '<span class="reference-accessdate">$1$2</span>', -- to allow editors to hide accessdate using personal CSS
['bdi'] = '<bdi$1>$2</bdi>', -- bidirectional isolation used with |script-title= and the like
['cite'] = '<cite class="$1">$2</cite>'; -- for use when citation does not have a namelist and |ref= not set so no id="..." attribute
['cite-id'] = '<cite id="$1" class="$2">$3</cite>'; -- for use when when |ref= is set or when citation has a namelist
['format'] = ' <span class="cs1-format">($1)</span>', -- for |format=, |chapter-format=, etc.
['interwiki'] = ' <span class="cs1-format">[in $1]</span>', -- for interwiki-language-linked author, editor, etc
['interproj'] = ' <span class="cs1-format">[at $1]</span>', -- for interwiki-project-linked author, editor, etc (:d: and :s: supported; :w: ignored)
-- various access levels, for |access=, |doi-access=, |arxiv=, ...
-- narrow no-break space   may work better than nowrap CSS. Or not? Browser support?
['ext-link-access-signal'] = '<span class="$1" title="$2">$3</span>', -- external link with appropriate lock icon
['free'] = {class='id-lock-free', title='Freely accessible'}, -- classes defined in Module:Citation/CS1/styles.css
['registration'] = {class='id-lock-registration', title='Free registration required'},
['limited'] = {class='id-lock-limited', title='Free access subject to limited trial, subscription normally required'},
['subscription'] = {class='id-lock-subscription', title='Paid subscription required'},
['interwiki-icon'] = '<span class="$1" title="$2">$3</span>',
['class-wikisource'] = 'cs1-ws-icon',
['italic-title'] = "''$1''",
['kern-left'] = '<span class="cs1-kern-left"></span>$1', -- spacing to use when title contains leading single or double quote mark
['kern-right'] = '$1<span class="cs1-kern-right"></span>', -- spacing to use when title contains trailing single or double quote mark
['nowrap1'] = '<span class="nowrap">$1</span>', -- for nowrapping an item: <span ...>yyyy-mm-dd</span>
['nowrap2'] = '<span class="nowrap">$1</span> $2', -- for nowrapping portions of an item: <span ...>dd mmmm</span> yyyy (note white space)
['ocins'] = '<span title="$1" class="Z3988"></span>',
['parameter'] = '<code class="cs1-code">|$1=</code>',
['ps_cs1'] = '.'; -- CS1 style postscript (terminal) character
['ps_cs2'] = ''; -- CS2 style postscript (terminal) character (empty string)
['quoted-text'] = '<q>$1</q>', -- for wrapping |quote= content
['quoted-title'] = '"$1"',
['sep_cs1'] = '.', -- CS1 element separator
['sep_cs2'] = ',', -- CS2 separator
['sep_nl'] = ';', -- CS1|2 style name-list separator between names is a semicolon
['sep_nl_and'] = ' and ', -- used as last nl sep when |name-list-style=and and list has 2 items
['sep_nl_end'] = '; and ', -- used as last nl sep when |name-list-style=and and list has 3+ names
['sep_name'] = ', ', -- CS1|2 style last/first separator is <comma><space>
['sep_nl_vanc'] = ',', -- Vancouver style name-list separator between authors is a comma
['sep_name_vanc'] = ' ', -- Vancouver style last/first separator is a space
['sep_list'] = ', ', -- used for |language= when list has 3+ items except for last sep which uses sep_list_end
['sep_list_pair'] = ' and ', -- used for |language= when list has 2 items
['sep_list_end'] = ', and ', -- used as last list sep for |language= when list has 3+ items
['trans-italic-title'] = "[''$1'']",
['trans-quoted-title'] = "[$1]", -- for |trans-title= and |trans-quote=
['vol-bold'] = '$1 <b>$2</b>', -- sepc, volume; for bold journal cites; for other cites ['vol'] in messages{}
}
--[[--------------------------< A L I A S E S >---------------------------------
Aliases table for commonly passed parameters.
Parameter names on the right side in the assignments in this table must have been
defined in the Whitelist before they will be recognized as valid parameter names
]]
local aliases = {
['AccessDate'] = {'access-date', 'accessdate'}, -- Used by InternetArchiveBot
['Agency'] = 'agency',
['ArchiveDate'] = {'archive-date', 'archivedate'}, -- Used by InternetArchiveBot
['ArchiveFormat'] = 'archive-format',
['ArchiveURL'] = {'archive-url', 'archiveurl'}, -- Used by InternetArchiveBot
['ArticleNumber'] = 'article-number',
['ASINTLD'] = 'asin-tld',
['At'] = 'at', -- Used by InternetArchiveBot
['Authors'] = {'people', 'credits'},
['BookTitle'] = {'book-title', 'booktitle'},
['Cartography'] = 'cartography',
['Chapter'] = {'chapter', 'contribution', 'entry', 'article', 'section'},
['ChapterFormat'] = {'chapter-format', 'contribution-format', 'entry-format',
'article-format', 'section-format'};
['ChapterURL'] = {'chapter-url', 'contribution-url', 'entry-url', 'article-url', 'section-url'}, -- Used by InternetArchiveBot
['ChapterUrlAccess'] = {'chapter-url-access', 'contribution-url-access',
'entry-url-access', 'article-url-access', 'section-url-access'}, -- Used by InternetArchiveBot
['Class'] = 'class', -- cite arxiv and arxiv identifier
['Collaboration'] = 'collaboration',
['Conference'] = {'conference', 'event'},
['ConferenceFormat'] = 'conference-format',
['ConferenceURL'] = 'conference-url', -- Used by InternetArchiveBot
['Date'] = {'date', 'air-date', 'airdate'}, -- air-date and airdate for cite episode and cite serial only
['Degree'] = 'degree',
['DF'] = 'df',
['DisplayAuthors'] = {'display-authors', 'display-subjects'},
['DisplayContributors'] = 'display-contributors',
['DisplayEditors'] = 'display-editors',
['DisplayInterviewers'] = 'display-interviewers',
['DisplayTranslators'] = 'display-translators',
['Docket'] = 'docket',
['DoiBroken'] = 'doi-broken-date',
['Edition'] = 'edition',
['Embargo'] = 'pmc-embargo-date',
['Encyclopedia'] = {'encyclopedia', 'encyclopaedia', 'dictionary'}, -- cite encyclopedia only
['Episode'] = 'episode', -- cite serial only TODO: make available to cite episode?
['Format'] = 'format',
['ID'] = {'id', 'ID'},
['Inset'] = 'inset',
['Issue'] = {'issue', 'number'},
['Language'] = {'language', 'lang'},
['MailingList'] = {'mailing-list', 'mailinglist'}, -- cite mailing list only
['Map'] = 'map', -- cite map only
['MapFormat'] = 'map-format', -- cite map only
['MapURL'] = {'map-url', 'mapurl'}, -- cite map only -- Used by InternetArchiveBot
['MapUrlAccess'] = 'map-url-access', -- cite map only -- Used by InternetArchiveBot
['Minutes'] = 'minutes',
['Mode'] = 'mode',
['NameListStyle'] = 'name-list-style',
['Network'] = 'network',
['Newsgroup'] = 'newsgroup', -- cite newsgroup only
['NoPP'] = {'no-pp', 'nopp'},
['NoTracking'] = {'no-tracking', 'template-doc-demo'},
['Number'] = 'number', -- this case only for cite techreport
['OrigDate'] = {'orig-date', 'orig-year', 'origyear'},
['Others'] = 'others',
['Page'] = {'page', 'p'}, -- Used by InternetArchiveBot
['Pages'] = {'pages', 'pp'}, -- Used by InternetArchiveBot
['Periodical'] = {'journal', 'magazine', 'newspaper', 'periodical', 'website', 'work'},
['Place'] = {'place', 'location'},
['PostScript'] = 'postscript',
['PublicationDate'] = {'publication-date', 'publicationdate'},
['PublicationPlace'] = {'publication-place', 'publicationplace'},
['PublisherName'] = {'publisher', 'institution'},
['Quote'] = {'quote', 'quotation'},
['QuotePage'] = 'quote-page',
['QuotePages'] = 'quote-pages',
['Ref'] = 'ref',
['Scale'] = 'scale',
['ScriptChapter'] = {'script-chapter', 'script-contribution', 'script-entry',
'script-article', 'script-section'},
['ScriptEncyclopedia'] = {'script-encyclopedia', 'script-encyclopaedia'}, -- cite encyclopedia only
['ScriptMap'] = 'script-map',
['ScriptPeriodical'] = {'script-journal', 'script-magazine', 'script-newspaper',
'script-periodical', 'script-website', 'script-work'},
['ScriptQuote'] = 'script-quote',
['ScriptTitle'] = 'script-title', -- Used by InternetArchiveBot
['Season'] = 'season',
['Sections'] = 'sections', -- cite map only
['Series'] = {'series', 'version'},
['SeriesLink'] = {'series-link', 'serieslink'},
['SeriesNumber'] = {'series-number', 'series-no'},
['Sheet'] = 'sheet', -- cite map only
['Sheets'] = 'sheets', -- cite map only
['Station'] = 'station',
['Time'] = 'time',
['TimeCaption'] = 'time-caption',
['Title'] = 'title', -- Used by InternetArchiveBot
['TitleLink'] = {'title-link', 'episode-link', 'episodelink'}, -- Used by InternetArchiveBot
['TitleNote'] = {'title-note', 'department'},
['TitleType'] = {'type', 'medium'},
['TransChapter'] = {'trans-article', 'trans-chapter', 'trans-contribution',
'trans-entry', 'trans-section'},
['Transcript'] = 'transcript',
['TranscriptFormat'] = 'transcript-format',
['TranscriptURL'] = 'transcript-url', -- Used by InternetArchiveBot
['TransEncyclopedia'] = {'trans-encyclopedia', 'trans-encyclopaedia'}, -- cite encyclopedia only
['TransMap'] = 'trans-map', -- cite map only
['TransPeriodical'] = {'trans-journal', 'trans-magazine', 'trans-newspaper',
'trans-periodical', 'trans-website', 'trans-work'},
['TransQuote'] = 'trans-quote',
['TransTitle'] = 'trans-title', -- Used by InternetArchiveBot
['URL'] = {'url', 'URL'}, -- Used by InternetArchiveBot
['UrlAccess'] = 'url-access', -- Used by InternetArchiveBot
['UrlStatus'] = 'url-status', -- Used by InternetArchiveBot
['Vauthors'] = 'vauthors',
['Veditors'] = 'veditors',
['Via'] = 'via',
['Volume'] = 'volume',
['Year'] = 'year',
['AuthorList-First'] = {"first#", "author-first#", "author#-first", "author-given#", "author#-given",
"subject-first#", "subject#-first", "subject-given#", "subject#-given",
"given#"},
['AuthorList-Last'] = {"last#", "author-last#", "author#-last", "author-surname#", "author#-surname",
"subject-last#", "subject#-last", "subject-surname#", "subject#-surname",
"author#", 'host#', "subject#", "surname#"},
['AuthorList-Link'] = {"author-link#", "author#-link", "subject-link#",
"subject#-link", "authorlink#", "author#link"},
['AuthorList-Mask'] = {"author-mask#", "author#-mask", "subject-mask#", "subject#-mask"},
['ContributorList-First'] = {'contributor-first#', 'contributor#-first',
'contributor-given#', 'contributor#-given'},
['ContributorList-Last'] = {'contributor-last#', 'contributor#-last',
'contributor-surname#', 'contributor#-surname', 'contributor#'},
['ContributorList-Link'] = {'contributor-link#', 'contributor#-link'},
['ContributorList-Mask'] = {'contributor-mask#', 'contributor#-mask'},
['EditorList-First'] = {"editor-first#", "editor#-first", "editor-given#", "editor#-given"},
['EditorList-Last'] = {"editor-last#", "editor#-last", "editor-surname#",
"editor#-surname", "editor#"},
['EditorList-Link'] = {"editor-link#", "editor#-link"},
['EditorList-Mask'] = {"editor-mask#", "editor#-mask"},
['InterviewerList-First'] = {'interviewer-first#', 'interviewer#-first',
'interviewer-given#', 'interviewer#-given'},
['InterviewerList-Last'] = {'interviewer-last#', 'interviewer#-last',
'interviewer-surname#', 'interviewer#-surname', 'interviewer#'},
['InterviewerList-Link'] = {'interviewer-link#', 'interviewer#-link'},
['InterviewerList-Mask'] = {'interviewer-mask#', 'interviewer#-mask'},
['TranslatorList-First'] = {'translator-first#', 'translator#-first',
'translator-given#', 'translator#-given'},
['TranslatorList-Last'] = {'translator-last#', 'translator#-last',
'translator-surname#', 'translator#-surname', 'translator#'},
['TranslatorList-Link'] = {'translator-link#', 'translator#-link'},
['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'},
}
--[[--------------------------< P U N C T _ S K I P >---------------------------
builds a table of parameter names that the extraneous terminal punctuation check should not check.
]]
local punct_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'BookTitle', 'Chapter', 'ScriptChapter', 'ScriptTitle', 'Title', 'TransChapter', 'Transcript', 'TransMap', 'TransTitle', -- title-holding parameters
'AuthorList-Mask', 'ContributorList-Mask', 'EditorList-Mask', 'InterviewerList-Mask', 'TranslatorList-Mask', -- name-list mask may have name separators
'PostScript', 'Quote', 'ScriptQuote', 'TransQuote', 'Ref', -- miscellaneous
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'MapURL', 'TranscriptURL', 'URL', -- URL-holding parameters
}
local url_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'ID', 'MapURL', 'TranscriptURL', 'URL', -- parameters allowed to hold urls
'Page', 'Pages', 'At', 'QuotePage', 'QuotePages', -- insource locators allowed to hold urls
}
local function build_skip_table (skip_t, meta_params)
for _, meta_param in ipairs (meta_params) do -- for each meta parameter key
local params = aliases[meta_param]; -- get the parameter or the table of parameters associated with the meta parameter name
if 'string' == type (params) then
skip_t[params] = 1; -- just a single parameter
else
for _, param in ipairs (params) do -- get the parameter name
skip_t[param] = 1; -- add the parameter name to the skip table
local count;
param, count = param:gsub ('#', ''); -- remove enumerator marker from enumerated parameters
if 0 ~= count then -- if removed
skip_t[param] = 1; -- add param name without enumerator marker
end
end
end
end
return skip_t;
end
local punct_skip = {};
local url_skip = {};
--[[--------------------------< S I N G L E - L E T T E R S E C O N D - L E V E L D O M A I N S >----------
this is a list of tlds that are known to have single-letter second-level domain names. This list does not include
ccTLDs which are accepted in is_domain_name().
]]
local single_letter_2nd_lvl_domains_t = {'cash', 'company', 'foundation', 'media', 'org', 'today'};
--[[-----------< S P E C I A L C A S E T R A N S L A T I O N S >------------
This table is primarily here to support internationalization. Translations in
this table are used, for example, when an error message, category name, etc.,
is extracted from the English alias key. There may be other cases where
this translation table may be useful.
]]
local is_Latn = 'A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191';
local special_case_translation = {
['AuthorList'] = 'authors list', -- used to assemble maintenance category names
['ContributorList'] = 'contributors list', -- translation of these names plus translation of the base maintenance category names in maint_cats{} table below
['EditorList'] = 'editors list', -- must match the names of the actual categories
['InterviewerList'] = 'interviewers list', -- this group or translations used by name_has_ed_markup() and name_has_mult_names()
['TranslatorList'] = 'translators list',
-- Lua patterns to match pseudo-titles used by InternetArchiveBot and others as placeholder for unknown |title= value
['archived_copy'] = { -- used with CS1 maint: Archive[d] copy as title
['en'] = '^archived?%s+copy$', -- for English; translators: keep this because templates imported from en.wiki
['local'] = nil, -- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
},
-- Lua patterns to match generic titles; usually created by bots or reference filling tools
-- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language
-- generic titles and patterns in this table should be lowercase only
-- leave ['local'] nil except when there is a matching generic title in your language
-- boolean 'true' for plain-text searches; 'false' for pattern searches
['generic_titles'] = {
['accept'] = {
},
['reject'] = {
{['en'] = {'^wayback%s+machine$', false}, ['local'] = nil},
{['en'] = {'are you a robot', true}, ['local'] = nil},
{['en'] = {'hugedomains.com', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?no +title[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'page not found', true}, ['local'] = nil},
{['en'] = {'subscribe to read', true}, ['local'] = nil},
{['en'] = {'^[%(%[{<]?unknown[>}%]%)]?$', false}, ['local'] = nil},
{['en'] = {'website is for sale', true}, ['local'] = nil},
{['en'] = {'^404', false}, ['local'] = nil},
{['en'] = {'error[ %-]404', false}, ['local'] = nil},
{['en'] = {'internet archive wayback machine', true}, ['local'] = nil},
{['en'] = {'log into facebook', true}, ['local'] = nil},
{['en'] = {'login • instagram', true}, ['local'] = nil},
{['en'] = {'redirecting...', true}, ['local'] = nil},
{['en'] = {'usurped title', true}, ['local'] = nil}, -- added by a GreenC bot
{['en'] = {'webcite query result', true}, ['local'] = nil},
{['en'] = {'wikiwix\'s cache', true}, ['local'] = nil},
}
},
-- boolean 'true' for plain-text searches, search string must be lowercase only
-- boolean 'false' for pattern searches
-- leave ['local'] nil except when there is a matching generic name in your language
['generic_names'] = {
['accept'] = {
{['en'] = {'%[%[[^|]*%(author%) *|[^%]]*%]%]', false}, ['local'] = nil},
},
['reject'] = {
{['en'] = {'about us', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]dvisor%f[%A]', false}, ['local'] = nil},
{['en'] = {'allmusic', true}, ['local'] = nil},
{['en'] = {'%f[%a][Aa]uthor%f[%A]', false}, ['local'] = nil},
{['en'] = {'^[Bb]ureau$', false}, ['local'] = nil},
{['en'] = {'business', true}, ['local'] = nil},
{['en'] = {'cnn', true}, ['local'] = nil},
{['en'] = {'collaborator', true}, ['local'] = nil},
{['en'] = {'^[Cc]ompany$', false}, ['local'] = nil},
{['en'] = {'contributor', true}, ['local'] = nil},
{['en'] = {'contact us', true}, ['local'] = nil},
{['en'] = {'correspondent', true}, ['local'] = nil},
{['en'] = {'^[Dd]esk$', false}, ['local'] = nil},
{['en'] = {'directory', true}, ['local'] = nil},
{['en'] = {'%f[%(%[][%(%[]%s*eds?%.?%s*[%)%]]?$', false}, ['local'] = nil},
{['en'] = {'[,%.%s]%f[e]eds?%.?$', false}, ['local'] = nil},
{['en'] = {'^eds?[%.,;]', false}, ['local'] = nil},
{['en'] = {'^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]dited%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]ditors?%f[%A]', false}, ['local'] = nil},
{['en'] = {'%f[%a][Ee]mail%f[%A]', false}, ['local'] = nil},
{['en'] = {'facebook', true}, ['local'] = nil},
{['en'] = {'google', true}, ['local'] = nil},
{['en'] = {'^[Gg]roup$', false}, ['local'] = nil},
{['en'] = {'home page', true}, ['local'] = nil},
{['en'] = {'^[Ii]nc%.?$', false}, ['local'] = nil},
{['en'] = {'instagram', true}, ['local'] = nil},
{['en'] = {'interviewer', true}, ['local'] = nil},
{['en'] = {'^[Ll]imited$', false}, ['local'] = nil},
{['en'] = {'linkedIn', true}, ['local'] = nil},
{['en'] = {'^[Nn]ews$', false}, ['local'] = nil},
{['en'] = {'[Nn]ews[ %-]?[Rr]oom', false}, ['local'] = nil},
{['en'] = {'pinterest', true}, ['local'] = nil},
{['en'] = {'policy', true}, ['local'] = nil},
{['en'] = {'privacy', true}, ['local'] = nil},
{['en'] = {'reuters', true}, ['local'] = nil},
{['en'] = {'translator', true}, ['local'] = nil},
{['en'] = {'tumblr', true}, ['local'] = nil},
{['en'] = {'twitter', true}, ['local'] = nil},
{['en'] = {'site name', true}, ['local'] = nil},
{['en'] = {'statement', true}, ['local'] = nil},
{['en'] = {'submitted', true}, ['local'] = nil},
{['en'] = {'super.?user', false}, ['local'] = nil},
{['en'] = {'%f['..is_Latn..'][Uu]ser%f[^'..is_Latn..']', false}, ['local'] = nil},
{['en'] = {'verfasser', true}, ['local'] = nil},
}
}
}
--[[--------------------------< D A T E _ N A M E S >----------------------------------------------------------
This table of tables lists local language date names and fallback English date names.
The code in Date_validation will look first in the local table for valid date names.
If date names are not found in the local table, the code will look in the English table.
Because citations can be copied to the local wiki from en.wiki, the English is
required when the date-name translation function date_name_xlate() is used.
In these tables, season numbering is defined by
Extended Date/Time Format (EDTF) Specification (https://www.loc.gov/standards/datetime/)
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard
defines various divisions using numbers 21-41. CS1|2 only supports generic seasons.
EDTF does support the distinction between north and south hemisphere seasons
but CS1|2 has no way to make that distinction.
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)
The standard does not address 'named' dates so, for the purposes of CS1|2,
Easter and Christmas are defined here as 98 and 99, which should be out of the
ISO 8601 (EDTF) range of uses for a while.
local_date_names_from_mediawiki is a boolean. When set to:
true – module will fetch local month names from MediaWiki for both date_names['local']['long'] and date_names['local']['short']; this will unconditionally overwrite manual translations
false – module will *not* fetch local month names from MediaWiki
Caveat lector: There is no guarantee that MediaWiki will provide short month names. At your wiki you can test
the results of the MediaWiki fetch in the debug console with this command (the result is alpha sorted):
=mw.dumpObject (p.date_names['local'])
While the module can fetch month names from MediaWiki, it cannot fetch the quarter, season, and named date names
from MediaWiki. Those must be translated manually.
]]
local local_date_names_from_mediawiki = true; -- when false, manual translation required for date_names['local']['long'] and date_names['local']['short']; overwrites manual translations
-- when true, module fetches long and short month names from MediaWiki
local date_names = {
['en'] = { -- English
['long'] = {['January'] = 1, ['February'] = 2, ['March'] = 3, ['April'] = 4, ['May'] = 5, ['June'] = 6, ['July'] = 7, ['August'] = 8, ['September'] = 9, ['October'] = 10, ['November'] = 11, ['December'] = 12},
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
-- when local_date_names_from_mediawiki = false
['local'] = { -- replace these English date names with the local language equivalents
['long'] = {['Januari'] = 1, ['Februari'] = 2, ['Mach'] = 3, ['April'] = 4, ['Mei'] = 5, ['Jun'] = 6, ['Julai'] = 7, ['Ogos'] = 8, ['September'] = 9, ['Oktober'] = 10, ['Nobember'] = 11, ['Disember'] = 12 },
['short'] = {['Jan'] = 1, ['Feb'] = 2, ['Mar'] = 3, ['Apr'] = 4, ['May'] = 5, ['Jun'] = 6, ['Jul'] = 7, ['Aug'] = 8, ['Sep'] = 9, ['Oct'] = 10, ['Nov'] = 11, ['Dec'] = 12},
['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36},
['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23},
['named'] = {['Easter'] = 98, ['Christmas'] = 99},
},
['inv_local_long'] = {}, -- used in date reformatting & translation; copy of date_names['local'].long where k/v are inverted: [1]='<local name>' etc.
['inv_local_short'] = {}, -- used in date reformatting & translation; copy of date_names['local'].short where k/v are inverted: [1]='<local name>' etc.
['inv_local_quarter'] = {}, -- used in date translation; copy of date_names['local'].quarter where k/v are inverted: [1]='<local name>' etc.
['inv_local_season'] = {}, -- used in date translation; copy of date_names['local'].season where k/v are inverted: [1]='<local name>' etc.
['inv_local_named'] = {}, -- used in date translation; copy of date_names['local'].named where k/v are inverted: [1]='<local name>' etc.
['local_digits'] = {['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9'}, -- used to convert local language digits to Western 0-9
['xlate_digits'] = {},
}
if local_date_names_from_mediawiki then -- if fetching local month names from MediaWiki is enabled
local long_t = {};
local short_t = {};
for i=1, 12 do -- loop 12x and
local name = lang_obj:formatDate('F', '2022-' .. i .. '-1'); -- get long month name for each i
long_t[name] = i; -- save it
name = lang_obj:formatDate('M', '2022-' .. i .. '-1'); -- get short month name for each i
short_t[name] = i; -- save it
end
date_names['local']['long'] = long_t; -- write the long table – overwrites manual translation
date_names['local']['short'] = short_t; -- write the short table – overwrites manual translation
end
-- create inverted date-name tables for reformatting and/or translation
for _, invert_t in pairs {{'long', 'inv_local_long'}, {'short', 'inv_local_short'}, {'quarter', 'inv_local_quarter'}, {'season', 'inv_local_season'}, {'named', 'inv_local_named'}} do
for name, i in pairs (date_names['local'][invert_t[1]]) do -- this table is ['name'] = i
date_names[invert_t[2]][i] = name; -- invert to get [i] = 'name' for conversions from ymd
end
end
if local_digits_from_mediawiki then -- if fetching local digits from MediaWiki is enabled
local digits_t = {};
for i=0, 9 do -- loop 10x and
digits_t [lang_obj:formatNum (i)] = tostring (i); -- format the loop indexer as local lang table index and assign loop indexer (a string) as the value
end
date_names['local_digits'] = digits_t;
end
for ld, ed in pairs (date_names.local_digits) do -- make a digit translation table for simple date translation from en to local language using local_digits table
date_names.xlate_digits [ed] = ld; -- en digit becomes index with local digit as the value
end
local df_template_patterns = { -- table of redirects to {{Use dmy dates}} and {{Use mdy dates}}
'{{ *[Uu]se +(dmy) +dates *[|}]', -- 1159k -- sorted by approximate transclusion count
'{{ *[Uu]se +(mdy) +dates *[|}]', -- 212k
'{{ *[Uu]se +(MDY) +dates *[|}]', -- 788
'{{ *[Uu]se +(DMY) +dates *[|}]', -- 343
'{{ *([Mm]dy) *[|}]', -- 176
'{{ *[Uu]se *(dmy) *[|}]', -- 156 + 18
'{{ *[Uu]se *(mdy) *[|}]', -- 149 + 11
'{{ *([Dd]my) *[|}]', -- 56
'{{ *[Uu]se +(MDY) *[|}]', -- 5
'{{ *([Dd]MY) *[|}]', -- 3
'{{ *[Uu]se(mdy)dates *[|}]', -- 1
'{{ *[Uu]se +(DMY) *[|}]', -- 0
'{{ *([Mm]DY) *[|}]', -- 0
}
local title_object = mw.title.getCurrentTitle();
local content; -- done this way so that unused templates appear in unused-template-reports; self-transcluded makes them look like they are used
if 10 ~= title_object.namespace then -- all namespaces except Template
content = title_object:getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
end
local function get_date_format ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
for _, pattern in ipairs (df_template_patterns) do -- loop through the patterns looking for {{Use dmy dates}} or {{Use mdy dates}} or any of their redirects
local start, _, match = content:find(pattern); -- match is the three letters indicating desired date format
if match then
local use_dates_template = content:match ('%b{}', start); -- get the whole template
if use_dates_template:match ('| *cs1%-dates *= *[lsy][sy]?') then -- look for |cs1-dates=publication date length access-/archive-date length
return match:lower() .. '-' .. use_dates_template:match ('| *cs1%-dates *= *([lsy][sy]?)');
else
return match:lower() .. '-all'; -- no |cs1-dates= k/v pair; return value appropriate for use in |df=
end
end
end
end
local global_df; -- TODO: add this to <global_cs1_config_t>?
--[[-----------------< V O L U M E , I S S U E , P A G E S >------------------
These tables hold cite class values (from the template invocation) and identify those templates that support
|volume=, |issue=, and |page(s)= parameters. Cite conference and cite map require further qualification which
is handled in the main module.
]]
local templates_using_volume = {'citation', 'audio-visual', 'book', 'conference', 'encyclopaedia', 'interview', 'journal', 'magazine', 'map', 'news', 'report', 'techreport', 'thesis'}
local templates_using_issue = {'citation', 'conference', 'episode', 'interview', 'journal', 'magazine', 'map', 'news', 'podcast'}
local templates_not_using_page = {'audio-visual', 'episode', 'mailinglist', 'newsgroup', 'podcast', 'serial', 'sign', 'speech'}
--[[
These tables control when it is appropriate for {{citation}} to render |volume= and/or |issue=. The parameter
names in the tables constrain {{citation}} so that its renderings match the renderings of the equivalent cs1
templates. For example, {{cite web}} does not support |volume= so the equivalent {{citation |website=...}} must
not support |volume=.
]]
local citation_no_volume_t = { -- {{citation}} does not render |volume= when these parameters are used
'website', 'mailinglist', 'script-website',
}
local citation_issue_t = { -- {{citation}} may render |issue= when these parameters are used
'journal', 'magazine', 'newspaper', 'periodical', 'work',
'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-work',
}
--[[
Patterns for finding extra text in |volume=, |issue=, |page=, |pages=
]]
local vol_iss_pg_patterns = {
good_ppattern = '^P[^%.PpGg]', -- OK to begin with uppercase P: P7 (page 7 of section P), but not p123 (page 123); TODO: this allows 'Pages' which it should not
bad_ppatterns = { -- patterns for |page= and |pages=
'^[Pp][PpGg]?%.?[ %d]',
'^[Pp][Pp]?%. ', -- from {{p.}} and {{pp.}} templates
'^[Pp]ages?',
'^[Pp]gs.?',
},
vi_patterns_t = { -- combined to catch volume-like text in |issue= and issue-like text in |volume=
'^volumes?', -- volume-like text
'^vols?[%.:=]?',
'^issues?', --issue-like text
'^iss[%.:=]?',
'^numbers?',
'^nos?%A', -- don't match 'november' or 'nostradamus'
'^nr[%.:=]?',
'^n[%.:= ]', -- might be a valid issue without separator (space char is sep char here)
'^n°', -- 'n' with degree sign (U+00B0)
'^№', -- precomposed unicode numero character (U+2116)
},
}
--[[--------------------------< K E Y W O R D S >-------------------------------
These tables hold keywords for those parameters that have defined sets of acceptable keywords.
]]
--[[-------------------< K E Y W O R D S T A B L E >--------------------------
this is a list of keywords; each key in the list is associated with a table of
synonymous keywords possibly from different languages.
for I18N: add local-language keywords to value table; do not change the key.
For example, adding the German keyword 'ja':
['affirmative'] = {'yes', 'true', 'y', 'ja'},
Because CS1|2 templates from en.wiki articles are often copied to other local wikis,
it is recommended that the English keywords remain in these tables.
]]
local keywords = {
['amp'] = {'&', 'amp', 'ampersand'}, -- |name-list-style=
['and'] = {'and', 'serial'}, -- |name-list-style=
['affirmative'] = {'yes', 'true', 'y'}, -- |no-tracking=, |no-pp= -- Used by InternetArchiveBot
['afterword'] = {'afterword'}, -- |contribution=
['bot: unknown'] = {'bot: unknown'}, -- |url-status= -- Used by InternetArchiveBot
['cs1'] = {'cs1'}, -- |mode=
['cs2'] = {'cs2'}, -- |mode=
['dead'] = {'dead', 'deviated'}, -- |url-status= -- Used by InternetArchiveBot
['dmy'] = {'dmy'}, -- |df=
['dmy-all'] = {'dmy-all'}, -- |df=
['foreword'] = {'foreword'}, -- |contribution=
['free'] = {'free'}, -- |<id>-access= -- Used by InternetArchiveBot
['harv'] = {'harv'}, -- |ref=; this no longer supported; is_valid_parameter_value() called with <invert> = true
['introduction'] = {'introduction'}, -- |contribution=
['limited'] = {'limited'}, -- |url-access= -- Used by InternetArchiveBot
['live'] = {'live'}, -- |url-status= -- Used by InternetArchiveBot
['mdy'] = {'mdy'}, -- |df=
['mdy-all'] = {'mdy-all'}, -- |df=
['none'] = {'none'}, -- |postscript=, |ref=, |title=, |type= -- Used by InternetArchiveBot
['off'] = {'off'}, -- |title= (potentially also: |title-link=, |postscript=, |ref=, |type=)
['preface'] = {'preface'}, -- |contribution=
['registration'] = {'registration'}, -- |url-access= -- Used by InternetArchiveBot
['subscription'] = {'subscription'}, -- |url-access= -- Used by InternetArchiveBot
['unfit'] = {'unfit'}, -- |url-status= -- Used by InternetArchiveBot
['usurped'] = {'usurped'}, -- |url-status= -- Used by InternetArchiveBot
['vanc'] = {'vanc'}, -- |name-list-style=
['ymd'] = {'ymd'}, -- |df=
['ymd-all'] = {'ymd-all'}, -- |df=
-- ['yMd'] = {'yMd'}, -- |df=; not supported at en.wiki
-- ['yMd-all'] = {'yMd-all'}, -- |df=; not supported at en.wiki
}
--[[------------------------< X L A T E _ K E Y W O R D S >---------------------
this function builds a list, keywords_xlate{}, of the keywords found in keywords{} where the values from keywords{}
become the keys in keywords_xlate{} and the keys from keywords{} become the values in keywords_xlate{}:
['affirmative'] = {'yes', 'true', 'y'}, -- in keywords{}
becomes
['yes'] = 'affirmative', -- in keywords_xlate{}
['true'] = 'affirmative',
['y'] = 'affirmative',
the purpose of this function is to act as a translator between a non-English keyword and its English equivalent
that may be used in other modules of this suite
]]
local function xlate_keywords ()
local out_table = {}; -- output goes here
for k, keywords_t in pairs (keywords) do -- spin through the keywords table
for _, keyword in ipairs (keywords_t) do -- for each keyword
out_table[keyword] = k; -- create an entry in the output table where keyword is the key
end
end
return out_table;
end
local keywords_xlate = xlate_keywords (); -- the list of translated keywords
--[[----------------< M A K E _ K E Y W O R D S _ L I S T >---------------------
this function assembles, for parameter-value validation, the list of keywords appropriate to that parameter.
keywords_lists{}, is a table of tables from keywords{}
]]
local function make_keywords_list (keywords_lists)
local out_table = {}; -- output goes here
for _, keyword_list in ipairs (keywords_lists) do -- spin through keywords_lists{} and get a table of keywords
for _, keyword in ipairs (keyword_list) do -- spin through keyword_list{} and add each keyword, ...
table.insert (out_table, keyword); -- ... as plain text, to the output list
end
end
return out_table;
end
--[[----------------< K E Y W O R D S _ L I S T S >-----------------------------
this is a list of lists of valid keywords for the various parameters in [key].
Generally the keys in this table are the canonical en.wiki parameter names though
some are contrived because of use in multiple differently named parameters:
['yes_true_y'], ['id-access'].
The function make_keywords_list() extracts the individual keywords from the
appropriate list in keywords{}.
The lists in this table are used to validate the keyword assignment for the
parameters named in this table's keys.
]]
local keywords_lists = {
['yes_true_y'] = make_keywords_list ({keywords.affirmative}),
['contribution'] = make_keywords_list ({keywords.afterword, keywords.foreword, keywords.introduction, keywords.preface}),
['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all']}),
-- ['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all'], keywords.yMd, keywords['yMd-all']}), -- not supported at en.wiki
['mode'] = make_keywords_list ({keywords.cs1, keywords.cs2}),
['name-list-style'] = make_keywords_list ({keywords.amp, keywords['and'], keywords.vanc}),
['ref'] = make_keywords_list ({keywords.harv}), -- inverted check; |ref=harv no longer supported
['url-access'] = make_keywords_list ({keywords.subscription, keywords.limited, keywords.registration}),
['url-status'] = make_keywords_list ({keywords.dead, keywords.live, keywords.unfit, keywords.usurped, keywords['bot: unknown']}),
['id-access'] = make_keywords_list ({keywords.free}),
}
--[[--------------------------< C S 1 _ C O N F I G _ G E T >--------------------------------------------------
fetch and validate values from {{cs1 config}} template to fill <global_cs1_config_t>
no error messages; when errors are detected, the parameter value from {{cs1 config}} is blanked.
Supports all parameters and aliases associated with the metaparameters: DisplayAuthors, DisplayContributors,
DisplayEditors, DisplayInterviewers, DisplayTranslators, NameListStyle, and Mode. The DisplayWhatever metaparameters
accept numeric values only (|display-authors=etal and the like is not supported).
]]
local global_cs1_config_t = {}; -- TODO: add value returned from get_date_format() to this table?
local function get_cs1_config ()
if not content then -- nil content when we're in template
return nil; -- auto-formatting does not work in Template space so don't set global_df
end
local start = content:find('{{ *[Cc][Ss]1 config *[|}]'); -- <start> is offset into <content> when {{cs1 config}} found; nil else
if start then
local cs1_config_template = content:match ('%b{}', start); -- get the whole template
if not cs1_config_template then
return nil;
end
local params_t = mw.text.split (cs1_config_template:gsub ('^{{%s*', ''):gsub ('%s*}}$', ''), '%s*|%s*'); -- remove '{{' and '}}'; make a sequence of parameter/value pairs (split on the pipe)
table.remove (params_t, 1); -- remove the template name because it isn't a parameter/value pair
local config_meta_params_t = {'DisplayAuthors', 'DisplayContributors', 'DisplayEditors', 'DisplayInterviewers', 'DisplayTranslators', 'NameListStyle', 'Mode'};
local meta_param_map_t = {}; -- list of accepted parameter names usable in {{cs1 config}} goes here
for _, meta_param in ipairs (config_meta_params_t) do -- for i18n using <config_meta_params_t>, map template parameter names to their metaparameter equivalents
if 'table' == type (aliases[meta_param]) then -- if <meta_param> is a sequence,
for _, param in ipairs (aliases[meta_param]) do -- extract its contents
meta_param_map_t[param] = meta_param; -- and add to <meta_param_map_t>
end
else
meta_param_map_t[aliases[meta_param]] = meta_param; -- not a sequence so just add the parameter to <meta_param_map_t>
end
end
local keywords_t = {}; -- map valid keywords to their associate metaparameter; reverse form of <keyword_lists[key] for these metaparameters
for _, metaparam_t in ipairs ({{'NameListStyle', 'name-list-style'}, {'Mode', 'mode'}}) do -- only these metaparameter / keywords_lists key pairs
for _, keyword in ipairs (keywords_lists[metaparam_t[2]]) do -- spin through the list of keywords
keywords_t[keyword] = metaparam_t[1]; -- add [keyword] = metaparameter to the map
end
end
for _, param in ipairs (params_t) do -- spin through the {{cs1 config}} parameters and fill <global_cs1_config_t>
local k, v = param:match ('([^=]-)%s*=%s*(.+)'); -- <k> is the parameter name; <v> is parameter's assigned value
if k then
if k:find ('^display') then -- if <k> is one of the |display-<namelist>= parameters
if v:match ('%d+') then -- the assigned value must be digits; doesn't accept 'etal'
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the display param and its value to globals table
end
else
if keywords_t[v] == meta_param_map_t[k] then -- keywords_t[v] returns nil or the metaparam name; these must be the same
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the parameter and its value to globals table
end
end
end
end
end
end
get_cs1_config (); -- fill <global_cs1_config_t>
--[[---------------------< S T R I P M A R K E R S >----------------------------
Common pattern definition location for stripmarkers so that we don't have to go
hunting for them if (when) MediaWiki changes their form.
]]
local stripmarkers = {
['any'] = '\127[^\127]*UNIQ%-%-(%a+)%-[%a%d]+%-QINU[^\127]*\127', -- capture returns name of stripmarker
['math'] = '\127[^\127]*UNIQ%-%-math%-[%a%d]+%-QINU[^\127]*\127' -- math stripmarkers used in coins_cleanup() and coins_replace_math_stripmarker()
}
--[[------------< I N V I S I B L E _ C H A R A C T E R S >---------------------
This table holds non-printing or invisible characters indexed either by name or
by Unicode group. Values are decimal representations of UTF-8 codes. The table
is organized as a table of tables because the Lua pairs keyword returns table
data in an arbitrary order. Here, we want to process the table from top to bottom
because the entries at the top of the table are also found in the ranges specified
by the entries at the bottom of the table.
Also here is a pattern that recognizes stripmarkers that begin and end with the
delete characters. The nowiki stripmarker is not an error but some others are
because the parameter values that include them become part of the template's
metadata before stripmarker replacement.
]]
local invisible_defs = {
del = '\127', -- used to distinguish between stripmarker and del char
zwj = '\226\128\141', -- used with capture because zwj may be allowed
}
local invisible_chars = {
{'replacement', '\239\191\189'}, -- U+FFFD, EF BF BD
{'zero width joiner', '('.. invisible_defs.zwj .. ')'}, -- U+200D, E2 80 8D; capture because zwj may be allowed
{'zero width space', '\226\128\139'}, -- U+200B, E2 80 8B
{'hair space', '\226\128\138'}, -- U+200A, E2 80 8A
{'soft hyphen', '\194\173'}, -- U+00AD, C2 AD
{'horizontal tab', '\009'}, -- U+0009 (HT), 09
{'line feed', '\010'}, -- U+000A (LF), 0A
{'no-break space', '\194\160'}, -- U+00A0 (NBSP), C2 A0
{'carriage return', '\013'}, -- U+000D (CR), 0D
{'stripmarker', stripmarkers.any}, -- stripmarker; may or may not be an error; capture returns the stripmaker type
{'delete', '('.. invisible_defs.del .. ')'}, -- U+007F (DEL), 7F; must be done after stripmarker test; capture to distinguish isolated del chars not part of stripmarker
{'C0 control', '[\000-\008\011\012\014-\031]'}, -- U+0000–U+001F (NULL–US), 00–1F (except HT, LF, CR (09, 0A, 0D))
{'C1 control', '[\194\128-\194\159]'}, -- U+0080–U+009F (XXX–APC), C2 80 – C2 9F
-- {'Specials', '[\239\191\185-\239\191\191]'}, -- U+FFF9-U+FFFF, EF BF B9 – EF BF BF
-- {'Private use area', '[\238\128\128-\239\163\191]'}, -- U+E000–U+F8FF, EE 80 80 – EF A3 BF
-- {'Supplementary Private Use Area-A', '[\243\176\128\128-\243\191\191\189]'}, -- U+F0000–U+FFFFD, F3 B0 80 80 – F3 BF BF BD
-- {'Supplementary Private Use Area-B', '[\244\128\128\128-\244\143\191\189]'}, -- U+100000–U+10FFFD, F4 80 80 80 – F4 8F BF BD
}
--[[
Indic script makes use of zero width joiner as a character modifier so zwj
characters must be left in. This pattern covers all of the unicode characters
for these languages:
Devanagari 0900–097F – https://unicode.org/charts/PDF/U0900.pdf
Devanagari extended A8E0–A8FF – https://unicode.org/charts/PDF/UA8E0.pdf
Bengali 0980–09FF – https://unicode.org/charts/PDF/U0980.pdf
Gurmukhi 0A00–0A7F – https://unicode.org/charts/PDF/U0A00.pdf
Gujarati 0A80–0AFF – https://unicode.org/charts/PDF/U0A80.pdf
Oriya 0B00–0B7F – https://unicode.org/charts/PDF/U0B00.pdf
Tamil 0B80–0BFF – https://unicode.org/charts/PDF/U0B80.pdf
Telugu 0C00–0C7F – https://unicode.org/charts/PDF/U0C00.pdf
Kannada 0C80–0CFF – https://unicode.org/charts/PDF/U0C80.pdf
Malayalam 0D00–0D7F – https://unicode.org/charts/PDF/U0D00.pdf
plus the not-necessarily Indic scripts for Sinhala and Burmese:
Sinhala 0D80-0DFF - https://unicode.org/charts/PDF/U0D80.pdf
Myanmar 1000-109F - https://unicode.org/charts/PDF/U1000.pdf
Myanmar extended A AA60-AA7F - https://unicode.org/charts/PDF/UAA60.pdf
Myanmar extended B A9E0-A9FF - https://unicode.org/charts/PDF/UA9E0.pdf
the pattern is used by has_invisible_chars() and coins_cleanup()
]]
local indic_script = '[\224\164\128-\224\181\191\224\163\160-\224\183\191\225\128\128-\225\130\159\234\167\160-\234\167\191\234\169\160-\234\169\191]';
-- list of emoji that use a zwj character (U+200D) to combine with another emoji
-- from: https://unicode.org/Public/emoji/15.1/emoji-zwj-sequences.txt; version: 15.1; 2023-06-05
-- table created by: [[:en:Module:Make emoji zwj table]]
local emoji_t = { -- indexes are decimal forms of the hex values in U+xxxx
[8596] = true, -- U+2194 ↔ left right arrow
[8597] = true, -- U+2195 ↕ up down arrow
[9760] = true, -- U+2620 ☠ skull and crossbones
[9792] = true, -- U+2640 ♀ female sign
[9794] = true, -- U+2642 ♂ male sign
[9877] = true, -- U+2695 ⚕ staff of aesculapius
[9878] = true, -- U+2696 ⚖ scales
[9895] = true, -- U+26A7 ⚧ male with stroke and male and female sign
[9992] = true, -- U+2708 ✈ airplane
[10052] = true, -- U+2744 ❄ snowflake
[10084] = true, -- U+2764 ❤ heavy black heart
[10145] = true, -- U+27A1 ➡ black rightwards arrow
[11035] = true, -- U+2B1B ⬛ black large square
[127752] = true, -- U+1F308 🌈 rainbow
[127787] = true, -- U+1F32B 🌫 fog
[127806] = true, -- U+1F33E 🌾 ear of rice
[127859] = true, -- U+1F373 🍳 cooking
[127868] = true, -- U+1F37C 🍼 baby bottle
[127876] = true, -- U+1F384 🎄 christmas tree
[127891] = true, -- U+1F393 🎓 graduation cap
[127908] = true, -- U+1F3A4 🎤 microphone
[127912] = true, -- U+1F3A8 🎨 artist palette
[127979] = true, -- U+1F3EB 🏫 school
[127981] = true, -- U+1F3ED 🏭 factory
[128102] = true, -- U+1F466 👦 boy
[128103] = true, -- U+1F467 👧 girl
[128104] = true, -- U+1F468 👨 man
[128105] = true, -- U+1F469 👩 woman
[128139] = true, -- U+1F48B 💋 kiss mark
[128165] = true, -- U+1F4A5 💥 collision symbol
[128168] = true, -- U+1F4A8 💨 dash symbol
[128171] = true, -- U+1F4AB 💫 dizzy symbol
[128187] = true, -- U+1F4BB 💻 personal computer
[128188] = true, -- U+1F4BC 💼 brief case
[128293] = true, -- U+1F525 🔥 fire
[128295] = true, -- U+1F527 🔧 wrench
[128300] = true, -- U+1F52C 🔬 microscope
[128488] = true, -- U+1F5E8 🗨 left speech bubble
[128640] = true, -- U+1F680 🚀 rocket
[128658] = true, -- U+1F692 🚒 fire engine
[129001] = true, -- U+1F7E9 🟩 large green square
[129003] = true, -- U+1F7EB 🟫 large brown square
[129309] = true, -- U+1F91D 🤝 handshake
[129455] = true, -- U+1F9AF 🦯 probing cane
[129456] = true, -- U+1F9B0 🦰 emoji component red hair
[129457] = true, -- U+1F9B1 🦱 emoji component curly hair
[129458] = true, -- U+1F9B2 🦲 emoji component bald
[129459] = true, -- U+1F9B3 🦳 emoji component white hair
[129466] = true, -- U+1F9BA 🦺 safety vest
[129468] = true, -- U+1F9BC 🦼 motorized wheelchair
[129469] = true, -- U+1F9BD 🦽 manual wheelchair
[129489] = true, -- U+1F9D1 🧑 adult
[129490] = true, -- U+1F9D2 🧒 child
[129657] = true, -- U+1FA79 🩹 adhesive bandage
[129778] = true, -- U+1FAF2 🫲 leftwards hand
}
--[[----------------------< L A N G U A G E S U P P O R T >-------------------
These tables and constants support various language-specific functionality.
]]
--local this_wiki_code = mw.getContentLanguage():getCode(); -- get this wiki's language code
local this_wiki_code = lang_obj:getCode(); -- get this wiki's language code
if string.match (mw.site.server, 'wikidata') then
this_wiki_code = mw.getCurrentFrame():callParserFunction('int', {'lang'}); -- on Wikidata so use interface language setting instead
end
local mw_languages_by_tag_t = mw.language.fetchLanguageNames (this_wiki_code, 'all'); -- get a table of language tag/name pairs known to Wikimedia; used for interwiki tests
local mw_languages_by_name_t = {};
for k, v in pairs (mw_languages_by_tag_t) do -- build a 'reversed' table name/tag language pairs know to MediaWiki; used for |language=
v = mw.ustring.lower (v); -- lowercase for tag fetch; get name's proper case from mw_languages_by_tag_t[<tag>]
if mw_languages_by_name_t[v] then -- when name already in the table
if 2 == #k or 3 == #k then -- if tag does not have subtags
mw_languages_by_name_t[v] = k; -- prefer the shortest tag for this name
end
else -- here when name not in the table
mw_languages_by_name_t[v] = k; -- so add name and matching tag
end
end
local inter_wiki_map = {}; -- map of interwiki prefixes that are language-code prefixes
for k, v in pairs (mw.site.interwikiMap ('local')) do -- spin through the base interwiki map (limited to local)
if mw_languages_by_tag_t[v["prefix"]] then -- if the prefix matches a known language tag
inter_wiki_map[v["prefix"]] = true; -- add it to our local map
end
end
--[[--------------------< S C R I P T _ L A N G _ C O D E S >-------------------
This table is used to hold ISO 639-1 two-character and ISO 639-3 three-character
language codes that apply only to |script-title= and |script-chapter=
]]
local script_lang_codes = {
'ab', 'am', 'ar', 'be', 'bg', 'bn', 'bo', 'bs', 'ce', 'dv', 'dz', 'el', 'fa', 'grc',
'gu', 'he', 'hi', 'hy', 'ja', 'ka', 'kk', 'km', 'kn', 'ko', 'ku', 'ky', 'lo', 'mk', 'ml',
'mn', 'mni', 'mr', 'my', 'ne', 'or', 'ota', 'pa', 'ps', 'ru', 'sd', 'si', 'sr', 'syc',
'ta', 'te', 'tg', 'th', 'ti', 'tt', 'ug', 'uk', 'ur', 'uz', 'yi', 'yue', 'zh'
};
--[[---------------< L A N G U A G E R E M A P P I N G >----------------------
These tables hold language information that is different (correct) from MediaWiki's definitions
For each ['<tag>'] = 'language name' in lang_code_remap{} there must be a matching ['language name'] = {'language name', '<tag>'} in lang_name_remap{}
lang_tag_remap{}:
key is always lowercase ISO 639-1, -2, -3 language tag or a valid lowercase IETF language tag
value is properly spelled and capitalized language name associated with <tag>
only one language name per <tag>;
key/value pair must have matching entry in lang_name_remap{}
lang_name_remap{}:
key is always lowercase language name
value is a table the holds correctly spelled and capitalized language name [1] and associated tag [2] (tag must match a tag key in lang_tag_remap{})
may have multiple keys referring to a common preferred name and tag; For example:
['kolsch'] and ['kölsch'] both refer to 'Kölsch' and 'ksh'
]]
local lang_tag_remap = { -- used for |language= and |script-title= / |script-chapter=
['als'] = 'Tosk Albanian', -- MediaWiki returns Alemannisch
['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bla'] = 'Blackfoot', -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['bn'] = 'Bengali', -- MediaWiki returns Bangla
['ca-valencia'] = 'Valencian', -- IETF variant of Catalan
['fkv'] = 'Kven', -- MediaWiki returns Kvensk
['gsw'] = 'Swiss German',
['ilo'] = 'Ilocano', -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['ksh'] = 'Kölsch', -- MediaWiki: Colognian; use IANA/ISO 639 preferred name
['ksh-x-colog'] = 'Colognian', -- override MediaWiki ksh; no IANA/ISO 639 code for Colognian; IETF private code created at Module:Lang/data
['mis-x-ripuar'] = 'Ripuarian', -- override MediaWiki ksh; no IANA/ISO 639 code for Ripuarian; IETF private code created at Module:Lang/data
['nan-tw'] = 'Taiwanese Hokkien', -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese and support en.wiki preferred name
['sr-ec'] = 'Serbian (Cyrillic script)', -- MediaWiki returns српски (ћирилица)
['sr-el'] = 'Serbian (Latin script)', -- MediaWiki returns srpski (latinica)
}
local lang_name_remap = { -- used for |language=; names require proper capitalization; tags must be lowercase
['alemannic'] = {'Swiss German', 'gsw'}, -- ISO 639-2, -3 alternate for Swiss German; MediaWiki mediawiki returns Alemannic for gsw; en.wiki preferred name
['alemannisch'] = {'Swiss German', 'gsw'}, -- not an ISO or IANA language name; MediaWiki uses 'als' as a subdomain name for Alemannic Wikipedia: als.wikipedia.org
['bangla'] = {'Bengali', 'bn'}, -- MediaWiki returns Bangla (the endonym) but we want Bengali (the exonym); here we remap
['bengali'] = {'Bengali', 'bn'}, -- MediaWiki doesn't use exonym so here we provide correct language name and 639-1 code
['bhojpuri'] = {'Bhojpuri', 'bho'}, -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['bihari'] = {'Bihari', 'bh'}, -- MediaWiki replaces 'Bihari' with 'Bhojpuri' so 'Bihari' cannot be found
['blackfoot'] = {'Blackfoot', 'bla'}, -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name
['colognian'] = {'Colognian', 'ksh-x-colog'}, -- MediaWiki preferred name for ksh
['ilocano'] = {'Ilocano', 'ilo'}, -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name
['kolsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name (use non-diacritical o instead of umlaut ö)
['kölsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name
['kven'] = {'Kven', 'fkv'}, -- Unicode CLDR have decided not to support English language name for these two...
['kvensk'] = {'Kven', 'fkv'}, -- ...they say to refer to IANA registry for English names
['ripuarian'] = {'Ripuarian', 'mis-x-ripuar'}, -- group of dialects; no code in MediaWiki or in IANA/ISO 639
['serbian (cyrillic script)'] = {'Serbian (Cyrillic script)', 'sr-cyrl'}, -- special case to get correct tag when |language=sr-ec
['serbian (latin script)'] = {'Serbian (Latin script)', 'sr-latn'}, -- special case to get correct tag when |language=sr-el
['swiss german'] = {'Swiss German', 'gsw'},
['taiwanese hokkien'] = {'Taiwanese Hokkien', 'nan-tw'}, -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese
['tosk albanian'] = {'Tosk Albanian', 'als'}, -- MediaWiki replaces 'Tosk Albanian' with 'Alemannisch' so 'Tosk Albanian' cannot be found
['valencian'] = {'Valencian', 'ca-valencia'}, -- variant of Catalan; categorizes as Valencian
}
--[[---------------< P R O P E R T I E S _ C A T E G O R I E S >----------------
Properties categories. These are used for investigating qualities of citations.
]]
local prop_cats = {
['foreign-lang-source'] = 'sumber CS1 jaku $1 ($2)', -- |language= categories; $1 is foreign-language name, $2 is ISO639-1 code
['foreign-lang-source-2'] = 'sumber CS1 jaku luar (ISO 639-2)|$1', -- |language= category; a cat for ISO639-2 languages; $1 is the ISO 639-2 code used as a sort key
['interproj-linked-name'] = 'nama CS1 belink antara projek|$1', -- any author, editor, etc that has an interproject link; $1 is interproject tag used as a sort key
['interwiki-linked-name'] = 'nama CS1 belink antara wiki|$1', -- any author, editor, etc that has an interwiki link; $1 is interwiki tag used as a sort key; yeilds to interproject
['local-lang-source'] = 'sumber CS1 jaku $1 ($2)', -- |language= categories; $1 is local-language name, $2 is ISO639-1 code; not emitted when local_lang_cat_enable is false
['location-test'] = 'CS1 penguji endur',
['long-vol'] = 'CS1: Nilai isi padu panjai', -- probably temporary cat to identify scope of |volume= values longer than 4 characters
['script'] = 'CS1 ngena urup jaku $1 ($2)', -- |script-title=xx: has matching category; $1 is language name, $2 is ISO639-1 code
['tracked-param'] = 'CS1 tracked parameter: $1', -- $1 is base (enumerators removed) parameter name
['year-range-abbreviated'] = 'CS1: abbreviated year range', -- probably temporary cat to identify scope of |date=, |year= values using YYYY–YY form
}
--[[-------------------< T I T L E _ T Y P E S >--------------------------------
Here we map a template's CitationClass to TitleType (default values for |type= parameter)
]]
local title_types = {
['AV-media-notes'] = 'Media notes',
['document'] = 'Document',
['interview'] = 'Interview',
['mailinglist'] = 'Mailing list',
['map'] = 'Map',
['podcast'] = 'Podcast',
['pressrelease'] = 'Press release',
['report'] = 'Report',
['speech'] = 'Speech',
['techreport'] = 'Technical report',
['thesis'] = 'Thesis',
}
--[[--------------------------< B U I L D _ K N O W N _ F R E E _ D O I _ R E G I S T R A N T S _ T A B L E >--
build a table of doi registrants known to be free-to-read In a doi, the registrant ID is the series of digits
between the '10.' and the first '/': in doi 10.1100/sommat, 1100 is the registrant ID
see §3.2.2 DOI prefix of the Doi Handbook p. 43
https://www.doi.org/doi-handbook/DOI_Handbook_Final.pdf#page=43
]]
local function build_free_doi_registrants_table()
local registrants_t = {};
for _, v in ipairs ({
'1045', '1074', '1096', '1100', '1155', '1186', '1194', '1371', '1629', '1989', '1999', '2147', '2196', '3285', '3389', '3390',
'3748', '3814', '3847', '3897', '4061', '4089', '4103', '4172', '4175', '4230', '4236', '4239', '4240', '4249', '4251',
'4252', '4253', '4254', '4291', '4292', '4329', '4330', '4331', '5194', '5210', '5306', '5312', '5313', '5314',
'5315', '5316', '5317', '5318', '5319', '5320', '5321', '5334', '5402', '5409', '5410', '5411', '5412',
'5492', '5493', '5494', '5495', '5496', '5497', '5498', '5499', '5500', '5501', '5527', '5528', '5662',
'6064', '6219', '7167', '7217', '7287', '7482', '7490', '7554', '7717', '7759', '7766', '11131', '11569', '11647',
'11648', '12688', '12703', '12715', '12942', '12998', '13105', '14256', '14293', '14303', '15215', '15347', '15412', '15560', '16995',
'17645', '19080', '19173', '20944', '21037', '21468', '21767', '22261', '22323', '22459', '24105', '24196', '24966',
'26775', '30845', '32545', '35711', '35712', '35713', '35995', '36648', '37126', '37532', '37871', '47128',
'47622', '47959', '52437', '52975', '53288', '54081', '54947', '55667', '55914', '57009', '58647', '59081',
}) do
registrants_t[v] = true; -- build a k/v table of known free-to-read doi registrants
end
return registrants_t;
end
local extended_registrants_t = { -- known free registrants identifiable by the doi suffix incipit
['1016'] = {'j.heliyon'}, -- Heliyon
['1046'] = {'j.1365-8711', 'j.1365-246x'}, -- MNRAS, GJI
['1093'] = {'mnras', 'mnrasl', 'gji', 'rasti'}, -- MNRAS, MNRAS Letters, GJI, RASTI
['1099'] = {'acmi', 'mic', '00221287', 'mgen'}, -- Access Microbiology, Microbiology, Journal of General Microbiology, Microbial Genomics
['1111'] = {'j.1365-2966', 'j.1745-3933', 'j.1365-246X'}, -- MNRAS, MNRAS Letters, GJI
['1210'] = {'jendso','jcemcr'}, -- Journal of the Endocrine Society, JCEM Case Reports
}
--[[===================<< E R R O R M E S S A G I N G >>======================
]]
--[[----------< E R R O R M E S S A G E S U P P L I M E N T S >-------------
I18N for those messages that are supplemented with additional specific text that
describes the reason for the error
TODO: merge this with special_case_translations{}?
]]
local err_msg_supl = {
['char'] = 'invalid character', -- |isbn=, |sbn=
['check'] = 'checksum', -- |isbn=, |sbn=
['flag'] = 'flag', -- |archive-url=
['form'] = 'invalid form', -- |isbn=, |sbn=
['group'] = 'invalid group id', -- |isbn=
['initials'] = 'initials', -- Vancouver
['invalid language code'] = 'invalid language code', -- |script-<param>=
['journal'] = 'journal', -- |bibcode=
['length'] = 'length', -- |isbn=, |bibcode=, |sbn=
['liveweb'] = 'liveweb', -- |archive-url=
['missing comma'] = 'missing comma', -- Vancouver
['missing prefix'] = 'missing prefix', -- |script-<param>=
['missing title part'] = 'missing title part', -- |script-<param>=
['name'] = 'name', -- Vancouver
['non-Latin char'] = 'non-Latin character', -- Vancouver
['path'] = 'path', -- |archive-url=
['prefix'] = 'invalid prefix', -- |isbn=
['punctuation'] = 'punctuation', -- Vancouver
['save'] = 'save command', -- |archive-url=
['suffix'] = 'suffix', -- Vancouver
['timestamp'] = 'timestamp', -- |archive-url=
['unknown language code'] = 'unknown language code', -- |script-<param>=
['value'] = 'value', -- |bibcode=
['year'] = 'year', -- |bibcode=
}
--[[--------------< E R R O R _ C O N D I T I O N S >---------------------------
Error condition table. This table has two sections: errors at the top, maintenance
at the bottom. Maint 'messaging' does not have a 'message' (message=nil)
The following contains a list of IDs for various error conditions defined in the
code. For each ID, we specify a text message to display, an error category to
include, and whether the error message should be wrapped as a hidden comment.
Anchor changes require identical changes to matching anchor in Help:CS1 errors
TODO: rename error_conditions{} to something more generic; create separate error
and maint tables inside that?
]]
local error_conditions = {
err_accessdate_missing_url = {
message = '<code class="cs1-code">|access-date=</code> requires <code class="cs1-code">|url=</code>',
anchor = 'accessdate_missing_url',
category = 'CS1 errors: access-date without URL',
hidden = false
},
err_apostrophe_markup = {
message = 'Italic or bold markup not allowed in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'apostrophe_markup',
category = 'CS1 errors: markup',
hidden = false
},
err_archive_date_missing_url = {
message = '<code class="cs1-code">|archive-date=</code> requires <code class="cs1-code">|archive-url=</code>',
anchor = 'archive_date_missing_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_date_url_ts_mismatch = {
message = '<code class="cs1-code">|archive-date=</code> / <code class="cs1-code">|archive-url=</code> timestamp mismatch; $1 suggested',
anchor = 'archive_date_url_ts_mismatch',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_missing_date = {
message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|archive-date=</code>',
anchor = 'archive_missing_date',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_missing_url = {
message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|url=</code>',
anchor = 'archive_missing_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_archive_url = {
message = '<code class="cs1-code">|archive-url=</code> is malformed: $1', -- $1 is error message detail
anchor = 'archive_url',
category = 'CS1 errors: archive-url',
hidden = false
},
err_arxiv_missing = {
message = '<code class="cs1-code">|arxiv=</code> required',
anchor = 'arxiv_missing',
category = 'CS1 errors: arXiv', -- same as bad arxiv
hidden = false
},
err_asintld_missing_asin = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|asin=</code>', -- $1 is parameter name
anchor = 'asintld_missing_asin',
category = 'CS1 errors: ASIN TLD',
hidden = false
},
err_bad_arxiv = {
message = 'Check <code class="cs1-code">|arxiv=</code> value',
anchor = 'bad_arxiv',
category = 'CS1 errors: arXiv',
hidden = false
},
err_bad_asin = {
message = 'Check <code class="cs1-code">|asin=</code> value',
anchor = 'bad_asin',
category ='CS1 errors: ASIN',
hidden = false
},
err_bad_asin_tld = {
message = 'Check <code class="cs1-code">|asin-tld=</code> value',
anchor = 'bad_asin_tld',
category ='CS1 errors: ASIN TLD',
hidden = false
},
err_bad_bibcode = {
message = 'Check <code class="cs1-code">|bibcode=</code> $1', -- $1 is error message detail
anchor = 'bad_bibcode',
category = 'CS1 errors: bibcode',
hidden = false
},
err_bad_biorxiv = {
message = 'Check <code class="cs1-code">|biorxiv=</code> value',
anchor = 'bad_biorxiv',
category = 'CS1 errors: bioRxiv',
hidden = false
},
err_bad_citeseerx = {
message = 'Check <code class="cs1-code">|citeseerx=</code> value',
anchor = 'bad_citeseerx',
category = 'CS1 errors: citeseerx',
hidden = false
},
err_bad_date = {
message = 'Check date values in: $1', -- $1 is a parameter name list
anchor = 'bad_date',
category = 'CS1 errors: dates',
hidden = false
},
err_bad_doi = {
message = 'Check <code class="cs1-code">|doi=</code> value',
anchor = 'bad_doi',
category = 'CS1 errors: DOI',
hidden = false
},
err_bad_hdl = {
message = 'Check <code class="cs1-code">|hdl=</code> value',
anchor = 'bad_hdl',
category = 'CS1 errors: HDL',
hidden = false
},
err_bad_isbn = {
message = 'Check <code class="cs1-code">|isbn=</code> value: $1', -- $1 is error message detail
anchor = 'bad_isbn',
category = 'CS1 errors: ISBN',
hidden = false
},
err_bad_ismn = {
message = 'Check <code class="cs1-code">|ismn=</code> value',
anchor = 'bad_ismn',
category = 'CS1 errors: ISMN',
hidden = false
},
err_bad_issn = {
message = 'Check <code class="cs1-code">|$1issn=</code> value', -- $1 is 'e' or '' for eissn or issn
anchor = 'bad_issn',
category = 'CS1 errors: ISSN',
hidden = false
},
err_bad_jfm = {
message = 'Check <code class="cs1-code">|jfm=</code> value',
anchor = 'bad_jfm',
category = 'CS1 errors: JFM',
hidden = false
},
err_bad_jstor = {
message = 'Check <code class="cs1-code">|jstor=</code> value',
anchor = 'bad_jstor',
category = 'CS1 errors: JSTOR',
hidden = false
},
err_bad_lccn = {
message = 'Check <code class="cs1-code">|lccn=</code> value',
anchor = 'bad_lccn',
category = 'CS1 errors: LCCN',
hidden = false
},
err_bad_medrxiv = {
message = 'Check <code class="cs1-code">|medrxiv=</code> value',
anchor = 'bad_medrxiv',
category = 'CS1 errors: medRxiv',
hidden = false
},
err_bad_mr = {
message = 'Check <code class="cs1-code">|mr=</code> value',
anchor = 'bad_mr',
category = 'CS1 errors: MR',
hidden = false
},
err_bad_oclc = {
message = 'Check <code class="cs1-code">|oclc=</code> value',
anchor = 'bad_oclc',
category = 'CS1 errors: OCLC',
hidden = false
},
err_bad_ol = {
message = 'Check <code class="cs1-code">|ol=</code> value',
anchor = 'bad_ol',
category = 'CS1 errors: OL',
hidden = false
},
err_bad_osti = {
message = 'Check <code class="cs1-code">|osti=</code> value',
anchor = 'bad_osti',
category = 'CS1 errors: OSTI',
hidden = false
},
err_bad_paramlink = { -- for |title-link=, |author/editor/translator-link=, |series-link=, |episode-link=
message = 'Check <code class="cs1-code">|$1=</code> value', -- $1 is parameter name
anchor = 'bad_paramlink',
category = 'CS1 errors: parameter link',
hidden = false
},
err_bad_pmc = {
message = 'Check <code class="cs1-code">|pmc=</code> value',
anchor = 'bad_pmc',
category = 'CS1 errors: PMC',
hidden = false
},
err_bad_pmid = {
message = 'Check <code class="cs1-code">|pmid=</code> value',
anchor = 'bad_pmid',
category = 'CS1 errors: PMID',
hidden = false
},
err_bad_rfc = {
message = 'Check <code class="cs1-code">|rfc=</code> value',
anchor = 'bad_rfc',
category = 'CS1 errors: RFC',
hidden = false
},
err_bad_s2cid = {
message = 'Check <code class="cs1-code">|s2cid=</code> value',
anchor = 'bad_s2cid',
category = 'CS1 errors: S2CID',
hidden = false
},
err_bad_sbn = {
message = 'Check <code class="cs1-code">|sbn=</code> value: $1', -- $1 is error message detail
anchor = 'bad_sbn',
category = 'CS1 errors: SBN',
hidden = false
},
err_bad_ssrn = {
message = 'Check <code class="cs1-code">|ssrn=</code> value',
anchor = 'bad_ssrn',
category = 'CS1 errors: SSRN',
hidden = false
},
err_bad_url = {
message = 'Check $1 value', -- $1 is parameter name
anchor = 'bad_url',
category = 'CS1 errors: URL',
hidden = false
},
err_bad_usenet_id = {
message = 'Check <code class="cs1-code">|message-id=</code> value',
anchor = 'bad_message_id',
category = 'CS1 errors: message-id',
hidden = false
},
err_bad_zbl = {
message = 'Check <code class="cs1-code">|zbl=</code> value',
anchor = 'bad_zbl',
category = 'CS1 errors: Zbl',
hidden = false
},
err_bare_url_missing_title = {
message = '$1 missing title', -- $1 is parameter name
anchor = 'bare_url_missing_title',
category = 'CS1 errors: bare URL',
hidden = false
},
err_biorxiv_missing = {
message = '<code class="cs1-code">|biorxiv=</code> required',
anchor = 'biorxiv_missing',
category = 'CS1 errors: bioRxiv', -- same as bad bioRxiv
hidden = false
},
err_chapter_ignored = {
message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'chapter_ignored',
category = 'CS1 errors: chapter ignored',
hidden = false
},
err_citation_missing_title = {
message = 'Missing or empty <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'citation_missing_title',
category = 'CS1 errors: missing title',
hidden = false
},
err_citeseerx_missing = {
message = '<code class="cs1-code">|citeseerx=</code> required',
anchor = 'citeseerx_missing',
category = 'CS1 errors: citeseerx', -- same as bad citeseerx
hidden = false
},
err_cite_web_url = { -- this error applies to cite web and to cite podcast
message = 'Missing or empty <code class="cs1-code">|url=</code>',
anchor = 'cite_web_url',
category = 'CS1 errors: requires URL',
hidden = false
},
err_class_ignored = {
message = '<code class="cs1-code">|class=</code> ignored',
anchor = 'class_ignored',
category = 'CS1 errors: class',
hidden = false
},
err_contributor_ignored = {
message = '<code class="cs1-code">|contributor=</code> ignored',
anchor = 'contributor_ignored',
category = 'CS1 errors: contributor',
hidden = false
},
err_contributor_missing_required_param = {
message = '<code class="cs1-code">|contributor=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'contributor_missing_required_param',
category = 'CS1 errors: contributor',
hidden = false
},
err_deprecated_params = {
message = 'Cite uses deprecated parameter <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'deprecated_params',
category = 'CS1 errors: deprecated parameters',
hidden = false
},
err_disp_name = {
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name; $2 is the assigned value
anchor = 'disp_name',
category = 'CS1 errors: display-names',
hidden = false,
},
err_doibroken_missing_doi = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|doi=</code>', -- $1 is parameter name
anchor = 'doibroken_missing_doi',
category = 'CS1 errors: DOI',
hidden = false
},
err_embargo_missing_pmc = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|pmc=</code>', -- $1 is parameter name
anchor = 'embargo_missing_pmc',
category = 'CS1 errors: PMC embargo',
hidden = false
},
err_empty_citation = {
message = 'Empty citation',
anchor = 'empty_citation',
category = 'CS1 errors: empty citation',
hidden = false
},
err_etal = {
message = 'Explicit use of et al. in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'explicit_et_al',
category = 'CS1 errors: explicit use of et al.',
hidden = false
},
err_extra_text_edition = {
message = '<code class="cs1-code">|edition=</code> has extra text',
anchor = 'extra_text_edition',
category = 'CS1 errors: extra text: edition',
hidden = false,
},
err_extra_text_issue = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_issue',
category = 'CS1 errors: extra text: issue',
hidden = false,
},
err_extra_text_pages = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_pages',
category = 'CS1 errors: extra text: pages',
hidden = false,
},
err_extra_text_volume = {
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name
anchor = 'extra_text_volume',
category = 'CS1 errors: extra text: volume',
hidden = false,
},
err_first_missing_last = {
message = '<code class="cs1-code">|$1=</code> missing <code class="cs1-code">|$2=</code>', -- $1 is first alias, $2 is matching last alias
anchor = 'first_missing_last',
category = 'CS1 errors: missing name', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_format_missing_url = {
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|$2=</code>', -- $1 is format parameter $2 is url parameter
anchor = 'format_missing_url',
category = 'CS1 errors: format without URL',
hidden = false
},
err_generic_name = {
message = '<code class="cs1-code">|$1=</code> has generic name', -- $1 is parameter name
anchor = 'generic_name',
category = 'CS1 errors: generic name',
hidden = false,
},
err_generic_title = {
message = 'Cite uses generic title',
anchor = 'generic_title',
category = 'CS1 errors: generic title',
hidden = false,
},
err_invalid_param_val = {
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name $2 is parameter value
anchor = 'invalid_param_val',
category = 'CS1 errors: invalid parameter value',
hidden = false
},
err_invisible_char = {
message = '$1 in $2 at position $3', -- $1 is invisible char $2 is parameter name $3 is position number
anchor = 'invisible_char',
category = 'CS1 errors: invisible characters',
hidden = false
},
err_medrxiv_missing = {
message = '<code class="cs1-code">|medrxiv=</code> required',
anchor = 'medrxiv_missing',
category = 'CS1 errors: medRxiv', -- same as bad medRxiv
hidden = false
},
err_missing_name = {
message = 'Missing <code class="cs1-code">|$1$2=</code>', -- $1 is modified NameList; $2 is enumerator
anchor = 'missing_name',
category = 'CS1 errors: missing name', -- author, contributor, editor, interviewer, translator
hidden = false
},
err_missing_periodical = {
message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical periodical parameter name for cite $1
anchor = 'missing_periodical',
category = 'CS1 errors: missing periodical',
hidden = false
},
err_missing_pipe = {
message = 'Missing pipe in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'missing_pipe',
category = 'CS1 errors: missing pipe',
hidden = false
},
err_missing_publisher = {
message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical publisher parameter name for cite $1
anchor = 'missing_publisher',
category = 'CS1 errors: missing publisher',
hidden = false
},
err_numeric_names = {
message = '<code class="cs1-code">|$1=</code> has numeric name', -- $1 is parameter name',
anchor = 'numeric_names',
category = 'CS1 errors: numeric name',
hidden = false,
},
err_param_access_requires_param = {
message = '<code class="cs1-code">|$1-access=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name
anchor = 'param_access_requires_param',
category = 'CS1 errors: param-access',
hidden = false
},
err_param_has_ext_link = {
message = 'External link in <code class="cs1-code">$1</code>', -- $1 is parameter name
anchor = 'param_has_ext_link',
category = 'CS1 errors: external links',
hidden = false
},
err_parameter_ignored = {
message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'parameter_ignored',
category = 'CS1 errors: unsupported parameter',
hidden = false
},
err_parameter_ignored_suggest = {
message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored (<code class="cs1-code">|$2=</code> suggested)', -- $1 is unknown parameter $2 is suggested parameter name
anchor = 'parameter_ignored_suggest',
category = 'CS1 errors: unsupported parameter',
hidden = false
},
err_periodical_ignored = {
message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name
anchor = 'periodical_ignored',
category = 'CS1 errors: periodical ignored',
hidden = false
},
err_redundant_parameters = {
message = 'More than one of $1 specified', -- $1 is error message detail
anchor = 'redundant_parameters',
category = 'CS1 errors: redundant parameter',
hidden = false
},
err_script_parameter = {
message = 'Invalid <code class="cs1-code">|$1=</code>: $2', -- $1 is parameter name $2 is script language code or error detail
anchor = 'script_parameter',
category = 'CS1 errors: script parameters',
hidden = false
},
err_ssrn_missing = {
message = '<code class="cs1-code">|ssrn=</code> required',
anchor = 'ssrn_missing',
category = 'CS1 errors: SSRN',
hidden = false
},
err_text_ignored = {
message = 'Text "$1" ignored', -- $1 is ignored text
anchor = 'text_ignored',
category = 'CS1 errors: unrecognized parameter',
hidden = false
},
err_trans_missing_title = {
message = '<code class="cs1-code">|trans-$1=</code> requires <code class="cs1-code">|$1=</code> or <code class="cs1-code">|script-$1=</code>', -- $1 is base parameter name
anchor = 'trans_missing_title',
category = 'CS1 errors: translated title',
hidden = false
},
err_param_unknown_empty = {
message = 'Cite has empty unknown parameter$1: $2', -- $1 is 's' or empty space; $2 is emty unknown param list
anchor = 'param_unknown_empty',
category = 'CS1 errors: empty unknown parameters',
hidden = false
},
err_vancouver = {
message = 'Vancouver style error: $1 in name $2', -- $1 is error detail, $2 is the nth name
anchor = 'vancouver',
category = 'CS1 errors: Vancouver style',
hidden = false
},
err_wikilink_in_url = {
message = 'URL–wikilink conflict', -- uses ndash
anchor = 'wikilink_in_url',
category = 'CS1 errors: URL–wikilink conflict', -- uses ndash
hidden = false
},
--[[--------------------------< M A I N T >-------------------------------------
maint messages do not have a message (message = nil); otherwise the structure
is the same as error messages
]]
maint_archived_copy = {
message = nil,
anchor = 'archived_copy',
category = 'CS1 maint: archived copy as title',
hidden = true,
},
maint_bibcode = {
message = nil,
anchor = 'bibcode',
category = 'CS1 maint: bibcode',
hidden = true,
},
maint_location_no_publisher = { -- cite book, conference, encyclopedia; citation as book cite or encyclopedia cite
message = nil,
anchor = 'location_no_publisher',
category = 'CS1 maint: location missing publisher',
hidden = true,
},
maint_bot_unknown = {
message = nil,
anchor = 'bot:_unknown',
category = 'CS1 maint: bot: original URL status unknown',
hidden = true,
},
maint_date_auto_xlated = { -- date auto-translation not supported by en.wiki
message = nil,
anchor = 'date_auto_xlated',
category = 'CS1 maint: date auto-translated',
hidden = true,
},
maint_date_format = {
message = nil,
anchor = 'date_format',
category = 'CS1 maint: date format',
hidden = true,
},
maint_date_year = {
message = nil,
anchor = 'date_year',
category = 'CS1 maint: date and year',
hidden = true,
},
maint_doi_ignore = {
message = nil,
anchor = 'doi_ignore',
category = 'CS1 maint: ignored DOI errors',
hidden = true,
},
maint_doi_inactive = {
message = nil,
anchor = 'doi_inactive',
category = 'CS1 maint: DOI inactive',
hidden = true,
},
maint_doi_inactive_dated = {
message = nil,
anchor = 'doi_inactive_dated',
category = 'CS1 maint: DOI inactive as of $2$3$1', -- $1 is year, $2 is month-name or empty string, $3 is space or empty string
hidden = true,
},
maint_doi_unflagged_free = {
message = nil,
anchor = 'doi_unflagged_free',
category = 'CS1 maint: unflagged free DOI',
hidden = true,
},
maint_extra_punct = {
message = nil,
anchor = 'extra_punct',
category = 'CS1 maint: extra punctuation',
hidden = true,
},
maint_isbn_ignore = {
message = nil,
anchor = 'ignore_isbn_err',
category = 'CS1 maint: ignored ISBN errors',
hidden = true,
},
maint_issn_ignore = {
message = nil,
anchor = 'ignore_issn',
category = 'CS1 maint: ignored ISSN errors',
hidden = true,
},
maint_jfm_format = {
message = nil,
anchor = 'jfm_format',
category = 'CS1 maint: JFM format',
hidden = true,
},
maint_location = {
message = nil,
anchor = 'location',
category = 'CS1 maint: location',
hidden = true,
},
maint_mr_format = {
message = nil,
anchor = 'mr_format',
category = 'CS1 maint: MR format',
hidden = true,
},
maint_mult_names = {
message = nil,
anchor = 'mult_names',
category = 'CS1 maint: multiple names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_numeric_names = {
message = nil,
anchor = 'numeric_names',
category = 'CS1 maint: numeric names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table
hidden = true,
},
maint_others = {
message = nil,
anchor = 'others',
category = 'CS1 maint: others',
hidden = true,
},
maint_others_avm = {
message = nil,
anchor = 'others_avm',
category = 'CS1 maint: others in cite AV media (notes)',
hidden = true,
},
maint_overridden_setting = {
message = nil,
anchor = 'overridden',
category = 'CS1 maint: overridden setting',
hidden = true,
},
maint_page_art_num = {
message = nil,
anchor = 'page_art_num',
category = 'CS1 maint: article number as page number',
hidden = true,
},
maint_pmc_embargo = {
message = nil,
anchor = 'embargo',
category = 'CS1 maint: PMC embargo expired',
hidden = true,
},
maint_pmc_format = {
message = nil,
anchor = 'pmc_format',
category = 'CS1 maint: PMC format',
hidden = true,
},
maint_postscript = {
message = nil,
anchor = 'postscript',
category = 'CS1 maint: postscript',
hidden = true,
},
maint_ref_duplicates_default = {
message = nil,
anchor = 'ref_default',
category = 'CS1 maint: ref duplicates default',
hidden = true,
},
maint_unfit = {
message = nil,
anchor = 'unfit',
category = 'CS1 maint: unfit URL',
hidden = true,
},
maint_unknown_lang = {
message = nil,
anchor = 'unknown_lang',
category = 'CS1 maint: unrecognized language',
hidden = true,
},
maint_untitled = {
message = nil,
anchor = 'untitled',
category = 'CS1 maint: untitled periodical',
hidden = true,
},
maint_url_status = {
message = nil,
anchor = 'url_status',
category = 'CS1 maint: url-status',
hidden = true,
},
maint_year= {
message = nil,
anchor = 'year',
category = 'CS1 maint: year',
hidden = true,
},
maint_zbl = {
message = nil,
anchor = 'zbl',
category = 'CS1 maint: Zbl',
hidden = true,
},
}
--[[--------------------------< I D _ L I M I T S _ D A T A _ T >----------------------------------------------
fetch id limits for certain identifiers from c:Data:CS1/Identifier limits.tab. This source is a json tabular
data file maintained at wikipedia commons. Convert the json format to a table of k/v pairs.
The values from <id_limits_data_t> are used to set handle.id_limit.
]]
local id_limits_data_t = {};
for _, limit_t in ipairs (mw.ext.data.get ("CS1/Identifier limits.tab").data) do
id_limits_data_t[limit_t[1]] = limit_t[2]; -- <limit[1]> is identifier; <limit[2]> is upper limit for that identifier
end
--[[--------------------------< I D _ H A N D L E R S >--------------------------------------------------------
The following contains a list of values for various defined identifiers. For each
identifier we specify a variety of information necessary to properly render the
identifier in the citation.
parameters: a list of parameter aliases for this identifier; first in the list is the canonical form
link: Wikipedia article name
redirect: a local redirect to a local Wikipedia article name; at en.wiki, 'ISBN (identifier)' is a redirect to 'International Standard Book Number'
q: Wikidata q number for the identifier
label: the label preceding the identifier; label is linked to a Wikipedia article (in this order):
redirect from id_handlers['<id>'].redirect when use_identifier_redirects is true
Wikidata-supplied article name for the local wiki from id_handlers['<id>'].q
local article name from id_handlers['<id>'].link
prefix: the first part of a URL that will be concatenated with a second part which usually contains the identifier
suffix: optional third part to be added after the identifier
encode: true if URI should be percent-encoded; otherwise false
COinS: identifier link or keyword for use in COinS:
for identifiers registered at info-uri.info use: info:.... where '...' is the appropriate identifier label
for identifiers that have COinS keywords, use the keyword: rft.isbn, rft.issn, rft.eissn
for |asin= and |ol=, which require assembly, use the keyword: url
for others make a URL using the value in prefix/suffix and #label, use the keyword: pre (not checked; any text other than 'info', 'rft', or 'url' works here)
set to nil to leave the identifier out of the COinS
separator: character or text between label and the identifier in the rendered citation
id_limit: for those identifiers with established limits, this property holds the upper limit
access: use this parameter to set the access level for all instances of this identifier.
the value must be a valid access level for an identifier (see ['id-access'] in this file).
custom_access: to enable custom access level for an identifier, set this parameter
to the parameter that should control it (normally 'id-access')
]]
local id_handlers = {
['ARXIV'] = {
parameters = {'arxiv', 'eprint'},
link = 'arXiv',
redirect = 'arXiv (identifier)',
q = 'Q118398',
label = 'arXiv',
prefix = 'https://arxiv.org/abs/',
encode = false,
COinS = 'info:arxiv',
separator = ':',
access = 'free', -- free to read
},
['ASIN'] = {
parameters = { 'asin', 'ASIN' },
link = 'Amazon Standard Identification Number',
redirect = 'ASIN (identifier)',
q = 'Q1753278',
label = 'ASIN',
prefix = 'https://www.amazon.',
COinS = 'url',
separator = ' ',
encode = false;
},
['BIBCODE'] = {
parameters = {'bibcode'},
link = 'Bibcode',
redirect = 'Bibcode (identifier)',
q = 'Q25754',
label = 'Bibcode',
prefix = 'https://ui.adsabs.harvard.edu/abs/',
encode = false,
COinS = 'info:bibcode',
separator = ':',
custom_access = 'bibcode-access',
},
['BIORXIV'] = {
parameters = {'biorxiv'},
link = 'bioRxiv',
redirect = 'bioRxiv (identifier)',
q = 'Q19835482',
label = 'bioRxiv',
prefix = 'https://doi.org/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['CITESEERX'] = {
parameters = {'citeseerx'},
link = 'CiteSeerX',
redirect = 'CiteSeerX (identifier)',
q = 'Q2715061',
label = 'CiteSeerX',
prefix = 'https://citeseerx.ist.psu.edu/viewdoc/summary?doi=',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = true,
separator = ' ',
},
['DOI'] = { -- Used by InternetArchiveBot
parameters = { 'doi', 'DOI'},
link = 'Digital object identifier',
redirect = 'doi (identifier)',
q = 'Q25670',
label = 'doi',
prefix = 'https://doi.org/',
COinS = 'info:doi',
separator = ':',
encode = true,
custom_access = 'doi-access',
},
['EISSN'] = {
parameters = {'eissn', 'EISSN'},
link = 'International Standard Serial Number#Electronic ISSN',
redirect = 'eISSN (identifier)',
q = 'Q46339674',
label = 'eISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.eissn',
encode = false,
separator = ' ',
},
['HDL'] = {
parameters = { 'hdl', 'HDL' },
link = 'Handle System',
redirect = 'hdl (identifier)',
q = 'Q3126718',
label = 'hdl',
prefix = 'https://hdl.handle.net/',
COinS = 'info:hdl',
separator = ':',
encode = true,
custom_access = 'hdl-access',
},
['ISBN'] = { -- Used by InternetArchiveBot
parameters = {'isbn', 'ISBN'},
link = 'International Standard Book Number',
redirect = 'ISBN (identifier)',
q = 'Q33057',
label = 'ISBN',
prefix = 'Special:BookSources/',
COinS = 'rft.isbn',
separator = ' ',
},
['ISMN'] = {
parameters = {'ismn', 'ISMN'},
link = 'International Standard Music Number',
redirect = 'ISMN (identifier)',
q = 'Q1666938',
label = 'ISMN',
prefix = '', -- not currently used;
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['ISSN'] = {
parameters = {'issn', 'ISSN'},
link = 'International Standard Serial Number',
redirect = 'ISSN (identifier)',
q = 'Q131276',
label = 'ISSN',
prefix = 'https://search.worldcat.org/issn/',
COinS = 'rft.issn',
encode = false,
separator = ' ',
},
['JFM'] = {
parameters = {'jfm', 'JFM'},
link = 'Jahrbuch über die Fortschritte der Mathematik',
redirect = 'JFM (identifier)',
q = '',
label = 'JFM',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['JSTOR'] = {
parameters = {'jstor', 'JSTOR'},
link = 'JSTOR',
redirect = 'JSTOR (identifier)',
q = 'Q1420342',
label = 'JSTOR',
prefix = 'https://www.jstor.org/stable/',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
custom_access = 'jstor-access',
},
['LCCN'] = {
parameters = {'lccn', 'LCCN'},
link = 'Library of Congress Control Number',
redirect = 'LCCN (identifier)',
q = 'Q620946',
label = 'LCCN',
prefix = 'https://lccn.loc.gov/',
COinS = 'info:lccn',
encode = false,
separator = ' ',
},
['MEDRXIV'] = {
parameters = {'medrxiv'},
link = 'medRxiv',
redirect = 'medRxiv (identifier)',
q = 'Q58465838',
label = 'medRxiv',
prefix = 'https://www.medrxiv.org/content/',
COinS = 'pre', -- use prefix value
access = 'free', -- free to read
encode = false,
separator = ' ',
},
['MR'] = {
parameters = {'mr', 'MR'},
link = 'Mathematical Reviews',
redirect = 'MR (identifier)',
q = 'Q211172',
label = 'MR',
prefix = 'https://mathscinet.ams.org/mathscinet-getitem?mr=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
['OCLC'] = {
parameters = {'oclc', 'OCLC'},
link = 'OCLC',
redirect = 'OCLC (identifier)',
q = 'Q190593',
label = 'OCLC',
prefix = 'https://search.worldcat.org/oclc/',
COinS = 'info:oclcnum',
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OCLC or 0,
},
['OL'] = {
parameters = { 'ol', 'OL' },
link = 'Open Library',
redirect = 'OL (identifier)',
q = 'Q1201876',
label = 'OL',
prefix = 'https://openlibrary.org/',
COinS = 'url',
separator = ' ',
encode = true,
custom_access = 'ol-access',
},
['OSTI'] = {
parameters = {'osti', 'OSTI'},
link = 'Office of Scientific and Technical Information',
redirect = 'OSTI (identifier)',
q = 'Q2015776',
label = 'OSTI',
prefix = 'https://www.osti.gov/biblio/',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.OSTI or 0,
custom_access = 'osti-access',
},
['PMC'] = {
parameters = {'pmc', 'PMC'},
link = 'PubMed Central',
redirect = 'PMC (identifier)',
q = 'Q229883',
label = 'PMC',
prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC',
suffix = '',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.PMC or 0,
access = 'free', -- free to read
},
['PMID'] = {
parameters = {'pmid', 'PMID'},
link = 'PubMed Identifier',
redirect = 'PMID (identifier)',
q = 'Q2082879',
label = 'PMID',
prefix = 'https://pubmed.ncbi.nlm.nih.gov/',
COinS = 'info:pmid',
encode = false,
separator = ' ',
id_limit = id_limits_data_t.PMID or 0,
},
['RFC'] = {
parameters = {'rfc', 'RFC'},
link = 'Request for Comments',
redirect = 'RFC (identifier)',
q = 'Q212971',
label = 'RFC',
prefix = 'https://tools.ietf.org/html/rfc',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.RFC or 0,
access = 'free', -- free to read
},
['SBN'] = {
parameters = {'sbn', 'SBN'},
link = 'Standard Book Number', -- redirect to International_Standard_Book_Number#History
redirect = 'SBN (identifier)',
label = 'SBN',
prefix = 'Special:BookSources/0-', -- prefix has leading zero necessary to make 9-digit sbn a 10-digit isbn
COinS = nil, -- nil because we can't use pre or rft or info:
separator = ' ',
},
['SSRN'] = {
parameters = {'ssrn', 'SSRN'},
link = 'Social Science Research Network',
redirect = 'SSRN (identifier)',
q = 'Q7550801',
label = 'SSRN',
prefix = 'https://papers.ssrn.com/sol3/papers.cfm?abstract_id=',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
id_limit = id_limits_data_t.SSRN or 0,
custom_access = 'ssrn-access',
},
['S2CID'] = {
parameters = {'s2cid', 'S2CID'},
link = 'Semantic Scholar',
redirect = 'S2CID (identifier)',
q = 'Q22908627',
label = 'S2CID',
prefix = 'https://api.semanticscholar.org/CorpusID:',
COinS = 'pre', -- use prefix value
encode = false,
separator = ' ',
id_limit = id_limits_data_t.S2CID or 0,
custom_access = 's2cid-access',
},
['USENETID'] = {
parameters = {'message-id'},
link = 'Usenet',
redirect = 'Usenet (identifier)',
q = 'Q193162',
label = 'Usenet:',
prefix = 'news:',
encode = false,
COinS = 'pre', -- use prefix value
separator = ' ',
},
['ZBL'] = {
parameters = {'zbl', 'ZBL' },
link = 'Zentralblatt MATH',
redirect = 'Zbl (identifier)',
q = 'Q190269',
label = 'Zbl',
prefix = 'https://zbmath.org/?format=complete&q=an:',
COinS = 'pre', -- use prefix value
encode = true,
separator = ' ',
},
}
--[[--------------------------< E X P O R T S >---------------------------------
]]
return {
use_identifier_redirects = use_identifier_redirects, -- booleans defined in the settings at the top of this module
local_lang_cat_enable = local_lang_cat_enable,
date_name_auto_xlate_enable = date_name_auto_xlate_enable,
date_digit_auto_xlate_enable = date_digit_auto_xlate_enable,
enable_sort_keys = enable_sort_keys,
-- tables and variables created when this module is loaded
global_df = get_date_format (), -- this line can be replaced with "global_df = 'dmy-all'," to have all dates auto translated to dmy format.
global_cs1_config_t = global_cs1_config_t, -- global settings from {{cs1 config}}
punct_skip = build_skip_table (punct_skip, punct_meta_params),
url_skip = build_skip_table (url_skip, url_meta_params),
known_free_doi_registrants_t = build_free_doi_registrants_table(),
name_space_sort_keys = name_space_sort_keys,
aliases = aliases,
special_case_translation = special_case_translation,
date_names = date_names,
err_msg_supl = err_msg_supl,
error_conditions = error_conditions,
editor_markup_patterns = editor_markup_patterns,
et_al_patterns = et_al_patterns,
extended_registrants_t = extended_registrants_t,
id_handlers = id_handlers,
keywords_lists = keywords_lists,
keywords_xlate = keywords_xlate,
stripmarkers = stripmarkers,
invisible_chars = invisible_chars,
invisible_defs = invisible_defs,
indic_script = indic_script,
emoji_t = emoji_t,
maint_cats = maint_cats,
messages = messages,
presentation = presentation,
prop_cats = prop_cats,
script_lang_codes = script_lang_codes,
lang_tag_remap = lang_tag_remap,
lang_name_remap = lang_name_remap,
this_wiki_code = this_wiki_code,
title_types = title_types,
uncategorized_namespaces = uncategorized_namespaces_t,
uncategorized_subpages = uncategorized_subpages,
templates_using_volume = templates_using_volume,
templates_using_issue = templates_using_issue,
templates_not_using_page = templates_not_using_page,
vol_iss_pg_patterns = vol_iss_pg_patterns,
single_letter_2nd_lvl_domains_t = single_letter_2nd_lvl_domains_t,
inter_wiki_map = inter_wiki_map,
mw_languages_by_tag_t = mw_languages_by_tag_t,
mw_languages_by_name_t = mw_languages_by_name_t,
citation_class_map_t = citation_class_map_t,
citation_issue_t = citation_issue_t,
citation_no_volume_t = citation_no_volume_t,
}
elraypr8yjxl3lluj9je1bb952zw3ee
Mawat
0
1385
19278
19105
2026-06-10T10:38:09Z
Song GK
9
Song GK telah memindahkan laman [[Gibrael Mawat]] ke [[Mawat]]
19105
wikitext
text/x-wiki
{{Infobox musical artist
| name = Gibrael Mawat
| caption =
| birth_name = Gibrael Mawat
| birth_place = [[Sarawak]]
| occupation = Penyanyi
| genre = Pop
| years_active = 2021- diatu
| label = Assapai Music Production
}}
'''Gibrael Mawat Clement Saran'''<ref>{{cite web |url=https://utusansarawak.com.my/eksklusif-saya-mahu-dunia-tahu-keindahan-muzik-iban-mawat/ |title=Eksklusif: Saya mahu dunia tahu keindahan muzik Iban, Mawat |website=Utusan Sarawak |access-date=2026-05-17}}</ref> tauka dikelala enggau nama '''Mawat''' nya siku penanyi Iban ari [[Sarawak]]. Iya tebilang enggau lagu Mit Kelichit , Ulat Bulu , enggau Dayang Bintang.
==Kereban sanding==
{{reflist}}
[[Kategori:Artis Iban]]
g8ug4u8lpp654s5dnblvx45x9y4szf5
Maria
0
1744
19267
12481
2026-06-10T07:18:59Z
Song GK
9
/* Penyanding */
19267
wikitext
text/x-wiki
{{Infobox person
| name = Maria
| image = The Mourning Virgin Daoud Corm.png
| birth_date = {{Circa|20 BC}}{{Efn|Per the [[Bar and bat mitzvah#Significance|Jewish customs surrounding marriage]] at the time, and the apocryphal [[Gospel of James]], Mary was approximately 16-17{{Efn|if we got the early [[Christian]] traditions on Mary's birthday on September 8th and Jesus's birthday on December 25th we would get that Mary would be 17 when giving birth to Jesus}} years old when giving birth to Jesus.<ref>{{Cite web |title=CHURCH FATHERS: Protoevangelium of James |url=https://www.newadvent.org/fathers/0847.htm |access-date=2024-08-27 |website=www.newadvent.org |quote=And she was sixteen years old when these mysteries happened.}}</ref> Her year of birth is therefore contingent on [[Date of birth of Jesus|that of Jesus]], and though some posit slightly different dates (such as [[John P. Meier|Meier]]'s dating of {{C.|7}} or 6 BC)<ref>{{Cite book |last=Meier |first=John P. |author-link=John P. Meier |title=A Marginal Jew: The Roots of the Problem and the Person |year=1991 |publisher=Yale University Press |isbn=978-0-300-14018-7|page=407}}</ref> general consensus places Jesus' birth in {{C.|4}} BC,<ref>{{Cite book|last=Sanders|first=E. P.|author-link=E. P. Sanders|title=The Historical Figure of Jesus|publisher=Allen Lane Penguin Press|year=1993|url=https://books.google.com/books?id=lkbTL36ZgPIC|isbn=978-0-14-192822-7|access-date=1 September 2022|archive-date=18 April 2017|archive-url=https://web.archive.org/web/20170418040039/https://books.google.com/books?id=lkbTL36ZgPIC|url-status=live|pages=10–11}}</ref> thus placing Mary's birth in {{C.|20}} BC.}}
| birth_place = [[Herodian kingdom|Herodian Judea]]
| death_date = After {{C.|33 AD}}
| death_place = [[Jerusalem]], [[Province of Judea|Province of Judaea]], [[Roman Empire]]<br />or [[Ephesus]], [[Province of Asia]], [[Roman Empire]]<ref>{{Cite web |title=Catholic Enncyclopedia: Tomb of the Blessed Virgin Mary |url=https://www.newadvent.org/cathen/14774a.htm |access-date=2 January 2023 |website=New Advent}}</ref><ref>{{Cite web |title=Tomb of Mary: Location and Significance: University of Dayton, Ohio |url=https://udayton.edu/imri/mary/t/tomb-of-mary-location-and-significance.php |access-date=2 January 2023 |website=udayton.edu}}</ref>
| spouse = [[Saint Joseph|Joseph]]
| children = [[Jesus]]
| parents = [[Joachim]] and [[Saint Anne|Anne]] (according to some apocryphal writings)
}}
'''Maria''' tau dikumbai mega '''Indai Maria''' nya indai [[Jesus|Jesus Christ]] enggau bini [[Joseph]]. Iya disebut dalam [[Sempekat Baru]] enggau mega ba [[Al-Quran]]. Gerija [[Ortodoks Timur]], [[Ortodoks Oriental]], [[Syiriak Timur]], [[Katolik]], [[Anglikan]] enggau [[Lutheran]] pechaya Maria, ukai mina indai Jesus, tang iya mega '''Indai Allah Taala''' lalu gelar '''Ratu Serega'''. Penemu orang [[Protestan]] bukai ngagai Maria bebida nitihka denominasyen sida.
Ba pengarap [[Islam]], Maria dikelala enggau nama Maryam, lalu bisi surah dalam Al-Quran ke ngembuan nama iya, ke dikumbai [[Surah Maryam]]. Iya mega ngembuan penuduk ke pemadu tinggi entara semua indu nitihka pengarap Islam. Iya mega dikeninggika dalam pengarap [[Pengarap Baháʼí|Baháʼí]] enggau [[Druze]].
== Nota ==
<references group="lower-alpha" />
== Kereban sanding ==
{{reflist}}
jx368kyddj1qxckhw9d7d3edo6dn24v
Pengidup
0
1905
19268
11393
2026-06-10T07:19:40Z
Song GK
9
19268
wikitext
text/x-wiki
{{Automatic taxobox
| name = Life <!-- please see section "Biota" on Talk page before reverting-->
| fossil_range = {{Long fossil range|3770|0|earliest=4280}} [[Archean]] – [[Holocene|present]] (possible [[Hadean]] origin)
| image = Coral reef... South end of my area (14119221571).jpg
| image_upright = 1.2
| image_caption = Diverse forms of life on a [[coral reef]]
| taxon = Life
| authority =
| subdivision_ranks = [[Domain (biology)|Domains]] and [[Kingdom (biology)#Kingdoms of the Eukaryota|Supergroups]]
| subdivision = Life on Earth:
* [[Cellular life]]
** Domain [[Bacteria]]
** Domain [[Archaea]]
** Domain [[Eukaryota]]
*** [[Diaphoretickes]]
**** [[Archaeplastida]] <small>(includes [[plant]]s)</small>
**** [[Haptista]]
**** [[Cryptista]]
**** [[TSAR]]
*** "[[Excavata]]"
*** [[Provora]]
*** [[Ancyromonadida]]
*** [[CRuMs]]
*** [[Hemimastigophora]]
*** [[Amorphea]] <small>(includes [[animal]]s and [[fungi]])</small>
**''[[Parakaryon myojinensis]]'' (''[[incertae sedis]]'')
* [[Non-cellular life]]
** [[Virus]]es{{Efn|Viruses are strongly believed not to descend from a common ancestor, with each [[Realm (virology)|realm]] corresponding to separate instances of a virus coming into existence.<ref name=exec >{{Cite journal |author=International Committee on Taxonomy of Viruses Executive Committee |date=May 2020 |title=The New Scope of Virus Taxonomy: Partitioning the Virosphere Into 15 Hierarchical Ranks |journal=Nature Microbiology |volume=5 |issue=5 |pages=668–674 |doi=10.1038/s41564-020-0709-x |pmc=7186216 |pmid=32341570}}</ref>}}
** [[Virusoid]]s
** [[Viroid]]s
}}
'''Pengidup''' tau dikumbai mega utai idup, organisma, ianya utai benyawa ke idup ba [[dunya raya]] tu enggau biuh ti mebidaka utai idup enggau utai enda idup baka bejalaika proses fisiologi dll. ari ke nadai, sekalika ketegal fungsi baka nya udah badu (tau dikumbai udah parai), tauka ketegal sida enda kala ngembuan fungsi baka nya lalu dikelas nyadi enda benyawa. Bemayuh macham utai hidup ke bisi, baka utai tumbuh, [[jelu]], [[kulat]], [[protista]], enggau [[monera]]. Penteba tu kadang-kadang ulih nyadi saru enggau engka enda ulih nentuka [[virus]], viroid, tauka pengidup sintetik ke bepotensi nyadi "idup". [[Biologi]] nya [[sains]] ke bekait enggau pansik pengidup.
== Nota ==
<references group="lower-alpha"/>
== Kereban sanding ==
<references />
rnvxfxm8vum5le1o2udzxruow40144s
Modul:In lang
828
3284
19251
11612
2026-06-09T13:22:38Z
Song GK
9
19251
Scribunto
text/plain
require('strict');
--[[--------------------------< _ I N _ L A N G >--------------------------------------------------------------
implements {{in lang}}
Module entry point from another module
|link=yes - creates wikilinked language names
|template=<template name> - customizes error messages created by Module:lang
|list-cats=yes - documentation tool returns language-category names of cats populated by this template
<span class="languageicon">(in <language>)</span>
]]
local function _in_lang (args)
local yesno = require('Module:Yesno')
local synonym_table = mw.loadData ('Module:Lang/ISO 639 synonyms'); -- ISO 639-2/639-2T code translation to 639-1 code
local list_cats = 'yes' == args['list-cats']; -- make a boolean
local list = {};
local cats = {};
local maint_msgs = {};
if not args[1] then
local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template)
return table.concat ({'<span style=\"color:#d33\">error: ', template, 'missing language tag</span>'});
end
local module = 'Module:Lang' .. (mw.getCurrentFrame():getTitle():match ('/sandbox') or ''); -- if this module is the sandbox,
local name_from_tag = require (module)._name_from_tag; -- use Module:Lang/sandbox; Module:Lang else
local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization
local this_wiki_lang = mw.language.getContentLanguage().code; -- get this wiki's language code
local override_t = mw.loadData ('Module:Lang/data').override; -- this table holds IETF tag/name definitions known to Module:Lang
for i, lang in ipairs (args) do
local code = args[i]:lower();
local t = {code, ['link'] = args['link'], ['template'] = args['template']}; -- build an 'args' table
lang = name_from_tag (t) -- get the language name
table.insert (list, lang) -- add this language or error message to the list
if code:find ('%-') and not override_t[code] then -- except for the IETF tags listed in <override_t>
code = code:match ('^%a%a%a?%f[^%a]'); -- strip off region, script, and variant subtags so that they aren't used to make category names
end
if synonym_table[code] then -- if 639-2/639-2T code has a 639-1 synonym
if (0 == namespace) and not list_cats then -- when listing cats don't include this cat; TODO: right choice?
table.insert (cats, table.concat ({'[[Category:Lang and lang-xx code promoted to ISO 639-1|', code ..']]'}));
end
table.insert (maint_msgs, ' <span class="lang-comment" style="font-style:normal; display:none; color:#33aa33; margin-left:0.3em">')
table.insert (maint_msgs, table.concat ({'code: ', code, ' promoted to code: ', synonym_table[code]}));
table.insert (maint_msgs, '</span>;');
code = synonym_table[code]; -- use the synonym
end
if (0 == namespace) or list_cats then -- when in article space
if lang:find ('[Ee]rror') then -- add error category (message provided by Module:Lang)
if not list_cats then -- don't include this cat when listing cats; TODO: right choice?
table.insert (cats, '[[Category:in lang template errors]]');
end
elseif this_wiki_lang ~= code:match ('^%a%a%a?') then -- categorize article only when code is not this wiki's language code or variants thereof
if lang:match ('%[%[.-|.-%]%]') then -- wikilinked individual language name
lang = lang:match ('%[%[.-|(.-)%]%]');
elseif lang:match ('%[%[.-%]%]') then -- wikilinked collective languages name
lang = lang:match ('%[%[(.-)%]%]');
end -- neither of these then plain-text language name
if lang:find ('languages') then -- add appropriate language-name category
table.insert (cats, table.concat ({'[[Category:Artikel enggau sumber dalam jaku ', lang, ' (', code, ')]]'}));
else
table.insert (cats, table.concat ({'[[Category:Artikel enggau sumber jaku ', lang, ' (', code, ')]]'}));
end
end
end
end
if list_cats then
local cats = table.concat (cats, ', '):gsub ('[%[%]]', ''); -- make a string of categories and then strip wikilink markup
return cats
end
local capBoolean = yesno(args['cap']) or yesno(args['caps'])
local result = {'<span class="languageicon">('}; -- opening span and (
table.insert (result, capBoolean and 'Dalam jaku ' or 'dalam jaku '); -- add capitalized or uncapitalized 'in'
table.insert (result, mw.text.listToText (list, ', ', (2 < #list) and ', and ' or ' and ' )); -- and concatenate the language list
table.insert (result, ')</span>'); -- add closing ) and closing span
table.insert (result, table.concat (maint_msgs) or ''); -- add maint messages, if any
table.insert (result, table.concat (cats)); -- add categories
return table.concat (result); -- make a big string and done
end
--[[--------------------------< I N _ L A N G >----------------------------------------------------------------
implements {{in lang}}
Module entry point from an {{#invoke:lang/utilities/sanbox|in_lang|<code>|<code2>|<code3>|<code...>|link=yes|template=in lang|list-cats=yes}}
]]
local function in_lang (frame)
local args = require ('Module:Arguments').getArgs (frame);
return _in_lang (args);
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
in_lang = in_lang, -- module entry from {{#invoke:}}
_in_lang = _in_lang, -- module entry from another module
}
fy2c5vlf35n0pgv9hn6yop2255groq1
19256
19251
2026-06-09T13:31:48Z
Song GK
9
19256
Scribunto
text/plain
require('strict');
--[[--------------------------< _ I N _ L A N G >--------------------------------------------------------------
implements {{in lang}}
Module entry point from another module
|link=yes - creates wikilinked language names
|template=<template name> - customizes error messages created by Module:lang
|list-cats=yes - documentation tool returns language-category names of cats populated by this template
<span class="languageicon">(in <language>)</span>
]]
local function _in_lang (args)
local yesno = require('Module:Yesno')
local synonym_table = mw.loadData ('Module:Lang/ISO 639 synonyms'); -- ISO 639-2/639-2T code translation to 639-1 code
local list_cats = 'yes' == args['list-cats']; -- make a boolean
local list = {};
local cats = {};
local maint_msgs = {};
if not args[1] then
local template = (args['template'] and table.concat ({'{{', args['template'], '}}: '})) or ''; -- make template name (if provided by the template)
return table.concat ({'<span style=\"color:#d33\">error: ', template, 'missing language tag</span>'});
end
local module = 'Module:Lang' .. (mw.getCurrentFrame():getTitle():match ('/sandbox') or ''); -- if this module is the sandbox,
local name_from_tag = require (module)._name_from_tag; -- use Module:Lang/sandbox; Module:Lang else
local namespace = mw.title.getCurrentTitle().namespace; -- used for categorization
local this_wiki_lang = mw.language.getContentLanguage().code; -- get this wiki's language code
local override_t = mw.loadData ('Module:Lang/data').override; -- this table holds IETF tag/name definitions known to Module:Lang
for i, lang in ipairs (args) do
local code = args[i]:lower();
local t = {code, ['link'] = args['link'], ['template'] = args['template']}; -- build an 'args' table
lang = name_from_tag (t) -- get the language name
table.insert (list, lang) -- add this language or error message to the list
if code:find ('%-') and not override_t[code] then -- except for the IETF tags listed in <override_t>
code = code:match ('^%a%a%a?%f[^%a]'); -- strip off region, script, and variant subtags so that they aren't used to make category names
end
if synonym_table[code] then -- if 639-2/639-2T code has a 639-1 synonym
if (0 == namespace) and not list_cats then -- when listing cats don't include this cat; TODO: right choice?
table.insert (cats, table.concat ({'[[Kategori:Lang and lang-xx code promoted to ISO 639-1|', code ..']]'}));
end
table.insert (maint_msgs, ' <span class="lang-comment" style="font-style:normal; display:none; color:#33aa33; margin-left:0.3em">')
table.insert (maint_msgs, table.concat ({'code: ', code, ' promoted to code: ', synonym_table[code]}));
table.insert (maint_msgs, '</span>;');
code = synonym_table[code]; -- use the synonym
end
if (0 == namespace) or list_cats then -- when in article space
if lang:find ('[Ee]rror') then -- add error category (message provided by Module:Lang)
if not list_cats then -- don't include this cat when listing cats; TODO: right choice?
table.insert (cats, '[[Kategori:in lang template errors]]');
end
elseif this_wiki_lang ~= code:match ('^%a%a%a?') then -- categorize article only when code is not this wiki's language code or variants thereof
if lang:match ('%[%[.-|.-%]%]') then -- wikilinked individual language name
lang = lang:match ('%[%[.-|(.-)%]%]');
elseif lang:match ('%[%[.-%]%]') then -- wikilinked collective languages name
lang = lang:match ('%[%[(.-)%]%]');
end -- neither of these then plain-text language name
if lang:find ('languages') then -- add appropriate language-name category
table.insert (cats, table.concat ({'[[Kategori:Artikel enggau sumber dalam jaku ', lang, ' (', code, ')]]'}));
else
table.insert (cats, table.concat ({'[[Kategori:Artikel enggau sumber jaku ', lang, ' (', code, ')]]'}));
end
end
end
end
if list_cats then
local cats = table.concat (cats, ', '):gsub ('[%[%]]', ''); -- make a string of categories and then strip wikilink markup
return cats
end
local capBoolean = yesno(args['cap']) or yesno(args['caps'])
local result = {'<span class="languageicon">('}; -- opening span and (
table.insert (result, capBoolean and 'Dalam jaku ' or 'dalam jaku '); -- add capitalized or uncapitalized 'in'
table.insert (result, mw.text.listToText (list, ', ', (2 < #list) and ', and ' or ' and ' )); -- and concatenate the language list
table.insert (result, ')</span>'); -- add closing ) and closing span
table.insert (result, table.concat (maint_msgs) or ''); -- add maint messages, if any
table.insert (result, table.concat (cats)); -- add categories
return table.concat (result); -- make a big string and done
end
--[[--------------------------< I N _ L A N G >----------------------------------------------------------------
implements {{in lang}}
Module entry point from an {{#invoke:lang/utilities/sanbox|in_lang|<code>|<code2>|<code3>|<code...>|link=yes|template=in lang|list-cats=yes}}
]]
local function in_lang (frame)
local args = require ('Module:Arguments').getArgs (frame);
return _in_lang (args);
end
--[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
]]
return {
in_lang = in_lang, -- module entry from {{#invoke:}}
_in_lang = _in_lang, -- module entry from another module
}
m1oc8pxoxv248rt4mnb8otsevknqe89
Yukgaejang
0
4841
19250
15219
2026-06-09T13:20:34Z
Song GK
9
19250
wikitext
text/x-wiki
{{Infobox food|name=''Yukgaejang''|image=Korean soup-Yukgaejang-01.jpg|caption=|alternate_name=Spicy beef soup|country=[[Korea]]|region=|national_cuisine=|creator=<!-- or | creators = -->|year=|mintime=|maxtime=|type=[[Guk]]|course=|served=Hot|main_ingredient=[[Beef]]|minor_ingredient=|variations=|serving_size=100 g|calories=|protein=|fat=|carbohydrate=|glycemic_index=|similar_dish=|other=}}
'''''Yukgaejang''''' <ref name="standardized2">{{in lang|ko}} {{Cite web|url=http://www.korean.go.kr/common/download.do?file_path=notice&c_file_name=140730_%ED%95%9C%EC%8B%9D%EB%AA%85_%EB%A1%9C%EB%A7%88%EC%9E%90_%ED%91%9C%EA%B8%B0_%EB%B0%8F_%ED%91%9C%EC%A4%80_%EB%B2%88%EC%97%AD_%ED%99%95%EC%A0%95%EC%95%88_.pdf&o_file_name=140730_%ED%95%9C%EC%8B%9D%EB%AA%85_%EB%A1%9C%EB%A7%88%EC%9E%90_%ED%91%9C%EA%B8%B0_%EB%B0%8F_%ED%91%9C%EC%A4%80_%EB%B2%88%EC%97%AD_%ED%99%95%EC%A0%95%EC%95%88_.pdf|script-title=ko:주요 한식명(200개) 로마자 표기 및 번역(영, 중, 일) 표준안|date=2014-07-30|publisher=[[National Institute of Korean Language]]|trans-title=Standardized Romanizations and Translations (English, Chinese, and Japanese) of (200) Major Korean Dishes|format=PDF|access-date=2017-02-16}}</ref> ({{Korean|hangul=육개장}}) tauka '''sup dagin chapi pedas'''<ref name="standardized2" /> nya pemakai Korea ti pedas sereta baka sup ti digaga ari dagin chapi ti dikeretas enggau daun bawang sereta utai bukai, ti ditumis begulai ungkup awak ke lama. Iya nya mayuh macham ''gomguk'', tauka sup ti tebal, ti kala diberi ba pemakai istana diraja Korea. Pemakai tu dikumbai ulih mai pemanah dalam pengerai sereta dikerinduka ketegal gaya iya ti angat sereta pedas.<ref name="whatsonkorea2">{{cite web|url=http://english.whatsonkorea.com/main.ph?code=N&scode=N-16&pst=L|title=Perfect Food for Hot and Humid Weather,Yukgyejang (Spicy Beef Soup)|publisher=What's On Communications Inc.|date=2008-07-06|access-date=2008-05-16|archive-date=2021-11-24|archive-url=https://web.archive.org/web/20211124184842/http://english.whatsonkorea.com/main.ph?code=N&scode=N-16&pst=L|url-status=dead}}</ref>
Pia mega, yukgaejang diempa tebal agi orang ke lelak ketegal angat tengah musin angat dikena ngintu diri.<ref>{{Cite web|script-title=ko:육개장, 닭개장|url=https://terms.naver.com/entry.naver?cid=48163&docId=1820009&categoryId=48200|access-date=4 April 2021|website=terms.naver.com|language=ko}}</ref>
Kelimpah ari dagin chapi ti udah dikeretas, daun bawang, enggau ai, lauk tu mega nyengkaum pucuk kacang, ''gosari'' (paku bracken), ''torandae'' (batang keribang), bawang ti diiris, ''dangmyeon'' (mi keribang), serebuk chabi, bawang burak, lenga, kichap, minyak (minyak lenga enggau/tauka minyak sayur), lada burak, enggau [[garam]]. Minyak chabi mega tau dikena.<ref name="whatsonkorea2" /> ''Yukgaejang'' suah agi dipantaika enggau mangkuk asi enggau kimchi.
== Sejarah ==
Asal nama jaku ''yukgaejang'' iya nya ''gaejang'' ({{Korean|hangul=개장}}), stew dagin ukui ("개") ti direbus enggau sos pedas sereta mayuh macham herba dikena ngelamun bau ti kuat ari dagin ti wangi nya.<ref>{{cite web|title=[홍익희의 음식이야기] 육개장의 유래|author=홍익희|newspaper=[[Kukmin Ilbo]]|url=https://www.kmib.co.kr/article/view.asp?arcid=0923932717|language=ko|date=April 13, 2018}}</ref> ''Yukgaejang'' digaga nyadi varian penganti ''gaejang'' bepelasarka dagin chapi ungkup sida ke enda rindu makai ukui, enggau ''yuk'' (肉, ''dagin'' ) nyadi metonim dagin chapi.<ref name="chosun2">{{cite web|url=https://biz.chosun.com/site/data/html_dir/2015/03/19/2015031902390.html|title=[맛있는 음식의 역사] 육개장|author=김정미|date=March 22, 2013|newspaper=[[Chosun Ilbo]]|language=ko}}</ref>
Rikut kulinari keterubah ''yukgaejang'' bisi ayan ba ''Kyugonyoram'' ({{Korean|hangul=규곤요람|hanja=閨壼要覽|labels=no}}), bup nyumai [[Hangul]] ti ditulis ba pun taun 1800-an.<ref>{{cite web|title=규곤요람 (閨壼要覽)|website=[[Encyclopedia of Korean Culture]]|access-date=June 28, 2025|author=이효지|url=https://encykorea.aks.ac.kr/Article/E0007250|language=ko}}</ref> Maya jeman kolonial Jipun, siti varian Daegu ari lauk ti dikelala enggau nama ''Daegutang'' ({{Korean|hangul=대구탕|hanja=大邱湯|labels=no}}) nyadi tebilang. Seraya dagin chapi nyadi mudah agi diulih, lauk nya dibai ngagai Seoul ketegal pengawa ngaga Gyeongbu Line, lalu pengujung iya nyadi ngerembai di serata Korea.<ref name="chosun2" />
== Varian ==
[[Fail:Dakgaejang.jpg|thumb|''Dakgaejang'' (sup manuk pedas)]]
Lauk tu tau mega digaga ngena [[Manuk|dagin manuk]] kena nganti dagin chapi, lalu dalam kes tu iya dikumbai ''dak-yukgaejang'' tauka ''dakgaejang''.
== Kereban sanding ==
{{Reflist}}
qhz52dz88kofju83a48pvtlgcdl1tsj
Penyarut Gaza–Israel
0
5222
19269
16072
2026-06-10T07:20:34Z
Song GK
9
19269
wikitext
text/x-wiki
{{Infobox military conflict|conflict=Penyarut Gaza–Israel|place=[[Semenanjung Gaza]] enggau [[Israel]]|campaignbox=|result=Benung nyadi|territory=* Egypt captures the Gaza Strip in [[1948 Arab–Israeli war|1948]]
* [[Palestinian fedayeen]] fighters from [[Palestinian Fedayeen insurgency|1948–1956 conduct cross-border raids]] into Israel
* Israel occupies the Gaza Strip during the [[Suez Crisis]] in 1956 but subsequently withdraws following intense US pressure
* Israel reoccupies the Gaza Strip in 1967 during the [[Six-Day war]]
* The [[Second Intifada]] lasts from 2000–2005
** [[Israeli disengagement from the Gaza Strip|Israel disengages from the Gaza Strip]] in 2005
* Israel implements the ongoing [[Blockade of the Gaza Strip|Gaza blockade]] after [[Battle of Gaza (2007)|Hamas seizes control]] in 2007
* Many wars occur in the Gaza Strip since 2007 with the most recent [[Gaza war|war]] ongoing since 2023|image=Gaza Strip map2.svg|caption=Map of the Gaza Strip|map_size=300|combatant1={{tree list}}
* {{flagicon image|Flag of Hejaz (1917).svg}} [[All-Palestine Protectorate]]{{efn|(1948–1959)}}
** [[Palestinian fedayeen]]
<hr />
* {{flagicon|Palestin}} [[Palestinian Authority]]{{efn|(1994–2007)}}<hr />{{flagicon|Palestin}}{{flagicon image|}} [[Gaza Strip under Hamas|Hamas-ruled Gaza Strip]]{{efn|(2007–present)}}<hr />
[[Islamist anti-Hamas groups in the Gaza Strip|Gazan Salafi-jihadist groups]]{{efn|(2009–present)}}
{{tree list/end}}|combatant2={{flag|Israel}}<br/>{{#invoke:collapsible list|main|title=[[Societal breakdown in the Gaza Strip during the Gaza war#Israeli-backed_groups|Israeli-backed groups]]:|{{tree list}}
* {{flag|Popular Forces}}{{#tag:ref|From May 2024.<ref>{{#invoke:Cite|web|url=https://www.timesofisrael.com/liveblog_entry/leader-of-militia-in-gaza-fighting-hamas-admits-cooperating-with-idf/|title=Leader of militia in Gaza fighting Hamas admits cooperating with IDF|date=6 July 2025|website=The Times of Israel|archive-url=https://web.archive.org/web/20250706181426/https://www.timesofisrael.com/liveblog_entry/leader-of-militia-in-gaza-fighting-hamas-admits-cooperating-with-idf/|archive-date=6 July 2025|url-status=live}}</ref><ref name="Shabab">{{#invoke:cite|web|url=https://www.timesofisrael.com/israel-providing-guns-to-gaza-jihadist-gang-to-bolster-opposition-to-hamas/|title=Israel providing guns to Gaza gang to bolster opposition to Hamas|first1=Emanuel|last1=Fabian|first2=Nurit|last2=Yohanan|first3=Nava|last3=Freiberg|date=5 June 2025|website=The Times of Israel|access-date=5 June 2025|archive-url=https://web.archive.org/web/20250605180757/https://www.timesofisrael.com/israel-providing-guns-to-gaza-jihadist-gang-to-bolster-opposition-to-hamas/|archive-date=5 June 2025|url-status=live}}</ref><ref>{{#invoke:Cite|news|last=Rasgon |first=Adam |date=2025-06-06 |title=Who Is Yasser Abu Shabab, the Leader of the Israeli-Backed Militia in Gaza? |url=https://www.nytimes.com/2025/06/06/world/middleeast/israel-gaza-palestinian-militia-hamas-abu-shabab.html |access-date=2025-06-07 |work=The New York Times |language=en-US |issn=0362-4331}}</ref> Popular Forces have been described as a Salafi Jihadist organization with alleged ties to the [[Islamic State]]. Several senior leaders in the Popular Forces also allied with the Islamic State in the Sinai.<ref>{{#invoke:cite|web|last1=Uddin |first1=Rayhan |date=12 June 2025 |title='Popular Forces': Who are the Gaza gangsters being armed by Israel? |url=https://www.middleeasteye.net/explainers/popular-forces-who-are-gangsters-being-armed-israel |access-date=22 June 2025 |website=Middle East Eye}}</ref>|group=lower-alpha}}
** [[Popular Army – Northern Forces]]
* {{flag icon|Fatah}} [[Fatah]]-affiliated groups
** [[Counter-Terrorism Strike Force]]<ref>{{Cite web |last=Matamis |first=Joaquin |date=2025-10-27 |title=Gaza's Armed Fragmentation: Clans, Militias, and Rival Power Centers • Stimson Center |url=https://www.stimson.org/2025/gazas-armed-fragmentation-clans-militias-and-rival-power-centers/ |access-date=2025-11-26 |website=Stimson Center |language=en-US}}</ref>
** [[Shuja'iyya Popular Defense Forces]]
** [[Societal breakdown in the Gaza Strip during the Gaza war#Khanidak clan|Khanidak clan]] (disputed)<ref>{{#invoke:Cite|news|last=Halabi |first=Einav |date=2025-07-03 |title=Israel arms Fatah-linked militias, combatting Hamas in Gaza |url=https://www.ynetnews.com/article/hj00b11cxrex |access-date=2025-07-09 |work=Ynet |language=en}}</ref><ref>{{#invoke:Cite|web|date=3 July 2025 |title=Palestinian man denies leading new Gaza gang following Israeli report |url=https://www.middleeasteye.net/news/israel-backs-two-new-armed-gangs-gaza |access-date=2025-10-16 |website=Middle East Eye |language=en}}</ref>
** [[Societal breakdown in the Gaza Strip during the Gaza war#Al-Mujaida clan|Al-Mujaida clan]] (disputed)<ref>{{#invoke:Cite|web |date=2025-10-04 |title=Bodies of Hamas terrorists dragged through the streets as terror group targets Gazan clan |url=https://www.jpost.com/israel-news/article-869352 |access-date=2025-10-04 |website=The Jerusalem Post |language=en}}</ref><ref>{{#invoke:Cite|news |date=2025-10-15 |title=Hamas reasserts control on streets of Gaza, turning guns on its rivals |url=https://www.washingtonpost.com/world/2025/10/15/gaza-hamas-control-clans-ceasefire/ |access-date=2025-10-16 |newspaper=The Washington Post |language=en-US |issn=0190-8286}}</ref>
{{tree list/end}}
}}|casualties1=56,000–80,000+ parai|casualties2=1,944+ parai}}
'''Penyarut Gaza–Israel''' nyadi sebagi ari penyarut Israel-Palestin ke nyadi ba endur nya berengkah ari taun 1948, lebuh urung 200,000 ari lebih 700,000 [[Nakba|iku rayat Palestin ke rari tauka dibuai ari]] rumah sida ngentapka diri ba Semenanjung Gaza nyadi orang tasah.<ref>{{Cite book |last=Morris |first=Benny |title=Righteous Victims: A History of the Zionist-Arab Conflict, 1881–1999 |date=1999 |publisher=Knopf |isbn=978-0-679-74475-7 |language=en}}</ref> Kenyau ari nya, raban militan [[Israel]] enggau Palestin udah belaban dalam 15<ref>{{cite news|title=French historian: Israel destroyed 4,000-year-old culture in Gaza|url=https://www.aljazeera.com/program/the-bottom-line/2024/1/11/french-historian-israel-destroyed-4000-year-old-culture-in-gaza|website=[[Al Jazeera Media Network|Al-Jazeera]]|date=11 January 2024|access-date=20 January 2024|archive-date=2 May 2024|archive-url=https://web.archive.org/web/20240502182056/https://www.aljazeera.com/program/the-bottom-line/2024/1/11/french-historian-israel-destroyed-4000-year-old-culture-in-gaza|url-status=live}}</ref> perang ba Semenanjung Gaza. Penyampau orang Palestin ke parai dalam perang Gaza (benung nyadi kenyau ari taun 2023) (70,000+) tinggi agi ari penyampau pemati ke dipegulai dalam semua perang bukai dalam penyarut Israel–Palestin.<ref>{{cite news|title=Gaza Deaths Surpass Any Arab Loss in Wars With Israel in Past 40 Years|work=The New York Times|date=21 December 2023|url=https://www.nytimes.com/2023/12/21/world/middleeast/gaza-death-toll-palestinians.html|last1=Stack|first1=Liam|access-date=20 January 2024|archive-date=23 January 2024|archive-url=https://web.archive.org/web/20240123191810/https://www.nytimes.com/2023/12/21/world/middleeast/gaza-death-toll-palestinians.html|url-status=live}}</ref><ref name=":0">{{#invoke:Cite|web|date=13 December 2025 |title=386 Killed Since Ceasefire in Gaza|url=https://www.jordannews.jo/Section-20/Middle-East/386-Killed-Since-Ceasefire-in-Gaza-47336|access-date=14 December 2025 |website=Jordan News}}</ref>
Israel belaban dalam tiga perang ba Semenanjung Gaza ti maya dipegai Ejipr: Perang Palestin 1948, keterubah iya nguasa Gaza maya Penyarut Suez, enggau pengawa ngambi menua Gaza dalam taun 1967. Maya pengawa nguasa keterubah, 1% ari penyampau tubuh Semenanjung Gaza sekalika dibunuh, diperinsa tauka dijil Israel.{{Sfn|Filiu|2014}} Berindik ari dua timpuh penyarut tikas baruh, penyarut besai entara Israel enggau Palestin nyadi dalam Intifada Keterubah. Sempekat Oslo 1993 mai timpuh ti belelak. Tang, dalam taun 2000 Intifada Kedua nyadi. Nengah pengujung Intifada Kedua, Israel ngelengka diri ari Gaza dalam taun 2005, [[Hamas]] menang ba pengawa bepilih taun 2006 lalu ngerampas kuasa Gaza dalam taun 2007.<ref>{{Cite news|last1=Perry|first1=Tom|last2=McDowall|first2=Angus|date=7 October 2023|title=Timeline of conflict between Israel and Palestinians in Gaza|work=Reuters|editor-last=Harvey|editor-first=Jan|url=https://www.reuters.com/world/middle-east/conflict-between-israel-palestinians-gaza-2023-10-07/|url-status=live|access-date=7 October 2023|archive-url=https://web.archive.org/web/20231007105909/https://www.reuters.com/world/middle-east/conflict-between-israel-palestinians-gaza-2023-10-07/|archive-date=7 October 2023}}</ref>
Dalam taun 2007, Israel neritka sekat darat, langit enggau tasik ba Semenanjung Gaza,<ref name=":1">{{Cite news|last=Meakem|first=Allison|date=10 October 2023|title=The Geopolitics of Palestine, Explained|work=[[Foreign Policy]]|url=https://foreignpolicy.com/2023/10/10/israel-palestine-conflict-gaza-hamas-war-geography-history/|access-date=16 October 2023|archive-date=23 October 2023|archive-url=https://web.archive.org/web/20231023230350/https://foreignpolicy.com/2023/10/10/israel-palestine-conflict-gaza-hamas-war-geography-history/|url-status=live}}</ref> ngubah kandang menua tu nyadi "rumah jil tebuka".<ref>{{Cite web|url=https://www.pbs.org/wnet/wideangle/uncategorized/gaza-er-map-in-and-out-of-gaza/1226/|title=Gaza E.R. ~ Map: In and Out of Gaza | Wide Angle|website=[[PBS]]|date=14 August 2007|accessdate=30 August 2024}}</ref><ref name=":1" /> Pengawa nyekat nya dikutuk mayuh nyadika sebengkah chara ngukum begulai,<ref>{{Cite news|last=Nebehay|first=Stephanie|date=13 September 2011|title=U.N. experts say Israel's blockade of Gaza illegal|work=Reuters|editor-last=Graff|editor-first=Peter|url=https://www.reuters.com/article/us-un-gaza-rights-idUSTRE78C59R20110913|access-date=15 October 2023|archive-date=15 June 2017|archive-url=https://web.archive.org/web/20170615210724/http://www.reuters.com/article/us-un-gaza-rights-idUSTRE78C59R20110913|url-status=live}}<cite id="CITEREFNebehay2011" class="citation news cs1"><span data-segmentid="1009" class="cx-segment">Graff, Peter (ed.). </span><span data-segmentid="1010" class="cx-segment">[https://www.reuters.com/article/us-un-gaza-rights-idUSTRE78C59R20110913 "U.N. experts say Israel's blockade of Gaza illegal"]. </span><span data-segmentid="1011" class="cx-segment">''Reuters''. </span><span data-segmentid="1012" class="cx-segment">[https://web.archive.org/web/20170615210724/http://www.reuters.com/article/us-un-gaza-rights-idUSTRE78C59R20110913 Archived] from the original on 15 June 2017<span class="reference-accessdate">. </span></span></cite><cite id="CITEREFNebehay2011" class="citation news cs1"><span class="reference-accessdate">Retrieved <span class="nowrap">15 October</span> 2023</span>.</cite> "A panel of five independent U.N. rights experts [said] the blockade had subjected Gazans to collective punishment in 'flagrant contravention of international human rights and humanitarian law.'"</ref> seraya Israel ngetanka nya enggau kebuah beguna dikena nagang serang roket Palestin.<ref>{{Cite news|last=Abdulrahim|first=Raja|date=7 October 2023|title=Gaza Has Suffered Under 16-Year Blockade|language=en-US|work=[[The New York Times]]|url=https://www.nytimes.com/2023/10/07/world/middleeast/gaza-blockade-israel.html|access-date=16 October 2023|issn=0362-4331|archive-date=24 October 2023|archive-url=https://web.archive.org/web/20231024053734/https://www.nytimes.com/2023/10/07/world/middleeast/gaza-blockade-israel.html|url-status=live}}</ref> Hamas ngumbai nya nyadika kangau perang.<ref>{{cite news|title=Israel declares Gaza Strip hostile territory|url=https://www.theguardian.com/world/2007/sep/20/israel1|first=Conal|last=Urquhart|work=[[The Guardian]]|date=21 September 2007|access-date=2 February 2024}}</ref> Serang Israel ngagai Gaza ba taun 2008–2009 ngujungka lebih 1,000 iku orang mati sereta rumah, sekula enggau sepital balat rusak. Operasyen Israel taun 2012 mega munuh lebih 100 iku orang.
Ba taun 2014, Israel nyerang Gaza dalam perang besai ke ngujungka pemati 73 iku peranak Israel (tebal agi soldadu) enggau 2,251 iku peranak Palestin (tebal agi orang periman). Penyarut nya ngujungka pengerusak ti "enda kala nyadi sebedau tu"<ref name=":2">{{Cite news|last=Burke|first=Jason|date=11 August 2014|title=Gaza homes 'uninhabitable' as tens of thousands come back to rubble|url=https://www.theguardian.com/world/2014/aug/11/damage-gaza-homes-israel-hamas-conflict|access-date=12 May 2024|work=The Guardian|archive-date=27 August 2024|archive-url=https://web.archive.org/web/20240827082849/https://www.theguardian.com/world/2014/aug/11/damage-gaza-homes-israel-hamas-conflict|url-status=live}}</ref>, ngerusak 25% rumah di Nengeri Gaza enggau 70% rumah di Beit Hanoun.<ref name=":2" /> Pengudah taun 2014, pekara ke tampak nyadi dalam konflik nya nyengkaum " Pejalai Besai Pulai " (2018–2019) enggau penyarut ba bulan November 2018, Mei 2019 enggau November 2019. Penyarut taun 2021 beujung 256 iku rayat Palestin enggau 15 iku rayat Israel bebadi nyawa.
Kena 7 Oktober 2023, raban militan Palestin nyerang Israel, munuh 1,143 iku orang (tebal agi orang periman) lalu ngepunka perang Gaza. Israel nimbal enggau ngebom Semenanjung Gaza lalu ngepunka serang ti udah munuh lebih 70,000 iku peranak Gaza naka bulan Disember 2025.<ref name=":0" />
== Nota ==
<references group="lower-alpha"/>
== Kereban sanding ==
{{Reflist}}
1fkq9jpqh92nrdmkn58bibagvp7qogg
Gabriel Mawat
0
6606
19280
19104
2026-06-10T10:38:25Z
Song GK
9
Mengubah sasaran lencongan dari [[Gibrael Mawat]] ke [[Mawat]]
19280
wikitext
text/x-wiki
#LENCONG [[Mawat]]
t010dnsk99wsamheqy2ut7s34disgid
Kategori:Artikel enggau sumber jaku Korea (ko)
14
6658
19252
2026-06-09T13:24:02Z
Song GK
9
Mencipta laman baru dengan kandungan '{{Kategori sumber ukai jaku Iban}}'
19252
wikitext
text/x-wiki
{{Kategori sumber ukai jaku Iban}}
6076wlzprhayhewk04jp9gd7ca0q8qv
Templat:Kategori sumber ukai jaku Iban
10
6659
19253
2026-06-09T13:24:13Z
Song GK
9
Mencipta laman baru dengan kandungan '<includeonly>{{#invoke:Lang/documentor tool|non_english_language_sources_category}}</includeonly> <noinclude> {{Documentation}} </noinclude>'
19253
wikitext
text/x-wiki
<includeonly>{{#invoke:Lang/documentor tool|non_english_language_sources_category}}</includeonly>
<noinclude>
{{Documentation}}
</noinclude>
tth392pjya3d72u358xiaffc3eucl79
Modul:Lang/documentor tool
828
6660
19254
2026-06-09T13:28:03Z
Song GK
9
Mencipta laman baru dengan kandungan 'require('strict') local p = {} --[[ -------------------------< P R I V A T E _ T A G S >------------------------------------------------------ {{#invoke:Lang/documentor tool|private_tags}} Reads the override{} table in Module:Lang/data and renders a wiki table of private tags and their associated languages ]] local function private_tags (frame) local override_t = mw.loadData ('Module:Lang/data').override -- get the override table local priv...'
19254
Scribunto
text/plain
require('strict')
local p = {}
--[[ -------------------------< P R I V A T E _ T A G S >------------------------------------------------------
{{#invoke:Lang/documentor tool|private_tags}}
Reads the override{} table in Module:Lang/data and renders a wiki table of private tags and their associated languages
]]
local function private_tags (frame)
local override_t = mw.loadData ('Module:Lang/data').override -- get the override table
local private_t = {}
for tag, lang in pairs (override_t) do
if tag:find ('%-x%-') then
table.insert (private_t, table.concat ({'\n|-\n|', lang, '||', tag}))
end
end
table.sort (private_t)
table.insert (private_t, 1, '{| class="wikitable sortable"')
table.insert (private_t, 2, '\n|+ Supported private-use IETF language tags')
table.insert (private_t, 3, '\n! Language !! Private-use tag')
return table.concat (private_t) .. '\n|}'
-- return '<pre>' .. table.concat (private_t) .. '\n|}' .. '</pre>'
--error (mw.dumpObject (private_t))
end
--[[ -------------------------< L A N G - X X _ S E T T I N G S >----------------------------------------------
{{#invoke:Lang/documentor tool|lang_xx_settings|template={{ROOTPAGENAME}}}}
Reads the content of the template and extracts the parameters from {{#invoke:Lang|...}} for display on the template's
documentation page.
]]
local function lang_xx_settings(frame)
local page = mw.title.makeTitle('Template', frame.args['template'] or frame.args[1]) -- get a page object for this page in 'Template:' namespace
if not page then
return '' -- TODO: error message?
end
local content = page:getContent() -- get unparsed content
if not page then
return '' -- TODO: error message?
end
local out = {}
local params
local style
if content:match('{{%s*#invoke:%s*[Ll]ang%s*|[^|]+|[^}]+}}') or content:match('{{%s*#invoke:%s*[Ll]ang/sandbox%s*|[^|]+|[^}]+}}') then -- if this template uses [[Module:Lang]]
params = content:match('{{%s*#invoke:%s*[Ll]ang%s*|[^|]+(|[^}]+)}}') or content:match('{{%s*#invoke:%s*[Ll]ang/sandbox%s*|[^|]+(|[^}]+)}}') -- extract the #invoke:'s parameters
if not params then
return '' -- there should be at least one or the template/module won't work TODO: error message?
end
table.insert(out, '{| class="wikitable" style="text-align: right; float: right;"\n|+settings') -- start a wikitable
for k, v in params:gmatch('%s*|%s*([^%s=]+)%s*=%s*([^%s|]+)') do -- get the parameter names (k) and values (v)
if 'label' == k then -- special case for labels because spaces and pipes
v = params:match('label%s*=%s*(%[%[[^%]]+%]%])') or params:match('label%s*=%s*([^|\n]+)') or 'missing label'
end
table.insert(out, table.concat({k, '\n|', v})) -- make rudimentary wikitable entries
end
style = content:match('lang_xx_([^|]+)')
if not style or ('italic' ~= mw.text.trim (style) and 'inherit' ~= mw.text.trim (style)) then
return '<span style="color:#d33">Error: template #invoke calls unknown function</span>'
end
return table.concat({table.concat(out,'\n|-\n! scope="row" | '), '\n|-\n|colspan="2"|style: ', style, '\n|-\n|}'}) -- add inter-row markup and close the wikitable and done
else
return '' -- does not use [[Module:Lang]] so abandon quietly
end
end
--[[ -------------------------- < U S E S _ M O D U L E > --------------------------
{{#invoke:Lang/documentor tool|uses_module|template={{ROOTPAGENAME}}}}
Reads the content of the template to determine if this {{lang-xx}} template uses Module:Lang.
Returns the index of the substring '{{#invoke|lang|' in the template page content if true; empty string if false.
Used in template documentation {{#if:}} parser functions.
]]
local function uses_module(frame)
local page = mw.title.makeTitle('Template', frame.args['template'] or frame.args[1]) -- get a page object for this page in 'Template:' namespace
if not page then
return '' -- TODO: error message?
end
local content = page:getContent() -- get unparsed content
if not page then
return '' -- TODO: error message?
end
return content:find('{{%s*#invoke:[Ll]ang%s*|') or '' -- return index or empty string
end
--[[ -------------------------- < S H A R E D _ C O D E > --------------------------
- Tables:
-- LANGUAGE_CATEGORIES
-- error_messages
-- strings
- Functions:
-- make_error(message, layout, parent_category, nocat)
-- get_language_link(language_name, language_code)
-- get_see_also_section(page_title, language_name, language_code)
-- get_hidden_category_template(frame)
-- get_top_section(frame)
-- get_bottom_section(frame, language_name, see_also_section, parent_category)
]]
local LANGUAGE_CATEGORIES = {
["LANGUAGES_SOURCES"] = "Artikel enggau sumber jaku %s (%s)",
["LANGUAGES_COLLECTIVE_SOURCES"] = "Articles with %s-collective sources (%s)",
["CS1"] = "Sumber CS1 jaku %s (%s)",
["CS1_SCRIPT"] = "CS1 ngena urup jaku %s (%s)",
["LANGUAGE_TEXT"] = "Artikel ti ngundan teks jaku %s",
["LANGUAGES_COLLECTIVE_TEXT"] = "Articles with text in %s",
["ENGLISH"] = "Articles containing explicitly cited %s-language text",
["IPA"] = "Lambar enggau IPA jaku %s"
}
local error_assistance = " Please see [[Template talk:Lang]] for assistance."
local error_messages = {
["ASSISTANCE"] = "Please see [[Template talk:Lang]] for assistance.",
["INCORRECT_CATEGORY_TITLE"] = "[[:%s]] is not the category being populated by the %s template. The correct category is located at: [[:%s]].",
["NO_CATEGORY_TITLE_FOUND"] = "No language category found for '''%s.'''" .. error_assistance,
["NOT_VALID_CATEGORY_FORMAT"] = "'''%s''' is not a a valid category title." .. error_assistance,
["NOT_VALID_LANGUAGE_CODE"] = "[[%s]] is not a valid ISO 639 or IETF language name." .. error_assistance,
}
local strings = {
["ERROR_CATEGORY"] = "[[Category:Lang and lang-xx template errors]]",
["ERROR_SPAN"] = '<span style="font-size: 100%%; font-style: normal;" class="error">Error: %s </span>',
["PURGE_DIV"] = '<div style="font-size: x-small;">%s</div>',
["SEE_ALSO"] = "\n==See also==",
["SEE_ALSO_ITEM"] = "* [[:%s]]",
}
--[[ -------------------------- < M A K E _ E R R O R > --------------------------
Create an error message.
Does not place page in error category if args.nocat is used.
Does not categorize in parent cateogory if used in category namespace (usually for /testcases).
]]
local function make_error(message, layout, parent_category, nocat)
table.insert(layout, string.format(strings["ERROR_SPAN"], message))
if not nocat then
table.insert(layout, strings["ERROR_CATEGORY"])
end
if mw.title.getCurrentTitle().nsText == "Category" then
table.insert(layout, parent_category)
end
return table.concat(layout)
end
--[[ -------------------------- < G E T _ L A N G U A G E _ L I N K > --------------------------
Generates a language link for the correct style.
Collective languages use the name_from_tag value,
while other languages use a display name of "x-language".
]]
local function get_language_link(language_name, language_code)
local lang_module = require('Module:Lang')
-- Is a language collective?
if language_name:find('languages') then
return lang_module.name_from_tag({language_code, link = "yes"})
else
return lang_module.name_from_tag({language_code, link = "yes", label = lang_module.name_from_tag({language_code}) .. "-language"})
end
end
--[[ -------------------------- < G E T _ P R I M A R Y _ L A N G U A G E _ C O D E > --------------------------
Returns the primary language for sub-langage variants.
]]
local function get_primary_language_code(language_code)
-- If no hyphen exists, return nil (for cases like "el")
if not language_code:find("-") then
return nil
end
-- Match everything before the first hyphen, but only if a hyphen exists
if language_code:match("^-") then
return nil -- If the code starts with a hyphen, return nil
end
-- Look for the first part before any hyphen
local primary_code = language_code:match("^[^-]+")
return primary_code
end
--[[ -------------------------- < G E T _ S E E _ A L S O _ S E C T I O N > --------------------------
Generates a consistent style See also section for
{{Category articles containing non-English-language text}} and {{Non-English-language source category}}.
If {{CS1 language sources}} is converted, it should also use it.
]]
local function get_see_also_section(page_title, language_name, language_code)
local see_also_section = {}
for _, category_name in pairs(LANGUAGE_CATEGORIES) do
local category = mw.title.new(string.format(category_name, language_name, language_code), 14)
if category and page_title ~= category.text and category.exists then
table.insert(see_also_section, string.format(strings["SEE_ALSO_ITEM"], category.prefixedText))
end
end
table.sort(see_also_section)
table.insert(see_also_section, 1, strings["SEE_ALSO"])
if table.getn(see_also_section) == 1 then
return ""
else
return table.concat(see_also_section, "\n")
end
end
--[[ -------------------------- < G E T _ H I D D E N _ C A T E G O R Y _ T E M P L A T E > --------------------------
Generates the Template:Hidden category template.
This function is separate from the get_top_section() function
as this should be used in both error categories and valid categories.
]]
local function get_hidden_category_template(frame)
return frame:expandTemplate{title = 'Hidden category'}
end
--[[ -------------------------- < G E T _ T O P _ S E C T I O N > --------------------------
Generates a consistent top maintenance template section which consists of:
-- Template:Possibly empty category
-- Template:Purge
]]
local function get_top_section(frame)
local top_section = {}
if mw.site.stats.pagesInCategory(mw.title.getCurrentTitle().text, "all") == 0 then
table.insert(top_section, frame:expandTemplate{title = 'Possibly empty category'})
else
table.insert(top_section, frame:expandTemplate{title = 'Possibly empty category', args = {hidden=true}})
end
local purge_module = require('Module:Purge')
table.insert(top_section, string.format(strings["PURGE_DIV"], purge_module._main({"Purge page cache"})))
return table.concat(top_section, "\n\n")
end
--[[ -------------------------- < G E T _ B O T T O M _ S E C T I O N > --------------------------
Generates a consistent non-text section which consists of:
-- Template:Automatic category TOC
-- A see also section
-- {{DEFAULTSORT}}
-- Categorization in parent category
]]
local function get_bottom_section(frame, language_name, see_also_section, parent_category, parent_language_category)
local bottom_section = {}
table.insert(bottom_section, frame:expandTemplate{title = 'Automatic category TOC'})
table.insert(bottom_section, see_also_section)
if mw.title.getCurrentTitle().nsText == "Category" then
table.insert(bottom_section, frame:preprocess{text = "{{DEFAULTSORT:" .. language_name .. "}}"})
if parent_language_category then
table.insert(bottom_section, "[[" .. parent_language_category .. "]]")
end
table.insert(bottom_section, parent_category)
end
return table.concat(bottom_section, "\n\n\n")
end
--[[ -------------------------- < N O N _ E N G L I S H _ L A N G U A G E _ T E X T _ C A T E G O R Y > --------------------------
{{#invoke:Lang/documentor tool|non_english_language_text_category}}
This function implements {{Non-English-language text category}}.
]]
local non_english_language_text_strings = {
["LINE1"] = "This category contains articles with %s%s text. The primary purpose of these categories is to facilitate manual or automated checking of text in other languages.",
["LINE2"] = "This category should only be added with the %s family of templates, never explicitly.",
["LINE3"] = 'For example %s, which wraps the text with %s. Also available is %s which displays as %s.',
["LINE3_SYNTAXHIGHLIGHT"] = "<span lang=\"%s\">",
["IN_SCRIPT"] = " (in %s)",
["EXAMPLE_DEFAULT_TEXT"] = "text in %s language here",
["PARENT_CATEGORY"] = "[[Category:Artikel ngundan teks ukai jaku Iban]]",
["TEMPLATE"] = "Lang",
["TEMPLATE2"] = "Langx",
}
local function non_english_language_text_category(frame)
local page = mw.title.getCurrentTitle()
local args = require('Module:Arguments').getArgs(frame)
-- args.test is used for /testcases
if args.test then
page = mw.title.new(args.test)
end
-- Naming style: Articles with text from the Berber languages collective
local page_title_modified = page.text
local split_title = "([^,]+)%%s([^,]*)"
local part1 = ""
local part2 = ""
if page_title_modified:find('Articles with text in') then
-- Naming style: Category:Articles with text from Afro-Asiatic languages (as currently implemented in Module:lang)
part1, part2 = LANGUAGE_CATEGORIES["LANGUAGES_COLLECTIVE_TEXT"]:match(split_title)
elseif page_title_modified:find('explicitly cited') then
part1, part2 = LANGUAGE_CATEGORIES["ENGLISH"]:match(split_title)
else
-- Naming style: Category:Articles containing French-language text
part1, part2 = LANGUAGE_CATEGORIES["LANGUAGE_TEXT"]:match(split_title)
end
page_title_modified = page_title_modified:gsub(part1, "")
page_title_modified = page_title_modified:gsub(part2, "")
local language_name = page_title_modified
local layout = {}
table.insert(layout, get_hidden_category_template(frame))
local parent_category = non_english_language_text_strings["PARENT_CATEGORY"]
if language_name == page.text then
-- Error: Category title format not supported.
return make_error(string.format(error_messages["NOT_VALID_CATEGORY_FORMAT"], page.text), layout, parent_category, args.nocat)
end
local lang_module = require('Module:Lang')
local language_code = lang_module._tag_from_name({language_name})
if language_code:find('[Ee]rror') then
-- Error: Language code not found in database.
return make_error(string.format(error_messages["NOT_VALID_LANGUAGE_CODE"], language_name), layout, parent_category, args.nocat)
end
local correct_language_category_title = lang_module._category_from_tag({language_code})
if correct_language_category_title:find('[Ee]rror') then
-- Error: No category title found for language code.
return make_error(string.format(error_messages["NO_CATEGORY_TITLE_FOUND"], language_code), layout, parent_category, args.nocat)
end
local current_category_title = page.prefixedText
if current_category_title ~= correct_language_category_title then
-- Error: The current title used is not in the supported format. TODO: can this still be reached?
return make_error(
string.format(error_messages["INCORRECT_CATEGORY_TITLE"], current_category_title, frame:expandTemplate{title = 'Tlx', args = {non_english_language_text_strings["TEMPLATE"]}}, correct_language_category_title),
layout, parent_category, args.nocat)
end
table.insert(layout, get_top_section(frame))
local script_text = ""
if args.script then
script_text = string.format(non_english_language_text_strings["IN_SCRIPT"], args.script)
end
local language_link = get_language_link(language_name, language_code)
table.insert(layout, string.format(non_english_language_text_strings["LINE1"], language_link, script_text))
local lang_template = frame:expandTemplate{title = 'Tl', args = {non_english_language_text_strings["TEMPLATE"]}}
table.insert(layout, string.format(non_english_language_text_strings["LINE2"], lang_template))
local language_code_link = lang_module._name_from_tag({language_code, link="yes", label=language_code})
local example_default_text = string.format(non_english_language_text_strings["EXAMPLE_DEFAULT_TEXT"], language_name)
local example_text = args.example or example_default_text
local lang_template_example = frame:expandTemplate{title = "Tlx", args = {non_english_language_text_strings["TEMPLATE"], language_code_link, example_text}}
local langx_args = {non_english_language_text_strings["TEMPLATE2"], language_code_link, example_text}
local langx_template_example = frame:expandTemplate{title = "Tlx", args = {non_english_language_text_strings["TEMPLATE2"], language_code, example_text}}
local langx_template_code = frame:expandTemplate{title = non_english_language_text_strings["TEMPLATE2"], args = {language_code, example_text}}
-- Strip private use subtag from code tag because this is what [[Module:Lang]] does.
local language_code_without_private_use = language_code:gsub("%-x%-.*", "")
-- Wrap in syntaxhighlight.
local syntaxhighlight = frame:extensionTag(
"syntaxhighlight",
string.format(non_english_language_text_strings["LINE3_SYNTAXHIGHLIGHT"], language_code_without_private_use),
{lang = "html", inline = true}
)
table.insert(layout, string.format(non_english_language_text_strings["LINE3"], lang_template_example, syntaxhighlight, langx_template_example, langx_template_code))
local see_also_section = get_see_also_section(page.text, language_name, language_code)
local parent_language_code = get_primary_language_code(language_code)
local parent_language_category
if parent_language_code then
parent_language_category = lang_module._category_from_tag({parent_language_code})
end
local bottom = get_bottom_section(frame, language_name, see_also_section, non_english_language_text_strings["PARENT_CATEGORY"], parent_language_category)
return table.concat(layout, "\n\n") .. bottom
end
--[[ -------------------------- < N O N _ E N G L I S H _ L A N G U A G E _ S O U R C E S _ C A T E G O R Y > --------------------------
{{#invoke:Lang/documentor tool|non_english_language_sources_category}}
This function implements {{Non-English-language sources category}}.
]]
local non_english_language_sources_strings = {
["LINE1"] = "This is a tracking category for articles that use %s to identify %s sources.",
["PARENT_CATEGORY"] = "[[Category:Articles with non-English-language sources]]",
["TEMPLATE"] = "In lang",
}
local function non_english_language_sources_category(frame)
local page = mw.title.getCurrentTitle()
local args = require('Module:Arguments').getArgs(frame)
-- args.test is used for /testcases
if args.test then
page = mw.title.new(args.test)
end
local page_title = page.text
local language_code = page_title:match('%(([%a%-]+)%)')
local language_name = require('Module:Lang')._name_from_tag({language_code})
local layout = {}
table.insert(layout, get_hidden_category_template(frame))
local parent_category = non_english_language_sources_strings["PARENT_CATEGORY"]
local in_lang_module = require('Module:In lang')
local correct_language_category_title = in_lang_module._in_lang({language_code, ["list-cats"]="yes"})
if correct_language_category_title == "" then
-- Error: No category title found for language code.
return make_error(string.format(error_messages["NO_CATEGORY_TITLE_FOUND"], language_code), layout, parent_category, args.nocat)
end
local current_category_title = page.prefixedText
if correct_language_category_title ~= current_category_title then
-- Error: The current title used is not in the supported format.
return make_error(
string.format(error_messages["INCORRECT_CATEGORY_TITLE"], current_category_title, frame:expandTemplate{title = 'Tlx', args = {non_english_language_sources_strings["TEMPLATE"]}}, correct_language_category_title),
layout, parent_category, args.nocat)
end
local language_link = get_language_link(language_name, language_code)
local text = string.format(non_english_language_sources_strings["LINE1"], frame:expandTemplate{title = 'Tlx', args = {non_english_language_sources_strings["TEMPLATE"], language_code}}, language_link)
table.insert(layout, get_top_section(frame))
table.insert(layout, text)
local see_also_section = get_see_also_section(page_title, language_name, language_code)
local parent_language_code = get_primary_language_code(language_code)
local parent_language_category
if parent_language_code then
parent_language_category = in_lang_module._in_lang({parent_language_code, ["list-cats"]="yes"})
end
local bottom = get_bottom_section(frame, language_name, see_also_section, parent_category, parent_language_category)
return table.concat(layout, "\n\n") .. bottom
end
--[[ -------------------------- < N O N _ E N G L I S H _ L A N G U A G E _ C S 1 _ S O U R C E S _ C A T E G O R Y > --------------------------
{{#invoke:Lang/documentor tool|non_english_language_cs1_sources_category}}
This function implements {{Non-English-language CS1 sources category}}.
]]
local non_english_language_cs1_text_strings = {
["LINE1"] = "This is a tracking category for [[WP:CS1|CS1 citations]] that use the parameter %s to identify a source in [[%s language|%s]]. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].",
["PARENT_CATEGORY"] = "[[Category:CS1 foreign language sources]]", -- #TODO change to "Articles with non-english CS1 language sources" or "CS1 non-English language sources"
}
--"This is a tracking category for [[WP:CS1|CS1 citations]] that use the parameter %s to hold a citation title that uses %s characters and contains the language prefix <code>%s:</code>. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].",
--"[[Category:CS1 uses foreign language script]]",
-- "This is a tracking category for [[WP:CS1|CS1 citations]] that use the parameter %s. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].",
-- "to identify a source in [[%s language|%s]].",
-- "to hold a citation title that uses %s characters and contains the language prefix <code>%s:</code>.",
local function non_english_language_cs1_sources_category(frame)
local page_title_object = mw.title.getCurrentTitle()
local page_title = page_title_object.text
local language_code = page_title:match('%(([%a%-]+)%)')
local language_name = require('Module:Lang')._name_from_tag({language_code})
local layout = {}
table.insert(layout, get_hidden_category_template(frame))
local see_also_section = ""
local parameter_doc = frame:expandTemplate{title = 'para', args = {"language", language_code}}
table.insert(layout, get_top_section(frame))
table.insert(layout, string.format(non_english_language_cs1_text_strings["LINE1"], parameter_doc, language_name, language_name))
local see_also_section = get_see_also_section(page_title, language_name, language_code)
local bottom = get_bottom_section(frame, language_name, see_also_section, non_english_language_cs1_text_strings["PARENT_CATEGORY"])
return table.concat(layout, "\n\n") .. bottom
end
--[[ -------------------------- < T E S T _ C A S E S _ S H A R E D _ C O D E > --------------------------
]]
local function compare_by_keys2(a, b) -- local function used by table.sort()
return a[2] < b[2] -- ascending sort by code
end
local function compare_by_keys(a, b) -- local function used by table.sort()
return a[1] < b[1] -- ascending sort by code
end
-- Used by testcases_iso_code_to_name()
local function get_language_code_table_from_code(args)
local entry = {}
--if args.override_table[args.language_code] then
-- table.insert(entry, args.override_table[args.language_code][1]) -- :gsub(' %b()$', '') fails here
--else
table.insert(entry, args.language_code)
-- end
return entry
end
-- Used by testcases_name_from_tag()
local function get_language_code_and_name_table_from_code(args)
local entry = {}
if args.override_table and args.override_table[args.language_code] then
table.insert(entry, args.language_code)
local language_code, _ = args.override_table[args.language_code][1]:gsub(' %b()$', '')
table.insert(entry, language_code)
else
table.insert(entry, args.language_code)
table.insert(entry, args.language_table[args.language_code])
end
return entry
end
-- Used by testcases_category_from_tag()
local function get_language_code_and_category_table_from_code(args)
local entry = {}
table.insert(entry, args.language_code)
table.insert(entry, args.test_function({args.language_code}))
return entry
end
-- Used by testcases_iso_name_to_code() and testcases_tag_from_name()
local function get_language_name_and_code_table_from_code(args)
local entry = {}
if args.override_table[args.language_code] then
table.insert(entry, args.override_table[args.language_code][1]) -- only the first name when there are multiples
table.insert(entry, args.language_code)
else
table.insert(entry, args.language_names[1]) -- only the first name when there are multiples
table.insert(entry, args.language_code)
end
return entry
end
local function get_table(table_function, language_table, length, range, iso_number, test_function)
local table_of_language_name_and_code_tables = {}
local override_table_name = "override"
if iso_number then
override_table_name = "override_" .. iso_number
end
local override_table = require("Module:ISO 639 name/ISO_639_override/sandbox")[override_table_name]
-- For most ISO 639s.
if range then
for language_code, language_names in pairs(language_table) do
if language_code:find(range) then
table.insert(table_of_language_name_and_code_tables, table_function({
override_table = override_table,
language_code = language_code,
language_names = language_names,
test_function = test_function,
language_table = language_table
}))
end
end
-- For ISO 639-1.
elseif length then
for language_code, language_names in pairs(language_table) do
if language_code:len() == 2 then
table.insert(table_of_language_name_and_code_tables, table_function({
override_table = override_table,
language_code = language_code,
language_names = language_names,
test_function = test_function,
language_table = language_table
}))
end
end
-- For general /testcases.
else
for language_code, language_names in pairs(language_table) do
table.insert(table_of_language_name_and_code_tables, table_function({
override_table = override_table,
language_code = language_code,
language_names = language_names,
test_function = test_function,
language_table = language_table
}))
end
end
return table_of_language_name_and_code_tables
end
local function get_undabbed_table(language_list, length, range)
local undabbed_language_table = {} -- for this test, ISO 639-3 language name disambiguators must be removed; un-dabbed names go here
for language_code, language_names in pairs(language_list) do
-- For most ISO 639s.
if range then
if language_code:find(range) then
undabbed_language_table[language_code] = language_names[1]:gsub(' %b()$', '') -- undab and save only the first name; ignore all other names assigned to a code
end
-- For ISO 639-1.
elseif length then
if language_code:len() == 2 then
undabbed_language_table[language_code] = language_names[1]:gsub(' %b()$', '') -- undab and save only the first name; ignore all other names assigned to a code
end
-- For general /testcases.
else
undabbed_language_table[language_code] = language_names[1]:gsub(' %b()$', '')
end
end
return undabbed_language_table
end
--[[ -------------------------- < T E S T C A S E S _ C A T E G O R Y _ F R O M _ T A G > --------------------------
Entry point for the various category_from_tag testcases.
Build a table of test patterns where each entry in the table is a table with two members:
{"<language_code>", "<category name according to Module:Lang>"}
- "Expected" column value is the category name according to Module:Lang.
- "Actual" column value is the result of {{#invoke:Lang/sandbox|category_from_tag|<language_code>}}.
TODO: Currently not working.
]]
local function testcases_category_from_tag(self, args)
local cat_from_tag_function = require('Module:Lang')._category_from_tag
local language_tables = get_table(get_language_code_and_category_table_from_code, args.language_list, args.length, args.range, args.iso_number, cat_from_tag_function)
table.sort(language_tables, compare_by_keys)
self:preprocess_equals_preprocess_many(
'{{#invoke:Lang/sandbox|category_from_tag|', '}}', '', '',
language_tables,
{nowiki=false}
)
end
--[[ -------------------------- < T E S T C A S E S _ N A M E _ F R O M _ T A G > --------------------------
Entry point for the various name_from_tag testcases.
Build a table of test patterns where each entry in the table is a table with two members:
{"<language_code>", "<language_name>"}
- "Expected" column value is the <language_name>.
- "Actual" column value is the result of sandbox version {{#invoke:Lang/sandbox|name_from_tag|<language_code>}}.
]]
local function testcases_name_from_tag(self, args)
local undabbed_language_table = get_undabbed_table(args.language_list, args.length, args.range, nil)
local language_tables = get_table(get_language_code_and_name_table_from_code, undabbed_language_table, args.length, args.range)
table.sort(language_tables, compare_by_keys)
self:preprocess_equals_preprocess_many(
'{{#invoke:Lang/sandbox|name_from_tag|', '}}', '', '',
language_tables,
{nowiki=false}
)
end
--[[ -------------------------- < T E S T C A S E S _ T A G _ F R O M _ N A M E > --------------------------
Entry point for the various tag_from_name testcases.
Build a table of test patterns where each entry in the table is a table with two members:
{"<language_name>", "<language_code>"}
- "Expected" column value is the <language_code>.
- "Actual" column value is the result of sandbox version {{#invoke:Lang/sandbox|tag_from_name|<language_name>}}.
TODO: Currently not working.
]]
local function testcases_tag_from_name(self, args)
local language_tables = get_table(get_language_name_and_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)
table.sort(language_tables, compare_by_keys2)
local ordered_table = {}
table.sort(unordered_table)
for _, key in ipairs(unordered_table) do
table.insert(ordered_table, {key, reverse_table[key]})
end
self:preprocess_equals_preprocess_many(
'{{#invoke:Lang/sandbox|tag_from_name|', '}}', '', '',
language_tables,
{nowiki=false}
)
end
--[[ -------------------------- < T E S T C A S E S _ I S O _ C O D E _ T O _ N A M E > --------------------------
Entry point for the various iso_code_to_name testcases.
Build a table of test patterns where each entry in the table is a table with one member:
{"<language_code>"}
- "Expected" column value is the result of the live version of {{#invoke:ISO 639 name|iso_639_name_to_code|<language_code>}}.
- "Actual" column value is the result of sandbox version {{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|<language_code>}}.
]]
local function testcases_iso_code_to_name(self, args)
local language_tables = get_table(get_language_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)
table.sort(language_tables, compare_by_keys)
self:preprocess_equals_preprocess_many(
'{{#invoke:ISO 639 name/sandbox|iso_639_code_to_name|link=yes|', '}}', '{{#invoke:ISO 639 name|iso_639_code_to_name|link=yes|', '}}',
language_tables,
{nowiki=false}
)
end
--[[ -------------------------- < T E S T C A S E S _ I S O _ N A M E _ T O _ C O D E > --------------------------
Entry point for the various iso_name_to_code testcases.
Build a table of test patterns where each entry in the table is a table with two members:
{"<language_name>", "<language_code>"}
- "Expected" column value is the <language_code>.
- "Actual" column is value the result of {{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|<language_name>}}.
]]
local function testcases_iso_name_to_code(self, args)
local language_tables = get_table(get_language_name_and_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)
table.sort(language_tables, compare_by_keys2)
self:preprocess_equals_preprocess_many(
'{{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|2=' .. args.iso_number .. "|", '}}', '', '',
language_tables,
{nowiki=false}
)
end
--[[--------------------------< S E E _ A L S O >--------------------------------------------------------------
adds items to the list of items in §See also section of Template:Lang-x/doc; Evaluates single positional parameter
which is a comma-separated list of items including list markup.
{{#invoke:Lang/documentor tool|see_also|*{{tl|Lang-tt-Cyrl}}, *{{tl|Lang-tt-Latn}}, *{{tl|Lang-tt-Arab}}}}
]]
local function see_also (frame)
if nil == frame.args[1] or '' == frame.args[1] then -- if empty, ...
return -- ... return nothing
end
return frame:preprocess (frame.args[1]:gsub ('%s*,%s', '\n')) -- preprocess so any templates are rendered before saving and done
end
--[[ -------------------------< E X P O R T E D _ F U N C T I O N S > -----------------------------------------
]]
return {
lang_xx_settings = lang_xx_settings,
uses_module = uses_module,
see_also = see_also,
non_english_language_text_category = non_english_language_text_category,
non_english_language_sources_category = non_english_language_sources_category,
non_english_language_cs1_sources_category = non_english_language_cs1_sources_category,
private_tags = private_tags,
-- Module:Lang testcases
testcases_category_from_tag = testcases_category_from_tag,
testcases_name_from_tag = testcases_name_from_tag,
testcases_tag_from_name = testcases_tag_from_name,
-- Module:ISO 639 name testcases
testcases_iso_code_to_name = testcases_iso_code_to_name,
testcases_iso_name_to_code = testcases_iso_name_to_code,
}
i152m32an5j4f8n8lripgkyzjuyr3bi
19255
19254
2026-06-09T13:30:21Z
Song GK
9
19255
Scribunto
text/plain
require('strict')
local p = {}
--[[ -------------------------< P R I V A T E _ T A G S >------------------------------------------------------
{{#invoke:Lang/documentor tool|private_tags}}
Reads the override{} table in Module:Lang/data and renders a wiki table of private tags and their associated languages
]]
local function private_tags (frame)
local override_t = mw.loadData ('Module:Lang/data').override -- get the override table
local private_t = {}
for tag, lang in pairs (override_t) do
if tag:find ('%-x%-') then
table.insert (private_t, table.concat ({'\n|-\n|', lang, '||', tag}))
end
end
table.sort (private_t)
table.insert (private_t, 1, '{| class="wikitable sortable"')
table.insert (private_t, 2, '\n|+ Supported private-use IETF language tags')
table.insert (private_t, 3, '\n! Language !! Private-use tag')
return table.concat (private_t) .. '\n|}'
-- return '<pre>' .. table.concat (private_t) .. '\n|}' .. '</pre>'
--error (mw.dumpObject (private_t))
end
--[[ -------------------------< L A N G - X X _ S E T T I N G S >----------------------------------------------
{{#invoke:Lang/documentor tool|lang_xx_settings|template={{ROOTPAGENAME}}}}
Reads the content of the template and extracts the parameters from {{#invoke:Lang|...}} for display on the template's
documentation page.
]]
local function lang_xx_settings(frame)
local page = mw.title.makeTitle('Template', frame.args['template'] or frame.args[1]) -- get a page object for this page in 'Template:' namespace
if not page then
return '' -- TODO: error message?
end
local content = page:getContent() -- get unparsed content
if not page then
return '' -- TODO: error message?
end
local out = {}
local params
local style
if content:match('{{%s*#invoke:%s*[Ll]ang%s*|[^|]+|[^}]+}}') or content:match('{{%s*#invoke:%s*[Ll]ang/sandbox%s*|[^|]+|[^}]+}}') then -- if this template uses [[Module:Lang]]
params = content:match('{{%s*#invoke:%s*[Ll]ang%s*|[^|]+(|[^}]+)}}') or content:match('{{%s*#invoke:%s*[Ll]ang/sandbox%s*|[^|]+(|[^}]+)}}') -- extract the #invoke:'s parameters
if not params then
return '' -- there should be at least one or the template/module won't work TODO: error message?
end
table.insert(out, '{| class="wikitable" style="text-align: right; float: right;"\n|+settings') -- start a wikitable
for k, v in params:gmatch('%s*|%s*([^%s=]+)%s*=%s*([^%s|]+)') do -- get the parameter names (k) and values (v)
if 'label' == k then -- special case for labels because spaces and pipes
v = params:match('label%s*=%s*(%[%[[^%]]+%]%])') or params:match('label%s*=%s*([^|\n]+)') or 'missing label'
end
table.insert(out, table.concat({k, '\n|', v})) -- make rudimentary wikitable entries
end
style = content:match('lang_xx_([^|]+)')
if not style or ('italic' ~= mw.text.trim (style) and 'inherit' ~= mw.text.trim (style)) then
return '<span style="color:#d33">Error: template #invoke calls unknown function</span>'
end
return table.concat({table.concat(out,'\n|-\n! scope="row" | '), '\n|-\n|colspan="2"|style: ', style, '\n|-\n|}'}) -- add inter-row markup and close the wikitable and done
else
return '' -- does not use [[Module:Lang]] so abandon quietly
end
end
--[[ -------------------------- < U S E S _ M O D U L E > --------------------------
{{#invoke:Lang/documentor tool|uses_module|template={{ROOTPAGENAME}}}}
Reads the content of the template to determine if this {{lang-xx}} template uses Module:Lang.
Returns the index of the substring '{{#invoke|lang|' in the template page content if true; empty string if false.
Used in template documentation {{#if:}} parser functions.
]]
local function uses_module(frame)
local page = mw.title.makeTitle('Template', frame.args['template'] or frame.args[1]) -- get a page object for this page in 'Template:' namespace
if not page then
return '' -- TODO: error message?
end
local content = page:getContent() -- get unparsed content
if not page then
return '' -- TODO: error message?
end
return content:find('{{%s*#invoke:[Ll]ang%s*|') or '' -- return index or empty string
end
--[[ -------------------------- < S H A R E D _ C O D E > --------------------------
- Tables:
-- LANGUAGE_CATEGORIES
-- error_messages
-- strings
- Functions:
-- make_error(message, layout, parent_category, nocat)
-- get_language_link(language_name, language_code)
-- get_see_also_section(page_title, language_name, language_code)
-- get_hidden_category_template(frame)
-- get_top_section(frame)
-- get_bottom_section(frame, language_name, see_also_section, parent_category)
]]
local LANGUAGE_CATEGORIES = {
["LANGUAGES_SOURCES"] = "Artikel enggau sumber jaku %s (%s)",
["LANGUAGES_COLLECTIVE_SOURCES"] = "Articles with %s-collective sources (%s)",
["CS1"] = "Sumber CS1 jaku %s (%s)",
["CS1_SCRIPT"] = "CS1 ngena urup jaku %s (%s)",
["LANGUAGE_TEXT"] = "Artikel ti ngundan teks jaku %s",
["LANGUAGES_COLLECTIVE_TEXT"] = "Articles with text in %s",
["ENGLISH"] = "Articles containing explicitly cited %s-language text",
["IPA"] = "Lambar enggau IPA jaku %s"
}
local error_assistance = " Please see [[Template talk:Lang]] for assistance."
local error_messages = {
["ASSISTANCE"] = "Please see [[Template talk:Lang]] for assistance.",
["INCORRECT_CATEGORY_TITLE"] = "[[:%s]] is not the category being populated by the %s template. The correct category is located at: [[:%s]].",
["NO_CATEGORY_TITLE_FOUND"] = "No language category found for '''%s.'''" .. error_assistance,
["NOT_VALID_CATEGORY_FORMAT"] = "'''%s''' is not a a valid category title." .. error_assistance,
["NOT_VALID_LANGUAGE_CODE"] = "[[%s]] is not a valid ISO 639 or IETF language name." .. error_assistance,
}
local strings = {
["ERROR_CATEGORY"] = "[[Kategori:Lang and lang-xx template errors]]",
["ERROR_SPAN"] = '<span style="font-size: 100%%; font-style: normal;" class="error">Error: %s </span>',
["PURGE_DIV"] = '<div style="font-size: x-small;">%s</div>',
["SEE_ALSO"] = "\n==See also==",
["SEE_ALSO_ITEM"] = "* [[:%s]]",
}
--[[ -------------------------- < M A K E _ E R R O R > --------------------------
Create an error message.
Does not place page in error category if args.nocat is used.
Does not categorize in parent cateogory if used in category namespace (usually for /testcases).
]]
local function make_error(message, layout, parent_category, nocat)
table.insert(layout, string.format(strings["ERROR_SPAN"], message))
if not nocat then
table.insert(layout, strings["ERROR_CATEGORY"])
end
if mw.title.getCurrentTitle().nsText == "Category" then
table.insert(layout, parent_category)
end
return table.concat(layout)
end
--[[ -------------------------- < G E T _ L A N G U A G E _ L I N K > --------------------------
Generates a language link for the correct style.
Collective languages use the name_from_tag value,
while other languages use a display name of "x-language".
]]
local function get_language_link(language_name, language_code)
local lang_module = require('Module:Lang')
-- Is a language collective?
if language_name:find('languages') then
return lang_module.name_from_tag({language_code, link = "yes"})
else
return lang_module.name_from_tag({language_code, link = "yes", label = lang_module.name_from_tag({language_code}) .. "-language"})
end
end
--[[ -------------------------- < G E T _ P R I M A R Y _ L A N G U A G E _ C O D E > --------------------------
Returns the primary language for sub-langage variants.
]]
local function get_primary_language_code(language_code)
-- If no hyphen exists, return nil (for cases like "el")
if not language_code:find("-") then
return nil
end
-- Match everything before the first hyphen, but only if a hyphen exists
if language_code:match("^-") then
return nil -- If the code starts with a hyphen, return nil
end
-- Look for the first part before any hyphen
local primary_code = language_code:match("^[^-]+")
return primary_code
end
--[[ -------------------------- < G E T _ S E E _ A L S O _ S E C T I O N > --------------------------
Generates a consistent style See also section for
{{Category articles containing non-English-language text}} and {{Non-English-language source category}}.
If {{CS1 language sources}} is converted, it should also use it.
]]
local function get_see_also_section(page_title, language_name, language_code)
local see_also_section = {}
for _, category_name in pairs(LANGUAGE_CATEGORIES) do
local category = mw.title.new(string.format(category_name, language_name, language_code), 14)
if category and page_title ~= category.text and category.exists then
table.insert(see_also_section, string.format(strings["SEE_ALSO_ITEM"], category.prefixedText))
end
end
table.sort(see_also_section)
table.insert(see_also_section, 1, strings["SEE_ALSO"])
if table.getn(see_also_section) == 1 then
return ""
else
return table.concat(see_also_section, "\n")
end
end
--[[ -------------------------- < G E T _ H I D D E N _ C A T E G O R Y _ T E M P L A T E > --------------------------
Generates the Template:Hidden category template.
This function is separate from the get_top_section() function
as this should be used in both error categories and valid categories.
]]
local function get_hidden_category_template(frame)
return frame:expandTemplate{title = 'Hidden category'}
end
--[[ -------------------------- < G E T _ T O P _ S E C T I O N > --------------------------
Generates a consistent top maintenance template section which consists of:
-- Template:Possibly empty category
-- Template:Purge
]]
local function get_top_section(frame)
local top_section = {}
if mw.site.stats.pagesInCategory(mw.title.getCurrentTitle().text, "all") == 0 then
table.insert(top_section, frame:expandTemplate{title = 'Possibly empty category'})
else
table.insert(top_section, frame:expandTemplate{title = 'Possibly empty category', args = {hidden=true}})
end
local purge_module = require('Module:Purge')
table.insert(top_section, string.format(strings["PURGE_DIV"], purge_module._main({"Purge page cache"})))
return table.concat(top_section, "\n\n")
end
--[[ -------------------------- < G E T _ B O T T O M _ S E C T I O N > --------------------------
Generates a consistent non-text section which consists of:
-- Template:Automatic category TOC
-- A see also section
-- {{DEFAULTSORT}}
-- Categorization in parent category
]]
local function get_bottom_section(frame, language_name, see_also_section, parent_category, parent_language_category)
local bottom_section = {}
table.insert(bottom_section, frame:expandTemplate{title = 'Automatic category TOC'})
table.insert(bottom_section, see_also_section)
if mw.title.getCurrentTitle().nsText == "Category" then
table.insert(bottom_section, frame:preprocess{text = "{{DEFAULTSORT:" .. language_name .. "}}"})
if parent_language_category then
table.insert(bottom_section, "[[" .. parent_language_category .. "]]")
end
table.insert(bottom_section, parent_category)
end
return table.concat(bottom_section, "\n\n\n")
end
--[[ -------------------------- < N O N _ E N G L I S H _ L A N G U A G E _ T E X T _ C A T E G O R Y > --------------------------
{{#invoke:Lang/documentor tool|non_english_language_text_category}}
This function implements {{Non-English-language text category}}.
]]
local non_english_language_text_strings = {
["LINE1"] = "This category contains articles with %s%s text. The primary purpose of these categories is to facilitate manual or automated checking of text in other languages.",
["LINE2"] = "This category should only be added with the %s family of templates, never explicitly.",
["LINE3"] = 'For example %s, which wraps the text with %s. Also available is %s which displays as %s.',
["LINE3_SYNTAXHIGHLIGHT"] = "<span lang=\"%s\">",
["IN_SCRIPT"] = " (in %s)",
["EXAMPLE_DEFAULT_TEXT"] = "text in %s language here",
["PARENT_CATEGORY"] = "[[Kategori:Artikel ngundan teks ukai jaku Iban]]",
["TEMPLATE"] = "Lang",
["TEMPLATE2"] = "Langx",
}
local function non_english_language_text_category(frame)
local page = mw.title.getCurrentTitle()
local args = require('Module:Arguments').getArgs(frame)
-- args.test is used for /testcases
if args.test then
page = mw.title.new(args.test)
end
-- Naming style: Articles with text from the Berber languages collective
local page_title_modified = page.text
local split_title = "([^,]+)%%s([^,]*)"
local part1 = ""
local part2 = ""
if page_title_modified:find('Articles with text in') then
-- Naming style: Category:Articles with text from Afro-Asiatic languages (as currently implemented in Module:lang)
part1, part2 = LANGUAGE_CATEGORIES["LANGUAGES_COLLECTIVE_TEXT"]:match(split_title)
elseif page_title_modified:find('explicitly cited') then
part1, part2 = LANGUAGE_CATEGORIES["ENGLISH"]:match(split_title)
else
-- Naming style: Category:Articles containing French-language text
part1, part2 = LANGUAGE_CATEGORIES["LANGUAGE_TEXT"]:match(split_title)
end
page_title_modified = page_title_modified:gsub(part1, "")
page_title_modified = page_title_modified:gsub(part2, "")
local language_name = page_title_modified
local layout = {}
table.insert(layout, get_hidden_category_template(frame))
local parent_category = non_english_language_text_strings["PARENT_CATEGORY"]
if language_name == page.text then
-- Error: Category title format not supported.
return make_error(string.format(error_messages["NOT_VALID_CATEGORY_FORMAT"], page.text), layout, parent_category, args.nocat)
end
local lang_module = require('Module:Lang')
local language_code = lang_module._tag_from_name({language_name})
if language_code:find('[Ee]rror') then
-- Error: Language code not found in database.
return make_error(string.format(error_messages["NOT_VALID_LANGUAGE_CODE"], language_name), layout, parent_category, args.nocat)
end
local correct_language_category_title = lang_module._category_from_tag({language_code})
if correct_language_category_title:find('[Ee]rror') then
-- Error: No category title found for language code.
return make_error(string.format(error_messages["NO_CATEGORY_TITLE_FOUND"], language_code), layout, parent_category, args.nocat)
end
local current_category_title = page.prefixedText
if current_category_title ~= correct_language_category_title then
-- Error: The current title used is not in the supported format. TODO: can this still be reached?
return make_error(
string.format(error_messages["INCORRECT_CATEGORY_TITLE"], current_category_title, frame:expandTemplate{title = 'Tlx', args = {non_english_language_text_strings["TEMPLATE"]}}, correct_language_category_title),
layout, parent_category, args.nocat)
end
table.insert(layout, get_top_section(frame))
local script_text = ""
if args.script then
script_text = string.format(non_english_language_text_strings["IN_SCRIPT"], args.script)
end
local language_link = get_language_link(language_name, language_code)
table.insert(layout, string.format(non_english_language_text_strings["LINE1"], language_link, script_text))
local lang_template = frame:expandTemplate{title = 'Tl', args = {non_english_language_text_strings["TEMPLATE"]}}
table.insert(layout, string.format(non_english_language_text_strings["LINE2"], lang_template))
local language_code_link = lang_module._name_from_tag({language_code, link="yes", label=language_code})
local example_default_text = string.format(non_english_language_text_strings["EXAMPLE_DEFAULT_TEXT"], language_name)
local example_text = args.example or example_default_text
local lang_template_example = frame:expandTemplate{title = "Tlx", args = {non_english_language_text_strings["TEMPLATE"], language_code_link, example_text}}
local langx_args = {non_english_language_text_strings["TEMPLATE2"], language_code_link, example_text}
local langx_template_example = frame:expandTemplate{title = "Tlx", args = {non_english_language_text_strings["TEMPLATE2"], language_code, example_text}}
local langx_template_code = frame:expandTemplate{title = non_english_language_text_strings["TEMPLATE2"], args = {language_code, example_text}}
-- Strip private use subtag from code tag because this is what [[Module:Lang]] does.
local language_code_without_private_use = language_code:gsub("%-x%-.*", "")
-- Wrap in syntaxhighlight.
local syntaxhighlight = frame:extensionTag(
"syntaxhighlight",
string.format(non_english_language_text_strings["LINE3_SYNTAXHIGHLIGHT"], language_code_without_private_use),
{lang = "html", inline = true}
)
table.insert(layout, string.format(non_english_language_text_strings["LINE3"], lang_template_example, syntaxhighlight, langx_template_example, langx_template_code))
local see_also_section = get_see_also_section(page.text, language_name, language_code)
local parent_language_code = get_primary_language_code(language_code)
local parent_language_category
if parent_language_code then
parent_language_category = lang_module._category_from_tag({parent_language_code})
end
local bottom = get_bottom_section(frame, language_name, see_also_section, non_english_language_text_strings["PARENT_CATEGORY"], parent_language_category)
return table.concat(layout, "\n\n") .. bottom
end
--[[ -------------------------- < N O N _ E N G L I S H _ L A N G U A G E _ S O U R C E S _ C A T E G O R Y > --------------------------
{{#invoke:Lang/documentor tool|non_english_language_sources_category}}
This function implements {{Non-English-language sources category}}.
]]
local non_english_language_sources_strings = {
["LINE1"] = "This is a tracking category for articles that use %s to identify %s sources.",
["PARENT_CATEGORY"] = "[[Kategori:Artikel enggau sumber ukai jaku Iban]]",
["TEMPLATE"] = "In lang",
}
local function non_english_language_sources_category(frame)
local page = mw.title.getCurrentTitle()
local args = require('Module:Arguments').getArgs(frame)
-- args.test is used for /testcases
if args.test then
page = mw.title.new(args.test)
end
local page_title = page.text
local language_code = page_title:match('%(([%a%-]+)%)')
local language_name = require('Module:Lang')._name_from_tag({language_code})
local layout = {}
table.insert(layout, get_hidden_category_template(frame))
local parent_category = non_english_language_sources_strings["PARENT_CATEGORY"]
local in_lang_module = require('Module:In lang')
local correct_language_category_title = in_lang_module._in_lang({language_code, ["list-cats"]="yes"})
if correct_language_category_title == "" then
-- Error: No category title found for language code.
return make_error(string.format(error_messages["NO_CATEGORY_TITLE_FOUND"], language_code), layout, parent_category, args.nocat)
end
local current_category_title = page.prefixedText
if correct_language_category_title ~= current_category_title then
-- Error: The current title used is not in the supported format.
return make_error(
string.format(error_messages["INCORRECT_CATEGORY_TITLE"], current_category_title, frame:expandTemplate{title = 'Tlx', args = {non_english_language_sources_strings["TEMPLATE"]}}, correct_language_category_title),
layout, parent_category, args.nocat)
end
local language_link = get_language_link(language_name, language_code)
local text = string.format(non_english_language_sources_strings["LINE1"], frame:expandTemplate{title = 'Tlx', args = {non_english_language_sources_strings["TEMPLATE"], language_code}}, language_link)
table.insert(layout, get_top_section(frame))
table.insert(layout, text)
local see_also_section = get_see_also_section(page_title, language_name, language_code)
local parent_language_code = get_primary_language_code(language_code)
local parent_language_category
if parent_language_code then
parent_language_category = in_lang_module._in_lang({parent_language_code, ["list-cats"]="yes"})
end
local bottom = get_bottom_section(frame, language_name, see_also_section, parent_category, parent_language_category)
return table.concat(layout, "\n\n") .. bottom
end
--[[ -------------------------- < N O N _ E N G L I S H _ L A N G U A G E _ C S 1 _ S O U R C E S _ C A T E G O R Y > --------------------------
{{#invoke:Lang/documentor tool|non_english_language_cs1_sources_category}}
This function implements {{Non-English-language CS1 sources category}}.
]]
local non_english_language_cs1_text_strings = {
["LINE1"] = "This is a tracking category for [[WP:CS1|CS1 citations]] that use the parameter %s to identify a source in [[%s language|%s]]. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].",
["PARENT_CATEGORY"] = "[[Kategori:CS1 foreign language sources]]", -- #TODO change to "Articles with non-english CS1 language sources" or "CS1 non-English language sources"
}
--"This is a tracking category for [[WP:CS1|CS1 citations]] that use the parameter %s to hold a citation title that uses %s characters and contains the language prefix <code>%s:</code>. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].",
--"[[Kategori:CS1 uses foreign language script]]",
-- "This is a tracking category for [[WP:CS1|CS1 citations]] that use the parameter %s. Pages in this category should only be added by CS1 templates and [[Module:Citation/CS1]].",
-- "to identify a source in [[%s language|%s]].",
-- "to hold a citation title that uses %s characters and contains the language prefix <code>%s:</code>.",
local function non_english_language_cs1_sources_category(frame)
local page_title_object = mw.title.getCurrentTitle()
local page_title = page_title_object.text
local language_code = page_title:match('%(([%a%-]+)%)')
local language_name = require('Module:Lang')._name_from_tag({language_code})
local layout = {}
table.insert(layout, get_hidden_category_template(frame))
local see_also_section = ""
local parameter_doc = frame:expandTemplate{title = 'para', args = {"language", language_code}}
table.insert(layout, get_top_section(frame))
table.insert(layout, string.format(non_english_language_cs1_text_strings["LINE1"], parameter_doc, language_name, language_name))
local see_also_section = get_see_also_section(page_title, language_name, language_code)
local bottom = get_bottom_section(frame, language_name, see_also_section, non_english_language_cs1_text_strings["PARENT_CATEGORY"])
return table.concat(layout, "\n\n") .. bottom
end
--[[ -------------------------- < T E S T _ C A S E S _ S H A R E D _ C O D E > --------------------------
]]
local function compare_by_keys2(a, b) -- local function used by table.sort()
return a[2] < b[2] -- ascending sort by code
end
local function compare_by_keys(a, b) -- local function used by table.sort()
return a[1] < b[1] -- ascending sort by code
end
-- Used by testcases_iso_code_to_name()
local function get_language_code_table_from_code(args)
local entry = {}
--if args.override_table[args.language_code] then
-- table.insert(entry, args.override_table[args.language_code][1]) -- :gsub(' %b()$', '') fails here
--else
table.insert(entry, args.language_code)
-- end
return entry
end
-- Used by testcases_name_from_tag()
local function get_language_code_and_name_table_from_code(args)
local entry = {}
if args.override_table and args.override_table[args.language_code] then
table.insert(entry, args.language_code)
local language_code, _ = args.override_table[args.language_code][1]:gsub(' %b()$', '')
table.insert(entry, language_code)
else
table.insert(entry, args.language_code)
table.insert(entry, args.language_table[args.language_code])
end
return entry
end
-- Used by testcases_category_from_tag()
local function get_language_code_and_category_table_from_code(args)
local entry = {}
table.insert(entry, args.language_code)
table.insert(entry, args.test_function({args.language_code}))
return entry
end
-- Used by testcases_iso_name_to_code() and testcases_tag_from_name()
local function get_language_name_and_code_table_from_code(args)
local entry = {}
if args.override_table[args.language_code] then
table.insert(entry, args.override_table[args.language_code][1]) -- only the first name when there are multiples
table.insert(entry, args.language_code)
else
table.insert(entry, args.language_names[1]) -- only the first name when there are multiples
table.insert(entry, args.language_code)
end
return entry
end
local function get_table(table_function, language_table, length, range, iso_number, test_function)
local table_of_language_name_and_code_tables = {}
local override_table_name = "override"
if iso_number then
override_table_name = "override_" .. iso_number
end
local override_table = require("Module:ISO 639 name/ISO_639_override/sandbox")[override_table_name]
-- For most ISO 639s.
if range then
for language_code, language_names in pairs(language_table) do
if language_code:find(range) then
table.insert(table_of_language_name_and_code_tables, table_function({
override_table = override_table,
language_code = language_code,
language_names = language_names,
test_function = test_function,
language_table = language_table
}))
end
end
-- For ISO 639-1.
elseif length then
for language_code, language_names in pairs(language_table) do
if language_code:len() == 2 then
table.insert(table_of_language_name_and_code_tables, table_function({
override_table = override_table,
language_code = language_code,
language_names = language_names,
test_function = test_function,
language_table = language_table
}))
end
end
-- For general /testcases.
else
for language_code, language_names in pairs(language_table) do
table.insert(table_of_language_name_and_code_tables, table_function({
override_table = override_table,
language_code = language_code,
language_names = language_names,
test_function = test_function,
language_table = language_table
}))
end
end
return table_of_language_name_and_code_tables
end
local function get_undabbed_table(language_list, length, range)
local undabbed_language_table = {} -- for this test, ISO 639-3 language name disambiguators must be removed; un-dabbed names go here
for language_code, language_names in pairs(language_list) do
-- For most ISO 639s.
if range then
if language_code:find(range) then
undabbed_language_table[language_code] = language_names[1]:gsub(' %b()$', '') -- undab and save only the first name; ignore all other names assigned to a code
end
-- For ISO 639-1.
elseif length then
if language_code:len() == 2 then
undabbed_language_table[language_code] = language_names[1]:gsub(' %b()$', '') -- undab and save only the first name; ignore all other names assigned to a code
end
-- For general /testcases.
else
undabbed_language_table[language_code] = language_names[1]:gsub(' %b()$', '')
end
end
return undabbed_language_table
end
--[[ -------------------------- < T E S T C A S E S _ C A T E G O R Y _ F R O M _ T A G > --------------------------
Entry point for the various category_from_tag testcases.
Build a table of test patterns where each entry in the table is a table with two members:
{"<language_code>", "<category name according to Module:Lang>"}
- "Expected" column value is the category name according to Module:Lang.
- "Actual" column value is the result of {{#invoke:Lang/sandbox|category_from_tag|<language_code>}}.
TODO: Currently not working.
]]
local function testcases_category_from_tag(self, args)
local cat_from_tag_function = require('Module:Lang')._category_from_tag
local language_tables = get_table(get_language_code_and_category_table_from_code, args.language_list, args.length, args.range, args.iso_number, cat_from_tag_function)
table.sort(language_tables, compare_by_keys)
self:preprocess_equals_preprocess_many(
'{{#invoke:Lang/sandbox|category_from_tag|', '}}', '', '',
language_tables,
{nowiki=false}
)
end
--[[ -------------------------- < T E S T C A S E S _ N A M E _ F R O M _ T A G > --------------------------
Entry point for the various name_from_tag testcases.
Build a table of test patterns where each entry in the table is a table with two members:
{"<language_code>", "<language_name>"}
- "Expected" column value is the <language_name>.
- "Actual" column value is the result of sandbox version {{#invoke:Lang/sandbox|name_from_tag|<language_code>}}.
]]
local function testcases_name_from_tag(self, args)
local undabbed_language_table = get_undabbed_table(args.language_list, args.length, args.range, nil)
local language_tables = get_table(get_language_code_and_name_table_from_code, undabbed_language_table, args.length, args.range)
table.sort(language_tables, compare_by_keys)
self:preprocess_equals_preprocess_many(
'{{#invoke:Lang/sandbox|name_from_tag|', '}}', '', '',
language_tables,
{nowiki=false}
)
end
--[[ -------------------------- < T E S T C A S E S _ T A G _ F R O M _ N A M E > --------------------------
Entry point for the various tag_from_name testcases.
Build a table of test patterns where each entry in the table is a table with two members:
{"<language_name>", "<language_code>"}
- "Expected" column value is the <language_code>.
- "Actual" column value is the result of sandbox version {{#invoke:Lang/sandbox|tag_from_name|<language_name>}}.
TODO: Currently not working.
]]
local function testcases_tag_from_name(self, args)
local language_tables = get_table(get_language_name_and_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)
table.sort(language_tables, compare_by_keys2)
local ordered_table = {}
table.sort(unordered_table)
for _, key in ipairs(unordered_table) do
table.insert(ordered_table, {key, reverse_table[key]})
end
self:preprocess_equals_preprocess_many(
'{{#invoke:Lang/sandbox|tag_from_name|', '}}', '', '',
language_tables,
{nowiki=false}
)
end
--[[ -------------------------- < T E S T C A S E S _ I S O _ C O D E _ T O _ N A M E > --------------------------
Entry point for the various iso_code_to_name testcases.
Build a table of test patterns where each entry in the table is a table with one member:
{"<language_code>"}
- "Expected" column value is the result of the live version of {{#invoke:ISO 639 name|iso_639_name_to_code|<language_code>}}.
- "Actual" column value is the result of sandbox version {{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|<language_code>}}.
]]
local function testcases_iso_code_to_name(self, args)
local language_tables = get_table(get_language_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)
table.sort(language_tables, compare_by_keys)
self:preprocess_equals_preprocess_many(
'{{#invoke:ISO 639 name/sandbox|iso_639_code_to_name|link=yes|', '}}', '{{#invoke:ISO 639 name|iso_639_code_to_name|link=yes|', '}}',
language_tables,
{nowiki=false}
)
end
--[[ -------------------------- < T E S T C A S E S _ I S O _ N A M E _ T O _ C O D E > --------------------------
Entry point for the various iso_name_to_code testcases.
Build a table of test patterns where each entry in the table is a table with two members:
{"<language_name>", "<language_code>"}
- "Expected" column value is the <language_code>.
- "Actual" column is value the result of {{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|<language_name>}}.
]]
local function testcases_iso_name_to_code(self, args)
local language_tables = get_table(get_language_name_and_code_table_from_code, args.language_list, args.length, args.range, args.iso_number, nil)
table.sort(language_tables, compare_by_keys2)
self:preprocess_equals_preprocess_many(
'{{#invoke:ISO 639 name/sandbox|iso_639_name_to_code|2=' .. args.iso_number .. "|", '}}', '', '',
language_tables,
{nowiki=false}
)
end
--[[--------------------------< S E E _ A L S O >--------------------------------------------------------------
adds items to the list of items in §See also section of Template:Lang-x/doc; Evaluates single positional parameter
which is a comma-separated list of items including list markup.
{{#invoke:Lang/documentor tool|see_also|*{{tl|Lang-tt-Cyrl}}, *{{tl|Lang-tt-Latn}}, *{{tl|Lang-tt-Arab}}}}
]]
local function see_also (frame)
if nil == frame.args[1] or '' == frame.args[1] then -- if empty, ...
return -- ... return nothing
end
return frame:preprocess (frame.args[1]:gsub ('%s*,%s', '\n')) -- preprocess so any templates are rendered before saving and done
end
--[[ -------------------------< E X P O R T E D _ F U N C T I O N S > -----------------------------------------
]]
return {
lang_xx_settings = lang_xx_settings,
uses_module = uses_module,
see_also = see_also,
non_english_language_text_category = non_english_language_text_category,
non_english_language_sources_category = non_english_language_sources_category,
non_english_language_cs1_sources_category = non_english_language_cs1_sources_category,
private_tags = private_tags,
-- Module:Lang testcases
testcases_category_from_tag = testcases_category_from_tag,
testcases_name_from_tag = testcases_name_from_tag,
testcases_tag_from_name = testcases_tag_from_name,
-- Module:ISO 639 name testcases
testcases_iso_code_to_name = testcases_iso_code_to_name,
testcases_iso_name_to_code = testcases_iso_name_to_code,
}
ds27u7na3alrbanii9xpibt0ey76blc
Templat:Possibly empty category
10
6661
19257
2026-06-09T13:33:26Z
Song GK
9
Melencong ke [[Templat:Kategori engka puang]]
19257
wikitext
text/x-wiki
#REDIRECT [[Templat:Kategori engka puang]]
dlpsvqw0hq5uo137hw8r43rg9kfmxsp
Kategori:Artikel enggau sumber ukai jaku Iban
14
6662
19258
2026-06-09T13:37:18Z
Song GK
9
Mencipta laman baru dengan kandungan '{{Tracking category}} {{Container category}} [[Kategori:Artikel ti ngena templat jaku]]'
19258
wikitext
text/x-wiki
{{Tracking category}}
{{Container category}}
[[Kategori:Artikel ti ngena templat jaku]]
erx8qsfa84dqzdpksh162a2cfcwhsr7
Opis Kereja Raya Malaysia
0
6663
19259
2026-06-09T15:13:05Z
Song GK
9
Digaga enggau chara nyalin lambar " [[:ms:Special:Redirect/revision/6641141|Jabatan Kerja Raya Malaysia]] "
19259
wikitext
text/x-wiki
{{Infobox government agency|agency_name=Opis Kereja Raya Malaysia|native_name={{lang|ms|Jabatan Kerja Raya Malaysia}}|logo=JKR Malaysia logo.png|logo_width=100px|logo_caption=|seal=Coat of arms of Malaysia.svg|seal_width=100px|seal_caption=|formed={{start date and age|1872}}|preceding1=|dissolved=|superseding=|jurisdiction=|headquarters=Ibu Pejabat JKR Malaysia, Jalan Sultan Salahuddin 50480 Kuala Lumpur|employees=|budget=|chief1_name=Datuk Wira Ir. Roslan bin Ismail|chief1_position=Ketuai Pengarah|agency_type=Perintah|parent_agency=[[Opis Menteri Kereja Raya Malaysia]]|child1_agency=|website={{url|https://www.jkr.gov.my/}}|footnotes=}}
'''Opis Kereja Raya Malaysia''' ( [[Urup Jawi|skrip Jawi]] : جابتن كرجا راي مليسيا; pandak: '''JKR''' ) nya siti ari opis perintah [[Malaysia]] ti megai tanggung pengawa ngaga sereta ngintu infrastruktur mensia mayuh di Malaysia baka jalai alun perintah besai enggau nengeri, begunan perintah, kuasa karan, ai enggau mayuh agi. Ejensi tu bepalan ba baruh Opis Menteri Kereja Raya Malaysia.<ref>{{Cite web|url=https://www.jkr.gov.my/en/page/kpkr-history-0|title=Current Events 'Public Works Department' Established|last=|first=|date=|website=|archive-url=https://web.archive.org/web/20190221224227/https://www.jkr.gov.my/en/page/kpkr-history-0|archive-date=2019-02-21|access-date=|url-status=dead}}</ref>
[[Fail:JKRHQKL.jpg|thumb|Indu Opis JKR di Kuala Lumpur.]]
== Kereban sanding ==
== Laman web ke bukai ==
* [http://www.jkr.gov.my Laman web rasmi] Diarkibkan
ezj4qd5qpv5qljkox656x6hjhubwlp7
19260
19259
2026-06-09T15:13:36Z
Song GK
9
/* Kereban sanding */
19260
wikitext
text/x-wiki
{{Infobox government agency|agency_name=Opis Kereja Raya Malaysia|native_name={{lang|ms|Jabatan Kerja Raya Malaysia}}|logo=JKR Malaysia logo.png|logo_width=100px|logo_caption=|seal=Coat of arms of Malaysia.svg|seal_width=100px|seal_caption=|formed={{start date and age|1872}}|preceding1=|dissolved=|superseding=|jurisdiction=|headquarters=Ibu Pejabat JKR Malaysia, Jalan Sultan Salahuddin 50480 Kuala Lumpur|employees=|budget=|chief1_name=Datuk Wira Ir. Roslan bin Ismail|chief1_position=Ketuai Pengarah|agency_type=Perintah|parent_agency=[[Opis Menteri Kereja Raya Malaysia]]|child1_agency=|website={{url|https://www.jkr.gov.my/}}|footnotes=}}
'''Opis Kereja Raya Malaysia''' ( [[Urup Jawi|skrip Jawi]] : جابتن كرجا راي مليسيا; pandak: '''JKR''' ) nya siti ari opis perintah [[Malaysia]] ti megai tanggung pengawa ngaga sereta ngintu infrastruktur mensia mayuh di Malaysia baka jalai alun perintah besai enggau nengeri, begunan perintah, kuasa karan, ai enggau mayuh agi. Ejensi tu bepalan ba baruh Opis Menteri Kereja Raya Malaysia.<ref>{{Cite web|url=https://www.jkr.gov.my/en/page/kpkr-history-0|title=Current Events 'Public Works Department' Established|last=|first=|date=|website=|archive-url=https://web.archive.org/web/20190221224227/https://www.jkr.gov.my/en/page/kpkr-history-0|archive-date=2019-02-21|access-date=|url-status=dead}}</ref>
[[Fail:JKRHQKL.jpg|thumb|Indu Opis JKR di Kuala Lumpur.]]
== Kereban sanding ==
{{reflist}}
== Laman web ke bukai ==
* [http://www.jkr.gov.my Laman web rasmi] Diarkibkan
objni63ue4jfa6udlypd10nk5crqcln
Saizeriya
0
6664
19261
2026-06-10T00:28:18Z
Song GK
9
Digaga enggau chara nyalin lambar " [[:en:Special:Redirect/revision/1346523618|Saizeriya]] "
19261
wikitext
text/x-wiki
{{Infobox company
| name = Saizeriya Co., Ltd. <br /> 株式会社サイゼリヤ
| logo =
| image = File:Saizeriya-OSU301.jpg
| image_size = 300
| image_caption = Siti restoran Saizeriya di [[Nagoya]], [[Jipun]]
| type = [[Kabushiki gaisha|Kompeni rama]]
| traded_as = {{tyo|7581}}
| industry = Restoran
| founded = [[Yoshikawa, Saitama]], Jipun ({{Start date and age|1973|5|1}})
| hq_location_city = 〒 342-0008
No. 5, No. 2 Asahi, Nengeri Yoshikawa, Prefektur Saitama
| hq_location_country = Jipun
| area_served = Jipun, Singapura, Taiwan, Hong Kong, Tanah Besai China, Malaysia
| key_people = {{nihongo|Yasuhiko Shōgaki|正垣泰彦}} (Direktor eksekutif)
| services = Pemakai Itali gaya Jipun
| revenue = ¥ 82,700,000,000 [[Yen Jipun|JPY]]
| assets = ¥ 61,000,000,000 [[Yen Jipun|JPY]]
| num_employees = 1,454
| website = {{url|www.saizeriya.co.jp}} Jipun, {{in lang|ja}}<br/>{{url|www.saizeriya.com.sg}} Singapura, {{in lang|en}}
}}
'''Saizeriya''' (サイゼリヤ) nya rengkayan restoran ''[[yōshoku]]'' gaya Itali, suah dikedut nyadi "Saize" (サイゼ). Tu diatur kompeni Saizeriya Co. (株式会社サイゼリヤ, Kabushiki-gaisha Saizeriya). Indu opis iya bepalan ba [[Yoshikawa, Saitama]].<ref>{{Cite web|url=https://www.saizeriya.co.jp/corporate/information/outline/|title=企業情報|publisher=Saizeriya|access-date=2021-05-27|quote=本社 〒342-0008 埼玉県吉川市旭2番地5}}</ref>
Kelimpah ari Jopun, restoran tu mega bisi ba menua China, Hong Kong, Taiwan, Singapura, sereta Malaysia lalu bisi kilang ba [[Melton, Victoria]], Australia.
== Sejarah ==
[[Fail:Saizeriya_Yoshikawa_factory.JPG|kanan|thumb|Indu opis Saizeriya, iya nya kilang Yoshikawa]]
Presiden kompeni nya ke diatu, Yasuhiko Shōgaki, kala gawa ba sebengkah restoran barat di [[Ichikawa, Chiba]] ke dikumbai Saizeriya lebuh iya benung besekula ba [[Universiti Sains Tokyo]]. Menijar maya nya ngelala pengelandik iya, lalu lebuh Shōgaki nyadi senior ba sekula, iya bempu restoran nya. Pemakai Itali majak popular maya nya, nya alai Shōgaki nukar restoran nya ngagai pemakai Itali - tang pelanggan badu agi datai. Shōgaki lalu ngurangka rega 70%, lalu restoran nya bejalai enggau manah nyentukka baris berengkah ayan, lalu iya patut muka kedai bukai.<ref>「がっちりマンデー!!」(TBS系列)2008年9月14日放送分</ref>
Kena bulan Me 1973, Shōgaki numbuhka sebuah [[kabushiki gaisha]] ke dikumbai Maria-nu di Ichikawa. Kompeni nya udah nya berengkah ngerembai nyadi rentayan restoran. Indu opis nya terus ba prefektur Chiba. Dalam taun 1987, kompeni nya nukar nama ngagai {{nihongo|Maria-no|マリアーノ}}. Dalam taun 1992, kompeni nya sekali agi nukar nama ngagai Saizeriya.<ref name="name-change2">{{in lang|ja}}Name changed to [https://www.saizeriya.co.jp/corporate/information/history/ (株)サイゼリヤ、ホーム > 企業情報 > 沿革:創業〜1999年] {{Webarchive|url=https://web.archive.org/web/20251123130215/https://www.saizeriya.co.jp/corporate/information/history/|date=2025-11-23}}</ref>
[[Fail:Saizeriya_Milano_style_Doria_-_1.jpg|thumb|[[Doria (pemakai)|Doria]] Saizeriya "gaya Milano"]]
[[Fail:SAIZERIYA_PRODUCTS_IN_CHINA_(36).jpg|thumb|Piring dagin ari endur Saizeriya di Shenzhen]]
Dalam bulan Oktober 2006, bisi dipadahka kedai Saizeriya udah ngereja pengawa ti pemadu manah dalam kandang 8 taun. Naka bulan Ogos taun nya, asil jual niki 3%. Penyampau pelanggan niki 2.1%, lalu pukul rata penyampau belanja ke siku pelanggan udah niki 0.8%. Kompeni nya ulih nampung rega nambahka kedai iya, kelimpah ari mega ngangkatka kualiti menu sereta nyapai asil ke manah agi seraya mega nambahka pelanggan pangkalan enggau penyampau ke dijual.<ref>サイゼリヤ、1000店へ足場固め‐既存店、前期8年ぶり増収 - 日経流通新聞(2006年10月25日朝刊)</ref>
== Galeri ==
<gallery mode="packed" widths="160px" heights="160px">
Fail:Saizeriya-Matsuoka-Building-B1F.jpg|alt=In Nagoya, Japan| Ba [[Nagoya]], [[Jipun]]
Fail:Saizeriya_Foleo_Osaka_Dome_City.jpg|alt=In Osaka, Japan| Ba [[Osaka]], Jipun .
Fail:A_SAIZERIYA_RESTAURANT_AT_SHENNAN_MIDDLE_ROAD,_SHENZHEN_(2).jpg|alt=In Shenzhen, China| Ba [[Shenzhen]], [[China]]
Fail:Saizeriya_at_Jing_Liang_Plaza,_Tiancun_(20210513191512).jpg|alt=In Beijing, China| Ba [[Beijing]], China
</gallery>
== Kereban sanding ==
{{Reflist}}
== Bacha ke silik agi ==
* {{cite web|url=https://www.japantimes.co.jp/news/2020/08/08/business/corporate-business/japan-saizeriya-restaurant-face-mask/|title=Japan's Saizeriya restaurant 'develops' face mask to wear when eating|agency=[[Kyodo News]]|newspaper=[[The Japan Times]]|date=2020-08-08}}
== Laman web ==
* {{Official website|http://www.saizeriya.co.jp/}} {{in lang|ja}} (Japan)
* {{Official website|https://www.saizeriya.com.sg/}} {{in lang|en}} (Singapore)
{{Authority control}}
l0vvsj51npakxc7memmrf564xs9dyx8
Kategori:Artikel enggau sumber jaku Jipun (ja)
14
6665
19262
2026-06-10T00:29:50Z
Song GK
9
Mencipta laman baru dengan kandungan '{{Kategori sumber ukai jaku Iban}}'
19262
wikitext
text/x-wiki
{{Kategori sumber ukai jaku Iban}}
6076wlzprhayhewk04jp9gd7ca0q8qv
Templat:Container category
10
6666
19263
2026-06-10T07:12:52Z
Song GK
9
Melencong ke [[Templat:Kategori bungkan]]
19263
wikitext
text/x-wiki
#REDIRECT [[Templat:Kategori bungkan]]
bzwcymeefm9zxrj4gb9u83dkqxmf373
Templat:Kategori bungkan
10
6667
19264
2026-06-10T07:14:18Z
Song GK
9
Mencipta laman baru dengan kandungan '{{Cmbox | type = notice | text = Tu '''[[:Kategori:Kategori bungkan|kategori bungkan]]'''. Ketegal fungsyen iya, tu patut ''mina'' ngundan subkategori. }}<includeonly>{{#ifeq: {{lc:{{{nocat|false}}}}}|false|{{Single namespace|category|{{{category|[[Kategori:Kategori bungkan]]}}}}}|<!-- Category suppressed -->}}</includeonly><noinclude> {{Documentation}} <!-- Please add metadata to the <includeonly> section at the bottom of the /doc sub-page. --> </noin...'
19264
wikitext
text/x-wiki
{{Cmbox
| type = notice
| text = Tu '''[[:Kategori:Kategori bungkan|kategori bungkan]]'''. Ketegal fungsyen iya, tu patut ''mina'' ngundan subkategori.
}}<includeonly>{{#ifeq: {{lc:{{{nocat|false}}}}}|false|{{Single namespace|category|{{{category|[[Kategori:Kategori bungkan]]}}}}}|<!-- Category suppressed -->}}</includeonly><noinclude>
{{Documentation}}
<!-- Please add metadata to the <includeonly> section at the bottom of the /doc sub-page. -->
</noinclude>
5gm91s6spd693skt78ehjj7p3x0e7jj
Kategori:Artikel enggau sumber jaku Inggeris (en)
14
6668
19265
2026-06-10T07:15:23Z
Song GK
9
Mencipta laman baru dengan kandungan '{{Kategori sumber ukai jaku Iban}}'
19265
wikitext
text/x-wiki
{{Kategori sumber ukai jaku Iban}}
6076wlzprhayhewk04jp9gd7ca0q8qv
Kategori:Artikel enggau sumber jaku Melayu (ms)
14
6669
19266
2026-06-10T07:16:31Z
Song GK
9
Mencipta laman baru dengan kandungan '{{Kategori sumber ukai jaku Iban}}'
19266
wikitext
text/x-wiki
{{Kategori sumber ukai jaku Iban}}
6076wlzprhayhewk04jp9gd7ca0q8qv
Johan Ghazali
0
6670
19270
2026-06-10T07:41:12Z
Song GK
9
Mencipta laman baru dengan kandungan '{{Infobox martial artist | name = Johan Ghazali <br><small>[[Derajat Utama Pemadu Mulia Bintang Sarawak|ABS]]</small> | image = | caption = | birth_name = Muhammad Johan Ghazali bin Zulfikar | birth_date = {{Birth date and age|2006|11|14|mf=y}} | birth_place = [[Kuala Lumpur]], [[Malaysia]] | death_date = | death_place = | height = 170 cm | weight_class =[[Kelas terebai (MMA)|Kelas terebai (135 lbs)]] ([[ONE Championship|ONE]]) | reach = 165 cm |...'
19270
wikitext
text/x-wiki
{{Infobox martial artist
| name = Johan Ghazali <br><small>[[Derajat Utama Pemadu Mulia Bintang Sarawak|ABS]]</small>
| image =
| caption =
| birth_name = Muhammad Johan Ghazali bin Zulfikar
| birth_date = {{Birth date and age|2006|11|14|mf=y}}
| birth_place = [[Kuala Lumpur]], [[Malaysia]]
| death_date =
| death_place =
| height = 170 cm
| weight_class =[[Kelas terebai (MMA)|Kelas terebai (135 lbs)]] ([[ONE Championship|ONE]])
| reach = 165 cm
| style = [[Muay Thai]]
| team =*Rentap Muaythai Gym (2016–''diatu'')
| years_active = {{circa}} 2016–''diatu''
| kickbox_win = 7
| kickbox_kowin =6
| kickbox_loss = 3
| kickbox_koloss =
| kickbox_draw = 0
| kickbox_nc =
| other =
| occupation =
| spouse =
| relatives = *General Tan Sri [[Mohd Ghazali Che Mat]] (aki)
*SAC Zulfikar Mohd Ghazali (apai)
*Jennana Lynn Johnson (indai)
*Muhammad Elias Ghazali (abang)
*Muhammad Mikael "Miki" Ghazali (madi laki)
*Emylia Lynn "Mia" Ghazali (madi indu)
| students =
| university =
| url =
| boxrec =
|nickname=Jojo Ghazali}}
'''Muhammad Johan Ghazali bin Zulfikar''' (ada kena 14 November 2006), dikelala sechara profesional enggau nama '''Jojo Ghazali''' nya siku petinju [[Muay Thai]] Malaysia.<ref>{{cite web |title=Jojo – Biodata Johan Ghazali, Atlet Muay Thai Malaysia |url=https://ecentral.my/jojo/ |access-date=12 August 2025 |publisher=E-Central MY}}</ref>
== Pengidup kediri ==
Jojo ada kena 14 November 2006 ba [[Kuala Lumpur]]. Ba taun 2015, iya mindah ngagai [[Kuching]], Sarawak. Iya anak kedua ari empat iku menyadi. Jojo nya anak SAC Zulfikar Ghazali, pegawai renggat tinggi dalam [[Polis Diraja Malaysia]] sereta uchu niang Jeneral [[Mohd Ghazali Che Mat]] ti nyadi [[Pengelima Raban Soldadu (Malaysia)|Pengelima Raban Soldadu]] ke-8. Iya bisi peturun Amerika nengah indai iya.<ref name=":2">{{cite web |last=Furness |first=Jay |date=7 December 2023 |title=Origins Of A Prodigy: Get To Know Teen Muay Thai Sensation Johan Ghazali Ahead Of His U.S. Primetime Debut |url=https://www.onefc.com/features/origins-of-a-prodigy-get-to-know-teen-muay-thai-sensation-johan-ghazali-ahead-of-his-u-s-primetime-debut/ |website=www.onefc.com}}</ref><ref>{{cite web |last=Coate |first=Ben |date=15 May 2024 |title=‘Warrior Blood Is Definitely In Me’ – Johan Ghazali’s Incredible Family History Of Fighters |url=https://www.onefc.com/features/warrior-blood-is-definitely-in-me-johan-ghazalis-incredible-family-history-of-fighters/#:~:text=Ghazali's%20warrior%20bloodline%20runs%20deeper,decorated%20figure%20in%20the%20country. |website=www.onefc.com}}</ref>
Iya bulih pelajar tumu iya ba Sekula Sekondari St. Thomas, [[Kuching]], [[Sarawak]]. Jojo berengkah regas nyeretai [[Muay Thai]] ba umur 10, diiri enggau inspirasyen ari apai indai iya, ke sama-sama pengamal Muay Thai. Ke berat, semua menyadi iya mega pengamal Muay Thai sereta ngarika [[Malaysia]] ba mayuh bengkah pekit entarabansa.<ref name=":2" />
Kena 11 Oktober 2025, Jojo diberi Kaban [[Derajat Utama Pemadu Mulia Bintang Sarawak]] (A.B.S.) ari Gabenor Sarawak, [[Wan Junaidi Tuanku Jaafar]] ketegal pemujur enggau pemeri iya ke nyulut ngagai lumba enggau main tu.<ref name=":3" />
== Pengawa ==
Ba taun 2022, Jojo nyapai pemujur ke nyelai lebuh menang gelar kategori umur 14–15 taun (baruh 60 kg) ba Kejohanan Muay Thai Belia Dunia IFMA 2022. Ba renggat kepenudi, ke diatur ba Piramid Sunway di [[Petaling Jaya]] kena Hari Enam tu tadi, iya ngalahka pemekit Rusia Rustam Yunusob enggau skor keseluruhan 20-18.<ref name="marriage">{{cite web |last=Umpang |first=Matthew |date=22 August 2022 |title=Sarawak’s Johan wins 2022 IFMA World Youth Muay Thai Championship title |url=https://www.theborneopost.com/2022/08/22/sarawaks-johan-wins-2022-ifma-world-youth-muay-thai-championship-title/#:~:text=Sarawak's%20Johan%20wins%202022%20IFMA%20World%20Youth%20Muay%20Thai%20Championship%20title,-0&text=KUCHING%20(Aug%2022)%3A%20Sarawak's,World%20Youth%20Muay%20Thai%20Championship. |access-date=12 August 2025 |publisher=[[Borneo Post]]}}</ref> Ba bulan September, Jojo bepekit dalam kategori 60 kg laki ba [[Lumba Malaysia 2022]] ngelaban Wan Muhd Sabri Wan Zuki ari Melaka, nguasa renggat pemuka. Ba renggat kedua, Johan bulih pemenang enggau ‘knockout’, ngujungka main nya enggau skor 10-9 ke nyukung iya lalu ngujungka iya bulih midul emas.<ref name="ONE 157">{{cite web |last=Tieng Hee |first=Ting |date=21 September 2022 |title=Sukma: Sarawakian brothers strike double gold in Muay Thai |url=https://www.theborneopost.com/2022/09/21/sukma-sarawakian-brothers-strike-double-gold-in-muay-thai/ |access-date=12 August 2025 |website=[[Borneo Post]]}}</ref>
'''Championsyip ONE'''
Jojo ngaga pengawa promosyen keterubah iya ba [[Championsyip ONE]] ba pun bulan Februari 2023, ngalahka Padesuk Fairtex nengah chara knockout dalam timpuh semina 16 saat ngulihka pemenang keterubah iya ba [[Championsyip ONE]]. Jojo mega bulih [[Ringgit Malaysia|RM]] 46,000 ungkup bonus prestasi.<ref name=":0">{{cite web |last1= |first1= |date=26 February 2023 |title=M'sian teenage Muay Thai exponent makes stunning ONE Championship debut in Bangkok |url=https://www.bernama.com/en/news.php?id=2168020 |access-date=12 August 2025 |website=[[Bernama]]}}</ref>
Kena 26 Me 2023, Jojo bepekit enggau bintang tinju Thailand Tai Sor Jor Piek Uthai dalam [[ONE Friday Fights 18]], ngulihka pemenang enggau knockout ti ngalit ati.<ref name=":1">{{cite web |first= |date=29 May 2023 |title=Malaysian teenage Muay Thai fighter dreams of claiming contract, ONE Championship belt |url=https://www.nst.com.my/sports/others/2023/05/914489/malaysian-teenage-muay-thai-fighter-dreams-claiming-contract-one |access-date=12 August 2025 |website=[[New Straits Times]]}}</ref> The win repeated the success of his debut match. In addition Jojo secured a contract valued $100,000 with ONE Championship and returned home with RM 46,000 for his second knockout in a row.<ref name=":1" />
Kena 9 Disember 2023, iya ngerembaika rikut pengawa iya ba Championsyip ONE enggau mark 5-0, pengudah ngalahka Edgar Tarbares dalam timpuh semina 36 saat. Jojo enda ulih ngetanka kesemua duit perais iya pengudah enda mujur ngaga pemerat ti dipinta. Ketegal nya, iya diwajibka ngelepaska 50 peratus duit dompet iya ngagai pangan iya.<ref>{{cite web |last=Siasat |first=JM |date=9 December 2023 |title=Teen sensation Johan Ghazali fires out 36-second win at ONE Fight Night 17, wants next bout to ‘make some noise’ |url=https://www.scmp.com/sport/martial-arts/muay-thai/article/3244500/teen-sensation-johan-ghazali-fires-out-36-second-win-one-fight-night-17-wants-next-bout-make-some |website=www.scmp.com}}</ref>
==Basa==
*{{Flag|Sarawak}}
**[[File:MY-SAR Order of the Star of Sarawak - 2 ribbon PNBS -JBS-PBS-ABS-BBS.svg|50px]] Kaban [[Derajat Utama Mulia Bintang Sarawak]] (ABS) (2025)<ref name=":3">{{cite news|url=https://www.sarawaktribune.com/from-mats-to-glory-jojo-honoured-with-ahli-bintang-sarawak-award/|title=From Mats to Glory: Jojo honoured with Ahli Bintang Sarawak award|date=15 October 2025|website=www.sarawaktribune.com}}</ref><ref>[https://suarasarawak.my/senarai-penerima-darjah-kebesaran-sempena-hari-jadi-tyt-sarawak/ Senarai Penerima Darjah Kebesaran Sempena Hari Jadi TYT Sarawak]</ref>
==Kereban sanding==
{{reflist}}
==Laman web ke bukai==
* [https://www.onefc.com/athletes/johan-ghazali/ Johan Ghazali] ba [[ONE Championship]]
* {{Instagram|johanghazali_}}
[[Kategori:Pengada 2006]]
[[Kategori:Orang idup]]
ou6qvb69ojcoz20bj9sy08e3w4bp6ia
Templat:Infobox martial artist
10
6671
19271
2026-06-10T07:46:00Z
Song GK
9
Mencipta laman baru dengan kandungan '{{#invoke:Infobox|infoboxTemplate | child = {{if empty|{{{child|}}}|{{{embed|}}}}} | subbox = {{{subbox|}}} | bodyclass = ib-martial-artist vcard | headerstyle = background-color:{{if empty|{{{color|}}}|{{{colour|}}}|#efefef}}; color:inherit; | above = {{#if:{{{child|}}}{{{embed|}}}{{{subbox|}}}||<includeonly><span class="fn">{{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}</span></includeonly>}} | abovestyle = background-color:{{if empty|{{{color|}}...'
19271
wikitext
text/x-wiki
{{#invoke:Infobox|infoboxTemplate
| child = {{if empty|{{{child|}}}|{{{embed|}}}}}
| subbox = {{{subbox|}}}
| bodyclass = ib-martial-artist vcard
| headerstyle = background-color:{{if empty|{{{color|}}}|{{{colour|}}}|#efefef}}; color:inherit;
| above = {{#if:{{{child|}}}{{{embed|}}}{{{subbox|}}}||<includeonly><span class="fn">{{if empty|{{{name|}}}|{{PAGENAMEBASE}}}}</span></includeonly>}}
| abovestyle = background-color:{{if empty|{{{color|}}}|{{{colour|}}}|#efefef}}; color:inherit;
| autoheaders = yes
| title = {{#ifeq:{{{child|}}}{{{embed|}}}{{{subbox|}}}|yes|'''Pengawa seni ngetanka diri'''}}
| image = {{#invoke:InfoboxImage|InfoboxImage|image={{#if:{{{child|}}}{{{embed|}}}{{{subbox|}}}||{{#invoke:WikidataIB |getValue|rank=best|P18 |name=image |qid={{{qid|}}} |suppressfields={{{suppressfields|}}} |fetchwikidata={{if empty|{{{fetchwikidata|}}}|ALL}} |onlysourced={{if empty|{{{onlysourced|}}}|no}} |noicon=yes |maxvals=1 |{{{image|}}}}}|size={{if empty|{{{image_size|}}}|{{{imagesize|}}}}}|sizedefault=frameless|upright=1|alt={{{alt|}}}|suppressplaceholder=yes}}}}
| caption = {{if empty|{{{caption|}}}|{{#invoke:WikidataIB|getValue|P18|rank=best|qual=P2096|qualsonly=y|lang=en|name=caption|maxvals=1|fetchwikidata={{{fetchwikidata|}}}|onlysourced={{if empty|{{{onlysourced|}}}|no}}|{{{caption|}}}}}}}
| label1 = Ada
| data1 = {{br separated entries
|1={{#if:{{{birth_name|}}} {{{birthname|}}} |<span class="nickname">{{if empty|{{{birth_name|}}}|{{{birthname|}}}}}</span>}}
|2={{#invoke:person date|birth}}
|3={{#if:{{{birth_place|}}}|<span class="birthplace">{{{birth_place|}}}</span>}}
}}
| label2 = Mati
| data2 = {{br separated entries
|1={{#invoke:person date|death}}
|2={{#if:{{{death_place|}}}|<span class="deathplace">{{{death_place|}}}</span>}}
|3={{if empty|{{{death_cause|}}}|{{{deathcause|}}}}}
}}
| label3 = Nama asal
| data3 = {{#if:{{{native_name|}}}|{{#if:{{{native_name_lang|}}}|<span class="nickname" lang="{{{native_name_lang}}}">}}{{{native_name}}}{{#if:{{{native_name_lang|}}}|</span> }} }}
| label4 = Nama ke bukai
| data4 = {{{other_names|}}}
| class4 = nickname
| label5 = Nama gela
| data5 = {{{nickname|}}}
| class5 = nickname
| label7 = Peranak
| data7 = {{{nationality|}}}
| label8 = Citizenship
| data8 = {{{citizenship|}}}
| label9 = Peninggi
| data9 = {{#if:{{{height_ft|}}}
|{{convert|{{{height_ft}}}|ft|{{if empty|{{{height_in|}}}|0}}|in|cm|0|abbr=on}}{{{height_footnote|}}}
|{{#if:{{{height_cm|}}}
|{{convert|{{{height_cm}}}|cm|ftin|0|abbr=on}}{{{height_footnote|}}}
|{{#if:{{{height_m|}}}
|{{convert|{{{height_m}}}|m|ftin|0|abbr=on}}{{{height_footnote|}}}
|{{#if:{{{height|}}}|{{Infobox person/height|{{{height}}}}}}}{{{height_footnote|}}}
}}
}}
}}
| label10 = Pemerat
| data10 = {{#if:{{{weight_lb|}}}{{{weightlb|}}}
|{{convert|{{if empty|{{{weight_lb|}}}|{{{weightlb}}}}}|lb|kg stlb|0|abbr=on}}{{{weight_footnote|}}}
|{{#if:{{{weight_kg|}}}{{{weightkg|}}}
|{{convert|{{if empty|{{{weight_kg|}}}|{{{weightkg}}}}}|kg|lb stlb|0|abbr=on}}{{{weight_footnote|}}}
|{{#if:{{{weight|}}}|{{Infobox person/weight|kg-stlb=y|lb-stlb=y|{{{weight}}}}}}}{{{weight_footnote|}}}
}}
}}
| label11 = Bagi
| data11 = {{if empty|{{{weight_class|}}}|{{{weightclass|}}}}}
| label12 = Reach
| data12 = {{#if:{{{reach_in|}}}{{{reachin|}}}
|{{convert|{{if empty|{{{reach_in|}}}|{{{reachin}}}}}|in|cm|0|abbr=on}}{{{reach_footnote|}}}
|{{#if:{{{reach_cm|}}}{{{reachcm|}}}
|{{convert|{{if empty|{{{reach_cm|}}}|{{{reachcm}}}}}|cm|in|1|abbr=on}}{{{reach_footnote|}}}
|{{#if:{{{reach|}}}|{{Infobox person/length|{{{reach}}}}}}}{{{reach_footnote|}}}
}}
}}
| label13 = Gaya
| data13 = {{br separated entries||{{{martial_art|}}}|{{{style|}}}}}
| label14 = Stance
| data14 = {{#if:{{{stance|}}}|{{#switch:{{lc:{{{stance}}}}}
|r|right|orthodox = [[Orthodox stance|Orthodox]]
|l|left|southpaw = [[Southpaw stance|Southpaw]]
| = <span style="color:red;">Unknown Value: {{{stance}}}</span>
}}
}}
| label15 = Fighting out of
| data15 = {{if empty|{{{fighting_out_of|}}}|{{{fightingoutof|}}}}}
| label16 = Tim
| data16 = {{{team|}}}
| class16 = org
| label17 = Pengajar
| data17 = {{{teacher|}}}
| label18 = Pematih
| data18 = {{{trainer|}}}
| class18 = agent
| label19 = Rank
| data19 = {{{rank|}}}
| label20 = Wrestling
| data20 = {{{wrestling|}}}
| label21 = Taun aktif
| data21 = {{if empty|{{{years_active|}}}|{{{yearsactive|}}}}}
| data22 = {{Infobox martial artist/record
|color = {{if empty|{{{color|}}}|{{{colour|}}}|#efefef}}
|type = [[Professional boxing]] record
|win = {{if empty|{{{box_win|}}}|{{{boxingwins|}}}}}
|kowin = {{if empty|{{{box_kowin|}}}|{{{boxingkowins|}}}}}
|loss = {{if empty|{{{box_loss|}}}|{{{boxinglosses|}}}}}
|koloss = {{if empty|{{{box_koloss|}}}|{{{boxingkolosses|}}}}}
|draw = {{if empty|{{{box_draw|}}}|{{{boxingdraws|}}}}}
|nc = {{if empty|{{{box_nc|}}}|{{{boxingncs|}}}}}
|win_ref = {{{box_win_ref|}}}
|kowin_ref = {{{box_kowin_ref|}}}
|loss_ref = {{{box_loss_ref|}}}
|koloss_ref = {{{box_koloss_ref|}}}
|draw_ref = {{{box_draw_ref|}}}
|nc_ref = {{{box_nc_ref|}}}
}}
| data23 = {{Infobox martial artist/record
|color = {{if empty|{{{color|}}}|{{{colour|}}}|#efefef}}
|type = [[Kickboxing]] record
|win = {{if empty|{{{kickbox_win|}}}|{{{kickboxingwins|}}}}}
|kowin = {{if empty|{{{kickbox_kowin|}}}|{{{kickboxingkowins|}}}}}
|loss = {{if empty|{{{kickbox_loss|}}}|{{{kickboxinglosses|}}}}}
|koloss = {{if empty|{{{kickbox_koloss|}}}|{{{kickboxingkolosses|}}}}}
|draw = {{if empty|{{{kickbox_draw|}}}|{{{kickboxingdraws|}}}}}
|nc = {{if empty|{{{kickbox_nc|}}}|{{{kickboxingncs|}}}}}
}}
| data24 = {{#ifexpr:0{{{mma_win|{{{mmawins|{{#expr:0{{if empty|{{{mma_kowin|}}}|{{{mmakowins|}}}}} + 0{{if empty|{{{mma_subwin|}}}|{{{mmasubwins|}}}}} + 0{{if empty|{{{mma_decwin|}}}|{{{mmadecwins|}}}}} + 0{{if empty|{{{mma_otherwin|}}}|{{{mmaotherwins|}}}}} + 0{{if empty|{{{mma_dqwin|}}}|{{{mmadqwins|}}}}}}}}}}}}} + 0{{{mma_loss|{{{mmalosses|{{#expr:0{{if empty|{{{mma_koloss|}}}|{{{mmakolosses|}}}}} + 0{{if empty|{{{mma_subloss|}}}|{{{mmasublosses|}}}}} + 0{{if empty|{{{mma_decloss|}}}|{{{mmadeclosses|}}}}} + 0{{if empty|{{{mma_dqloss|}}}|{{{mmadqlosses|}}}}}}}}}}}}} > 0|{{Infobox martial artist/record
|color = {{if empty|{{{color|}}}|{{{colour|}}}|#efefef}}
|type = {{#if:{{{mma_label|}}}{{{mmalabel|}}}|{{if empty|{{{mma_label|}}}|{{{mmalabel}}}}}|[[Mixed martial arts]] record}}
|win = {{{mma_win|{{{mmawins|{{#expr:0{{if empty|{{{mma_kowin|}}}|{{{mmakowins|}}}}} + 0{{if empty|{{{mma_subwin|}}}|{{{mmasubwins|}}}}} + 0{{if empty|{{{mma_decwin|}}}|{{{mmadecwins|}}}}} + 0{{if empty|{{{mma_otherwin|}}}|{{{mmaotherwins|}}}}} + 0{{if empty|{{{mma_dqwin|}}}|{{{mmadqwins|}}}}}}}}}}}}}
|kowin = {{if empty|{{{mma_kowin|}}}|{{{mmakowins|}}}}}
|subwin = {{if empty|{{{mma_subwin|}}}|{{{mmasubwins|}}}}}
|decwin = {{if empty|{{{mma_decwin|}}}|{{{mmadecwins|}}}}}
|dqwin = {{if empty|{{{mma_dqwin|}}}|{{{mmadqwins|}}}}}
|otherwin= {{if empty|{{{mma_otherwin|}}}|{{{mmaotherwins|}}}}}
|loss = {{{mma_loss|{{{mmalosses|{{#expr:0{{if empty|{{{mma_koloss|}}}|{{{mmakolosses|}}}}} + 0{{if empty|{{{mma_subloss|}}}|{{{mmasublosses|}}}}} + 0{{if empty|{{{mma_decloss|}}}|{{{mmadeclosses|}}}}} + 0{{if empty|{{{mma_otherloss|}}}|{{{mmaotherlosses|}}}}} + 0{{if empty|{{{mma_dqloss|}}}|{{{mmadqlosses|}}}}}}}}}}}}}
|koloss = {{if empty|{{{mma_koloss|}}}|{{{mmakolosses|}}}}}
|subloss = {{if empty|{{{mma_subloss|}}}|{{{mmasublosses|}}}}}
|decloss = {{if empty|{{{mma_decloss|}}}|{{{mmadeclosses|}}}}}
|dqloss = {{if empty|{{{mma_dqloss|}}}|{{{mmadqlosses|}}}}}
|otherloss={{if empty|{{{mma_otherloss|}}}|{{{mmaotherlosses|}}}}}
|draw = {{if empty|{{{mma_draw|}}}|{{{mmadraws|}}}}}
|nc = {{if empty|{{{mma_nc|}}}|{{{mmancs|}}}}}
}} }}
| data25 = {{Infobox martial artist/record
|color = {{if empty|{{{color|}}}|{{{colour|}}}|#efefef}}
|type = {{#if:{{{am_label|}}}{{{amlabel|}}}|{{if empty|{{{am_label|}}}|{{{amlabel}}}}}|[[Amateur sports|Amateur]] record}}
|win = {{if empty|{{{am_win|}}}|{{{amwins|}}}}}
|kowin = {{if empty|{{{am_kowin|}}}|{{{amkowins|}}}}}
|subwin = {{if empty|{{{am_subwin|}}}|{{{amsubwins|}}}}}
|decwin = {{if empty|{{{am_decwin|}}}|{{{amdecwins|}}}}}
|loss = {{if empty|{{{am_loss|}}}|{{{amlosses|}}}}}
|koloss = {{if empty|{{{am_koloss|}}}|{{{amkolosses|}}}}}
|subloss = {{if empty|{{{am_subloss|}}}|{{{amsublosses|}}}}}
|decloss = {{if empty|{{{am_decloss|}}}|{{{amdeclosses|}}}}}
|draw = {{if empty|{{{am_draw|}}}|{{{amdraws|}}}}}
|nc = {{if empty|{{{am_nc|}}}|{{{amncs|}}}}}
}}
| header26 = Other information
| label27 = Pengawa
| data27 = {{{occupation|}}}
| class27 = role
| label28 = Universiti
| data28 = {{{university|}}}
| label29 = Kaling
| data29 = {{{spouse|}}}
| label30 = Anak
| data30 = {{{children|}}}
| label31 = Kaul sebilik tebilang
| data31 = {{{relatives|}}}
| label32 = Tarak tebilang
| data32 = {{{students|}}}
| label33 = Notable club{{pluralize from text|{{{club|}}}|plural=s}}
| data33 = {{{club|}}}
| label34 = Notable school{{pluralize from text|{{{school|}}}|plural=s}}
| data34 = {{{school|}}}
| label35 = Laman web
| data35 = {{if empty|{{{url|}}}|{{{website|}}}}}
| data36 = {{#if:{{{boxrec|}}}|[http://boxrec.com/en/boxer/{{{boxrec}}} Boxing record] from [[BoxRec]]}}
| data37 = {{#if:{{{sherdog|}}}|[http://www.sherdog.com/fightfinder/fightfinder.asp?fighterID={{{sherdog|}}} Mixed martial arts record] from [[Sherdog]]}}
| header38 = _BLANK_
| data39 = {{#if:{{{medaltemplates|}}}|{{Infobox medal templates
|medals = {{{medaltemplates|}}}
|expand = {{#ifeq:{{lc:{{{show-medals}}}}}|no||yes}}
}}}}
| data65 = {{if empty|{{{misc|}}}|{{{module|}}}}}
| data66 = {{if empty|{{{misc2|}}}|{{{module2|}}}}}
| below = {{#if:{{{footnotes|}}}|{{{footnotes}}}}}{{#if:{{{updated|}}}|<div style="margin-top: 1em; color: var(--color-subtle, #54595d)">Last updated on: {{{updated}}}</div>}}
}}{{#invoke:Check for unknown parameters|check|unknown={{main other|[[Category:Pages using infobox martial artist with unknown parameters|_VALUE_{{PAGENAME}}]]}}|preview=Page using [[Template:Infobox martial artist]] with unknown parameter "_VALUE_"|ignoreblank=y| alt | am_decloss | am_decwin | am_draw | am_koloss | am_kowin | am_label | am_loss | am_nc | am_subloss | am_subwin | am_win | amdeclosses | amdecwins | amdraws | amkolosses | amkowins | amlabel | amlosses | amncs | amsublosses | amsubwins | amwins | birth_date | birth_name | birth_place | birthname | box_draw | box_draw_ref | box_koloss | box_koloss_ref | box_kowin | box_kowin_ref | box_loss | box_loss_ref | box_nc | box_nc_ref | box_win | box_win_ref | boxingdraws | boxingkolosses | boxingkowins | boxinglosses | boxingncs | boxingwins | boxrec | caption | child | children | citizenship | club | color | colour | death_cause | death_date | death_place | deathcause | embed | fetchwikidata | fighting_out_of | fightingoutof | footnotes | height | height_cm | height_footnote | height_ft | height_in | height_m | image | image_size | imagesize | kickbox_draw | kickbox_koloss | kickbox_kowin | kickbox_loss | kickbox_nc | kickbox_win | kickboxingdraws | kickboxingkolosses | kickboxingkowins | kickboxinglosses | kickboxingncs | kickboxingwins | martial_art | medaltemplates | misc | misc2 | mma_decloss | mma_decwin | mma_dqloss | mma_dqwin | mma_draw | mma_koloss | mma_kowin | mma_label | mma_loss | mma_nc | mma_otherloss | mma_otherwin | mma_subloss | mma_subwin | mma_win | mmadeclosses | mmadecwins | mmadqlosses | mmadqwins | mmadraws | mmakolosses | mmakowins | mmalabel | mmalosses | mmancs | mmaotherlosses | mmaotherwins | mmasublosses | mmasubwins | mmawins | module | module2 | name | nationality | native_name | native_name_lang | nickname | occupation | other_names | qid | rank | reach | reach_cm | reach_footnote | reach_in | reachcm | reachin | relatives | school | sherdog | show-medals | spouse | stance | students | style | subbox | suppressfields | teacher | team | trainer | university | updated | url | website | weight | weight_class | weight_footnote | weight_kg | weight_lb | weightclass | weightkg | weightlb | wrestling | years_active | yearsactive }}{{#if: {{{boxrec|}}}
| {{Wikidata check|property=P1967 |value={{#invoke:String|replace|source={{{boxrec|}}}|pattern=^0*|plain=false}} |category=Pages using infobox martial artist with boxrec parameter |namespaces=0 |nocatsame=1}}
}}{{#if: {{{sherdog|}}}
| {{Wikidata check|property=P2818 |value={{{sherdog|}}} |category=Pages using infobox martial artist with sherdog parameter |namespaces=0 |nocatsame=1}}
}}{{#invoke:Check for conflicting parameters|check
| template = [[Template:Infobox martial artist]]
| cat = {{main other|Category:Pages using infobox martial artist with conflicting parameters}}
| child; embed
| color; colour
| image_size; imagesize
| birth_name; birthname
| death_cause; deathcause
| weight_lb; weightlb
| weight_kg; weightkg
| weight_class; weightclass
| reach_in; reachin
| reach_cm; reachcm
| fighting_out_of; fightingoutof
| years_active; yearsactive
| box_win; boxingwins
| box_kowin; boxingkowins
| box_loss; boxinglosses
| box_koloss; boxingkolosses
| box_draw; boxingdraws
| box_nc; boxingncs
| kickbox_win; kickboxingwins
| kickbox_kowin; kickboxingkowins
| kickbox_loss; kickboxinglosses
| kickbox_koloss; kickboxingkolosses
| kickbox_draw; kickboxingdraws
| kickbox_nc; kickboxingncs
| mma_kowin; mmakowins
| mma_subwin; mmasubwins
| mma_decwin; mmadecwins
| mma_otherwin; mmaotherwins
| mma_dqwin; mmadqwins
| mma_koloss; mmakolosses
| mma_subloss; mmasublosses
| mma_decloss; mmadeclosses
| mma_dqloss; mmadqlosses
| mma_label; mmalabel
| mma_otherloss; mmaotherlosses
| mma_draw; mmadraws
| mma_nc; mmancs
| am_label; amlabel
| am_win; amwins
| am_kowin; amkowins
| am_subwin; amsubwins
| am_decwin; amdecwins
| am_loss; amlosses
| am_koloss; amkolosses
| am_subloss; amsublosses
| am_decloss; amdeclosses
| am_draw; amdraws
| am_nc; amncs
| url; website
| misc; module
| misc2; module2
}}<noinclude>
{{documentation}}<!-- place categories on /doc sub-page, interwikis in Wikidata -->
</noinclude>
olhn36eyspic8p85oaq9xizwqbap0oh
Templat:Infobox martial artist/record
10
6672
19272
2026-06-10T07:47:27Z
Song GK
9
Mencipta laman baru dengan kandungan '{{#if:{{{win|}}}{{{kowin|}}}{{{loss|}}}{{{koloss|}}}{{{draw|}}}{{{nc|}}}<!-- -->|{{Infobox|child=yes | labelstyle = font-weight: normal | headerstyle = background-color:{{{color|{{{colour|#efefef}}}}}}; color:inherit; | header2 = {{{type|}}} | label4 = '''Penyampau''' | data4 = {{#if:{{{win|}}}{{{loss|}}}{{{draw|}}}{{{nc|}}}|{{#expr:{{#if:{{{win|}}}|{{{win}}}|0}} + {{#if:{{{loss|}}}|{{{loss}}}|0}} + {{#if:{{{draw|}}}|{{{draw}}}|0}} + {...'
19272
wikitext
text/x-wiki
{{#if:{{{win|}}}{{{kowin|}}}{{{loss|}}}{{{koloss|}}}{{{draw|}}}{{{nc|}}}<!--
-->|{{Infobox|child=yes
| labelstyle = font-weight: normal
| headerstyle = background-color:{{{color|{{{colour|#efefef}}}}}}; color:inherit;
| header2 = {{{type|}}}
| label4 = '''Penyampau'''
| data4 = {{#if:{{{win|}}}{{{loss|}}}{{{draw|}}}{{{nc|}}}|{{#expr:{{#if:{{{win|}}}|{{{win}}}|0}} + {{#if:{{{loss|}}}|{{{loss}}}|0}} + {{#if:{{{draw|}}}|{{{draw}}}|0}} + {{#if:{{{nc|}}}|{{{nc}}}|0}}}}}}
| label5 = '''Menang'''
| data5 = {{#if:{{{win|}}}<!--
-->|{{{win}}}{{{win_ref|}}}<!--
-->|{{#if:{{{kowin|}}}{{{subwin|}}}{{{decwin|}}}{{{dqwin|}}}| <!--
-->}}<!--
-->}}
| label6 = By knockout
| data6 = {{{kowin|}}}{{{kowin_ref|}}}
| label7 = By submission
| data7 = {{{subwin|}}}
| label8 = By decision
| data8 = {{{decwin|}}}
| label9 = By disqualification
| data9 = {{{dqwin|}}}
| label10 = Unknown
| data10 = {{{otherwin|}}}
| label11 = '''Alah'''
| data11 = {{#if:{{{loss|}}}<!--
-->|{{{loss}}}{{{loss_ref|}}}<!--
-->|{{#if:{{{koloss|}}}{{{subloss|}}}{{{decloss|}}}{{{dqloss|}}}| <!--
-->}}<!--
-->}}
| label12 = By knockout
| data12 = {{{koloss|}}}{{{koloss_ref|}}}
| label13 = By submission
| data13 = {{{subloss|}}}
| label14 = By decision
| data14 = {{{decloss|}}}
| label15 = By disqualification
| data15 = {{{dqloss|}}}
| label16 = Unknown
| data16 = {{{otherloss|}}}
| label17 = '''Bedu'''
| data17 = {{{draw|}}}{{{draw_ref|}}}
| label18 = '''No contests'''
| data18 = {{{nc|}}}{{{nc_ref|}}}
}}<!-- end if
-->}}<noinclude>
{{documentation|content =
This subtemplate is used to create the record subsections of {{tl|Infobox martial artist}}. It should not be used directly.
}}</noinclude>
an3gg1sqvr78bopi9lw2fv80ogfny58
Modul:Person date
828
6673
19273
2026-06-10T07:49:32Z
Song GK
9
Mencipta laman baru dengan kandungan 'require("strict") local p = {} local TEMPLATES = { birth_date = "Hari bulan pengada", birth_date_and_age = "Hari bulan pengada enggau umur", birth_year = "Taun pengada", birth_year_and_age = "Taun pengada enggau umur", death_date = "Hari bulan pemati", death_date_text = "Teks hari bulan pemati", death_date_and_age = "Hari bulan pemati enggau umur", death_year = "Taun pemati", death_year_and_age = "Taun pemati enggau umur", } local invalid_da...'
19273
Scribunto
text/plain
require("strict")
local p = {}
local TEMPLATES = {
birth_date = "Hari bulan pengada",
birth_date_and_age = "Hari bulan pengada enggau umur",
birth_year = "Taun pengada",
birth_year_and_age = "Taun pengada enggau umur",
death_date = "Hari bulan pemati",
death_date_text = "Teks hari bulan pemati",
death_date_and_age = "Hari bulan pemati enggau umur",
death_year = "Taun pemati",
death_year_and_age = "Taun pemati enggau umur",
}
local invalid_date_category = ''
local tracking_category = ''
local Date = require('Module:Date')._Date
local getArgs = require('Module:Arguments').getArgs
if mw.title.getCurrentTitle():inNamespaces(0, 828, 829) then
-- Category only in namespaces: 0=article, 828=module & 829=module talk (last 2 needed for testcases)
tracking_category = '[[Category:Pages where birth or death is being automatically determined]]'
invalid_date_category = '[[Category:Pages with invalid birth or death dates]]'
end
local function check_for_invalid_date(str)
return mw.ustring.match(str, '^%?') or mw.ustring.match(str, '^%d%d%?') or mw.ustring.match(str, '^[Uu]nk')
end
local function expand_template(template, args)
return mw.getCurrentFrame():expandTemplate{title = template, args = args}
end
local function parse_date(str)
local date = Date(str)
if date then
return tostring(date.year), tostring(date.month), tostring(date.day)
end
-- TODO: Date has not been parsed. Need to work out what to do. For now, throw an error.
-- Example where this can occur: "birth_date = 22 December 1946" at [[Maurice Pasternak]].
-- There was a nonbreaking space after "22" whidh Date does not accept.
error('Module:Person_date parse_date invalid date: "' .. tostring(str) .. '"')
end
local function date_format(str)
if mw.ustring.match (str, '^%d+%s*%a+[%.]*%s*%d%d%d%d$') then
return 'df'
elseif mw.ustring.match(str, '^%a+[%.]*%s+%d+,%s*%d%d%d%d$') then
return 'mf'
else
return 'ERROR'
end
end
local function is_valid_month (str)
str = string.upper(mw.ustring.sub(str,1,1))..string.lower(mw.ustring.sub(str,2))
local months = {'Jan','Jan.','January','Feb','Feb.','February','Mar','March','Apr','Apr.','April','May','Jun','Jun.','June','Jul','Jul.','July','Aug','Aug.','August','Sep','Sept','Sep.','Sept.','September','Oct','Oct.','October','Nov','Nov','November','Dec','Dec.','December'}
for index, value in ipairs(months) do
if value == str then
return true
end
end
return false
end
local function is_month_year_only(str)
local month = mw.ustring.match(str, '^(%a+)[%.]*%s+%d%d%d%d$')
if month == nil then
return false
else
return is_valid_month(month)
end
end
local function is_valid_date(str)
local month = mw.ustring.match (str, '^%d+%s*(%a+)[%.]*%s*%d%d%d%d$') or mw.ustring.match(str, '^(%a+)[%.]*%s+%d+,%s*%d%d%d%d$')
if month == nil then
return false
else
return is_valid_month(month)
end
end
local function is_year_only(str)
return mw.ustring.match(str, '^%d%d%d%d$')
end
local function already_has_template(str)
str = mw.ustring.gsub(str, '&[Nn][Bb][Ss][Pp];', ' ')
return mw.ustring.match(str, '<span') or mw.ustring.match(str, '<time') or mw.ustring.match(str,'%(aged%s*%d+') or mw.ustring.match(str,'%(age%s*%d+')
end
local function sanatize_date(str)
-- Sanatize leading & trailing whitespace (this caused an issue before it was implemented)
str = mw.ustring.gsub(str,'^%s*','')
str = mw.ustring.gsub(str,'%s*$','')
-- Sanatize ordinals
str = mw.ustring.gsub(str, '(%d+)st([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)rd([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)th([,%s])', '%1%2')
str = mw.ustring.gsub(str, '(%d+)nd([,%s])', '%1%2')
return str
end
local function parse_birth(args)
local birth_date = args['birth_date'] or ''
local death_date = args['death_date'] or ''
local disap_date = args['disappeared_date'] or ''
local original = birth_date
birth_date = sanatize_date(birth_date)
death_date = sanatize_date(death_date)
disap_date = sanatize_date(disap_date)
-- Check for bad inputs. This used to be covered by a switch statement in infoboxes
if check_for_invalid_date(birth_date) then
return original..invalid_date_category
end
if already_has_template(birth_date) then
return original
end
if is_valid_date(birth_date) then
local location = mw.ustring.find(birth_date, '%d%d%d%d')
local extra = mw.ustring.sub(birth_date, location+4) .. tracking_category
local date = mw.ustring.sub(birth_date, 1,location+3)
local year, month, day = parse_date(date)
local format = date_format(date)
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_date_and_age, {year, month, day, [format] = 'yes'}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) or is_month_year_only(death_date) then
return expand_template(TEMPLATES.birth_date, {year, month, day, [format] = 'yes'}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
if is_month_year_only(birth_date) then
local year = Date('1 '..birth_date):text('%Y')
local month = Date('1 '..birth_date):text('%-m')
local location = mw.ustring.find(birth_date, '%d%d%d%d')
local date = mw.ustring.sub(birth_date, 1,location+3)
local extra = mw.ustring.sub(birth_date, location+4) .. tracking_category
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_year_and_age, {year, month}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) or is_month_year_only(death_date) then
return expand_template(TEMPLATES.birth_year, {date}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
if is_year_only(birth_date) then
local date = mw.ustring.sub(birth_date, 1, 5)
local extra = mw.ustring.sub(birth_date, 5) .. tracking_category
if death_date == '' and disap_date == '' then
return expand_template(TEMPLATES.birth_year_and_age, {date}) .. extra
elseif is_year_only(death_date) or is_valid_date(death_date) then
return expand_template(TEMPLATES.birth_year, {date}) .. extra
else
-- death_date is not a valid string (example: 'unknown')
return original
end
end
return original
end
local function parse_death(args)
local birth_date = args['birth_date'] or ''
local death_date = args['death_date'] or ''
local original = death_date
birth_date = sanatize_date(birth_date)
death_date = sanatize_date(death_date)
-- Check for bad inputs. This used to be covered by a switch statement in infoboxes
if check_for_invalid_date(death_date) then
return original..invalid_date_category
end
if already_has_template(death_date) then
return original
end
if is_valid_date(death_date) or is_month_year_only(death_date) then
local location = mw.ustring.find(death_date, '%d%d%d%d')
local date = mw.ustring.sub(death_date, 1,location+3)
local extra = mw.ustring.sub(death_date, location+4) .. tracking_category
local format = date_format(date)
if birth_date == '' then
if is_month_year_only(death_date) then
return expand_template(TEMPLATES.death_date_text, {date}) .. extra
end
local year, month, day = parse_date(date)
return expand_template(TEMPLATES.death_date, {year, month, day, [format] = 'yes'}) .. extra
else
if is_year_only(birth_date) then
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
if is_month_year_only(death_date) then
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
return expand_template(TEMPLATES.death_date_and_age, {date, bd, [format] = 'yes'}) .. extra
elseif is_valid_date(birth_date) or is_month_year_only(birth_date) then
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
if (is_month_year_only(death_date)) then
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
return expand_template(TEMPLATES.death_date_and_age, {date, bd, [format] = 'yes'}) .. extra
end
end
end
if is_year_only(death_date) then
if birth_date == '' then
return expand_template(TEMPLATES.death_year, {mw.ustring.sub(death_date, 1, 5)}) .. mw.ustring.sub(death_date, 5) .. tracking_category
else
if is_year_only(birth_date) then
return expand_template(TEMPLATES.death_year_and_age, {mw.ustring.sub(death_date, 1, 5), mw.ustring.sub(birth_date, 1, 5)}) .. mw.ustring.sub(death_date, 5) .. tracking_category
else
if is_valid_date(birth_date) then
local location = mw.ustring.find(death_date, '%d%d%d%d')
local date = mw.ustring.sub(death_date, 1,location+3)
local extra = mw.ustring.sub(death_date, location+4) .. tracking_category
location = mw.ustring.find(birth_date, '%d%d%d%d')
local bd = mw.ustring.sub(birth_date, 1,location+3)
return expand_template(TEMPLATES.death_date_and_age, {date, bd}) .. extra
end
end
end
end
return original
end
function p.birth(frame)
return parse_birth(getArgs(frame, {parentFirst = true}))
end
function p.death(frame)
return parse_death(getArgs(frame, {parentFirst = true}))
end
return p
ljya27mn2nx14vgu0ruw9895v5thtld
Templat:Infobox person/length
10
6674
19274
2026-06-10T07:50:27Z
Song GK
9
Mencipta laman baru dengan kandungan '{{#invoke:Person length|length}}<noinclude> {{Documentation}} </noinclude>'
19274
wikitext
text/x-wiki
{{#invoke:Person length|length}}<noinclude>
{{Documentation}}
</noinclude>
0urzd0kzi0b9qp4ywelaup2q0q4cbab
Modul:Person length
828
6675
19275
2026-06-10T07:51:33Z
Song GK
9
Mencipta laman baru dengan kandungan '-- This module implements [[Template:Infobox person/length]] local p = {} local function clean_length(s) s = mw.ustring.gsub(s, 'centimetre', 'cm') s = mw.ustring.gsub(s, 'centimeter', 'cm') s = mw.ustring.gsub(s, 'cms', 'cm') s = mw.ustring.gsub(s, 'cm%.', 'cm') s = mw.ustring.gsub(s, 'metre', 'm') s = mw.ustring.gsub(s, 'meter', 'm') s = mw.ustring.gsub(s, 'ms', 'm') s = mw.ustring.gsub(s, 'm%.', 'm') s = mw.ustring.gsub(s, 'inches', 'in')...'
19275
Scribunto
text/plain
-- This module implements [[Template:Infobox person/length]]
local p = {}
local function clean_length(s)
s = mw.ustring.gsub(s, 'centimetre', 'cm')
s = mw.ustring.gsub(s, 'centimeter', 'cm')
s = mw.ustring.gsub(s, 'cms', 'cm')
s = mw.ustring.gsub(s, 'cm%.', 'cm')
s = mw.ustring.gsub(s, 'metre', 'm')
s = mw.ustring.gsub(s, 'meter', 'm')
s = mw.ustring.gsub(s, 'ms', 'm')
s = mw.ustring.gsub(s, 'm%.', 'm')
s = mw.ustring.gsub(s, 'inches', 'in')
s = mw.ustring.gsub(s, 'inch', 'in')
s = mw.ustring.gsub(s, 'ins', 'in')
s = mw.ustring.gsub(s, 'in%.', 'in')
s = mw.ustring.gsub(s, '%[%[[Cc]entim|cm%]%]', '[[Centimetre|cm]]')
s = mw.ustring.gsub(s, '%[%[cm%]%]s', '[[Centimetre|cm]]')
s = mw.ustring.gsub(s, '%[%[m%]%]s', '[[Metre|m]]')
s = mw.ustring.gsub(s, '%[%[in|in%]%]', '[[inch|in]]')
return s
end
local function isnumber(s)
if s then
s = mw.ustring.gsub(s, '%+%s*%d+%s*/%s*%d+%s*$', '')
return tonumber(s)
end
return nil
end
local function get_convert_length_args(s, prefer, enforce)
local prefer_m = (prefer or '') == 'm'
local force_m = (enforce or '') == 'm'
local prefer_cm = (prefer or '') == 'cm'
local force_cm = (enforce or '') == 'cm'
unconverted = clean_length(s or '') -- basic unit cleaning
s = mw.ustring.gsub(unconverted, '&[Nn][Bb][Ss][Pp];', ' ')
local m = mw.ustring.find(s, 'm')
local c = mw.ustring.find(s, 'cm')
local i = mw.ustring.find(s, 'in')
if m == nil and i == nil then
return '', unconverted
end
if c ~= nil and i == nil then
local n = mw.ustring.sub(s, 1, c - 1)
if isnumber(n) then
return force_m
and {n/100,'m','in',0,['abbr']='on'}
or {n,'cm','in',0,['abbr']='on'}, mw.ustring.sub(s, c+2)
end
return '', unconverted
end
if m ~= nil and c == nil and i == nil then
local n = mw.ustring.sub(s, 1, m - 1)
if isnumber(n) then
return force_cm
and {n*100,'cm','in',0,['abbr']='on'}
or {n,'m','in',0,['abbr']='on'}, mw.ustring.sub(s, m+1)
end
return '', unconverted
end
if i ~= nil and m == nil then
local n = mw.ustring.sub(s, 1, i - 1)
if isnumber(n) then
return (force_m or prefer_m)
and {n,'in','m',2,['abbr']='on'}
or {n,'in','cm',0,['abbr']='on'}, mw.ustring.sub(s, i+2)
end
return '', unconverted
end
return '', unconverted
end
function convert_length(frame, args)
local targs, str = get_convert_length_args(args[1], args['prefer'] or '', args['enforce'] or '')
if type(targs) == 'table' then
return frame:expandTemplate{ title = 'convert', args = targs} .. str
else
return str
end
end
function p.length(frame)
return convert_length(frame, frame.args[1] and frame.args or frame:getParent().args)
end
return p
s9kv9i5j8q4gp6orlczfrsph5u32jia
Jefri Nichol
0
6676
19276
2026-06-10T10:17:10Z
Changkir Langkau
674
Mencipta laman baru dengan kandungan '{{infobox person | name = Jefri Nichol | image = Jefri Nichol in 2019.png | alt = | caption = Jefri Nichol maya 2019 | birth_name = | birth_date = {{birth date and age|1999|1|15}} | birth_place = [[Jakarta]], Indonesia | education = | alma_mater = | occupation = {{hlist|Pengelulu|Model}} | years_active = 2013–diatu | known_for = |...'
19276
wikitext
text/x-wiki
{{infobox person
| name = Jefri Nichol
| image = Jefri Nichol in 2019.png
| alt =
| caption = Jefri Nichol maya 2019
| birth_name =
| birth_date = {{birth date and age|1999|1|15}}
| birth_place = [[Jakarta]], Indonesia
| education =
| alma_mater =
| occupation = {{hlist|Pengelulu|Model}}
| years_active = 2013–diatu
| known_for =
| notable_works =
| spouse =
| partner =
| children =
| parents =
| relatives =
| family =
| awards = [[#Anugerah enggau penyalun|Peda rintai]]
| website = <!-- {{URL|example.com}} -->
| module =
| module2 =
| module3 =
| module4 =
| module5 =
| module6 =
| signature = Jefri Nichol (signature).svg
| signature_size =
| signature_alt =
| footnotes =
}}
'''Jefri Nichol''' (ada 15 Januari 1999) nya siku pengelulu enggau model Indonesia. Iya dikelala bala mayuh ketegal pengawa iya dalam ''[[Dear Nathan]]'' (2017).
== Pengidup tumu ==
Jefri Nichol ada kena 15 Januari 1999 ba Jakarta, Indonesia.<ref name="Profil">{{cite news|title=Profil Jefri Nichol|url=https://www.viva.co.id/siapa/read/708-jefri-nichol|first=|last=|date=|accessdate=|language=id|website=Viva.co.id|archive-date=2022-11-30|archive-url=https://web.archive.org/web/20221130110358/https://www.viva.co.id/siapa/read/708-jefri-nichol|url-status=live}}</ref> Iya anak sulung ari apai iya ti bebansa [[Minangkabau|Minang]] enggau indai iya ari Sungai Geringging, [[Kabupaten Padang Pariaman|Padang Pariaman]]. Iya bisi madi indu benama Jessie Putri.<ref>{{Cite web|date=2018-01-08|title=Jefri Nichol dan Caitlin Halderman Sambangi Padang|url=https://republika.co.id/share/p28e4k284|website=Republika Online|language=id|access-date=2023-08-11|archive-date=2023-06-28|archive-url=https://web.archive.org/web/20230628061237/https://republika.co.id/share/p28e4k284|url-status=live}}</ref> Iya besekula ba sekula vokasional SMK Tunas Jakasampurna ngambi pelajar dalam teknologi, tang ketegal jadual bekelulu ti kisuk, iya besekula rumah.<ref>{{Cite web|url=https://www.kapanlagi.com/showbiz/selebriti/pentingkan-pendidikan-jefri-nichol-cuti-dari-dunia-hiburan-6cd277.html|title=Pentingkan Pendidikan, Jefri Nichol Cuti Dari Dunia Hiburan|last=Nugraini|first=Galuh Esti|website=KapanLagi.com|date=2018-10-20|accessdate=2023-08-11|language=id|archive-date=2023-08-14|archive-url=https://web.archive.org/web/20230814085720/https://www.kapanlagi.com/showbiz/selebriti/pentingkan-pendidikan-jefri-nichol-cuti-dari-dunia-hiburan-6cd277.html|url-status=live}}</ref>
== Pengawa ==
Jefri Nichol merengkahka pengawa iya nyadi model iklan lalu berengkah bekeulu nyadi watak sukung dalam [[Minisiri|minisiri televisyen]] ''Kami Rindu Ayah'' ba taun 2013. Ba taun 2017, iya belakun nyadi Elzan ba filem keterubah iya, ''[[At Stake]]''. Siti ari pengawa ti nyadika iya tebilang iya nya lebuh iya nyadi watak terubah dalam ''[[Dear Nathan]]'', ti dipansutka ba taun ke sama.
== Pengidup kediri ==
Jefri Nichol nya siku orang ke beminatka lumba enggau main. Lumba ti dikerinduka iya bemacham, baka belanda, bejoging, enggau betinju.<ref>{{Cite web|url=https://www.jpnn.com/news/profil-jefri-nichol-si-ganteng-yang-hobi-bertinju|title=Profil Jefri Nichol, Si Ganteng yang Hobi Bertinju|website=jpnn.com|date=14 June 2022|accessdate=12 August 2023|language=id|archive-date=14 August 2023|archive-url=https://web.archive.org/web/20230814085723/https://www.jpnn.com/news/profil-jefri-nichol-si-ganteng-yang-hobi-bertinju|url-status=live}}</ref>
===Pengetan taun 2019===
Kena 23 Julai 2019, Jefri Nichol ditan [[Polis Kandang Menua Metropolitan Jakarta Raya]] ba endur iya diau ketegal ngempu [[marijuana]]. Iya udah diuji positif dadah pengudah beberapa jam ditan.<ref>{{Cite web|last=Hadiansyah|first=Surya|date=23 July 2019|title=Jefri Nichol Ditangkap Karena Kepemilikan Ganja|url=https://www.liputan6.com/showbiz/read/4019971/jefri-nichol-ditangkap-karena-kepemilikan-ganja|website=Liputan 6|language=id|archive-url=https://web.archive.org/web/20210729053758/https://www.liputan6.com/showbiz/read/4019971/jefri-nichol-ditangkap-karena-kepemilikan-ganja|archive-date=29 July 2021|access-date=23 July 2019}}</ref><ref>{{Cite web|last=Marhaenjati|first=Bayu|date=23 July 2019|title=Tangkap Aktor Muda Jefri Nichol, Polisi Sita Ganja|url=https://www.beritasatu.com/megapolitan/565930/tangkap-aktor-muda-jefri-nichol-polisi-sita-ganja|website=Berita Satu|language=id|archive-url=https://web.archive.org/web/20210729053755/https://www.beritasatu.com/megapolitan/565930/tangkap-aktor-muda-jefri-nichol-polisi-sita-ganja|archive-date=29 July 2021|access-date=23 July 2019}}</ref><ref>{{Cite web|last=Permana|first=Bayu Indra|date=23 July 2019|editor-last=Wardhani|editor-first=Anita K|title=Saat Geledah Apartemen Jefri Nichol, Polisi Temukan Ganja 6,01 Gram Jatuh Dari Kulkas|url=https://www.tribunnews.com/seleb/2019/07/23/saat-geledah-apartemen-jefri-nichol-polisi-temukan-ganja-601-gram-jatuh-dari-kulkas|website= Tribun Seleb|language=id|archive-url=https://web.archive.org/web/20210822094038/https://www.tribunnews.com/seleb/2019/07/23/saat-geledah-apartemen-jefri-nichol-polisi-temukan-ganja-601-gram-jatuh-dari-kulkas|archive-date=22 August 2021|access-date=23 July 2019}}</ref>
== Filemografi ==
=== Filem ===
{| class="wikitable unsortable"
|-
!Taun
!Tajuk
!Pengawa
!Nota
|-
|rowspan="8"|2017
|''[[At Stake]]''
|Elzan
|
|-
|''Love Letter for Starla''
|Hema Chandra
|Filem pandak
|-
|rowspan="2"|''[[Dear Nathan]]''
|Nathan Januar Prasetyo
|rowspan="2"|
|-
|Daniel Januar Prasetyo
|-
|''Jailangkung''
|Rama Putera
|
|-
|''A: Aku, Benci & Cinta''
|Alvaro Radyana Putra
|
|-
|''One Fine Day''
|Mahesa
|
|-
|''[[Love Letter for Starla]]''
|Hema Chandra
|
|-
|rowspan="4"|2018
|''Jailangkung 2''
|Rama Putera
|
|-
|rowspan="2"|''Something in Between''
|Gema
|rowspan="2"|
|-
|Abimanyu
|-
|''[[Dear Nathan: Hello Salma]]''
|Nathan Januar Prasetyo
|
|-
|rowspan="5"|2019
|''The Woven Path: Perempuan Tana Humba''
|Narrator
|Filem pandak
|-
|''DreadOut''
|Eric
|
|-
|''Hit & Run''
|Jefri
|
|-
|''Bebas''
|Mia's Bully
|Cameo
|-
|''Habibie & Ainun 3''
|Ahmad Notosastro
|
|-
|2020
|''[[Love like the Falling Rain]]''
|Kevin
|
|-
|2021
|''[[Aum!]]''
|Satriya/Surya Jatitama
|
|-
|rowspan="5"|2022
|''[[Dear Nathan: Thank You Salma]]''
|Nathan Januar Prasetyo
|
|-
|''[[Jakarta, City of Dreamers]]''
|Dominik
|Mega nyadi penulis
|-
|''My Sassy Girl''
|Gian Pratama
|
|-
|''Jailangkung: Sandekala''
|Rama Putera
|Cameo
|-
|''[[Sri Asih (2022 film)|Sri Asih]]''
|Tangguh
|
|-
|rowspan="4"|2023
|''Tulah 6/13''
|Medical team
|Cameo
|-
|''Why Do You Love Me''
|Danton
|
|-
|''Mohon Doa Restu''
|Satya
|
|-
|''[[Ali Topan]]''
|Ali Topan
|
|-
| 2025
| ''[[Sammi, Who Can Detach His Body Parts]]''
| Sammi
| Filem pandak
|}
=== Siri web ===
{| class="wikitable unsortable"
|-
!Taun
!Tajuk
!Pengawa
!Nota
|-
|2018–2019
|''Line Tutorial''
|Kala
|
|-
|2021
|''Paradise Garden''
|Kalandra Rezvan
|
|-
|2022
|''At Stake: the Series''
|Elzan
|
|-
|rowspan="2"|2022–2023
|rowspan="2"|''Love Letter for Starla: the Series''
|Hema Chandra
|rowspan="2"|
|-
|Arya
|-
|2023
|''At Stake: the Series 2''
|Elzan
|
|-
|}
=== Siri televisyen ===
{| class="wikitable unsortable"
|-
!Taun
!Tajuk
!Pengawa
!Nota
|-
|2013
|''Kami Rindu Ayah''
|Boni
|Debut
|-
|2015
|''Keluarga Garuda di Dadaku''
|Abe
|
|-
|2016
|''Sinema Pintu Taubat''
|Adit
|Episod: "Rumah untuk Bapak"
|-
|2017
|''Pesantren & Rock n' Roll Reborn''
|Ken
|
|-
|rowspan="2"|2020
|''Catatan Harianku''
|Bima
|Episod: "Jatuh Cinta pada Catatan Terakhir"
|-
|''Pesantren Rock n' Dut''
|Jefri
|
|-
|rowspan="3"|2022
|''Ikatan Cinta''
|rowspan="3"|Himself
|rowspan="3"|Cameo; ngelakuka filem ''My Sassy Girl''
|-
|''IPA & IPS''
|-
|''Aku Jatuh Cinta''
|}
=== Video musik ===
{| class="wikitable unsortable"
|-
!Taun
!Tajuk
!Penanyi
!Nota
|-
|2017
|"Surat Cinta untuk Starla"
|Virgoun
|
|-
|2020
|"Tak Bisa Bersama"
|[[Prilly Latuconsina]], [[Vidi Aldiano]]
|
|-
|2021
|"Apa Lagi"
|[[Prilly Latuconsina]], [[Andi Rianto]]
|
|-
|rowspan="4"|2022
|"Bintang di Surga"
|[[Noah (ban)|Noah]]
|
|-
|"Merasa Indah"
|[[Tiara Andini]]
|
|-
|"Deritaku"
|rowspan="2"|David Bayu
|
|-
|"It's OK for Me Now"
|
|-
|2023
|"Love Me Back"
|Christie
|
|}
== Anugerah enggau penyalun ==
{| class="wikitable sortable"
|-
! Taun
! Anugerah
! Kategori
! Pengawa
! Pemutus
! class="unsortable" | {{Abbr|Ref.|Reference(s)}}
|-
|rowspan="2"|2017
|Festival Filem Bandung
|Pengelulu dipuji
|rowspan="2" align="center"|''[[Dear Nathan]]''
|{{nom}}
|align="center"|<ref>{{Cite news|first=Mitra|last=Tarigan|date=22 October 2017|title=Ini Pemenang Festival Film Bandung 2017|url=https://seleb.tempo.co/read/1026959/ini-pemenang-festival-film-bandung-2017|work=[[Tempo.co]]|access-date=12 August 2023|editor-last=Tarigan|editor-first=Mitra|language=id|archive-date=21 September 2022|archive-url=https://web.archive.org/web/20220921192142/https://seleb.tempo.co/read/1026959/ini-pemenang-festival-film-bandung-2017|url-status=live}}</ref><ref>{{cite web|title=Daftar Lengkap Pemenang Festival Film Bandung ke-30 Tahun 2017|url=https://www.festivalfilmbandung.com/2017/10/daftar-lengkap-pemenang-festival-film.html|first=|last=|date=|accessdate=|language=id|website=Festival Film Bandung|archive-date=2023-03-23|archive-url=https://web.archive.org/web/20230323051017/https://www.festivalfilmbandung.com/2017/10/daftar-lengkap-pemenang-festival-film.html|url-status=live}}</ref>
|-
|[[Anugerah Maya (Indonesia)|Anugerah Naya]]
|[[Anugerah Maya (Indonesia)#Kategori|Pengelulu Baru Pemadu Manah]]
|{{won}}
|align="center"|<ref>{{Cite web|last=Aldida|first=Vania Ika|date=18 December 2017|title=Daftar Lengkap Pemenang Piala Maya 2017|url=https://celebrity.okezone.com/read/2017/12/17/206/1831826/daftar-lengkap-pemenang-piala-maya-2017|website=[[Okezone]]|language=id-ID|access-date=13 August 2023|archive-date=28 April 2023|archive-url=https://web.archive.org/web/20230428205923/https://celebrity.okezone.com/read/2017/12/17/206/1831826/daftar-lengkap-pemenang-piala-maya-2017|url-status=live}}</ref>
|-
|2018
|Anugerah Filem Box Office Indonesia
|Midul Mas (enggau [[Amanda Rawles]])
|align="center"|''Jailangkung''
|{{won}}
|
|-
|2019
|Anugerah Maya
|Pengelulu Pemadu Manah ungkup Watak Sukung
|rowspan="2" align="center"|''Habibie & Ainun 3''
|{{nom}}
|align="center"|<ref>{{Cite news|url=https://www.cnnindonesia.com/hiburan/20200123150737-220-468045/daftar-nominasi-piala-maya-2020|title=Daftar Nominasi Piala Maya 2020|date=23 January 2020|accessdate=4 August 2023|work=[[CNN Indonesia]]|language=id|archive-date=6 July 2022|archive-url=https://web.archive.org/web/20220706223415/https://www.cnnindonesia.com/hiburan/20200123150737-220-468045/daftar-nominasi-piala-maya-2020|url-status=live}}</ref><ref>{{cite web|url=https://kumparan.com/kumparanhits/film-dua-garis-biru-raih-4-penghargaan-di-piala-maya-8-1snw3bq643X|title=Film Dua Garis Biru Raih 4 Penghargaan di Piala Maya 8|date=9 February 2023|accessdate=9 August 2023|work=Kumparan|language=id|archive-date=15 January 2022|archive-url=https://web.archive.org/web/20220115062725/https://kumparan.com/kumparanhits/film-dua-garis-biru-raih-4-penghargaan-di-piala-maya-8-1snw3bq643X|url-status=live}}</ref>
|-
|2020
|Festival Filem Bandung
|Pengelulu Sukung Dipuji
|{{won}}
|align="center"|<ref>{{Cite news|url= https://www.kompas.com/hype/read/2020/09/10/090717266/daftar-lengkap-nominasi-film-dan-narafilm-festival-film-bandung-2020|title= Daftar Lengkap Nominasi Film dan Narafilm Festival Film Bandung 2020|work= [[Kompas.com]]|access-date= 17 August 2023|last= Susanti|first= Reni|editor-last= Setuningsih|editor-first= Novianti|language= id|archive-date= 25 October 2020|archive-url= https://web.archive.org/web/20201025093153/https://www.kompas.com/hype/read/2020/09/10/090717266/daftar-lengkap-nominasi-film-dan-narafilm-festival-film-bandung-2020|url-status= live}}</ref><ref>{{cite web|title=Daftar Lengkap Pemenang Festival Film Bandung ke-33 Tahun 2020|url=https://www.festivalfilmbandung.com/2020/12/pemenang-festival-film-bandung-2020.html?m=1|first=|last=|date=|website=Festival Film Bandung|publisher=Forum Film Bandung|language=id|accessdate=6 August 2023|archive-date=10 December 2022|archive-url=https://web.archive.org/web/20221210143250/https://www.festivalfilmbandung.com/2020/12/pemenang-festival-film-bandung-2020.html?m=1|url-status=live}}</ref>
|-
|2021
|[[Festival Filem Indonesia]]
|[[Anugerah Citra ungkup Pengelulu Pemadu Manah|Pengelulu Pemadu Manah]]
|rowspan="2" align="center" |''[[Jakarta, City of Dreamers]]''
|rowspan="2" {{nom}}
|align="center"|
|-
|rowspan="4"|2022
|Indonesian Journalist Film Festival
|Best Actor – Drama
|align="center"|
|-
|[[Anugerah Televisyen Asia]]
|[[Anugerah Televisyen Asia#Kategori Digital|Pemerindang Tuai Laki Pemadu Manah – Digital]]
|align="center"|''At Stake: the Series''
|{{nom}}
|align="center"|
|-
|rowspan="2"|Anugerah Pengelulu Filem Indonesia
|Pengelulu Sukung Pemadu Manah
|rowspan="2" align="center"|''[[Aum!]]''
|rowspan="2" {{nom}}
|rowspan="2" align="center"|
|-
|Pengelulu Sukung Pemadu Dikerindu
|}
== Kereban sanding ==
{{reflist}}
== Laman web ke bukai ==
* {{IMDb name|8758347}}
* {{instagram|jefrinichol}}
[[Kategori:Pengada 1999]]
[[Kategori:Orang idup]]
[[Kategori:Pengelulu laku Indonesia kurun ke-21]]
lwwjjubot84i52yioybpahbb2bl9w22
19277
19276
2026-06-10T10:18:49Z
Changkir Langkau
674
/* Anugerah enggau penyalun */
19277
wikitext
text/x-wiki
{{infobox person
| name = Jefri Nichol
| image = Jefri Nichol in 2019.png
| alt =
| caption = Jefri Nichol maya 2019
| birth_name =
| birth_date = {{birth date and age|1999|1|15}}
| birth_place = [[Jakarta]], Indonesia
| education =
| alma_mater =
| occupation = {{hlist|Pengelulu|Model}}
| years_active = 2013–diatu
| known_for =
| notable_works =
| spouse =
| partner =
| children =
| parents =
| relatives =
| family =
| awards = [[#Anugerah enggau penyalun|Peda rintai]]
| website = <!-- {{URL|example.com}} -->
| module =
| module2 =
| module3 =
| module4 =
| module5 =
| module6 =
| signature = Jefri Nichol (signature).svg
| signature_size =
| signature_alt =
| footnotes =
}}
'''Jefri Nichol''' (ada 15 Januari 1999) nya siku pengelulu enggau model Indonesia. Iya dikelala bala mayuh ketegal pengawa iya dalam ''[[Dear Nathan]]'' (2017).
== Pengidup tumu ==
Jefri Nichol ada kena 15 Januari 1999 ba Jakarta, Indonesia.<ref name="Profil">{{cite news|title=Profil Jefri Nichol|url=https://www.viva.co.id/siapa/read/708-jefri-nichol|first=|last=|date=|accessdate=|language=id|website=Viva.co.id|archive-date=2022-11-30|archive-url=https://web.archive.org/web/20221130110358/https://www.viva.co.id/siapa/read/708-jefri-nichol|url-status=live}}</ref> Iya anak sulung ari apai iya ti bebansa [[Minangkabau|Minang]] enggau indai iya ari Sungai Geringging, [[Kabupaten Padang Pariaman|Padang Pariaman]]. Iya bisi madi indu benama Jessie Putri.<ref>{{Cite web|date=2018-01-08|title=Jefri Nichol dan Caitlin Halderman Sambangi Padang|url=https://republika.co.id/share/p28e4k284|website=Republika Online|language=id|access-date=2023-08-11|archive-date=2023-06-28|archive-url=https://web.archive.org/web/20230628061237/https://republika.co.id/share/p28e4k284|url-status=live}}</ref> Iya besekula ba sekula vokasional SMK Tunas Jakasampurna ngambi pelajar dalam teknologi, tang ketegal jadual bekelulu ti kisuk, iya besekula rumah.<ref>{{Cite web|url=https://www.kapanlagi.com/showbiz/selebriti/pentingkan-pendidikan-jefri-nichol-cuti-dari-dunia-hiburan-6cd277.html|title=Pentingkan Pendidikan, Jefri Nichol Cuti Dari Dunia Hiburan|last=Nugraini|first=Galuh Esti|website=KapanLagi.com|date=2018-10-20|accessdate=2023-08-11|language=id|archive-date=2023-08-14|archive-url=https://web.archive.org/web/20230814085720/https://www.kapanlagi.com/showbiz/selebriti/pentingkan-pendidikan-jefri-nichol-cuti-dari-dunia-hiburan-6cd277.html|url-status=live}}</ref>
== Pengawa ==
Jefri Nichol merengkahka pengawa iya nyadi model iklan lalu berengkah bekeulu nyadi watak sukung dalam [[Minisiri|minisiri televisyen]] ''Kami Rindu Ayah'' ba taun 2013. Ba taun 2017, iya belakun nyadi Elzan ba filem keterubah iya, ''[[At Stake]]''. Siti ari pengawa ti nyadika iya tebilang iya nya lebuh iya nyadi watak terubah dalam ''[[Dear Nathan]]'', ti dipansutka ba taun ke sama.
== Pengidup kediri ==
Jefri Nichol nya siku orang ke beminatka lumba enggau main. Lumba ti dikerinduka iya bemacham, baka belanda, bejoging, enggau betinju.<ref>{{Cite web|url=https://www.jpnn.com/news/profil-jefri-nichol-si-ganteng-yang-hobi-bertinju|title=Profil Jefri Nichol, Si Ganteng yang Hobi Bertinju|website=jpnn.com|date=14 June 2022|accessdate=12 August 2023|language=id|archive-date=14 August 2023|archive-url=https://web.archive.org/web/20230814085723/https://www.jpnn.com/news/profil-jefri-nichol-si-ganteng-yang-hobi-bertinju|url-status=live}}</ref>
===Pengetan taun 2019===
Kena 23 Julai 2019, Jefri Nichol ditan [[Polis Kandang Menua Metropolitan Jakarta Raya]] ba endur iya diau ketegal ngempu [[marijuana]]. Iya udah diuji positif dadah pengudah beberapa jam ditan.<ref>{{Cite web|last=Hadiansyah|first=Surya|date=23 July 2019|title=Jefri Nichol Ditangkap Karena Kepemilikan Ganja|url=https://www.liputan6.com/showbiz/read/4019971/jefri-nichol-ditangkap-karena-kepemilikan-ganja|website=Liputan 6|language=id|archive-url=https://web.archive.org/web/20210729053758/https://www.liputan6.com/showbiz/read/4019971/jefri-nichol-ditangkap-karena-kepemilikan-ganja|archive-date=29 July 2021|access-date=23 July 2019}}</ref><ref>{{Cite web|last=Marhaenjati|first=Bayu|date=23 July 2019|title=Tangkap Aktor Muda Jefri Nichol, Polisi Sita Ganja|url=https://www.beritasatu.com/megapolitan/565930/tangkap-aktor-muda-jefri-nichol-polisi-sita-ganja|website=Berita Satu|language=id|archive-url=https://web.archive.org/web/20210729053755/https://www.beritasatu.com/megapolitan/565930/tangkap-aktor-muda-jefri-nichol-polisi-sita-ganja|archive-date=29 July 2021|access-date=23 July 2019}}</ref><ref>{{Cite web|last=Permana|first=Bayu Indra|date=23 July 2019|editor-last=Wardhani|editor-first=Anita K|title=Saat Geledah Apartemen Jefri Nichol, Polisi Temukan Ganja 6,01 Gram Jatuh Dari Kulkas|url=https://www.tribunnews.com/seleb/2019/07/23/saat-geledah-apartemen-jefri-nichol-polisi-temukan-ganja-601-gram-jatuh-dari-kulkas|website= Tribun Seleb|language=id|archive-url=https://web.archive.org/web/20210822094038/https://www.tribunnews.com/seleb/2019/07/23/saat-geledah-apartemen-jefri-nichol-polisi-temukan-ganja-601-gram-jatuh-dari-kulkas|archive-date=22 August 2021|access-date=23 July 2019}}</ref>
== Filemografi ==
=== Filem ===
{| class="wikitable unsortable"
|-
!Taun
!Tajuk
!Pengawa
!Nota
|-
|rowspan="8"|2017
|''[[At Stake]]''
|Elzan
|
|-
|''Love Letter for Starla''
|Hema Chandra
|Filem pandak
|-
|rowspan="2"|''[[Dear Nathan]]''
|Nathan Januar Prasetyo
|rowspan="2"|
|-
|Daniel Januar Prasetyo
|-
|''Jailangkung''
|Rama Putera
|
|-
|''A: Aku, Benci & Cinta''
|Alvaro Radyana Putra
|
|-
|''One Fine Day''
|Mahesa
|
|-
|''[[Love Letter for Starla]]''
|Hema Chandra
|
|-
|rowspan="4"|2018
|''Jailangkung 2''
|Rama Putera
|
|-
|rowspan="2"|''Something in Between''
|Gema
|rowspan="2"|
|-
|Abimanyu
|-
|''[[Dear Nathan: Hello Salma]]''
|Nathan Januar Prasetyo
|
|-
|rowspan="5"|2019
|''The Woven Path: Perempuan Tana Humba''
|Narrator
|Filem pandak
|-
|''DreadOut''
|Eric
|
|-
|''Hit & Run''
|Jefri
|
|-
|''Bebas''
|Mia's Bully
|Cameo
|-
|''Habibie & Ainun 3''
|Ahmad Notosastro
|
|-
|2020
|''[[Love like the Falling Rain]]''
|Kevin
|
|-
|2021
|''[[Aum!]]''
|Satriya/Surya Jatitama
|
|-
|rowspan="5"|2022
|''[[Dear Nathan: Thank You Salma]]''
|Nathan Januar Prasetyo
|
|-
|''[[Jakarta, City of Dreamers]]''
|Dominik
|Mega nyadi penulis
|-
|''My Sassy Girl''
|Gian Pratama
|
|-
|''Jailangkung: Sandekala''
|Rama Putera
|Cameo
|-
|''[[Sri Asih (2022 film)|Sri Asih]]''
|Tangguh
|
|-
|rowspan="4"|2023
|''Tulah 6/13''
|Medical team
|Cameo
|-
|''Why Do You Love Me''
|Danton
|
|-
|''Mohon Doa Restu''
|Satya
|
|-
|''[[Ali Topan]]''
|Ali Topan
|
|-
| 2025
| ''[[Sammi, Who Can Detach His Body Parts]]''
| Sammi
| Filem pandak
|}
=== Siri web ===
{| class="wikitable unsortable"
|-
!Taun
!Tajuk
!Pengawa
!Nota
|-
|2018–2019
|''Line Tutorial''
|Kala
|
|-
|2021
|''Paradise Garden''
|Kalandra Rezvan
|
|-
|2022
|''At Stake: the Series''
|Elzan
|
|-
|rowspan="2"|2022–2023
|rowspan="2"|''Love Letter for Starla: the Series''
|Hema Chandra
|rowspan="2"|
|-
|Arya
|-
|2023
|''At Stake: the Series 2''
|Elzan
|
|-
|}
=== Siri televisyen ===
{| class="wikitable unsortable"
|-
!Taun
!Tajuk
!Pengawa
!Nota
|-
|2013
|''Kami Rindu Ayah''
|Boni
|Debut
|-
|2015
|''Keluarga Garuda di Dadaku''
|Abe
|
|-
|2016
|''Sinema Pintu Taubat''
|Adit
|Episod: "Rumah untuk Bapak"
|-
|2017
|''Pesantren & Rock n' Roll Reborn''
|Ken
|
|-
|rowspan="2"|2020
|''Catatan Harianku''
|Bima
|Episod: "Jatuh Cinta pada Catatan Terakhir"
|-
|''Pesantren Rock n' Dut''
|Jefri
|
|-
|rowspan="3"|2022
|''Ikatan Cinta''
|rowspan="3"|Himself
|rowspan="3"|Cameo; ngelakuka filem ''My Sassy Girl''
|-
|''IPA & IPS''
|-
|''Aku Jatuh Cinta''
|}
=== Video musik ===
{| class="wikitable unsortable"
|-
!Taun
!Tajuk
!Penanyi
!Nota
|-
|2017
|"Surat Cinta untuk Starla"
|Virgoun
|
|-
|2020
|"Tak Bisa Bersama"
|[[Prilly Latuconsina]], [[Vidi Aldiano]]
|
|-
|2021
|"Apa Lagi"
|[[Prilly Latuconsina]], [[Andi Rianto]]
|
|-
|rowspan="4"|2022
|"Bintang di Surga"
|[[Noah (ban)|Noah]]
|
|-
|"Merasa Indah"
|[[Tiara Andini]]
|
|-
|"Deritaku"
|rowspan="2"|David Bayu
|
|-
|"It's OK for Me Now"
|
|-
|2023
|"Love Me Back"
|Christie
|
|}
== Anugerah enggau penyalun ==
{| class="wikitable sortable"
|-
! Taun
! Anugerah
! Kategori
! Pengawa
! Pemutus
! class="unsortable" | {{Abbr|KS.|Kereban sanding}}
|-
|rowspan="2"|2017
|Festival Filem Bandung
|Pengelulu dipuji
|rowspan="2" align="center"|''[[Dear Nathan]]''
|{{nom}}
|align="center"|<ref>{{Cite news|first=Mitra|last=Tarigan|date=22 October 2017|title=Ini Pemenang Festival Film Bandung 2017|url=https://seleb.tempo.co/read/1026959/ini-pemenang-festival-film-bandung-2017|work=[[Tempo.co]]|access-date=12 August 2023|editor-last=Tarigan|editor-first=Mitra|language=id|archive-date=21 September 2022|archive-url=https://web.archive.org/web/20220921192142/https://seleb.tempo.co/read/1026959/ini-pemenang-festival-film-bandung-2017|url-status=live}}</ref><ref>{{cite web|title=Daftar Lengkap Pemenang Festival Film Bandung ke-30 Tahun 2017|url=https://www.festivalfilmbandung.com/2017/10/daftar-lengkap-pemenang-festival-film.html|first=|last=|date=|accessdate=|language=id|website=Festival Film Bandung|archive-date=2023-03-23|archive-url=https://web.archive.org/web/20230323051017/https://www.festivalfilmbandung.com/2017/10/daftar-lengkap-pemenang-festival-film.html|url-status=live}}</ref>
|-
|[[Anugerah Maya (Indonesia)|Anugerah Naya]]
|[[Anugerah Maya (Indonesia)#Kategori|Pengelulu Baru Pemadu Manah]]
|{{won}}
|align="center"|<ref>{{Cite web|last=Aldida|first=Vania Ika|date=18 December 2017|title=Daftar Lengkap Pemenang Piala Maya 2017|url=https://celebrity.okezone.com/read/2017/12/17/206/1831826/daftar-lengkap-pemenang-piala-maya-2017|website=[[Okezone]]|language=id-ID|access-date=13 August 2023|archive-date=28 April 2023|archive-url=https://web.archive.org/web/20230428205923/https://celebrity.okezone.com/read/2017/12/17/206/1831826/daftar-lengkap-pemenang-piala-maya-2017|url-status=live}}</ref>
|-
|2018
|Anugerah Filem Box Office Indonesia
|Midul Mas (enggau [[Amanda Rawles]])
|align="center"|''Jailangkung''
|{{won}}
|
|-
|2019
|Anugerah Maya
|Pengelulu Pemadu Manah ungkup Watak Sukung
|rowspan="2" align="center"|''Habibie & Ainun 3''
|{{nom}}
|align="center"|<ref>{{Cite news|url=https://www.cnnindonesia.com/hiburan/20200123150737-220-468045/daftar-nominasi-piala-maya-2020|title=Daftar Nominasi Piala Maya 2020|date=23 January 2020|accessdate=4 August 2023|work=[[CNN Indonesia]]|language=id|archive-date=6 July 2022|archive-url=https://web.archive.org/web/20220706223415/https://www.cnnindonesia.com/hiburan/20200123150737-220-468045/daftar-nominasi-piala-maya-2020|url-status=live}}</ref><ref>{{cite web|url=https://kumparan.com/kumparanhits/film-dua-garis-biru-raih-4-penghargaan-di-piala-maya-8-1snw3bq643X|title=Film Dua Garis Biru Raih 4 Penghargaan di Piala Maya 8|date=9 February 2023|accessdate=9 August 2023|work=Kumparan|language=id|archive-date=15 January 2022|archive-url=https://web.archive.org/web/20220115062725/https://kumparan.com/kumparanhits/film-dua-garis-biru-raih-4-penghargaan-di-piala-maya-8-1snw3bq643X|url-status=live}}</ref>
|-
|2020
|Festival Filem Bandung
|Pengelulu Sukung Dipuji
|{{won}}
|align="center"|<ref>{{Cite news|url= https://www.kompas.com/hype/read/2020/09/10/090717266/daftar-lengkap-nominasi-film-dan-narafilm-festival-film-bandung-2020|title= Daftar Lengkap Nominasi Film dan Narafilm Festival Film Bandung 2020|work= [[Kompas.com]]|access-date= 17 August 2023|last= Susanti|first= Reni|editor-last= Setuningsih|editor-first= Novianti|language= id|archive-date= 25 October 2020|archive-url= https://web.archive.org/web/20201025093153/https://www.kompas.com/hype/read/2020/09/10/090717266/daftar-lengkap-nominasi-film-dan-narafilm-festival-film-bandung-2020|url-status= live}}</ref><ref>{{cite web|title=Daftar Lengkap Pemenang Festival Film Bandung ke-33 Tahun 2020|url=https://www.festivalfilmbandung.com/2020/12/pemenang-festival-film-bandung-2020.html?m=1|first=|last=|date=|website=Festival Film Bandung|publisher=Forum Film Bandung|language=id|accessdate=6 August 2023|archive-date=10 December 2022|archive-url=https://web.archive.org/web/20221210143250/https://www.festivalfilmbandung.com/2020/12/pemenang-festival-film-bandung-2020.html?m=1|url-status=live}}</ref>
|-
|2021
|[[Festival Filem Indonesia]]
|[[Anugerah Citra ungkup Pengelulu Pemadu Manah|Pengelulu Pemadu Manah]]
|rowspan="2" align="center" |''[[Jakarta, City of Dreamers]]''
|rowspan="2" {{nom}}
|align="center"|
|-
|rowspan="4"|2022
|Indonesian Journalist Film Festival
|Best Actor – Drama
|align="center"|
|-
|[[Anugerah Televisyen Asia]]
|[[Anugerah Televisyen Asia#Kategori Digital|Pemerindang Tuai Laki Pemadu Manah – Digital]]
|align="center"|''At Stake: the Series''
|{{nom}}
|align="center"|
|-
|rowspan="2"|Anugerah Pengelulu Filem Indonesia
|Pengelulu Sukung Pemadu Manah
|rowspan="2" align="center"|''[[Aum!]]''
|rowspan="2" {{nom}}
|rowspan="2" align="center"|
|-
|Pengelulu Sukung Pemadu Dikerindu
|}
== Kereban sanding ==
{{reflist}}
== Laman web ke bukai ==
* {{IMDb name|8758347}}
* {{instagram|jefrinichol}}
[[Kategori:Pengada 1999]]
[[Kategori:Orang idup]]
[[Kategori:Pengelulu laku Indonesia kurun ke-21]]
eilyrnrs9p0b32vt1trym56tv6irnon
Gibrael Mawat
0
6677
19279
2026-06-10T10:38:09Z
Song GK
9
Song GK telah memindahkan laman [[Gibrael Mawat]] ke [[Mawat]]
19279
wikitext
text/x-wiki
#LENCONG [[Mawat]]
t010dnsk99wsamheqy2ut7s34disgid