1if not modules then modules = { } end modules ['lang-lab'] = {
2 version = 1.001,
3 comment = "companion to lang-lab.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
9local format, find = string.format, string.find
10local next, rawget, type = next, rawget, type
11local lpegmatch = lpeg.match
12local formatters = string.formatters
13
14local prtcatcodes = catcodes.numbers.prtcatcodes
15
16local trace_labels = false trackers.register("languages.labels", function(v) trace_labels = v end)
17local report_labels = logs.reporter("languages","labels")
18
19languages.labels = languages.labels or { }
20local labels = languages.labels
21
22local context = context
23local implement = interfaces.implement
24
25local variables = interfaces.variables
26local settings_to_array = utilities.parsers.settings_to_array
27
28local splitter = lpeg.splitat(":")
29
30local function split(tag)
31 return lpegmatch(splitter,tag)
32end
33
34labels.split = split
35
36local contextsprint = context.sprint
37
38local f_setlabeltextpair = formatters["\\setlabeltextpair{%s}{%s}{%s}{%s}{%s}"]
39local f_key_key = formatters["\\v!%s:\\v!%s"]
40local f_key_raw = formatters["\\v!%s:%s"]
41local f_raw_key = formatters["%s:\\v!%s"]
42local f_raw_raw = formatters["%s:%s"]
43local f_key = formatters["\\v!%s"]
44local f_raw = formatters["%s"]
45
46local function definelanguagelabels(data,class,tag,rawtag)
47 for language, text in next, data.labels do
48 if text == "" then
49
50 elseif type(text) == "table" then
51 contextsprint(prtcatcodes,f_setlabeltextpair(class,language,tag,text[1],text[2]))
52 if trace_labels then
53 report_labels("language %a, defining label %a as %a and %a",language,rawtag,text[1],text[2])
54 end
55 else
56 contextsprint(prtcatcodes,f_setlabeltextpair(class,language,tag,text,""))
57 if trace_labels then
58 report_labels("language %a, defining label %a as %a",language,rawtag,text)
59 end
60 end
61 end
62end
63
64function labels.define(class,name,prefixed)
65 local list = languages.data.labels[name]
66 if list then
67 report_labels("defining label set %a",name)
68 for tag, data in next, list do
69 tag = variables[tag] or tag
70 if data.hidden then
71
72 elseif prefixed then
73 local first, second = lpegmatch(splitter,tag)
74 if second then
75 if rawget(variables,first) then
76 if rawget(variables,second) then
77 definelanguagelabels(data,class,f_key_key(first,second),tag)
78 else
79 definelanguagelabels(data,class,f_key_raw(first,second),tag)
80 end
81 elseif rawget(variables,second) then
82 definelanguagelabels(data,class,f_raw_key(first,second),tag)
83 else
84 definelanguagelabels(data,class,f_raw_raw(first,second),tag)
85 end
86 elseif rawget(variables,rawtag) then
87 definelanguagelabels(data,class,f_key(tag),tag)
88 else
89 definelanguagelabels(data,class,tag,tag)
90 end
91 else
92 definelanguagelabels(data,class,tag,tag)
93 end
94 end
95 else
96 report_labels("unknown label set %a",name)
97 end
98end
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117interfaces.implement {
118 name = "definelabels",
119 actions = labels.define,
120 arguments = { "string", "string", "boolean" }
121}
122
123
124
125
126
127
128
129
130
131
132
133
134local function concatcommalist(settings)
135 local list = settings.list or settings_to_array(settings.text or "")
136 local size = #list
137 local command = settings.command and context[settings.command] or context
138 if size > 1 then
139 local separator, last = " ", " "
140 if settings.separators then
141 local set = settings_to_array(settings.separators)
142 separator = set[1] or settings.separator or separator
143 last = set[2] or settings.last or last
144 else
145 separator = settings.separator or separator
146 last = settings.last or last
147 end
148 command(list[1])
149 for i=2,size-1 do
150 context(separator)
151 command(list[i])
152 end
153 context(last)
154 end
155 if size > 0 then
156 command(list[size])
157 end
158end
159
160implement {
161 name = "concatcommalist",
162 actions = concatcommalist,
163 arguments = {
164 {
165 { "text" },
166 { "separators" },
167 { "separator" },
168 { "last" },
169 }
170 }
171}
172 |