localmArguments=require('Module:Arguments')localvalidFields={type=true,scale=true,region=true}localp={}localfunctionerr(msg)returnstring.format('<strong class="error">Error: %s</strong>',msg)endfunctionp.main(frame)localargs=mArguments.getArgs(frame)returnp._main(args)endfunctionp._main(args)localinput=args1localfield=args2orargs.fieldlocalshowCityData=args.citydata=='yes'-- Validate input.ifnotinputthenreturnerr('no input code specified')elseifnotfieldthenreturnerr('no field specified')end-- Parse the input string.localsubstrings=mw.text.split(input,'_')localdata={}fori,substringinipairs(substrings)dolocalkey,value=mw.ustring.match(substring,'^(.-):(.*)$')ifkeyandvalidFieldskeythendatakey=valueendend-- Fetch the result.iffield=='error'then-- Check for missing data.localmissingFields={}forvalidFieldinpairs(validFields)doifnotdatavalidFieldthentable.insert(missingFields,validField)endendif#missingFields>0thenlocalmsg='the '..mw.text.listToText(missingFields)..' fields are missing'returnerr(msg)elsereturn''endelse-- Return the specified field, or the blank string if it is missing.localresult=datafieldor''iffield=='type'then-- Check for type values like "city(20000)".localcity,population=mw.ustring.match(result,'^(city)%((.-)%)$')ifcitythenifshowCityDatathenreturnpopulationelsereturncityendendendreturnresultendendreturnp