strc-tag.mkxl /size: 18 Kb    last modification: 2025-02-21 11: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}
27\definetagconstant{documentpart}
28
29\definetagconstant{division}
30\definetagconstant{paragraph}
31\definetagconstant{subparagraph}
32\definetagconstant{p}
33\definetagconstant{highlight}
34\definetagconstant{ornament}
35\definetagconstant{break}
36\definetagconstant{placeholder}
37
38\definetagconstant{construct}
39\definetagconstant{constructleft}
40\definetagconstant{constructright}
41\definetagconstant{constructcontent}
42
43% \definetagconstant{sectionblock}
44
45\definetagconstant{section}
46\definetagconstant{sectioncaption}
47\definetagconstant{sectiontitle}
48\definetagconstant{sectionnumber}
49\definetagconstant{sectioncontent}
50
51\definetagconstant{itemgroup}
52\definetagconstant{item}
53\definetagconstant{itemtag}
54\definetagconstant{itemcontent}
55\definetagconstant{itemhead}
56\definetagconstant{itembody}
57
58\definetagconstant{items}
59\definetagconstant{itemtexts}
60\definetagconstant{itemtext}
61\definetagconstant{itemsymbols}
62\definetagconstant{itemsymbol}
63
64\definetagconstant{description}
65\definetagconstant{descriptiontag}
66\definetagconstant{descriptioncontent}
67\definetagconstant{descriptionsymbol}
68
69\aliastagconstant {construction}       {description}
70\aliastagconstant {constructiontag}    {descriptiontag}
71\aliastagconstant {constructioncontent}{descriptioncontent}
72\aliastagconstant {constructionsymbol} {descriptionsymbol}
73
74\definetagconstant{verbatimblock}
75\definetagconstant{verbatimlines}
76\definetagconstant{verbatimline}
77\definetagconstant{verbatim}
78
79\definetagconstant{lines}
80\definetagconstant{line}
81\definetagconstant{linenumber}
82
83\definetagconstant{sorting}
84\definetagconstant{synonym}
85
86\definetagconstant{register}
87\definetagconstant{registerlocation}
88\definetagconstant{registersection}
89\definetagconstant{registertag}
90\definetagconstant{registerentries}
91\definetagconstant{registerentry}
92\definetagconstant{registercontent}
93\definetagconstant{registersee}
94\definetagconstant{registerpages}
95\definetagconstant{registerpage}
96\definetagconstant{registerpagerange}
97\definetagconstant{registerfrompage}
98\definetagconstant{registertopage}
99\definetagconstant{registerseparator}
100
101\definetagconstant{table}
102\definetagconstant{tablerow}
103\definetagconstant{tablecell}
104\definetagconstant{tableheadcell}
105\definetagconstant{tablehead}
106\definetagconstant{tablebody}
107\definetagconstant{tablefoot}
108
109\definetagconstant{tabulate}
110\definetagconstant{tabulaterow}
111\definetagconstant{tabulatecell}
112\definetagconstant{tabulateheadcell}
113\definetagconstant{tabulatehead}
114\definetagconstant{tabulatebody}
115\definetagconstant{tabulatefoot}
116
117\definetagconstant{math}
118\definetagconstant{mtable}
119\definetagconstant{mtr}
120\definetagconstant{mtd}
121
122\definetagconstant{maction}
123
124\definetagconstant{mstack}
125
126\definetagconstant{mstacker}
127\definetagconstant{mstackertop}
128\definetagconstant{mstackermid}
129\definetagconstant{mstackerbot}
130
131\definetagconstant{mextensible}
132
133\definetagconstant{mfunction}
134\definetagconstant{mfunctionstack}
135
136\definetagconstant{mdelimited}
137\definetagconstant{mdelimitedstack}
138
139\definetagconstant{mfraction}
140\definetagconstant{mfractionstack}
141
142\definetagconstant{munit}
143\definetagconstant{mdigits}
144
145\aliastagconstant {mtablerow} {mtr}
146\aliastagconstant {mtablecell}{mtd}
147
148\definetagconstant{munderover}
149\definetagconstant{munder}
150\definetagconstant{mover}
151\definetagconstant{mtext}
152
153\definetagconstant{mrow}
154
155\definetagconstant{list}
156\definetagconstant{listitem}
157\definetagconstant{listtag}
158\definetagconstant{listcontent}
159\definetagconstant{listdata}
160\definetagconstant{listpage}
161\definetagconstant{listtext}
162
163\definetagconstant{delimitedblock}
164\definetagconstant{delimited}
165\definetagconstant{delimitedsymbol}
166\definetagconstant{delimitedcontent}
167
168%aliastagconstant {delimitedblock}{delimited} % no longer
169
170\definetagconstant{subsentence}
171\definetagconstant{subsentencecontent}
172\definetagconstant{subsentencesymbol}
173
174\definetagconstant{float}
175\definetagconstant{floatcaption}
176\definetagconstant{floatlabel}
177\definetagconstant{floattext}
178\definetagconstant{floatnumber}
179\definetagconstant{floatcontent}
180
181\definetagconstant{image}
182
183\definetagconstant{mpgraphic}
184
185\definetagconstant{formulaset}
186\definetagconstant{formula}
187\definetagconstant{formulacaption}
188\definetagconstant{formulalabel}
189\definetagconstant{formulanumber}
190\definetagconstant{formulacontent}
191\definetagconstant{subformula}
192
193\definetagconstant{link}
194\definetagconstant{reference}
195
196\definetagconstant{nativation}
197\definetagconstant{nativationbutton}
198\definetagconstant{nativationmenu}
199\definetagconstant{nativationmenuitem}
200\definetagconstant{nativationaction}
201
202\definetagconstant{margintext}
203\definetagconstant{margintextblock}
204\definetagconstant{marginanchor}
205
206\definetagconstant{linetext}
207
208% we might opt for verbose variants so this is experimental:
209
210\definetagconstant{label}
211\definetagconstant{number}
212
213\definetagconstant{ignore}
214\definetagconstant{private}
215
216\definetagconstant{mid}
217\definetagconstant{sub}
218\definetagconstant{sup}
219\definetagconstant{subsup}
220
221\definetagconstant{unit}
222\definetagconstant{quantity}
223%definetagconstant{number}
224
225\definetagconstant{combination}
226\definetagconstant{combinationpair}
227\definetagconstant{combinationcontent}
228\definetagconstant{combinationcaption}
229
230\definetagconstant{publications}
231\definetagconstant{publication}
232\definetagconstant{pubfld}
233
234\definetagconstant{citation}
235\definetagconstant{cite}
236
237\definetagconstant{narrower}
238
239\definetagconstant{block}
240
241\definetagconstant{userdata}
242
243\definetagconstant{textdisplay}
244
245\definetagconstant{verse}
246\definetagconstant{versetag}
247\definetagconstant{verseseparator}
248\definetagconstant{versecontent}
249
250\definetagconstant{navigation}
251\definetagconstant{navigationbutton}
252\definetagconstant{navigationmenu}
253\definetagconstant{navigationmenuitem}
254\definetagconstant{navigationaction}
255\definetagconstant{navigationpage}
256
257% \setuptaglabeltext
258%   [en]
259%   [\t!document=document]
260
261% the real code
262
263\definesystemattribute[tagged][public]
264\definesystemattribute[image] [public]
265
266% \setelementbackendtag [#1][#2] % define at the lua end
267% \setelementnature     [#1][#2] % define at the lua end
268
269\permanent\protected\def\ignoretagsinexport[#1]{\clf_ignoretagsinexport{#1}} % todo: public implementor
270
271\installcorenamespace{tagging}
272
273\installsetuponlycommandhandler \??tagging {tagging}
274
275% It makes no sense to have labels ... maybe some day as a last 'replace' in the export
276% which might be more efficient then ... okay, we now cannot overload but who cares.
277
278% \strc_tags_start_userdata              % defined at the lua end
279% \strc_tags_stop                        % defined at the lua end
280% \strc_tags_set_aspect                  % defined at the lua end
281% \strc_tags_get_element_tag             % defined at the lua end
282% \strc_tags_set_element_user_properties % defined at the lua end
283
284\permanent\protected\def\strc_tags_element_start_yes
285  {\iftrialtypesetting
286     \expandafter\gobbletwooptionals
287   \else
288     \expandafter\strc_tags_start_userdata
289   \fi}
290
291\permanent\protected\def\strc_tags_element_stop_yes
292  {\iftrialtypesetting
293     % nothing
294   \else
295     \expandafter\strc_tags_stop
296   \fi}
297
298\protected\def\strc_tags_enable_elements
299  {\enforced\let\startelement    \strc_tags_element_start_yes
300   \enforced\let\stopelement     \strc_tags_element_stop_yes
301   \enforced\let\dosettagproperty\strc_tags_set_aspect}
302
303\protected\def\strc_tags_disable_elements
304  {\enforced\let\startelement    \gobbletwooptionals
305   \enforced\let\stopelement     \relax
306   \enforced\let\dosettagproperty\gobbletwoarguments}
307
308% beware: making these unexpanded spoils tables (noalign problem)
309
310\def\strc_tags_enabled_start_no_detail
311  {\iftrialtypesetting
312     \expandafter\gobbleoneargument
313   \else
314     \expandafter\strc_tags_start
315   \fi}
316
317\def\strc_tags_enabled_start_detail
318  {\iftrialtypesetting
319     \expandafter\gobbletwoarguments
320   \else
321     \expandafter\strc_tags_start_detail
322   \fi}
323
324\def\strc_tags_enabled_start_chained
325  {\iftrialtypesetting
326     \expandafter\gobblefourarguments
327   \else
328     \expandafter\strc_tags_start_chained_indeed
329   \fi}
330
331\def\strc_tags_enabled_start_ignore
332  {\iftrialtypesetting
333     \expandafter\gobbleoneargument
334   \else
335     \expandafter\strc_tags_start_ignore
336   \fi}
337
338\def\strc_tags_enabled_stop
339  {\iftrialtypesetting
340     % do nothing
341   \else
342     \expandafter\strc_tags_stop
343  \fi}
344
345% #2 : parent #3: instance
346
347\def\strc_tags_start_chained_indeed#1#2#3#4{\strc_tags_start_chained{#1}{#2}{\getcurrentparentchain#4{#3}}}
348
349\newconditional\c_strc_tags_enabled
350\newconditional\c_strc_tags_global
351
352\permanent\protected\def\taggingpause % see pack-obj
353  {\c_strc_tags_global\conditionalfalse}
354
355\lettonothing\dotaggedplaceholder
356
357\immutable\chardef\strc_tags_placeholder_char\zerocount % "FFFC
358
359\protected\def\strc_tags_enable_indeed
360  {\enforced\let\dotaggedplaceholder  \strc_tags_placeholder_char
361   \enforced\let\dostarttagged        \strc_tags_enabled_start_detail
362   \enforced\let\dostarttaggednodetail\strc_tags_enabled_start_no_detail
363   \enforced\let\dostarttaggedchained \strc_tags_enabled_start_chained
364   \enforced\let\dostoptagged         \strc_tags_enabled_stop
365   \enforced\let\dostartignoretagging \strc_tags_enabled_start_ignore
366   \enforced\let\dostopignoretagging  \strc_tags_stop
367   \enforced\let\dotagdocumentpush    \strc_tags_document_push % defined at the lua end
368   \enforced\let\dotagdocumentpop     \strc_tags_document_pop  % defined at the lua end
369   \enforced\let\dotagdocumentignore  \strc_tags_document_ignore}
370
371\protected\def\strc_tags_enable
372  {% once enable one is toast
373   \global\c_strc_tags_enabled\conditionaltrue
374   % and gets:
375   \strc_tags_enable_indeed}
376
377\protected\def\strc_tags_disable
378  {\ifconditional\c_strc_tags_enabled
379     % so now all are artifacts
380     \enforced\let\dotaggedplaceholder  \strc_tags_placeholder_char
381     \enforced\let\dostarttagged        \gobbletwoarguments
382     \enforced\let\dostarttaggednodetail\gobbleoneargument
383     \enforced\let\dostarttaggedchained \gobblefourarguments
384     \enforced\let\dostoptagged         \donothing
385   \else
386     % initial
387     \enforced\lettonothing\dotaggedplaceholder
388     \enforced\let\dostarttagged        \gobbletwoarguments
389     \enforced\let\dostarttaggednodetail\gobbleoneargument
390     \enforced\let\dostarttaggedchained \gobblefourarguments
391     \enforced\let\dostoptagged         \donothing
392     \enforced\let\dostartignoretagging \donothing
393     \enforced\let\dostopignoretagging  \donothing
394     \enforced\let\dotagdocumentpush    \donothing
395     \enforced\let\dotagdocumentpop     \donothing
396     \enforced\let\dotagdocumentignore  \donothing
397   \fi}
398
399% this
400%
401% \appendtoks
402%     \strc_tags_disable_elements
403%     \strc_tags_disable
404% \to \everybeforepagebody
405%
406% has become
407
408\protected\def\strc_tags_document_ignore
409  {\c_attr_tagged\plusone}
410
411\prependtoks
412    \dotagdocumentignore
413\to \everybeforepagebody
414
415% \def\strc_tags_horrible_start
416%   {\begingroup
417%    \ifconditional\c_strc_tags_enabled
418%      \dotagdocumentpush
419%    \fi}
420
421% \def\strc_tags_horrible_stop
422%   {\ifconditional\c_strc_tags_enabled
423%       \dotagdocumentpop
424%    \fi
425%    \endgroup}
426
427% for luigi (beware: fully expandable):
428
429\protected\def\strc_tags_setup_element_user_properties
430  {\iftrialtypesetting
431     \expandafter\gobbletwooptionals
432   \else
433     \expandafter\strc_tags_set_element_user_properties
434   \fi}
435
436\protected\def\strc_tags_enable_properties
437  {\enforced\let\getelementtag             \strc_tags_get_element_tag
438   \enforced\let\setupelementuserproperties\strc_tags_set_element_user_properties}
439
440\protected\def\strc_tags_disable_properties
441  {\enforced\let\getelementtag             \donothing
442   \enforced\let\setupelementuserproperties\gobbletwooptionals}
443
444\strc_tags_disable
445
446%D The triggers:
447
448\newtoks\everyenableelements
449\newtoks\everydisableelements
450
451\appendtoks
452    \strc_tags_enable_elements
453    \strc_tags_enable_properties
454    \ifcstok{\taggingparameter\c!method}\v!auto
455      \strc_tags_enable
456    \else
457      \strc_tags_disable
458    \fi
459\to \everyenableelements
460
461\appendtoks
462    \strc_tags_disable_elements
463    \strc_tags_disable_properties
464    \strc_tags_disable
465\to \everydisableelements
466
467%D Tagging is kind of tricky because quite a bit happens when we ship out a page and
468%D therefore we can't just enable and disable at will. In some manuals we only need
469%D part of the tagging mechanism so there we can turn it on and off.
470
471\appendtoks
472   \ifexporting
473     % already set up
474   \orelse\ifcstok{\taggingparameter\c!state}\v!start
475     \c_strc_tags_global\conditionaltrue
476     \setsystemmode\s!tagging
477     \expand\everyenableelements
478   \orelse\iflastnamedcs\v!on
479     \setsystemmode\s!tagging
480     \ifconditional\c_strc_tags_global \else
481       \expand\everyenableelements
482     \fi
483   \orelse\iflastnamedcs\v!off
484     \resetsystemmode\s!tagging
485     \ifconditional\c_strc_tags_global \else
486       \expand\everydisableelements
487     \fi
488   \else
489     \c_strc_tags_global\conditionalfalse
490     \resetsystemmode\s!tagging
491     \expand\everydisableelements
492   \fi
493\to \everysetuptagging
494
495\permanent\protected\def\forgettagging
496  {\c_attr_tagged\attributeunsetvalue}
497
498\setuptagging
499  [\c!state=\v!stop,
500   \c!method=\v!auto]
501
502% Cf suggestion by Wolfgang we now have named paragraphs. Watch out, the content
503% is grouped but only when we have an instance.
504%
505% \defineparagraph[red] [color=red]
506% \defineparagraph[bold][style=bold]
507%
508% \startparagraph       \input ward \stopparagraph
509% \startparagraph[red]  \input ward \stopparagraph
510% \startparagraph[bold] \input ward \stopparagraph
511
512\installcorenamespace               {paragraph}
513\installcommandhandler \??paragraph {paragraph} \??paragraph
514
515\setupparagraph % someday maybe also strut (beg/end) and align
516  [\c!color=,
517   \c!style=]
518
519\ifdefined\dotagparagraph \else \aliased\let\dotagparagraph\gobbleoneargument \fi
520
521\permanent\tolerant\protected\def\startparagraph[#S#1]#*[#S#2]%
522  {\endgraf % we end before the group
523   \begingroup
524   \ifarguments
525     \lettonothing\currentparagraph
526   \or
527     \ifhastok={#1}%
528       \lettonothing\currentparagraph
529       \setupcurrentparagraph[#1]
530     \else
531       \cdef\currentparagraph{#1}%
532     \fi
533   \or
534     \cdef\currentparagraph{#1}%
535     \setupcurrentparagraph[#2]%
536   \fi
537   \useparagraphstyleandcolor\c!style\c!color
538   \usealignparameter\paragraphparameter
539   \usesetupsparameter\paragraphparameter
540   \dostarttagged\t!paragraph\currentparagraph
541   \dotagparagraph{\paragraphparameter\c!align}}
542
543\permanent\protected\def\stopparagraph
544  {\dostoptagged
545   \endgraf % we end inside the group
546   \endgroup}
547
548\aliased\let\startpar\startparagraph
549\aliased\let\stoppar \stopparagraph
550
551\def\strc_tags_document_start_indeed
552  {\glet\strc_tags_document_start_indeed\relax
553   \dostarttaggednodetail\t!document
554   \dostarttaggednodetail\t!documentpart} % ua2 demands at least one level more
555
556\def\strc_tags_document_stop_indeed
557  {\glet\strc_tags_document_stop_indeed\relax
558   \dostoptagged
559   \dostoptagged}
560
561\appendtoks
562    \strc_tags_document_start_indeed % here because otherwise products don't get a root (starttext before env)
563\to \everyenableelements
564
565% \appendtoks
566%     \strc_tags_document_start_indeed
567% \to \everystarttext
568
569\appendtoks
570    \strc_tags_document_stop_indeed
571\to \everystoptext
572
573% \doifelseinelement{structure:section}            {yes} {no}
574% \doifelseinelement{structure:chapter}            {yes} {no}
575% \doifelseinelement{division:*-structure:chapter} {yes} {no}
576
577\aliased\let\doifinelementelse\doifelseinelement % define at the lua end
578
579\permanent\protected\def\taggedlabeltexts#1#2#3% experimental: label, numberdetail, numbercontent
580  {\begingroup
581   \dostarttagged\t!label{#1}%
582   \labeltexts{#1}%
583     {\dostoptagged
584      \dostarttagged\t!number{#2}%
585      #3%
586      \dostoptagged
587      \dostarttagged\t!label{#1}}%
588   \dostoptagged
589   \endgroup}
590
591\permanent\protected\def\namedtaggedlabeltexts#1#2#3#4#5% experimental: labeltag label numbertag numberdetail numbercontent
592  {\begingroup
593   \dostarttagged{#1}{#2}%
594   \labeltexts{#2}%
595     {\dostoptagged
596      \dostarttagged{#3}{#4}%
597      #5%
598      \dostoptagged
599      \dostarttagged{#1}{#2}}%
600   \dostoptagged
601   \endgroup}
602
603%D Metadata is added after the following structure element so here we get some as
604%D child of the document root and some as child of the chapter element.
605%D
606%D \settaggedmetadata[title=Hello World!,author=Hans Hagen]
607%D
608%D \starttyping
609%D \starttext
610%D   \startelement[ignore]
611%D     \input tufte
612%D   \stopelement
613%D   \par \input ward \par
614%D   \settaggedmetadata[whatever=Again and Again]
615%D   \startchapter[title=test]
616%D     \input ward
617%D   \stopchapter
618%D \stoptext
619%D \stoptyping
620
621% \settaggedmetadata[#1] % define at the lua end
622
623%D An overload:
624
625\pushoverloadmode
626
627\aliased\let\strc_tagged_saved_bpar\bpar
628\aliased\let\strc_tagged_saved_epar\epar
629
630\enforced\permanent\protected\def\bpar{\dostarttaggednodetail\t!paragraph\strc_tagged_saved_bpar}
631\enforced\permanent\protected\def\epar{\strc_tagged_saved_epar\dostoptagged}
632
633\popoverloadmode
634
635% \permanent\def\untagged{attr \taggedattribute\attributeunsetvalue}
636
637%D Horrible (maybe enable more here):
638
639\def\strc_tags_horrible_start
640  {\ifconditional\c_strc_tags_enabled
641     \strc_tags_enable_indeed
642     \dostarttaggednodetail\t!document
643     \dostarttaggednodetail\t!documentpart
644   \fi}
645
646\def\strc_tags_horrible_stop
647  {\ifconditional\c_strc_tags_enabled
648     \dostoptagged
649     \dostoptagged
650   \fi}
651
652%D A byproduct of some tests:
653%D
654%D \starttyping
655%D \startquotation
656%D     \startsubparagraph test 1\stopsubparagraph
657%D     \startsubparagraph test 2\stopsubparagraph
658%D     \startsubparagraph test 3\stopsubparagraph
659%D \stopquotation
660%D \stoptyping
661
662\newboundary\subparagraphboundary
663
664\permanent\protected\def\startsubparagraph
665  {\removeunwantedspaces
666   \ifnum\lastboundary=\subparagraphboundary
667     \unboundary
668     \par
669   \fi
670   \dostarttagged\t!subparagraph\empty
671   \ignorespaces}
672
673\permanent\protected\def\stopsubparagraph
674  {\removeunwantedspaces
675   \dostoptagged
676   \boundary\subparagraphboundary
677   \ignorespaces}
678
679\permanent\protected\def\subparagraph{\stopsubparagraph\startsubparagraph}
680
681\protect
682