summaryrefslogtreecommitdiff
path: root/tex/context/base/meta-tex.lua
diff options
context:
space:
mode:
authorHans Hagen <pragma@wxs.nl>2013-11-01 15:02:00 +0100
committerHans Hagen <pragma@wxs.nl>2013-11-01 15:02:00 +0100
commit642ffccd526fab491d23efce30f40c35a13262cd (patch)
tree019ee93fbb5a8aca8922d2c2aa30009fb8ab3989 /tex/context/base/meta-tex.lua
parent9cb5e3dcce51a3c07bd482b7c0575496434017e1 (diff)
downloadcontext-642ffccd526fab491d23efce30f40c35a13262cd.tar.gz
beta 2013.11.01 15:02
Diffstat (limited to 'tex/context/base/meta-tex.lua')
-rw-r--r--tex/context/base/meta-tex.lua113
1 files changed, 90 insertions, 23 deletions
diff --git a/tex/context/base/meta-tex.lua b/tex/context/base/meta-tex.lua
index 94815495d..e1398e7ed 100644
--- a/tex/context/base/meta-tex.lua
+++ b/tex/context/base/meta-tex.lua
@@ -7,8 +7,10 @@ if not modules then modules = { } end modules ['meta-tex'] = {
}
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
-local P, C, Cs, lpegmatch = lpeg.P, lpeg.C, lpeg.Cs, lpeg.match
+metapost = metapost or { }
-- local left = P("[")
-- local right = P("]")
@@ -70,31 +72,96 @@ local simplify = true
-- 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)
+-- 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)
+
+function format_n(fmt,...)
+ return
end
-function metapost.format_n(fmt,...)
- fmt = gsub(fmt,"@","%%")
- if find(fmt,"%%") then
- str = format(fmt,...)
- else -- yes or no
- str = format("%"..fmt,...)
+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
- str = gsub(str,"([%-%+]-[%.%d]+)e([%-%+]-[%.%d]+)",strip)
- context(str)
end
-function metapost.format_v(fmt,str)
- metapost.format_n(fmt,metapost.untagvariable(str,false))
+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
+
+-- 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")