%% See file 'doclicense.dtx' for copyright and license.
\NeedsTeXFormat{LaTeX2e}[1998/12/01]
\ProvidesPackage{doclicense}
    [2020/09/25 v2.2.1 Support for putting documents under a license]

%% ^^A nag warned about the center environment and it really messes up spacing.

%% Parameters (((
\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}
%% )))

\ProcessLocalKeyvalOptions*

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

%% Custom enumerate list with adjusted labels
%% that match the license text conventions
\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},
    }
  }{}
}
\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
  }
}
%% )))

%% Deprecation handling (((
\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.
  }
}{}
%% )))

%% Declare variables (((
\@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}%
}
%% )))

%% User macros (((
\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}
  % }
  }
}
%% )))

%% Language support (((
\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
}{}

%% )))

%% Set license (((
\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'.
