Convert-it/Areas/TextTools/Controllers/CaseConverterController.cs
2025-09-10 01:06:53 -03:00

109 lines
4.2 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using System.ComponentModel.DataAnnotations;
using System.Text.RegularExpressions;
namespace Convert_It_Online.Areas.TextTools.Controllers
{
/// <summary>
/// ViewModel para a ferramenta de conversão de texto.
/// </summary>
public class CaseConverterViewModel
{
[Display(Name = "Seu texto")]
public string? InputText { get; set; }
public string? ResultText { get; set; }
// Usado para saber qual botão foi pressionado no formulário
public string? ConversionType { get; set; }
}
[Area("TextTools")]
public class CaseConverterController : Controller
{
private readonly IStringLocalizer<SharedResource> _localizer;
public CaseConverterController(IStringLocalizer<SharedResource> localizer)
{
_localizer = localizer;
}
private void SetCommonViewBagProperties()
{
ViewBag.HomeLink = _localizer["HomeLink"];
ViewBag.TextMenuTitle = _localizer["TextMenuTitle"];
ViewBag.ImageMenuTitle = _localizer["ImageMenuTitle"];
ViewBag.CaseConverterTitle = _localizer["CaseConverterTitle"];
ViewBag.JpgToWebpTitle = _localizer["JpgToWebpTitle"];
ViewBag.FooterText = _localizer["FooterText"];
ViewBag.About = _localizer["About"];
ViewBag.Contact = _localizer["Contact"];
ViewBag.Terms = _localizer["Terms"];
}
// Método GET: Apenas exibe a página com um formulário vazio.
[HttpGet]
public IActionResult Index()
{
SetCommonViewBagProperties();
ViewBag.PageTitle = _localizer["TextToolsPageTitle"];
ViewBag.TextAreaLabel = _localizer["TextAreaLabel"];
ViewBag.ToUpperButton = _localizer["ToUpperButton"];
ViewBag.ToLowerButton = _localizer["ToLowerButton"];
ViewBag.ToSentenceCaseButton = _localizer["ToSentenceCaseButton"];
ViewBag.ResultTitle = _localizer["ResultTitle"];
var model = new CaseConverterViewModel();
return View(model);
}
// Método POST: Recebe o formulário, processa e retorna o resultado.
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult Index([FromForm] CaseConverterViewModel model)
{
SetCommonViewBagProperties();
ViewBag.PageTitle = _localizer["TextToolsPageTitle"];
ViewBag.TextAreaLabel = _localizer["TextAreaLabel"];
ViewBag.ToUpperButton = _localizer["ToUpperButton"];
ViewBag.ToLowerButton = _localizer["ToLowerButton"];
ViewBag.ToSentenceCaseButton = _localizer["ToSentenceCaseButton"];
ViewBag.ResultTitle = _localizer["ResultTitle"];
if (!ModelState.IsValid || string.IsNullOrEmpty(model.InputText))
{
// Se o modelo for inválido ou o texto estiver vazio, retorna a view sem fazer nada.
return View(model);
}
// Executa a conversão baseada no valor do botão pressionado
model.ResultText = model.ConversionType switch
{
"upper" => model.InputText.ToUpper(),
"lower" => model.InputText.ToLower(),
"sentence" => ToSentenceCase(model.InputText),
_ => model.InputText // Caso padrão, não faz nada
};
// Retorna a mesma view, agora com o modelo preenchido (InputText e ResultText)
return View(model);
}
/// <summary>
/// Converte uma string para "Sentence case", onde a primeira letra de cada sentença é maiúscula.
/// </summary>
private string ToSentenceCase(string input)
{
if (string.IsNullOrEmpty(input)) return input;
var lowerCase = input.ToLower();
// Regex para encontrar o primeiro caractere da string ou o primeiro caractere após um ponto e espaço.
var r = new Regex(@"(^[a-z])|\.\s+(.)", RegexOptions.ExplicitCapture);
return r.Replace(lowerCase, s => s.Value.ToUpper());
}
}
}