% SPDX-FileCopyrightText: 2015-2022 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}
    [2023/10/01 v3.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{ccicons}{}{\RequirePackage{ccicons}}
    % For \doclicenseIcon
  \@ifpackageloaded{graphicx}{}{\RequirePackage{graphicx}}
    % For \doclicenseImage
  \@ifpackageloaded{hyperref}{}{\RequirePackage{hyperref}}
  \@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 an 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{hyperxmp}{%
    % The following options are only defined when the hyperxmp package was loaded.
    \hypersetup{%
      pdfcopyright  = {\doclicenseLongTextForHyperref},
      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.
    }
  }{%
    \@ifpackageloaded{silence}{%
      \PackageWarning{doclicense}{%
        The silence package was detected. hyperxmp and silence are not% chktex 12
        compatible with each other so doclicense will not load hyperxmp as long
        as you load silence. Therefore the mechanism to add license metadata
        won't work.  Consider to compile the final version of your document
        without silence so that you can benefit from hyperxmp while still being
        able to filter log messages for your draft versions.
      }
      \@ifpackageloaded{hyperxmp}{%
        \PackageError{doclicense}{silence and hyperxmp were manually loaded together}{%
          Error out because those packages together result in an endless loop.
        }%
      }{}
    }{%
      \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}{}
}{%
  \PackageError{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.
  }
}{}

\ifthenelse{%
  \equal{\doclicense@modifier}{}
}{%
  \PackageError{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.
  }
}{}

\ifthenelse{%
  \equal{\doclicense@version}{}
}{%
  \PackageError{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{\doclicenseLongTextForHyperref}{%
  \doclicense@lang@thisDoc\space
  \doclicenseLongType\space"\doclicense@longName"% chktex 18
  \doclicense@lang@word@license.%
}
\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
}{%
  \ifthenelse{\equal{\doclicense@lang}{nil}}{%
    \PackageWarning{doclicense}{%
      The language of your document is not defined. Please refer to the babel or polyglossia
      package to see how to define it. Using English as fallback.
    }
  }{%
    \PackageWarning{doclicense}{%
      No language definition for \doclicense@lang\space
      found.  Consider adding one and submit it to doclicense. 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'.
