summaryrefslogtreecommitdiff
path: root/tex/context/base/phys-dim.lua
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2011-11-23 20:20:15 +0200
committerMarius <mariausol@gmail.com>2011-11-23 20:20:15 +0200
commitae4e7c1b2b58b4b089b5eff6e8f41371a309a538 (patch)
tree09d92389e47365408a57367fb597d49aab54d69c /tex/context/base/phys-dim.lua
parent795d92e8b019a53568afbcdf5517b0db6f14b99c (diff)
downloadcontext-ae4e7c1b2b58b4b089b5eff6e8f41371a309a538.tar.gz
beta 2011.11.23 18:58
Diffstat (limited to 'tex/context/base/phys-dim.lua')
-rw-r--r--tex/context/base/phys-dim.lua173
1 files changed, 96 insertions, 77 deletions
diff --git a/tex/context/base/phys-dim.lua b/tex/context/base/phys-dim.lua
index cdc7541a2..0a271852d 100644
--- a/tex/context/base/phys-dim.lua
+++ b/tex/context/base/phys-dim.lua
@@ -16,68 +16,71 @@ if not modules then modules = { } end modules ['phys-dim'] = {
local V, P, S, R, C, Cc, Cs, matchlpeg, Carg = lpeg.V, lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.match, lpeg.Carg
local format, lower = string.format, string.lower
local appendlpeg = lpeg.append
-
local mergetable, mergedtable, keys, loweredkeys = table.merge, table.merged, table.keys, table.loweredkeys
-local allocate = utilities.storage.allocate
+physics = physics or { }
+physics.patterns = physics.patterns or { }
+
+local variables = interfaces.variables
+local v_reverse = variables.reverse
+local allocate = utilities.storage.allocate
-physics = physics or { }
-physics.patterns = physics.patterns or { }
+local trace_units = false
+local report_units = logs.reporter("units")
-local variables = interfaces.variables
-local v_reverse = variables.reverse
+trackers.register("physics.units", function(v) trace_units = v end)
-- digits parser (todo : use patterns)
-local digit = R("09")
-local sign = S("+-")
-local power = S("^e")
-local digitspace = S("~@_")
-local comma = P(",")
-local period = P(".")
-local semicolon = P(";")
-local colon = P(":")
-local signspace = P("/")
-local positive = P("++") -- was p
-local negative = P("--") -- was n
-local highspace = P("//") -- was s
-local padding = P("=")
-local plus = P("+")
-local minus = P("-")
-local space = P(" ")
-
-local digits = digit^1
-
-local ddigitspace = digitspace / "" / context.digitsspace
-local dcommayes = semicolon / "" / context.digitsfinalcomma
-local dcommanop = semicolon / "" / context.digitsseparatorspace
-local dperiodyes = colon / "" / context.digitsfinalperiod
-local dperiodnop = colon / "" / context.digitsseparatorspace
-local ddigit = digits / context.digitsdigit
-local dfinalcomma = comma / "" / context.digitsfinalcomma
-local dfinalperiod = period / "" / context.digitsfinalperiod
-local dintercomma = comma * #(digitspace) / "" / context.digitsseparatorspace
- + comma / "" / context.digitsintermediatecomma
-local dinterperiod = period * #(digitspace) / "" / context.digitsseparatorspace
- + period / "" / context.digitsintermediateperiod
-local dsignspace = signspace / "" / context.digitssignspace
-local dpositive = positive / "" / context.digitspositive
-local dnegative = negative / "" / context.digitsnegative
-local dhighspace = highspace / "" / context.digitshighspace
-local dsomesign = plus / "" / context.digitsplus
- + minus / "" / context.digitsminus
-local dpower = power / "" * (
- plus * C(digits) / context.digitspowerplus
- + minus * C(digits) / context.digitspowerminus
- + C(digits) / context.digitspower
- )
-local dpadding = padding / "" / context.digitszeropadding -- todo
-
-local dleader = (dpositive + dnegative + dhighspace + dsomesign + dsignspace)^0
-local dtrailer = dpower^0
-local dfinal = P(-1) + #P(1 - comma - period - semicolon - colon)
-local dnumber = (ddigitspace + ddigit)^1
-local dtemplate = ddigitspace^1
+local digit = R("09")
+local sign = S("+-")
+local power = S("^e")
+local digitspace = S("~@_")
+local comma = P(",")
+local period = P(".")
+local semicolon = P(";")
+local colon = P(":")
+local signspace = P("/")
+local positive = P("++") -- was p
+local negative = P("--") -- was n
+local highspace = P("//") -- was s
+local padding = P("=")
+local plus = P("+")
+local minus = P("-")
+local space = P(" ")
+
+local digits = digit^1
+
+local ddigitspace = digitspace / "" / context.digitsspace
+local dcommayes = semicolon / "" / context.digitsfinalcomma
+local dcommanop = semicolon / "" / context.digitsseparatorspace
+local dperiodyes = colon / "" / context.digitsfinalperiod
+local dperiodnop = colon / "" / context.digitsseparatorspace
+local ddigit = digits / context.digitsdigit
+local dfinalcomma = comma / "" / context.digitsfinalcomma
+local dfinalperiod = period / "" / context.digitsfinalperiod
+local dintercomma = comma * #(digitspace) / "" / context.digitsseparatorspace
+ + comma / "" / context.digitsintermediatecomma
+local dinterperiod = period * #(digitspace) / "" / context.digitsseparatorspace
+ + period / "" / context.digitsintermediateperiod
+local dsignspace = signspace / "" / context.digitssignspace
+local dpositive = positive / "" / context.digitspositive
+local dnegative = negative / "" / context.digitsnegative
+local dhighspace = highspace / "" / context.digitshighspace
+local dsomesign = plus / "" / context.digitsplus
+ + minus / "" / context.digitsminus
+local dpower = power / "" * (
+ plus * C(digits) / context.digitspowerplus
+ + minus * C(digits) / context.digitspowerminus
+ + C(digits) / context.digitspower
+ )
+local dpadding = padding / "" / context.digitszeropadding -- todo
+
+local dleader = (dpositive + dnegative + dhighspace + dsomesign + dsignspace)^0
+local dtrailer = dpower^0
+local dfinal = P(-1) + #P(1 - comma - period - semicolon - colon)
+local dnumber = (ddigitspace + ddigit)^1
+local dtemplate = ddigitspace^1
-- probably too complex, due to lookahead (lookback with state is probably easier)
@@ -93,7 +96,7 @@ local p_c_number = (dcpinternumber)^0 * (dpcfinalnumber)^0 * ddigit + dfallb
local c_p_number = (dpcinternumber)^0 * (dcpfinalnumber)^0 * ddigit + dfallback -- 000,000,000.00
-- ony signs before numbers (otherwise we get s / seconds issues)
---
+
local p_c_dparser = dleader * p_c_number * dtrailer * dfinal
local c_p_dparser = dleader * c_p_number * dtrailer * dfinal
@@ -147,6 +150,11 @@ local long_prefixes = {
Exbi = [[Ei]], -- binary
Zebi = [[Zi]], -- binary
Yobi = [[Yi]], -- binary
+
+ Degrees = [[°]],
+ Degree = [[°]],
+ Deg = [[°]],
+ ["°"] = [[°]],
}
local long_units = {
@@ -203,7 +211,6 @@ local long_units = {
Angstrom = [[Å]],
Gauss = [[G]],
Rad = [[rad]],
- Deg = [[°]],
RPS = [[RPS]],
RPM = [[RPM]],
RevPerSec = [[RPS]],
@@ -262,24 +269,24 @@ local short_prefixes_to_long = {
}
local short_units_to_long = { -- I'm not sure about casing
- m = "Meter",
- Hz = "Hertz",
- hz = "Hertz",
- u = "Hour",
- h = "Hour",
- s = "Second",
- g = "Gram",
- n = "Newton",
- v = "Volt",
-
- l = "Liter",
- -- w = "Watt",
- W = "Watt",
- -- a = "Ampere",
- A = "Ampere",
-
- Litre = "Liter",
- Metre = "Meter",
+ m = "Meter",
+ Hz = "Hertz",
+ hz = "Hertz",
+ u = "Hour",
+ h = "Hour",
+ s = "Second",
+ g = "Gram",
+ n = "Newton",
+ v = "Volt",
+
+ l = "Liter",
+ -- w = "Watt",
+ W = "Watt",
+ -- a = "Ampere",
+ A = "Ampere",
+
+ Litre = "Liter",
+ Metre = "Meter",
}
local short_operators_to_long = {
@@ -289,6 +296,10 @@ local short_operators_to_long = {
[":"] = "OutOf",
}
+-- local connected = table.tohash {
+-- "Degrees",
+-- }
+
short_prefixes = { } for k, v in next, short_prefixes_to_long do short_prefixes [k] = long_prefixes [v] end
short_units = { } for k, v in next, short_units_to_long do short_units [k] = long_units [v] end
short_operators = { } for k, v in next, short_operators_to_long do short_operators[k] = long_operators[v] end
@@ -371,6 +382,7 @@ local unitsU = context.unitsU
local unitsS = context.unitsS
local unitsO = context.unitsO
local unitsN = context.unitsN
+local unitsC = context.unitsC
local unitsNstart = context.unitsNstart
local unitsNstop = context.unitsNstop
@@ -389,7 +401,10 @@ l_units .test = { Meter = "meter", Second = "second" }
l_operators.test = { Solidus = " per " }
local function dimpus(p,u,s,wherefrom)
---~ print(p,u,s,wherefrom)
+ if trace_units then
+ report_units("w: [%s], p: [%s], u: [%s], s: [%s]",wherefrom or "?",p or "?",u or "?",s or "?")
+ end
+ -- local c = connected[u]
if wherefrom == "" then
p = prefixes[p] or p
u = units [u] or u
@@ -417,6 +432,8 @@ local function dimpus(p,u,s,wherefrom)
if u ~= "" then
if s ~= "" then
unitsUS(u,s)
+ -- elseif c then
+ -- unitsC(u)
else
unitsU(u)
end
@@ -433,7 +450,9 @@ local function dimspu(s,p,u,wherefrom)
end
local function dimop(o,wherefrom)
---~ print(o,wherefrom)
+ if trace_units then
+ report_units("w: [%s], o: [%s]",wherefrom or "?",o or "?")
+ end
if wherefrom == "" then
o = operators[o] or o
else