%  This file is part of pdfpc.
%  Copyright (C) 2023 Evgeny Stambulchik
%
%  This program is free software; you can redistribute it and/or modify
%  it under the terms of the GNU General Public License as published by
%  the Free Software Foundation; either version 3 of the License, or
%  (at your option) any later version.
%
%  This program 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.  See the
%  GNU General Public License for more details.
%
%  You should have received a copy of the GNU General Public License along
%  with this program; if not, write to the Free Software Foundation, Inc.,
%  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
%  -------------------------------------------------------------------------------------------
%
%  Allow for defining some meta data and simple textual notes for use
%  with the pdfpc presentation application <https://pdfpc.github.io>.
%
%  -------------------------------------------------------------------------------------------
%
%  Inspired by Carsten Brandt's <https://github.com/cebe/pdfpc-latex-notes>.
%
%  -------------------------------------------------------------------------------------------
%
%  Please report bugs and other problems as well as suggestions for improvements
%  to the issue tracker at github <https://github.com/pdfpc/pdfpc/>
%
%  -------------------------------------------------------------------------------------------
%
\ProvidesPackage{pdfpc}[2023/10/21 v0.7.1 PDFPC]
\NeedsTeXFormat{LaTeX2e}
%
% Require additional packages needed by \sty{pdfpc}:
\RequirePackage{kvoptions}
\RequirePackage{xstring}
\RequirePackage{iftex}
\RequirePackage{hyperxmp}
\ifLuaTeX
  \RequirePackage{stringenc}
  \RequirePackage{pdftexcmds}
