Eliminar información de protocolo de la URL en biblatex

Eliminar información de protocolo de la URL en biblatex

Quiero optimizar mi bibliografía eliminando la información del protocolo ( http://y https://) de la versión impresa de la URL sin romper las hiperreferencias. Mi solución en este momento se ve así

\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}

Pero estoy seguro de que debe haber una solución más sencilla, especialmente la que Sourcemapme parece excesiva teniendo en cuenta este problema. Al menos no se me ocurrió la expresión regular más simple.

Respuesta1

Creo que tu planteamiento es muy sensato, pero cambiaría tres cosas

  1. Utilice un campo literal ( verba) y no un campo literal ( userd) para la ruta URL. Esto se vuelve relevante si la URL contiene caracteres peligrosos como #o %. Los campos literales no pueden tratar con esos caracteres a menos que se les escape.

  2. Puede acortar ligeramente la expresión regular simplemente reemplazando el esquema coincidente con nada en lugar de capturar la ruta restante.

  3. Usar \nolinkurldentro \href: \hrefya proporciona el enlace.

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}

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


Creo que es mejor dejar la manipulación de cadenas a Biber (ciertamente es posible cierta manipulación de cadenas en TeX, pero generalmente es un poco más doloroso que con Biber), así que si desea conservar la información sobre el protocolo (http o https) y no solo desea vincular todas las URL con un código httpo https, debe pasar dos campos separados en el archivo .bbl. La otra opción sería guardar el esquema del protocolo y la ruta por separado, pero luego tendría que unir las cosas para obtener un enlace que funcione, lo que parece más trabajo. Entonces creo que su enfoque es bastante sencillo.


Probablemente sea excesivo en esta situación, pero normalmente me parece mejor usar un campo recién declarado en lugar del marcador de posición genérico verba. Aquí tienes la misma solución con un 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}

información relacionada