strc-tag.mkxl /size: 16 Kb    last modification: 2024-01-16 09:03
1%D \module
2%D   [       file=strc-tag,
3%D        version=2010.07.16,
4%D          title=\CONTEXT\ Structure Macros,
5%D       subtitle=Tags,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14% labels: no language needed
15% key/values and other names might change (and probably will)
16
17\writestatus{loading}{ConTeXt Structure Macros / Tags}
18
19\registerctxluafile{strc-tag}{autosuffix}
20
21\unprotect
22
23%D Eventually these labels will either move to the modules where they're used, or
24%D they will en dup in mult-tag.
25
26\definetagconstant{document}               % Div
27
28\definetagconstant{division}               % Div
29\definetagconstant{paragraph}              % P
30\definetagconstant{p}                      % P
31\definetagconstant{construct}              % Span
32\definetagconstant{highlight}              % Span
33
34\definetagconstant{section}                % Sect
35\definetagconstant{sectioncaption}         % Div
36\definetagconstant{sectiontitle}           % H
37\definetagconstant{sectionnumber}          % H
38\definetagconstant{sectioncontent}         % Div
39
40\definetagconstant{itemgroup}              % L
41\definetagconstant{item}                   % Li
42\definetagconstant{itemtag}                % Lbl
43\definetagconstant{itemcontent}            % LBody
44\definetagconstant{itemhead}               % Div
45\definetagconstant{itembody}               % Div
46
47\definetagconstant{description}            % Li
48\definetagconstant{descriptiontag}         % Lbl
49\definetagconstant{descriptioncontent}     % LBody
50\definetagconstant{descriptionsymbol}      % Span
51
52\aliastagconstant{construction}       {description}
53\aliastagconstant{constructiontag}    {descriptiontag}
54\aliastagconstant{constructioncontent}{descriptioncontent}
55\aliastagconstant{constructionsymbol} {descriptionsymbol}
56
57\definetagconstant{verbatimblock}          % Code
58\definetagconstant{verbatimlines}          % Code
59\definetagconstant{verbatimline}           % Code
60\definetagconstant{verbatim}               % Code
61
62\definetagconstant{lines}                  % Code
63\definetagconstant{line}                   % Code
64\definetagconstant{linenumber}             % Span
65
66\definetagconstant{sorting}                % Span
67\definetagconstant{synonym}                % Span
68
69\definetagconstant{register}               % Div
70\definetagconstant{registerlocation}       % Span
71\definetagconstant{registersection}        % Div
72\definetagconstant{registertag}            % Span
73\definetagconstant{registerentries}        % Div
74\definetagconstant{registerentry}          % Span
75\definetagconstant{registercontent}        % Span
76\definetagconstant{registersee}            % Span
77\definetagconstant{registerpages}          % Span
78\definetagconstant{registerpage}           % Span
79\definetagconstant{registerpagerange}      % Span
80\definetagconstant{registerfrompage}       % Span
81\definetagconstant{registertopage}         % Span
82\definetagconstant{registerseparator}      % Span
83
84\definetagconstant{table}                  % Table
85\definetagconstant{tablerow}               % TR
86\definetagconstant{tablecell}              % TD
87\definetagconstant{tableheadcell}          % TH
88\definetagconstant{tablehead}              % THEAD
89\definetagconstant{tablebody}              % TBODY
90\definetagconstant{tablefoot}              % TFOOT
91
92\definetagconstant{tabulate}               % Table
93\definetagconstant{tabulaterow}            % TR
94\definetagconstant{tabulatecell}           % TD
95\definetagconstant{tabulateheadcell}       % TH
96\definetagconstant{tabulatehead}           % THEAD
97\definetagconstant{tabulatebody}           % TBODY
98\definetagconstant{tabulatefoot}           % TFOOT
99
100\definetagconstant{math}                   % math
101\definetagconstant{mtable}                 % Table
102\definetagconstant{mtr}                    % TR
103\definetagconstant{mtd}                    % TD
104\definetagconstant{maction}                %
105
106\definetagconstant{mstacker}
107\definetagconstant{mstackertop}
108\definetagconstant{mstackermid}
109\definetagconstant{mstackerbot}
110\definetagconstant{mextensible}
111
112\aliastagconstant{mtablerow} {mtr}
113\aliastagconstant{mtablecell}{mtd}
114
115\definetagconstant{munderover}             % special cases
116\definetagconstant{munder}                 % special cases
117\definetagconstant{mover}                  % special cases
118
119\definetagconstant{list}                   % TOC
120\definetagconstant{listitem}               % TOCI
121\definetagconstant{listtag}                % Lbl
122\definetagconstant{listcontent}            % P
123\definetagconstant{listdata}               % P
124\definetagconstant{listpage}               % Reference
125\definetagconstant{listtext}               % Span
126
127\definetagconstant{delimited}              % BlockQuote
128%definetagconstant{delimited}              % Quote
129\definetagconstant{delimitedsymbol}        % Span
130\definetagconstant{delimitedcontent}       % Span
131
132\aliastagconstant{delimitedblock}{delimited}
133
134\definetagconstant{subsentence}            % Span
135\definetagconstant{subsentencecontent}     % Span
136\definetagconstant{subsentencesymbol}      % Span
137
138\definetagconstant{float}                  % Div
139\definetagconstant{floatcaption}           % Caption
140\definetagconstant{floatlabel}             % Span
141\definetagconstant{floattext}              % Span
142\definetagconstant{floatnumber}            % Span
143\definetagconstant{floatcontent}           % P
144
145\definetagconstant{image}                  % P
146
147\definetagconstant{mpgraphic}              % P
148
149\definetagconstant{formulaset}             % Div
150\definetagconstant{formula}                % Div
151\definetagconstant{formulacaption}         % Span
152\definetagconstant{formulalabel}           % Span
153\definetagconstant{formulanumber}          % P
154\definetagconstant{formulacontent}         % P
155\definetagconstant{subformula}             % Div
156
157\definetagconstant{link}                   % Link
158\definetagconstant{reference}              % Span
159
160\definetagconstant{margintext}             % Span
161\definetagconstant{margintextblock}        % Div
162\definetagconstant{marginanchor}           % Span
163
164% we might opt for verbose variants so this is experimental:
165
166\definetagconstant{label}                  % Span
167\definetagconstant{number}                 % Span
168
169\definetagconstant{ignore}                 % Span
170\definetagconstant{private}                % Span
171
172\definetagconstant{mid}                    % Span
173\definetagconstant{sub}                    % Span
174\definetagconstant{sup}                    % Span
175\definetagconstant{subsup}                 % Span
176
177\definetagconstant{unit}                   % Span
178\definetagconstant{quantity}               % Span
179%definetagconstant{number}                 % Span
180
181\definetagconstant{combination}            % Span
182\definetagconstant{combinationpair}        % Span
183\definetagconstant{combinationcontent}     % Span
184\definetagconstant{combinationcaption}     % Span
185
186\definetagconstant{publications}           % Span
187\definetagconstant{publication}            % Span
188\definetagconstant{pubfld}                 % Span
189
190\definetagconstant{block}                  % Div
191\definetagconstant{userdata}               % Div
192
193% \setuptaglabeltext
194%   [en]
195%   [\t!document=document]
196
197% the real code
198
199\definesystemattribute[tagged][public]
200\definesystemattribute[image] [public]
201
202% \setelementbackendtag [#1][#2] % define at the lua end
203% \setelementnature     [#1][#2] % define at the lua end
204
205\permanent\protected\def\ignoretagsinexport[#1]{\clf_ignoretagsinexport{#1}} % todo: public implementor
206
207\installcorenamespace{tagging}
208
209\installsetuponlycommandhandler \??tagging {tagging}
210
211% It makes no sense to have labels ... maybe some day as a last 'replace' in the export
212% which might be more efficient then ... okay, we now cannot overload but who cares.
213
214% \strc_tags_start_userdata              % defined at the lua end
215% \strc_tags_stop                        % defined at the lua end
216% \strc_tags_set_aspect                  % defined at the lua end
217% \strc_tags_get_element_tag             % defined at the lua end
218% \strc_tags_set_element_user_properties % defined at the lua end
219
220\permanent\protected\def\strc_tags_element_start_yes
221  {\iftrialtypesetting
222     \expandafter\gobbletwooptionals
223   \else
224     \expandafter\strc_tags_start_userdata
225   \fi}
226
227\permanent\protected\def\strc_tags_element_stop_yes
228  {\iftrialtypesetting
229     % nothing
230   \else
231     \expandafter\strc_tags_stop
232   \fi}
233
234\protected\def\strc_tags_enable_elements
235  {\enforced\let\startelement    \strc_tags_element_start_yes
236   \enforced\let\stopelement     \strc_tags_element_stop_yes
237   \enforced\let\dosettagproperty\strc_tags_set_aspect}
238
239\protected\def\strc_tags_disable_elements
240  {\enforced\let\startelement    \gobbletwooptionals
241   \enforced\let\stopelement     \relax
242   \enforced\let\dosettagproperty\gobbletwoarguments}
243
244% beware: making these unexpanded spoils tables (noalign problem)
245
246\def\strc_tags_enabled_start_no_detail
247  {\iftrialtypesetting
248     \expandafter\gobbleoneargument
249   \else
250     \expandafter\strc_tags_start
251   \fi}
252
253\def\strc_tags_enabled_start_detail
254  {\iftrialtypesetting
255     \expandafter\gobbletwoarguments
256   \else
257     \expandafter\strc_tags_start_detail
258   \fi}
259
260\def\strc_tags_enabled_start_chained
261  {\iftrialtypesetting
262     \expandafter\gobblethreearguments
263   \else
264     \expandafter\strc_tags_start_chained_indeed
265   \fi}
266
267\def\strc_tags_enabled_start_ignore
268  {\iftrialtypesetting
269     \expandafter\gobbleoneargument
270   \else
271     \expandafter\strc_tags_start_ignore
272   \fi}
273
274\def\strc_tags_enabled_stop
275  {\iftrialtypesetting
276     % do nothing
277   \else
278     \expandafter\strc_tags_stop
279  \fi}
280
281\def\strc_tags_start_chained_indeed#1#2#3{\strc_tags_start_chained{#1}{#2}{\getcurrentparentchain#3{#2}}}
282
283\newconditional\c_strc_tags_enabled
284
285\lettonothing\dotaggedplaceholder
286
287\immutable\chardef\strc_tags_placeholder_char\zerocount % "FFFC
288
289\protected\def\strc_tags_enable_indeed
290  {\enforced\let\dotaggedplaceholder  \strc_tags_placeholder_char
291   \enforced\let\dostarttagged        \strc_tags_enabled_start_detail
292   \enforced\let\dostarttaggednodetail\strc_tags_enabled_start_no_detail
293   \enforced\let\dostarttaggedchained \strc_tags_enabled_start_chained
294   \enforced\let\dostoptagged         \strc_tags_enabled_stop
295   \enforced\let\dostartignoretagging \strc_tags_enabled_start_ignore
296   \enforced\let\dostopignoretagging  \strc_tags_stop}
297
298\protected\def\strc_tags_enable
299  {% once enable one is toast
300   \global\c_strc_tags_enabled\conditionaltrue
301   % and gets:
302   \strc_tags_enable_indeed}
303
304\protected\def\strc_tags_disable
305  {\ifconditional\c_strc_tags_enabled
306     % so now all are artifacts
307     \enforced\let\dotaggedplaceholder  \strc_tags_placeholder_char
308     \enforced\let\dostarttagged        \gobbletwoarguments
309     \enforced\let\dostarttaggednodetail\gobbleoneargument
310     \enforced\let\dostarttaggedchained \gobblethreearguments
311     \enforced\let\dostoptagged         \donothing
312   \else
313     % initial
314     \enforced\lettonothing\dotaggedplaceholder
315     \enforced\let\dostarttagged        \gobbletwoarguments
316     \enforced\let\dostarttaggednodetail\gobbleoneargument
317     \enforced\let\dostarttaggedchained \gobblethreearguments
318     \enforced\let\dostoptagged         \donothing
319     \enforced\let\dostartignoretagging \donothing
320     \enforced\let\dostopignoretagging  \donothing
321   \fi}
322
323% for luigi (beware: fully expandable):
324
325\protected\def\strc_tags_setup_element_user_properties
326  {\iftrialtypesetting
327     \expandafter\gobbletwooptionals
328   \else
329     \expandafter\strc_tags_set_element_user_properties
330   \fi}
331
332\protected\def\strc_tags_enable_properties
333  {\enforced\let\getelementtag             \strc_tags_get_element_tag
334   \enforced\let\setupelementuserproperties\strc_tags_set_element_user_properties}
335
336\protected\def\strc_tags_disable_properties
337  {\enforced\let\getelementtag             \donothing
338   \enforced\let\setupelementuserproperties\gobbletwooptionals}
339
340\strc_tags_disable
341
342%D The triggers:
343
344\newtoks\everyenableelements
345\newtoks\everydisableelements
346
347\appendtoks
348    \strc_tags_enable_elements
349    \strc_tags_enable_properties
350    \ifcstok{\taggingparameter\c!method}\v!auto
351      \strc_tags_enable
352    \else
353      \strc_tags_disable
354    \fi
355\to \everyenableelements
356
357\appendtoks
358    \strc_tags_disable_elements
359    \strc_tags_disable_properties
360    \strc_tags_disable
361\to \everydisableelements
362
363\appendtoks
364   \ifcstok{\taggingparameter\c!state}\v!start
365     \expand\everyenableelements
366   \else
367     \expand\everydisableelements
368   \fi
369\to \everysetuptagging
370
371\permanent\protected\def\forgettagging
372  {\c_attr_tagged\attributeunsetvalue}
373
374\setuptagging
375  [\c!state=\v!stop,
376   \c!method=\v!auto]
377
378% Cf suggestion by Wolfgang we now have named paragraphs. Watch out, the content
379% is grouped but only when we have an instance.
380%
381% \defineparagraph[red] [color=red]
382% \defineparagraph[bold][style=bold]
383%
384% \startparagraph       \input ward \stopparagraph
385% \startparagraph[red]  \input ward \stopparagraph
386% \startparagraph[bold] \input ward \stopparagraph
387
388\installcorenamespace               {paragraph}
389\installcommandhandler \??paragraph {paragraph} \??paragraph
390
391\setupparagraph % someday maybe also strut (beg/end) and align
392  [\c!color=,
393   \c!style=]
394
395\ifdefined\dotagparagraph \else \aliased\let\dotagparagraph\gobbleoneargument \fi
396
397\permanent\tolerant\protected\def\startparagraph[#S#1]#*[#S#2]%
398  {\endgraf % we end before the group
399   \begingroup
400   \ifarguments
401     \lettonothing\currentparagraph
402   \or
403     \ifhastok={#1}%
404       \lettonothing\currentparagraph
405       \setupcurrentparagraph[#1]
406     \else
407       \cdef\currentparagraph{#1}%
408     \fi
409   \or
410     \cdef\currentparagraph{#1}%
411     \setupcurrentparagraph[#2]%
412   \fi
413   \useparagraphstyleandcolor\c!style\c!color
414   \usealignparameter\paragraphparameter
415   \usesetupsparameter\paragraphparameter
416   \dostarttagged\t!paragraph\currentparagraph
417   \dotagparagraph{\paragraphparameter\c!align}}
418
419\permanent\protected\def\stopparagraph
420  {\dostoptagged
421   \endgraf % we end inside the group
422   \endgroup}
423
424\aliased\let\startpar\startparagraph
425\aliased\let\stoppar \stopparagraph
426
427\def\strc_tags_document_start_indeed
428  {\glet\strc_tags_document_start_indeed\relax
429   \dostarttagged\t!document\empty}
430
431\def\strc_tags_document_stop_indeed
432  {\glet\strc_tags_document_stop_indeed\relax
433   \dostoptagged}
434
435\appendtoks
436    \strc_tags_document_start_indeed % here because otherwise products don't get a root (starttext before env)
437\to \everyenableelements
438
439% \appendtoks
440%     \strc_tags_document_start_indeed
441% \to \everystarttext
442
443\appendtoks
444    \strc_tags_document_stop_indeed
445\to \everystoptext
446
447\appendtoks
448    \strc_tags_disable_elements
449    \strc_tags_disable
450\to \everybeforepagebody
451
452% This doesn't work well either, so instead we handle the ornaments in the tagging
453% in a different way (see attr -> false code).
454
455% \appendtoks
456%     \dostartignoretagging
457% \to \everybeforepagebody
458%
459% \appendtoks
460%     \dostopignoretagging
461% \to \everyafterpagebody
462
463% \doifelseinelement{structure:section}            {yes} {no}
464% \doifelseinelement{structure:chapter}            {yes} {no}
465% \doifelseinelement{division:*-structure:chapter} {yes} {no}
466
467\aliased\let\doifinelementelse\doifelseinelement % define at the lua end
468
469\permanent\protected\def\taggedlabeltexts#1#2#3% experimental: label, numberdetail, numbercontent
470  {\begingroup
471   \dostarttagged\t!label{#1}%
472   \labeltexts{#1}%
473     {\dostoptagged
474      \dostarttagged\t!number{#2}%
475      #3%
476      \dostoptagged
477      \dostarttagged\t!label{#1}}%
478   \dostoptagged
479   \endgroup}
480
481\permanent\protected\def\namedtaggedlabeltexts#1#2#3#4#5% experimental: labeltag label numbertag numberdetail numbercontent
482  {\begingroup
483   \dostarttagged{#1}{#2}%
484   \labeltexts{#2}%
485     {\dostoptagged
486      \dostarttagged{#3}{#4}%
487      #5%
488      \dostoptagged
489      \dostarttagged{#1}{#2}}%
490   \dostoptagged
491   \endgroup}
492
493%D Metadata is added after the following structure element so here we get some as
494%D child of the document root and some as child of the chapter element.
495%D
496%D \settaggedmetadata[title=Hello World!,author=Hans Hagen]
497%D
498%D \starttyping
499%D \starttext
500%D   \startelement[ignore]
501%D     \input tufte
502%D   \stopelement
503%D   \par \input ward \par
504%D   \settaggedmetadata[whatever=Again and Again]
505%D   \startchapter[title=test]
506%D     \input ward
507%D   \stopchapter
508%D \stoptext
509%D \stoptyping
510
511% \settaggedmetadata[#1] % define at the lua end
512
513%D An overload:
514
515\pushoverloadmode
516
517\aliased\let\strc_tagged_saved_bpar\bpar
518\aliased\let\strc_tagged_saved_epar\epar
519
520\enforced\permanent\protected\def\bpar{\dostarttagged\t!paragraph\empty\strc_tagged_saved_bpar}
521\enforced\permanent\protected\def\epar{\strc_tagged_saved_epar\dostoptagged}
522
523\popoverloadmode
524
525%D For now:
526
527\appendtoks
528    \clf_settagginglevel{\taggingparameter\c!level}%
529\to \everysetuptagging
530
531% \permanent\def\untagged{attr \taggedattribute\attributeunsetvalue}
532
533\protect
534