summaryrefslogtreecommitdiff
path: root/tex/context/base/mkiv/mlib-lua.lmt
blob: ed65b9401661dfc4425f9fb3acf119ed04562244 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
if not modules then modules = { } end modules ['mlib-lua'] = {
    version   = 1.001,
    comment   = "companion to mlib-ctx.mkiv",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files",
}

local type = type
local insert, remove = table.insert, table.remove

local scan   = mp.scan
local inject = mp.inject

local currentmpx = nil
local stack      = { }

local scan_next       = mplib.scan_next
local scan_expression = mplib.scan_expression
local scan_token      = mplib.scan_token
local scan_symbol     = mplib.scan_symbol
local scan_numeric    = mplib.scan_numeric
local scan_integer    = mplib.scan_integer
local scan_boolean    = mplib.scan_boolean
local scan_string     = mplib.scan_string
local scan_pair       = mplib.scan_pair
local scan_color      = mplib.scan_color
local scan_cmykcolor  = mplib.scan_cmykcolor
local scan_transform  = mplib.scan_transform
local scan_path       = mplib.scan_path
local scan_pen        = mplib.scan_pen

scan.next       = function(k)   return scan_next      (currentmpx,k)   end
scan.expression = function(k)   return scan_expression(currentmpx,k)   end
scan.token      = function(k)   return scan_token     (currentmpx,k)   end
scan.symbol     = function(k,e) return scan_symbol    (currentmpx,k,e) end
scan.numeric    = function()    return scan_numeric   (currentmpx)     end
scan.integer    = function()    return scan_integer   (currentmpx)     end
scan.boolean    = function()    return scan_boolean   (currentmpx)     end
scan.string     = function()    return scan_string    (currentmpx)     end
scan.pair       = function(t)   return scan_pair      (currentmpx,t)   end
scan.color      = function(t)   return scan_color     (currentmpx,t)   end
scan.cmykcolor  = function(t)   return scan_cmykcolor (currentmpx,t)   end
scan.transform  = function(t)   return scan_transform (currentmpx,t)   end
scan.path       = function(t)   return scan_path      (currentmpx,t)   end
scan.pen        = function(t)   return scan_pen       (currentmpx,t)   end

local inject_path      = mplib.inject_path
local inject_numeric   = mplib.inject_numeric
local inject_pair      = mplib.inject_pair
local inject_boolean   = mplib.inject_boolean
local inject_integer   = mplib.inject_integer
local inject_string    = mplib.inject_string
local inject_color     = mplib.inject_color
local inject_cmykcolor = mplib.inject_cmykcolor
local inject_transform = mplib.inject_transform
local inject_whatever  = mplib.inject_whatever

inject.path      = function(t,cycle,curled)  return inject_path     (currentmpx,t,cycle,curled)  end
inject.numeric   = function(n)               return inject_numeric  (currentmpx,n)               end
inject.pair      = function(x,y)             return inject_pair     (currentmpx,x,y)             end
inject.boolean   = function(b)               return inject_boolean  (currentmpx,b)               end
inject.integer   = function(i)               return inject_integer  (currentmpx,i)               end
inject.string    = function(s)               return inject_string   (currentmpx,s)               end
inject.color     = function(r,g,b)           return inject_color    (currentmpx,r,g,b)           end
inject.cmykcolor = function(c,m,y,k)         return inject_cmykcolor(currentmpx,c,m,y,k)         end
inject.transform = function(x,y,xx,xy,yx,yy) return inject_transform(currentmpx,x,y,xx,xy,yx,yy) end
inject.whatever  = function(...)             return inject_whatever (currentmpx,...)             end

-- bonus:

scan  .number    = scan  .numeric
inject.number    = inject.numeric

table.setmetatablecall(inject,function(t,...)
    inject_whatever(currentmpx,...)
end)

-- experiment

function mp.autoinject(m)
    local t = type(m)
    if t == "table" then
        local n = #t
        if n == 2 then
            inject_pair(currentmpx,m)
        elseif n == 3 then
            inject_color(currentmpx,m)
        elseif n == 4 then
            inject_cmykcolor(currentmpx,m)
        elseif n == 6 then
            inject_transform(currentmpx,m)
        end
    elseif t == "number" then
        inject_numeric(currentmpx,m)
    elseif t == "string" then
        inject_string(currentmpx,m)
    elseif t == "boolean" then
        inject_boolean(currentmpx,m)
    end
end

function metapost.pushscriptrunner(mpx)
    insert(stack,mpx)
    currentmpx = mpx
end

function metapost.popscriptrunner()
    currentmpx = remove(stack,mpx)
end

function metapost.currentmpx()
    return currentmpx
end

local status = mplib.status

function metapost.currentmpxstatus()
    return status and status(currentmpx) or 0
end