Module:Footnotes/anchor id list/sandbox: Difference between revisions

Content deleted Content added
assume that wrapper templates will never generate a harv ref that isn't also a harv target
Restored revision 1291947075 by Hike395 (talk): Nope: wasn't my edits
 
(28 intermediate revisions by 2 users not shown)
Line 2:
local data = mw.loadData ('Module:Footnotes/anchor id list/data');
local whitelist = mw.loadData ('Module:Footnotes/whitelist/sandbox');
local Lang_obj = mw.language.getContentLanguage(); -- used by template_list_addtemplate_name_get() to uppercase first letter of template name TODO: better way to do that?
 
local redirects_date = {
Line 92:
['Citation-attribution'] = true,
}
local global_article_content = nil
local Article_content;
 
local global_anchor_id_list = nil -- exported tables
local global_template_list = nil
local global_article_whitelist = nil
 
local anchor_id_list = {}; -- exported tables
local template_list = {};
local article_whitelist = {};
local template_list_done = false
 
 
Line 108:
 
local function article_content_get ()
if global_article_content then return global_article_content end
if not Article_content then
Article_content local article_content = mw.title.getCurrentTitle():getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
for _, tag in ipairs (patterns_tags) do
Article_content article_content = Article_contentarticle_content:gsub (tag, ''); -- remove certain html-like tags and their content
end
end
global_article_content = article_content
return article_content
end
 
Line 373 ⟶ 374:
end
 
