Модуль:FtlMarking: различия между версиями

мНет описания правки
мНет описания правки
 
(не показано 7 промежуточных версий этого же участника)
Строка 53: Строка 53:
     if attr_str == "" then return nil end
     if attr_str == "" then return nil end
     local params = {}
     local params = {}
    local function unquote_val(v)
        if not v then return v end
        v = trim(v)
        v = mw.ustring.gsub(v, "^"(.-)"$", "%1")
        v = mw.ustring.gsub(v, '^"(.-)"$', "%1")
        return v
    end
     for k, v in mw.ustring.gmatch(attr_str, "([%w_%-%:]+)%s*=%s*\"(.-)\"") do
     for k, v in mw.ustring.gmatch(attr_str, "([%w_%-%:]+)%s*=%s*\"(.-)\"") do
         params[mw.ustring.lower(k)] = v
         params[mw.ustring.lower(k)] = unquote_val(v)
     end
     end
     attr_str = mw.ustring.gsub(attr_str, "([%w_%-%:]+)%s*=%s*\"(.-)\"", "")
     attr_str = mw.ustring.gsub(attr_str, "([%w_%-%:]+)%s*=%s*\"(.-)\"", "")
     for k, v in mw.ustring.gmatch(attr_str, "([%w_%-%:]+)%s*=%s*([^%s%]]+)") do
     for k, v in mw.ustring.gmatch(attr_str, "([%w_%-%:]+)%s*=%s*([^%s%]]+)") do
         params[mw.ustring.lower(k)] = v
         params[mw.ustring.lower(k)] = unquote_val(v)
     end
     end
     attr_str = mw.ustring.gsub(attr_str, "([%w_%-%:]+)%s*=%s*([^%s%]]+)", "")
     attr_str = mw.ustring.gsub(attr_str, "([%w_%-%:]+)%s*=%s*([^%s%]]+)", "")
     local unnamed = mw.ustring.match(attr_str, "%s*\"(.-)\"")
 
     local unnamed = mw.ustring.match(attr_str, "%s*"(.-)"") or mw.ustring.match(attr_str, "%s*\"(.-)\"")
     if unnamed then
     if unnamed then
         params._value = unnamed
         params._value = unquote_val(unnamed)
        attr_str = mw.ustring.gsub(attr_str, "%s*"(.-)"", "", 1)
         attr_str = mw.ustring.gsub(attr_str, "%s*\"(.-)\"", "", 1)
         attr_str = mw.ustring.gsub(attr_str, "%s*\"(.-)\"", "", 1)
     end
     end
     if not params._value then
     if not params._value then
         local v = mw.ustring.match(attr_str, "%s*([^%s%]]+)")
         local v = mw.ustring.match(attr_str, "%s*([^%s%]]+)")
         if v then params._value = v end
         if v then params._value = unquote_val(v) end
     end
     end
     return params
     return params
end
end
Строка 77: Строка 91:
     local lines = mw.text.split(s, "\n")
     local lines = mw.text.split(s, "\n")
     local first_non_empty = nil
     local first_non_empty = nil
    local first_non_empty_unescaped = nil
     for i, line in ipairs(lines) do
     for i, line in ipairs(lines) do
         if line and line:match("%S") then
         if line and line:match("%S") then
             first_non_empty = line
             first_non_empty = line
            first_non_empty_unescaped = mw.ustring.gsub(line, " ", " ")
             break
             break
         end
         end
     end
     end
     local enable_numeric = false
     local enable_numeric = false
     if first_non_empty and mw.ustring.match(first_non_empty, "^%s*%d+%.") then
     if first_non_empty_unescaped and mw.ustring.match(first_non_empty_unescaped, "^%s*%d+%.") then
         enable_numeric = true
         enable_numeric = true
     end
     end
     local out_lines = {}
     local out_lines = {}
     for _, line in ipairs(lines) do
     for _, line in ipairs(lines) do
         local processed = line
         local processed = line
         local handled = false
         local handled = false
        local line_unescaped = mw.ustring.gsub(line, " ", " ")
         if enable_numeric then
         if enable_numeric then
             local leading, num, rest = mw.ustring.match(line, "^(%s*)(%d+)%.%s*(.*)$")
             local leading, num, rest = mw.ustring.match(line_unescaped, "^(%s*)(%d+)%.%s*(.*)$")
             if num then
             if num then
                 local indent = mw.ustring.len(leading or "")
                 local indent = mw.ustring.len(leading or "")
Строка 102: Строка 123:
             end
             end
         end
         end
         if not handled then
         if not handled then
             local leading, rest = mw.ustring.match(line, "^(%s*)%-%s+(.*)$")
             local leading, rest = mw.ustring.match(line_unescaped, "^(%s*)%-%s+(.*)$")
             if rest then
             if rest then
                 local indent = mw.ustring.len(leading or "")
                 local indent = mw.ustring.len(leading or "")
Строка 113: Строка 135:
             end
             end
         end
         end
         if not handled then
         if not handled then
             table.insert(out_lines, processed)
             table.insert(out_lines, processed)
         end
         end
     end
     end
     return table.concat(out_lines, "\n")
     return table.concat(out_lines, "\n")
end
end
Строка 134: Строка 158:
         visible = mw.ustring.gsub(visible, "|", "|")
         visible = mw.ustring.gsub(visible, "|", "|")
         tip = mw.ustring.gsub(tip, "|", "|")
         tip = mw.ustring.gsub(tip, "|", "|")
         return "{{tooltip|" .. (visible or "") .. "||" .. (tip or "") .. "}}"
         return "{{altTooltip|" .. (visible or "") .. "|" .. (tip or "") .. "}}"
     end)
     end)
     while true do
     while true do
Строка 178: Строка 202:
     text = mw.text.unstripNoWiki(text)
     text = mw.text.unstripNoWiki(text)
     text = process_nowiki_equals(text)
     text = process_nowiki_equals(text)
     return transform(text)
     return frame:preprocess(transform(text))
end
end


return p
return p