123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- var util = require('util')
- var isProperty = require('is-property')
- var INDENT_START = /[\{\[]/
- var INDENT_END = /[\}\]]/
- // from https://mathiasbynens.be/notes/reserved-keywords
- var RESERVED = [
- 'do',
- 'if',
- 'in',
- 'for',
- 'let',
- 'new',
- 'try',
- 'var',
- 'case',
- 'else',
- 'enum',
- 'eval',
- 'null',
- 'this',
- 'true',
- 'void',
- 'with',
- 'await',
- 'break',
- 'catch',
- 'class',
- 'const',
- 'false',
- 'super',
- 'throw',
- 'while',
- 'yield',
- 'delete',
- 'export',
- 'import',
- 'public',
- 'return',
- 'static',
- 'switch',
- 'typeof',
- 'default',
- 'extends',
- 'finally',
- 'package',
- 'private',
- 'continue',
- 'debugger',
- 'function',
- 'arguments',
- 'interface',
- 'protected',
- 'implements',
- 'instanceof',
- 'NaN',
- 'undefined'
- ]
- var RESERVED_MAP = {}
- for (var i = 0; i < RESERVED.length; i++) {
- RESERVED_MAP[RESERVED[i]] = true
- }
- var isVariable = function (name) {
- return isProperty(name) && !RESERVED_MAP.hasOwnProperty(name)
- }
- var formats = {
- s: function(s) {
- return '' + s
- },
- d: function(d) {
- return '' + Number(d)
- },
- o: function(o) {
- return JSON.stringify(o)
- }
- }
- var genfun = function() {
- var lines = []
- var indent = 0
- var vars = {}
- var push = function(str) {
- var spaces = ''
- while (spaces.length < indent*2) spaces += ' '
- lines.push(spaces+str)
- }
- var pushLine = function(line) {
- if (INDENT_END.test(line.trim()[0]) && INDENT_START.test(line[line.length-1])) {
- indent--
- push(line)
- indent++
- return
- }
- if (INDENT_START.test(line[line.length-1])) {
- push(line)
- indent++
- return
- }
- if (INDENT_END.test(line.trim()[0])) {
- indent--
- push(line)
- return
- }
- push(line)
- }
- var line = function(fmt) {
- if (!fmt) return line
- if (arguments.length === 1 && fmt.indexOf('\n') > -1) {
- var lines = fmt.trim().split('\n')
- for (var i = 0; i < lines.length; i++) {
- pushLine(lines[i].trim())
- }
- } else {
- pushLine(util.format.apply(util, arguments))
- }
- return line
- }
- line.scope = {}
- line.formats = formats
- line.sym = function(name) {
- if (!name || !isVariable(name)) name = 'tmp'
- if (!vars[name]) vars[name] = 0
- return name + (vars[name]++ || '')
- }
- line.property = function(obj, name) {
- if (arguments.length === 1) {
- name = obj
- obj = ''
- }
- name = name + ''
- if (isProperty(name)) return (obj ? obj + '.' + name : name)
- return obj ? obj + '[' + JSON.stringify(name) + ']' : JSON.stringify(name)
- }
- line.toString = function() {
- return lines.join('\n')
- }
- line.toFunction = function(scope) {
- if (!scope) scope = {}
- var src = 'return ('+line.toString()+')'
- Object.keys(line.scope).forEach(function (key) {
- if (!scope[key]) scope[key] = line.scope[key]
- })
- var keys = Object.keys(scope).map(function(key) {
- return key
- })
- var vals = keys.map(function(key) {
- return scope[key]
- })
- return Function.apply(null, keys.concat(src)).apply(null, vals)
- }
- if (arguments.length) line.apply(null, arguments)
- return line
- }
- genfun.formats = formats
- module.exports = genfun
|