codo
Version:
A CoffeeScript documentation generator.
255 lines (196 loc) • 6.89 kB
text/coffeescript
module.exports = class Documentation
constructor: (comment) ->
# Parse the given lines and adds the result
# to the result object.
#
# [Array<String>] lines the lines to parse
#
parseTags: (lines) ->
comment = []
while (line = lines.shift()) isnt undefined
# Look ahead
unless /^|||/.exec line
while /^\s{2}\S+/.test(lines[0])
line += lines.shift().substring(1)
if property = /^/i.exec line
= true
if property = /^\s+[\[\{](.+?)[\]\}](?:\s+(.+))?/i.exec line
= property[1]
lines.unshift property[2] if property[2]?
else if returns = /^\s+[\[\{](.+?)[\]\}](?:\s+(.+))?/i.exec line
=
type: returns[1]
description: returns[2]
else if returns = /^\s+(.+)/i.exec line
=
type: '?'
description: returns[1]
else if throws = /^\s+[\[\{](.+?)[\]\}](?:\s+(.+))?/i.exec line
?= []
.push
type: throws[1]
description: throws[2]
else if throws = /^\s+(.+)/i.exec line
?= []
.push
type: '?'
description: throws[1]
else if param = /^\s+[\[\{](.+?)[\]}]\s+\[([^\]]+)](?:\s+(.+))?/i.exec line
if paramNameVal = /^([^ ]+)\s*=\s*([^ ]+)/.exec param[2]
paramName = paramNameVal[1]
defValue = paramNameVal[2]
else
defValue = null
paramName = param[2]
.push
type: param[1]
name: paramName
description: param[3]
defaultState: defValue
optional: yes
else if param = /^\s+([^ ]+)\s+[\[\{](.+?)[\]\}](?:\s+(.+))?/i.exec line
?= []
.push
type: param[2]
name: param[1]
description: param[3]
else if param = /^\s+[\[\{](.+?)[\]\}]\s+([^ ]+)(?:\s+(.+))?/i.exec line
?= []
.push
type: param[1]
name: param[2]
description: param[3]
else if option = /^\s+([^ ]+)\s+[\[\{](.+?)[\]\}]\s+([^ ]+)(?:\s+(.+))?/i.exec line
?= {}
[option[1]] ?= []
[option[1]].push
type: option[2]
name: option[3]
description: option[4]
else if option = /^\s+([^ ]+)\s+([^ ]+)\s+[\[\{](.+?)[\]\}](?:\s+(.+))?/i.exec line
?= {}
[option[1]] ?= []
[option[1]].push
type: option[3]
name: option[2]
description: option[4]
else if see = /^\s+([^\s]+)(?:\s+(.+))?/i.exec line
?= []
.push
reference: see[1]
label: see[2]
else if author = /^\s+(.+)/i.exec line
?= []
.push author[1] || ''
else if copyright = /^\s+(.+)/i.exec line
= copyright[1] || ''
else if note = /^\s+(.+)/i.exec line
?= []
.push note[1] || ''
else if todo = /^\s+(.+)/i.exec line
?= []
.push todo[1] || ''
else if example = /^?/i.exec line
title = example[1] || ''
code = []
while /^\s{2}.*/.test(lines[0]) or (/^$/.test(lines[0]) and /^\s{2}.*/.test(lines[1]))
code.push lines.shift().substring(2)
if code.length isnt 0
?= []
.push
title: title
code: code.join '\n'
else if namespace = /^\s+(.+)/i.exec line
= namespace[1] || ''
else if abstract = /^?/i.exec line
= abstract[1] || ''
else if /^/.exec line
= true
else if since = /^\s+(.+)/i.exec line
= since[1] || ''
else if version = /^\s+(.+)/i.exec line
= version[1] || ''
else if deprecated = /^?(.*)/i.exec line
= deprecated[2] || ''
else if mixin = /^/i.exec line
= true
else if concern = /^\s+(.+)/i.exec line
?= []
.push concern[1]
else if include = /^\s+(.+)/i.exec line
?= []
.push include[1]
else if extend = /^\s+(.+)/i.exec line
?= []
.push extend[1]
else if event = /^\s+(\S+)(\s+(.+))?/i.exec line
?= []
innerComment = []
innerComment.push(event[2]) if event[2]
doc = {}
while /^\s{2}.*/.test(lines[0]) || /^\s*$/.test(lines[0])
innerComment.push lines.shift().substring(2)
.call(doc, innerComment) if innerComment
.push
name: event[1]
documentation: doc
else if overload = /^\s+(.+)/i.exec line
signature = overload[1]
innerComment = []
while /^\s{2}.*/.test(lines[0]) || /^\s*$/.test(lines[0])
innerComment.push lines.shift().substring(2)
if innerComment.length != 0
?= []
doc = {}
.call doc, innerComment
.push
signature: signature
documentation: doc
else if method = /^\s+(.+)/i.exec line
signature = method[1]
innerComment = []
while /^\s{2}.*/.test(lines[0]) or /^\s*$/.test(lines[0])
innerComment.push lines.shift().substring(2)
if innerComment.length isnt 0
?= []
doc = {}
.call doc, innerComment
.push
signature: signature
documentation: doc
else
comment.push line
text = comment.join('\n')
= text.trim()
sentence = /((?:.|\n)*?[.#][\s$])/.exec(text)
sentence = sentence[1].replace(/\s*#\s*$/, '') if sentence
= (sentence || text || '').trim()
inspect: ->
{
comment:
summary:
notes:
see:
namespace:
abstract:
private:
deprecated:
version:
since:
authors:
copyright:
todos:
includes:
extends:
concerns:
examples:
params:
options:
returns:
throws:
overloads:
events:
methods:
property:
}