Permanently protected module

모듈:인용/CS1

Module

require('strict');  --[[--------------------------< F O R W A R D   D E C L A R A T I O N S >--------------------------------------  each of these counts against the Lua upvalue limit  ]]  local validation;                -- functions in Module:Citation/CS1/Date_validation  local utilities;                -- functions in Module:Citation/CS1/Utilities local z = {};                 -- table of tables in Module:Citation/CS1/Utilities  local identifiers;                -- functions and tables in Module:Citation/CS1/Identifiers local metadata;                 -- functions in Module:Citation/CS1/COinS local cfg = {};                 -- table of configuration tables that are defined in Module:Citation/CS1/Configuration local whitelist = {};               -- table of tables listing valid template parameter names; defined in Module:Citation/CS1/Whitelist   --[[------------------< P A G E   S C O P E   V A R I A B L E S >---------------  declare variables here that have page-wide scope that are not brought in from other modules; that are created here and used here  ]]  local added_deprecated_cat;              -- Boolean flag so that the category is added only once local added_vanc_errs;               -- Boolean flag so we only emit one Vancouver error / category local added_generic_name_errs;             -- Boolean flag so we only emit one generic name error / category and stop testing names once an error is encountered local Frame;                 -- holds the module's frame table local is_preview_mode;               -- true when article is in preview mode; false when using 'Preview page with this template' (previewing the module) local is_sandbox;                -- true when using sandbox modules to render citation   --[[--------------------------< F I R S T _ S E T >------------------------------------------------------------  Locates and returns the first set value in a table of values where the order established in the table, left-to-right (or top-to-bottom), is the order in which the values are evaluated.  Returns nil if none are set.  This version replaces the original 'for _, val in pairs do' and a similar version that used ipairs.  With the pairs version the order of evaluation could not be guaranteed.  With the ipairs version, a nil value would terminate the for-loop before it reached the actual end of the list.  ]]  local function first_set (list, count)  local i = 1;  while i <= count do               -- loop through all items in list   if utilities.is_set( list[i] ) then    return list[i];              -- return the first set list member   end   i = i + 1;                -- point to next  end end   --[[--------------------------< A D D _ V A N C _ E R R O R >----------------------------------------------------  Adds a single Vancouver system error message to the template's output regardless of how many error actually exist. To prevent duplication, added_vanc_errs is nil until an error message is emitted.  added_vanc_errs is a Boolean declared in page scope variables above  ]]  local function add_vanc_error (source, position)  if added_vanc_errs then return end     added_vanc_errs = true;              -- note that we've added this category  utilities.set_message ('err_vancouver', {source, position}); end   --[[--------------------------< I S _ S C H E M E >------------------------------------------------------------  does this thing that purports to be a URI scheme seem to be a valid scheme?  The scheme is checked to see if it is in agreement with http://tools.ietf.org/html/std66#section-3.1 which says:  Scheme names consist of a sequence of characters beginning with a    letter and followed by any combination of letters, digits, plus    ("+"), period ("."), or hyphen ("-").  returns true if it does, else false  ]]  local function is_scheme (scheme)  return scheme and scheme:match ('^%a[%a%d%+%.%-]*:');      -- true if scheme is set and matches the pattern end   --[=[-------------------------< I S _ D O M A I N _ N A M E >--------------------------------------------------  Does this thing that purports to be a domain name seem to be a valid domain name?  Syntax defined here: http://tools.ietf.org/html/rfc1034#section-3.5 BNF defined here: https://tools.ietf.org/html/rfc4234 Single character names are generally reserved; see https://tools.ietf.org/html/draft-ietf-dnsind-iana-dns-01#page-15;  see also [[Single-letter second-level domain]] list of TLDs: https://www.iana.org/domains/root/db  RFC 952 (modified by RFC 1123) requires the first and last character of a hostname to be a letter or a digit.  Between the first and last characters the name may use letters, digits, and the hyphen.  Also allowed are IPv4 addresses. IPv6 not supported  domain is expected to be stripped of any path so that the last character in the last character of the TLD.  tld is two or more alpha characters.  Any preceding '//' (from splitting a URL with a scheme) will be stripped here.  Perhaps not necessary but retained in case it is necessary for IPv4 dot decimal.  There are several tests:  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  single-letter/digit second-level domains in the .org, .cash, and .today TLDs  q, x, and z SL domains in the .com TLD  i and q SL domains in the .net TLD  single-letter SL domains in the ccTLDs (where the ccTLD is two letters)  two-character SL domains in gTLDs (where the gTLD is two or more letters)  three-plus-character SL domains in gTLDs (where the gTLD is two or more letters)  IPv4 dot-decimal address format; TLD not allowed  returns true if domain appears to be a proper name and TLD or IPv4 address, else false  ]=]  local function is_domain_name (domain)  if not domain then   return false;               -- if not set, abandon  end    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   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;  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]+