Module:Sensitive IP addresses/summary explained

local mSIPA_API = require('Module:Sensitive IP addresses/API')local yesno = require('Module:Yesno')

local p =

-- Strips a suffix from a CIDR string if the suffix is of a given bitLength.-- bitLength must be either 32 or 128.-- This is intended to allow CIDR strings to be represented as a single IP-- address if this can be done unambiguously.local function stripCIDRSuffix(cidr, bitLength) assert(bitLength

32 or bitLength

128, 'bitLength was not 32 or 128') local pattern = '/' .. bitLength .. '$' cidr = cidr:gsub(pattern, ) return cidrend

-- Takes an array of CIDR ranges and returns a new array with ranges-- appropriate for printing.local function prettifyRanges(ranges, bitLength) local ret = for i, cidr in ipairs(ranges) do ret[i] = stripCIDRSuffix(cidr, bitLength) end return retend

-- Turns an array of CIDR ranges into its string representation.local function stringifyRanges(ranges, bitLength, separator) if not ranges then return end ranges = prettifyRanges(ranges, bitLength) return table.concat(ranges, separator)end

function p._table(options) -- Return a wikitext table summarizing all the sensitive IP ranges -- and the entities they belong to.

-- Load dependencies local lang = mw.language.getContentLanguage

-- Set up options options = options or local rangeSeparator = options.rangeseparator or ', ' local showNotes = yesno(options.notes) local nColumns = showNotes and 3 or 4

-- Get the entity data local data = mSIPA_API.query if data['error'] then error(string.format('%s: %s', data['error'].code, data['error'].info)) end

-- Make the table root local root = mw.html.create('table') root:addClass('sensitive-ip-addresses') if options.class then root:addClass(options.class) end if options.style then root:cssText(options.style) end

-- Add main header if options.mainheader then root:tag('tr'):tag('td') :attr('colspan', nColumns) :cssText(options.cellstyle) :wikitext(options.mainheader) end

-- Add column headers local headerRow = root:tag('tr') headerRow :tag('th') :cssText(options.cellstyle) :wikitext('IPv4') :done :tag('th') :cssText(options.cellstyle) :wikitext('IPv6') :done :tag('th') :cssText(options.cellstyle) :wikitext('Description') if showNotes then headerRow:tag('th') :cssText(options.cellstyle) :wikitext('Notes') end

-- Add data cells for i, id in ipairs(data.sensitiveips['entity-ids']) do local entityData = data.sensitiveips.entities[id] if not options.reason or options.reason

entityData.reason then local dataRow = root:tag('tr') dataRow :tag('td') :cssText(options.cellstyle) :wikitext(stringifyRanges(entityData.ipv4Ranges, 32, rangeSeparator )) :done :tag('td') :cssText(options.cellstyle) :wikitext(stringifyRanges(entityData.ipv6Ranges, 128, rangeSeparator )) :done :tag('td') :cssText(options.cellstyle) :wikitext(lang:ucfirst(entityData.description)) if showNotes then dataRow:tag('td') :cssText(options.cellstyle) :wikitext(entityData.notes) end end end

return tostring(root)end

function p.table(frame) local args = require('Module:Arguments').getArgs(frame,) return p._table(args)end

return p