added basic parsing support

This commit is contained in:
taywon18 2024-09-22 16:49:15 +02:00
parent 5707f5a2d4
commit 7169561eaa
7 changed files with 135 additions and 4 deletions

View File

@ -9,4 +9,6 @@ public class User
public class Configuration
{
public List<User> Users { get; set; } = new();
public string HomeAssistantUrl { get; set; } = "";
public string HomeAssistantToken { get; set; } = "";
}

View File

@ -1,10 +1,13 @@
@page "/page/{*Route}"
@inject PageProvider Pages;
@inject UserManager Users;
@inject ParsingManager Parser;
@inject NavigationManager NavManager;
@inject IJSRuntime JS
<span class="numericvalue">test</span>
@if (CurrentPage is null)
{
<p>Page introuvable</p>
@ -57,10 +60,9 @@ else
StateHasChanged();
}
Task OnMarkdownValueHTMLChanged(string value)
async Task OnMarkdownValueHTMLChanged(string value)
{
markdownHtml = value;
return Task.CompletedTask;
markdownHtml = await Parser.Parse(value);
}
void Save()

View File

@ -0,0 +1 @@


View File

@ -13,6 +13,7 @@ builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
builder.Services.AddHttpContextAccessor();
builder.Services.AddSingleton<PageProvider>();
builder.Services.AddSingleton<ParsingManager>();
builder.Services.AddScoped<UserManager>();
builder.Services.AddScoped<IHostEnvironmentAuthenticationStateProvider>(sp =>

View File

@ -1 +1,6 @@
# turlutu
# turlutu
{{display:number.kalanchoe_max_air_humidity}}
{{minmax_display:sensor.kalanchoe_air_humidity,number.kalanchoe_min_air_humidity,number.kalanchoe_max_air_humidity}}
{{minmax_display:sensor.bromelia_soil_moisture,number.kalanchoe_min_air_humidity,number.kalanchoe_max_air_humidity}}

View File

@ -0,0 +1,106 @@
using System.Globalization;
using System.Net.Http.Headers;
using System.Text.RegularExpressions;
namespace Tagger.Service;
public class HAResponse
{
public string state { get; set; }
}
public class ParsingManager
{
Configuration Conf;
HttpClient Client;
string Pattern = @"\{\{([a-zA-Z0-9._]+)\:([a-zA-Z0-9._]+)(?:,([a-zA-Z0-9._]+))*\}\}";
readonly string SimpleDisplay = "display";
readonly string MinMaxDisplay = "minmax_display";
public ParsingManager(IConfiguration configuration)
{
Conf = configuration.Get<Configuration>() ?? new();
Client = new();
Client.BaseAddress = new(Conf.HomeAssistantUrl);
Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Conf.HomeAssistantToken);
}
public async Task<string> Parse(string input)
{
return Regex.Replace(input, Pattern, (match) =>
{
if (match.Groups.Count <= 1)
return ($"(Bad func at {match.Index}, not any func)");
var allArgs = match.Groups.Values.Skip(1).ToArray();
string func = allArgs[0].ToString().ToLower();
List<string> args = new();
foreach (var i in allArgs.Skip(1))
foreach (var j in i.Captures)
if(j is not null)
args.Add(j.ToString());
if(func == SimpleDisplay)
return ParseDisplay(args.ToArray()).Result;
else if(func == MinMaxDisplay)
return ParseMinMaxDisplay(args.ToArray()).Result;
else
return match.Value;
});
}
public async Task<string> ParseDisplay(string[] args)
{
if(args.Length < 1)
return ($"(Bad {SimpleDisplay} call, need at least 1 argument)");
var r = await Get(args[0]).ConfigureAwait(false);
if (r is null)
return $"(Bad {SimpleDisplay} call, Not any result from call)";
return $"<span class=\"numeric-value\">{r}</span>";
}
public async Task<string> ParseMinMaxDisplay(string[] args)
{
if (args.Length < 3)
return ($"(Bad {SimpleDisplay} call, need at least 3 argument)");
var val = await Get(args[0]).ConfigureAwait(false);
if (val is null)
return $"(Bad {SimpleDisplay} call, Not any result from call for main (1st) argument)";
var min = await Get(args[1]).ConfigureAwait(false);
if (min is null)
return $"(Bad {SimpleDisplay} call, Not any result from call for min (2nd) argument)";
var max = await Get(args[2]).ConfigureAwait(false);
if (max is null)
return $"(Bad {SimpleDisplay} call, Not any result from call for max (3th) argument)";
bool isOk = val > min && val < max;
string emoji = isOk ? "✔️" : "❌";
string tag = isOk ? "numeric-value" : "numeric-value-error";
return $"<span class=\"{tag}\">{val}</span> {emoji} [<span class=\"numeric-value-range\">{min}</span>, <span class=\"numeric-value-range\">{max}</span>]";
}
public async Task<float?> Get(string item, CancellationToken tk = default)
{
try
{
var resp = await Client.GetFromJsonAsync<HAResponse>(item, tk).ConfigureAwait(false);
if (resp is null)
return null;
if (float.TryParse(resp.state, CultureInfo.InvariantCulture, out float value))
return value;
return null;
}
catch(Exception e)
{
return null;
};
}
}

View File

@ -66,3 +66,17 @@ a, .btn-link {
.blazor-error-boundary::after {
content: "An error has occurred."
}
.numeric-value {
color: blue;
}
.numeric-value-error {
color: red;
font-weight: bold;
}
.numeric-value-range{
}