\ProvidesFile{gost-authoryear.bbx}
[2023/04/25\space v1.24\space biblatex-gost styles]

\RequireBibliographyStyle{gost-standard}

\DeclareBibliographyOption{dropdates}[true]{%
  \ifstrequal{#1}{true}
    {\ExecuteBibliographyOptions{singletitle=true,uniquebaretitle=true}}
    {\ExecuteBibliographyOptions{singletitle=false,uniquebaretitle=false}}}

\DeclareBibliographyOption{mergedate}[true]{%
  \ifcsdef{bbx@opt@mergedate@#1}
    {\csuse{bbx@opt@mergedate@#1}}
    {\PackageError{biblatex}
       {Invalid option 'mergedate=#1'}
       {Valid values are 'maximum', 'compact', 'basic', 'minimum',\MessageBreak
        'goststrict', 'gostletter', 'gostlabel', 'true' (=compact), and 'false'.}}}

% whether the date is necessary for disambiguation
\newcommand*{\blx@gost@ifneedsdate}[2]{%
  \ifnameundef{labelname}
    {\ifuniquebaretitle{#2}{#1}}
    {\ifsingletitle{#2}{#1}}}

\providebibmacro*{labelyear+extradate}{}
\providebibmacro*{authoryearlabel}{}
\newbibmacro*{cite:extras}{%
  \ifnameundef{labelname}%    if there is labelname, extradate disambiguation is enough
    {\printfield{extratitleyear}} % if labeltitle+labelyear are the same
    {\printfield{extradate}}}

\providebibmacro*{labeltitle}{}
\newlength{\labelauthoryearsep}

% label isn't taken into account since labeltitle is always provided
\newbibmacro*{labeltitle:common}{%
  \blx@gost@ifneedsdate
    {\printtext[title]{\printfield[titlecase]{labeltitle}}%
     \clearfield{\thefield{labeltitlesource}}}
    {}}

\def\bbx@opt@mergedate@true{\bbx@opt@mergedate@compact}

\def\bbx@opt@mergedate@maximum{%
  \renewbibmacro*{labelyear+extradate}{%
    \blx@gost@ifneedsdate
      {\iffieldundef{labelyear}
        {}
        {\printtext[parens]{%
            % \ifentrytype{article}
              % {\printfield{issue}%
               % \clearfield{issue}%
               % \setunit*{\addspace}}
              % {}%
            \usebibmacro{cite:labelyear+extras}{}%
            \clearfield{\thefield{labeldatesource}month}%
            \clearfield{\thefield{labeldatesource}day}}}}
      {}}%
  %\renewcommand*{\labelnamepunct}{\newunitpunct}
  \renewbibmacro*{date}{\blx@gost@ifneedsdate{}{\usebibmacro{printdate}{}}}%
  \renewbibmacro*{year}{\blx@gost@ifneedsdate{}{\usebibmacro{printyear}{}}}%
  \renewbibmacro*{jour:date}{%
    \blx@gost@ifneedsdate
      {}
      {\usebibmacro{year}%
       \newunit\newblock
       \mkbibdatelong{}{month}{day}}}%
  \renewbibmacro*{labeltitle}{\usebibmacro{labeltitle:common}}%
  \renewbibmacro*{authoryearlabel}{}%
  \setlength{\labelauthoryearsep}{0pt}%
}

\def\bbx@opt@mergedate@compact{%
  \renewbibmacro*{labelyear+extradate}{%
    \blx@gost@ifneedsdate{\usebibmacro{cite:labelyear+extras}{parens}}{}}%
  %\renewcommand*{\labelnamepunct}{\newunitpunct}
  \renewbibmacro*{date}{\blx@gost@ifneedsdate{}{\usebibmacro{printdate}{}}}%
  \renewbibmacro*{year}{\blx@gost@ifneedsdate{}{\usebibmacro{printyear}{}}}%
  \renewbibmacro*{jour:date}{%
    \blx@gost@ifneedsdate
      {}
      {\usebibmacro{year}%
       \newunit\newblock
       \mkbibdatelong{}{month}{day}}}%
  \renewbibmacro*{labeltitle}{\usebibmacro{labeltitle:common}}%
  \renewbibmacro*{authoryearlabel}{}%
  \setlength{\labelauthoryearsep}{0pt}%
}

\def\bbx@opt@mergedate@basic{%
  \renewbibmacro*{labelyear+extradate}{%
    \blx@gost@ifneedsdate{\usebibmacro{cite:labelyear+extras}{parens}}{}}%
  %\renewcommand*{\labelnamepunct}{\newunitpunct}
  \renewbibmacro*{date}{%
    \blx@gost@ifneedsdate
      {\ifthenelse{\(\iffieldundef{extradate}\AND\iffieldundef{extratitleyear}\)
        \AND\iffieldundef{month}} %if date is simply year
        {}
        {\usebibmacro{printdate}{}}}
      {\usebibmacro{printdate}{}}}%
  \renewbibmacro*{year}{%
    \blx@gost@ifneedsdate
      {\ifthenelse{\iffieldundef{extradate}\AND\iffieldundef{extratitleyear}}
        {}
        {\usebibmacro{printyear}{}}}
      {\usebibmacro{printyear}{}}}%
  \renewbibmacro*{jour:date}{%
    \blx@gost@ifneedsdate
      {\ifthenelse{\(\iffieldundef{extradate}\AND\iffieldundef{extratitleyear}\)
        \AND\iffieldundef{month}} %if date is simply year
        {}
        {\usebibmacro{year}%
         \newunit\newblock
         \mkbibdatelong{}{month}{day}}}%
      {\usebibmacro{year}%
       \newunit\newblock
       \mkbibdatelong{}{month}{day}}}%
  \renewbibmacro*{labeltitle}{\usebibmacro{labeltitle:common}}%
  \renewbibmacro*{authoryearlabel}{}%
  \setlength{\labelauthoryearsep}{0pt}%
}

\def\bbx@opt@mergedate@minimum{%
  \renewbibmacro*{labelyear+extradate}{%
    \blx@gost@ifneedsdate{\usebibmacro{cite:labelyear+extras}{parens}}{}}%
  %\renewcommand*{\labelnamepunct}{\newunitpunct}
  \renewbibmacro*{date}{%
    \blx@gost@ifneedsdate
      {\ifthenelse{\iffieldundef{extradate}\AND\iffieldundef{extratitleyear}}
        {}
        {\usebibmacro{printdate}{}}}
      {\usebibmacro{printdate}{}}}%
  \renewbibmacro*{year}{%
    \blx@gost@ifneedsdate
      {\ifthenelse{\iffieldundef{extradate}\AND\iffieldundef{extratitleyear}}
        {}
        {\usebibmacro{printyear}{}}}
      {\usebibmacro{printyear}{}}}%
  \renewbibmacro*{jour:date}{%
    \blx@gost@ifneedsdate
      {\ifthenelse{\iffieldundef{extradate}\AND\iffieldundef{extratitleyear}}
        {}
        {\usebibmacro{year}%
         \newunit\newblock
         \mkbibdatelong{}{month}{day}}}%
      {\usebibmacro{year}%
       \newunit\newblock
       \mkbibdatelong{}{month}{day}}}%
  \renewbibmacro*{labeltitle}{\usebibmacro{labeltitle:common}}%
  \renewbibmacro*{authoryearlabel}{}%
  \setlength{\labelauthoryearsep}{0pt}%
}

\def\bbx@opt@mergedate@false{%
  \renewbibmacro*{labelyear+extradate}{%
    \blx@gost@ifneedsdate{\usebibmacro{cite:labelyear+extras}{parens}}{}}%
  %\renewcommand*{\labelnamepunct}{\newunitpunct}
  \renewbibmacro*{date}{\usebibmacro{printdate}{}}%
  \renewbibmacro*{year}{\usebibmacro{printyear}{}}%
  \renewbibmacro*{labeltitle}{\usebibmacro{labeltitle:common}}%
  \renewbibmacro*{authoryearlabel}{}%
  \setlength{\labelauthoryearsep}{0pt}%
}

\def\bbx@opt@mergedate@goststrict{%
  \renewbibmacro*{labelyear+extradate}{}%
  \renewbibmacro*{date}{\usebibmacro{printdate}{}}%
  \renewbibmacro*{year}{\usebibmacro{printyear}{}}%
  \renewbibmacro*{labeltitle}{}%
  \DeclareFieldFormat{extradate}{%
    \PackageWarning{biblatex-gost}{%
      Citation \thefield{entrykey} is not unique}}%
  \DeclareFieldFormat{extratitleyear}{%
    \PackageWarning{biblatex-gost}{%
      Citation \thefield{entrykey} is not unique}}%
  \ExecuteBibliographyOptions{singletitle,uniquebaretitle}%
  \renewbibmacro*{authoryearlabel}{}%
  \setlength{\labelauthoryearsep}{0pt}%
}

\def\bbx@opt@mergedate@gostletter{%
  \renewbibmacro*{labelyear+extradate}{}%
  \renewbibmacro*{date}{\usebibmacro{printdate}{}\usebibmacro{cite:extras}}%
  \renewbibmacro*{year}{\usebibmacro{printyear}{}\usebibmacro{cite:extras}}%
  \renewbibmacro*{labeltitle}{}%
  \renewbibmacro*{authoryearlabel}{}%
  \setlength{\labelauthoryearsep}{0pt}%
}

\def\bbx@opt@mergedate@gostlabel{%
  \renewbibmacro*{labelyear+extradate}{}%
  \renewbibmacro*{date}{\usebibmacro{printdate}{}}%
  \renewbibmacro*{year}{\usebibmacro{printyear}{}}%
  \renewbibmacro*{labeltitle}{}%
  \renewbibmacro*{heading}{}%
  \renewbibmacro*{authoryearlabel}{%
    \mkbibbrackets{%
      \iffieldundef{shorthand}
        {\iffieldundef{heading}
             {\ifthenelse{\ifnameundef{labelname}\OR\iffieldundef{labelyear}}
                {\ifnameundef{labelname}
                  {% no labelname
                   \iffieldundef{label}
                     {% no label, so print labeltitle (always present)
                      \blx@gost@ifneedsdate
                        {\printtext[citetitle]{\printfield[titlecase]{labeltitle}}
                         \setunit{\nameyeardelim}%
                         \usebibmacro{cite:labelyear+extras}{}}
                        {\printtext[citetitle]{\printfield[titlecase]{labeltitle}}}}
                     {% label exists, print it
                      \usebibmacro{cite:label+volume+parts}}}%
                  {% labelname, no labelyear
                   \usebibmacro{cite:labelname+volume+parts}{}}}%
               {% both labelname, labelyear exist
                   \blx@gost@ifneedsdate
                      {\usebibmacro{cite:labelname+volume+parts}{}%
                       \setunit{\nameyeardelim}%
                       \usebibmacro{cite:labelyear+extras}{}}%
                      {\usebibmacro{cite:labelname+volume+parts}{}}}}
             {\usebibmacro{cite:heading}{bibhyperref}%
    %          \iffieldundef{labelyear}
    %            {}
    %            {\setunit{\nameyeardelim}%
    %             \usebibmacro{cite:labelyear+extras}{bibhyperref}}
              }}%
        {\usebibmacro{cite:shorthand}}}}%
  \setlength{\biblabelsep}{.5em}%
  \setlength{\labelauthoryearsep}{\biblabelsep}%
}

\ExecuteBibliographyOptions{labeldateparts,labeltitleyear,sorting=nyt,pagetracker,
      mergedate=gostletter,dropdates=false,
      bibisbn,biburl,bibdoi,bibeprint}

\DeclareFieldFormat{shorthandwidth}{#1}
\setlength{\bibitemsep}{0pt}

\defbibenvironment{bibliography}
  {\list
     {\usebibmacro{authoryearlabel}}
     {\setlength{\leftmargin}{\bibhang}%
      \setlength{\labelwidth}{0pt}
      \setlength{\labelsep}{\labelauthoryearsep}%
      \setlength{\itemindent}{-\leftmargin}
      \addtolength{\itemindent}{\labelsep}
      \setlength{\itemsep}{\bibitemsep}%
      \setlength{\parsep}{\bibparsep}}}
  {\endlist}
  {\item}

\defbibenvironment{shorthand}
  {\list
     {\printfield[shorthandwidth]{shorthand}}
     {\setlength{\labelwidth}{\shorthandwidth}%
      \setlength{\leftmargin}{\labelwidth}%
      \setlength{\labelsep}{\biblabelsep}%
      \addtolength{\leftmargin}{\labelsep}%
      \setlength{\itemsep}{\bibitemsep}%
      \setlength{\parsep}{\bibparsep}%
      \renewcommand*{\makelabel}[1]{##1\hss}}}
  {\endlist}
  {\item}

\renewbibmacro*{author}{%
  \ifboolexpr{
    test \ifuseauthor
    and
    not test {\ifnameundef{author}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\iftoggle{bbx:gostbibliography}
         {\printnames[heading][1-1]{author}}
         {\printnames[heading]{author}}%
     \setunit{\addcomma\space}%
     \usebibmacro{bbx:savehash}}%
     \usebibmacro{authorstrg}%
     \setunit*{\addspace}}
    {\global\undef\bbx@lasthash%
     \usebibmacro{labeltitle}%
     \setunit*{\addspace}}%
  \usebibmacro{labelyear+extradate}}


\renewbibmacro*{editor}{%
  \usebibmacro{bbx:editor}{editorstrg}}
\renewbibmacro*{editor+others}{%
  \usebibmacro{bbx:editor}{editor+othersstrg}}
\renewbibmacro*{bbx:editor}[1]{%
  \ifboolexpr{
    test \ifuseeditor
    and
    not test {\ifnameundef{editor}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\printnames[heading]{editor}%
     \setunit{\addcomma\space}%
     \usebibmacro{bbx:savehash}}%
     \usebibmacro{#1}%
     \clearname{editor}%
     \setunit*{\addspace}}%
    {\global\undef\bbx@lasthash%
     \usebibmacro{labeltitle}%
     \setunit*{\addspace}}%
  \usebibmacro{labelyear+extradate}}

\renewbibmacro*{translator}{%
  \usebibmacro{bbx:translator}{translatorstrg}}
\renewbibmacro*{translator+others}{%
  \usebibmacro{bbx:translator}{translator+othersstrg}}
\renewbibmacro*{bbx:translator}[1]{%
  \ifboolexpr{
    test \ifusetranslator
    and
    not test {\ifnameundef{translator}}
  }
    {\usebibmacro{bbx:dashcheck}
       {\bibnamedash}
       {\printnames[heading]{translator}%
     \setunit{\addcomma\space}%
     \usebibmacro{bbx:savehash}}%
     \usebibmacro{#1}%
     \clearname{translator}%
     \setunit*{\addspace}}%
    {\global\undef\bbx@lasthash%
     \usebibmacro{labeltitle}%
     \setunit*{\addspace}}%
  \usebibmacro{labelyear+extradate}}


\endinput
