Changes

Jump to navigation Jump to search
8,360 bytes added ,  16:28, 19 January 2019
synch from sandbox;
Line 153: Line 153:  
 
 
if not domain:match ('^[%a%d]') then -- first character must be letter or digit
 
if not domain:match ('^[%a%d]') then -- first character must be letter or digit
 +
return false;
 +
end
 +
 +
if domain:match ('^%a+:') then -- hack to detect things that look like s:Page:Title where Page: is namespace at wikisource
 
return false;
 
return false;
 
end
 
end
Line 399: Line 403:  
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;
Line 419: Line 423:     
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
Line 593: Line 597:  
return substitute( cfg.messages[key], str );
 
return substitute( cfg.messages[key], str );
 
end
 
end
 +
end
 +
 +
 +
--[[--------------------------< W I K I S O U R C E _ U R L _ M A K E >----------------------------------------
 +
 +
makes a wikisource url from wikisource interwiki link.  returns the url and appropriate label; nil else.
 +
 +
str is the value assigned to |chapter= (or aliases) or |title= or |title-link=
 +
 +
]]
 +
 +
local function wikisource_url_make (str)
 +
local wl_type, D, L;
 +
local ws_url, ws_label;
 +
 +
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
 
end
   Line 605: Line 661:  
local function format_chapter_title (scriptchapter, chapter, transchapter, chapterurl, chapter_url_source, no_quotes, access)
 
local function format_chapter_title (scriptchapter, chapter, transchapter, chapterurl, chapter_url_source, no_quotes, access)
 
local chapter_error = '';
 
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
 
if not is_set (chapter) then
 
chapter = ''; -- to be safe for concatenation
 
chapter = ''; -- to be safe for concatenation
Line 619: Line 681:  
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 .. '&nbsp;', '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
   Line 822: Line 887:  
return str; -- nothing to do, we're done
 
return str; -- nothing to do, we're done
 
end
 
end
 +
 +
str = str:gsub ('&[nm]dash;', {['&ndash;'] = '–', ['&mdash;'] = '—'}); -- replace &mdash; and &ndash; entities  with their characters; semicolon mucks up the text.split
 
 
 
local out = {};
 
local out = {};
Line 1,342: Line 1,409:  
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.  These names can be found (for the time being) at
+
are used as sub-domain names: cbk-zam.wikipedia.org.  A list of language names and codes supported by fetchLanguageNames()
https://phabricator.wikimedia.org/diffusion/ECLD/browse/master/LocalNames/LocalNamesEn.php
+
can be found at Template:Citation Style documentation/language/doc
   −
Names but that are included in the list will be found if that name is provided in the |language= parameter.  For example,
+
Names 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.
Line 1,358: Line 1,429:  
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() and 3 ~= code:len() then -- two- or three-character codes only; extensions not supported
+
if 2 == code:len() or 3 == code:len() then -- two- or three-character codes only; extensions not supported
return name; -- so return the name but not the code
+
return name, code; -- so return the name and the code
 
end
 
end
return name, code; -- found it, return name to ensure proper capitalization and the the code
+
ietf_code = code; -- remember that we found an ietf-like code and save its name
 +
ietf_name = name; -- but keep looking for a 2- or 3-char code
 
end
 
end
 
end
 
end
return lang; -- not valid language; return language in original case and nil for the code
+
-- didn't find name with 2- or 3-char code; if ietf-like code found return
 +
return ietf_code and ietf_name or lang; -- associated name; return original language text else
 
end
 
end
   Line 1,404: Line 1,480:     
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 lang:match ('^%a%a%-') then -- strip ietf language tags from code; TODO: is there a need to support 3-char with tag?
+
if name then -- there was a remapped code so
lang = lang:match ('(%a%a)%-') -- keep only 639-1 code portion to lang; TODO: do something with 3166 alpha 2 country code?
+
lang = lang:gsub ('^(%a%a%a?)%-.*', '%1'); -- strip ietf tags from code
end
+
else
if 2 == lang:len() or 3 == lang:len() then -- if two-or three-character code
+
if lang:match ('^%a%a%-') then -- strip ietf tags from code; TODO: is there a need to support 3-char with tag?
name = mw.language.fetchLanguageName( lang:lower(), this_wiki_code); -- get language name if |language= is a proper code
+
lang = lang:match ('(%a%a)%-') -- keep only 639-1 code portion to lang; TODO: do something with 3166 alpha 2 country code?
if not is_set (name) then
+
end
name = cfg.lang_code_remap[lang]; -- not supported by MediaWiki; is it in remap?
+
if 2 == lang:len() or 3 == lang:len() then -- if two-or three-character code
 +
name = mw.language.fetchLanguageName (lang:lower(), this_wiki_code); -- get language name if |language= is a proper code
 
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
Line 1,441: Line 1,519:  
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, ' and ') -- insert '<space>and<space>' between two language names
+
name = table.concat (language_list, cfg.messages['parameter-pair-separator']) -- insert '<space>and<space>' between two language names
 
elseif 2 < code then
 
