codo
Version:
A CoffeeScript documentation generator.
155 lines (122 loc) • 4.39 kB
text/coffeescript
FS = require 'fs'
Path = require 'path'
Traverser = require './traverser'
File = require './entities/file'
Class = require './entities/class'
Method = require './entities/method'
Variable = require './entities/variable'
Property = require './entities/property'
Mixin = require './entities/mixin'
Extra = require './entities/extra'
walkdir = require 'walkdir'
Winston = require 'winston'
module.exports = class Environment
: (files, options={}) ->
files = [files] unless Array.isArray(files)
environment = new @(options)
environment.readCoffee(file) for file in files
environment.linkify()
environment
constructor: (={}) ->
= JSON.parse(
FS.readFileSync(Path.join(__dirname, '..', 'package.json'), 'utf-8')
)['version']
.name ?= 'Unknown Project'
.verbose ?= false
.debug ?= false
.cautios ?= false
.quiet ?= false
.closure ?= false
.output ?= 'doc'
.basedir ?= process.cwd()
= []
= []
= {}
= {}
.push Class
.push Method
.push Variable
.push Property
.push Mixin
readCoffee: (file) ->
return if [file]
Winston.info("Parsing Codo file #{file}") if .verbose
try
Traverser.read(file, @)
catch error
throw error if .debug
Winston.error("Cannot parse Coffee file #{file}: #{error.message}") unless .quiet
finally
[file] = true
readExtra: (file) ->
return if [file]
Winston.info("Parsing Extra file #{file}") if .verbose
try
catch error
throw error if .debug
Winston.error("Cannot parse Extra file #{file}: #{error.message}") unless .quiet
finally
[file] = true
registerEntity: (entity) ->
.push entity
all: (Entity, haystack = []) ->
for entity in
haystack.push(entity) if entity instanceof Entity
haystack
visibleFiles: ->
visibleClasses: -> .filter((x) -> x.visible())
visibleMixins: -> .filter((x) -> x.visible())
visibleExtras: ->
visibleMethods: -> .filter((x) -> x.entity.visible && x.owner.visible())
visibleVariables: ->
allFiles: -> ||=
allClasses: -> ||=
allMixins: -> ||=
allExtras: -> ||=
allMethods: ->
return if ?
= []
for source in [, , ]
for entry in source
for method in entry.effectiveMethods()
.push {entity: method, owner: entry}
.sort (a, b) ->
return -1 if a.entity.name < b.entity.name
return 1 if a.entity.name > b.entity.name
return 0
allVariables: ->
return if ?
= []
for source in [, , ]
for entry in source
for variable in entry.variables
.push {entity: variable, owner: entry}
find: (Entity, name) ->
for entity in
if entity instanceof Entity && entity.name == name
return entity
findReadme: ->
Extra, Path.relative(.basedir, .readme)
linkify: ->
entity.linkify() for entity in
for basics in [, , ]
for basic in basics
[basic.name] = basic
for variable in
keyword = variable.owner.name + '.' + variable.entity.name
[keyword] = variable
for method in
keyword = method.owner.name + method.entity.shortSignature()
[keyword] = method
reference: (needle, context='') ->
needle = needle.split(' ')[0]
if [needle]
[needle]
else if [context+needle]
[context+needle]
else
needle
inspect: ->
.map (entity) -> entity.inspect()