diff options
Diffstat (limited to 'tex/context/base/mkiv/meta-tex.lua')
-rw-r--r-- | tex/context/base/mkiv/meta-tex.lua | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/tex/context/base/mkiv/meta-tex.lua b/tex/context/base/mkiv/meta-tex.lua new file mode 100644 index 000000000..1008e45c0 --- /dev/null +++ b/tex/context/base/mkiv/meta-tex.lua @@ -0,0 +1,208 @@ +if not modules then modules = { } end modules ['meta-tex'] = { + version = 1.001, + comment = "companion to meta-tex.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local tostring = tostring +local format, gsub, find, match = string.format, string.gsub, string.find, string.match +local formatters = string.formatters +local P, S, R, C, Cs, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cs, lpeg.match + +metapost = metapost or { } + +local implement = interfaces.implement + +-- local left = P("[") +-- local right = P("]") +-- local space = P(" ") +-- local argument = left * C((1-right)^1) * right +-- local pattern = (argument + space)^0 + +-- function metapost.sometxt(optional,str) +-- if optional == "" then +-- context.sometxta(str) +-- else +-- local one, two = lpegmatch(pattern,optional) +-- if two then +-- context.sometxtc(one,two,str) +-- elseif one then +-- context.sometxtb(one,str) +-- else +-- context.sometxta(str) +-- end +-- end +-- end + +local pattern = Cs((P([[\"]]) + P([["]])/"\\quotedbl{}" + P(1))^0) -- or \char + +function metapost.escaped(str) + context(lpegmatch(pattern,str)) +end + +implement { + name = "metapostescaped", + actions = metapost.escaped, + arguments = "string" +} + +local simplify = true + +-- local function strip(n,e) +-- -- get rid of e(0) +-- -- get rid of e(+*) +-- e = gsub(e,"^+","") +-- -- remove leading zeros +-- e = gsub(e,"^([+-]*)0+(%d)","%1%2") +-- if not simplify then +-- -- take it as it is +-- elseif n == "1" then +-- return format("10^{%s}",e) +-- end +-- return format("%s\\times10^{%s}",n,e) +-- end +-- +-- function metapost.format_n(fmt,...) +-- fmt = gsub(fmt,"@","%%") +-- local initial, hasformat, final = match(fmt,"^(.-)(%%.-[%a])(.-)$") +-- if hasformat then +-- str = format(fmt,...) +-- str = gsub(str,"(.-)e(.-)$",strip) +-- str = format("%s\\mathematics{%s}%s",initial,str,final) +-- elseif not find(fmt,"%%") then +-- str = format("%"..fmt,...) +-- str = gsub(str,"(.-)e(.-)$",strip) +-- str = format("\\mathematics{%s}",str) +-- end +-- context(str) +-- end + +-- todo: proper lpeg + +-- local function strip(n,e) +-- -- get rid of e(0) +-- -- get rid of e(+*) +-- e = gsub(e,"^+","") +-- -- remove leading zeros +-- e = gsub(e,"^([+-]*)0+(%d)","%1%2") +-- if not simplify then +-- -- take it as it is +-- elseif n == "1" then +-- return format("\\mathematics{10^{%s}}",e) +-- end +-- return format("\\mathematics{%s\\times10^{%s}}",n,e) +-- end +-- +-- function metapost.format_n(fmt,...) +-- fmt = gsub(fmt,"@","%%") +-- if find(fmt,"%%") then +-- str = format(fmt,...) +-- else -- yes or no +-- str = format("%"..fmt,...) +-- end +-- str = gsub(str,"([%-%+]-[%.%d]+)e([%-%+]-[%.%d]+)",strip) +-- context(str) +-- end +-- +-- function metapost.format_v(fmt,str) +-- metapost.format_n(fmt,metapost.untagvariable(str,false)) +-- end + +-- -- -- + +local number = C((S("+-")^0 * R("09","..")^1)) +local enumber = number * S("eE") * number + +local cleaner = Cs((P("@@")/"@" + P("@")/"%%" + P(1))^0) + +context = context or { exponent = function(...) print(...) end } + +function metapost.format_string(fmt,...) + context(lpegmatch(cleaner,fmt),...) +end + +function metapost.format_number(fmt,num) + local number = tonumber(num) + if number then + local base, exponent = lpegmatch(enumber,formatters[lpegmatch(cleaner,fmt)](number)) + if base and exponent then + context.MPexponent(base,exponent) + else + context(number) + end + else + context(tostring(num)) + end +end + +-- This is experimental and will change! + +function metapost.svformat(fmt,str) + metapost.format_string(fmt,metapost.untagvariable(str,false)) +end + +function metapost.nvformat(fmt,str) + metapost.format_number(fmt,metapost.untagvariable(str,false)) +end + +implement { name = "metapostformatted", actions = metapost.svformat, arguments = { "string", "string" } } +implement { name = "metapostgraphformat", actions = metapost.nvformat, arguments = { "string", "string" } } + +-- local function test(fmt,n) +-- logs.report("mp format test","fmt: %s, n: %s, result: %s, \\exponent{%s}{%s}",fmt,n, +-- formatters[lpegmatch(cleaner,fmt)](n), +-- lpegmatch(enumber,formatters[lpegmatch(cleaner,fmt)](n)) +-- ) +-- end +-- +-- test("@j","1e-8") +-- test("@j",1e-8) +-- test("@j","1e+8") +-- test("@j","1e-10") +-- test("@j",1e-10) +-- test("@j","1e+10") +-- test("@j","1e-12") +-- test("@j","1e+12") +-- test("@j","1e-0") +-- test("@j","1e+0") +-- test("@j","1") +-- test("@j test","1") +-- test("@j","-1") +-- test("@j","1e-102") +-- test("@1.4j","1e+102") +-- test("@j","1.2e+102") +-- test("@j","1.23e+102") +-- test("@j","1.234e+102") + +local f_textext = formatters[ [[textext("%s")]] ] +local f_mthtext = formatters[ [[textext("\mathematics{%s}")]] ] +local f_exptext = formatters[ [[textext("\mathematics{%s\times10^{%s}}")]] ] + +local mpprint = mp.print + +function mp.format(fmt,str) + fmt = lpegmatch(cleaner,fmt) + mpprint(f_textext(formatters[fmt](metapost.untagvariable(str,false)))) +end + +function mp.formatted(fmt,num) -- svformat + fmt = lpegmatch(cleaner,fmt) + mpprint(f_textext(formatters[fmt](tonumber(num) or num))) +end + +function mp.graphformat(fmt,num) -- nvformat + fmt = lpegmatch(cleaner,fmt) + local number = tonumber(num) + if number then + local base, exponent = lpegmatch(enumber,number) + if base and exponent then + mpprint(f_exptext(base,exponent)) + else + mpprint(f_mthtext(num)) + end + else + mpprint(f_textext(tostring(num))) + end +end |