%% Copyright 2010-2016 Yves de Saint-Pern
%
% 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 Yves de Saint-Pern.

\ProvidesFile{droit-fr.bbx}[2016/20/02 v1.2 style droit francais]

\RequireBibliographyStyle{verbose-ibid}
\RequireBiber[3]

%%%%%%%%%%%%%%%%%%%%%%
% OPTIONS DE PACKAGE %
%%%%%%%%%%%%%%%%%%%%%%

% style du champ auteur: auteurs secondaires inversés ou non ?
\DeclareBibliographyOption{revertauthors}[false]{%
  \ifstrequal{#1}{true}
    {\DeclareNameAlias{sortname}{last-first}}
    {\DeclareNameAlias{sortname}{last-first/first-last}}}

% style de chaque nom d'une entrée de la bibliographie
\DeclareBibliographyOption{namestyle}[parens]{%
  \ifcsdef{bbx@opt@namestyle@#1}
    {\csuse{bbx@opt@namestyle@#1}}
    {\PackageError{biblatex}
      {Invalid option 'namestyle=#1'}
      {Valid values are 'parens', 'parensprefix', 'plain'}}}

\def\bbx@opt@namestyle@parens{%
  \renewbibmacro*{name:last-first}{\usebibmacro*{name:last-first:parens}}}

\def\bbx@opt@namestyle@parensprefix{%
  \renewbibmacro*{name:last-first}{\usebibmacro*{name:last-first:parensprefix}}}

\def\bbx@opt@namestyle@plain{%
  \renewbibmacro*{name:last-first}{\usebibmacro*{name:last-first:plain}}}

% formatage des noms de famille indexés ?
\newcommand{\mkbibindexnamelast}{}
\DeclareBibliographyOption{indexnameformat}[true]{%
  \ifstrequal{#1}{true}%
    {\renewcommand{\mkbibindexnamelast}{\mkbibnamelast}}%
    {\renewcommand{\mkbibindexnamelast}{}}}

% gestion des prénoms dont l'abréviation doit être formée de 2 ou 3 lettres et non d'une seule:
% - ceux commençant par un digramme (2 consonnes formant un son): Ch, Th, Ph
% - ceux commençant par une consonne ou un digramme, puis l ou r: Cl, Chr, Fr, etc.
% le code ci-dessous s'applique aux prénoms des champs author et editor.
% il protège chacune de ces abréviations par la substitution suivante effectuée a la volée:
%   "Malaurie, Philippe" => "Malaurie, {\relax{}Ph}ilippe"
\DeclareBibliographyOption{smartinitials}[true]{%
  \ifstrequal{#1}{true}%
{\DeclareStyleSourcemap{%
  \maps[datatype=bibtex]{%
    \map{%
    	% champ author
      \step[fieldsource=author,%
      	match={\regexp{\b(Chr|Ch|Th|Ph|[B-DF-HJ-NP-TV-XZ](l|r))(\S*,)}},%
      	replace={\regexp{\{$1\}$3}}]% protection noms de famille si format "prénom nom"
      \step[fieldsource=author,%
      	match={\regexp{([^,]\s)\b(Chr|Ch|Th|Ph|[B-DF-HJ-NP-TV-XZ](l|r))}},%
      	replace={\regexp{$1\{$2\}}}]% protection noms de famille si format "nom, prénom"
      \step[fieldsource=author,%
      	match={\regexp{\b(Chr|Ch|Th|Ph|[B-DF-HJ-NP-TV-XZ](l|r))([^\}])}},%
      	replace={\regexp{\{\\relax\{\}$1\}$3}}]% insertion \relax dans les prénoms trouvés
      % champ editor
      \step[fieldsource=editor,%
      	match={\regexp{\b(Chr|Ch|Th|Ph|[B-DF-HJ-NP-TV-XZ](l|r))(\S*,)}},%
      	replace={\regexp{\{$1\}$3}}]% protection noms de famille si format "prénom nom"
      \step[fieldsource=editor,%
      	match={\regexp{([^,]\s)\b(Chr|Ch|Th|Ph|[B-DF-HJ-NP-TV-XZ](l|r))}},%
      	replace={\regexp{$1\{$2\}}}]% protection noms de famille si format "nom, prénom"
      \step[fieldsource=editor,%
      	match={\regexp{\b(Chr|Ch|Th|Ph|[B-DF-HJ-NP-TV-XZ](l|r))([^\}])}},%
      	replace={\regexp{\{\\relax\{\}$1\}$3}}]% insertion \relax dans les prénoms trouvés
}}}%
}
{}}

% l'editor ne remplace pas un champ author laissé vide.
% il reste imprimé à sa place (généralement après le title).
\ExecuteBibliographyOptions{useeditor=false,sorting=nyt}

% options locales par défaut
\ExecuteBibliographyOptions{revertauthors=false,namestyle=parens,indexnameformat=true,smartinitials=true}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% REDEFINITIONS/AJOUT DE MOTS-CLES %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\NewBibliographyString{byobservator}
\NewBibliographyString{bychronicler}
\NewBibliographyString{numbers}

\DefineBibliographyStrings{french}{%
  in               = {in},
  byeditor         = {sous la dir\adddot\ de},
  bycommentator    = {comm\adddot},
  byannotator      = {note},
  byobservator     = {obs\adddot},
  byredactor       = {rapp\adddot},
  bychronicler     = {chron\adddot},
  withafterword    = {concl\adddot},
  thiscite         = {spéc\adddot},
  section          = {art\adddot},
  sections         = {art\adddot},
  numbers          = {{num\'eros}{n\textsuperscript{os}}}
}

\DefineBibliographyStrings{british}{%
  in               = {in},
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% REDEFINITIONS DE BIBLATEX.DEF %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\setlength{\bibitemsep}{1.5\itemsep} % espacement entre 2 références
\renewcommand*{\newunitpunct}{\addcomma\space} % separation des units par une virgule
\renewcommand*{\mkbibnamelast}[1]{\textsc{\textnohyphenation{#1}}} % petites maj. pour toutes les langues.
\renewcommand*{\subtitlepunct}{\addcolon\space} % separation entre titre et sous-titre


% ------------------------------------------------------------------
% FIELD FORMATS
% ------------------------------------------------------------------

% Used in citations

% book, thesis, collection, report, jurisdiction, case = italique
% legislation = normal
% inbook, incollection, article, commentary = guillemets
\DeclareFieldFormat{citetitle}{\mkbibemph{#1\isdot}}
\DeclareFieldFormat[legislation]{citetitle}{#1\isdot}
\DeclareFieldFormat
  [article,inbook,incollection,inproceedings,patent,unpublished]
  {citetitle}{\mkbibquote{#1\isdot}}

% pas de P. majuscule
\DeclareFieldFormat{postnote}{\midsentence\mkpageprefix[pagination]{#1}}
\DeclareFieldFormat{volcitepages}{\midsentence\mkpageprefix[pagination]{#1}}
\DeclareFieldFormat{multipostnote}{\midsentence\mkpageprefix[pagination]{#1}}

% Used in the bibliography

% pas de P. majuscule
\DeclareFieldFormat{pages}{\midsentence\mkpageprefix[bookpagination]{#1}}
\DeclareFieldFormat{pagetotal}{\midsentence\mkpagetotal[bookpagination]{#1}}

% tout italique, sauf legislation
\DeclareFieldFormat{title}{\mkbibemph{#1\isdot}}
\DeclareFieldFormat[thesis]{title}{\mkbibemph{#1\isdot}}
\DeclareFieldFormat[legislation]{title}{#1\isdot}

\DeclareFieldFormat{chapter}{#1} % pas de 'chap.'
\DeclareFieldFormat[jurisdiction,legislation]{number}{\biblcstring{number}~#1}% no de l'arret
\DeclareFieldFormat[case]{journaltitle}{#1}% pas d'italique'
\DeclareFieldFormat[case]{volume}{#1}% pas de 't.'
\DeclareFieldFormat[case]{pages}{#1} % pas de 'p.'

% ------------------------------------------------------------------
% LIST FORMATS
% ------------------------------------------------------------------

% institution entre parentheses dans les cases de type legacy
\DeclareListFormat{parenslist}{%
  \mkbibparens{\usebibmacro{list:delim}{#1}%
  #1\isdot
  \usebibmacro{list:andothers}}}

% ------------------------------------------------------------------
% NAME LIST FORMATS
% ------------------------------------------------------------------
% #1 = last name
% #2 = last name (initials)
% #3 = first name
% #4 = first name (initials)
% #5 = name prefix, a.k.a. 'von part'
% #6 = name prefix (initials)
% #7 = name affix, a.k.a. 'junior part'
% #8 = name affix (initials)

% Forcer l'affichage du prénom en initiales, suivi du nom pour les auteurs dans les citations.
\DeclareNameFormat{labelname}{%
  \ifuseprefix
    {\usebibmacro{name:first-last}{#1}{#4}{#5}{#8}}
    {\usebibmacro{name:first-last}{#1}{#4}{#6}{#8}}%
  \usebibmacro{name:andothers}}

% correspond à la macro "name:last-first" de biblatex.def
% NOM, Prénom particule
\newbibmacro*{name:last-first:plain}[4]{%
  \usebibmacro{name:delim}{#1}%
  \usebibmacro{name:hook}{#1}%
  \mkbibnamelast{#1}\isdot
  \ifblank{#4}{}{\bibnamedelimd\mkbibnameaffix{#4}\isdot}%
  \ifblank{#2#3}{}{\revsdnamepunct}%
  \ifblank{#2}{}{\bibnamedelimd\mkbibnamefirst{#2}\isdot}%
  \ifblank{#3}{}{\bibnamedelimd\mkbibnameprefix{#3}\isdot}}

% NOM (Prénom particule)
\newbibmacro*{name:last-first:parens}[4]{%
  \usebibmacro{name:delim}{#1}%
  \mkbibnamelast{#1}\isdot
  \ifblank{#4}{}{\bibnamedelimd\mkbibnameaffix{#4}\isdot}%
  \ifblank{#2#3}{}{\bibnamedelimd\mkbibparens{%
    \ifblank{#2}{}{\mkbibnamefirst{#2}\isdot}%
    \ifblank{#3}{}{\bibnamedelimd\mkbibnameprefix{#3}\isdot}}
  }
}

% NOM (particule), Prénom
\newbibmacro*{name:last-first:parensprefix}[4]{%
  \usebibmacro{name:delim}{#1}%
  \usebibmacro{name:hook}{#1}%
  \mkbibnamelast{#1}\isdot
  \ifblank{#4}{}{\bibnamedelimd\mkbibnameaffix{#4}\isdot}%
  \ifblank{#3}{}{\bibnamedelimd\mkbibparens{\mkbibnameprefix{#3}\isdot}}
  \ifblank{#2}{}{\revsdnamepunct\bibnamedelimd\mkbibnamefirst{#2}\isdot}}

% affichage du prénom en initiales, suivi du nom pour les autres champs (editor, translator, etc).
\DeclareNameFormat{first-last}{%
  \usebibmacro{name:first-last}{#1}{#4}{#5}{#7}
  \usebibmacro{name:andothers}}

% caractère de séparation entre plusieurs entrées référencées dans "related"
\renewcommand*{\relateddelim}{\addsemicolon\addspace}

% modification du champ "related" pour les commentaires d'arrêt
\renewbibmacro*{related:default}[1]{%
  \entrydata{#1}{\usedriver{}{commentary}}}

%%%%%%%%%
% INDEX %
%%%%%%%%%

% indexation des auteurs seulement
\renewbibmacro*{bibindex}{%
  \ifbibindex
    {\indexnames{labelname}}
    {}}

% indexation des auteurs seulement
\renewbibmacro*{citeindex}{%
  \ifciteindex
    {\indexnames{labelname}}
    {}}

% formatage des noms indexés 
\renewcommand*{\mkbibindexname}[4]{%
  \ifuseprefix
    {\ifblank{#3}{}{#3 }%
     \@firstofone #1% remove spurious braces
     \actualoperator
     \ifblank{#3}{}{\MakeCapital{#3} }%
     #1%
     \ifblank{#4}{}{ #4}%
     \ifblank{#2}{}{, #2}}
    {\@firstofone #1% remove spurious braces
     \actualoperator % ajouté
     \mkbibindexnamelast{#1}%
     \ifblank{#4}{}{ #4}%
     \ifblank{#2#3}{}{,}%
     \ifblank{#2}{}{ #2}%
     \ifblank{#3}{}{ #3}}}


%%%%%%%%%%%%%%%%%%
% SCHEMAS DE TRI %
%%%%%%%%%%%%%%%%%%

% schéma de tri destiné à la jurisprudence: institution, date de décision
\DeclareSortingScheme{iymd}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkey}
  }
  \sort{
    \field{institution}
  }
  \sort{
    \field{eventyear}
  }
  \sort{
    \field[padside=left,padwidth=2,padchar=0]{eventmonth}
    \literal{00}
  }
  \sort{
    \field[padside=left,padwidth=2,padchar=0]{eventday}
    \literal{00}
  }
}


% schéma de tri destiné à la jurisprudence: titre (nom d'affaire), date de décision, institution
\DeclareSortingScheme{tymdi}{
  \sort{
    \field{presort}
  }
  \sort[final]{
    \field{sortkey}
  }
  \sort{
    \field{sorttitle}
    \field{title}
  }
  \sort{
    \field{eventyear}
  }
  \sort{
    \field[padside=left,padwidth=2,padchar=0]{eventmonth}
    \literal{00}
  }
  \sort{
    \field[padside=left,padwidth=2,padchar=0]{eventday}
    \literal{00}
  }
  \sort{
    \field{institution}
  }
}


%%%%%%%%%%%
% DRIVERS %
%%%%%%%%%%%

% loi
\DeclareBibliographyDriver{legislation}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \usebibmacro{journal+issuetitle}%
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \printfield{pages}
  \newunit\newblock
  \usebibmacro{url+urldate}%
  \newunit\newblock
  \printfield{addendum}%
  \newunit\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

% rapport officiel
% ajout de l'editor (byeditor)
\DeclareBibliographyDriver{report}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byauthor}%
  \newunit\newblock
  \usebibmacro{byeditor}%
  \newunit\newblock
  \printfield{type}%
  \setunit*{\addspace}%
  \printfield{number}%
  \newunit\newblock
  \printfield{version}%
  \newunit
  \printfield{note}%
  \newunit\newblock
  \usebibmacro{institution+location+date}%
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \newunit
  \printfield{pagetotal}%
  \newunit\newblock
  \iftoggle{bbx:isbn}
    {\printfield{isrn}}
    {}%
  \newunit\newblock
  \usebibmacro{doi+eprint+url}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

% thèse:
% ajout du directeur de thèse (byeditor)
\DeclareBibliographyDriver{thesis}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{author}%
  \setunit{\labelnamepunct}\newblock
  \usebibmacro{title}%
  \newunit
  \printlist{language}%
  \newunit\newblock
  \usebibmacro{byeditor}%
  \newunit\newblock  
  \printfield{note}%
  \newunit\newblock
  \printfield{type}%
  \newunit
  \usebibmacro{institution+location+date}%
  \newunit\newblock
  \usebibmacro{chapter+pages}%
  \newunit\newblock
  \printlist{publisher}
  \newunit
  \printfield{pagetotal}
  \setunit*{\addcomma\space}
  \newblock
  \printfield{doi}%
  \newunit\newblock
  \usebibmacro{url+urldate}%
  \newunit\newblock
  \printfield{addendum}%
  \newunit\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

% cas de jurisprudence générique
\DeclareBibliographyAlias{jurisdiction}{case}
\DeclareBibliographyDriver{case}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \ifbibmacroundef{case:\strfield{hyphenation}}
  	{\usebibmacro{case:french}}
    {\usebibmacro{case:\strfield{hyphenation}}}
  \newunit\newblock
  \printfield{note}%
  \newunit\newblock
  \printfield{addendum}%
  \newunit\newblock
  \usebibmacro{pageref}%
  \setunit{\addsemicolon\addspace}\newblock
  \iftoggle{bbx:related}
    {\usebibmacro{related:init}%
     \usebibmacro{related}}
    {}%
  \usebibmacro{finentry}}

% cas de jurisprudence anglaise
% - avec neutral citation: format adopté depuis 2001 par certaines juridictions
% - sans neutral citation: format historique
\newbibmacro*{case:british}{%
  \iffieldundef{number}
    {\usebibmacro{case:british:legacy}}
    {\usebibmacro{case:british:withneutral}}
}

% jurisprudence anglaise sans neutral citation:
% title | [year] OR (eventyear) | volume | journal | page | (jurisdiction)
\newbibmacro*{case:british:legacy}{%
  \usebibmacro{title}%
  \setunit{\addspace}\newblock
  \iffieldundef{year}
    {\printfield[parens]{eventyear}}
    {\printfield[brackets]{year}}
  \setunit{\addspace}
  \printfield{volume}%
  \setunit{\addspace}
  \usebibmacro{journal}%
  \setunit{\addspace}\newblock
  \printfield{pages}
  \setunit{\addspace}\newblock
  \printlist[parenslist]{institution}}

% case avec neutral citation (depuis 2001 et pour certaines juridictions)
% <neutral citation>, | <infos de publications dans un law report>
\newbibmacro*{case:british:withneutral}{%
  \usebibmacro{case:british:neutral}%
  \iffieldundef{journaltitle}
    {}
    {\usebibmacro{case:british:report}}}

% neutral citation
% title | [eventyear] | jurisdiction | number
\newbibmacro*{case:british:neutral}{%
  \usebibmacro{title}%
  \setunit{\addspace}\newblock
  \printfield[brackets]{eventyear}%
  \setunit{\addspace}
  \printlist{institution}%
  \setunit{\addspace}
  \printfield{number}%
}

% informations de publication relatives à un law report
% dans un arrêt de jurisprudence anglaise avec neutral citation.
% [year] OR (eventyear) | volume | journal | page
\newbibmacro*{case:british:report}{%
  \setunit{\addcomma\space}\newblock
  \iffieldundef{year}
    {\printfield[parens]{eventyear}}
    {\printfield[brackets]{year}}
  \setunit{\addspace}
  \printfield{volume}%
  \setunit{\addspace}
  \usebibmacro{journal}%
  \setunit{\addspace}\newblock
  \printfield{pages}
}

% jurisprudence française.
% institution, | titre, | eventdate, | number, | journal, | date, | volume, | chapter, | pages
% - eventdate: date de décision rendue
% - date: date de publication dans un journal officiel
% - number: numéro de requête ou de l'arrêt (si non publié)
% - chapter: section logique du journal dans laquelle se trouve l'arrêt
\newbibmacro{case:french}{%
  \printlist{institution}%
  \newunit\newblock
  \usebibmacro{title}%
  \newunit\newblock
  \printeventdate%
  \newunit\newblock
  \printfield{number}%
  \newunit\newblock
  \usebibmacro{journal}%
  \newunit
  \printfield{volume}%
  \printfield{part}}

% jurisprudence selon le format européen ECLI.
% https://e-justice.europa.eu/content_european_case_law_identifier_ecli-175-fr.do
%
% ECLI:<location>:<institution>:<date>:<number>
% - location: code État membre. Ex: FR, DE, NL, etc.
% - institution: juridiction ayant rendu la décision
% - date: année de la décision
% - number: numéro d'ordre, de 25 caractères au maximum présenté selon un format décidé par chaque État membre.
\newbibmacro{case:ecli}{%
  \printtext{ECLI}%
  \setunit{\addcolon}
  \printfield{location}%
  \setunit{\addcolon}
  \printfield{institution}%
  \setunit{\addcolon}
  \printfield{year}%
  \setunit{\addcolon}
  \printfield{number}%
  \newunit\newblock
  \usebibmacro{chapter+pages}}

% commentaire d'arrêt
\DeclareBibliographyDriver{commentary}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \usebibmacro{journal+issuetitle}%
  \setunit{\bibpagespunct}%
  \printfield{pages}%
  \newunit\newblock
  \usebibmacro{byeditor+others}%
  \newunit\newblock
  \usebibmacro{addendum+pubstate}%
  \newunit\newblock
  \usebibmacro{pageref}%
  \usebibmacro{finentry}}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% REDEFINITIONS DU STYLE STANDARD.BBX %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% mot-clé "in" non présent dans les articles.
% présent dans les autres types (inbook, incollection...):
% - pas de : 
% - pas de virgule (ni avant ni après)
\renewbibmacro*{in:}{%
  \ifentrytype{article}
    {\newunit}
    {\setunit{\addspace}
     \biblcstring[\mkbibemph]{in}
     \setunit{\addspace}
     \nopunct}
  }

% date imprimée sans parenthèses
\renewbibmacro*{issue+date}{%
  \printtext{% [parens]
    \iffieldundef{issue}
      {\printdate}
      {\printfield{issue}%
       \setunit{\addspace}%
       \printfield{year}}}%
  \newunit}

% macro utilisée dans article, legislation, commentary.
% - journal et date toujours séparés par un espace.
% - ajout de "part" et "chapter", pour des journaux comprenant des partie thématiques (Dalloz, JCP, etc)
\renewbibmacro*{journal+issuetitle}{%
  \usebibmacro{journal}%
  \setunit{\addspace}%
  \usebibmacro{issue+date}%
  \newunit\newblock
  \usebibmacro{issue}%
  \newunit
  \printfield{volume}%
  \newunit
  \printfield{part}%
  \newunit
  \printfield{chapter}%
  \newunit
  \iffieldundef{series}
    {}
    {\printfield{series}%
     \newunit}%
  \printfield{number}%
  \newunit
  \printfield{eid}%
  \newunit}

% macro utilisée dans les (in)proceedings.
% date imprimée sans parenthèses
\renewbibmacro*{event+venue+date}{%
  \printfield{eventtitle}%
  \ifboolexpr{
    test {\iffieldundef{venue}}
    and
    test {\iffieldundef{eventyear}}
  }
    {}
    {\setunit*{\addspace}%
     \printtext{% [parens]
       \printfield{venue}%
       \setunit*{\addcomma\space}%
       \printeventdate}}%
  \newunit}

\endinput