\fi
%
\SetupKeyvalOptions{
  family=PDFPC,
  prefix=PDFPC@
}
%
\DeclareStringOption{duration}
\DeclareStringOption{starttime}
\DeclareStringOption{endtime}
\DeclareStringOption{enduserslide}
\DeclareStringOption{lastminutes}
\DeclareBoolOption{hidenotes}
\DeclareBoolOption{overridenote}
\DeclareStringOption{notesposition}
\DeclareBoolOption[false]{disablemarkdown}
\DeclareStringOption{defaulttransition}
\DeclareDefaultOption{\@unknownoptionerror}
%
\ProcessKeyvalOptions*
%
\ifx\PDFPC@duration\@empty
\else
  \IfInteger{\PDFPC@duration}{}
    {\PackageWarningNoLine{pdfpc}{`duration' should be an integer}}%
\fi
%
\ifx\PDFPC@enduserslide\@empty
\else
  \IfInteger{\PDFPC@enduserslide}{}
    {\PackageWarningNoLine{pdfpc}{`enduserslide' should be an integer}}%
\fi
%
\ifx\PDFPC@lastminutes\@empty
\else
  \IfInteger{\PDFPC@lastminutes}{}
    {\PackageWarningNoLine{pdfpc}{`lastminutes' should be an integer}}%
\fi
%
\ifPDFPC@overridenote
  \renewcommand<>{\note}[2][]{%
    \IfStrEq{#1}{item}%
      % Imitate a bullet
      {\pdfpcnote#3{* #2}}%
      {\pdfpcnote#3{#2}}%
  }%
\fi
%
\def\pdfpc@notespositionauto{auto}%
\ifx\PDFPC@notesposition\@empty%
  \def\PDFPC@notesposition{auto}%
\fi%
%
\def\pdfpcsetup{\kvsetkeys{PDFPC}}%
% Guesswork for beamer/pgfpages notes
\ifx\PDFPC@notesposition\pdfpc@notespositionauto%
  \def\PDFPC@notesposition{none}%
  \def\pdfpc@onepaperheight{\paperheight}%
  \def\pdfpc@twopaperheight{2\paperheight}%
  \def\pdfpc@onepaperwidth{\paperwidth}%
  \def\pdfpc@twopaperwidth{2\paperwidth}%
  \def\pdfpc@pagecenter{\pgfpoint{.5\paperwidth}{.5\paperheight}}%

  \ifx\pgfpageoptiontwoheight\pdfpc@onepaperheight%
    \ifx\pgfpageoptiontwowidth\pdfpc@twopaperwidth%
      \ifx\pgfpageoptionfirstcenter\pdfpc@pagecenter%
        \def\PDFPC@notesposition{right}%
      \else%
        \def\PDFPC@notesposition{left}%
      \fi%
    \fi%
  \fi%
  \ifx\pgfpageoptiontwoheight\pdfpc@twopaperheight%
    \ifx\pgfpageoptiontwowidth\pdfpc@onepaperwidth%
      \ifx\pgfpageoptionfirstcenter\pdfpc@pagecenter%
        \def\PDFPC@notesposition{top}%
      \else%
        \def\PDFPC@notesposition{bottom}%
      \fi%
    \fi%
  \fi%
\fi%
%
% Our schema
\newcommand*{\pdfpc@schema}{%
  \hyxmp@add@to@xml{%
______<rdf:Description xmlns:pdfpc="https://github.com/pdfpc/pdfpc">^^J%
  }%
  \hyxmp@add@simple{pdfpc:Duration}{\PDFPC@duration}%
  \hyxmp@add@simple{pdfpc:StartTime}{\PDFPC@starttime}%
  \hyxmp@add@simple{pdfpc:EndTime}{\PDFPC@endtime}%
  \hyxmp@add@simple{pdfpc:EndUserSlide}{\PDFPC@enduserslide}%
  \hyxmp@add@simple{pdfpc:LastMinutes}{\PDFPC@lastminutes}%
  \hyxmp@add@simple{pdfpc:NotesPosition}{\PDFPC@notesposition}%
  \ifPDFPC@disablemarkdown%
    \hyxmp@add@simple{pdfpc:DisableMarkdown}{true}%
  \else%
    \hyxmp@add@simple{pdfpc:DisableMarkdown}{false}%
  \fi
  \hyxmp@add@simple{pdfpc:DefaultTransition}{\PDFPC@defaulttransition}%
  \hyxmp@add@to@xml{%
______</rdf:Description>^^J%
  }%
}
%
% Piggybacking on the hyperxmp schema...
\let\oldhyxmp@pdf@schema\hyxmp@pdf@schema
\renewcommand{\hyxmp@pdf@schema}{{\oldhyxmp@pdf@schema}{\pdfpc@schema}}
%
% Note command
\ifPDFPC@hidenotes%
  \newcommand<>{\pdfpcnote}[1]{}%
\else%
  \ifXeTeX%
    \newcommand<>{\pdfpcnote}[1]{%
      \only#2{%
        \edef\\{\string\n}%
        \special{pdf: ann width 0pt height 0pt depth 0pt%
           <<%
             /Subtype /Text%
             /Contents (#1)%
             /F 6%
           >>%
        }%
      }%
      \relax%
    }%
  \else%
    \ifLuaTeX%
      \protected\def\pdfannot {\pdfextension annot }%
      \newcommand<>{\pdfpcnote}[1]{%
        \only#2{%
          \edef\tmp@a{\pdf@escapehexnative{#1}}
          \expandafter\SE@ConvertFrom\expandafter\tmp@a\expandafter{\tmp@a}{utf8}
          {%
            \edef\\{\string\n}%
            \pdfannot width 0pt height 0pt depth 0pt {%
               /Subtype /Text%
               /Contents <FEFF\tmp@a>%
               /F 6%
            }%
          }%
        }%
        \relax%
      }%
    \else%
      \newcommand<>{\pdfpcnote}[1]{%
        \only#2{%
          \edef\\{\string\n}%
          \pdfannot width 0pt height 0pt depth 0pt {%
             /Subtype /Text%
             /Contents (#1)%
             /F 6%
          }%
        }%
        \relax%
      }%
    \fi%
  \fi%
\fi%
%
\endinput