pascalabcnet/LanguageIntegrator/LanguageProvider.cs
AlexanderZemlyak 21e2141e02
Case sensitive search fixes (#3357)
* Change SelectLanguageByExtension method slightly

* Fix standard procedures names in StringConstants
2025-11-07 20:43:07 +03:00

93 lines
3.3 KiB
C#

// Copyright (c) Ivan Bondarev, Stanislav Mikhalkovich (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.IO;
using PascalABCCompiler.Errors;
namespace Languages.Facade
{
/// <summary>
/// Хранилище языков, поддерживаемых платформой (Singletone)
/// </summary>
public class LanguageProvider
{
private static readonly Lazy<LanguageProvider> lazyInstanceWrapper = new Lazy<LanguageProvider>(() => new LanguageProvider(), true);
public static LanguageProvider Instance { get { return lazyInstanceWrapper.Value; } }
/// <summary>
/// Список всех языков, заполняется классом LanguageIntegrator
/// </summary>
public List<ILanguage> Languages { get; private set; } = new List<ILanguage>();
/// <summary>
/// Основной язык платформы - PascalABC.NET
/// </summary>
public ILanguage MainLanguage
{
get
{
return Languages[0];
}
}
/// <summary>
/// Выбор языка по расширению файла - бросает ошибку некорректного расширения
/// </summary>
/// <param name="fileName">Имя файла или просто расширение</param>
/// <returns></returns>
/// <exception cref="ParserBadFileExtension"></exception>
public ILanguage SelectLanguageByExtension(string fileName)
{
return SelectLanguageByExtensionSafe(fileName) ?? throw new ParserBadFileExtension(fileName);
}
/// <summary>
/// Выбор языка по расширению файла - возвращает null, если расширение не то
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public ILanguage SelectLanguageByExtensionSafe(string fileName)
{
string extension = Path.GetExtension(fileName).ToLower();
foreach (ILanguage language in Languages)
foreach (string langExtension in language.FilesExtensions)
if (langExtension.ToLower() == extension)
return language;
return null;
}
/// <summary>
/// Есть ли язык, поддерживающий такое расширение файла
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
public bool HasLanguageForExtension(string fileName)
{
return SelectLanguageByExtensionSafe(fileName) != null;
}
/// <summary>
/// Выбор языка по имени (ILanguage.Name)
/// </summary>
/// <param name="languageName">Имя языка</param>
/// <returns></returns>
public ILanguage SelectLanguageByName(string languageName)
{
foreach (ILanguage language in Languages)
if (language.Name == languageName)
return language;
return null;
}
}
}