Module:Sandbox/Aseleste/Indexer: Difference between revisions

Content deleted Content added
test: debug
Tag: Reverted
improve: trim
 
(31 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 12 ⟶ 13:
local as_fold_function;
local escape_replacement;
local unstrip_and_strip_nowiki_tags;
local decode_magic_text;
 
-- exposed: categorizes content and display them
Line 20 ⟶ 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(result)
end
 
Line 46 ⟶ 69:
local result = {}
local pframe = frame:getParent()
for key, value in pairs(frame.args) do
result[mw.text.trim(key)] = unstrip_and_strip_nowiki_tags(value)
end
local pframe = frame:getParent()
for key, value in pairs(pframe.args) do
result[mw.text.trim(key)] = unstrip_and_strip_nowiki_tags(value)
end
Line 57 ⟶ 80:
end
 
-- builds key mapping, key order mapping
-- reads 'table_*'
build_keys = function(args)
local resultkeys = {}
local key_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(mw.text.trim(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(mw.text.trim(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 80 ⟶ 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 105 ⟶ 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 126 ⟶ 172:
as_key_content_function = function(text)
local function func(content)
returnlocal result = decode_magic_text(text):gsub("__M_CONTENT__", escape_replacement(content)) -- need this variable to only return 1 result
return result
end
return func
Line 135 ⟶ 182:
as_value_content_function = function(text)
local function func(category)
returnlocal result = decode_magic_text(text):gsub("__M_CATEGORY__", escape_replacement(category)) -- need this variable to only return 1 result
return result
end
return func
Line 145 ⟶ 193:
local function func(left, right)
-- some improvements could be made here
returnlocal result = decode_magic_text(text):gsub("__M_LEFT__", escape_replacement(left)):gsub("__M_RIGHT__", escape_replacement(right)) -- need this variable to only return 1 result
return result
end
return func
Line 151 ⟶ 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 mw.text.nowiki(result)
end
 
unstrip_and_strip_nowiki_tags = function(text)
-- decode text with magic words
local result = mw.text.trim(mw.text.unstripNoWiki(text)) -- need this variable to only return 1 result
decode_magic_text = function(text)
:gsub("<nowiki>", "")
-- experimental
return text :gsub("&#95;</nowiki>", "_")
:gsub("&lt;", "<") -- needs to be escaped in the source
:gsub("&gt;", ">")
:gsub("&quot;", '"')
return result
end