summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tagpdf/tagpdf-attr-code.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/tagpdf/tagpdf-attr-code.sty')
-rw-r--r--macros/latex/contrib/tagpdf/tagpdf-attr-code.sty110
1 files changed, 110 insertions, 0 deletions
diff --git a/macros/latex/contrib/tagpdf/tagpdf-attr-code.sty b/macros/latex/contrib/tagpdf/tagpdf-attr-code.sty
new file mode 100644
index 0000000000..9bb57f2bb3
--- /dev/null
+++ b/macros/latex/contrib/tagpdf/tagpdf-attr-code.sty
@@ -0,0 +1,110 @@
+\ProvidesExplPackage {tagpdf-attr-code} {2019/07/02} {0.61}
+ {part of tagpdf - code related to attributes and attribute classes}
+
+% the obj is written in tagpdf-tree-code.
+
+\seq_new:N \g__uftag_attr_class_used_seq
+\prop_new:N \g__uftag_attr_objnum_prop %will contain obj num of used attributes
+
+\prop_new:N \g__uftag_attr_entries_prop
+\tl_new:N \g__uftag_attr_class_content_tl
+\tl_new:N \l__uftag_attr_objtmp_tl
+\tl_new:N \l__uftag_attr_value_tl
+
+
+\cs_new_protected:Nn \__uftag_attr_new_entry:nn %#1:name, #2: content
+ {
+ \prop_gput:Nnn \g__uftag_attr_entries_prop
+ {#1}{#2}
+ }
+
+\keys_define:nn { uftag / setup }
+ {
+ newattribute .code:n =
+ {
+ \__uftag_attr_new_entry:nn #1
+ }
+ }
+
+
+% the key for the structure:
+\keys_define:nn { uftag / struct }
+{
+ attribute-class .code:n =
+ {
+ \clist_set:No \l_tmpa_clist { #1 }
+ \seq_set_from_clist:NN \l_tmpa_seq \l_tmpa_clist
+ \seq_map_inline:Nn \l_tmpa_seq
+ {
+ \prop_if_in:NnF \g__uftag_attr_entries_prop {##1}
+ {
+ \msg_error:nnn { uftag } { attr-unknown } { ##1 }
+ }
+ \seq_gput_left:Nn\g__uftag_attr_class_used_seq { ##1}
+ }
+ \seq_set_map:NNn \l_tmpb_seq \l_tmpa_seq
+ {
+ /##1
+ }
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 1 }{[}
+ \seq_use:Nn \l_tmpb_seq { \c_space_tl }
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 1 }{]}
+ }
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 0 }
+ {
+ \__uftag_prop_gput:cnx
+ { g__uftag_struct_\int_eval:n {\c@g__uftag_struct_abs_int}_prop }
+ { C }
+ { \l_tmpa_tl }
+ %\prop_show:c { g__uftag_struct_\int_eval:n {\c@g__uftag_struct_abs_int}_prop }
+ }
+ }
+}
+
+\keys_define:nn { uftag / struct }
+ {
+ attribute .code:n = % A property (attribute, value currently a dictionary)
+ {
+ \clist_set:No \l_tmpa_clist { #1 }
+ \seq_set_from_clist:NN \l_tmpa_seq \l_tmpa_clist
+ \tl_set:Nx \l__uftag_attr_value_tl
+ {
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 1 }{[}
+ }
+ \seq_map_inline:Nn \l_tmpa_seq
+ {
+ \prop_if_in:NnF \g__uftag_attr_entries_prop {##1}
+ {
+ \msg_error:nnn { uftag } { attr-unknown } { ##1 }
+ }
+ \prop_if_in:NnF \g__uftag_attr_objnum_prop {##1}
+ {
+ \__uftag_pdfreserveobjnum:N \l_tmpa_tl
+ \__uftag_pdfuseobjnum:Nx \l_tmpa_tl
+ {
+ \prop_item:Nn\g__uftag_attr_entries_prop {##1}
+ }
+ \prop_gput:NnV \g__uftag_attr_objnum_prop {##1} {\l_tmpa_tl}
+ }
+ \tl_put_right:Nx \l__uftag_attr_value_tl
+ {
+ \c_space_tl
+ \prop_item:Nn \g__uftag_attr_objnum_prop {##1}
+ \c_space_tl 0 \c_space_tl R
+ }
+ % \tl_show:N \l__uftag_attr_value_tl
+ }
+ \tl_put_right:Nx \l__uftag_attr_value_tl
+ {
+ \int_compare:nT { \seq_count:N \l_tmpa_seq > 1 }{]}
+ }
+ % \tl_show:N \l__uftag_attr_value_tl
+ \__uftag_prop_gput:cnx
+ { g__uftag_struct_\int_eval:n {\c@g__uftag_struct_abs_int}_prop }
+ { A }
+ { \l__uftag_attr_value_tl }
+ },
+ }
+\endinput