%% Copyright 2016-… Maïeul Rouquette
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this work is Maïeul Rouquette
% This work consists of the files claves.dbx, claves.bbx
% 0. Preamble

\ProvidesFile{claves.dbx}[2017/04/09 v1.2.0 biblatex bibliography style (MR)]

\ifdef{\biblatexmultipledm@bibstyle}
	{\RequireBibliographyStyle{\biblatexmultipledm@bibstyle}}
	{\RequireBibliographyStyle{verbose}}


\RequirePackage{xpatch}

% 1. Tools to declare new clavis
\newcommand{\AddBiblatexClavis}[1]{%
  \appto\biblatex@claves{#1,}%
  \DeclareStyleSourcemap{%
  	\maps[datatype=bibtex]{%
  		\map[overwrite]{%
  			\step[fieldsource=#1,final]%
  			\step[fieldset=claves,fieldvalue={\string\multiclavesseparator\space\string\clavisformat{#1}\string\clavisseparator{}},append]%
  			\step[fieldset=claves,origfieldval, append]
  			}%
			\map[overwrite]{%
  			 \step[fieldsource=entrykey,match=\regexp{^#1$},final]
				 \step[fieldset=claves_definition, origfieldval]
  			}%
    }%
  }%
}

% 2. Format
\newcommand{\multiclavesseparator}{\addsemicolon\ifpunct{\addspace}{}}
\newcommand{\clavisseparator}{\addspace}
\DeclareFieldFormat{claves}{\mkbibparens{#1}}
\DeclareFieldFormat{claves_definition}{\clavisformat{#1}}
\newcommand{\clavisformat}[1]{#1}

% 3. Patching macro standard to add claves

\newcommand{\@biblatex@claves@bibmacronotpatched}[1]{%
  \PackageError{biblatex-claves}{Fail when patching `#1' bibmacro}%
}%

\xpatchbibmacro{title}
  {\newunit}
  {\usebibmacro{claves}}
  {}
  {\@biblatex@claves@bibmacronotpatched{title}}
  
\newbibmacro{claves}{%
	\iffieldundef{claves}%
	  {}%
	  {
	  \nopunct%
		\setunit{\addspace}%
		\printfield{claves}
		}%
	\newunit%
}

%4. List of claves

\newcommand{\citeallclaves}{\nocite{\biblatex@claves}}

\newcommand{\@biblatex@claves@bibdrivernotpatched}[1]{%
  \PackageError{biblatex-claves}{Fail when patching `#1' bibdriver}%
}%

\newcommand{\clavesadddashinset}{%
  \xpatchbibdriver{set}
    {\booltrue{bbx@inset}}
    {}%
    {}%
    {\@biblatex@claves@bibdrivernotpatched{claves}}%
}
\defbibenvironment{claves}%Inspired from shorthand environment
  {\list
     {\printtext[claves_definition]{\printfield[labelwidth]{entrykey}}}
     {\setlength{\labelwidth}{\shorthandwidth}%
      \setlength{\leftmargin}{\labelwidth}%
      \setlength{\labelsep}{\biblabelsep}%
      \addtolength{\leftmargin}{\labelsep}%
      \setlength{\itemsep}{\bibitemsep}%
      \setlength{\parsep}{\bibparsep}%
      \renewcommand*{\makelabel}[1]{##1\hss}%
	    \renewcommand{\entrysetpunct}{\endgraf}%Break between set of an enty
	    \clavesadddashinset%Add the dash inside set (modify default style)
	    }%
	   }
  {\endlist}
  {\item}

\DeclareSortingScheme{claves}{
  \sort{
    \field{entrykey}
  }
}


%5. Inheritance
  \DeclareDataInheritance{*}{*}{%
	  \noinherit{claves_definition}%
  }%

  \DeclareDataInheritance{*}{inbook}{%
	  \noinherit{claves}%
  }%

\endinput
