\ProvidesExplPackage {tagpdf-mc-code-lua} {2019/07/02} {0.61}
  {tagpdf - mc code only for the luamode }

% the two attibutes are defined in the driver file.
% it also load the lua (as it can also contain functions needed by generic mode.
% (new) attributes for mc are local:
% \newattribute \l__uftag_mc_type_attr     %the value represent the type
% \newattribute \l__uftag_mc_cnt_attr      %will hold the \c@g__uftag_MCID_abs_int value


% An attribute for the current structure probably doesn't make sense as mc chunks can be used later.
% \newattribute \g__uftag_struct_type_attr %represent the current structure type. Not sure if needed
% \newattribute \g__uftag_struct_cnt_attr  %will hold \c@g__uftag_struct_abs_int a cnt

% handling attribute needs a different system to number the page wise mcid's:
% a tagmcbegin ... tagmcend pair no longer surrounds exactly one mc chunk: it can be split
% at page breaks. We know the included mcid(s) only after the ship out. So for the struct-> mcid mapping we
% need to record struct -> mc-cnt (in \g__uftag_mc_parenttree_prop and/or a lua table
% and at shipout mc-cnt-> {mcid, mcid, ...} (in a table?)
% and when building the trees connect both

% key definitions are overwritten for luatex to store that data in tables
% the data for the mc are in uftag.mc[absnum]
% the fields of the table are
% tag : the type (a string)
% raw : more properties (string)
% label: a string. Do we need a way to retrieve the num from the label from lua??
% artifact: the presence indicates an artifact, the value (string) is the type.
% kids: a array of tables {1={kid=num2,page=pagenum1}, 2={kid=num2,page=pagenum2},...},
% this describes the chunks the mc has been split to by the traversing code
% parent: the number of the structure it is in. Needed to build the parent tree.

% The main function which wanders through the shipout box to inject the literals.
\AtBeginDocument
 {
  \bool_if:NT\g_uftag_active_mc_bool
   {
    \AtBeginShipout
     {
      \directlua{uftag.func.mark_shipout ()}
     }
   }
 }

\prg_new_conditional:Nnn \__uftag_mc_if_in: {p,T,F,TF}
 {
  \int_compare:nNnTF {-2147483647}={\l__uftag_mc_type_attr}
   { \prg_return_true:  }
   { \prg_return_false: }
 }

\prg_new_eq_conditional:NNn \uftag_mc_if_in: \__uftag_mc_if_in: {p,T,F,TF}

% the keys
\tl_new:N \l__uftag_mc_key_tag_tl
\tl_new:N \l__uftag_mc_key_label_tl
\tl_new:N \l__uftag_mc_key_properties_tl

\keys_define:nn { uftag / mc }
 {
  tag .code:n = %
   {%%????????? \pdfescapename??
    \tl_set:Nx  \l__uftag_mc_key_tag_tl { #1 }
    \directlua
     {
      uftag.func.store_mc_data(\__uftag_get_mc_abs_cnt:,"tag","#1")
     }
   },
  raw .code:n =
   {
    \tl_put_right:Nx \l__uftag_mc_key_properties_tl { #1 }
    \directlua
     {
      uftag.func.store_mc_data(\__uftag_get_mc_abs_cnt:,"raw","#1")
     }
   },
  alttext .code:n      = % Alt property
   {
    \str_set_convert:Nnon
     \l__uftag_tmpa_str
     { #1 }
     { \g__uftag_inputencoding_tl }
     { utf16/hex }
    \tl_put_right:Nn \l__uftag_mc_key_properties_tl { /Alt~< }
    \tl_put_right:No \l__uftag_mc_key_properties_tl { \l__uftag_tmpa_str>~ }
    \directlua
     {
      uftag.func.store_mc_data(\__uftag_get_mc_abs_cnt:,"alt","/Alt~<\str_use:N \l__uftag_tmpa_str>")
     }
   },
  alttext-o .code:n      = % Alt property
   {
    \str_set_convert:Noon
     \l__uftag_tmpa_str
     { #1 }
     { \g__uftag_inputencoding_tl }
     { utf16/hex }
    \tl_put_right:Nn \l__uftag_mc_key_properties_tl { /Alt~< }
    \tl_put_right:No \l__uftag_mc_key_properties_tl { \l__uftag_tmpa_str>~ }
    \directlua
     {
      uftag.func.store_mc_data(\__uftag_get_mc_abs_cnt:,"alt","/Alt~<\str_use:N \l__uftag_tmpa_str>")
     }
   },
  actualtext .code:n      = % Alt property
   {
    \str_set_convert:Nnon
     \l__uftag_tmpa_str
     { #1 }
     { \g__uftag_inputencoding_tl }
     { utf16/hex }
    \tl_put_right:Nn \l__uftag_mc_key_properties_tl { /Alt~< }
    \tl_put_right:No \l__uftag_mc_key_properties_tl { \l__uftag_tmpa_str>~ }
    \directlua
     {
      uftag.func.store_mc_data(\__uftag_get_mc_abs_cnt:,"actualtext","/ActualText~<\str_use:N \l__uftag_tmpa_str>")
     }
   },
  actualtext-o .code:n      = % Alt property
   {
    \str_set_convert:Noon
     \l__uftag_tmpa_str
     { #1 }
     { \g__uftag_inputencoding_tl }
     { utf16/hex }
    \tl_put_right:Nn \l__uftag_mc_key_properties_tl { /Alt~< }
    \tl_put_right:No \l__uftag_mc_key_properties_tl { \l__uftag_tmpa_str>~ }
    \directlua
     {
      uftag.func.store_mc_data(\__uftag_get_mc_abs_cnt:,"actualtext","/ActualText~<\str_use:N \l__uftag_tmpa_str>")
     }
   },
  label .code:n =
   {
    \tl_set:Nn\l__uftag_mc_key_label_tl { #1 }
    \directlua {uftag.func.store_mc_data(\__uftag_get_mc_abs_cnt:,"label","#1")}
   },
  __artifact-store .code:n =
   {
    \directlua {uftag.func.store_mc_data(\__uftag_get_mc_abs_cnt:,"artifact","#1")}
   },
  artifact .code:n       =
    {
     \exp_args:Nnx \keys_set:nn {uftag / mc} { artifact-bool, artifact-type=#1, tag=Artifact }
     \exp_args:Nnx \keys_set:nn {uftag / mc }{ __artifact-store=\l__uftag_mc_artifact_type_tl }
    },
  artifact .default:n    = { notype }
 }


% attributes
% set the mc from a tag name

\cs_set_protected:Npn \__uftag_attribute_gset:Nn #1 #2
 {
  \tex_global:D \setattribute #1 #2
 }

\cs_set_protected:Npn \__uftag_attribute_set:Nn #1 #2
 {
  \setattribute #1 #2
 }

\cs_set_protected:Npn \__uftag_attribute_gunset:N #1
 {
  \tex_global:D \unsetattribute #1
 }

\cs_set_protected:Npn \__uftag_attribute_unset:N #1
 {
   \unsetattribute #1
 }


\cs_new:Nn \__uftag_mc_lua_set_mc_type_attr:n % #1 is a tag name
 {
  \__uftag_attribute_set:Nn \l__uftag_mc_type_attr { \directlua {uftag.func.output_num_from ("#1") } }
  \__uftag_attribute_set:Nn \l__uftag_mc_cnt_attr  { \__uftag_get_mc_abs_cnt: }
 }

\cs_generate_variant:Nn\__uftag_mc_lua_set_mc_type_attr:n { o }

\cs_new:Nn \__uftag_mc_lua_unset_mc_type_attr:
 {
  \__uftag_attribute_unset:N \l__uftag_mc_type_attr
  \__uftag_attribute_unset:N \l__uftag_mc_cnt_attr
 }



%This command will in the finish code replace the dummy for a mc by the real mcid kids
%we need a variant for the case that it is the only kid, to get the array right
\cs_new:Nn \__uftag_mc_insert_mcid_kids:n
 {
  \directlua {uftag.func.mc_insert_kids (#1,0) }
 }

\cs_new:Nn \__uftag_mc_insert_mcid_single_kids:n
 {
  \directlua {uftag.func.mc_insert_kids (#1,1) }
 }


% we need to pass the info if the kids are alone or already in an array
% so we add a second argument, which should == 1 if the kids are single


% puts an mcid absolute number in the current structure
\cs_new:Nn \__uftag_mc_handle_stash:n %1 mcidnum
 {
  \__uftag_check_mc_used:n { #1 }
  \seq_gput_right:cn % Don't fill a lua table due to the command in the item, so the kernel command
   { g__uftag_struct_kids_\g__uftag_struct_stack_current_tl _seq }
   {
    \__uftag_mc_insert_mcid_kids:n {#1}%
   }
  \directlua
   {
    uftag.func.store_struct_mcabs(\g__uftag_struct_stack_current_tl,#1)
   }
  \prop_gput:Nxx
   \g__uftag_mc_parenttree_prop
   { #1 }
   { \g__uftag_struct_stack_current_tl }
 }

\cs_generate_variant:Nn \__uftag_mc_handle_stash:n { o }

\cs_new_protected:Nn \uftag_mc_begin:n
 {
   %\group_begin:
   %\__uftag_check_mc_if_nested:
   %\bool_gset_true:N \g__uftag_in_mc_bool
   \int_gincr:N \c@g__uftag_MCID_abs_int
   \tl_clear:N\l__uftag_mc_key_properties_tl
   \keys_set:nn { uftag / mc }{ label={}, #1 }
   %check that a tag or artifact has been used
   \__uftag_check_mc_tag:N \l__uftag_mc_key_tag_tl
   %set the attributes:
   \__uftag_mc_lua_set_mc_type_attr:o  { \l__uftag_mc_key_tag_tl }
   \bool_if:NF \l__uftag_mc_artifact_bool
    { % store the absolute num name in a label:
      \tl_if_empty:NF {\l__uftag_mc_key_label_tl}
       {
        \__uftag_mc_handle_mc_label:n { \l__uftag_mc_key_label_tl }
       }
      % if not stashed record the absolute number
      \bool_if:NF \l__uftag_mc_key_stash_bool
      {
        \exp_args:Nx \__uftag_mc_handle_stash:n { \__uftag_get_mc_abs_cnt: }
      }
    }
   \bool_set_false:N\l__uftag_mc_artifact_bool
  %\group_end:
 }

\cs_new_protected:Nn \uftag_mc_end:
 {
  %\__uftag_check_mc_if_open:
  %\bool_gset_false:N \g__uftag_in_mc_bool
  \__uftag_mc_lua_unset_mc_type_attr:
  \tl_set:Nn  \l__uftag_mc_key_tag_tl { }
 }

\cs_new_protected:Nn \uftag_mc_use:n %#1: label name
 {
  \tl_set:Nx  \l_tmpa_tl { \zref@extractdefault{tagpdf-#1}{tagmcabs}{} }
  \tl_if_empty:NTF\l_tmpa_tl
   {
    \msg_warning:nnn {uftag} {mc-label-unknown} { #1 }
   }
   {
    \__uftag_mc_handle_stash:o { \l_tmpa_tl }
   }
 }

\cs_new:Nn \__uftag_get_data_mc_tag: { \l__uftag_mc_key_tag_tl }


\endinput
