heyujie
2021-06-07 8f8155aa4c83f7c2577ac123add550766b6a7ce3
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
'use strict'
 
var fs = require('fs')
var path = require('path')
var through = require('through2')
var globStream = require('glob-stream')
var concat = require('callback-stream')
var xtend = require('xtend')
 
var defaults = {
  dir: path.join(path.dirname(require.main.filename), 'doc'),
  ext: '.txt',
  help: 'help'
}
 
function helpMe (opts) {
  opts = xtend(defaults, opts)
 
  if (!opts.dir) {
    throw new Error('missing directory')
  }
 
  return {
    createStream: createStream,
    toStdout: toStdout
  }
 
  function createStream (args) {
    if (typeof args === 'string') {
      args = args.split(' ')
    } else if (!args || args.length === 0) {
      args = [opts.help]
    }
 
    var out = through()
    var gs = globStream([opts.dir + '/**/*' + opts.ext])
    var re = new RegExp(args.map(function (arg) {
      return arg + '[a-zA-Z0-9]*'
    }).join('[ /]+'))
 
    gs.pipe(concat({ objectMode: true }, function (err, files) {
      if (err) return out.emit('error', err)
 
      files = files.map(function (file) {
        file.relative = file.path.replace(file.base, '').replace(/^\//, '')
        return file
      }).filter(function (file) {
        return file.relative.match(re)
      })
 
      if (files.length === 0) {
        return out.emit('error', new Error('no such help file'))
      } else if (files.length > 1) {
        out.write('There are ' + files.length + ' help pages ')
        out.write('that matches the given request, please disambiguate:\n')
        files.forEach(function (file) {
          out.write('  * ')
          out.write(file.relative.replace(opts.ext, ''))
          out.write('\n')
        })
        out.end()
        return
      }
 
      fs.createReadStream(files[0].path)
        .on('error', function (err) {
          out.emit('error', err)
        })
        .pipe(out)
    }))
 
    return out
  }
 
  function toStdout (args) {
    createStream(args)
      .on('error', function () {
        console.log('no such help file\n')
        toStdout()
      })
      .pipe(process.stdout)
  }
}
 
module.exports = helpMe