Module:Citation/CS1/Identifiers: Difference between revisions

    (doi.org is not accepting fully url encoded urls; '/' character must not be encoded;)
    enwiki:Mediawiki>Trappist the monk
    (synch from sandbox;)
    Line 11: Line 11:


    local cfg; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
    local cfg; -- table of configuration tables that are defined in Module:Citation/CS1/Configuration
    local wd_int_lang = (mw.site.server:match ('wikidata') and mw.getCurrentFrame():preprocess('{{int:lang}}')) or '';




    Line 24: Line 26:
    local url_string = options.id;
    local url_string = options.id;
    local ext_link;
    local ext_link;
    local this_wiki_code; -- wikipedia subdomain; 'en' for en.wikipedia.org
    local wd_article; -- article title from wikidata
    if options.encode == true or options.encode == nil then
    if options.encode == true or options.encode == nil then
    url_string = mw.uri.encode( url_string );
    url_string = mw.uri.encode( url_string );
    if 'doi' == options.label then -- 2018-07-02 doi.org stopped accepting urls with url encoded '/' (%2F)
    url_string = url_string:gsub ('%%2F', '/'); -- special case for doi; undo url-encoded slashes
    end
    end
    end
     
    ext_link = mw.ustring.format ('[%s%s%s %s]', options.prefix, url_string, options.suffix or "", mw.text.nowiki(options.id));
    ext_link = mw.ustring.format ('[%s%s%s %s]', options.prefix, url_string, options.suffix or "", mw.text.nowiki(options.id));
    if is_set(options.access) then
    if is_set(options.access) then
    ext_link = substitute (cfg.presentation['access-signal'], {ext_link, cfg.presentation[options.access]}); -- add the free-to-read / paywall lock
    ext_link = substitute (cfg.presentation['ext-link-access-signal'], {cfg.presentation[options.access].class, cfg.presentation[options.access].title, ext_link}); -- add the free-to-read / paywall lock
    end
    end
    this_wiki_code = mw.language.getContentLanguage():getCode(); -- get this wikipedia's language code (subdomain)
    if string.match (mw.site.server, 'wikidata') then
    this_wiki_code = mw.getCurrentFrame():preprocess('{{int:lang}}'); -- on wikidata so use interface language setting instead
    end
    if is_set (options.q) then
    wd_article = mw.wikibase.getEntity (options.q):getSitelink (this_wiki_code .. 'wiki'); -- fetch article title from wd
    if wd_article then
    wd_article = table.concat ({':', this_wiki_code, ':', wd_article}); -- make interwiki link if taken from wd; leading colon required
    end
    end
    return table.concat ({
    return table.concat ({
    make_wikilink (options.link, options.label),
    make_wikilink (wd_article or options.link, options.label), -- wikidata link or locally specified
    options.separator or ' ',
    options.separator or ' ',
    ext_link
    ext_link
    Line 186: Line 200:
    where:
    where:
    <archive> is a string of alpha characters - may be hyphenated; no other punctuation
    <archive> is a string of alpha characters - may be hyphenated; no other punctuation
    <class> is a string of alpha characters - may be hyphenated; no other punctuation
    <class> is a string of alpha characters - may be hyphenated; no other punctuation; not the same as |class= parameter which is not supported in this form
    <date code> is four digits in the form YYMM where YY is the last two digits of the four-digit year and MM is the month number January = 01
    <date code> is four digits in the form YYMM where YY is the last two digits of the four-digit year and MM is the month number January = 01
    first digit of YY for this form can only 9 and 0
    first digit of YY for this form can only 9 and 0
    Line 209: Line 223:
    local handler = cfg.id_handlers['ARXIV'];
    local handler = cfg.id_handlers['ARXIV'];
    local year, month, version;
    local year, month, version;
    local err_cat = '';
    local err_cat = false; -- assume no error message
    local text;
    local text; -- output text
    if id:match("^%a[%a%.%-]+/[90]%d[01]%d%d%d%d$") or id:match("^%a[%a%.%-]+/[90]%d[01]%d%d%d%dv%d+$") then -- test for the 9108-0703 format w/ & w/o version
    if id:match("^%a[%a%.%-]+/[90]%d[01]%d%d%d%d$") or id:match("^%a[%a%.%-]+/[90]%d[01]%d%d%d%dv%d+$") then -- test for the 9108-0703 format w/ & w/o version
    Line 218: Line 232:
    if ((not (90 < year or 8 > year)) or (1 > month or 12 < month)) or -- if invalid year or invalid month
    if ((not (90 < year or 8 > year)) or (1 > month or 12 < month)) or -- if invalid year or invalid month
    ((91 == year and 7 > month) or (7 == year and 3 < month)) then -- if years ok, are starting and ending months ok?
    ((91 == year and 7 > month) or (7 == year and 3 < month)) then -- if years ok, are starting and ending months ok?
    err_cat = ' ' .. set_error( 'bad_arxiv' ); -- set error message
    err_cat = true; -- flag for error message
    end
    end
    elseif id:match("^%d%d[01]%d%.%d%d%d%d$") or id:match("^%d%d[01]%d%.%d%d%d%dv%d+$") then -- test for the 0704-1412 w/ & w/o version
    elseif id:match("^%d%d[01]%d%.%d%d%d%d$") or id:match("^%d%d[01]%d%.%d%d%d%dv%d+$") then -- test for the 0704-1412 w/ & w/o version
    year, month = id:match("^(%d%d)([01]%d)%.%d%d%d%d[v%d]*$");
    year, month = id:match("^(%d%d)([01]%d)%.%d%d%d%d[v%d]*$");
    Line 226: Line 241:
    if ((7 > year) or (14 < year) or (1 > month or 12 < month)) or -- is year invalid or is month invalid? (doesn't test for future years)
    if ((7 > year) or (14 < year) or (1 > month or 12 < month)) or -- is year invalid or is month invalid? (doesn't test for future years)
    ((7 == year) and (4 > month)) then --or -- when year is 07, is month invalid (before April)?
    ((7 == year) and (4 > month)) then --or -- when year is 07, is month invalid (before April)?
    err_cat = ' ' .. set_error( 'bad_arxiv' ); -- set error message
    err_cat = true; -- flag for error message
    end
    end
    elseif id:match("^%d%d[01]%d%.%d%d%d%d%d$") or id:match("^%d%d[01]%d%.%d%d%d%d%dv%d+$") then -- test for the 1501- format w/ & w/o version
    elseif id:match("^%d%d[01]%d%.%d%d%d%d%d$") or id:match("^%d%d[01]%d%.%d%d%d%d%dv%d+$") then -- test for the 1501- format w/ & w/o version
    year, month = id:match("^(%d%d)([01]%d)%.%d%d%d%d%d[v%d]*$");
    year, month = id:match("^(%d%d)([01]%d)%.%d%d%d%d%d[v%d]*$");
    Line 233: Line 249:
    month = tonumber(month);
    month = tonumber(month);
    if ((15 > year) or (1 > month or 12 < month)) then -- is year invalid or is month invalid? (doesn't test for future years)
    if ((15 > year) or (1 > month or 12 < month)) then -- is year invalid or is month invalid? (doesn't test for future years)
    err_cat = ' ' .. set_error( 'bad_arxiv' ); -- set error message
    err_cat = true; -- flag for error message
    end
    end
    else
    else
    err_cat = ' ' .. set_error( 'bad_arxiv' ); -- arXiv id doesn't match any format
    err_cat = true; -- not a recognized format; flag for error message
    end
    end


    text = external_link_id({link = handler.link, label = handler.label,
    err_cat = err_cat and table.concat ({' ', set_error ('bad_arxiv')}) or ''; -- set error message if flag is true
    text = external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=handler.access}) .. err_cat;
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=handler.access}) .. err_cat;


    if is_set (class) then
    if is_set (class) then
    class = ' [[' .. '//arxiv.org/archive/' .. class .. ' ' .. class .. ']]'; -- external link within square brackets, not wikilink
    if id:match ('^%d+') then
    else
    text = table.concat ({text, ' [[//arxiv.org/archive/', class, ' ', class, ']]'}); -- external link within square brackets, not wikilink
    class = ''; -- empty string for concatenation
    else
    text = table.concat ({text, ' ', set_error ('class_ignored')});
    end
    end
    end
     
    return text .. class;
    return text;
    end
    end


    Line 276: Line 297:
    local year;
    local year;


    local text = external_link_id({link=handler.link, label=handler.label,
    local text = external_link_id({link=handler.link, label=handler.label, q = handler.q,
    prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode,
    prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode,
    access=access});
    access=access});
    Line 321: Line 342:
    end
    end
    return external_link_id({link = handler.link, label = handler.label,
    return external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator,
    prefix=handler.prefix,id=id,separator=handler.separator,
    encode=handler.encode, access=handler.access}) .. err_cat;
    encode=handler.encode, access=handler.access}) .. err_cat;
    Line 338: Line 359:
    local matched;
    local matched;
    local text = external_link_id({link=handler.link, label=handler.label,
    local text = external_link_id({link=handler.link, label=handler.label, q = handler.q,
    prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode,
    prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode,
    access=handler.access});
    access=handler.access});
    Line 381: Line 402:
    inactive = " (" .. cfg.messages['inactive'] .. " " .. inactive .. ")"  
    inactive = " (" .. cfg.messages['inactive'] .. " " .. inactive .. ")"  
    end
    end
    text = external_link_id({link = handler.link, label = handler.label,
    text = external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=access}) .. (inactive or '')
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=access}) .. (inactive or '')


    Line 412: Line 433:
    local handler = cfg.id_handlers['HDL'];
    local handler = cfg.id_handlers['HDL'];
    local text = external_link_id({link = handler.link, label = handler.label,
    local text = external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=access})
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=access})


    Line 492: Line 513:
    local handler = cfg.id_handlers['ASIN'];
    local handler = cfg.id_handlers['ASIN'];
    return external_link_id({link=handler.link,
    return external_link_id({link=handler.link,
    label=handler.label, prefix=handler.prefix .. domain .. "/dp/",
    label=handler.label, q = handler.q, prefix=handler.prefix .. domain .. "/dp/",
    id=id, encode=handler.encode, separator = handler.separator}) .. err_cat;
    id=id, encode=handler.encode, separator = handler.separator}) .. err_cat;
    end
    end
    Line 579: Line 600:
    end
    end
    text = external_link_id({link = handler.link, label = handler.label,
    text = external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})
       
       
    Line 615: Line 636:
    end
    end
    return external_link_id({link = handler.link, label = handler.label,
    return external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
    end
    end
    Line 672: Line 693:
    end
    end


    return external_link_id({link = handler.link, label = handler.label,
    return external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=lccn,separator=handler.separator, encode=handler.encode}) .. err_cat;
    prefix=handler.prefix,id=lccn,separator=handler.separator, encode=handler.encode}) .. err_cat;
    end
    end
    Line 704: Line 725:
    end
    end
    return external_link_id({link = handler.link, label = handler.label,
    return external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
    end
    end
    Line 744: Line 765:
    end
    end
    local text = external_link_id({link=handler.link, label=handler.label,
    local text = external_link_id({link=handler.link, label=handler.label, q = handler.q,
    prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode}) .. err_msg;
    prefix=handler.prefix, id=id, separator=handler.separator, encode=handler.encode}) .. err_msg;


    Line 765: Line 786:


    if not is_set (ident) then -- if malformed return an error
    if not is_set (ident) then -- if malformed return an error
    return external_link_id({link=handler.link, label=handler.label,
    return external_link_id({link=handler.link, label=handler.label, q = handler.q,
    prefix=handler.prefix .. 'OL',
    prefix=handler.prefix .. 'OL',
    id=id, separator=handler.separator, encode = handler.encode,
    id=id, separator=handler.separator, encode = handler.encode,
    Line 774: Line 795:
    if ( code == "A" ) then
    if ( code == "A" ) then
    return external_link_id({link=handler.link, label=handler.label,
    return external_link_id({link=handler.link, label=handler.label, q = handler.q,
    prefix=handler.prefix .. 'authors/OL',
    prefix=handler.prefix .. 'authors/OL',
    id=id, separator=handler.separator, encode = handler.encode,
    id=id, separator=handler.separator, encode = handler.encode,
    Line 781: Line 802:
    if ( code == "M" ) then
    if ( code == "M" ) then
    return external_link_id({link=handler.link, label=handler.label,
    return external_link_id({link=handler.link, label=handler.label, q = handler.q,
    prefix=handler.prefix .. 'books/OL',
    prefix=handler.prefix .. 'books/OL',
    id=id, separator=handler.separator, encode = handler.encode,
    id=id, separator=handler.separator, encode = handler.encode,
    Line 788: Line 809:


    if ( code == "W" ) then
    if ( code == "W" ) then
    return external_link_id({link=handler.link, label=handler.label,
    return external_link_id({link=handler.link, label=handler.label, q = handler.q,
    prefix=handler.prefix .. 'works/OL',
    prefix=handler.prefix .. 'works/OL',
    id=id, separator=handler.separator, encode = handler.encode,
    id=id, separator=handler.separator, encode = handler.encode,
    Line 848: Line 869:
    });
    });
    else
    else
    text = external_link_id({link = handler.link, label = handler.label, -- no embargo date or embargo has expired, ok to link to article
    text = external_link_id({link = handler.link, label = handler.label, q = handler.q, -- no embargo date or embargo has expired, ok to link to article
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=handler.access}) .. err_cat;
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=handler.access}) .. err_cat;
    end
    end
    Line 877: Line 898:
    end
    end
    return external_link_id({link = handler.link, label = handler.label,
    return external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
    end
    end
    Line 910: Line 931:
    end
    end
    text = external_link_id({link = handler.link, label = handler.label,
    text = external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=handler.access}) .. err_cat;
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode, access=handler.access}) .. err_cat;


    Line 927: Line 948:
    local handler = cfg.id_handlers['USENETID'];
    local handler = cfg.id_handlers['USENETID'];


    local text = external_link_id({link = handler.link, label = handler.label,
    local text = external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode})
       
       
    Line 963: Line 984:
    end
    end
    return external_link_id({link = handler.link, label = handler.label,
    return external_link_id({link = handler.link, label = handler.label, q = handler.q,
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
    prefix=handler.prefix,id=id,separator=handler.separator, encode=handler.encode}) .. err_cat;
    end
    end