Line 3: |
Line 3: |
| -- not on the list | | -- not on the list |
| local p = {} | | local p = {} |
| + | |
| + | local function trim(s) |
| + | return s:match('^%s*(.-)%s*$') |
| + | end |
| | | |
| local function isnotempty(s) | | local function isnotempty(s) |
− | return s and s:match( '^%s*(.-)%s*$' ) ~= '' | + | return s and s:match('%S') |
| + | end |
| + | |
| + | local function clean(text) |
| + | -- Return text cleaned for display and truncated if too long. |
| + | -- Strip markers are replaced with dummy text representing the original wikitext. |
| + | local pos, truncated |
| + | local function truncate(text) |
| + | if truncated then |
| + | return '' |
| + | end |
| + | if mw.ustring.len(text) > 25 then |
| + | truncated = true |
| + | text = mw.ustring.sub(text, 1, 25) .. '...' |
| + | end |
| + | return mw.text.nowiki(text) |
| + | end |
| + | local parts = {} |
| + | for before, tag, remainder in text:gmatch('([^\127]*)\127[^\127]*%-(%l+)%-[^\127]*\127()') do |
| + | pos = remainder |
| + | table.insert(parts, truncate(before) .. '<' .. tag .. '>...</' .. tag .. '>') |
| + | end |
| + | table.insert(parts, truncate(text:sub(pos or 1))) |
| + | return table.concat(parts) |
| end | | end |
| | | |
− | function p.check (frame) | + | function p._check(args, pargs) |
− | local args = frame.args | + | if type(args) ~= "table" or type(pargs) ~= "table" then |
− | local pargs = frame:getParent().args
| + | -- TODO: error handling |
− | local ignoreblank = isnotempty(frame.args['ignoreblank']) | + | return |
− | local checkpos = isnotempty(frame.args['checkpositional']) | + | end |
| + | |
| + | local ignoreblank = isnotempty(args['ignoreblank']) |
| + | local showblankpos = isnotempty(args['showblankpositional']) |
| local knownargs = {} | | local knownargs = {} |
− | local unknown = 'Found _VALUE_, ' | + | local unknown = args['unknown'] or 'Found _VALUE_, ' |
| + | local preview = args['preview'] |
| | | |
| + | local values = {} |
| local res = {} | | local res = {} |
| local regexps = {} | | local regexps = {} |
− | local comments = {}
| + | |
− | local commentstr = ''
| |
− |
| |
| -- create the list of known args, regular expressions, and the return string | | -- create the list of known args, regular expressions, and the return string |
| for k, v in pairs(args) do | | for k, v in pairs(args) do |
| if type(k) == 'number' then | | if type(k) == 'number' then |
− | v = mw.ustring.gsub(v, '^%s*(.-)%s*$', '%1') | + | v = trim(v) |
| knownargs[v] = 1 | | knownargs[v] = 1 |
− | else | + | elseif k:find('^regexp[1-9][0-9]*$') then |
− | if (k == 'unknown' and type(v) == 'string') then
| + | table.insert(regexps, '^' .. v .. '$') |
− | unknown = v
| |
− | elseif (mw.ustring.match(k, '^regexp[%d]*$') and type(v) == 'string') then
| |
− | table.insert(regexps, '^' .. v .. '$')
| |
− | end
| |
| end | | end |
| + | end |
| + | if isnotempty(preview) then |
| + | preview = '<div class="hatnote" style="color:red"><strong>Warning:</strong> ' .. preview .. ' (this message is shown only in preview).</div>' |
| + | elseif preview == nil then |
| + | preview = unknown |
| end | | end |
| | | |
| -- loop over the parent args, and make sure they are on the list | | -- loop over the parent args, and make sure they are on the list |
− | for k,v in pairs(pargs) do | + | for k, v in pairs(pargs) do |
− | if (type(k) == 'string' and knownargs[k] == nil) then | + | if type(k) == 'string' and knownargs[k] == nil then |
− | local knownflag = nil | + | local knownflag = false |
− | for r = 1,#regexps do | + | for _, regexp in ipairs(regexps) do |
− | if( mw.ustring.match(k,regexps[r]) ) then | + | if mw.ustring.match(k, regexp) then |
− | knownflag = 1 | + | knownflag = true |
| + | break |
| end | | end |
| end | | end |
− | if( (not knownflag) and ( (not ignoreblank) or (ignoreblank and isnotempty(v)) ) ) then | + | if not knownflag and ( not ignoreblank or isnotempty(v) ) then |
− | k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
| + | table.insert(values, clean(k)) |
− | local r = mw.ustring.gsub(unknown, '_VALUE_', k)
| |
− | table.insert(res, r) | |
− | table.insert(comments, '"' .. k .. '"')
| |
| end | | end |
− | elseif(checkpos and type(k) == 'number' and knownargs[tostring(k)] == nil) then | + | elseif type(k) == 'number' and |
− | if( (not ignoreblank) or (ignoreblank and isnotempty(v)) ) then | + | knownargs[tostring(k)] == nil and |
− | local r = mw.ustring.gsub(unknown, '_VALUE_', k)
| + | ( showblankpos or isnotempty(v) ) |
− | table.insert(res, r)
| + | then |
− | table.insert(comments, '"' .. k .. '"')
| + | table.insert(values, k .. ' = ' .. clean(v)) |
| + | end |
| + | end |
| + | |
| + | -- add results to the output tables |
| + | if #values > 0 then |
| + | if mw.getCurrentFrame():preprocess( "{{REVISIONID}}" ) == "" then |
| + | unknown = preview |
| + | end |
| + | for _, v in pairs(values) do |
| + | if v == '' then |
| + | -- Fix odd bug for | = which gets stripped to the empty string and |
| + | -- breaks category links |
| + | v = ' ' |
| end | | end |
| + | -- avoid error with v = 'example%2' ("invalid capture index") |
| + | local r = unknown:gsub('_VALUE_', {_VALUE_ = v}) |
| + | table.insert(res, r) |
| end | | end |
| end | | end |
| | | |
− | if(#comments > 0) then | + | return table.concat(res) |
− | commentstr = '<!-- Module:Check for unknown parameters results: ' ..
| + | end |
− | table.concat(comments, ', ') .. '-->'
| + | |
− | end | + | function p.check(frame) |
− | | + | local args = frame.args |
− | return table.concat(res) .. commentstr | + | local pargs = frame:getParent().args |
| + | return p._check(args, pargs) |
| end | | end |
| | | |
| return p | | return p |