fs = require 'fs' path = require 'path' mecano = require 'mecano' each = require 'each' date = -> d = (new Date).toISOString() ### Find indentation based on the first line containing text ### getindent = (text) -> text = text.split '\n' unless Array.isArray text # Find indentation based on the first line containing text for line in text if line.trim() return /(\s*)/.exec(line)[0] '' ### Discover indentation in first line and remove it for every other lines ### unindent = (lines) -> lines = lines.split('\n') indent = getindent lines # for line in lines # if line.trim() # indent = /(\s*)/.exec(line)[0] # break # Remove indentation lines = lines.map (line) -> line.substr indent.length lines.join('\n') ### Create an anchor from the function name in the title ### convert_anchor = (text) -> re_anchor = /`([\w.]+)\(/g text.replace re_anchor, (str, code) -> # At least in FF, doesn't close the tag "\n`#{code}(" convert_code = (text) -> re_code = /\n(\s{4}\s*?\S[\s\S]*?)\n(?!\s)/g text.replace re_code, (str, code) -> code = code.split('\n').map((line)->line.substr(4)).join('\n') "\n\n```javascript\n#{code}\n```\n\n" docs = ['index', 'from', 'to', 'transformer', 'parser', 'stringifier'] each( docs ) .parallel( true ) .on 'item', (file, next) -> source = "#{__dirname}/#{file}.coffee" destination = "#{__dirname}/../doc/#{file}.md" fs.readFile source, 'ascii', (err, text) -> return console.error err if err re = /###(.*)\n([\s\S]*?)\n( *)###/g re_title = /([\s\S]+)\n={2}=+([\s\S]*)/g match = re.exec text match = re_title.exec match[2] title = match[1].trim() content = match[2] content = unindent content content = convert_code content docs = """ --- language: en layout: page title: "#{title}" date: #{date()} comments: false sharing: false footer: false navigation: csv github: https://github.com/wdavidw/node-csv source: ./#{path.relative __dirname+'/../', source} --- #{content} """ while match = re.exec text continue if match[1] match[2] = unindent match[2] docs += convert_code convert_anchor match[2] docs += '\n' fs.writeFile destination, docs, next .on 'both', (err) -> return console.error err if err console.log 'Documentation generated' destination = process.argv[2] return unless destination each() .files("#{__dirname}/../doc/*.md") .on 'item', (file, next) -> mecano.copy source: file destination: destination force: true , next .on 'both', (err) -> return console.error err if err console.log "Documentation published: #{destination}"