\RequirePackage{expl3}[2018/06/14]
%\RequirePackage[enable-debug]{expl3}[2018/06/14]
\RequirePackage{xpatch}
\ProvidesExplPackage {tagpdfdocu-patches} {2019/07/02} {0.61}
 {patches/commands for the tagpdf documentation}

% to do : marginnote, perhaps the description macros ...
% to do: footnotes!
% printbibliography?

\newbibmacro*{begentry}{\tagstructbegin{tag=BibEntry}\tagmcbegin{tag=BibEntry}}
\newbibmacro*{finentry}{\finentry\tagmcend\tagstructend}

% hyperref
\@ifpackageloaded{hyperref}{%
\pdfstringdefDisableCommands{
 \let\tagstructbegin\@gobble
 \let\tagmcbegin\@gobble
 \let\tagmcend\relax
 \let\tagstructend\relax
}}{}

%%%%%
% Paragraphs
%%%%%

% we need a command which simply starts a paragraph \TagP^,
% a "continuation" variant which closes the previous paragraph (\TagP),
% and a final end.

\NewDocumentCommand\TagP{t{^}}
 {
  \uftag_mc_if_in:T { \uftag_mc_end: }
  \IfBooleanF{#1}
  {
    \uftag_struct_end:
  }
  \uftag_struct_begin:n{tag=P}
  \uftag_mc_begin:n{tag=P}
 }
% close a mc and one structure

\NewDocumentCommand\TagPend{}
 {
  \uftag_mc_if_in:T { \uftag_mc_end: }
  \uftag_struct_end:
 }


%%%%%
% maketitle
%%%%%
\tagpdfsetup{ add-new-tag=Title/H1 }

%%%%%
% tableofcontents
%%%%%

%Marking the toc entries
%around the whole entry so only structure:
\newcommand\tagscrtocentry[1]{\uftag_struct_begin:n{tag=TOCI}#1\uftag_struct_end:}

%leaf so structure and mc:
\newcommand\tagscrtocpagenumber[1]{%
 \uftag_struct_begin:n{tag=Reference}%
 \uftag_mc_begin:n{tag=Reference}%
 #1%
 \uftag_mc_end:
 \uftag_struct_end:}


\DeclareTOCStyleEntry[
   entryformat=\tagscrtocentry,
   pagenumberformat=\tagscrtocpagenumber]{tocline}{section}
\DeclareTOCStyleEntry[
   entryformat=\tagscrtocentry,
   pagenumberformat=\tagscrtocpagenumber]{tocline}{subsection}
\DeclareTOCStyleEntry[
   entryformat=\tagscrtocentry,
   pagenumberformat=\tagscrtocpagenumber]{tocline}{subsubsection}
\DeclareTOCStyleEntry[
   entryformat=\tagscrtocentry,
   pagenumberformat=\tagscrtocpagenumber]{tocline}{paragraph}



\renewcommand{\addtocentrydefault}[3]{%
 \ifstr{#3}{}{}
   {%\
   \ifstr{#2}{}
    {%
     \addcontentsline{toc}{#1}
      {%
       \protect\nonumberline
       \tagstructbegin{tag=P}%
       \tagmcbegin{tag=P}%
        #3%
       \tagmcend
       \tagstructend
      }%
    }%
    {%
    \addcontentsline{toc}{#1}{%
     \tagstructbegin{tag=Lbl}%
     \tagmcbegin{tag=Lbl}%
     \protect\numberline{#2}%
     \tagmcend\tagstructend
     \tagstructbegin{tag=P}%
     \tagmcbegin{tag=P}%
      #3%
     \tagmcend
     \tagstructend
     }%
    }%
   }}%

% the dots must be marked too

\renewcommand*{\TOCLineLeaderFill}[1][.]{
  \leaders\hbox{$\m@th
    \mkern \@dotsep mu\hbox{\uftag_mc_begin:n{artifact}#1\uftag_mc_end:}\mkern \@dotsep
    mu$}\hfill
}

%%%%%%%%%
% Sectioning commands
%%%%%%%%

\prop_new:N    \g_tag_section_level_prop
\prop_gput:Nnn \g_tag_section_level_prop {section}{H1}
\prop_gput:Nnn \g_tag_section_level_prop {subsection}{H2}
\prop_gput:Nnn \g_tag_section_level_prop {subsubsection}{H3}
\prop_gput:Nnn \g_tag_section_level_prop {paragraph}{H4}



%unnumbered sections level give an empty mc, need to think about it.
\renewcommand{\sectionlinesformat}[4]
 {
  \@hangfrom
   {\hskip #2
    \tagstructbegin{tag=\prop_item:Nn\g_tag_section_level_prop{#1}}
    \tl_if_empty:nF{#3}
    {
     \uftag_mc_begin:n    {tag=\prop_item:Nn\g_tag_section_level_prop{#1}}
     #3
     \uftag_mc_end:
    }
   }
   {\uftag_mc_begin:n    {tag=\prop_item:Nn\g_tag_section_level_prop{#1}}
    #4
    \uftag_mc_end:\tagstructend}%
 }

%minisec is simply P, H6 doesn't work ....
\cs_new:Nn \__uftag_docu_tag_minisec:n
{
  \uftag_struct_begin:n {tag=P}
  \uftag_mc_begin:n{tag=P}
  #1
  \uftag_mc_end:
  \uftag_struct_end:
}

\addtokomafont{minisec}{\__uftag_docu_tag_minisec:n}

\AfterTOCHead{\uftag_struct_begin:n{tag=TOC}}
\AfterStartingTOC{\uftag_struct_end:} %end TOC

%% list

\newcommand\uftag@enit@format@preset[1]{%
  \tagstructbegin{tag=LI}%
  \tagstructbegin{tag=Lbl}%
  \tagmcbegin{tag=Lbl}%
  #1%
  \tagmcend
  \tagstructend %end Lbl
  \tagstructbegin{tag=LBody}}

\newcommand\meti{% end of \item
 \tagstructend %end of LBody
 \tagstructend %end of LI
}

\newcommand\Pmeti{% end of \item
 \TagPend      %end of P
 \tagstructend %end of LBody
 \tagstructend %end of LI
}

\ExplSyntaxOff
\xpatchcmd\enit@preset{\@firstofone}{\uftag@enit@format@preset}{}{\fail}
\ExplSyntaxOn
\setlist{
    before*=\tagstructbegin{tag=L},
    after*={\tagstructend}}

% keys that overwrite \enit@format must be patched, eg like the follow
% the font key should be patched in a similar way
\enitkv@key{}{format}{% new enumitem don't use first argument
  \def\enit@format{%
   \tagstructbegin{tag=LI}%
   \tagstructbegin{tag=Lbl}%
   \tagmcbegin{tag=Lbl}%
   #1\tagmcend}}

 %%% hooks for links
 %%% attention, to get the order right, it is necessary currently to start a new
 %%% mc after a link! I'm not sure if this can/group be included in the hooks
 %%% grouping is a bit tricky ...
\cs_if_exist:NT\hook_put_left:nnn
{
 \hook_put_left:nnn
 { pdf }
 { link_begin_url }
 {
   \uftag_struct_begin:n{tag=Link}
   \uftag_mc_begin:n{tag=Link}
 }
\hook_put:nnnn
 { pdf }
 { link_begin_url_attr }
 { /StructParent }
 { \int_use:N\c@g__uftag_parenttree_obj_int }

\hook_put_right:nnn
 { pdf }
 { link_end_url }
 {
  \__uftag_struct_finish_link:
   \uftag_mc_end:
   \uftag_struct_end:
 }

\hook_put_left:nnn
 { pdf }
 { link_begin_link }
 {
   \uftag_struct_begin:n{tag=Link}
   \uftag_mc_begin:n{tag=Link}
 }
\hook_put:nnnn
 { pdf }
 { link_begin_link_attr }
 { /StructParent }
 { \int_use:N\c@g__uftag_parenttree_obj_int }
\hook_put_right:nnn
 { pdf }
 { link_end_link }
 {
  \__uftag_struct_finish_link:
  \uftag_mc_end:
  \uftag_struct_end:
 }

% "alternative descriptions " for PAX3. How to get better text here??
\hook_put:nnnn
 { pdf }
 { link_begin_url_attr }
 { /Contents }
 { (url) }

\hook_put:nnnn
 { pdf }
 { link_begin_link_attr }
 { /Contents }
 { (ref) }
 }
\endinput
