Remover informações de protocolo da URL no biblatex

Remover informações de protocolo da URL no biblatex

Quero agilizar minha bibliografia removendo as informações do protocolo ( http://e https://) da versão impressa da URL sem quebrar as hiperrefs. Minha solução no momento é assim

\documentclass{article}

\begin{filecontents}{bibliography.bib}
@misc{key1,
author="Google",
title="Google",
url="https://google.com",
}
@misc{key2,
author="Microsoft",
title="Bing",
url="http://bing.com",
}
@misc{key3,
author="DuckDuckGo",
title="DuckDuckGo",
url="https://duckduckgo.com",
}
\end{filecontents}

\usepackage{hyperref}
\usepackage{biblatex}

\DeclareSourcemap{%
  \maps[datatype=bibtex,overwrite=true]{%
    \map{
      \step[fieldsource=url, final=true]
      \step[fieldset=userd, origfieldval,final=true]
      \step[fieldsource=userd, match=\regexp{\A(ht|f)tp(s)?:\/\/([^/]+)},replace=\regexp{$3}]
    }
  }%
}

\DeclareFieldFormat{url}{\mkbibacro{URL}\addcolon\space\href{#1}{\url{\thefield{userd}}}}

\bibliography{bibliography}
\nocite{*}

\begin{document}
\printbibliography
\end{document}

Mas tenho certeza de que deve haver uma solução mais simples, especialmente o que Sourcemapme parece um exagero considerando este problema. No mínimo, não criei a expressão regular mais simples.

Responder1

Acho que sua abordagem é muito sensata, mas eu mudaria três coisas

  1. Use um campo literal ( verba) e não um campo literal ( userd) para o caminho do URL. Isso se torna relevante se o URL contiver caracteres perigosos como #ou %. Os campos literais não podem lidar com esses caracteres, a menos que sejam escapados.

  2. Você pode tornar o RegEx um pouco mais curto simplesmente substituindo o esquema correspondente por nada, em vez de capturar o caminho restante.

  3. Use \nolinkurlinside \href: \hrefjá fornece o link.

MWE

\documentclass{article}

\usepackage{biblatex}
\usepackage{hyperref}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=url, final=true]
      \step[fieldset=verba, origfieldval, final=true]
      \step[fieldsource=verba, match=\regexp{\A(ht|f)tp(s)?:\/\/}, replace={}]
    }
  }
}

\DeclareFieldFormat{url}{%
  \mkbibacro{URL}\addcolon\space
  \href{#1}{\nolinkurl{\thefield{verba}}}}

\begin{filecontents}{\jobname.bib}
@misc{key1,
  author = {Google},
  title  = {Google},
  url    = {https://google.com},
}
@misc{key2,
  author = {Microsoft},
  title  = {Bing},
  url    = {http://bing.com},
}
@misc{key3,
  author = {DuckDuckGo},
  title  = {DuckDuckGo},
  url    = {https://duckduckgo.com/_^a#?\u&6%k},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\nocite{*}

\begin{document}
\printbibliography
\end{document}

PatoDuckGo. PatoDuckGo. url: duckduckgo.com/_^a#?\u&6%k.//Google. Google. url: google.com.//Microsoft. Bing. URL: bing. com.


Eu acho que é melhor deixar a manipulação de strings para o Biber (alguma manipulação de strings é certamente possível no TeX, mas geralmente é um pouco mais dolorosa do que no Biber), então se você quiser reter as informações sobre o protocolo (http ou https) e não deseja apenas vincular todos os URLs com um httpou codificado https, você precisa passar dois campos separados no arquivo .bbl. A outra opção seria salvar o esquema do protocolo e o caminho separadamente, mas então você teria que juntar as peças para obter um link funcional, o que parece mais trabalhoso. Portanto, acho que sua abordagem é bastante direta.


Provavelmente é um exagero nesta situação, mas geralmente acho melhor usar um campo recém-declarado em vez do espaço reservado genérico verba. Então aqui está a mesma solução com um protocollessurlcampo dedicado.

\documentclass{article}

\begin{filecontents}{protocollessurl.dbx}
\DeclareDatamodelFields[type=field, datatype=uri]{protocollessurl}

\DeclareDatamodelEntryfields{protocollessurl}
\end{filecontents}

\usepackage[datamodel=protocollessurl]{biblatex}
\usepackage{hyperref}

\DeclareSourcemap{
  \maps[datatype=bibtex]{
    \map{
      \step[fieldsource=url, final=true]
      \step[fieldset=protocollessurl, origfieldval, final=true]
      \step[fieldsource=protocollessurl, match=\regexp{\A(ht|f)tp(s)?:\/\/}, replace={}]
    }
  }
}

\DeclareFieldFormat{url}{%
  \mkbibacro{URL}\addcolon\space
  \href{#1}{\nolinkurl{\thefield{protocollessurl}}}}

\begin{filecontents}{\jobname.bib}
@misc{key1,
  author = {Google},
  title  = {Google},
  url    = {https://google.com},
}
@misc{key2,
  author = {Microsoft},
  title  = {Bing},
  url    = {http://bing.com},
}
@misc{key3,
  author = {DuckDuckGo},
  title  = {DuckDuckGo},
  url    = {https://duckduckgo.com/_^a#?\u&6%k},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\nocite{*}

\begin{document}
\printbibliography
\end{document}

informação relacionada