jade
Version:
Jade template engine
91 lines (78 loc) • 3.08 kB
text/coffeescript
# CoffeeScript can be used both on the server, as a command-line compiler based
# on Node.js/V8, or to run CoffeeScripts directly in the browser. This module
# contains the main entry functions for tokenzing, parsing, and compiling source
# CoffeeScript into JavaScript.
#
# If included on a webpage, it will automatically sniff out, compile, and
# execute all scripts present in `text/coffeescript` tags.
path = require 'path'
{Lexer} = require './lexer'
{parser} = require './parser'
# TODO: Remove registerExtension when fully deprecated
if require.extensions
fs = require 'fs'
require.extensions['.coffee'] = (module, filename) ->
content = compile fs.readFileSync filename, 'utf8'
module._compile content, filename
else if require.registerExtension
require.registerExtension '.coffee', (content) -> compile content
# The current CoffeeScript version number.
exports.VERSION = '0.9.4'
# Expose helpers for testing.
exports.helpers = require './helpers'
# Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison
# compiler.
exports.compile = compile = (code, options) ->
options or= {}
try
(parser.parse lexer.tokenize code).compile options
catch err
err.message = "In #{options.fileName}, #{err.message}" if options.fileName
throw err
# Tokenize a string of CoffeeScript code, and return the array of tokens.
exports.tokens = (code, options) ->
lexer.tokenize code, options
# Tokenize and parse a string of CoffeeScript code, and return the AST. You can
# then compile it by calling `.compile()` on the root, or traverse it by using
# `.traverse()` with a callback.
exports.nodes = (code, options) ->
parser.parse lexer.tokenize code, options
# Compile and execute a string of CoffeeScript (on the server), correctly
# setting `__filename`, `__dirname`, and relative `require()`.
exports.run = (code, options) ->
# We want the root module.
root = module
while root.parent
root = root.parent
# Set the filename
root.filename = options.fileName
# Clear the module cache
root.moduleCache = {} if root.moduleCache
# Compile
if path.extname(root.filename) isnt '.coffee' or require.extensions
root._compile exports.compile(code, options), root.filename
else
root._compile code, root.filename
# Compile and evaluate a string of CoffeeScript (in a Node.js-like environment).
# The CoffeeScript REPL uses this to run the input.
exports.eval = (code, options) ->
__filename = options.fileName
__dirname = path.dirname __filename
eval exports.compile(code, options)
# Instantiate a Lexer for our use here.
lexer = new Lexer
# The real Lexer produces a generic stream of tokens. This object provides a
# thin wrapper around it, compatible with the Jison API. We can then pass it
# directly as a "Jison lexer".
parser.lexer =
lex: ->
token = @tokens[@pos] or [""]
@pos += 1
this.yylineno = token[2]
this.yytext = token[1]
token[0]
setInput: (tokens) ->
@tokens = tokens
@pos = 0
upcomingInput: -> ""
parser.yy = require './nodes'