Sətir 1: |
Sətir 1: |
| + | |
| + | local cs1 ={}; |
| | | |
| --[[--------------------------< F O R W A R D D E C L A R A T I O N S >-------------------------------------- | | --[[--------------------------< F O R W A R D D E C L A R A T I O N S >-------------------------------------- |
Sətir 7: |
Sətir 9: |
| | | |
| local is_set, in_array, substitute, error_comment, set_error, select_one, -- functions in Module:Citation/CS1/Utilities | | local is_set, in_array, substitute, error_comment, set_error, select_one, -- functions in Module:Citation/CS1/Utilities |
− | add_maint_cat, wrap_style, safe_for_italics, is_wikilink, make_wikilink, | + | add_maint_cat, wrap_style, safe_for_italics, is_wikilink, make_wikilink; |
− | strip_apostrophe_markup;
| |
| | | |
| local z ={}; -- tables in Module:Citation/CS1/Utilities | | local z ={}; -- tables in Module:Citation/CS1/Utilities |
Sətir 68: |
Sətir 69: |
| | | |
| local function add_prop_cat (key, arguments) | | local function add_prop_cat (key, arguments) |
| + | --[[ отключено для рувики |
| if not added_prop_cats [key] then | | if not added_prop_cats [key] then |
| added_prop_cats [key] = true; -- note that we've added this category | | added_prop_cats [key] = true; -- note that we've added this category |
| key = key:gsub ('(foreign_lang_source_?2?)%a%a%a?', '%1'); -- strip lang code from keyname | | key = key:gsub ('(foreign_lang_source_?2?)%a%a%a?', '%1'); -- strip lang code from keyname |
− | table.insert( z.properties_cats, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table | + | table.insert( z.properties_cats, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table |
| end | | end |
| + | ]] |
| end | | end |
| | | |
Sətir 132: |
Sətir 135: |
| the first character of the whole domain name including subdomains must be a letter or a digit | | the first character of the whole domain name including subdomains must be a letter or a digit |
| internationalized domain name (ascii characters with .xn-- ASCII Compatible Encoding (ACE) prefix xn-- in the tld) see https://tools.ietf.org/html/rfc3490 | | internationalized domain name (ascii characters with .xn-- ASCII Compatible Encoding (ACE) prefix xn-- in the tld) see https://tools.ietf.org/html/rfc3490 |
− | single-letter/digit second-level domains in the .org, .cash, and .today TLDs | + | single-letter/digit second-level domains in the .org and .cash TLDs |
| q, x, and z SL domains in the .com TLD | | q, x, and z SL domains in the .com TLD |
| i and q SL domains in the .net TLD | | i and q SL domains in the .net TLD |
Sətir 151: |
Sətir 154: |
| domain = domain:gsub ('^//', ''); -- strip '//' from domain name if present; done here so we only have to do it once | | domain = domain:gsub ('^//', ''); -- strip '//' from domain name if present; done here so we only have to do it once |
| | | |
− | if not domain:match ('^[%w]') then -- first character must be letter or digit | + | if not domain:match ('^[%a%d]') then -- first character must be letter or digit |
| return false; | | return false; |
| end | | end |
− | | + | -- Do most common case first |
− | if domain:match ('^%a+:') then -- hack to detect things that look like s:Page:Title where Page: is namespace at wikisource | + | if domain:match ('%f[%a%d][%a%d][%a%d%-]+[%a%d]%.%a%a+$') then -- three or more character hostname.hostname or hostname.tld |
| + | return true; |
| + | elseif domain:match ('%f[%a%d][%a%d][%a%d%-]+[%a%d]%.xn%-%-[%a%d]+$') then -- internationalized domain name with ACE prefix |
| + | return true; |
| + | elseif domain:match ('%f[%a%d][%a%d]%.cash$') then -- one character/digit .cash hostname |
| + | return true; |
| + | elseif domain:match ('%f[%a%d][%a%d]%.org$') then -- one character/digit .org hostname |
| + | return true; |
| + | elseif domain:match ('%f[%a][qxz]%.com$') then -- assigned one character .com hostname (x.com times out 2015-12-10) |
| + | return true; |
| + | elseif domain:match ('%f[%a][iq]%.net$') then -- assigned one character .net hostname (q.net registered but not active 2015-12-10) |
| + | return true; |
| + | elseif domain:match ('%f[%a%d][%a%d]%.%a%a$') then -- one character hostname and cctld (2 chars) |
| + | return true; |
| + | elseif domain:match ('%f[%a%d][%a%d][%a%d]%.%a%a+$') then -- two character hostname and tld |
| + | return true; |
| + | elseif domain:match ('^%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?') then -- IPv4 address |
| + | return true; |
| + | else |
| return false; | | return false; |
| end | | end |
− |
| |
− | local patterns = { -- patterns that look like urls
| |
− | '%f[%w][%w][%w%-]+[%w]%.%a%a+$', -- three or more character hostname.hostname or hostname.tld
| |
− | '%f[%w][%w][%w%-]+[%w]%.xn%-%-[%w]+$', -- internationalized domain name with ACE prefix
| |
− | '%f[%a][qxz]%.com$', -- assigned one character .com hostname (x.com times out 2015-12-10)
| |
− | '%f[%a][iq]%.net$', -- assigned one character .net hostname (q.net registered but not active 2015-12-10)
| |
− | '%f[%w][%w]%.%a%a$', -- one character hostname and cctld (2 chars)
| |
− | '%f[%w][%w][%w]%.%a%a+$', -- two character hostname and tld
| |
− | '^%d%d?%d?%.%d%d?%d?%.%d%d?%d?%.%d%d?%d?', -- IPv4 address
| |
− | }
| |
− |
| |
− | for _, pattern in ipairs (patterns) do -- loop through the patterns list
| |
− | if domain:match (pattern) then
| |
− | return true; -- if a match then we think that this thing that purports to be a url is a url
| |
− | end
| |
− | end
| |
− |
| |
− | for _, d in ipairs ({'cash', 'company', 'today', 'org'}) do -- look for single letter second level domain names for these top level domains
| |
− | if domain:match ('%f[%w][%w]%.' .. d) then
| |
− | return true
| |
− | end
| |
− | end
| |
− | return false; -- no matches, we don't know what this thing is
| |
| end | | end |
| | | |
Sətir 367: |
Sətir 365: |
| error_message=error_message .. "|" .. k .. "="; -- add the failed parameter | | error_message=error_message .. "|" .. k .. "="; -- add the failed parameter |
| end | | end |
| + | end |
| + | if is_set (error_message) then -- done looping, if there is an error message, display it |
| + | table.insert( z.message_tail, { set_error( 'param_has_ext_link', {error_message}, true ) } ); |
| end | | end |
| end | | end |
Sətir 379: |
Sətir 380: |
| local function safe_for_url( str ) | | local function safe_for_url( str ) |
| if str:match( "%[%[.-%]%]" ) ~= nil then | | if str:match( "%[%[.-%]%]" ) ~= nil then |
| + | table.insert( z.message_tail, { set_error( 'wikilink_in_url', {}, true ) } ); |
| end | | end |
| | | |
Sətir 399: |
Sətir 401: |
| local path; | | local path; |
| local base_url; | | local base_url; |
− | | + | |
| if not is_set( label ) then | | if not is_set( label ) then |
| label = URL; | | label = URL; |
Sətir 419: |
Sətir 421: |
| | | |
| base_url = table.concat({ "[", URL, " ", safe_for_url (label), "]" }); -- assemble a wikimarkup url | | base_url = table.concat({ "[", URL, " ", safe_for_url (label), "]" }); -- assemble a wikimarkup url |
− | | + | |
| if is_set (access) then -- access level (subscription, registration, limited) | | if is_set (access) then -- access level (subscription, registration, limited) |
| base_url = substitute (cfg.presentation['ext-link-access-signal'], {cfg.presentation[access].class, cfg.presentation[access].title, base_url}); -- add the appropriate icon | | base_url = substitute (cfg.presentation['ext-link-access-signal'], {cfg.presentation[access].class, cfg.presentation[access].title, base_url}); -- add the appropriate icon |
Sətir 441: |
Sətir 443: |
| if not added_deprecated_cat then | | if not added_deprecated_cat then |
| added_deprecated_cat = true; -- note that we've added this category | | added_deprecated_cat = true; -- note that we've added this category |
| + | table.insert( z.message_tail, { set_error( 'deprecated_params', {name}, true ) } ); -- add error message |
| end | | end |
| end | | end |
Sətir 522: |
Sətir 525: |
| is not added. At this time there is no error message for this condition. | | is not added. At this time there is no error message for this condition. |
| | | |
− | Supports |script-title=, |script-chapter=, |script-<periodical>= | + | Supports |script-title= and |script-chapter= |
| | | |
| + | TODO: error messages when prefix is invalid ISO639-1 code; when script_value has prefix but no script; |
| ]] | | ]] |
| | | |
− | local function format_script_value (script_value, script_param) | + | local function format_script_value (script_value) |
| local lang=''; -- initialize to empty string | | local lang=''; -- initialize to empty string |
| local name; | | local name; |
Sətir 532: |
Sətir 536: |
| lang = script_value:match('^(%l%l)%s*:%s*%S.*'); -- get the language prefix or nil if there is no script | | lang = script_value:match('^(%l%l)%s*:%s*%S.*'); -- get the language prefix or nil if there is no script |
| if not is_set (lang) then | | if not is_set (lang) then |
− | table.insert( z.message_tail, { set_error( 'script_parameter', {script_param, 'missing title part'}, true ) } ); -- prefix without 'title'; add error message
| |
| return ''; -- script_value was just the prefix so return empty string | | return ''; -- script_value was just the prefix so return empty string |
| end | | end |
Sətir 540: |
Sətir 543: |
| script_value = script_value:gsub ('^%l%l%s*:%s*', ''); -- strip prefix from script | | script_value = script_value:gsub ('^%l%l%s*:%s*', ''); -- strip prefix from script |
| -- is prefix one of these language codes? | | -- is prefix one of these language codes? |
| + | if in_array (lang, cfg.script_lang_codes) then |
| + | add_prop_cat ('script_with_name', {name, lang}) |
| + | else |
| + | add_prop_cat ('script') |
| + | end |
| lang = ' lang="' .. lang .. '" '; -- convert prefix into a lang attribute | | lang = ' lang="' .. lang .. '" '; -- convert prefix into a lang attribute |
| else | | else |
− | table.insert( z.message_tail, { set_error( 'script_parameter', {script_param, 'invalid language code'}, true ) } ); -- invalid language code; add error message
| |
| lang = ''; -- invalid so set lang to empty string | | lang = ''; -- invalid so set lang to empty string |
| end | | end |
− | else
| |
− | table.insert( z.message_tail, { set_error( 'script_parameter', {script_param, 'missing prefix'}, true ) } ); -- no language code prefix; add error message
| |
| end | | end |
| script_value = substitute (cfg.presentation['bdi'], {lang, script_value}); -- isolate in case script is rtl | | script_value = substitute (cfg.presentation['bdi'], {lang, script_value}); -- isolate in case script is rtl |
Sətir 560: |
Sətir 565: |
| ]] | | ]] |
| | | |
− | local function script_concatenate (title, script, script_param) | + | local function script_concatenate (title, script) |
| if is_set (script) then | | if is_set (script) then |
− | script = format_script_value (script, script_param); -- <bdi> tags, lang atribute, categorization, etc; returns empty string on error | + | script = format_script_value (script); -- <bdi> tags, lang atribute, categorization, etc; returns empty string on error |
| if is_set (script) then | | if is_set (script) then |
| title = title .. ' ' .. script; -- concatenate title and script title | | title = title .. ' ' .. script; -- concatenate title and script title |
Sətir 586: |
Sətir 591: |
| local msg; | | local msg; |
| msg = cfg.messages[key]:lower(); -- set the message to lower case before | | msg = cfg.messages[key]:lower(); -- set the message to lower case before |
− | return substitute( msg, str ); -- including template text | + | return substitute( msg, str ); -- including template text |
| else | | else |
| return substitute( cfg.messages[key], str ); | | return substitute( cfg.messages[key], str ); |
Sətir 593: |
Sətir 598: |
| | | |
| | | |
− | --[[--------------------------< W I K I S O U R C E _ U R L _ M A K E >---------------------------------------- | + | --[[--------------------------< F O R M A T _ C H A P T E R _ T I T L E >-------------------------------------- |
| | | |
− | makes a wikisource url from wikisource interwiki link. returns the url and appropriate label; nil else.
| + | Format the four chapter parameters: |script-chapter=, |chapter=, |trans-chapter=, and |chapter-url= into a single Chapter meta- |
− | | + | parameter (chapter_url_source used for error messages). |
− | str is the value assigned to |chapter= (or aliases) or |title= or |title-link=
| |
| | | |
| ]] | | ]] |
| | | |
− | local function wikisource_url_make (str)
| + | local function format_chapter_title (scriptchapter, chapter, transchapter, chapterurl, chapter_url_source, no_quotes, access) |
− | local wl_type, D, L;
| + | local chapter_error = ''; |
− | local ws_url, ws_label;
| + | |
− | | + | if not is_set (chapter) then |
− | wl_type, D, L = is_wikilink (str); -- wl_type is 0 (not a wikilink), 1 (simple wikilink), 2 (complex wikilink)
| |
− | | |
− | if 0 == wl_type then -- not a wikilink; might be from |title-link=
| |
− | str = D:match ('^[Ww]ikisource:(.+)') or D:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
| |
− | if is_set (str) then
| |
− | ws_url = table.concat ({ -- build a wikisource url
| |
− | 'https://en.wikisource.org/wiki/', -- prefix
| |
− | str, -- article title
| |
− | });
| |
− | ws_label = str; -- label for the url
| |
− | end
| |
− | elseif 1 == wl_type then -- simple wikilink: [[Wikisource:ws article]]
| |
− | str = D:match ('^[Ww]ikisource:(.+)') or D:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
| |
− | if is_set (str) then
| |
− | ws_url = table.concat ({ -- build a wikisource url
| |
− | 'https://en.wikisource.org/wiki/', -- prefix
| |
− | str, -- article title
| |
− | });
| |
− | ws_label = str; -- label for the url
| |
− | end
| |
− | elseif 2 == wl_type then -- non-so-simple wikilink: [[Wikisource:ws article|displayed text]] ([[L|D]])
| |
− | str = L:match ('^[Ww]ikisource:(.+)') or L:match ('^[Ss]:(.+)'); -- article title from interwiki link with long-form or short-form namespace
| |
− | if is_set (str) then
| |
− | ws_label = D; -- get ws article name from display portion of interwiki link
| |
− | ws_url = table.concat ({ -- build a wikisource url
| |
− | 'https://en.wikisource.org/wiki/', -- prefix
| |
− | str, -- article title without namespace from link portion of wikilink
| |
− | });
| |
− | end
| |
− | end
| |
− |
| |
− | if ws_url then
| |
− | ws_url = mw.uri.encode (ws_url, 'WIKI'); -- make a usable url
| |
− | ws_url = ws_url:gsub ('%%23', '#'); -- undo percent encoding of anchor
| |
− | end
| |
− | | |
− | return ws_url, ws_label, L or D; -- return proper url or nil and a label or nil
| |
− | end
| |
− | | |
− | | |
− | --[[--------------------------< F O R M A T _ P E R I O D I C A L >--------------------------------------------
| |
− | | |
− | Format the four periodical parameters: |script-<periodical>=, |<periodical>=, and |trans-<periodical>= into a single Periodical meta-
| |
− | parameter.
| |
− | | |
− | ]]
| |
− | | |
− | local function format_periodical (script_periodical, script_periodical_source, periodical, trans_periodical)
| |
− | local periodical_error = '';
| |
− | | |
− | if not is_set (periodical) then
| |
− | periodical = ''; -- to be safe for concatenation
| |
− | else
| |
− | periodical = wrap_style ('italic-title', periodical); -- style
| |
− | end
| |
− | | |
− | periodical = script_concatenate (periodical, script_periodical, script_periodical_source); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped
| |
− | | |
− | if is_set (trans_periodical) then
| |
− | trans_periodical = wrap_style ('trans-italic-title', trans_periodical);
| |
− | if is_set (periodical) then
| |
− | periodical = periodical .. ' ' .. trans_periodical;
| |
− | else -- here when transchapter without chapter or script-chapter
| |
− | periodical = trans_periodical;
| |
− | periodical_error = ' ' .. set_error ('trans_missing_title', {'periodical'});
| |
− | end
| |
− | end
| |
− | | |
− | return periodical .. periodical_error;
| |
− | end
| |
− | | |
− | | |
− | --[[--------------------------< F O R M A T _ C H A P T E R _ T I T L E >--------------------------------------
| |
− | | |
− | Format the four chapter parameters: |script-chapter=, |chapter=, |trans-chapter=, and |chapter-url= into a single Chapter meta-
| |
− | parameter (chapter_url_source used for error messages).
| |
− | | |
− | ]]
| |
− | | |
− | local function format_chapter_title (scriptchapter, script_chapter_source, chapter, transchapter, chapterurl, chapter_url_source, no_quotes, access) | |
− | local chapter_error = ''; | |
− | | |
− | local ws_url, ws_label, L = wikisource_url_make (chapter); -- make a wikisource url and label from a wikisource interwiki link | |
− | if ws_url then
| |
− | ws_label = ws_label:gsub ('_', ''); -- replace underscore separaters with space characters
| |
− | chapter = ws_label;
| |
− | end
| |
− | | |
− | if not is_set (chapter) then | |
| chapter = ''; -- to be safe for concatenation | | chapter = ''; -- to be safe for concatenation |
| else | | else |
Sətir 702: |
Sətir 617: |
| end | | end |
| | | |
− | chapter = script_concatenate (chapter, scriptchapter, script_chapter_source); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped | + | chapter = script_concatenate (chapter, scriptchapter) -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped |
| | | |
| if is_set (chapterurl) then | | if is_set (chapterurl) then |
− | chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate | + | chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate |
− | elseif ws_url then | |
− | chapter = external_link (ws_url, chapter .. ' ', 'ws link in chapter'); -- adds bare_url_missing_title error if appropriate; space char to move icon away from chap text; TODO: better way to do this?
| |
− | chapter = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, chapter});
| |
| end | | end |
| | | |
Sətir 716: |
Sətir 628: |
| chapter = chapter .. ' ' .. transchapter; | | chapter = chapter .. ' ' .. transchapter; |
| else -- here when transchapter without chapter or script-chapter | | else -- here when transchapter without chapter or script-chapter |
− | chapter = transchapter; | + | chapter = transchapter; -- |
| chapter_error = ' ' .. set_error ('trans_missing_title', {'chapter'}); | | chapter_error = ' ' .. set_error ('trans_missing_title', {'chapter'}); |
| end | | end |
Sətir 722: |
Sətir 634: |
| | | |
| -- if is_set (chapterurl) then | | -- if is_set (chapterurl) then |
− | -- chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate | + | -- chapter = external_link (chapterurl, chapter, chapter_url_source, access); -- adds bare_url_missing_title error if appropriate |
| -- end | | -- end |
| | | |
Sətir 738: |
Sətir 650: |
| Detects but ignores nowiki and math stripmarkers. Also detects other named stripmarkers (gallery, math, pre, ref) | | Detects but ignores nowiki and math stripmarkers. Also detects other named stripmarkers (gallery, math, pre, ref) |
| and identifies them with a slightly different error message. See also coins_cleanup(). | | and identifies them with a slightly different error message. See also coins_cleanup(). |
| + | |
| + | Detects but ignores the character pattern that results from the transclusion of {{'}} templates. |
| | | |
| Output of this function is an error message that identifies the character or the Unicode group, or the stripmarker | | Output of this function is an error message that identifies the character or the Unicode group, or the stripmarker |
Sətir 777: |
Sətir 691: |
| local err_msg; | | local err_msg; |
| if capture then | | if capture then |
− | err_msg = capture .. ' ' .. char; | + | err_msg = capture .. ' ' .. char; -- для рувики: TODO: не согласуется? |
| else | | else |
− | err_msg = char .. ' ' .. 'character'; | + | err_msg = 'Символ' .. ' ' .. char; -- для рувики |
| end | | end |
| | | |
Sətir 825: |
Sətir 739: |
| -- maybe let through instead of raising an error? | | -- maybe let through instead of raising an error? |
| -- v, origin[k] = args[k], k; | | -- v, origin[k] = args[k], k; |
− | error( cfg.messages['unknown_argument_map'] .. ': ' .. k); | + | error( cfg.messages['unknown_argument_map'] ); |
| end | | end |
| | | |
Sətir 910: |
Sətir 824: |
| return str; -- nothing to do, we're done | | return str; -- nothing to do, we're done |
| end | | end |
− |
| |
− | str = str:gsub ('&[nm]dash;', {['–'] = '–', ['—'] = '—'}); -- replace — and – entities with their characters; semicolon mucks up the text.split
| |
| | | |
| local out = {}; | | local out = {}; |
Sətir 924: |
Sətir 836: |
| item:match ('%a+%s*%-%s*%a+') then -- letter hyphen letter | | item:match ('%a+%s*%-%s*%a+') then -- letter hyphen letter |
| item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2'); -- replace hyphen, remove extraneous space characters | | item = item:gsub ('(%w*[%.%-]?%w+)%s*%-%s*(%w*[%.%-]?%w+)', '%1–%2'); -- replace hyphen, remove extraneous space characters |
− | else | + | else -- для рувики: всё наоборот |
− | item = mw.ustring.gsub (item, '%s*[–—]%s*', '–'); -- for endash or emdash separated ranges, replace em with en, remove extraneous white space | + | item = mw.ustring.gsub (item, '%s*[–—]%s*', '—'); -- for endash or emdash separated ranges, replace em with en, remove extraneous white space |
| end | | end |
| end | | end |
Sətir 1.064: |
Sətir 976: |
| | | |
| local function is_good_vanc_name (last, first) | | local function is_good_vanc_name (last, first) |
− | local first, suffix = first:match ('(.-),?%s*([%dJS][%drndth]+)%.?$') or first; -- if first has something that looks like a generational suffix, get it | + | local first, suffix = first:match ('(.-),?%s*([%dJS][%drndth]+)%.?$') or first; -- if first has something that looks like a generational suffix, get it |
| | | |
| if is_set (suffix) then | | if is_set (suffix) then |
Sətir 1.205: |
Sətir 1.117: |
| if count > 0 then | | if count > 0 then |
| if count > 1 and is_set(lastauthoramp) and not etal then | | if count > 1 and is_set(lastauthoramp) and not etal then |
− | text[#text-2] = ", "; -- replace last separator with ampersand text | + | text[#text-2] = " & "; -- replace last separator with ampersand text |
| end | | end |
| text[#text] = nil; -- erase the last separator | | text[#text] = nil; -- erase the last separator |
Sətir 1.244: |
Sətir 1.156: |
| --[[--------------------------< N A M E _ H A S _ E T A L >---------------------------------------------------- | | --[[--------------------------< N A M E _ H A S _ E T A L >---------------------------------------------------- |
| | | |
− | Evaluates the content of name parameters (author, editor, etc) for variations on the theme of et al. If found, | + | Evaluates the content of author and editor name parameters for variations on the theme of et al. If found, |
| the et al. is removed, a flag is set to true and the function returns the modified name and the flag. | | the et al. is removed, a flag is set to true and the function returns the modified name and the flag. |
| | | |
| This function never sets the flag to false but returns it's previous state because it may have been set by | | This function never sets the flag to false but returns it's previous state because it may have been set by |
− | previous passes through this function or by the associated |display-<names>=etal parameter | + | previous passes through this function or by the parameters |display-authors=etal or |display-editors=etal |
| | | |
| ]] | | ]] |
| | | |
− | local function name_has_etal (name, etal, nocat, param) | + | local function name_has_etal (name, etal, nocat) |
| | | |
| if is_set (name) then -- name can be nil in which case just return | | if is_set (name) then -- name can be nil in which case just return |
− | local patterns = cfg.et_al_patterns; --get patterns from configuration | + | local etal_pattern = "[;,]? *[\"']*%f[%a][Ee][Tt] *[Aa][Ll][%.\"']*$" -- variations on the 'et al' theme |
| + | local others_pattern = "[;,]? *%f[%a]and [Oo]thers"; -- and alternate to et al. |
| | | |
− | for _, pattern in ipairs (patterns) do -- loop through all of the patterns | + | if name:match (etal_pattern) then -- variants on et al. |
− | if name:match (pattern) then -- if this 'et al' pattern is found in name | + | name = name:gsub (etal_pattern, ''); -- if found, remove |
− | name = name:gsub (pattern, ''); -- remove the offending text
| + | etal = true; -- set flag (may have been set previously here or by |display-authors=etal) |
− | etal = true; -- set flag (may have been set previously here or by |display-<names>=etal)
| + | if not nocat then -- no categorization for |vauthors= |
− | if not nocat then -- no categorization for |vauthors=
| + | add_maint_cat ('etal'); -- and add a category if not already added |
− | table.insert( z.message_tail, {set_error ('etal', {param})}); -- and set an error if not added
| + | end |
− | end
| + | elseif name:match (others_pattern) then -- if not 'et al.', then 'and others'? |
| + | name = name:gsub (others_pattern, ''); -- if found, remove |
| + | etal = true; -- set flag (may have been set previously here or by |display-authors=etal) |
| + | if not nocat then -- no categorization for |vauthors= |
| + | add_maint_cat ('etal'); -- and add a category if not already added |
| end | | end |
| end | | end |
| end | | end |
− |
| |
| return name, etal; -- | | return name, etal; -- |
| end | | end |
Sətir 1.282: |
Sətir 1.198: |
| local function name_has_ed_markup (name, list_name) | | local function name_has_ed_markup (name, list_name) |
| local _, pattern; | | local _, pattern; |
− | local patterns = cfg.editor_markup_patterns; -- get patterns from configuration | + | local patterns = { -- these patterns match annotations at end of name |
| + | '%f[%(%[][%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]?$', -- (ed) or (eds): leading '(', case insensitive 'ed', optional 's', '.' and/or ')' |
| + | '[,%.%s]%f[e]eds?%.?$', -- ed or eds: without '('or ')'; case sensitive (ED could be initials Ed could be name) |
| + | '%f[%(%[][%(%[]%s*[Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%.?%s*[%)%]]?$', -- (editor) or (editors): leading '(', case insensitive, optional '.' and/or ')' |
| + | '[,%.%s]%f[Ee][Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%.?$', -- editor or editors: without '('or ')'; case insensitive |
| + | |
| + | -- these patterns match annotations at beginning of name |
| + | '^eds?[%.,;]', -- ed. or eds.: lower case only, optional 's', requires '.' |
| + | '^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', -- (ed) or (eds): also sqare brackets, case insensitive, optional 's', '.' |
| + | '^[%(%[]?%s*[Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%A', -- (editor or (editors: also sq brackets, case insensitive, optional brackets, 's' |
| + | '^[%(%[]?%s*[Ee][Dd][Ii][Tt][Ee][Dd]%A', -- (edited: also sq brackets, case insensitive, optional brackets |
| + | } |
| | | |
| if is_set (name) then | | if is_set (name) then |
Sətir 1.308: |
Sətir 1.235: |
| if is_set (name) then | | if is_set (name) then |
| _, count = name:gsub ('[;,]', ''); -- count the number of separator-like characters | | _, count = name:gsub ('[;,]', ''); -- count the number of separator-like characters |
| + | |
| + | if 1 < count then -- param could be |author= or |editor= so one separator character is acceptable |
| + | add_maint_cat ('mult_names', cfg.special_case_translation [list_name]); -- more than one separator indicates multiple names so add a maint cat for this template |
| + | end |
| end | | end |
| return name; -- and done | | return name; -- and done |
Sətir 1.366: |
Sətir 1.297: |
| local etal=false; -- return value set to true when we find some form of et al. in an author parameter | | local etal=false; -- return value set to true when we find some form of et al. in an author parameter |
| | | |
− | local last_alias, first_alias; -- selected parameter aliases used in error messaging | + | local err_msg_list_name = list_name:match ("(%w+)List") .. 's list'; -- modify AuthorList or EditorList for use in error messages if necessary |
| while true do | | while true do |
− | last, last_alias = select_one( args, cfg.aliases[list_name .. '-Last'], 'redundant_parameters', i ); -- search through args for name components beginning at 1 | + | last = select_one( args, cfg.aliases[list_name .. '-Last'], 'redundant_parameters', i ); -- search through args for name components beginning at 1 |
− | first, first_alias = select_one( args, cfg.aliases[list_name .. '-First'], 'redundant_parameters', i ); | + | first = select_one( args, cfg.aliases[list_name .. '-First'], 'redundant_parameters', i ); |
| link = select_one( args, cfg.aliases[list_name .. '-Link'], 'redundant_parameters', i ); | | link = select_one( args, cfg.aliases[list_name .. '-Link'], 'redundant_parameters', i ); |
| mask = select_one( args, cfg.aliases[list_name .. '-Mask'], 'redundant_parameters', i ); | | mask = select_one( args, cfg.aliases[list_name .. '-Mask'], 'redundant_parameters', i ); |
| | | |
− | last, etal = name_has_etal (last, etal, false, last_alias); -- find and remove variations on et al. | + | last, etal = name_has_etal (last, etal, false); -- find and remove variations on et al. |
− | first, etal = name_has_etal (first, etal, false, first_alias); -- find and remove variations on et al. | + | first, etal = name_has_etal (first, etal, false); -- find and remove variations on et al. |
| last, first= name_checks (last, first, list_name); -- multiple names, extraneous annotation, etc checks | | last, first= name_checks (last, first, list_name); -- multiple names, extraneous annotation, etc checks |
| | | |
| if first and not last then -- if there is a firstn without a matching lastn | | if first and not last then -- if there is a firstn without a matching lastn |
− | table.insert( z.message_tail, { set_error( 'first_missing_last', {first_alias, first_alias:gsub('first', 'last')}, true ) } ); -- add this error message | + | table.insert( z.message_tail, { set_error( 'first_missing_last', {err_msg_list_name, i}, true ) } ); -- add this error message |
| elseif not first and not last then -- if both firstn and lastn aren't found, are we done? | | elseif not first and not last then -- if both firstn and lastn aren't found, are we done? |
| count = count + 1; -- number of times we haven't found last and first | | count = count + 1; -- number of times we haven't found last and first |
Sətir 1.390: |
Sətir 1.321: |
| n = n + 1; -- point to next location in the names table | | n = n + 1; -- point to next location in the names table |
| if 1 == count then -- if the previous name was missing | | if 1 == count then -- if the previous name was missing |
− | table.insert( z.message_tail, { set_error( 'missing_name', {list_name:match ("(%w+)List"):lower(), i-1}, true ) } ); -- add this error message | + | table.insert( z.message_tail, { set_error( 'missing_name', {err_msg_list_name, i-1}, true ) } ); -- add this error message |
| end | | end |
| count = 0; -- reset the counter, we're looking for two consecutive missing names | | count = 0; -- reset the counter, we're looking for two consecutive missing names |
Sətir 1.413: |
Sətir 1.344: |
| extensions. For example, code 'cbk-zam' and its associated name 'Chavacano de Zamboanga' (MediaWiki does not support | | extensions. For example, code 'cbk-zam' and its associated name 'Chavacano de Zamboanga' (MediaWiki does not support |
| code 'cbk' or name 'Chavacano'. Most (all?) of these languages are not used a 'language' codes per se, rather they | | code 'cbk' or name 'Chavacano'. Most (all?) of these languages are not used a 'language' codes per se, rather they |
− | are used as sub-domain names: cbk-zam.wikipedia.org. A list of language names and codes supported by fetchLanguageNames() | + | are used as sub-domain names: cbk-zam.wikipedia.org. These names can be found (for the time being) at |
− | can be found at Template:Citation Style documentation/language/doc | + | https://phabricator.wikimedia.org/diffusion/ECLD/browse/master/LocalNames/LocalNamesEn.php |
| | | |
− | Names that are included in the list will be found if that name is provided in the |language= parameter. For example, | + | Names but that are included in the list will be found if that name is provided in the |language= parameter. For example, |
| if |language=Chavacano de Zamboanga, that name will be found with the associated code 'cbk-zam'. When names are found | | if |language=Chavacano de Zamboanga, that name will be found with the associated code 'cbk-zam'. When names are found |
− | and the associated code is not two or three characters, this function returns only the WikiMedia language name. | + | and the associated code is not two or three characters, this function returns only the Wikimedia language name. |
− | | |
− | Some language names have multiple entries under different codes:
| |
− | Aromanian has code rup and code roa-rup
| |
− | When this occurs, this function returns the language name and the 2- or 3-character code
| |
| | | |
| Adapted from code taken from Module:Check ISO 639-1. | | Adapted from code taken from Module:Check ISO 639-1. |
Sətir 1.433: |
Sətir 1.360: |
| end | | end |
| | | |
− | local ietf_code; -- because some languages have both ietf-like codes and iso 639-like codes
| |
− | local ietf_name;
| |
− |
| |
| local languages = mw.language.fetchLanguageNames(this_wiki_code, 'all') -- get a list of language names known to Wikimedia | | local languages = mw.language.fetchLanguageNames(this_wiki_code, 'all') -- get a list of language names known to Wikimedia |
| -- ('all' is required for North Ndebele, South Ndebele, and Ojibwa) | | -- ('all' is required for North Ndebele, South Ndebele, and Ojibwa) |
| local langlc = mw.ustring.lower(lang); -- lower case version for comparisons | | local langlc = mw.ustring.lower(lang); -- lower case version for comparisons |
− | | + | |
| for code, name in pairs(languages) do -- scan the list to see if we can find our language | | for code, name in pairs(languages) do -- scan the list to see if we can find our language |
| if langlc == mw.ustring.lower(name) then | | if langlc == mw.ustring.lower(name) then |
− | if 2 == code:len() or 3 == code:len() then -- two- or three-character codes only; extensions not supported | + | if 2 ~= code:len() and 3 ~= code:len() then -- two- or three-character codes only; extensions not supported |
− | return name, code; -- so return the name and the code | + | return name; -- so return the name but not the code |
| end | | end |
− | ietf_code = code; -- remember that we found an ietf-like code and save its name | + | return name, code; -- found it, return name to ensure proper capitalization and the the code |
− | ietf_name = name; -- but keep looking for a 2- or 3-char code
| |
| end | | end |
| end | | end |
− | -- didn't find name with 2- or 3-char code; if ietf-like code found return
| + | return lang; -- not valid language; return language in original case and nil for the code |
− | return ietf_code and ietf_name or lang; -- associated name; return original language text else | |
| end | | end |
| | | |
Sətir 1.484: |
Sətir 1.406: |
| | | |
| for _, lang in ipairs (names_table) do -- reuse lang | | for _, lang in ipairs (names_table) do -- reuse lang |
− | name = cfg.lang_code_remap[lang:lower()]; -- first see if this is a code that is not supported by MediaWiki but is in remap
| |
| | | |
− | if name then -- there was a remapped code so | + | if lang:match ('^%a%a%-') then -- strip ietf language tags from code; TODO: is there a need to support 3-char with tag? |
− | lang = lang:gsub ('^(%a%a%a?)%-.*', '%1'); -- strip ietf tags from code
| + | lang = lang:match ('(%a%a)%-') -- keep only 639-1 code portion to lang; TODO: do something with 3166 alpha 2 country code? |
− | else
| + | end |
− | if lang:match ('^%a%a%-') then -- strip ietf tags from code; TODO: is there a need to support 3-char with tag?
| + | |
− | lang = lang:match ('(%a%a)%-') -- keep only 639-1 code portion to lang; TODO: do something with 3166 alpha 2 country code?
| + | -- костыль для рувики: замена распространённых англоназваний на коды |
| + | local fromEnglishToCode = { |
| + | ['Arabic'] = 'ar', |
| + | ['Azerbaijani'] = 'az', |
| + | ['Belarusian'] = 'be', |
| + | ['Bulgarian'] = 'bg', |
| + | ['Czech'] = 'cs', |
| + | ['Danish'] = 'da', |
| + | ['German'] = 'de', |
| + | ['Greek'] = 'el', |
| + | ['Spanish'] = 'es', |
| + | ['English'] = 'en', |
| + | ['Finnish'] = 'fi', |
| + | ['French'] = 'fr', |
| + | ['Hebrew'] = 'he', |
| + | ['Croatian'] = 'hr', |
| + | ['Hungarian'] = 'hu', |
| + | ['Armenian'] = 'hy', |
| + | ['Indonesian'] = 'id', |
| + | ['Italian'] = 'it', |
| + | ['Japanese'] = 'ja', |
| + | ['Korean'] = 'ko', |
| + | ['Latin'] = 'la', |
| + | ['Dutch'] = 'nl', |
| + | ['Norwegian'] = 'no', |
| + | ['Polish'] = 'pl', |
| + | ['Portuguese'] = 'pt', |
| + | ['Romanian'] = 'ro', |
| + | ['Russian'] = 'ru', |
| + | ['Slovenian'] = 'sl', |
| + | ['Serbian'] = 'sr', |
| + | ['Swedish'] = 'sv', |
| + | ['Thai'] = 'th', |
| + | ['Turkish'] = 'tr', |
| + | ['Ukrainian'] = 'uk', |
| + | ['Chinese'] = 'zh', |
| + | } |
| + | if fromEnglishToCode[lang] then |
| + | lang = fromEnglishToCode[lang] |
| + | end |
| + | |
| + | if 2 == lang:len() or 3 == lang:len() then -- if two-or three-character code |
| + | -- для рувики: замена полного названия на сокращение вроде фр. или англ. |
| + | name = mw.getCurrentFrame():expandTemplate{ |
| + | title='lg', |
| + | args={lang} |
| + | } |
| + | if name == '' then |
| + | name = nil |
| end | | end |
− | if 2 == lang:len() or 3 == lang:len() then -- if two-or three-character code | + | if not is_set (name) then |
− | name = mw.language.fetchLanguageName (lang:lower(), this_wiki_code); -- get language name if |language= is a proper code | + | name = mw.language.fetchLanguageName( lang:lower(), this_wiki_code); -- get language name if |language= is a proper code |
| + | end |
| + | |
| + | if not is_set (name) then |
| + | name = cfg.lang_code_remap[lang]; -- not supported by MediaWiki; is it in remap? |
| end | | end |
| end | | end |
− | | + | |
| if is_set (name) then -- if |language= specified a valid code | | if is_set (name) then -- if |language= specified a valid code |
| code = lang:lower(); -- save it | | code = lang:lower(); -- save it |
Sətir 1.504: |
Sətir 1.477: |
| | | |
| if is_set (code) then -- only 2- or 3-character codes | | if is_set (code) then -- only 2- or 3-character codes |
− | name = cfg.lang_code_remap[code] or name; -- override wikimedia when they misuse language codes/names -- add maint category if not already added | + | name = cfg.lang_code_remap[code] or name; -- override wikimedia when they misuse language codes/names |
| + | |
| + | if this_wiki_code ~= code then -- when the language is not the same as this wiki's language |
| + | if 2 == code:len() then -- and is a two-character code |
| + | add_prop_cat ('foreign_lang_source' .. code, {name, code}) -- categorize it |
| + | else -- or is a recognized language (but has a three-character code) |
| + | add_prop_cat ('foreign_lang_source_2' .. code, {code}) -- categorize it differently TODO: support mutliple three-character code categories per cs1|2 template |
| + | end |
| + | end |
| + | else |
| + | add_maint_cat ('unknown_lang'); -- add maint category if not already added |
| end | | end |
| | | |
Sətir 1.513: |
Sətir 1.496: |
| code = #language_list -- reuse code as number of languages in the list | | code = #language_list -- reuse code as number of languages in the list |
| if 2 >= code then | | if 2 >= code then |
− | name = table.concat (language_list, cfg.messages['parameter-pair-separator']) -- insert '<space>and<space>' between two language names | + | name = table.concat (language_list, ' and ') -- insert '<space>and<space>' between two language names |
| elseif 2 < code then | | elseif 2 < code then |
− | name = table.concat (language_list, ', '); -- and concatenate with '<comma><space>' separators | + | language_list[code] = 'and ' .. language_list[code]; -- prepend last name with 'and<space>' |
− | name = name:gsub (', ([^,]+)$', cfg.messages['parameter-final-separator'] .. '%1'); -- replace last '<comma><space>' separator with '<comma><space>and<space>' separator | + | name = table.concat (language_list, ', ') -- and concatenate with '<comma><space>' separators |
| end | | end |
| if this_wiki_name == name then | | if this_wiki_name == name then |
Sətir 1.618: |
Sətir 1.601: |
| | | |
| local function is_pdf (url) | | local function is_pdf (url) |
− | return url:match ('%.pdf$') or url:match ('%.PDF$') or | + | return url:match ('%.pdf$') or url:match ('%.PDF$') or url:match ('%.pdf[%?#]') or url:match ('%.PDF[%?#]'); |
− | url:match ('%.pdf[%?#]') or url:match ('%.PDF[%?#]') or
| |
− | url:match ('%.PDF#') or url:match ('%.pdf#');
| |
| end | | end |
| | | |
Sətir 1.648: |
Sətir 1.629: |
| | | |
| | | |
− | --[[--------------------------< G E T _ D I S P L A Y _ N A M E S >-------------------------------------------- | + | --[[--------------------------< G E T _ D I S P L A Y _ A U T H O R S _ E D I T O R S >------------------------ |
| | | |
| Returns a number that defines the number of names displayed for author and editor name lists and a boolean flag | | Returns a number that defines the number of names displayed for author and editor name lists and a boolean flag |
Sətir 1.671: |
Sətir 1.652: |
| ]] | | ]] |
| | | |
− | local function get_display_names (max, count, list_name, etal) | + | local function get_display_authors_editors (max, count, list_name, etal) |
| if is_set (max) then | | if is_set (max) then |
| if 'etal' == max:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings | | if 'etal' == max:lower():gsub("[ '%.]", '') then -- the :gsub() portion makes 'etal' from a variety of 'et al.' spellings and stylings |
Sətir 1.678: |
Sətir 1.659: |
| elseif max:match ('^%d+$') then -- if is a string of numbers | | elseif max:match ('^%d+$') then -- if is a string of numbers |
| max = tonumber (max); -- make it a number | | max = tonumber (max); -- make it a number |
| + | if max >= count then -- if |display-xxxxors= value greater than or equal to number of authors/editors |
| + | add_maint_cat ('disp_auth_ed', cfg.special_case_translation [list_name]); |
| + | end |
| else -- not a valid keyword or number | | else -- not a valid keyword or number |
| table.insert( z.message_tail, { set_error( 'invalid_param_val', {'display-' .. list_name, max}, true ) } ); -- add error message | | table.insert( z.message_tail, { set_error( 'invalid_param_val', {'display-' .. list_name, max}, true ) } ); -- add error message |
Sətir 1.702: |
Sətir 1.686: |
| local good_pattern = '^P[^%.Pp]'; -- ok to begin with uppercase P: P7 (pg 7 of section P) but not p123 (page 123) TODO: add Gg for PG or Pg? | | local good_pattern = '^P[^%.Pp]'; -- ok to begin with uppercase P: P7 (pg 7 of section P) but not p123 (page 123) TODO: add Gg for PG or Pg? |
| local bad_pattern = '^[Pp]?[Pp]%.?[ %d]'; | | local bad_pattern = '^[Pp]?[Pp]%.?[ %d]'; |
| + | |
| + | if not page:match (good_pattern) and (page:match (bad_pattern) or page:match ('^[Pp]ages?')) then |
| + | add_maint_cat ('extra_text'); |
| + | end |
| end | | end |
| | | |
Sətir 1.773: |
Sətir 1.761: |
| | | |
| vparam, etal = name_has_etal (vparam, etal, true); -- find and remove variations on et al. do not categorize (do it here because et al. might have a period) | | vparam, etal = name_has_etal (vparam, etal, true); -- find and remove variations on et al. do not categorize (do it here because et al. might have a period) |
− | v_name_table = get_v_name_table (vparam, v_name_table, v_link_table); -- names are separated by commas | + | v_name_table = get_v_name_table (vparam, v_name_table, v_link_table); -- names are separated by commas |
| | | |
| for i, v_name in ipairs(v_name_table) do | | for i, v_name in ipairs(v_name_table) do |
Sətir 1.885: |
Sətir 1.873: |
| if not is_set (value) then | | if not is_set (value) then |
| return true; -- an empty parameter is ok | | return true; -- an empty parameter is ok |
− | elseif in_array (value, possible) then | + | elseif in_array(value:lower(), possible) then |
| return true; | | return true; |
| else | | else |
Sətir 1.936: |
Sətir 1.924: |
| end | | end |
| | | |
− | local vol = ''; -- here for all cites except magazine | + | local vol = ''; |
| | | |
| if is_set (volume) then | | if is_set (volume) then |
− | if volume:match ('^[MDCLXVI]+$') or volume:match ('^%d+$')then -- volume value is all digits or all uppercase roman numerals | + | if (4 < mw.ustring.len(volume)) then |
− | vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)}); -- render in bold face
| + | vol = substitute (cfg.messages['j-vol'], {sepc, volume}); |
− | elseif (4 < mw.ustring.len(volume)) then -- not all digits or roman numerals and longer than 4 characters
| + | else |
− | vol = substitute (cfg.messages['j-vol'], {sepc, volume}); -- not bold | + | vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)}); |
− | else -- four or less characters | |
− | vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)}); -- bold | |
| end | | end |
| end | | end |
Sətir 1.991: |
Sətir 1.977: |
| return substitute (cfg.messages['nopp'], {sepc, page}), '', '', ''; | | return substitute (cfg.messages['nopp'], {sepc, page}), '', '', ''; |
| end | | end |
− | end | + | elseif is_set(pages) then |
− | if is_set(pages) then
| |
| if is_journal then | | if is_journal then |
| return substitute (cfg.messages['j-page(s)'], pages), '', '', ''; | | return substitute (cfg.messages['j-page(s)'], pages), '', '', ''; |
− | elseif tonumber(pages) ~= nil and not nopp then -- if pages is only digits, assume a single page number | + | elseif tonumber(pages) ~= nil and not nopp then -- if pages is only digits, assume a single page number |
− | return '', substitute (cfg.messages['pp-suffix'], {sepc, pages}), '', ''; | + | return '', substitute (cfg.messages['p-prefix'], {sepc, pages}), '', ''; |
| elseif not nopp then | | elseif not nopp then |
− | return '', substitute (cfg.messages['pp-suffix'], {sepc, pages}), '', ''; | + | return '', substitute (cfg.messages['pp-prefix'], {sepc, pages}), '', ''; |
| else | | else |
| return '', substitute (cfg.messages['nopp'], {sepc, pages}), '', ''; | | return '', substitute (cfg.messages['nopp'], {sepc, pages}), '', ''; |
Sətir 2.008: |
Sətir 1.993: |
| | | |
| | | |
− | --[[--------------------------< I N S O U R C E _ L O C _ G E T >---------------------------------------------- | + | --[=[-------------------------< A R C H I V E _ U R L _ C H E C K >-------------------------------------------- |
| | | |
− | returns one of the in-source locators: page, pages, or at.
| + | Check archive.org urls to make sure they at least look like they are pointing at valid archives and not to the |
− | | + | save snapshot url or to calendar pages. When the archive url is 'https://web.archive.org/save/' (or http://...) |
− | If any of these are interwiki links to wikisource, returns the label portion of the interwikilink as plain text
| + | archive.org saves a snapshot of the target page in the url. That is something that Wikipedia should not allow |
− | for use in COinS. This COinS thing is done because here we convert an interwiki link to and external link and
| + | unwitting readers to do. |
− | add an icon span around that; get_coins_pages() doesn't know about the span. TODO: should it?
| |
− | | |
− | TODO: add support for sheet and sheets?; streamline;
| |
− | | |
− | TODO: make it so that this function returns only one of the three as the single in-source (the return value assigned
| |
− | to a new name)?
| |
− | | |
− | ]]
| |
− | | |
− | local function insource_loc_get (page, pages, at)
| |
− | local ws_url, ws_label, coins_pages, L; -- for wikisource interwikilinks; TODO: this corrupts page metadata (span remains in place after cleanup; fix there?)
| |
− | | |
− | if is_set (page) then
| |
− | if is_set (pages) or is_set(at) then
| |
− | pages = ''; -- unset the others
| |
− | at = '';
| |
− | end
| |
− | extra_text_in_page_check (page); -- add this page to maint cat if |page= value begins with what looks like p. or pp.
| |
− | | |
− | ws_url, ws_label, L = wikisource_url_make (page); -- make ws url from |page= interwiki link; link portion L becomes tool tip label
| |
− | if ws_url then
| |
− | page = external_link (ws_url, ws_label .. ' ', 'ws link in page'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
| |
− | page = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, page});
| |
− | coins_pages = ws_label;
| |
− | end
| |
− | elseif is_set (pages) then
| |
− | if is_set (at) then
| |
− | at = ''; -- unset
| |
− | end
| |
− | extra_text_in_page_check (pages); -- add this page to maint cat if |pages= value begins with what looks like p. or pp.
| |
− | | |
− | ws_url, ws_label, L = wikisource_url_make (pages); -- make ws url from |pages= interwiki link; link portion L becomes tool tip label
| |
− | if ws_url then
| |
− | pages = external_link (ws_url, ws_label .. ' ', 'ws link in pages'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
| |
− | pages = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, pages});
| |
− | coins_pages = ws_label;
| |
− | end
| |
− | elseif is_set (at) then
| |
− | ws_url, ws_label, L = wikisource_url_make (at); -- make ws url from |at= interwiki link; link portion L becomes tool tip label
| |
− | if ws_url then
| |
− | at = external_link (ws_url, ws_label .. ' ', 'ws link in at'); -- space char after label to move icon away from in-source text; TODO: a better way to do this?
| |
− | at = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, at});
| |
− | coins_pages = ws_label;
| |
− | end
| |
− | end
| |
− |
| |
− | return page, pages, at, coins_pages;
| |
− | end
| |
− | | |
− | | |
− | | |
− | --[=[-------------------------< A R C H I V E _ U R L _ C H E C K >--------------------------------------------
| |
− | | |
− | Check archive.org urls to make sure they at least look like they are pointing at valid archives and not to the | |
− | save snapshot url or to calendar pages. When the archive url is 'https://web.archive.org/save/' (or http://...) | |
− | archive.org saves a snapshot of the target page in the url. That is something that Wikipedia should not allow | |
− | unwitting readers to do. | |
| | | |
| When the archive.org url does not have a complete timestamp, archive.org chooses a snapshot according to its own | | When the archive.org url does not have a complete timestamp, archive.org chooses a snapshot according to its own |
Sətir 2.112: |
Sətir 2.040: |
| err_msg = 'liveweb'; | | err_msg = 'liveweb'; |
| else | | else |
− | path, timestamp, flag = url:match('//web%.archive%.org/([^%d]*)(%d+)([^/]*)/'); -- split out some of the url parts for evaluation | + | path, timestamp, flag = url:match('//web%.archive%.org/([^%d]*)(%d+)([^/]*)/'); -- split out some of the url parts for evaluation |
| | | |
| if not is_set(timestamp) or 14 ~= timestamp:len() then -- path and flag optional, must have 14-digit timestamp here | | if not is_set(timestamp) or 14 ~= timestamp:len() then -- path and flag optional, must have 14-digit timestamp here |
Sətir 2.177: |
Sətir 2.105: |
| elseif 3 == selected then | | elseif 3 == selected then |
| Authors = A['Authors']; -- use content of |authors= | | Authors = A['Authors']; -- use content of |authors= |
| + | if 'authors' == A:ORIGIN('Authors') then -- but add a maint cat if the parameter is |authors= |
| + | add_maint_cat ('authors'); -- because use of this parameter is discouraged; what to do about the aliases is a TODO: |
| + | end |
| end | | end |
| if is_set (Collaboration) then | | if is_set (Collaboration) then |
Sətir 2.183: |
Sətir 2.114: |
| end | | end |
| | | |
| + | local Coauthors = A['Coauthors']; -- для рувики (а вообще депрекированный) |
| local Others = A['Others']; | | local Others = A['Others']; |
| | | |
Sətir 2.198: |
Sətir 2.130: |
| elseif 3 == selected then | | elseif 3 == selected then |
| Editors = A['Editors']; -- use content of |editors= | | Editors = A['Editors']; -- use content of |editors= |
| + | add_maint_cat ('editors'); -- but add a maint cat because use of this parameter is discouraged |
| end | | end |
| end | | end |
| | | |
− | local translator_etal;
| |
| local t = {}; -- translators list from |translator-lastn= / translator-firstn= pairs | | local t = {}; -- translators list from |translator-lastn= / translator-firstn= pairs |
| local Translators; -- assembled translators name list | | local Translators; -- assembled translators name list |
| t = extract_names (args, 'TranslatorList'); -- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn= | | t = extract_names (args, 'TranslatorList'); -- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn= |
| | | |
− | local interviewer_etal;
| + | local interviewers_list = {}; |
− | local interviewers_list = {}; | + | local Interviewers = A['Interviewers'] |
− | local Interviewers; -- used later | + | if is_set (Interviewers) then -- add a maint cat if the |interviewers= is used |
− | interviewers_list = extract_names (args, 'InterviewerList'); -- process preferred interviewers parameters | + | add_maint_cat ('interviewers'); -- because use of this parameter is discouraged |
| + | else |
| + | interviewers_list = extract_names (args, 'InterviewerList'); -- else, process preferred interviewers parameters |
| + | end |
| | | |
− | local contributor_etal;
| |
| local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs | | local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs |
| local Contributors; -- assembled contributors name list | | local Contributors; -- assembled contributors name list |
Sətir 2.235: |
Sətir 2.169: |
| end | | end |
| | | |
− | if not is_valid_parameter_value (NameListFormat, 'name-list-format', cfg.keywords['name-list-format']) then -- only accepted value for this parameter is 'vanc' | + | if not is_valid_parameter_value (NameListFormat, 'name-list-format', cfg.keywords['name-list-format']) then -- only accepted value for this parameter is 'vanc' |
| NameListFormat = ''; -- anything else, set to empty string | | NameListFormat = ''; -- anything else, set to empty string |
| end | | end |
Sətir 2.256: |
Sətir 2.190: |
| local Chapter = A['Chapter']; | | local Chapter = A['Chapter']; |
| local ScriptChapter = A['ScriptChapter']; | | local ScriptChapter = A['ScriptChapter']; |
− | local ScriptChapterOrigin = A:ORIGIN ('ScriptChapter');
| |
| local ChapterLink -- = A['ChapterLink']; -- deprecated as a parameter but still used internally by cite episode | | local ChapterLink -- = A['ChapterLink']; -- deprecated as a parameter but still used internally by cite episode |
| local TransChapter = A['TransChapter']; | | local TransChapter = A['TransChapter']; |
Sətir 2.269: |
Sətir 2.202: |
| ArchiveURL, ArchiveDate = archive_url_check (A['ArchiveURL'], A['ArchiveDate']) | | ArchiveURL, ArchiveDate = archive_url_check (A['ArchiveURL'], A['ArchiveDate']) |
| | | |
− | local UrlStatus = A['UrlStatus']; | + | local DeadURL = A['DeadURL'] |
− | if 'url-status' == A:ORIGIN ('UrlStatus') then -- interim: TODO: this line goes away
| + | if not is_valid_parameter_value (DeadURL, 'dead-url', cfg.keywords ['deadurl']) then -- set in config.defaults to 'yes' |
− | if not is_valid_parameter_value (UrlStatus, 'url-status', cfg.keywords ['url-status']) then -- set in config.defaults to 'dead' | + | DeadURL = ''; -- anything else, set to empty string |
− | UrlStatus = ''; -- anything else, set to empty string
| + | end |
− | end -- interim: TODO: this line goes away
| + | |
− | elseif is_set (A:ORIGIN ('UrlStatus')) then -- interim: while both |dead-url= and |url-status= allowed use separate keyword lists; TODO: remove this section
| |
− | if not is_valid_parameter_value (UrlStatus, A:ORIGIN ('UrlStatus'), cfg.keywords ['deadurl']) then -- interim: assume |dead-url=; use those keywords; TODO: this line goes away
| |
− | UrlStatus = ''; -- anything else, set to empty string; interim: TODO: this line goes away | |
− | end -- interim: TODO: this line goes away | |
− | end -- interim: TODO: this line goes away
| |
− |
| |
− | if in_array (UrlStatus, {'yes', 'true', 'y'}) then -- TODO: remove this whole thing when |dead-url=[yes|no] parameters removed from articles
| |
− | UrlStatus = 'dead';
| |
− | elseif 'no' == UrlStatus then
| |
− | UrlStatus = 'live';
| |
− | end
| |
− |
| |
| local URL = A['URL'] | | local URL = A['URL'] |
| local URLorigin = A:ORIGIN('URL'); -- get name of parameter that holds URL | | local URLorigin = A:ORIGIN('URL'); -- get name of parameter that holds URL |
Sətir 2.294: |
Sətir 2.215: |
| local ConferenceURLorigin = A:ORIGIN('ConferenceURL'); -- get name of parameter that holds ConferenceURL | | local ConferenceURLorigin = A:ORIGIN('ConferenceURL'); -- get name of parameter that holds ConferenceURL |
| local Periodical = A['Periodical']; | | local Periodical = A['Periodical']; |
− | local Periodical_origin = ''; | + | local Periodical_origin = A:ORIGIN('Periodical'); -- get the name of the periodical parameter |
− | if is_set (Periodical) then
| |
− | Periodical_origin = A:ORIGIN('Periodical'); -- get the name of the periodical parameter
| |
− | local i;
| |
− | Periodical, i = strip_apostrophe_markup (Periodical); -- strip appostrophe markup so that metadata isn't contaminated
| |
− | if i then -- non-zero when markup was stripped so emit an error message
| |
− | table.insert( z.message_tail, {set_error ('apostrophe_markup', {Periodical_origin}, true)});
| |
− | end
| |
− | end
| |
| | | |
− | local ScriptPeriodical = A['ScriptPeriodical'];
| + | local Series = A['Series']; |
− | local ScriptPeriodical_origin = A:ORIGIN('ScriptPeriodical');
| |
− | -- web and news not tested for now because of
| |
− | -- Wikipedia:Administrators%27_noticeboard#Is_there_a_semi-automated_tool_that_could_fix_these_annoying_"Cite_Web"_errors?
| |
− | | |
− | local TransPeriodical = A['TransPeriodical'];
| |
− | | |
− | local Series = A['Series']; | |
| | | |
| local Volume; | | local Volume; |
Sətir 2.319: |
Sətir 2.225: |
| local At; | | local At; |
| | | |
− | if 'citation' == config.CitationClass then | + | if in_array (config.CitationClass, cfg.templates_using_volume) then |
− | if is_set (Periodical) then
| |
− | if not in_array (Periodical_origin, {'website', 'mailinglist'}) then -- {{citation}} does not render volume for these 'periodicals'
| |
− | Volume = A['Volume']; -- but does for all other 'periodicals'
| |
− | end
| |
− | elseif is_set (ScriptPeriodical) then
| |
− | if 'script-website' ~= ScriptPeriodical_origin then -- {{citation}} does not render volume for |script-website=
| |
− | Volume = A['Volume']; -- but does for all other 'periodicals'
| |
− | end
| |
− | else
| |
− | Volume = A['Volume']; -- and does for non-'periodical' cites
| |
− | end
| |
− | elseif in_array (config.CitationClass, cfg.templates_using_volume) then -- render |volume= for cs1 according to the configuration settings
| |
| Volume = A['Volume']; | | Volume = A['Volume']; |
− | end
| |
− |
| |
− | if 'citation' == config.CitationClass then
| |
− | if is_set (Periodical) and in_array (Periodical_origin, {'journal', 'magazine', 'newspaper', 'periodical', 'work'}) or -- {{citation}} renders issue for these 'periodicals'
| |
− | is_set (ScriptPeriodical) and in_array (ScriptPeriodical_origin, {'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-work'}) then -- and these 'script-periodicals'
| |
− | Issue = hyphen_to_dash (A['Issue']);
| |
− | end
| |
− | elseif in_array (config.CitationClass, cfg.templates_using_issue) then -- conference & map books do not support issue; {{citation}} listed here because included in settings table
| |
− | if not (in_array (config.CitationClass, {'conference', 'map', 'citation'}) and not (is_set (Periodical) or is_set (ScriptPeriodical))) then
| |
− | Issue = hyphen_to_dash (A['Issue']);
| |
− | end
| |
| end | | end |
− | | + | -- conference & map books do not support issue |
| + | if in_array (config.CitationClass, cfg.templates_using_issue) and not (in_array (config.CitationClass, {'conference', 'map'}) and not is_set (Periodical))then |
| + | Issue = hyphen_to_dash (A['Issue']); |
| + | end |
| local Position = ''; | | local Position = ''; |
| if not in_array (config.CitationClass, cfg.templates_not_using_page) then | | if not in_array (config.CitationClass, cfg.templates_not_using_page) then |
Sətir 2.358: |
Sətir 2.244: |
| | | |
| local PublisherName = A['PublisherName']; | | local PublisherName = A['PublisherName']; |
− | local PublisherName_origin = A:ORIGIN('PublisherName');
| |
− | if is_set (PublisherName) then
| |
− | local i=0;
| |
− | PublisherName, i = strip_apostrophe_markup (PublisherName); -- strip appostrophe markup so that metadata isn't contaminated; publisher is never italicized
| |
− |
| |
− | if i then -- non-zero when markup was stripped so emit an error message
| |
− | table.insert( z.message_tail, {set_error ('apostrophe_markup', {PublisherName_origin}, true)});
| |
− | end
| |
− | end
| |
− |
| |
| local RegistrationRequired = A['RegistrationRequired']; | | local RegistrationRequired = A['RegistrationRequired']; |
| if not is_valid_parameter_value (RegistrationRequired, 'registration', cfg.keywords ['yes_true_y']) then | | if not is_valid_parameter_value (RegistrationRequired, 'registration', cfg.keywords ['yes_true_y']) then |
Sətir 2.386: |
Sətir 2.262: |
| table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'url'}, true ) } ); | | table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'url'}, true ) } ); |
| end | | end |
− |
| + | |
| if is_set (UrlAccess) and is_set (SubscriptionRequired) then -- while not aliases, these are much the same so if both are set | | if is_set (UrlAccess) and is_set (SubscriptionRequired) then -- while not aliases, these are much the same so if both are set |
| table.insert( z.message_tail, { set_error( 'redundant_parameters', {wrap_style ('parameter', 'url-access') .. ' and ' .. wrap_style ('parameter', 'subscription')}, true ) } ); -- add error message | | table.insert( z.message_tail, { set_error( 'redundant_parameters', {wrap_style ('parameter', 'url-access') .. ' and ' .. wrap_style ('parameter', 'subscription')}, true ) } ); -- add error message |
Sətir 2.397: |
Sətir 2.273: |
| | | |
| local ChapterUrlAccess = A['ChapterUrlAccess']; | | local ChapterUrlAccess = A['ChapterUrlAccess']; |
− | if not is_valid_parameter_value (ChapterUrlAccess, A:ORIGIN('ChapterUrlAccess'), cfg.keywords ['url-access']) then -- same as url-access | + | if not is_valid_parameter_value (ChapterUrlAccess, 'chapter-url-access', cfg.keywords ['url-access']) then -- same as url-access |
| ChapterUrlAccess = nil; | | ChapterUrlAccess = nil; |
| end | | end |
| if not is_set(ChapterURL) and is_set(ChapterUrlAccess) then | | if not is_set(ChapterURL) and is_set(ChapterUrlAccess) then |
| ChapterUrlAccess = nil; | | ChapterUrlAccess = nil; |
− | table.insert( z.message_tail, { set_error( 'param_access_requires_param', {A:ORIGIN('ChapterUrlAccess'):gsub ('%-access', '')}, true ) } ); | + | table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'chapter-url'}, true ) } ); |
− | end
| |
− | | |
− | local MapUrlAccess = A['MapUrlAccess'];
| |
− | if not is_valid_parameter_value (MapUrlAccess, 'map-url-access', cfg.keywords ['url-access']) then
| |
− | MapUrlAccess = nil;
| |
− | end
| |
− | if not is_set(A['MapURL']) and is_set(MapUrlAccess) then
| |
− | MapUrlAccess = nil;
| |
− | table.insert( z.message_tail, { set_error( 'param_access_requires_param', {'map-url'}, true ) } );
| |
| end | | end |
| | | |
Sətir 2.432: |
Sətir 2.299: |
| | | |
| local ID_list = extract_ids( args ); | | local ID_list = extract_ids( args ); |
− | if is_set (DoiBroken) and not ID_list['DOI'] then
| |
− | table.insert( z.message_tail, { set_error( 'doibroken_missing_doi', A:ORIGIN('DoiBroken'))});
| |
− | end
| |
| local ID_access_levels = extract_id_access_levels( args, ID_list ); | | local ID_access_levels = extract_id_access_levels( args, ID_list ); |
| | | |
Sətir 2.466: |
Sətir 2.330: |
| if not is_valid_parameter_value (DF, 'df', cfg.keywords['date-format']) then -- validate reformatting keyword | | if not is_valid_parameter_value (DF, 'df', cfg.keywords['date-format']) then -- validate reformatting keyword |
| DF = ''; -- not valid, set to empty string | | DF = ''; -- not valid, set to empty string |
− | end
| |
− | if not is_set (DF) then
| |
− | DF = cfg.global_df;
| |
| end | | end |
| | | |
− | local sepc; -- separator between citation elements for CS1 a period, for CS2, a comma | + | local sepc; -- separator between citation elements for CS1 a period, for CS2, a comma |
| local PostScript; | | local PostScript; |
| local Ref; | | local Ref; |
| sepc, PostScript, Ref = set_style (Mode:lower(), A['PostScript'], A['Ref'], config.CitationClass); | | sepc, PostScript, Ref = set_style (Mode:lower(), A['PostScript'], A['Ref'], config.CitationClass); |
− | use_lowercase = ( sepc == ',' ); -- used to control capitalization for certain static text | + | use_lowercase = ( sepc == ',' ); -- used to control capitalization for certain static text |
| | | |
| --check this page to see if it is in one of the namespaces that cs1 is not supposed to add to the error categories | | --check this page to see if it is in one of the namespaces that cs1 is not supposed to add to the error categories |
Sətir 2.491: |
Sətir 2.352: |
| | | |
| -- check for extra |page=, |pages= or |at= parameters. (also sheet and sheets while we're at it) | | -- check for extra |page=, |pages= or |at= parameters. (also sheet and sheets while we're at it) |
− | select_one( args, {'page', 'p', 'at', 'sheet', 'sheets'}, 'redundant_parameters' ); -- this is a dummy call simply to get the error message and category | + | select_one( args, {'page', 'p', 'pp', 'pages', 'at', 'sheet', 'sheets'}, 'redundant_parameters' ); -- this is a dummy call simply to get the error message and category |
− | | |
− | local coins_pages;
| |
− |
| |
− | Page, Pages, At, coins_pages = insource_loc_get (Page, Pages, At);
| |
| | | |
| local NoPP = A['NoPP'] | | local NoPP = A['NoPP'] |
Sətir 2.504: |
Sətir 2.361: |
| end | | end |
| | | |
− | if not is_set(PublicationPlace) and is_set(Place) then -- both |publication-place= and |place= (|location=) allowed if different | + | if is_set(Page) then |
− | PublicationPlace = Place; -- promote |place= (|location=) to |publication-place | + | if is_set(Pages) or is_set(At) then |
| + | Pages = ''; -- unset the others |
| + | At = ''; |
| + | end |
| + | extra_text_in_page_check (Page); -- add this page to maint cat if |page= value begins with what looks like p. or pp. |
| + | elseif is_set(Pages) then |
| + | if is_set(At) then |
| + | At = ''; -- unset |
| + | end |
| + | extra_text_in_page_check (Pages); -- add this page to maint cat if |pages= value begins with what looks like p. or pp. |
| + | end |
| + | |
| + | -- both |publication-place= and |place= (|location=) allowed if different |
| + | if not is_set(PublicationPlace) and is_set(Place) then |
| + | PublicationPlace = Place; -- promote |place= (|location=) to |publication-place |
| end | | end |
| | | |
− | if PublicationPlace == Place then Place = ''; end -- don't need both if they are the same | + | if PublicationPlace == Place then Place = ''; end -- don't need both if they are the same |
| | | |
| --[[ | | --[[ |
Sətir 2.515: |
Sətir 2.386: |
| |encyclopedia and |title then map |title to |article and |encyclopedia to |title | | |encyclopedia and |title then map |title to |article and |encyclopedia to |title |
| |encyclopedia and |article then map |encyclopedia to |title | | |encyclopedia and |article then map |encyclopedia to |title |
− | | + | |encyclopedia then map |encyclopedia to |title |
| + | |
| |trans-title maps to |trans-chapter when |title is re-mapped | | |trans-title maps to |trans-chapter when |title is re-mapped |
| |url maps to |chapterurl when |title is remapped | | |url maps to |chapterurl when |title is remapped |
Sətir 2.526: |
Sətir 2.398: |
| | | |
| if ( config.CitationClass == "encyclopaedia" ) or ( config.CitationClass == "citation" and is_set (Encyclopedia)) then -- test code for citation | | if ( config.CitationClass == "encyclopaedia" ) or ( config.CitationClass == "citation" and is_set (Encyclopedia)) then -- test code for citation |
− | if is_set (Periodical) then -- Periodical is set when |encyclopedia is set | + | if is_set(Periodical) then -- Periodical is set when |encyclopedia is set |
| if is_set(Title) or is_set (ScriptTitle) then | | if is_set(Title) or is_set (ScriptTitle) then |
| if not is_set(Chapter) then | | if not is_set(Chapter) then |
| Chapter = Title; -- |encyclopedia and |title are set so map |title to |article and |encyclopedia to |title | | Chapter = Title; -- |encyclopedia and |title are set so map |title to |article and |encyclopedia to |title |
| ScriptChapter = ScriptTitle; | | ScriptChapter = ScriptTitle; |
− | ScriptChapterOrigin = 'title';
| |
| TransChapter = TransTitle; | | TransChapter = TransTitle; |
| ChapterURL = URL; | | ChapterURL = URL; |
Sətir 2.548: |
Sətir 2.419: |
| ScriptTitle = ''; | | ScriptTitle = ''; |
| end | | end |
− | elseif is_set (Chapter) then -- |title not set | + | else -- |title not set |
− | Title = Periodical; -- |encyclopedia set and |article set so map |encyclopedia to |title | + | Title = Periodical; -- |encyclopedia set and |article set or not set so map |encyclopedia to |title |
| Periodical = ''; -- redundant so unset | | Periodical = ''; -- redundant so unset |
| end | | end |
Sətir 2.569: |
Sətir 2.440: |
| if (config.CitationClass == "mailinglist") then | | if (config.CitationClass == "mailinglist") then |
| Periodical = A ['MailingList']; | | Periodical = A ['MailingList']; |
− | elseif 'mailinglist' == Periodical_origin then | + | elseif 'mailinglist' == A:ORIGIN('Periodical') then |
| Periodical = ''; -- unset because mailing list is only used for cite mailing list | | Periodical = ''; -- unset because mailing list is only used for cite mailing list |
| end | | end |
Sətir 2.592: |
Sətir 2.463: |
| elseif 'speech' ~= config.CitationClass then | | elseif 'speech' ~= config.CitationClass then |
| Conference = ''; -- not cite conference or cite speech so make sure this is empty string | | Conference = ''; -- not cite conference or cite speech so make sure this is empty string |
| + | end |
| + | |
| + | -- для рувики: конкатенация |month к |date |
| + | local Month = A['Month']; |
| + | if is_set(Month) and is_set(Year) then |
| + | Date = Month .. " " .. Year; |
| + | Month = nil; |
| + | Year = nil; |
| end | | end |
| | | |
Sətir 2.602: |
Sətir 2.481: |
| Chapter = A['Map']; | | Chapter = A['Map']; |
| ChapterURL = A['MapURL']; | | ChapterURL = A['MapURL']; |
− | ChapterUrlAccess = MapUrlAccess; | + | ChapterUrlAccess = UrlAccess; |
| TransChapter = A['TransMap']; | | TransChapter = A['TransMap']; |
| ChapterURLorigin = A:ORIGIN('MapURL'); | | ChapterURLorigin = A:ORIGIN('MapURL'); |
Sətir 2.646: |
Sətir 2.525: |
| -- assemble a table of parts concatenated later into Series | | -- assemble a table of parts concatenated later into Series |
| if is_set(Season) then table.insert(s, wrap_msg ('season', Season, use_lowercase)); end | | if is_set(Season) then table.insert(s, wrap_msg ('season', Season, use_lowercase)); end |
− | if is_set(SeriesNumber) then table.insert(s, wrap_msg ('seriesnum', SeriesNumber, use_lowercase)); end | + | if is_set(SeriesNumber) then table.insert(s, wrap_msg ('series', SeriesNumber, use_lowercase)); end |
| if is_set(Issue) then table.insert(s, wrap_msg ('episode', Issue, use_lowercase)); end | | if is_set(Issue) then table.insert(s, wrap_msg ('episode', Issue, use_lowercase)); end |
| Issue = ''; -- unset because this is not a unique parameter | | Issue = ''; -- unset because this is not a unique parameter |
Sətir 2.652: |
Sətir 2.531: |
| Chapter = Title; -- promote title parameters to chapter | | Chapter = Title; -- promote title parameters to chapter |
| ScriptChapter = ScriptTitle; | | ScriptChapter = ScriptTitle; |
− | ScriptChapterOrigin = 'title';
| |
| ChapterLink = TitleLink; -- alias episodelink | | ChapterLink = TitleLink; -- alias episodelink |
| TransChapter = TransTitle; | | TransChapter = TransTitle; |
Sətir 2.683: |
Sətir 2.561: |
| -- end of {{cite episode}} stuff | | -- end of {{cite episode}} stuff |
| | | |
− | -- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, {{cite ssrn}}, before generation of COinS data. | + | -- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, before generation of COinS data. |
| do | | do |
− | if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then | + | if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx'}) then |
| if not is_set (ID_list[config.CitationClass:upper()]) then -- |arxiv= or |eprint= required for cite arxiv; |biorxiv= & |citeseerx= required for their templates | | if not is_set (ID_list[config.CitationClass:upper()]) then -- |arxiv= or |eprint= required for cite arxiv; |biorxiv= & |citeseerx= required for their templates |
− | table.insert( z.message_tail, { set_error( config.CitationClass .. '_missing', {}, true ) } ); -- add error message | + | table.insert( z.message_tail, { set_error( config.CitationClass .. '_missing', {}, true ) } ); -- add error message |
| + | end |
| + | |
| + | if 'arxiv' == config.CitationClass then |
| + | Periodical = 'arXiv'; -- set to arXiv for COinS; after that, must be set to empty string |
| end | | end |
| | | |
− | Periodical = ({['arxiv'] = 'arXiv', ['biorxiv'] = bioRxiv, ['citeseerx'] = 'CiteSeerX', ['ssrn'] = 'Social Science Research Network'})[config.CitationClass]; | + | if 'biorxiv' == config.CitationClass then |
| + | Periodical = 'bioRxiv'; -- set to bioRxiv for COinS; after that, must be set to empty string |
| + | end |
| + | |
| + | if 'citeseerx' == config.CitationClass then |
| + | Periodical = 'CiteSeerX'; -- set to CiteSeerX for COinS; after that, must be set to empty string |
| + | end |
| end | | end |
| end | | end |
Sətir 2.747: |
Sətir 2.635: |
| anchor_year, Embargo, error_message = dates(date_parameters_list, COinS_date); | | anchor_year, Embargo, error_message = dates(date_parameters_list, COinS_date); |
| | | |
| + | -- start temporary Julian / Gregorian calendar uncertainty categorization |
| + | if COinS_date.inter_cal_cat then |
| + | add_prop_cat ('jul_greg_uncertainty'); |
| + | end |
| -- end temporary Julian / Gregorian calendar uncertainty categorization | | -- end temporary Julian / Gregorian calendar uncertainty categorization |
| | | |
Sətir 2.756: |
Sətir 2.648: |
| end | | end |
| error_message = error_message .. '|year= / |date= mismatch'; | | error_message = error_message .. '|year= / |date= mismatch'; |
| + | elseif 1 == mismatch then -- |year= matches year-value in |date= |
| + | add_maint_cat ('date_year'); |
| end | | end |
| end | | end |
Sətir 2.768: |
Sətir 2.662: |
| if true == date_hyphen_to_dash (date_parameters_list) then -- convert hyphens to dashes where appropriate | | if true == date_hyphen_to_dash (date_parameters_list) then -- convert hyphens to dashes where appropriate |
| modified = true; | | modified = true; |
| + | add_maint_cat ('date_format'); -- hyphens were converted so add maint category |
| end | | end |
| | | |
Sətir 2.785: |
Sətir 2.680: |
| PublicationDate = date_parameters_list['publication-date'].val; | | PublicationDate = date_parameters_list['publication-date'].val; |
| end | | end |
| + | else |
| + | table.insert( z.message_tail, { set_error( 'bad_date', {error_message}, true ) } ); -- add this error message |
| end | | end |
| end -- end of do | | end -- end of do |
Sətir 2.798: |
Sətir 2.695: |
| if is_set(AccessDate) then -- access date requires |url=; pmc created url is not |url= | | if is_set(AccessDate) then -- access date requires |url=; pmc created url is not |url= |
| table.insert( z.message_tail, { set_error( 'accessdate_missing_url', {}, true ) } ); | | table.insert( z.message_tail, { set_error( 'accessdate_missing_url', {}, true ) } ); |
− | AccessDate = ''; -- unset | + | AccessDate = ''; -- для рувики: TODO: убрать? -- unset |
| end | | end |
| | | |
Sətir 2.809: |
Sətir 2.706: |
| not is_set(TransTitle) and | | not is_set(TransTitle) and |
| not is_set(ScriptTitle) then | | not is_set(ScriptTitle) then |
− | if 'episode' == config.CitationClass then | + | if 'episode' == config.CitationClass then -- special case for cite episode; TODO: is there a better way to do this? |
| + | table.insert( z.message_tail, { set_error( 'citation_missing_title', {'series'}, true ) } ); |
| + | else |
| + | table.insert( z.message_tail, { set_error( 'citation_missing_title', {'title'}, true ) } ); |
| end | | end |
| end | | end |
− | | + | |
− | if 'none' == Title and | + | if 'none' == Title and in_array (config.CitationClass, {'journal', 'citation'}) and is_set (Periodical) and 'journal' == A:ORIGIN('Periodical') then -- special case for journal cites |
− | in_array (config.CitationClass, {'journal', 'citation'}) and
| + | Title = ''; -- set title to empty string |
− | (is_set (Periodical) or is_set (ScriptPeriodical)) and
| + | add_maint_cat ('untitled'); |
− | ('journal' == Periodical_origin or 'script-journal' == ScriptPeriodical_origin) then -- special case for journal cites
| |
− | Title = ''; -- set title to empty string
| |
| end | | end |
| | | |
− | check_for_url ({ -- add error message when any of these parameters hold a URL | + | check_for_url ({ -- add error message when any of these parameters contains a URL |
| ['title']=Title, | | ['title']=Title, |
| [A:ORIGIN('Chapter')]=Chapter, | | [A:ORIGIN('Chapter')]=Chapter, |
− | [Periodical_origin] = Periodical, | + | [A:ORIGIN('Periodical')]=Periodical, |
− | [PublisherName_origin] = PublisherName | + | [A:ORIGIN('PublisherName')] = PublisherName |
| }); | | }); |
| | | |
Sətir 2.847: |
Sətir 2.745: |
| -- this is the function call to COinS() | | -- this is the function call to COinS() |
| local OCinSoutput = COinS({ | | local OCinSoutput = COinS({ |
− | ['Periodical'] = strip_apostrophe_markup (Periodical), -- no markup in the metadata | + | ['Periodical'] = Periodical, |
− | ['Encyclopedia'] = strip_apostrophe_markup (Encyclopedia), | + | ['Encyclopedia'] = Encyclopedia, |
| ['Chapter'] = make_coins_title (coins_chapter, ScriptChapter), -- Chapter and ScriptChapter stripped of bold / italic wikimarkup | | ['Chapter'] = make_coins_title (coins_chapter, ScriptChapter), -- Chapter and ScriptChapter stripped of bold / italic wikimarkup |
| ['Degree'] = Degree; -- cite thesis only | | ['Degree'] = Degree; -- cite thesis only |
Sətir 2.859: |
Sətir 2.757: |
| ['Volume'] = Volume, | | ['Volume'] = Volume, |
| ['Issue'] = Issue, | | ['Issue'] = Issue, |
− | ['Pages'] = coins_pages or get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At}, 5)), -- pages stripped of external links | + | ['Pages'] = get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At}, 5)), -- pages stripped of external links |
| ['Edition'] = Edition, | | ['Edition'] = Edition, |
− | ['PublisherName'] = PublisherName, -- any apostrophe markup already removed | + | ['PublisherName'] = PublisherName, |
| ['URL'] = first_set ({ChapterURL, URL}, 2), | | ['URL'] = first_set ({ChapterURL, URL}, 2), |
| ['Authors'] = coins_author, | | ['Authors'] = coins_author, |
Sətir 2.868: |
Sətir 2.766: |
| }, config.CitationClass); | | }, config.CitationClass); |
| | | |
− | -- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, {{cite citeseerx}}, and {{cite ssrn}} AFTER generation of COinS data. | + | -- Account for the oddities that are {{cite arxiv}}, {{cite biorxiv}}, and {{cite citeseerx}} AFTER generation of COinS data. |
− | if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then -- we have set rft.jtitle in COinS to arXiv, bioRxiv, CiteSeerX, or ssrn now unset so it isn't displayed | + | if in_array (config.CitationClass, {'arxiv', 'biorxiv', 'citeseerx'}) then -- we have set rft.jtitle in COinS to arXiv, bioRxiv, or CiteSeerX now unset so it isn't displayed |
| Periodical = ''; -- periodical not allowed in these templates; if article has been published, use cite journal | | Periodical = ''; -- periodical not allowed in these templates; if article has been published, use cite journal |
| end | | end |
Sətir 2.876: |
Sətir 2.774: |
| if 'newsgroup' == config.CitationClass then | | if 'newsgroup' == config.CitationClass then |
| if is_set (PublisherName) then | | if is_set (PublisherName) then |
− | PublisherName = substitute (cfg.messages['newsgroup'], external_link( 'news:' .. PublisherName, PublisherName, PublisherName_origin, nil )); | + | PublisherName = substitute (cfg.messages['newsgroup'], external_link( 'news:' .. PublisherName, PublisherName, A:ORIGIN('PublisherName'), nil )); |
| end | | end |
| end | | end |
| + | |
| + | |
| | | |
| -- Now perform various field substitutions. | | -- Now perform various field substitutions. |
Sətir 2.895: |
Sətir 2.795: |
| | | |
| do -- do editor name list first because the now unsupported coauthors used to modify control table | | do -- do editor name list first because the now unsupported coauthors used to modify control table |
− | control.maximum , editor_etal = get_display_names (A['DisplayEditors'], #e, 'editors', editor_etal); | + | control.maximum , editor_etal = get_display_authors_editors (A['DisplayEditors'], #e, 'editors', editor_etal); |
| last_first_list, EditorCount = list_people(control, e, editor_etal); | | last_first_list, EditorCount = list_people(control, e, editor_etal); |
| | | |
| if is_set (Editors) then | | if is_set (Editors) then |
− | Editors, editor_etal = name_has_etal (Editors, editor_etal, false, 'editors'); -- find and remove variations on et al.
| |
| if editor_etal then | | if editor_etal then |
| Editors = Editors .. ' ' .. cfg.messages['et al']; -- add et al. to editors parameter beause |display-editors=etal | | Editors = Editors .. ' ' .. cfg.messages['et al']; -- add et al. to editors parameter beause |display-editors=etal |
Sətir 2.915: |
Sətir 2.814: |
| end | | end |
| do -- now do interviewers | | do -- now do interviewers |
− | control.maximum , interviewer_etal = get_display_names (A['DisplayInterviewers'], #interviewers_list, 'interviewers', interviewer_etal); | + | control.maximum = #interviewers_list; -- number of interviewerss |
− | Interviewers = list_people (control, interviewers_list, interviewer_etal); | + | Interviewers = list_people(control, interviewers_list, false); -- et al not currently supported |
| end | | end |
| do -- now do translators | | do -- now do translators |
− | control.maximum , translator_etal = get_display_names (A['DisplayTranslators'], #t, 'translators', translator_etal); | + | control.maximum = #t; -- number of translators |
− | Translators = list_people (control, t, translator_etal); | + | Translators = list_people(control, t, false); -- et al not currently supported |
| end | | end |
| do -- now do contributors | | do -- now do contributors |
− | control.maximum , contributor_etal = get_display_names (A['DisplayContributors'], #c, 'contributors', contributor_etal); | + | control.maximum = #c; -- number of contributors |
− | Contributors = list_people (control, c, contributor_etal); | + | Contributors = list_people(control, c, false); -- et al not currently supported |
| end | | end |
| do -- now do authors | | do -- now do authors |
− | control.maximum , author_etal = get_display_names (A['DisplayAuthors'], #a, 'authors', author_etal); | + | control.maximum , author_etal = get_display_authors_editors (A['DisplayAuthors'], #a, 'authors', author_etal); |
| | | |
| last_first_list = list_people(control, a, author_etal); | | last_first_list = list_people(control, a, author_etal); |
| | | |
| if is_set (Authors) then | | if is_set (Authors) then |
− | Authors, author_etal = name_has_etal (Authors, author_etal, false, 'authors'); -- find and remove variations on et al. | + | Authors, author_etal = name_has_etal (Authors, author_etal, false); -- find and remove variations on et al. |
| if author_etal then | | if author_etal then |
| Authors = Authors .. ' ' .. cfg.messages['et al']; -- add et al. to authors parameter | | Authors = Authors .. ' ' .. cfg.messages['et al']; -- add et al. to authors parameter |
Sətir 2.956: |
Sətir 2.855: |
| | | |
| -- special case for chapter format so no error message or cat when chapter not supported | | -- special case for chapter format so no error message or cat when chapter not supported |
− | if not (in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) or | + | if not (in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx'}) or |
− | ('citation' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical)) and not is_set (Encyclopedia))) then | + | ('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia))) then |
| ChapterFormat = style_format (ChapterFormat, ChapterURL, 'chapter-format', 'chapter-url'); | | ChapterFormat = style_format (ChapterFormat, ChapterURL, 'chapter-format', 'chapter-url'); |
| end | | end |
| | | |
| if not is_set(URL) then | | if not is_set(URL) then |
− | if in_array(config.CitationClass, {"web","podcast", "mailinglist"}) or -- |url= required for cite web, cite podcast, and cite mailinglist | + | if in_array(config.CitationClass, {"web","podcast", "mailinglist"}) then -- |url= required for cite web, cite podcast, and cite mailinglist |
− | ('citation' == config.CitationClass and ('website' == Periodical_origin or 'script-website' == ScriptPeriodical_origin)) then -- and required for {{citation}} with |website= or |script-website= | + | table.insert( z.message_tail, { set_error( 'cite_web_url', {}, true ) } ); |
− | table.insert( z.message_tail, { set_error( 'cite_web_url', {}, true ) } );
| |
| end | | end |
| | | |
Sətir 2.970: |
Sətir 2.868: |
| if is_set(AccessDate) and not is_set(ChapterURL)then -- ChapterURL may be set when URL is not set; | | if is_set(AccessDate) and not is_set(ChapterURL)then -- ChapterURL may be set when URL is not set; |
| table.insert( z.message_tail, { set_error( 'accessdate_missing_url', {}, true ) } ); | | table.insert( z.message_tail, { set_error( 'accessdate_missing_url', {}, true ) } ); |
− | AccessDate = ''; | + | -- AccessDate = ''; -- для рувики: убрано |
| end | | end |
| end | | end |
| | | |
| local OriginalURL, OriginalURLorigin, OriginalFormat, OriginalAccess; | | local OriginalURL, OriginalURLorigin, OriginalFormat, OriginalAccess; |
− | -- DeadURL = DeadURL:lower(); -- used later when assembling archived text
| + | DeadURL = DeadURL:lower(); -- used later when assembling archived text |
− | UrlStatus = UrlStatus:lower(); -- used later when assembling archived text
| |
| if is_set( ArchiveURL ) then | | if is_set( ArchiveURL ) then |
| if is_set (ChapterURL) then -- if chapter-url is set apply archive url to it | | if is_set (ChapterURL) then -- if chapter-url is set apply archive url to it |
Sətir 2.982: |
Sətir 2.879: |
| OriginalURLorigin = ChapterURLorigin; -- name of chapter-url parameter for error messages | | OriginalURLorigin = ChapterURLorigin; -- name of chapter-url parameter for error messages |
| OriginalFormat = ChapterFormat; -- and original |chapter-format= | | OriginalFormat = ChapterFormat; -- and original |chapter-format= |
− | -- if 'no' ~= DeadURL then
| + | if 'no' ~= DeadURL then |
− | if 'live' ~= UrlStatus then
| |
| ChapterURL = ArchiveURL -- swap-in the archive's url | | ChapterURL = ArchiveURL -- swap-in the archive's url |
| ChapterURLorigin = A:ORIGIN('ArchiveURL') -- name of archive-url parameter for error messages | | ChapterURLorigin = A:ORIGIN('ArchiveURL') -- name of archive-url parameter for error messages |
Sətir 2.994: |
Sətir 2.890: |
| OriginalFormat = Format; -- and original |format= | | OriginalFormat = Format; -- and original |format= |
| OriginalAccess = UrlAccess; | | OriginalAccess = UrlAccess; |
− | -- if 'no' ~= DeadURL then -- if URL set then archive-url applies to it
| + | if 'no' ~= DeadURL then -- if URL set then archive-url applies to it |
− | if 'live' ~= UrlStatus then -- if URL set then archive-url applies to it
| |
| URL = ArchiveURL -- swap-in the archive's url | | URL = ArchiveURL -- swap-in the archive's url |
| URLorigin = A:ORIGIN('ArchiveURL') -- name of archive url parameter for error messages | | URLorigin = A:ORIGIN('ArchiveURL') -- name of archive url parameter for error messages |
Sətir 3.004: |
Sətir 2.899: |
| end | | end |
| | | |
− | if in_array(config.CitationClass, {'web','news','journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) or -- if any of the 'periodical' cites except encyclopedia | + | if in_array(config.CitationClass, {'web','news','journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'arxiv', 'biorxiv', 'citeseerx'}) or -- if any of the 'periodical' cites except encyclopedia |
− | ('citation' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical)) and not is_set (Encyclopedia)) then | + | ('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia)) then |
| local chap_param; | | local chap_param; |
| if is_set (Chapter) then -- get a parameter name from one of these chapter related meta-parameters | | if is_set (Chapter) then -- get a parameter name from one of these chapter related meta-parameters |
Sətir 3.014: |
Sətir 2.909: |
| chap_param = A:ORIGIN ('ChapterURL') | | chap_param = A:ORIGIN ('ChapterURL') |
| elseif is_set (ScriptChapter) then | | elseif is_set (ScriptChapter) then |
− | chap_param = ScriptChapterOrigin; | + | chap_param = A:ORIGIN ('ScriptChapter') |
| else is_set (ChapterFormat) | | else is_set (ChapterFormat) |
| chap_param = A:ORIGIN ('ChapterFormat') | | chap_param = A:ORIGIN ('ChapterFormat') |
Sətir 3.035: |
Sətir 2.930: |
| end | | end |
| | | |
− | Chapter = format_chapter_title (ScriptChapter, ScriptChapterOrigin, Chapter, TransChapter, ChapterURL, ChapterURLorigin, no_quotes, ChapterUrlAccess); -- Contribution is also in Chapter | + | Chapter = format_chapter_title (ScriptChapter, Chapter, TransChapter, ChapterURL, ChapterURLorigin, no_quotes, ChapterUrlAccess); -- Contribution is also in Chapter |
| if is_set (Chapter) then | | if is_set (Chapter) then |
| Chapter = Chapter .. ChapterFormat ; | | Chapter = Chapter .. ChapterFormat ; |
Sətir 3.048: |
Sətir 2.943: |
| | | |
| -- Format main title. | | -- Format main title. |
| + | if is_set (ArchiveURL) and mw.ustring.match (mw.ustring.lower(Title), cfg.special_case_translation['archived_copy']) then -- if title is 'Archived copy' (place holder added by bots that can't find proper title) |
| + | add_maint_cat ('archived_copy'); -- add maintenance category before we modify the content of Title |
| + | end |
| | | |
| if Title:match ('^%(%(.*%)%)$') then -- if keep as written markup: | | if Title:match ('^%(%(.*%)%)$') then -- if keep as written markup: |
Sətir 3.060: |
Sətir 2.958: |
| end | | end |
| | | |
− | if in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'mailinglist', 'interview', 'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) or | + | if is_set(TitleLink) and is_set(Title) then |
− | ('citation' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical)) and not is_set (Encyclopedia)) or | + | Title = make_wikilink (TitleLink, Title); |
− | ('map' == config.CitationClass and (is_set (Periodical) or is_set (ScriptPeriodical))) then -- special case for cite map when the map is in a periodical treat as an article | + | end |
| + | |
| + | if in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'mailinglist', 'interview', 'arxiv', 'biorxiv', 'citeseerx'}) or |
| + | ('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia)) or |
| + | ('map' == config.CitationClass and is_set (Periodical)) then -- special case for cite map when the map is in a periodical treat as an article |
| Title = kern_quotes (Title); -- if necessary, separate title's leading and trailing quote marks from Module provided quote marks | | Title = kern_quotes (Title); -- if necessary, separate title's leading and trailing quote marks from Module provided quote marks |
| Title = wrap_style ('quoted-title', Title); | | Title = wrap_style ('quoted-title', Title); |
− | Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped | + | Title = script_concatenate (Title, ScriptTitle); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped |
| TransTitle= wrap_style ('trans-quoted-title', TransTitle ); | | TransTitle= wrap_style ('trans-quoted-title', TransTitle ); |
| elseif 'report' == config.CitationClass then -- no styling for cite report | | elseif 'report' == config.CitationClass then -- no styling for cite report |
− | Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped | + | Title = script_concatenate (Title, ScriptTitle); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped |
| TransTitle= wrap_style ('trans-quoted-title', TransTitle ); -- for cite report, use this form for trans-title | | TransTitle= wrap_style ('trans-quoted-title', TransTitle ); -- for cite report, use this form for trans-title |
| else | | else |
| Title = wrap_style ('italic-title', Title); | | Title = wrap_style ('italic-title', Title); |
− | Title = script_concatenate (Title, ScriptTitle, 'script-title'); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped | + | Title = script_concatenate (Title, ScriptTitle); -- <bdi> tags, lang atribute, categorization, etc; must be done after title is wrapped |
| TransTitle = wrap_style ('trans-italic-title', TransTitle); | | TransTitle = wrap_style ('trans-italic-title', TransTitle); |
| end | | end |
Sətir 3.084: |
Sətir 2.986: |
| end | | end |
| end | | end |
− | | + | |
| if is_set(Title) then | | if is_set(Title) then |
− | if not is_set (TitleLink) and is_set (URL) then | + | if not is_set(TitleLink) and is_set(URL) then |
− | Title = external_link (URL, Title, URLorigin, UrlAccess) .. TransTitle .. TransError .. Format; | + | |
| + | Title = external_link( URL, Title, URLorigin, UrlAccess ) .. TransTitle .. TransError .. Format; |
| URL = ''; -- unset these because no longer needed | | URL = ''; -- unset these because no longer needed |
| Format = ""; | | Format = ""; |
− | elseif is_set (TitleLink) and not is_set (URL) then
| |
− | local ws_url;
| |
− | ws_url = wikisource_url_make (TitleLink); -- ignore ws_label return; not used here
| |
− | if ws_url then
| |
− | Title = external_link (ws_url, Title .. ' ', 'ws link in title-link'); -- space char after Title to move icon away from italic text; TODO: a better way to do this?
| |
− | Title = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], TitleLink, Title});
| |
− | Title = Title .. TransTitle .. TransError;
| |
− | else
| |
− | Title = make_wikilink (TitleLink, Title) .. TransTitle .. TransError;
| |
− | end
| |
| else | | else |
− | local ws_url, ws_label; | + | Title = Title .. TransTitle .. TransError; |
− | ws_url, ws_label, L = wikisource_url_make (Title); -- make ws url from |title= interwiki link; link portion L becomes tool tip label
| |
− | if ws_url then
| |
− | Title = Title:gsub ('%b[]', ws_label); -- replace interwiki link with ws_label to retain markup
| |
− | Title = external_link (ws_url, Title .. ' ', 'ws link in title'); -- space char after Title to move icon away from italic text; TODO: a better way to do this?
| |
− | Title = substitute (cfg.presentation['interwiki-icon'], {cfg.presentation['class-wikisource'], L, Title});
| |
− | Title = Title .. TransTitle .. TransError;
| |
− | else
| |
− | Title = Title .. TransTitle .. TransError;
| |
− | end
| |
| end | | end |
| else | | else |
Sətir 3.196: |
Sətir 3.080: |
| TitleNote = is_set(TitleNote) and (sepc .. " " .. TitleNote) or ""; | | TitleNote = is_set(TitleNote) and (sepc .. " " .. TitleNote) or ""; |
| if is_set (Edition) then | | if is_set (Edition) then |
| + | if Edition:match ('%f[%a][Ee]d%.?$') or Edition:match ('%f[%a][Ee]dition$') then |
| + | add_maint_cat ('extra_text', 'edition'); |
| + | end |
| Edition = " " .. wrap_msg ('edition', Edition); | | Edition = " " .. wrap_msg ('edition', Edition); |
| else | | else |
Sətir 3.201: |
Sətir 3.088: |
| end | | end |
| | | |
− | Series = is_set (Series) and wrap_msg ('series', {sepc, Series}) or ""; -- not the same as SeriesNum | + | Series = is_set(Series) and (sepc .. " " .. Series) or ""; |
− | OrigYear = is_set (OrigYear) and wrap_msg ('origyear', OrigYear) or '';
| + | OrigYear = is_set(OrigYear) and (" [" .. OrigYear .. "]") or ""; -- TODO: presentation |
− | Agency = is_set (Agency) and wrap_msg ('agency', {sepc, Agency}) or ""; | + | |
| + | Agency = is_set(Agency) and (sepc .. " " .. Agency) or ""; |
| + | |
| Volume = format_volume_issue (Volume, Issue, config.CitationClass, Periodical_origin, sepc, use_lowercase); | | Volume = format_volume_issue (Volume, Issue, config.CitationClass, Periodical_origin, sepc, use_lowercase); |
| | | |
| ------------------------------------ totally unrelated data | | ------------------------------------ totally unrelated data |
− | Via = is_set (Via) and wrap_msg ('via', Via) or ''; | + | if is_set(Via) then |
| + | Via = " " .. wrap_msg ('via', Via); |
| + | end |
| | | |
| --[[ | | --[[ |
Sətir 3.259: |
Sətir 3.150: |
| ArchiveDate = set_error('archive_missing_date'); | | ArchiveDate = set_error('archive_missing_date'); |
| end | | end |
− | if "live" == UrlStatus then | + | if "no" == DeadURL then |
| local arch_text = cfg.messages['archived']; | | local arch_text = cfg.messages['archived']; |
| if sepc ~= "." then arch_text = arch_text:lower() end | | if sepc ~= "." then arch_text = arch_text:lower() end |
− | Archived = sepc .. " " .. substitute( cfg.messages['archived-live'], | + | Archived = sepc .. " " .. substitute( cfg.messages['archived-not-dead'], |
| { external_link( ArchiveURL, arch_text, A:ORIGIN('ArchiveURL'), nil ) .. ArchiveFormat, ArchiveDate } ); | | { external_link( ArchiveURL, arch_text, A:ORIGIN('ArchiveURL'), nil ) .. ArchiveFormat, ArchiveDate } ); |
| if not is_set(OriginalURL) then | | if not is_set(OriginalURL) then |
| Archived = Archived .. " " .. set_error('archive_missing_url'); | | Archived = Archived .. " " .. set_error('archive_missing_url'); |
| end | | end |
− | elseif is_set(OriginalURL) then -- UrlStatus is empty, 'dead', 'unfit', 'usurped', 'bot: unknown' | + | elseif is_set(OriginalURL) then -- DeadURL is empty, 'yes', 'true', 'y', 'unfit', 'usurped' |
| local arch_text = cfg.messages['archived-dead']; | | local arch_text = cfg.messages['archived-dead']; |
| if sepc ~= "." then arch_text = arch_text:lower() end | | if sepc ~= "." then arch_text = arch_text:lower() end |
− | if in_array (UrlStatus, {'unfit', 'usurped', 'bot: unknown'}) then | + | if in_array (DeadURL, {'unfit', 'usurped', 'bot: unknown'}) then |
| Archived = sepc .. " " .. 'Archived from the original on ' .. ArchiveDate; -- format already styled | | Archived = sepc .. " " .. 'Archived from the original on ' .. ArchiveDate; -- format already styled |
− | else -- UrlStatus is empty, 'dead' | + | if 'bot: unknown' == DeadURL then |
| + | add_maint_cat ('bot:_unknown'); -- and add a category if not already added |
| + | else |
| + | add_maint_cat ('unfit'); -- and add a category if not already added |
| + | end |
| + | else -- DeadURL is empty, 'yes', 'true', or 'y' |
| Archived = sepc .. " " .. substitute( arch_text, | | Archived = sepc .. " " .. substitute( arch_text, |
| { external_link( OriginalURL, cfg.messages['original'], OriginalURLorigin, OriginalAccess ) .. OriginalFormat, ArchiveDate } ); -- format already styled | | { external_link( OriginalURL, cfg.messages['original'], OriginalURLorigin, OriginalAccess ) .. OriginalFormat, ArchiveDate } ); -- format already styled |
Sətir 3.331: |
Sətir 3.227: |
| | | |
| -- Several of the above rely upon detecting this as nil, so do it last. | | -- Several of the above rely upon detecting this as nil, so do it last. |
− | if (is_set (Periodical) or is_set (ScriptPeriodical) or is_set (TransPeriodical)) then | + | if is_set(Periodical) then |
| if is_set(Title) or is_set(TitleNote) then | | if is_set(Title) or is_set(TitleNote) then |
− | Periodical = sepc .. " " .. format_periodical (ScriptPeriodical, ScriptPeriodical_origin, Periodical, TransPeriodical); | + | Periodical = sepc .. " " .. wrap_style ('italic-title', Periodical) |
| else | | else |
− | Periodical = format_periodical (ScriptPeriodical, ScriptPeriodical_origin, Periodical, TransPeriodical); | + | Periodical = wrap_style ('italic-title', Periodical) |
| end | | end |
| end | | end |
Sətir 3.343: |
Sətir 3.239: |
| the annotation directly follows the |title= parameter value in the citation rather than the |event= parameter value (if provided). | | the annotation directly follows the |title= parameter value in the citation rather than the |event= parameter value (if provided). |
| ]] | | ]] |
− | if "speech" == config.CitationClass then -- cite speech only | + | if "speech" == config.CitationClass then -- cite speech only |
− | TitleNote = " (Speech)"; -- annotate the citation | + | TitleNote = " (Speech)"; -- annotate the citation |
− | if is_set (Periodical) then -- if Periodical, perhaps because of an included |website= or |journal= parameter | + | if is_set (Periodical) then -- if Periodical, perhaps because of an included |website= or |journal= parameter |
− | if is_set (Conference) then -- and if |event= is set | + | if is_set (Conference) then -- and if |event= is set |
− | Conference = Conference .. sepc .. " "; -- then add appropriate punctuation to the end of the Conference variable before rendering | + | Conference = Conference .. sepc .. " "; -- then add appropriate punctuation to the end of the Conference variable before rendering |
| end | | end |
| end | | end |
Sətir 3.380: |
Sətir 3.276: |
| | | |
| elseif 'episode' == config.CitationClass then -- special case for cite episode | | elseif 'episode' == config.CitationClass then -- special case for cite episode |
− | tcommon = safe_join( {Title, TitleNote, TitleType, Series, Language, Edition, Publisher}, sepc ); | + | tcommon = safe_join( {Title, TitleNote, TitleType, Series, Transcript, Language, Edition, Publisher}, sepc ); |
| | | |
| else -- all other CS1 templates | | else -- all other CS1 templates |
Sətir 3.393: |
Sətir 3.289: |
| end | | end |
| | | |
− | local idcommon; | + | local idcommon = safe_join( { ID_list, URL, Archived, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc ); |
− | if 'audio-visual' == config.CitationClass or 'episode' == config.CitationClass then -- special case for cite AV media & cite episode position transcript
| |
− | idcommon = safe_join( { ID_list, URL, Archived, Transcript, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc );
| |
− | else
| |
− | idcommon = safe_join( { ID_list, URL, Archived, AccessDate, Via, SubscriptionRequired, Lay, Quote }, sepc );
| |
− | end
| |
− |
| |
| local text; | | local text; |
| local pgtext = Position .. Sheet .. Sheets .. Page .. Pages .. At; | | local pgtext = Position .. Sheet .. Sheets .. Page .. Pages .. At; |
Sətir 3.413: |
Sətir 3.303: |
| end | | end |
| end | | end |
− | end | + | end |
| + | |
| if is_set(Authors) then | | if is_set(Authors) then |
| + | -- для рувики: конкатенация |coauthors к |authors (без остальной поддержки вроде убирания амперсанта и автоскрытия) |
| + | if is_set(Coauthors) then |
| + | Authors = Authors .. "; " .. Coauthors; |
| + | end |
| + | |
| if (not is_set (Date)) then -- when date is set it's in parentheses; no Authors termination | | if (not is_set (Date)) then -- when date is set it's in parentheses; no Authors termination |
| Authors = terminate_name_list (Authors, sepc); -- when no date, terminate with 0 or 1 sepc and a space | | Authors = terminate_name_list (Authors, sepc); -- when no date, terminate with 0 or 1 sepc and a space |
Sətir 3.425: |
Sətir 3.321: |
| if (sepc ~= '.') then | | if (sepc ~= '.') then |
| in_text = in_text:lower() -- lowercase for cs2 | | in_text = in_text:lower() -- lowercase for cs2 |
| + | end |
| + | else |
| + | if EditorCount <= 1 then |
| + | post_text = ", " .. cfg.messages['editor']; |
| + | else |
| + | post_text = ", " .. cfg.messages['editors']; |
| end | | end |
− | end
| + | end |
− | if EditorCount <= 1 then
| |
− | post_text = " (" .. cfg.messages['editor'] .. ")"; -- be consistent with no-author, no-date case
| |
− | else
| |
− | post_text = " (" .. cfg.messages['editors'] .. ")";
| |
− | end | |
| Editors = terminate_name_list (in_text .. Editors .. post_text, sepc); -- terminate with 0 or 1 sepc and a space | | Editors = terminate_name_list (in_text .. Editors .. post_text, sepc); -- terminate with 0 or 1 sepc and a space |
| end | | end |
Sətir 3.472: |
Sətir 3.369: |
| | | |
| if is_set(PostScript) and PostScript ~= sepc then | | if is_set(PostScript) and PostScript ~= sepc then |
− | text = safe_join( {text, sepc}, sepc ); --Deals with italics, spaces, etc. | + | text = safe_join( {text, sepc}, sepc ); --Deals with italics, spaces, etc. |
| text = text:sub(1,-sepc:len()-1); | | text = text:sub(1,-sepc:len()-1); |
| end | | end |
| | | |
| text = safe_join( {text, PostScript}, sepc ); | | text = safe_join( {text, PostScript}, sepc ); |
− | | + | |
− | -- Now enclose the whole thing in a <cite/> element | + | -- Now enclose the whole thing in a <cite/> element |
− | local options = {}; | + | local options = {}; |
− | | + | |
− | if is_set(config.CitationClass) and config.CitationClass ~= "citation" then | + | if is_set(config.CitationClass) and config.CitationClass ~= "citation" then |
− | options.class = config.CitationClass; | + | options.class = config.CitationClass; |
− | options.class = "citation " .. config.CitationClass; -- class=citation required for blue highlight when used with |ref= | + | options.class = "citation " .. config.CitationClass; -- class=citation required for blue highlight when used with |ref= |
− | else | + | else |
− | options.class = "citation"; | + | options.class = "citation"; |
− | end | + | end |
− | | + | |
− | if is_set(Ref) and Ref:lower() ~= "none" then -- set reference anchor if appropriate | + | if is_set(Ref) and Ref:lower() ~= "none" then -- set reference anchor if appropriate |
− | local id = Ref | + | local id = Ref |
− | if ('harv' == Ref ) then | + | if ('harv' == Ref ) then |
− | local namelist = {}; -- holds selected contributor, author, editor name list | + | local namelist = {}; -- holds selected contributor, author, editor name list |
− | local year = first_set ({Year, anchor_year}, 2); -- Year first for legacy citations and for YMD dates that require disambiguation | + | local year = first_set ({Year, anchor_year}, 2); -- Year first for legacy citations and for YMD dates that require disambiguation |
− | | + | |
− | if #c > 0 then -- if there is a contributor list | + | if #c > 0 then -- if there is a contributor list |
− | namelist = c; -- select it | + | namelist = c; -- select it |
− | elseif #a > 0 then -- or an author list | + | elseif #a > 0 then -- or an author list |
− | namelist = a; | + | namelist = a; |
− | elseif #e > 0 then -- or an editor list | + | elseif #e > 0 then -- or an editor list |
− | namelist = e; | + | namelist = e; |
− | end | + | end |
− | if #namelist > 0 then -- if there are names in namelist | + | if #namelist > 0 then -- if there are names in namelist |
− | id = anchor_id (namelist, year); -- go make the CITEREF anchor | + | id = anchor_id (namelist, year); -- go make the CITEREF anchor |
− | else | + | else |
− | id = ''; -- unset | + | id = ''; -- unset |
| + | end |
| + | elseif Ref ~= '' and mw.ustring.sub(Ref, 0, 7) ~= 'CITEREF' then -- для рувики: иная генерация ref-якорей |
| + | if mw.ustring.match(id, '%d%d%d%d') then |
| + | id = 'CITEREF' .. id |
| + | else |
| + | local yearForRef = nil |
| + | if year and mw.ustring.match(year, '^%d%d%d%d$') then |
| + | yearForRef = mw.ustring.match(year, '^%d%d%d%d$') |
| + | elseif Date and mw.ustring.match(Date, '%d%d%d%d') then |
| + | yearForRef = mw.ustring.match(Date, '%d%d%d%d') |
| + | end |
| + | if yearForRef then |
| + | id = 'CITEREF' .. id .. yearForRef |
| + | else |
| + | id = '' -- TODO: для рувики: выдавать ошибку? |
| + | end |
| end | | end |
| end | | end |
Sətir 3.524: |
Sətir 3.437: |
| end | | end |
| | | |
− | table.insert (render, substitute (cfg.presentation['ocins'], {OCinSoutput})); -- append metadata to the citation | + | table.insert (render, substitute (cfg.presentation['ocins'], {OCinSoutput})); -- append metadata to the citation |
| | | |
− | if 0 ~= #z.message_tail then | + | if #z.message_tail ~= 0 then |
| table.insert (render, ' '); | | table.insert (render, ' '); |
| for i,v in ipairs( z.message_tail ) do | | for i,v in ipairs( z.message_tail ) do |
Sətir 3.539: |
Sətir 3.452: |
| end | | end |
| | | |
− | if 0 ~= #z.maintenance_cats then | + | if #z.maintenance_cats ~= 0 then |
− | local maint_msgs = {}; -- here we collect all of the maint messages | + | table.insert (render, '<span class="citation-comment" style="display:none; color:#33aa33; margin-left:0.3em">'); |
| for _, v in ipairs( z.maintenance_cats ) do -- append maintenance categories | | for _, v in ipairs( z.maintenance_cats ) do -- append maintenance categories |
− | local maint = {}; -- here we assemble a maintenence message
| + | table.insert (render, v); |
− | table.insert (maint, v); -- maint msg is the category name | + | table.insert (render, ' ('); |
− | table.insert (maint, ' ('); -- open the link text | + | table.insert (render, make_wikilink (':Category:' .. v, 'link')); |
− | table.insert (maint, make_wikilink (':Category:' .. v, 'link')); -- add the link | + | table.insert (render, ') '); |
− | table.insert (maint, ')'); -- and close it | |
− | table.insert (maint_msgs, table.concat (maint)); -- assemble new maint message and add it to the maint_msgs table
| |
| end | | end |
− | table.insert (render, substitute (cfg.presentation['hidden-maint'], table.concat (maint_msgs, ' '))); -- wrap the group of maint message with proper presentation and save | + | table.insert (render, '</span>'); |
| end | | end |
| | | |
Sətir 3.584: |
Sətir 3.495: |
| local state; | | local state; |
| | | |
− | if in_array (cite_class, {'arxiv', 'biorxiv', 'citeseerx', 'ssrn'}) then -- limited parameter sets allowed for these templates | + | if in_array (cite_class, {'arxiv', 'biorxiv', 'citeseerx'}) then -- limited parameter sets allowed for these templates |
| state = whitelist.limited_basic_arguments[name]; | | state = whitelist.limited_basic_arguments[name]; |
| if true == state then return true; end -- valid actively supported parameter | | if true == state then return true; end -- valid actively supported parameter |
Sətir 3.646: |
Sətir 3.557: |
| ]] | | ]] |
| | | |
− | local function missing_pipe_check (parameter, value) | + | local function missing_pipe_check (value) |
| local capture; | | local capture; |
| value = value:gsub ('%b<>', ''); -- remove xml/html tags because attributes: class=, title=, etc | | value = value:gsub ('%b<>', ''); -- remove xml/html tags because attributes: class=, title=, etc |
| | | |
− | capture = value:match ('%s+(%a[%w%-]+)%s*=') or value:match ('^(%a[%w%-]+)%s*='); -- find and categorize parameters with possible missing pipes | + | capture = value:match ('%s+(%a[%a%d]+)%s*=') or value:match ('^(%a[%a%d]+)%s*='); -- find and categorize parameters with possible missing pipes |
| if capture and validate (capture) then -- if the capture is a valid parameter name | | if capture and validate (capture) then -- if the capture is a valid parameter name |
− | table.insert( z.message_tail, {set_error ('missing_pipe',parameter)}); | + | add_maint_cat ('missing_pipe'); |
| end | | end |
| end | | end |
| | | |
| | | |
− | --[[--------------------------< H A S _ E X T R A N E O U S _ P U N C T >-------------------------------------- | + | --[[--------------------------< C S 1 . C I T A T I O N >------------------------------------------------------ |
− | | |
− | look for extraneous terminal punctuation in most parameter values; parameters listed in skip table are not checked
| |
− | | |
− | ]]
| |
− | | |
− | local function has_extraneous_punc (param, value)
| |
− | if cfg.punct_skip[param] then
| |
− | return; -- parameter name found in the skip table so done
| |
− | end
| |
− | end
| |
− | | |
− | | |
− | --[[--------------------------< C I T A T I O N >--------------------------------------------------------------
| |
| | | |
| This is used by templates such as {{cite book}} to create the actual citation text. | | This is used by templates such as {{cite book}} to create the actual citation text. |
Sətir 3.676: |
Sətir 3.574: |
| ]] | | ]] |
| | | |
− | local function citation(frame)
| + | function cs1.citation(frame) |
| Frame = frame; -- save a copy incase we need to display an error message in preview mode | | Frame = frame; -- save a copy incase we need to display an error message in preview mode |
| local pframe = frame:getParent() | | local pframe = frame:getParent() |
Sətir 3.718: |
Sətir 3.616: |
| set_error = utilities.set_error; | | set_error = utilities.set_error; |
| select_one = utilities.select_one; | | select_one = utilities.select_one; |
− | add_maint_cat = utilities.add_maint_cat; | + | add_maint_cat = function () end; -- для рувики: вместо utilities.add_maint_cat; |
| wrap_style = utilities.wrap_style; | | wrap_style = utilities.wrap_style; |
| safe_for_italics = utilities.safe_for_italics; | | safe_for_italics = utilities.safe_for_italics; |
| is_wikilink = utilities.is_wikilink; | | is_wikilink = utilities.is_wikilink; |
| make_wikilink = utilities.make_wikilink; | | make_wikilink = utilities.make_wikilink; |
− | strip_apostrophe_markup = utilities.strip_apostrophe_markup;
| |
| | | |
| z = utilities.z; -- table of error and category tables in Module:Citation/CS1/Utilities | | z = utilities.z; -- table of error and category tables in Module:Citation/CS1/Utilities |
Sətir 3.793: |
Sətir 3.690: |
| end | | end |
| end | | end |
− | missing_pipe_check (k, v); -- do we think that there is a parameter that is missing a pipe? | + | missing_pipe_check (v); -- do we think that there is a parameter that is missing a pipe? |
| -- TODO: is this the best place for this translation? | | -- TODO: is this the best place for this translation? |
| args[k] = v; | | args[k] = v; |
Sətir 3.804: |
Sətir 3.701: |
| if 'string' == type (k) then -- don't evaluate positional parameters | | if 'string' == type (k) then -- don't evaluate positional parameters |
| has_invisible_chars (k, v); | | has_invisible_chars (k, v); |
− | has_extraneous_punc (k, v); -- look for extraneous terminal punctuation in parameter values
| |
| end | | end |
| end | | end |
Sətir 3.810: |
Sətir 3.706: |
| end | | end |
| | | |
− | --[[--------------------------< E X P O R T E D F U N C T I O N S >------------------------------------------
| + | return cs1; |
− | ]]
| |
− | | |
− | return {citation = citation}; | |