Module:Citation/CS1/Utilities/sandbox: Difference between revisions
No edit summary |
Richardpruen (talk | contribs) m 1 revision imported: Templates and CSS files |
||
(2 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
--[[ | --[[ | ||
History of changes since last sync: | History of changes since last sync: 2022-01-22 | ||
]] | ]] | ||
Line 21: | Line 18: | ||
local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration | local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration | ||
Line 72: | Line 47: | ||
end | end | ||
return false; | return false; | ||
end | |||
--[[--------------------------< H A S _ A C C E P T _ A S _ W R I T T E N >------------------------------------ | |||
When <str> is wholly wrapped in accept-as-written markup, return <str> without markup and true; return <str> and false else | |||
with allow_empty = false, <str> must have at least one character inside the markup | |||
with allow_empty = true, <str> the markup frame can be empty like (()) to distinguish an empty template parameter from the specific condition "has no applicable value" in citation-context. | |||
After further evaluation the two cases might be merged at a later stage, but should be kept separated for now. | |||
]] | |||
local function has_accept_as_written (str, allow_empty) | |||
if not is_set (str) then | |||
return str, false; | |||
end | |||
local count; | |||
if true == allow_empty then | |||
str, count = str:gsub ('^%(%((.*)%)%)$', '%1'); -- allows (()) to be an empty set | |||
else | |||
str, count = str:gsub ('^%(%((.+)%)%)$', '%1'); | |||
end | |||
return str, 0 ~= count; | |||
end | end | ||
Line 96: | Line 98: | ||
local function error_comment (content, hidden) | local function error_comment (content, hidden) | ||
return substitute (hidden and cfg.presentation['hidden-error'] or cfg.presentation['visible-error'], content); | return substitute (hidden and cfg.presentation['hidden-error'] or cfg.presentation['visible-error'], content); | ||
end | |||
--[[--------------------------< H Y P H E N _ T O _ D A S H >-------------------------------------------------- | |||
Converts a hyphen to a dash under certain conditions. The hyphen must separate | |||
like items; unlike items are returned unmodified. These forms are modified: | |||
letter - letter (A - B) | |||
digit - digit (4-5) | |||
digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5) | |||
letterdigit - letterdigit (A1-A5) (an optional separator between letter and | |||
digit is supported – a.1-a.5 or a-1-a-5) | |||
digitletter - digitletter (5a - 5d) (an optional separator between letter and | |||
digit is supported – 5.a-5.d or 5-a-5-d) | |||
any other forms are returned unmodified. | |||
str may be a comma- or semicolon-separated list | |||
]] | |||
local function hyphen_to_dash (str) | |||
if not is_set (str) then | |||
return str; | |||
end | |||
local accept; -- boolean | |||
str = str:gsub ("(%(%(.-%)%))", function(m) return m:gsub(",", ","):gsub(";", ";") end) -- replace commas and semicolons in accept-as-written markup with similar unicode characters so they'll be ignored during the split | |||
str = str:gsub ('&[nm]dash;', {['–'] = '–', ['—'] = '—'}); -- replace — and – entities with their characters; semicolon mucks up the text.split | |||
str = str:gsub ('-', '-'); -- replace HTML numeric entity with hyphen character | |||
str = str:gsub (' ', ' '); -- replace entity with generic keyboard space character | |||
local out = {}; | |||
local list = mw.text.split (str, '%s*[,;]%s*'); -- split str at comma or semicolon separators if there are any | |||
for _, item in ipairs (list) do -- for each item in the list | |||
item, accept = has_accept_as_written (item); -- remove accept-this-as-written markup when it wraps all of item | |||
if not accept and mw.ustring.match (item, '^%w*[%.%-]?%w+%s*[%-–—]%s*%w*[%.%-]?%w+$') then -- if a hyphenated range or has endash or emdash separators | |||
if item:match ('^%a+[%.%-]?%d+%s*%-%s*%a+[%.%-]?%d+$') or -- letterdigit hyphen letterdigit (optional separator between letter and digit) | |||
item:match ('^%d+[%.%-]?%a+%s*%-%s*%d+[%.%-]?%a+$') or -- digitletter hyphen digitletter (optional separator between digit and letter) | |||
item:match ('^%d+[%.%-]%d+%s*%-%s*%d+[%.%-]%d+$') or -- digit separator digit hyphen digit separator digit | |||
item:match ('^%d+%s*%-%s*%d+$') or -- digit hyphen digit | |||
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 | |||
else | |||
item = mw.ustring.gsub (item, '%s*[–—]%s*', '–'); -- for endash or emdash separated ranges, replace em with en, remove extraneous whitespace | |||
end | |||
end | |||
table.insert (out, item); -- add the (possibly modified) item to the output table | |||
end | |||
local temp_str = ''; -- concatenate the output table into a comma separated string | |||
temp_str, accept = has_accept_as_written (table.concat (out, ', ')); -- remove accept-this-as-written markup when it wraps all of concatenated out | |||
if accept then | |||
temp_str = has_accept_as_written (str); -- when global markup removed, return original str; do it this way to suppress boolean second return value | |||
return temp_str:gsub(",", ","):gsub(";", ";"); | |||
else | |||
return temp_str:gsub(",", ","):gsub(";", ";"); -- else, return assembled temp_str | |||
end | |||
end | end | ||
Line 277: | Line 339: | ||
if not added_prop_cats [key_modified] then | if not added_prop_cats [key_modified] then | ||
added_prop_cats [key_modified] = true; -- note that we've added this category | added_prop_cats [key_modified] = true; -- note that we've added this category | ||
table.insert (z.prop_cats_t, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table | table.insert (z.prop_cats_t, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table | ||
table.insert (z.prop_keys_t, 'cs1-prop-' .. key); -- convert key to class for use in the citation's <cite> tag | table.insert (z.prop_keys_t, 'cs1-prop-' .. key); -- convert key to class for use in the citation's <cite> tag | ||
end | end | ||
end | end | ||
Line 517: | Line 573: | ||
error_comment = error_comment, | error_comment = error_comment, | ||
has_accept_as_written = has_accept_as_written, | has_accept_as_written = has_accept_as_written, | ||
hyphen_to_dash = hyphen_to_dash, | |||
in_array = in_array, | in_array = in_array, | ||
is_set = is_set, | is_set = is_set, |