| Pre-alpha | This module is rated as pre-alpha. It is unfinished, and may or may not be in active development. It should not be used from article namespace pages. Modules remain pre-alpha until the original editor (or someone who takes one over if it is abandoned for some time) is satisfied with the basic structure. | 
The module “Sandbox/Ypnypn/Review” provides an automated review of an article, pointing out possible flaws.
Usage edit source
{{#invoke:Sandbox/Ypnypn/Review|review|page name}}
Parameters edit source
The first parameter, also available through |page=, indicates the page to be analyzed.
The second parameter, also available through |plain=, has the module return a plain, non-descriptive list of issues. This is not recommended.
local p = {}
function p.review(frame)
    page = frame.args['page'] or frame.args[1]
    article = mw.title.new(page,'')
    content = article:getContent()
    result = ''
    
    issues = critique(content)
    
    if frame.args['plain'] then
        for issue, details in pairs(issues) do
            result = result..'# '..issue..' = '..details..'\n'
        end
        return result
    else
       for issue, details in pairs(issues) do
           result = result..text(issue, details)
        end
        if result == '' then
            result = 'The article is perfect!'
        else
            result = "The article '''[["..page.."]]''' has some problems:\n"..result
        end
        return result
    end
end
function critique(content)
    issues = {}
    prose = content
    prose = string.gsub(prose, '{|.-|}', '')
    prose = string.gsub(prose, '<ref>.-</ref>', '')
    prose = string.gsub(prose, '%[%[Category:.-%]%]', '')
    prose = string.gsub(prose, '%[%[File:.-%]%]', '')
    prose = string.gsub(prose, '%b{}', '')
    --infobox
    if not string.match(content, '{{Infobox') then
        issues['infobox'] = 'none'
    end
    --categories
    if not string.match(content, '%[%[Category:') then
        issues['category'] = 'none'
    elseif not string.match(content, '%[%[Category:.+%[%[Category:') then
        issues['category'] = 'one'
    end
    --length
    length = #prose
    if length > 100000 then
        issues['length'] = 'too long'
    elseif length < 10000 then
        issues['length'] = 'too short'
    end
    return issues
end
function text(issue, details)
    if issue == 'infobox' and details == 'none' then
        return '* There is no infobox.\n'
    end
    if issue == 'category' then
        if details == 'none' then
            return '* There are no categories.\n'
        elseif details == 'one' then
            return '* There is only one category.\n'
        end
    end
    if issue == 'length' then
        if details == 'too long' then
            return '* The article is very long.\n'
        elseif details == 'too short' then
            return '* The article is very short.\n'
        end
    end
    return '<strong><span style="color:red">Error: text not found!</span> '..issue..' = '..details..'</strong>\n'
end
return p