diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eeb028b --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +lib-cov +*.seed +*.log +*.csv +*.dat +*.out +*.pid +*.gz + +pids +logs +results + +.DS_Store + +npm-debug.log +node_modules \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..d0f2465 --- /dev/null +++ b/README.md @@ -0,0 +1,26 @@ +#script-injector + +1. provides a Transform stream that allows you to inject inline javascript into an html text stream. +2. Uses Stream.Transform, but shims in [`readable-stream`](https://github.com/isaacs/readable-stream) if you're on node 0.8 +3. Should only be used for good, never for evil + +## Installation + +`npm install script-injector` + + +## How to use + +Just pipe a stream of html through script-injector. You can pass in either some stringified or a function object. What could be easier? + +```javascript +scriptInjector = require('script-injector); + +\\ Then do something like this somewhere else + +fs.createReadStream('anHTMLFile') + .pipe(scriptInjector(aFunction)) + .pipe(someOtherPlace); +``` + +`script-injector` will insert the provided code *before* your first script tags, or just before `` if you don't have any other scripts. \ No newline at end of file diff --git a/index.js b/index.js new file mode 100644 index 0000000..186b722 --- /dev/null +++ b/index.js @@ -0,0 +1 @@ +module.exports = require('./lib/script-injector'); \ No newline at end of file diff --git a/lib/script-injector.js b/lib/script-injector.js new file mode 100644 index 0000000..7210b0e --- /dev/null +++ b/lib/script-injector.js @@ -0,0 +1,62 @@ +module.exports = ScriptInjectorStream; + +var fs = require('fs') + , Transform = require('stream').Transform; + +if(!Transform) { // shim for node 0.8 + Transform = require('readable-stream/transform'); +} + +var hp = require('htmlparser2'); + +function ScriptInjectorStream(script, options) { + var self = this; + if(!(self instanceof ScriptInjectorStream)) { + return new ScriptInjectorStream(script, options); + } + + Transform.call(self, options); + + self._script = script ? script.toString() + : ';(' + function () { console.log("You didn't provide a script to inject") } + ')()'; + self.needToAddScript = true; + self.htmlParser = new hp.Parser({ + onprocessinginstruction: function (name, data) { + self.push('<' + data + '>'); + }, + onopentag: function (name, attribs) { + var output = ''; + if(name === 'script' && self.needToAddScript) { + self.needToAddScript = false; + output += '