diff options
Diffstat (limited to 'Master/texmf-dist/metapost/context/base/mpxl/mp-luas.mpxl')
-rw-r--r-- | Master/texmf-dist/metapost/context/base/mpxl/mp-luas.mpxl | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/context/base/mpxl/mp-luas.mpxl b/Master/texmf-dist/metapost/context/base/mpxl/mp-luas.mpxl new file mode 100644 index 00000000000..b98305bba59 --- /dev/null +++ b/Master/texmf-dist/metapost/context/base/mpxl/mp-luas.mpxl @@ -0,0 +1,319 @@ +%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 metafun_loaded_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. + +newinternal boolean metafun_loaded_luas ; metafun_loaded_luas := true ; immutable metafun_loaded_luas ; + +def newscriptindex suffix t = newinternal t ; immutable t ; enddef ; + +newscriptindex mfid_scriptindex ; mfid_scriptindex := runscript("mp.mf_script_index('scriptindex')") ; + +def scriptindex = runscript mfid_scriptindex enddef ; + +string mfun_lua_bs ; mfun_lua_bs := "[===[" ; +string mfun_lua_es ; mfun_lua_es := "]===]" ; + +vardef mlib_luas_luacall(text t) = + runscript("" for s = t : + if string s : + & s + % & mfun_lua_bs & s & mfun_lua_es + elseif numeric s : + & decimal s + elseif boolean s : + & if s : "true" else : "false" fi + elseif pair s : + & mfun_pair_to_table(s) + elseif path s : + & mfun_path_to_table(s) + elseif rgbcolor s : + & mfun_rgb_to_table(s) + elseif cmykcolor s : + & mfun_cmyk_to_table(s) + else : + & ditto & tostring(s) & ditto + fi endfor + ) +enddef ; + +newinternal mfun_luas_b ; + +def mlib_luas_luadone = + exitif numeric begingroup mfun_luas_b := 1 ; endgroup ; +enddef ; + +vardef mlib_luas_lualist(expr c)(text t) = % we could use mlib_luas_s instead of c + interim mfun_luas_b := 0 ; + runscript(c & for s = t : + if mfun_luas_b = 0 : + "(" + % hide(mfun_luas_b := 1) + mlib_luas_luadone + else : + "," + fi + & + if string s : + mfun_lua_bs & s & mfun_lua_es + elseif numeric s : + decimal s + elseif boolean s : + if s : "true" else : "false" fi + elseif pair s : + mfun_pair_to_table(s) + elseif path s : + mfun_path_to_table(s) + elseif rgbcolor s : + mfun_rgb_to_table(s) + elseif cmykcolor s : + mfun_cmyk_to_table(s) + else : + ditto & tostring(s) & ditto + fi & endfor if mfun_luas_b = 0 : "()" else : ")" fi + ) +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 = + lua.mp.report(tostring(t)) ; +enddef ; + +permanent newscriptindex, scriptindex, luacall, lua, lualist, mp, MP ; + +% Color: + +% We do a low level runscript: +% +% lua.mp.namedcolor(s) % conflicts with macro namedcolor +% lua.mp.mf_named_color(s) % okay but, can also be +% lua.mp("mf_named_color",s) % which gives expansion mess + +newscriptindex mfid_resolvedcolor ; mfid_resolvedcolor := scriptindex "namedcolor" ; + +def resolvedcolor = runscript mfid_resolvedcolor enddef ; + +permanent resolvedcolor ; + +% Modes: + +vardef texmode (expr s) = lua.mp("mode", s) enddef ; +vardef systemmode(expr s) = lua.mp("systemmode",s) enddef ; + +permanent texmode, systemmode ; + +% A few helpers + +vardef isarray suffix a = lua.mp.isarray (str a) enddef ; +vardef prefix suffix a = lua.mp.prefix (str a) enddef ; +vardef dimension suffix a = lua.mp.dimension(str a) enddef ; + +permanent isarray, prefix, dimension ; + +% More access + +newscriptindex mfid_getmacro ; mfid_getmacro := scriptindex "getmacro" ; def getmacro = runscript mfid_getmacro enddef ; +newscriptindex mfid_getdimen ; mfid_getdimen := scriptindex "getdimen" ; def getdimen = runscript mfid_getdimen enddef ; +newscriptindex mfid_getcount ; mfid_getcount := scriptindex "getcount" ; def getcount = runscript mfid_getcount enddef ; +newscriptindex mfid_gettoks ; mfid_gettoks := scriptindex "gettoks" ; def gettoks = runscript mfid_gettoks enddef ; + +% todo: figure out a mixed interface: setdimen "foo" 123pt ; setdimen("foo", 123pt) ; + +newscriptindex mfid_setmacro ; mfid_setmacro := scriptindex "setmacro" ; def setmacro(expr k, v) = runscript mfid_setmacro k v ; enddef ; +newscriptindex mfid_setdimen ; mfid_setdimen := scriptindex "setdimen" ; def setdimen(expr k, v) = runscript mfid_setdimen k v ; enddef ; +newscriptindex mfid_setcount ; mfid_setcount := scriptindex "setcount" ; def setcount(expr k, v) = runscript mfid_setcount k v ; enddef ; +newscriptindex mfid_settoks ; mfid_settoks := scriptindex "settoks" ; def settoks (expr k, v) = runscript mfid_settoks k v ; enddef ; + +newscriptindex mfid_setglobalmacro ; mfid_setglobalmacro := scriptindex "setglobalmacro" ; def setglobalmacro(expr k, v) = runscript mfid_setglobalmacro k v ; enddef ; +newscriptindex mfid_setglobaldimen ; mfid_setglobaldimen := scriptindex "setglobaldimen" ; def setglobaldimen(expr k, v) = runscript mfid_setglobaldimen k v ; enddef ; +newscriptindex mfid_setglobalcount ; mfid_setglobalcount := scriptindex "setglobalcount" ; def setglobalcount(expr k, v) = runscript mfid_setglobalcount k v ; enddef ; +newscriptindex mfid_setglobaltoks ; mfid_setglobaltoks := scriptindex "setglobaltoks" ; def setglobaltoks (expr k, v) = runscript mfid_setglobaltoks k v ; enddef ; + +permanent + getmacro, getdimen, getcount, gettoks, + setmacro, setdimen, setcount, settoks, + setglobalmacro, setglobaldimen, setglobalcount, setglobaltoks ; + +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 ; + +vardef positioninregion = + currentpicture := currentpicture shifted - positionxy(positionanchor) ; +enddef ; + +vardef positionatanchor(expr name) = + currentpicture := currentpicture shifted - positionxy(name) ; +enddef ; + +permanent positionpath, positioncurve, positionxy, positionpxy, positionwhd, positionpage, + positionregion, positionbox, positionanchor, positioninregion, positionatanchor ; + +let wdpart = redpart ; +let htpart = greenpart ; +let dppart = bluepart ; + +permanent wdpart, htpart, dppart; + +vardef texvar(expr name) = lua.mp.texvar(name) enddef ; +vardef texstr(expr name) = lua.mp.texstr(name) enddef ; + +newscriptindex mfid_path_lengthof ; mfid_path_lengthof := scriptindex "pathlengthof" ; +newscriptindex mfid_path_pointof ; mfid_path_pointof := scriptindex "pathpointof" ; +newscriptindex mfid_path_leftof ; mfid_path_leftof := scriptindex "pathleftof" ; +newscriptindex mfid_path_rightof ; mfid_path_rightof := scriptindex "pathrightof" ; +newscriptindex mfid_path_reset ; mfid_path_reset := scriptindex "pathreset" ; + +% 25 pct gain + + def inpath = = 1 step 1 until runscript mfid_path_lengthof enddef ; +vardef pointof primary i = runscript mfid_path_pointof i enddef ; +vardef leftof primary i = runscript mfid_path_leftof i enddef ; +vardef rightof primary i = runscript mfid_path_rightof i enddef ; + +permanent inpath, pointof, leftof, rightof ; + +% another 10 pct gain + +% def inpath = = 1 step 1 until runscript mfid_path_lengthof enddef ; +% def pointof = runscript mfid_path_pointof enddef ; +% def leftof = runscript mfid_path_leftof enddef ; +% def rightof = runscript mfid_path_rightof enddef ; + +extra_endfig := extra_endfig & " runscript mfid_path_reset ; " ; + +newscriptindex mfid_utfnum ; mfid_utfnum := scriptindex "utfnum" ; +newscriptindex mfid_utflen ; mfid_utflen := scriptindex "utflen" ; +newscriptindex mfid_utfsub ; mfid_utfsub := scriptindex "utfsub" ; + +% def utfnum = runscript mfid_utfnum enddef ; +% def utflen = runscript mfid_utflen enddef ; +% def utfsub = runscript mfid_utfsub enddef ; + +vardef utfnum expr s = runscript mfid_utfnum s enddef ; % str +vardef utflen expr s = runscript mfid_utflen s enddef ; % str +vardef utfsub(text t) = runscript mfid_utfsub t enddef ; % str, first, (optional) last + +permanent utfnum, utflen, utfsub ; + +newscriptindex mfid_getparameters ; mfid_getparameters := scriptindex "getparameters" ; +newscriptindex mfid_presetparameters ; mfid_presetparameters := scriptindex "presetparameters" ; +newscriptindex mfid_hasparameter ; mfid_hasparameter := scriptindex "hasparameter" ; +newscriptindex mfid_hasoption ; mfid_hasoption := scriptindex "hasoption" ; +newscriptindex mfid_getparameter ; mfid_getparameter := scriptindex "getparameter" ; +newscriptindex mfid_getparameterdefault ; mfid_getparameterdefault := scriptindex "getparameterdefault" ; +newscriptindex mfid_getparametercount ; mfid_getparametercount := scriptindex "getparametercount" ; +newscriptindex mfid_getmaxparametercount ; mfid_getmaxparametercount := scriptindex "getmaxparametercount" ; +newscriptindex mfid_getparameterpath ; mfid_getparameterpath := scriptindex "getparameterpath" ; +newscriptindex mfid_getparameterpen ; mfid_getparameterpen := scriptindex "getparameterpen" ; +newscriptindex mfid_getparametertext ; mfid_getparametertext := scriptindex "getparametertext" ; +% mfid_getparameteroption ; mfid_getparameteroption := scriptindex "getparameteroption" ; +newscriptindex mfid_applyparameters ; mfid_applyparameters := scriptindex "applyparameters" ; +newscriptindex mfid_pushparameters ; mfid_pushparameters := scriptindex "pushparameters" ; +newscriptindex mfid_popparameters ; mfid_popparameters := scriptindex "popparameters" ; + +def getparameters = runscript mfid_getparameters enddef ; +def presetparameters = runscript mfid_presetparameters enddef ; +def hasparameter = runscript mfid_hasparameter enddef ; +def hasoption = runscript mfid_hasoption enddef ; +def getparameter = runscript mfid_getparameter enddef ; +def getparameterdefault = runscript mfid_getparameterdefault enddef ; +def getparametercount = runscript mfid_getparametercount enddef ; +def getmaxparametercount = runscript mfid_getmaxparametercount enddef ; +def getparameterpath = runscript mfid_getparameterpath enddef ; +def getparameterpen = runscript mfid_getparameterpen enddef ; +def getparametertext = runscript mfid_getparametertext enddef ; +% getparameteroption = runscript mfid_getparameteroption enddef ; +def applyparameters = runscript mfid_applyparameters enddef ; +def pushparameters = runscript mfid_pushparameters enddef ; +def popparameters = runscript mfid_popparameters enddef ; + +permanent getparameters, presetparameters, hasparameter, hasoption, getparameter, getparameterdefault, + getparametercount, getmaxparametercount, getparameterpath, getparameterpen, getparametertext, % getparameteroption, + applyparameters, pushparameters, popparameters ; + +% No vardef's because we need to scan for an assignment too and we'll see +% an endgroup otherwise. + +newscriptindex mfid_year ; mfid_year := scriptindex "year" ; def year = runscript mfid_year enddef ; +newscriptindex mfid_month ; mfid_month := scriptindex "month" ; def month = runscript mfid_month enddef ; +newscriptindex mfid_day ; mfid_day := scriptindex "day" ; def day = runscript mfid_day enddef ; +newscriptindex mfid_hour ; mfid_hour := scriptindex "hour" ; def hour = runscript mfid_hour enddef ; +newscriptindex mfid_minute ; mfid_minute := scriptindex "minute" ; def minute = runscript mfid_minute enddef ; +newscriptindex mfid_second ; mfid_second := scriptindex "second" ; def second = runscript mfid_second enddef ; + +permanent year, month, day, hour, minute, second ; % overloaded + +% You cannot overload a local color bu using a prefix works ok: +% +% \definecolor [ name = "mp:myred", r = .9 ] ; + +newscriptindex mfid_definecolor ; mfid_definecolor := scriptindex "definecolor" ; + +def definecolor = runscript mfid_definecolor ; enddef ; % the semicolon prevents lookahead + +permanent definecolor ; + +% showproperty fullcircle ; +% showhashentry "fullcircle" ; + +newscriptindex mfid_showproperty ; mfid_showproperty := scriptindex("showproperty") ; +newscriptindex mfid_showhashentry ; mfid_showhashentry := scriptindex("showhashentry") ; + +def showproperty = runscript mfid_showproperty enddef ; +def showhashentry = runscript mfid_showhashentry enddef ; + +permanent showproperty, showhashentry ; + +newscriptindex mfid_textextanchor ; mfid_textextanchor := scriptindex("textextanchor") ; + +def textextanchor = runscript mfid_textextanchor enddef ; + +vardef textextanchor(expr p) = + runscript mfid_textextanchor (prescriptpart p) +enddef ; + +permanent textextanchor ; |