From e37be7627a4f7cefc8b5627251722f8bd9bcad12 Mon Sep 17 00:00:00 2001 From: Chris Pulman Date: Sat, 26 Aug 2023 18:12:30 +0100 Subject: [PATCH] Migrated Spectre.Console to Spectre.Console.Rx Converted elements to use reactive code where required. Unfortunately the original source doesn't have any DI setup for swap out of components. --- build/Build.cs | 1 - src/LiveExample/LiveExample.csproj | 2 +- src/LiveExample/Program.cs | 8 +- src/LiveTableExample/LiveTableExample.csproj | 2 +- src/LiveTableExample/Program.cs | 33 +- src/ProgressExample/Program.cs | 73 +- src/ProgressExample/ProgressExample.csproj | 2 +- src/ProgressThreadExample/Program.cs | 21 +- .../ProgressThreadExample.csproj | 2 +- src/Shared/Shared.csproj | 17 - src/Spectre.Console.Rx.sln | 11 +- src/Spectre.Console.Rx/AnsiConsoleRx.cs | 119 +- .../ISpectreConsoleScheduler.cs | 39 + .../Internal/SpectreConsoleMessageQueue.cs | 132 + .../SpectreConsoleSynchronizationContext.cs | 143 + .../SynchronizationContextExtensions.cs | 46 + .../Spectre.Console.Rx.csproj | 19 +- .../Spectre.Console/AnsiConsole.Exceptions.cs | 24 + .../Spectre.Console/AnsiConsole.Live.cs | 17 + .../Spectre.Console/AnsiConsole.Markup.cs | 114 + .../Spectre.Console/AnsiConsole.Progress.cs | 22 + .../Spectre.Console/AnsiConsole.Prompt.cs | 57 + .../Spectre.Console/AnsiConsole.Recording.cs | 69 + .../Spectre.Console/AnsiConsole.Rendering.cs | 31 + .../Spectre.Console/AnsiConsole.Screen.cs | 16 + .../Spectre.Console/AnsiConsole.State.cs | 60 + .../Spectre.Console/AnsiConsole.Write.cs | 186 + .../Spectre.Console/AnsiConsole.WriteLine.cs | 203 + .../Spectre.Console/AnsiConsole.cs | 73 + .../Spectre.Console/AnsiConsoleFactory.cs | 105 + .../Spectre.Console/AnsiConsoleOutput.cs | 52 + .../Spectre.Console/AnsiConsoleSettings.cs | 53 + .../Spectre.Console/AnsiSupport.cs | 26 + .../Spectre.Console/BoxBorder.Known.cs | 41 + .../Spectre.Console/BoxBorder.cs | 22 + .../Spectre.Console/Capabilities.cs | 72 + .../Spectre.Console/Color.Generated.cs | 1359 +++ .../Spectre.Console/Color.cs | 242 + .../Spectre.Console/ColorSystem.cs | 35 + .../Spectre.Console/ColorSystemSupport.cs | 40 + .../Spectre.Console/CursorDirection.cs | 30 + .../Spectre.Console/Decoration.cs | 75 + .../Spectre.Console/Emoji.Generated.cs | 9298 +++++++++++++++++ .../Spectre.Console/Emoji.cs | 124 + .../Enrichment/CI/AppVeyorEnricher.cs | 13 + .../Enrichment/CI/BambooEnricher.cs | 13 + .../Enrichment/CI/BitbucketEnricher.cs | 15 + .../Enrichment/CI/BitriseEnricher.cs | 13 + .../Enrichment/CI/ContinuaEnricher.cs | 13 + .../Enrichment/CI/GitHubEnricher.cs | 27 + .../Enrichment/CI/GitLabEnricher.cs | 21 + .../Enrichment/CI/GoCDEnricher.cs | 13 + .../Enrichment/CI/JenkinsEnricher.cs | 13 + .../Enrichment/CI/MyGetEnricher.cs | 21 + .../Enrichment/CI/TeamCityEnricher.cs | 13 + .../Enrichment/CI/TfsEnricher.cs | 13 + .../Enrichment/CI/TravisEnricher.cs | 13 + .../Enrichment/ProfileEnricher.cs | 93 + .../Enrichment/ProfileEnrichment.cs | 22 + .../Advanced/AnsiConsoleExtensions.cs | 44 + .../Extensions/AlignExtensions.cs | 109 + .../Extensions/AlignableExtensions.cs | 83 + .../AnsiConsoleExtensions.Exceptions.cs | 42 + .../AnsiConsoleExtensions.Exclusive.cs | 44 + .../Extensions/AnsiConsoleExtensions.Input.cs | 129 + .../Extensions/AnsiConsoleExtensions.Live.cs | 31 + .../AnsiConsoleExtensions.Markup.cs | 148 + .../AnsiConsoleExtensions.Progress.cs | 40 + .../AnsiConsoleExtensions.Prompt.cs | 64 + .../AnsiConsoleExtensions.Rendering.cs | 31 + .../AnsiConsoleExtensions.Screen.cs | 52 + .../Extensions/AnsiConsoleExtensions.cs | 104 + .../Extensions/BarChartExtensions.cs | 252 + .../Extensions/BoxExtensions.cs | 31 + .../Extensions/BreakdownChartExtensions.cs | 285 + .../Extensions/CalendarExtensions.cs | 123 + .../Extensions/CharExtensions.cs | 17 + .../Extensions/ColorExtensions.cs | 14 +- .../Extensions/ColumnExtensions.cs | 47 + .../ConfirmationPromptExtensions.cs | 123 + .../Extensions/ContextExtensions.cs | 98 + .../Extensions/CursorExtensions.cs | 154 + .../Extensions/DayOfWeekExtensions.cs | 26 + .../Extensions/DictionaryExtensions.cs | 13 + .../Extensions/ExceptionExtensions.cs | 50 + .../Extensions/ExpandableExtensions.cs | 47 + .../Extensions/FigletTextExtensions.cs | 27 + .../Extensions/GridExtensions.cs | 115 + .../Extensions/HasBorderExtensions.cs | 84 + .../Extensions/HasBoxBorderExtensions.cs | 83 + .../Extensions/HasCultureExtensions.cs | 62 + .../Extensions/HasJustificationExtensions.cs | 83 + .../Extensions/HasTableBorderExtensions.cs | 191 + .../Extensions/HasTreeNodeExtensions.cs | 214 + .../Extensions/Int32Extensions.cs | 22 + .../Extensions/LayoutExtensions.cs | 61 + .../Extensions/ListExtensions.cs | 37 + .../Extensions/LiveDisplayExtensions.cs | 65 + .../Extensions/OverflowableExtensions.cs | 80 + .../Extensions/PaddableExtensions.cs | 125 + .../Extensions/PaddingExtensions.cs | 38 + .../Extensions/PanelExtensions.cs | 77 + .../Progress/PercentageColumnExtensions.cs | 54 + .../Progress/ProgressBarColumnExtensions.cs | 76 + .../Extensions/Progress/ProgressExtensions.cs | 98 + .../Progress/ProgressTaskExtensions.cs | 78 + .../Progress/RemainingTimeColumnExtensions.cs | 32 + .../Progress/SpinnerColumnExtensions.cs | 62 + .../Progress/StatusContextExtensions.cs | 61 + .../Extensions/Progress/StatusExtensions.cs | 62 + .../Extensions/RecorderExtensions.cs | 43 + .../Extensions/RenderOptionsExtensions.cs | 10 + .../Extensions/RenderableExtensions.cs | 45 + .../Extensions/RuleExtensions.cs | 54 + .../Extensions/StackExtensions.cs | 23 + .../Extensions/StringBuilderExtensions.cs | 36 + .../Extensions/StringExtensions.cs | 222 + .../Extensions/StyleExtensions.cs | 107 + .../Extensions/TableBorderExtensions.cs | 31 + .../Extensions/TableColumnExtensions.cs | 98 + .../Extensions/TableExtensions.cs | 449 + .../Extensions/TextPathExtensions.cs | 110 + .../Extensions/TextWriterExtensions.cs | 31 + .../Extensions/TreeExtensions.cs | 44 + .../Extensions/TreeGuideExtensions.cs | 31 + .../Extensions/TreeNodeExtensions.cs | 41 + .../Extensions/VisibilityExtensions.cs | 46 + .../Spectre.Console/HorizontalAlignment.cs | 25 + .../Spectre.Console/IAlignable.cs | 15 + .../Spectre.Console/IAnsiConsole.cs | 47 + .../Spectre.Console/IAnsiConsoleCursor.cs | 30 + .../Spectre.Console/IAnsiConsoleInput.cs | 32 + .../Spectre.Console/IAnsiConsoleOutput.cs | 36 + .../Spectre.Console/IColumn.cs | 21 + .../Spectre.Console/IExclusivityMode.cs | 26 + .../Spectre.Console/IExpandable.cs | 17 + .../Spectre.Console/IHasBorder.cs | 22 + .../Spectre.Console/IHasBoxBorder.cs | 15 + .../Spectre.Console/IHasCulture.cs | 15 + .../Spectre.Console/IHasJustification.cs | 15 + .../Spectre.Console/IHasTableBorder.cs | 15 + .../Spectre.Console/IHasTreeNodes.cs | 15 + .../Spectre.Console/IHasVisibility.cs | 16 + .../Spectre.Console/IOverflowable.cs | 15 + .../Spectre.Console/IPaddable.cs | 15 + .../Spectre.Console/IProfileEnricher.cs | 28 + .../Spectre.Console/IReadOnlyCapabilities.cs | 56 + .../Spectre.Console/IRenderable.cs | 26 + .../Spectre.Console/InteractionSupport.cs | 26 + .../Spectre.Console/Internal/Aligner.cs | 142 + .../Internal/Backends/Ansi/AnsiBuilder.cs | 106 + .../Backends/Ansi/AnsiColorBuilder.cs | 65 + .../Backends/Ansi/AnsiConsoleBackend.cs | 40 + .../Backends/Ansi/AnsiConsoleCursor.cs | 51 + .../Backends/Ansi/AnsiDecorationBuilder.cs | 56 + .../Internal/Backends/Ansi/AnsiDetector.cs | 140 + .../Internal/Backends/Ansi/AnsiLinkHasher.cs | 38 + .../Internal/Backends/Ansi/AnsiSequences.cs | 136 + .../Internal/Backends/AnsiConsoleFacade.cs | 60 + .../Internal/Backends/IAnsiConsoleBackend.cs | 27 + .../Backends/Legacy/LegacyConsoleBackend.cs | 62 + .../Backends/Legacy/LegacyConsoleCursor.cs | 39 + .../Spectre.Console/Internal/Cell.cs | 39 + .../Internal/Collections/ListWithCallback.cs | 69 + .../Internal/Colors/ColorPalette.Generated.cs | 292 + .../Internal/Colors/ColorPalette.cs | 81 + .../Internal/Colors/ColorSystemDetector.cs | 91 + .../Internal/Colors/ColorTable.Generated.cs | 313 + .../Internal/Colors/ColorTable.cs | 56 + .../Spectre.Console/Internal/ConsoleHelper.cs | 43 + .../Spectre.Console/Internal/Constants.cs | 12 + .../Internal/DecorationTable.cs | 73 + .../Internal/DefaultExclusivityMode.cs | 75 + .../Spectre.Console/Internal/DefaultInput.cs | 56 + .../Internal/Extensions/CharExtensions.cs | 9 + .../Extensions/EnumerableExtensions.cs | 115 + .../Spectre.Console/Internal/FileSize.cs | 81 + .../Spectre.Console/Internal/FileSizeUnit.cs | 17 + .../Internal/IRatioResolvable.cs | 25 + .../Internal/Polyfill/IsExternalInit.cs | 17 + .../Spectre.Console/Internal/Ratio.cs | 141 + .../Internal/ResourceReader.cs | 31 + .../Text/Encoding/EncoderCapabilities.cs | 21 + .../Internal/Text/Encoding/HtmlEncoder.cs | 121 + .../Internal/Text/Encoding/TextEncoder.cs | 29 + .../Internal/Text/Markup/MarkupParser.cs | 63 + .../Internal/Text/Markup/MarkupToken.cs | 13 + .../Internal/Text/Markup/MarkupTokenKind.cs | 11 + .../Internal/Text/Markup/MarkupTokenizer.cs | 189 + .../Internal/Text/StringBuffer.cs | 58 + .../Internal/TypeConverterHelper.cs | 77 + .../Spectre.Console/Justify.cs | 25 + .../Spectre.Console/Live/LiveDisplay.cs | 116 + .../Live/LiveDisplayContext.cs | 54 + .../Live/LiveDisplayRenderer.cs | 58 + .../Spectre.Console/Live/LiveRenderable.cs | 146 + .../Live/Progress/Columns/DownloadedColumn.cs | 37 + .../Progress/Columns/ElapsedTimeColumn.cs | 38 + .../Live/Progress/Columns/PercentageColumn.cs | 31 + .../Progress/Columns/ProgressBarColumn.cs | 48 + .../Progress/Columns/RemainingTimeColumn.cs | 38 + .../Live/Progress/Columns/SpinnerColumn.cs | 144 + .../Progress/Columns/TaskDescriptionColumn.cs | 25 + .../Progress/Columns/TransferSpeedColumn.cs | 27 + .../Spectre.Console/Live/Progress/IContext.cs | 15 + .../Spectre.Console/Live/Progress/Progress.cs | 169 + .../Live/Progress/ProgressColumn.cs | 31 + .../Live/Progress/ProgressContext.cs | 113 + .../Live/Progress/ProgressRefreshThread.cs | 15 + .../Live/Progress/ProgressRenderer.cs | 21 + .../Live/Progress/ProgressSample.cs | 11 + .../Live/Progress/ProgressTask.cs | 309 + .../Live/Progress/ProgressTaskSettings.cs | 27 + .../Live/Progress/ProgressTaskState.cs | 80 + .../Renderers/DefaultProgressRenderer.cs | 108 + .../Renderers/FallbackProgressRenderer.cs | 120 + .../Renderers/FallbackStatusRenderer.cs | 54 + .../Live/Progress/Spinner.Generated.cs | 1871 ++++ .../Spectre.Console/Live/Progress/Spinner.cs | 26 + .../Spectre.Console/Live/Status/Status.cs | 123 + .../Live/Status/StatusContext.cs | 73 + .../Spectre.Console/Overflow.cs | 26 + .../Spectre.Console/Padding.cs | 107 + .../Spectre.Console/Profile.cs | 146 + .../Prompts/ConfirmationPrompt.cs | 81 + .../Prompts/DefaultPromptValue.cs | 9 + .../Prompts/IMultiSelectionItem.cs | 23 + .../Spectre.Console/Prompts/IPrompt.cs | 26 + .../Spectre.Console/Prompts/ISelectionItem.cs | 19 + .../Prompts/List/IListPromptStrategy.cs | 39 + .../Prompts/List/ListPrompt.cs | 112 + .../Prompts/List/ListPromptConstants.cs | 14 + .../Prompts/List/ListPromptInputResult.cs | 12 + .../Prompts/List/ListPromptItem.cs | 76 + .../Prompts/List/ListPromptRenderHook.cs | 55 + .../Prompts/List/ListPromptState.cs | 45 + .../Prompts/List/ListPromptTree.cs | 56 + .../Prompts/MultiSelectionPrompt.cs | 264 + .../Prompts/MultiSelectionPromptExtensions.cs | 368 + .../Spectre.Console/Prompts/SelectionMode.cs | 21 + .../Prompts/SelectionPrompt.cs | 183 + .../Prompts/SelectionPromptExtensions.cs | 264 + .../Spectre.Console/Prompts/TextPrompt.cs | 242 + .../Prompts/TextPromptExtensions.cs | 361 + .../Prompts/ValidationResult.cs | 39 + .../Spectre.Console/Properties/Usings.cs | 16 + .../Spectre.Console/Recorder.cs | 75 + .../Spectre.Console/Region.cs | 32 + .../Rendering/Borders/BoxBorderPart.cs | 50 + .../Rendering/Borders/Boxes/AsciiBoxBorder.cs | 24 + .../Borders/Boxes/DoubleBoxBorder.cs | 24 + .../Rendering/Borders/Boxes/HeavyBoxBorder.cs | 27 + .../Rendering/Borders/Boxes/NoBoxBorder.cs | 13 + .../Borders/Boxes/RoundedBoxBorder.cs | 27 + .../Borders/Boxes/SquareBoxBorder.cs | 24 + .../Rendering/Borders/TableBorderPart.cs | 120 + .../Borders/Tables/Ascii2TableBorder.cs | 38 + .../Tables/AsciiDoubleHeadTableBorder.cs | 38 + .../Borders/Tables/AsciiTableBorder.cs | 38 + .../Borders/Tables/DoubleEdgeTableBorder.cs | 38 + .../Borders/Tables/DoubleTableBorder.cs | 38 + .../Borders/Tables/HeavyEdgeTableBorder.cs | 41 + .../Borders/Tables/HeavyHeadTableBorder.cs | 41 + .../Borders/Tables/HeavyTableBorder.cs | 41 + .../Borders/Tables/HorizontalTableBorder.cs | 38 + .../Borders/Tables/MarkdownTableBorder.cs | 108 + .../Tables/MinimalDoubleHeadTableBorder.cs | 38 + .../Tables/MinimalHeavyHeadTableBorder.cs | 41 + .../Borders/Tables/MinimalTableBorder.cs | 38 + .../Rendering/Borders/Tables/NoTableBorder.cs | 16 + .../Borders/Tables/RoundedTableBorder.cs | 41 + .../Borders/Tables/SimpleHeavyTableBorder.cs | 41 + .../Borders/Tables/SimpleTableBorder.cs | 38 + .../Borders/Tables/SquareTableBorder.cs | 38 + .../Rendering/IAnsiConsoleEncoder.cs | 19 + .../Rendering/IHasDirtyState.cs | 15 + .../Spectre.Console/Rendering/IRenderHook.cs | 18 + .../Rendering/JustInTimeRenderable.cs | 66 + .../Spectre.Console/Rendering/Measurement.cs | 59 + .../Rendering/RenderHookScope.cs | 29 + .../Rendering/RenderOptions.cs | 66 + .../Rendering/RenderPipeline.cs | 66 + .../Spectre.Console/Rendering/Renderable.cs | 34 + .../Spectre.Console/Rendering/Segment.cs | 636 ++ .../Spectre.Console/Rendering/SegmentLine.cs | 51 + .../Rendering/SegmentLineEnumerator.cs | 32 + .../Rendering/SegmentLineIterator.cs | 118 + .../Spectre.Console/Rendering/SegmentShape.cs | 53 + .../Spectre.Console/Rendering/TablePart.cs | 30 + .../Rendering/Tree/AsciiTreeGuide.cs | 20 + .../Rendering/Tree/BoldLineTreeGuide.cs | 23 + .../Rendering/Tree/DoubleLineTreeGuide.cs | 23 + .../Rendering/Tree/LineTreeGuide.cs | 20 + .../Rendering/TreeGuidePart.cs | 30 + .../Spectre.Console/Size.cs | 22 + .../Spectre.Console/Style.cs | 219 + .../Spectre.Console/StyleParser.cs | 229 + .../Spectre.Console/TableBorder.Known.cs | 101 + .../Spectre.Console/TableBorder.cs | 98 + .../Spectre.Console/TreeGuide.Known.cs | 30 + .../Spectre.Console/TreeGuide.cs | 22 + .../Spectre.Console/VerticalAlignment.cs | 25 + .../Spectre.Console/VerticalOverflow.cs | 25 + .../VerticalOverflowCropping.cs | 20 + .../Spectre.Console/Widgets/Align.cs | 132 + .../Spectre.Console/Widgets/Calendar.cs | 273 + .../Spectre.Console/Widgets/CalendarEvent.cs | 48 + .../Spectre.Console/Widgets/Canvas.cs | 172 + .../Widgets/Charts/BarChart.cs | 98 + .../Widgets/Charts/BarChartItem.cs | 31 + .../Widgets/Charts/BreakdownBar.cs | 34 + .../Widgets/Charts/BreakdownChart.cs | 110 + .../Widgets/Charts/BreakdownChartItem.cs | 28 + .../Widgets/Charts/BreakdownTags.cs | 63 + .../Widgets/Charts/IBarChartItem.cs | 25 + .../Widgets/Charts/IBreakdownChartItem.cs | 25 + .../Widgets/CircularTreeException.cs | 24 + .../Spectre.Console/Widgets}/ColorBox.cs | 51 +- .../Spectre.Console/Widgets/Columns.cs | 178 + .../Spectre.Console/Widgets/ControlCode.cs | 21 + .../Widgets/Exceptions/ExceptionFormats.cs | 41 + .../Widgets/Exceptions/ExceptionFormatter.cs | 456 + .../Widgets/Exceptions/ExceptionSettings.cs | 29 + .../Widgets/Exceptions/ExceptionStyle.cs | 60 + .../Widgets/Exceptions/StringUriExtensions.cs | 40 + .../Widgets/Exceptions/TypeNameHelper.cs | 190 + .../Widgets/Figlet/FigletCharacter.cs | 31 + .../Widgets/Figlet/FigletFont.cs | 125 + .../Widgets/Figlet/FigletFontParser.cs | 114 + .../Widgets/Figlet/FigletHeader.cs | 19 + .../Widgets/Figlet/FigletText.cs | 153 + .../Widgets/Figlet/Fonts/Standard.flf | 2227 ++++ .../Spectre.Console/Widgets/Grid.cs | 148 + .../Spectre.Console/Widgets/GridColumn.cs | 70 + .../Spectre.Console/Widgets/GridRow.cs | 39 + .../Spectre.Console/Widgets/Layout/Layout.cs | 305 + .../Widgets/Layout/LayoutPlaceholder.cs | 29 + .../Widgets/Layout/LayoutRender.cs | 12 + .../Widgets/Layout/LayoutSplitter.cs | 53 + .../Spectre.Console/Widgets/Markup.cs | 109 + .../Spectre.Console/Widgets/Padder.cs | 109 + .../Spectre.Console/Widgets/Panel.cs | 221 + .../Spectre.Console/Widgets/PanelHeader.cs | 54 + .../Spectre.Console/Widgets/Paragraph.cs | 281 + .../Spectre.Console/Widgets/ProgressBar.cs | 148 + .../Spectre.Console/Widgets/Rows.cs | 72 + .../Spectre.Console/Widgets/Rule.cs | 140 + .../Spectre.Console/Widgets/Table/Table.cs | 171 + .../Widgets/Table/TableAccessor.cs | 23 + .../Widgets/Table/TableColumn.cs | 56 + .../Widgets/Table/TableMeasurer.cs | 148 + .../Widgets/Table/TableRenderer.cs | 178 + .../Widgets/Table/TableRendererContext.cs | 67 + .../Spectre.Console/Widgets/Table/TableRow.cs | 65 + .../Widgets/Table/TableRowCollection.cs | 201 + .../Widgets/Table/TableRowEnumerator.cs | 26 + .../Widgets/Table/TableTitle.cs | 52 + .../Spectre.Console/Widgets/Text.cs | 58 + .../Spectre.Console/Widgets/TextPath.cs | 203 + .../Spectre.Console/Widgets/Tree.cs | 125 + .../Spectre.Console/Widgets/TreeNode.cs | 25 + .../SpectreConsoleScheduler.cs | 199 +- src/StatusExample/Program.cs | 92 +- src/StatusExample/StatusExample.csproj | 2 +- version.json | 18 + 365 files changed, 40582 insertions(+), 286 deletions(-) delete mode 100644 src/Shared/Shared.csproj create mode 100644 src/Spectre.Console.Rx/ISpectreConsoleScheduler.cs create mode 100644 src/Spectre.Console.Rx/Internal/SpectreConsoleMessageQueue.cs create mode 100644 src/Spectre.Console.Rx/Internal/SpectreConsoleSynchronizationContext.cs create mode 100644 src/Spectre.Console.Rx/Internal/SynchronizationContextExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Exceptions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Live.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Markup.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Progress.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Prompt.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Recording.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Rendering.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Screen.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.State.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Write.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.WriteLine.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleFactory.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleOutput.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleSettings.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/AnsiSupport.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/BoxBorder.Known.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/BoxBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Capabilities.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Color.Generated.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Color.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/ColorSystem.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/ColorSystemSupport.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/CursorDirection.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Decoration.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Emoji.Generated.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Emoji.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/AppVeyorEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BambooEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BitbucketEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BitriseEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/ContinuaEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GitHubEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GitLabEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GoCDEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/JenkinsEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/MyGetEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TeamCityEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TfsEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TravisEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/ProfileEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Enrichment/ProfileEnrichment.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Advanced/AnsiConsoleExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AlignExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AlignableExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Exclusive.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Live.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Progress.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Prompt.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Rendering.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Screen.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/BarChartExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/BoxExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/BreakdownChartExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/CalendarExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/CharExtensions.cs rename src/{Shared => Spectre.Console.Rx/Spectre.Console}/Extensions/ColorExtensions.cs (55%) create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/ColumnExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/ConfirmationPromptExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/ContextExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/CursorExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/DayOfWeekExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/DictionaryExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/ExceptionExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/ExpandableExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/FigletTextExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/GridExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/HasBorderExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/HasBoxBorderExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/HasCultureExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/HasJustificationExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/HasTableBorderExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/HasTreeNodeExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Int32Extensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/LayoutExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/ListExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/LiveDisplayExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/OverflowableExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/PaddableExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/PaddingExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/PanelExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/PercentageColumnExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressBarColumnExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressTaskExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/RemainingTimeColumnExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/SpinnerColumnExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/StatusContextExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/StatusExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/RecorderExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/RenderOptionsExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/RenderableExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/RuleExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/StackExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/StringBuilderExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/StringExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/StyleExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/TableBorderExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/TableColumnExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/TableExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/TextPathExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/TextWriterExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/TreeExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/TreeGuideExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/TreeNodeExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Extensions/VisibilityExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/HorizontalAlignment.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IAlignable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IAnsiConsole.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IAnsiConsoleCursor.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IAnsiConsoleInput.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IAnsiConsoleOutput.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IExclusivityMode.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IExpandable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IHasBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IHasBoxBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IHasCulture.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IHasJustification.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IHasTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IHasTreeNodes.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IHasVisibility.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IOverflowable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IPaddable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IProfileEnricher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IReadOnlyCapabilities.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/IRenderable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/InteractionSupport.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Aligner.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Ansi/AnsiBuilder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Ansi/AnsiColorBuilder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleBackend.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleCursor.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Ansi/AnsiDecorationBuilder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Ansi/AnsiDetector.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Ansi/AnsiLinkHasher.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Ansi/AnsiSequences.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/AnsiConsoleFacade.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/IAnsiConsoleBackend.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Legacy/LegacyConsoleBackend.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Backends/Legacy/LegacyConsoleCursor.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Cell.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Collections/ListWithCallback.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Colors/ColorPalette.Generated.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Colors/ColorPalette.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Colors/ColorSystemDetector.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Colors/ColorTable.Generated.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Colors/ColorTable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/ConsoleHelper.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Constants.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/DecorationTable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/DefaultExclusivityMode.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/DefaultInput.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Extensions/CharExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Extensions/EnumerableExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/FileSize.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/FileSizeUnit.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/IRatioResolvable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Polyfill/IsExternalInit.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Ratio.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/ResourceReader.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Text/Encoding/EncoderCapabilities.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Text/Encoding/TextEncoder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Text/Markup/MarkupParser.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Text/Markup/MarkupToken.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Text/Markup/MarkupTokenKind.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Text/Markup/MarkupTokenizer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/Text/StringBuffer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Internal/TypeConverterHelper.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Justify.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/LiveDisplay.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/LiveDisplayContext.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/LiveDisplayRenderer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/LiveRenderable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Columns/DownloadedColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Columns/ElapsedTimeColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Columns/PercentageColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Columns/ProgressBarColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Columns/RemainingTimeColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Columns/SpinnerColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Columns/TaskDescriptionColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Columns/TransferSpeedColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/IContext.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Progress.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/ProgressColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/ProgressContext.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/ProgressRefreshThread.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/ProgressRenderer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/ProgressSample.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/ProgressTask.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/ProgressTaskSettings.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/ProgressTaskState.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Renderers/DefaultProgressRenderer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Renderers/FallbackProgressRenderer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Renderers/FallbackStatusRenderer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Spinner.Generated.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Progress/Spinner.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Status/Status.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Live/Status/StatusContext.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Overflow.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Padding.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Profile.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/ConfirmationPrompt.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/DefaultPromptValue.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/IMultiSelectionItem.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/IPrompt.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/ISelectionItem.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/List/IListPromptStrategy.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/List/ListPrompt.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/List/ListPromptConstants.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/List/ListPromptInputResult.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/List/ListPromptItem.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/List/ListPromptRenderHook.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/List/ListPromptState.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/List/ListPromptTree.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/MultiSelectionPrompt.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/MultiSelectionPromptExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/SelectionMode.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/SelectionPrompt.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/SelectionPromptExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/TextPrompt.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/TextPromptExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Prompts/ValidationResult.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Properties/Usings.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Recorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Region.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/BoxBorderPart.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Boxes/AsciiBoxBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Boxes/DoubleBoxBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Boxes/HeavyBoxBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Boxes/NoBoxBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Boxes/RoundedBoxBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Boxes/SquareBoxBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/TableBorderPart.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/Ascii2TableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/AsciiDoubleHeadTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/AsciiTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/DoubleEdgeTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/DoubleTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/HeavyEdgeTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/HeavyHeadTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/HeavyTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/HorizontalTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/MarkdownTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/MinimalDoubleHeadTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/MinimalHeavyHeadTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/MinimalTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/NoTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/RoundedTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/SimpleHeavyTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/SimpleTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Borders/Tables/SquareTableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/IAnsiConsoleEncoder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/IHasDirtyState.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/IRenderHook.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/JustInTimeRenderable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Measurement.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/RenderHookScope.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/RenderOptions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/RenderPipeline.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Renderable.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Segment.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/SegmentLine.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/SegmentLineEnumerator.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/SegmentLineIterator.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/SegmentShape.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/TablePart.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Tree/AsciiTreeGuide.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Tree/BoldLineTreeGuide.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Tree/DoubleLineTreeGuide.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/Tree/LineTreeGuide.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Rendering/TreeGuidePart.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Size.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Style.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/StyleParser.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/TableBorder.Known.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/TableBorder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/TreeGuide.Known.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/TreeGuide.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/VerticalAlignment.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/VerticalOverflow.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/VerticalOverflowCropping.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Align.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Calendar.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/CalendarEvent.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Canvas.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Charts/BarChart.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Charts/BarChartItem.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Charts/BreakdownBar.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Charts/BreakdownChart.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Charts/BreakdownChartItem.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Charts/BreakdownTags.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Charts/IBarChartItem.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Charts/IBreakdownChartItem.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/CircularTreeException.cs rename src/{Shared => Spectre.Console.Rx/Spectre.Console/Widgets}/ColorBox.cs (72%) create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Columns.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/ControlCode.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Exceptions/ExceptionFormats.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Exceptions/ExceptionFormatter.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Exceptions/ExceptionSettings.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Exceptions/ExceptionStyle.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Exceptions/StringUriExtensions.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Exceptions/TypeNameHelper.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Figlet/FigletCharacter.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Figlet/FigletFont.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Figlet/FigletFontParser.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Figlet/FigletHeader.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Figlet/FigletText.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Figlet/Fonts/Standard.flf create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Grid.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/GridColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/GridRow.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Layout/Layout.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Layout/LayoutPlaceholder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Layout/LayoutRender.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Layout/LayoutSplitter.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Markup.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Padder.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Panel.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/PanelHeader.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Paragraph.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/ProgressBar.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Rows.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Rule.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/Table.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableAccessor.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableColumn.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableMeasurer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableRenderer.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableRendererContext.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableRow.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableRowCollection.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableRowEnumerator.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Table/TableTitle.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Text.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/TextPath.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/Tree.cs create mode 100644 src/Spectre.Console.Rx/Spectre.Console/Widgets/TreeNode.cs create mode 100644 version.json diff --git a/build/Build.cs b/build/Build.cs index a2ad2e2..82d8096 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -56,7 +56,6 @@ partial class Build : NukeBuild } PackagesDirectory.CreateOrCleanDirectory(); - ////await this.UpdateVisualStudio(); await this.InstallDotNetSdk("3.1.x", "5.x.x", "6.x.x", "7.x.x"); }); diff --git a/src/LiveExample/LiveExample.csproj b/src/LiveExample/LiveExample.csproj index 82384a3..4289849 100644 --- a/src/LiveExample/LiveExample.csproj +++ b/src/LiveExample/LiveExample.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/LiveExample/Program.cs b/src/LiveExample/Program.cs index aa60567..46f0b06 100644 --- a/src/LiveExample/Program.cs +++ b/src/LiveExample/Program.cs @@ -3,7 +3,6 @@ using System; using System.Reactive.Linq; -using Spectre.Console; using Spectre.Console.Rx; namespace Live; @@ -24,7 +23,7 @@ public static void Main() AnsiConsoleRx.Live(table, ld => ld.AutoClear(false).Overflow(VerticalOverflow.Ellipsis).Cropping(VerticalOverflowCropping.Top)) .ObserveOn(AnsiConsoleRx.Scheduler) .Subscribe(ctx => - { + // Columns ctx.Update(230, () => table.AddColumn("Release date")) .Update(230, () => table.AddColumn("Title")) @@ -76,9 +75,6 @@ public static void Main() .Update(230, () => table.SimpleHeavyBorder()) // Caption - .Update(400, () => table.Caption("[[ [blue]THE END[/] ]]")); - }); - - Console.ReadLine(); + .Update(400, () => table.Caption("[[ [blue]THE END[/] ]]"))); } } diff --git a/src/LiveTableExample/LiveTableExample.csproj b/src/LiveTableExample/LiveTableExample.csproj index 82384a3..4289849 100644 --- a/src/LiveTableExample/LiveTableExample.csproj +++ b/src/LiveTableExample/LiveTableExample.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/LiveTableExample/Program.cs b/src/LiveTableExample/Program.cs index 27cbf7b..d0b150c 100644 --- a/src/LiveTableExample/Program.cs +++ b/src/LiveTableExample/Program.cs @@ -3,8 +3,7 @@ using System; using System.Linq; -using System.Threading.Tasks; -using Spectre.Console; +using System.Reactive.Linq; using Spectre.Console.Rx; namespace LiveTable; @@ -45,31 +44,31 @@ public static void Main(string[] args) p.AutoClear(false) .Overflow(VerticalOverflow.Ellipsis) .Cropping(VerticalOverflowCropping.Bottom)) - .Subscribe(async ctx => + .ObserveOn(AnsiConsoleRx.Scheduler) + .Do(_ => { // Add some initial rows foreach (var a in Enumerable.Range(0, NumberOfRows)) { AddExchangeRateRow(table); } - + }) + .CombineLatest(Observable.Interval(TimeSpan.FromMilliseconds(400)), (ctx, _) => ctx) + .Subscribe(ctx => + { // Continously update the table - while (true) + // More rows than we want? + if (table.Rows.Count > NumberOfRows) { - // More rows than we want? - if (table.Rows.Count > NumberOfRows) - { - // Remove the first one - table.Rows.RemoveAt(0); - } + // Remove the first one + table.Rows.RemoveAt(0); + } - // Add a new row - AddExchangeRateRow(table); + // Add a new row + AddExchangeRateRow(table); - // Refresh and wait for a while - ctx.Refresh(); - await Task.Delay(400); - } + // Refresh and wait for a while + ctx.Refresh(); }); Console.ReadLine(); diff --git a/src/ProgressExample/Program.cs b/src/ProgressExample/Program.cs index 8d482bd..194722e 100644 --- a/src/ProgressExample/Program.cs +++ b/src/ProgressExample/Program.cs @@ -4,8 +4,6 @@ using System; using System.Collections.Generic; using System.Reactive.Linq; -using System.Threading; -using Spectre.Console; using Spectre.Console.Rx; namespace Progress; @@ -23,7 +21,8 @@ public static void Main() AnsiConsole.MarkupLine("[yellow]Initializing warp drive[/]..."); // Show progress - AnsiConsoleRx.Progress(p => p.AutoClear(false) + AnsiConsoleRx.Progress(p => + p.AutoClear(false) .Columns(new ProgressColumn[] { new TaskDescriptionColumn(), // Task description @@ -33,7 +32,7 @@ public static void Main() new SpinnerColumn(), // Spinner })) .ObserveOn(AnsiConsoleRx.Scheduler) - .Subscribe(ctx => + .Subscribe(async ctx => { var random = new Random(DateTime.Now.Millisecond); @@ -41,64 +40,56 @@ public static void Main() var tasks = CreateTasks(ctx, random); var warpTask = ctx.AddTask("Going to warp", autoStart: false).IsIndeterminate(); - // Wait for all tasks (except the indeterminate one) to complete - while (!ctx.IsFinished) - { - // Increment progress - foreach (var (task, increment) in tasks) + await ctx.Schedule( + TimeSpan.FromMilliseconds(100), + () => ctx.IsFinished, + () => { - task.Increment(random.NextDouble() * increment); - } - - // Write some random things to the terminal - if (random.NextDouble() < 0.1) - { - WriteLogMessage(); - } - - ctx.Refresh(); - - // Simulate some delay - Thread.Sleep(100); - } + // Increment progress + foreach (var (task, increment) in tasks) + { + task.Increment(random.NextDouble() * increment); + } + + // Write some random things to the terminal + if (random.NextDouble() < 0.1) + { + WriteLogMessage(); + } + }); // Now start the "warp" task - warpTask.StartTask(); - warpTask.IsIndeterminate(false); - while (!ctx.IsFinished) - { - warpTask.Increment(12 * random.NextDouble()); - - // Simulate some delay - Thread.Sleep(100); - } + warpTask.StartTask().IsIndeterminate(false); + await ctx.Schedule( + TimeSpan.FromMilliseconds(100), + () => warpTask.Increment(12 * random.NextDouble())); // Done - AnsiConsole.MarkupLine("[green]Done![/]"); + await ctx.Schedule(_ => WriteLogMessage("[green]Done![/]")); }); - - Console.ReadLine(); } - private static List<(ProgressTask Task, int Delay)> CreateTasks(ProgressContext progress, Random random) + private static List<(ProgressTask Task, int Delay)> CreateTasks(ProgressContext context, Random random) { var tasks = new List<(ProgressTask, int)>(); while (tasks.Count < 5) { if (DescriptionGenerator.TryGenerate(out var name)) { - tasks.Add((progress.AddTask(name), random.Next(2, 10))); + tasks.Add((context.AddTask(name), random.Next(2, 10))); } } return tasks; } - private static void WriteLogMessage() - { - AnsiConsole.MarkupLine( + private static void WriteLogMessage() => AnsiConsole.MarkupLine( "[grey]LOG:[/] " + DescriptionGenerator.Generate() + "[grey]...[/]"); - } + + private static void WriteLogMessage(string message) => AnsiConsole.MarkupLine( + "[grey]LOG:[/] " + + message + + "[grey]...[/]"); } diff --git a/src/ProgressExample/ProgressExample.csproj b/src/ProgressExample/ProgressExample.csproj index 0e87f93..73df831 100644 --- a/src/ProgressExample/ProgressExample.csproj +++ b/src/ProgressExample/ProgressExample.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/ProgressThreadExample/Program.cs b/src/ProgressThreadExample/Program.cs index d01b89f..27f9276 100644 --- a/src/ProgressThreadExample/Program.cs +++ b/src/ProgressThreadExample/Program.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Reactive.Linq; using System.Threading.Tasks; -using Spectre.Console; using Spectre.Console.Rx; namespace Progress; @@ -33,28 +32,18 @@ public static void Main() { ctx.AddTask("Deleting Custom Formats").MaxValue(cfs.Count), }) + .ObserveOn(AnsiConsoleRx.Scheduler) .Subscribe( ctx => { var rng = new Random(); cfs.ToObservable() - .Select(x => Observable.FromAsync(async ct => - { - await Task.Delay(TimeSpan.FromSeconds(rng.Next(1, 5)), ct); - })) + .Select(_ => Observable.FromAsync(async ct => await Task.Delay(TimeSpan.FromSeconds(rng.Next(1, 5)), ct), AnsiConsoleRx.Scheduler)) .Merge(8) - .Subscribe(_ => - { - ctx.tasks[0].Increment(1); // Not thread safe; needs to invoke on the thread that subscribed; not sure if this is ObserveOn or SubscribeOn - }); + .ObserveOn(SpectreConsoleScheduler.Instance) + .Subscribe(_ => ctx.tasks[0].Increment(1)); }, - () => - { - // Render a message when the sequence completes - AnsiConsole.MarkupLine("[blue]Done![/]"); - }); - - Console.ReadLine(); + () => AnsiConsole.MarkupLine("[blue]Done![/]")); // Render a message when the sequence completes } } diff --git a/src/ProgressThreadExample/ProgressThreadExample.csproj b/src/ProgressThreadExample/ProgressThreadExample.csproj index 0e87f93..73df831 100644 --- a/src/ProgressThreadExample/ProgressThreadExample.csproj +++ b/src/ProgressThreadExample/ProgressThreadExample.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Shared/Shared.csproj b/src/Shared/Shared.csproj deleted file mode 100644 index 3104dc0..0000000 --- a/src/Shared/Shared.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - net7.0 - enable - False - - - - - - - - - - - diff --git a/src/Spectre.Console.Rx.sln b/src/Spectre.Console.Rx.sln index 5149e32..e276a89 100644 --- a/src/Spectre.Console.Rx.sln +++ b/src/Spectre.Console.Rx.sln @@ -7,8 +7,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Spectre.Console.Rx", "Spect EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LiveExample", "LiveExample\LiveExample.csproj", "{3EBF3829-4483-48ED-AD1E-E057CC7DDFF0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Shared", "Shared\Shared.csproj", "{725C299C-42CE-405F-85CC-6DEFEA8487B9}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ProgressExample", "ProgressExample\ProgressExample.csproj", "{D3195DF3-668F-4BF0-9020-22C6649924EF}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Examples", "Examples", "{E17E245C-D501-46B4-A804-A68241982088}" @@ -27,8 +25,6 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {15A30A6D-9A94-4A7C-A74B-D7A9CB36C216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {15A30A6D-9A94-4A7C-A74B-D7A9CB36C216}.Release|Any CPU.ActiveCfg = Release|Any CPU {43DC5A6B-B066-4CCF-90A8-680432C139D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43DC5A6B-B066-4CCF-90A8-680432C139D5}.Debug|Any CPU.Build.0 = Debug|Any CPU {43DC5A6B-B066-4CCF-90A8-680432C139D5}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -37,10 +33,6 @@ Global {3EBF3829-4483-48ED-AD1E-E057CC7DDFF0}.Debug|Any CPU.Build.0 = Debug|Any CPU {3EBF3829-4483-48ED-AD1E-E057CC7DDFF0}.Release|Any CPU.ActiveCfg = Release|Any CPU {3EBF3829-4483-48ED-AD1E-E057CC7DDFF0}.Release|Any CPU.Build.0 = Release|Any CPU - {725C299C-42CE-405F-85CC-6DEFEA8487B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {725C299C-42CE-405F-85CC-6DEFEA8487B9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {725C299C-42CE-405F-85CC-6DEFEA8487B9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {725C299C-42CE-405F-85CC-6DEFEA8487B9}.Release|Any CPU.Build.0 = Release|Any CPU {D3195DF3-668F-4BF0-9020-22C6649924EF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D3195DF3-668F-4BF0-9020-22C6649924EF}.Debug|Any CPU.Build.0 = Debug|Any CPU {D3195DF3-668F-4BF0-9020-22C6649924EF}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -57,13 +49,14 @@ Global {CB209C31-2CD2-4188-A088-18E68DF23788}.Debug|Any CPU.Build.0 = Debug|Any CPU {CB209C31-2CD2-4188-A088-18E68DF23788}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB209C31-2CD2-4188-A088-18E68DF23788}.Release|Any CPU.Build.0 = Release|Any CPU + {15A30A6D-9A94-4A7C-A74B-D7A9CB36C216}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {15A30A6D-9A94-4A7C-A74B-D7A9CB36C216}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {3EBF3829-4483-48ED-AD1E-E057CC7DDFF0} = {E17E245C-D501-46B4-A804-A68241982088} - {725C299C-42CE-405F-85CC-6DEFEA8487B9} = {E17E245C-D501-46B4-A804-A68241982088} {D3195DF3-668F-4BF0-9020-22C6649924EF} = {E17E245C-D501-46B4-A804-A68241982088} {9B8D02EB-C0CB-42B1-B44C-74471D83A8C2} = {E17E245C-D501-46B4-A804-A68241982088} {51ACCE14-F44D-455B-A5E9-AEC71F7C6F61} = {E17E245C-D501-46B4-A804-A68241982088} diff --git a/src/Spectre.Console.Rx/AnsiConsoleRx.cs b/src/Spectre.Console.Rx/AnsiConsoleRx.cs index 90844d7..c76f3d7 100644 --- a/src/Spectre.Console.Rx/AnsiConsoleRx.cs +++ b/src/Spectre.Console.Rx/AnsiConsoleRx.cs @@ -1,10 +1,8 @@ // Copyright (c) Chris Pulman. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. -using System.Reactive.Concurrency; using System.Reactive.Disposables; using System.Reactive.Linq; -using Spectre.Console.Rendering; namespace Spectre.Console.Rx; @@ -22,7 +20,7 @@ public static class AnsiConsoleRx /// /// The scheduler. /// - public static IScheduler Scheduler { get; } = new SpectreConsoleScheduler(); + public static ISpectreConsoleScheduler Scheduler => SpectreConsoleScheduler.Instance; /// /// Creates a new instance. @@ -32,30 +30,31 @@ public static class AnsiConsoleRx /// A instance. /// public static IObservable Progress(Func? addProperties = null) => - Observable.Create(observer => - new CompositeDisposable - { - Scheduler.Schedule(async () => await AnsiConsole - .Progress() - .AddProgressProperties(addProperties) - .StartAsync(async ctx => - { - observer.OnNext(ctx); - while (!ctx.IsFinished) - { - await Task.Yield(); - } - - observer.OnCompleted(); - })), - Disposable.Create(() => + Observable.Create(async observer => + { + await AnsiConsole + .Progress() + .AddProgressProperties(addProperties) + .StartAsync(async ctx => { - lock (_lock) + SynchronizationContext.SetSynchronizationContext(Scheduler.SynchronizationContext); + observer.OnNext(ctx); + while (!ctx.IsFinished) { - _tasks.Clear(); + await Task.Yield(); } - }) + + observer.OnCompleted(); + }); + + return Disposable.Create(() => + { + lock (_lock) + { + _tasks.Clear(); + } }); + }).SubscribeOn(Scheduler); /// /// Statuses the specified status. @@ -64,33 +63,25 @@ public static IObservable Progress(Func? ad /// The add properties. /// A StatusContext. public static IObservable Status(string status, Func? addProperties = null) => - Observable.Create(observer => + Observable.Create(async observer => { var complete = false; - return new CompositeDisposable + await AnsiConsole + .Status() + .AddStatusProperties(addProperties) + .StartAsync(status, async ctx => { - Scheduler.Schedule(async () => await AnsiConsole - .Status() - .AddStatusProperties(addProperties) - .StartAsync(status, async ctx => - { - observer.OnNext(ctx); - while (!complete) - { - await Task.Yield(); - } - - observer.OnCompleted(); - })), - Disposable.Create(() => + observer.OnNext(ctx); + while (!complete) { - lock (_lock) - { - _tasks.Clear(); - } - }) - }; - }); + await Task.Yield(); + } + + observer.OnCompleted(); + }); + + return Disposable.Create(() => complete = true); + }).SubscribeOn(Scheduler); /// /// Adds the elements of the given collection to the end of this list. If @@ -109,7 +100,7 @@ public static IObservable Status(string status, Func /// Creates a new instance. @@ -120,27 +111,25 @@ public static IObservable Status(string status, Func instance. /// public static IObservable Live(IRenderable renderable, Func? addProperties = null) => - Observable.Create(observer => + Observable.Create(async observer => { var complete = false; - return new CompositeDisposable + await AnsiConsole + .Live(renderable) + .AddLiveDisplayProperties(addProperties) + .StartAsync(async ctx => { - Scheduler.Schedule(async () => - await AnsiConsole.Live(renderable) - .AddLiveDisplayProperties(addProperties) - .StartAsync(async ctx => - { - observer.OnNext(ctx); - while (!complete) - { - await Task.Yield(); - } - - observer.OnCompleted(); - })), - Disposable.Create(() => complete = true) - }; - }); + observer.OnNext(ctx); + while (!complete) + { + await Task.Yield(); + } + + observer.OnCompleted(); + }); + + return Disposable.Create(() => complete = true); + }).SubscribeOn(Scheduler); /// /// Updates the specified delay. diff --git a/src/Spectre.Console.Rx/ISpectreConsoleScheduler.cs b/src/Spectre.Console.Rx/ISpectreConsoleScheduler.cs new file mode 100644 index 0000000..92cd83f --- /dev/null +++ b/src/Spectre.Console.Rx/ISpectreConsoleScheduler.cs @@ -0,0 +1,39 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reactive.Concurrency; + +namespace Spectre.Console.Rx; + +/// +/// ISpectreConsoleScheduler. +/// +/// +public interface ISpectreConsoleScheduler : IScheduler, IStopwatchProvider, IServiceProvider, IDisposable +{ + /// + /// Gets a value indicating whether this instance is running. + /// + /// + /// true if this instance is running; otherwise, false. + /// + bool IsRunning { get; } + + /// + /// Gets the synchronization context. + /// + /// + /// The synchronization context. + /// + SynchronizationContext SynchronizationContext { get; } + + /// + /// Starts this instance. + /// + void Start(); + + /// + /// Stops this instance. + /// + void Stop(); +} diff --git a/src/Spectre.Console.Rx/Internal/SpectreConsoleMessageQueue.cs b/src/Spectre.Console.Rx/Internal/SpectreConsoleMessageQueue.cs new file mode 100644 index 0000000..3a0282e --- /dev/null +++ b/src/Spectre.Console.Rx/Internal/SpectreConsoleMessageQueue.cs @@ -0,0 +1,132 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Collections.Concurrent; + +namespace Spectre.Console.Rx.Internal; + +internal sealed class SpectreConsoleMessageQueue : IDisposable +{ + private readonly ConcurrentQueue _queue = new(); + private readonly SemaphoreSlim _sync = new(0); + private bool _disposedValue; + + /// + /// Gets a value indicating whether indicates whether or not the queue is empty. + /// + public bool IsEmpty => _queue.IsEmpty; + + /// + /// Gets indicates the count of messages in the queue. + /// + public int Count => _queue.Count; + + /// + /// Sends a message. + /// + /// The message to send. + public void Post(T message) + { + _queue.Enqueue(message); + _sync.Release(1); + } + + /// + /// Receives the next message from the queue. + /// + /// The received message. + public T Receive() + { + _sync.Wait(); + if (!_queue.TryDequeue(out var result)) + { + throw new InvalidOperationException("The queue is empty"); + } + + return result; + } + + /// + /// Receives the next message from the queue. + /// + /// A cancellation token. + /// The received message. + /// The operation was cancelled. + public T Receive(CancellationToken cancellationToken) + { + _sync.Wait(cancellationToken); + cancellationToken.ThrowIfCancellationRequested(); + if (!_queue.TryDequeue(out var result)) + { + throw new InvalidOperationException("The queue is empty"); + } + + cancellationToken.ThrowIfCancellationRequested(); + return result; + } + + /// + /// Asynchronously receives a message. + /// + /// A containing the message. + public async Task ReceiveAsync() + { + await _sync.WaitAsync(); + if (!_queue.TryDequeue(out var result)) + { + throw new InvalidOperationException("The queue is empty"); + } + + return result; + } + + /// + /// Asynchronously receives a message. + /// + /// A cancelation token. + /// A containing the message. + /// The operation was canceled. + public async Task ReceiveAsync(CancellationToken cancellationToken) + { + await _sync.WaitAsync(cancellationToken); + cancellationToken.ThrowIfCancellationRequested(); + if (!_queue.TryDequeue(out var result)) + { + throw new InvalidOperationException("The queue is empty"); + } + + cancellationToken.ThrowIfCancellationRequested(); + return result; + } + + /// + /// Polls for a message. + /// + /// The message to receive. + /// True if a message is available, otherwise false. If the result is false is undefined. + /// This function never waits. + public bool Poll(out T result) + => _queue.TryDequeue(out result!); + + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + private void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + _sync.Dispose(); + } + + _disposedValue = true; + } + } +} diff --git a/src/Spectre.Console.Rx/Internal/SpectreConsoleSynchronizationContext.cs b/src/Spectre.Console.Rx/Internal/SpectreConsoleSynchronizationContext.cs new file mode 100644 index 0000000..529fcf5 --- /dev/null +++ b/src/Spectre.Console.Rx/Internal/SpectreConsoleSynchronizationContext.cs @@ -0,0 +1,143 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Internal; + +/// +/// Provides a using . +/// +internal class SpectreConsoleSynchronizationContext : SynchronizationContext, IDisposable +{ + private readonly SpectreConsoleMessageQueue _messageQueue = new(); + private bool _disposedValue; + + /// + /// Sends a message and does not wait. + /// + /// The delegate to execute. + /// The state associated with the message. + public override void Post(SendOrPostCallback d, object? state) => _messageQueue.Post(new Message(d, state)); + + /// + /// Sends a message and waits for completion. + /// + /// The delegate to execute. + /// The state associated with the message. + public override void Send(SendOrPostCallback d, object? state) + { + var ev = new ManualResetEventSlim(false); + try + { + _messageQueue.Post(new Message(d, state, ev)); + ev.Wait(); + } + finally + { + ev.Dispose(); + } + } + + /// + /// Starts the message loop. + /// + /// The cancellation token. + /// The operation was canceled. + public void Start(CancellationToken cancellationToken) + { + Message msg; + do + { + // blocks until a message comes in: + msg = _messageQueue.Receive(cancellationToken); + + // execute the code on this thread + msg.Callback?.Invoke(msg.State); + + // let Send() know we're done: + msg.FinishedEvent?.Set(); + + // exit on the quit message + } + while (msg.Callback != null && !cancellationToken.IsCancellationRequested); + cancellationToken.ThrowIfCancellationRequested(); + } + + /// + /// Starts the message loop. + /// + public void Start() + { + Message msg; + do + { + // blocks until a message comes in: + msg = _messageQueue.Receive(); + + // execute the code on this thread + msg.Callback?.Invoke(msg.State); + + // let Send() know we're done: + msg.FinishedEvent?.Set(); + + // exit on the quit message + } + while (msg.Callback != null); + } + + /// + /// Stops the message loop. + /// + public void Stop() + { + var ev = new ManualResetEventSlim(false); + try + { + // post the quit message + _messageQueue.Post(new Message(null, null, ev)); + ev.Wait(); + } + finally + { + ev.Dispose(); + } + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (!_disposedValue) + { + if (disposing) + { + Stop(); + _messageQueue.Dispose(); + } + + _disposedValue = true; + } + } + + /// + /// Message. + /// + /// + /// Initializes a new instance of the struct. + /// + private readonly struct Message(SendOrPostCallback? callback, object? state, ManualResetEventSlim? finishedEvent) + { + public readonly SendOrPostCallback? Callback = callback; + public readonly object? State = state; + public readonly ManualResetEventSlim? FinishedEvent = finishedEvent; + + public Message(SendOrPostCallback callback, object? state) + : this(callback, state, null) + { + } + } +} diff --git a/src/Spectre.Console.Rx/Internal/SynchronizationContextExtensions.cs b/src/Spectre.Console.Rx/Internal/SynchronizationContextExtensions.cs new file mode 100644 index 0000000..8ce0818 --- /dev/null +++ b/src/Spectre.Console.Rx/Internal/SynchronizationContextExtensions.cs @@ -0,0 +1,46 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Internal; + +internal static class SynchronizationContextExtensions +{ + public static void PostWithStartComplete(this SynchronizationContext context, Action action, T state) + { + context.OperationStarted(); + + context.Post( + o => + { + try + { + action((T)o!); + } + finally + { + context.OperationCompleted(); + } + }, + state); + } + + public static void PostWithStartComplete(this SynchronizationContext context, Action action) + { + context.OperationStarted(); + + context.Post( + () => + { + try + { + action(); + } + finally + { + context.OperationCompleted(); + } + }); + } + + public static void Post(this SynchronizationContext context, Action action) => context.Post(_ => action(), null); +} diff --git a/src/Spectre.Console.Rx/Spectre.Console.Rx.csproj b/src/Spectre.Console.Rx/Spectre.Console.Rx.csproj index 1f9d604..eebe0fa 100644 --- a/src/Spectre.Console.Rx/Spectre.Console.Rx.csproj +++ b/src/Spectre.Console.Rx/Spectre.Console.Rx.csproj @@ -6,9 +6,26 @@ enable + + 3.0.0 + False + + - + + all + + + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Exceptions.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Exceptions.cs new file mode 100644 index 0000000..09ad1bf --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Exceptions.cs @@ -0,0 +1,24 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Writes an exception to the console. + /// + /// The exception to write to the console. + /// The exception format options. + public static void WriteException(Exception exception, ExceptionFormats format = ExceptionFormats.Default) => Console.WriteException(exception, format); + + /// + /// Writes an exception to the console. + /// + /// The exception to write to the console. + /// The exception settings. + public static void WriteException(Exception exception, ExceptionSettings settings) => Console.WriteException(exception, settings); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Live.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Live.cs new file mode 100644 index 0000000..7d1e2b0 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Live.cs @@ -0,0 +1,17 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Creates a new instance. + /// + /// The target renderable to update. + /// A instance. + internal static LiveDisplay Live(IRenderable target) => Console.Live(target); +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Markup.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Markup.cs new file mode 100644 index 0000000..17c583c --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Markup.cs @@ -0,0 +1,114 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Writes the specified markup to the console. + /// + /// The value to write. + public static void Markup(string value) => Console.Markup(value); + + /// + /// Writes the specified markup to the console. + /// + /// A composite format string. + /// An array of objects to write. + public static void Markup(string format, params object[] args) => Console.Markup(format, args); + + /// + /// Writes the specified markup to the console. + /// + /// All interpolation holes which contain a string are automatically escaped so you must not call . + /// + /// + /// + /// string input = args[0]; + /// string output = Process(input); + /// AnsiConsole.MarkupInterpolated($"[blue]{input}[/] -> [green]{output}[/]"); + /// + /// + /// The interpolated string value to write. + public static void MarkupInterpolated(FormattableString value) => Console.MarkupInterpolated(value); + + /// + /// Writes the specified markup to the console. + /// + /// An object that supplies culture-specific formatting information. + /// A composite format string. + /// An array of objects to write. + public static void Markup(IFormatProvider provider, string format, params object[] args) => Console.Markup(provider, format, args); + + /// + /// Writes the specified markup to the console. + /// + /// All interpolation holes which contain a string are automatically escaped so you must not call . + /// + /// + /// + /// string input = args[0]; + /// string output = Process(input); + /// AnsiConsole.MarkupInterpolated(CultureInfo.InvariantCulture, $"[blue]{input}[/] -> [green]{output}[/]"); + /// + /// + /// An object that supplies culture-specific formatting information. + /// The interpolated string value to write. + public static void MarkupInterpolated(IFormatProvider provider, FormattableString value) => Console.MarkupInterpolated(provider, value); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// The value to write. + public static void MarkupLine(string value) => Console.MarkupLine(value); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// A composite format string. + /// An array of objects to write. + public static void MarkupLine(string format, params object[] args) => Console.MarkupLine(format, args); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// All interpolation holes which contain a string are automatically escaped so you must not call . + /// + /// + /// + /// string input = args[0]; + /// string output = Process(input); + /// AnsiConsole.MarkupLineInterpolated($"[blue]{input}[/] -> [green]{output}[/]"); + /// + /// + /// The interpolated string value to write. + public static void MarkupLineInterpolated(FormattableString value) => Console.MarkupLineInterpolated(value); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// A composite format string. + /// An array of objects to write. + public static void MarkupLine(IFormatProvider provider, string format, params object[] args) => Console.MarkupLine(provider, format, args); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// All interpolation holes which contain a string are automatically escaped so you must not call . + /// + /// + /// + /// string input = args[0]; + /// string output = Process(input); + /// AnsiConsole.MarkupLineInterpolated(CultureInfo.InvariantCulture, $"[blue]{input}[/] -> [green]{output}[/]"); + /// + /// + /// An object that supplies culture-specific formatting information. + /// The interpolated string value to write. + public static void MarkupLineInterpolated(IFormatProvider provider, FormattableString value) => Console.MarkupLineInterpolated(provider, value); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Progress.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Progress.cs new file mode 100644 index 0000000..d59a319 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Progress.cs @@ -0,0 +1,22 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Creates a new instance. + /// + /// A instance. + internal static Progress Progress() => Console.Progress(); + + /// + /// Creates a new instance. + /// + /// A instance. + internal static Status Status() => Console.Status(); +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Prompt.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Prompt.cs new file mode 100644 index 0000000..ae6ad0e --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Prompt.cs @@ -0,0 +1,57 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Displays a prompt to the user. + /// + /// The prompt result type. + /// The prompt to display. + /// The prompt input result. + public static T Prompt(IPrompt prompt) + { + if (prompt is null) + { + throw new ArgumentNullException(nameof(prompt)); + } + + return prompt.Show(Console); + } + + /// + /// Displays a prompt to the user. + /// + /// The prompt result type. + /// The prompt markup text. + /// The prompt input result. + public static T Ask(string prompt) => new TextPrompt(prompt).Show(Console); + + /// + /// Displays a prompt to the user with a given default. + /// + /// The prompt result type. + /// The prompt markup text. + /// The default value. + /// The prompt input result. + public static T Ask(string prompt, T defaultValue) => new TextPrompt(prompt) + .DefaultValue(defaultValue) + .Show(Console); + + /// + /// Displays a prompt with two choices, yes or no. + /// + /// The prompt markup text. + /// Specifies the default answer. + /// true if the user selected "yes", otherwise false. + public static bool Confirm(string prompt, bool defaultValue = true) => new ConfirmationPrompt(prompt) + { + DefaultValue = defaultValue, + } + .Show(Console); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Recording.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Recording.cs new file mode 100644 index 0000000..706fcc2 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Recording.cs @@ -0,0 +1,69 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Starts recording the console output. + /// + public static void Record() + { + if (_recorder == null) + { + _recorder = new Recorder(Console); + } + } + + /// + /// Exports all recorded console output as text. + /// + /// The recorded output as text. + public static string ExportText() + { + if (_recorder == null) + { + throw new InvalidOperationException("Cannot export text since a recording hasn't been started."); + } + + return _recorder.ExportText(); + } + + /// + /// Exports all recorded console output as HTML text. + /// + /// The recorded output as HTML text. + public static string ExportHtml() + { + if (_recorder == null) + { + throw new InvalidOperationException("Cannot export HTML since a recording hasn't been started."); + } + + return _recorder.ExportHtml(); + } + + /// + /// Exports all recorded console output using a custom encoder. + /// + /// The encoder to use. + /// The recorded output. + public static string ExportCustom(IAnsiConsoleEncoder encoder) + { + if (_recorder == null) + { + throw new InvalidOperationException("Cannot export HTML since a recording hasn't been started."); + } + + if (encoder is null) + { + throw new ArgumentNullException(nameof(encoder)); + } + + return _recorder.Export(encoder); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Rendering.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Rendering.cs new file mode 100644 index 0000000..6bfba20 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Rendering.cs @@ -0,0 +1,31 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Renders the specified object to the console. + /// + /// The object to render. + [Obsolete("Consider using AnsiConsole.Write instead.")] + public static void Render(IRenderable renderable) => Write(renderable); + + /// + /// Renders the specified to the console. + /// + /// The object to render. + public static void Write(IRenderable renderable) + { + if (renderable is null) + { + throw new ArgumentNullException(nameof(renderable)); + } + + Console.Write(renderable); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Screen.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Screen.cs new file mode 100644 index 0000000..905aaf3 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Screen.cs @@ -0,0 +1,16 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Switches to an alternate screen buffer if the terminal supports it. + /// + /// The action to execute within the alternate screen buffer. + public static void AlternateScreen(Action action) => Console.AlternateScreen(action); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.State.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.State.cs new file mode 100644 index 0000000..d3a39d1 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.State.cs @@ -0,0 +1,60 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Gets or sets the foreground color. + /// + public static Color Foreground + { + get => CurrentStyle.Foreground; + set => CurrentStyle = CurrentStyle.Foreground(value); + } + + /// + /// Gets or sets the background color. + /// + public static Color Background + { + get => CurrentStyle.Background; + set => CurrentStyle = CurrentStyle.Background(value); + } + + /// + /// Gets or sets the text decoration. + /// + public static Decoration Decoration + { + get => CurrentStyle.Decoration; + set => CurrentStyle = CurrentStyle.Decoration(value); + } + + internal static Style CurrentStyle { get; private set; } = Style.Plain; + + internal static bool Created { get; private set; } + + /// + /// Resets colors and text decorations. + /// + public static void Reset() + { + ResetColors(); + ResetDecoration(); + } + + /// + /// Resets the current applied text decorations. + /// + public static void ResetDecoration() => Decoration = Decoration.None; + + /// + /// Resets the current applied foreground and background colors. + /// + public static void ResetColors() => CurrentStyle = Style.Plain; +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Write.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Write.cs new file mode 100644 index 0000000..42d3cc8 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.Write.cs @@ -0,0 +1,186 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Writes the specified string value to the console. + /// + /// The value to write. + public static void Write(string value) => Write(value, CurrentStyle); + + /// + /// Writes the text representation of the specified 32-bit + /// signed integer value to the console. + /// + /// The value to write. + public static void Write(int value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified 32-bit + /// signed integer value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, int value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified 32-bit + /// unsigned integer value to the console. + /// + /// The value to write. + public static void Write(uint value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified 32-bit + /// unsigned integer value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, uint value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified 64-bit + /// signed integer value to the console. + /// + /// The value to write. + public static void Write(long value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified 64-bit + /// signed integer value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, long value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified 64-bit + /// unsigned integer value to the console. + /// + /// The value to write. + public static void Write(ulong value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified 64-bit + /// unsigned integer value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, ulong value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified single-precision + /// floating-point value to the console. + /// + /// The value to write. + public static void Write(float value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified single-precision + /// floating-point value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, float value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified double-precision + /// floating-point value to the console. + /// + /// The value to write. + public static void Write(double value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified double-precision + /// floating-point value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, double value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified decimal value, to the console. + /// + /// The value to write. + public static void Write(decimal value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified decimal value, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, decimal value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified boolean value to the console. + /// + /// The value to write. + public static void Write(bool value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified boolean value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, bool value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the specified Unicode character to the console. + /// + /// The value to write. + public static void Write(char value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the specified Unicode character to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, char value) => Console.Write(value.ToString(provider), CurrentStyle); + + /// + /// Writes the specified array of Unicode characters to the console. + /// + /// The value to write. + public static void Write(char[] value) => Write(CultureInfo.CurrentCulture, value); + + /// + /// Writes the specified array of Unicode characters to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void Write(IFormatProvider provider, char[] value) + { + if (value is null) + { + throw new ArgumentNullException(nameof(value)); + } + + for (var index = 0; index < value.Length; index++) + { + Console.Write(value[index].ToString(provider), CurrentStyle); + } + } + + /// + /// Writes the text representation of the specified array of objects, + /// to the console using the specified format information. + /// + /// A composite format string. + /// An array of objects to write. + public static void Write(string format, params object[] args) => Write(CultureInfo.CurrentCulture, format, args); + + /// + /// Writes the text representation of the specified array of objects, + /// to the console using the specified format information. + /// + /// An object that supplies culture-specific formatting information. + /// A composite format string. + /// An array of objects to write. + public static void Write(IFormatProvider provider, string format, params object[] args) => Console.Write(string.Format(provider, format, args), CurrentStyle); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.WriteLine.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.WriteLine.cs new file mode 100644 index 0000000..9f9942a --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.WriteLine.cs @@ -0,0 +1,203 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ + /// + /// Writes an empty line to the console. + /// + public static void WriteLine() => Console.WriteLine(); + + /// + /// Writes the specified string value, followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(string value) => Console.WriteLine(value, CurrentStyle); + + /// + /// Writes the text representation of the specified 32-bit signed integer value, + /// followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(int value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified 32-bit signed integer value, + /// followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, int value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified 32-bit unsigned integer value, + /// followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(uint value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified 32-bit unsigned integer value, + /// followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, uint value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified 64-bit signed integer value, + /// followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(long value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified 64-bit signed integer value, + /// followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, long value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified 64-bit unsigned integer value, + /// followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(ulong value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified 64-bit unsigned integer value, + /// followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, ulong value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified single-precision floating-point + /// value, followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(float value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified single-precision floating-point + /// value, followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, float value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified double-precision floating-point + /// value, followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(double value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified double-precision floating-point + /// value, followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, double value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified decimal value, + /// followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(decimal value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified decimal value, + /// followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, decimal value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the text representation of the specified boolean value, + /// followed by the current line terminator, to the console. + /// + /// The value to write. + public static void WriteLine(bool value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the text representation of the specified boolean value, + /// followed by the current line terminator, to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, bool value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the specified Unicode character, followed by the current + /// line terminator, value to the console. + /// + /// The value to write. + public static void WriteLine(char value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the specified Unicode character, followed by the current + /// line terminator, value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, char value) => Console.WriteLine(value.ToString(provider), CurrentStyle); + + /// + /// Writes the specified array of Unicode characters, followed by the current + /// line terminator, value to the console. + /// + /// The value to write. + public static void WriteLine(char[] value) => WriteLine(CultureInfo.CurrentCulture, value); + + /// + /// Writes the specified array of Unicode characters, followed by the current + /// line terminator, value to the console. + /// + /// An object that supplies culture-specific formatting information. + /// The value to write. + public static void WriteLine(IFormatProvider provider, char[] value) + { + if (value is null) + { + throw new ArgumentNullException(nameof(value)); + } + + for (var index = 0; index < value.Length; index++) + { + Console.Write(value[index].ToString(provider), CurrentStyle); + } + + Console.WriteLine(); + } + + /// + /// Writes the text representation of the specified array of objects, + /// followed by the current line terminator, to the console + /// using the specified format information. + /// + /// A composite format string. + /// An array of objects to write. + public static void WriteLine(string format, params object[] args) => WriteLine(CultureInfo.CurrentCulture, format, args); + + /// + /// Writes the text representation of the specified array of objects, + /// followed by the current line terminator, to the console + /// using the specified format information. + /// + /// An object that supplies culture-specific formatting information. + /// A composite format string. + /// An array of objects to write. + public static void WriteLine(IFormatProvider provider, string format, params object[] args) => Console.WriteLine(string.Format(provider, format, args), CurrentStyle); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.cs new file mode 100644 index 0000000..64d9586 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsole.cs @@ -0,0 +1,73 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// A console capable of writing ANSI escape sequences. +/// +public static partial class AnsiConsole +{ +#pragma warning disable CS0618 // 'AnsiConsoleFactory' is obsolete + private static readonly AnsiConsoleFactory _factory = new(); +#pragma warning restore CS0618 + + private static Recorder? _recorder; + private static Lazy _console = new( + () => + { + var console = Create(new AnsiConsoleSettings + { + Ansi = AnsiSupport.Detect, + ColorSystem = ColorSystemSupport.Detect, + Out = new AnsiConsoleOutput(System.Console.Out), + }); + + Created = true; + return console; + }); + + /// + /// Gets or sets the underlying . + /// + public static IAnsiConsole Console + { + get => _recorder ?? _console.Value; + + set + { + _console = new Lazy(() => value); + + if (_recorder != null) + { + // Recreate the recorder + _recorder = _recorder.Clone(value); + } + + Created = true; + } + } + + /// + /// Gets the . + /// + public static IAnsiConsoleCursor Cursor => _recorder?.Cursor ?? _console.Value.Cursor; + + /// + /// Gets the console profile. + /// + public static Profile Profile => Console.Profile; + + /// + /// Creates a new instance + /// from the provided settings. + /// + /// The settings to use. + /// An instance. + public static IAnsiConsole Create(AnsiConsoleSettings settings) => _factory.Create(settings); + + /// + /// Clears the console. + /// + public static void Clear() => Console.Clear(); +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleFactory.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleFactory.cs new file mode 100644 index 0000000..e684507 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleFactory.cs @@ -0,0 +1,105 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Spectre.Console.Rx.Enrichment; + +namespace Spectre.Console.Rx; + +/// +/// Factory for creating an ANSI console. +/// +[Obsolete("Consider using AnsiConsole.Create instead.")] +public sealed class AnsiConsoleFactory +{ + /// + /// Creates an ANSI console. + /// + /// The settings. + /// An implementation of . + public IAnsiConsole Create(AnsiConsoleSettings settings) + { + if (settings is null) + { + throw new ArgumentNullException(nameof(settings)); + } + + var output = settings.Out ?? new AnsiConsoleOutput(System.Console.Out); + if (output.Writer == null) + { + throw new InvalidOperationException("Output writer was null"); + } + + // Detect if the terminal support ANSI or not + var (supportsAnsi, legacyConsole) = DetectAnsi(settings, output.Writer); + + // Use console encoding or fall back to provided encoding + var encoding = output.Writer.IsStandardOut() || output.Writer.IsStandardError() + ? System.Console.OutputEncoding : output.Writer.Encoding; + + // Get the color system + var colorSystem = settings.ColorSystem == ColorSystemSupport.Detect + ? ColorSystemDetector.Detect(supportsAnsi) + : (ColorSystem)settings.ColorSystem; + + // Get whether or not we consider the terminal interactive + var interactive = settings.Interactive == InteractionSupport.Yes; + if (settings.Interactive == InteractionSupport.Detect) + { + interactive = !System.Console.IsInputRedirected; + } + + var profile = new Profile(output, encoding); + + profile.Capabilities.ColorSystem = colorSystem; + profile.Capabilities.Ansi = supportsAnsi; + profile.Capabilities.Links = supportsAnsi && !legacyConsole; + profile.Capabilities.Legacy = legacyConsole; + profile.Capabilities.Interactive = interactive; + profile.Capabilities.Unicode = encoding.EncodingName.ContainsExact("Unicode"); + profile.Capabilities.AlternateBuffer = supportsAnsi && !legacyConsole; + + // Enrich the profile + ProfileEnricher.Enrich( + profile, + settings.Enrichment, + settings.EnvironmentVariables); + + return new AnsiConsoleFacade( + profile, + settings.ExclusivityMode ?? new DefaultExclusivityMode()); + } + + private static (bool Ansi, bool Legacy) DetectAnsi(AnsiConsoleSettings settings, System.IO.TextWriter buffer) + { + var supportsAnsi = settings.Ansi == AnsiSupport.Yes; + var legacyConsole = false; + + if (settings.Ansi == AnsiSupport.Detect) + { + (supportsAnsi, legacyConsole) = AnsiDetector.Detect(buffer.IsStandardError(), true); + + // Check whether or not this is a legacy console from the existing instance (if any). + // We need to do this because once we upgrade the console to support ENABLE_VIRTUAL_TERMINAL_PROCESSING + // on Windows, there is no way of detecting whether or not we're running on a legacy console or not. + if (AnsiConsole.Created && !legacyConsole && (buffer.IsStandardOut() || buffer.IsStandardError()) && AnsiConsole.Profile.Capabilities.Legacy) + { + legacyConsole = AnsiConsole.Profile.Capabilities.Legacy; + } + } + else if ((buffer.IsStandardOut() || buffer.IsStandardError()) && RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // Not the first console we're creating? + if (AnsiConsole.Created) + { + legacyConsole = AnsiConsole.Profile.Capabilities.Legacy; + } + else + { + // Try detecting whether or not this is a legacy console + (_, legacyConsole) = AnsiDetector.Detect(buffer.IsStandardError(), false); + } + } + + return (supportsAnsi, legacyConsole); + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleOutput.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleOutput.cs new file mode 100644 index 0000000..82f8d7e --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleOutput.cs @@ -0,0 +1,52 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Represents console output. +/// +/// +/// Initializes a new instance of the class. +/// +/// The output writer. +public sealed class AnsiConsoleOutput(TextWriter writer) : IAnsiConsoleOutput +{ + + /// + public TextWriter Writer { get; } = writer ?? throw new ArgumentNullException(nameof(writer)); + + /// + public bool IsTerminal + { + get + { + if (Writer.IsStandardOut()) + { + return !System.Console.IsOutputRedirected; + } + + if (Writer.IsStandardError()) + { + return !System.Console.IsErrorRedirected; + } + + return false; + } + } + + /// + public int Width => ConsoleHelper.GetSafeWidth(Constants.DefaultTerminalWidth); + + /// + public int Height => ConsoleHelper.GetSafeHeight(Constants.DefaultTerminalWidth); + + /// + public void SetEncoding(Encoding encoding) + { + if (Writer.IsStandardOut() || Writer.IsStandardError()) + { + System.Console.OutputEncoding = encoding; + } + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleSettings.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleSettings.cs new file mode 100644 index 0000000..9fb74d7 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiConsoleSettings.cs @@ -0,0 +1,53 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Settings used when building a . +/// +public sealed class AnsiConsoleSettings +{ + /// + /// Initializes a new instance of the class. + /// + public AnsiConsoleSettings() => Enrichment = new ProfileEnrichment(); + + /// + /// Gets or sets a value indicating whether or + /// not ANSI escape sequences are supported. + /// + public AnsiSupport Ansi { get; set; } + + /// + /// Gets or sets the color system to use. + /// + public ColorSystemSupport ColorSystem { get; set; } = ColorSystemSupport.Detect; + + /// + /// Gets or sets the out buffer. + /// + public IAnsiConsoleOutput? Out { get; set; } + + /// + /// Gets or sets a value indicating whether or not the + /// terminal is interactive or not. + /// + public InteractionSupport Interactive { get; set; } + + /// + /// Gets or sets the exclusivity mode. + /// + public IExclusivityMode? ExclusivityMode { get; set; } + + /// + /// Gets or sets the profile enrichments settings. + /// + public ProfileEnrichment Enrichment { get; set; } + + /// + /// Gets or sets the environment variables. + /// If not value is provided the default environment variables will be used. + /// + public Dictionary? EnvironmentVariables { get; set; } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/AnsiSupport.cs b/src/Spectre.Console.Rx/Spectre.Console/AnsiSupport.cs new file mode 100644 index 0000000..ea7e5bd --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/AnsiSupport.cs @@ -0,0 +1,26 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Determines ANSI escape sequence support. +/// +public enum AnsiSupport +{ + /// + /// ANSI escape sequence support should + /// be detected by the system. + /// + Detect = 0, + + /// + /// ANSI escape sequences are supported. + /// + Yes = 1, + + /// + /// ANSI escape sequences are not supported. + /// + No = 2, +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/BoxBorder.Known.cs b/src/Spectre.Console.Rx/Spectre.Console/BoxBorder.Known.cs new file mode 100644 index 0000000..9741cb0 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/BoxBorder.Known.cs @@ -0,0 +1,41 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Represents a border. +/// +public abstract partial class BoxBorder +{ + /// + /// Gets an invisible border. + /// + public static BoxBorder None { get; } = new NoBoxBorder(); + + /// + /// Gets an ASCII border. + /// + public static BoxBorder Ascii { get; } = new AsciiBoxBorder(); + + /// + /// Gets a double border. + /// + [SuppressMessage("Naming", "CA1720:Identifier contains type name", Justification = "Intensional")] + public static BoxBorder Double { get; } = new DoubleBoxBorder(); + + /// + /// Gets a heavy border. + /// + public static BoxBorder Heavy { get; } = new HeavyBoxBorder(); + + /// + /// Gets a rounded border. + /// + public static BoxBorder Rounded { get; } = new RoundedBoxBorder(); + + /// + /// Gets a square border. + /// + public static BoxBorder Square { get; } = new SquareBoxBorder(); +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/BoxBorder.cs b/src/Spectre.Console.Rx/Spectre.Console/BoxBorder.cs new file mode 100644 index 0000000..0b01a17 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/BoxBorder.cs @@ -0,0 +1,22 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Represents a border. +/// +public abstract partial class BoxBorder +{ + /// + /// Gets the safe border for this border or null if none exist. + /// + public virtual BoxBorder? SafeBorder { get; } + + /// + /// Gets the string representation of the specified border part. + /// + /// The part to get the character representation for. + /// A character representation of the specified border part. + public abstract string GetPart(BoxBorderPart part); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Capabilities.cs b/src/Spectre.Console.Rx/Spectre.Console/Capabilities.cs new file mode 100644 index 0000000..d832635 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Capabilities.cs @@ -0,0 +1,72 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Represents console capabilities. +/// +public sealed class Capabilities : IReadOnlyCapabilities +{ + private readonly IAnsiConsoleOutput _out; + + /// + /// Initializes a new instance of the + /// class. + /// + /// The out. + /// out. + internal Capabilities(IAnsiConsoleOutput @out) => _out = @out ?? throw new ArgumentNullException(nameof(@out)); + + /// + /// Gets or sets the color system. + /// + public ColorSystem ColorSystem { get; set; } + + /// + /// Gets or sets a value indicating whether or not + /// the console supports VT/ANSI control codes. + /// + public bool Ansi { get; set; } + + /// + /// Gets or sets a value indicating whether or not + /// the console support links. + /// + public bool Links { get; set; } + + /// + /// Gets or sets a value indicating whether or not + /// this is a legacy console (cmd.exe) on an OS + /// prior to Windows 10. + /// + /// + /// Only relevant when running on Microsoft Windows. + /// + public bool Legacy { get; set; } + + /// + /// Gets a value indicating whether or not + /// the output is a terminal. + /// + [Obsolete("Use Profile.Out.IsTerminal instead")] + public bool IsTerminal => _out.IsTerminal; + + /// + /// Gets or sets a value indicating whether + /// or not the console supports interaction. + /// + public bool Interactive { get; set; } + + /// + /// Gets or sets a value indicating whether + /// or not the console supports Unicode. + /// + public bool Unicode { get; set; } + + /// + /// Gets or sets a value indicating whether + /// or not the console supports alternate buffers. + /// + public bool AlternateBuffer { get; set; } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Color.Generated.cs b/src/Spectre.Console.Rx/Spectre.Console/Color.Generated.cs new file mode 100644 index 0000000..cdbccc3 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Color.Generated.cs @@ -0,0 +1,1359 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System.Diagnostics.CodeAnalysis; + +namespace Spectre.Console.Rx; + +/// +/// Represents a color. +/// +public partial struct Color +{ + internal Color(byte number, byte red, byte green, byte blue, bool isDefault = false) + : this(red, green, blue) + { + Number = number; + IsDefault = isDefault; + } + + /// + /// Gets the color "Black" (RGB 0,0,0). + /// + public static Color Black { get; } = new Color(0, 0, 0, 0); + + /// + /// Gets the color "Maroon" (RGB 128,0,0). + /// + public static Color Maroon { get; } = new Color(1, 128, 0, 0); + + /// + /// Gets the color "Green" (RGB 0,128,0). + /// + public static Color Green { get; } = new Color(2, 0, 128, 0); + + /// + /// Gets the color "Olive" (RGB 128,128,0). + /// + public static Color Olive { get; } = new Color(3, 128, 128, 0); + + /// + /// Gets the color "Navy" (RGB 0,0,128). + /// + public static Color Navy { get; } = new Color(4, 0, 0, 128); + + /// + /// Gets the color "Purple" (RGB 128,0,128). + /// + public static Color Purple { get; } = new Color(5, 128, 0, 128); + + /// + /// Gets the color "Teal" (RGB 0,128,128). + /// + public static Color Teal { get; } = new Color(6, 0, 128, 128); + + /// + /// Gets the color "Silver" (RGB 192,192,192). + /// + public static Color Silver { get; } = new Color(7, 192, 192, 192); + + /// + /// Gets the color "Grey" (RGB 128,128,128). + /// + public static Color Grey { get; } = new Color(8, 128, 128, 128); + + /// + /// Gets the color "Red" (RGB 255,0,0). + /// + public static Color Red { get; } = new Color(9, 255, 0, 0); + + /// + /// Gets the color "Lime" (RGB 0,255,0). + /// + public static Color Lime { get; } = new Color(10, 0, 255, 0); + + /// + /// Gets the color "Yellow" (RGB 255,255,0). + /// + public static Color Yellow { get; } = new Color(11, 255, 255, 0); + + /// + /// Gets the color "Blue" (RGB 0,0,255). + /// + public static Color Blue { get; } = new Color(12, 0, 0, 255); + + /// + /// Gets the color "Fuchsia" (RGB 255,0,255). + /// + public static Color Fuchsia { get; } = new Color(13, 255, 0, 255); + + /// + /// Gets the color "Aqua" (RGB 0,255,255). + /// + public static Color Aqua { get; } = new Color(14, 0, 255, 255); + + /// + /// Gets the color "White" (RGB 255,255,255). + /// + public static Color White { get; } = new Color(15, 255, 255, 255); + + /// + /// Gets the color "Grey0" (RGB 0,0,0). + /// + public static Color Grey0 { get; } = new Color(16, 0, 0, 0); + + /// + /// Gets the color "NavyBlue" (RGB 0,0,95). + /// + public static Color NavyBlue { get; } = new Color(17, 0, 0, 95); + + /// + /// Gets the color "DarkBlue" (RGB 0,0,135). + /// + public static Color DarkBlue { get; } = new Color(18, 0, 0, 135); + + /// + /// Gets the color "Blue3" (RGB 0,0,175). + /// + public static Color Blue3 { get; } = new Color(19, 0, 0, 175); + + /// + /// Gets the color "Blue3_1" (RGB 0,0,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Blue3_1 { get; } = new Color(20, 0, 0, 215); + + /// + /// Gets the color "Blue1" (RGB 0,0,255). + /// + public static Color Blue1 { get; } = new Color(21, 0, 0, 255); + + /// + /// Gets the color "DarkGreen" (RGB 0,95,0). + /// + public static Color DarkGreen { get; } = new Color(22, 0, 95, 0); + + /// + /// Gets the color "DeepSkyBlue4" (RGB 0,95,95). + /// + public static Color DeepSkyBlue4 { get; } = new Color(23, 0, 95, 95); + + /// + /// Gets the color "DeepSkyBlue4_1" (RGB 0,95,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DeepSkyBlue4_1 { get; } = new Color(24, 0, 95, 135); + + /// + /// Gets the color "DeepSkyBlue4_2" (RGB 0,95,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DeepSkyBlue4_2 { get; } = new Color(25, 0, 95, 175); + + /// + /// Gets the color "DodgerBlue3" (RGB 0,95,215). + /// + public static Color DodgerBlue3 { get; } = new Color(26, 0, 95, 215); + + /// + /// Gets the color "DodgerBlue2" (RGB 0,95,255). + /// + public static Color DodgerBlue2 { get; } = new Color(27, 0, 95, 255); + + /// + /// Gets the color "Green4" (RGB 0,135,0). + /// + public static Color Green4 { get; } = new Color(28, 0, 135, 0); + + /// + /// Gets the color "SpringGreen4" (RGB 0,135,95). + /// + public static Color SpringGreen4 { get; } = new Color(29, 0, 135, 95); + + /// + /// Gets the color "Turquoise4" (RGB 0,135,135). + /// + public static Color Turquoise4 { get; } = new Color(30, 0, 135, 135); + + /// + /// Gets the color "DeepSkyBlue3" (RGB 0,135,175). + /// + public static Color DeepSkyBlue3 { get; } = new Color(31, 0, 135, 175); + + /// + /// Gets the color "DeepSkyBlue3_1" (RGB 0,135,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DeepSkyBlue3_1 { get; } = new Color(32, 0, 135, 215); + + /// + /// Gets the color "DodgerBlue1" (RGB 0,135,255). + /// + public static Color DodgerBlue1 { get; } = new Color(33, 0, 135, 255); + + /// + /// Gets the color "Green3" (RGB 0,175,0). + /// + public static Color Green3 { get; } = new Color(34, 0, 175, 0); + + /// + /// Gets the color "SpringGreen3" (RGB 0,175,95). + /// + public static Color SpringGreen3 { get; } = new Color(35, 0, 175, 95); + + /// + /// Gets the color "DarkCyan" (RGB 0,175,135). + /// + public static Color DarkCyan { get; } = new Color(36, 0, 175, 135); + + /// + /// Gets the color "LightSeaGreen" (RGB 0,175,175). + /// + public static Color LightSeaGreen { get; } = new Color(37, 0, 175, 175); + + /// + /// Gets the color "DeepSkyBlue2" (RGB 0,175,215). + /// + public static Color DeepSkyBlue2 { get; } = new Color(38, 0, 175, 215); + + /// + /// Gets the color "DeepSkyBlue1" (RGB 0,175,255). + /// + public static Color DeepSkyBlue1 { get; } = new Color(39, 0, 175, 255); + + /// + /// Gets the color "Green3_1" (RGB 0,215,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Green3_1 { get; } = new Color(40, 0, 215, 0); + + /// + /// Gets the color "SpringGreen3_1" (RGB 0,215,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color SpringGreen3_1 { get; } = new Color(41, 0, 215, 95); + + /// + /// Gets the color "SpringGreen2" (RGB 0,215,135). + /// + public static Color SpringGreen2 { get; } = new Color(42, 0, 215, 135); + + /// + /// Gets the color "Cyan3" (RGB 0,215,175). + /// + public static Color Cyan3 { get; } = new Color(43, 0, 215, 175); + + /// + /// Gets the color "DarkTurquoise" (RGB 0,215,215). + /// + public static Color DarkTurquoise { get; } = new Color(44, 0, 215, 215); + + /// + /// Gets the color "Turquoise2" (RGB 0,215,255). + /// + public static Color Turquoise2 { get; } = new Color(45, 0, 215, 255); + + /// + /// Gets the color "Green1" (RGB 0,255,0). + /// + public static Color Green1 { get; } = new Color(46, 0, 255, 0); + + /// + /// Gets the color "SpringGreen2_1" (RGB 0,255,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color SpringGreen2_1 { get; } = new Color(47, 0, 255, 95); + + /// + /// Gets the color "SpringGreen1" (RGB 0,255,135). + /// + public static Color SpringGreen1 { get; } = new Color(48, 0, 255, 135); + + /// + /// Gets the color "MediumSpringGreen" (RGB 0,255,175). + /// + public static Color MediumSpringGreen { get; } = new Color(49, 0, 255, 175); + + /// + /// Gets the color "Cyan2" (RGB 0,255,215). + /// + public static Color Cyan2 { get; } = new Color(50, 0, 255, 215); + + /// + /// Gets the color "Cyan1" (RGB 0,255,255). + /// + public static Color Cyan1 { get; } = new Color(51, 0, 255, 255); + + /// + /// Gets the color "DarkRed" (RGB 95,0,0). + /// + public static Color DarkRed { get; } = new Color(52, 95, 0, 0); + + /// + /// Gets the color "DeepPink4" (RGB 95,0,95). + /// + public static Color DeepPink4 { get; } = new Color(53, 95, 0, 95); + + /// + /// Gets the color "Purple4" (RGB 95,0,135). + /// + public static Color Purple4 { get; } = new Color(54, 95, 0, 135); + + /// + /// Gets the color "Purple4_1" (RGB 95,0,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Purple4_1 { get; } = new Color(55, 95, 0, 175); + + /// + /// Gets the color "Purple3" (RGB 95,0,215). + /// + public static Color Purple3 { get; } = new Color(56, 95, 0, 215); + + /// + /// Gets the color "BlueViolet" (RGB 95,0,255). + /// + public static Color BlueViolet { get; } = new Color(57, 95, 0, 255); + + /// + /// Gets the color "Orange4" (RGB 95,95,0). + /// + public static Color Orange4 { get; } = new Color(58, 95, 95, 0); + + /// + /// Gets the color "Grey37" (RGB 95,95,95). + /// + public static Color Grey37 { get; } = new Color(59, 95, 95, 95); + + /// + /// Gets the color "MediumPurple4" (RGB 95,95,135). + /// + public static Color MediumPurple4 { get; } = new Color(60, 95, 95, 135); + + /// + /// Gets the color "SlateBlue3" (RGB 95,95,175). + /// + public static Color SlateBlue3 { get; } = new Color(61, 95, 95, 175); + + /// + /// Gets the color "SlateBlue3_1" (RGB 95,95,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color SlateBlue3_1 { get; } = new Color(62, 95, 95, 215); + + /// + /// Gets the color "RoyalBlue1" (RGB 95,95,255). + /// + public static Color RoyalBlue1 { get; } = new Color(63, 95, 95, 255); + + /// + /// Gets the color "Chartreuse4" (RGB 95,135,0). + /// + public static Color Chartreuse4 { get; } = new Color(64, 95, 135, 0); + + /// + /// Gets the color "DarkSeaGreen4" (RGB 95,135,95). + /// + public static Color DarkSeaGreen4 { get; } = new Color(65, 95, 135, 95); + + /// + /// Gets the color "PaleTurquoise4" (RGB 95,135,135). + /// + public static Color PaleTurquoise4 { get; } = new Color(66, 95, 135, 135); + + /// + /// Gets the color "SteelBlue" (RGB 95,135,175). + /// + public static Color SteelBlue { get; } = new Color(67, 95, 135, 175); + + /// + /// Gets the color "SteelBlue3" (RGB 95,135,215). + /// + public static Color SteelBlue3 { get; } = new Color(68, 95, 135, 215); + + /// + /// Gets the color "CornflowerBlue" (RGB 95,135,255). + /// + public static Color CornflowerBlue { get; } = new Color(69, 95, 135, 255); + + /// + /// Gets the color "Chartreuse3" (RGB 95,175,0). + /// + public static Color Chartreuse3 { get; } = new Color(70, 95, 175, 0); + + /// + /// Gets the color "DarkSeaGreen4_1" (RGB 95,175,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkSeaGreen4_1 { get; } = new Color(71, 95, 175, 95); + + /// + /// Gets the color "CadetBlue" (RGB 95,175,135). + /// + public static Color CadetBlue { get; } = new Color(72, 95, 175, 135); + + /// + /// Gets the color "CadetBlue_1" (RGB 95,175,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color CadetBlue_1 { get; } = new Color(73, 95, 175, 175); + + /// + /// Gets the color "SkyBlue3" (RGB 95,175,215). + /// + public static Color SkyBlue3 { get; } = new Color(74, 95, 175, 215); + + /// + /// Gets the color "SteelBlue1" (RGB 95,175,255). + /// + public static Color SteelBlue1 { get; } = new Color(75, 95, 175, 255); + + /// + /// Gets the color "Chartreuse3_1" (RGB 95,215,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Chartreuse3_1 { get; } = new Color(76, 95, 215, 0); + + /// + /// Gets the color "PaleGreen3" (RGB 95,215,95). + /// + public static Color PaleGreen3 { get; } = new Color(77, 95, 215, 95); + + /// + /// Gets the color "SeaGreen3" (RGB 95,215,135). + /// + public static Color SeaGreen3 { get; } = new Color(78, 95, 215, 135); + + /// + /// Gets the color "Aquamarine3" (RGB 95,215,175). + /// + public static Color Aquamarine3 { get; } = new Color(79, 95, 215, 175); + + /// + /// Gets the color "MediumTurquoise" (RGB 95,215,215). + /// + public static Color MediumTurquoise { get; } = new Color(80, 95, 215, 215); + + /// + /// Gets the color "SteelBlue1_1" (RGB 95,215,255). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color SteelBlue1_1 { get; } = new Color(81, 95, 215, 255); + + /// + /// Gets the color "Chartreuse2" (RGB 95,255,0). + /// + public static Color Chartreuse2 { get; } = new Color(82, 95, 255, 0); + + /// + /// Gets the color "SeaGreen2" (RGB 95,255,95). + /// + public static Color SeaGreen2 { get; } = new Color(83, 95, 255, 95); + + /// + /// Gets the color "SeaGreen1" (RGB 95,255,135). + /// + public static Color SeaGreen1 { get; } = new Color(84, 95, 255, 135); + + /// + /// Gets the color "SeaGreen1_1" (RGB 95,255,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color SeaGreen1_1 { get; } = new Color(85, 95, 255, 175); + + /// + /// Gets the color "Aquamarine1" (RGB 95,255,215). + /// + public static Color Aquamarine1 { get; } = new Color(86, 95, 255, 215); + + /// + /// Gets the color "DarkSlateGray2" (RGB 95,255,255). + /// + public static Color DarkSlateGray2 { get; } = new Color(87, 95, 255, 255); + + /// + /// Gets the color "DarkRed_1" (RGB 135,0,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkRed_1 { get; } = new Color(88, 135, 0, 0); + + /// + /// Gets the color "DeepPink4_1" (RGB 135,0,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DeepPink4_1 { get; } = new Color(89, 135, 0, 95); + + /// + /// Gets the color "DarkMagenta" (RGB 135,0,135). + /// + public static Color DarkMagenta { get; } = new Color(90, 135, 0, 135); + + /// + /// Gets the color "DarkMagenta_1" (RGB 135,0,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkMagenta_1 { get; } = new Color(91, 135, 0, 175); + + /// + /// Gets the color "DarkViolet" (RGB 135,0,215). + /// + public static Color DarkViolet { get; } = new Color(92, 135, 0, 215); + + /// + /// Gets the color "Purple_1" (RGB 135,0,255). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Purple_1 { get; } = new Color(93, 135, 0, 255); + + /// + /// Gets the color "Orange4_1" (RGB 135,95,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Orange4_1 { get; } = new Color(94, 135, 95, 0); + + /// + /// Gets the color "LightPink4" (RGB 135,95,95). + /// + public static Color LightPink4 { get; } = new Color(95, 135, 95, 95); + + /// + /// Gets the color "Plum4" (RGB 135,95,135). + /// + public static Color Plum4 { get; } = new Color(96, 135, 95, 135); + + /// + /// Gets the color "MediumPurple3" (RGB 135,95,175). + /// + public static Color MediumPurple3 { get; } = new Color(97, 135, 95, 175); + + /// + /// Gets the color "MediumPurple3_1" (RGB 135,95,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color MediumPurple3_1 { get; } = new Color(98, 135, 95, 215); + + /// + /// Gets the color "SlateBlue1" (RGB 135,95,255). + /// + public static Color SlateBlue1 { get; } = new Color(99, 135, 95, 255); + + /// + /// Gets the color "Yellow4" (RGB 135,135,0). + /// + public static Color Yellow4 { get; } = new Color(100, 135, 135, 0); + + /// + /// Gets the color "Wheat4" (RGB 135,135,95). + /// + public static Color Wheat4 { get; } = new Color(101, 135, 135, 95); + + /// + /// Gets the color "Grey53" (RGB 135,135,135). + /// + public static Color Grey53 { get; } = new Color(102, 135, 135, 135); + + /// + /// Gets the color "LightSlateGrey" (RGB 135,135,175). + /// + public static Color LightSlateGrey { get; } = new Color(103, 135, 135, 175); + + /// + /// Gets the color "MediumPurple" (RGB 135,135,215). + /// + public static Color MediumPurple { get; } = new Color(104, 135, 135, 215); + + /// + /// Gets the color "LightSlateBlue" (RGB 135,135,255). + /// + public static Color LightSlateBlue { get; } = new Color(105, 135, 135, 255); + + /// + /// Gets the color "Yellow4_1" (RGB 135,175,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Yellow4_1 { get; } = new Color(106, 135, 175, 0); + + /// + /// Gets the color "DarkOliveGreen3" (RGB 135,175,95). + /// + public static Color DarkOliveGreen3 { get; } = new Color(107, 135, 175, 95); + + /// + /// Gets the color "DarkSeaGreen" (RGB 135,175,135). + /// + public static Color DarkSeaGreen { get; } = new Color(108, 135, 175, 135); + + /// + /// Gets the color "LightSkyBlue3" (RGB 135,175,175). + /// + public static Color LightSkyBlue3 { get; } = new Color(109, 135, 175, 175); + + /// + /// Gets the color "LightSkyBlue3_1" (RGB 135,175,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color LightSkyBlue3_1 { get; } = new Color(110, 135, 175, 215); + + /// + /// Gets the color "SkyBlue2" (RGB 135,175,255). + /// + public static Color SkyBlue2 { get; } = new Color(111, 135, 175, 255); + + /// + /// Gets the color "Chartreuse2_1" (RGB 135,215,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Chartreuse2_1 { get; } = new Color(112, 135, 215, 0); + + /// + /// Gets the color "DarkOliveGreen3_1" (RGB 135,215,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkOliveGreen3_1 { get; } = new Color(113, 135, 215, 95); + + /// + /// Gets the color "PaleGreen3_1" (RGB 135,215,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color PaleGreen3_1 { get; } = new Color(114, 135, 215, 135); + + /// + /// Gets the color "DarkSeaGreen3" (RGB 135,215,175). + /// + public static Color DarkSeaGreen3 { get; } = new Color(115, 135, 215, 175); + + /// + /// Gets the color "DarkSlateGray3" (RGB 135,215,215). + /// + public static Color DarkSlateGray3 { get; } = new Color(116, 135, 215, 215); + + /// + /// Gets the color "SkyBlue1" (RGB 135,215,255). + /// + public static Color SkyBlue1 { get; } = new Color(117, 135, 215, 255); + + /// + /// Gets the color "Chartreuse1" (RGB 135,255,0). + /// + public static Color Chartreuse1 { get; } = new Color(118, 135, 255, 0); + + /// + /// Gets the color "LightGreen" (RGB 135,255,95). + /// + public static Color LightGreen { get; } = new Color(119, 135, 255, 95); + + /// + /// Gets the color "LightGreen_1" (RGB 135,255,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color LightGreen_1 { get; } = new Color(120, 135, 255, 135); + + /// + /// Gets the color "PaleGreen1" (RGB 135,255,175). + /// + public static Color PaleGreen1 { get; } = new Color(121, 135, 255, 175); + + /// + /// Gets the color "Aquamarine1_1" (RGB 135,255,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Aquamarine1_1 { get; } = new Color(122, 135, 255, 215); + + /// + /// Gets the color "DarkSlateGray1" (RGB 135,255,255). + /// + public static Color DarkSlateGray1 { get; } = new Color(123, 135, 255, 255); + + /// + /// Gets the color "Red3" (RGB 175,0,0). + /// + public static Color Red3 { get; } = new Color(124, 175, 0, 0); + + /// + /// Gets the color "DeepPink4_2" (RGB 175,0,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DeepPink4_2 { get; } = new Color(125, 175, 0, 95); + + /// + /// Gets the color "MediumVioletRed" (RGB 175,0,135). + /// + public static Color MediumVioletRed { get; } = new Color(126, 175, 0, 135); + + /// + /// Gets the color "Magenta3" (RGB 175,0,175). + /// + public static Color Magenta3 { get; } = new Color(127, 175, 0, 175); + + /// + /// Gets the color "DarkViolet_1" (RGB 175,0,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkViolet_1 { get; } = new Color(128, 175, 0, 215); + + /// + /// Gets the color "Purple_2" (RGB 175,0,255). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Purple_2 { get; } = new Color(129, 175, 0, 255); + + /// + /// Gets the color "DarkOrange3" (RGB 175,95,0). + /// + public static Color DarkOrange3 { get; } = new Color(130, 175, 95, 0); + + /// + /// Gets the color "IndianRed" (RGB 175,95,95). + /// + public static Color IndianRed { get; } = new Color(131, 175, 95, 95); + + /// + /// Gets the color "HotPink3" (RGB 175,95,135). + /// + public static Color HotPink3 { get; } = new Color(132, 175, 95, 135); + + /// + /// Gets the color "MediumOrchid3" (RGB 175,95,175). + /// + public static Color MediumOrchid3 { get; } = new Color(133, 175, 95, 175); + + /// + /// Gets the color "MediumOrchid" (RGB 175,95,215). + /// + public static Color MediumOrchid { get; } = new Color(134, 175, 95, 215); + + /// + /// Gets the color "MediumPurple2" (RGB 175,95,255). + /// + public static Color MediumPurple2 { get; } = new Color(135, 175, 95, 255); + + /// + /// Gets the color "DarkGoldenrod" (RGB 175,135,0). + /// + public static Color DarkGoldenrod { get; } = new Color(136, 175, 135, 0); + + /// + /// Gets the color "LightSalmon3" (RGB 175,135,95). + /// + public static Color LightSalmon3 { get; } = new Color(137, 175, 135, 95); + + /// + /// Gets the color "RosyBrown" (RGB 175,135,135). + /// + public static Color RosyBrown { get; } = new Color(138, 175, 135, 135); + + /// + /// Gets the color "Grey63" (RGB 175,135,175). + /// + public static Color Grey63 { get; } = new Color(139, 175, 135, 175); + + /// + /// Gets the color "MediumPurple2_1" (RGB 175,135,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color MediumPurple2_1 { get; } = new Color(140, 175, 135, 215); + + /// + /// Gets the color "MediumPurple1" (RGB 175,135,255). + /// + public static Color MediumPurple1 { get; } = new Color(141, 175, 135, 255); + + /// + /// Gets the color "Gold3" (RGB 175,175,0). + /// + public static Color Gold3 { get; } = new Color(142, 175, 175, 0); + + /// + /// Gets the color "DarkKhaki" (RGB 175,175,95). + /// + public static Color DarkKhaki { get; } = new Color(143, 175, 175, 95); + + /// + /// Gets the color "NavajoWhite3" (RGB 175,175,135). + /// + public static Color NavajoWhite3 { get; } = new Color(144, 175, 175, 135); + + /// + /// Gets the color "Grey69" (RGB 175,175,175). + /// + public static Color Grey69 { get; } = new Color(145, 175, 175, 175); + + /// + /// Gets the color "LightSteelBlue3" (RGB 175,175,215). + /// + public static Color LightSteelBlue3 { get; } = new Color(146, 175, 175, 215); + + /// + /// Gets the color "LightSteelBlue" (RGB 175,175,255). + /// + public static Color LightSteelBlue { get; } = new Color(147, 175, 175, 255); + + /// + /// Gets the color "Yellow3" (RGB 175,215,0). + /// + public static Color Yellow3 { get; } = new Color(148, 175, 215, 0); + + /// + /// Gets the color "DarkOliveGreen3_2" (RGB 175,215,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkOliveGreen3_2 { get; } = new Color(149, 175, 215, 95); + + /// + /// Gets the color "DarkSeaGreen3_1" (RGB 175,215,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkSeaGreen3_1 { get; } = new Color(150, 175, 215, 135); + + /// + /// Gets the color "DarkSeaGreen2" (RGB 175,215,175). + /// + public static Color DarkSeaGreen2 { get; } = new Color(151, 175, 215, 175); + + /// + /// Gets the color "LightCyan3" (RGB 175,215,215). + /// + public static Color LightCyan3 { get; } = new Color(152, 175, 215, 215); + + /// + /// Gets the color "LightSkyBlue1" (RGB 175,215,255). + /// + public static Color LightSkyBlue1 { get; } = new Color(153, 175, 215, 255); + + /// + /// Gets the color "GreenYellow" (RGB 175,255,0). + /// + public static Color GreenYellow { get; } = new Color(154, 175, 255, 0); + + /// + /// Gets the color "DarkOliveGreen2" (RGB 175,255,95). + /// + public static Color DarkOliveGreen2 { get; } = new Color(155, 175, 255, 95); + + /// + /// Gets the color "PaleGreen1_1" (RGB 175,255,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color PaleGreen1_1 { get; } = new Color(156, 175, 255, 135); + + /// + /// Gets the color "DarkSeaGreen2_1" (RGB 175,255,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkSeaGreen2_1 { get; } = new Color(157, 175, 255, 175); + + /// + /// Gets the color "DarkSeaGreen1" (RGB 175,255,215). + /// + public static Color DarkSeaGreen1 { get; } = new Color(158, 175, 255, 215); + + /// + /// Gets the color "PaleTurquoise1" (RGB 175,255,255). + /// + public static Color PaleTurquoise1 { get; } = new Color(159, 175, 255, 255); + + /// + /// Gets the color "Red3_1" (RGB 215,0,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Red3_1 { get; } = new Color(160, 215, 0, 0); + + /// + /// Gets the color "DeepPink3" (RGB 215,0,95). + /// + public static Color DeepPink3 { get; } = new Color(161, 215, 0, 95); + + /// + /// Gets the color "DeepPink3_1" (RGB 215,0,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DeepPink3_1 { get; } = new Color(162, 215, 0, 135); + + /// + /// Gets the color "Magenta3_1" (RGB 215,0,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Magenta3_1 { get; } = new Color(163, 215, 0, 175); + + /// + /// Gets the color "Magenta3_2" (RGB 215,0,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Magenta3_2 { get; } = new Color(164, 215, 0, 215); + + /// + /// Gets the color "Magenta2" (RGB 215,0,255). + /// + public static Color Magenta2 { get; } = new Color(165, 215, 0, 255); + + /// + /// Gets the color "DarkOrange3_1" (RGB 215,95,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkOrange3_1 { get; } = new Color(166, 215, 95, 0); + + /// + /// Gets the color "IndianRed_1" (RGB 215,95,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color IndianRed_1 { get; } = new Color(167, 215, 95, 95); + + /// + /// Gets the color "HotPink3_1" (RGB 215,95,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color HotPink3_1 { get; } = new Color(168, 215, 95, 135); + + /// + /// Gets the color "HotPink2" (RGB 215,95,175). + /// + public static Color HotPink2 { get; } = new Color(169, 215, 95, 175); + + /// + /// Gets the color "Orchid" (RGB 215,95,215). + /// + public static Color Orchid { get; } = new Color(170, 215, 95, 215); + + /// + /// Gets the color "MediumOrchid1" (RGB 215,95,255). + /// + public static Color MediumOrchid1 { get; } = new Color(171, 215, 95, 255); + + /// + /// Gets the color "Orange3" (RGB 215,135,0). + /// + public static Color Orange3 { get; } = new Color(172, 215, 135, 0); + + /// + /// Gets the color "LightSalmon3_1" (RGB 215,135,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color LightSalmon3_1 { get; } = new Color(173, 215, 135, 95); + + /// + /// Gets the color "LightPink3" (RGB 215,135,135). + /// + public static Color LightPink3 { get; } = new Color(174, 215, 135, 135); + + /// + /// Gets the color "Pink3" (RGB 215,135,175). + /// + public static Color Pink3 { get; } = new Color(175, 215, 135, 175); + + /// + /// Gets the color "Plum3" (RGB 215,135,215). + /// + public static Color Plum3 { get; } = new Color(176, 215, 135, 215); + + /// + /// Gets the color "Violet" (RGB 215,135,255). + /// + public static Color Violet { get; } = new Color(177, 215, 135, 255); + + /// + /// Gets the color "Gold3_1" (RGB 215,175,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Gold3_1 { get; } = new Color(178, 215, 175, 0); + + /// + /// Gets the color "LightGoldenrod3" (RGB 215,175,95). + /// + public static Color LightGoldenrod3 { get; } = new Color(179, 215, 175, 95); + + /// + /// Gets the color "Tan" (RGB 215,175,135). + /// + public static Color Tan { get; } = new Color(180, 215, 175, 135); + + /// + /// Gets the color "MistyRose3" (RGB 215,175,175). + /// + public static Color MistyRose3 { get; } = new Color(181, 215, 175, 175); + + /// + /// Gets the color "Thistle3" (RGB 215,175,215). + /// + public static Color Thistle3 { get; } = new Color(182, 215, 175, 215); + + /// + /// Gets the color "Plum2" (RGB 215,175,255). + /// + public static Color Plum2 { get; } = new Color(183, 215, 175, 255); + + /// + /// Gets the color "Yellow3_1" (RGB 215,215,0). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Yellow3_1 { get; } = new Color(184, 215, 215, 0); + + /// + /// Gets the color "Khaki3" (RGB 215,215,95). + /// + public static Color Khaki3 { get; } = new Color(185, 215, 215, 95); + + /// + /// Gets the color "LightGoldenrod2" (RGB 215,215,135). + /// + public static Color LightGoldenrod2 { get; } = new Color(186, 215, 215, 135); + + /// + /// Gets the color "LightYellow3" (RGB 215,215,175). + /// + public static Color LightYellow3 { get; } = new Color(187, 215, 215, 175); + + /// + /// Gets the color "Grey84" (RGB 215,215,215). + /// + public static Color Grey84 { get; } = new Color(188, 215, 215, 215); + + /// + /// Gets the color "LightSteelBlue1" (RGB 215,215,255). + /// + public static Color LightSteelBlue1 { get; } = new Color(189, 215, 215, 255); + + /// + /// Gets the color "Yellow2" (RGB 215,255,0). + /// + public static Color Yellow2 { get; } = new Color(190, 215, 255, 0); + + /// + /// Gets the color "DarkOliveGreen1" (RGB 215,255,95). + /// + public static Color DarkOliveGreen1 { get; } = new Color(191, 215, 255, 95); + + /// + /// Gets the color "DarkOliveGreen1_1" (RGB 215,255,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkOliveGreen1_1 { get; } = new Color(192, 215, 255, 135); + + /// + /// Gets the color "DarkSeaGreen1_1" (RGB 215,255,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DarkSeaGreen1_1 { get; } = new Color(193, 215, 255, 175); + + /// + /// Gets the color "Honeydew2" (RGB 215,255,215). + /// + public static Color Honeydew2 { get; } = new Color(194, 215, 255, 215); + + /// + /// Gets the color "LightCyan1" (RGB 215,255,255). + /// + public static Color LightCyan1 { get; } = new Color(195, 215, 255, 255); + + /// + /// Gets the color "Red1" (RGB 255,0,0). + /// + public static Color Red1 { get; } = new Color(196, 255, 0, 0); + + /// + /// Gets the color "DeepPink2" (RGB 255,0,95). + /// + public static Color DeepPink2 { get; } = new Color(197, 255, 0, 95); + + /// + /// Gets the color "DeepPink1" (RGB 255,0,135). + /// + public static Color DeepPink1 { get; } = new Color(198, 255, 0, 135); + + /// + /// Gets the color "DeepPink1_1" (RGB 255,0,175). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color DeepPink1_1 { get; } = new Color(199, 255, 0, 175); + + /// + /// Gets the color "Magenta2_1" (RGB 255,0,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color Magenta2_1 { get; } = new Color(200, 255, 0, 215); + + /// + /// Gets the color "Magenta1" (RGB 255,0,255). + /// + public static Color Magenta1 { get; } = new Color(201, 255, 0, 255); + + /// + /// Gets the color "OrangeRed1" (RGB 255,95,0). + /// + public static Color OrangeRed1 { get; } = new Color(202, 255, 95, 0); + + /// + /// Gets the color "IndianRed1" (RGB 255,95,95). + /// + public static Color IndianRed1 { get; } = new Color(203, 255, 95, 95); + + /// + /// Gets the color "IndianRed1_1" (RGB 255,95,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color IndianRed1_1 { get; } = new Color(204, 255, 95, 135); + + /// + /// Gets the color "HotPink" (RGB 255,95,175). + /// + public static Color HotPink { get; } = new Color(205, 255, 95, 175); + + /// + /// Gets the color "HotPink_1" (RGB 255,95,215). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color HotPink_1 { get; } = new Color(206, 255, 95, 215); + + /// + /// Gets the color "MediumOrchid1_1" (RGB 255,95,255). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color MediumOrchid1_1 { get; } = new Color(207, 255, 95, 255); + + /// + /// Gets the color "DarkOrange" (RGB 255,135,0). + /// + public static Color DarkOrange { get; } = new Color(208, 255, 135, 0); + + /// + /// Gets the color "Salmon1" (RGB 255,135,95). + /// + public static Color Salmon1 { get; } = new Color(209, 255, 135, 95); + + /// + /// Gets the color "LightCoral" (RGB 255,135,135). + /// + public static Color LightCoral { get; } = new Color(210, 255, 135, 135); + + /// + /// Gets the color "PaleVioletRed1" (RGB 255,135,175). + /// + public static Color PaleVioletRed1 { get; } = new Color(211, 255, 135, 175); + + /// + /// Gets the color "Orchid2" (RGB 255,135,215). + /// + public static Color Orchid2 { get; } = new Color(212, 255, 135, 215); + + /// + /// Gets the color "Orchid1" (RGB 255,135,255). + /// + public static Color Orchid1 { get; } = new Color(213, 255, 135, 255); + + /// + /// Gets the color "Orange1" (RGB 255,175,0). + /// + public static Color Orange1 { get; } = new Color(214, 255, 175, 0); + + /// + /// Gets the color "SandyBrown" (RGB 255,175,95). + /// + public static Color SandyBrown { get; } = new Color(215, 255, 175, 95); + + /// + /// Gets the color "LightSalmon1" (RGB 255,175,135). + /// + public static Color LightSalmon1 { get; } = new Color(216, 255, 175, 135); + + /// + /// Gets the color "LightPink1" (RGB 255,175,175). + /// + public static Color LightPink1 { get; } = new Color(217, 255, 175, 175); + + /// + /// Gets the color "Pink1" (RGB 255,175,215). + /// + public static Color Pink1 { get; } = new Color(218, 255, 175, 215); + + /// + /// Gets the color "Plum1" (RGB 255,175,255). + /// + public static Color Plum1 { get; } = new Color(219, 255, 175, 255); + + /// + /// Gets the color "Gold1" (RGB 255,215,0). + /// + public static Color Gold1 { get; } = new Color(220, 255, 215, 0); + + /// + /// Gets the color "LightGoldenrod2_1" (RGB 255,215,95). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color LightGoldenrod2_1 { get; } = new Color(221, 255, 215, 95); + + /// + /// Gets the color "LightGoldenrod2_2" (RGB 255,215,135). + /// + [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] + public static Color LightGoldenrod2_2 { get; } = new Color(222, 255, 215, 135); + + /// + /// Gets the color "NavajoWhite1" (RGB 255,215,175). + /// + public static Color NavajoWhite1 { get; } = new Color(223, 255, 215, 175); + + /// + /// Gets the color "MistyRose1" (RGB 255,215,215). + /// + public static Color MistyRose1 { get; } = new Color(224, 255, 215, 215); + + /// + /// Gets the color "Thistle1" (RGB 255,215,255). + /// + public static Color Thistle1 { get; } = new Color(225, 255, 215, 255); + + /// + /// Gets the color "Yellow1" (RGB 255,255,0). + /// + public static Color Yellow1 { get; } = new Color(226, 255, 255, 0); + + /// + /// Gets the color "LightGoldenrod1" (RGB 255,255,95). + /// + public static Color LightGoldenrod1 { get; } = new Color(227, 255, 255, 95); + + /// + /// Gets the color "Khaki1" (RGB 255,255,135). + /// + public static Color Khaki1 { get; } = new Color(228, 255, 255, 135); + + /// + /// Gets the color "Wheat1" (RGB 255,255,175). + /// + public static Color Wheat1 { get; } = new Color(229, 255, 255, 175); + + /// + /// Gets the color "Cornsilk1" (RGB 255,255,215). + /// + public static Color Cornsilk1 { get; } = new Color(230, 255, 255, 215); + + /// + /// Gets the color "Grey100" (RGB 255,255,255). + /// + public static Color Grey100 { get; } = new Color(231, 255, 255, 255); + + /// + /// Gets the color "Grey3" (RGB 8,8,8). + /// + public static Color Grey3 { get; } = new Color(232, 8, 8, 8); + + /// + /// Gets the color "Grey7" (RGB 18,18,18). + /// + public static Color Grey7 { get; } = new Color(233, 18, 18, 18); + + /// + /// Gets the color "Grey11" (RGB 28,28,28). + /// + public static Color Grey11 { get; } = new Color(234, 28, 28, 28); + + /// + /// Gets the color "Grey15" (RGB 38,38,38). + /// + public static Color Grey15 { get; } = new Color(235, 38, 38, 38); + + /// + /// Gets the color "Grey19" (RGB 48,48,48). + /// + public static Color Grey19 { get; } = new Color(236, 48, 48, 48); + + /// + /// Gets the color "Grey23" (RGB 58,58,58). + /// + public static Color Grey23 { get; } = new Color(237, 58, 58, 58); + + /// + /// Gets the color "Grey27" (RGB 68,68,68). + /// + public static Color Grey27 { get; } = new Color(238, 68, 68, 68); + + /// + /// Gets the color "Grey30" (RGB 78,78,78). + /// + public static Color Grey30 { get; } = new Color(239, 78, 78, 78); + + /// + /// Gets the color "Grey35" (RGB 88,88,88). + /// + public static Color Grey35 { get; } = new Color(240, 88, 88, 88); + + /// + /// Gets the color "Grey39" (RGB 98,98,98). + /// + public static Color Grey39 { get; } = new Color(241, 98, 98, 98); + + /// + /// Gets the color "Grey42" (RGB 108,108,108). + /// + public static Color Grey42 { get; } = new Color(242, 108, 108, 108); + + /// + /// Gets the color "Grey46" (RGB 118,118,118). + /// + public static Color Grey46 { get; } = new Color(243, 118, 118, 118); + + /// + /// Gets the color "Grey50" (RGB 128,128,128). + /// + public static Color Grey50 { get; } = new Color(244, 128, 128, 128); + + /// + /// Gets the color "Grey54" (RGB 138,138,138). + /// + public static Color Grey54 { get; } = new Color(245, 138, 138, 138); + + /// + /// Gets the color "Grey58" (RGB 148,148,148). + /// + public static Color Grey58 { get; } = new Color(246, 148, 148, 148); + + /// + /// Gets the color "Grey62" (RGB 158,158,158). + /// + public static Color Grey62 { get; } = new Color(247, 158, 158, 158); + + /// + /// Gets the color "Grey66" (RGB 168,168,168). + /// + public static Color Grey66 { get; } = new Color(248, 168, 168, 168); + + /// + /// Gets the color "Grey70" (RGB 178,178,178). + /// + public static Color Grey70 { get; } = new Color(249, 178, 178, 178); + + /// + /// Gets the color "Grey74" (RGB 188,188,188). + /// + public static Color Grey74 { get; } = new Color(250, 188, 188, 188); + + /// + /// Gets the color "Grey78" (RGB 198,198,198). + /// + public static Color Grey78 { get; } = new Color(251, 198, 198, 198); + + /// + /// Gets the color "Grey82" (RGB 208,208,208). + /// + public static Color Grey82 { get; } = new Color(252, 208, 208, 208); + + /// + /// Gets the color "Grey85" (RGB 218,218,218). + /// + public static Color Grey85 { get; } = new Color(253, 218, 218, 218); + + /// + /// Gets the color "Grey89" (RGB 228,228,228). + /// + public static Color Grey89 { get; } = new Color(254, 228, 228, 228); + + /// + /// Gets the color "Grey93" (RGB 238,238,238). + /// + public static Color Grey93 { get; } = new Color(255, 238, 238, 238); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Color.cs b/src/Spectre.Console.Rx/Spectre.Console/Color.cs new file mode 100644 index 0000000..ebb71ac --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Color.cs @@ -0,0 +1,242 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Represents a color. +/// +/// +/// Initializes a new instance of the struct. +/// +public partial struct Color(byte red, byte green, byte blue) : IEquatable +{ + static Color() => Default = new Color(0, 0, 0, 0, true); + + /// + /// Gets the default color. + /// + public static Color Default { get; } + + /// + /// Gets the red component. + /// + public byte R { get; } = red; + + /// + /// Gets the green component. + /// + public byte G { get; } = green; + + /// + /// Gets the blue component. + /// + public byte B { get; } = blue; + + /// + /// Gets the number of the color, if any. + /// + internal byte? Number { get; } + + /// + /// Gets a value indicating whether or not this is the default color. + /// + internal bool IsDefault { get; } + + /// + /// Converts a to a . + /// + /// The color number to convert. + public static implicit operator Color(int number) => FromInt32(number); + + /// + /// Converts a to a . + /// + /// The color to convert. + public static implicit operator Color(ConsoleColor color) => FromConsoleColor(color); + + /// + /// Converts a to a . + /// + /// The console color to convert. + public static implicit operator ConsoleColor(Color color) => ToConsoleColor(color); + + /// + /// Checks if two instances are equal. + /// + /// The first color instance to compare. + /// The second color instance to compare. + /// true if the two colors are equal, otherwise false. + public static bool operator ==(Color left, Color right) => left.Equals(right); + + /// + /// Checks if two instances are not equal. + /// + /// The first color instance to compare. + /// The second color instance to compare. + /// true if the two colors are not equal, otherwise false. + public static bool operator !=(Color left, Color right) => !(left == right); + + /// + /// Converts a to a . + /// + /// The color to convert. + /// A representing the . + public static ConsoleColor ToConsoleColor(Color color) + { + if (color.IsDefault) + { + return (ConsoleColor)(-1); + } + + if (color.Number == null || color.Number.Value >= 16) + { + color = ColorPalette.ExactOrClosest(ColorSystem.Standard, color); + } + + // Should not happen, but this will make things easier if we mess things up... + Debug.Assert( + color.Number >= 0 && color.Number < 16, + "Color does not fall inside the standard palette range."); + + return color.Number.Value switch + { + 0 => ConsoleColor.Black, + 1 => ConsoleColor.DarkRed, + 2 => ConsoleColor.DarkGreen, + 3 => ConsoleColor.DarkYellow, + 4 => ConsoleColor.DarkBlue, + 5 => ConsoleColor.DarkMagenta, + 6 => ConsoleColor.DarkCyan, + 7 => ConsoleColor.Gray, + 8 => ConsoleColor.DarkGray, + 9 => ConsoleColor.Red, + 10 => ConsoleColor.Green, + 11 => ConsoleColor.Yellow, + 12 => ConsoleColor.Blue, + 13 => ConsoleColor.Magenta, + 14 => ConsoleColor.Cyan, + 15 => ConsoleColor.White, + _ => throw new InvalidOperationException("Cannot convert color to console color."), + }; + } + + /// + /// Converts a color number into a . + /// + /// The color number. + /// The color representing the specified color number. + public static Color FromInt32(int number) => ColorTable.GetColor(number); + + /// + /// Converts a to a . + /// + /// The color to convert. + /// A representing the . + public static Color FromConsoleColor(ConsoleColor color) => color switch + { + ConsoleColor.Black => Black, + ConsoleColor.Blue => Blue, + ConsoleColor.Cyan => Aqua, + ConsoleColor.DarkBlue => Navy, + ConsoleColor.DarkCyan => Teal, + ConsoleColor.DarkGray => Grey, + ConsoleColor.DarkGreen => Green, + ConsoleColor.DarkMagenta => Purple, + ConsoleColor.DarkRed => Maroon, + ConsoleColor.DarkYellow => Olive, + ConsoleColor.Gray => Silver, + ConsoleColor.Green => Lime, + ConsoleColor.Magenta => Fuchsia, + ConsoleColor.Red => Red, + ConsoleColor.White => White, + ConsoleColor.Yellow => Yellow, + _ => Default, + }; + + /// + /// Blends two colors. + /// + /// The other color. + /// The blend factor. + /// The resulting color. + public readonly Color Blend(Color other, float factor) => + new( + (byte)(R + ((other.R - R) * factor)), + (byte)(G + ((other.G - G) * factor)), + (byte)(B + ((other.B - B) * factor))); + + /// + /// Gets the hexadecimal representation of the color. + /// + /// The hexadecimal representation of the color. + public readonly string ToHex() => string.Format( + CultureInfo.InvariantCulture, + "{0}{1}{2}", + R.ToString("X2", CultureInfo.InvariantCulture), + G.ToString("X2", CultureInfo.InvariantCulture), + B.ToString("X2", CultureInfo.InvariantCulture)); + + /// + public override int GetHashCode() + { + unchecked + { + var hash = (int)2166136261; + hash = (hash * 16777619) ^ R.GetHashCode(); + hash = (hash * 16777619) ^ G.GetHashCode(); + hash = (hash * 16777619) ^ B.GetHashCode(); + return hash; + } + } + + /// + public override bool Equals(object? obj) => obj is Color color && Equals(color); + + /// + public readonly bool Equals(Color other) => (IsDefault && other.IsDefault) || + (IsDefault == other.IsDefault && R == other.R && G == other.G && B == other.B); + + /// + /// Converts the color to a markup string. + /// + /// A representing the color as markup. + public readonly string ToMarkup() + { + if (IsDefault) + { + return "default"; + } + + if (Number != null) + { + var name = ColorTable.GetName(Number.Value); + if (!string.IsNullOrWhiteSpace(name)) + { + return name; + } + } + + return string.Format(CultureInfo.InvariantCulture, "#{0:X2}{1:X2}{2:X2}", R, G, B); + } + + /// + public override string ToString() + { + if (IsDefault) + { + return "default"; + } + + if (Number != null) + { + var name = ColorTable.GetName(Number.Value); + if (!string.IsNullOrWhiteSpace(name)) + { + return name; + } + } + + return string.Format(CultureInfo.InvariantCulture, "#{0:X2}{1:X2}{2:X2} (RGB={0},{1},{2})", R, G, B); + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/ColorSystem.cs b/src/Spectre.Console.Rx/Spectre.Console/ColorSystem.cs new file mode 100644 index 0000000..ffe9602 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/ColorSystem.cs @@ -0,0 +1,35 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Represents a color system. +/// +public enum ColorSystem +{ + /// + /// No colors. + /// + NoColors = 0, + + /// + /// Legacy, 3-bit mode. + /// + Legacy = 1, + + /// + /// Standard, 4-bit mode. + /// + Standard = 2, + + /// + /// 8-bit mode. + /// + EightBit = 3, + + /// + /// 24-bit mode. + /// + TrueColor = 4, +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/ColorSystemSupport.cs b/src/Spectre.Console.Rx/Spectre.Console/ColorSystemSupport.cs new file mode 100644 index 0000000..0a5d0a1 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/ColorSystemSupport.cs @@ -0,0 +1,40 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Determines what color system should be used. +/// +public enum ColorSystemSupport +{ + /// + /// Try to detect the color system. + /// + Detect = -1, + + /// + /// No colors. + /// + NoColors = 0, + + /// + /// Legacy, 3-bit mode. + /// + Legacy = 1, + + /// + /// Standard, 4-bit mode. + /// + Standard = 2, + + /// + /// 8-bit mode. + /// + EightBit = 3, + + /// + /// 24-bit mode. + /// + TrueColor = 4, +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/CursorDirection.cs b/src/Spectre.Console.Rx/Spectre.Console/CursorDirection.cs new file mode 100644 index 0000000..e9c1b9e --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/CursorDirection.cs @@ -0,0 +1,30 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Represents cursor direction. +/// +public enum CursorDirection +{ + /// + /// Moves cursor up. + /// + Up, + + /// + /// Moves cursor down. + /// + Down, + + /// + /// Moves cursor left. + /// + Left, + + /// + /// Moves cursor right. + /// + Right, +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Decoration.cs b/src/Spectre.Console.Rx/Spectre.Console/Decoration.cs new file mode 100644 index 0000000..9a81f82 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Decoration.cs @@ -0,0 +1,75 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Represents text decoration. +/// +/// +/// Support for text decorations is up to the terminal. +/// +[Flags] +public enum Decoration +{ + /// + /// No text decoration. + /// + None = 0, + + /// + /// Bold text. + /// Not supported in every environment. + /// + Bold = 1 << 0, + + /// + /// Dim or faint text. + /// Not supported in every environment. + /// + Dim = 1 << 1, + + /// + /// Italic text. + /// Not supported in every environment. + /// + Italic = 1 << 2, + + /// + /// Underlined text. + /// Not supported in every environment. + /// + Underline = 1 << 3, + + /// + /// Swaps the foreground and background colors. + /// Not supported in every environment. + /// + Invert = 1 << 4, + + /// + /// Hides the text. + /// Not supported in every environment. + /// + Conceal = 1 << 5, + + /// + /// Makes text blink. + /// Normally less than 150 blinks per minute. + /// Not supported in every environment. + /// + SlowBlink = 1 << 6, + + /// + /// Makes text blink. + /// Normally more than 150 blinks per minute. + /// Not supported in every environment. + /// + RapidBlink = 1 << 7, + + /// + /// Shows text with a horizontal line through the center. + /// Not supported in every environment. + /// + Strikethrough = 1 << 8, +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Emoji.Generated.cs b/src/Spectre.Console.Rx/Spectre.Console/Emoji.Generated.cs new file mode 100644 index 0000000..68cb0f3 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Emoji.Generated.cs @@ -0,0 +1,9298 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Collections.Generic; + +namespace Spectre.Console.Rx; + +/// +/// Utility for working with emojis. +/// +public static partial class Emoji +{ + private static readonly Dictionary _emojis + = new Dictionary(StringComparer.InvariantCultureIgnoreCase) + { + { "abacus", Emoji.Known.Abacus }, + { "ab_button_blood_type", Emoji.Known.AbButtonBloodType }, + { "a_button_blood_type", Emoji.Known.AButtonBloodType }, + { "accordion", Emoji.Known.Accordion }, + { "adhesive_bandage", Emoji.Known.AdhesiveBandage }, + { "admission_tickets", Emoji.Known.AdmissionTickets }, + { "aerial_tramway", Emoji.Known.AerialTramway }, + { "airplane", Emoji.Known.Airplane }, + { "airplane_arrival", Emoji.Known.AirplaneArrival }, + { "airplane_departure", Emoji.Known.AirplaneDeparture }, + { "alarm_clock", Emoji.Known.AlarmClock }, + { "alembic", Emoji.Known.Alembic }, + { "alien", Emoji.Known.Alien }, + { "alien_monster", Emoji.Known.AlienMonster }, + { "ambulance", Emoji.Known.Ambulance }, + { "american_football", Emoji.Known.AmericanFootball }, + { "amphora", Emoji.Known.Amphora }, + { "anatomical_heart", Emoji.Known.AnatomicalHeart }, + { "anchor", Emoji.Known.Anchor }, + { "anger_symbol", Emoji.Known.AngerSymbol }, + { "angry_face", Emoji.Known.AngryFace }, + { "angry_face_with_horns", Emoji.Known.AngryFaceWithHorns }, + { "anguished_face", Emoji.Known.AnguishedFace }, + { "ant", Emoji.Known.Ant }, + { "antenna_bars", Emoji.Known.AntennaBars }, + { "anxious_face_with_sweat", Emoji.Known.AnxiousFaceWithSweat }, + { "aquarius", Emoji.Known.Aquarius }, + { "aries", Emoji.Known.Aries }, + { "articulated_lorry", Emoji.Known.ArticulatedLorry }, + { "artist_palette", Emoji.Known.ArtistPalette }, + { "astonished_face", Emoji.Known.AstonishedFace }, + { "atm_sign", Emoji.Known.AtmSign }, + { "atom_symbol", Emoji.Known.AtomSymbol }, + { "automobile", Emoji.Known.Automobile }, + { "auto_rickshaw", Emoji.Known.AutoRickshaw }, + { "avocado", Emoji.Known.Avocado }, + { "axe", Emoji.Known.Axe }, + { "baby", Emoji.Known.Baby }, + { "baby_angel", Emoji.Known.BabyAngel }, + { "baby_bottle", Emoji.Known.BabyBottle }, + { "baby_chick", Emoji.Known.BabyChick }, + { "baby_symbol", Emoji.Known.BabySymbol }, + { "back_arrow", Emoji.Known.BackArrow }, + { "backhand_index_pointing_down", Emoji.Known.BackhandIndexPointingDown }, + { "backhand_index_pointing_left", Emoji.Known.BackhandIndexPointingLeft }, + { "backhand_index_pointing_right", Emoji.Known.BackhandIndexPointingRight }, + { "backhand_index_pointing_up", Emoji.Known.BackhandIndexPointingUp }, + { "backpack", Emoji.Known.Backpack }, + { "bacon", Emoji.Known.Bacon }, + { "badger", Emoji.Known.Badger }, + { "badminton", Emoji.Known.Badminton }, + { "bagel", Emoji.Known.Bagel }, + { "baggage_claim", Emoji.Known.BaggageClaim }, + { "baguette_bread", Emoji.Known.BaguetteBread }, + { "balance_scale", Emoji.Known.BalanceScale }, + { "bald", Emoji.Known.Bald }, + { "ballet_shoes", Emoji.Known.BalletShoes }, + { "balloon", Emoji.Known.Balloon }, + { "ballot_box_with_ballot", Emoji.Known.BallotBoxWithBallot }, + { "banana", Emoji.Known.Banana }, + { "banjo", Emoji.Known.Banjo }, + { "bank", Emoji.Known.Bank }, + { "barber_pole", Emoji.Known.BarberPole }, + { "bar_chart", Emoji.Known.BarChart }, + { "baseball", Emoji.Known.Baseball }, + { "basket", Emoji.Known.Basket }, + { "basketball", Emoji.Known.Basketball }, + { "bat", Emoji.Known.Bat }, + { "bathtub", Emoji.Known.Bathtub }, + { "battery", Emoji.Known.Battery }, + { "b_button_blood_type", Emoji.Known.BButtonBloodType }, + { "beach_with_umbrella", Emoji.Known.BeachWithUmbrella }, + { "beaming_face_with_smiling_eyes", Emoji.Known.BeamingFaceWithSmilingEyes }, + { "bear", Emoji.Known.Bear }, + { "beating_heart", Emoji.Known.BeatingHeart }, + { "beaver", Emoji.Known.Beaver }, + { "bed", Emoji.Known.Bed }, + { "beer_mug", Emoji.Known.BeerMug }, + { "beetle", Emoji.Known.Beetle }, + { "bell", Emoji.Known.Bell }, + { "bellhop_bell", Emoji.Known.BellhopBell }, + { "bell_pepper", Emoji.Known.BellPepper }, + { "bell_with_slash", Emoji.Known.BellWithSlash }, + { "bento_box", Emoji.Known.BentoBox }, + { "beverage_box", Emoji.Known.BeverageBox }, + { "bicycle", Emoji.Known.Bicycle }, + { "bikini", Emoji.Known.Bikini }, + { "billed_cap", Emoji.Known.BilledCap }, + { "biohazard", Emoji.Known.Biohazard }, + { "bird", Emoji.Known.Bird }, + { "birthday_cake", Emoji.Known.BirthdayCake }, + { "bison", Emoji.Known.Bison }, + { "black_circle", Emoji.Known.BlackCircle }, + { "black_flag", Emoji.Known.BlackFlag }, + { "black_heart", Emoji.Known.BlackHeart }, + { "black_large_square", Emoji.Known.BlackLargeSquare }, + { "black_medium_small_square", Emoji.Known.BlackMediumSmallSquare }, + { "black_medium_square", Emoji.Known.BlackMediumSquare }, + { "black_nib", Emoji.Known.BlackNib }, + { "black_small_square", Emoji.Known.BlackSmallSquare }, + { "black_square_button", Emoji.Known.BlackSquareButton }, + { "blossom", Emoji.Known.Blossom }, + { "blowfish", Emoji.Known.Blowfish }, + { "blueberries", Emoji.Known.Blueberries }, + { "blue_book", Emoji.Known.BlueBook }, + { "blue_circle", Emoji.Known.BlueCircle }, + { "blue_heart", Emoji.Known.BlueHeart }, + { "blue_square", Emoji.Known.BlueSquare }, + { "boar", Emoji.Known.Boar }, + { "bomb", Emoji.Known.Bomb }, + { "bone", Emoji.Known.Bone }, + { "bookmark", Emoji.Known.Bookmark }, + { "bookmark_tabs", Emoji.Known.BookmarkTabs }, + { "books", Emoji.Known.Books }, + { "boomerang", Emoji.Known.Boomerang }, + { "bottle_with_popping_cork", Emoji.Known.BottleWithPoppingCork }, + { "bouquet", Emoji.Known.Bouquet }, + { "bow_and_arrow", Emoji.Known.BowAndArrow }, + { "bowling", Emoji.Known.Bowling }, + { "bowl_with_spoon", Emoji.Known.BowlWithSpoon }, + { "boxing_glove", Emoji.Known.BoxingGlove }, + { "boy", Emoji.Known.Boy }, + { "brain", Emoji.Known.Brain }, + { "bread", Emoji.Known.Bread }, + { "breast_feeding", Emoji.Known.BreastFeeding }, + { "brick", Emoji.Known.Brick }, + { "bridge_at_night", Emoji.Known.BridgeAtNight }, + { "briefcase", Emoji.Known.Briefcase }, + { "briefs", Emoji.Known.Briefs }, + { "bright_button", Emoji.Known.BrightButton }, + { "broccoli", Emoji.Known.Broccoli }, + { "broken_heart", Emoji.Known.BrokenHeart }, + { "broom", Emoji.Known.Broom }, + { "brown_circle", Emoji.Known.BrownCircle }, + { "brown_heart", Emoji.Known.BrownHeart }, + { "brown_square", Emoji.Known.BrownSquare }, + { "bubble_tea", Emoji.Known.BubbleTea }, + { "bucket", Emoji.Known.Bucket }, + { "bug", Emoji.Known.Bug }, + { "building_construction", Emoji.Known.BuildingConstruction }, + { "bullet_train", Emoji.Known.BulletTrain }, + { "bullseye", Emoji.Known.Bullseye }, + { "burrito", Emoji.Known.Burrito }, + { "bus", Emoji.Known.Bus }, + { "bus_stop", Emoji.Known.BusStop }, + { "bust_in_silhouette", Emoji.Known.BustInSilhouette }, + { "busts_in_silhouette", Emoji.Known.BustsInSilhouette }, + { "butter", Emoji.Known.Butter }, + { "butterfly", Emoji.Known.Butterfly }, + { "cactus", Emoji.Known.Cactus }, + { "calendar", Emoji.Known.Calendar }, + { "call_me_hand", Emoji.Known.CallMeHand }, + { "camel", Emoji.Known.Camel }, + { "camera", Emoji.Known.Camera }, + { "camera_with_flash", Emoji.Known.CameraWithFlash }, + { "camping", Emoji.Known.Camping }, + { "cancer", Emoji.Known.Cancer }, + { "candle", Emoji.Known.Candle }, + { "candy", Emoji.Known.Candy }, + { "canned_food", Emoji.Known.CannedFood }, + { "canoe", Emoji.Known.Canoe }, + { "capricorn", Emoji.Known.Capricorn }, + { "card_file_box", Emoji.Known.CardFileBox }, + { "card_index", Emoji.Known.CardIndex }, + { "card_index_dividers", Emoji.Known.CardIndexDividers }, + { "carousel_horse", Emoji.Known.CarouselHorse }, + { "carpentry_saw", Emoji.Known.CarpentrySaw }, + { "carp_streamer", Emoji.Known.CarpStreamer }, + { "carrot", Emoji.Known.Carrot }, + { "castle", Emoji.Known.Castle }, + { "cat", Emoji.Known.Cat }, + { "cat_face", Emoji.Known.CatFace }, + { "cat_with_tears_of_joy", Emoji.Known.CatWithTearsOfJoy }, + { "cat_with_wry_smile", Emoji.Known.CatWithWrySmile }, + { "chains", Emoji.Known.Chains }, + { "chair", Emoji.Known.Chair }, + { "chart_decreasing", Emoji.Known.ChartDecreasing }, + { "chart_increasing", Emoji.Known.ChartIncreasing }, + { "chart_increasing_with_yen", Emoji.Known.ChartIncreasingWithYen }, + { "check_box_with_check", Emoji.Known.CheckBoxWithCheck }, + { "check_mark", Emoji.Known.CheckMark }, + { "check_mark_button", Emoji.Known.CheckMarkButton }, + { "cheese_wedge", Emoji.Known.CheeseWedge }, + { "chequered_flag", Emoji.Known.ChequeredFlag }, + { "cherries", Emoji.Known.Cherries }, + { "cherry_blossom", Emoji.Known.CherryBlossom }, + { "chess_pawn", Emoji.Known.ChessPawn }, + { "chestnut", Emoji.Known.Chestnut }, + { "chicken", Emoji.Known.Chicken }, + { "child", Emoji.Known.Child }, + { "children_crossing", Emoji.Known.ChildrenCrossing }, + { "chipmunk", Emoji.Known.Chipmunk }, + { "chocolate_bar", Emoji.Known.ChocolateBar }, + { "chopsticks", Emoji.Known.Chopsticks }, + { "christmas_tree", Emoji.Known.ChristmasTree }, + { "church", Emoji.Known.Church }, + { "cigarette", Emoji.Known.Cigarette }, + { "cinema", Emoji.Known.Cinema }, + { "circled_m", Emoji.Known.CircledM }, + { "circus_tent", Emoji.Known.CircusTent }, + { "cityscape", Emoji.Known.Cityscape }, + { "cityscape_at_dusk", Emoji.Known.CityscapeAtDusk }, + { "clamp", Emoji.Known.Clamp }, + { "clapper_board", Emoji.Known.ClapperBoard }, + { "clapping_hands", Emoji.Known.ClappingHands }, + { "classical_building", Emoji.Known.ClassicalBuilding }, + { "cl_button", Emoji.Known.ClButton }, + { "clinking_beer_mugs", Emoji.Known.ClinkingBeerMugs }, + { "clinking_glasses", Emoji.Known.ClinkingGlasses }, + { "clipboard", Emoji.Known.Clipboard }, + { "clockwise_vertical_arrows", Emoji.Known.ClockwiseVerticalArrows }, + { "closed_book", Emoji.Known.ClosedBook }, + { "closed_mailbox_with_lowered_flag", Emoji.Known.ClosedMailboxWithLoweredFlag }, + { "closed_mailbox_with_raised_flag", Emoji.Known.ClosedMailboxWithRaisedFlag }, + { "closed_umbrella", Emoji.Known.ClosedUmbrella }, + { "cloud", Emoji.Known.Cloud }, + { "cloud_with_lightning", Emoji.Known.CloudWithLightning }, + { "cloud_with_lightning_and_rain", Emoji.Known.CloudWithLightningAndRain }, + { "cloud_with_rain", Emoji.Known.CloudWithRain }, + { "cloud_with_snow", Emoji.Known.CloudWithSnow }, + { "clown_face", Emoji.Known.ClownFace }, + { "club_suit", Emoji.Known.ClubSuit }, + { "clutch_bag", Emoji.Known.ClutchBag }, + { "coat", Emoji.Known.Coat }, + { "cockroach", Emoji.Known.Cockroach }, + { "cocktail_glass", Emoji.Known.CocktailGlass }, + { "coconut", Emoji.Known.Coconut }, + { "coffin", Emoji.Known.Coffin }, + { "coin", Emoji.Known.Coin }, + { "cold_face", Emoji.Known.ColdFace }, + { "collision", Emoji.Known.Collision }, + { "comet", Emoji.Known.Comet }, + { "compass", Emoji.Known.Compass }, + { "computer_disk", Emoji.Known.ComputerDisk }, + { "computer_mouse", Emoji.Known.ComputerMouse }, + { "confetti_ball", Emoji.Known.ConfettiBall }, + { "confounded_face", Emoji.Known.ConfoundedFace }, + { "confused_face", Emoji.Known.ConfusedFace }, + { "construction", Emoji.Known.Construction }, + { "construction_worker", Emoji.Known.ConstructionWorker }, + { "control_knobs", Emoji.Known.ControlKnobs }, + { "convenience_store", Emoji.Known.ConvenienceStore }, + { "cooked_rice", Emoji.Known.CookedRice }, + { "cookie", Emoji.Known.Cookie }, + { "cooking", Emoji.Known.Cooking }, + { "cool_button", Emoji.Known.CoolButton }, + { "copyright", Emoji.Known.Copyright }, + { "couch_and_lamp", Emoji.Known.CouchAndLamp }, + { "counterclockwise_arrows_button", Emoji.Known.CounterclockwiseArrowsButton }, + { "couple_with_heart", Emoji.Known.CoupleWithHeart }, + { "cow", Emoji.Known.Cow }, + { "cowboy_hat_face", Emoji.Known.CowboyHatFace }, + { "cow_face", Emoji.Known.CowFace }, + { "crab", Emoji.Known.Crab }, + { "crayon", Emoji.Known.Crayon }, + { "credit_card", Emoji.Known.CreditCard }, + { "crescent_moon", Emoji.Known.CrescentMoon }, + { "cricket", Emoji.Known.Cricket }, + { "cricket_game", Emoji.Known.CricketGame }, + { "crocodile", Emoji.Known.Crocodile }, + { "croissant", Emoji.Known.Croissant }, + { "crossed_fingers", Emoji.Known.CrossedFingers }, + { "crossed_flags", Emoji.Known.CrossedFlags }, + { "crossed_swords", Emoji.Known.CrossedSwords }, + { "cross_mark", Emoji.Known.CrossMark }, + { "cross_mark_button", Emoji.Known.CrossMarkButton }, + { "crown", Emoji.Known.Crown }, + { "crying_cat", Emoji.Known.CryingCat }, + { "crying_face", Emoji.Known.CryingFace }, + { "crystal_ball", Emoji.Known.CrystalBall }, + { "cucumber", Emoji.Known.Cucumber }, + { "cupcake", Emoji.Known.Cupcake }, + { "cup_with_straw", Emoji.Known.CupWithStraw }, + { "curling_stone", Emoji.Known.CurlingStone }, + { "curly_hair", Emoji.Known.CurlyHair }, + { "curly_loop", Emoji.Known.CurlyLoop }, + { "currency_exchange", Emoji.Known.CurrencyExchange }, + { "curry_rice", Emoji.Known.CurryRice }, + { "custard", Emoji.Known.Custard }, + { "customs", Emoji.Known.Customs }, + { "cut_of_meat", Emoji.Known.CutOfMeat }, + { "cyclone", Emoji.Known.Cyclone }, + { "dagger", Emoji.Known.Dagger }, + { "dango", Emoji.Known.Dango }, + { "dashing_away", Emoji.Known.DashingAway }, + { "deaf_person", Emoji.Known.DeafPerson }, + { "deciduous_tree", Emoji.Known.DeciduousTree }, + { "deer", Emoji.Known.Deer }, + { "delivery_truck", Emoji.Known.DeliveryTruck }, + { "department_store", Emoji.Known.DepartmentStore }, + { "derelict_house", Emoji.Known.DerelictHouse }, + { "desert", Emoji.Known.Desert }, + { "desert_island", Emoji.Known.DesertIsland }, + { "desktop_computer", Emoji.Known.DesktopComputer }, + { "detective", Emoji.Known.Detective }, + { "diamond_suit", Emoji.Known.DiamondSuit }, + { "diamond_with_a_dot", Emoji.Known.DiamondWithADot }, + { "dim_button", Emoji.Known.DimButton }, + { "disappointed_face", Emoji.Known.DisappointedFace }, + { "disguised_face", Emoji.Known.DisguisedFace }, + { "divide", Emoji.Known.Divide }, + { "diving_mask", Emoji.Known.DivingMask }, + { "diya_lamp", Emoji.Known.DiyaLamp }, + { "dizzy", Emoji.Known.Dizzy }, + { "dna", Emoji.Known.Dna }, + { "dodo", Emoji.Known.Dodo }, + { "dog", Emoji.Known.Dog }, + { "dog_face", Emoji.Known.DogFace }, + { "dollar_banknote", Emoji.Known.DollarBanknote }, + { "dolphin", Emoji.Known.Dolphin }, + { "door", Emoji.Known.Door }, + { "dotted_six_pointed_star", Emoji.Known.DottedSixPointedStar }, + { "double_curly_loop", Emoji.Known.DoubleCurlyLoop }, + { "double_exclamation_mark", Emoji.Known.DoubleExclamationMark }, + { "doughnut", Emoji.Known.Doughnut }, + { "dove", Emoji.Known.Dove }, + { "down_arrow", Emoji.Known.DownArrow }, + { "downcast_face_with_sweat", Emoji.Known.DowncastFaceWithSweat }, + { "down_left_arrow", Emoji.Known.DownLeftArrow }, + { "down_right_arrow", Emoji.Known.DownRightArrow }, + { "downwards_button", Emoji.Known.DownwardsButton }, + { "dragon", Emoji.Known.Dragon }, + { "dragon_face", Emoji.Known.DragonFace }, + { "dress", Emoji.Known.Dress }, + { "drooling_face", Emoji.Known.DroolingFace }, + { "droplet", Emoji.Known.Droplet }, + { "drop_of_blood", Emoji.Known.DropOfBlood }, + { "drum", Emoji.Known.Drum }, + { "duck", Emoji.Known.Duck }, + { "dumpling", Emoji.Known.Dumpling }, + { "dvd", Emoji.Known.Dvd }, + { "eagle", Emoji.Known.Eagle }, + { "ear", Emoji.Known.Ear }, + { "ear_of_corn", Emoji.Known.EarOfCorn }, + { "ear_with_hearing_aid", Emoji.Known.EarWithHearingAid }, + { "egg", Emoji.Known.Egg }, + { "eggplant", Emoji.Known.Eggplant }, + { "eight_o_clock", Emoji.Known.EightOClock }, + { "eight_pointed_star", Emoji.Known.EightPointedStar }, + { "eight_spoked_asterisk", Emoji.Known.EightSpokedAsterisk }, + { "eight_thirty", Emoji.Known.EightThirty }, + { "eject_button", Emoji.Known.EjectButton }, + { "electric_plug", Emoji.Known.ElectricPlug }, + { "elephant", Emoji.Known.Elephant }, + { "elevator", Emoji.Known.Elevator }, + { "eleven_o_clock", Emoji.Known.ElevenOClock }, + { "eleven_thirty", Emoji.Known.ElevenThirty }, + { "elf", Emoji.Known.Elf }, + { "e_mail", Emoji.Known.EMail }, + { "end_arrow", Emoji.Known.EndArrow }, + { "envelope", Emoji.Known.Envelope }, + { "envelope_with_arrow", Emoji.Known.EnvelopeWithArrow }, + { "euro_banknote", Emoji.Known.EuroBanknote }, + { "evergreen_tree", Emoji.Known.EvergreenTree }, + { "ewe", Emoji.Known.Ewe }, + { "exclamation_question_mark", Emoji.Known.ExclamationQuestionMark }, + { "exploding_head", Emoji.Known.ExplodingHead }, + { "expressionless_face", Emoji.Known.ExpressionlessFace }, + { "eye", Emoji.Known.Eye }, + { "eyes", Emoji.Known.Eyes }, + { "face_blowing_a_kiss", Emoji.Known.FaceBlowingAKiss }, + { "face_savoring_food", Emoji.Known.FaceSavoringFood }, + { "face_screaming_in_fear", Emoji.Known.FaceScreamingInFear }, + { "face_vomiting", Emoji.Known.FaceVomiting }, + { "face_with_hand_over_mouth", Emoji.Known.FaceWithHandOverMouth }, + { "face_with_head_bandage", Emoji.Known.FaceWithHeadBandage }, + { "face_with_medical_mask", Emoji.Known.FaceWithMedicalMask }, + { "face_with_monocle", Emoji.Known.FaceWithMonocle }, + { "face_with_open_mouth", Emoji.Known.FaceWithOpenMouth }, + { "face_without_mouth", Emoji.Known.FaceWithoutMouth }, + { "face_with_raised_eyebrow", Emoji.Known.FaceWithRaisedEyebrow }, + { "face_with_rolling_eyes", Emoji.Known.FaceWithRollingEyes }, + { "face_with_steam_from_nose", Emoji.Known.FaceWithSteamFromNose }, + { "face_with_symbols_on_mouth", Emoji.Known.FaceWithSymbolsOnMouth }, + { "face_with_tears_of_joy", Emoji.Known.FaceWithTearsOfJoy }, + { "face_with_thermometer", Emoji.Known.FaceWithThermometer }, + { "face_with_tongue", Emoji.Known.FaceWithTongue }, + { "factory", Emoji.Known.Factory }, + { "fairy", Emoji.Known.Fairy }, + { "falafel", Emoji.Known.Falafel }, + { "fallen_leaf", Emoji.Known.FallenLeaf }, + { "family", Emoji.Known.Family }, + { "fast_down_button", Emoji.Known.FastDownButton }, + { "fast_forward_button", Emoji.Known.FastForwardButton }, + { "fast_reverse_button", Emoji.Known.FastReverseButton }, + { "fast_up_button", Emoji.Known.FastUpButton }, + { "fax_machine", Emoji.Known.FaxMachine }, + { "fearful_face", Emoji.Known.FearfulFace }, + { "feather", Emoji.Known.Feather }, + { "female_sign", Emoji.Known.FemaleSign }, + { "ferris_wheel", Emoji.Known.FerrisWheel }, + { "ferry", Emoji.Known.Ferry }, + { "field_hockey", Emoji.Known.FieldHockey }, + { "file_cabinet", Emoji.Known.FileCabinet }, + { "file_folder", Emoji.Known.FileFolder }, + { "film_frames", Emoji.Known.FilmFrames }, + { "film_projector", Emoji.Known.FilmProjector }, + { "fire", Emoji.Known.Fire }, + { "firecracker", Emoji.Known.Firecracker }, + { "fire_engine", Emoji.Known.FireEngine }, + { "fire_extinguisher", Emoji.Known.FireExtinguisher }, + { "fireworks", Emoji.Known.Fireworks }, + { "1st_place_medal", Emoji.Known.FirstPlaceMedal }, + { "first_quarter_moon", Emoji.Known.FirstQuarterMoon }, + { "first_quarter_moon_face", Emoji.Known.FirstQuarterMoonFace }, + { "fish", Emoji.Known.Fish }, + { "fish_cake_with_swirl", Emoji.Known.FishCakeWithSwirl }, + { "fishing_pole", Emoji.Known.FishingPole }, + { "five_o_clock", Emoji.Known.FiveOClock }, + { "five_thirty", Emoji.Known.FiveThirty }, + { "flag_in_hole", Emoji.Known.FlagInHole }, + { "flamingo", Emoji.Known.Flamingo }, + { "flashlight", Emoji.Known.Flashlight }, + { "flatbread", Emoji.Known.Flatbread }, + { "flat_shoe", Emoji.Known.FlatShoe }, + { "fleur_de_lis", Emoji.Known.FleurDeLis }, + { "flexed_biceps", Emoji.Known.FlexedBiceps }, + { "floppy_disk", Emoji.Known.FloppyDisk }, + { "flower_playing_cards", Emoji.Known.FlowerPlayingCards }, + { "flushed_face", Emoji.Known.FlushedFace }, + { "fly", Emoji.Known.Fly }, + { "flying_disc", Emoji.Known.FlyingDisc }, + { "flying_saucer", Emoji.Known.FlyingSaucer }, + { "fog", Emoji.Known.Fog }, + { "foggy", Emoji.Known.Foggy }, + { "folded_hands", Emoji.Known.FoldedHands }, + { "fondue", Emoji.Known.Fondue }, + { "foot", Emoji.Known.Foot }, + { "footprints", Emoji.Known.Footprints }, + { "fork_and_knife", Emoji.Known.ForkAndKnife }, + { "fork_and_knife_with_plate", Emoji.Known.ForkAndKnifeWithPlate }, + { "fortune_cookie", Emoji.Known.FortuneCookie }, + { "fountain", Emoji.Known.Fountain }, + { "fountain_pen", Emoji.Known.FountainPen }, + { "four_leaf_clover", Emoji.Known.FourLeafClover }, + { "four_o_clock", Emoji.Known.FourOClock }, + { "four_thirty", Emoji.Known.FourThirty }, + { "fox", Emoji.Known.Fox }, + { "framed_picture", Emoji.Known.FramedPicture }, + { "free_button", Emoji.Known.FreeButton }, + { "french_fries", Emoji.Known.FrenchFries }, + { "fried_shrimp", Emoji.Known.FriedShrimp }, + { "frog", Emoji.Known.Frog }, + { "front_facing_baby_chick", Emoji.Known.FrontFacingBabyChick }, + { "frowning_face", Emoji.Known.FrowningFace }, + { "frowning_face_with_open_mouth", Emoji.Known.FrowningFaceWithOpenMouth }, + { "fuel_pump", Emoji.Known.FuelPump }, + { "full_moon", Emoji.Known.FullMoon }, + { "full_moon_face", Emoji.Known.FullMoonFace }, + { "funeral_urn", Emoji.Known.FuneralUrn }, + { "game_die", Emoji.Known.GameDie }, + { "garlic", Emoji.Known.Garlic }, + { "gear", Emoji.Known.Gear }, + { "gemini", Emoji.Known.Gemini }, + { "gem_stone", Emoji.Known.GemStone }, + { "genie", Emoji.Known.Genie }, + { "ghost", Emoji.Known.Ghost }, + { "giraffe", Emoji.Known.Giraffe }, + { "girl", Emoji.Known.Girl }, + { "glasses", Emoji.Known.Glasses }, + { "glass_of_milk", Emoji.Known.GlassOfMilk }, + { "globe_showing_americas", Emoji.Known.GlobeShowingAmericas }, + { "globe_showing_asia_australia", Emoji.Known.GlobeShowingAsiaAustralia }, + { "globe_showing_europe_africa", Emoji.Known.GlobeShowingEuropeAfrica }, + { "globe_with_meridians", Emoji.Known.GlobeWithMeridians }, + { "gloves", Emoji.Known.Gloves }, + { "glowing_star", Emoji.Known.GlowingStar }, + { "goal_net", Emoji.Known.GoalNet }, + { "goat", Emoji.Known.Goat }, + { "goblin", Emoji.Known.Goblin }, + { "goggles", Emoji.Known.Goggles }, + { "gorilla", Emoji.Known.Gorilla }, + { "graduation_cap", Emoji.Known.GraduationCap }, + { "grapes", Emoji.Known.Grapes }, + { "green_apple", Emoji.Known.GreenApple }, + { "green_book", Emoji.Known.GreenBook }, + { "green_circle", Emoji.Known.GreenCircle }, + { "green_heart", Emoji.Known.GreenHeart }, + { "green_salad", Emoji.Known.GreenSalad }, + { "green_square", Emoji.Known.GreenSquare }, + { "grimacing_face", Emoji.Known.GrimacingFace }, + { "grinning_cat", Emoji.Known.GrinningCat }, + { "grinning_cat_with_smiling_eyes", Emoji.Known.GrinningCatWithSmilingEyes }, + { "grinning_face", Emoji.Known.GrinningFace }, + { "grinning_face_with_big_eyes", Emoji.Known.GrinningFaceWithBigEyes }, + { "grinning_face_with_smiling_eyes", Emoji.Known.GrinningFaceWithSmilingEyes }, + { "grinning_face_with_sweat", Emoji.Known.GrinningFaceWithSweat }, + { "grinning_squinting_face", Emoji.Known.GrinningSquintingFace }, + { "growing_heart", Emoji.Known.GrowingHeart }, + { "guard", Emoji.Known.Guard }, + { "guide_dog", Emoji.Known.GuideDog }, + { "guitar", Emoji.Known.Guitar }, + { "hamburger", Emoji.Known.Hamburger }, + { "hammer", Emoji.Known.Hammer }, + { "hammer_and_pick", Emoji.Known.HammerAndPick }, + { "hammer_and_wrench", Emoji.Known.HammerAndWrench }, + { "hamster", Emoji.Known.Hamster }, + { "handbag", Emoji.Known.Handbag }, + { "handshake", Emoji.Known.Handshake }, + { "hand_with_fingers_splayed", Emoji.Known.HandWithFingersSplayed }, + { "hatching_chick", Emoji.Known.HatchingChick }, + { "headphone", Emoji.Known.Headphone }, + { "headstone", Emoji.Known.Headstone }, + { "hear_no_evil_monkey", Emoji.Known.HearNoEvilMonkey }, + { "heart_decoration", Emoji.Known.HeartDecoration }, + { "heart_exclamation", Emoji.Known.HeartExclamation }, + { "heart_suit", Emoji.Known.HeartSuit }, + { "heart_with_arrow", Emoji.Known.HeartWithArrow }, + { "heart_with_ribbon", Emoji.Known.HeartWithRibbon }, + { "heavy_dollar_sign", Emoji.Known.HeavyDollarSign }, + { "hedgehog", Emoji.Known.Hedgehog }, + { "helicopter", Emoji.Known.Helicopter }, + { "herb", Emoji.Known.Herb }, + { "hibiscus", Emoji.Known.Hibiscus }, + { "high_heeled_shoe", Emoji.Known.HighHeeledShoe }, + { "high_speed_train", Emoji.Known.HighSpeedTrain }, + { "high_voltage", Emoji.Known.HighVoltage }, + { "hiking_boot", Emoji.Known.HikingBoot }, + { "hindu_temple", Emoji.Known.HinduTemple }, + { "hippopotamus", Emoji.Known.Hippopotamus }, + { "hole", Emoji.Known.Hole }, + { "hollow_red_circle", Emoji.Known.HollowRedCircle }, + { "honeybee", Emoji.Known.Honeybee }, + { "honey_pot", Emoji.Known.HoneyPot }, + { "hook", Emoji.Known.Hook }, + { "horizontal_traffic_light", Emoji.Known.HorizontalTrafficLight }, + { "horse", Emoji.Known.Horse }, + { "horse_face", Emoji.Known.HorseFace }, + { "horse_racing", Emoji.Known.HorseRacing }, + { "hospital", Emoji.Known.Hospital }, + { "hot_beverage", Emoji.Known.HotBeverage }, + { "hot_dog", Emoji.Known.HotDog }, + { "hotel", Emoji.Known.Hotel }, + { "hot_face", Emoji.Known.HotFace }, + { "hot_pepper", Emoji.Known.HotPepper }, + { "hot_springs", Emoji.Known.HotSprings }, + { "hourglass_done", Emoji.Known.HourglassDone }, + { "hourglass_not_done", Emoji.Known.HourglassNotDone }, + { "house", Emoji.Known.House }, + { "houses", Emoji.Known.Houses }, + { "house_with_garden", Emoji.Known.HouseWithGarden }, + { "hugging_face", Emoji.Known.HuggingFace }, + { "hundred_points", Emoji.Known.HundredPoints }, + { "hushed_face", Emoji.Known.HushedFace }, + { "hut", Emoji.Known.Hut }, + { "ice", Emoji.Known.Ice }, + { "ice_cream", Emoji.Known.IceCream }, + { "ice_hockey", Emoji.Known.IceHockey }, + { "ice_skate", Emoji.Known.IceSkate }, + { "id_button", Emoji.Known.IdButton }, + { "inbox_tray", Emoji.Known.InboxTray }, + { "incoming_envelope", Emoji.Known.IncomingEnvelope }, + { "index_pointing_up", Emoji.Known.IndexPointingUp }, + { "infinity", Emoji.Known.Infinity }, + { "information", Emoji.Known.Information }, + { "input_latin_letters", Emoji.Known.InputLatinLetters }, + { "input_latin_lowercase", Emoji.Known.InputLatinLowercase }, + { "input_latin_uppercase", Emoji.Known.InputLatinUppercase }, + { "input_numbers", Emoji.Known.InputNumbers }, + { "input_symbols", Emoji.Known.InputSymbols }, + { "jack_o_lantern", Emoji.Known.JackOLantern }, + { "japanese_acceptable_button", Emoji.Known.JapaneseAcceptableButton }, + { "japanese_application_button", Emoji.Known.JapaneseApplicationButton }, + { "japanese_bargain_button", Emoji.Known.JapaneseBargainButton }, + { "japanese_castle", Emoji.Known.JapaneseCastle }, + { "japanese_congratulations_button", Emoji.Known.JapaneseCongratulationsButton }, + { "japanese_discount_button", Emoji.Known.JapaneseDiscountButton }, + { "japanese_dolls", Emoji.Known.JapaneseDolls }, + { "japanese_free_of_charge_button", Emoji.Known.JapaneseFreeOfChargeButton }, + { "japanese_here_button", Emoji.Known.JapaneseHereButton }, + { "japanese_monthly_amount_button", Emoji.Known.JapaneseMonthlyAmountButton }, + { "japanese_not_free_of_charge_button", Emoji.Known.JapaneseNotFreeOfChargeButton }, + { "japanese_no_vacancy_button", Emoji.Known.JapaneseNoVacancyButton }, + { "japanese_open_for_business_button", Emoji.Known.JapaneseOpenForBusinessButton }, + { "japanese_passing_grade_button", Emoji.Known.JapanesePassingGradeButton }, + { "japanese_post_office", Emoji.Known.JapanesePostOffice }, + { "japanese_prohibited_button", Emoji.Known.JapaneseProhibitedButton }, + { "japanese_reserved_button", Emoji.Known.JapaneseReservedButton }, + { "japanese_secret_button", Emoji.Known.JapaneseSecretButton }, + { "japanese_service_charge_button", Emoji.Known.JapaneseServiceChargeButton }, + { "japanese_symbol_for_beginner", Emoji.Known.JapaneseSymbolForBeginner }, + { "japanese_vacancy_button", Emoji.Known.JapaneseVacancyButton }, + { "jeans", Emoji.Known.Jeans }, + { "joker", Emoji.Known.Joker }, + { "joystick", Emoji.Known.Joystick }, + { "kaaba", Emoji.Known.Kaaba }, + { "kangaroo", Emoji.Known.Kangaroo }, + { "key", Emoji.Known.Key }, + { "keyboard", Emoji.Known.Keyboard }, + { "keycap_10", Emoji.Known.Keycap10 }, + { "kick_scooter", Emoji.Known.KickScooter }, + { "kimono", Emoji.Known.Kimono }, + { "kiss", Emoji.Known.Kiss }, + { "kissing_cat", Emoji.Known.KissingCat }, + { "kissing_face", Emoji.Known.KissingFace }, + { "kissing_face_with_closed_eyes", Emoji.Known.KissingFaceWithClosedEyes }, + { "kissing_face_with_smiling_eyes", Emoji.Known.KissingFaceWithSmilingEyes }, + { "kiss_mark", Emoji.Known.KissMark }, + { "kitchen_knife", Emoji.Known.KitchenKnife }, + { "kite", Emoji.Known.Kite }, + { "kiwi_fruit", Emoji.Known.KiwiFruit }, + { "knocked_out_face", Emoji.Known.KnockedOutFace }, + { "knot", Emoji.Known.Knot }, + { "koala", Emoji.Known.Koala }, + { "lab_coat", Emoji.Known.LabCoat }, + { "label", Emoji.Known.Label }, + { "lacrosse", Emoji.Known.Lacrosse }, + { "ladder", Emoji.Known.Ladder }, + { "lady_beetle", Emoji.Known.LadyBeetle }, + { "laptop", Emoji.Known.Laptop }, + { "large_blue_diamond", Emoji.Known.LargeBlueDiamond }, + { "large_orange_diamond", Emoji.Known.LargeOrangeDiamond }, + { "last_quarter_moon", Emoji.Known.LastQuarterMoon }, + { "last_quarter_moon_face", Emoji.Known.LastQuarterMoonFace }, + { "last_track_button", Emoji.Known.LastTrackButton }, + { "latin_cross", Emoji.Known.LatinCross }, + { "leaf_fluttering_in_wind", Emoji.Known.LeafFlutteringInWind }, + { "leafy_green", Emoji.Known.LeafyGreen }, + { "ledger", Emoji.Known.Ledger }, + { "left_arrow", Emoji.Known.LeftArrow }, + { "left_arrow_curving_right", Emoji.Known.LeftArrowCurvingRight }, + { "left_facing_fist", Emoji.Known.LeftFacingFist }, + { "left_luggage", Emoji.Known.LeftLuggage }, + { "left_right_arrow", Emoji.Known.LeftRightArrow }, + { "left_speech_bubble", Emoji.Known.LeftSpeechBubble }, + { "leg", Emoji.Known.Leg }, + { "lemon", Emoji.Known.Lemon }, + { "leo", Emoji.Known.Leo }, + { "leopard", Emoji.Known.Leopard }, + { "level_slider", Emoji.Known.LevelSlider }, + { "libra", Emoji.Known.Libra }, + { "light_bulb", Emoji.Known.LightBulb }, + { "light_rail", Emoji.Known.LightRail }, + { "link", Emoji.Known.Link }, + { "linked_paperclips", Emoji.Known.LinkedPaperclips }, + { "lion", Emoji.Known.Lion }, + { "lipstick", Emoji.Known.Lipstick }, + { "litter_in_bin_sign", Emoji.Known.LitterInBinSign }, + { "lizard", Emoji.Known.Lizard }, + { "llama", Emoji.Known.Llama }, + { "lobster", Emoji.Known.Lobster }, + { "locked", Emoji.Known.Locked }, + { "locked_with_key", Emoji.Known.LockedWithKey }, + { "locked_with_pen", Emoji.Known.LockedWithPen }, + { "locomotive", Emoji.Known.Locomotive }, + { "lollipop", Emoji.Known.Lollipop }, + { "long_drum", Emoji.Known.LongDrum }, + { "lotion_bottle", Emoji.Known.LotionBottle }, + { "loudly_crying_face", Emoji.Known.LoudlyCryingFace }, + { "loudspeaker", Emoji.Known.Loudspeaker }, + { "love_hotel", Emoji.Known.LoveHotel }, + { "love_letter", Emoji.Known.LoveLetter }, + { "love_you_gesture", Emoji.Known.LoveYouGesture }, + { "luggage", Emoji.Known.Luggage }, + { "lungs", Emoji.Known.Lungs }, + { "lying_face", Emoji.Known.LyingFace }, + { "mage", Emoji.Known.Mage }, + { "magic_wand", Emoji.Known.MagicWand }, + { "magnet", Emoji.Known.Magnet }, + { "magnifying_glass_tilted_left", Emoji.Known.MagnifyingGlassTiltedLeft }, + { "magnifying_glass_tilted_right", Emoji.Known.MagnifyingGlassTiltedRight }, + { "mahjong_red_dragon", Emoji.Known.MahjongRedDragon }, + { "male_sign", Emoji.Known.MaleSign }, + { "mammoth", Emoji.Known.Mammoth }, + { "man", Emoji.Known.Man }, + { "man_dancing", Emoji.Known.ManDancing }, + { "mango", Emoji.Known.Mango }, + { "mans_shoe", Emoji.Known.MansShoe }, + { "mantelpiece_clock", Emoji.Known.MantelpieceClock }, + { "manual_wheelchair", Emoji.Known.ManualWheelchair }, + { "maple_leaf", Emoji.Known.MapleLeaf }, + { "map_of_japan", Emoji.Known.MapOfJapan }, + { "martial_arts_uniform", Emoji.Known.MartialArtsUniform }, + { "mate", Emoji.Known.Mate }, + { "meat_on_bone", Emoji.Known.MeatOnBone }, + { "mechanical_arm", Emoji.Known.MechanicalArm }, + { "mechanical_leg", Emoji.Known.MechanicalLeg }, + { "medical_symbol", Emoji.Known.MedicalSymbol }, + { "megaphone", Emoji.Known.Megaphone }, + { "melon", Emoji.Known.Melon }, + { "memo", Emoji.Known.Memo }, + { "men_holding_hands", Emoji.Known.MenHoldingHands }, + { "menorah", Emoji.Known.Menorah }, + { "mens_room", Emoji.Known.MensRoom }, + { "merperson", Emoji.Known.Merperson }, + { "metro", Emoji.Known.Metro }, + { "microbe", Emoji.Known.Microbe }, + { "microphone", Emoji.Known.Microphone }, + { "microscope", Emoji.Known.Microscope }, + { "middle_finger", Emoji.Known.MiddleFinger }, + { "military_helmet", Emoji.Known.MilitaryHelmet }, + { "military_medal", Emoji.Known.MilitaryMedal }, + { "milky_way", Emoji.Known.MilkyWay }, + { "minibus", Emoji.Known.Minibus }, + { "minus", Emoji.Known.Minus }, + { "mirror", Emoji.Known.Mirror }, + { "moai", Emoji.Known.Moai }, + { "mobile_phone", Emoji.Known.MobilePhone }, + { "mobile_phone_off", Emoji.Known.MobilePhoneOff }, + { "mobile_phone_with_arrow", Emoji.Known.MobilePhoneWithArrow }, + { "money_bag", Emoji.Known.MoneyBag }, + { "money_mouth_face", Emoji.Known.MoneyMouthFace }, + { "money_with_wings", Emoji.Known.MoneyWithWings }, + { "monkey", Emoji.Known.Monkey }, + { "monkey_face", Emoji.Known.MonkeyFace }, + { "monorail", Emoji.Known.Monorail }, + { "moon_cake", Emoji.Known.MoonCake }, + { "moon_viewing_ceremony", Emoji.Known.MoonViewingCeremony }, + { "mosque", Emoji.Known.Mosque }, + { "mosquito", Emoji.Known.Mosquito }, + { "motor_boat", Emoji.Known.MotorBoat }, + { "motorcycle", Emoji.Known.Motorcycle }, + { "motorized_wheelchair", Emoji.Known.MotorizedWheelchair }, + { "motor_scooter", Emoji.Known.MotorScooter }, + { "motorway", Emoji.Known.Motorway }, + { "mountain", Emoji.Known.Mountain }, + { "mountain_cableway", Emoji.Known.MountainCableway }, + { "mountain_railway", Emoji.Known.MountainRailway }, + { "mount_fuji", Emoji.Known.MountFuji }, + { "mouse", Emoji.Known.Mouse }, + { "mouse_face", Emoji.Known.MouseFace }, + { "mouse_trap", Emoji.Known.MouseTrap }, + { "mouth", Emoji.Known.Mouth }, + { "movie_camera", Emoji.Known.MovieCamera }, + { "mrs_claus", Emoji.Known.MrsClaus }, + { "multiply", Emoji.Known.Multiply }, + { "mushroom", Emoji.Known.Mushroom }, + { "musical_keyboard", Emoji.Known.MusicalKeyboard }, + { "musical_note", Emoji.Known.MusicalNote }, + { "musical_notes", Emoji.Known.MusicalNotes }, + { "musical_score", Emoji.Known.MusicalScore }, + { "muted_speaker", Emoji.Known.MutedSpeaker }, + { "nail_polish", Emoji.Known.NailPolish }, + { "name_badge", Emoji.Known.NameBadge }, + { "national_park", Emoji.Known.NationalPark }, + { "nauseated_face", Emoji.Known.NauseatedFace }, + { "nazar_amulet", Emoji.Known.NazarAmulet }, + { "necktie", Emoji.Known.Necktie }, + { "nerd_face", Emoji.Known.NerdFace }, + { "nesting_dolls", Emoji.Known.NestingDolls }, + { "neutral_face", Emoji.Known.NeutralFace }, + { "new_button", Emoji.Known.NewButton }, + { "new_moon", Emoji.Known.NewMoon }, + { "new_moon_face", Emoji.Known.NewMoonFace }, + { "newspaper", Emoji.Known.Newspaper }, + { "next_track_button", Emoji.Known.NextTrackButton }, + { "ng_button", Emoji.Known.NgButton }, + { "night_with_stars", Emoji.Known.NightWithStars }, + { "nine_o_clock", Emoji.Known.NineOClock }, + { "nine_thirty", Emoji.Known.NineThirty }, + { "ninja", Emoji.Known.Ninja }, + { "no_bicycles", Emoji.Known.NoBicycles }, + { "no_entry", Emoji.Known.NoEntry }, + { "no_littering", Emoji.Known.NoLittering }, + { "no_mobile_phones", Emoji.Known.NoMobilePhones }, + { "non_potable_water", Emoji.Known.NonPotableWater }, + { "no_one_under_eighteen", Emoji.Known.NoOneUnderEighteen }, + { "no_pedestrians", Emoji.Known.NoPedestrians }, + { "nose", Emoji.Known.Nose }, + { "no_smoking", Emoji.Known.NoSmoking }, + { "notebook", Emoji.Known.Notebook }, + { "notebook_with_decorative_cover", Emoji.Known.NotebookWithDecorativeCover }, + { "nut_and_bolt", Emoji.Known.NutAndBolt }, + { "o_button_blood_type", Emoji.Known.OButtonBloodType }, + { "octopus", Emoji.Known.Octopus }, + { "oden", Emoji.Known.Oden }, + { "office_building", Emoji.Known.OfficeBuilding }, + { "ogre", Emoji.Known.Ogre }, + { "oil_drum", Emoji.Known.OilDrum }, + { "ok_button", Emoji.Known.OkButton }, + { "ok_hand", Emoji.Known.OkHand }, + { "older_person", Emoji.Known.OlderPerson }, + { "old_key", Emoji.Known.OldKey }, + { "old_man", Emoji.Known.OldMan }, + { "old_woman", Emoji.Known.OldWoman }, + { "olive", Emoji.Known.Olive }, + { "om", Emoji.Known.Om }, + { "on_arrow", Emoji.Known.OnArrow }, + { "oncoming_automobile", Emoji.Known.OncomingAutomobile }, + { "oncoming_bus", Emoji.Known.OncomingBus }, + { "oncoming_fist", Emoji.Known.OncomingFist }, + { "oncoming_police_car", Emoji.Known.OncomingPoliceCar }, + { "oncoming_taxi", Emoji.Known.OncomingTaxi }, + { "one_o_clock", Emoji.Known.OneOClock }, + { "one_piece_swimsuit", Emoji.Known.OnePieceSwimsuit }, + { "one_thirty", Emoji.Known.OneThirty }, + { "onion", Emoji.Known.Onion }, + { "open_book", Emoji.Known.OpenBook }, + { "open_file_folder", Emoji.Known.OpenFileFolder }, + { "open_hands", Emoji.Known.OpenHands }, + { "open_mailbox_with_lowered_flag", Emoji.Known.OpenMailboxWithLoweredFlag }, + { "open_mailbox_with_raised_flag", Emoji.Known.OpenMailboxWithRaisedFlag }, + { "ophiuchus", Emoji.Known.Ophiuchus }, + { "optical_disk", Emoji.Known.OpticalDisk }, + { "orange_book", Emoji.Known.OrangeBook }, + { "orange_circle", Emoji.Known.OrangeCircle }, + { "orange_heart", Emoji.Known.OrangeHeart }, + { "orange_square", Emoji.Known.OrangeSquare }, + { "orangutan", Emoji.Known.Orangutan }, + { "orthodox_cross", Emoji.Known.OrthodoxCross }, + { "otter", Emoji.Known.Otter }, + { "outbox_tray", Emoji.Known.OutboxTray }, + { "owl", Emoji.Known.Owl }, + { "ox", Emoji.Known.Ox }, + { "oyster", Emoji.Known.Oyster }, + { "package", Emoji.Known.Package }, + { "page_facing_up", Emoji.Known.PageFacingUp }, + { "pager", Emoji.Known.Pager }, + { "page_with_curl", Emoji.Known.PageWithCurl }, + { "paintbrush", Emoji.Known.Paintbrush }, + { "palms_up_together", Emoji.Known.PalmsUpTogether }, + { "palm_tree", Emoji.Known.PalmTree }, + { "pancakes", Emoji.Known.Pancakes }, + { "panda", Emoji.Known.Panda }, + { "paperclip", Emoji.Known.Paperclip }, + { "parachute", Emoji.Known.Parachute }, + { "parrot", Emoji.Known.Parrot }, + { "part_alternation_mark", Emoji.Known.PartAlternationMark }, + { "partying_face", Emoji.Known.PartyingFace }, + { "party_popper", Emoji.Known.PartyPopper }, + { "passenger_ship", Emoji.Known.PassengerShip }, + { "passport_control", Emoji.Known.PassportControl }, + { "pause_button", Emoji.Known.PauseButton }, + { "paw_prints", Emoji.Known.PawPrints }, + { "p_button", Emoji.Known.PButton }, + { "peace_symbol", Emoji.Known.PeaceSymbol }, + { "peach", Emoji.Known.Peach }, + { "peacock", Emoji.Known.Peacock }, + { "peanuts", Emoji.Known.Peanuts }, + { "pear", Emoji.Known.Pear }, + { "pen", Emoji.Known.Pen }, + { "pencil", Emoji.Known.Pencil }, + { "penguin", Emoji.Known.Penguin }, + { "pensive_face", Emoji.Known.PensiveFace }, + { "people_hugging", Emoji.Known.PeopleHugging }, + { "people_with_bunny_ears", Emoji.Known.PeopleWithBunnyEars }, + { "people_wrestling", Emoji.Known.PeopleWrestling }, + { "performing_arts", Emoji.Known.PerformingArts }, + { "persevering_face", Emoji.Known.PerseveringFace }, + { "person", Emoji.Known.Person }, + { "person_beard", Emoji.Known.PersonBeard }, + { "person_biking", Emoji.Known.PersonBiking }, + { "person_blond_hair", Emoji.Known.PersonBlondHair }, + { "person_bouncing_ball", Emoji.Known.PersonBouncingBall }, + { "person_bowing", Emoji.Known.PersonBowing }, + { "person_cartwheeling", Emoji.Known.PersonCartwheeling }, + { "person_climbing", Emoji.Known.PersonClimbing }, + { "person_facepalming", Emoji.Known.PersonFacepalming }, + { "person_fencing", Emoji.Known.PersonFencing }, + { "person_frowning", Emoji.Known.PersonFrowning }, + { "person_gesturing_no", Emoji.Known.PersonGesturingNo }, + { "person_gesturing_ok", Emoji.Known.PersonGesturingOk }, + { "person_getting_haircut", Emoji.Known.PersonGettingHaircut }, + { "person_getting_massage", Emoji.Known.PersonGettingMassage }, + { "person_golfing", Emoji.Known.PersonGolfing }, + { "person_in_bed", Emoji.Known.PersonInBed }, + { "person_in_lotus_position", Emoji.Known.PersonInLotusPosition }, + { "person_in_steamy_room", Emoji.Known.PersonInSteamyRoom }, + { "person_in_suit_levitating", Emoji.Known.PersonInSuitLevitating }, + { "person_in_tuxedo", Emoji.Known.PersonInTuxedo }, + { "person_juggling", Emoji.Known.PersonJuggling }, + { "person_kneeling", Emoji.Known.PersonKneeling }, + { "person_lifting_weights", Emoji.Known.PersonLiftingWeights }, + { "person_mountain_biking", Emoji.Known.PersonMountainBiking }, + { "person_playing_handball", Emoji.Known.PersonPlayingHandball }, + { "person_playing_water_polo", Emoji.Known.PersonPlayingWaterPolo }, + { "person_pouting", Emoji.Known.PersonPouting }, + { "person_raising_hand", Emoji.Known.PersonRaisingHand }, + { "person_rowing_boat", Emoji.Known.PersonRowingBoat }, + { "person_running", Emoji.Known.PersonRunning }, + { "person_shrugging", Emoji.Known.PersonShrugging }, + { "person_standing", Emoji.Known.PersonStanding }, + { "person_surfing", Emoji.Known.PersonSurfing }, + { "person_swimming", Emoji.Known.PersonSwimming }, + { "person_taking_bath", Emoji.Known.PersonTakingBath }, + { "person_tipping_hand", Emoji.Known.PersonTippingHand }, + { "person_walking", Emoji.Known.PersonWalking }, + { "person_wearing_turban", Emoji.Known.PersonWearingTurban }, + { "person_with_skullcap", Emoji.Known.PersonWithSkullcap }, + { "person_with_veil", Emoji.Known.PersonWithVeil }, + { "petri_dish", Emoji.Known.PetriDish }, + { "pick", Emoji.Known.Pick }, + { "pickup_truck", Emoji.Known.PickupTruck }, + { "pie", Emoji.Known.Pie }, + { "pig", Emoji.Known.Pig }, + { "pig_face", Emoji.Known.PigFace }, + { "pig_nose", Emoji.Known.PigNose }, + { "pile_of_poo", Emoji.Known.PileOfPoo }, + { "pill", Emoji.Known.Pill }, + { "piñata", Emoji.Known.Piñata }, + { "pinched_fingers", Emoji.Known.PinchedFingers }, + { "pinching_hand", Emoji.Known.PinchingHand }, + { "pineapple", Emoji.Known.Pineapple }, + { "pine_decoration", Emoji.Known.PineDecoration }, + { "ping_pong", Emoji.Known.PingPong }, + { "pisces", Emoji.Known.Pisces }, + { "pizza", Emoji.Known.Pizza }, + { "placard", Emoji.Known.Placard }, + { "place_of_worship", Emoji.Known.PlaceOfWorship }, + { "play_button", Emoji.Known.PlayButton }, + { "play_or_pause_button", Emoji.Known.PlayOrPauseButton }, + { "pleading_face", Emoji.Known.PleadingFace }, + { "plunger", Emoji.Known.Plunger }, + { "plus", Emoji.Known.Plus }, + { "police_car", Emoji.Known.PoliceCar }, + { "police_car_light", Emoji.Known.PoliceCarLight }, + { "police_officer", Emoji.Known.PoliceOfficer }, + { "poodle", Emoji.Known.Poodle }, + { "pool_8_ball", Emoji.Known.Pool8Ball }, + { "popcorn", Emoji.Known.Popcorn }, + { "postal_horn", Emoji.Known.PostalHorn }, + { "postbox", Emoji.Known.Postbox }, + { "post_office", Emoji.Known.PostOffice }, + { "potable_water", Emoji.Known.PotableWater }, + { "potato", Emoji.Known.Potato }, + { "pot_of_food", Emoji.Known.PotOfFood }, + { "potted_plant", Emoji.Known.PottedPlant }, + { "poultry_leg", Emoji.Known.PoultryLeg }, + { "pound_banknote", Emoji.Known.PoundBanknote }, + { "pouting_cat", Emoji.Known.PoutingCat }, + { "pouting_face", Emoji.Known.PoutingFace }, + { "prayer_beads", Emoji.Known.PrayerBeads }, + { "pregnant_woman", Emoji.Known.PregnantWoman }, + { "pretzel", Emoji.Known.Pretzel }, + { "prince", Emoji.Known.Prince }, + { "princess", Emoji.Known.Princess }, + { "printer", Emoji.Known.Printer }, + { "prohibited", Emoji.Known.Prohibited }, + { "purple_circle", Emoji.Known.PurpleCircle }, + { "purple_heart", Emoji.Known.PurpleHeart }, + { "purple_square", Emoji.Known.PurpleSquare }, + { "purse", Emoji.Known.Purse }, + { "pushpin", Emoji.Known.Pushpin }, + { "puzzle_piece", Emoji.Known.PuzzlePiece }, + { "rabbit", Emoji.Known.Rabbit }, + { "rabbit_face", Emoji.Known.RabbitFace }, + { "raccoon", Emoji.Known.Raccoon }, + { "racing_car", Emoji.Known.RacingCar }, + { "radio", Emoji.Known.Radio }, + { "radioactive", Emoji.Known.Radioactive }, + { "radio_button", Emoji.Known.RadioButton }, + { "railway_car", Emoji.Known.RailwayCar }, + { "railway_track", Emoji.Known.RailwayTrack }, + { "rainbow", Emoji.Known.Rainbow }, + { "raised_back_of_hand", Emoji.Known.RaisedBackOfHand }, + { "raised_fist", Emoji.Known.RaisedFist }, + { "raised_hand", Emoji.Known.RaisedHand }, + { "raising_hands", Emoji.Known.RaisingHands }, + { "ram", Emoji.Known.Ram }, + { "rat", Emoji.Known.Rat }, + { "razor", Emoji.Known.Razor }, + { "receipt", Emoji.Known.Receipt }, + { "record_button", Emoji.Known.RecordButton }, + { "recycling_symbol", Emoji.Known.RecyclingSymbol }, + { "red_apple", Emoji.Known.RedApple }, + { "red_circle", Emoji.Known.RedCircle }, + { "red_envelope", Emoji.Known.RedEnvelope }, + { "red_exclamation_mark", Emoji.Known.RedExclamationMark }, + { "red_hair", Emoji.Known.RedHair }, + { "red_heart", Emoji.Known.RedHeart }, + { "red_paper_lantern", Emoji.Known.RedPaperLantern }, + { "red_question_mark", Emoji.Known.RedQuestionMark }, + { "red_square", Emoji.Known.RedSquare }, + { "red_triangle_pointed_down", Emoji.Known.RedTrianglePointedDown }, + { "red_triangle_pointed_up", Emoji.Known.RedTrianglePointedUp }, + { "registered", Emoji.Known.Registered }, + { "relieved_face", Emoji.Known.RelievedFace }, + { "reminder_ribbon", Emoji.Known.ReminderRibbon }, + { "repeat_button", Emoji.Known.RepeatButton }, + { "repeat_single_button", Emoji.Known.RepeatSingleButton }, + { "rescue_workers_helmet", Emoji.Known.RescueWorkersHelmet }, + { "restroom", Emoji.Known.Restroom }, + { "reverse_button", Emoji.Known.ReverseButton }, + { "revolving_hearts", Emoji.Known.RevolvingHearts }, + { "rhinoceros", Emoji.Known.Rhinoceros }, + { "ribbon", Emoji.Known.Ribbon }, + { "rice_ball", Emoji.Known.RiceBall }, + { "rice_cracker", Emoji.Known.RiceCracker }, + { "right_anger_bubble", Emoji.Known.RightAngerBubble }, + { "right_arrow", Emoji.Known.RightArrow }, + { "right_arrow_curving_down", Emoji.Known.RightArrowCurvingDown }, + { "right_arrow_curving_left", Emoji.Known.RightArrowCurvingLeft }, + { "right_arrow_curving_up", Emoji.Known.RightArrowCurvingUp }, + { "right_facing_fist", Emoji.Known.RightFacingFist }, + { "ring", Emoji.Known.Ring }, + { "ringed_planet", Emoji.Known.RingedPlanet }, + { "roasted_sweet_potato", Emoji.Known.RoastedSweetPotato }, + { "robot", Emoji.Known.Robot }, + { "rock", Emoji.Known.Rock }, + { "rocket", Emoji.Known.Rocket }, + { "rolled_up_newspaper", Emoji.Known.RolledUpNewspaper }, + { "roller_coaster", Emoji.Known.RollerCoaster }, + { "roller_skate", Emoji.Known.RollerSkate }, + { "rolling_on_the_floor_laughing", Emoji.Known.RollingOnTheFloorLaughing }, + { "roll_of_paper", Emoji.Known.RollOfPaper }, + { "rooster", Emoji.Known.Rooster }, + { "rose", Emoji.Known.Rose }, + { "rosette", Emoji.Known.Rosette }, + { "round_pushpin", Emoji.Known.RoundPushpin }, + { "rugby_football", Emoji.Known.RugbyFootball }, + { "running_shirt", Emoji.Known.RunningShirt }, + { "running_shoe", Emoji.Known.RunningShoe }, + { "sad_but_relieved_face", Emoji.Known.SadButRelievedFace }, + { "safety_pin", Emoji.Known.SafetyPin }, + { "safety_vest", Emoji.Known.SafetyVest }, + { "sagittarius", Emoji.Known.Sagittarius }, + { "sailboat", Emoji.Known.Sailboat }, + { "sake", Emoji.Known.Sake }, + { "salt", Emoji.Known.Salt }, + { "sandwich", Emoji.Known.Sandwich }, + { "santa_claus", Emoji.Known.SantaClaus }, + { "sari", Emoji.Known.Sari }, + { "satellite", Emoji.Known.Satellite }, + { "satellite_antenna", Emoji.Known.SatelliteAntenna }, + { "sauropod", Emoji.Known.Sauropod }, + { "saxophone", Emoji.Known.Saxophone }, + { "scarf", Emoji.Known.Scarf }, + { "school", Emoji.Known.School }, + { "scissors", Emoji.Known.Scissors }, + { "scorpio", Emoji.Known.Scorpio }, + { "scorpion", Emoji.Known.Scorpion }, + { "screwdriver", Emoji.Known.Screwdriver }, + { "scroll", Emoji.Known.Scroll }, + { "seal", Emoji.Known.Seal }, + { "seat", Emoji.Known.Seat }, + { "2nd_place_medal", Emoji.Known.SecondPlaceMedal }, + { "seedling", Emoji.Known.Seedling }, + { "see_no_evil_monkey", Emoji.Known.SeeNoEvilMonkey }, + { "selfie", Emoji.Known.Selfie }, + { "seven_o_clock", Emoji.Known.SevenOClock }, + { "seven_thirty", Emoji.Known.SevenThirty }, + { "sewing_needle", Emoji.Known.SewingNeedle }, + { "shallow_pan_of_food", Emoji.Known.ShallowPanOfFood }, + { "shamrock", Emoji.Known.Shamrock }, + { "shark", Emoji.Known.Shark }, + { "shaved_ice", Emoji.Known.ShavedIce }, + { "sheaf_of_rice", Emoji.Known.SheafOfRice }, + { "shield", Emoji.Known.Shield }, + { "shinto_shrine", Emoji.Known.ShintoShrine }, + { "ship", Emoji.Known.Ship }, + { "shooting_star", Emoji.Known.ShootingStar }, + { "shopping_bags", Emoji.Known.ShoppingBags }, + { "shopping_cart", Emoji.Known.ShoppingCart }, + { "shortcake", Emoji.Known.Shortcake }, + { "shorts", Emoji.Known.Shorts }, + { "shower", Emoji.Known.Shower }, + { "shrimp", Emoji.Known.Shrimp }, + { "shuffle_tracks_button", Emoji.Known.ShuffleTracksButton }, + { "shushing_face", Emoji.Known.ShushingFace }, + { "sign_of_the_horns", Emoji.Known.SignOfTheHorns }, + { "six_o_clock", Emoji.Known.SixOClock }, + { "six_thirty", Emoji.Known.SixThirty }, + { "skateboard", Emoji.Known.Skateboard }, + { "skier", Emoji.Known.Skier }, + { "skis", Emoji.Known.Skis }, + { "skull", Emoji.Known.Skull }, + { "skull_and_crossbones", Emoji.Known.SkullAndCrossbones }, + { "skunk", Emoji.Known.Skunk }, + { "sled", Emoji.Known.Sled }, + { "sleeping_face", Emoji.Known.SleepingFace }, + { "sleepy_face", Emoji.Known.SleepyFace }, + { "slightly_frowning_face", Emoji.Known.SlightlyFrowningFace }, + { "slightly_smiling_face", Emoji.Known.SlightlySmilingFace }, + { "sloth", Emoji.Known.Sloth }, + { "slot_machine", Emoji.Known.SlotMachine }, + { "small_airplane", Emoji.Known.SmallAirplane }, + { "small_blue_diamond", Emoji.Known.SmallBlueDiamond }, + { "small_orange_diamond", Emoji.Known.SmallOrangeDiamond }, + { "smiling_cat_with_heart_eyes", Emoji.Known.SmilingCatWithHeartEyes }, + { "smiling_face", Emoji.Known.SmilingFace }, + { "smiling_face_with_halo", Emoji.Known.SmilingFaceWithHalo }, + { "smiling_face_with_heart_eyes", Emoji.Known.SmilingFaceWithHeartEyes }, + { "smiling_face_with_hearts", Emoji.Known.SmilingFaceWithHearts }, + { "smiling_face_with_horns", Emoji.Known.SmilingFaceWithHorns }, + { "smiling_face_with_smiling_eyes", Emoji.Known.SmilingFaceWithSmilingEyes }, + { "smiling_face_with_sunglasses", Emoji.Known.SmilingFaceWithSunglasses }, + { "smiling_face_with_tear", Emoji.Known.SmilingFaceWithTear }, + { "smirking_face", Emoji.Known.SmirkingFace }, + { "snail", Emoji.Known.Snail }, + { "snake", Emoji.Known.Snake }, + { "sneezing_face", Emoji.Known.SneezingFace }, + { "snowboarder", Emoji.Known.Snowboarder }, + { "snow_capped_mountain", Emoji.Known.SnowCappedMountain }, + { "snowflake", Emoji.Known.Snowflake }, + { "snowman", Emoji.Known.Snowman }, + { "snowman_without_snow", Emoji.Known.SnowmanWithoutSnow }, + { "soap", Emoji.Known.Soap }, + { "soccer_ball", Emoji.Known.SoccerBall }, + { "socks", Emoji.Known.Socks }, + { "softball", Emoji.Known.Softball }, + { "soft_ice_cream", Emoji.Known.SoftIceCream }, + { "soon_arrow", Emoji.Known.SoonArrow }, + { "sos_button", Emoji.Known.SosButton }, + { "spade_suit", Emoji.Known.SpadeSuit }, + { "spaghetti", Emoji.Known.Spaghetti }, + { "sparkle", Emoji.Known.Sparkle }, + { "sparkler", Emoji.Known.Sparkler }, + { "sparkles", Emoji.Known.Sparkles }, + { "sparkling_heart", Emoji.Known.SparklingHeart }, + { "speaker_high_volume", Emoji.Known.SpeakerHighVolume }, + { "speaker_low_volume", Emoji.Known.SpeakerLowVolume }, + { "speaker_medium_volume", Emoji.Known.SpeakerMediumVolume }, + { "speaking_head", Emoji.Known.SpeakingHead }, + { "speak_no_evil_monkey", Emoji.Known.SpeakNoEvilMonkey }, + { "speech_balloon", Emoji.Known.SpeechBalloon }, + { "speedboat", Emoji.Known.Speedboat }, + { "spider", Emoji.Known.Spider }, + { "spider_web", Emoji.Known.SpiderWeb }, + { "spiral_calendar", Emoji.Known.SpiralCalendar }, + { "spiral_notepad", Emoji.Known.SpiralNotepad }, + { "spiral_shell", Emoji.Known.SpiralShell }, + { "sponge", Emoji.Known.Sponge }, + { "spoon", Emoji.Known.Spoon }, + { "sports_medal", Emoji.Known.SportsMedal }, + { "sport_utility_vehicle", Emoji.Known.SportUtilityVehicle }, + { "spouting_whale", Emoji.Known.SpoutingWhale }, + { "squid", Emoji.Known.Squid }, + { "squinting_face_with_tongue", Emoji.Known.SquintingFaceWithTongue }, + { "stadium", Emoji.Known.Stadium }, + { "star", Emoji.Known.Star }, + { "star_and_crescent", Emoji.Known.StarAndCrescent }, + { "star_of_david", Emoji.Known.StarOfDavid }, + { "star_struck", Emoji.Known.StarStruck }, + { "station", Emoji.Known.Station }, + { "statue_of_liberty", Emoji.Known.StatueOfLiberty }, + { "steaming_bowl", Emoji.Known.SteamingBowl }, + { "stethoscope", Emoji.Known.Stethoscope }, + { "stop_button", Emoji.Known.StopButton }, + { "stop_sign", Emoji.Known.StopSign }, + { "stopwatch", Emoji.Known.Stopwatch }, + { "straight_ruler", Emoji.Known.StraightRuler }, + { "strawberry", Emoji.Known.Strawberry }, + { "studio_microphone", Emoji.Known.StudioMicrophone }, + { "stuffed_flatbread", Emoji.Known.StuffedFlatbread }, + { "sun", Emoji.Known.Sun }, + { "sun_behind_cloud", Emoji.Known.SunBehindCloud }, + { "sun_behind_large_cloud", Emoji.Known.SunBehindLargeCloud }, + { "sun_behind_rain_cloud", Emoji.Known.SunBehindRainCloud }, + { "sun_behind_small_cloud", Emoji.Known.SunBehindSmallCloud }, + { "sunflower", Emoji.Known.Sunflower }, + { "sunglasses", Emoji.Known.Sunglasses }, + { "sunrise", Emoji.Known.Sunrise }, + { "sunrise_over_mountains", Emoji.Known.SunriseOverMountains }, + { "sunset", Emoji.Known.Sunset }, + { "sun_with_face", Emoji.Known.SunWithFace }, + { "superhero", Emoji.Known.Superhero }, + { "supervillain", Emoji.Known.Supervillain }, + { "sushi", Emoji.Known.Sushi }, + { "suspension_railway", Emoji.Known.SuspensionRailway }, + { "swan", Emoji.Known.Swan }, + { "sweat_droplets", Emoji.Known.SweatDroplets }, + { "synagogue", Emoji.Known.Synagogue }, + { "syringe", Emoji.Known.Syringe }, + { "taco", Emoji.Known.Taco }, + { "takeout_box", Emoji.Known.TakeoutBox }, + { "tamale", Emoji.Known.Tamale }, + { "tanabata_tree", Emoji.Known.TanabataTree }, + { "tangerine", Emoji.Known.Tangerine }, + { "taurus", Emoji.Known.Taurus }, + { "taxi", Emoji.Known.Taxi }, + { "teacup_without_handle", Emoji.Known.TeacupWithoutHandle }, + { "teapot", Emoji.Known.Teapot }, + { "tear_off_calendar", Emoji.Known.TearOffCalendar }, + { "teddy_bear", Emoji.Known.TeddyBear }, + { "telephone", Emoji.Known.Telephone }, + { "telephone_receiver", Emoji.Known.TelephoneReceiver }, + { "telescope", Emoji.Known.Telescope }, + { "television", Emoji.Known.Television }, + { "tennis", Emoji.Known.Tennis }, + { "ten_o_clock", Emoji.Known.TenOClock }, + { "tent", Emoji.Known.Tent }, + { "ten_thirty", Emoji.Known.TenThirty }, + { "test_tube", Emoji.Known.TestTube }, + { "thermometer", Emoji.Known.Thermometer }, + { "thinking_face", Emoji.Known.ThinkingFace }, + { "3rd_place_medal", Emoji.Known.ThirdPlaceMedal }, + { "thong_sandal", Emoji.Known.ThongSandal }, + { "thought_balloon", Emoji.Known.ThoughtBalloon }, + { "thread", Emoji.Known.Thread }, + { "three_o_clock", Emoji.Known.ThreeOClock }, + { "three_thirty", Emoji.Known.ThreeThirty }, + { "thumbs_down", Emoji.Known.ThumbsDown }, + { "thumbs_up", Emoji.Known.ThumbsUp }, + { "ticket", Emoji.Known.Ticket }, + { "tiger", Emoji.Known.Tiger }, + { "tiger_face", Emoji.Known.TigerFace }, + { "timer_clock", Emoji.Known.TimerClock }, + { "tired_face", Emoji.Known.TiredFace }, + { "toilet", Emoji.Known.Toilet }, + { "tokyo_tower", Emoji.Known.TokyoTower }, + { "tomato", Emoji.Known.Tomato }, + { "tongue", Emoji.Known.Tongue }, + { "toolbox", Emoji.Known.Toolbox }, + { "tooth", Emoji.Known.Tooth }, + { "toothbrush", Emoji.Known.Toothbrush }, + { "top_arrow", Emoji.Known.TopArrow }, + { "top_hat", Emoji.Known.TopHat }, + { "tornado", Emoji.Known.Tornado }, + { "trackball", Emoji.Known.Trackball }, + { "tractor", Emoji.Known.Tractor }, + { "trade_mark", Emoji.Known.TradeMark }, + { "train", Emoji.Known.Train }, + { "tram", Emoji.Known.Tram }, + { "tram_car", Emoji.Known.TramCar }, + { "transgender_symbol", Emoji.Known.TransgenderSymbol }, + { "t_rex", Emoji.Known.TRex }, + { "triangular_flag", Emoji.Known.TriangularFlag }, + { "triangular_ruler", Emoji.Known.TriangularRuler }, + { "trident_emblem", Emoji.Known.TridentEmblem }, + { "trolleybus", Emoji.Known.Trolleybus }, + { "trophy", Emoji.Known.Trophy }, + { "tropical_drink", Emoji.Known.TropicalDrink }, + { "tropical_fish", Emoji.Known.TropicalFish }, + { "trumpet", Emoji.Known.Trumpet }, + { "t_shirt", Emoji.Known.TShirt }, + { "tulip", Emoji.Known.Tulip }, + { "tumbler_glass", Emoji.Known.TumblerGlass }, + { "turkey", Emoji.Known.Turkey }, + { "turtle", Emoji.Known.Turtle }, + { "twelve_o_clock", Emoji.Known.TwelveOClock }, + { "twelve_thirty", Emoji.Known.TwelveThirty }, + { "two_hearts", Emoji.Known.TwoHearts }, + { "two_hump_camel", Emoji.Known.TwoHumpCamel }, + { "two_o_clock", Emoji.Known.TwoOClock }, + { "two_thirty", Emoji.Known.TwoThirty }, + { "umbrella", Emoji.Known.Umbrella }, + { "umbrella_on_ground", Emoji.Known.UmbrellaOnGround }, + { "umbrella_with_rain_drops", Emoji.Known.UmbrellaWithRainDrops }, + { "unamused_face", Emoji.Known.UnamusedFace }, + { "unicorn", Emoji.Known.Unicorn }, + { "unlocked", Emoji.Known.Unlocked }, + { "up_arrow", Emoji.Known.UpArrow }, + { "up_button", Emoji.Known.UpButton }, + { "up_down_arrow", Emoji.Known.UpDownArrow }, + { "up_left_arrow", Emoji.Known.UpLeftArrow }, + { "up_right_arrow", Emoji.Known.UpRightArrow }, + { "upside_down_face", Emoji.Known.UpsideDownFace }, + { "upwards_button", Emoji.Known.UpwardsButton }, + { "vampire", Emoji.Known.Vampire }, + { "vertical_traffic_light", Emoji.Known.VerticalTrafficLight }, + { "vibration_mode", Emoji.Known.VibrationMode }, + { "victory_hand", Emoji.Known.VictoryHand }, + { "video_camera", Emoji.Known.VideoCamera }, + { "videocassette", Emoji.Known.Videocassette }, + { "video_game", Emoji.Known.VideoGame }, + { "violin", Emoji.Known.Violin }, + { "virgo", Emoji.Known.Virgo }, + { "volcano", Emoji.Known.Volcano }, + { "volleyball", Emoji.Known.Volleyball }, + { "vs_button", Emoji.Known.VsButton }, + { "vulcan_salute", Emoji.Known.VulcanSalute }, + { "waffle", Emoji.Known.Waffle }, + { "waning_crescent_moon", Emoji.Known.WaningCrescentMoon }, + { "waning_gibbous_moon", Emoji.Known.WaningGibbousMoon }, + { "warning", Emoji.Known.Warning }, + { "wastebasket", Emoji.Known.Wastebasket }, + { "watch", Emoji.Known.Watch }, + { "water_buffalo", Emoji.Known.WaterBuffalo }, + { "water_closet", Emoji.Known.WaterCloset }, + { "watermelon", Emoji.Known.Watermelon }, + { "water_pistol", Emoji.Known.WaterPistol }, + { "water_wave", Emoji.Known.WaterWave }, + { "waving_hand", Emoji.Known.WavingHand }, + { "wavy_dash", Emoji.Known.WavyDash }, + { "waxing_crescent_moon", Emoji.Known.WaxingCrescentMoon }, + { "waxing_gibbous_moon", Emoji.Known.WaxingGibbousMoon }, + { "weary_cat", Emoji.Known.WearyCat }, + { "weary_face", Emoji.Known.WearyFace }, + { "wedding", Emoji.Known.Wedding }, + { "whale", Emoji.Known.Whale }, + { "wheelchair_symbol", Emoji.Known.WheelchairSymbol }, + { "wheel_of_dharma", Emoji.Known.WheelOfDharma }, + { "white_cane", Emoji.Known.WhiteCane }, + { "white_circle", Emoji.Known.WhiteCircle }, + { "white_exclamation_mark", Emoji.Known.WhiteExclamationMark }, + { "white_flag", Emoji.Known.WhiteFlag }, + { "white_flower", Emoji.Known.WhiteFlower }, + { "white_hair", Emoji.Known.WhiteHair }, + { "white_heart", Emoji.Known.WhiteHeart }, + { "white_large_square", Emoji.Known.WhiteLargeSquare }, + { "white_medium_small_square", Emoji.Known.WhiteMediumSmallSquare }, + { "white_medium_square", Emoji.Known.WhiteMediumSquare }, + { "white_question_mark", Emoji.Known.WhiteQuestionMark }, + { "white_small_square", Emoji.Known.WhiteSmallSquare }, + { "white_square_button", Emoji.Known.WhiteSquareButton }, + { "wilted_flower", Emoji.Known.WiltedFlower }, + { "wind_chime", Emoji.Known.WindChime }, + { "wind_face", Emoji.Known.WindFace }, + { "window", Emoji.Known.Window }, + { "wine_glass", Emoji.Known.WineGlass }, + { "winking_face", Emoji.Known.WinkingFace }, + { "winking_face_with_tongue", Emoji.Known.WinkingFaceWithTongue }, + { "wolf", Emoji.Known.Wolf }, + { "woman", Emoji.Known.Woman }, + { "woman_and_man_holding_hands", Emoji.Known.WomanAndManHoldingHands }, + { "woman_dancing", Emoji.Known.WomanDancing }, + { "womans_boot", Emoji.Known.WomansBoot }, + { "womans_clothes", Emoji.Known.WomansClothes }, + { "womans_hat", Emoji.Known.WomansHat }, + { "womans_sandal", Emoji.Known.WomansSandal }, + { "woman_with_headscarf", Emoji.Known.WomanWithHeadscarf }, + { "women_holding_hands", Emoji.Known.WomenHoldingHands }, + { "womens_room", Emoji.Known.WomensRoom }, + { "wood", Emoji.Known.Wood }, + { "woozy_face", Emoji.Known.WoozyFace }, + { "world_map", Emoji.Known.WorldMap }, + { "worm", Emoji.Known.Worm }, + { "worried_face", Emoji.Known.WorriedFace }, + { "wrapped_gift", Emoji.Known.WrappedGift }, + { "wrench", Emoji.Known.Wrench }, + { "writing_hand", Emoji.Known.WritingHand }, + { "yarn", Emoji.Known.Yarn }, + { "yawning_face", Emoji.Known.YawningFace }, + { "yellow_circle", Emoji.Known.YellowCircle }, + { "yellow_heart", Emoji.Known.YellowHeart }, + { "yellow_square", Emoji.Known.YellowSquare }, + { "yen_banknote", Emoji.Known.YenBanknote }, + { "yin_yang", Emoji.Known.YinYang }, + { "yo_yo", Emoji.Known.YoYo }, + { "zany_face", Emoji.Known.ZanyFace }, + { "zebra", Emoji.Known.Zebra }, + { "zipper_mouth_face", Emoji.Known.ZipperMouthFace }, + { "zombie", Emoji.Known.Zombie }, + { "zzz", Emoji.Known.Zzz }, + }; + + /// + /// Contains all predefined emojis. + /// + public static class Known + { + /// + /// Gets the "abacus" emoji. + /// Description: Abacus. + /// + public const string Abacus = "\U0001F9EE"; + + /// + /// Gets the "ab_button_blood_type" emoji. + /// Description: AB button blood type. + /// + public const string AbButtonBloodType = "\U0001F18E"; + + /// + /// Gets the "a_button_blood_type" emoji. + /// Description: A button blood type. + /// + public const string AButtonBloodType = "\U0001F170"; + + /// + /// Gets the "accordion" emoji. + /// Description: Accordion. + /// + public const string Accordion = "\U0001FA97"; + + /// + /// Gets the "adhesive_bandage" emoji. + /// Description: Adhesive bandage. + /// + public const string AdhesiveBandage = "\U0001FA79"; + + /// + /// Gets the "admission_tickets" emoji. + /// Description: Admission tickets. + /// + public const string AdmissionTickets = "\U0001F39F"; + + /// + /// Gets the "aerial_tramway" emoji. + /// Description: Aerial tramway. + /// + public const string AerialTramway = "\U0001F6A1"; + + /// + /// Gets the "airplane" emoji. + /// Description: Airplane. + /// + public const string Airplane = "\U00002708"; + + /// + /// Gets the "airplane_arrival" emoji. + /// Description: Airplane arrival. + /// + public const string AirplaneArrival = "\U0001F6EC"; + + /// + /// Gets the "airplane_departure" emoji. + /// Description: Airplane departure. + /// + public const string AirplaneDeparture = "\U0001F6EB"; + + /// + /// Gets the "alarm_clock" emoji. + /// Description: Alarm clock. + /// + public const string AlarmClock = "\U000023F0"; + + /// + /// Gets the "alembic" emoji. + /// Description: Alembic. + /// + public const string Alembic = "\U00002697"; + + /// + /// Gets the "alien" emoji. + /// Description: Alien. + /// + public const string Alien = "\U0001F47D"; + + /// + /// Gets the "alien_monster" emoji. + /// Description: Alien monster. + /// + public const string AlienMonster = "\U0001F47E"; + + /// + /// Gets the "ambulance" emoji. + /// Description: Ambulance. + /// + public const string Ambulance = "\U0001F691"; + + /// + /// Gets the "american_football" emoji. + /// Description: American football. + /// + public const string AmericanFootball = "\U0001F3C8"; + + /// + /// Gets the "amphora" emoji. + /// Description: Amphora. + /// + public const string Amphora = "\U0001F3FA"; + + /// + /// Gets the "anatomical_heart" emoji. + /// Description: Anatomical heart. + /// + public const string AnatomicalHeart = "\U0001FAC0"; + + /// + /// Gets the "anchor" emoji. + /// Description: Anchor. + /// + public const string Anchor = "\U00002693"; + + /// + /// Gets the "anger_symbol" emoji. + /// Description: Anger symbol. + /// + public const string AngerSymbol = "\U0001F4A2"; + + /// + /// Gets the "angry_face" emoji. + /// Description: Angry face. + /// + public const string AngryFace = "\U0001F620"; + + /// + /// Gets the "angry_face_with_horns" emoji. + /// Description: Angry face with horns. + /// + public const string AngryFaceWithHorns = "\U0001F47F"; + + /// + /// Gets the "anguished_face" emoji. + /// Description: Anguished face. + /// + public const string AnguishedFace = "\U0001F627"; + + /// + /// Gets the "ant" emoji. + /// Description: Ant. + /// + public const string Ant = "\U0001F41C"; + + /// + /// Gets the "antenna_bars" emoji. + /// Description: Antenna bars. + /// + public const string AntennaBars = "\U0001F4F6"; + + /// + /// Gets the "anxious_face_with_sweat" emoji. + /// Description: Anxious face with sweat. + /// + public const string AnxiousFaceWithSweat = "\U0001F630"; + + /// + /// Gets the "aquarius" emoji. + /// Description: Aquarius. + /// + public const string Aquarius = "\U00002652"; + + /// + /// Gets the "aries" emoji. + /// Description: Aries. + /// + public const string Aries = "\U00002648"; + + /// + /// Gets the "articulated_lorry" emoji. + /// Description: Articulated lorry. + /// + public const string ArticulatedLorry = "\U0001F69B"; + + /// + /// Gets the "artist_palette" emoji. + /// Description: Artist palette. + /// + public const string ArtistPalette = "\U0001F3A8"; + + /// + /// Gets the "astonished_face" emoji. + /// Description: Astonished face. + /// + public const string AstonishedFace = "\U0001F632"; + + /// + /// Gets the "atm_sign" emoji. + /// Description: ATM sign. + /// + public const string AtmSign = "\U0001F3E7"; + + /// + /// Gets the "atom_symbol" emoji. + /// Description: Atom symbol. + /// + public const string AtomSymbol = "\U0000269B"; + + /// + /// Gets the "automobile" emoji. + /// Description: Automobile. + /// + public const string Automobile = "\U0001F697"; + + /// + /// Gets the "auto_rickshaw" emoji. + /// Description: Auto rickshaw. + /// + public const string AutoRickshaw = "\U0001F6FA"; + + /// + /// Gets the "avocado" emoji. + /// Description: Avocado. + /// + public const string Avocado = "\U0001F951"; + + /// + /// Gets the "axe" emoji. + /// Description: Axe. + /// + public const string Axe = "\U0001FA93"; + + /// + /// Gets the "baby" emoji. + /// Description: Baby. + /// + public const string Baby = "\U0001F476"; + + /// + /// Gets the "baby_angel" emoji. + /// Description: Baby angel. + /// + public const string BabyAngel = "\U0001F47C"; + + /// + /// Gets the "baby_bottle" emoji. + /// Description: Baby bottle. + /// + public const string BabyBottle = "\U0001F37C"; + + /// + /// Gets the "baby_chick" emoji. + /// Description: Baby chick. + /// + public const string BabyChick = "\U0001F424"; + + /// + /// Gets the "baby_symbol" emoji. + /// Description: Baby symbol. + /// + public const string BabySymbol = "\U0001F6BC"; + + /// + /// Gets the "back_arrow" emoji. + /// Description: BACK arrow. + /// + public const string BackArrow = "\U0001F519"; + + /// + /// Gets the "backhand_index_pointing_down" emoji. + /// Description: Backhand index pointing down. + /// + public const string BackhandIndexPointingDown = "\U0001F447"; + + /// + /// Gets the "backhand_index_pointing_left" emoji. + /// Description: Backhand index pointing left. + /// + public const string BackhandIndexPointingLeft = "\U0001F448"; + + /// + /// Gets the "backhand_index_pointing_right" emoji. + /// Description: Backhand index pointing right. + /// + public const string BackhandIndexPointingRight = "\U0001F449"; + + /// + /// Gets the "backhand_index_pointing_up" emoji. + /// Description: Backhand index pointing up. + /// + public const string BackhandIndexPointingUp = "\U0001F446"; + + /// + /// Gets the "backpack" emoji. + /// Description: Backpack. + /// + public const string Backpack = "\U0001F392"; + + /// + /// Gets the "bacon" emoji. + /// Description: Bacon. + /// + public const string Bacon = "\U0001F953"; + + /// + /// Gets the "badger" emoji. + /// Description: Badger. + /// + public const string Badger = "\U0001F9A1"; + + /// + /// Gets the "badminton" emoji. + /// Description: Badminton. + /// + public const string Badminton = "\U0001F3F8"; + + /// + /// Gets the "bagel" emoji. + /// Description: Bagel. + /// + public const string Bagel = "\U0001F96F"; + + /// + /// Gets the "baggage_claim" emoji. + /// Description: Baggage claim. + /// + public const string BaggageClaim = "\U0001F6C4"; + + /// + /// Gets the "baguette_bread" emoji. + /// Description: Baguette bread. + /// + public const string BaguetteBread = "\U0001F956"; + + /// + /// Gets the "balance_scale" emoji. + /// Description: Balance scale. + /// + public const string BalanceScale = "\U00002696"; + + /// + /// Gets the "bald" emoji. + /// Description: Bald. + /// + public const string Bald = "\U0001F9B2"; + + /// + /// Gets the "ballet_shoes" emoji. + /// Description: Ballet shoes. + /// + public const string BalletShoes = "\U0001FA70"; + + /// + /// Gets the "balloon" emoji. + /// Description: Balloon. + /// + public const string Balloon = "\U0001F388"; + + /// + /// Gets the "ballot_box_with_ballot" emoji. + /// Description: Ballot box with ballot. + /// + public const string BallotBoxWithBallot = "\U0001F5F3"; + + /// + /// Gets the "banana" emoji. + /// Description: Banana. + /// + public const string Banana = "\U0001F34C"; + + /// + /// Gets the "banjo" emoji. + /// Description: Banjo. + /// + public const string Banjo = "\U0001FA95"; + + /// + /// Gets the "bank" emoji. + /// Description: Bank. + /// + public const string Bank = "\U0001F3E6"; + + /// + /// Gets the "barber_pole" emoji. + /// Description: Barber pole. + /// + public const string BarberPole = "\U0001F488"; + + /// + /// Gets the "bar_chart" emoji. + /// Description: Bar chart. + /// + public const string BarChart = "\U0001F4CA"; + + /// + /// Gets the "baseball" emoji. + /// Description: Baseball. + /// + public const string Baseball = "\U000026BE"; + + /// + /// Gets the "basket" emoji. + /// Description: Basket. + /// + public const string Basket = "\U0001F9FA"; + + /// + /// Gets the "basketball" emoji. + /// Description: Basketball. + /// + public const string Basketball = "\U0001F3C0"; + + /// + /// Gets the "bat" emoji. + /// Description: Bat. + /// + public const string Bat = "\U0001F987"; + + /// + /// Gets the "bathtub" emoji. + /// Description: Bathtub. + /// + public const string Bathtub = "\U0001F6C1"; + + /// + /// Gets the "battery" emoji. + /// Description: Battery. + /// + public const string Battery = "\U0001F50B"; + + /// + /// Gets the "b_button_blood_type" emoji. + /// Description: B button blood type. + /// + public const string BButtonBloodType = "\U0001F171"; + + /// + /// Gets the "beach_with_umbrella" emoji. + /// Description: Beach with umbrella. + /// + public const string BeachWithUmbrella = "\U0001F3D6"; + + /// + /// Gets the "beaming_face_with_smiling_eyes" emoji. + /// Description: Beaming face with smiling eyes. + /// + public const string BeamingFaceWithSmilingEyes = "\U0001F601"; + + /// + /// Gets the "bear" emoji. + /// Description: Bear. + /// + public const string Bear = "\U0001F43B"; + + /// + /// Gets the "beating_heart" emoji. + /// Description: Beating heart. + /// + public const string BeatingHeart = "\U0001F493"; + + /// + /// Gets the "beaver" emoji. + /// Description: Beaver. + /// + public const string Beaver = "\U0001F9AB"; + + /// + /// Gets the "bed" emoji. + /// Description: Bed. + /// + public const string Bed = "\U0001F6CF"; + + /// + /// Gets the "beer_mug" emoji. + /// Description: Beer mug. + /// + public const string BeerMug = "\U0001F37A"; + + /// + /// Gets the "beetle" emoji. + /// Description: Beetle. + /// + public const string Beetle = "\U0001FAB2"; + + /// + /// Gets the "bell" emoji. + /// Description: Bell. + /// + public const string Bell = "\U0001F514"; + + /// + /// Gets the "bellhop_bell" emoji. + /// Description: Bellhop bell. + /// + public const string BellhopBell = "\U0001F6CE"; + + /// + /// Gets the "bell_pepper" emoji. + /// Description: Bell pepper. + /// + public const string BellPepper = "\U0001FAD1"; + + /// + /// Gets the "bell_with_slash" emoji. + /// Description: Bell with slash. + /// + public const string BellWithSlash = "\U0001F515"; + + /// + /// Gets the "bento_box" emoji. + /// Description: Bento box. + /// + public const string BentoBox = "\U0001F371"; + + /// + /// Gets the "beverage_box" emoji. + /// Description: Beverage box. + /// + public const string BeverageBox = "\U0001F9C3"; + + /// + /// Gets the "bicycle" emoji. + /// Description: Bicycle. + /// + public const string Bicycle = "\U0001F6B2"; + + /// + /// Gets the "bikini" emoji. + /// Description: Bikini. + /// + public const string Bikini = "\U0001F459"; + + /// + /// Gets the "billed_cap" emoji. + /// Description: Billed cap. + /// + public const string BilledCap = "\U0001F9E2"; + + /// + /// Gets the "biohazard" emoji. + /// Description: Biohazard. + /// + public const string Biohazard = "\U00002623"; + + /// + /// Gets the "bird" emoji. + /// Description: Bird. + /// + public const string Bird = "\U0001F426"; + + /// + /// Gets the "birthday_cake" emoji. + /// Description: Birthday cake. + /// + public const string BirthdayCake = "\U0001F382"; + + /// + /// Gets the "bison" emoji. + /// Description: Bison. + /// + public const string Bison = "\U0001F9AC"; + + /// + /// Gets the "black_circle" emoji. + /// Description: Black circle. + /// + public const string BlackCircle = "\U000026AB"; + + /// + /// Gets the "black_flag" emoji. + /// Description: Black flag. + /// + public const string BlackFlag = "\U0001F3F4"; + + /// + /// Gets the "black_heart" emoji. + /// Description: Black heart. + /// + public const string BlackHeart = "\U0001F5A4"; + + /// + /// Gets the "black_large_square" emoji. + /// Description: Black large square. + /// + public const string BlackLargeSquare = "\U00002B1B"; + + /// + /// Gets the "black_medium_small_square" emoji. + /// Description: black medium small square. + /// + public const string BlackMediumSmallSquare = "\U000025FE"; + + /// + /// Gets the "black_medium_square" emoji. + /// Description: Black medium square. + /// + public const string BlackMediumSquare = "\U000025FC"; + + /// + /// Gets the "black_nib" emoji. + /// Description: Black nib. + /// + public const string BlackNib = "\U00002712"; + + /// + /// Gets the "black_small_square" emoji. + /// Description: Black small square. + /// + public const string BlackSmallSquare = "\U000025AA"; + + /// + /// Gets the "black_square_button" emoji. + /// Description: Black square button. + /// + public const string BlackSquareButton = "\U0001F532"; + + /// + /// Gets the "blossom" emoji. + /// Description: Blossom. + /// + public const string Blossom = "\U0001F33C"; + + /// + /// Gets the "blowfish" emoji. + /// Description: Blowfish. + /// + public const string Blowfish = "\U0001F421"; + + /// + /// Gets the "blueberries" emoji. + /// Description: Blueberries. + /// + public const string Blueberries = "\U0001FAD0"; + + /// + /// Gets the "blue_book" emoji. + /// Description: Blue book. + /// + public const string BlueBook = "\U0001F4D8"; + + /// + /// Gets the "blue_circle" emoji. + /// Description: Blue circle. + /// + public const string BlueCircle = "\U0001F535"; + + /// + /// Gets the "blue_heart" emoji. + /// Description: Blue heart. + /// + public const string BlueHeart = "\U0001F499"; + + /// + /// Gets the "blue_square" emoji. + /// Description: Blue square. + /// + public const string BlueSquare = "\U0001F7E6"; + + /// + /// Gets the "boar" emoji. + /// Description: Boar. + /// + public const string Boar = "\U0001F417"; + + /// + /// Gets the "bomb" emoji. + /// Description: Bomb. + /// + public const string Bomb = "\U0001F4A3"; + + /// + /// Gets the "bone" emoji. + /// Description: Bone. + /// + public const string Bone = "\U0001F9B4"; + + /// + /// Gets the "bookmark" emoji. + /// Description: Bookmark. + /// + public const string Bookmark = "\U0001F516"; + + /// + /// Gets the "bookmark_tabs" emoji. + /// Description: Bookmark tabs. + /// + public const string BookmarkTabs = "\U0001F4D1"; + + /// + /// Gets the "books" emoji. + /// Description: Books. + /// + public const string Books = "\U0001F4DA"; + + /// + /// Gets the "boomerang" emoji. + /// Description: Boomerang. + /// + public const string Boomerang = "\U0001FA83"; + + /// + /// Gets the "bottle_with_popping_cork" emoji. + /// Description: Bottle with popping cork. + /// + public const string BottleWithPoppingCork = "\U0001F37E"; + + /// + /// Gets the "bouquet" emoji. + /// Description: Bouquet. + /// + public const string Bouquet = "\U0001F490"; + + /// + /// Gets the "bow_and_arrow" emoji. + /// Description: Bow and arrow. + /// + public const string BowAndArrow = "\U0001F3F9"; + + /// + /// Gets the "bowling" emoji. + /// Description: Bowling. + /// + public const string Bowling = "\U0001F3B3"; + + /// + /// Gets the "bowl_with_spoon" emoji. + /// Description: Bowl with spoon. + /// + public const string BowlWithSpoon = "\U0001F963"; + + /// + /// Gets the "boxing_glove" emoji. + /// Description: Boxing glove. + /// + public const string BoxingGlove = "\U0001F94A"; + + /// + /// Gets the "boy" emoji. + /// Description: Boy. + /// + public const string Boy = "\U0001F466"; + + /// + /// Gets the "brain" emoji. + /// Description: Brain. + /// + public const string Brain = "\U0001F9E0"; + + /// + /// Gets the "bread" emoji. + /// Description: Bread. + /// + public const string Bread = "\U0001F35E"; + + /// + /// Gets the "breast_feeding" emoji. + /// Description: breast feeding. + /// + public const string BreastFeeding = "\U0001F931"; + + /// + /// Gets the "brick" emoji. + /// Description: Brick. + /// + public const string Brick = "\U0001F9F1"; + + /// + /// Gets the "bridge_at_night" emoji. + /// Description: Bridge at night. + /// + public const string BridgeAtNight = "\U0001F309"; + + /// + /// Gets the "briefcase" emoji. + /// Description: Briefcase. + /// + public const string Briefcase = "\U0001F4BC"; + + /// + /// Gets the "briefs" emoji. + /// Description: Briefs. + /// + public const string Briefs = "\U0001FA72"; + + /// + /// Gets the "bright_button" emoji. + /// Description: Bright button. + /// + public const string BrightButton = "\U0001F506"; + + /// + /// Gets the "broccoli" emoji. + /// Description: Broccoli. + /// + public const string Broccoli = "\U0001F966"; + + /// + /// Gets the "broken_heart" emoji. + /// Description: Broken heart. + /// + public const string BrokenHeart = "\U0001F494"; + + /// + /// Gets the "broom" emoji. + /// Description: Broom. + /// + public const string Broom = "\U0001F9F9"; + + /// + /// Gets the "brown_circle" emoji. + /// Description: Brown circle. + /// + public const string BrownCircle = "\U0001F7E4"; + + /// + /// Gets the "brown_heart" emoji. + /// Description: Brown heart. + /// + public const string BrownHeart = "\U0001F90E"; + + /// + /// Gets the "brown_square" emoji. + /// Description: Brown square. + /// + public const string BrownSquare = "\U0001F7EB"; + + /// + /// Gets the "bubble_tea" emoji. + /// Description: Bubble tea. + /// + public const string BubbleTea = "\U0001F9CB"; + + /// + /// Gets the "bucket" emoji. + /// Description: Bucket. + /// + public const string Bucket = "\U0001FAA3"; + + /// + /// Gets the "bug" emoji. + /// Description: Bug. + /// + public const string Bug = "\U0001F41B"; + + /// + /// Gets the "building_construction" emoji. + /// Description: Building construction. + /// + public const string BuildingConstruction = "\U0001F3D7"; + + /// + /// Gets the "bullet_train" emoji. + /// Description: Bullet train. + /// + public const string BulletTrain = "\U0001F685"; + + /// + /// Gets the "bullseye" emoji. + /// Description: Bullseye. + /// + public const string Bullseye = "\U0001F3AF"; + + /// + /// Gets the "burrito" emoji. + /// Description: Burrito. + /// + public const string Burrito = "\U0001F32F"; + + /// + /// Gets the "bus" emoji. + /// Description: Bus. + /// + public const string Bus = "\U0001F68C"; + + /// + /// Gets the "bus_stop" emoji. + /// Description: Bus stop. + /// + public const string BusStop = "\U0001F68F"; + + /// + /// Gets the "bust_in_silhouette" emoji. + /// Description: Bust in silhouette. + /// + public const string BustInSilhouette = "\U0001F464"; + + /// + /// Gets the "busts_in_silhouette" emoji. + /// Description: Busts in silhouette. + /// + public const string BustsInSilhouette = "\U0001F465"; + + /// + /// Gets the "butter" emoji. + /// Description: Butter. + /// + public const string Butter = "\U0001F9C8"; + + /// + /// Gets the "butterfly" emoji. + /// Description: Butterfly. + /// + public const string Butterfly = "\U0001F98B"; + + /// + /// Gets the "cactus" emoji. + /// Description: Cactus. + /// + public const string Cactus = "\U0001F335"; + + /// + /// Gets the "calendar" emoji. + /// Description: Calendar. + /// + public const string Calendar = "\U0001F4C5"; + + /// + /// Gets the "call_me_hand" emoji. + /// Description: Call me hand. + /// + public const string CallMeHand = "\U0001F919"; + + /// + /// Gets the "camel" emoji. + /// Description: Camel. + /// + public const string Camel = "\U0001F42A"; + + /// + /// Gets the "camera" emoji. + /// Description: Camera. + /// + public const string Camera = "\U0001F4F7"; + + /// + /// Gets the "camera_with_flash" emoji. + /// Description: Camera with flash. + /// + public const string CameraWithFlash = "\U0001F4F8"; + + /// + /// Gets the "camping" emoji. + /// Description: Camping. + /// + public const string Camping = "\U0001F3D5"; + + /// + /// Gets the "cancer" emoji. + /// Description: Cancer. + /// + public const string Cancer = "\U0000264B"; + + /// + /// Gets the "candle" emoji. + /// Description: Candle. + /// + public const string Candle = "\U0001F56F"; + + /// + /// Gets the "candy" emoji. + /// Description: Candy. + /// + public const string Candy = "\U0001F36C"; + + /// + /// Gets the "canned_food" emoji. + /// Description: Canned food. + /// + public const string CannedFood = "\U0001F96B"; + + /// + /// Gets the "canoe" emoji. + /// Description: Canoe. + /// + public const string Canoe = "\U0001F6F6"; + + /// + /// Gets the "capricorn" emoji. + /// Description: Capricorn. + /// + public const string Capricorn = "\U00002651"; + + /// + /// Gets the "card_file_box" emoji. + /// Description: Card file box. + /// + public const string CardFileBox = "\U0001F5C3"; + + /// + /// Gets the "card_index" emoji. + /// Description: Card index. + /// + public const string CardIndex = "\U0001F4C7"; + + /// + /// Gets the "card_index_dividers" emoji. + /// Description: Card index dividers. + /// + public const string CardIndexDividers = "\U0001F5C2"; + + /// + /// Gets the "carousel_horse" emoji. + /// Description: Carousel horse. + /// + public const string CarouselHorse = "\U0001F3A0"; + + /// + /// Gets the "carpentry_saw" emoji. + /// Description: Carpentry saw. + /// + public const string CarpentrySaw = "\U0001FA9A"; + + /// + /// Gets the "carp_streamer" emoji. + /// Description: Carp streamer. + /// + public const string CarpStreamer = "\U0001F38F"; + + /// + /// Gets the "carrot" emoji. + /// Description: Carrot. + /// + public const string Carrot = "\U0001F955"; + + /// + /// Gets the "castle" emoji. + /// Description: Castle. + /// + public const string Castle = "\U0001F3F0"; + + /// + /// Gets the "cat" emoji. + /// Description: Cat. + /// + public const string Cat = "\U0001F408"; + + /// + /// Gets the "cat_face" emoji. + /// Description: Cat face. + /// + public const string CatFace = "\U0001F431"; + + /// + /// Gets the "cat_with_tears_of_joy" emoji. + /// Description: Cat with tears of joy. + /// + public const string CatWithTearsOfJoy = "\U0001F639"; + + /// + /// Gets the "cat_with_wry_smile" emoji. + /// Description: Cat with wry smile. + /// + public const string CatWithWrySmile = "\U0001F63C"; + + /// + /// Gets the "chains" emoji. + /// Description: Chains. + /// + public const string Chains = "\U000026D3"; + + /// + /// Gets the "chair" emoji. + /// Description: Chair. + /// + public const string Chair = "\U0001FA91"; + + /// + /// Gets the "chart_decreasing" emoji. + /// Description: Chart decreasing. + /// + public const string ChartDecreasing = "\U0001F4C9"; + + /// + /// Gets the "chart_increasing" emoji. + /// Description: Chart increasing. + /// + public const string ChartIncreasing = "\U0001F4C8"; + + /// + /// Gets the "chart_increasing_with_yen" emoji. + /// Description: Chart increasing with yen. + /// + public const string ChartIncreasingWithYen = "\U0001F4B9"; + + /// + /// Gets the "check_box_with_check" emoji. + /// Description: Check box with check. + /// + public const string CheckBoxWithCheck = "\U00002611"; + + /// + /// Gets the "check_mark" emoji. + /// Description: Check mark. + /// + public const string CheckMark = "\U00002714"; + + /// + /// Gets the "check_mark_button" emoji. + /// Description: Check mark button. + /// + public const string CheckMarkButton = "\U00002705"; + + /// + /// Gets the "cheese_wedge" emoji. + /// Description: Cheese wedge. + /// + public const string CheeseWedge = "\U0001F9C0"; + + /// + /// Gets the "chequered_flag" emoji. + /// Description: Chequered flag. + /// + public const string ChequeredFlag = "\U0001F3C1"; + + /// + /// Gets the "cherries" emoji. + /// Description: Cherries. + /// + public const string Cherries = "\U0001F352"; + + /// + /// Gets the "cherry_blossom" emoji. + /// Description: Cherry blossom. + /// + public const string CherryBlossom = "\U0001F338"; + + /// + /// Gets the "chess_pawn" emoji. + /// Description: Chess pawn. + /// + public const string ChessPawn = "\U0000265F"; + + /// + /// Gets the "chestnut" emoji. + /// Description: Chestnut. + /// + public const string Chestnut = "\U0001F330"; + + /// + /// Gets the "chicken" emoji. + /// Description: Chicken. + /// + public const string Chicken = "\U0001F414"; + + /// + /// Gets the "child" emoji. + /// Description: Child. + /// + public const string Child = "\U0001F9D2"; + + /// + /// Gets the "children_crossing" emoji. + /// Description: Children crossing. + /// + public const string ChildrenCrossing = "\U0001F6B8"; + + /// + /// Gets the "chipmunk" emoji. + /// Description: Chipmunk. + /// + public const string Chipmunk = "\U0001F43F"; + + /// + /// Gets the "chocolate_bar" emoji. + /// Description: Chocolate bar. + /// + public const string ChocolateBar = "\U0001F36B"; + + /// + /// Gets the "chopsticks" emoji. + /// Description: Chopsticks. + /// + public const string Chopsticks = "\U0001F962"; + + /// + /// Gets the "christmas_tree" emoji. + /// Description: Christmas tree. + /// + public const string ChristmasTree = "\U0001F384"; + + /// + /// Gets the "church" emoji. + /// Description: Church. + /// + public const string Church = "\U000026EA"; + + /// + /// Gets the "cigarette" emoji. + /// Description: Cigarette. + /// + public const string Cigarette = "\U0001F6AC"; + + /// + /// Gets the "cinema" emoji. + /// Description: Cinema. + /// + public const string Cinema = "\U0001F3A6"; + + /// + /// Gets the "circled_m" emoji. + /// Description: Circled M. + /// + public const string CircledM = "\U000024C2"; + + /// + /// Gets the "circus_tent" emoji. + /// Description: Circus tent. + /// + public const string CircusTent = "\U0001F3AA"; + + /// + /// Gets the "cityscape" emoji. + /// Description: Cityscape. + /// + public const string Cityscape = "\U0001F3D9"; + + /// + /// Gets the "cityscape_at_dusk" emoji. + /// Description: Cityscape at dusk. + /// + public const string CityscapeAtDusk = "\U0001F306"; + + /// + /// Gets the "clamp" emoji. + /// Description: Clamp. + /// + public const string Clamp = "\U0001F5DC"; + + /// + /// Gets the "clapper_board" emoji. + /// Description: Clapper board. + /// + public const string ClapperBoard = "\U0001F3AC"; + + /// + /// Gets the "clapping_hands" emoji. + /// Description: Clapping hands. + /// + public const string ClappingHands = "\U0001F44F"; + + /// + /// Gets the "classical_building" emoji. + /// Description: Classical building. + /// + public const string ClassicalBuilding = "\U0001F3DB"; + + /// + /// Gets the "cl_button" emoji. + /// Description: CL button. + /// + public const string ClButton = "\U0001F191"; + + /// + /// Gets the "clinking_beer_mugs" emoji. + /// Description: Clinking beer mugs. + /// + public const string ClinkingBeerMugs = "\U0001F37B"; + + /// + /// Gets the "clinking_glasses" emoji. + /// Description: Clinking glasses. + /// + public const string ClinkingGlasses = "\U0001F942"; + + /// + /// Gets the "clipboard" emoji. + /// Description: Clipboard. + /// + public const string Clipboard = "\U0001F4CB"; + + /// + /// Gets the "clockwise_vertical_arrows" emoji. + /// Description: Clockwise vertical arrows. + /// + public const string ClockwiseVerticalArrows = "\U0001F503"; + + /// + /// Gets the "closed_book" emoji. + /// Description: Closed book. + /// + public const string ClosedBook = "\U0001F4D5"; + + /// + /// Gets the "closed_mailbox_with_lowered_flag" emoji. + /// Description: Closed mailbox with lowered flag. + /// + public const string ClosedMailboxWithLoweredFlag = "\U0001F4EA"; + + /// + /// Gets the "closed_mailbox_with_raised_flag" emoji. + /// Description: Closed mailbox with raised flag. + /// + public const string ClosedMailboxWithRaisedFlag = "\U0001F4EB"; + + /// + /// Gets the "closed_umbrella" emoji. + /// Description: Closed umbrella. + /// + public const string ClosedUmbrella = "\U0001F302"; + + /// + /// Gets the "cloud" emoji. + /// Description: Cloud. + /// + public const string Cloud = "\U00002601"; + + /// + /// Gets the "cloud_with_lightning" emoji. + /// Description: Cloud with lightning. + /// + public const string CloudWithLightning = "\U0001F329"; + + /// + /// Gets the "cloud_with_lightning_and_rain" emoji. + /// Description: Cloud with lightning and rain. + /// + public const string CloudWithLightningAndRain = "\U000026C8"; + + /// + /// Gets the "cloud_with_rain" emoji. + /// Description: Cloud with rain. + /// + public const string CloudWithRain = "\U0001F327"; + + /// + /// Gets the "cloud_with_snow" emoji. + /// Description: Cloud with snow. + /// + public const string CloudWithSnow = "\U0001F328"; + + /// + /// Gets the "clown_face" emoji. + /// Description: Clown face. + /// + public const string ClownFace = "\U0001F921"; + + /// + /// Gets the "club_suit" emoji. + /// Description: Club suit. + /// + public const string ClubSuit = "\U00002663"; + + /// + /// Gets the "clutch_bag" emoji. + /// Description: Clutch bag. + /// + public const string ClutchBag = "\U0001F45D"; + + /// + /// Gets the "coat" emoji. + /// Description: Coat. + /// + public const string Coat = "\U0001F9E5"; + + /// + /// Gets the "cockroach" emoji. + /// Description: Cockroach. + /// + public const string Cockroach = "\U0001FAB3"; + + /// + /// Gets the "cocktail_glass" emoji. + /// Description: Cocktail glass. + /// + public const string CocktailGlass = "\U0001F378"; + + /// + /// Gets the "coconut" emoji. + /// Description: Coconut. + /// + public const string Coconut = "\U0001F965"; + + /// + /// Gets the "coffin" emoji. + /// Description: Coffin. + /// + public const string Coffin = "\U000026B0"; + + /// + /// Gets the "coin" emoji. + /// Description: Coin. + /// + public const string Coin = "\U0001FA99"; + + /// + /// Gets the "cold_face" emoji. + /// Description: Cold face. + /// + public const string ColdFace = "\U0001F976"; + + /// + /// Gets the "collision" emoji. + /// Description: Collision. + /// + public const string Collision = "\U0001F4A5"; + + /// + /// Gets the "comet" emoji. + /// Description: Comet. + /// + public const string Comet = "\U00002604"; + + /// + /// Gets the "compass" emoji. + /// Description: Compass. + /// + public const string Compass = "\U0001F9ED"; + + /// + /// Gets the "computer_disk" emoji. + /// Description: Computer disk. + /// + public const string ComputerDisk = "\U0001F4BD"; + + /// + /// Gets the "computer_mouse" emoji. + /// Description: Computer mouse. + /// + public const string ComputerMouse = "\U0001F5B1"; + + /// + /// Gets the "confetti_ball" emoji. + /// Description: Confetti ball. + /// + public const string ConfettiBall = "\U0001F38A"; + + /// + /// Gets the "confounded_face" emoji. + /// Description: Confounded face. + /// + public const string ConfoundedFace = "\U0001F616"; + + /// + /// Gets the "confused_face" emoji. + /// Description: Confused face. + /// + public const string ConfusedFace = "\U0001F615"; + + /// + /// Gets the "construction" emoji. + /// Description: Construction. + /// + public const string Construction = "\U0001F6A7"; + + /// + /// Gets the "construction_worker" emoji. + /// Description: Construction worker. + /// + public const string ConstructionWorker = "\U0001F477"; + + /// + /// Gets the "control_knobs" emoji. + /// Description: Control knobs. + /// + public const string ControlKnobs = "\U0001F39B"; + + /// + /// Gets the "convenience_store" emoji. + /// Description: Convenience store. + /// + public const string ConvenienceStore = "\U0001F3EA"; + + /// + /// Gets the "cooked_rice" emoji. + /// Description: Cooked rice. + /// + public const string CookedRice = "\U0001F35A"; + + /// + /// Gets the "cookie" emoji. + /// Description: Cookie. + /// + public const string Cookie = "\U0001F36A"; + + /// + /// Gets the "cooking" emoji. + /// Description: Cooking. + /// + public const string Cooking = "\U0001F373"; + + /// + /// Gets the "cool_button" emoji. + /// Description: COOL button. + /// + public const string CoolButton = "\U0001F192"; + + /// + /// Gets the "copyright" emoji. + /// Description: Copyright. + /// + public const string Copyright = "\U000000A9"; + + /// + /// Gets the "couch_and_lamp" emoji. + /// Description: Couch and lamp. + /// + public const string CouchAndLamp = "\U0001F6CB"; + + /// + /// Gets the "counterclockwise_arrows_button" emoji. + /// Description: Counterclockwise arrows button. + /// + public const string CounterclockwiseArrowsButton = "\U0001F504"; + + /// + /// Gets the "couple_with_heart" emoji. + /// Description: Couple with heart. + /// + public const string CoupleWithHeart = "\U0001F491"; + + /// + /// Gets the "cow" emoji. + /// Description: Cow. + /// + public const string Cow = "\U0001F404"; + + /// + /// Gets the "cowboy_hat_face" emoji. + /// Description: Cowboy hat face. + /// + public const string CowboyHatFace = "\U0001F920"; + + /// + /// Gets the "cow_face" emoji. + /// Description: Cow face. + /// + public const string CowFace = "\U0001F42E"; + + /// + /// Gets the "crab" emoji. + /// Description: Crab. + /// + public const string Crab = "\U0001F980"; + + /// + /// Gets the "crayon" emoji. + /// Description: Crayon. + /// + public const string Crayon = "\U0001F58D"; + + /// + /// Gets the "credit_card" emoji. + /// Description: Credit card. + /// + public const string CreditCard = "\U0001F4B3"; + + /// + /// Gets the "crescent_moon" emoji. + /// Description: Crescent moon. + /// + public const string CrescentMoon = "\U0001F319"; + + /// + /// Gets the "cricket" emoji. + /// Description: Cricket. + /// + public const string Cricket = "\U0001F997"; + + /// + /// Gets the "cricket_game" emoji. + /// Description: Cricket game. + /// + public const string CricketGame = "\U0001F3CF"; + + /// + /// Gets the "crocodile" emoji. + /// Description: Crocodile. + /// + public const string Crocodile = "\U0001F40A"; + + /// + /// Gets the "croissant" emoji. + /// Description: Croissant. + /// + public const string Croissant = "\U0001F950"; + + /// + /// Gets the "crossed_fingers" emoji. + /// Description: Crossed fingers. + /// + public const string CrossedFingers = "\U0001F91E"; + + /// + /// Gets the "crossed_flags" emoji. + /// Description: Crossed flags. + /// + public const string CrossedFlags = "\U0001F38C"; + + /// + /// Gets the "crossed_swords" emoji. + /// Description: Crossed swords. + /// + public const string CrossedSwords = "\U00002694"; + + /// + /// Gets the "cross_mark" emoji. + /// Description: Cross mark. + /// + public const string CrossMark = "\U0000274C"; + + /// + /// Gets the "cross_mark_button" emoji. + /// Description: Cross mark button. + /// + public const string CrossMarkButton = "\U0000274E"; + + /// + /// Gets the "crown" emoji. + /// Description: Crown. + /// + public const string Crown = "\U0001F451"; + + /// + /// Gets the "crying_cat" emoji. + /// Description: Crying cat. + /// + public const string CryingCat = "\U0001F63F"; + + /// + /// Gets the "crying_face" emoji. + /// Description: Crying face. + /// + public const string CryingFace = "\U0001F622"; + + /// + /// Gets the "crystal_ball" emoji. + /// Description: Crystal ball. + /// + public const string CrystalBall = "\U0001F52E"; + + /// + /// Gets the "cucumber" emoji. + /// Description: Cucumber. + /// + public const string Cucumber = "\U0001F952"; + + /// + /// Gets the "cupcake" emoji. + /// Description: Cupcake. + /// + public const string Cupcake = "\U0001F9C1"; + + /// + /// Gets the "cup_with_straw" emoji. + /// Description: Cup with straw. + /// + public const string CupWithStraw = "\U0001F964"; + + /// + /// Gets the "curling_stone" emoji. + /// Description: Curling stone. + /// + public const string CurlingStone = "\U0001F94C"; + + /// + /// Gets the "curly_hair" emoji. + /// Description: Curly hair. + /// + public const string CurlyHair = "\U0001F9B1"; + + /// + /// Gets the "curly_loop" emoji. + /// Description: Curly loop. + /// + public const string CurlyLoop = "\U000027B0"; + + /// + /// Gets the "currency_exchange" emoji. + /// Description: Currency exchange. + /// + public const string CurrencyExchange = "\U0001F4B1"; + + /// + /// Gets the "curry_rice" emoji. + /// Description: Curry rice. + /// + public const string CurryRice = "\U0001F35B"; + + /// + /// Gets the "custard" emoji. + /// Description: Custard. + /// + public const string Custard = "\U0001F36E"; + + /// + /// Gets the "customs" emoji. + /// Description: Customs. + /// + public const string Customs = "\U0001F6C3"; + + /// + /// Gets the "cut_of_meat" emoji. + /// Description: Cut of meat. + /// + public const string CutOfMeat = "\U0001F969"; + + /// + /// Gets the "cyclone" emoji. + /// Description: Cyclone. + /// + public const string Cyclone = "\U0001F300"; + + /// + /// Gets the "dagger" emoji. + /// Description: Dagger. + /// + public const string Dagger = "\U0001F5E1"; + + /// + /// Gets the "dango" emoji. + /// Description: Dango. + /// + public const string Dango = "\U0001F361"; + + /// + /// Gets the "dashing_away" emoji. + /// Description: Dashing away. + /// + public const string DashingAway = "\U0001F4A8"; + + /// + /// Gets the "deaf_person" emoji. + /// Description: Deaf person. + /// + public const string DeafPerson = "\U0001F9CF"; + + /// + /// Gets the "deciduous_tree" emoji. + /// Description: Deciduous tree. + /// + public const string DeciduousTree = "\U0001F333"; + + /// + /// Gets the "deer" emoji. + /// Description: Deer. + /// + public const string Deer = "\U0001F98C"; + + /// + /// Gets the "delivery_truck" emoji. + /// Description: Delivery truck. + /// + public const string DeliveryTruck = "\U0001F69A"; + + /// + /// Gets the "department_store" emoji. + /// Description: Department store. + /// + public const string DepartmentStore = "\U0001F3EC"; + + /// + /// Gets the "derelict_house" emoji. + /// Description: Derelict house. + /// + public const string DerelictHouse = "\U0001F3DA"; + + /// + /// Gets the "desert" emoji. + /// Description: Desert. + /// + public const string Desert = "\U0001F3DC"; + + /// + /// Gets the "desert_island" emoji. + /// Description: Desert island. + /// + public const string DesertIsland = "\U0001F3DD"; + + /// + /// Gets the "desktop_computer" emoji. + /// Description: Desktop computer. + /// + public const string DesktopComputer = "\U0001F5A5"; + + /// + /// Gets the "detective" emoji. + /// Description: Detective. + /// + public const string Detective = "\U0001F575"; + + /// + /// Gets the "diamond_suit" emoji. + /// Description: Diamond suit. + /// + public const string DiamondSuit = "\U00002666"; + + /// + /// Gets the "diamond_with_a_dot" emoji. + /// Description: Diamond with a dot. + /// + public const string DiamondWithADot = "\U0001F4A0"; + + /// + /// Gets the "dim_button" emoji. + /// Description: Dim button. + /// + public const string DimButton = "\U0001F505"; + + /// + /// Gets the "disappointed_face" emoji. + /// Description: Disappointed face. + /// + public const string DisappointedFace = "\U0001F61E"; + + /// + /// Gets the "disguised_face" emoji. + /// Description: Disguised face. + /// + public const string DisguisedFace = "\U0001F978"; + + /// + /// Gets the "divide" emoji. + /// Description: Divide. + /// + public const string Divide = "\U00002797"; + + /// + /// Gets the "diving_mask" emoji. + /// Description: Diving mask. + /// + public const string DivingMask = "\U0001F93F"; + + /// + /// Gets the "diya_lamp" emoji. + /// Description: Diya lamp. + /// + public const string DiyaLamp = "\U0001FA94"; + + /// + /// Gets the "dizzy" emoji. + /// Description: Dizzy. + /// + public const string Dizzy = "\U0001F4AB"; + + /// + /// Gets the "dna" emoji. + /// Description: Dna. + /// + public const string Dna = "\U0001F9EC"; + + /// + /// Gets the "dodo" emoji. + /// Description: Dodo. + /// + public const string Dodo = "\U0001F9A4"; + + /// + /// Gets the "dog" emoji. + /// Description: Dog. + /// + public const string Dog = "\U0001F415"; + + /// + /// Gets the "dog_face" emoji. + /// Description: Dog face. + /// + public const string DogFace = "\U0001F436"; + + /// + /// Gets the "dollar_banknote" emoji. + /// Description: Dollar banknote. + /// + public const string DollarBanknote = "\U0001F4B5"; + + /// + /// Gets the "dolphin" emoji. + /// Description: Dolphin. + /// + public const string Dolphin = "\U0001F42C"; + + /// + /// Gets the "door" emoji. + /// Description: Door. + /// + public const string Door = "\U0001F6AA"; + + /// + /// Gets the "dotted_six_pointed_star" emoji. + /// Description: dotted six pointed star. + /// + public const string DottedSixPointedStar = "\U0001F52F"; + + /// + /// Gets the "double_curly_loop" emoji. + /// Description: Double curly loop. + /// + public const string DoubleCurlyLoop = "\U000027BF"; + + /// + /// Gets the "double_exclamation_mark" emoji. + /// Description: Double exclamation mark. + /// + public const string DoubleExclamationMark = "\U0000203C"; + + /// + /// Gets the "doughnut" emoji. + /// Description: Doughnut. + /// + public const string Doughnut = "\U0001F369"; + + /// + /// Gets the "dove" emoji. + /// Description: Dove. + /// + public const string Dove = "\U0001F54A"; + + /// + /// Gets the "down_arrow" emoji. + /// Description: Down arrow. + /// + public const string DownArrow = "\U00002B07"; + + /// + /// Gets the "downcast_face_with_sweat" emoji. + /// Description: Downcast face with sweat. + /// + public const string DowncastFaceWithSweat = "\U0001F613"; + + /// + /// Gets the "down_left_arrow" emoji. + /// Description: down left arrow. + /// + public const string DownLeftArrow = "\U00002199"; + + /// + /// Gets the "down_right_arrow" emoji. + /// Description: down right arrow. + /// + public const string DownRightArrow = "\U00002198"; + + /// + /// Gets the "downwards_button" emoji. + /// Description: Downwards button. + /// + public const string DownwardsButton = "\U0001F53D"; + + /// + /// Gets the "dragon" emoji. + /// Description: Dragon. + /// + public const string Dragon = "\U0001F409"; + + /// + /// Gets the "dragon_face" emoji. + /// Description: Dragon face. + /// + public const string DragonFace = "\U0001F432"; + + /// + /// Gets the "dress" emoji. + /// Description: Dress. + /// + public const string Dress = "\U0001F457"; + + /// + /// Gets the "drooling_face" emoji. + /// Description: Drooling face. + /// + public const string DroolingFace = "\U0001F924"; + + /// + /// Gets the "droplet" emoji. + /// Description: Droplet. + /// + public const string Droplet = "\U0001F4A7"; + + /// + /// Gets the "drop_of_blood" emoji. + /// Description: Drop of blood. + /// + public const string DropOfBlood = "\U0001FA78"; + + /// + /// Gets the "drum" emoji. + /// Description: Drum. + /// + public const string Drum = "\U0001F941"; + + /// + /// Gets the "duck" emoji. + /// Description: Duck. + /// + public const string Duck = "\U0001F986"; + + /// + /// Gets the "dumpling" emoji. + /// Description: Dumpling. + /// + public const string Dumpling = "\U0001F95F"; + + /// + /// Gets the "dvd" emoji. + /// Description: Dvd. + /// + public const string Dvd = "\U0001F4C0"; + + /// + /// Gets the "eagle" emoji. + /// Description: Eagle. + /// + public const string Eagle = "\U0001F985"; + + /// + /// Gets the "ear" emoji. + /// Description: Ear. + /// + public const string Ear = "\U0001F442"; + + /// + /// Gets the "ear_of_corn" emoji. + /// Description: Ear of corn. + /// + public const string EarOfCorn = "\U0001F33D"; + + /// + /// Gets the "ear_with_hearing_aid" emoji. + /// Description: Ear with hearing aid. + /// + public const string EarWithHearingAid = "\U0001F9BB"; + + /// + /// Gets the "egg" emoji. + /// Description: Egg. + /// + public const string Egg = "\U0001F95A"; + + /// + /// Gets the "eggplant" emoji. + /// Description: Eggplant. + /// + public const string Eggplant = "\U0001F346"; + + /// + /// Gets the "eight_o_clock" emoji. + /// Description: Eight o clock. + /// + public const string EightOClock = "\U0001F557"; + + /// + /// Gets the "eight_pointed_star" emoji. + /// Description: eight pointed star. + /// + public const string EightPointedStar = "\U00002734"; + + /// + /// Gets the "eight_spoked_asterisk" emoji. + /// Description: eight spoked asterisk. + /// + public const string EightSpokedAsterisk = "\U00002733"; + + /// + /// Gets the "eight_thirty" emoji. + /// Description: eight thirty. + /// + public const string EightThirty = "\U0001F563"; + + /// + /// Gets the "eject_button" emoji. + /// Description: Eject button. + /// + public const string EjectButton = "\U000023CF"; + + /// + /// Gets the "electric_plug" emoji. + /// Description: Electric plug. + /// + public const string ElectricPlug = "\U0001F50C"; + + /// + /// Gets the "elephant" emoji. + /// Description: Elephant. + /// + public const string Elephant = "\U0001F418"; + + /// + /// Gets the "elevator" emoji. + /// Description: Elevator. + /// + public const string Elevator = "\U0001F6D7"; + + /// + /// Gets the "eleven_o_clock" emoji. + /// Description: Eleven o clock. + /// + public const string ElevenOClock = "\U0001F55A"; + + /// + /// Gets the "eleven_thirty" emoji. + /// Description: eleven thirty. + /// + public const string ElevenThirty = "\U0001F566"; + + /// + /// Gets the "elf" emoji. + /// Description: Elf. + /// + public const string Elf = "\U0001F9DD"; + + /// + /// Gets the "e_mail" emoji. + /// Description: e mail. + /// + public const string EMail = "\U0001F4E7"; + + /// + /// Gets the "end_arrow" emoji. + /// Description: END arrow. + /// + public const string EndArrow = "\U0001F51A"; + + /// + /// Gets the "envelope" emoji. + /// Description: Envelope. + /// + public const string Envelope = "\U00002709"; + + /// + /// Gets the "envelope_with_arrow" emoji. + /// Description: Envelope with arrow. + /// + public const string EnvelopeWithArrow = "\U0001F4E9"; + + /// + /// Gets the "euro_banknote" emoji. + /// Description: Euro banknote. + /// + public const string EuroBanknote = "\U0001F4B6"; + + /// + /// Gets the "evergreen_tree" emoji. + /// Description: Evergreen tree. + /// + public const string EvergreenTree = "\U0001F332"; + + /// + /// Gets the "ewe" emoji. + /// Description: Ewe. + /// + public const string Ewe = "\U0001F411"; + + /// + /// Gets the "exclamation_question_mark" emoji. + /// Description: Exclamation question mark. + /// + public const string ExclamationQuestionMark = "\U00002049"; + + /// + /// Gets the "exploding_head" emoji. + /// Description: Exploding head. + /// + public const string ExplodingHead = "\U0001F92F"; + + /// + /// Gets the "expressionless_face" emoji. + /// Description: Expressionless face. + /// + public const string ExpressionlessFace = "\U0001F611"; + + /// + /// Gets the "eye" emoji. + /// Description: Eye. + /// + public const string Eye = "\U0001F441"; + + /// + /// Gets the "eyes" emoji. + /// Description: Eyes. + /// + public const string Eyes = "\U0001F440"; + + /// + /// Gets the "face_blowing_a_kiss" emoji. + /// Description: Face blowing a kiss. + /// + public const string FaceBlowingAKiss = "\U0001F618"; + + /// + /// Gets the "face_savoring_food" emoji. + /// Description: Face savoring food. + /// + public const string FaceSavoringFood = "\U0001F60B"; + + /// + /// Gets the "face_screaming_in_fear" emoji. + /// Description: Face screaming in fear. + /// + public const string FaceScreamingInFear = "\U0001F631"; + + /// + /// Gets the "face_vomiting" emoji. + /// Description: Face vomiting. + /// + public const string FaceVomiting = "\U0001F92E"; + + /// + /// Gets the "face_with_hand_over_mouth" emoji. + /// Description: Face with hand over mouth. + /// + public const string FaceWithHandOverMouth = "\U0001F92D"; + + /// + /// Gets the "face_with_head_bandage" emoji. + /// Description: face with head bandage. + /// + public const string FaceWithHeadBandage = "\U0001F915"; + + /// + /// Gets the "face_with_medical_mask" emoji. + /// Description: Face with medical mask. + /// + public const string FaceWithMedicalMask = "\U0001F637"; + + /// + /// Gets the "face_with_monocle" emoji. + /// Description: Face with monocle. + /// + public const string FaceWithMonocle = "\U0001F9D0"; + + /// + /// Gets the "face_with_open_mouth" emoji. + /// Description: Face with open mouth. + /// + public const string FaceWithOpenMouth = "\U0001F62E"; + + /// + /// Gets the "face_without_mouth" emoji. + /// Description: Face without mouth. + /// + public const string FaceWithoutMouth = "\U0001F636"; + + /// + /// Gets the "face_with_raised_eyebrow" emoji. + /// Description: Face with raised eyebrow. + /// + public const string FaceWithRaisedEyebrow = "\U0001F928"; + + /// + /// Gets the "face_with_rolling_eyes" emoji. + /// Description: Face with rolling eyes. + /// + public const string FaceWithRollingEyes = "\U0001F644"; + + /// + /// Gets the "face_with_steam_from_nose" emoji. + /// Description: Face with steam from nose. + /// + public const string FaceWithSteamFromNose = "\U0001F624"; + + /// + /// Gets the "face_with_symbols_on_mouth" emoji. + /// Description: Face with symbols on mouth. + /// + public const string FaceWithSymbolsOnMouth = "\U0001F92C"; + + /// + /// Gets the "face_with_tears_of_joy" emoji. + /// Description: Face with tears of joy. + /// + public const string FaceWithTearsOfJoy = "\U0001F602"; + + /// + /// Gets the "face_with_thermometer" emoji. + /// Description: Face with thermometer. + /// + public const string FaceWithThermometer = "\U0001F912"; + + /// + /// Gets the "face_with_tongue" emoji. + /// Description: Face with tongue. + /// + public const string FaceWithTongue = "\U0001F61B"; + + /// + /// Gets the "factory" emoji. + /// Description: Factory. + /// + public const string Factory = "\U0001F3ED"; + + /// + /// Gets the "fairy" emoji. + /// Description: Fairy. + /// + public const string Fairy = "\U0001F9DA"; + + /// + /// Gets the "falafel" emoji. + /// Description: Falafel. + /// + public const string Falafel = "\U0001F9C6"; + + /// + /// Gets the "fallen_leaf" emoji. + /// Description: Fallen leaf. + /// + public const string FallenLeaf = "\U0001F342"; + + /// + /// Gets the "family" emoji. + /// Description: Family. + /// + public const string Family = "\U0001F46A"; + + /// + /// Gets the "fast_down_button" emoji. + /// Description: Fast down button. + /// + public const string FastDownButton = "\U000023EC"; + + /// + /// Gets the "fast_forward_button" emoji. + /// Description: fast forward button. + /// + public const string FastForwardButton = "\U000023E9"; + + /// + /// Gets the "fast_reverse_button" emoji. + /// Description: Fast reverse button. + /// + public const string FastReverseButton = "\U000023EA"; + + /// + /// Gets the "fast_up_button" emoji. + /// Description: Fast up button. + /// + public const string FastUpButton = "\U000023EB"; + + /// + /// Gets the "fax_machine" emoji. + /// Description: Fax machine. + /// + public const string FaxMachine = "\U0001F4E0"; + + /// + /// Gets the "fearful_face" emoji. + /// Description: Fearful face. + /// + public const string FearfulFace = "\U0001F628"; + + /// + /// Gets the "feather" emoji. + /// Description: Feather. + /// + public const string Feather = "\U0001FAB6"; + + /// + /// Gets the "female_sign" emoji. + /// Description: Female sign. + /// + public const string FemaleSign = "\U00002640"; + + /// + /// Gets the "ferris_wheel" emoji. + /// Description: Ferris wheel. + /// + public const string FerrisWheel = "\U0001F3A1"; + + /// + /// Gets the "ferry" emoji. + /// Description: Ferry. + /// + public const string Ferry = "\U000026F4"; + + /// + /// Gets the "field_hockey" emoji. + /// Description: Field hockey. + /// + public const string FieldHockey = "\U0001F3D1"; + + /// + /// Gets the "file_cabinet" emoji. + /// Description: File cabinet. + /// + public const string FileCabinet = "\U0001F5C4"; + + /// + /// Gets the "file_folder" emoji. + /// Description: File folder. + /// + public const string FileFolder = "\U0001F4C1"; + + /// + /// Gets the "film_frames" emoji. + /// Description: Film frames. + /// + public const string FilmFrames = "\U0001F39E"; + + /// + /// Gets the "film_projector" emoji. + /// Description: Film projector. + /// + public const string FilmProjector = "\U0001F4FD"; + + /// + /// Gets the "fire" emoji. + /// Description: Fire. + /// + public const string Fire = "\U0001F525"; + + /// + /// Gets the "firecracker" emoji. + /// Description: Firecracker. + /// + public const string Firecracker = "\U0001F9E8"; + + /// + /// Gets the "fire_engine" emoji. + /// Description: Fire engine. + /// + public const string FireEngine = "\U0001F692"; + + /// + /// Gets the "fire_extinguisher" emoji. + /// Description: Fire extinguisher. + /// + public const string FireExtinguisher = "\U0001F9EF"; + + /// + /// Gets the "fireworks" emoji. + /// Description: Fireworks. + /// + public const string Fireworks = "\U0001F386"; + + /// + /// Gets the "1st_place_medal" emoji. + /// Description: 1st place medal. + /// + public const string FirstPlaceMedal = "\U0001F947"; + + /// + /// Gets the "first_quarter_moon" emoji. + /// Description: First quarter moon. + /// + public const string FirstQuarterMoon = "\U0001F313"; + + /// + /// Gets the "first_quarter_moon_face" emoji. + /// Description: First quarter moon face. + /// + public const string FirstQuarterMoonFace = "\U0001F31B"; + + /// + /// Gets the "fish" emoji. + /// Description: Fish. + /// + public const string Fish = "\U0001F41F"; + + /// + /// Gets the "fish_cake_with_swirl" emoji. + /// Description: Fish cake with swirl. + /// + public const string FishCakeWithSwirl = "\U0001F365"; + + /// + /// Gets the "fishing_pole" emoji. + /// Description: Fishing pole. + /// + public const string FishingPole = "\U0001F3A3"; + + /// + /// Gets the "five_o_clock" emoji. + /// Description: Five o clock. + /// + public const string FiveOClock = "\U0001F554"; + + /// + /// Gets the "five_thirty" emoji. + /// Description: five thirty. + /// + public const string FiveThirty = "\U0001F560"; + + /// + /// Gets the "flag_in_hole" emoji. + /// Description: Flag in hole. + /// + public const string FlagInHole = "\U000026F3"; + + /// + /// Gets the "flamingo" emoji. + /// Description: Flamingo. + /// + public const string Flamingo = "\U0001F9A9"; + + /// + /// Gets the "flashlight" emoji. + /// Description: Flashlight. + /// + public const string Flashlight = "\U0001F526"; + + /// + /// Gets the "flatbread" emoji. + /// Description: Flatbread. + /// + public const string Flatbread = "\U0001FAD3"; + + /// + /// Gets the "flat_shoe" emoji. + /// Description: Flat shoe. + /// + public const string FlatShoe = "\U0001F97F"; + + /// + /// Gets the "fleur_de_lis" emoji. + /// Description: fleur de lis. + /// + public const string FleurDeLis = "\U0000269C"; + + /// + /// Gets the "flexed_biceps" emoji. + /// Description: Flexed biceps. + /// + public const string FlexedBiceps = "\U0001F4AA"; + + /// + /// Gets the "floppy_disk" emoji. + /// Description: Floppy disk. + /// + public const string FloppyDisk = "\U0001F4BE"; + + /// + /// Gets the "flower_playing_cards" emoji. + /// Description: Flower playing cards. + /// + public const string FlowerPlayingCards = "\U0001F3B4"; + + /// + /// Gets the "flushed_face" emoji. + /// Description: Flushed face. + /// + public const string FlushedFace = "\U0001F633"; + + /// + /// Gets the "fly" emoji. + /// Description: Fly. + /// + public const string Fly = "\U0001FAB0"; + + /// + /// Gets the "flying_disc" emoji. + /// Description: Flying disc. + /// + public const string FlyingDisc = "\U0001F94F"; + + /// + /// Gets the "flying_saucer" emoji. + /// Description: Flying saucer. + /// + public const string FlyingSaucer = "\U0001F6F8"; + + /// + /// Gets the "fog" emoji. + /// Description: Fog. + /// + public const string Fog = "\U0001F32B"; + + /// + /// Gets the "foggy" emoji. + /// Description: Foggy. + /// + public const string Foggy = "\U0001F301"; + + /// + /// Gets the "folded_hands" emoji. + /// Description: Folded hands. + /// + public const string FoldedHands = "\U0001F64F"; + + /// + /// Gets the "fondue" emoji. + /// Description: Fondue. + /// + public const string Fondue = "\U0001FAD5"; + + /// + /// Gets the "foot" emoji. + /// Description: Foot. + /// + public const string Foot = "\U0001F9B6"; + + /// + /// Gets the "footprints" emoji. + /// Description: Footprints. + /// + public const string Footprints = "\U0001F463"; + + /// + /// Gets the "fork_and_knife" emoji. + /// Description: Fork and knife. + /// + public const string ForkAndKnife = "\U0001F374"; + + /// + /// Gets the "fork_and_knife_with_plate" emoji. + /// Description: Fork and knife with plate. + /// + public const string ForkAndKnifeWithPlate = "\U0001F37D"; + + /// + /// Gets the "fortune_cookie" emoji. + /// Description: Fortune cookie. + /// + public const string FortuneCookie = "\U0001F960"; + + /// + /// Gets the "fountain" emoji. + /// Description: Fountain. + /// + public const string Fountain = "\U000026F2"; + + /// + /// Gets the "fountain_pen" emoji. + /// Description: Fountain pen. + /// + public const string FountainPen = "\U0001F58B"; + + /// + /// Gets the "four_leaf_clover" emoji. + /// Description: Four leaf clover. + /// + public const string FourLeafClover = "\U0001F340"; + + /// + /// Gets the "four_o_clock" emoji. + /// Description: Four o clock. + /// + public const string FourOClock = "\U0001F553"; + + /// + /// Gets the "four_thirty" emoji. + /// Description: four thirty. + /// + public const string FourThirty = "\U0001F55F"; + + /// + /// Gets the "fox" emoji. + /// Description: Fox. + /// + public const string Fox = "\U0001F98A"; + + /// + /// Gets the "framed_picture" emoji. + /// Description: Framed picture. + /// + public const string FramedPicture = "\U0001F5BC"; + + /// + /// Gets the "free_button" emoji. + /// Description: FREE button. + /// + public const string FreeButton = "\U0001F193"; + + /// + /// Gets the "french_fries" emoji. + /// Description: French fries. + /// + public const string FrenchFries = "\U0001F35F"; + + /// + /// Gets the "fried_shrimp" emoji. + /// Description: Fried shrimp. + /// + public const string FriedShrimp = "\U0001F364"; + + /// + /// Gets the "frog" emoji. + /// Description: Frog. + /// + public const string Frog = "\U0001F438"; + + /// + /// Gets the "front_facing_baby_chick" emoji. + /// Description: front facing baby chick. + /// + public const string FrontFacingBabyChick = "\U0001F425"; + + /// + /// Gets the "frowning_face" emoji. + /// Description: Frowning face. + /// + public const string FrowningFace = "\U00002639"; + + /// + /// Gets the "frowning_face_with_open_mouth" emoji. + /// Description: Frowning face with open mouth. + /// + public const string FrowningFaceWithOpenMouth = "\U0001F626"; + + /// + /// Gets the "fuel_pump" emoji. + /// Description: Fuel pump. + /// + public const string FuelPump = "\U000026FD"; + + /// + /// Gets the "full_moon" emoji. + /// Description: Full moon. + /// + public const string FullMoon = "\U0001F315"; + + /// + /// Gets the "full_moon_face" emoji. + /// Description: Full moon face. + /// + public const string FullMoonFace = "\U0001F31D"; + + /// + /// Gets the "funeral_urn" emoji. + /// Description: Funeral urn. + /// + public const string FuneralUrn = "\U000026B1"; + + /// + /// Gets the "game_die" emoji. + /// Description: Game die. + /// + public const string GameDie = "\U0001F3B2"; + + /// + /// Gets the "garlic" emoji. + /// Description: Garlic. + /// + public const string Garlic = "\U0001F9C4"; + + /// + /// Gets the "gear" emoji. + /// Description: Gear. + /// + public const string Gear = "\U00002699"; + + /// + /// Gets the "gemini" emoji. + /// Description: Gemini. + /// + public const string Gemini = "\U0000264A"; + + /// + /// Gets the "gem_stone" emoji. + /// Description: Gem stone. + /// + public const string GemStone = "\U0001F48E"; + + /// + /// Gets the "genie" emoji. + /// Description: Genie. + /// + public const string Genie = "\U0001F9DE"; + + /// + /// Gets the "ghost" emoji. + /// Description: Ghost. + /// + public const string Ghost = "\U0001F47B"; + + /// + /// Gets the "giraffe" emoji. + /// Description: Giraffe. + /// + public const string Giraffe = "\U0001F992"; + + /// + /// Gets the "girl" emoji. + /// Description: Girl. + /// + public const string Girl = "\U0001F467"; + + /// + /// Gets the "glasses" emoji. + /// Description: Glasses. + /// + public const string Glasses = "\U0001F453"; + + /// + /// Gets the "glass_of_milk" emoji. + /// Description: Glass of milk. + /// + public const string GlassOfMilk = "\U0001F95B"; + + /// + /// Gets the "globe_showing_americas" emoji. + /// Description: Globe showing americas. + /// + public const string GlobeShowingAmericas = "\U0001F30E"; + + /// + /// Gets the "globe_showing_asia_australia" emoji. + /// Description: globe showing Asia Australia. + /// + public const string GlobeShowingAsiaAustralia = "\U0001F30F"; + + /// + /// Gets the "globe_showing_europe_africa" emoji. + /// Description: globe showing Europe Africa. + /// + public const string GlobeShowingEuropeAfrica = "\U0001F30D"; + + /// + /// Gets the "globe_with_meridians" emoji. + /// Description: Globe with meridians. + /// + public const string GlobeWithMeridians = "\U0001F310"; + + /// + /// Gets the "gloves" emoji. + /// Description: Gloves. + /// + public const string Gloves = "\U0001F9E4"; + + /// + /// Gets the "glowing_star" emoji. + /// Description: Glowing star. + /// + public const string GlowingStar = "\U0001F31F"; + + /// + /// Gets the "goal_net" emoji. + /// Description: Goal net. + /// + public const string GoalNet = "\U0001F945"; + + /// + /// Gets the "goat" emoji. + /// Description: Goat. + /// + public const string Goat = "\U0001F410"; + + /// + /// Gets the "goblin" emoji. + /// Description: Goblin. + /// + public const string Goblin = "\U0001F47A"; + + /// + /// Gets the "goggles" emoji. + /// Description: Goggles. + /// + public const string Goggles = "\U0001F97D"; + + /// + /// Gets the "gorilla" emoji. + /// Description: Gorilla. + /// + public const string Gorilla = "\U0001F98D"; + + /// + /// Gets the "graduation_cap" emoji. + /// Description: Graduation cap. + /// + public const string GraduationCap = "\U0001F393"; + + /// + /// Gets the "grapes" emoji. + /// Description: Grapes. + /// + public const string Grapes = "\U0001F347"; + + /// + /// Gets the "green_apple" emoji. + /// Description: Green apple. + /// + public const string GreenApple = "\U0001F34F"; + + /// + /// Gets the "green_book" emoji. + /// Description: Green book. + /// + public const string GreenBook = "\U0001F4D7"; + + /// + /// Gets the "green_circle" emoji. + /// Description: Green circle. + /// + public const string GreenCircle = "\U0001F7E2"; + + /// + /// Gets the "green_heart" emoji. + /// Description: Green heart. + /// + public const string GreenHeart = "\U0001F49A"; + + /// + /// Gets the "green_salad" emoji. + /// Description: Green salad. + /// + public const string GreenSalad = "\U0001F957"; + + /// + /// Gets the "green_square" emoji. + /// Description: Green square. + /// + public const string GreenSquare = "\U0001F7E9"; + + /// + /// Gets the "grimacing_face" emoji. + /// Description: Grimacing face. + /// + public const string GrimacingFace = "\U0001F62C"; + + /// + /// Gets the "grinning_cat" emoji. + /// Description: Grinning cat. + /// + public const string GrinningCat = "\U0001F63A"; + + /// + /// Gets the "grinning_cat_with_smiling_eyes" emoji. + /// Description: Grinning cat with smiling eyes. + /// + public const string GrinningCatWithSmilingEyes = "\U0001F638"; + + /// + /// Gets the "grinning_face" emoji. + /// Description: Grinning face. + /// + public const string GrinningFace = "\U0001F600"; + + /// + /// Gets the "grinning_face_with_big_eyes" emoji. + /// Description: Grinning face with big eyes. + /// + public const string GrinningFaceWithBigEyes = "\U0001F603"; + + /// + /// Gets the "grinning_face_with_smiling_eyes" emoji. + /// Description: Grinning face with smiling eyes. + /// + public const string GrinningFaceWithSmilingEyes = "\U0001F604"; + + /// + /// Gets the "grinning_face_with_sweat" emoji. + /// Description: Grinning face with sweat. + /// + public const string GrinningFaceWithSweat = "\U0001F605"; + + /// + /// Gets the "grinning_squinting_face" emoji. + /// Description: Grinning squinting face. + /// + public const string GrinningSquintingFace = "\U0001F606"; + + /// + /// Gets the "growing_heart" emoji. + /// Description: Growing heart. + /// + public const string GrowingHeart = "\U0001F497"; + + /// + /// Gets the "guard" emoji. + /// Description: Guard. + /// + public const string Guard = "\U0001F482"; + + /// + /// Gets the "guide_dog" emoji. + /// Description: Guide dog. + /// + public const string GuideDog = "\U0001F9AE"; + + /// + /// Gets the "guitar" emoji. + /// Description: Guitar. + /// + public const string Guitar = "\U0001F3B8"; + + /// + /// Gets the "hamburger" emoji. + /// Description: Hamburger. + /// + public const string Hamburger = "\U0001F354"; + + /// + /// Gets the "hammer" emoji. + /// Description: Hammer. + /// + public const string Hammer = "\U0001F528"; + + /// + /// Gets the "hammer_and_pick" emoji. + /// Description: Hammer and pick. + /// + public const string HammerAndPick = "\U00002692"; + + /// + /// Gets the "hammer_and_wrench" emoji. + /// Description: Hammer and wrench. + /// + public const string HammerAndWrench = "\U0001F6E0"; + + /// + /// Gets the "hamster" emoji. + /// Description: Hamster. + /// + public const string Hamster = "\U0001F439"; + + /// + /// Gets the "handbag" emoji. + /// Description: Handbag. + /// + public const string Handbag = "\U0001F45C"; + + /// + /// Gets the "handshake" emoji. + /// Description: Handshake. + /// + public const string Handshake = "\U0001F91D"; + + /// + /// Gets the "hand_with_fingers_splayed" emoji. + /// Description: Hand with fingers splayed. + /// + public const string HandWithFingersSplayed = "\U0001F590"; + + /// + /// Gets the "hatching_chick" emoji. + /// Description: Hatching chick. + /// + public const string HatchingChick = "\U0001F423"; + + /// + /// Gets the "headphone" emoji. + /// Description: Headphone. + /// + public const string Headphone = "\U0001F3A7"; + + /// + /// Gets the "headstone" emoji. + /// Description: Headstone. + /// + public const string Headstone = "\U0001FAA6"; + + /// + /// Gets the "hear_no_evil_monkey" emoji. + /// Description: hear no evil monkey. + /// + public const string HearNoEvilMonkey = "\U0001F649"; + + /// + /// Gets the "heart_decoration" emoji. + /// Description: Heart decoration. + /// + public const string HeartDecoration = "\U0001F49F"; + + /// + /// Gets the "heart_exclamation" emoji. + /// Description: Heart exclamation. + /// + public const string HeartExclamation = "\U00002763"; + + /// + /// Gets the "heart_suit" emoji. + /// Description: Heart suit. + /// + public const string HeartSuit = "\U00002665"; + + /// + /// Gets the "heart_with_arrow" emoji. + /// Description: Heart with arrow. + /// + public const string HeartWithArrow = "\U0001F498"; + + /// + /// Gets the "heart_with_ribbon" emoji. + /// Description: Heart with ribbon. + /// + public const string HeartWithRibbon = "\U0001F49D"; + + /// + /// Gets the "heavy_dollar_sign" emoji. + /// Description: Heavy dollar sign. + /// + public const string HeavyDollarSign = "\U0001F4B2"; + + /// + /// Gets the "hedgehog" emoji. + /// Description: Hedgehog. + /// + public const string Hedgehog = "\U0001F994"; + + /// + /// Gets the "helicopter" emoji. + /// Description: Helicopter. + /// + public const string Helicopter = "\U0001F681"; + + /// + /// Gets the "herb" emoji. + /// Description: Herb. + /// + public const string Herb = "\U0001F33F"; + + /// + /// Gets the "hibiscus" emoji. + /// Description: Hibiscus. + /// + public const string Hibiscus = "\U0001F33A"; + + /// + /// Gets the "high_heeled_shoe" emoji. + /// Description: high heeled shoe. + /// + public const string HighHeeledShoe = "\U0001F460"; + + /// + /// Gets the "high_speed_train" emoji. + /// Description: high speed train. + /// + public const string HighSpeedTrain = "\U0001F684"; + + /// + /// Gets the "high_voltage" emoji. + /// Description: High voltage. + /// + public const string HighVoltage = "\U000026A1"; + + /// + /// Gets the "hiking_boot" emoji. + /// Description: Hiking boot. + /// + public const string HikingBoot = "\U0001F97E"; + + /// + /// Gets the "hindu_temple" emoji. + /// Description: Hindu temple. + /// + public const string HinduTemple = "\U0001F6D5"; + + /// + /// Gets the "hippopotamus" emoji. + /// Description: Hippopotamus. + /// + public const string Hippopotamus = "\U0001F99B"; + + /// + /// Gets the "hole" emoji. + /// Description: Hole. + /// + public const string Hole = "\U0001F573"; + + /// + /// Gets the "hollow_red_circle" emoji. + /// Description: Hollow red circle. + /// + public const string HollowRedCircle = "\U00002B55"; + + /// + /// Gets the "honeybee" emoji. + /// Description: Honeybee. + /// + public const string Honeybee = "\U0001F41D"; + + /// + /// Gets the "honey_pot" emoji. + /// Description: Honey pot. + /// + public const string HoneyPot = "\U0001F36F"; + + /// + /// Gets the "hook" emoji. + /// Description: Hook. + /// + public const string Hook = "\U0001FA9D"; + + /// + /// Gets the "horizontal_traffic_light" emoji. + /// Description: Horizontal traffic light. + /// + public const string HorizontalTrafficLight = "\U0001F6A5"; + + /// + /// Gets the "horse" emoji. + /// Description: Horse. + /// + public const string Horse = "\U0001F40E"; + + /// + /// Gets the "horse_face" emoji. + /// Description: Horse face. + /// + public const string HorseFace = "\U0001F434"; + + /// + /// Gets the "horse_racing" emoji. + /// Description: Horse racing. + /// + public const string HorseRacing = "\U0001F3C7"; + + /// + /// Gets the "hospital" emoji. + /// Description: Hospital. + /// + public const string Hospital = "\U0001F3E5"; + + /// + /// Gets the "hot_beverage" emoji. + /// Description: Hot beverage. + /// + public const string HotBeverage = "\U00002615"; + + /// + /// Gets the "hot_dog" emoji. + /// Description: Hot dog. + /// + public const string HotDog = "\U0001F32D"; + + /// + /// Gets the "hotel" emoji. + /// Description: Hotel. + /// + public const string Hotel = "\U0001F3E8"; + + /// + /// Gets the "hot_face" emoji. + /// Description: Hot face. + /// + public const string HotFace = "\U0001F975"; + + /// + /// Gets the "hot_pepper" emoji. + /// Description: Hot pepper. + /// + public const string HotPepper = "\U0001F336"; + + /// + /// Gets the "hot_springs" emoji. + /// Description: Hot springs. + /// + public const string HotSprings = "\U00002668"; + + /// + /// Gets the "hourglass_done" emoji. + /// Description: Hourglass done. + /// + public const string HourglassDone = "\U0000231B"; + + /// + /// Gets the "hourglass_not_done" emoji. + /// Description: Hourglass not done. + /// + public const string HourglassNotDone = "\U000023F3"; + + /// + /// Gets the "house" emoji. + /// Description: House. + /// + public const string House = "\U0001F3E0"; + + /// + /// Gets the "houses" emoji. + /// Description: Houses. + /// + public const string Houses = "\U0001F3D8"; + + /// + /// Gets the "house_with_garden" emoji. + /// Description: House with garden. + /// + public const string HouseWithGarden = "\U0001F3E1"; + + /// + /// Gets the "hugging_face" emoji. + /// Description: Hugging face. + /// + public const string HuggingFace = "\U0001F917"; + + /// + /// Gets the "hundred_points" emoji. + /// Description: Hundred points. + /// + public const string HundredPoints = "\U0001F4AF"; + + /// + /// Gets the "hushed_face" emoji. + /// Description: Hushed face. + /// + public const string HushedFace = "\U0001F62F"; + + /// + /// Gets the "hut" emoji. + /// Description: Hut. + /// + public const string Hut = "\U0001F6D6"; + + /// + /// Gets the "ice" emoji. + /// Description: Ice. + /// + public const string Ice = "\U0001F9CA"; + + /// + /// Gets the "ice_cream" emoji. + /// Description: Ice cream. + /// + public const string IceCream = "\U0001F368"; + + /// + /// Gets the "ice_hockey" emoji. + /// Description: Ice hockey. + /// + public const string IceHockey = "\U0001F3D2"; + + /// + /// Gets the "ice_skate" emoji. + /// Description: Ice skate. + /// + public const string IceSkate = "\U000026F8"; + + /// + /// Gets the "id_button" emoji. + /// Description: ID button. + /// + public const string IdButton = "\U0001F194"; + + /// + /// Gets the "inbox_tray" emoji. + /// Description: Inbox tray. + /// + public const string InboxTray = "\U0001F4E5"; + + /// + /// Gets the "incoming_envelope" emoji. + /// Description: Incoming envelope. + /// + public const string IncomingEnvelope = "\U0001F4E8"; + + /// + /// Gets the "index_pointing_up" emoji. + /// Description: Index pointing up. + /// + public const string IndexPointingUp = "\U0000261D"; + + /// + /// Gets the "infinity" emoji. + /// Description: Infinity. + /// + public const string Infinity = "\U0000267E"; + + /// + /// Gets the "information" emoji. + /// Description: Information. + /// + public const string Information = "\U00002139"; + + /// + /// Gets the "input_latin_letters" emoji. + /// Description: Input latin letters. + /// + public const string InputLatinLetters = "\U0001F524"; + + /// + /// Gets the "input_latin_lowercase" emoji. + /// Description: Input latin lowercase. + /// + public const string InputLatinLowercase = "\U0001F521"; + + /// + /// Gets the "input_latin_uppercase" emoji. + /// Description: Input latin uppercase. + /// + public const string InputLatinUppercase = "\U0001F520"; + + /// + /// Gets the "input_numbers" emoji. + /// Description: Input numbers. + /// + public const string InputNumbers = "\U0001F522"; + + /// + /// Gets the "input_symbols" emoji. + /// Description: Input symbols. + /// + public const string InputSymbols = "\U0001F523"; + + /// + /// Gets the "jack_o_lantern" emoji. + /// Description: jack o lantern. + /// + public const string JackOLantern = "\U0001F383"; + + /// + /// Gets the "japanese_acceptable_button" emoji. + /// Description: Japanese acceptable button. + /// + public const string JapaneseAcceptableButton = "\U0001F251"; + + /// + /// Gets the "japanese_application_button" emoji. + /// Description: Japanese application button. + /// + public const string JapaneseApplicationButton = "\U0001F238"; + + /// + /// Gets the "japanese_bargain_button" emoji. + /// Description: Japanese bargain button. + /// + public const string JapaneseBargainButton = "\U0001F250"; + + /// + /// Gets the "japanese_castle" emoji. + /// Description: Japanese castle. + /// + public const string JapaneseCastle = "\U0001F3EF"; + + /// + /// Gets the "japanese_congratulations_button" emoji. + /// Description: Japanese congratulations button. + /// + public const string JapaneseCongratulationsButton = "\U00003297"; + + /// + /// Gets the "japanese_discount_button" emoji. + /// Description: Japanese discount button. + /// + public const string JapaneseDiscountButton = "\U0001F239"; + + /// + /// Gets the "japanese_dolls" emoji. + /// Description: Japanese dolls. + /// + public const string JapaneseDolls = "\U0001F38E"; + + /// + /// Gets the "japanese_free_of_charge_button" emoji. + /// Description: Japanese free of charge button. + /// + public const string JapaneseFreeOfChargeButton = "\U0001F21A"; + + /// + /// Gets the "japanese_here_button" emoji. + /// Description: Japanese here button. + /// + public const string JapaneseHereButton = "\U0001F201"; + + /// + /// Gets the "japanese_monthly_amount_button" emoji. + /// Description: Japanese monthly amount button. + /// + public const string JapaneseMonthlyAmountButton = "\U0001F237"; + + /// + /// Gets the "japanese_not_free_of_charge_button" emoji. + /// Description: Japanese not free of charge button. + /// + public const string JapaneseNotFreeOfChargeButton = "\U0001F236"; + + /// + /// Gets the "japanese_no_vacancy_button" emoji. + /// Description: Japanese no vacancy button. + /// + public const string JapaneseNoVacancyButton = "\U0001F235"; + + /// + /// Gets the "japanese_open_for_business_button" emoji. + /// Description: Japanese open for business button. + /// + public const string JapaneseOpenForBusinessButton = "\U0001F23A"; + + /// + /// Gets the "japanese_passing_grade_button" emoji. + /// Description: Japanese passing grade button. + /// + public const string JapanesePassingGradeButton = "\U0001F234"; + + /// + /// Gets the "japanese_post_office" emoji. + /// Description: Japanese post office. + /// + public const string JapanesePostOffice = "\U0001F3E3"; + + /// + /// Gets the "japanese_prohibited_button" emoji. + /// Description: Japanese prohibited button. + /// + public const string JapaneseProhibitedButton = "\U0001F232"; + + /// + /// Gets the "japanese_reserved_button" emoji. + /// Description: Japanese reserved button. + /// + public const string JapaneseReservedButton = "\U0001F22F"; + + /// + /// Gets the "japanese_secret_button" emoji. + /// Description: Japanese secret button. + /// + public const string JapaneseSecretButton = "\U00003299"; + + /// + /// Gets the "japanese_service_charge_button" emoji. + /// Description: Japanese service charge button. + /// + public const string JapaneseServiceChargeButton = "\U0001F202"; + + /// + /// Gets the "japanese_symbol_for_beginner" emoji. + /// Description: Japanese symbol for beginner. + /// + public const string JapaneseSymbolForBeginner = "\U0001F530"; + + /// + /// Gets the "japanese_vacancy_button" emoji. + /// Description: Japanese vacancy button. + /// + public const string JapaneseVacancyButton = "\U0001F233"; + + /// + /// Gets the "jeans" emoji. + /// Description: Jeans. + /// + public const string Jeans = "\U0001F456"; + + /// + /// Gets the "joker" emoji. + /// Description: Joker. + /// + public const string Joker = "\U0001F0CF"; + + /// + /// Gets the "joystick" emoji. + /// Description: Joystick. + /// + public const string Joystick = "\U0001F579"; + + /// + /// Gets the "kaaba" emoji. + /// Description: Kaaba. + /// + public const string Kaaba = "\U0001F54B"; + + /// + /// Gets the "kangaroo" emoji. + /// Description: Kangaroo. + /// + public const string Kangaroo = "\U0001F998"; + + /// + /// Gets the "key" emoji. + /// Description: Key. + /// + public const string Key = "\U0001F511"; + + /// + /// Gets the "keyboard" emoji. + /// Description: Keyboard. + /// + public const string Keyboard = "\U00002328"; + + /// + /// Gets the "keycap_10" emoji. + /// Description: Keycap 10. + /// + public const string Keycap10 = "\U0001F51F"; + + /// + /// Gets the "kick_scooter" emoji. + /// Description: Kick scooter. + /// + public const string KickScooter = "\U0001F6F4"; + + /// + /// Gets the "kimono" emoji. + /// Description: Kimono. + /// + public const string Kimono = "\U0001F458"; + + /// + /// Gets the "kiss" emoji. + /// Description: Kiss. + /// + public const string Kiss = "\U0001F48F"; + + /// + /// Gets the "kissing_cat" emoji. + /// Description: Kissing cat. + /// + public const string KissingCat = "\U0001F63D"; + + /// + /// Gets the "kissing_face" emoji. + /// Description: Kissing face. + /// + public const string KissingFace = "\U0001F617"; + + /// + /// Gets the "kissing_face_with_closed_eyes" emoji. + /// Description: Kissing face with closed eyes. + /// + public const string KissingFaceWithClosedEyes = "\U0001F61A"; + + /// + /// Gets the "kissing_face_with_smiling_eyes" emoji. + /// Description: Kissing face with smiling eyes. + /// + public const string KissingFaceWithSmilingEyes = "\U0001F619"; + + /// + /// Gets the "kiss_mark" emoji. + /// Description: Kiss mark. + /// + public const string KissMark = "\U0001F48B"; + + /// + /// Gets the "kitchen_knife" emoji. + /// Description: Kitchen knife. + /// + public const string KitchenKnife = "\U0001F52A"; + + /// + /// Gets the "kite" emoji. + /// Description: Kite. + /// + public const string Kite = "\U0001FA81"; + + /// + /// Gets the "kiwi_fruit" emoji. + /// Description: Kiwi fruit. + /// + public const string KiwiFruit = "\U0001F95D"; + + /// + /// Gets the "knocked_out_face" emoji. + /// Description: knocked out face. + /// + public const string KnockedOutFace = "\U0001F635"; + + /// + /// Gets the "knot" emoji. + /// Description: Knot. + /// + public const string Knot = "\U0001FAA2"; + + /// + /// Gets the "koala" emoji. + /// Description: Koala. + /// + public const string Koala = "\U0001F428"; + + /// + /// Gets the "lab_coat" emoji. + /// Description: Lab coat. + /// + public const string LabCoat = "\U0001F97C"; + + /// + /// Gets the "label" emoji. + /// Description: Label. + /// + public const string Label = "\U0001F3F7"; + + /// + /// Gets the "lacrosse" emoji. + /// Description: Lacrosse. + /// + public const string Lacrosse = "\U0001F94D"; + + /// + /// Gets the "ladder" emoji. + /// Description: Ladder. + /// + public const string Ladder = "\U0001FA9C"; + + /// + /// Gets the "lady_beetle" emoji. + /// Description: Lady beetle. + /// + public const string LadyBeetle = "\U0001F41E"; + + /// + /// Gets the "laptop" emoji. + /// Description: Laptop. + /// + public const string Laptop = "\U0001F4BB"; + + /// + /// Gets the "large_blue_diamond" emoji. + /// Description: Large blue diamond. + /// + public const string LargeBlueDiamond = "\U0001F537"; + + /// + /// Gets the "large_orange_diamond" emoji. + /// Description: Large orange diamond. + /// + public const string LargeOrangeDiamond = "\U0001F536"; + + /// + /// Gets the "last_quarter_moon" emoji. + /// Description: Last quarter moon. + /// + public const string LastQuarterMoon = "\U0001F317"; + + /// + /// Gets the "last_quarter_moon_face" emoji. + /// Description: Last quarter moon face. + /// + public const string LastQuarterMoonFace = "\U0001F31C"; + + /// + /// Gets the "last_track_button" emoji. + /// Description: Last track button. + /// + public const string LastTrackButton = "\U000023EE"; + + /// + /// Gets the "latin_cross" emoji. + /// Description: Latin cross. + /// + public const string LatinCross = "\U0000271D"; + + /// + /// Gets the "leaf_fluttering_in_wind" emoji. + /// Description: Leaf fluttering in wind. + /// + public const string LeafFlutteringInWind = "\U0001F343"; + + /// + /// Gets the "leafy_green" emoji. + /// Description: Leafy green. + /// + public const string LeafyGreen = "\U0001F96C"; + + /// + /// Gets the "ledger" emoji. + /// Description: Ledger. + /// + public const string Ledger = "\U0001F4D2"; + + /// + /// Gets the "left_arrow" emoji. + /// Description: Left arrow. + /// + public const string LeftArrow = "\U00002B05"; + + /// + /// Gets the "left_arrow_curving_right" emoji. + /// Description: Left arrow curving right. + /// + public const string LeftArrowCurvingRight = "\U000021AA"; + + /// + /// Gets the "left_facing_fist" emoji. + /// Description: left facing fist. + /// + public const string LeftFacingFist = "\U0001F91B"; + + /// + /// Gets the "left_luggage" emoji. + /// Description: Left luggage. + /// + public const string LeftLuggage = "\U0001F6C5"; + + /// + /// Gets the "left_right_arrow" emoji. + /// Description: left right arrow. + /// + public const string LeftRightArrow = "\U00002194"; + + /// + /// Gets the "left_speech_bubble" emoji. + /// Description: Left speech bubble. + /// + public const string LeftSpeechBubble = "\U0001F5E8"; + + /// + /// Gets the "leg" emoji. + /// Description: Leg. + /// + public const string Leg = "\U0001F9B5"; + + /// + /// Gets the "lemon" emoji. + /// Description: Lemon. + /// + public const string Lemon = "\U0001F34B"; + + /// + /// Gets the "leo" emoji. + /// Description: Leo. + /// + public const string Leo = "\U0000264C"; + + /// + /// Gets the "leopard" emoji. + /// Description: Leopard. + /// + public const string Leopard = "\U0001F406"; + + /// + /// Gets the "level_slider" emoji. + /// Description: Level slider. + /// + public const string LevelSlider = "\U0001F39A"; + + /// + /// Gets the "libra" emoji. + /// Description: Libra. + /// + public const string Libra = "\U0000264E"; + + /// + /// Gets the "light_bulb" emoji. + /// Description: Light bulb. + /// + public const string LightBulb = "\U0001F4A1"; + + /// + /// Gets the "light_rail" emoji. + /// Description: Light rail. + /// + public const string LightRail = "\U0001F688"; + + /// + /// Gets the "link" emoji. + /// Description: Link. + /// + public const string Link = "\U0001F517"; + + /// + /// Gets the "linked_paperclips" emoji. + /// Description: Linked paperclips. + /// + public const string LinkedPaperclips = "\U0001F587"; + + /// + /// Gets the "lion" emoji. + /// Description: Lion. + /// + public const string Lion = "\U0001F981"; + + /// + /// Gets the "lipstick" emoji. + /// Description: Lipstick. + /// + public const string Lipstick = "\U0001F484"; + + /// + /// Gets the "litter_in_bin_sign" emoji. + /// Description: Litter in bin sign. + /// + public const string LitterInBinSign = "\U0001F6AE"; + + /// + /// Gets the "lizard" emoji. + /// Description: Lizard. + /// + public const string Lizard = "\U0001F98E"; + + /// + /// Gets the "llama" emoji. + /// Description: Llama. + /// + public const string Llama = "\U0001F999"; + + /// + /// Gets the "lobster" emoji. + /// Description: Lobster. + /// + public const string Lobster = "\U0001F99E"; + + /// + /// Gets the "locked" emoji. + /// Description: Locked. + /// + public const string Locked = "\U0001F512"; + + /// + /// Gets the "locked_with_key" emoji. + /// Description: Locked with key. + /// + public const string LockedWithKey = "\U0001F510"; + + /// + /// Gets the "locked_with_pen" emoji. + /// Description: Locked with pen. + /// + public const string LockedWithPen = "\U0001F50F"; + + /// + /// Gets the "locomotive" emoji. + /// Description: Locomotive. + /// + public const string Locomotive = "\U0001F682"; + + /// + /// Gets the "lollipop" emoji. + /// Description: Lollipop. + /// + public const string Lollipop = "\U0001F36D"; + + /// + /// Gets the "long_drum" emoji. + /// Description: Long drum. + /// + public const string LongDrum = "\U0001FA98"; + + /// + /// Gets the "lotion_bottle" emoji. + /// Description: Lotion bottle. + /// + public const string LotionBottle = "\U0001F9F4"; + + /// + /// Gets the "loudly_crying_face" emoji. + /// Description: Loudly crying face. + /// + public const string LoudlyCryingFace = "\U0001F62D"; + + /// + /// Gets the "loudspeaker" emoji. + /// Description: Loudspeaker. + /// + public const string Loudspeaker = "\U0001F4E2"; + + /// + /// Gets the "love_hotel" emoji. + /// Description: Love hotel. + /// + public const string LoveHotel = "\U0001F3E9"; + + /// + /// Gets the "love_letter" emoji. + /// Description: Love letter. + /// + public const string LoveLetter = "\U0001F48C"; + + /// + /// Gets the "love_you_gesture" emoji. + /// Description: love you gesture. + /// + public const string LoveYouGesture = "\U0001F91F"; + + /// + /// Gets the "luggage" emoji. + /// Description: Luggage. + /// + public const string Luggage = "\U0001F9F3"; + + /// + /// Gets the "lungs" emoji. + /// Description: Lungs. + /// + public const string Lungs = "\U0001FAC1"; + + /// + /// Gets the "lying_face" emoji. + /// Description: Lying face. + /// + public const string LyingFace = "\U0001F925"; + + /// + /// Gets the "mage" emoji. + /// Description: Mage. + /// + public const string Mage = "\U0001F9D9"; + + /// + /// Gets the "magic_wand" emoji. + /// Description: Magic wand. + /// + public const string MagicWand = "\U0001FA84"; + + /// + /// Gets the "magnet" emoji. + /// Description: Magnet. + /// + public const string Magnet = "\U0001F9F2"; + + /// + /// Gets the "magnifying_glass_tilted_left" emoji. + /// Description: Magnifying glass tilted left. + /// + public const string MagnifyingGlassTiltedLeft = "\U0001F50D"; + + /// + /// Gets the "magnifying_glass_tilted_right" emoji. + /// Description: Magnifying glass tilted right. + /// + public const string MagnifyingGlassTiltedRight = "\U0001F50E"; + + /// + /// Gets the "mahjong_red_dragon" emoji. + /// Description: Mahjong red dragon. + /// + public const string MahjongRedDragon = "\U0001F004"; + + /// + /// Gets the "male_sign" emoji. + /// Description: Male sign. + /// + public const string MaleSign = "\U00002642"; + + /// + /// Gets the "mammoth" emoji. + /// Description: Mammoth. + /// + public const string Mammoth = "\U0001F9A3"; + + /// + /// Gets the "man" emoji. + /// Description: Man. + /// + public const string Man = "\U0001F468"; + + /// + /// Gets the "man_dancing" emoji. + /// Description: Man dancing. + /// + public const string ManDancing = "\U0001F57A"; + + /// + /// Gets the "mango" emoji. + /// Description: Mango. + /// + public const string Mango = "\U0001F96D"; + + /// + /// Gets the "mans_shoe" emoji. + /// Description: Man s shoe. + /// + public const string MansShoe = "\U0001F45E"; + + /// + /// Gets the "mantelpiece_clock" emoji. + /// Description: Mantelpiece clock. + /// + public const string MantelpieceClock = "\U0001F570"; + + /// + /// Gets the "manual_wheelchair" emoji. + /// Description: Manual wheelchair. + /// + public const string ManualWheelchair = "\U0001F9BD"; + + /// + /// Gets the "maple_leaf" emoji. + /// Description: Maple leaf. + /// + public const string MapleLeaf = "\U0001F341"; + + /// + /// Gets the "map_of_japan" emoji. + /// Description: Map of japan. + /// + public const string MapOfJapan = "\U0001F5FE"; + + /// + /// Gets the "martial_arts_uniform" emoji. + /// Description: Martial arts uniform. + /// + public const string MartialArtsUniform = "\U0001F94B"; + + /// + /// Gets the "mate" emoji. + /// Description: Mate. + /// + public const string Mate = "\U0001F9C9"; + + /// + /// Gets the "meat_on_bone" emoji. + /// Description: Meat on bone. + /// + public const string MeatOnBone = "\U0001F356"; + + /// + /// Gets the "mechanical_arm" emoji. + /// Description: Mechanical arm. + /// + public const string MechanicalArm = "\U0001F9BE"; + + /// + /// Gets the "mechanical_leg" emoji. + /// Description: Mechanical leg. + /// + public const string MechanicalLeg = "\U0001F9BF"; + + /// + /// Gets the "medical_symbol" emoji. + /// Description: Medical symbol. + /// + public const string MedicalSymbol = "\U00002695"; + + /// + /// Gets the "megaphone" emoji. + /// Description: Megaphone. + /// + public const string Megaphone = "\U0001F4E3"; + + /// + /// Gets the "melon" emoji. + /// Description: Melon. + /// + public const string Melon = "\U0001F348"; + + /// + /// Gets the "memo" emoji. + /// Description: Memo. + /// + public const string Memo = "\U0001F4DD"; + + /// + /// Gets the "men_holding_hands" emoji. + /// Description: Men holding hands. + /// + public const string MenHoldingHands = "\U0001F46C"; + + /// + /// Gets the "menorah" emoji. + /// Description: Menorah. + /// + public const string Menorah = "\U0001F54E"; + + /// + /// Gets the "mens_room" emoji. + /// Description: Men s room. + /// + public const string MensRoom = "\U0001F6B9"; + + /// + /// Gets the "merperson" emoji. + /// Description: Merperson. + /// + public const string Merperson = "\U0001F9DC"; + + /// + /// Gets the "metro" emoji. + /// Description: Metro. + /// + public const string Metro = "\U0001F687"; + + /// + /// Gets the "microbe" emoji. + /// Description: Microbe. + /// + public const string Microbe = "\U0001F9A0"; + + /// + /// Gets the "microphone" emoji. + /// Description: Microphone. + /// + public const string Microphone = "\U0001F3A4"; + + /// + /// Gets the "microscope" emoji. + /// Description: Microscope. + /// + public const string Microscope = "\U0001F52C"; + + /// + /// Gets the "middle_finger" emoji. + /// Description: Middle finger. + /// + public const string MiddleFinger = "\U0001F595"; + + /// + /// Gets the "military_helmet" emoji. + /// Description: Military helmet. + /// + public const string MilitaryHelmet = "\U0001FA96"; + + /// + /// Gets the "military_medal" emoji. + /// Description: Military medal. + /// + public const string MilitaryMedal = "\U0001F396"; + + /// + /// Gets the "milky_way" emoji. + /// Description: Milky way. + /// + public const string MilkyWay = "\U0001F30C"; + + /// + /// Gets the "minibus" emoji. + /// Description: Minibus. + /// + public const string Minibus = "\U0001F690"; + + /// + /// Gets the "minus" emoji. + /// Description: Minus. + /// + public const string Minus = "\U00002796"; + + /// + /// Gets the "mirror" emoji. + /// Description: Mirror. + /// + public const string Mirror = "\U0001FA9E"; + + /// + /// Gets the "moai" emoji. + /// Description: Moai. + /// + public const string Moai = "\U0001F5FF"; + + /// + /// Gets the "mobile_phone" emoji. + /// Description: Mobile phone. + /// + public const string MobilePhone = "\U0001F4F1"; + + /// + /// Gets the "mobile_phone_off" emoji. + /// Description: Mobile phone off. + /// + public const string MobilePhoneOff = "\U0001F4F4"; + + /// + /// Gets the "mobile_phone_with_arrow" emoji. + /// Description: Mobile phone with arrow. + /// + public const string MobilePhoneWithArrow = "\U0001F4F2"; + + /// + /// Gets the "money_bag" emoji. + /// Description: Money bag. + /// + public const string MoneyBag = "\U0001F4B0"; + + /// + /// Gets the "money_mouth_face" emoji. + /// Description: money mouth face. + /// + public const string MoneyMouthFace = "\U0001F911"; + + /// + /// Gets the "money_with_wings" emoji. + /// Description: Money with wings. + /// + public const string MoneyWithWings = "\U0001F4B8"; + + /// + /// Gets the "monkey" emoji. + /// Description: Monkey. + /// + public const string Monkey = "\U0001F412"; + + /// + /// Gets the "monkey_face" emoji. + /// Description: Monkey face. + /// + public const string MonkeyFace = "\U0001F435"; + + /// + /// Gets the "monorail" emoji. + /// Description: Monorail. + /// + public const string Monorail = "\U0001F69D"; + + /// + /// Gets the "moon_cake" emoji. + /// Description: Moon cake. + /// + public const string MoonCake = "\U0001F96E"; + + /// + /// Gets the "moon_viewing_ceremony" emoji. + /// Description: Moon viewing ceremony. + /// + public const string MoonViewingCeremony = "\U0001F391"; + + /// + /// Gets the "mosque" emoji. + /// Description: Mosque. + /// + public const string Mosque = "\U0001F54C"; + + /// + /// Gets the "mosquito" emoji. + /// Description: Mosquito. + /// + public const string Mosquito = "\U0001F99F"; + + /// + /// Gets the "motor_boat" emoji. + /// Description: Motor boat. + /// + public const string MotorBoat = "\U0001F6E5"; + + /// + /// Gets the "motorcycle" emoji. + /// Description: Motorcycle. + /// + public const string Motorcycle = "\U0001F3CD"; + + /// + /// Gets the "motorized_wheelchair" emoji. + /// Description: Motorized wheelchair. + /// + public const string MotorizedWheelchair = "\U0001F9BC"; + + /// + /// Gets the "motor_scooter" emoji. + /// Description: Motor scooter. + /// + public const string MotorScooter = "\U0001F6F5"; + + /// + /// Gets the "motorway" emoji. + /// Description: Motorway. + /// + public const string Motorway = "\U0001F6E3"; + + /// + /// Gets the "mountain" emoji. + /// Description: Mountain. + /// + public const string Mountain = "\U000026F0"; + + /// + /// Gets the "mountain_cableway" emoji. + /// Description: Mountain cableway. + /// + public const string MountainCableway = "\U0001F6A0"; + + /// + /// Gets the "mountain_railway" emoji. + /// Description: Mountain railway. + /// + public const string MountainRailway = "\U0001F69E"; + + /// + /// Gets the "mount_fuji" emoji. + /// Description: Mount fuji. + /// + public const string MountFuji = "\U0001F5FB"; + + /// + /// Gets the "mouse" emoji. + /// Description: Mouse. + /// + public const string Mouse = "\U0001F401"; + + /// + /// Gets the "mouse_face" emoji. + /// Description: Mouse face. + /// + public const string MouseFace = "\U0001F42D"; + + /// + /// Gets the "mouse_trap" emoji. + /// Description: Mouse trap. + /// + public const string MouseTrap = "\U0001FAA4"; + + /// + /// Gets the "mouth" emoji. + /// Description: Mouth. + /// + public const string Mouth = "\U0001F444"; + + /// + /// Gets the "movie_camera" emoji. + /// Description: Movie camera. + /// + public const string MovieCamera = "\U0001F3A5"; + + /// + /// Gets the "mrs_claus" emoji. + /// Description: Mrs claus. + /// + public const string MrsClaus = "\U0001F936"; + + /// + /// Gets the "multiply" emoji. + /// Description: Multiply. + /// + public const string Multiply = "\U00002716"; + + /// + /// Gets the "mushroom" emoji. + /// Description: Mushroom. + /// + public const string Mushroom = "\U0001F344"; + + /// + /// Gets the "musical_keyboard" emoji. + /// Description: Musical keyboard. + /// + public const string MusicalKeyboard = "\U0001F3B9"; + + /// + /// Gets the "musical_note" emoji. + /// Description: Musical note. + /// + public const string MusicalNote = "\U0001F3B5"; + + /// + /// Gets the "musical_notes" emoji. + /// Description: Musical notes. + /// + public const string MusicalNotes = "\U0001F3B6"; + + /// + /// Gets the "musical_score" emoji. + /// Description: Musical score. + /// + public const string MusicalScore = "\U0001F3BC"; + + /// + /// Gets the "muted_speaker" emoji. + /// Description: Muted speaker. + /// + public const string MutedSpeaker = "\U0001F507"; + + /// + /// Gets the "nail_polish" emoji. + /// Description: Nail polish. + /// + public const string NailPolish = "\U0001F485"; + + /// + /// Gets the "name_badge" emoji. + /// Description: Name badge. + /// + public const string NameBadge = "\U0001F4DB"; + + /// + /// Gets the "national_park" emoji. + /// Description: National park. + /// + public const string NationalPark = "\U0001F3DE"; + + /// + /// Gets the "nauseated_face" emoji. + /// Description: Nauseated face. + /// + public const string NauseatedFace = "\U0001F922"; + + /// + /// Gets the "nazar_amulet" emoji. + /// Description: Nazar amulet. + /// + public const string NazarAmulet = "\U0001F9FF"; + + /// + /// Gets the "necktie" emoji. + /// Description: Necktie. + /// + public const string Necktie = "\U0001F454"; + + /// + /// Gets the "nerd_face" emoji. + /// Description: Nerd face. + /// + public const string NerdFace = "\U0001F913"; + + /// + /// Gets the "nesting_dolls" emoji. + /// Description: Nesting dolls. + /// + public const string NestingDolls = "\U0001FA86"; + + /// + /// Gets the "neutral_face" emoji. + /// Description: Neutral face. + /// + public const string NeutralFace = "\U0001F610"; + + /// + /// Gets the "new_button" emoji. + /// Description: NEW button. + /// + public const string NewButton = "\U0001F195"; + + /// + /// Gets the "new_moon" emoji. + /// Description: New moon. + /// + public const string NewMoon = "\U0001F311"; + + /// + /// Gets the "new_moon_face" emoji. + /// Description: New moon face. + /// + public const string NewMoonFace = "\U0001F31A"; + + /// + /// Gets the "newspaper" emoji. + /// Description: Newspaper. + /// + public const string Newspaper = "\U0001F4F0"; + + /// + /// Gets the "next_track_button" emoji. + /// Description: Next track button. + /// + public const string NextTrackButton = "\U000023ED"; + + /// + /// Gets the "ng_button" emoji. + /// Description: NG button. + /// + public const string NgButton = "\U0001F196"; + + /// + /// Gets the "night_with_stars" emoji. + /// Description: Night with stars. + /// + public const string NightWithStars = "\U0001F303"; + + /// + /// Gets the "nine_o_clock" emoji. + /// Description: Nine o clock. + /// + public const string NineOClock = "\U0001F558"; + + /// + /// Gets the "nine_thirty" emoji. + /// Description: nine thirty. + /// + public const string NineThirty = "\U0001F564"; + + /// + /// Gets the "ninja" emoji. + /// Description: Ninja. + /// + public const string Ninja = "\U0001F977"; + + /// + /// Gets the "no_bicycles" emoji. + /// Description: No bicycles. + /// + public const string NoBicycles = "\U0001F6B3"; + + /// + /// Gets the "no_entry" emoji. + /// Description: No entry. + /// + public const string NoEntry = "\U000026D4"; + + /// + /// Gets the "no_littering" emoji. + /// Description: No littering. + /// + public const string NoLittering = "\U0001F6AF"; + + /// + /// Gets the "no_mobile_phones" emoji. + /// Description: No mobile phones. + /// + public const string NoMobilePhones = "\U0001F4F5"; + + /// + /// Gets the "non_potable_water" emoji. + /// Description: non potable water. + /// + public const string NonPotableWater = "\U0001F6B1"; + + /// + /// Gets the "no_one_under_eighteen" emoji. + /// Description: No one under eighteen. + /// + public const string NoOneUnderEighteen = "\U0001F51E"; + + /// + /// Gets the "no_pedestrians" emoji. + /// Description: No pedestrians. + /// + public const string NoPedestrians = "\U0001F6B7"; + + /// + /// Gets the "nose" emoji. + /// Description: Nose. + /// + public const string Nose = "\U0001F443"; + + /// + /// Gets the "no_smoking" emoji. + /// Description: No smoking. + /// + public const string NoSmoking = "\U0001F6AD"; + + /// + /// Gets the "notebook" emoji. + /// Description: Notebook. + /// + public const string Notebook = "\U0001F4D3"; + + /// + /// Gets the "notebook_with_decorative_cover" emoji. + /// Description: Notebook with decorative cover. + /// + public const string NotebookWithDecorativeCover = "\U0001F4D4"; + + /// + /// Gets the "nut_and_bolt" emoji. + /// Description: Nut and bolt. + /// + public const string NutAndBolt = "\U0001F529"; + + /// + /// Gets the "o_button_blood_type" emoji. + /// Description: O button blood type. + /// + public const string OButtonBloodType = "\U0001F17E"; + + /// + /// Gets the "octopus" emoji. + /// Description: Octopus. + /// + public const string Octopus = "\U0001F419"; + + /// + /// Gets the "oden" emoji. + /// Description: Oden. + /// + public const string Oden = "\U0001F362"; + + /// + /// Gets the "office_building" emoji. + /// Description: Office building. + /// + public const string OfficeBuilding = "\U0001F3E2"; + + /// + /// Gets the "ogre" emoji. + /// Description: Ogre. + /// + public const string Ogre = "\U0001F479"; + + /// + /// Gets the "oil_drum" emoji. + /// Description: Oil drum. + /// + public const string OilDrum = "\U0001F6E2"; + + /// + /// Gets the "ok_button" emoji. + /// Description: OK button. + /// + public const string OkButton = "\U0001F197"; + + /// + /// Gets the "ok_hand" emoji. + /// Description: OK hand. + /// + public const string OkHand = "\U0001F44C"; + + /// + /// Gets the "older_person" emoji. + /// Description: Older person. + /// + public const string OlderPerson = "\U0001F9D3"; + + /// + /// Gets the "old_key" emoji. + /// Description: Old key. + /// + public const string OldKey = "\U0001F5DD"; + + /// + /// Gets the "old_man" emoji. + /// Description: Old man. + /// + public const string OldMan = "\U0001F474"; + + /// + /// Gets the "old_woman" emoji. + /// Description: Old woman. + /// + public const string OldWoman = "\U0001F475"; + + /// + /// Gets the "olive" emoji. + /// Description: Olive. + /// + public const string Olive = "\U0001FAD2"; + + /// + /// Gets the "om" emoji. + /// Description: Om. + /// + public const string Om = "\U0001F549"; + + /// + /// Gets the "on_arrow" emoji. + /// Description: ON arrow. + /// + public const string OnArrow = "\U0001F51B"; + + /// + /// Gets the "oncoming_automobile" emoji. + /// Description: Oncoming automobile. + /// + public const string OncomingAutomobile = "\U0001F698"; + + /// + /// Gets the "oncoming_bus" emoji. + /// Description: Oncoming bus. + /// + public const string OncomingBus = "\U0001F68D"; + + /// + /// Gets the "oncoming_fist" emoji. + /// Description: Oncoming fist. + /// + public const string OncomingFist = "\U0001F44A"; + + /// + /// Gets the "oncoming_police_car" emoji. + /// Description: Oncoming police car. + /// + public const string OncomingPoliceCar = "\U0001F694"; + + /// + /// Gets the "oncoming_taxi" emoji. + /// Description: Oncoming taxi. + /// + public const string OncomingTaxi = "\U0001F696"; + + /// + /// Gets the "one_o_clock" emoji. + /// Description: One o clock. + /// + public const string OneOClock = "\U0001F550"; + + /// + /// Gets the "one_piece_swimsuit" emoji. + /// Description: one piece swimsuit. + /// + public const string OnePieceSwimsuit = "\U0001FA71"; + + /// + /// Gets the "one_thirty" emoji. + /// Description: one thirty. + /// + public const string OneThirty = "\U0001F55C"; + + /// + /// Gets the "onion" emoji. + /// Description: Onion. + /// + public const string Onion = "\U0001F9C5"; + + /// + /// Gets the "open_book" emoji. + /// Description: Open book. + /// + public const string OpenBook = "\U0001F4D6"; + + /// + /// Gets the "open_file_folder" emoji. + /// Description: Open file folder. + /// + public const string OpenFileFolder = "\U0001F4C2"; + + /// + /// Gets the "open_hands" emoji. + /// Description: Open hands. + /// + public const string OpenHands = "\U0001F450"; + + /// + /// Gets the "open_mailbox_with_lowered_flag" emoji. + /// Description: Open mailbox with lowered flag. + /// + public const string OpenMailboxWithLoweredFlag = "\U0001F4ED"; + + /// + /// Gets the "open_mailbox_with_raised_flag" emoji. + /// Description: Open mailbox with raised flag. + /// + public const string OpenMailboxWithRaisedFlag = "\U0001F4EC"; + + /// + /// Gets the "ophiuchus" emoji. + /// Description: Ophiuchus. + /// + public const string Ophiuchus = "\U000026CE"; + + /// + /// Gets the "optical_disk" emoji. + /// Description: Optical disk. + /// + public const string OpticalDisk = "\U0001F4BF"; + + /// + /// Gets the "orange_book" emoji. + /// Description: Orange book. + /// + public const string OrangeBook = "\U0001F4D9"; + + /// + /// Gets the "orange_circle" emoji. + /// Description: Orange circle. + /// + public const string OrangeCircle = "\U0001F7E0"; + + /// + /// Gets the "orange_heart" emoji. + /// Description: Orange heart. + /// + public const string OrangeHeart = "\U0001F9E1"; + + /// + /// Gets the "orange_square" emoji. + /// Description: Orange square. + /// + public const string OrangeSquare = "\U0001F7E7"; + + /// + /// Gets the "orangutan" emoji. + /// Description: Orangutan. + /// + public const string Orangutan = "\U0001F9A7"; + + /// + /// Gets the "orthodox_cross" emoji. + /// Description: Orthodox cross. + /// + public const string OrthodoxCross = "\U00002626"; + + /// + /// Gets the "otter" emoji. + /// Description: Otter. + /// + public const string Otter = "\U0001F9A6"; + + /// + /// Gets the "outbox_tray" emoji. + /// Description: Outbox tray. + /// + public const string OutboxTray = "\U0001F4E4"; + + /// + /// Gets the "owl" emoji. + /// Description: Owl. + /// + public const string Owl = "\U0001F989"; + + /// + /// Gets the "ox" emoji. + /// Description: Ox. + /// + public const string Ox = "\U0001F402"; + + /// + /// Gets the "oyster" emoji. + /// Description: Oyster. + /// + public const string Oyster = "\U0001F9AA"; + + /// + /// Gets the "package" emoji. + /// Description: Package. + /// + public const string Package = "\U0001F4E6"; + + /// + /// Gets the "page_facing_up" emoji. + /// Description: Page facing up. + /// + public const string PageFacingUp = "\U0001F4C4"; + + /// + /// Gets the "pager" emoji. + /// Description: Pager. + /// + public const string Pager = "\U0001F4DF"; + + /// + /// Gets the "page_with_curl" emoji. + /// Description: Page with curl. + /// + public const string PageWithCurl = "\U0001F4C3"; + + /// + /// Gets the "paintbrush" emoji. + /// Description: Paintbrush. + /// + public const string Paintbrush = "\U0001F58C"; + + /// + /// Gets the "palms_up_together" emoji. + /// Description: Palms up together. + /// + public const string PalmsUpTogether = "\U0001F932"; + + /// + /// Gets the "palm_tree" emoji. + /// Description: Palm tree. + /// + public const string PalmTree = "\U0001F334"; + + /// + /// Gets the "pancakes" emoji. + /// Description: Pancakes. + /// + public const string Pancakes = "\U0001F95E"; + + /// + /// Gets the "panda" emoji. + /// Description: Panda. + /// + public const string Panda = "\U0001F43C"; + + /// + /// Gets the "paperclip" emoji. + /// Description: Paperclip. + /// + public const string Paperclip = "\U0001F4CE"; + + /// + /// Gets the "parachute" emoji. + /// Description: Parachute. + /// + public const string Parachute = "\U0001FA82"; + + /// + /// Gets the "parrot" emoji. + /// Description: Parrot. + /// + public const string Parrot = "\U0001F99C"; + + /// + /// Gets the "part_alternation_mark" emoji. + /// Description: Part alternation mark. + /// + public const string PartAlternationMark = "\U0000303D"; + + /// + /// Gets the "partying_face" emoji. + /// Description: Partying face. + /// + public const string PartyingFace = "\U0001F973"; + + /// + /// Gets the "party_popper" emoji. + /// Description: Party popper. + /// + public const string PartyPopper = "\U0001F389"; + + /// + /// Gets the "passenger_ship" emoji. + /// Description: Passenger ship. + /// + public const string PassengerShip = "\U0001F6F3"; + + /// + /// Gets the "passport_control" emoji. + /// Description: Passport control. + /// + public const string PassportControl = "\U0001F6C2"; + + /// + /// Gets the "pause_button" emoji. + /// Description: Pause button. + /// + public const string PauseButton = "\U000023F8"; + + /// + /// Gets the "paw_prints" emoji. + /// Description: Paw prints. + /// + public const string PawPrints = "\U0001F43E"; + + /// + /// Gets the "p_button" emoji. + /// Description: P button. + /// + public const string PButton = "\U0001F17F"; + + /// + /// Gets the "peace_symbol" emoji. + /// Description: Peace symbol. + /// + public const string PeaceSymbol = "\U0000262E"; + + /// + /// Gets the "peach" emoji. + /// Description: Peach. + /// + public const string Peach = "\U0001F351"; + + /// + /// Gets the "peacock" emoji. + /// Description: Peacock. + /// + public const string Peacock = "\U0001F99A"; + + /// + /// Gets the "peanuts" emoji. + /// Description: Peanuts. + /// + public const string Peanuts = "\U0001F95C"; + + /// + /// Gets the "pear" emoji. + /// Description: Pear. + /// + public const string Pear = "\U0001F350"; + + /// + /// Gets the "pen" emoji. + /// Description: Pen. + /// + public const string Pen = "\U0001F58A"; + + /// + /// Gets the "pencil" emoji. + /// Description: Pencil. + /// + public const string Pencil = "\U0000270F"; + + /// + /// Gets the "penguin" emoji. + /// Description: Penguin. + /// + public const string Penguin = "\U0001F427"; + + /// + /// Gets the "pensive_face" emoji. + /// Description: Pensive face. + /// + public const string PensiveFace = "\U0001F614"; + + /// + /// Gets the "people_hugging" emoji. + /// Description: People hugging. + /// + public const string PeopleHugging = "\U0001FAC2"; + + /// + /// Gets the "people_with_bunny_ears" emoji. + /// Description: People with bunny ears. + /// + public const string PeopleWithBunnyEars = "\U0001F46F"; + + /// + /// Gets the "people_wrestling" emoji. + /// Description: People wrestling. + /// + public const string PeopleWrestling = "\U0001F93C"; + + /// + /// Gets the "performing_arts" emoji. + /// Description: Performing arts. + /// + public const string PerformingArts = "\U0001F3AD"; + + /// + /// Gets the "persevering_face" emoji. + /// Description: Persevering face. + /// + public const string PerseveringFace = "\U0001F623"; + + /// + /// Gets the "person" emoji. + /// Description: Person. + /// + public const string Person = "\U0001F9D1"; + + /// + /// Gets the "person_beard" emoji. + /// Description: Person beard. + /// + public const string PersonBeard = "\U0001F9D4"; + + /// + /// Gets the "person_biking" emoji. + /// Description: Person biking. + /// + public const string PersonBiking = "\U0001F6B4"; + + /// + /// Gets the "person_blond_hair" emoji. + /// Description: Person blond hair. + /// + public const string PersonBlondHair = "\U0001F471"; + + /// + /// Gets the "person_bouncing_ball" emoji. + /// Description: Person bouncing ball. + /// + public const string PersonBouncingBall = "\U000026F9"; + + /// + /// Gets the "person_bowing" emoji. + /// Description: Person bowing. + /// + public const string PersonBowing = "\U0001F647"; + + /// + /// Gets the "person_cartwheeling" emoji. + /// Description: Person cartwheeling. + /// + public const string PersonCartwheeling = "\U0001F938"; + + /// + /// Gets the "person_climbing" emoji. + /// Description: Person climbing. + /// + public const string PersonClimbing = "\U0001F9D7"; + + /// + /// Gets the "person_facepalming" emoji. + /// Description: Person facepalming. + /// + public const string PersonFacepalming = "\U0001F926"; + + /// + /// Gets the "person_fencing" emoji. + /// Description: Person fencing. + /// + public const string PersonFencing = "\U0001F93A"; + + /// + /// Gets the "person_frowning" emoji. + /// Description: Person frowning. + /// + public const string PersonFrowning = "\U0001F64D"; + + /// + /// Gets the "person_gesturing_no" emoji. + /// Description: Person gesturing NO. + /// + public const string PersonGesturingNo = "\U0001F645"; + + /// + /// Gets the "person_gesturing_ok" emoji. + /// Description: Person gesturing OK. + /// + public const string PersonGesturingOk = "\U0001F646"; + + /// + /// Gets the "person_getting_haircut" emoji. + /// Description: Person getting haircut. + /// + public const string PersonGettingHaircut = "\U0001F487"; + + /// + /// Gets the "person_getting_massage" emoji. + /// Description: Person getting massage. + /// + public const string PersonGettingMassage = "\U0001F486"; + + /// + /// Gets the "person_golfing" emoji. + /// Description: Person golfing. + /// + public const string PersonGolfing = "\U0001F3CC"; + + /// + /// Gets the "person_in_bed" emoji. + /// Description: Person in bed. + /// + public const string PersonInBed = "\U0001F6CC"; + + /// + /// Gets the "person_in_lotus_position" emoji. + /// Description: Person in lotus position. + /// + public const string PersonInLotusPosition = "\U0001F9D8"; + + /// + /// Gets the "person_in_steamy_room" emoji. + /// Description: Person in steamy room. + /// + public const string PersonInSteamyRoom = "\U0001F9D6"; + + /// + /// Gets the "person_in_suit_levitating" emoji. + /// Description: Person in suit levitating. + /// + public const string PersonInSuitLevitating = "\U0001F574"; + + /// + /// Gets the "person_in_tuxedo" emoji. + /// Description: Person in tuxedo. + /// + public const string PersonInTuxedo = "\U0001F935"; + + /// + /// Gets the "person_juggling" emoji. + /// Description: Person juggling. + /// + public const string PersonJuggling = "\U0001F939"; + + /// + /// Gets the "person_kneeling" emoji. + /// Description: Person kneeling. + /// + public const string PersonKneeling = "\U0001F9CE"; + + /// + /// Gets the "person_lifting_weights" emoji. + /// Description: Person lifting weights. + /// + public const string PersonLiftingWeights = "\U0001F3CB"; + + /// + /// Gets the "person_mountain_biking" emoji. + /// Description: Person mountain biking. + /// + public const string PersonMountainBiking = "\U0001F6B5"; + + /// + /// Gets the "person_playing_handball" emoji. + /// Description: Person playing handball. + /// + public const string PersonPlayingHandball = "\U0001F93E"; + + /// + /// Gets the "person_playing_water_polo" emoji. + /// Description: Person playing water polo. + /// + public const string PersonPlayingWaterPolo = "\U0001F93D"; + + /// + /// Gets the "person_pouting" emoji. + /// Description: Person pouting. + /// + public const string PersonPouting = "\U0001F64E"; + + /// + /// Gets the "person_raising_hand" emoji. + /// Description: Person raising hand. + /// + public const string PersonRaisingHand = "\U0001F64B"; + + /// + /// Gets the "person_rowing_boat" emoji. + /// Description: Person rowing boat. + /// + public const string PersonRowingBoat = "\U0001F6A3"; + + /// + /// Gets the "person_running" emoji. + /// Description: Person running. + /// + public const string PersonRunning = "\U0001F3C3"; + + /// + /// Gets the "person_shrugging" emoji. + /// Description: Person shrugging. + /// + public const string PersonShrugging = "\U0001F937"; + + /// + /// Gets the "person_standing" emoji. + /// Description: Person standing. + /// + public const string PersonStanding = "\U0001F9CD"; + + /// + /// Gets the "person_surfing" emoji. + /// Description: Person surfing. + /// + public const string PersonSurfing = "\U0001F3C4"; + + /// + /// Gets the "person_swimming" emoji. + /// Description: Person swimming. + /// + public const string PersonSwimming = "\U0001F3CA"; + + /// + /// Gets the "person_taking_bath" emoji. + /// Description: Person taking bath. + /// + public const string PersonTakingBath = "\U0001F6C0"; + + /// + /// Gets the "person_tipping_hand" emoji. + /// Description: Person tipping hand. + /// + public const string PersonTippingHand = "\U0001F481"; + + /// + /// Gets the "person_walking" emoji. + /// Description: Person walking. + /// + public const string PersonWalking = "\U0001F6B6"; + + /// + /// Gets the "person_wearing_turban" emoji. + /// Description: Person wearing turban. + /// + public const string PersonWearingTurban = "\U0001F473"; + + /// + /// Gets the "person_with_skullcap" emoji. + /// Description: Person with skullcap. + /// + public const string PersonWithSkullcap = "\U0001F472"; + + /// + /// Gets the "person_with_veil" emoji. + /// Description: Person with veil. + /// + public const string PersonWithVeil = "\U0001F470"; + + /// + /// Gets the "petri_dish" emoji. + /// Description: Petri dish. + /// + public const string PetriDish = "\U0001F9EB"; + + /// + /// Gets the "pick" emoji. + /// Description: Pick. + /// + public const string Pick = "\U000026CF"; + + /// + /// Gets the "pickup_truck" emoji. + /// Description: Pickup truck. + /// + public const string PickupTruck = "\U0001F6FB"; + + /// + /// Gets the "pie" emoji. + /// Description: Pie. + /// + public const string Pie = "\U0001F967"; + + /// + /// Gets the "pig" emoji. + /// Description: Pig. + /// + public const string Pig = "\U0001F416"; + + /// + /// Gets the "pig_face" emoji. + /// Description: Pig face. + /// + public const string PigFace = "\U0001F437"; + + /// + /// Gets the "pig_nose" emoji. + /// Description: Pig nose. + /// + public const string PigNose = "\U0001F43D"; + + /// + /// Gets the "pile_of_poo" emoji. + /// Description: Pile of poo. + /// + public const string PileOfPoo = "\U0001F4A9"; + + /// + /// Gets the "pill" emoji. + /// Description: Pill. + /// + public const string Pill = "\U0001F48A"; + + /// + /// Gets the "piñata" emoji. + /// Description: Piñata. + /// + public const string Piñata = "\U0001FA85"; + + /// + /// Gets the "pinched_fingers" emoji. + /// Description: Pinched fingers. + /// + public const string PinchedFingers = "\U0001F90C"; + + /// + /// Gets the "pinching_hand" emoji. + /// Description: Pinching hand. + /// + public const string PinchingHand = "\U0001F90F"; + + /// + /// Gets the "pineapple" emoji. + /// Description: Pineapple. + /// + public const string Pineapple = "\U0001F34D"; + + /// + /// Gets the "pine_decoration" emoji. + /// Description: Pine decoration. + /// + public const string PineDecoration = "\U0001F38D"; + + /// + /// Gets the "ping_pong" emoji. + /// Description: Ping pong. + /// + public const string PingPong = "\U0001F3D3"; + + /// + /// Gets the "pisces" emoji. + /// Description: Pisces. + /// + public const string Pisces = "\U00002653"; + + /// + /// Gets the "pizza" emoji. + /// Description: Pizza. + /// + public const string Pizza = "\U0001F355"; + + /// + /// Gets the "placard" emoji. + /// Description: Placard. + /// + public const string Placard = "\U0001FAA7"; + + /// + /// Gets the "place_of_worship" emoji. + /// Description: Place of worship. + /// + public const string PlaceOfWorship = "\U0001F6D0"; + + /// + /// Gets the "play_button" emoji. + /// Description: Play button. + /// + public const string PlayButton = "\U000025B6"; + + /// + /// Gets the "play_or_pause_button" emoji. + /// Description: Play or pause button. + /// + public const string PlayOrPauseButton = "\U000023EF"; + + /// + /// Gets the "pleading_face" emoji. + /// Description: Pleading face. + /// + public const string PleadingFace = "\U0001F97A"; + + /// + /// Gets the "plunger" emoji. + /// Description: Plunger. + /// + public const string Plunger = "\U0001FAA0"; + + /// + /// Gets the "plus" emoji. + /// Description: Plus. + /// + public const string Plus = "\U00002795"; + + /// + /// Gets the "police_car" emoji. + /// Description: Police car. + /// + public const string PoliceCar = "\U0001F693"; + + /// + /// Gets the "police_car_light" emoji. + /// Description: Police car light. + /// + public const string PoliceCarLight = "\U0001F6A8"; + + /// + /// Gets the "police_officer" emoji. + /// Description: Police officer. + /// + public const string PoliceOfficer = "\U0001F46E"; + + /// + /// Gets the "poodle" emoji. + /// Description: Poodle. + /// + public const string Poodle = "\U0001F429"; + + /// + /// Gets the "pool_8_ball" emoji. + /// Description: Pool 8 ball. + /// + public const string Pool8Ball = "\U0001F3B1"; + + /// + /// Gets the "popcorn" emoji. + /// Description: Popcorn. + /// + public const string Popcorn = "\U0001F37F"; + + /// + /// Gets the "postal_horn" emoji. + /// Description: Postal horn. + /// + public const string PostalHorn = "\U0001F4EF"; + + /// + /// Gets the "postbox" emoji. + /// Description: Postbox. + /// + public const string Postbox = "\U0001F4EE"; + + /// + /// Gets the "post_office" emoji. + /// Description: Post office. + /// + public const string PostOffice = "\U0001F3E4"; + + /// + /// Gets the "potable_water" emoji. + /// Description: Potable water. + /// + public const string PotableWater = "\U0001F6B0"; + + /// + /// Gets the "potato" emoji. + /// Description: Potato. + /// + public const string Potato = "\U0001F954"; + + /// + /// Gets the "pot_of_food" emoji. + /// Description: Pot of food. + /// + public const string PotOfFood = "\U0001F372"; + + /// + /// Gets the "potted_plant" emoji. + /// Description: Potted plant. + /// + public const string PottedPlant = "\U0001FAB4"; + + /// + /// Gets the "poultry_leg" emoji. + /// Description: Poultry leg. + /// + public const string PoultryLeg = "\U0001F357"; + + /// + /// Gets the "pound_banknote" emoji. + /// Description: Pound banknote. + /// + public const string PoundBanknote = "\U0001F4B7"; + + /// + /// Gets the "pouting_cat" emoji. + /// Description: Pouting cat. + /// + public const string PoutingCat = "\U0001F63E"; + + /// + /// Gets the "pouting_face" emoji. + /// Description: Pouting face. + /// + public const string PoutingFace = "\U0001F621"; + + /// + /// Gets the "prayer_beads" emoji. + /// Description: Prayer beads. + /// + public const string PrayerBeads = "\U0001F4FF"; + + /// + /// Gets the "pregnant_woman" emoji. + /// Description: Pregnant woman. + /// + public const string PregnantWoman = "\U0001F930"; + + /// + /// Gets the "pretzel" emoji. + /// Description: Pretzel. + /// + public const string Pretzel = "\U0001F968"; + + /// + /// Gets the "prince" emoji. + /// Description: Prince. + /// + public const string Prince = "\U0001F934"; + + /// + /// Gets the "princess" emoji. + /// Description: Princess. + /// + public const string Princess = "\U0001F478"; + + /// + /// Gets the "printer" emoji. + /// Description: Printer. + /// + public const string Printer = "\U0001F5A8"; + + /// + /// Gets the "prohibited" emoji. + /// Description: Prohibited. + /// + public const string Prohibited = "\U0001F6AB"; + + /// + /// Gets the "purple_circle" emoji. + /// Description: Purple circle. + /// + public const string PurpleCircle = "\U0001F7E3"; + + /// + /// Gets the "purple_heart" emoji. + /// Description: Purple heart. + /// + public const string PurpleHeart = "\U0001F49C"; + + /// + /// Gets the "purple_square" emoji. + /// Description: Purple square. + /// + public const string PurpleSquare = "\U0001F7EA"; + + /// + /// Gets the "purse" emoji. + /// Description: Purse. + /// + public const string Purse = "\U0001F45B"; + + /// + /// Gets the "pushpin" emoji. + /// Description: Pushpin. + /// + public const string Pushpin = "\U0001F4CC"; + + /// + /// Gets the "puzzle_piece" emoji. + /// Description: Puzzle piece. + /// + public const string PuzzlePiece = "\U0001F9E9"; + + /// + /// Gets the "rabbit" emoji. + /// Description: Rabbit. + /// + public const string Rabbit = "\U0001F407"; + + /// + /// Gets the "rabbit_face" emoji. + /// Description: Rabbit face. + /// + public const string RabbitFace = "\U0001F430"; + + /// + /// Gets the "raccoon" emoji. + /// Description: Raccoon. + /// + public const string Raccoon = "\U0001F99D"; + + /// + /// Gets the "racing_car" emoji. + /// Description: Racing car. + /// + public const string RacingCar = "\U0001F3CE"; + + /// + /// Gets the "radio" emoji. + /// Description: Radio. + /// + public const string Radio = "\U0001F4FB"; + + /// + /// Gets the "radioactive" emoji. + /// Description: Radioactive. + /// + public const string Radioactive = "\U00002622"; + + /// + /// Gets the "radio_button" emoji. + /// Description: Radio button. + /// + public const string RadioButton = "\U0001F518"; + + /// + /// Gets the "railway_car" emoji. + /// Description: Railway car. + /// + public const string RailwayCar = "\U0001F683"; + + /// + /// Gets the "railway_track" emoji. + /// Description: Railway track. + /// + public const string RailwayTrack = "\U0001F6E4"; + + /// + /// Gets the "rainbow" emoji. + /// Description: Rainbow. + /// + public const string Rainbow = "\U0001F308"; + + /// + /// Gets the "raised_back_of_hand" emoji. + /// Description: Raised back of hand. + /// + public const string RaisedBackOfHand = "\U0001F91A"; + + /// + /// Gets the "raised_fist" emoji. + /// Description: Raised fist. + /// + public const string RaisedFist = "\U0000270A"; + + /// + /// Gets the "raised_hand" emoji. + /// Description: Raised hand. + /// + public const string RaisedHand = "\U0000270B"; + + /// + /// Gets the "raising_hands" emoji. + /// Description: Raising hands. + /// + public const string RaisingHands = "\U0001F64C"; + + /// + /// Gets the "ram" emoji. + /// Description: Ram. + /// + public const string Ram = "\U0001F40F"; + + /// + /// Gets the "rat" emoji. + /// Description: Rat. + /// + public const string Rat = "\U0001F400"; + + /// + /// Gets the "razor" emoji. + /// Description: Razor. + /// + public const string Razor = "\U0001FA92"; + + /// + /// Gets the "receipt" emoji. + /// Description: Receipt. + /// + public const string Receipt = "\U0001F9FE"; + + /// + /// Gets the "record_button" emoji. + /// Description: Record button. + /// + public const string RecordButton = "\U000023FA"; + + /// + /// Gets the "recycling_symbol" emoji. + /// Description: Recycling symbol. + /// + public const string RecyclingSymbol = "\U0000267B"; + + /// + /// Gets the "red_apple" emoji. + /// Description: Red apple. + /// + public const string RedApple = "\U0001F34E"; + + /// + /// Gets the "red_circle" emoji. + /// Description: Red circle. + /// + public const string RedCircle = "\U0001F534"; + + /// + /// Gets the "red_envelope" emoji. + /// Description: Red envelope. + /// + public const string RedEnvelope = "\U0001F9E7"; + + /// + /// Gets the "red_exclamation_mark" emoji. + /// Description: Red exclamation mark. + /// + public const string RedExclamationMark = "\U00002757"; + + /// + /// Gets the "red_hair" emoji. + /// Description: Red hair. + /// + public const string RedHair = "\U0001F9B0"; + + /// + /// Gets the "red_heart" emoji. + /// Description: Red heart. + /// + public const string RedHeart = "\U00002764"; + + /// + /// Gets the "red_paper_lantern" emoji. + /// Description: Red paper lantern. + /// + public const string RedPaperLantern = "\U0001F3EE"; + + /// + /// Gets the "red_question_mark" emoji. + /// Description: Red question mark. + /// + public const string RedQuestionMark = "\U00002753"; + + /// + /// Gets the "red_square" emoji. + /// Description: Red square. + /// + public const string RedSquare = "\U0001F7E5"; + + /// + /// Gets the "red_triangle_pointed_down" emoji. + /// Description: Red triangle pointed down. + /// + public const string RedTrianglePointedDown = "\U0001F53B"; + + /// + /// Gets the "red_triangle_pointed_up" emoji. + /// Description: Red triangle pointed up. + /// + public const string RedTrianglePointedUp = "\U0001F53A"; + + /// + /// Gets the "registered" emoji. + /// Description: Registered. + /// + public const string Registered = "\U000000AE"; + + /// + /// Gets the "relieved_face" emoji. + /// Description: Relieved face. + /// + public const string RelievedFace = "\U0001F60C"; + + /// + /// Gets the "reminder_ribbon" emoji. + /// Description: Reminder ribbon. + /// + public const string ReminderRibbon = "\U0001F397"; + + /// + /// Gets the "repeat_button" emoji. + /// Description: Repeat button. + /// + public const string RepeatButton = "\U0001F501"; + + /// + /// Gets the "repeat_single_button" emoji. + /// Description: Repeat single button. + /// + public const string RepeatSingleButton = "\U0001F502"; + + /// + /// Gets the "rescue_workers_helmet" emoji. + /// Description: Rescue worker s helmet. + /// + public const string RescueWorkersHelmet = "\U000026D1"; + + /// + /// Gets the "restroom" emoji. + /// Description: Restroom. + /// + public const string Restroom = "\U0001F6BB"; + + /// + /// Gets the "reverse_button" emoji. + /// Description: Reverse button. + /// + public const string ReverseButton = "\U000025C0"; + + /// + /// Gets the "revolving_hearts" emoji. + /// Description: Revolving hearts. + /// + public const string RevolvingHearts = "\U0001F49E"; + + /// + /// Gets the "rhinoceros" emoji. + /// Description: Rhinoceros. + /// + public const string Rhinoceros = "\U0001F98F"; + + /// + /// Gets the "ribbon" emoji. + /// Description: Ribbon. + /// + public const string Ribbon = "\U0001F380"; + + /// + /// Gets the "rice_ball" emoji. + /// Description: Rice ball. + /// + public const string RiceBall = "\U0001F359"; + + /// + /// Gets the "rice_cracker" emoji. + /// Description: Rice cracker. + /// + public const string RiceCracker = "\U0001F358"; + + /// + /// Gets the "right_anger_bubble" emoji. + /// Description: Right anger bubble. + /// + public const string RightAngerBubble = "\U0001F5EF"; + + /// + /// Gets the "right_arrow" emoji. + /// Description: Right arrow. + /// + public const string RightArrow = "\U000027A1"; + + /// + /// Gets the "right_arrow_curving_down" emoji. + /// Description: Right arrow curving down. + /// + public const string RightArrowCurvingDown = "\U00002935"; + + /// + /// Gets the "right_arrow_curving_left" emoji. + /// Description: Right arrow curving left. + /// + public const string RightArrowCurvingLeft = "\U000021A9"; + + /// + /// Gets the "right_arrow_curving_up" emoji. + /// Description: Right arrow curving up. + /// + public const string RightArrowCurvingUp = "\U00002934"; + + /// + /// Gets the "right_facing_fist" emoji. + /// Description: right facing fist. + /// + public const string RightFacingFist = "\U0001F91C"; + + /// + /// Gets the "ring" emoji. + /// Description: Ring. + /// + public const string Ring = "\U0001F48D"; + + /// + /// Gets the "ringed_planet" emoji. + /// Description: Ringed planet. + /// + public const string RingedPlanet = "\U0001FA90"; + + /// + /// Gets the "roasted_sweet_potato" emoji. + /// Description: Roasted sweet potato. + /// + public const string RoastedSweetPotato = "\U0001F360"; + + /// + /// Gets the "robot" emoji. + /// Description: Robot. + /// + public const string Robot = "\U0001F916"; + + /// + /// Gets the "rock" emoji. + /// Description: Rock. + /// + public const string Rock = "\U0001FAA8"; + + /// + /// Gets the "rocket" emoji. + /// Description: Rocket. + /// + public const string Rocket = "\U0001F680"; + + /// + /// Gets the "rolled_up_newspaper" emoji. + /// Description: rolled up newspaper. + /// + public const string RolledUpNewspaper = "\U0001F5DE"; + + /// + /// Gets the "roller_coaster" emoji. + /// Description: Roller coaster. + /// + public const string RollerCoaster = "\U0001F3A2"; + + /// + /// Gets the "roller_skate" emoji. + /// Description: Roller skate. + /// + public const string RollerSkate = "\U0001F6FC"; + + /// + /// Gets the "rolling_on_the_floor_laughing" emoji. + /// Description: Rolling on the floor laughing. + /// + public const string RollingOnTheFloorLaughing = "\U0001F923"; + + /// + /// Gets the "roll_of_paper" emoji. + /// Description: Roll of paper. + /// + public const string RollOfPaper = "\U0001F9FB"; + + /// + /// Gets the "rooster" emoji. + /// Description: Rooster. + /// + public const string Rooster = "\U0001F413"; + + /// + /// Gets the "rose" emoji. + /// Description: Rose. + /// + public const string Rose = "\U0001F339"; + + /// + /// Gets the "rosette" emoji. + /// Description: Rosette. + /// + public const string Rosette = "\U0001F3F5"; + + /// + /// Gets the "round_pushpin" emoji. + /// Description: Round pushpin. + /// + public const string RoundPushpin = "\U0001F4CD"; + + /// + /// Gets the "rugby_football" emoji. + /// Description: Rugby football. + /// + public const string RugbyFootball = "\U0001F3C9"; + + /// + /// Gets the "running_shirt" emoji. + /// Description: Running shirt. + /// + public const string RunningShirt = "\U0001F3BD"; + + /// + /// Gets the "running_shoe" emoji. + /// Description: Running shoe. + /// + public const string RunningShoe = "\U0001F45F"; + + /// + /// Gets the "sad_but_relieved_face" emoji. + /// Description: Sad but relieved face. + /// + public const string SadButRelievedFace = "\U0001F625"; + + /// + /// Gets the "safety_pin" emoji. + /// Description: Safety pin. + /// + public const string SafetyPin = "\U0001F9F7"; + + /// + /// Gets the "safety_vest" emoji. + /// Description: Safety vest. + /// + public const string SafetyVest = "\U0001F9BA"; + + /// + /// Gets the "sagittarius" emoji. + /// Description: Sagittarius. + /// + public const string Sagittarius = "\U00002650"; + + /// + /// Gets the "sailboat" emoji. + /// Description: Sailboat. + /// + public const string Sailboat = "\U000026F5"; + + /// + /// Gets the "sake" emoji. + /// Description: Sake. + /// + public const string Sake = "\U0001F376"; + + /// + /// Gets the "salt" emoji. + /// Description: Salt. + /// + public const string Salt = "\U0001F9C2"; + + /// + /// Gets the "sandwich" emoji. + /// Description: Sandwich. + /// + public const string Sandwich = "\U0001F96A"; + + /// + /// Gets the "santa_claus" emoji. + /// Description: Santa claus. + /// + public const string SantaClaus = "\U0001F385"; + + /// + /// Gets the "sari" emoji. + /// Description: Sari. + /// + public const string Sari = "\U0001F97B"; + + /// + /// Gets the "satellite" emoji. + /// Description: Satellite. + /// + public const string Satellite = "\U0001F6F0"; + + /// + /// Gets the "satellite_antenna" emoji. + /// Description: Satellite antenna. + /// + public const string SatelliteAntenna = "\U0001F4E1"; + + /// + /// Gets the "sauropod" emoji. + /// Description: Sauropod. + /// + public const string Sauropod = "\U0001F995"; + + /// + /// Gets the "saxophone" emoji. + /// Description: Saxophone. + /// + public const string Saxophone = "\U0001F3B7"; + + /// + /// Gets the "scarf" emoji. + /// Description: Scarf. + /// + public const string Scarf = "\U0001F9E3"; + + /// + /// Gets the "school" emoji. + /// Description: School. + /// + public const string School = "\U0001F3EB"; + + /// + /// Gets the "scissors" emoji. + /// Description: Scissors. + /// + public const string Scissors = "\U00002702"; + + /// + /// Gets the "scorpio" emoji. + /// Description: Scorpio. + /// + public const string Scorpio = "\U0000264F"; + + /// + /// Gets the "scorpion" emoji. + /// Description: Scorpion. + /// + public const string Scorpion = "\U0001F982"; + + /// + /// Gets the "screwdriver" emoji. + /// Description: Screwdriver. + /// + public const string Screwdriver = "\U0001FA9B"; + + /// + /// Gets the "scroll" emoji. + /// Description: Scroll. + /// + public const string Scroll = "\U0001F4DC"; + + /// + /// Gets the "seal" emoji. + /// Description: Seal. + /// + public const string Seal = "\U0001F9AD"; + + /// + /// Gets the "seat" emoji. + /// Description: Seat. + /// + public const string Seat = "\U0001F4BA"; + + /// + /// Gets the "2nd_place_medal" emoji. + /// Description: 2nd place medal. + /// + public const string SecondPlaceMedal = "\U0001F948"; + + /// + /// Gets the "seedling" emoji. + /// Description: Seedling. + /// + public const string Seedling = "\U0001F331"; + + /// + /// Gets the "see_no_evil_monkey" emoji. + /// Description: see no evil monkey. + /// + public const string SeeNoEvilMonkey = "\U0001F648"; + + /// + /// Gets the "selfie" emoji. + /// Description: Selfie. + /// + public const string Selfie = "\U0001F933"; + + /// + /// Gets the "seven_o_clock" emoji. + /// Description: Seven o clock. + /// + public const string SevenOClock = "\U0001F556"; + + /// + /// Gets the "seven_thirty" emoji. + /// Description: seven thirty. + /// + public const string SevenThirty = "\U0001F562"; + + /// + /// Gets the "sewing_needle" emoji. + /// Description: Sewing needle. + /// + public const string SewingNeedle = "\U0001FAA1"; + + /// + /// Gets the "shallow_pan_of_food" emoji. + /// Description: Shallow pan of food. + /// + public const string ShallowPanOfFood = "\U0001F958"; + + /// + /// Gets the "shamrock" emoji. + /// Description: Shamrock. + /// + public const string Shamrock = "\U00002618"; + + /// + /// Gets the "shark" emoji. + /// Description: Shark. + /// + public const string Shark = "\U0001F988"; + + /// + /// Gets the "shaved_ice" emoji. + /// Description: Shaved ice. + /// + public const string ShavedIce = "\U0001F367"; + + /// + /// Gets the "sheaf_of_rice" emoji. + /// Description: Sheaf of rice. + /// + public const string SheafOfRice = "\U0001F33E"; + + /// + /// Gets the "shield" emoji. + /// Description: Shield. + /// + public const string Shield = "\U0001F6E1"; + + /// + /// Gets the "shinto_shrine" emoji. + /// Description: Shinto shrine. + /// + public const string ShintoShrine = "\U000026E9"; + + /// + /// Gets the "ship" emoji. + /// Description: Ship. + /// + public const string Ship = "\U0001F6A2"; + + /// + /// Gets the "shooting_star" emoji. + /// Description: Shooting star. + /// + public const string ShootingStar = "\U0001F320"; + + /// + /// Gets the "shopping_bags" emoji. + /// Description: Shopping bags. + /// + public const string ShoppingBags = "\U0001F6CD"; + + /// + /// Gets the "shopping_cart" emoji. + /// Description: Shopping cart. + /// + public const string ShoppingCart = "\U0001F6D2"; + + /// + /// Gets the "shortcake" emoji. + /// Description: Shortcake. + /// + public const string Shortcake = "\U0001F370"; + + /// + /// Gets the "shorts" emoji. + /// Description: Shorts. + /// + public const string Shorts = "\U0001FA73"; + + /// + /// Gets the "shower" emoji. + /// Description: Shower. + /// + public const string Shower = "\U0001F6BF"; + + /// + /// Gets the "shrimp" emoji. + /// Description: Shrimp. + /// + public const string Shrimp = "\U0001F990"; + + /// + /// Gets the "shuffle_tracks_button" emoji. + /// Description: Shuffle tracks button. + /// + public const string ShuffleTracksButton = "\U0001F500"; + + /// + /// Gets the "shushing_face" emoji. + /// Description: Shushing face. + /// + public const string ShushingFace = "\U0001F92B"; + + /// + /// Gets the "sign_of_the_horns" emoji. + /// Description: Sign of the horns. + /// + public const string SignOfTheHorns = "\U0001F918"; + + /// + /// Gets the "six_o_clock" emoji. + /// Description: Six o clock. + /// + public const string SixOClock = "\U0001F555"; + + /// + /// Gets the "six_thirty" emoji. + /// Description: six thirty. + /// + public const string SixThirty = "\U0001F561"; + + /// + /// Gets the "skateboard" emoji. + /// Description: Skateboard. + /// + public const string Skateboard = "\U0001F6F9"; + + /// + /// Gets the "skier" emoji. + /// Description: Skier. + /// + public const string Skier = "\U000026F7"; + + /// + /// Gets the "skis" emoji. + /// Description: Skis. + /// + public const string Skis = "\U0001F3BF"; + + /// + /// Gets the "skull" emoji. + /// Description: Skull. + /// + public const string Skull = "\U0001F480"; + + /// + /// Gets the "skull_and_crossbones" emoji. + /// Description: Skull and crossbones. + /// + public const string SkullAndCrossbones = "\U00002620"; + + /// + /// Gets the "skunk" emoji. + /// Description: Skunk. + /// + public const string Skunk = "\U0001F9A8"; + + /// + /// Gets the "sled" emoji. + /// Description: Sled. + /// + public const string Sled = "\U0001F6F7"; + + /// + /// Gets the "sleeping_face" emoji. + /// Description: Sleeping face. + /// + public const string SleepingFace = "\U0001F634"; + + /// + /// Gets the "sleepy_face" emoji. + /// Description: Sleepy face. + /// + public const string SleepyFace = "\U0001F62A"; + + /// + /// Gets the "slightly_frowning_face" emoji. + /// Description: Slightly frowning face. + /// + public const string SlightlyFrowningFace = "\U0001F641"; + + /// + /// Gets the "slightly_smiling_face" emoji. + /// Description: Slightly smiling face. + /// + public const string SlightlySmilingFace = "\U0001F642"; + + /// + /// Gets the "sloth" emoji. + /// Description: Sloth. + /// + public const string Sloth = "\U0001F9A5"; + + /// + /// Gets the "slot_machine" emoji. + /// Description: Slot machine. + /// + public const string SlotMachine = "\U0001F3B0"; + + /// + /// Gets the "small_airplane" emoji. + /// Description: Small airplane. + /// + public const string SmallAirplane = "\U0001F6E9"; + + /// + /// Gets the "small_blue_diamond" emoji. + /// Description: Small blue diamond. + /// + public const string SmallBlueDiamond = "\U0001F539"; + + /// + /// Gets the "small_orange_diamond" emoji. + /// Description: Small orange diamond. + /// + public const string SmallOrangeDiamond = "\U0001F538"; + + /// + /// Gets the "smiling_cat_with_heart_eyes" emoji. + /// Description: smiling cat with heart eyes. + /// + public const string SmilingCatWithHeartEyes = "\U0001F63B"; + + /// + /// Gets the "smiling_face" emoji. + /// Description: Smiling face. + /// + public const string SmilingFace = "\U0000263A"; + + /// + /// Gets the "smiling_face_with_halo" emoji. + /// Description: Smiling face with halo. + /// + public const string SmilingFaceWithHalo = "\U0001F607"; + + /// + /// Gets the "smiling_face_with_heart_eyes" emoji. + /// Description: smiling face with heart eyes. + /// + public const string SmilingFaceWithHeartEyes = "\U0001F60D"; + + /// + /// Gets the "smiling_face_with_hearts" emoji. + /// Description: Smiling face with hearts. + /// + public const string SmilingFaceWithHearts = "\U0001F970"; + + /// + /// Gets the "smiling_face_with_horns" emoji. + /// Description: Smiling face with horns. + /// + public const string SmilingFaceWithHorns = "\U0001F608"; + + /// + /// Gets the "smiling_face_with_smiling_eyes" emoji. + /// Description: Smiling face with smiling eyes. + /// + public const string SmilingFaceWithSmilingEyes = "\U0001F60A"; + + /// + /// Gets the "smiling_face_with_sunglasses" emoji. + /// Description: Smiling face with sunglasses. + /// + public const string SmilingFaceWithSunglasses = "\U0001F60E"; + + /// + /// Gets the "smiling_face_with_tear" emoji. + /// Description: Smiling face with tear. + /// + public const string SmilingFaceWithTear = "\U0001F972"; + + /// + /// Gets the "smirking_face" emoji. + /// Description: Smirking face. + /// + public const string SmirkingFace = "\U0001F60F"; + + /// + /// Gets the "snail" emoji. + /// Description: Snail. + /// + public const string Snail = "\U0001F40C"; + + /// + /// Gets the "snake" emoji. + /// Description: Snake. + /// + public const string Snake = "\U0001F40D"; + + /// + /// Gets the "sneezing_face" emoji. + /// Description: Sneezing face. + /// + public const string SneezingFace = "\U0001F927"; + + /// + /// Gets the "snowboarder" emoji. + /// Description: Snowboarder. + /// + public const string Snowboarder = "\U0001F3C2"; + + /// + /// Gets the "snow_capped_mountain" emoji. + /// Description: snow capped mountain. + /// + public const string SnowCappedMountain = "\U0001F3D4"; + + /// + /// Gets the "snowflake" emoji. + /// Description: Snowflake. + /// + public const string Snowflake = "\U00002744"; + + /// + /// Gets the "snowman" emoji. + /// Description: Snowman. + /// + public const string Snowman = "\U00002603"; + + /// + /// Gets the "snowman_without_snow" emoji. + /// Description: Snowman without snow. + /// + public const string SnowmanWithoutSnow = "\U000026C4"; + + /// + /// Gets the "soap" emoji. + /// Description: Soap. + /// + public const string Soap = "\U0001F9FC"; + + /// + /// Gets the "soccer_ball" emoji. + /// Description: Soccer ball. + /// + public const string SoccerBall = "\U000026BD"; + + /// + /// Gets the "socks" emoji. + /// Description: Socks. + /// + public const string Socks = "\U0001F9E6"; + + /// + /// Gets the "softball" emoji. + /// Description: Softball. + /// + public const string Softball = "\U0001F94E"; + + /// + /// Gets the "soft_ice_cream" emoji. + /// Description: Soft ice cream. + /// + public const string SoftIceCream = "\U0001F366"; + + /// + /// Gets the "soon_arrow" emoji. + /// Description: SOON arrow. + /// + public const string SoonArrow = "\U0001F51C"; + + /// + /// Gets the "sos_button" emoji. + /// Description: SOS button. + /// + public const string SosButton = "\U0001F198"; + + /// + /// Gets the "spade_suit" emoji. + /// Description: Spade suit. + /// + public const string SpadeSuit = "\U00002660"; + + /// + /// Gets the "spaghetti" emoji. + /// Description: Spaghetti. + /// + public const string Spaghetti = "\U0001F35D"; + + /// + /// Gets the "sparkle" emoji. + /// Description: Sparkle. + /// + public const string Sparkle = "\U00002747"; + + /// + /// Gets the "sparkler" emoji. + /// Description: Sparkler. + /// + public const string Sparkler = "\U0001F387"; + + /// + /// Gets the "sparkles" emoji. + /// Description: Sparkles. + /// + public const string Sparkles = "\U00002728"; + + /// + /// Gets the "sparkling_heart" emoji. + /// Description: Sparkling heart. + /// + public const string SparklingHeart = "\U0001F496"; + + /// + /// Gets the "speaker_high_volume" emoji. + /// Description: Speaker high volume. + /// + public const string SpeakerHighVolume = "\U0001F50A"; + + /// + /// Gets the "speaker_low_volume" emoji. + /// Description: Speaker low volume. + /// + public const string SpeakerLowVolume = "\U0001F508"; + + /// + /// Gets the "speaker_medium_volume" emoji. + /// Description: Speaker medium volume. + /// + public const string SpeakerMediumVolume = "\U0001F509"; + + /// + /// Gets the "speaking_head" emoji. + /// Description: Speaking head. + /// + public const string SpeakingHead = "\U0001F5E3"; + + /// + /// Gets the "speak_no_evil_monkey" emoji. + /// Description: speak no evil monkey. + /// + public const string SpeakNoEvilMonkey = "\U0001F64A"; + + /// + /// Gets the "speech_balloon" emoji. + /// Description: Speech balloon. + /// + public const string SpeechBalloon = "\U0001F4AC"; + + /// + /// Gets the "speedboat" emoji. + /// Description: Speedboat. + /// + public const string Speedboat = "\U0001F6A4"; + + /// + /// Gets the "spider" emoji. + /// Description: Spider. + /// + public const string Spider = "\U0001F577"; + + /// + /// Gets the "spider_web" emoji. + /// Description: Spider web. + /// + public const string SpiderWeb = "\U0001F578"; + + /// + /// Gets the "spiral_calendar" emoji. + /// Description: Spiral calendar. + /// + public const string SpiralCalendar = "\U0001F5D3"; + + /// + /// Gets the "spiral_notepad" emoji. + /// Description: Spiral notepad. + /// + public const string SpiralNotepad = "\U0001F5D2"; + + /// + /// Gets the "spiral_shell" emoji. + /// Description: Spiral shell. + /// + public const string SpiralShell = "\U0001F41A"; + + /// + /// Gets the "sponge" emoji. + /// Description: Sponge. + /// + public const string Sponge = "\U0001F9FD"; + + /// + /// Gets the "spoon" emoji. + /// Description: Spoon. + /// + public const string Spoon = "\U0001F944"; + + /// + /// Gets the "sports_medal" emoji. + /// Description: Sports medal. + /// + public const string SportsMedal = "\U0001F3C5"; + + /// + /// Gets the "sport_utility_vehicle" emoji. + /// Description: Sport utility vehicle. + /// + public const string SportUtilityVehicle = "\U0001F699"; + + /// + /// Gets the "spouting_whale" emoji. + /// Description: Spouting whale. + /// + public const string SpoutingWhale = "\U0001F433"; + + /// + /// Gets the "squid" emoji. + /// Description: Squid. + /// + public const string Squid = "\U0001F991"; + + /// + /// Gets the "squinting_face_with_tongue" emoji. + /// Description: Squinting face with tongue. + /// + public const string SquintingFaceWithTongue = "\U0001F61D"; + + /// + /// Gets the "stadium" emoji. + /// Description: Stadium. + /// + public const string Stadium = "\U0001F3DF"; + + /// + /// Gets the "star" emoji. + /// Description: Star. + /// + public const string Star = "\U00002B50"; + + /// + /// Gets the "star_and_crescent" emoji. + /// Description: Star and crescent. + /// + public const string StarAndCrescent = "\U0000262A"; + + /// + /// Gets the "star_of_david" emoji. + /// Description: Star of david. + /// + public const string StarOfDavid = "\U00002721"; + + /// + /// Gets the "star_struck" emoji. + /// Description: star struck. + /// + public const string StarStruck = "\U0001F929"; + + /// + /// Gets the "station" emoji. + /// Description: Station. + /// + public const string Station = "\U0001F689"; + + /// + /// Gets the "statue_of_liberty" emoji. + /// Description: Statue of liberty. + /// + public const string StatueOfLiberty = "\U0001F5FD"; + + /// + /// Gets the "steaming_bowl" emoji. + /// Description: Steaming bowl. + /// + public const string SteamingBowl = "\U0001F35C"; + + /// + /// Gets the "stethoscope" emoji. + /// Description: Stethoscope. + /// + public const string Stethoscope = "\U0001FA7A"; + + /// + /// Gets the "stop_button" emoji. + /// Description: Stop button. + /// + public const string StopButton = "\U000023F9"; + + /// + /// Gets the "stop_sign" emoji. + /// Description: Stop sign. + /// + public const string StopSign = "\U0001F6D1"; + + /// + /// Gets the "stopwatch" emoji. + /// Description: Stopwatch. + /// + public const string Stopwatch = "\U000023F1"; + + /// + /// Gets the "straight_ruler" emoji. + /// Description: Straight ruler. + /// + public const string StraightRuler = "\U0001F4CF"; + + /// + /// Gets the "strawberry" emoji. + /// Description: Strawberry. + /// + public const string Strawberry = "\U0001F353"; + + /// + /// Gets the "studio_microphone" emoji. + /// Description: Studio microphone. + /// + public const string StudioMicrophone = "\U0001F399"; + + /// + /// Gets the "stuffed_flatbread" emoji. + /// Description: Stuffed flatbread. + /// + public const string StuffedFlatbread = "\U0001F959"; + + /// + /// Gets the "sun" emoji. + /// Description: Sun. + /// + public const string Sun = "\U00002600"; + + /// + /// Gets the "sun_behind_cloud" emoji. + /// Description: Sun behind cloud. + /// + public const string SunBehindCloud = "\U000026C5"; + + /// + /// Gets the "sun_behind_large_cloud" emoji. + /// Description: Sun behind large cloud. + /// + public const string SunBehindLargeCloud = "\U0001F325"; + + /// + /// Gets the "sun_behind_rain_cloud" emoji. + /// Description: Sun behind rain cloud. + /// + public const string SunBehindRainCloud = "\U0001F326"; + + /// + /// Gets the "sun_behind_small_cloud" emoji. + /// Description: Sun behind small cloud. + /// + public const string SunBehindSmallCloud = "\U0001F324"; + + /// + /// Gets the "sunflower" emoji. + /// Description: Sunflower. + /// + public const string Sunflower = "\U0001F33B"; + + /// + /// Gets the "sunglasses" emoji. + /// Description: Sunglasses. + /// + public const string Sunglasses = "\U0001F576"; + + /// + /// Gets the "sunrise" emoji. + /// Description: Sunrise. + /// + public const string Sunrise = "\U0001F305"; + + /// + /// Gets the "sunrise_over_mountains" emoji. + /// Description: Sunrise over mountains. + /// + public const string SunriseOverMountains = "\U0001F304"; + + /// + /// Gets the "sunset" emoji. + /// Description: Sunset. + /// + public const string Sunset = "\U0001F307"; + + /// + /// Gets the "sun_with_face" emoji. + /// Description: Sun with face. + /// + public const string SunWithFace = "\U0001F31E"; + + /// + /// Gets the "superhero" emoji. + /// Description: Superhero. + /// + public const string Superhero = "\U0001F9B8"; + + /// + /// Gets the "supervillain" emoji. + /// Description: Supervillain. + /// + public const string Supervillain = "\U0001F9B9"; + + /// + /// Gets the "sushi" emoji. + /// Description: Sushi. + /// + public const string Sushi = "\U0001F363"; + + /// + /// Gets the "suspension_railway" emoji. + /// Description: Suspension railway. + /// + public const string SuspensionRailway = "\U0001F69F"; + + /// + /// Gets the "swan" emoji. + /// Description: Swan. + /// + public const string Swan = "\U0001F9A2"; + + /// + /// Gets the "sweat_droplets" emoji. + /// Description: Sweat droplets. + /// + public const string SweatDroplets = "\U0001F4A6"; + + /// + /// Gets the "synagogue" emoji. + /// Description: Synagogue. + /// + public const string Synagogue = "\U0001F54D"; + + /// + /// Gets the "syringe" emoji. + /// Description: Syringe. + /// + public const string Syringe = "\U0001F489"; + + /// + /// Gets the "taco" emoji. + /// Description: Taco. + /// + public const string Taco = "\U0001F32E"; + + /// + /// Gets the "takeout_box" emoji. + /// Description: Takeout box. + /// + public const string TakeoutBox = "\U0001F961"; + + /// + /// Gets the "tamale" emoji. + /// Description: Tamale. + /// + public const string Tamale = "\U0001FAD4"; + + /// + /// Gets the "tanabata_tree" emoji. + /// Description: Tanabata tree. + /// + public const string TanabataTree = "\U0001F38B"; + + /// + /// Gets the "tangerine" emoji. + /// Description: Tangerine. + /// + public const string Tangerine = "\U0001F34A"; + + /// + /// Gets the "taurus" emoji. + /// Description: Taurus. + /// + public const string Taurus = "\U00002649"; + + /// + /// Gets the "taxi" emoji. + /// Description: Taxi. + /// + public const string Taxi = "\U0001F695"; + + /// + /// Gets the "teacup_without_handle" emoji. + /// Description: Teacup without handle. + /// + public const string TeacupWithoutHandle = "\U0001F375"; + + /// + /// Gets the "teapot" emoji. + /// Description: Teapot. + /// + public const string Teapot = "\U0001FAD6"; + + /// + /// Gets the "tear_off_calendar" emoji. + /// Description: tear off calendar. + /// + public const string TearOffCalendar = "\U0001F4C6"; + + /// + /// Gets the "teddy_bear" emoji. + /// Description: Teddy bear. + /// + public const string TeddyBear = "\U0001F9F8"; + + /// + /// Gets the "telephone" emoji. + /// Description: Telephone. + /// + public const string Telephone = "\U0000260E"; + + /// + /// Gets the "telephone_receiver" emoji. + /// Description: Telephone receiver. + /// + public const string TelephoneReceiver = "\U0001F4DE"; + + /// + /// Gets the "telescope" emoji. + /// Description: Telescope. + /// + public const string Telescope = "\U0001F52D"; + + /// + /// Gets the "television" emoji. + /// Description: Television. + /// + public const string Television = "\U0001F4FA"; + + /// + /// Gets the "tennis" emoji. + /// Description: Tennis. + /// + public const string Tennis = "\U0001F3BE"; + + /// + /// Gets the "ten_o_clock" emoji. + /// Description: Ten o clock. + /// + public const string TenOClock = "\U0001F559"; + + /// + /// Gets the "tent" emoji. + /// Description: Tent. + /// + public const string Tent = "\U000026FA"; + + /// + /// Gets the "ten_thirty" emoji. + /// Description: ten thirty. + /// + public const string TenThirty = "\U0001F565"; + + /// + /// Gets the "test_tube" emoji. + /// Description: Test tube. + /// + public const string TestTube = "\U0001F9EA"; + + /// + /// Gets the "thermometer" emoji. + /// Description: Thermometer. + /// + public const string Thermometer = "\U0001F321"; + + /// + /// Gets the "thinking_face" emoji. + /// Description: Thinking face. + /// + public const string ThinkingFace = "\U0001F914"; + + /// + /// Gets the "3rd_place_medal" emoji. + /// Description: 3rd place medal. + /// + public const string ThirdPlaceMedal = "\U0001F949"; + + /// + /// Gets the "thong_sandal" emoji. + /// Description: Thong sandal. + /// + public const string ThongSandal = "\U0001FA74"; + + /// + /// Gets the "thought_balloon" emoji. + /// Description: Thought balloon. + /// + public const string ThoughtBalloon = "\U0001F4AD"; + + /// + /// Gets the "thread" emoji. + /// Description: Thread. + /// + public const string Thread = "\U0001F9F5"; + + /// + /// Gets the "three_o_clock" emoji. + /// Description: Three o clock. + /// + public const string ThreeOClock = "\U0001F552"; + + /// + /// Gets the "three_thirty" emoji. + /// Description: three thirty. + /// + public const string ThreeThirty = "\U0001F55E"; + + /// + /// Gets the "thumbs_down" emoji. + /// Description: Thumbs down. + /// + public const string ThumbsDown = "\U0001F44E"; + + /// + /// Gets the "thumbs_up" emoji. + /// Description: Thumbs up. + /// + public const string ThumbsUp = "\U0001F44D"; + + /// + /// Gets the "ticket" emoji. + /// Description: Ticket. + /// + public const string Ticket = "\U0001F3AB"; + + /// + /// Gets the "tiger" emoji. + /// Description: Tiger. + /// + public const string Tiger = "\U0001F405"; + + /// + /// Gets the "tiger_face" emoji. + /// Description: Tiger face. + /// + public const string TigerFace = "\U0001F42F"; + + /// + /// Gets the "timer_clock" emoji. + /// Description: Timer clock. + /// + public const string TimerClock = "\U000023F2"; + + /// + /// Gets the "tired_face" emoji. + /// Description: Tired face. + /// + public const string TiredFace = "\U0001F62B"; + + /// + /// Gets the "toilet" emoji. + /// Description: Toilet. + /// + public const string Toilet = "\U0001F6BD"; + + /// + /// Gets the "tokyo_tower" emoji. + /// Description: Tokyo tower. + /// + public const string TokyoTower = "\U0001F5FC"; + + /// + /// Gets the "tomato" emoji. + /// Description: Tomato. + /// + public const string Tomato = "\U0001F345"; + + /// + /// Gets the "tongue" emoji. + /// Description: Tongue. + /// + public const string Tongue = "\U0001F445"; + + /// + /// Gets the "toolbox" emoji. + /// Description: Toolbox. + /// + public const string Toolbox = "\U0001F9F0"; + + /// + /// Gets the "tooth" emoji. + /// Description: Tooth. + /// + public const string Tooth = "\U0001F9B7"; + + /// + /// Gets the "toothbrush" emoji. + /// Description: Toothbrush. + /// + public const string Toothbrush = "\U0001FAA5"; + + /// + /// Gets the "top_arrow" emoji. + /// Description: TOP arrow. + /// + public const string TopArrow = "\U0001F51D"; + + /// + /// Gets the "top_hat" emoji. + /// Description: Top hat. + /// + public const string TopHat = "\U0001F3A9"; + + /// + /// Gets the "tornado" emoji. + /// Description: Tornado. + /// + public const string Tornado = "\U0001F32A"; + + /// + /// Gets the "trackball" emoji. + /// Description: Trackball. + /// + public const string Trackball = "\U0001F5B2"; + + /// + /// Gets the "tractor" emoji. + /// Description: Tractor. + /// + public const string Tractor = "\U0001F69C"; + + /// + /// Gets the "trade_mark" emoji. + /// Description: Trade mark. + /// + public const string TradeMark = "\U00002122"; + + /// + /// Gets the "train" emoji. + /// Description: Train. + /// + public const string Train = "\U0001F686"; + + /// + /// Gets the "tram" emoji. + /// Description: Tram. + /// + public const string Tram = "\U0001F68A"; + + /// + /// Gets the "tram_car" emoji. + /// Description: Tram car. + /// + public const string TramCar = "\U0001F68B"; + + /// + /// Gets the "transgender_symbol" emoji. + /// Description: Transgender symbol. + /// + public const string TransgenderSymbol = "\U000026A7"; + + /// + /// Gets the "t_rex" emoji. + /// Description: T Rex. + /// + public const string TRex = "\U0001F996"; + + /// + /// Gets the "triangular_flag" emoji. + /// Description: Triangular flag. + /// + public const string TriangularFlag = "\U0001F6A9"; + + /// + /// Gets the "triangular_ruler" emoji. + /// Description: Triangular ruler. + /// + public const string TriangularRuler = "\U0001F4D0"; + + /// + /// Gets the "trident_emblem" emoji. + /// Description: Trident emblem. + /// + public const string TridentEmblem = "\U0001F531"; + + /// + /// Gets the "trolleybus" emoji. + /// Description: Trolleybus. + /// + public const string Trolleybus = "\U0001F68E"; + + /// + /// Gets the "trophy" emoji. + /// Description: Trophy. + /// + public const string Trophy = "\U0001F3C6"; + + /// + /// Gets the "tropical_drink" emoji. + /// Description: Tropical drink. + /// + public const string TropicalDrink = "\U0001F379"; + + /// + /// Gets the "tropical_fish" emoji. + /// Description: Tropical fish. + /// + public const string TropicalFish = "\U0001F420"; + + /// + /// Gets the "trumpet" emoji. + /// Description: Trumpet. + /// + public const string Trumpet = "\U0001F3BA"; + + /// + /// Gets the "t_shirt" emoji. + /// Description: t shirt. + /// + public const string TShirt = "\U0001F455"; + + /// + /// Gets the "tulip" emoji. + /// Description: Tulip. + /// + public const string Tulip = "\U0001F337"; + + /// + /// Gets the "tumbler_glass" emoji. + /// Description: Tumbler glass. + /// + public const string TumblerGlass = "\U0001F943"; + + /// + /// Gets the "turkey" emoji. + /// Description: Turkey. + /// + public const string Turkey = "\U0001F983"; + + /// + /// Gets the "turtle" emoji. + /// Description: Turtle. + /// + public const string Turtle = "\U0001F422"; + + /// + /// Gets the "twelve_o_clock" emoji. + /// Description: Twelve o clock. + /// + public const string TwelveOClock = "\U0001F55B"; + + /// + /// Gets the "twelve_thirty" emoji. + /// Description: twelve thirty. + /// + public const string TwelveThirty = "\U0001F567"; + + /// + /// Gets the "two_hearts" emoji. + /// Description: Two hearts. + /// + public const string TwoHearts = "\U0001F495"; + + /// + /// Gets the "two_hump_camel" emoji. + /// Description: two hump camel. + /// + public const string TwoHumpCamel = "\U0001F42B"; + + /// + /// Gets the "two_o_clock" emoji. + /// Description: Two o clock. + /// + public const string TwoOClock = "\U0001F551"; + + /// + /// Gets the "two_thirty" emoji. + /// Description: two thirty. + /// + public const string TwoThirty = "\U0001F55D"; + + /// + /// Gets the "umbrella" emoji. + /// Description: Umbrella. + /// + public const string Umbrella = "\U00002602"; + + /// + /// Gets the "umbrella_on_ground" emoji. + /// Description: Umbrella on ground. + /// + public const string UmbrellaOnGround = "\U000026F1"; + + /// + /// Gets the "umbrella_with_rain_drops" emoji. + /// Description: Umbrella with rain drops. + /// + public const string UmbrellaWithRainDrops = "\U00002614"; + + /// + /// Gets the "unamused_face" emoji. + /// Description: Unamused face. + /// + public const string UnamusedFace = "\U0001F612"; + + /// + /// Gets the "unicorn" emoji. + /// Description: Unicorn. + /// + public const string Unicorn = "\U0001F984"; + + /// + /// Gets the "unlocked" emoji. + /// Description: Unlocked. + /// + public const string Unlocked = "\U0001F513"; + + /// + /// Gets the "up_arrow" emoji. + /// Description: Up arrow. + /// + public const string UpArrow = "\U00002B06"; + + /// + /// Gets the "up_button" emoji. + /// Description: UP button. + /// + public const string UpButton = "\U0001F199"; + + /// + /// Gets the "up_down_arrow" emoji. + /// Description: up down arrow. + /// + public const string UpDownArrow = "\U00002195"; + + /// + /// Gets the "up_left_arrow" emoji. + /// Description: up left arrow. + /// + public const string UpLeftArrow = "\U00002196"; + + /// + /// Gets the "up_right_arrow" emoji. + /// Description: up right arrow. + /// + public const string UpRightArrow = "\U00002197"; + + /// + /// Gets the "upside_down_face" emoji. + /// Description: upside down face. + /// + public const string UpsideDownFace = "\U0001F643"; + + /// + /// Gets the "upwards_button" emoji. + /// Description: Upwards button. + /// + public const string UpwardsButton = "\U0001F53C"; + + /// + /// Gets the "vampire" emoji. + /// Description: Vampire. + /// + public const string Vampire = "\U0001F9DB"; + + /// + /// Gets the "vertical_traffic_light" emoji. + /// Description: Vertical traffic light. + /// + public const string VerticalTrafficLight = "\U0001F6A6"; + + /// + /// Gets the "vibration_mode" emoji. + /// Description: Vibration mode. + /// + public const string VibrationMode = "\U0001F4F3"; + + /// + /// Gets the "victory_hand" emoji. + /// Description: Victory hand. + /// + public const string VictoryHand = "\U0000270C"; + + /// + /// Gets the "video_camera" emoji. + /// Description: Video camera. + /// + public const string VideoCamera = "\U0001F4F9"; + + /// + /// Gets the "videocassette" emoji. + /// Description: Videocassette. + /// + public const string Videocassette = "\U0001F4FC"; + + /// + /// Gets the "video_game" emoji. + /// Description: Video game. + /// + public const string VideoGame = "\U0001F3AE"; + + /// + /// Gets the "violin" emoji. + /// Description: Violin. + /// + public const string Violin = "\U0001F3BB"; + + /// + /// Gets the "virgo" emoji. + /// Description: Virgo. + /// + public const string Virgo = "\U0000264D"; + + /// + /// Gets the "volcano" emoji. + /// Description: Volcano. + /// + public const string Volcano = "\U0001F30B"; + + /// + /// Gets the "volleyball" emoji. + /// Description: Volleyball. + /// + public const string Volleyball = "\U0001F3D0"; + + /// + /// Gets the "vs_button" emoji. + /// Description: VS button. + /// + public const string VsButton = "\U0001F19A"; + + /// + /// Gets the "vulcan_salute" emoji. + /// Description: Vulcan salute. + /// + public const string VulcanSalute = "\U0001F596"; + + /// + /// Gets the "waffle" emoji. + /// Description: Waffle. + /// + public const string Waffle = "\U0001F9C7"; + + /// + /// Gets the "waning_crescent_moon" emoji. + /// Description: Waning crescent moon. + /// + public const string WaningCrescentMoon = "\U0001F318"; + + /// + /// Gets the "waning_gibbous_moon" emoji. + /// Description: Waning gibbous moon. + /// + public const string WaningGibbousMoon = "\U0001F316"; + + /// + /// Gets the "warning" emoji. + /// Description: Warning. + /// + public const string Warning = "\U000026A0"; + + /// + /// Gets the "wastebasket" emoji. + /// Description: Wastebasket. + /// + public const string Wastebasket = "\U0001F5D1"; + + /// + /// Gets the "watch" emoji. + /// Description: Watch. + /// + public const string Watch = "\U0000231A"; + + /// + /// Gets the "water_buffalo" emoji. + /// Description: Water buffalo. + /// + public const string WaterBuffalo = "\U0001F403"; + + /// + /// Gets the "water_closet" emoji. + /// Description: Water closet. + /// + public const string WaterCloset = "\U0001F6BE"; + + /// + /// Gets the "watermelon" emoji. + /// Description: Watermelon. + /// + public const string Watermelon = "\U0001F349"; + + /// + /// Gets the "water_pistol" emoji. + /// Description: Water pistol. + /// + public const string WaterPistol = "\U0001F52B"; + + /// + /// Gets the "water_wave" emoji. + /// Description: Water wave. + /// + public const string WaterWave = "\U0001F30A"; + + /// + /// Gets the "waving_hand" emoji. + /// Description: Waving hand. + /// + public const string WavingHand = "\U0001F44B"; + + /// + /// Gets the "wavy_dash" emoji. + /// Description: Wavy dash. + /// + public const string WavyDash = "\U00003030"; + + /// + /// Gets the "waxing_crescent_moon" emoji. + /// Description: Waxing crescent moon. + /// + public const string WaxingCrescentMoon = "\U0001F312"; + + /// + /// Gets the "waxing_gibbous_moon" emoji. + /// Description: Waxing gibbous moon. + /// + public const string WaxingGibbousMoon = "\U0001F314"; + + /// + /// Gets the "weary_cat" emoji. + /// Description: Weary cat. + /// + public const string WearyCat = "\U0001F640"; + + /// + /// Gets the "weary_face" emoji. + /// Description: Weary face. + /// + public const string WearyFace = "\U0001F629"; + + /// + /// Gets the "wedding" emoji. + /// Description: Wedding. + /// + public const string Wedding = "\U0001F492"; + + /// + /// Gets the "whale" emoji. + /// Description: Whale. + /// + public const string Whale = "\U0001F40B"; + + /// + /// Gets the "wheelchair_symbol" emoji. + /// Description: Wheelchair symbol. + /// + public const string WheelchairSymbol = "\U0000267F"; + + /// + /// Gets the "wheel_of_dharma" emoji. + /// Description: Wheel of dharma. + /// + public const string WheelOfDharma = "\U00002638"; + + /// + /// Gets the "white_cane" emoji. + /// Description: White cane. + /// + public const string WhiteCane = "\U0001F9AF"; + + /// + /// Gets the "white_circle" emoji. + /// Description: White circle. + /// + public const string WhiteCircle = "\U000026AA"; + + /// + /// Gets the "white_exclamation_mark" emoji. + /// Description: White exclamation mark. + /// + public const string WhiteExclamationMark = "\U00002755"; + + /// + /// Gets the "white_flag" emoji. + /// Description: White flag. + /// + public const string WhiteFlag = "\U0001F3F3"; + + /// + /// Gets the "white_flower" emoji. + /// Description: White flower. + /// + public const string WhiteFlower = "\U0001F4AE"; + + /// + /// Gets the "white_hair" emoji. + /// Description: White hair. + /// + public const string WhiteHair = "\U0001F9B3"; + + /// + /// Gets the "white_heart" emoji. + /// Description: White heart. + /// + public const string WhiteHeart = "\U0001F90D"; + + /// + /// Gets the "white_large_square" emoji. + /// Description: White large square. + /// + public const string WhiteLargeSquare = "\U00002B1C"; + + /// + /// Gets the "white_medium_small_square" emoji. + /// Description: white medium small square. + /// + public const string WhiteMediumSmallSquare = "\U000025FD"; + + /// + /// Gets the "white_medium_square" emoji. + /// Description: White medium square. + /// + public const string WhiteMediumSquare = "\U000025FB"; + + /// + /// Gets the "white_question_mark" emoji. + /// Description: White question mark. + /// + public const string WhiteQuestionMark = "\U00002754"; + + /// + /// Gets the "white_small_square" emoji. + /// Description: White small square. + /// + public const string WhiteSmallSquare = "\U000025AB"; + + /// + /// Gets the "white_square_button" emoji. + /// Description: White square button. + /// + public const string WhiteSquareButton = "\U0001F533"; + + /// + /// Gets the "wilted_flower" emoji. + /// Description: Wilted flower. + /// + public const string WiltedFlower = "\U0001F940"; + + /// + /// Gets the "wind_chime" emoji. + /// Description: Wind chime. + /// + public const string WindChime = "\U0001F390"; + + /// + /// Gets the "wind_face" emoji. + /// Description: Wind face. + /// + public const string WindFace = "\U0001F32C"; + + /// + /// Gets the "window" emoji. + /// Description: Window. + /// + public const string Window = "\U0001FA9F"; + + /// + /// Gets the "wine_glass" emoji. + /// Description: Wine glass. + /// + public const string WineGlass = "\U0001F377"; + + /// + /// Gets the "winking_face" emoji. + /// Description: Winking face. + /// + public const string WinkingFace = "\U0001F609"; + + /// + /// Gets the "winking_face_with_tongue" emoji. + /// Description: Winking face with tongue. + /// + public const string WinkingFaceWithTongue = "\U0001F61C"; + + /// + /// Gets the "wolf" emoji. + /// Description: Wolf. + /// + public const string Wolf = "\U0001F43A"; + + /// + /// Gets the "woman" emoji. + /// Description: Woman. + /// + public const string Woman = "\U0001F469"; + + /// + /// Gets the "woman_and_man_holding_hands" emoji. + /// Description: Woman and man holding hands. + /// + public const string WomanAndManHoldingHands = "\U0001F46B"; + + /// + /// Gets the "woman_dancing" emoji. + /// Description: Woman dancing. + /// + public const string WomanDancing = "\U0001F483"; + + /// + /// Gets the "womans_boot" emoji. + /// Description: Woman s boot. + /// + public const string WomansBoot = "\U0001F462"; + + /// + /// Gets the "womans_clothes" emoji. + /// Description: Woman s clothes. + /// + public const string WomansClothes = "\U0001F45A"; + + /// + /// Gets the "womans_hat" emoji. + /// Description: Woman s hat. + /// + public const string WomansHat = "\U0001F452"; + + /// + /// Gets the "womans_sandal" emoji. + /// Description: Woman s sandal. + /// + public const string WomansSandal = "\U0001F461"; + + /// + /// Gets the "woman_with_headscarf" emoji. + /// Description: Woman with headscarf. + /// + public const string WomanWithHeadscarf = "\U0001F9D5"; + + /// + /// Gets the "women_holding_hands" emoji. + /// Description: Women holding hands. + /// + public const string WomenHoldingHands = "\U0001F46D"; + + /// + /// Gets the "womens_room" emoji. + /// Description: Women s room. + /// + public const string WomensRoom = "\U0001F6BA"; + + /// + /// Gets the "wood" emoji. + /// Description: Wood. + /// + public const string Wood = "\U0001FAB5"; + + /// + /// Gets the "woozy_face" emoji. + /// Description: Woozy face. + /// + public const string WoozyFace = "\U0001F974"; + + /// + /// Gets the "world_map" emoji. + /// Description: World map. + /// + public const string WorldMap = "\U0001F5FA"; + + /// + /// Gets the "worm" emoji. + /// Description: Worm. + /// + public const string Worm = "\U0001FAB1"; + + /// + /// Gets the "worried_face" emoji. + /// Description: Worried face. + /// + public const string WorriedFace = "\U0001F61F"; + + /// + /// Gets the "wrapped_gift" emoji. + /// Description: Wrapped gift. + /// + public const string WrappedGift = "\U0001F381"; + + /// + /// Gets the "wrench" emoji. + /// Description: Wrench. + /// + public const string Wrench = "\U0001F527"; + + /// + /// Gets the "writing_hand" emoji. + /// Description: Writing hand. + /// + public const string WritingHand = "\U0000270D"; + + /// + /// Gets the "yarn" emoji. + /// Description: Yarn. + /// + public const string Yarn = "\U0001F9F6"; + + /// + /// Gets the "yawning_face" emoji. + /// Description: Yawning face. + /// + public const string YawningFace = "\U0001F971"; + + /// + /// Gets the "yellow_circle" emoji. + /// Description: Yellow circle. + /// + public const string YellowCircle = "\U0001F7E1"; + + /// + /// Gets the "yellow_heart" emoji. + /// Description: Yellow heart. + /// + public const string YellowHeart = "\U0001F49B"; + + /// + /// Gets the "yellow_square" emoji. + /// Description: Yellow square. + /// + public const string YellowSquare = "\U0001F7E8"; + + /// + /// Gets the "yen_banknote" emoji. + /// Description: Yen banknote. + /// + public const string YenBanknote = "\U0001F4B4"; + + /// + /// Gets the "yin_yang" emoji. + /// Description: Yin yang. + /// + public const string YinYang = "\U0000262F"; + + /// + /// Gets the "yo_yo" emoji. + /// Description: yo yo. + /// + public const string YoYo = "\U0001FA80"; + + /// + /// Gets the "zany_face" emoji. + /// Description: Zany face. + /// + public const string ZanyFace = "\U0001F92A"; + + /// + /// Gets the "zebra" emoji. + /// Description: Zebra. + /// + public const string Zebra = "\U0001F993"; + + /// + /// Gets the "zipper_mouth_face" emoji. + /// Description: zipper mouth face. + /// + public const string ZipperMouthFace = "\U0001F910"; + + /// + /// Gets the "zombie" emoji. + /// Description: Zombie. + /// + public const string Zombie = "\U0001F9DF"; + + /// + /// Gets the "zzz" emoji. + /// Description: Zzz. + /// + public const string Zzz = "\U0001F4A4"; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Emoji.cs b/src/Spectre.Console.Rx/Spectre.Console/Emoji.cs new file mode 100644 index 0000000..e2e3e03 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Emoji.cs @@ -0,0 +1,124 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Utility for working with emojis. +/// +public static partial class Emoji +{ + private static readonly Dictionary _remappings; + + static Emoji() => _remappings = new Dictionary(StringComparer.OrdinalIgnoreCase); + + /// + /// Remaps a specific emoji tag with a new emoji. + /// + /// The emoji tag. + /// The emoji. + public static void Remap(string tag, string emoji) + { + if (tag is null) + { + throw new ArgumentNullException(nameof(tag)); + } + + if (emoji is null) + { + throw new ArgumentNullException(nameof(emoji)); + } + + tag = tag.TrimStart(':').TrimEnd(':'); + emoji = emoji.TrimStart(':').TrimEnd(':'); + + _remappings[tag] = emoji; + } + +#if NETSTANDARD2_0 + /// + /// Replaces emoji markup with corresponding unicode characters. + /// + /// A string with emojis codes, e.g. "Hello :smiley:!". + /// A string with emoji codes replaced with actual emoji. + public static string Replace(string value) => Replace(value.AsSpan()); +#endif + + /// + /// Replaces emoji markup with corresponding unicode characters. + /// + /// A string with emojis codes, e.g. "Hello :smiley:!". + /// A string with emoji codes replaced with actual emoji. + public static string Replace(ReadOnlySpan value) + { + var output = new StringBuilder(); + var colonPos = value.IndexOf(':'); + if (colonPos == -1) + { + // No colons, no emoji. return what was passed in with no changes. + return value.ToString(); + } + + while ((colonPos = value.IndexOf(':')) != -1) + { + // Append text up to colon + output.AppendSpan(value.Slice(0, colonPos)); + + // Set value equal to that colon and the rest of the string + value = value.Slice(colonPos); + + // Find colon after that. if no colon, break out + var nextColonPos = value.IndexOf(':', 1); + if (nextColonPos == -1) + { + break; + } + + // Get the emoji text minus the colons + var emojiKey = value.Slice(1, nextColonPos - 1).ToString(); + if (TryGetEmoji(emojiKey, out var emojiValue)) + { + output.Append(emojiValue); + value = value.Slice(nextColonPos + 1); + } + else + { + output.Append(':'); + value = value.Slice(1); + } + } + + output.AppendSpan(value); + return output.ToString(); + } + + private static bool TryGetEmoji(string emoji, out string value) + { + if (_remappings.TryGetValue(emoji, out var remappedEmojiValue)) + { + value = remappedEmojiValue; + return true; + } + + if (_emojis.TryGetValue(emoji, out var emojiValue)) + { + value = emojiValue; + return true; + } + + value = string.Empty; + return false; + } + + private static int IndexOf(this ReadOnlySpan span, char value, int startIndex) + { + var indexInSlice = span.Slice(startIndex).IndexOf(value); + + if (indexInSlice == -1) + { + return -1; + } + + return startIndex + indexInSlice; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/AppVeyorEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/AppVeyorEnricher.cs new file mode 100644 index 0000000..f7819a3 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/AppVeyorEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class AppVeyorEnricher : IProfileEnricher +{ + public string Name => "AppVeyor"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("APPVEYOR"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BambooEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BambooEnricher.cs new file mode 100644 index 0000000..9b1fa5c --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BambooEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class BambooEnricher : IProfileEnricher +{ + public string Name => "Bamboo"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("bamboo_buildNumber"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BitbucketEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BitbucketEnricher.cs new file mode 100644 index 0000000..354b00a --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BitbucketEnricher.cs @@ -0,0 +1,15 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class BitbucketEnricher : IProfileEnricher +{ + public string Name => "Bitbucket"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("BITBUCKET_REPO_OWNER") || + environmentVariables.ContainsKey("BITBUCKET_REPO_SLUG") || + environmentVariables.ContainsKey("BITBUCKET_COMMIT"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BitriseEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BitriseEnricher.cs new file mode 100644 index 0000000..e2d9f89 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/BitriseEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class BitriseEnricher : IProfileEnricher +{ + public string Name => "Bitrise"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("BITRISE_BUILD_URL"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/ContinuaEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/ContinuaEnricher.cs new file mode 100644 index 0000000..0c09d09 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/ContinuaEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class ContinuaEnricher : IProfileEnricher +{ + public string Name => "ContinuaCI"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("ContinuaCI.Version"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GitHubEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GitHubEnricher.cs new file mode 100644 index 0000000..36b7b30 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GitHubEnricher.cs @@ -0,0 +1,27 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class GitHubEnricher : IProfileEnricher +{ + public string Name => "GitHub"; + + public bool Enabled(IDictionary environmentVariables) + { + if (environmentVariables.TryGetValue("GITHUB_ACTIONS", out var value)) + { + return value?.Equals("true", StringComparison.OrdinalIgnoreCase) ?? false; + } + + return false; + } + + public void Enrich(Profile profile) + { + profile.Capabilities.Ansi = true; + profile.Capabilities.Legacy = false; + profile.Capabilities.Interactive = false; + profile.Capabilities.Links = false; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GitLabEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GitLabEnricher.cs new file mode 100644 index 0000000..fedecd2 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GitLabEnricher.cs @@ -0,0 +1,21 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class GitLabEnricher : IProfileEnricher +{ + public string Name => "GitLab"; + + public bool Enabled(IDictionary environmentVariables) + { + if (environmentVariables.TryGetValue("CI_SERVER", out var value)) + { + return value?.Equals("yes", StringComparison.OrdinalIgnoreCase) ?? false; + } + + return false; + } + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GoCDEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GoCDEnricher.cs new file mode 100644 index 0000000..cb31875 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/GoCDEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class GoCDEnricher : IProfileEnricher +{ + public string Name => "GoCD"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("GO_SERVER_URL"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/JenkinsEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/JenkinsEnricher.cs new file mode 100644 index 0000000..4490808 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/JenkinsEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class JenkinsEnricher : IProfileEnricher +{ + public string Name => "Jenkins"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("JENKINS_URL"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/MyGetEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/MyGetEnricher.cs new file mode 100644 index 0000000..c50dc08 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/MyGetEnricher.cs @@ -0,0 +1,21 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class MyGetEnricher : IProfileEnricher +{ + public string Name => "MyGet"; + + public bool Enabled(IDictionary environmentVariables) + { + if (environmentVariables.TryGetValue("BuildRunner", out var value)) + { + return value?.Equals("MyGet", StringComparison.OrdinalIgnoreCase) ?? false; + } + + return false; + } + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TeamCityEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TeamCityEnricher.cs new file mode 100644 index 0000000..3946acd --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TeamCityEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class TeamCityEnricher : IProfileEnricher +{ + public string Name => "TeamCity"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("TEAMCITY_VERSION"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TfsEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TfsEnricher.cs new file mode 100644 index 0000000..4667cc6 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TfsEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class TfsEnricher : IProfileEnricher +{ + public string Name => "TFS"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("TF_BUILD"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TravisEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TravisEnricher.cs new file mode 100644 index 0000000..d759be7 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/CI/TravisEnricher.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal sealed class TravisEnricher : IProfileEnricher +{ + public string Name => "Travis"; + + public bool Enabled(IDictionary environmentVariables) => environmentVariables.ContainsKey("TRAVIS"); + + public void Enrich(Profile profile) => profile.Capabilities.Interactive = false; +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/ProfileEnricher.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/ProfileEnricher.cs new file mode 100644 index 0000000..1cc6ed2 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/ProfileEnricher.cs @@ -0,0 +1,93 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Enrichment; + +internal static class ProfileEnricher +{ + private static readonly List _defaultEnrichers = new() + { + new AppVeyorEnricher(), + new BambooEnricher(), + new BitbucketEnricher(), + new BitriseEnricher(), + new ContinuaEnricher(), + new GitHubEnricher(), + new GitLabEnricher(), + new GoCDEnricher(), + new JenkinsEnricher(), + new MyGetEnricher(), + new TeamCityEnricher(), + new TfsEnricher(), + new TravisEnricher(), + }; + + public static void Enrich( + Profile profile, + ProfileEnrichment settings, + IDictionary? environmentVariables) + { + if (profile is null) + { + throw new ArgumentNullException(nameof(profile)); + } + + settings ??= new ProfileEnrichment(); + + var variables = GetEnvironmentVariables(environmentVariables); + foreach (var enricher in GetEnrichers(settings)) + { + if (string.IsNullOrWhiteSpace(enricher.Name)) + { + throw new InvalidOperationException($"Profile enricher of type '{enricher.GetType().FullName}' does not have a name."); + } + + if (enricher.Enabled(variables)) + { + enricher.Enrich(profile); + profile.AddEnricher(enricher.Name); + } + } + } + + private static List GetEnrichers(ProfileEnrichment settings) + { + var enrichers = new List(); + + if (settings.UseDefaultEnrichers) + { + enrichers.AddRange(_defaultEnrichers); + } + + if (settings.Enrichers?.Count > 0) + { + enrichers.AddRange(settings.Enrichers); + } + + return enrichers; + } + + private static IDictionary GetEnvironmentVariables(IDictionary? variables) + { + if (variables != null) + { + return new Dictionary(variables, StringComparer.OrdinalIgnoreCase); + } + + return Environment.GetEnvironmentVariables() + .Cast() + .Aggregate( + new Dictionary(StringComparer.OrdinalIgnoreCase), + (dictionary, entry) => + { + var key = (string)entry.Key; + if (!dictionary.TryGetValue(key, out _)) + { + dictionary.Add(key, entry.Value as string ?? string.Empty); + } + + return dictionary; + }, + dictionary => dictionary); + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Enrichment/ProfileEnrichment.cs b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/ProfileEnrichment.cs new file mode 100644 index 0000000..17b01cd --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Enrichment/ProfileEnrichment.cs @@ -0,0 +1,22 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains settings for profile enrichment. +/// +public sealed class ProfileEnrichment +{ + /// + /// Gets or sets a value indicating whether or not + /// any default enrichers should be added. + /// + /// Defaults to true. + public bool UseDefaultEnrichers { get; set; } = true; + + /// + /// Gets or sets the list of custom enrichers to use. + /// + public List? Enrichers { get; set; } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Advanced/AnsiConsoleExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Advanced/AnsiConsoleExtensions.cs new file mode 100644 index 0000000..a995ec1 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Advanced/AnsiConsoleExtensions.cs @@ -0,0 +1,44 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Advanced; + +/// +/// Contains extension methods for . +/// +public static class AnsiConsoleExtensions +{ + /// + /// Writes a VT/Ansi control code sequence to the console (if supported). + /// + /// The console to write to. + /// The VT/Ansi control code sequence to write. + public static void WriteAnsi(this IAnsiConsole console, string sequence) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + if (console.Profile.Capabilities.Ansi) + { + console.Write(new ControlCode(sequence)); + } + } + + /// + /// Gets the VT/ANSI control code sequence for a . + /// + /// The console. + /// The renderable to the VT/ANSI control code sequence for. + /// The VT/ANSI control code sequence. + public static string ToAnsi(this IAnsiConsole console, IRenderable renderable) + { + if (console == null) + { + throw new ArgumentNullException(nameof(console)); + } + + return AnsiBuilder.Build(console, renderable); + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AlignExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AlignExtensions.cs new file mode 100644 index 0000000..07bdfb1 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AlignExtensions.cs @@ -0,0 +1,109 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Extensions; + +/// +/// Contains extension methods for . +/// +public static class AlignExtensions +{ + /// + /// Sets the width. + /// + /// The object. + /// The width, or null for no explicit width. + /// The same instance so that multiple calls can be chained. + public static Align Width(this Align align, int? width) + { + if (align is null) + { + throw new ArgumentNullException(nameof(align)); + } + + align.Width = width; + return align; + } + + /// + /// Sets the height. + /// + /// The object. + /// The height, or null for no explicit height. + /// The same instance so that multiple calls can be chained. + public static Align Height(this Align align, int? height) + { + if (align is null) + { + throw new ArgumentNullException(nameof(align)); + } + + align.Height = height; + return align; + } + + /// + /// Sets the vertical alignment. + /// + /// The object. + /// The vertical alignment, or null for no vertical alignment. + /// The same instance so that multiple calls can be chained. + public static Align VerticalAlignment(this Align align, VerticalAlignment? vertical) + { + if (align is null) + { + throw new ArgumentNullException(nameof(align)); + } + + align.Vertical = vertical; + return align; + } + + /// + /// Sets the object to be top aligned. + /// + /// The object. + /// The same instance so that multiple calls can be chained. + public static Align TopAligned(this Align align) + { + if (align is null) + { + throw new ArgumentNullException(nameof(align)); + } + + align.Vertical = Rx.VerticalAlignment.Top; + return align; + } + + /// + /// Sets the object to be middle aligned. + /// + /// The object. + /// The same instance so that multiple calls can be chained. + public static Align MiddleAligned(this Align align) + { + if (align is null) + { + throw new ArgumentNullException(nameof(align)); + } + + align.Vertical = Rx.VerticalAlignment.Middle; + return align; + } + + /// + /// Sets the object to be bottom aligned. + /// + /// The object. + /// The same instance so that multiple calls can be chained. + public static Align BottomAligned(this Align align) + { + if (align is null) + { + throw new ArgumentNullException(nameof(align)); + } + + align.Vertical = Rx.VerticalAlignment.Bottom; + return align; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AlignableExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AlignableExtensions.cs new file mode 100644 index 0000000..a86fa77 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AlignableExtensions.cs @@ -0,0 +1,83 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class AlignableExtensions +{ + /// + /// Sets the alignment for an object. + /// + /// The alignable object type. + /// The alignable object. + /// The alignment. + /// The same instance so that multiple calls can be chained. + public static T Alignment(this T obj, Justify? alignment) + where T : class, IAlignable + { + if (obj is null) + { + throw new System.ArgumentNullException(nameof(obj)); + } + + obj.Alignment = alignment; + return obj; + } + + /// + /// Sets the object to be left aligned. + /// + /// The alignable type. + /// The alignable object. + /// The same instance so that multiple calls can be chained. + public static T LeftAligned(this T obj) + where T : class, IAlignable + { + if (obj is null) + { + throw new System.ArgumentNullException(nameof(obj)); + } + + obj.Alignment = Justify.Left; + return obj; + } + + /// + /// Sets the object to be centered. + /// + /// The alignable type. + /// The alignable object. + /// The same instance so that multiple calls can be chained. + public static T Centered(this T obj) + where T : class, IAlignable + { + if (obj is null) + { + throw new System.ArgumentNullException(nameof(obj)); + } + + obj.Alignment = Justify.Center; + return obj; + } + + /// + /// Sets the object to be right aligned. + /// + /// The alignable type. + /// The alignable object. + /// The same instance so that multiple calls can be chained. + public static T RightAligned(this T obj) + where T : class, IAlignable + { + if (obj is null) + { + throw new System.ArgumentNullException(nameof(obj)); + } + + obj.Alignment = Justify.Right; + return obj; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs new file mode 100644 index 0000000..6dc91d3 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs @@ -0,0 +1,42 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Writes an exception to the console. + /// + /// The console. + /// The exception to write to the console. + /// The exception format options. + public static void WriteException(this IAnsiConsole console, Exception exception, ExceptionFormats format = ExceptionFormats.Default) + { + if (console == null) + { + throw new ArgumentNullException(nameof(console)); + } + + console.Write(exception.GetRenderable(format)); + } + + /// + /// Writes an exception to the console. + /// + /// The console. + /// The exception to write to the console. + /// The exception settings. + public static void WriteException(this IAnsiConsole console, Exception exception, ExceptionSettings settings) + { + if (console == null) + { + throw new ArgumentNullException(nameof(console)); + } + + console.Write(exception.GetRenderable(settings)); + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Exclusive.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Exclusive.cs new file mode 100644 index 0000000..bfc1ac9 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Exclusive.cs @@ -0,0 +1,44 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Runs the specified function in exclusive mode. + /// + /// The result type. + /// The console. + /// The func to run in exclusive mode. + /// The result of the function. + public static T RunExclusive(this IAnsiConsole console, Func func) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + return console.ExclusivityMode.Run(func); + } + + /// + /// Runs the specified function in exclusive mode asynchronously. + /// + /// The result type. + /// The console. + /// The func to run in exclusive mode. + /// The result of the function. + public static Task RunExclusive(this IAnsiConsole console, Func> func) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + return console.ExclusivityMode.RunAsync(func); + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs new file mode 100644 index 0000000..00aa7af --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs @@ -0,0 +1,129 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + private enum AutoCompleteDirection + { + Forward, + Backward, + } + + internal static async Task ReadLine(this IAnsiConsole console, Style? style, bool secret, char? mask, IEnumerable? items = null, CancellationToken cancellationToken = default) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + style ??= Style.Plain; + var text = string.Empty; + + var autocomplete = new List(items ?? Enumerable.Empty()); + + while (true) + { + var rawKey = await console.Input.ReadKeyAsync(true, cancellationToken).ConfigureAwait(false); + if (rawKey == null) + { + continue; + } + + var key = rawKey.Value; + if (key.Key == ConsoleKey.Enter) + { + return text; + } + + if (key.Key == ConsoleKey.Tab && autocomplete.Count > 0) + { + var autoCompleteDirection = key.Modifiers.HasFlag(ConsoleModifiers.Shift) + ? AutoCompleteDirection.Backward + : AutoCompleteDirection.Forward; + var replace = AutoComplete(autocomplete, text, autoCompleteDirection); + if (!string.IsNullOrEmpty(replace)) + { + // Render the suggestion + console.Write("\b \b".Repeat(text.Length), style); + console.Write(replace); + text = replace; + continue; + } + } + + if (key.Key == ConsoleKey.Backspace) + { + if (text.Length > 0) + { + text = text.Substring(0, text.Length - 1); + console.Write("\b \b"); + } + + continue; + } + + if (!char.IsControl(key.KeyChar)) + { + text += key.KeyChar.ToString(); + var output = key.KeyChar.ToString(); + console.Write(secret ? output.Mask(mask) : output, style); + } + } + } + + private static string AutoComplete(List autocomplete, string text, AutoCompleteDirection autoCompleteDirection) + { + var found = autocomplete.Find(i => i == text); + var replace = string.Empty; + + if (found == null) + { + // Get the closest match + var next = autocomplete.Find(i => i.StartsWith(text, true, CultureInfo.InvariantCulture)); + if (next != null) + { + replace = next; + } + else if (string.IsNullOrEmpty(text)) + { + // Use the first item + replace = autocomplete[0]; + } + } + else + { + // Get the next match + replace = GetAutocompleteValue(autoCompleteDirection, autocomplete, found); + } + + return replace; + } + + private static string GetAutocompleteValue(AutoCompleteDirection autoCompleteDirection, IList autocomplete, string found) + { + var foundAutocompleteIndex = autocomplete.IndexOf(found); + var index = autoCompleteDirection switch + { + AutoCompleteDirection.Forward => foundAutocompleteIndex + 1, + AutoCompleteDirection.Backward => foundAutocompleteIndex - 1, + _ => throw new ArgumentOutOfRangeException(nameof(autoCompleteDirection), autoCompleteDirection, null), + }; + + if (index >= autocomplete.Count) + { + index = 0; + } + + if (index < 0) + { + index = autocomplete.Count - 1; + } + + return autocomplete[index]; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Live.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Live.cs new file mode 100644 index 0000000..2803720 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Live.cs @@ -0,0 +1,31 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Creates a new instance for the console. + /// + /// The console. + /// The target renderable to update. + /// A instance. + public static LiveDisplay Live(this IAnsiConsole console, IRenderable target) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + if (target is null) + { + throw new ArgumentNullException(nameof(target)); + } + + return new LiveDisplay(console, target); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs new file mode 100644 index 0000000..7373a94 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs @@ -0,0 +1,148 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Writes the specified markup to the console. + /// + /// The console to write to. + /// A composite format string. + /// An array of objects to write. + public static void Markup(this IAnsiConsole console, string format, params object[] args) => Markup(console, CultureInfo.CurrentCulture, format, args); + + /// + /// Writes the specified markup to the console. + /// + /// All interpolation holes which contain a string are automatically escaped so you must not call . + /// + /// + /// + /// string input = args[0]; + /// string output = Process(input); + /// console.MarkupInterpolated($"[blue]{input}[/] -> [green]{output}[/]"); + /// + /// + /// The console to write to. + /// The interpolated string value to write. + public static void MarkupInterpolated(this IAnsiConsole console, FormattableString value) => MarkupInterpolated(console, CultureInfo.CurrentCulture, value); + + /// + /// Writes the specified markup to the console. + /// + /// The console to write to. + /// An object that supplies culture-specific formatting information. + /// A composite format string. + /// An array of objects to write. + public static void Markup(this IAnsiConsole console, IFormatProvider provider, string format, params object[] args) => Markup(console, string.Format(provider, format, args)); + + /// + /// Writes the specified markup to the console. + /// + /// All interpolation holes which contain a string are automatically escaped so you must not call . + /// + /// + /// + /// string input = args[0]; + /// string output = Process(input); + /// console.MarkupInterpolated(CultureInfo.InvariantCulture, $"[blue]{input}[/] -> [green]{output}[/]"); + /// + /// + /// The console to write to. + /// An object that supplies culture-specific formatting information. + /// The interpolated string value to write. + public static void MarkupInterpolated(this IAnsiConsole console, IFormatProvider provider, FormattableString value) + { + if (value is null) + { + throw new ArgumentNullException(nameof(value)); + } + + Markup(console, Rx.Markup.EscapeInterpolated(provider, value)); + } + + /// + /// Writes the specified markup to the console. + /// + /// The console to write to. + /// The value to write. + public static void Markup(this IAnsiConsole console, string value) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + console.Write(MarkupParser.Parse(value)); + } + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// The console to write to. + /// A composite format string. + /// An array of objects to write. + public static void MarkupLine(this IAnsiConsole console, string format, params object[] args) => MarkupLine(console, CultureInfo.CurrentCulture, format, args); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// All interpolation holes which contain a string are automatically escaped so you must not call . + /// + /// + /// + /// string input = args[0]; + /// string output = Process(input); + /// console.MarkupLineInterpolated($"[blue]{input}[/] -> [green]{output}[/]"); + /// + /// + /// The console to write to. + /// The interpolated string value to write. + public static void MarkupLineInterpolated(this IAnsiConsole console, FormattableString value) => MarkupLineInterpolated(console, CultureInfo.CurrentCulture, value); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// The console to write to. + /// The value to write. + public static void MarkupLine(this IAnsiConsole console, string value) => Markup(console, value + Environment.NewLine); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// The console to write to. + /// An object that supplies culture-specific formatting information. + /// A composite format string. + /// An array of objects to write. + public static void MarkupLine(this IAnsiConsole console, IFormatProvider provider, string format, params object[] args) => Markup(console, provider, format + Environment.NewLine, args); + + /// + /// Writes the specified markup, followed by the current line terminator, to the console. + /// + /// All interpolation holes which contain a string are automatically escaped so you must not call . + /// + /// + /// + /// string input = args[0]; + /// string output = Process(input); + /// console.MarkupLineInterpolated(CultureInfo.InvariantCulture, $"[blue]{input}[/] -> [green]{output}[/]"); + /// + /// + /// The console to write to. + /// An object that supplies culture-specific formatting information. + /// The interpolated string value to write. + public static void MarkupLineInterpolated(this IAnsiConsole console, IFormatProvider provider, FormattableString value) + { + if (value is null) + { + throw new ArgumentNullException(nameof(value)); + } + + MarkupLine(console, Rx.Markup.EscapeInterpolated(provider, value)); + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Progress.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Progress.cs new file mode 100644 index 0000000..a275f6e --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Progress.cs @@ -0,0 +1,40 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Creates a new instance for the console. + /// + /// The console. + /// A instance. + public static Progress Progress(this IAnsiConsole console) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + return new Progress(console); + } + + /// + /// Creates a new instance for the console. + /// + /// The console. + /// A instance. + public static Status Status(this IAnsiConsole console) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + return new Status(console); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Prompt.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Prompt.cs new file mode 100644 index 0000000..c38bd82 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Prompt.cs @@ -0,0 +1,64 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Displays a prompt to the user. + /// + /// The prompt result type. + /// The console. + /// The prompt to display. + /// The prompt input result. + public static T Prompt(this IAnsiConsole console, IPrompt prompt) + { + if (prompt is null) + { + throw new ArgumentNullException(nameof(prompt)); + } + + return prompt.Show(console); + } + + /// + /// Displays a prompt to the user. + /// + /// The prompt result type. + /// The console. + /// The prompt markup text. + /// The prompt input result. + public static T Ask(this IAnsiConsole console, string prompt) => new TextPrompt(prompt).Show(console); + + /// + /// Displays a prompt to the user. + /// + /// The prompt result type. + /// The console. + /// The prompt markup text. + /// Specific CultureInfo to use when converting input. + /// The prompt input result. + public static T Ask(this IAnsiConsole console, string prompt, CultureInfo? culture) + { + var textPrompt = new TextPrompt(prompt); + textPrompt.Culture = culture; + return textPrompt.Show(console); + } + + /// + /// Displays a prompt with two choices, yes or no. + /// + /// The console. + /// The prompt markup text. + /// Specifies the default answer. + /// true if the user selected "yes", otherwise false. + public static bool Confirm(this IAnsiConsole console, string prompt, bool defaultValue = true) => new ConfirmationPrompt(prompt) + { + DefaultValue = defaultValue, + } + .Show(console); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Rendering.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Rendering.cs new file mode 100644 index 0000000..0f26a5a --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Rendering.cs @@ -0,0 +1,31 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Renders the specified object to the console. + /// + /// The console to render to. + /// The object to render. + [Obsolete("Consider using IAnsiConsole.Write instead.")] + public static void Render(this IAnsiConsole console, IRenderable renderable) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + if (renderable is null) + { + throw new ArgumentNullException(nameof(renderable)); + } + + console.Write(renderable); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Screen.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Screen.cs new file mode 100644 index 0000000..8cf411d --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.Screen.cs @@ -0,0 +1,52 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Switches to an alternate screen buffer if the terminal supports it. + /// + /// The console. + /// The action to execute within the alternate screen buffer. + public static void AlternateScreen(this IAnsiConsole console, Action action) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + if (action is null) + { + throw new ArgumentNullException(nameof(action)); + } + + if (!console.Profile.Capabilities.Ansi) + { + throw new NotSupportedException("Alternate buffers are not supported since your terminal does not support ANSI."); + } + + if (!console.Profile.Capabilities.AlternateBuffer) + { + throw new NotSupportedException("Alternate buffers are not supported by your terminal."); + } + + // Switch to alternate screen + console.Write(new ControlCode("\u001b[?1049h\u001b[H")); + + try + { + // Execute custom action + action(); + } + finally + { + // Switch back to primary screen + console.Write(new ControlCode("\u001b[?1049l")); + } + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.cs new file mode 100644 index 0000000..b27f3bc --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/AnsiConsoleExtensions.cs @@ -0,0 +1,104 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class AnsiConsoleExtensions +{ + /// + /// Creates a recorder for the specified console. + /// + /// The console to record. + /// A recorder for the specified console. + public static Recorder CreateRecorder(this IAnsiConsole console) => new(console); + + /// + /// Clears the console. + /// + /// The console to clear. + public static void Clear(this IAnsiConsole console) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + console.Clear(true); + } + + /// + /// Writes the specified string value to the console. + /// + /// The console to write to. + /// The text to write. + public static void Write(this IAnsiConsole console, string text) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + console.Write(new Text(text, Style.Plain)); + } + + /// + /// Writes the specified string value to the console. + /// + /// The console to write to. + /// The text to write. + /// The text style or if . + public static void Write(this IAnsiConsole console, string text, Style? style) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + console.Write(new Text(text, style)); + } + + /// + /// Writes an empty line to the console. + /// + /// The console to write to. + public static void WriteLine(this IAnsiConsole console) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + console.Write(Text.NewLine); + } + + /// + /// Writes the specified string value, followed by the current line terminator, to the console. + /// + /// The console to write to. + /// The text to write. + public static void WriteLine(this IAnsiConsole console, string text) => WriteLine(console, text, Style.Plain); + + /// + /// Writes the specified string value, followed by the current line terminator, to the console. + /// + /// The console to write to. + /// The text to write. + /// The text style or if . + public static void WriteLine(this IAnsiConsole console, string text, Style? style) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + if (text is null) + { + throw new ArgumentNullException(nameof(text)); + } + + console.Write(text + Environment.NewLine, style); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/BarChartExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/BarChartExtensions.cs new file mode 100644 index 0000000..aa8df32 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/BarChartExtensions.cs @@ -0,0 +1,252 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class BarChartExtensions +{ + /// + /// Adds an item to the bar chart. + /// + /// The bar chart. + /// The item label. + /// The item value. + /// The item color. + /// The same instance so that multiple calls can be chained. + public static BarChart AddItem(this BarChart chart, string label, double value, Color? color = null) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.Data.Add(new BarChartItem(label, value, color)); + return chart; + } + + /// + /// Adds an item to the bar chart. + /// + /// A type that implements . + /// The bar chart. + /// The item. + /// The same instance so that multiple calls can be chained. + public static BarChart AddItem(this BarChart chart, T item) + where T : IBarChartItem + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + if (item is BarChartItem barChartItem) + { + chart.Data.Add(barChartItem); + } + else + { + chart.Data.Add( + new BarChartItem( + item.Label, + item.Value, + item.Color)); + } + + return chart; + } + + /// + /// Adds multiple items to the bar chart. + /// + /// A type that implements . + /// The bar chart. + /// The items. + /// The same instance so that multiple calls can be chained. + public static BarChart AddItems(this BarChart chart, IEnumerable items) + where T : IBarChartItem + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + if (items is null) + { + throw new ArgumentNullException(nameof(items)); + } + + foreach (var item in items) + { + AddItem(chart, item); + } + + return chart; + } + + /// + /// Adds multiple items to the bar chart. + /// + /// A type that implements . + /// The bar chart. + /// The items. + /// The converter that converts instances of T to . + /// The same instance so that multiple calls can be chained. + public static BarChart AddItems(this BarChart chart, IEnumerable items, Func converter) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + if (items is null) + { + throw new ArgumentNullException(nameof(items)); + } + + if (converter is null) + { + throw new ArgumentNullException(nameof(converter)); + } + + foreach (var item in items) + { + chart.Data.Add(converter(item)); + } + + return chart; + } + + /// + /// Sets the width of the bar chart. + /// + /// The bar chart. + /// The bar chart width. + /// The same instance so that multiple calls can be chained. + public static BarChart Width(this BarChart chart, int? width) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.Width = width; + return chart; + } + + /// + /// Sets the label of the bar chart. + /// + /// The bar chart. + /// The bar chart label. + /// The same instance so that multiple calls can be chained. + public static BarChart Label(this BarChart chart, string? label) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.Label = label; + return chart; + } + + /// + /// Shows values next to each bar in the bar chart. + /// + /// The bar chart. + /// The same instance so that multiple calls can be chained. + public static BarChart ShowValues(this BarChart chart) => ShowValues(chart, true); + + /// + /// Hides values next to each bar in the bar chart. + /// + /// The bar chart. + /// The same instance so that multiple calls can be chained. + public static BarChart HideValues(this BarChart chart) => ShowValues(chart, false); + + /// + /// Sets whether or not values should be shown + /// next to each bar. + /// + /// The bar chart. + /// Whether or not values should be shown next to each bar. + /// The same instance so that multiple calls can be chained. + public static BarChart ShowValues(this BarChart chart, bool show) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.ShowValues = show; + return chart; + } + + /// + /// Aligns the label to the left. + /// + /// The bar chart. + /// The same instance so that multiple calls can be chained. + public static BarChart LeftAlignLabel(this BarChart chart) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.LabelAlignment = Justify.Left; + return chart; + } + + /// + /// Centers the label. + /// + /// The bar chart. + /// The same instance so that multiple calls can be chained. + public static BarChart CenterLabel(this BarChart chart) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.LabelAlignment = Justify.Center; + return chart; + } + + /// + /// Aligns the label to the right. + /// + /// The bar chart. + /// The same instance so that multiple calls can be chained. + public static BarChart RightAlignLabel(this BarChart chart) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.LabelAlignment = Justify.Right; + return chart; + } + + /// + /// Sets the max fixed value for the chart. + /// + /// The bar chart. + /// Max value for the chart. + /// The same instance so that multiple calls can be chained. + public static BarChart WithMaxValue(this BarChart chart, double maxValue) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.MaxValue = maxValue; + return chart; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/BoxExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/BoxExtensions.cs new file mode 100644 index 0000000..93a4017 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/BoxExtensions.cs @@ -0,0 +1,31 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx.Rendering; + +/// +/// Contains extension methods for . +/// +public static class BoxExtensions +{ + /// + /// Gets the safe border for a border. + /// + /// The border to get the safe border for. + /// Whether or not to return the safe border. + /// The safe border if one exist, otherwise the original border. + public static BoxBorder GetSafeBorder(this BoxBorder border, bool safe) + { + if (border is null) + { + throw new ArgumentNullException(nameof(border)); + } + + if (safe && border.SafeBorder != null) + { + border = border.SafeBorder; + } + + return border; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/BreakdownChartExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/BreakdownChartExtensions.cs new file mode 100644 index 0000000..b35f643 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/BreakdownChartExtensions.cs @@ -0,0 +1,285 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class BreakdownChartExtensions +{ + /// + /// Adds an item to the breakdown chart. + /// + /// The breakdown chart. + /// The item label. + /// The item value. + /// The item color. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart AddItem(this BreakdownChart chart, string label, double value, Color color) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.Data.Add(new BreakdownChartItem(label, value, color)); + return chart; + } + + /// + /// Adds an item to the breakdown chart. + /// + /// A type that implements . + /// The breakdown chart. + /// The item. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart AddItem(this BreakdownChart chart, T item) + where T : IBreakdownChartItem + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + if (item is BreakdownChartItem chartItem) + { + chart.Data.Add(chartItem); + } + else + { + chart.Data.Add( + new BreakdownChartItem( + item.Label, + item.Value, + item.Color)); + } + + return chart; + } + + /// + /// Adds multiple items to the breakdown chart. + /// + /// A type that implements . + /// The breakdown chart. + /// The items. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart AddItems(this BreakdownChart chart, IEnumerable items) + where T : IBreakdownChartItem + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + if (items is null) + { + throw new ArgumentNullException(nameof(items)); + } + + foreach (var item in items) + { + AddItem(chart, item); + } + + return chart; + } + + /// + /// Adds multiple items to the breakdown chart. + /// + /// A type that implements . + /// The breakdown chart. + /// The items. + /// The converter that converts instances of T to . + /// The same instance so that multiple calls can be chained. + public static BreakdownChart AddItems(this BreakdownChart chart, IEnumerable items, Func converter) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + if (items is null) + { + throw new ArgumentNullException(nameof(items)); + } + + if (converter is null) + { + throw new ArgumentNullException(nameof(converter)); + } + + foreach (var item in items) + { + chart.Data.Add(converter(item)); + } + + return chart; + } + + /// + /// Sets the width of the breakdown chart. + /// + /// The breakdown chart. + /// The breakdown chart width. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart Width(this BreakdownChart chart, int? width) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.Width = width; + return chart; + } + + /// + /// Tags will be shown. + /// + /// The breakdown chart. + /// The value formatter to use. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart UseValueFormatter(this BreakdownChart chart, Func? func) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.ValueFormatter = func; + return chart; + } + + /// + /// Tags will be shown. + /// + /// The breakdown chart. + /// The value formatter to use. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart UseValueFormatter(this BreakdownChart chart, Func? func) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.ValueFormatter = func != null + ? (value, _) => func(value) + : null; + + return chart; + } + + /// + /// Tags will be shown. + /// + /// The breakdown chart. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart ShowPercentage(this BreakdownChart chart) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.ValueFormatter = (value, culture) => string.Format(culture, "{0}%", value); + + return chart; + } + + /// + /// Tags will be shown. + /// + /// The breakdown chart. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart ShowTags(this BreakdownChart chart) => ShowTags(chart, true); + + /// + /// Tags will be not be shown. + /// + /// The breakdown chart. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart HideTags(this BreakdownChart chart) => ShowTags(chart, false); + + /// + /// Sets whether or not tags will be shown. + /// + /// The breakdown chart. + /// Whether or not tags will be shown. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart ShowTags(this BreakdownChart chart, bool show) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.ShowTags = show; + return chart; + } + + /// + /// Tag values will be shown. + /// + /// The breakdown chart. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart ShowTagValues(this BreakdownChart chart) => ShowTagValues(chart, true); + + /// + /// Tag values will be not be shown. + /// + /// The breakdown chart. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart HideTagValues(this BreakdownChart chart) => ShowTagValues(chart, false); + + /// + /// Sets whether or not tag values will be shown. + /// + /// The breakdown chart. + /// Whether or not tag values will be shown. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart ShowTagValues(this BreakdownChart chart, bool show) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.ShowTagValues = show; + return chart; + } + + /// + /// Chart and tags is rendered in compact mode. + /// + /// The breakdown chart. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart Compact(this BreakdownChart chart) => Compact(chart, true); + + /// + /// Chart and tags is rendered in full size mode. + /// + /// The breakdown chart. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart FullSize(this BreakdownChart chart) => Compact(chart, false); + + /// + /// Sets whether or not the chart and tags should be rendered in compact mode. + /// + /// The breakdown chart. + /// Whether or not the chart and tags should be rendered in compact mode. + /// The same instance so that multiple calls can be chained. + public static BreakdownChart Compact(this BreakdownChart chart, bool compact) + { + if (chart is null) + { + throw new ArgumentNullException(nameof(chart)); + } + + chart.Compact = compact; + return chart; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/CalendarExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/CalendarExtensions.cs new file mode 100644 index 0000000..dd8071d --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/CalendarExtensions.cs @@ -0,0 +1,123 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class CalendarExtensions +{ + /// + /// Adds a calendar event. + /// + /// The calendar to add the calendar event to. + /// The calendar event date. + /// The same instance so that multiple calls can be chained. + public static Calendar AddCalendarEvent(this Calendar calendar, DateTime date) => AddCalendarEvent(calendar, string.Empty, date.Year, date.Month, date.Day); + + /// + /// Adds a calendar event. + /// + /// The calendar to add the calendar event to. + /// The calendar event description. + /// The calendar event date. + /// The same instance so that multiple calls can be chained. + public static Calendar AddCalendarEvent(this Calendar calendar, string description, DateTime date) => AddCalendarEvent(calendar, description, date.Year, date.Month, date.Day); + + /// + /// Adds a calendar event. + /// + /// The calendar to add the calendar event to. + /// The year of the calendar event. + /// The month of the calendar event. + /// The day of the calendar event. + /// The same instance so that multiple calls can be chained. + public static Calendar AddCalendarEvent(this Calendar calendar, int year, int month, int day) => AddCalendarEvent(calendar, string.Empty, year, month, day); + + /// + /// Adds a calendar event. + /// + /// The calendar. + /// The calendar event description. + /// The year of the calendar event. + /// The month of the calendar event. + /// The day of the calendar event. + /// The same instance so that multiple calls can be chained. + public static Calendar AddCalendarEvent(this Calendar calendar, string description, int year, int month, int day) + { + if (calendar is null) + { + throw new ArgumentNullException(nameof(calendar)); + } + + calendar.CalendarEvents.Add(new CalendarEvent(description, year, month, day)); + return calendar; + } + + /// + /// Sets the calendar's highlight . + /// + /// The calendar. + /// The highlight style. + /// The same instance so that multiple calls can be chained. + public static Calendar HighlightStyle(this Calendar calendar, Style? style) + { + if (calendar is null) + { + throw new ArgumentNullException(nameof(calendar)); + } + + calendar.HighlightStyle = style ?? Style.Plain; + return calendar; + } + + /// + /// Sets the calendar's header . + /// + /// The calendar. + /// The header style. + /// The same instance so that multiple calls can be chained. + public static Calendar HeaderStyle(this Calendar calendar, Style? style) + { + if (calendar is null) + { + throw new ArgumentNullException(nameof(calendar)); + } + + calendar.HeaderStyle = style ?? Style.Plain; + return calendar; + } + + /// + /// Shows the calendar header. + /// + /// The calendar. + /// The same instance so that multiple calls can be chained. + public static Calendar ShowHeader(this Calendar calendar) + { + if (calendar is null) + { + throw new ArgumentNullException(nameof(calendar)); + } + + calendar.ShowHeader = true; + return calendar; + } + + /// + /// Hides the calendar header. + /// + /// The calendar. + /// The same instance so that multiple calls can be chained. + public static Calendar HideHeader(this Calendar calendar) + { + if (calendar is null) + { + throw new ArgumentNullException(nameof(calendar)); + } + + calendar.ShowHeader = false; + return calendar; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/CharExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/CharExtensions.cs new file mode 100644 index 0000000..f594451 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/CharExtensions.cs @@ -0,0 +1,17 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static partial class CharExtensions +{ + /// + /// Gets the cell width of a character. + /// + /// The character to get the cell width of. + /// The cell width of the character. + public static int GetCellWidth(this char character) => Cell.GetCellLength(character); +} \ No newline at end of file diff --git a/src/Shared/Extensions/ColorExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ColorExtensions.cs similarity index 55% rename from src/Shared/Extensions/ColorExtensions.cs rename to src/Spectre.Console.Rx/Spectre.Console/Extensions/ColorExtensions.cs index 6f1368a..116883a 100644 --- a/src/Shared/Extensions/ColorExtensions.cs +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ColorExtensions.cs @@ -1,7 +1,7 @@ // Copyright (c) Chris Pulman. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. -namespace Spectre.Console.Examples; +namespace Spectre.Console.Rx; /// /// ColorExtensions. @@ -13,13 +13,9 @@ public static class ColorExtensions /// /// The color. /// A color. - public static Color GetInvertedColor(this Color color) - { - return GetLuminance(color) < 140 ? Color.White : Color.Black; - } + public static Rx.Color GetInvertedColor(this Rx.Color color) => + GetLuminance(color) < 140 ? Rx.Color.White : Rx.Color.Black; - private static float GetLuminance(this Color color) - { - return (float)((0.2126 * color.R) + (0.7152 * color.G) + (0.0722 * color.B)); - } + private static float GetLuminance(this Rx.Color color) => + (float)((0.2126 * color.R) + (0.7152 * color.G) + (0.0722 * color.B)); } diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/ColumnExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ColumnExtensions.cs new file mode 100644 index 0000000..8450a7d --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ColumnExtensions.cs @@ -0,0 +1,47 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class ColumnExtensions +{ + /// + /// Prevents a column from wrapping. + /// + /// An object implementing . + /// The column. + /// The same instance so that multiple calls can be chained. + public static T NoWrap(this T obj) + where T : class, IColumn + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.NoWrap = true; + return obj; + } + + /// + /// Sets the width of the column. + /// + /// An object implementing . + /// The column. + /// The column width. + /// The same instance so that multiple calls can be chained. + public static T Width(this T obj, int? width) + where T : class, IColumn + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.Width = width; + return obj; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/ConfirmationPromptExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ConfirmationPromptExtensions.cs new file mode 100644 index 0000000..aa5c174 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ConfirmationPromptExtensions.cs @@ -0,0 +1,123 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class ConfirmationPromptExtensions +{ + /// + /// Show or hide choices. + /// + /// The prompt. + /// Whether or not the choices should be visible. + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt ShowChoices(this ConfirmationPrompt obj, bool show) + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.ShowChoices = show; + return obj; + } + + /// + /// Shows choices. + /// + /// The prompt. + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt ShowChoices(this ConfirmationPrompt obj) => ShowChoices(obj, true); + + /// + /// Hides choices. + /// + /// The prompt. + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt HideChoices(this ConfirmationPrompt obj) => ShowChoices(obj, false); + + /// + /// Show or hide the default value. + /// + /// The prompt. + /// Whether or not the default value should be visible. + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt ShowDefaultValue(this ConfirmationPrompt obj, bool show) + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.ShowDefaultValue = show; + return obj; + } + + /// + /// Shows the default value. + /// + /// The prompt. + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt ShowDefaultValue(this ConfirmationPrompt obj) => ShowDefaultValue(obj, true); + + /// + /// Hides the default value. + /// + /// The prompt. + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt HideDefaultValue(this ConfirmationPrompt obj) => ShowDefaultValue(obj, false); + + /// + /// Sets the "invalid choice" message for the prompt. + /// + /// The prompt. + /// The "invalid choice" message. + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt InvalidChoiceMessage(this ConfirmationPrompt obj, string message) + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.InvalidChoiceMessage = message; + return obj; + } + + /// + /// Sets the character to interpret as "yes". + /// + /// The confirmation prompt. + /// The character to interpret as "yes". + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt Yes(this ConfirmationPrompt obj, char character) + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.Yes = character; + return obj; + } + + /// + /// Sets the character to interpret as "no". + /// + /// The confirmation prompt. + /// The character to interpret as "no". + /// The same instance so that multiple calls can be chained. + public static ConfirmationPrompt No(this ConfirmationPrompt obj, char character) + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.No = character; + return obj; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/ContextExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ContextExtensions.cs new file mode 100644 index 0000000..39fced8 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ContextExtensions.cs @@ -0,0 +1,98 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System.Reactive.Concurrency; + +namespace Spectre.Console.Rx; + +/// +/// ContextExtensions. +/// +public static class ContextExtensions +{ + /// + /// Schedules the specified action. + /// + /// The context. + /// The delay. + /// The is complete. + /// The action. + /// + /// A representing the asynchronous operation. + /// + public static Task Schedule(this IContext context, TimeSpan delay, Func isComplete, Action action) + { + var consoleScheduler = new SpectreConsoleScheduler(); + var lockTillComplete = new SemaphoreSlim(1); + lockTillComplete.Wait(); + consoleScheduler.Schedule(async () => + { + while (!isComplete()) + { + action(); + context.Refresh(); + await consoleScheduler.Sleep(delay); + } + + lockTillComplete.Release(); + }); + + lockTillComplete.Wait(); + lockTillComplete.Dispose(); + return Task.CompletedTask; + } + + /// + /// Schedules the specified action. + /// + /// The context. + /// The action. + /// + /// A representing the asynchronous operation. + /// + public static Task Schedule(this IContext context, Action action) + { + var consoleScheduler = new SpectreConsoleScheduler(); + var lockTillComplete = new SemaphoreSlim(1); + lockTillComplete.Wait(); + consoleScheduler.Schedule(() => + { + action(consoleScheduler); + lockTillComplete.Release(); + }); + + lockTillComplete.Wait(); + lockTillComplete.Dispose(); + return Task.CompletedTask; + } + + /// + /// Schedules the specified is complete. + /// + /// The context. + /// The is complete. + /// The action. + /// + /// A representing the asynchronous operation. + /// + [SuppressMessage("Performance", "CA1822:Mark members as static", Justification = "Not Desired")] + public static Task Schedule(this IContext context, Func isComplete, Action action) + { + var consoleScheduler = new SpectreConsoleScheduler(); + var lockTillComplete = new SemaphoreSlim(1); + lockTillComplete.Wait(); + consoleScheduler.Schedule(() => + { + while (!isComplete()) + { + action(consoleScheduler); + } + + lockTillComplete.Release(); + }); + + lockTillComplete.Wait(); + lockTillComplete.Dispose(); + return Task.CompletedTask; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/CursorExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/CursorExtensions.cs new file mode 100644 index 0000000..fca242c --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/CursorExtensions.cs @@ -0,0 +1,154 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class CursorExtensions +{ + /// + /// Shows the cursor. + /// + /// The cursor. + public static void Show(this IAnsiConsoleCursor cursor) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Show(true); + } + + /// + /// Hides the cursor. + /// + /// The cursor. + public static void Hide(this IAnsiConsoleCursor cursor) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Show(false); + } + + /// + /// Moves the cursor up. + /// + /// The cursor. + public static void MoveUp(this IAnsiConsoleCursor cursor) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Move(CursorDirection.Up, 1); + } + + /// + /// Moves the cursor up. + /// + /// The cursor. + /// The number of steps to move the cursor. + public static void MoveUp(this IAnsiConsoleCursor cursor, int steps) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Move(CursorDirection.Up, steps); + } + + /// + /// Moves the cursor down. + /// + /// The cursor. + public static void MoveDown(this IAnsiConsoleCursor cursor) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Move(CursorDirection.Down, 1); + } + + /// + /// Moves the cursor down. + /// + /// The cursor. + /// The number of steps to move the cursor. + public static void MoveDown(this IAnsiConsoleCursor cursor, int steps) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Move(CursorDirection.Down, steps); + } + + /// + /// Moves the cursor to the left. + /// + /// The cursor. + public static void MoveLeft(this IAnsiConsoleCursor cursor) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Move(CursorDirection.Left, 1); + } + + /// + /// Moves the cursor to the left. + /// + /// The cursor. + /// The number of steps to move the cursor. + public static void MoveLeft(this IAnsiConsoleCursor cursor, int steps) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Move(CursorDirection.Left, steps); + } + + /// + /// Moves the cursor to the right. + /// + /// The cursor. + public static void MoveRight(this IAnsiConsoleCursor cursor) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Move(CursorDirection.Right, 1); + } + + /// + /// Moves the cursor to the right. + /// + /// The cursor. + /// The number of steps to move the cursor. + public static void MoveRight(this IAnsiConsoleCursor cursor, int steps) + { + if (cursor is null) + { + throw new System.ArgumentNullException(nameof(cursor)); + } + + cursor.Move(CursorDirection.Right, steps); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/DayOfWeekExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/DayOfWeekExtensions.cs new file mode 100644 index 0000000..6cd1bb5 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/DayOfWeekExtensions.cs @@ -0,0 +1,26 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +internal static class DayOfWeekExtensions +{ + public static string GetAbbreviatedDayName(this DayOfWeek day, CultureInfo culture) + { + culture ??= CultureInfo.InvariantCulture; + return culture.DateTimeFormat + .GetAbbreviatedDayName(day) + .CapitalizeFirstLetter(culture); + } + + public static DayOfWeek GetNextWeekDay(this DayOfWeek day) + { + var next = (int)day + 1; + if (next > (int)DayOfWeek.Saturday) + { + return DayOfWeek.Sunday; + } + + return (DayOfWeek)next; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/DictionaryExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/DictionaryExtensions.cs new file mode 100644 index 0000000..f2ffc8f --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/DictionaryExtensions.cs @@ -0,0 +1,13 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +internal static class DictionaryExtensions +{ + public static void Deconstruct(this KeyValuePair tuple, out T1 key, out T2 value) + { + key = tuple.Key; + value = tuple.Value; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/ExceptionExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ExceptionExtensions.cs new file mode 100644 index 0000000..3a0c07d --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ExceptionExtensions.cs @@ -0,0 +1,50 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class ExceptionExtensions +{ + /// + /// Gets a representation of the exception. + /// + /// The exception to format. + /// The exception format options. + /// A representing the exception. + public static IRenderable GetRenderable(this Exception exception, ExceptionFormats format = ExceptionFormats.Default) + { + if (exception is null) + { + throw new ArgumentNullException(nameof(exception)); + } + + return GetRenderable(exception, new ExceptionSettings + { + Format = format, + }); + } + + /// + /// Gets a representation of the exception. + /// + /// The exception to format. + /// The exception settings. + /// A representing the exception. + public static IRenderable GetRenderable(this Exception exception, ExceptionSettings settings) + { + if (exception is null) + { + throw new ArgumentNullException(nameof(exception)); + } + + if (settings is null) + { + throw new ArgumentNullException(nameof(settings)); + } + + return ExceptionFormatter.Format(exception, settings); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/ExpandableExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ExpandableExtensions.cs new file mode 100644 index 0000000..10f085b --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ExpandableExtensions.cs @@ -0,0 +1,47 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class ExpandableExtensions +{ + /// + /// Tells the specified object to not expand to the available area + /// but take as little space as possible. + /// + /// The expandable object. + /// The object to collapse. + /// The same instance so that multiple calls can be chained. + public static T Collapse(this T obj) + where T : class, IExpandable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.Expand = false; + return obj; + } + + /// + /// Tells the specified object to expand to the available area. + /// + /// The expandable object. + /// The object to expand. + /// The same instance so that multiple calls can be chained. + public static T Expand(this T obj) + where T : class, IExpandable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.Expand = true; + return obj; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/FigletTextExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/FigletTextExtensions.cs new file mode 100644 index 0000000..dac1a77 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/FigletTextExtensions.cs @@ -0,0 +1,27 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class FigletTextExtensions +{ + /// + /// Sets the color of the FIGlet text. + /// + /// The text. + /// The color. + /// The same instance so that multiple calls can be chained. + public static FigletText Color(this FigletText text, Color? color) + { + if (text is null) + { + throw new ArgumentNullException(nameof(text)); + } + + text.Color = color ?? Rx.Color.Default; + return text; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/GridExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/GridExtensions.cs new file mode 100644 index 0000000..d7ec457 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/GridExtensions.cs @@ -0,0 +1,115 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class GridExtensions +{ + /// + /// Adds a column to the grid. + /// + /// The grid to add the column to. + /// The number of columns to add. + /// The same instance so that multiple calls can be chained. + public static Grid AddColumns(this Grid grid, int count) + { + if (grid is null) + { + throw new ArgumentNullException(nameof(grid)); + } + + for (var index = 0; index < count; index++) + { + grid.AddColumn(new GridColumn()); + } + + return grid; + } + + /// + /// Adds a column to the grid. + /// + /// The grid to add the column to. + /// The columns to add. + /// The same instance so that multiple calls can be chained. + public static Grid AddColumns(this Grid grid, params GridColumn[] columns) + { + if (grid is null) + { + throw new ArgumentNullException(nameof(grid)); + } + + if (columns is null) + { + throw new ArgumentNullException(nameof(columns)); + } + + foreach (var column in columns) + { + grid.AddColumn(column); + } + + return grid; + } + + /// + /// Adds an empty row to the grid. + /// + /// The grid to add the row to. + /// The same instance so that multiple calls can be chained. + public static Grid AddEmptyRow(this Grid grid) + { + if (grid is null) + { + throw new ArgumentNullException(nameof(grid)); + } + + var columns = new IRenderable[grid.Columns.Count]; + Enumerable.Range(0, grid.Columns.Count).ForEach(index => columns[index] = Text.Empty); + grid.AddRow(columns); + + return grid; + } + + /// + /// Adds a new row to the grid. + /// + /// The grid to add the row to. + /// The columns to add. + /// The same instance so that multiple calls can be chained. + public static Grid AddRow(this Grid grid, params string[] columns) + { + if (grid is null) + { + throw new ArgumentNullException(nameof(grid)); + } + + if (columns is null) + { + throw new ArgumentNullException(nameof(columns)); + } + + grid.AddRow(columns.Select(column => new Markup(column)).ToArray()); + return grid; + } + + /// + /// Sets the grid width. + /// + /// The grid. + /// The width. + /// The same instance so that multiple calls can be chained. + public static Grid Width(this Grid grid, int? width) + { + if (grid is null) + { + throw new ArgumentNullException(nameof(grid)); + } + + grid.Width = width; + return grid; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasBorderExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasBorderExtensions.cs new file mode 100644 index 0000000..eb7bc8d --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasBorderExtensions.cs @@ -0,0 +1,84 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class HasBorderExtensions +{ + /// + /// Enables the safe border. + /// + /// An object type with a border. + /// The object to enable the safe border for. + /// The same instance so that multiple calls can be chained. + public static T SafeBorder(this T obj) + where T : class, IHasBorder + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.UseSafeBorder = true; + return obj; + } + + /// + /// Disables the safe border. + /// + /// An object type with a border. + /// The object to disable the safe border for. + /// The same instance so that multiple calls can be chained. + public static T NoSafeBorder(this T obj) + where T : class, IHasBorder + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.UseSafeBorder = false; + return obj; + } + + /// + /// Sets the border style. + /// + /// An object type with a border. + /// The object to set the border style for. + /// The border style to set. + /// The same instance so that multiple calls can be chained. + public static T BorderStyle(this T obj, Style style) + where T : class, IHasBorder + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.BorderStyle = style; + return obj; + } + + /// + /// Sets the border color. + /// + /// An object type with a border. + /// The object to set the border color for. + /// The border color to set. + /// The same instance so that multiple calls can be chained. + public static T BorderColor(this T obj, Color color) + where T : class, IHasBorder + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.BorderStyle = (obj.BorderStyle ?? Style.Plain).Foreground(color); + return obj; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasBoxBorderExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasBoxBorderExtensions.cs new file mode 100644 index 0000000..244412d --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasBoxBorderExtensions.cs @@ -0,0 +1,83 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class HasBoxBorderExtensions +{ + /// + /// Sets the border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The border to use. + /// The same instance so that multiple calls can be chained. + public static T Border(this T obj, BoxBorder border) + where T : class, IHasBoxBorder + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.Border = border; + return obj; + } + + /// + /// Do not display a border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T NoBorder(this T obj) + where T : class, IHasBoxBorder => Border(obj, BoxBorder.None); + + /// + /// Display a square border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T SquareBorder(this T obj) + where T : class, IHasBoxBorder => Border(obj, BoxBorder.Square); + + /// + /// Display an ASCII border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T AsciiBorder(this T obj) + where T : class, IHasBoxBorder => Border(obj, BoxBorder.Ascii); + + /// + /// Display a rounded border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T RoundedBorder(this T obj) + where T : class, IHasBoxBorder => Border(obj, BoxBorder.Rounded); + + /// + /// Display a heavy border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T HeavyBorder(this T obj) + where T : class, IHasBoxBorder => Border(obj, BoxBorder.Heavy); + + /// + /// Display a double border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T DoubleBorder(this T obj) + where T : class, IHasBoxBorder => Border(obj, BoxBorder.Double); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasCultureExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasCultureExtensions.cs new file mode 100644 index 0000000..b89c222 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasCultureExtensions.cs @@ -0,0 +1,62 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class HasCultureExtensions +{ + /// + /// Sets the culture. + /// + /// An object type with a culture. + /// The object to set the culture for. + /// The culture to set. + /// The same instance so that multiple calls can be chained. + public static T Culture(this T obj, CultureInfo culture) + where T : class, IHasCulture + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (culture is null) + { + throw new ArgumentNullException(nameof(culture)); + } + + obj.Culture = culture; + return obj; + } + + /// + /// Sets the culture. + /// + /// An object type with a culture. + /// The object to set the culture for. + /// The culture to set. + /// The same instance so that multiple calls can be chained. + public static T Culture(this T obj, string name) + where T : class, IHasCulture + { + if (name is null) + { + throw new ArgumentNullException(nameof(name)); + } + + return Culture(obj, CultureInfo.GetCultureInfo(name)); + } + + /// + /// Sets the culture. + /// + /// An object type with a culture. + /// The object to set the culture for. + /// The culture to set. + /// The same instance so that multiple calls can be chained. + public static T Culture(this T obj, int culture) + where T : class, IHasCulture => Culture(obj, CultureInfo.GetCultureInfo(culture)); +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasJustificationExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasJustificationExtensions.cs new file mode 100644 index 0000000..eb8e590 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasJustificationExtensions.cs @@ -0,0 +1,83 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class HasJustificationExtensions +{ + /// + /// Sets the justification for an object. + /// + /// The type that can be justified. + /// The alignable object. + /// The alignment. + /// The same instance so that multiple calls can be chained. + public static T Justify(this T obj, Justify? alignment) + where T : class, IHasJustification + { + if (obj is null) + { + throw new System.ArgumentNullException(nameof(obj)); + } + + obj.Justification = alignment; + return obj; + } + + /// + /// Sets the object to be left justified. + /// + /// The type that can be justified. + /// The alignable object. + /// The same instance so that multiple calls can be chained. + public static T LeftJustified(this T obj) + where T : class, IHasJustification + { + if (obj is null) + { + throw new System.ArgumentNullException(nameof(obj)); + } + + obj.Justification = Rx.Justify.Left; + return obj; + } + + /// + /// Sets the object to be centered. + /// + /// The type that can be justified. + /// The alignable object. + /// The same instance so that multiple calls can be chained. + public static T Centered(this T obj) + where T : class, IHasJustification + { + if (obj is null) + { + throw new System.ArgumentNullException(nameof(obj)); + } + + obj.Justification = Rx.Justify.Center; + return obj; + } + + /// + /// Sets the object to be right justified. + /// + /// The type that can be justified. + /// The alignable object. + /// The same instance so that multiple calls can be chained. + public static T RightJustified(this T obj) + where T : class, IHasJustification + { + if (obj is null) + { + throw new System.ArgumentNullException(nameof(obj)); + } + + obj.Justification = Rx.Justify.Right; + return obj; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasTableBorderExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasTableBorderExtensions.cs new file mode 100644 index 0000000..6074a15 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasTableBorderExtensions.cs @@ -0,0 +1,191 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class HasTableBorderExtensions +{ + /// + /// Do not display a border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T NoBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.None); + + /// + /// Display a square border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T SquareBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Square); + + /// + /// Display an ASCII border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T AsciiBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Ascii); + + /// + /// Display another ASCII border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T Ascii2Border(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Ascii2); + + /// + /// Display an ASCII border with a double header border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T AsciiDoubleHeadBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.AsciiDoubleHead); + + /// + /// Display a rounded border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T RoundedBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Rounded); + + /// + /// Display a minimal border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T MinimalBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Minimal); + + /// + /// Display a minimal border with a heavy head. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T MinimalHeavyHeadBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.MinimalHeavyHead); + + /// + /// Display a minimal border with a double header border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T MinimalDoubleHeadBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.MinimalDoubleHead); + + /// + /// Display a simple border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T SimpleBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Simple); + + /// + /// Display a simple border with heavy lines. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T SimpleHeavyBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.SimpleHeavy); + + /// + /// Display a simple border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T HorizontalBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Horizontal); + + /// + /// Display a heavy border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T HeavyBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Heavy); + + /// + /// Display a border with a heavy edge. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T HeavyEdgeBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.HeavyEdge); + + /// + /// Display a border with a heavy header. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T HeavyHeadBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.HeavyHead); + + /// + /// Display a double border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T DoubleBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Double); + + /// + /// Display a border with a double edge. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T DoubleEdgeBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.DoubleEdge); + + /// + /// Display a markdown border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The same instance so that multiple calls can be chained. + public static T MarkdownBorder(this T obj) + where T : class, IHasTableBorder => Border(obj, TableBorder.Markdown); + + /// + /// Sets the border. + /// + /// An object type with a border. + /// The object to set the border for. + /// The border to use. + /// The same instance so that multiple calls can be chained. + public static T Border(this T obj, TableBorder border) + where T : class, IHasTableBorder + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.Border = border; + return obj; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasTreeNodeExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasTreeNodeExtensions.cs new file mode 100644 index 0000000..1fcb1e7 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/HasTreeNodeExtensions.cs @@ -0,0 +1,214 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class HasTreeNodeExtensions +{ + /// + /// Adds a tree node. + /// + /// An object with tree nodes. + /// The object to add the tree node to. + /// The node's markup text. + /// The added tree node. + public static TreeNode AddNode(this T obj, string markup) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (markup is null) + { + throw new ArgumentNullException(nameof(markup)); + } + + return AddNode(obj, new Markup(markup)); + } + + /// + /// Adds a tree node. + /// + /// An object with tree nodes. + /// The object to add the tree node to. + /// The renderable to add. + /// The added tree node. + public static TreeNode AddNode(this T obj, IRenderable renderable) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (renderable is null) + { + throw new ArgumentNullException(nameof(renderable)); + } + + var node = new TreeNode(renderable); + obj.Nodes.Add(node); + return node; + } + + /// + /// Adds a tree node. + /// + /// An object with tree nodes. + /// The object to add the tree node to. + /// The tree node to add. + /// The added tree node. + public static TreeNode AddNode(this T obj, TreeNode node) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (node is null) + { + throw new ArgumentNullException(nameof(node)); + } + + obj.Nodes.Add(node); + return node; + } + + /// + /// Add multiple tree nodes. + /// + /// An object with tree nodes. + /// The object to add the tree nodes to. + /// The tree nodes to add. + public static void AddNodes(this T obj, params string[] nodes) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (nodes is null) + { + throw new ArgumentNullException(nameof(nodes)); + } + + obj.Nodes.AddRange(nodes.Select(node => new TreeNode(new Markup(node)))); + } + + /// + /// Add multiple tree nodes. + /// + /// An object with tree nodes. + /// The object to add the tree nodes to. + /// The tree nodes to add. + public static void AddNodes(this T obj, IEnumerable nodes) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (nodes is null) + { + throw new ArgumentNullException(nameof(nodes)); + } + + obj.Nodes.AddRange(nodes.Select(node => new TreeNode(new Markup(node)))); + } + + /// + /// Add multiple tree nodes. + /// + /// An object with tree nodes. + /// The object to add the tree nodes to. + /// The tree nodes to add. + public static void AddNodes(this T obj, params IRenderable[] nodes) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (nodes is null) + { + throw new ArgumentNullException(nameof(nodes)); + } + + obj.Nodes.AddRange(nodes.Select(node => new TreeNode(node))); + } + + /// + /// Add multiple tree nodes. + /// + /// An object with tree nodes. + /// The object to add the tree nodes to. + /// The tree nodes to add. + public static void AddNodes(this T obj, IEnumerable nodes) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (nodes is null) + { + throw new ArgumentNullException(nameof(nodes)); + } + + obj.Nodes.AddRange(nodes.Select(node => new TreeNode(node))); + } + + /// + /// Add multiple tree nodes. + /// + /// An object with tree nodes. + /// The object to add the tree nodes to. + /// The tree nodes to add. + public static void AddNodes(this T obj, params TreeNode[] nodes) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (nodes is null) + { + throw new ArgumentNullException(nameof(nodes)); + } + + obj.Nodes.AddRange(nodes); + } + + /// + /// Add multiple tree nodes. + /// + /// An object with tree nodes. + /// The object to add the tree nodes to. + /// The tree nodes to add. + public static void AddNodes(this T obj, IEnumerable nodes) + where T : IHasTreeNodes + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + if (nodes is null) + { + throw new ArgumentNullException(nameof(nodes)); + } + + obj.Nodes.AddRange(nodes); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Int32Extensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Int32Extensions.cs new file mode 100644 index 0000000..efd6042 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Int32Extensions.cs @@ -0,0 +1,22 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +internal static class Int32Extensions +{ + public static int Clamp(this int value, int min, int max) + { + if (value <= min) + { + return min; + } + + if (value >= max) + { + return max; + } + + return value; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/LayoutExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/LayoutExtensions.cs new file mode 100644 index 0000000..3899d95 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/LayoutExtensions.cs @@ -0,0 +1,61 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class LayoutExtensions +{ + /// + /// Sets the ratio of the layout. + /// + /// The layout. + /// The ratio. + /// The same instance so that multiple calls can be chained. + public static Layout Ratio(this Layout layout, int ratio) + { + if (layout is null) + { + throw new ArgumentNullException(nameof(layout)); + } + + layout.Ratio = ratio; + return layout; + } + + /// + /// Sets the size of the layout. + /// + /// The layout. + /// The size. + /// The same instance so that multiple calls can be chained. + public static Layout Size(this Layout layout, int size) + { + if (layout is null) + { + throw new ArgumentNullException(nameof(layout)); + } + + layout.Size = size; + return layout; + } + + /// + /// Sets the minimum width of the layout. + /// + /// The layout. + /// The size. + /// The same instance so that multiple calls can be chained. + public static Layout MinimumSize(this Layout layout, int size) + { + if (layout is null) + { + throw new ArgumentNullException(nameof(layout)); + } + + layout.MinimumSize = size; + return layout; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/ListExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ListExtensions.cs new file mode 100644 index 0000000..9ed48e8 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/ListExtensions.cs @@ -0,0 +1,37 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +internal static class ListExtensions +{ + public static void RemoveLast(this List list) + { + if (list is null) + { + throw new ArgumentNullException(nameof(list)); + } + + if (list.Count > 0) + { + list.RemoveAt(list.Count - 1); + } + } + + public static void AddOrReplaceLast(this List list, T item) + { + if (list is null) + { + throw new ArgumentNullException(nameof(list)); + } + + if (list.Count == 0) + { + list.Add(item); + } + else + { + list[list.Count - 1] = item; + } + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/LiveDisplayExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/LiveDisplayExtensions.cs new file mode 100644 index 0000000..99f2a02 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/LiveDisplayExtensions.cs @@ -0,0 +1,65 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class LiveDisplayExtensions +{ + /// + /// Sets whether or not auto clear is enabled. + /// If enabled, the live display will be cleared when done. + /// + /// The instance. + /// Whether or not auto clear is enabled. + /// The same instance so that multiple calls can be chained. + public static LiveDisplay AutoClear(this LiveDisplay live, bool enabled) + { + if (live is null) + { + throw new ArgumentNullException(nameof(live)); + } + + live.AutoClear = enabled; + + return live; + } + + /// + /// Sets the vertical overflow strategy. + /// + /// The instance. + /// The overflow strategy to use. + /// The same instance so that multiple calls can be chained. + public static LiveDisplay Overflow(this LiveDisplay live, VerticalOverflow overflow) + { + if (live is null) + { + throw new ArgumentNullException(nameof(live)); + } + + live.Overflow = overflow; + + return live; + } + + /// + /// Sets the vertical overflow cropping strategy. + /// + /// The instance. + /// The overflow cropping strategy to use. + /// The same instance so that multiple calls can be chained. + public static LiveDisplay Cropping(this LiveDisplay live, VerticalOverflowCropping cropping) + { + if (live is null) + { + throw new ArgumentNullException(nameof(live)); + } + + live.Cropping = cropping; + + return live; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/OverflowableExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/OverflowableExtensions.cs new file mode 100644 index 0000000..d999356 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/OverflowableExtensions.cs @@ -0,0 +1,80 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class OverflowableExtensions +{ + /// + /// Folds any overflowing text. + /// + /// An object implementing . + /// The overflowable object instance. + /// The same instance so that multiple calls can be chained. + public static T Fold(this T obj) + where T : class, IOverflowable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + return Overflow(obj, Rx.Overflow.Fold); + } + + /// + /// Crops any overflowing text. + /// + /// An object implementing . + /// The overflowable object instance. + /// The same instance so that multiple calls can be chained. + public static T Crop(this T obj) + where T : class, IOverflowable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + return Overflow(obj, Rx.Overflow.Crop); + } + + /// + /// Crops any overflowing text and adds an ellipsis to the end. + /// + /// An object implementing . + /// The overflowable object instance. + /// The same instance so that multiple calls can be chained. + public static T Ellipsis(this T obj) + where T : class, IOverflowable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + return Overflow(obj, Rx.Overflow.Ellipsis); + } + + /// + /// Sets the overflow strategy. + /// + /// An object implementing . + /// The overflowable object instance. + /// The overflow strategy to use. + /// The same instance so that multiple calls can be chained. + public static T Overflow(this T obj, Overflow overflow) + where T : class, IOverflowable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.Overflow = overflow; + return obj; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/PaddableExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/PaddableExtensions.cs new file mode 100644 index 0000000..c83df16 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/PaddableExtensions.cs @@ -0,0 +1,125 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class PaddableExtensions +{ + /// + /// Sets the left padding. + /// + /// An object implementing . + /// The paddable object instance. + /// The left padding. + /// The same instance so that multiple calls can be chained. + public static T PadLeft(this T obj, int left) + where T : class, IPaddable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + return Padding(obj, new Padding(left, obj.Padding.GetTopSafe(), obj.Padding.GetRightSafe(), obj.Padding.GetBottomSafe())); + } + + /// + /// Sets the top padding. + /// + /// An object implementing . + /// The paddable object instance. + /// The top padding. + /// The same instance so that multiple calls can be chained. + public static T PadTop(this T obj, int top) + where T : class, IPaddable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + return Padding(obj, new Padding(obj.Padding.GetLeftSafe(), top, obj.Padding.GetRightSafe(), obj.Padding.GetBottomSafe())); + } + + /// + /// Sets the right padding. + /// + /// An object implementing . + /// The paddable object instance. + /// The right padding. + /// The same instance so that multiple calls can be chained. + public static T PadRight(this T obj, int right) + where T : class, IPaddable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + return Padding(obj, new Padding(obj.Padding.GetLeftSafe(), obj.Padding.GetTopSafe(), right, obj.Padding.GetBottomSafe())); + } + + /// + /// Sets the bottom padding. + /// + /// An object implementing . + /// The paddable object instance. + /// The bottom padding. + /// The same instance so that multiple calls can be chained. + public static T PadBottom(this T obj, int bottom) + where T : class, IPaddable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + return Padding(obj, new Padding(obj.Padding.GetLeftSafe(), obj.Padding.GetTopSafe(), obj.Padding.GetRightSafe(), bottom)); + } + + /// + /// Sets the left, top, right and bottom padding. + /// + /// An object implementing . + /// The paddable object instance. + /// The left padding to apply. + /// The top padding to apply. + /// The right padding to apply. + /// The bottom padding to apply. + /// The same instance so that multiple calls can be chained. + public static T Padding(this T obj, int left, int top, int right, int bottom) + where T : class, IPaddable => Padding(obj, new Padding(left, top, right, bottom)); + + /// + /// Sets the horizontal and vertical padding. + /// + /// An object implementing . + /// The paddable object instance. + /// The left and right padding. + /// The top and bottom padding. + /// The same instance so that multiple calls can be chained. + public static T Padding(this T obj, int horizontal, int vertical) + where T : class, IPaddable => Padding(obj, new Padding(horizontal, vertical)); + + /// + /// Sets the padding. + /// + /// An object implementing . + /// The paddable object instance. + /// The padding to apply. + /// The same instance so that multiple calls can be chained. + public static T Padding(this T obj, Padding padding) + where T : class, IPaddable + { + if (obj is null) + { + throw new ArgumentNullException(nameof(obj)); + } + + obj.Padding = padding; + return obj; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/PaddingExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/PaddingExtensions.cs new file mode 100644 index 0000000..6cb6081 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/PaddingExtensions.cs @@ -0,0 +1,38 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class PaddingExtensions +{ + /// + /// Gets the left padding. + /// + /// The padding. + /// The left padding or zero if padding is null. + public static int GetLeftSafe(this Padding? padding) => padding?.Left ?? 0; + + /// + /// Gets the right padding. + /// + /// The padding. + /// The right padding or zero if padding is null. + public static int GetRightSafe(this Padding? padding) => padding?.Right ?? 0; + + /// + /// Gets the top padding. + /// + /// The padding. + /// The top padding or zero if padding is null. + public static int GetTopSafe(this Padding? padding) => padding?.Top ?? 0; + + /// + /// Gets the bottom padding. + /// + /// The padding. + /// The bottom padding or zero if padding is null. + public static int GetBottomSafe(this Padding? padding) => padding?.Bottom ?? 0; +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/PanelExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/PanelExtensions.cs new file mode 100644 index 0000000..7f494de --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/PanelExtensions.cs @@ -0,0 +1,77 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class PanelExtensions +{ + /// + /// Sets the panel header. + /// + /// The panel. + /// The header text. + /// The header alignment. + /// The same instance so that multiple calls can be chained. + public static Panel Header(this Panel panel, string text, Justify? alignment = null) + { + if (panel is null) + { + throw new ArgumentNullException(nameof(panel)); + } + + if (text is null) + { + throw new ArgumentNullException(nameof(text)); + } + + alignment ??= panel.Header?.Justification; + return Header(panel, new PanelHeader(text, alignment)); + } + + /// + /// Sets the panel header alignment. + /// + /// The panel. + /// The header alignment. + /// The same instance so that multiple calls can be chained. + public static Panel HeaderAlignment(this Panel panel, Justify alignment) + { + if (panel is null) + { + throw new ArgumentNullException(nameof(panel)); + } + + if (panel.Header != null) + { + // Update existing style + panel.Header.Justification = alignment; + } + else + { + // Create header + Header(panel, string.Empty, alignment); + } + + return panel; + } + + /// + /// Sets the panel header. + /// + /// The panel. + /// The header to use. + /// The same instance so that multiple calls can be chained. + public static Panel Header(this Panel panel, PanelHeader header) + { + if (panel is null) + { + throw new ArgumentNullException(nameof(panel)); + } + + panel.Header = header; + return panel; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/PercentageColumnExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/PercentageColumnExtensions.cs new file mode 100644 index 0000000..d13ce20 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/PercentageColumnExtensions.cs @@ -0,0 +1,54 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class PercentageColumnExtensions +{ + /// + /// Sets the style for a non-complete task. + /// + /// The column. + /// The style. + /// The same instance so that multiple calls can be chained. + public static PercentageColumn Style(this PercentageColumn column, Style style) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + column.Style = style; + return column; + } + + /// + /// Sets the style for a completed task. + /// + /// The column. + /// The style. + /// The same instance so that multiple calls can be chained. + public static PercentageColumn CompletedStyle(this PercentageColumn column, Style style) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + column.CompletedStyle = style; + return column; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressBarColumnExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressBarColumnExtensions.cs new file mode 100644 index 0000000..3b90aa7 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressBarColumnExtensions.cs @@ -0,0 +1,76 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class ProgressBarColumnExtensions +{ + /// + /// Sets the style of completed portions of the progress bar. + /// + /// The column. + /// The style. + /// The same instance so that multiple calls can be chained. + public static ProgressBarColumn CompletedStyle(this ProgressBarColumn column, Style style) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + column.CompletedStyle = style; + return column; + } + + /// + /// Sets the style of a finished progress bar. + /// + /// The column. + /// The style. + /// The same instance so that multiple calls can be chained. + public static ProgressBarColumn FinishedStyle(this ProgressBarColumn column, Style style) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + column.FinishedStyle = style; + return column; + } + + /// + /// Sets the style of remaining portions of the progress bar. + /// + /// The column. + /// The style. + /// The same instance so that multiple calls can be chained. + public static ProgressBarColumn RemainingStyle(this ProgressBarColumn column, Style style) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + column.RemainingStyle = style; + return column; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressExtensions.cs new file mode 100644 index 0000000..0ff9af2 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressExtensions.cs @@ -0,0 +1,98 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class ProgressExtensions +{ + /// + /// Sets the columns to be used for an instance. + /// + /// The instance. + /// The columns to use. + /// The same instance so that multiple calls can be chained. + public static Progress Columns(this Progress progress, params ProgressColumn[] columns) + { + if (progress is null) + { + throw new ArgumentNullException(nameof(progress)); + } + + if (columns is null) + { + throw new ArgumentNullException(nameof(columns)); + } + + if (columns.Length == 0) + { + throw new InvalidOperationException("At least one column must be specified."); + } + + progress.Columns.Clear(); + progress.Columns.AddRange(columns); + + return progress; + } + + /// + /// Sets whether or not auto refresh is enabled. + /// If disabled, you will manually have to refresh the progress. + /// + /// The instance. + /// Whether or not auto refresh is enabled. + /// The same instance so that multiple calls can be chained. + public static Progress AutoRefresh(this Progress progress, bool enabled) + { + if (progress is null) + { + throw new ArgumentNullException(nameof(progress)); + } + + progress.AutoRefresh = enabled; + + return progress; + } + + /// + /// Sets whether or not auto clear is enabled. + /// If enabled, the task tabled will be removed once + /// all tasks have completed. + /// + /// The instance. + /// Whether or not auto clear is enabled. + /// The same instance so that multiple calls can be chained. + public static Progress AutoClear(this Progress progress, bool enabled) + { + if (progress is null) + { + throw new ArgumentNullException(nameof(progress)); + } + + progress.AutoClear = enabled; + + return progress; + } + + /// + /// Sets whether or not hide completed is enabled. + /// If enabled, the task tabled will be removed once it is + /// completed. + /// + /// The instance. + /// Whether or not hide completed is enabled. + /// The same instance so that multiple calls can be chained. + public static Progress HideCompleted(this Progress progress, bool enabled) + { + if (progress is null) + { + throw new ArgumentNullException(nameof(progress)); + } + + progress.HideCompleted = enabled; + + return progress; + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressTaskExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressTaskExtensions.cs new file mode 100644 index 0000000..0612d97 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/ProgressTaskExtensions.cs @@ -0,0 +1,78 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class ProgressTaskExtensions +{ + /// + /// Sets the task description. + /// + /// The task. + /// The description. + /// The same instance so that multiple calls can be chained. + public static ProgressTask Description(this ProgressTask task, string description) + { + if (task is null) + { + throw new ArgumentNullException(nameof(task)); + } + + task.Description = description; + return task; + } + + /// + /// Sets the max value of the task. + /// + /// The task. + /// The max value. + /// The same instance so that multiple calls can be chained. + public static ProgressTask MaxValue(this ProgressTask task, double value) + { + if (task is null) + { + throw new ArgumentNullException(nameof(task)); + } + + task.MaxValue = value; + return task; + } + + /// + /// Sets the value of the task. + /// + /// The task. + /// The value. + /// The same instance so that multiple calls can be chained. + public static ProgressTask Value(this ProgressTask task, double value) + { + if (task is null) + { + throw new ArgumentNullException(nameof(task)); + } + + task.Value = value; + return task; + } + + /// + /// Sets whether the task is considered indeterminate or not. + /// + /// The task. + /// Whether the task is considered indeterminate or not. + /// The same instance so that multiple calls can be chained. + public static ProgressTask IsIndeterminate(this ProgressTask task, bool indeterminate = true) + { + if (task is null) + { + throw new ArgumentNullException(nameof(task)); + } + + task.IsIndeterminate = indeterminate; + return task; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/RemainingTimeColumnExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/RemainingTimeColumnExtensions.cs new file mode 100644 index 0000000..30be0eb --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/RemainingTimeColumnExtensions.cs @@ -0,0 +1,32 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class RemainingTimeColumnExtensions +{ + /// + /// Sets the style of the remaining time text. + /// + /// The column. + /// The style. + /// The same instance so that multiple calls can be chained. + public static RemainingTimeColumn Style(this RemainingTimeColumn column, Style style) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + column.Style = style; + return column; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/SpinnerColumnExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/SpinnerColumnExtensions.cs new file mode 100644 index 0000000..aeea30d --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/SpinnerColumnExtensions.cs @@ -0,0 +1,62 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class SpinnerColumnExtensions +{ + /// + /// Sets the style of the spinner. + /// + /// The column. + /// The style. + /// The same instance so that multiple calls can be chained. + public static SpinnerColumn Style(this SpinnerColumn column, Style? style) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + column.Style = style; + return column; + } + + /// + /// Sets the text that should be shown instead of the spinner + /// once a task completes. + /// + /// The column. + /// The text. + /// The same instance so that multiple calls can be chained. + public static SpinnerColumn CompletedText(this SpinnerColumn column, string? text) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + column.CompletedText = text; + return column; + } + + /// + /// Sets the completed style of the spinner. + /// + /// The column. + /// The style. + /// The same instance so that multiple calls can be chained. + public static SpinnerColumn CompletedStyle(this SpinnerColumn column, Style? style) + { + if (column is null) + { + throw new ArgumentNullException(nameof(column)); + } + + column.CompletedStyle = style; + return column; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/StatusContextExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/StatusContextExtensions.cs new file mode 100644 index 0000000..b9b25ea --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/StatusContextExtensions.cs @@ -0,0 +1,61 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class StatusContextExtensions +{ + /// + /// Sets the status message. + /// + /// The status context. + /// The status message. + /// The same instance so that multiple calls can be chained. + public static StatusContext Status(this StatusContext context, string status) + { + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + + context.Status = status; + return context; + } + + /// + /// Sets the spinner. + /// + /// The status context. + /// The spinner. + /// The same instance so that multiple calls can be chained. + public static StatusContext Spinner(this StatusContext context, Spinner spinner) + { + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + + context.Spinner = spinner; + return context; + } + + /// + /// Sets the spinner style. + /// + /// The status context. + /// The spinner style. + /// The same instance so that multiple calls can be chained. + public static StatusContext SpinnerStyle(this StatusContext context, Style? style) + { + if (context is null) + { + throw new ArgumentNullException(nameof(context)); + } + + context.SpinnerStyle = style; + return context; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/StatusExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/StatusExtensions.cs new file mode 100644 index 0000000..ccf0247 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/Progress/StatusExtensions.cs @@ -0,0 +1,62 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class StatusExtensions +{ + /// + /// Sets whether or not auto refresh is enabled. + /// If disabled, you will manually have to refresh the progress. + /// + /// The instance. + /// Whether or not auto refresh is enabled. + /// The same instance so that multiple calls can be chained. + public static Status AutoRefresh(this Status status, bool enabled) + { + if (status is null) + { + throw new ArgumentNullException(nameof(status)); + } + + status.AutoRefresh = enabled; + return status; + } + + /// + /// Sets the spinner. + /// + /// The instance. + /// The spinner. + /// The same instance so that multiple calls can be chained. + public static Status Spinner(this Status status, Spinner spinner) + { + if (status is null) + { + throw new ArgumentNullException(nameof(status)); + } + + status.Spinner = spinner; + return status; + } + + /// + /// Sets the spinner style. + /// + /// The instance. + /// The spinner style. + /// The same instance so that multiple calls can be chained. + public static Status SpinnerStyle(this Status status, Style? style) + { + if (status is null) + { + throw new ArgumentNullException(nameof(status)); + } + + status.SpinnerStyle = style; + return status; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/RecorderExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/RecorderExtensions.cs new file mode 100644 index 0000000..1c57df7 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/RecorderExtensions.cs @@ -0,0 +1,43 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class RecorderExtensions +{ + private static readonly TextEncoder _textEncoder = new(); + private static readonly HtmlEncoder _htmlEncoder = new(); + + /// + /// Exports the recorded content as text. + /// + /// The recorder. + /// The recorded content as text. + public static string ExportText(this Recorder recorder) + { + if (recorder is null) + { + throw new ArgumentNullException(nameof(recorder)); + } + + return recorder.Export(_textEncoder); + } + + /// + /// Exports the recorded content as HTML. + /// + /// The recorder. + /// The recorded content as HTML. + public static string ExportHtml(this Recorder recorder) + { + if (recorder is null) + { + throw new ArgumentNullException(nameof(recorder)); + } + + return recorder.Export(_htmlEncoder); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/RenderOptionsExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/RenderOptionsExtensions.cs new file mode 100644 index 0000000..c2cf377 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/RenderOptionsExtensions.cs @@ -0,0 +1,10 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +internal static class RenderOptionsExtensions +{ + public static BoxBorder GetSafeBorder(this RenderOptions options, T border) + where T : IHasBoxBorder, IHasBorder => border.Border.GetSafeBorder(!options.Unicode && border.UseSafeBorder); +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/RenderableExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/RenderableExtensions.cs new file mode 100644 index 0000000..64dc086 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/RenderableExtensions.cs @@ -0,0 +1,45 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class RenderableExtensions +{ + /// + /// Gets the segments for a renderable using the specified console. + /// + /// The renderable. + /// The console. + /// An enumerable containing segments representing the specified . + public static IEnumerable GetSegments(this IRenderable renderable, IAnsiConsole console) + { + if (console is null) + { + throw new ArgumentNullException(nameof(console)); + } + + if (renderable is null) + { + throw new ArgumentNullException(nameof(renderable)); + } + + var context = RenderOptions.Create(console, console.Profile.Capabilities); + var renderables = console.Pipeline.Process(context, new[] { renderable }); + + return GetSegments(console, context, renderables); + } + + private static IEnumerable GetSegments(IAnsiConsole console, RenderOptions options, IEnumerable renderables) + { + var result = new List(); + foreach (var renderable in renderables) + { + result.AddRange(renderable.Render(options, console.Profile.Width)); + } + + return Segment.Merge(result); + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/RuleExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/RuleExtensions.cs new file mode 100644 index 0000000..2c5b304 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/RuleExtensions.cs @@ -0,0 +1,54 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class RuleExtensions +{ + /// + /// Sets the rule title. + /// + /// The rule. + /// The title. + /// The same instance so that multiple calls can be chained. + public static Rule RuleTitle(this Rule rule, string title) + { + if (rule is null) + { + throw new ArgumentNullException(nameof(rule)); + } + + if (title is null) + { + throw new ArgumentNullException(nameof(title)); + } + + rule.Title = title; + return rule; + } + + /// + /// Sets the rule style. + /// + /// The rule. + /// The rule style. + /// The same instance so that multiple calls can be chained. + public static Rule RuleStyle(this Rule rule, Style style) + { + if (rule is null) + { + throw new ArgumentNullException(nameof(rule)); + } + + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + rule.Style = style; + return rule; + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/StackExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/StackExtensions.cs new file mode 100644 index 0000000..fb5cfb3 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/StackExtensions.cs @@ -0,0 +1,23 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +internal static class StackExtensions +{ + public static void PushRange(this Stack stack, IEnumerable source) + { + if (stack is null) + { + throw new ArgumentNullException(nameof(stack)); + } + + if (source != null) + { + foreach (var item in source) + { + stack.Push(item); + } + } + } +} \ No newline at end of file diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/StringBuilderExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/StringBuilderExtensions.cs new file mode 100644 index 0000000..4f21fa8 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/StringBuilderExtensions.cs @@ -0,0 +1,36 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +internal static class StringBuilderExtensions +{ + public static StringBuilder AppendWithStyle(this StringBuilder builder, Style? style, int? value) => AppendWithStyle(builder, style, value?.ToString(CultureInfo.InvariantCulture)); + + public static StringBuilder AppendWithStyle(this StringBuilder builder, Style? style, string? value) + { + value ??= string.Empty; + + if (style != null) + { + return builder.Append('[') + .Append(style.ToMarkup()) + .Append(']') + .Append(value.EscapeMarkup()) + .Append("[/]"); + } + + return builder.Append(value); + } + + public static void AppendSpan(this StringBuilder builder, ReadOnlySpan span) => + + // NetStandard 2 lacks the override for StringBuilder to add the span. We'll need to convert the span + // to a string for it, but for .NET 6.0 or newer we'll use the override. +#if NETSTANDARD2_0 + builder.Append(span.ToString()); +#else + builder.Append(span); +#endif + +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/StringExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/StringExtensions.cs new file mode 100644 index 0000000..b1993de --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/StringExtensions.cs @@ -0,0 +1,222 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class StringExtensions +{ + // Cache whether or not internally normalized line endings + // already are normalized. No reason to do yet another replace if it is. + private static readonly bool _alreadyNormalized + = Environment.NewLine.Equals("\n", StringComparison.OrdinalIgnoreCase); + + /// + /// Escapes text so that it won’t be interpreted as markup. + /// + /// The text to escape. + /// A string that is safe to use in markup. + public static string EscapeMarkup(this string? text) + { + if (text == null) + { + return string.Empty; + } + + return text + .ReplaceExact("[", "[[") + .ReplaceExact("]", "]]"); + } + + /// + /// Removes markup from the specified string. + /// + /// The text to remove markup from. + /// A string that does not have any markup. + public static string RemoveMarkup(this string? text) + { + if (string.IsNullOrWhiteSpace(text)) + { + return string.Empty; + } + + var result = new StringBuilder(); + + var tokenizer = new MarkupTokenizer(text); + while (tokenizer.MoveNext() && tokenizer.Current != null) + { + if (tokenizer.Current.Kind == MarkupTokenKind.Text) + { + result.Append(tokenizer.Current.Value); + } + } + + return result.ToString(); + } + + /// + /// Gets the cell width of the specified text. + /// + /// The text to get the cell width of. + /// The cell width of the text. + public static int GetCellWidth(this string text) + { + if (text is null) + { + throw new ArgumentNullException(nameof(text)); + } + + return Cell.GetCellLength(text); + } + + /// + /// "Masks" every character in a string. + /// + /// String value to mask. + /// Character to use for masking. + /// Masked string. + public static string Mask(this string value, char? mask) + { + if (value is null) + { + throw new ArgumentNullException(nameof(value)); + } + + var output = string.Empty; + + if (mask is null) + { + return output; + } + + foreach (var c in value) + { + output += mask; + } + + return output; + } + + internal static string CapitalizeFirstLetter(this string? text, CultureInfo? culture = null) + { + if (text == null) + { + return string.Empty; + } + + culture ??= CultureInfo.InvariantCulture; + + if (text.Length > 0 && char.IsLower(text[0])) + { + text = string.Format(culture, "{0}{1}", char.ToUpper(text[0], culture), text.Substring(1)); + } + + return text; + } + + internal static string? RemoveNewLines(this string? text) => text?.ReplaceExact("\r\n", string.Empty) + ?.ReplaceExact("\n", string.Empty); + + internal static string NormalizeNewLines(this string? text, bool native = false) + { + text = text?.ReplaceExact("\r\n", "\n"); + text ??= string.Empty; + + if (native && !_alreadyNormalized) + { + text = text.ReplaceExact("\n", Environment.NewLine); + } + + return text; + } + + internal static string[] SplitLines(this string text) + { + var result = text?.NormalizeNewLines()?.Split(new[] { '\n' }, StringSplitOptions.None); + return result ?? Array.Empty(); + } + + internal static string[] SplitWords(this string word, StringSplitOptions options = StringSplitOptions.None) + { + var result = new List(); + + static string Read(StringBuffer reader, Func criteria) + { + var buffer = new StringBuilder(); + while (!reader.Eof) + { + var current = reader.Peek(); + if (!criteria(current)) + { + break; + } + + buffer.Append(reader.Read()); + } + + return buffer.ToString(); + } + + using (var reader = new StringBuffer(word)) + { + while (!reader.Eof) + { + var current = reader.Peek(); + if (char.IsWhiteSpace(current)) + { + var x = Read(reader, c => char.IsWhiteSpace(c)); + if (options != StringSplitOptions.RemoveEmptyEntries) + { + result.Add(x); + } + } + else + { + result.Add(Read(reader, c => !char.IsWhiteSpace(c))); + } + } + } + + return result.ToArray(); + } + + internal static string Repeat(this string text, int count) + { + if (text is null) + { + throw new ArgumentNullException(nameof(text)); + } + + if (count <= 0) + { + return string.Empty; + } + + if (count == 1) + { + return text; + } + + return string.Concat(Enumerable.Repeat(text, count)); + } + + internal static string ReplaceExact(this string text, string oldValue, string? newValue) + { +#if NETSTANDARD2_0 + return text.Replace(oldValue, newValue); +#else + return text.Replace(oldValue, newValue, StringComparison.Ordinal); +#endif + } + + internal static bool ContainsExact(this string text, string value) + { +#if NETSTANDARD2_0 + return text.Contains(value); +#else + return text.Contains(value, StringComparison.Ordinal); +#endif + } +} diff --git a/src/Spectre.Console.Rx/Spectre.Console/Extensions/StyleExtensions.cs b/src/Spectre.Console.Rx/Spectre.Console/Extensions/StyleExtensions.cs new file mode 100644 index 0000000..2eac476 --- /dev/null +++ b/src/Spectre.Console.Rx/Spectre.Console/Extensions/StyleExtensions.cs @@ -0,0 +1,107 @@ +// Copyright (c) Chris Pulman. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +namespace Spectre.Console.Rx; + +/// +/// Contains extension methods for . +/// +public static class StyleExtensions +{ + /// + /// Creates a new style from the specified one with + /// the specified foreground color. + /// + /// The style. + /// The foreground color. + /// The same instance so that multiple calls can be chained. + public static Style Foreground(this Style style, Color color) + { + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + return new Style( + foreground: color, + background: style.Background, + decoration: style.Decoration); + } + + /// + /// Creates a new style from the specified one with + /// the specified background color. + /// + /// The style. + /// The background color. + /// The same instance so that multiple calls can be chained. + public static Style Background(this Style style, Color color) + { + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + return new Style( + foreground: style.Foreground, + background: color, + decoration: style.Decoration); + } + + /// + /// Creates a new style from the specified one with + /// the specified text decoration. + /// + /// The style. + /// The text decoration. + /// The same instance so that multiple calls can be chained. + public static Style Decoration(this Style style, Decoration decoration) + { + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + return new Style( + foreground: style.Foreground, + background: style.Background, + decoration: decoration); + } + + /// + /// Creates a new style from the specified one with + /// the specified link. + /// + /// The style. + /// The link. + /// The same instance so that multiple calls can be chained. + public static Style Link(this Style style, string link) + { + if (style is null) + { + throw new ArgumentNullException(nameof(style)); + } + + return new Style( + foreground: style.Foreground, + background: style.Background, + decoration: style.Decoration, + link: link); + } + + internal static Style Combine(this Style style, IEnumerable