Skip to content

Commit 3a1bd99

Browse files
committed
Moved esprima parsing to front end and now must popluate after returning data to backend
1 parent f4c6cab commit 3a1bd99

File tree

9 files changed

+286
-53
lines changed

9 files changed

+286
-53
lines changed

app/scripts/app.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ angular.module('codeSearchApp', [
2929
.when('/about', {
3030
templateUrl: 'partials/about',
3131
})
32+
.when('/popSnips', {
33+
templateUrl: 'partials/popsnips',
34+
controller: 'PopsnipsCtrl'
35+
})
3236
.otherwise({
3337
redirectTo: '/'
3438
});

app/scripts/controllers/main.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
'use strict';
22

33
angular.module('codeSearchApp')
4-
.controller('MainCtrl', function ($rootScope, $scope, $http, $timeout, $modal, $log, apiRequest, Auth) {
4+
.controller('MainCtrl', function ($rootScope, $scope, $http, $timeout, $modal, $log, apiRequest, Auth, codeParser) {
55
$scope.isCollapsed = {collapse:false};
66
$scope.codeSnippits = [];
77
$scope.fileUrl = {url: ''};
@@ -19,6 +19,7 @@ angular.module('codeSearchApp')
1919
currPage: 0,
2020
resultsPerPage: 10
2121
};
22+
2223
$scope.getNumPages = function() {
2324
return Math.ceil( $scope.codeSnippits.length / $scope.page.resultsPerPage );
2425
};

app/scripts/services/apirequest.js

Lines changed: 105 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,72 @@
11
'use strict';
22

33
angular.module('codeSearchApp')
4-
.factory('apiRequest', function ($http, $timeout) {
4+
.factory('apiRequest', function ($http, $timeout, codeParser) {
55
// Service logic
66
// ...
77
var apiRequest = {};
88

99
// Public API here
10+
var searchOptions;
11+
var searchQuery;
12+
var library;
13+
var libFunction;
14+
15+
var getDepVar = function(lib, file) {
16+
var parsedData = esprima.tokenize(file);
17+
18+
for ( var i = 0; i < parsedData.length; i++ ) {
19+
var o = parsedData[i];
20+
21+
if ( o.type === 'String' &&
22+
o.value.substring(1, o.value.length - 1 ) === lib &&
23+
parsedData[ i+1 ].type === 'Punctuator' &&
24+
parsedData[ i+1 ].value === ')' &&
25+
parsedData[ i-1 ].type === 'Punctuator' &&
26+
parsedData[ i-1 ].value === '(' &&
27+
parsedData[ i-2 ].type === 'Identifier' &&
28+
parsedData[ i-2 ].value === 'require' &&
29+
parsedData[ i-3 ].type === 'Punctuator' &&
30+
parsedData[ i-3 ].value === '=' &&
31+
parsedData[ i-4 ].type === 'Identifier' ) {
32+
33+
return parsedData[ i-4 ].value;
34+
}
35+
}
36+
};
37+
38+
var snippIterator = function(doc, callback) {
39+
40+
var docContent = doc.contents;
41+
var repoUrl = doc.repoUrl || "";
42+
var filePath = doc.filePath || "";
43+
var snippitRatings = doc.snippitRatings ?
44+
doc.snippitRatings[libFunction] : {};
45+
46+
var dep;
47+
if ( library.length > 0 && libFunction.length > 0 ) {
48+
dep = getDepVar( library, docContent );
49+
50+
if ( dep ) {
51+
searchQuery = dep + '.' + libFunction;
52+
}
53+
}
54+
55+
var snippit = codeParser(docContent, searchQuery, searchOptions);
56+
57+
var resultsArr = [];
58+
snippit.forEach(function(snippit) {
59+
// console.log(snippit.length);
60+
var snippitObj = {
61+
repoUrl: repoUrl,
62+
filePath: filePath,
63+
snippit: snippit,
64+
docContent: docContent
65+
};
66+
resultsArr.push(snippitObj);
67+
});
68+
callback(null, resultsArr);
69+
};
1070

1171
apiRequest.findCode = function (lib, func) {
1272
return $http({
@@ -16,41 +76,58 @@ angular.module('codeSearchApp')
1676
library: lib,
1777
libFunction: func
1878
}
19-
}).then(function(data){
20-
var parsedData = angular.fromJson(data);
21-
parsedData.data.snippits.sort(function(a, b) {
22-
if (a.snippitScore < b.snippitScore) {
23-
return 1;
24-
} else if (a.snippitScore > b.snippitScore) {
25-
return -1;
26-
} else {
27-
return 0;
28-
}
29-
});
79+
})
80+
.then(function(data) {
81+
searchOptions = data.data.searchOptions;
82+
searchQuery = data.data.searchQuery;
83+
library = lib;
84+
libFunction = func;
3085

31-
var snippitsReturned = {};
32-
snippitsReturned.codeSnippits = parsedData.data.snippits;
86+
var files = data.data.files;
3387

34-
var pages = Math.ceil(snippitsReturned.codeSnippits.length / 10 );
35-
snippitsReturned.pageArray = [];
88+
console.log('files', files.length);
89+
console.log('sOpts', searchOptions);
90+
console.log('sQuer', searchQuery);
3691

37-
for ( var i = 0; i < pages; i++ ) {
38-
snippitsReturned.pageArray.push(i);
39-
}
92+
async.map(files, snippIterator, function(err, snippitsArr) {
93+
snippitsArr = _.flatten(snippitsArr);
94+
console.log('done iterating through snippits', snippitsArr.length);
95+
console.log(snippitsArr);
96+
console.log('populating snippit ids');
97+
98+
var snipPaths = _.pluck(snippitsArr, 'filePath');
4099

41-
return snippitsReturned
100+
$http.post('/api/popSnips', {snipPaths: snipPaths})
101+
.then(function(data) {
102+
103+
});
104+
});
42105
})
43-
}
106+
// .then(function(data){
107+
// var parsedData = angular.fromJson(data);
108+
// parsedData.data.snippits.sort(function(a, b) {
109+
// if (a.snippitScore < b.snippitScore) {
110+
// return 1;
111+
// } else if (a.snippitScore > b.snippitScore) {
112+
// return -1;
113+
// } else {
114+
// return 0;
115+
// }
116+
// });
44117

118+
// var snippitsReturned = {};
119+
// snippitsReturned.codeSnippits = parsedData.data.snippits;
45120

46-
// apiRequest.snippitVote = function (vote, snippitObj) {
47-
// return $http.post('/api/snippitVote', {
48-
// snippit: snippitObj.snippit,
49-
// votePreference: vote,
50-
// filePath: snippitObj.filePath
51-
// });
52-
// }
121+
// var pages = Math.ceil(snippitsReturned.codeSnippits.length / 10 );
122+
// snippitsReturned.pageArray = [];
53123

124+
// for ( var i = 0; i < pages; i++ ) {
125+
// snippitsReturned.pageArray.push(i);
126+
// }
127+
128+
// return snippitsReturned
129+
// })
130+
}
54131

55132
return apiRequest
56133

app/scripts/services/codeparser.js

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
'use strict';
2+
3+
angular.module('codeSearchApp')
4+
.factory('codeParser', function () {
5+
6+
var extractSnippit = function(result) {
7+
8+
var content = result.input;
9+
var startIndex = result.index;
10+
var endIndex;
11+
var fnQuery = result.query;
12+
// console.log('extractSnippit fnQuery', result.query, startIndex);
13+
// console.log('fnQuery', fnQuery);
14+
// console.log('content', content);
15+
16+
17+
var bracketCounter = {
18+
'{': 0,
19+
'(': 0,
20+
')': 0,
21+
'}': 0,
22+
'[': 0,
23+
']': 0
24+
};
25+
26+
// console.log(content[ startIndex + fnQuery.length ])
27+
28+
for ( var i = startIndex + fnQuery.length; i < content.length; i++ ) {
29+
if ( content[i] in bracketCounter ) {
30+
bracketCounter[ content[i] ]++;
31+
}
32+
33+
if ( bracketCounter['{'] === bracketCounter['}']
34+
&& bracketCounter['('] === bracketCounter[')']
35+
&& bracketCounter['['] === bracketCounter[']'] )
36+
{
37+
endIndex = i;
38+
break;
39+
}
40+
}
41+
42+
if ( content[ startIndex + fnQuery.length ] !== '(' ) {
43+
return;
44+
} else {
45+
// console.log( content.substring(startIndex, endIndex + 1) );
46+
return content.substring(startIndex, endIndex + 1);
47+
}
48+
};
49+
50+
51+
return function(content, fnQuery, searchOptions) {
52+
var resultsArr = [];
53+
var parsedData = esprima.tokenize(content, {range: true});
54+
55+
var methodMatches = fnQuery.match(/\./g);
56+
// console.log('fnQuery', fnQuery);
57+
58+
if (methodMatches && methodMatches.length === 1 &&
59+
searchOptions.library === true &&
60+
searchOptions.func === true) {
61+
62+
var dotPosition = fnQuery.indexOf('.');
63+
var fnQueryPartOne = fnQuery.substring(0, dotPosition);
64+
var fnQueryPartTwo = fnQuery.substring(dotPosition+1);
65+
66+
for (var i = 0; i <parsedData.length; i++) {
67+
var o = parsedData[i];
68+
if (parsedData[ i+1 ] && parsedData[ i+2 ] &&
69+
o.type === 'Identifier' &&
70+
o.value === fnQueryPartOne &&
71+
parsedData[ i+1 ].value === '.' &&
72+
parsedData[ i+1 ].type === 'Punctuator' &&
73+
parsedData[ i+2 ].value === fnQueryPartTwo &&
74+
parsedData[ i+2 ].type === 'Identifier') {
75+
76+
fnQuery = fnQueryPartOne + '.' + fnQueryPartTwo;
77+
// console.log('extracting snippit', {input: content, index: parsedData[ i ].range[0], query: fnQuery});
78+
var snippit = extractSnippit({input: content, index: parsedData[ i ].range[0], query: fnQuery});
79+
80+
if (snippit) {
81+
resultsArr.push(snippit);
82+
}
83+
// console.log('snippit', snippit);
84+
}
85+
}
86+
} else if ( !methodMatches ) {
87+
for ( var i = 0; i < parsedData.length; i++ ) {
88+
var o = parsedData[i];
89+
if (searchOptions.library === false &&
90+
searchOptions.func === true &&
91+
o.type === 'Identifier' &&
92+
o.value === fnQuery &&
93+
parsedData[ i-1 ].type === 'Punctuator' &&
94+
parsedData[ i-1 ].value === '.' &&
95+
parsedData[ i-2 ].type === 'Identifier') {
96+
97+
fnQuery = parsedData[ i-2 ].value + '.' + fnQuery;
98+
var snippit = extractSnippit({ input: content, index: parsedData[ i-2 ].range[0], query: fnQuery });
99+
// console.log('method snippit', snippit);
100+
101+
if (snippit) {
102+
resultsArr.push(snippit);
103+
}
104+
} else if (parsedData[ i+1 ] && parsedData[ i+2 ] &&
105+
searchOptions.library === true &&
106+
searchOptions.func === false &&
107+
o.type === 'Identifier' &&
108+
o.value === fnQuery &&
109+
parsedData[ i+1 ].type === 'Punctuator' &&
110+
parsedData[ i+1 ].value === '.' &&
111+
parsedData[ i+2 ].type === 'Identifier') {
112+
113+
fnQuery = fnQuery + '.' + parsedData[ i+2 ].value;
114+
var snippit = extractSnippit({ input: content, index: o.range[0], query: fnQuery });
115+
// console.log('library snippit', snippit);
116+
117+
if (snippit) {
118+
resultsArr.push(snippit);
119+
}
120+
}
121+
}
122+
}
123+
124+
return resultsArr;
125+
};
126+
127+
});

app/views/index.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@
6060
<!-- build:js({.tmp,app}) scripts/scripts.js -->
6161
<!--<script src="bower_components/highlight/src/highlight.js"></script>-->
6262
<!--<script src="http://cdnjs.cloudflare.com/ajax/libs/highlight.js/8.0/highlight.min.js"></script>-->
63+
<script src="bower_components/esprima/esprima.js"></script>
64+
<script src="bower_components/async/lib/async.js"></script>
65+
<script src="bower_components/underscore/underscore.js"></script>
6366
<script src="scripts/app.js"></script>
6467
<script src="scripts/controllers/main.js"></script>
6568
<script src="scripts/controllers/navbar.js"></script>
@@ -75,6 +78,7 @@
7578
<script src="scripts/filters/startpagefrom.js"></script>
7679
<script src="scripts/filters/paginatefrom.js"></script>
7780
<script src="scripts/controllers/modal.js"></script>
81+
<script src="scripts/services/codeparser.js"></script>
7882
<!-- endbuild -->
7983
</body>
8084
</html>

bower.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@
1212
"angular-sanitize": ">=1.2.*",
1313
"angular-route": ">=1.2.*",
1414
"angular-bootstrap": "~0.11.0",
15-
"highlight": "~7.0.1"
15+
"highlight": "~7.0.1",
16+
"esprima": "~1.2.2",
17+
"async": "~0.9.0",
18+
"underscore": "~1.6.0"
1619
},
1720
"devDependencies": {
1821
"angular-mocks": ">=1.2.*",

0 commit comments

Comments
 (0)