--[[--------------------------< T E M P L A T E _ N A M E _ F R O M _ M O D U L E >----------------------------
 
if passed a module invocation, return the name of the template represented. Otherwise return the input.
 
{{#invoke:cite|foo|...}} or {{#invoke:cite bar||...}} will return "cite foo" and "cite bar", respectively.
 
]]
 
local function template_name_from_module (template, template_name)
if template_name and template_name:match ('^#invoke%s*:') then -- handle directly-invoked citation modules
template_name = template_name:match ('^#invoke%s*:%s*(.+)'); -- get module name
local func_name = template:match ('^{{[^|}]+%|%s*([^/|}]*)'); -- get function name
if template_name and func_name then -- valid module invocation
return template_name:gsub ('%s+$', '') .. ' ' .. func_name; -- ensure exactly one trailing whitespace between module and function name
end;
return nil -- could not get module and function name
end;
return template_name
end
 
--[[--------------------------< T E M P L A T E _ N A M E _ G E T >--------------------------------------------
Line 386 ⟶ 406:
local template_name = template:match ('^{{%s*([^/|}]+)'); -- get template name; ignore subpages ~/new, ~/sandbox; parser functions
 
template_name = template_name_from_module (template, template_name); -- if passed a module invocation, return the name of the template represented
if not template_name or template_name:match ('^#') then -- parser functions, magic words don't count as templates
return nil; -- could not get template name from (possibly corrupt) template; extraneous opening { mid template can cause this;
Line 449 ⟶ 471:
end
return nil; -- no names; no anchor_id
end
 
 
--[[--------------------------< A N C H O R _ I D _ M A K E _ W R A P P E R >----------------------------------
 
for wrapper templates
 
inspect externally visible |ref= to decide what to do:
|ref= - empty or missing: get names and date from whitelist defaults; override defaults from externally visible template parameters
|ref=harv - same as empty or missing
|ref={{SfnRef|name|name|name|name|year}} - assemble an anchor id from {{sfnref}} positional parameters
|ref={{Harvid|name|name|name|name|year}} - assemble an anchor id from {{harvid}} positional parameters
|ref=none - skip; do nothing because an anchor id intentionally suppressed; TODO: keep with a type code of '0'?
|ref=<text> - save param value because may match an anchor id override value in {{harv}} template |ref= parameter or {{harvc}} |id= parameter
 
]]
 
local function anchor_id_make_wrapper (template)
local ref; -- content of |ref=
local template_name; -- name of the template
local anchor_id; -- the assembled anchor id from this template
local date;
local name_default;
local date_default;
local vol;
local params = {}; -- table of template parameters
template_name = template_name_get (template); -- get first char uppercase trimmed template name; ignore subpages ~/new, ~/sandbox
if not template_name or template_skip[template_name] then
return nil; -- could not extract template name from (possibly corrupted) template (extraneous opening { in the template will cause this)
end
 
date = date_get (template, alias_patterns_date); -- get date; done here because might be in {{date}}
-- if '' == date then
-- date = whitelist.wrapper_templates[template_name][2] or ''; -- no externally visible date so get default date
-- end
 
ref = template:match ('|%s*ref%s*=%s*(%b{})'); -- first look for |ref={{sfnref}} or |ref={{harvid}} because we will strip templates from the wrapper template
if not ref then
if template:match ('|%s*ref%s*=([^|}]+)') then -- |ref={{template}} not found; if there is a |ref= param with an assigned value
ref = template:match ('|%s*ref%s*=([^|}]+)'); -- get the value; whitespace is a 'value'
if ref then -- nil when |ref=|... or when |ref=}} (no spaces between assignment operator and pipe or closing brace)
ref = mw.text.trim (ref); -- something, could be just whitespace, so trim leading / trailing whitespace
if '' == ref then -- trimming a string of whitespace makes an empty string
ref = nil; -- make empty ref same as missing ref
end
end
end
end
 
template_params_get (template, params); -- build a table of template parameters and their values
 
local wrap_data = whitelist.wrapper_templates[template_name]
 
if wrap_data[1] then -- is this wrapper a simple-default wrapper?
name_default = wrap_data[1]; -- get the default names
date_default = wrap_data[2]; -- get the default date
else
vol = params['volume'] or 'default';
local fascicle = params['fascicle'] -- some templates use "fascicle" to mean "subvolume"
if fascicle then
local subvol = vol..'/'..fascicle -- if fascicle is used, subvolume = "vol/fascicle"
if wrap_data[subvol] then -- if subvolume exists, use it, otherwise fall back to volume
vol = subvol
end
end
if not wrap_data[vol] then -- make sure this volume exists
vol = 'default'; -- doesn't exist, use default volume
end
name_default = wrap_data[vol][1]; -- get the default names
date_default = wrap_data[vol][2]; -- get the default date
end
 
if 'harv' == ref or not ref then -- |ref=harv specified or |ref= missing or empty
anchor_id = names_get (params, aliases_contributor) or -- get contributor, author, or editor names
names_get (params, aliases_author) or
vnames_get (params, 'vauthors') or -- |vauthors=
names_get (params, aliases_editor) or
vnames_get (params, 'veditors') or -- |veditors=
name_default; -- default names from whitelist
-- whitelist.wrapper_templates[template_name][1]; -- default names from whitelist
 
if '' == date then -- if date not provided in the template
date = date_default; -- use the default date from whitelist
end
 
if anchor_id then -- if names were gotten
anchor_id = 'CITEREF' .. anchor_id .. date;
end
 
elseif ref:match ('%b{}') then -- ref holds a template
anchor_id = sfnref_get (ref); -- returns content of {{sfnref}} or {{harvid}}; nil else
 
elseif 'none' == ref then -- |ref=none
return nil; -- anchor id expicitly suppressed
else
anchor_id = ref; -- |ref=<text> may match an anchor id override value in {{harv}} template |ref= parameter
end
return anchor_id; -- anchor_id text; nil else
end
 
Line 586 ⟶ 709:
list_add (anchor_id, anchor_id_list, true); -- add anchor ID to the list
end
end
end
 
 
--[[--------------------------< T E M P L A T E _ L I S T _ A D D >--------------------------------------------
 
makes a list of templates use in the article.
 
]]
 
local function template_list_add (template)
local template = template:match ('{{%s*(.-)[|}]'); -- keep the case of the template - this is different from template_name_get()
if template and not template:match ('^#') then -- found a template or magic word; ignore magic words
template=mw.text.trim (template); -- trim whitespace
template = Lang_obj:ucfirst (template); -- first character in template name must be uppercase (same as canonical template name) TODO: better way to do this?
list_add (template, template_list); -- add to list with (unused) tally
end
end
Line 622 ⟶ 729:
 
local function anchor_id_list_make ()
local anchor_id_list = {}
article_content_get (); -- attempt to get this article's content
local template_list = {}
local article_whitelist = {}
local article_content = article_content_get (); -- attempt to get this article's content
 
if ''article_content == Article_content'' then -- when there is no article content
return ''; -- no point in continuing
end
Line 633 ⟶ 743:
 
local find_pattern = '%f[{]{{[^{]';
local tstart, tend = Article_contentarticle_content:find (find_pattern); -- find the first template; do not find template variables: {{{template var|}}}
 
while tstart do
template = Article_contentarticle_content:match ('%b{}', tstart); -- get the whole template
if not template then
break; -- template is nil for some reason (last template missing closing }} for example) so declare ourselves done
end
 
template_name = template_name_get (template); -- get first char uppercase trimmed template name; ignore subpages ~/new, ~/sandbox
template_list_addlist_add (templatetemplate_name, template_list); -- add this template's name to the list
 
if data.known_templates_cs12 [template_name] then
Line 707 ⟶ 816:
end
end
 
elseif template_name and whitelist.wrapper_templates[template_name] then
anchor_id = anchor_id_make_wrapper (template); -- extract an anchor id from this template if possible
list_add (anchor_id, anchor_id_list, true);
 
elseif template_name and template_name:match ('^Cit[ea]') then -- not known, not known wrapper; last gasp, try as cs1-like
Line 713 ⟶ 827:
end
 
tstart, tend = Article_contentarticle_content:find (find_pattern, tend); -- search for another template; begin at end of last search
end
template_list_done = true
 
mw.logObject (anchor_id_list, 'anchor_id_list');
Line 721 ⟶ 834:
mw.logObject (article_whitelist, 'article_whitelist');
 
 
return anchor_id_list;
global_anchor_id_list = anchor_id_list
global_template_list = template_list
global_article_whitelist = article_whitelist
end
 
Line 733 ⟶ 849:
 
local function citeref_patterns_make()
if not template_list_doneglobal_template_list then error("Template list not yet created")return end
local citeref_patterns = {}
local template_patterns = whitelist.wrapper_template_patterns
for _, p in ipairs(template_patterns) do
for _, t in ipairs(p[1]) do -- loop through list of template wrappers
if template_listglobal_template_list[t] then -- if wrapper is found in article, record corresponding patterns
for _, pat in ipairs(p[2]) do
table.insert(citeref_patterns, pat)
Line 754 ⟶ 870:
]]
 
-- First create global_anchor_id_list, global_template_list, global_article_whitelist
anchor_id_list_make()
 
-- Then stuff them (and derived tables) into return table
return {
anchor_id_list = anchor_id_list_make()global_anchor_id_list or {}, -- table of anchor ids available in this article
article_whitelist = article_whitelistglobal_article_whitelist or {}, -- table of anchor ids with false-positive error message to be suppressed
template_list = template_listglobal_template_list or {}, -- table of templates used in this article
citeref_patterns = citeref_patterns_make() or {}, -- table of Lua patterns to search for citeref from wrappers
}