1if not modules then modules = { } end modules ['typo-man'] = {
2 version = 1.001,
3 comment = "companion to typo-prc.mkiv",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9if not characters then
10
11 require("char-def")
12 require("char-ini")
13end
14
15local lpegmatch = lpeg.match
16local P, R, C, Ct, Cs, Carg = lpeg.P, lpeg.R, lpeg.C, lpeg.Ct, lpeg.Cs, lpeg.Carg
17local global = global or _G
18
19local methods = {
20 uppercase = characters.upper,
21 lowercase = characters.lower,
22 Word = converters.Word,
23 Words = converters.Words,
24}
25
26local function nothing(s) return s end
27
28
29
30
31
32
33local splitter = lpeg.tsplitat(".")
34
35table.setmetatableindex(methods,function(t,k)
36 local s = lpegmatch(splitter,k)
37 local v = global
38 for i=1,#s do
39 v = v[s[i]]
40 if not v then
41 break
42 end
43 end
44 if not v or v == global then
45 v = nothing
46 end
47 t[k] = v
48 return v
49end)
50
51local whitespace = lpeg.patterns.whitespace^0
52local separator = whitespace * P("->") * whitespace
53local pair = C((1-separator)^1) * separator * C(P(1)^0)
54local list = Ct((C((1-separator)^1) * separator)^1) * C(P(1)^0)
55
56local pattern = Carg(1) * pair / function(methods,operation,str)
57 return methods[operation](str) or str
58end
59
60local function apply(str,m)
61 return lpegmatch(pattern,str,1,m or methods) or str
62end
63
64local function splitspecification(field,m)
65 local m, f = lpegmatch(list,field,1,m or methods)
66 if m then
67 return m, f or field
68 else
69 return nil, field
70 end
71end
72
73local function applyspecification(actions,str)
74 if actions then
75 for i=1,#actions do
76 local action = methods[actions[i]]
77 if action then
78 str = action(str) or str
79 end
80 end
81 end
82 return str
83end
84
85if not typesetters then typesetters = { } end
86
87typesetters.manipulators = {
88 methods = methods,
89 apply = apply,
90 patterns = {
91 pair = pair,
92 list = list,
93 },
94 splitspecification = splitspecification,
95 applyspecification = applyspecification,
96}
97
98local pattern = Cs((1 - P(1) * P(-1))^0 * (P(".")/"" + P(1)))
99
100methods.stripperiod = function(str) return lpegmatch(pattern,str) end
101
102
103
104
105
106
107
108
109
110
111function commands.manipulated(str)
112 context(apply(str))
113end
114 |