Permalink
Browse files

* Move to CoffeeScript

* Add option to quiet logger
* Update README
* Add sample test
  • Loading branch information...
1 parent 9c0e2d9 commit 3daef5e374dce7336e5995e614497ff992547290 @joscha committed Feb 5, 2013
Showing with 575 additions and 142 deletions.
  1. +1 −0 .gitignore
  2. +236 −0 Cakefile
  3. +12 −5 README.md
  4. +139 −136 lib/nodecr.js
  5. +1 −1 package.json
  6. +173 −0 src/nodecr.coffee
  7. BIN test/image.png
  8. +13 −0 test/test.js
View
@@ -0,0 +1 @@
+node_modules
View
236 Cakefile
@@ -0,0 +1,236 @@
+task 'build:apps', 'Build apps script JS file', ->
+ if_coffee ->
+ ps = spawn("coffee", ["--output", JAVASCRIPTS_PATH,"-- compile",COFFEESCRIPTS_PATH])
+ ps.stdout.on('data', log)
+ ps.stderr.on('data', log)
+ ps.on 'exit', (code)->
+ if code != 0
+ console.log 'failed'# ** Cakefile Template ** is a Template for a common Cakefile that you may use in a coffeescript nodejs project.
+#
+# It comes baked in with 5 tasks:
+#
+# * build - compiles your src directory to your lib directory
+# * watch - watches any changes in your src directory and automatically compiles to the lib directory
+# * test - runs mocha test framework, you can edit this task to use your favorite test framework
+# * docs - generates annotated documentation using docco
+# * clean - clean generated .js files
+files = [
+ 'lib'
+ 'src'
+]
+
+fs = require 'fs'
+{print} = require 'util'
+{spawn, exec} = require 'child_process'
+
+try
+ which = require('which').sync
+catch err
+ if process.platform.match(/^win/)?
+ console.log 'WARNING: the which module is required for windows\ntry: npm install which'
+ which = null
+
+# ANSI Terminal Colors
+bold = '\x1b[0;1m'
+green = '\x1b[0;32m'
+reset = '\x1b[0m'
+red = '\x1b[0;31m'
+
+# Cakefile Tasks
+#
+# ## *docs*
+#
+# Generate Annotated Documentation
+#
+# <small>Usage</small>
+#
+# ```
+# cake docs
+# ```
+task 'docs', 'generate documentation', -> docco()
+
+# ## *build*
+#
+# Builds Source
+#
+# <small>Usage</small>
+#
+# ```
+# cake build
+# ```
+task 'build', 'compile source', -> build -> log ":)", green
+
+# ## *watch*
+#
+# Builds your source whenever it changes
+#
+# <small>Usage</small>
+#
+# ```
+# cake watch
+# ```
+task 'watch', 'compile and watch', -> build true, -> log ":-)", green
+
+# ## *test*
+#
+# Runs your test suite.
+#
+# <small>Usage</small>
+#
+# ```
+# cake test
+# ```
+task 'test', 'run tests', -> build -> mocha -> log ":)", green
+
+# ## *clean*
+#
+# Cleans up generated js files
+#
+# <small>Usage</small>
+#
+# ```
+# cake clean
+# ```
+task 'clean', 'clean generated files', -> clean -> log ";)", green
+
+
+# Internal Functions
+#
+# ## *walk*
+#
+# **given** string as dir which represents a directory in relation to local directory
+# **and** callback as done in the form of (err, results)
+# **then** recurse through directory returning an array of files
+#
+# Examples
+#
+# ``` coffeescript
+# walk 'src', (err, results) -> console.log results
+# ```
+walk = (dir, done) ->
+ results = []
+ fs.readdir dir, (err, list) ->
+ return done(err, []) if err
+ pending = list.length
+ return done(null, results) unless pending
+ for name in list
+ file = "#{dir}/#{name}"
+ try
+ stat = fs.statSync file
+ catch err
+ stat = null
+ if stat?.isDirectory()
+ walk file, (err, res) ->
+ results.push name for name in res
+ done(null, results) unless --pending
+ else
+ results.push file
+ done(null, results) unless --pending
+
+# ## *log*
+#
+# **given** string as a message
+# **and** string as a color
+# **and** optional string as an explanation
+# **then** builds a statement and logs to console.
+#
+log = (message, color, explanation) -> console.log color + message + reset + ' ' + (explanation or '')
+
+# ## *launch*
+#
+# **given** string as a cmd
+# **and** optional array and option flags
+# **and** optional callback
+# **then** spawn cmd with options
+# **and** pipe to process stdout and stderr respectively
+# **and** on child process exit emit callback if set and status is 0
+launch = (cmd, options=[], callback) ->
+ cmd = which(cmd) if which
+ app = spawn cmd, options
+ app.stdout.pipe(process.stdout)
+ app.stderr.pipe(process.stderr)
+ app.on 'exit', (status) -> callback?() if status is 0
+
+# ## *build*
+#
+# **given** optional boolean as watch
+# **and** optional function as callback
+# **then** invoke launch passing coffee command
+# **and** defaulted options to compile src to lib
+build = (watch, callback) ->
+ if typeof watch is 'function'
+ callback = watch
+ watch = false
+
+ options = ['-c', '-b', '-o' ]
+ options = options.concat files
+ options.unshift '-w' if watch
+ launch 'coffee', options, callback
+
+# ## *unlinkIfCoffeeFile*
+#
+# **given** string as file
+# **and** file ends in '.coffee'
+# **then** convert '.coffee' to '.js'
+# **and** remove the result
+unlinkIfCoffeeFile = (file) ->
+ if file.match /\.coffee$/
+ fs.unlink file.replace(/\.coffee$/, '.js')
+ true
+ else false
+
+# ## *clean*
+#
+# **given** optional function as callback
+# **then** loop through files variable
+# **and** call unlinkIfCoffeeFile on each
+clean = (callback) ->
+ try
+ for file in files
+ unless unlinkIfCoffeeFile file
+ walk file, (err, results) ->
+ for f in results
+ unlinkIfCoffeeFile f
+
+ callback?()
+ catch err
+
+# ## *moduleExists*
+#
+# **given** name for module
+# **when** trying to require module
+# **and** not found
+# **then* print not found message with install helper in red
+# **and* return false if not found
+moduleExists = (name) ->
+ try
+ require name
+ catch err
+ log "#{name} required: npm install #{name}", red
+ false
+
+
+# ## *mocha*
+#
+# **given** optional array of option flags
+# **and** optional function as callback
+# **then** invoke launch passing mocha command
+mocha = (options, callback) ->
+ #if moduleExists('mocha')
+ if typeof options is 'function'
+ callback = options
+ options = []
+ # add coffee directive
+ options.push '--compilers'
+ options.push 'coffee:coffee-script'
+
+ launch 'mocha', options, callback
+
+# ## *docco*
+#
+# **given** optional function as callback
+# **then** invoke launch passing docco command
+docco = (callback) ->
+ #if moduleExists('docco')
+ walk 'src', (err, files) -> launch 'docco', files, callback
+
View
@@ -1,11 +1,12 @@
-# Tesseract for node.js
+# Tesseract for Node.js
-A simple wrapper for the Tesseract OCR package for node.js
+A simple wrapper for the Tesseract OCR package for Node.js
## Installation
-npm install nodecr
+`npm install nodecr`
## Versions
+* **0.0.5**: Add possibility to override logger (quiet nodecr, see example below)
* **0.0.4**: Changed name to nodecr and published node module (formerly node-tesseract)
* **0.0.3**: Added support for custom preprocessors, OTB Preprocessor using ImageMagick 'convert'
* **0.0.2**: Refactored to support tesseract 3.01, added language parameter, config parameter, documentation
@@ -37,7 +38,10 @@ nodecr.process(__dirname + '/path/to/image.jpg',function(err, text) {
// Recognise text of any language in any format but preprocess the image
// with ImageMagick 'convert' (This requires ImageMagick to be installed)
-// You can write and use your own preprocessors easily, just have a look at lib/nodecr.js
+// uncomment this to quiet nodecr
+//nodecr.log = function() {};
+
+// You can write and use your own preprocessors easily, just have a look at src/nodecr.coffee
nodecr.process(__dirname + '/path/to/image.jpg',function(err, text) {
if(err) {
console.error(err);
@@ -46,4 +50,7 @@ nodecr.process(__dirname + '/path/to/image.jpg',function(err, text) {
}
console.log(text);
}, null, null, null, nodecr.preprocessors.convert);
-```
+```
+
+## License
+MIT
Oops, something went wrong.

1 comment on commit 3daef5e

Owner

joscha commented on 3daef5e Feb 5, 2013

closes #1

Please sign in to comment.