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

мНет описания правки
Нет описания правки
 
(не показано 29 промежуточных версий этого же участника)
Строка 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


local function convert_lists(s)
local function convert_lists(s)
     local lines = mw.text.split(s or "", "\n", true)
    if not s or s == "" then return s end
    local out = {}
     local lines = mw.text.split(s, "\n")
 
    local enable_numeric = false
    for _, line in ipairs(lines) do
        local line_unescaped = mw.ustring.gsub(line, " ", " ")
        if mw.ustring.match(line_unescaped, "^%s*%d+%.") then
            enable_numeric = true
            break
        end
    end


    local out_lines = {}
     for _, line in ipairs(lines) do
     for _, line in ipairs(lines) do
         local indentEsc = mw.ustring.match(line, "^((  )*)") or ""
         local processed = line
        local level = 0
        local handled = false
        local line_unescaped = mw.ustring.gsub(line, " ", " ")


         if indentEsc ~= "" then
         if enable_numeric then
            level = mw.ustring.len(indentEsc) / mw.ustring.len("  ")
            local leading, num, rest = mw.ustring.match(line_unescaped, "^(%s*)(%d+)%.%s*(.*)$")
            if num then
                local indent = mw.ustring.len(leading or "")
                local level = math.floor(indent / 2)
                local hashes = string.rep('#', 1 + level)
                processed = hashes .. (rest ~= "" and (" " .. rest) or "")
                table.insert(out_lines, processed)
                handled = true
            end
         end
         end


         local content = mw.ustring.sub(line, mw.ustring.len(indentEsc) + 1)
         if not handled then
            local leading, rest = mw.ustring.match(line_unescaped, "^(%s*)%-%s+(.*)$")
            if rest then
                local indent = mw.ustring.len(leading or "")
                local level = math.floor(indent / 2)
                local hashes = string.rep('#', 1 + level)
                processed = hashes .. (rest ~= "" and (" " .. rest) or "")
                table.insert(out_lines, processed)
                handled = true
            end
        end


        local numMatch = mw.ustring.match(content, "^%d+%.%s*(.*)")
         if not handled then
         if numMatch then
             table.insert(out_lines, processed)
             table.insert(out, string.rep("#", level + 1) .. " " .. numMatch)
        else
            local dashMatch = mw.ustring.match(content, "^%-%s*(.*)")
            if dashMatch then
                table.insert(out, string.rep("*", level + 1) .. " " .. dashMatch)
            else
                table.insert(out, line)
            end
         end
         end
     end
     end


     return table.concat(out, "\n")
     return table.concat(out_lines, "\n")
end
end


Строка 115: Строка 150:
             if tip == "" and params._value and visible ~= params._value then tip = params._value end
             if tip == "" and params._value and visible ~= params._value then tip = params._value end
         end
         end
        visible = mw.ustring.gsub(visible, "|", "|")
         return "{{altTooltip|1=" .. (visible or "") .. "|2={{#invoke:Loc|GetRawString|" .. (tip or "") .. "}}}}"
        tip = mw.ustring.gsub(tip, "|", "|")
         return "{{tooltip|" .. (visible or "") .. "||" .. (tip or "") .. "}}"
     end)
     end)
     while true do
     while true do
Строка 149: Строка 182:
             :gsub('=', '=')
             :gsub('=', '=')
             :gsub(' ', ' ')
             :gsub(' ', ' ')
            :gsub('{"', '')
            :gsub('"}', '')
             :gsub('{', '{')
             :gsub('{', '{')
             :gsub('"', '"')
             :gsub('"', '"')
Строка 159: Строка 194:
     local args = frame.args or {}
     local args = frame.args or {}
     local text = args[1] or args.text or ""
     local text = args[1] or args.text or ""
     text = mw.text.unstripNoWiki(text)
     text = mw.text.unstripNoWiki(text)
     text = process_nowiki_equals(text)
     text = process_nowiki_equals(text)
     return frame:preprocess(transform(text))
 
     return frame:preprocess('<div class="list-reset-margin">\n' .. transform(text) .. '</div>')
end
end


return p
return p