1818
1919"""Provide utilities to work with programming language classes."""
2020
21+ import logging
2122from cms import plugin_list
2223from cms .grading .language import Language
2324
24-
2525__all__ = [
2626 "LANGUAGES" ,
2727 "HEADER_EXTS" , "SOURCE_EXTS" , "OBJECT_EXTS" ,
2828 "get_language" , "filename_to_language"
2929]
3030
3131
32+ logger = logging .getLogger (__name__ )
33+
34+
3235LANGUAGES : list [Language ] = list ()
3336_BY_NAME : dict [str , Language ] = dict ()
3437HEADER_EXTS : set [str ] = set ()
@@ -50,6 +53,25 @@ def get_language(name: str) -> Language:
5053 return _BY_NAME [name ]
5154
5255
56+ def safe_get_lang_filename (lang : str | None , filename : str ) -> str :
57+ """Get the filename of a file in a specific programming language,
58+ avoiding errors if the language isn't recognized.
59+
60+ lang: name of the programming language
61+ filename: filename template (containing .%l)
62+ return: filename with the template replaced.
63+ """
64+ if lang is None :
65+ return filename
66+ try :
67+ language = get_language (lang )
68+ source_ext = language .source_extension
69+ except KeyError :
70+ logger .warning (f"Found invalid language { lang } !" )
71+ source_ext = ".invalid_language"
72+ return filename .replace (".%l" , source_ext )
73+
74+
5375def filename_to_language (filename : str , available_languages : list [Language ] | None = None ) -> Language | None :
5476 """Return one of the languages inferred from the given filename.
5577
0 commit comments