all files / src/html_analyzer/ meta_generator_tags.js

13.16% Statements 5/38
0% Branches 0/21
0% Functions 0/7
13.16% Lines 5/38
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81                                                                                                                                                       
/**
 * @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);
 
   if (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');
      }
   }
   if (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);
         if (serverInfo) {
            serverInfos.push(serverInfo);
         }
      });
   };
};
 
 
module.exports = analyzer;