Module:Citation/CS1/Date validation: Difference between revisions

    m>Trappist the monk
    No edit summary
    (synch from sandbox;)
    Line 569: Line 569:
    for k, v in pairs(date_parameters_list) do -- for each date-holding parameter in the list
    for k, v in pairs(date_parameters_list) do -- for each date-holding parameter in the list
    if is_set(v) then -- if the parameter has a value
    if is_set(v.val) then -- if the parameter has a value
    if v:match("^c%. [1-9]%d%d%d?%a?$") then -- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=
    v.val = mw.ustring.gsub (v.val, '%d', cfg.date_names.local_digits); -- translate 'local' digits to Western 0-9
    v = mw.ustring.gsub (v, '%d', cfg.date_names.local_digits);
    if v.val:match("^c%. [1-9]%d%d%d?%a?$") then -- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=
    local year = v:match("c%. ([1-9]%d%d%d?)%a?"); -- get the year portion so it can be tested
    local year = v.val:match("c%. ([1-9]%d%d%d?)%a?"); -- get the year portion so it can be tested
    if 'date'==k then
    if 'date'==k then
    anchor_year, COinS_date = v:match("((c%. [1-9]%d%d%d?)%a?)"); -- anchor year and COinS_date only from |date= parameter
    anchor_year, COinS_date = v.val:match("((c%. [1-9]%d%d%d?)%a?)"); -- anchor year and COinS_date only from |date= parameter
    good_date = is_valid_year(year);
    good_date = is_valid_year(year);
    elseif 'year'==k then
    elseif 'year'==k then
    Line 580: Line 580:
    end
    end
    elseif 'date'==k then -- if the parameter is |date=
    elseif 'date'==k then -- if the parameter is |date=
    if v:match("^n%.d%.%a?$") then -- if |date=n.d. with or without a CITEREF disambiguator
    if v.val:match("^n%.d%.%a?$") then -- if |date=n.d. with or without a CITEREF disambiguator
    good_date, anchor_year, COinS_date = true, v:match("((n%.d%.)%a?)"); --"n.d."; no error when date parameter is set to no date
    good_date, anchor_year, COinS_date = true, v.val:match("((n%.d%.)%a?)"); --"n.d."; no error when date parameter is set to no date
    elseif v:match("^nd%a?$") then -- if |date=nd with or without a CITEREF disambiguator
    elseif v.val:match("^nd%a?$") then -- if |date=nd with or without a CITEREF disambiguator
    good_date, anchor_year, COinS_date = true, v:match("((nd)%a?)"); --"nd"; no error when date parameter is set to no date
    good_date, anchor_year, COinS_date = true, v.val:match("((nd)%a?)"); --"nd"; no error when date parameter is set to no date
    else
    else
    good_date, anchor_year, COinS_date = check_date (v, tCOinS_date); -- go test the date
    good_date, anchor_year, COinS_date = check_date (v.val, tCOinS_date); -- go test the date
    end
    end
    elseif 'year'==k then -- if the parameter is |year= it should hold only a year value
    elseif 'year'==k then -- if the parameter is |year= it should hold only a year value
    if v:match("^[1-9]%d%d%d?%a?$") then -- if |year= 3 or 4 digits only with or without a CITEREF disambiguator
    if v.val:match("^[1-9]%d%d%d?%a?$") then -- if |year= 3 or 4 digits only with or without a CITEREF disambiguator
    good_date, anchor_year, COinS_date = true, v:match("((%d+)%a?)");
    good_date, anchor_year, COinS_date = true, v.val:match("((%d+)%a?)");
    end
    end
    elseif 'access-date'==k then -- if the parameter is |date=
    elseif 'access-date'==k then -- if the parameter is |date=
    good_date = check_date (v, nil, true); -- go test the date; nil is a placeholder; true is the test_accessdate flag
    good_date = check_date (v.val, nil, true); -- go test the date; nil is a placeholder; true is the test_accessdate flag
    elseif 'embargo'==k then -- if the parameter is |embargo=
    elseif 'embargo'==k then -- if the parameter is |embargo=
    good_date = check_date (v); -- go test the date
    good_date = check_date (v.val); -- go test the date
    if true == good_date then -- if the date is a valid date
    if true == good_date then -- if the date is a valid date
    good_date, embargo_date = is_valid_embargo_date (v); -- is |embargo= date a single dmy, mdy, or ymd formatted date? yes:returns embargo; no: returns 9999
    good_date, embargo_date = is_valid_embargo_date (v.val); -- is |embargo= date a single dmy, mdy, or ymd formatted date? yes:returns embargo; no: returns 9999
    end
    end
    else -- any other date-holding parameter
    else -- any other date-holding parameter
    good_date = check_date (v); -- go test the date
    good_date = check_date (v.val); -- go test the date
    end
    end
    if false==good_date then -- assemble one error message so we don't add the tracking category multiple times
    if false==good_date then -- assemble one error message so we don't add the tracking category multiple times
    Line 605: Line 605:
    error_message=error_message .. ", "; -- ... add a comma space separator
    error_message=error_message .. ", "; -- ... add a comma space separator
    end
    end
    error_message=error_message .. "|" .. k .. "="; -- add the failed parameter
    error_message=error_message .. "|" .. v.name .. "="; -- add the failed parameter
    end
    end
    end
    end
    Line 753: Line 753:
    for param_name, param_val in pairs (date_parameters_list) do -- for each date-holding parameter in the list
    for param_name, param_val in pairs (date_parameters_list) do -- for each date-holding parameter in the list
    if is_set (param_val) then -- if the parameter has a value
    if is_set (param_val.val) then -- if the parameter has a value
    if not all and in_array (param_name, {'access-date', 'archive-date'}) then -- if access- or archive-date and format not xxx-all
    if not all and in_array (param_name, {'access-date', 'archive-date'}) then -- if access- or archive-date and format not xxx-all
    param_val = ''; -- set to empty string so we don't process this date
    param_val.val = ''; -- set to empty string so we don't process this date
    end
    end
    for source, pattern in pairs (source_patterns) do
    for source, pattern in pairs (source_patterns) do
    if param_val:match (pattern) then
    if param_val.val:match (pattern) then
    if 'ymd' == source then
    if 'ymd' == source then
    get_ymd_date_parts (param_val, source_date); -- get the date parts into the source_date table
    get_ymd_date_parts (param_val.val, source_date); -- get the date parts into the source_date table
    elseif 'dmy' == source then
    elseif 'dmy' == source then
    get_dmy_date_parts (param_val, source_date); -- get the date parts into the source_date table
    get_dmy_date_parts (param_val.val, source_date); -- get the date parts into the source_date table
    elseif 'mdy' == source then
    elseif 'mdy' == source then
    get_mdy_date_parts (param_val, source_date); -- get the date parts into the source_date table
    get_mdy_date_parts (param_val.val, source_date); -- get the date parts into the source_date table
    end
    end


    Line 777: Line 777:
    end
    end
    -- convert date and save;
    -- convert date and save;
    date_parameters_list[param_name] = mw.text.trim (os.date (format_str, os.time(source_date))); -- strip leading space when single digit day and %e is first format
    date_parameters_list[param_name].val = mw.text.trim (os.date (format_str, os.time(source_date))); -- strip leading space when single digit day and %e is first format
    end
    end
    end
    end
    Line 799: Line 799:
    local n;
    local n;
    for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
    for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
    if not param_val:match ('%d%d%d%d%-%d%d%-%d%d') then -- for those that are not ymd dates
    if is_set (param_val.val) then
    param_val, n = param_val:gsub ('%-', '–'); -- replace any hyphen with ndash
    if not mw.ustring.match (param_val.val, '%d%d%d%d%-%d%d%-%d%d') then -- for those that are not ymd dates (ustring because here digits may not be western)
    if 0 ~= n then
    param_val.val, n = param_val.val:gsub ('%-', '–'); -- replace any hyphen with ndash
    date_parameters_list[param_name] = param_val; -- update the list
    if 0 ~= n then
    result = true;
    date_parameters_list[param_name].val = param_val.val; -- update the list
    result = true;
    end
    end
    end
    end
    end
    Line 815: Line 817:
    Attempts to translate English month names to local-language month names using names supplied by MediaWiki's
    Attempts to translate English month names to local-language month names using names supplied by MediaWiki's
    date parser function.  This is simple name-for-name replacement and may not work for all languages.
    date parser function.  This is simple name-for-name replacement and may not work for all languages.
    if xlat_dig is true, this function will also translate western (English) digits to the local language's digits.
    This will also translate ymd dates.


    ]]
    ]]


    local function date_name_xlate (date_parameters_list)
    local function date_name_xlate (date_parameters_list, xlt_dig)
    local xlate;
    local xlate;
    local mode; -- long or short month names
    local mode; -- long or short month names
    Line 825: Line 830:
    for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
    for param_name, param_val in pairs(date_parameters_list) do -- for each date-holding parameter in the list
    if is_set(param_val) then -- if the parameter has a value
    if is_set(param_val.val) then -- if the parameter has a value
    date = param_val;
    date = param_val.val;
    for month in mw.ustring.gmatch (date, '%a+') do -- iterate through all dates in the date (single date or date range)
    for month in mw.ustring.gmatch (date, '%a+') do -- iterate through all dates in the date (single date or date range)
    if cfg.date_names.en.long[month] then
    if cfg.date_names.en.long[month] then
    Line 839: Line 844:
    xlate = mw.getContentLanguage():formatDate(mode, '1' .. month); -- translate the month name to this local language
    xlate = mw.getContentLanguage():formatDate(mode, '1' .. month); -- translate the month name to this local language
    date = mw.ustring.gsub (date, month, xlate); -- replace the English with the translation
    date = mw.ustring.gsub (date, month, xlate); -- replace the English with the translation
    date_parameters_list[param_name] = date; -- save the translated date
    date_parameters_list[param_name].val = date; -- save the translated date
    modified = true;
    modified = true;
    end
    end
    end
    end


    if xlt_dig then -- shall we also translate digits?
    date = date:gsub ('%d', cfg.date_names.xlate_digits); -- translate digits from western to 'local digits'
    date_parameters_list[param_name].val = date; -- save the translated date
    modified = true;
    end
    end
    end
    end
    end