Estoy intentando analizar la extensión de archivo de una ruta proporcionada por el usuario en expl3. Tengo la extensión de archivo, pero no puedo compararla con la extensión de archivo esperada. Mi MWE es
\documentclass[]{article}
\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
\ior_new:N \g_slo_input_stream_ior
\tl_new:N \l_slo_input_dir_tl
\tl_new:N \l_slo_input_base_tl
\tl_new:N \l_slo_input_ext_tl
\cs_generate_variant:Nn \tl_if_eq:nnTF { V }
\cs_new:Nn \slo_open_file:n {
\file_parse_full_name:nNNN { #1 } \l_slo_input_dir_tl \l_slo_input_base_tl \l_slo_input_ext_tl
\tl_if_eq:VnTF \l_slo_input_ext_tl { .abc } {
#1~is~.abc-file.
} {
#1~is~\l_slo_input_ext_tl-file,~expected~.abc-file.
}
}
\NewDocumentCommand { \abcfile } { m } { \slo_open_file:n { #1 } }
\ExplSyntaxOff
\begin{document}
\abcfile{example.test} \par
\abcfile{filename.abc}
\end{document}
que produce
example.test is .test-file, expected .abc-file.
filename.abc is .abc-file, expected .abc-file.
mientras esperaba
example.test is .test-file, expected .abc-file.
filename.abc is .abc-file
Según tengo entendido, la comparación \tl_if_eq
falla. ¿Por qué?
Respuesta1
Como está documentado, \file_parse_full_name:nNNN
proporciona los valores 'retur' como cadenas, no como listas de tokens. Es decir, todos los caracteres tienen el código de categoría 12 ('otros'), espacios de barra que son el código de categoría 10 ('espacio'). La tl
comparación verifica los tokens, por lo que aquí los códigos de categoría son importantes. Su literal ' .abc
' tiene el código de categoría 11 ("letra") abc
, por lo que la prueba falla.
La mayoría de las veces, y ciertamente aquí, probablemente sea mejor utilizar las pruebas basadas en cadenas para verificar el "texto". Esto solo analiza los códigos de caracteres, por lo que no tenemos que preocuparnos por el negocio de los códigos de categoría.
\cs_new_protected:Npn \slo_open_file:n #1
{
\file_parse_full_name:nNNN {#1}
\l__slo_input_dir_tl
\l__slo_input_base_tl
\l__slo_input_ext_tl
\str_if_eq:VnTF \l__slo_input_ext_tl { .abc }
{ #1 ~is~.abc~file. }
{ #1~is~\l__slo_input_ext_tl-file,~expected~.abc-file. }
}