Skip to content

Commit f372489

Browse files
authored
Merge pull request #4 from tomc128/web-ui
Project restructure & new web UI
2 parents cdbf69a + ac83b85 commit f372489

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+955
-59
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net7.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
<PackageId>BooleanExpressionParser.CLI</PackageId>
9+
<Version>1.2.0</Version>
10+
<Authors>Tom Chapman</Authors>
11+
</PropertyGroup>
12+
13+
<ItemGroup>
14+
<PackageReference Include="Spectre.Console" Version="0.45.0" />
15+
<PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
16+
</ItemGroup>
17+
18+
<ItemGroup>
19+
<ProjectReference Include="..\BooleanExpressionParser\BooleanExpressionParser.csproj" />
20+
</ItemGroup>
21+
22+
</Project>

BooleanExpressionParser/Formatters/DisplayFormatter.cs renamed to BooleanExpressionParser.CLI/Formatters/DisplayFormatter.cs

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
using System.Globalization;
22
using System.Text;
3+
using BooleanExpressionParser.Formatters;
4+
using BooleanExpressionParser.Tokens;
35
using Spectre.Console;
46

5-
namespace BooleanExpressionParser.Formatter;
7+
namespace BooleanExpressionParser.CLI.Formatters;
68

7-
enum ColourMode
9+
public enum ColourMode
810
{
911
None,
1012
Foreground,
1113
Background
1214
}
1315

14-
15-
class DisplayFormatter : IFormatter
16+
public class DisplayFormatter : IFormatter
1617
{
1718
private static int FinalPadding = 2;
1819

@@ -128,7 +129,7 @@ static string PadBoth(string source, int totalLength, char paddingChar = ' ')
128129
}
129130

130131

