Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions TagCloud.Client/CLI/CliOptions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
using CommandLine;

namespace TagCloud.Client.CLI;

public class CliOptions
{
[Option("inputFile")]
public string InputFilePath { get; set; } = null!;

[Option("boringWordsFile")]
public string BoringWordsFilePath { get; set; } = null!;

[Option("outputFile")]
public string OutputFilePath { get; set; } = "tagcloud.png";

[Option("width")]
public int ImageWidth { get; set; } = 1920;

[Option("height")]
public int ImageHeight { get; set; } = 1080;

[Option("font")]
public string FontName { get; set; } = "Arial";

[Option("min-font-size")]
public float MinFontSize { get; set; } = 10;

[Option("max-font-size")]
public float MaxFontSize { get; set; } = 60;

[Option("colorizer")]
public string ColorizerName { get; set; } = "gradient";

[Option("colors")]
public string Colors { get; set; } = "#ff0000";

[Option("background-color")]
public string BackgroundColor { get; set; } = "#000000";

[Option("gradient-from")]
public string GradientFrom { get; set; } = "#ff0000";

[Option("gradient-to")]
public string GradientTo { get; set; } = "#000000";
}
46 changes: 46 additions & 0 deletions TagCloud.Client/CLI/Runner.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
using Autofac;
using TagCloud.Client.DI;
using TagCloud.Options;

namespace TagCloud.Client.CLI;

public class Runner
{
public int Run(CliOptions options)
{
var builder = new ContainerBuilder();
builder.RegisterModule(new TagCloudModule());

var container = builder.Build();

var tagCloud = container.Resolve<ITagCloudGenerator>();

var tagCloudOptions = new TagCloudOptions
{
InputFilePath = options.InputFilePath,
BoringWordsFilePath = options.BoringWordsFilePath,
OutputFilePath = options.OutputFilePath,
ImageWidth = options.ImageWidth,
ImageHeight = options.ImageHeight,
FontName = options.FontName,
MinFontSize = options.MinFontSize,
MaxFontSize = options.MaxFontSize,
ColorizerName = options.ColorizerName,
Colors = options.Colors,
GradientFrom = options.GradientFrom,
GradientTo = options.GradientTo,
BackgroundColor = options.BackgroundColor
};

var result = tagCloud.Generate(tagCloudOptions);

if (!result.IsSuccess)
{
Console.WriteLine(result.Error);
return 1;
}

Console.WriteLine($"Tag cloud saved to {options.OutputFilePath}");
return 0;
}
}
67 changes: 67 additions & 0 deletions TagCloud.Client/DI/TagCloudModule.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
using Autofac;
using TagCloud.Colors;
using TagCloud.Colors.Factories;
using TagCloud.Layouters;
using TagCloud.Sizing;
using TagCloud.Visualizers;
using TagCloud.WordsProcessing;
using TagCloud.WordsProcessing.Filters;
using TagCloud.WordsProviders;

namespace TagCloud.Client.DI;

public class TagCloudModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<WordsProviderResolver>().As<IWordsProviderResolver>().SingleInstance();
builder.RegisterType<TxtWordsProvider>().As<IWordsProvider>().SingleInstance();
builder.RegisterType<DocWordsProvider>().As<IWordsProvider>().SingleInstance();
builder.RegisterType<DocxWordsProvider>().As<IWordsProvider>().SingleInstance();
builder.RegisterType<WordLowercaser>()
.As<IWordNormalizer>()
.SingleInstance();
builder.RegisterType<BoringWordsProvider>()
.As<IBoringWordsProvider>()
.SingleInstance();
builder.RegisterType<WordFilterFactory>()
.As<IWordFilterFactory>()
.SingleInstance();
builder.RegisterType<WordProcessor>()
.As<IWordProcessor>()
.SingleInstance();
builder.RegisterType<FrequencyCounter>()
.As<IFrequencyCounter>()
.SingleInstance();
builder.RegisterType<FontSizeCalculator>()
.As<IFontSizeCalculator>()
.SingleInstance();
builder.RegisterType<TextTagSizeCalculator>()
.As<ITextTagSizeCalculator>()
.SingleInstance();
builder.RegisterType<CircularCloudLayouterFactory>()
.As<ICircularCloudLayouterFactory>()
.SingleInstance();
builder.RegisterType<WordColorizerFactory>()
.As<IWordColorizerFactory>()
.SingleInstance();
builder.RegisterType<WordSingleColorizerCreator>()
.Keyed<IWordColorizerCreator>("single")
.SingleInstance();
builder.RegisterType<WordPaletteColorizerCreator>()
.Keyed<IWordColorizerCreator>("palette")
.SingleInstance();
builder.RegisterType<WordGradientColorizerCreator>()
.Keyed<IWordColorizerCreator>("gradient")
.SingleInstance();
builder.RegisterType<HexColorParser>()
.As<IColorParser>()
.SingleInstance();
builder.RegisterType<TagCloudVisualizer>()
.As<ITagCloudVisualizer>()
.SingleInstance();
builder.RegisterType<TagCloudGenerator>()
.As<ITagCloudGenerator>()
.InstancePerDependency();
}
}
7 changes: 7 additions & 0 deletions TagCloud.Client/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// See https://aka.ms/new-console-template for more information

using CommandLine;
using TagCloud.Client.CLI;

var runner = new Runner();
Parser.Default.ParseArguments<CliOptions>(args).MapResult(runner.Run, _ => 1);
10 changes: 10 additions & 0 deletions TagCloud.Client/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Запуск генератора облака слов

Для запуска программы генерирующей раскладку облака слов, данных в файле нужно перейти в директорию клиента и запустить программу

```cd TagCloud.Client```


