Модуль:Loc/Marking: различия между версиями
Pok (обсуждение | вклад) мНет описания правки |
Pok (обсуждение | вклад) мНет описания правки |
||
| Строка 1: | Строка 1: | ||
local p = {} | local p = {} | ||
local function apply_tag(tag, | local function apply_tag(tag, params, inner) | ||
local t = mw.ustring.lower(tag or "") | local t = mw.ustring.lower(tag or "") | ||
if t == "bold" then | if t == "bold" then | ||
| Строка 9: | Строка 9: | ||
elseif t == "bolditalic" then | elseif t == "bolditalic" then | ||
return "<i><b>" .. inner .. "</b></i>" | return "<i><b>" .. inner .. "</b></i>" | ||
elseif t == "bullet" then | |||
return "· " .. inner | |||
elseif t == "color" then | elseif t == "color" then | ||
if | local color = params and params._value or "" | ||
return '<span style="color:' .. color .. ';">' .. inner .. '</span>' | |||
elseif t == "head" then | |||
local level = params and tonumber(params._value) or 1 | |||
level = math.max(1, math.min(3, level)) | |||
local defaultSize = 12 | |||
local size = math.ceil(defaultSize * 2 / math.sqrt(level)) | |||
return '<span style="font-weight:bold; font-size:' .. size .. 'px;">' .. inner .. '</span>' | |||
elseif t == "font" then | |||
local family = params and params._value or nil | |||
local size = params and tonumber(params.size) or nil | |||
local style_parts = {} | |||
if family and family ~= "" then | |||
table.insert(style_parts, "font-family:" .. family) | |||
end | |||
if size and size ~= "" then | |||
table.insert(style_parts, "font-size:" .. size .. "px") | |||
end | |||
if #style_parts == 0 then | |||
return '<span>' .. inner .. '</span>' | return '<span>' .. inner .. '</span>' | ||
else | |||
return '<span style="' .. table.concat(style_parts, "; ") .. ';">' .. inner .. '</span>' | |||
end | end | ||
else | else | ||
return inner | return inner | ||
end | end | ||
end | |||
local function trim(s) | |||
if not s then return s end | |||
s = mw.ustring.gsub(s, "^%s+", "") | |||
s = mw.ustring.gsub(s, "%s+$", "") | |||
return s | |||
end | |||
local function parse_attrs(attr_str) | |||
if not attr_str then return nil end | |||
attr_str = mw.ustring.gsub(attr_str, "^%s*=%s*", "") | |||
attr_str = trim(attr_str) | |||
if attr_str == "" then return nil end | |||
local params = {} | |||
for k, v in mw.ustring.gmatch(attr_str, "([%w_%-%:]+)%s*=%s*\"(.-)\"") do | |||
params[mw.ustring.lower(k)] = v | |||
end | |||
attr_str = mw.ustring.gsub(attr_str, "([%w_%-%:]+)%s*=%s*\"(.-)\"", "") | |||
for k, v in mw.ustring.gmatch(attr_str, "([%w_%-%:]+)%s*=%s*([^%s%]]+)") do | |||
params[mw.ustring.lower(k)] = v | |||
end | |||
attr_str = mw.ustring.gsub(attr_str, "([%w_%-%:]+)%s*=%s*([^%s%]]+)", "") | |||
local unnamed = mw.ustring.match(attr_str, "%s*\"(.-)\"") | |||
if unnamed then | |||
params._value = unnamed | |||
attr_str = mw.ustring.gsub(attr_str, "%s*\"(.-)\"", "", 1) | |||
end | |||
if not params._value then | |||
local v = mw.ustring.match(attr_str, "%s*([^%s%]]+)") | |||
if v then params._value = v end | |||
end | |||
return params | |||
end | end | ||
| Строка 35: | Строка 90: | ||
local search_pos = 1 | local search_pos = 1 | ||
while true do | while true do | ||
local a, b = mw.ustring.find(s, "%[" .. c_tag .. " | local a, b = mw.ustring.find(s, "%[" .. c_tag .. "[^%]]*%]", search_pos) | ||
if not a or a > c_s then break end | if not a or a > c_s then break end | ||
last_o_s, last_o_e = a, b | last_o_s, last_o_e = a, b | ||
| Строка 45: | Строка 100: | ||
else | else | ||
local inner = mw.ustring.sub(s, last_o_e + 1, c_s - 1) | local inner = mw.ustring.sub(s, last_o_e + 1, c_s - 1) | ||
local _, _, | local _, _, raw_attrs = mw.ustring.find(s, "%[" .. c_tag .. "([^%]]*)%]", last_o_s) | ||
local replacement = apply_tag(c_tag, | local params = parse_attrs(raw_attrs) | ||
local replacement = apply_tag(c_tag, params, inner) | |||
s = mw.ustring.sub(s, 1, last_o_s - 1) .. replacement .. mw.ustring.sub(s, c_e + 1) | s = mw.ustring.sub(s, 1, last_o_s - 1) .. replacement .. mw.ustring.sub(s, c_e + 1) | ||