cxltx
Version:
CXLTX (CoffeeXeLaTeX) brings CoffeeScript to (Xe)(La)TeX documents. Fully general approach; use your own favorite language.
197 lines (179 loc) • 9.62 kB
text/coffeescript
############################################################################################################
# njs_util = require 'util'
# njs_fs = require 'fs'
# njs_path = require 'path'
#...........................................................................................................
# BAP = require 'coffeenode-bitsnpieces'
# TYPES = require 'coffeenode-types'
TRM = require 'coffeenode-trm'
rpr = TRM.rpr.bind TRM
badge = 'CXLTX/sample-provider'
log = TRM.get_logger 'plain', badge
info = TRM.get_logger 'info', badge
whisper = TRM.get_logger 'whisper', badge
alert = TRM.get_logger 'alert', badge
debug = TRM.get_logger 'debug', badge
warn = TRM.get_logger 'warn', badge
help = TRM.get_logger 'help', badge
echo = TRM.echo.bind TRM
#...........................................................................................................
CXLTX = require './main'
#===========================================================================================================
# SAMPLE COMMANDS
#-----------------------------------------------------------------------------------------------------------
@helo = ( name, handler ) ->
# handler null, "{Hello, \\textcolor{blue}{#{CXLTX.escape name}}!}"
handler null, "{Hello, #{CXLTX.escape name}!}"
#-----------------------------------------------------------------------------------------------------------
@page_and_line_nr = ( page_nr, line_nr, handler ) ->
page_nr = parseInt page_nr, 10
line_nr = parseInt line_nr, 10
handler null, """
Helo from NodeJS.
This paragraph appears on page #{page_nr}, column ..., line #{line_nr}."""
#-----------------------------------------------------------------------------------------------------------
@show_geometry = ( handler ) ->
CXLTX.read_aux ( error, aux ) =>
return handler error if error?
unless ( g = aux[ 'geometry' ] )?
# debug message
# you may want to consider using `\\auxgeo` in your TeX source."""
return handler "unable to retrieve geometry info from #{CXLTX.aux[ 'auxroute' ]};"
#.......................................................................................................
R = []
names = ( name for name of g ).sort()
#.......................................................................................................
for name in names
value = g[ name ]
value = if value? then ( ( value.toFixed 2 ).concat ' mm' ) else './.'
value = value.replace /-/g, '–'
R.push "#{name} & #{value}"
#.......................................................................................................
R = R.join '\\\\\n'
R = "\\begin{tabular}{ | l | r | }\n\\hline\n#{R}\\\\\n\\hline\\end{tabular}"
handler null, R
#-----------------------------------------------------------------------------------------------------------
@show_special_chrs = ( handler ) ->
chr_by_names =
'opening brace': '{'
'closing brace': '}'
'Dollar sign': '$'
'ampersand': '&'
'hash': '#'
'caret': '^'
'underscore': '_'
'wave': '~'
'percent sign': '%'
#.........................................................................................................
R = []
R.push "#{name} & #{CXLTX.escape chr}" for name, chr of chr_by_names
R = R.join '\\\\\n'
R = "\\begin{tabular}{ | l | c | }\n\\hline\n#{R}\\\\\n\\hline\n\\end{tabular}"
#.........................................................................................................
handler null, R
#-----------------------------------------------------------------------------------------------------------
@clear_aux = ( handler ) ->
delete CXLTX.aux[ name ] for name of CXLTX.aux
handler null, ''
#-----------------------------------------------------------------------------------------------------------
@show_aux = ( handler ) ->
handler null, "\\begin{verbatim}\n#{rpr CXLTX.aux}\n\\end{verbatim}"
#-----------------------------------------------------------------------------------------------------------
@show_labels = ( handler ) ->
CXLTX.read_aux ( error, aux ) =>
return handler error if error?
R = []
#.......................................................................................................
labels = []
for name, label of aux[ 'labels' ]
if label[ 'is-duplicate' ]
for duplicate_label in aux[ 'duplicate-labels' ][ name ]
labels.push duplicate_label
continue
labels.push label
#.......................................................................................................
labels.sort ( a, b ) ->
### TAINT what with roman numbers? ###
pageref_a = parseInt a[ 'pageref' ], 10
pageref_b = parseInt b[ 'pageref' ], 10
ref_a = a[ 'ref' ]
ref_b = b[ 'ref' ]
a_is_dup = a[ 'is-duplicate' ]
b_is_dup = b[ 'is-duplicate' ]
return -1 if a_is_dup and not b_is_dup
return +1 if b_is_dup and not a_is_dup
return -1 if pageref_a < pageref_b
return +1 if pageref_a > pageref_b
return -1 if ref_a < ref_b
return +1 if ref_a > ref_b
return 0
debug labels
#.......................................................................................................
# R.push "\\def\\mystrut{\\vrule height 2mmpt depth 1mm width 1pt} "
R.push "\\begin{tabular}{ | r | l | l | l | l | }"
R.push "\\hline"
R.push "& name & pageref & ref & title\\\\"
R.push "\\hline"
for label in labels
dupmark = if label[ 'is-duplicate' ] then '!' else ''
R.push "#{dupmark} & #{label[ 'name' ]} & #{label[ 'pageref' ]} & #{label[ 'ref' ]} & #{label[ 'title' ]}\\\\"
R.push "\\hline"
R.push "\\end{tabular}"
#.......................................................................................................
handler null, R.join '\n'
#-----------------------------------------------------------------------------------------------------------
@add = ( P..., handler ) ->
P[ idx ] = parseFloat p, 10 for p, idx in P
debug P
R = 0
R += p for p in P
return handler new Error "unable to sum up #{rpr P}" unless isFinite R
handler null, R
#===========================================================================================================
#
#-----------------------------------------------------------------------------------------------------------
@gimme_five = ( n, handler ) ->
handler null, "#{n}"
#-----------------------------------------------------------------------------------------------------------
@f = ( label, fontsize_pt_txt, y_sp_txt, handler ) ->
### TAINT paperheight must come from LaTeX document ###
paperheight_mm = 98 # mm
margin_top_mm = 14 # mm
lineheight_mm = 4.6667 # mm
#.........................................................................................................
sp_from_pt = 65536
pt_from_mm = 2.845274
sp_from_mm = sp_from_pt * pt_from_mm
#.........................................................................................................
fontsize_pt = parseFloat fontsize_pt_txt, 10
y_sp = parseFloat y_sp_txt, 10
#.........................................................................................................
fontsize_mm = fontsize_pt / pt_from_mm
y_mm = paperheight_mm - y_sp / sp_from_mm
# debug '©TNm2U', [fontsize_pt, y_sp, y_mm, paperheight_mm, sp_from_mm]
grid_row = ( y_mm - margin_top_mm ) / lineheight_mm
grid_row_2 = ( Math.floor grid_row * 100 + 0.5 ) / 100
nearest_grid_row = Math.floor grid_row_2 + 0.5
delta_grid_row_2 = nearest_grid_row - grid_row_2
raise_by_mm = -delta_grid_row_2 * lineheight_mm
raise_relatively = raise_by_mm / fontsize_mm
#.........................................................................................................
fontsize_mm_txt = fontsize_mm.toFixed 2
y_mm_txt = y_mm.toFixed 2
raise_by_mm_txt = raise_by_mm.toFixed 2
#.........................................................................................................
# debug '©rtXri', grid_row_2 * lineheight_mm
# debug '©rtXri', nearest_grid_row * lineheight_mm
info "label #{label} y: #{y_mm_txt}mm"
info "label #{label} fontsize: #{fontsize_mm_txt}mm"
info "label #{label} lineheight: #{lineheight_mm}mm"
info "label #{label} paperheight: #{paperheight_mm}mm"
info "label #{label} margin top: #{margin_top_mm}mm"
info "label #{label} grid row: #{grid_row}"
info "label #{label} grid row rounded: #{grid_row_2}"
info "label #{label} nearest grid row: #{nearest_grid_row}"
info "label #{label} delta grid row rounded: #{delta_grid_row_2}"
info "label #{label} raise by: #{raise_by_mm_txt}mm"
# handler null, y_mm_txt
# handler null, "#{grid_row_2} #{raise_by_mm_txt}"
handler null, "#{raise_relatively}"