UNPKG

@triaxio/node-xwhois

Version:

Advanced whois library with extended capabilities.

62 lines (47 loc) 1.74 kB
const os = require('os'), log = console.log.bind(console), changeCase = require('change-case'), htmlEntities = require('html-entities').XmlEntities; const DELIMITER = ':'; var stripHTMLEntitites = function(rawData){ var entities = new htmlEntities(); return entities.decode(rawData); } //Checks whether a delimiter followed by a space common in this result var getCommonDelimiterForm = function(rawData, delimiter) { var delimiterPattern = new RegExp(delimiter + '\\S+', 'g'); var delimiterWSpacePattern = new RegExp(delimiter + ' ', 'g'); var delimiterMatches = rawData.match(delimiterPattern) || []; var delimiterWSpaceMatches = rawData.match(delimiterWSpacePattern) || []; if (delimiterMatches.length > delimiterWSpaceMatches.length) { return delimiter; } return delimiter + ' '; } var parse = (rawData)=> { var result = {}; rawData = stripHTMLEntitites(rawData) rawData = rawData.replace(/:\s*\r\n/g, ': '); var lines = rawData.split('\n'); var delimiter = getCommonDelimiterForm(rawData, DELIMITER); lines.forEach(function(line){ line = line.trim(); // colon space because that's the standard delimiter - not ':' as that's used in eg, http links if ( line && line.includes(delimiter) ) { var lineParts = line.split(DELIMITER); // 'Greater than' since lines often have more than one colon, eg values with URLs if ( lineParts.length >= 2 ) { var key = changeCase.camelCase(lineParts[0]), value = lineParts.splice(1).join(DELIMITER).trim() // If multiple lines use the same key, combine the values if ( key in result ) { result[key] = `${result[key]} ${value}`; return } result[key] = value; } } }); return result; } module.exports = parse;