elseif 2 < code then
language_list[code] = 'and ' .. language_list[code]; -- prepend last name with 'and<space>'
+
name = table.concat (language_list, ', '); -- and concatenate with '<comma><space>' separators
name = table.concat (language_list, ', ') -- and concatenate with '<comma><space>' separators
+
name = name:gsub (', ([^,]+)$', cfg.messages['parameter-final-separator'] .. '%1'); -- replace last '<comma><space>' separator with '<comma><space>and<space>' separator
 
end
 
end
 
if this_wiki_name == name then
 
if this_wiki_name == name then
Line 1,869: Line 1,947:  
end
 
end
   −
local vol = '';
+
local vol = ''; -- here for all cites except magazine
 
 
 
if is_set (volume) then
 
if is_set (volume) then
if (4 < mw.ustring.len(volume)) then
+
if volume:match ('^[MDCLXVI]+$') or volume:match ('^%d+$')then -- volume value is all digits or all uppercase roman numerals
vol = substitute (cfg.messages['j-vol'], {sepc, volume});
+
vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)}); -- render in bold face
else
+
elseif (4 < mw.ustring.len(volume)) then -- not all digits or roman numerals and longer than 4 characters
vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)});
+
vol = substitute (cfg.messages['j-vol'], {sepc, volume}); -- not bold
 +
add_prop_cat ('long_vol');
 +
else -- four or less characters
 +
vol = substitute (cfg.presentation['vol-bold'], {sepc, hyphen_to_dash(volume)}); -- bold
 
end
 
end
 
end
 
end
Line 1,936: Line 2,017:  
return '', '', '', ''; -- return empty strings
 
return '', '', '', ''; -- return empty strings
 
end
 
end
 +
 +
 +
--[[--------------------------< I N S O U R C E _ L O C _ G E T >----------------------------------------------
 +
 +
returns one of the in-source locators: page, pages, or at.
 +
 +
If any of these are interwiki links to wikisource, returns the label portion of the interwikilink as plain text
 +
for use in COinS.  This COinS thing is done because here we convert an interwiki link to and external link and
 +
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 .. '&nbsp;', '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 .. '&nbsp;', '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 .. '&nbsp;', '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
 +
      Line 2,082: Line 2,220:  
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 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 c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
 
local c = {}; -- contributors list from |contributor-lastn= / contributor-firstn= pairs
Line 2,297: Line 2,431:  
-- 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', 'pp', 'pages', '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']  
Line 2,304: Line 2,442:  
NoPP = nil; -- unset, used as a flag later
 
NoPP = nil; -- unset, used as a flag later
 
end
 
end
  −
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.
  −
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
 
-- both |publication-place= and |place= (|location=) allowed if different
Line 2,693: Line 2,818:  
['Volume'] = Volume,
 
['Volume'] = Volume,
 
['Issue'] = Issue,
 
['Issue'] = Issue,
['Pages'] = get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At}, 5)), -- pages stripped of external links
+
['Pages'] = coins_pages or get_coins_pages (first_set ({Sheet, Sheets, Page, Pages, At}, 5)), -- pages stripped of external links
 
['Edition'] = Edition,
 
['Edition'] = Edition,
 
['PublisherName'] = PublisherName,
 
['PublisherName'] = PublisherName,
Line 2,894: Line 3,019:  
end
 
end
 
 
if is_set(TitleLink) and is_set(Title) then
  −
Title = make_wikilink (TitleLink, Title);
  −
end
  −
   
if in_array(config.CitationClass, {'web', 'news', 'journal', 'magazine', 'pressrelease', 'podcast', 'newsgroup', 'mailinglist', 'interview', 'arxiv', 'biorxiv', 'citeseerx'}) or
 
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
 
('citation' == config.CitationClass and is_set (Periodical) and not is_set (Encyclopedia)) or
Line 2,922: Line 3,043:  
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 .. '&nbsp;', '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
Title = Title .. TransTitle .. TransError;
+
local ws_url, ws_label;
 +
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 .. '&nbsp;', '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
Line 3,353: Line 3,492:  
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 #z.message_tail ~= 0 then
+
if 0 ~= #z.message_tail 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
Line 3,366: Line 3,505:  
end
 
end
   −
if #z.maintenance_cats ~= 0 then
+
if 0 ~= #z.maintenance_cats then
table.insert (render, '<span class="citation-comment" style="display:none; color:#33aa33; margin-left:0.3em">');
+
local maint_msgs = {}; -- here we collect all of the maint messages
 
for _, v in ipairs( z.maintenance_cats ) do -- append maintenance categories
 
for _, v in ipairs( z.maintenance_cats ) do -- append maintenance categories
table.insert (render, v);
+
local maint = {}; -- here we assemble a maintenence message
table.insert (render, ' (');
+
table.insert (maint, v); -- maint msg is the category name
table.insert (render, make_wikilink (':Category:' .. v, 'link'));
+
table.insert (maint, ' ('); -- open the link text
table.insert (render, ') ');
+
table.insert (maint, make_wikilink (':Category:' .. v, 'link')); -- add the link
 +
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, '</span>');
+
table.insert (render, substitute (cfg.presentation['hidden-maint'], table.concat (maint_msgs, ' '))); -- wrap the group of maint message with proper presentation and save
 
end
 
end
 
 
Anonymous user

Navigation menu