131-
public String JoinTruthTables(params string[] tables)
132+
public string JoinTruthTables(params string[] tables)
132133
{
133134
var sb = new StringBuilder();
134135

BooleanExpressionParser/Program.cs renamed to BooleanExpressionParser.CLI/Program.cs

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
using System.CommandLine;
1+
using System.CommandLine;
22
using System.Text;
3-
using BooleanExpressionParser.Formatter;
3+
using System;
44
using Spectre.Console;
5+
using BooleanExpressionParser.CLI.Formatters;
6+
using BooleanExpressionParser.Formatters;
57

6-
namespace BooleanExpressionParser;
8+
namespace BooleanExpressionParser.CLI;
79

810

911
enum OutputType
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"profiles": {
3+
"BooleanExpressionParser.CLI - table": {
4+
"commandName": "Project",
5+
"commandLineArgs": "table"
6+
},
7+
"BooleanExpressionParser.CLI - convert": {
8+
"commandName": "Project",
9+
"commandLineArgs": "convert"
10+
}
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Router AppAssembly="@typeof(App).Assembly">
2+
<Found Context="routeData">
3+
<RouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)" />
4+
<FocusOnNavigate RouteData="@routeData" Selector="h1" />
5+
</Found>
6+
<NotFound>
7+
<PageTitle>Not found</PageTitle>
8+
<LayoutView Layout="@typeof(MainLayout)">
9+
<p role="alert">Sorry, there's nothing at this address.</p>
10+
</LayoutView>
11+
</NotFound>
12+
</Router>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<Project Sdk="Microsoft.NET.Sdk.BlazorWebAssembly">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net7.0</TargetFramework>
5+
<Nullable>annotations</Nullable>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<ServiceWorkerAssetsManifest>service-worker-assets.js</ServiceWorkerAssetsManifest>
8+
<PackageId>BooleanExpressionParser.Web.Client</PackageId>
9+
<Version>1.0.0</Version>
10+
<Authors>Tom Chapman</Authors>
11+
</PropertyGroup>
12+
13+
<ItemGroup>
14+
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.1" />
15+
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.1" PrivateAssets="all" />
16+
<PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
17+
</ItemGroup>
18+
19+
<ItemGroup>
20+
<ProjectReference Include="..\Shared\BooleanExpressionParser.Web.Shared.csproj" />
21+
<ProjectReference Include="..\..\BooleanExpressionParser\BooleanExpressionParser.csproj" />
22+
</ItemGroup>
23+
24+
<ItemGroup>
25+
<ServiceWorker Include="wwwroot\service-worker.js" PublishedContent="wwwroot\service-worker.published.js" />
26+
</ItemGroup>
27+
28+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<input placeholder="Enter expression" @oninput="OnInputChanged" @bind="expression"/>
2+
<button @onclick="OnButtonClicked">@ButtonLabel</button>
3+
4+
5+
@code {
6+
[Parameter]
7+
public string ButtonLabel {get; set;}
8+
9+
public string? expression;
10+
11+
[Parameter]
12+
public EventCallback<string> ButtonClicked { get; set; }
13+
14+
[Parameter]
15+
public EventCallback<string> ExpressionChanged { get; set; }
16+
17+
private Task OnButtonClicked()
18+
{
19+
return ButtonClicked.InvokeAsync(expression);
20+
}
21+
22+
private Task OnInputChanged(ChangeEventArgs args)
23+
{
24+
return ExpressionChanged.InvokeAsync(args.Value.ToString());
25+
}
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<div class="container">
2+
<h3>Boolean Expression Parser</h3>
3+
<nav>
4+
<ul>
5+
<li>
6+
<NavLink class="nav-link" href="/" Match="NavLinkMatch.All">Home</NavLink>
7+
</li>
8+
<li>
9+
<NavLink class="nav-link" href="/truth-table" Match="NavLinkMatch.All">Truth Table Generator</NavLink>
10+
</li>
11+
<li>
12+
<NavLink class="nav-link" href="/evaluator" Match="NavLinkMatch.All">Evaluator</NavLink>
13+
</li>
14+
<li>
15+
<NavLink class="nav-link" href="/notation-converter" Match="NavLinkMatch.All">Notation Converter</NavLink>
16+
</li>
17+
</ul>
18+
</nav>
19+
</div>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
.container {
2+
display: flex;
3+
justify-content: space-between;
4+
padding: 2rem;
5+
}
6+
7+
.container ul {
8+
display: flex;
9+
gap: 2rem;
10+
}
11+
12+
.container ul li {
13+
list-style: none;
14+
}
15+
16+
.container ul li ::deep .nav-link {
17+
text-decoration: none;
18+
color: black;
19+
}
20+
21+
.container ul li ::deep .nav-link.active {
22+
font-weight: bold;
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
@foreach (var item in Ast.Variables)
2+
{
3+
<span>@item</span>
4+
<input size="3" @bind="inputs[item]" />
5+
}
6+
7+
<button @onclick="OnButtonClicked">Evaluate</button>
8+
9+
10+
@code {
11+
[Parameter]
12+
public Ast Ast { get; set; }
13+
14+
[Parameter]
15+
public EventCallback<Dictionary<string, string?>> EvaluateClicked { get; set; }
16+
17+
private Dictionary<string, string?> inputs = new();
18+
19+
private Task OnButtonClicked()
20+
{
21+
return EvaluateClicked.InvokeAsync(inputs);
22+
}
23+
24+
protected override void OnParametersSet()
25+
{
26+
base.OnParametersSet();
27+
28+
foreach (var item in Ast.Variables)
29+
{
30+
if (!inputs.ContainsKey(item)) inputs.Add(item, null);
31+
}
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using BooleanExpressionParser.Formatters;
2+
using BooleanExpressionParser.Tokens;
3+
using System.Text;
4+
5+
namespace BooleanExpressionParser.Web.Client.Formatters;
6+
7+
public class HTMLFormatter : IFormatter
8+
{
9+
public string FormatTokens(IEnumerable<Token> tokens)
10+
{
11+
var sb = new StringBuilder();
12+
13+
foreach (Token token in tokens)
14+
{
15+
string s = token.ToString()!;
16+
if (token is OperatorToken && s.Length > 1) s = $"[[{s}]]";
17+
sb.Append(s);
18+
}
19+
20+
return sb.ToString();
21+
}
22+
23+
public string FormatTruthTable(Ast ast, List<bool[]> table, string label)
24+
{
25+
var sb = new StringBuilder();
26+
27+
// Generate HTML representation of the truth table
28+
// table
29+
// tr
30+
// th th th
31+
// tr ***
32+
// td td td
33+
34+
sb.Append("<table class=\"truth-table\">");
35+
36+
sb.Append("<tr>");
37+
for (int i = 0; i < ast.Variables.Count; i++)
38+
{
39+
string? item = ast.Variables[i];
40+
sb.Append($"<th>{item}</th>");
41+
}
42+
sb.Append($"<th>{label}</th>");
43+
sb.Append("</tr>");
44+
45+
foreach (bool[] row in table)
46+
{
47+
sb.Append("<tr>");
48+
for (int i = 0; i < row.Length; i++)
49+
{
50+
sb.Append($"<td class=\"{(row[i] ? "true" : "false")}\">{(row[i] ? "1" : "0")}</td>");
51+
}
52+
sb.Append("</tr>");
53+
}
54+
55+
return sb.ToString();
56+
}
57+
58+
public string JoinTruthTables(params string[] tables)
59+
{
60+
throw new NotImplementedException();
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
@inherits LayoutComponentBase
2+
@using BooleanExpressionParser.Web.Client.Components;
3+
4+
5+
<div id="nav-bar">
6+
<NavBar />
7+
</div>
8+
9+
<main>
10+
@Body
11+
</main>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
@page "/evaluator"
2+
@using BooleanExpressionParser.Web.Client.Components
3+
4+
<PageTitle>Expression Evaluator</PageTitle>
5+
6+
<h1>Expression Evaluator</h1>
7+
<p>Produces the output of an expression for given values.</p>
8+
9+
<ExpressionInput ButtonLabel="Load" ButtonClicked="ParseExpression" ExpressionChanged="ExpressionChanged" />
10+
11+
@if (expressionParsed)
12+
{
13+
<ValueInput Ast="ast" EvaluateClicked="Evaluate"/>
14+
}
15+
16+
@if (result is not null)
17+
{
18+
<h3>@result</h3>
19+
}
20+
21+
@code {
22+
private bool expressionParsed = false;
23+
private Ast? ast;
24+
private bool? result;
25+
26+
private void ExpressionChanged(string _)
27+
{
28+
expressionParsed = false;
29+
result = null;
30+
}
31+
32+
private void ParseExpression(string? expression)
33+
{
34+
if (string.IsNullOrWhiteSpace(expression)) return;
35+
var wrapper = new ExpressionWrapper(expression);
36+
37+
var tokeniser = new Tokeniser(wrapper.Expression);
38+
var infixTokens = tokeniser.Tokenise();
39+
40+
var parser = new Parser();
41+
var postfixTokens = parser.InfixToPostfix(infixTokens);
42+
43+
ast = parser.GrowAst(postfixTokens, wrapper.VariableOrder);
44+
45+
expressionParsed = true;
46+
}
47+
48+
private void Evaluate(Dictionary<string, string?> inputs)
49+
{
50+
// Parse inputs
51+
var values = inputs.Select(x => new { Key = x.Key, Value = x.Value == "1" }).ToDictionary(pair => pair.Key, pair => pair.Value);
52+
53+
result = ast.Root.Evaluate(values);
54+
}
55+
}
56+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
@page "/"
2+
3+
<PageTitle>Index Page</PageTitle>
4+
5+
<h1>BooleanExpressionParser - Web</h1>
6+
<p>This is a web UI for BooleanExpressionParser.</p>

0 commit comments

Comments
 (0)