% SPDX-FileCopyrightText: 2015-2021 Robin Schneider <ypid@riseup.net>
%
% SPDX-License-Identifier: LPPL-1.3c
%
% This work consists of all files listed in manifest.txt.
% For more details about the licensing, refer to the README.md file.
% If you don't have those files, you can find them at: https://ctan.org/pkg/doclicense

\NeedsTeXFormat{LaTeX2e}[1998/12/01]
\ProvidesPackage{doclicense}
    [2021/03/13 v2.3.0 Support for putting documents under a license]


\RequirePackage{kvoptions}
\DeclareStringOption{type}
\DeclareStringOption{modifier}
\DeclareStringOption{version}
\DeclareStringOption{lang}
\DeclareStringOption[-88x31]{imagemodifier}% chktex 29
\DeclareStringOption[right]{imageposition}
\DeclareStringOption[10em]{imagewidth}
\DeclareStringOption[2em]{imagedistance}
\DeclareStringOption{hyphenation}
\DeclareBoolOption[true]{hyperxmp}

\ProcessLocalKeyvalOptions*

\RequirePackage{xifthen}
\RequirePackage{xstring}
\RequirePackage{etoolbox} % \ifcsdef
\RequirePackage{xspace}
\RequirePackage{verbatim}

\newenvironment{doclicense@enumerate}{%
  \begin{enumerate}
    \renewcommand{\labelenumi}{(\alph{enumi})}%
    \renewcommand{\labelenumii}{(\arabic{enumii})}%
    \renewcommand{\labelenumiii}{(\Alph{enumiii})}%
    \renewcommand{\labelenumiv}{(\roman{enumiv})}%
}{\end{enumerate}}

\ifthenelse{
  \equal{\doclicense@hyphenation}{}
}{}{%
  \RequirePackage{ragged2e}

  \ifthenelse{\isnamedefined{\doclicense@hyphenation}}{}{%
    \PackageError{doclicense}{Hyphenation macro not defined}
      {The macro name given via the hyphenation option is not defined.}%
  }
}
\AtEndPreamble{%
  \@ifpackageloaded{csquotes}{
    % csquotes has already been loaded so we are fine.
  }{
    \ifcsdef{enquote}{
      % \enquote is defined but not by csquotes.
      \@ifpackageloaded{biblatex}{
        \PackageError{doclicense}{The enquote macro is defined by biblatex}
          {This package assumes that the enquote macro is defined by the
            csquotes package. Please load csquotes before you load biblatex so
            that biblatex does not define enquote instead.}%
      }{
        \PackageError{doclicense}{The enquote macro is defined by unknown package}
          {This package assumes that the enquote macro is defined by the
            csquotes package. Please check why enquote is defined without
            csquotes being loaded. Maybe try loading csquotes early so that it
            can define the enquote macro instead.}%
      }
    }{
      \RequirePackage{csquotes}
    }
  }
  \@ifpackageloaded{ccicons}{}{\RequirePackage{ccicons}}
    % For \doclicenseIcon
  \@ifpackageloaded{graphicx}{}{\RequirePackage{graphicx}}
    % For \doclicenseImage
  \@ifpackageloaded{hyperref}{}{\RequirePackage{hyperref}}
  \@ifpackageloaded{hyperxmp}{
    % The following options are only defined when the hyperxmp package was loaded.
    \hypersetup{
      pdfcopyright  = {\doclicenseLongText},
      pdflicenseurl = {\doclicenseURL},
    }
  }{}
}
\ifdoclicense@hyperxmp
  \@ifpackageloaded{pdfx}{%
    \PackageWarning{doclicense}{%
    The pdfx package was detected. Therefore the mechanism to add license
    metadata won't work. Ensure to setup \string\Copyright\space and
    corresponding settings to your xmpdata-file.
  }
  }{
    \IfFileExists{hyperxmp.sty}{
      \@ifpackageloaded{hyperxmp}{}{\RequirePackage{hyperxmp}}
    }{
      \PackageWarning{doclicense}{%
        The hyperxmp package is missing so no license metadata can be embedded
        into the PDF. Consider installing hyperxmp.% chktex 13
      }
    }
  }
