Module:Sandbox/Aseleste/Indexer: Difference between revisions

Content deleted Content added
test: debug
Tag: Reverted
improve: trim
 
(16 intermediate revisions by the same user not shown)
Line 6:
-- forward declarations
local index;
local process_key_value;
local build_keys;
local build_values;
Line 13 ⟶ 14:
local escape_replacement;
local unstrip_and_strip_nowiki_tags;
 
local d = {}
 
-- exposed: categorizes content and display them
Line 22 ⟶ 21:
local folder = as_fold_function(args.folder)
local keys, key_order = build_keys(args)
local values = build_values(args.content)
local result = ""
-- ordered first
for category, key in pairs(keys) do
for _, categories in ipairs(key_order) do
for _, category in ipairs(categories) do
local processed = process_key_value(keys, values, category)
if processed then
result = folder(result, processed)
-- remove key and value to mark as processed
value(keys[category)] = nil
values[category] = nil
)end
end
end
-- unordered last
for category, key_ in pairs(keys) do
local processed = process_key_value(keys, values, category)
if processed then
result = folder(result, processed)
end
end
return frame:getParent():preprocess(result) -- intended to be used with a template
end
 
-- process key and value for a given category
process_key_value = function(keys, values, category)
local key = keys[category]
if key then
local value = values[category]
if not value == nil then
value = function(category)
return ""
end
end
local result = folderkey(result,value(category))
return result
key(
value(category)
)
)
end
return nil
return mw.text.nowiki(mw.dumpObject({args = args, keys = keys, values = values, result = result, d = d}))
end
 
Line 48 ⟶ 69:
local result = {}
local pframe = frame:getParent()
for key, value in pairs(frame.args) do
result[mw.text.trim(key)] = mw.text.trim(unstrip_and_strip_nowiki_tags(value))
end
local pframe = frame:getParent()
for key, value in pairs(pframe.args) do
result[mw.text.trim(key)] = mw.text.trim(unstrip_and_strip_nowiki_tags(value))
end
Line 59 ⟶ 80:
end
 
-- builds key mapping, key order mapping
-- reads 'table_*'
build_keys = function(args)
local resultkeys = {}
local dkey_order = {}
for arg_k, arg_v in pairs(args) do
if arg_k:match("^table_") then
local arg_k_trim = mw.text.trim(arg_k)
if local arg_k_trimkey = arg_k:matchgsub("^table_"), then"", 1)
local keyorder = arg_k_trimkey:gsubmatch("table_^(%d+)_", "", 1)
if order then
result[key] = as_key_content_function(arg_v)
key = key:gsub(order .. "_", "", 1)
local order_list = key_order[order]
if order_list then
table.insert(order_list, key)
else
key_order[order] = {key}
key( end
end
resultkeys[key] = as_key_content_function(arg_v)
end
end
return result
-- sort key order
local key_order_list = {}
for order, category in pairs(key_order) do
table.insert(key_order_list, {key=tonumber(order), value=category})
end
table.sort(key_order_list, function(a, b) return a.key < b.key end)
key_order = {}
for _, value in ipairs(key_order_list) do
table.insert(key_order, value.value)
end
return keys, key_order
end
 
Line 82 ⟶ 126:
local content = ""
for line_number_, line in ipairs(mw.text.split(text, "\n", true)) do -- is \n sufficient
if line:match("^__M_INDEX__") then
-- finish result
for index_, category in ipairs(context) do
local sub_result = result[category]
if sub_result == nil then
Line 107 ⟶ 151:
-- one more round of finishing result
for index_, category in ipairs(context) do
local sub_result = result[category]
if sub_result == nil then
Line 128 ⟶ 172:
as_key_content_function = function(text)
local function func(content)
returnlocal result = text:gsub("__M_CONTENT__", escape_replacement(content)) -- need this variable to only return 1 result
table.insert(d, {concatype = 'key', text = text, content = content})
return result
return text:gsub("__M_CONTENT__", escape_replacement(content))
end
return func
Line 138 ⟶ 182:
as_value_content_function = function(text)
local function func(category)
returnlocal result = text:gsub("__M_CATEGORY__", escape_replacement(category)) -- need this variable to only return 1 result
table.insert(d, {concatype = 'value', text = text, category = category})
return result
return text:gsub("__M_CATEGORY__", escape_replacement(category))
end
return func
Line 149 ⟶ 193:
local function func(left, right)
-- some improvements could be made here
returnlocal result = text:gsub("__M_LEFT__", escape_replacement(left)):gsub("__M_RIGHT__", escape_replacement(right)) -- need this variable to only return 1 result
table.insert(d, {concatype = 'fold', text = text, left = left, right = right})
return result
return text:gsub("__M_LEFT__", escape_replacement(left)):gsub("__M_RIGHT__", escape_replacement(right))
end
return func
Line 156 ⟶ 200:
 
-- escapes replacement, replace '%' with '%%'
-- ah, multiple return results cost us headache, apparently multiple return results expand into multiple arguments
escape_replacement = function(text)
returnlocal result = text:gsub("%%", "%%%%") -- need this variable to only return 1 result
return result
end
 
unstrip_and_strip_nowiki_tags = function(text)
returnlocal result = mw.text.trim(mw.text.unstripNoWiki(text):gsub("<nowiki>", ""):gsub("</nowiki>", "")-- need this variable to only return 1 result
:gsub("<nowiki>", "")
:gsub("</nowiki>", "")
:gsub("&lt;", "<") -- needs to be escaped in the source
:gsub("&gt;", ">")
:gsub("&quot;", '"')
return result
end