% pkgmeta: Package metadata information for LaTeX.
%
% Copyright (C) 2026 Amer Amikhteh
%
% This package is free software: you may redistribute it and/or modify
% it under the terms of the LaTeX Project Public License as published
% by the LaTeX Project, either version 1.3c of the License, or
% (at your option) any later version.
%
% This package is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
%
% The full license text is available at:
% https://www.latex-project.org/lppl/
%
% This work is "maintained" by Amer Amikhteh.
%
% The current maintainer of this work is Amer Amikhteh.
%
% This package consists of the file pkgmeta.sty and the files
% distributed with it.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pkgmeta}
[2026/09/29 v1.0 Package metadata information]

\makeatletter

% ------------------------------------------------------------
% Remove a leading v from a version number
% ------------------------------------------------------------

\def\pmeta@removev#1#2\@end{%
    \ifnum`#1=`v %
        #2%
    \else
        #1#2%
    \fi
}

% ------------------------------------------------------------
% Split a date of the form YYYY/MM/DD
% ------------------------------------------------------------

\def\pmeta@splitdate#1/#2/#3\@end{%
    \def\pmeta@yearvalue{#1}%
    \def\pmeta@monthvalue{#2}%
    \def\pmeta@dayvalue{#3}%
}

% ------------------------------------------------------------
% Read metadata from a file
% ------------------------------------------------------------

\def\pmeta@read#1#2{%
    \begingroup
    \let\NeedsTeXFormat\@gobble
    \let\filename@ext\relax
    \filename@parse{#1}%
    \ifx\filename@ext\relax
        \edef\pmeta@filename{#1.sty}%
    \else
        \edef\pmeta@filename{#1}%
    \fi
    \setbox\@tempboxa=\vbox{%
        \hsize=\maxdimen
        \expandafter\ReadFileInfos\expandafter{\pmeta@filename}%
    }%
    \expandafter\pmeta@select
    \expandafter{\pmeta@filename}{#2}%
    \endgroup
}

% ------------------------------------------------------------
% Select the requested metadata field
% ------------------------------------------------------------

\def\pmeta@select#1#2{%
    \GetFileInfo{#1}%
    \def\pmeta@key{#2}%
    \def\pmeta@defaultkey{default}%
    \def\pmeta@versionkey{version}%
    \def\pmeta@datekey{date}%
    \def\pmeta@yearkey{year}%
    \def\pmeta@monthkey{month}%
    \def\pmeta@daykey{day}%
    \def\pmeta@descriptionkey{description}%
    \ifx\pmeta@key\pmeta@defaultkey
        \filedate\space\fileversion\space\fileinfo%
    \else
        \ifx\pmeta@key\pmeta@versionkey
            \expandafter\pmeta@removev\fileversion\@end%
        \else
            \ifx\pmeta@key\pmeta@datekey
                \filedate%
            \else
                \ifx\pmeta@key\pmeta@descriptionkey
                    \fileinfo%
                \else
                    \expandafter\pmeta@splitdate\filedate\@end%
                    \ifx\pmeta@key\pmeta@yearkey
                        \pmeta@yearvalue%
                    \else
                        \ifx\pmeta@key\pmeta@monthkey
                            \pmeta@monthvalue%
                        \else
                            \ifx\pmeta@key\pmeta@daykey
                                \pmeta@dayvalue%
                            \else
                                unresolved%
                            \fi
                        \fi
                    \fi
                \fi
            \fi
        \fi
    \fi
}

% ------------------------------------------------------------*
% LuaTeX
% ------------------------------------------------------------*

\ifdefined\directlua

    \directlua{pkgmeta = require("pkgmeta")}

    \NewExpandableDocumentCommand{\pkgmeta}{O{default}m}{%
        \directlua{%
            pkgmeta.print(
            "\luaescapestring{#2}",
            "\luaescapestring{#1}"
            )%
        }%
    }

    % ------------------------------------------------------------*
    % XeTeX and other non-Lua engines
    % ------------------------------------------------------------*

\else

    \RequirePackage{readprov}

    \ExplSyntaxOn

    \cs_new:Npn \pmeta_date_year:n #1
    {
        \exp_args:Ne \tl_range:nnn
        { \UseDateOf{#1.sty} }
        { 1 }
        { 4 }
    }

    \cs_new:Npn \pmeta_date_month:n #1
    {
        \exp_args:Ne \tl_range:nnn
        { \UseDateOf{#1.sty} }
        { 6 }
        { 7 }
    }

    \cs_new:Npn \pmeta_date_day:n #1
    {
        \exp_args:Ne \tl_range:nnn
        { \UseDateOf{#1.sty} }
        { 9 }
        { 10 }
    }

    \cs_new:Npn \pmeta_version:n #1
    {
        \exp_args:Ne \pmeta_version_aux:n
        { \UseVersionOf{#1.sty} }
    }

    \cs_new:Npn \pmeta_version_aux:n #1
    {
        \tl_if_head_eq_charcode:nNTF {#1} v
            { \tl_tail:n {#1} }
            { #1 }
    }

    \NewExpandableDocumentCommand{\pkgmeta}{O{default}m}
    {
        \ifcsname ver@#2.sty\endcsname

            \str_case:nnF {#1}
            {
                {date}
                {
                    \UseDateOf{#2.sty}
                }

                {version}
                {
                    \pmeta_version:n {#2}
                }

                {year}
                {
                    \pmeta_date_year:n {#2}
                }

                {month}
                {
                    \pmeta_date_month:n {#2}
                }

                {day}
                {
                    \pmeta_date_day:n {#2}
                }
            }
            {
                \pmeta@read{#2}{#1}
            }

        \else

            \pmeta@read{#2}{#1}

        \fi
    }

    \ExplSyntaxOff

\fi

\makeatother

\endinput