```dotnet run --inputFile .\test.txt --boringWordsFile .\boringwords.txt --colorizer palette --colors "#ff00ff,#ff0000,#008000"```

Все доступные опции можно посмотреть в CLI/CliOptions.cs
20 changes: 20 additions & 0 deletions TagCloud.Client/TagCloud.Client.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Autofac" Version="9.0.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" />
<PackageReference Include="CommandLineParser" Version="2.9.1" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\TagCloud\TagCloud.csproj" />
</ItemGroup>

</Project>
1 change: 1 addition & 0 deletions TagCloud.Client/boringwords.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
и
Binary file added TagCloud.Client/tagcloud.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added TagCloud.Client/test.doc
Binary file not shown.
Binary file added TagCloud.Client/test.docx
Binary file not shown.
49 changes: 49 additions & 0 deletions TagCloud.Client/test.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
слова
это
очень
прикольно
и
здорово
даже
пара
слов
может
сильно
растрогать
или
задеть
но
всё
равно
это
просто
замечательно
здорово
и
великолепно
даже
очень
здорово
здоровее
чем
буквы
хотя
из
букв
составляют
слова
замечательно
здорово
и
великолепно
даже
очень
здорово
здоровее
чем
буквы
хотя
из
букв
составляют
слова
9 changes: 9 additions & 0 deletions TagCloud/Colors/Factories/IWordColorizerCreator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using TagCloud.Options;
using TagCloud.ResultModel;

namespace TagCloud.Colors.Factories;

public interface IWordColorizerCreator
{
public Result<IWordColorizer> Create(TagCloudOptions options);
}
9 changes: 9 additions & 0 deletions TagCloud/Colors/Factories/IWordColorizerFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using TagCloud.Options;
using TagCloud.ResultModel;

namespace TagCloud.Colors.Factories;

public interface IWordColorizerFactory
{
public Result<IWordColorizer> Create(TagCloudOptions options);
}
19 changes: 19 additions & 0 deletions TagCloud/Colors/Factories/WordColorizerFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using Autofac.Features.Indexed;
using TagCloud.Options;
using TagCloud.ResultModel;

namespace TagCloud.Colors.Factories;

public class WordColorizerFactory(IIndex<string, IWordColorizerCreator> creators) : IWordColorizerFactory
{
public Result<IWordColorizer> Create(TagCloudOptions options)
{
if (string.IsNullOrWhiteSpace(options.ColorizerName))
return Result.Fail<IWordColorizer>("Colorizer name not specified");

if (!creators.TryGetValue(options.ColorizerName, out var creator))
return Result.Fail<IWordColorizer>($"Colorizer {options.ColorizerName} not found");

return creator.Create(options);
}
}
18 changes: 18 additions & 0 deletions TagCloud/Colors/Factories/WordGradientColorizerCreator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using TagCloud.Options;
using TagCloud.ResultModel;

namespace TagCloud.Colors.Factories;

public class WordGradientColorizerCreator(IColorParser parser) : IWordColorizerCreator
{
public Result<IWordColorizer> Create(TagCloudOptions options)
{
var fromRaw = options.GradientFrom ?? "#1E3A8A";
var toRaw = options.GradientTo ?? "#B91C1C";

return parser.Parse(fromRaw)
.Then(from => parser.Parse(toRaw).Then(to =>
Result.Ok<IWordColorizer>(new WordGradientColorizer(from, to))))
.RefineError("Can't create gradient colorizer");
}
}
15 changes: 15 additions & 0 deletions TagCloud/Colors/Factories/WordPaletteColorizerCreator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using TagCloud.Options;
using TagCloud.ResultModel;

namespace TagCloud.Colors.Factories;

public class WordPaletteColorizerCreator(IColorParser parser) : IWordColorizerCreator
{
public Result<IWordColorizer> Create(TagCloudOptions options)
{
var colorsText = options.Colors ?? "#cd5b45,#c51d34,#ffb28b,#cdb891";
return parser.ParseMany(colorsText)
.Then(c => Result.Ok<IWordColorizer>(new WordPaletteColorizer(c)))
.RefineError("Can't create palette colorizer");
}
}
15 changes: 15 additions & 0 deletions TagCloud/Colors/Factories/WordSingleColorizerCreator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using TagCloud.Options;
using TagCloud.ResultModel;

namespace TagCloud.Colors.Factories;

public class WordSingleColorizerCreator(IColorParser parser) : IWordColorizerCreator
{
public Result<IWordColorizer> Create(TagCloudOptions options)
{
var colorText = options.Colors ?? "#cd5b45";
return parser.Parse(colorText)
.Then(c => Result.Ok<IWordColorizer>(new WordSingleColorizer(c)))
.RefineError("Can't create single colorizer");
}
}
37 changes: 37 additions & 0 deletions TagCloud/Colors/HexColorParser.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
using SixLabors.ImageSharp;
using TagCloud.ResultModel;

namespace TagCloud.Colors;

public class HexColorParser : IColorParser
{
public Result<Color> Parse(string color)
{
if (string.IsNullOrWhiteSpace(color))
return Result.Fail<Color>("Color cannot be null or empty");

if (!Color.TryParse(color, out Color colorResult))
return Result.Fail<Color>($"Invalid color {color}");

return Result.Ok(colorResult);
}

public Result<List<Color>> ParseMany(string colors)
{
var parts = colors.Split(',');

if (parts.Length == 0)
return Result.Fail<List<Color>>($"Colors cannot be empty");

var colorList = new List<Color>();
foreach (var part in parts)
{
var color = Parse(part);
if (!color.IsSuccess)
return Result.Fail<List<Color>>(color.Error);
colorList.Add(color.GetValueOrThrow());
}

return Result.Ok(colorList);
}
}
Loading