Skip to content
This repository was archived by the owner on Jul 17, 2020. It is now read-only.

Commit 1a06e63

Browse files
committed
Merge branch 'master' of https://github.com/Zirak/SO-ChatBot
Conflicts: master.js master.min.js Conflicts resolved: chose remote
2 parents aff3f0d + f3d1b16 commit 1a06e63

File tree

16 files changed

+654
-366
lines changed

16 files changed

+654
-366
lines changed

master.js

Lines changed: 376 additions & 207 deletions
Large diffs are not rendered by default.

master.min.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

source/IO.js

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,49 @@ var IO = window.IO = {
102102
}
103103
};
104104

105-
IO.decodehtmlEntities = (function (){
105+
//turns some html tags into markdown. a major assumption is that the input is
106+
// properly sanitised - that is, all <, &, etc entered by the user got turned
107+
// into html entities.
108+
IO.htmlToMarkdown = (function () {
109+
110+
// A string value is the delimiter (what replaces the tag)
111+
var markdown = {
112+
i : '*',
113+
b : '**',
114+
strike : '---',
115+
code : '`',
116+
117+
a : function ( $0, $1, text ) {
118+
var href = /href="([^"]+?)"/.exec( $0 );
119+
120+
if ( !href ) {
121+
return $0;
122+
}
123+
return '[' + text + '](' + href[1] + ')';
124+
},
125+
};
126+
var htmlRe = /<(\S+)[^\>]*>([^<]+)<\/\1>/g;
127+
128+
return function ( html ) {
129+
var delim;
130+
131+
return html.replace( htmlRe, decodeHtml );
132+
133+
function decodeHtml ( $0, tag, text ) {
134+
if ( !markdown.hasOwnProperty(tag) ) {
135+
return $0;
136+
}
137+
138+
delim = markdown[ tag ];
139+
140+
return delim.apply ?
141+
markdown[ tag ].apply( markdown, arguments ) :
142+
delim + text + delim;
143+
}
144+
};
145+
}());
146+
147+
IO.decodehtmlEntities = (function () {
106148
var entities; //will be filled in the following line
107149
//#build static/htmlEntities.js
108150

source/bot.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ var bot = window.bot = {
3939
try {
4040
//it wants to execute some code
4141
if ( /^c?>/.test(msg) ) {
42-
this.eval( msg );
42+
this.eval( msg.toString(), msg.directreply.bind(msg) );
4343
}
44+
//or maybe some other action.
4445
else {
4546
this.invokeAction( msg );
4647
}
@@ -134,7 +135,10 @@ var bot = window.bot = {
134135
prepareMessage : function ( msgObj ) {
135136
msgObj = this.adapter.transform( msgObj );
136137

137-
var msg = IO.decodehtmlEntities( msgObj.content );
138+
//decode markdown and html entities.
139+
var msg = IO.htmlToMarkdown( msgObj.content ); //#150
140+
msg = IO.decodehtmlEntities( msg );
141+
138142
//fixes issues #87 and #90 globally
139143
msg = msg.replace( /\u200b|\u200c/g, '' );
140144

@@ -556,6 +560,7 @@ bot.beatInterval = 5000; //once every 5 seconds is Good Enough ™
556560
//#build eval.js
557561

558562
//#build parseCommandArgs.js
563+
//#build parseMacro.js
559564
//#build suggestionDict.js
560565

561566
//#build commands.js

source/codeWorker.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ var global = this;
44
var whitey = {
55
'Array' : 1,
66
'Boolean' : 1,
7+
'console' : 1,
78
'Date' : 1,
89
'Error' : 1,
910
'EvalError' : 1,
11+
'exec' : 1,
1012
'Function' : 1,
1113
'Infinity' : 1,
1214
'JSON' : 1,
@@ -118,7 +120,6 @@ var console = {
118120
}
119121
};
120122
console.error = console.info = console.debug = console.log;
121-
var p = console.log.bind( console );
122123

123124
(function(){
124125
"use strict";

source/commands.js

Lines changed: 7 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ var commands = {
2828
},
2929

3030
eval : function ( msg, cb ) {
31+
cb = cb || msg.directreply.bind( msg );
32+
3133
return bot.eval( msg, cb );
3234
},
3335
coffee : function ( msg, cb ) {
@@ -285,119 +287,15 @@ return function ( args ) {
285287

286288
commands.eval.async = commands.coffee.async = true;
287289

288-
var parse = commands.parse = (function () {
289-
var macros = {
290-
who : function ( msgObj ) {
291-
return msgObj.get( 'user_name' );
292-
},
293-
294-
someone : function () {
295-
var presentUsers = document.getElementById( 'sidebar' )
296-
.getElementsByClassName( 'present-user' );
297-
298-
//the chat keeps a low opacity for users who remained silent for long,
299-
// and high opacity for those who recently talked
300-
var active = [].filter.call( presentUsers, function ( user ) {
301-
return Number( user.style.opacity ) >= 0.5;
302-
}),
303-
user = active[ Math.floor(Math.random() * (active.length-1)) ];
304-
305-
if ( !user ) {
306-
return 'Nobody';
307-
}
308-
309-
return user.getElementsByTagName( 'img' )[ 0 ].title;
310-
},
311-
312-
digit : function () {
313-
return Math.floor( Math.random() * 10 );
314-
},
315-
316-
encode : function ( msgObj, string ) {
317-
return encodeURIComponent( string );
318-
},
319-
320-
//random number, min <= n <= max
321-
//treats non-numeric inputs like they don't exist
322-
rand : function ( msgObj, min, max ) {
323-
min = Number( min );
324-
max = Number( max );
325-
return Math.rand( min, max );
326-
}
327-
};
328-
var macroRegex = /(?:.|^)\$(\w+)(?:\((.*?)\))?/g;
329-
330-
//extraVars is for internal usage via other commands
331-
return function parse ( args, extraVars ) {
332-
var isMsg = !!args.get,
333-
//filler objects, solves
334-
// https://github.com/Zirak/SO-ChatBot/issues/66
335-
msgObj = isMsg ? args.get() : {},
336-
user = isMsg ? bot.users[ args.get('user_id') ] : {};
290+
commands.parse = function ( args ) {
291+
var msgObj = args.get(),
292+
user = bot.users[ args.get('user_id') ],
337293

338-
extraVars = extraVars || {};
294+
extraVars = Object.merge( msgObj, user );
339295
bot.log( args, extraVars, '/parse input' );
340296

341-
return args.replace( macroRegex, replaceMacro );
342-
343-
function replaceMacro ( $0, filler, fillerArgs ) {
344-
//$$ makes a literal $
345-
if ( $0.startsWith('$$') ) {
346-
return $0.slice( 1 );
347-
}
348-
349-
//include the character that was matched in the $$ check, unless
350-
// it's a $
351-
var ret = '';
352-
if ( $0[0] !== '$' ) {
353-
ret = $0[ 0 ];
354-
}
355-
356-
var macro = findMacro( filler );
357-
358-
//not found? bummer.
359-
if ( !macro ) {
360-
return filler;
361-
}
362-
363-
bot.log( macro, filler, fillerArgs, '/parse replaceMacro' );
364-
//when the macro is a function
365-
if ( macro.apply ) {
366-
ret += macro.apply( null, parseMacroArgs(fillerArgs) );
367-
}
368-
//when the macro is simply a substitution
369-
else {
370-
ret += macro;
371-
}
372-
return ret;
373-
}
374-
375-
function parseMacroArgs ( macroArgs ) {
376-
bot.log( macroArgs, '/parse parseMacroArgs' );
377-
if ( !macroArgs ) {
378-
return [ args ];
379-
}
380-
381-
//parse the arguments, split them into individual arguments,
382-
// and trim'em (to cover the case of "arg,arg" and "arg, arg")
383-
return (
384-
[ args ].concat(
385-
parse( macroArgs, extraVars )
386-
.split( ',' ).invoke( 'trim' ) ) );
387-
//this is not good code
388-
}
389-
390-
function findMacro ( macro ) {
391-
var container = [ macros, msgObj, user, extraVars ].first( hasMacro );
392-
393-
return ( container || {} )[ macro ];
394-
395-
function hasMacro ( obj ) {
396-
return obj && obj.hasOwnProperty( macro );
397-
}
398-
}
297+
return bot.parseMacro( args.toString(), extraVars );
399298
};
400-
}());
401299

402300
commands.tell = (function () {
403301
var invalidCommands = { tell : true, forget : true };

source/eval.js

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ bot.eval = (function () {
33
window.URL = window.URL || window.webkitURL || window.mozURL || null;
44

55
//translation tool: http://tinkerbin.heroku.com/84dPpGFr
6-
var worker_code = atob( "dmFyIGdsb2JhbCA9IHRoaXM7CgovKm1vc3QgZXh0cmEgZnVuY3Rpb25zIGNvdWxkIGJlIHBvc3NpYmx5IHVuc2FmZSovCnZhciB3aGl0ZXkgPSB7CgknQXJyYXknICAgICAgICAgICAgICA6IDEsCgknQm9vbGVhbicgICAgICAgICAgICA6IDEsCgknRGF0ZScgICAgICAgICAgICAgICA6IDEsCgknRXJyb3InICAgICAgICAgICAgICA6IDEsCgknRXZhbEVycm9yJyAgICAgICAgICA6IDEsCgknRnVuY3Rpb24nICAgICAgICAgICA6IDEsCgknSW5maW5pdHknICAgICAgICAgICA6IDEsCgknSlNPTicgICAgICAgICAgICAgICA6IDEsCgknTWF0aCcgICAgICAgICAgICAgICA6IDEsCgknTmFOJyAgICAgICAgICAgICAgICA6IDEsCgknTnVtYmVyJyAgICAgICAgICAgICA6IDEsCgknT2JqZWN0JyAgICAgICAgICAgICA6IDEsCgknUmFuZ2VFcnJvcicgICAgICAgICA6IDEsCgknUmVmZXJlbmNlRXJyb3InICAgICA6IDEsCgknUmVnRXhwJyAgICAgICAgICAgICA6IDEsCgknU3RyaW5nJyAgICAgICAgICAgICA6IDEsCgknU3ludGF4RXJyb3InICAgICAgICA6IDEsCgknVHlwZUVycm9yJyAgICAgICAgICA6IDEsCgknVVJJRXJyb3InICAgICAgICAgICA6IDEsCgknYXRvYicgICAgICAgICAgICAgICA6IDEsCgknYnRvYScgICAgICAgICAgICAgICA6IDEsCgknZGVjb2RlVVJJJyAgICAgICAgICA6IDEsCgknZGVjb2RlVVJJQ29tcG9uZW50JyA6IDEsCgknZW5jb2RlVVJJJyAgICAgICAgICA6IDEsCgknZW5jb2RlVVJJQ29tcG9uZW50JyA6IDEsCgknZXZhbCcgICAgICAgICAgICAgICA6IDEsCgknZ2xvYmFsJyAgICAgICAgICAgICA6IDEsCgknaXNGaW5pdGUnICAgICAgICAgICA6IDEsCgknaXNOYU4nICAgICAgICAgICAgICA6IDEsCgknb25tZXNzYWdlJyAgICAgICAgICA6IDEsCgkncGFyc2VGbG9hdCcgICAgICAgICA6IDEsCgkncGFyc2VJbnQnICAgICAgICAgICA6IDEsCgkncG9zdE1lc3NhZ2UnICAgICAgICA6IDEsCgknc2VsZicgICAgICAgICAgICAgICA6IDEsCgkndW5kZWZpbmVkJyAgICAgICAgICA6IDEsCgknd2hpdGV5JyAgICAgICAgICAgICA6IDEsCgoJLyogdHlwZWQgYXJyYXlzIGFuZCBzaGl0ICovCgknQXJyYXlCdWZmZXInICAgICAgIDogMSwKCSdCbG9iJyAgICAgICAgICAgICAgOiAxLAoJJ0Zsb2F0MzJBcnJheScgICAgICA6IDEsCgknRmxvYXQ2NEFycmF5JyAgICAgIDogMSwKCSdJbnQ4QXJyYXknICAgICAgICAgOiAxLAoJJ0ludDE2QXJyYXknICAgICAgICA6IDEsCgknSW50MzJBcnJheScgICAgICAgIDogMSwKCSdVaW50OEFycmF5JyAgICAgICAgOiAxLAoJJ1VpbnQxNkFycmF5JyAgICAgICA6IDEsCgknVWludDMyQXJyYXknICAgICAgIDogMSwKCSdVaW50OENsYW1wZWRBcnJheScgOiAxLAoKCS8qCgl0aGVzZSBwcm9wZXJ0aWVzIGFsbG93IEZGIHRvIGZ1bmN0aW9uLiB3aXRob3V0IHRoZW0sIGEgZnVja2Zlc3Qgb2YKCWluZXhwbGljYWJsZSBlcnJvcnMgZW51c2VzLiB0b29rIG1lIGFib3V0IDQgaG91cnMgdG8gdHJhY2sgdGhlc2UgZnVja2VycwoJZG93bi4KCWZ1Y2sgaGVsbCBpdCBpc24ndCBmdXR1cmUtcHJvb2YsIGJ1dCB0aGUgZXJyb3JzIHRocm93biBhcmUgdW5jYXRjaGFibGUKCWFuZCB1bnRyYWNhYmxlLiBzbyBhIGhlYWRzLXVwLiBlbmpveSwgZnV0dXJlLW1lIQoJKi8KCSdET01FeGNlcHRpb24nIDogMSwKCSdFdmVudCcgICAgICAgIDogMSwKCSdNZXNzYWdlRXZlbnQnIDogMSwKCSdXb3JrZXJNZXNzYWdlRXZlbnQnOiAxCn07CgpbIGdsb2JhbCwgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCkgXS5mb3JFYWNoKGZ1bmN0aW9uICggb2JqICkgewoJT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoIG9iaiApLmZvckVhY2goZnVuY3Rpb24oIHByb3AgKSB7CgkJaWYoIHdoaXRleS5oYXNPd25Qcm9wZXJ0eShwcm9wKSApIHsKICAgICAgICAgICAgcmV0dXJuOwoJCX0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCBvYmosIHByb3AsIHsKICAgICAgICAgICAgICAgIGdldCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAvKiBURUUgSEVFICovCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCBwcm9wICsgJyBpcyBub3QgZGVmaW5lZCcgKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGUgOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGUgOiBmYWxzZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKCBlICkgewogICAgICAgICAgICBkZWxldGUgb2JqWyBwcm9wIF07CgogICAgICAgICAgICBpZiAoIG9ialsgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICBvYmpbIHByb3AgXSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9Cgl9KTsKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoIEFycmF5LnByb3RvdHlwZSwgJ2pvaW4nLCB7Cgl3cml0YWJsZTogZmFsc2UsCgljb25maWd1cmFibGU6IGZhbHNlLAoJZW51bXJhYmxlOiBmYWxzZSwKCgl2YWx1ZTogKGZ1bmN0aW9uICggb2xkICkgewoJCXJldHVybiBmdW5jdGlvbiAoIGFyZyApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCA+IDUwMCB8fCAoYXJnICYmIGFyZy5sZW5ndGggPiA1MDApICkgewoJCQkJdGhyb3cgJ0V4Y2VwdGlvbjogdG9vIG1hbnkgaXRlbXMnOwoJCQl9CgoJCQlyZXR1cm4gb2xkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl9OwoJfSggQXJyYXkucHJvdG90eXBlLmpvaW4gKSkKfSk7CgovKiB3ZSBkZWZpbmUgaXQgb3V0c2lkZSBzbyBpdCdsbCBub3QgYmUgaW4gc3RyaWN0IG1vZGUgKi8KdmFyIGV4ZWMgPSBmdW5jdGlvbiAoIGNvZGUgKSB7CglyZXR1cm4gZXZhbCggJ3VuZGVmaW5lZDtcbicgKyBjb2RlICk7Cn0KdmFyIGNvbnNvbGUgPSB7CglfaXRlbXMgOiBbXSwKCWxvZyA6IGZ1bmN0aW9uKCkgewoJCWNvbnNvbGUuX2l0ZW1zLnB1c2guYXBwbHkoIGNvbnNvbGUuX2l0ZW1zLCBhcmd1bWVudHMgKTsKCX0KfTsKY29uc29sZS5lcnJvciA9IGNvbnNvbGUuaW5mbyA9IGNvbnNvbGUuZGVidWcgPSBjb25zb2xlLmxvZzsKdmFyIHAgPSBjb25zb2xlLmxvZy5iaW5kKCBjb25zb2xlICk7CgooZnVuY3Rpb24oKXsKCSJ1c2Ugc3RyaWN0IjsKCglnbG9iYWwub25tZXNzYWdlID0gZnVuY3Rpb24gKCBldmVudCApIHsKCQlwb3N0TWVzc2FnZSh7CgkJCWV2ZW50IDogJ3N0YXJ0JwoJCX0pOwoKCQl2YXIganNvblN0cmluZ2lmeSA9IEpTT04uc3RyaW5naWZ5LCAvKmJhY2t1cCovCgkJCXJlc3VsdDsKCgkJdHJ5IHsKCQkJcmVzdWx0ID0gZXhlYyggZXZlbnQuZGF0YSApOwoJCX0KCQljYXRjaCAoIGUgKSB7CgkJCXJlc3VsdCA9IGUudG9TdHJpbmcoKTsKCQl9CgoJCS8qSlNPTiBkb2VzIG5vdCBsaWtlIGFueSBvZiB0aGUgZm9sbG93aW5nKi8KCQl2YXIgc3RydW5nID0gewoJCQlGdW5jdGlvbiAgOiB0cnVlLCBFcnJvciAgOiB0cnVlLAoJCQlVbmRlZmluZWQgOiB0cnVlLCBSZWdFeHAgOiB0cnVlCgkJfTsKCQl2YXIgc2hvdWxkX3N0cmluZyA9IGZ1bmN0aW9uICggdmFsdWUgKSB7CgkJCXZhciB0eXBlID0gKCB7fSApLnRvU3RyaW5nLmNhbGwoIHZhbHVlICkuc2xpY2UoIDgsIC0xICk7CgoJCQlpZiAoIHR5cGUgaW4gc3RydW5nICkgewoJCQkJcmV0dXJuIHRydWU7CgkJCX0KCQkJLypuZWl0aGVyIGRvZXMgaXQgZmVlbCBjb21wYXNzaW9uYXRlIGFib3V0IE5hTiBvciBJbmZpbml0eSovCgkJCXJldHVybiB2YWx1ZSAhPT0gdmFsdWUgfHwgdmFsdWUgPT09IEluZmluaXR5OwoJCX07CgoJCXZhciByZXZpdmVyID0gZnVuY3Rpb24gKCBrZXksIHZhbHVlICkgewoJCQl2YXIgb3V0cHV0OwoKCQkJaWYgKCBzaG91bGRfc3RyaW5nKHZhbHVlKSApIHsKCQkJCW91dHB1dCA9ICcnICsgdmFsdWU7CgkJCX0KCQkJZWxzZSB7CgkJCQlvdXRwdXQgPSB2YWx1ZTsKCQkJfQoKCQkJcmV0dXJuIG91dHB1dDsKCQl9OwoKCQlwb3N0TWVzc2FnZSh7CgkJCWFuc3dlciA6IGpzb25TdHJpbmdpZnkoIHJlc3VsdCwgcmV2aXZlciApLAoJCQlsb2cgICAgOiBqc29uU3RyaW5naWZ5KCBjb25zb2xlLl9pdGVtcywgcmV2aXZlciApLnNsaWNlKCAxLCAtMSApCgkJfSk7Cgl9Owp9KSgpOwo=" );
6+
var worker_code = atob( 'dmFyIGdsb2JhbCA9IHRoaXM7CgovKm1vc3QgZXh0cmEgZnVuY3Rpb25zIGNvdWxkIGJlIHBvc3NpYmx5IHVuc2FmZSovCnZhciB3aGl0ZXkgPSB7CgknQXJyYXknICAgICAgICAgICAgICA6IDEsCgknQm9vbGVhbicgICAgICAgICAgICA6IDEsCgknY29uc29sZScgICAgICAgICAgICA6IDEsCgknRGF0ZScgICAgICAgICAgICAgICA6IDEsCgknRXJyb3InICAgICAgICAgICAgICA6IDEsCgknRXZhbEVycm9yJyAgICAgICAgICA6IDEsCgknZXhlYycgICAgICAgICAgICAgICA6IDEsCgknRnVuY3Rpb24nICAgICAgICAgICA6IDEsCgknSW5maW5pdHknICAgICAgICAgICA6IDEsCgknSlNPTicgICAgICAgICAgICAgICA6IDEsCgknTWF0aCcgICAgICAgICAgICAgICA6IDEsCgknTmFOJyAgICAgICAgICAgICAgICA6IDEsCgknTnVtYmVyJyAgICAgICAgICAgICA6IDEsCgknT2JqZWN0JyAgICAgICAgICAgICA6IDEsCgknUmFuZ2VFcnJvcicgICAgICAgICA6IDEsCgknUmVmZXJlbmNlRXJyb3InICAgICA6IDEsCgknUmVnRXhwJyAgICAgICAgICAgICA6IDEsCgknU3RyaW5nJyAgICAgICAgICAgICA6IDEsCgknU3ludGF4RXJyb3InICAgICAgICA6IDEsCgknVHlwZUVycm9yJyAgICAgICAgICA6IDEsCgknVVJJRXJyb3InICAgICAgICAgICA6IDEsCgknYXRvYicgICAgICAgICAgICAgICA6IDEsCgknYnRvYScgICAgICAgICAgICAgICA6IDEsCgknZGVjb2RlVVJJJyAgICAgICAgICA6IDEsCgknZGVjb2RlVVJJQ29tcG9uZW50JyA6IDEsCgknZW5jb2RlVVJJJyAgICAgICAgICA6IDEsCgknZW5jb2RlVVJJQ29tcG9uZW50JyA6IDEsCgknZXZhbCcgICAgICAgICAgICAgICA6IDEsCgknZ2xvYmFsJyAgICAgICAgICAgICA6IDEsCgknaXNGaW5pdGUnICAgICAgICAgICA6IDEsCgknaXNOYU4nICAgICAgICAgICAgICA6IDEsCgknb25tZXNzYWdlJyAgICAgICAgICA6IDEsCgkncGFyc2VGbG9hdCcgICAgICAgICA6IDEsCgkncGFyc2VJbnQnICAgICAgICAgICA6IDEsCgkncG9zdE1lc3NhZ2UnICAgICAgICA6IDEsCgknc2VsZicgICAgICAgICAgICAgICA6IDEsCgkndW5kZWZpbmVkJyAgICAgICAgICA6IDEsCgknd2hpdGV5JyAgICAgICAgICAgICA6IDEsCgoJLyogdHlwZWQgYXJyYXlzIGFuZCBzaGl0ICovCgknQXJyYXlCdWZmZXInICAgICAgIDogMSwKCSdCbG9iJyAgICAgICAgICAgICAgOiAxLAoJJ0Zsb2F0MzJBcnJheScgICAgICA6IDEsCgknRmxvYXQ2NEFycmF5JyAgICAgIDogMSwKCSdJbnQ4QXJyYXknICAgICAgICAgOiAxLAoJJ0ludDE2QXJyYXknICAgICAgICA6IDEsCgknSW50MzJBcnJheScgICAgICAgIDogMSwKCSdVaW50OEFycmF5JyAgICAgICAgOiAxLAoJJ1VpbnQxNkFycmF5JyAgICAgICA6IDEsCgknVWludDMyQXJyYXknICAgICAgIDogMSwKCSdVaW50OENsYW1wZWRBcnJheScgOiAxLAoKCS8qCgl0aGVzZSBwcm9wZXJ0aWVzIGFsbG93IEZGIHRvIGZ1bmN0aW9uLiB3aXRob3V0IHRoZW0sIGEgZnVja2Zlc3Qgb2YKCWluZXhwbGljYWJsZSBlcnJvcnMgZW51c2VzLiB0b29rIG1lIGFib3V0IDQgaG91cnMgdG8gdHJhY2sgdGhlc2UgZnVja2VycwoJZG93bi4KCWZ1Y2sgaGVsbCBpdCBpc24ndCBmdXR1cmUtcHJvb2YsIGJ1dCB0aGUgZXJyb3JzIHRocm93biBhcmUgdW5jYXRjaGFibGUKCWFuZCB1bnRyYWNhYmxlLiBzbyBhIGhlYWRzLXVwLiBlbmpveSwgZnV0dXJlLW1lIQoJKi8KCSdET01FeGNlcHRpb24nIDogMSwKCSdFdmVudCcgICAgICAgIDogMSwKCSdNZXNzYWdlRXZlbnQnIDogMSwKCSdXb3JrZXJNZXNzYWdlRXZlbnQnOiAxCn07CgpbIGdsb2JhbCwgT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbCkgXS5mb3JFYWNoKGZ1bmN0aW9uICggb2JqICkgewoJT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoIG9iaiApLmZvckVhY2goZnVuY3Rpb24oIHByb3AgKSB7CgkJaWYoIHdoaXRleS5oYXNPd25Qcm9wZXJ0eShwcm9wKSApIHsKICAgICAgICAgICAgcmV0dXJuOwoJCX0KCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCBvYmosIHByb3AsIHsKICAgICAgICAgICAgICAgIGdldCA6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAvKiBURUUgSEVFICovCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCBwcm9wICsgJyBpcyBub3QgZGVmaW5lZCcgKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGUgOiBmYWxzZSwKICAgICAgICAgICAgICAgIGVudW1lcmFibGUgOiBmYWxzZQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKCBlICkgewogICAgICAgICAgICBkZWxldGUgb2JqWyBwcm9wIF07CgogICAgICAgICAgICBpZiAoIG9ialsgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7CiAgICAgICAgICAgICAgICBvYmpbIHByb3AgXSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9Cgl9KTsKfSk7CgpPYmplY3QuZGVmaW5lUHJvcGVydHkoIEFycmF5LnByb3RvdHlwZSwgJ2pvaW4nLCB7Cgl3cml0YWJsZTogZmFsc2UsCgljb25maWd1cmFibGU6IGZhbHNlLAoJZW51bXJhYmxlOiBmYWxzZSwKCgl2YWx1ZTogKGZ1bmN0aW9uICggb2xkICkgewoJCXJldHVybiBmdW5jdGlvbiAoIGFyZyApIHsKCQkJaWYgKCB0aGlzLmxlbmd0aCA+IDUwMCB8fCAoYXJnICYmIGFyZy5sZW5ndGggPiA1MDApICkgewoJCQkJdGhyb3cgJ0V4Y2VwdGlvbjogdG9vIG1hbnkgaXRlbXMnOwoJCQl9CgoJCQlyZXR1cm4gb2xkLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKCQl9OwoJfSggQXJyYXkucHJvdG90eXBlLmpvaW4gKSkKfSk7CgovKiB3ZSBkZWZpbmUgaXQgb3V0c2lkZSBzbyBpdCdsbCBub3QgYmUgaW4gc3RyaWN0IG1vZGUgKi8KdmFyIGV4ZWMgPSBmdW5jdGlvbiAoIGNvZGUgKSB7CglyZXR1cm4gZXZhbCggJ3VuZGVmaW5lZDtcbicgKyBjb2RlICk7Cn0KdmFyIGNvbnNvbGUgPSB7CglfaXRlbXMgOiBbXSwKCWxvZyA6IGZ1bmN0aW9uKCkgewoJCWNvbnNvbGUuX2l0ZW1zLnB1c2guYXBwbHkoIGNvbnNvbGUuX2l0ZW1zLCBhcmd1bWVudHMgKTsKCX0KfTsKY29uc29sZS5lcnJvciA9IGNvbnNvbGUuaW5mbyA9IGNvbnNvbGUuZGVidWcgPSBjb25zb2xlLmxvZzsKCihmdW5jdGlvbigpewoJInVzZSBzdHJpY3QiOwoKCWdsb2JhbC5vbm1lc3NhZ2UgPSBmdW5jdGlvbiAoIGV2ZW50ICkgewoJCXBvc3RNZXNzYWdlKHsKCQkJZXZlbnQgOiAnc3RhcnQnCgkJfSk7CgoJCXZhciBqc29uU3RyaW5naWZ5ID0gSlNPTi5zdHJpbmdpZnksIC8qYmFja3VwKi8KCQkJcmVzdWx0OwoKCQl0cnkgewoJCQlyZXN1bHQgPSBleGVjKCBldmVudC5kYXRhICk7CgkJfQoJCWNhdGNoICggZSApIHsKCQkJcmVzdWx0ID0gZS50b1N0cmluZygpOwoJCX0KCgkJLypKU09OIGRvZXMgbm90IGxpa2UgYW55IG9mIHRoZSBmb2xsb3dpbmcqLwoJCXZhciBzdHJ1bmcgPSB7CgkJCUZ1bmN0aW9uICA6IHRydWUsIEVycm9yICA6IHRydWUsCgkJCVVuZGVmaW5lZCA6IHRydWUsIFJlZ0V4cCA6IHRydWUKCQl9OwoJCXZhciBzaG91bGRfc3RyaW5nID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKCQkJdmFyIHR5cGUgPSAoIHt9ICkudG9TdHJpbmcuY2FsbCggdmFsdWUgKS5zbGljZSggOCwgLTEgKTsKCgkJCWlmICggdHlwZSBpbiBzdHJ1bmcgKSB7CgkJCQlyZXR1cm4gdHJ1ZTsKCQkJfQoJCQkvKm5laXRoZXIgZG9lcyBpdCBmZWVsIGNvbXBhc3Npb25hdGUgYWJvdXQgTmFOIG9yIEluZmluaXR5Ki8KCQkJcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSB8fCB2YWx1ZSA9PT0gSW5maW5pdHk7CgkJfTsKCgkJdmFyIHJldml2ZXIgPSBmdW5jdGlvbiAoIGtleSwgdmFsdWUgKSB7CgkJCXZhciBvdXRwdXQ7CgoJCQlpZiAoIHNob3VsZF9zdHJpbmcodmFsdWUpICkgewoJCQkJb3V0cHV0ID0gJycgKyB2YWx1ZTsKCQkJfQoJCQllbHNlIHsKCQkJCW91dHB1dCA9IHZhbHVlOwoJCQl9CgoJCQlyZXR1cm4gb3V0cHV0OwoJCX07CgoJCXBvc3RNZXNzYWdlKHsKCQkJYW5zd2VyIDoganNvblN0cmluZ2lmeSggcmVzdWx0LCByZXZpdmVyICksCgkJCWxvZyAgICA6IGpzb25TdHJpbmdpZnkoIGNvbnNvbGUuX2l0ZW1zLCByZXZpdmVyICkuc2xpY2UoIDEsIC0xICkKCQl9KTsKCX07Cn0pKCk7Cg==' );
77
var blob = new Blob( [worker_code], { type : 'application/javascript' } ),
88
code_url = window.URL.createObjectURL( blob );
99

@@ -14,12 +14,10 @@ setTimeout(function () {
1414
IO.injectScript( 'https://raw.github.com/jashkenas/coffee-script/master/extras/coffee-script.js' );
1515
}, 1000);
1616

17-
return function ( msg, cb ) {
17+
return function ( code, cb ) {
1818
var worker = new Worker( code_url ),
1919
timeout;
2020

21-
var code = msg.toString();
22-
2321
if ( code[0] === 'c' ) {
2422
code = CoffeeScript.compile( code.replace(/^c>/, ''), {bare:1} );
2523
}
@@ -44,13 +42,14 @@ return function ( msg, cb ) {
4442

4543
//and it all boils down to this...
4644
worker.postMessage( code );
45+
//so fucking cool.
4746

4847
function start () {
4948
if ( timeout ) {
5049
return;
5150
}
5251

53-
timeout = window.setTimeout(function() {
52+
timeout = window.setTimeout(function () {
5453
finish( 'Maximum execution time exceeded' );
5554
}, 500 );
5655
}
@@ -63,7 +62,7 @@ return function ( msg, cb ) {
6362
cb( result );
6463
}
6564
else {
66-
msg.directreply( result );
65+
console.warn( 'eval did not get callback' );
6766
}
6867
}
6968
};

0 commit comments

Comments
 (0)