cxltx
Version:
CXLTX (CoffeeXeLaTeX) brings CoffeeScript to (Xe)(La)TeX documents. Fully general approach; use your own favorite language.
128 lines (111 loc) • 6.62 kB
text/coffeescript
############################################################################################################
# njs_util = require 'util'
# njs_fs = require 'fs'
# njs_path = require 'path'
njs_url = require 'url'
#...........................................................................................................
# BAP = require 'coffeenode-bitsnpieces'
TYPES = require 'coffeenode-types'
TRM = require 'coffeenode-trm'
rpr = TRM.rpr.bind TRM
badge = 'CXLTX/server'
log = TRM.get_logger 'plain', badge
info = TRM.get_logger 'info', badge
whisper = TRM.get_logger 'whisper', badge
debug = TRM.get_logger 'debug', badge
alert = TRM.get_logger 'alert', badge
warn = TRM.get_logger 'warn', badge
help = TRM.get_logger 'help', badge
_echo = TRM.echo.bind TRM
#...........................................................................................................
express = require 'express'
#...........................................................................................................
CXLTX = require './main'
MULTIMIX = require 'coffeenode-multimix'
#...........................................................................................................
sample_provider = require './sample-provider'
ids_provider = require './ids-provider'
#...........................................................................................................
provider = MULTIMIX.compose sample_provider, ids_provider
#-----------------------------------------------------------------------------------------------------------
server_options =
'host': '127.0.0.1'
'port': 8910
#-----------------------------------------------------------------------------------------------------------
@request_count = 0
#-----------------------------------------------------------------------------------------------------------
@main = ->
#---------------------------------------------------------------------------------------------------------
process_request = ( request, handler ) =>
@request_count += 1
RC = @request_count
#.......................................................................................................
# debug "©45f #{RC} rq.params: ", request.params
{ texroute
splitter
command
parameter } = request.params
#.......................................................................................................
# debug "©45f #{RC} url: ", request[ 'url' ]
# debug "©45f #{RC} texroute: ", texroute
# debug "©45f #{RC} splitter: ", splitter
# debug "©45f #{RC} command: ", command
# debug "©45f #{RC} parameter: ", parameter
#.......................................................................................................
### TAINT rewrite as middleware ###
unless texroute? and command? # and parameters?
return handler "need 2 or 3 parts in URL route"
#.......................................................................................................
# texroute = @decode_url_crumb texroute
# command = @decode_url_crumb command
#.......................................................................................................
CXLTX.dispatch provider, texroute, splitter, command, parameter, handler
#.......................................................................................................
return null
#---------------------------------------------------------------------------------------------------------
return ( request, response ) =>
#.......................................................................................................
process_request request, ( error, result ) =>
#.....................................................................................................
if error?
error = rpr error unless ( TYPES.type_of error ) is 'text'
warn "©23 #{@request_count} error:", error
status = 500
headers = 'Content-Type': 'text/plain'
response.writeHeader status, headers
response.write CXLTX.escape_error error
return response.end()
#.....................................................................................................
result = rpr result unless TYPES.isa_text result
whisper "©23 #{@request_count} result:", rpr result
status = 200
headers = 'Content-Type': 'text/plain'
response.writeHeader status, headers
response.write result if result?
return response.end()
#.......................................................................................................
return null
#-----------------------------------------------------------------------------------------------------------
# APP
#-----------------------------------------------------------------------------------------------------------
app = express()
view = @main()
#-----------------------------------------------------------------------------------------------------------
# MIDDLEWARE
#-----------------------------------------------------------------------------------------------------------
app.use express.logger 'format': 'dev'
#-----------------------------------------------------------------------------------------------------------
# ENDPOINTS
#-----------------------------------------------------------------------------------------------------------
main = @main()
app.get '/:texroute/:splitter/:command/:parameter', main
app.get '/:texroute/:splitter/:command', main
# app.use view 'not_found'
#===========================================================================================================
# SERVING
#-----------------------------------------------------------------------------------------------------------
app.listen server_options[ 'port' ], ( error ) ->
throw error if error?
log TRM.green "listening to #{server_options[ 'host' ]}:#{server_options[ 'port' ]}"
############################################################################################################
# @serve()