\fi

\ifthenelse{
  \equal{\doclicense@type}{}
}{
  \PackageWarning{doclicense}{%
    "type" package option missing. % chktex 18
    This option is now required and the fallback to "CC" is deprecated. % chktex 18
    In an upcoming major version of doclicense, this will be a package error.
    Please explicitly pick a license of your choosing.
  }
  \renewcommand{\doclicense@type}{CC}
}{}

\ifthenelse{
  \equal{\doclicense@modifier}{}
}{
  \PackageWarning{doclicense}{%
    "modifier" package option missing. % chktex 18
    This option is now required and the fallback to "by-sa" is deprecated. % chktex 18
    In an upcoming major version of doclicense, this will be a package error.
    Please explicitly pick a license of your choosing.
  }
  \renewcommand{\doclicense@modifier}{by-sa}
}{}

\ifthenelse{
  \equal{\doclicense@version}{}
}{
  \PackageWarning{doclicense}{%
    "version" package option missing. % chktex 18
    This option is now required and the fallback is deprecated. % chktex 18
    In an upcoming major version of doclicense, this will be a package error.
    Please explicitly pick a license of your choosing.
  }
}{}

\@namedef{doclicense@lang@lic@CC}{Creative Commons}%
\newcommand{\doclicense@baseUrlCC}{https://creativecommons.org}
\newcommand{\doclicense@versionFallback}{}
\newcommand{\doclicense@versionUsed}{}
\newboolean{doclicense@licenseKnown}
\newlength{\doclicense@hsize}
\newcommand{\doclicense@longName}{%
  \@nameuse{doclicense@lang@lic@\doclicense@type @\doclicense@modifier%
    @\doclicense@versionUsed}%
}
\newcommand{\doclicense@icon}{%
  \PackageError{doclicense}{Icon not defined}
    {Please check the manual of doclicense to see what you can do about it.}%
}
\newcommand{\doclicense@modifier@uppercase}{\texorpdfstring{%
    \MakeUppercase{\doclicense@modifier}%
  }{%
    \doclicense@modifier}%
}

\newcommand{\doclicenseType}{\doclicense@type\xspace}
\newcommand{\doclicenseLongType}{}
\newcommand{\doclicenseModifier}{\doclicense@modifier@uppercase\xspace}
\newcommand{\doclicenseVersion}{\doclicense@versionUsed\xspace}
\newcommand{\doclicenseName}{%
  \doclicense@type\nobreakspace\doclicense@modifier@uppercase\nobreakspace%
  \doclicense@versionUsed\xspace%
}
\newcommand{\doclicenseNameRef}{\href{\doclicenseURL}{\doclicenseName}\xspace}
\newcommand{\doclicenseLongName}{\doclicenseLongType\space%
  \doclicense@longName\xspace}
\newcommand{\doclicenseLongNameRef}{\href{\doclicenseURL}{\doclicenseLongName}}
\newcommand{\doclicenseText}{%
  \doclicense@lang@thisDoc\space
  \href{\doclicenseURL}{\enquote{\doclicenseName{}}}%
  \doclicense@lang@word@license.\xspace%
}
\newcommand{\doclicenseLongText}{%
  \doclicense@lang@thisDoc\space
  \href{\doclicenseURL}{\doclicenseLongType\space\enquote{\doclicense@longName}}%
  \doclicense@lang@word@license.\xspace%
}
\newcommand{\doclicenseIcon}{\doclicense@icon\xspace}
\newcommand{\doclicenseTypeIcon}{\doclicenseType}
\newcommand{\doclicenseImageFileName}{%
  doclicense-\doclicense@type-\doclicense@modifier\doclicense@imagemodifier}
\newcommand{\doclicenseImage}[1][]{%
  \setkeys{doclicense}{#1}
  \href{\doclicenseURL}{%
    \includegraphics[
      width=\doclicense@imagewidth%
    ]{\doclicenseImageFileName}%
  }
}
\newcommand{\doclicensePlainFullTextFileName}{%
  doclicense-\doclicense@type-\doclicense@modifier%
  -\doclicense@versionUsed-plaintext%
}
\newcommand{\doclicensePlainFullText}{%
  \verbatiminput{\doclicensePlainFullTextFileName}
}
\newcommand{\doclicenseFullTextFileName}{%
  doclicense-\doclicense@type-\doclicense@modifier-\doclicense@versionUsed-latex}
\newcommand{\doclicenseFullText}{\input{\doclicenseFullTextFileName}}% chktex 27

\newcommand{\doclicenseLicense}{\doclicenseThis} % legacy support
\newcommand{\doclicenseThis}{%
  \setlength{\doclicense@hsize}{\linewidth-\doclicense@imagewidth-\doclicense@imagedistance}%
  \ifthenelse{\equal{\doclicense@imageposition}{left}}{%
    \begin{center}
      \begin{minipage}{\doclicense@imagewidth}
        \doclicenseImage%
      \end{minipage}
      \hfill
      \begin{minipage}{\doclicense@hsize}
        \ifthenelse{\isempty{\doclicense@hyphenation}}{}{%
          \@nameuse{\doclicense@hyphenation}%
        }%
        \doclicenseLongText%
      \end{minipage}
    \end{center}
  }{%
  % \ifthenelse{\isnamedefined{iflandscape}}{%
  %   \iflandscape{%
  %     \setlength{\doclicense@hsize}{\doclicense@hsize-10em}%
  %   }{}%
  % }{}%
  % {%
    \begin{center}
      \begin{minipage}{\doclicense@hsize}
        \ifthenelse{\isempty{\doclicense@hyphenation}}{}{%
          \@nameuse{\doclicense@hyphenation}%
        }%
        \doclicenseLongText%
      \end{minipage}
      \hfill
      \begin{minipage}{\doclicense@imagewidth}
        \doclicenseImage%
      \end{minipage}
    \end{center}
  % }
  }
}

\ifthenelse{\equal{\doclicense@lang}{}}{%
  \renewcommand{\doclicense@lang}{\languagename}}{}
\IfFileExists{doclicense-\doclicense@lang.ldf}{%
  \input{doclicense-\doclicense@lang.ldf}% chktex 27
}{%
  \PackageWarning{doclicense}{%
    No language definition for \doclicense@lang found.
    Please add one and submit a patch. Using English as fallback.
  }
  \renewcommand{\doclicense@lang}{english}
  \input{doclicense-\doclicense@lang.ldf}% chktex 27
}
\ifthenelse{\equal{\doclicense@imagemodifier}{-us}}{%
  \@namedef{doclicense@imagemodifier}{-88x31}% chktex 29
}{}


\newcommand{\doclicense@setVersion}[1][]{%
  \ifthenelse{\equal{#1}{}}{}{%
    \renewcommand{\doclicense@versionFallback}{#1}
  }
  \ifthenelse{\equal{\doclicense@version}{}}{%
    \renewcommand{\doclicense@versionUsed}{\doclicense@versionFallback}
  }{%
    \renewcommand{\doclicense@versionUsed}{\doclicense@version}
  }
}
\newcommand{\doclicense@set}{%
  % CC (((
  \ifthenelse{\equal{\doclicense@type}{CC}}{%
    \renewcommand{\doclicenseLongType}{\doclicense@lang@lic@CC\xspace}
    \renewcommand{\doclicenseTypeIcon}{\ccLogo\xspace}

    \doclicense@setVersion[3.0]

    % Allow to predefine the following macros in ldf files.
    \ifcsdef{doclicense@UrlLangPart}{}{%
      \ifthenelse{\equal{\doclicense@lang@lic@CC@code}{}}{%
        \edef\doclicense@UrlLangPart{}
      }{%
        \edef\doclicense@UrlLangPart{/deed.\doclicense@lang@lic@CC@code}
      }
    }
    \ifcsdef{doclicenseURL}{}{%
      \edef\doclicenseURL{%
        \doclicense@baseUrlCC/%
        licenses/%
        \doclicense@modifier/%
        \doclicense@versionUsed\doclicense@UrlLangPart%
      }
    }
    \ifthenelse{\equal{\doclicense@modifier}{by}}{%
      \renewcommand{\doclicense@icon}{\ccby}
    }{}
    \ifthenelse{\equal{\doclicense@modifier}{by-sa}}{%
      \renewcommand{\doclicense@icon}{\ccbysa}
    }{}
    \ifthenelse{\equal{\doclicense@modifier}{by-nd}}{%
      \renewcommand{\doclicense@icon}{\ccbynd}
    }{}
    \ifthenelse{\equal{\doclicense@modifier}{by-nc}}{%
      \renewcommand{\doclicense@icon}{\ccbync}
      \IfBeginWith{\doclicense@imagemodifier}{-eu}{%
        \renewcommand{\doclicense@icon}{\ccbynceu}
      }{}
      \IfBeginWith{\doclicense@imagemodifier}{-jp}{%
        \renewcommand{\doclicense@icon}{\ccbyncjp}
        \renewcommand{\doclicense@imagemodifier}{-88x31}% chktex 29
      }{}
    }{}
    \ifthenelse{\equal{\doclicense@modifier}{by-nc-sa}}{
      \renewcommand{\doclicense@icon}{\ccbyncsa}
      \IfBeginWith{\doclicense@imagemodifier}{-eu}{%
        \renewcommand{\doclicense@icon}{\ccbyncsaeu}
      }{}
      \IfBeginWith{\doclicense@imagemodifier}{-jp}{%
        \renewcommand{\doclicense@icon}{\ccbyncsajp}
        \renewcommand{\doclicense@imagemodifier}{-88x31}% chktex 29
      }{}
    }{}
    \ifthenelse{\equal{\doclicense@modifier}{by-nc-nd}}{
      \renewcommand{\doclicense@icon}{\ccbyncnd}
      \IfBeginWith{\doclicense@imagemodifier}{-jp}{%
        \renewcommand{\doclicense@icon}{\ccbyncndjp}
        \renewcommand{\doclicense@imagemodifier}{-88x31}% chktex 29
      }{}
    }{}
    \ifthenelse{\equal{\doclicense@modifier}{zero}}{%
      \renewcommand{\doclicense@icon}{\cczero}
      \doclicense@setVersion[1.0]
      \edef\doclicenseURL{%
        \doclicense@baseUrlCC/%
        publicdomain/%
        \doclicense@modifier/%
        \doclicense@versionUsed\doclicense@UrlLangPart}
    }{}
    \ifthenelse{\equal{\doclicense@modifier}{pd}}{
      \PackageError{doclicense}{CC PD license removed as of version 2.0.0}{
        Creative Commons PD has been replaced by CC-zero.
        Please update your license choice.
      }%
    }{}
    \IfSubStr{\doclicense@modifier}{nc}{}{
      % eu (Euro) does only exist for nc (non commercial) so if not nc then reset -eu.
      \IfBeginWith{\doclicense@imagemodifier}{-eu}{%
        \renewcommand{\doclicense@imagemodifier}{-88x31}% chktex 29
      }{}
    }
    \ifthenelse{\equal{\doclicense@imagemodifier}{-eu}}{%
      \renewcommand{\doclicense@imagemodifier}{-eu-88x31}% chktex 29
    }{}

    \ifcsdef{doclicense@lang@lic@\doclicense@type%
      @\doclicense@modifier @\doclicense@versionUsed}{}{%

      \PackageError{doclicense}{License long name not defined}{%
        Please check the manual of doclicense
        to see what you can do about it.%
      }%
    }

    \setboolean{doclicense@licenseKnown}{true}
  }{}% )))
  \ifthenelse{\not\boolean{doclicense@licenseKnown}}{%
    \PackageError{doclicense}{License unknown}{%
      Please check the manual of doclicense
      to see what you can do about it.%
    }%
  }{}%
}

\doclicense@set%
\endinput
%%
%% End of file `doclicense.sty'.
