Merge branch 'master' into arastta

main
Burak Çakırel 10 years ago
commit a761b8ce09

@ -17,6 +17,10 @@ jsonlint -ist $'\t' $WAPPALYZER_ROOT/src/apps.json
wappalyzer links
# Npm Module
mkdir -p $WAPPALYZER_ROOT/build/wappalyzer_npm/
cp -R $WAPPALYZER_ROOT/src/drivers/npm/* $WAPPALYZER_ROOT/build/wappalyzer_npm/
# Mozilla Firefox
echo "Building Firefox driver..."

@ -1314,19 +1314,30 @@
"script": "dhtmlxcommon\\.js",
"website": "dhtmlx.com"
},
"Discuz! X": {
"DNN": {
"cats": [
2
1
],
"env": "^DotNetNuke$",
"headers": {
"Cookie": "dnn_IsMobile=",
"DNNOutputCache": "",
"Set-Cookie": "DotNetNukeAnonymous=",
"X-Compressed-By": "DotNetNuke"
},
"html": [
"<!-- by DotNetNuke Corporation",
"<!-- DNN Platform"
],
"implies": "Microsoft ASP.NET",
"meta": {
"generator": "Discuz! X([\\d\\.]+)?\\;version:\\1"
"generator": "DotNetNuke"
},
"env": [
"^discuz_uid$",
"^DISCUZCODE$"
"script": [
"/js/dnncore\\.js",
"/js/dnn\\.js"
],
"implies": "PHP",
"website": "discuz.com"
"website": "dnnsoftware.com"
},
"DTG": {
"cats": [
@ -1478,6 +1489,20 @@
},
"website": "discourse.org"
},
"Discuz! X": {
"cats": [
2
],
"env": [
"^discuz_uid$",
"^DISCUZCODE$"
],
"implies": "PHP",
"meta": {
"generator": "Discuz! X([\\d\\.]+)?\\;version:\\1"
},
"website": "discuz.com"
},
"Disqus": {
"cats": [
15
@ -1543,31 +1568,6 @@
},
"website": "www.dokuwiki.org"
},
"DNN": {
"cats": [
1
],
"env": "^DotNetNuke$",
"headers": {
"DNNOutputCache": "",
"Cookie": "dnn_IsMobile=",
"Set-Cookie": "DotNetNukeAnonymous=",
"X-Compressed-By": "DotNetNuke"
},
"html": [
"<!-- by DotNetNuke Corporation",
"<!-- DNN Platform"
],
"implies": "Microsoft ASP.NET",
"meta": {
"generator": "DotNetNuke"
},
"script": [
"/js/dnncore\\.js",
"/js/dnn\\.js"
],
"website": "dnnsoftware.com"
},
"Dotclear": {
"cats": [
1
@ -2341,6 +2341,16 @@
"script": "https?://js\\.cit\\.api\\.here\\.com/se/([\\d.]+)\\/\\;version:\\1",
"website": "developer.here.com"
},
"HHVM": {
"cats": [
22
],
"headers": {
"X-Powered-By": "HHVM/?([\\d.]+)?\\;version:\\1"
},
"implies": "PHP\\;confidence:50",
"website": "hhvm.com"
},
"HP": {
"cats": [
40
@ -2393,6 +2403,16 @@
},
"website": "hp.com"
},
"HTTP Kit": {
"cats": [
22
],
"headers": {
"Server": "^http-kit"
},
"implies": "Java",
"website": "http-kit.org"
},
"HTTP-Server": {
"cats": [
22
@ -2452,16 +2472,6 @@
"script": "hellobar\\.js",
"website": "hellobar.com"
},
"HHVM": {
"cats": [
22
],
"headers": {
"X-Powered-By": "HHVM/?([\\d.]+)?\\;version:\\1"
},
"website": "hhvm.com",
"implies": "PHP\\;confidence:50"
},
"Hiawatha": {
"cats": [
22
@ -3069,9 +3079,9 @@
"MySQL"
],
"meta": {
"generator": "Koken ([\\d.]+);version:\\1"
"generator": "Koken ([\\d.]+)\\;version:\\1"
},
"script": "koken(?:\\.js\\?([\\d.]+)|/storage);version:\\1",
"script": "koken(?:\\.js\\?([\\d.]+)|/storage)\\;version:\\1",
"website": "koken.me"
},
"Kolibri CMS": {
@ -3117,6 +3127,13 @@
"script": "/Kooboo",
"website": "kooboo.com"
},
"Kotisivukone": {
"cats": [
1
],
"script": "kotisivukone(?:\\.min)?\\.js",
"website": "www.kotisivukone.fi"
},
"LEPTON": {
"cats": [
1
@ -3285,6 +3302,19 @@
"script": "livefyre_init\\.js",
"website": "livefyre.com"
},
"Liveinternet": {
"cats": [
10
],
"html": [
"<script[^<>]*>[^]{0,128}?src\\s*=\\s*['\"]//counter\\.yadro\\.ru/hit(?:;\\S+)?\\?(?:t\\d+\\.\\d+;)?r",
"<!--LiveInternet counter-->",
"<!--/LiveInternet-->",
"<a href=\"http://www.liveinternet.ru/click\""
],
"script": "/js/al/common.js\\?[0-9_]+",
"website": "liveinternet.ru/rating/"
},
"Lo-dash": {
"cats": [
12
@ -3395,11 +3425,10 @@
"MadAdsMedia": {
"cats": [
36
],
],
"env": "^setM(?:Iframe|RefURL)$",
"script": "^https?://(?:ads-by|pixel)\\.madadsmedia.com/",
"website": "madadsmedia.com"
},
"Magento": {
"cats": [
@ -3448,6 +3477,15 @@
"script": "munchkin\\.marketo\\.net/munchkin\\.js",
"website": "www.marketo.com"
},
"Materialize CSS": {
"cats": [
18
],
"html": "<link[^>]* href=\"[^\"]*materialize(?:\\.min)?\\.css",
"implies": "jQuery",
"script": "materialize(?:\\.min)?\\.js",
"website": "materializecss.com"
},
"MathJax": {
"cats": [
25
@ -3764,13 +3802,6 @@
"implies": "PHP",
"website": "moodle.org"
},
"Kotisivukone": {
"cats": [
1
],
"script": "kotisivukone(?:\\.min)?\\.js",
"website": "www.kotisivukone.fi"
},
"Motion-httpd": {
"cats": [
22
@ -3944,24 +3975,6 @@
},
"website": "nginx.org"
},
"Odoo": {
"cats": [
1,
6
],
"implies": [
"Python",
"PostgreSQL",
"node.js",
"Less"
],
"meta": {
"generator": "Odoo"
},
"script": "/web/js/(?:web\\.assets_common/|website\\.assets_frontend/)\\;confidence:25",
"html": "<link[^>]* href=[^>]+/web/css/(?:web\\.assets_common/|website\\.assets_frontend/)\\;confidence:25",
"website": "odoo.com"
},
"OWL Carousel": {
"cats": [
5,
@ -3990,12 +4003,37 @@
"implies": "Laravel",
"website": "octobercms.com"
},
"Odoo": {
"cats": [
1,
6
],
"html": "<link[^>]* href=[^>]+/web/css/(?:web\\.assets_common/|website\\.assets_frontend/)\\;confidence:25",
"implies": [
"Python",
"PostgreSQL",
"node.js",
"Less"
],
"meta": {
"generator": "Odoo"
},
"script": "/web/js/(?:web\\.assets_common/|website\\.assets_frontend/)\\;confidence:25",
"website": "odoo.com"
},
"OmniTouch 8660 My Teamwork": {
"cats": [
19
],
"website": "enterprise.alcatel-lucent.com"
},
"OneAPM": {
"cats": [
10
],
"env": "^BWEUM",
"website": "www.oneapm.com"
},
"OneStat": {
"cats": [
10
@ -4737,6 +4775,16 @@
"script": "require.*\\.js",
"website": "requirejs.org"
},
"Resin": {
"cats": [
22
],
"headers": {
"Server": "^Resin(?:/(\\S*))?;version=\\1"
},
"implies": "Java",
"website": "caucho.com"
},
"Reveal.js": {
"cats": [
12
@ -4999,6 +5047,17 @@
"script": "select2.*\\.js",
"website": "select2.github.io"
},
"Semantic-ui": {
"cats": [
18
],
"html": [
"(?:<div class=\"ui\\s[^>]+\">)\\;confidence:30",
"(?:<link[^>]+semantic(?:\\.css|\\.min\\.css)\">)"
],
"script": "(?:semantic(?:\\.js|\\.min\\.js))",
"website": "semantic-ui.com"
},
"Sencha Touch": {
"cats": [
12,
@ -5113,7 +5172,11 @@
"cats": [
6
],
"implies": [ "PHP", "MySQL", "jQuery" ],
"implies": [
"PHP",
"MySQL",
"jQuery"
],
"meta": {
"application-name": "Shopware"
},
@ -5558,6 +5621,17 @@
"url": "/neos/",
"website": "neos.typo3.org"
},
"Taiga": {
"cats": [
13
],
"env": "^taigaConfig$",
"implies": [
"Django",
"AngularJS"
],
"website": "taiga.io"
},
"Tealeaf": {
"cats": [
10
@ -6077,7 +6151,7 @@
"script": [
"vue(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1",
"/([\\d.]+)/vue(\\.min)?\\.js\\;version:\\1",
"vue.*\\.js;\\confidence:20"
"vue.*\\.js\\;confidence:20"
],
"website": "vuejs.org"
},
@ -6110,6 +6184,16 @@
"implies": "WordPress",
"website": "wp-rocket.me"
},
"Warp": {
"cats": [
22
],
"headers": {
"Server": "^Warp/(\\d+(?:\\.\\d+)+)?$;version:\\1"
},
"implies": "Haskell",
"website": "www.stackage.org/package/warp"
},
"Web Optimizer": {
"cats": [
10
@ -6147,13 +6231,6 @@
},
"website": "www.webgui.org"
},
"webpack": {
"cats": [
44
],
"env": "^webpackJsonp$",
"website": "webpack.github.io"
},
"WebPublisher": {
"cats": [
1
@ -6523,17 +6600,6 @@
"script": "mc\\.yandex\\.ru\\/metrika\\/watch\\.js",
"website": "metrika.yandex.com"
},
"Yesod": {
"cats": [
18,
22
],
"headers": {
"Server": "Warp/\\d+(\\.\\d+)+"
},
"implies": "Haskell",
"website": "www.yesodweb.com"
},
"Yieldlab": {
"cats": [
36
@ -6553,6 +6619,15 @@
],
"website": "yiiframework.com"
},
"Yoast SEO": {
"cats": [
32
],
"html": [
"<!-- This site is optimized with the Yoast"
],
"website": "yoast.com"
},
"YouTube": {
"cats": [
14
@ -7373,6 +7448,13 @@
},
"website": "webedition.de/en"
},
"webpack": {
"cats": [
44
],
"env": "^webpackJsonp$",
"website": "webpack.github.io"
},
"xCharts": {
"cats": [
25

@ -1,78 +1,145 @@
# Wappalyzer
This is npm module for wappalyzer
npm install wappalyzer
var wappalyzer = require("wappalyzer");
var options={
url : "http://codelanka.github.io/Presentation-Engines",
hostname:"codelanka.github.io",
debug:false
}
wappalyzer.detectFromUrl(options,function (err,apps,appInfo) {
console.log(err,apps,appInfo);
})
####Output
null [ 'AngularJS',
'Font Awesome',
'Google Font API',
'jQuery',
'Twitter Bootstrap' ] { AngularJS:
{ app: 'AngularJS',
confidence:
{ 'script //([\\d.]+(\\-?rc[.\\d]*)*)/angular(\\.min)?\\.js/i': 100,
'script /angular.*\\.js/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '1.3.5',
versions: [ '1.3.5' ] },
'Font Awesome':
{ app: 'Font Awesome',
confidence: { 'html /<link[^>]* href=[^>]+font-awesome(?:\\.min)?\\.css/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: [] },
'Google Font API':
{ app: 'Google Font API',
confidence: { 'html /<link[^>]* href=[^>]+fonts\\.(?:googleapis|google)\\.com/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: [] },
jQuery:
{ app: 'jQuery',
confidence: { 'script /jquery.*\\.js/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: [] },
'Twitter Bootstrap':
{ app: 'Twitter Bootstrap',
confidence:
{ 'script /(?:twitter\\.github\\.com/bootstrap|bootstrap(?:\\.js|\\.min\\.js))/i': 100,
'html /<link.+?href="[^"]+bootstrap(?:\\.min)?\\.css/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: [] } }
Wappalyzer Author - Elbert Alias
## Install
Install wappalyzer from NPM with:
```bash
npm install wappalyzer
```
## Quickstart
```javascript
// load in the lib
var wappalyzer = require("wappalyzer");
// set our options
var options={
url : "http://codelanka.github.io/Presentation-Engines",
hostname:"codelanka.github.io",
debug:false
}
// detect from the url directly, library will make a request
wappalyzer.detectFromUrl(options,function (err,apps,appInfo) {
// output for the test
console.dir(apps);
console.dir(appInfo);
})
// sample data
var data = {
url: options.url,
headers: {
test: 1
},
html: '<p>HTML CONTENT OF PAGE HERE</p>'
};
// detect from content you have already
wappalyzer.detectFromHTML(options,function (err,apps,appInfo) {
// output for the test
console.dir(apps);
console.log(appInfo);
})
```
### Output from QuickStart
```javascript
// Apps
[
'CloudFlare',
'Font Awesome',
'Google Maps',
'Modernizr',
'Nginx',
'RequireJS',
'jQuery'
]
// Detailed info on links
{
CloudFlare: {
app: 'CloudFlare',
confidence: { 'headers Server /cloudflare/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: []
},
'Font Awesome': {
app: 'Font Awesome',
confidence: { 'html /<link[^>]* href=[^>]+font-awesome(?:\.min)?\.css/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: []
},
'Google Maps': {
app: 'Google Maps',
confidence: { 'script ///maps.googleapis.com/maps/api/js/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: []
},
'Modernizr': {
app: 'Modernizr',
confidence: { 'script /modernizr(?:-([\d.]*[\d]))?.*\.js/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '2.6.2',
versions: [ '2.6.2' ]
},
'Nginx': {
app: 'Nginx',
confidence: { 'headers Server /nginx(?:/([\d.]+))?/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: []
},
'RequireJS': {
app: 'RequireJS',
confidence: { 'script /require.*\.js/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '',
versions: []
},
'jQuery': {
app: 'jQuery',
confidence:
{ 'script //([\d.]+)/jquery(\.min)?\.js/i': 100,
'script /jquery.*\.js/i': 100 },
confidenceTotal: 100,
detected: true,
excludes: [],
version: '1.10.1',
versions: [ '1.10.1' ]
}
}
```
## Credits
### Wappalyzer Author - Elbert Alias
[Wappalyzer](https://wappalyzer.com/) is a
[cross-platform](https://github.com/AliasIO/Wappalyzer/wiki/Drivers) utility that uncovers the
@ -89,8 +156,17 @@ Refer to the [wiki](https://github.com/AliasIO/Wappalyzer/wiki) for
[contribute](https://github.com/AliasIO/Wappalyzer/wiki/Contributing) and
[more](https://github.com/AliasIO/Wappalyzer/wiki/_pages).
### NPM Module
* [Pasindu De Silva](https://github.com/pasindud) - Initial version with tests
* [Johann du Toit](http://johanndutoit.net) from [Passmarked](http://passmarked.com) - Updated to support just passing data and helped publish to NPMJS
## License
*Licensed under the [GPL](https://github.com/AliasIO/Wappalyzer/blob/master/LICENSE).*
## Donations
Donate Bitcoin: 16gb4uGDAjaeRJwKVmKr2EXa8x2fmvT8EQ - *Thanks!*
![QR Code](https://wappalyzer.com/sites/default/themes/wappalyzer/images/bitcoinqrcode.png)

@ -4,26 +4,65 @@ var request = require('request');
var fs = require('fs');
var path = require('path');
//TODO
exports.detectFromHTML = function(options) {};
/**
* Does the actual detection with information passed
**/
exports.detect = function(options, data, cb) {
// run the wrapper function that will
// trigger the actual library to run
runWrappalyer(options, data, cb);
};
/**
* Wraps the detect method, just kept to reuse old method names
* and not break anything. Although this was just stubbed out.
**/
exports.detectFromHTML = function(options, data, cb) {
// run the detect method
exports.detect(options, data, cb);
};
/**
* Do a actual request for the body & headers, then
* run through detection
**/
exports.detectFromUrl = function(options, cb) {
var url = options.url;
// ensure options and url were
if(!options || !options.url) {
if (options.debug) {
console.log('Fetching the page');
}
// send back a error ...
cb(new Error("\"url\" is a required option to run"
+ " wappalyzer and get the page content"))
getHTMLFromUrl(url, function(err, data) {
if (err || data === null) {
cb(err, null);
} else {
runWrappalyer(options, data, function(err, detected, appInfo) {
cb(null, detected, appInfo);
});
}
});
} else {
// local variables to
var url = options.url;
// get the body content from the url
getHTMLFromUrl(url, function(err, data) {
// check for error or if we got no data back
if (err || data === null) {
// handle the error and don't do anything else ..
cb(err, null);
} else {
// run actual detection
exports.detect(options, data, cb);
}
});
}
};
function getHTMLFromUrl(url, cb) {
@ -42,7 +81,20 @@ function getHTMLFromUrl(url, cb) {
}
function getAppsJson(cb) {
fs.readFile(path.resolve(__dirname, 'apps.json'), 'utf8', function(err, data) {
// depending on evironment select a direction to the path
var appsFileStr = path.resolve(__dirname, './apps.json');
// handle the environment variable if it's there
if(process.env.NODE_ENV == 'testing') {
// set the apps.json to testing stage
appsFileStr = path.resolve(__dirname, '../../apps.json');
}
// read in the file
fs.readFile(appsFileStr, 'utf8', function(err, data) {
if (err) throw err;
return cb(null, JSON.parse(data));
});
@ -51,7 +103,20 @@ function getAppsJson(cb) {
function runWrappalyer(options, data, cb) {
var debug = options.debug || false;
var wappalyzer = require('./wappalyzer').wappalyzer;
// according to environment check it
var wappalyzer = null;
// change depending on the environment
if( process.env.NODE_ENV == 'testing' ) {
wappalyzer = require('../../wappalyzer').wappalyzer;
} else {
wappalyzer = require('./wappalyzer').wappalyzer;
}
getAppsJson(function(err, apps) {
var w = wappalyzer;
w.driver = {

@ -1,19 +1,30 @@
{
"name": "wappalyzer",
"version": "2.0.2",
"version": "2.0.3",
"description": "NPM Module that uncovers the technologies used on websites",
"main": "index.js",
"scripts": {
"test": "mocha -t 15000"
"test": "NODE_ENV=testing mocha -t 15000"
},
"repository": {
"type": "git",
"url": "https://github.com/AliasIO/Wappalyzer"
},
"keywords": [
"wappalyzer"
"wappalyzer",
"detect",
"stack",
"technologies"
],
"author": "Pasindu De Silva",
"contributors": [
{
"name": "Pasindu De Silva"
},
{
"name": "Johann du Toit"
}
],
"author": "Elbert Alias",
"license": "GPLv3",
"bugs": {
"url": "https://github.com/AliasIO/Wappalyzer/issues"

@ -0,0 +1,20 @@
{
"Date":"Fri, 17 Jul 2015 11:05:08 GMT",
"Content-Encoding":"gzip",
"Age":"0",
"X-Cache":"MISS",
"Connection":"keep-alive",
"Content-Length":"1940",
"Via":"1.1 varnish",
"X-Served-By":"cache-lcy1122-LCY",
"Last-Modified":"Thu, 16 Apr 2015 14:24:18 GMT",
"Server":"GitHub.com",
"X-Timer":"S1437131108.300792,VS0,VE84",
"Vary":"Accept-Encoding",
"Content-Type":"text/html; charset=utf-8",
"Access-Control-Allow-Origin":"*",
"Expires":"Fri, 17 Jul 2015 11:10:54 GMT",
"Cache-Control":"max-age=600",
"Accept-Ranges":"bytes",
"X-Cache-Hits":"0"
}

@ -0,0 +1,149 @@
<!DOCTYPE html>
<html lang="en" ng-app="presen" >
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Preso Engines | CodeLanka</title>
<!-- Bootstrap CSS -->
<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css" rel="stylesheet">
<link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.2.0/css/font-awesome.min.css" rel="stylesheet">
<script src="//code.jquery.com/jquery.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.3.5/angular.min.js"></script>
<link href='//fonts.googleapis.com/css?family=Ubuntu' rel='stylesheet' type='text/css'>
<link href="css/style.css" rel="stylesheet">
<script type="text/javascript">
$(function () {
"use strict";
var $bgobj = $(".ha-bg-parallax"); // assigning the object
$(window).on("scroll", function () {
var yPos = -($(window).scrollTop() / $bgobj.data('speed'));
// Put together our final background position
var coords = '100% ' + yPos + 'px';
// Move the background
$bgobj.css({ backgroundPosition: coords });
});
$('div.product-chooser').not('.disabled').find('div.product-chooser-item').on('click', function(){
$(this).parent().parent().find('div.product-chooser-item').removeClass('selected');
$(this).addClass('selected');
$(this).find('input[type="radio"]').prop("checked", true);
});
});
</script>
</head>
<body>
<div class="container-fluid">
<div>
<div class="ha-bg-parallax text-center block-marginb-none" data-type="background" data-speed="20">
<div class="ha-parallax-body">
<div class="ha-content ha-content-whitecolor">
<h1 id="headernav">Preso Engines</h1>
"Presentation Engines"
</div>
<div class="ha-parallax-divider-wrapper">
<span class="ha-diamond-divider-md img-responsive"></span>
</div>
<div class="ha-heading-parallax">By | CodeLanka</div>
</div>
</div>
<div class="container" ng-controller="presentationController">
<h2></h2>
<div class="row form-group product-chooser">
<div class="col-xs-12 col-sm-12 col-md-4 col-lg-4"
ng-repeat="presentation in presentations">
<div class="product-chooser-item">
<div class="col-xs-8 col-sm-8 col-md-12 col-lg-12">
<hr/>
<span class="title">
{{presentation.name}}
</span>
<span class="website">
<a href="{{presentation.website}}">{{presentation.website}}</a>
</span>
<span class="description">
{{presentation.description}}</span>
<input type="radio" name="product" value="mobile_desktop"
checked="checked">
<hr/>
<div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 text-center">
<i class="fa fa-star"></i>
<h2>{{presentation.stargazers_count}}</h2>
</div>
<div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 text-center">
<i class="fa fa-users"></i>
<h2>{{presentation.watchers_count}}</h2>
</div>
<div class="col-xs-4 col-sm-4 col-md-4 col-lg-4 text-center">
<i class="fa fa-bug"></i>
<h2>{{presentation.open_issues_count}}</h2>
</div>
<div class="clear"></div>
<hr>
<p>Github -
<a href="http://github.com/{{presentation.github}}">{{presentation.github}}</a>
</p>
<p>Demo -
<a href="{{presentation.demo}}">{{presentation.demo}}</a>
</p>
<p>License - {{presentation.license}} </p>
<p>Language - {{presentation.language}} </p>
<hr/>
</div>
<div class="clear"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- jQuery -->
<!-- Bootstrap JavaScript -->
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script>
var phonecatApp = angular.module('presen', []);
phonecatApp.controller('presentationController', function ($scope,$http) {
var github = "https://api.github.com/repos/";
$http.get('data.json').
success(function(data, status, headers, config) {
$scope.presentations=data.engines;
for (var i = data.engines.length - 1; i >= 0; i--) {
$scope.presentations[i].stargazers_count=0;
$scope.presentations[i].watchers_count=0;
$scope.presentations[i].open_issues_count=0;
(function(no){
var githuburl = github+data.engines[no].github;
$http.get(githuburl)
.success(function(data, status, headers, config) {
$scope.presentations[no].stargazers_count=data.stargazers_count;
$scope.presentations[no].watchers_count=data.watchers_count;
$scope.presentations[no].open_issues_count=data.open_issues_count;
})
.error(function(data, status, headers, config) {});
}(i));
};
}).
error(function(data, status, headers, config) {});
});
</script>
</body>
</html>

@ -1,4 +1,5 @@
var assert = require("assert")
var assert = require("assert")
var fs = require('fs')
describe('wappalyzer', function(){
describe('detectFromUrl', function(){
@ -24,4 +25,41 @@ describe('wappalyzer', function(){
})
})
describe('detectFromHTML', function(){
it('should have the expected apps detected when passed raw info', function(done){
var wappalyzer = require("../index");
var expect = ['AngularJS','Font Awesome','Google Font API','Twitter Bootstrap','jQuery'];
var options={
url : "http://codelanka.github.io/Presentation-Engines",
hostname:"codelanka.github.io",
debug:false
}
var data = {
url: options.url,
headers: require('./sample.headers.json'),
html: fs.readFileSync('./test/sample.html').toString(),
headers: {
headers: {}
}
};
wappalyzer.detectFromHTML(options, data, function (err,apps) {
assert.equal(expect[0], apps[0]);
assert.equal(expect[1], apps[1]);
assert.equal(expect[2], apps[2]);
assert.equal(expect[3], apps[3]);
done();
})
})
})
})

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 971 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 862 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB