Navigation Menu

Skip to content

Commit

Permalink
* Move to CoffeeScript
Browse files Browse the repository at this point in the history
* Add option to quiet logger
* Update README
* Add sample test
  • Loading branch information
joscha committed Feb 5, 2013
1 parent 9c0e2d9 commit 3daef5e
Show file tree
Hide file tree
Showing 8 changed files with 575 additions and 142 deletions.
1 change: 1 addition & 0 deletions .gitignore
@@ -0,0 +1 @@
node_modules
236 changes: 236 additions & 0 deletions 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

17 changes: 12 additions & 5 deletions README.md
@@ -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
Expand Down Expand Up @@ -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);
Expand All @@ -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

1 comment on commit 3daef5e

@joscha
Copy link
Owner Author

@joscha joscha commented on 3daef5e Feb 5, 2013

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

closes #1

Please sign in to comment.