/**
* @file meta_generator_tags.js
* @desc looks for server version info in meta generator tags
*/
'use strict';
var _ = require('lodash'),
_s = require('underscore.string'),
domutils = require('domutils');
var serverKeywords = ['MediaWiki', 'Drupal', 'WordPress',
'vBulletin', 'Joomla!'];
var getServerInfoFromMetaHeader = function (metaHeader, keyLower) {
var serverInfo = {};
var headerWords = _s.words(metaHeader);
Eif (headerWords.length > 0) {
serverInfo.name = _s.trim(headerWords[0]);
if (keyLower === 'wordpress') {
// Hosted WordPress.com also have generator tag 'WordPress.com'
serverInfo.name = _s.strLeftBack(serverInfo.name, '.com');
}
}
Eif (headerWords.length > 1) {
serverInfo.version = _s.trim(headerWords[1]).replace(/[^\d.]/g, '');
}
return serverInfo;
};
var analyzer = function () {
var serverInfos = [];
this.init = function (headers /*jshint unused:vars*/) {
//No Op
};
this.isEnabledForDomWatch = function () {
return true;
};
this.getServerInfo = function () {
return serverInfos;
};
this.inspectDomNode = function (element) {
if (!element || element.type !== 'tag' || element.name !== 'meta') {
return;
}
var attrName = domutils.getAttributeValue(element, 'name');
if (!attrName && attrName !== 'generator'){
return;
}
var attrContent = domutils.getAttributeValue(element, 'content');
if (!attrContent){
return;
}
var metaHeader = _s.trim(attrContent);
_.forEach(serverKeywords, function (key) {
var keyLower = key.toLowerCase();
var metaLower = metaHeader.toLowerCase();
if (!_s.startsWith(metaLower, keyLower)) {
return;
}
var serverInfo = getServerInfoFromMetaHeader(metaHeader, keyLower);
Eif (serverInfo) {
serverInfos.push(serverInfo);
}
});
};
};
module.exports = analyzer;
|