Content deleted Content added
improve: code, remove: debug code |
improve: trim |
||
(46 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;
-- exposed: categorizes content and display them
Line 19 ⟶ 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
values[category] = nil
end
end
-- unordered last
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
value = function(category)
return ""
end
end
local result =
▲ value(category)
▲ )
end
▲ return result
end
Line 45 ⟶ 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 56 ⟶ 80:
end
-- builds key mapping, key order mapping
-- reads 'table_*'
build_keys = function(args)
local
local key_order = {}
for arg_k, arg_v in pairs(args) do
local
if order then
result[key] = as_key_content_function(arg_v:trim())▼
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}
end
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 79 ⟶ 126:
local content = ""
for
if line:match("^__M_INDEX__") then
-- finish result
for
local sub_result = result[category]
if sub_result == nil then
Line 104 ⟶ 151:
-- one more round of finishing result
for
local sub_result = result[category]
if sub_result == nil then
Line 125 ⟶ 172:
as_key_content_function = function(text)
local function func(content)
return result
end
return func
Line 134 ⟶ 182:
as_value_content_function = function(text)
local function func(category)
return result
end
return func
Line 144 ⟶ 193:
local function func(left, right)
-- some improvements could be made here
return result
end
return func
Line 150 ⟶ 200:
-- escapes replacement, replace '%' with '%%'
-- ah, multiple return results cost us headache, apparently multiple return results expand into multiple arguments
escape_replacement = function(text)
return result
end
unstrip_and_strip_nowiki_tags = function(text)
local result = mw.text.trim(mw.text.unstripNoWiki(text)) -- need this variable to only return 1 result
:gsub("<nowiki>", "")
:gsub("</nowiki>", "")
:gsub("<", "<") -- needs to be escaped in the source
:gsub(">", ">")
:gsub(""", '"')
return result
end
|