%% hpstatement.sty
%% 2024-01-29
%% Copyright 2004-2024 Martin Hensel
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License version 1.3c
% which is included as lppl-1-3c.txt.
%
% This work has the LPPL maintenance status "maintained".
% The Current Maintainer of this work is Martin Hensel.
%
% ( In order to fight spam, the maintainer's contact      )
% ( information is "encrypted" with ROT13.                )
% ( If you do not know ROT13 yet and have no tool for     )
% ( decryption, simply do an Internet search for "ROT13". )
%
% ,---[ ROT 13 ]---
% | Gur Pheerag Znvagnvare bs guvf jbex vf Znegva Urafry
% |   jub pna or pbagnpgrq ivn
% |     zupurz@ZnegvaUrafry.qr
% |   be ivn znvy
% |     Znegva Urafry
% |     Cbfgfge. 20
% |     09232 Unegznaafqbes
% |     Treznal
% `----------
%
% This work consists of all files listed in manifest.txt.
%
%
\RequirePackage{expl3}
\@ifundefined{NewDocumentCommand}{}{\RequirePackage{xparse}}
\RequirePackage{l3keys2e}
\RequirePackage{iflang}
\ProvidesExplPackage
  {hpstatement}
  {2024/01/29}
  {2.1.0}
  {H and P statements (mhchem bundle)}

\cs_generate_variant:Nn \tl_if_eq:nnT { V }

\msg_new:nnn { hpstatement } { language-not-supported }
  { Language~not~supported. }
\msg_new:nnn { hpstatement } { initial }
  { You~haven't~specified~a~statement~number,~yet. }
\msg_new:nnn { hpstatement } { undefined }
  { H~or~P~statement~"#1"~is~not~defined~for~the~selected~language. }
\msg_new:nnn { hpstatement } { undefined-date }
  { H~or~P~statement~"#1"~is~not~defined~for~the~selected~language~and~date. }
\msg_new:nnn { hpstatement } { undefined-enhancement }
  { This~statement~has~not~been~"translated".~If~you~know~the~language~and~want~to~contibute,~please~contact~the~package~author. }
\msg_new:nnn { hpstatement } { /A }
  { This~statement~has~1~optional~text~argument.~Please~use~\c_backslash_str hpstatement[]\{#1\}~or~\c_backslash_str hpstatement[text]\{#1\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~a~placeholder. }
\msg_new:nnn { hpstatement } { /B }
  { This~statement~needs~1~mandatory~text~argument.~Please~specify~this~with~\c_backslash_str hpstatement[text]\{#1\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~a~placeholder. }
\msg_new:nnn { hpstatement } { /C }
  { This~statement~has~2~variants.~Please~use~\c_backslash_str hpstatement\{#1.1\}~or~\c_backslash_str hpstatement\{#1.2\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~both~variants. }
\msg_new:nnn { hpstatement } { /D }
  { This~statement~has~3~variants.~Please~use~\c_backslash_str hpstatement\{#1.1\}~thru~\c_backslash_str hpstatement\{#1.3\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~all~variants. }
\msg_new:nnn { hpstatement } { /E }
  { This~statement~has~4~variants.~Please~use~\c_backslash_str hpstatement\{#1.1\}~thru~\c_backslash_str hpstatement\{#1.4\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~all~variants. }
\msg_new:nnn { hpstatement } { /F }
  { This~statement~has~6~variants.~Please~use~\c_backslash_str hpstatement\{#1.1\}~thru~\c_backslash_str hpstatement\{#1.6\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~all~variants. }
\msg_new:nnn { hpstatement } { /G }
  { This~statement~has~1~variant~or~1~text~argument.~Please~use~\c_backslash_str hpstatement\{#1.1\}~or~\c_backslash_str hpstatement[text]\{#1\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~a~placeholder. }
\msg_new:nnn { hpstatement } { /H }
{ This~statement~has~2~variants~or~1~text~argument.~Please~use~\c_backslash_str hpstatement\{#1.1\}~or~\c_backslash_str hpstatement\{#1.2\}.~Or~\c_backslash_str hpstatement[text]\{#1\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~placeholders. }
\msg_new:nnn { hpstatement } { /I }
  { This~statement~has~3~variants~or~1~text~argument.~Please~use~\c_backslash_str hpstatement\{#1.1\}~thru~\c_backslash_str hpstatement\{#1.3\}.~Or~\c_backslash_str hpstatement[text]\{#1\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~placeholders. }
\msg_new:nnn { hpstatement } { /J }
  { This~statement~has~multiple~variants.~Use~\c_backslash_str hpstatemen[text]\{#1\}~or~\c_backslash_str hpstatement[text][text]\{#1\}~or~\c_backslash_str hpstatement\{#1.1\}~or~\c_backslash_str hpstatement[text]\{#1.1\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~placeholders.  }
\msg_new:nnn { hpstatement } { /K }
  { This~statement~has~2~variants~with~1~mandatory~text~argument.~Use~\c_backslash_str hpstatemen[text]\{#1.1\}~or~\c_backslash_str hpstatement[text]\{#1.2\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~placeholders. }
\msg_new:nnn { hpstatement } { /L }
    { This~statement~has~2~variants~with~2~mandatory~text~arguments.~Please~use~\c_backslash_str hpstatement[text][text]\{#1.1\}~or~\c_backslash_str hpstatement[text][text]\{#1.2\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~both~variants. }
\msg_new:nnn { hpstatement } { /M }
  { This~statement~has~2~variants~and~1~mandatory~text~argument.~Please~use~\c_backslash_str hpstatement[text]\{#1.1\}~or~\c_backslash_str hpstatement[text]\{#1.2\}.~Or~use~\c_backslash_str hpstatement[text]\{#1.0\}~or~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~both~variants. }
\msg_new:nnn { hpstatement } { /N }
  { This~statement~has~2~variants~with~2~variants.~Please~use~\c_backslash_str hpstatement\{#1.1.1\}~or~\c_backslash_str hpstatement\{#1.1.2\}~or~\c_backslash_str hpstatement\{#1.2.1\}~or~\c_backslash_str hpstatement\{#1.2.2\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~all~variants. }
\msg_new:nnn { hpstatement } { /O }
  { This~statement~has~multiple~variants.~Please~use~\c_backslash_str hpstatement\{#1.1.1\}~or~\c_backslash_str hpstatement\{#1.1.2\}~or~\c_backslash_str hpstatement[text]\{#1.1\}.~Or~\c_backslash_str hpstatement\{#1.2.1\}~or~\c_backslash_str hpstatement\{#1.2.2\}~or~\c_backslash_str hpstatement[text]\{#1.2\}.~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~all~variants. }
\msg_new:nnn { hpstatement } { /P }
  { This~statement~needs~1~mandatory~text~argument.~Please~use~\c_backslash_str hpstatement[text]\{#1\}.~Or~use~\c_backslash_str hpstatement[text]\{#1.nolabel\}~for~a~non-official~version~without~"this label".~Or~use~\c_backslash_str hpstatement\{#1.0\}~for~the~original~form~containing~all~variants. }

%% Settings and variables
\int_new:N \g__mhchem_hp_date_int
\tl_new:N \g__mhchem_hp_rawnumber_tl
\tl_new:N \g__mhchem_hp_number_tl
\tl_new:N \g__mhchem_hp_statement_tl
\tl_new:N \g__mhchem_hp_p_tl  % parameter 1
\tl_new:N \g__mhchem_hp_q_tl  % parameter 2

\int_gset:Nn \g__mhchem_hp_date_int { 99999999 }
\tl_gset:Nn \g__mhchem_hp_number_tl
  { \msg_error:nnn { hpstatement } { initial } }
\tl_gset:Nn \g__mhchem_hp_statement_tl
  { \msg_error:nnn { hpstatement } { initial } }

\keys_define:nn { hpstatement }
  {
    date .code:n = {
      \int_gset:Nn \g__mhchem_hp_date_int
      {
        \tl_range:nnn {#1} { 1 } { 4 }
        \tl_range:nnn {#1} { 6 } { 7 }
        \tl_range:nnn {#1} { 9 } { 10 }
      }
    }
  }
\ProcessKeysPackageOptions { hpstatement }

%% User-level commands
\NewDocumentCommand \hpsetup { m }
  { \keys_set:nn { hpstatement } { #1 }  }
\NewDocumentCommand \hpnumber { o o m }  % #1,#2 optional statement parameters, #3 statement number
  {
    \tl_if_empty:nTF {#3}
      {}
      { \__mhchem_hp_main:nnn {#1} {#2} {#3} }
    \tl_use:N \g__mhchem_hp_number_tl
  }
\NewDocumentCommand \hpstatement { o o m }  % #1,#2 optional statement parameters, #3 statement number
  {
    \tl_if_empty:nF {#3}
      { \__mhchem_hp_main:nnn {#1} {#2} {#3} }
    \tl_use:N \g__mhchem_hp_statement_tl
  }

%% Populates hp@statement and hp@number
\tl_new:N \l__mhchem_hp_argumentsCount_tl
\tl_new:N \l__mhchem_hp_id_tl
\bool_new:N \l__mhchem_hp_idExists_bool
\cs_new:Npn \__mhchem_hp_main:nnn #1#2#3  % #1,#2 statement parameters, #3 statement number
  {
    \tl_gset:Nn \g__mhchem_hp_rawnumber_tl {#3}
    %% determine argumentsCount
    \IfNoValueTF {#1}
      { \tl_set:Nn \l__mhchem_hp_argumentsCount_tl { 0 } }
      {
        \tl_gset:Nn \g__mhchem_hp_p_tl {#1}
        \IfNoValueTF {#2}
          {
            \tl_if_empty:nTF {#1}
              {
                \tl_set:Nn \l__mhchem_hp_argumentsCount_tl { 1empty }
              }
              {
                \tl_set:Nn \l__mhchem_hp_argumentsCount_tl { 1 }
              }
          }
          {
            \tl_set:Nn \l__mhchem_hp_argumentsCount_tl { 2 }
            \tl_gset:Nn \g__mhchem_hp_q_tl {#2}
          }
      }
    %% determine language and load file if needed, more specificly if EUH001 does not exist
    \__mhchem_hp_getLanguage:
    \tl_if_exist:cF
      {
        g__mhchem_hp
        _ \tl_use:N \l__mhchem_hp_language_tl
        _EUH001-0
        _tl
      }
      { \file_input:n { hpstatement.inc/hpstatement- \tl_use:N \l__mhchem_hp_language_tl .inc.sty } }
    %% find value
    \tl_clear:N \g__mhchem_hp_statement_tl
    \bool_set_false:N \l__mhchem_hp_idExists_bool
    \tl_set:Nx \l__mhchem_hp_id_tl
      { g__mhchem_hp_ \tl_use:N \l__mhchem_hp_language_tl _ #3 - \tl_use:N \l__mhchem_hp_argumentsCount_tl _tl }
    %% extract values [**1**], P231.0-0
    \tl_if_exist:cT \l__mhchem_hp_id_tl
      {
        \bool_set_true:N \l__mhchem_hp_idExists_bool
        \tl_gset_eq:Nc \g__mhchem_hp_statement_tl \l__mhchem_hp_id_tl  % -> {number}{\__mhchem_hp_s:nnn ...}
        %%% populate number
        \tl_gset:Nx \g__mhchem_hp_number_tl % first part
          { \tl_head:N \g__mhchem_hp_statement_tl }
        %% populate statement
        \tl_gset:Nx \g__mhchem_hp_statement_tl % second part
          { \tl_tail:N \g__mhchem_hp_statement_tl }
        \tl_gset:Nx \g__mhchem_hp_statement_tl % remove braces
          { \tl_head:N \g__mhchem_hp_statement_tl }
        \tl_gset:Nx \g__mhchem_hp_statement_tl { \g__mhchem_hp_statement_tl } % expand
      }
    %% if not successful yet, find -e
    \tl_if_empty:NT \g__mhchem_hp_statement_tl
      {
        \regex_replace_once:nnN { ([.\-]\d).* } { -e_tl } \l__mhchem_hp_id_tl
        %% extract values [**1**], P231-e
        \tl_if_exist:cT \l__mhchem_hp_id_tl
          {
            \bool_set_true:N \l__mhchem_hp_idExists_bool
            \tl_gset_eq:Nc \g__mhchem_hp_statement_tl \l__mhchem_hp_id_tl  % -> {number}{\__mhchem_hp_s:nnn ...}
            %%% populate number
            \tl_gset:Nx \g__mhchem_hp_number_tl % first part
              { \tl_head:N \g__mhchem_hp_statement_tl }
            %% populate statement
            \tl_gset:Nx \g__mhchem_hp_statement_tl % second part
              { \tl_tail:N \g__mhchem_hp_statement_tl }
            \tl_gset:Nx \g__mhchem_hp_statement_tl % remove braces
              { \tl_head:N \g__mhchem_hp_statement_tl }
            \tl_gset:Nx \g__mhchem_hp_statement_tl { \g__mhchem_hp_statement_tl } % expand
          }
      }
    %% if no match yet, error
    \tl_if_empty:NT \g__mhchem_hp_statement_tl
      {
        \bool_if:NTF  \l__mhchem_hp_idExists_bool
          {
            \tl_gset:Nx \g__mhchem_hp_number_tl
              { \msg_error:nnn { hpstatement } { undefined-date } {#3} }
            \tl_gset:Nx \g__mhchem_hp_statement_tl
              { \msg_error:nnn { hpstatement } { undefined-date } {#3} }
          }
          {
            \tl_gset:Nx \g__mhchem_hp_number_tl
              { \msg_error:nnn { hpstatement } { undefined } {#3} }
            \tl_gset:Nx \g__mhchem_hp_statement_tl
              { \msg_error:nnn { hpstatement } { undefined } {#3} }
          }
      }
  }

\tl_new:N \l__mhchem_hp_language_tl
\cs_new:Npn \__mhchem_hp_getLanguage:
  {
    \IfLanguageName { english    } { \tl_set:Nn \l__mhchem_hp_language_tl { en } } {
    \IfLanguageName { USenglish  } { \tl_set:Nn \l__mhchem_hp_language_tl { en } } {
    \IfLanguageName { american   } { \tl_set:Nn \l__mhchem_hp_language_tl { en } } {
    \IfLanguageName { UKenglish  } { \tl_set:Nn \l__mhchem_hp_language_tl { en } } {
    \IfLanguageName { british    } { \tl_set:Nn \l__mhchem_hp_language_tl { en } } {
    \IfLanguageName { canadian   } { \tl_set:Nn \l__mhchem_hp_language_tl { en } } {
    \IfLanguageName { australian } { \tl_set:Nn \l__mhchem_hp_language_tl { en } } {
    \IfLanguageName { newzealand } { \tl_set:Nn \l__mhchem_hp_language_tl { en } } {
    %
    \IfLanguageName { german     } { \tl_set:Nn \l__mhchem_hp_language_tl { de } } {
    \IfLanguageName { ngerman    } { \tl_set:Nn \l__mhchem_hp_language_tl { de } } {
    \IfLanguageName { germanb    } { \tl_set:Nn \l__mhchem_hp_language_tl { de } } {
    \IfLanguageName { austrian   } { \tl_set:Nn \l__mhchem_hp_language_tl { de } } {
    \IfLanguageName { naustrian  } { \tl_set:Nn \l__mhchem_hp_language_tl { de } } {
    %
    \IfLanguageName { french     } { \tl_set:Nn \l__mhchem_hp_language_tl { fr } } {
    \IfLanguageName { francais   } { \tl_set:Nn \l__mhchem_hp_language_tl { fr } } {
    \IfLanguageName { canadien   } { \tl_set:Nn \l__mhchem_hp_language_tl { fr } } {
    \IfLanguageName { acadian    } { \tl_set:Nn \l__mhchem_hp_language_tl { fr } } {
    %
    \IfLanguageName { bulgarian  } { \tl_set:Nn \l__mhchem_hp_language_tl { bg } } {
    \IfLanguageName { croatian   } { \tl_set:Nn \l__mhchem_hp_language_tl { hr } } {
    \IfLanguageName { czech      } { \tl_set:Nn \l__mhchem_hp_language_tl { cs } } {
    \IfLanguageName { danish     } { \tl_set:Nn \l__mhchem_hp_language_tl { da } } {
    \IfLanguageName { dutch      } { \tl_set:Nn \l__mhchem_hp_language_tl { nl } } {
    \IfLanguageName { estonian   } { \tl_set:Nn \l__mhchem_hp_language_tl { et } } {
    \IfLanguageName { finnish    } { \tl_set:Nn \l__mhchem_hp_language_tl { fi } } {
    \IfLanguageName { greek      } { \tl_set:Nn \l__mhchem_hp_language_tl { el } } {
    \IfLanguageName { polutonikogreek } { \tl_set:Nn \l__mhchem_hp_language_tl { el } } {
    \IfLanguageName { hungarian  } { \tl_set:Nn \l__mhchem_hp_language_tl { hu } } {
    \IfLanguageName { irish      } { \tl_set:Nn \l__mhchem_hp_language_tl { ga } } {
    \IfLanguageName { italian    } { \tl_set:Nn \l__mhchem_hp_language_tl { it } } {
    \IfLanguageName { lithuanian } { \tl_set:Nn \l__mhchem_hp_language_tl { lt } } {
    \IfLanguageName { latvian    } { \tl_set:Nn \l__mhchem_hp_language_tl { lv } } {
    \IfLanguageName { malti      } { \tl_set:Nn \l__mhchem_hp_language_tl { mt } } {
    \IfLanguageName { polish     } { \tl_set:Nn \l__mhchem_hp_language_tl { pl } } {
    \IfLanguageName { portuguese } { \tl_set:Nn \l__mhchem_hp_language_tl { pt } } {
    \IfLanguageName { brazilian  } { \tl_set:Nn \l__mhchem_hp_language_tl { pt } } {
    \IfLanguageName { romanian   } { \tl_set:Nn \l__mhchem_hp_language_tl { ro } } {
    \IfLanguageName { spanish    } { \tl_set:Nn \l__mhchem_hp_language_tl { es } } {
    \IfLanguageName { slovak     } { \tl_set:Nn \l__mhchem_hp_language_tl { sk } } {
    \IfLanguageName { slovene    } { \tl_set:Nn \l__mhchem_hp_language_tl { sl } } {
    \IfLanguageName { swedish    } { \tl_set:Nn \l__mhchem_hp_language_tl { sv } } {
    %
    \msg_error:nn { hpstatement } { language-not-supported }
    }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}
  }

\cs_new:Npn \__mhchem_hp_s:nnn #1#2#3 % #1 date #2 statement #3 else
  {
    \int_compare:nNnTF { \g__mhchem_hp_date_int } < {#1}%
      {#3}
      {#2}
  }