summaryrefslogtreecommitdiff
path: root/tex/context/base/syst-aux.lua
blob: 6b5e18d1625e0cbbb52c51ff5f7f43439c18d53c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
if not modules then modules = { } end modules ['syst-aux'] = {
    version   = 1.001,
    comment   = "companion to syst-aux.mkiv",
    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
    copyright = "PRAGMA ADE / ConTeXt Development Team",
    license   = "see context related readme files"
}

-- slower than lpeg:
--
-- utfmatch(str,"(.?)(.*)$")
-- utf.sub(str,1,1)

local commands, context = commands, context

local settings_to_array = utilities.parsers.settings_to_array
local format = string.format
local utfsub = utf.sub
local P, S, C, Cc, Cs, Carg, lpegmatch, utf8char = lpeg.P, lpeg.S, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg, lpeg.match, lpeg.patterns.utf8char


local setvalue = context.setvalue

local pattern = C(utf8char^-1) * C(P(1)^0)

function commands.getfirstcharacter(str)
    local first, rest = lpegmatch(pattern,str)
    setvalue("firstcharacter",first)
    setvalue("remainingcharacters",rest)
end

function commands.thefirstcharacter(str)
    local first, rest = lpegmatch(pattern,str)
    context(first)
end
function commands.theremainingcharacters(str)
    local first, rest = lpegmatch(pattern,str)
    context(rest)
end

local pattern = C(utf8char^-1)

function commands.doiffirstcharelse(chr,str)
    commands.doifelse(lpegmatch(pattern,str) == chr)
end

function commands.getsubstring(str,first,last)
    context(utfsub(str,tonumber(first),tonumber(last)))
end

-- function commands.addtocommalist(list,item)
--     if list == "" then
--         context(item)
--     else
--         context("%s,%s",list,item) -- using tex.print is some 10% faster
--     end
-- end
--
-- function commands.removefromcommalist(list,item)
--     if list == "" then
--         context(item)
--     else
--         -- okay, using a proper lpeg is probably faster
--         -- we could also check for #l = 1
--         local l = settings_to_array(list)
--         local t, n = { }
--         for i=1,#l do
--             if l[i] ~= item then
--                 n = n + 1
--                 t[n] = item
--             end
--         end
--         if n == 0 then
--             context(item)
--         else
--             context(concat(list,","))
--         end
--     end
-- end

local pattern = (C((1-P("%"))^1) * Carg(1)) /function(n,d) return format("%.0fsp",d * tonumber(n)/100) end * P("%") * P(-1)

-- commands.percentageof("10%",65536*10)

function commands.percentageof(str,dim)
    context(lpegmatch(pattern,str,1,dim) or str)
end

-- \gdef\setpercentdimen#1#2%
--   {#1=\ctxcommand{percentageof("#2",\number#1)}\relax}

local spaces = P(" ")^0/""

local pattern = Cs(
    ( P("global") / "\\global" )^0
  * spaces
  * ( P("unexpanded") / "\\unexpanded" )^0
  * spaces
  * Cc("\\expandafter\\")
  * spaces
  * ( P("expanded") / "e" )^0
  * spaces
  * ( P((1-S(" #"))^1) / "def\\csname %0\\endcsname" )
  * spaces
  * Cs( (P("##")/"#" + P(1))^0 )
)

function commands.thetexdefinition(str)
    context(lpegmatch(pattern,str))
end

local upper, lower = utf.upper, utf.lower

function commands.upper(s) context(upper(s)) end
function commands.lower(s) context(lower(s)) end