%D \module
%D   [       file=mp-luas.mpiv,
%D        version=2014.04.14,
%D          title=\CONTEXT\ \METAPOST\ graphics,
%D       subtitle=\LUA,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
%C
%C This module is part of the \CONTEXT\ macro||package and is
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.

if known context_luas : endinput ; fi ;

% When I prototyped the runscript primitive I was just thinking of a usage like
% the original \directlua primitive in luatex: genererate something and pipe
% that back to metapost, and have access to some internals. Instead of compiling
% the code a the metapost end here we delegate that to the lua end. Only strings
% get passed. Of course in the end the real usage got a bit beyong the intended
% usage. So, in addition to some definitions here there are and will be use in
% other metafun modules too. Of course in retrospect I should have done this five
% years earlier.

boolean context_luas ; context_luas := true ;

% First variant:
%
% let lua = runscript ;
%
% Second variant:
%
% vardef lua (text t) =
%     runscript(for s = t : s & endfor "")
% enddef;
%
% Third variant:
%
% vardef lua (text t) =
%     runscript("" for s = t :
%         if string s :
%             & s
%         elseif numeric s :
%             & decimal s
%         elseif boolean s :
%             & if s : "true" else "false" fi
%         fi endfor)
% enddef;
%
% Fourth variant:

vardef mlib_luas_luacall(text t) =
    runscript("" for s = t :
        if string s :
            & s
        elseif numeric s :
            & decimal s
        elseif boolean s :
            & if s : "true" else : "false" fi
        else :
            & ditto & tostring(s) & ditto
        fi endfor
    )
enddef ;

vardef mlib_luas_lualist(expr c)(text t) =
    save b ; boolean b ; b := false ;
    runscript(c & "(" for s = t :
        if b :
            & ","
        else :
            hide(b := true)
        fi
        if string s :
            & ditto & s & ditto
        elseif numeric s :
            & decimal s
        elseif boolean s :
            & if s : "true" else : "false" fi
        else :
            & ditto & tostring(s) & ditto
        fi endfor & ")"
    )
enddef ;

def luacall = mlib_luas_luacall enddef ; % why no let

vardef lualist@#(text t) = mlib_luas_lualist(str @#)(t) enddef ;

string mlib_luas_s ; % saves save/restore

vardef lua@#(text t) =
    mlib_luas_s := str @# ;
    if length(mlib_luas_s) > 0 :
        mlib_luas_lualist(mlib_luas_s,t)
    else :
        mlib_luas_luacall(t)
    fi
enddef ;

vardef MP@#(text t) =
    mlib_luas_lualist("MP." & str @#,t)
enddef ;

def message expr t =
    if t <> "" : lua.mp.report(t) fi ;
enddef ;

% a few helpers

% A few helpers:

vardef isarray suffix a =
    lua.mp.isarray(str a)
enddef ;

vardef prefix suffix a =
    lua.mp.prefix(str a)
enddef ;

vardef dimensions suffix a =
    lua.mp.dimensions(str a)
enddef ;

% More access

def getdimen(expr k)    = lua.mp._get_dimen_(k)   enddef ;
def getcount(expr k)    = lua.mp._get_count_(k)   enddef ;
def gettoks (expr k)    = lua.mp._get_toks_ (k)   enddef ;
def setdimen(expr k, v) = lua.mp._set_dimen_(k,v) enddef ;
def setcount(expr k, v) = lua.mp._set_count_(k,v) enddef ;
def settoks (expr k, v) = lua.mp._set_toks_ (k,v) enddef ;

% vardef getdimen(expr k)   = save getdimen ; lua.mp.getdimen(k) enddef ;
% vardef getcount(expr k)   = save getcount ; lua.mp.getcount(k) enddef ;
% vardef gettoks (expr k)   = save gettoks  ; lua.mp.gettoks (k) enddef ;
% vardef setdimen(expr k,v) = save setdimen ; lua.mp.setdimen(k,v) enddef ;
% vardef setcount(expr k,v) = save setcount ; lua.mp.setcount(k,v) enddef ;
% vardef settoks (expr k,v) = save settoks  ; lua.mp.settoks (k,v) enddef ;

vardef positionpath  (expr name) = lua.mp.positionpath  (name) enddef ;
vardef positioncurve (expr name) = lua.mp.positioncurve (name) enddef ;
vardef positionxy    (expr name) = lua.mp.positionxy    (name) enddef ;
vardef positionpxy   (expr name) = lua.mp.positionpxy   (name) enddef ;
vardef positionwhd   (expr name) = lua.mp.positionwhd   (name) enddef ;
vardef positionpage  (expr name) = lua.mp.positionpage  (name) enddef ;
vardef positionregion(expr name) = lua.mp.positionregion(name) enddef ;
vardef positionbox   (expr name) = lua.mp.positionbox   (name) enddef ;
vardef positionanchor            = lua.mp.positionanchor()     enddef ;

let wdpart = redpart ;
let htpart = greenpart ;
let dppart = bluepart ;

vardef positioninregion =
    currentpicture := currentpicture shifted - positionxy(positionanchor) ;
enddef ;

vardef positionatanchor(expr name) =
    currentpicture := currentpicture shifted - positionxy(name) ;
enddef ;


vardef texvar(expr name) = lua.mp.texvar(name) enddef ;
vardef texstr(expr name) = lua.mp.texstr(name) enddef ;
