forked from jnordberg/wintersmith
/
common.coffee
96 lines (80 loc) · 2.53 KB
/
common.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
winston = require 'winston'
colors = require 'colors'
util = require 'util'
fs = require 'fs'
path = require 'path'
async = require 'async'
extend = (obj, mixin) ->
for name, method of mixin
obj[name] = method
exports.extend = extend
stripExtension = (filename) ->
filename.replace /(.+)\.[^.]+$/, '$1'
exports.stripExtension = stripExtension
rfc822 = (date) ->
### return a rfc822 representation of a javascript Date object
http://www.w3.org/Protocols/rfc822/#z28 ###
pad = (i) -> if i < 10 then '0' + i else i
tzoffset = (offset) ->
hours = Math.floor offset / 60
minutes = Math.abs offset % 60
direction = if hours > 0 then '-' else '+'
return direction + pad(Math.abs(hours)) + pad(minutes)
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',' Aug', 'Sep', 'Oct', 'Nov', 'Dec']
days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat']
time = [pad(date.getHours()), pad(date.getMinutes()), pad(date.getSeconds())].join ':'
return [
days[date.getDay()] + ','
pad(date.getDate())
months[date.getMonth()]
date.getFullYear()
time
tzoffset(date.getTimezoneOffset())
].join ' '
exports.rfc822 = rfc822
class cli extends winston.Transport
name: 'cli'
constructor: (options) ->
super(options)
@quiet = options.quiet or false
log: (level, msg, meta, callback) ->
if level == 'error'
process.stderr.write "\n error".red + " #{ msg }\n"
if @level == 'verbose' && meta?
if meta.stack?
stack = meta.stack.substr meta.stack.indexOf('\n') + 1
process.stderr.write stack + "\n\n"
for key, value of meta
if key in ['message', 'stack']
continue
pval = util.inspect(value, false, 2, true).replace(/\n/g, '\n ')
process.stderr.write " #{ key }: #{ pval }\n"
else
process.stderr.write "\n"
else if !@quiet
switch level
when 'verbose'
msg = msg.yellow
if meta
msg += util.format ' %j', meta
process.stdout.write " #{ msg }\n"
@emit 'logged'
callback null, true
transports = exports.transports = [
new cli {level: 'info'}
]
exports.logger = new winston.Logger
exitOnError: true
transports: transports
exports.readJSON = (filename, callback) ->
### read and try to parse *filename* as json ###
async.waterfall [
(callback) ->
fs.readFile filename, callback
(buffer, callback) ->
try
rv = JSON.parse buffer.toString()
callback null, rv
catch error
callback error
], callback