diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Layout/server/LayoutServerDocumentation.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Layout/server/LayoutServerDocumentation.razor index 14c18abba..e61f9d137 100644 --- a/BlazorBootstrap.Demo.RCL/Components/Pages/Layout/server/LayoutServerDocumentation.razor +++ b/BlazorBootstrap.Demo.RCL/Components/Pages/Layout/server/LayoutServerDocumentation.razor @@ -26,7 +26,7 @@ Remove all the CSS content from the Shared/MainLayout.razor.css file. - + @code { private string pageUrl = "/layout-setup/blazor-server"; diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/Layout/webassembly/LayoutWebAssemblyDocumentation.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/Layout/webassembly/LayoutWebAssemblyDocumentation.razor index 1d41ac58f..edd649b98 100644 --- a/BlazorBootstrap.Demo.RCL/Components/Pages/Layout/webassembly/LayoutWebAssemblyDocumentation.razor +++ b/BlazorBootstrap.Demo.RCL/Components/Pages/Layout/webassembly/LayoutWebAssemblyDocumentation.razor @@ -27,7 +27,7 @@ Remove all the CSS content from the Shared/MainLayout.razor.css file. - + @code { private string pageUrl = "/layout-setup/blazor-webassembly"; diff --git a/BlazorBootstrap.Demo.RCL/Components/Pages/SortableList/SortableListDocumentation.razor b/BlazorBootstrap.Demo.RCL/Components/Pages/SortableList/SortableListDocumentation.razor index 130e98546..15c7f96ef 100644 --- a/BlazorBootstrap.Demo.RCL/Components/Pages/SortableList/SortableListDocumentation.razor +++ b/BlazorBootstrap.Demo.RCL/Components/Pages/SortableList/SortableListDocumentation.razor @@ -13,7 +13,7 @@
Before using the SortableList component, include the SortableJS script reference in your index.html/_Host.cshtml file.
- +
diff --git a/BlazorBootstrap.Demo.RCL/Components/Shared/CodeSnippet.cs b/BlazorBootstrap.Demo.RCL/Components/Shared/CodeSnippet.cs deleted file mode 100644 index 1ee0bf913..000000000 --- a/BlazorBootstrap.Demo.RCL/Components/Shared/CodeSnippet.cs +++ /dev/null @@ -1,90 +0,0 @@ -namespace BlazorBootstrap.Demo.RCL; - -public class CodeSnippet : ComponentBase -{ - #region Members - - private string? code; - - #endregion - - #region Methods - - protected override async Task OnParametersSetAsync() - { - if (code is null) - { - if (!string.IsNullOrWhiteSpace(File)) - { - var resourceName = File.Replace("~", typeof(CodeSnippet).Assembly.GetName().Name).Replace("/", ".").Replace("\\", "."); - - using (Stream stream = typeof(CodeSnippet).Assembly.GetManifestResourceStream(resourceName)!) - { - using (StreamReader reader = new StreamReader(stream)) - { - code = await reader.ReadToEndAsync(); - } - } - } - } - } - - private string? GetLanguageFromFileExtension() - { - if (string.IsNullOrWhiteSpace(File)) - return null; - - return Path.GetExtension(File).ToLower() switch - { - ".razor" => "cshtml", - ".cshtml" => "cshtml", - ".html" => "html", - ".css" => "css", - ".cs" => "csharp", - ".txt" => "none", - ".js" => "js", - _ => null - }; - } - - protected override void BuildRenderTree(RenderTreeBuilder builder) - { - // no base call - builder.AddMarkupContent(0, ""); - - builder.OpenElement(300, "div"); - builder.AddAttribute(301, "class", "highlight show-code-only"); - builder.OpenElement(400, "pre"); - builder.OpenElement(401, "code"); - builder.AddAttribute(402, "class", $"language-{Language ?? GetLanguageFromFileExtension() ?? "cshtml"}"); - if (code != null) - { - builder.AddContent(403, code.Trim()); - } - builder.CloseElement(); // end: code - builder.CloseElement(); // end: pre - builder.CloseElement(); - - builder.AddMarkupContent(700, ""); - } - - protected override async Task OnAfterRenderAsync(bool firstRender) - { - if(firstRender) - await JS.InvokeVoidAsync("highlightCode"); - - await base.OnAfterRenderAsync(firstRender); - } - - #endregion - - #region Properties - - [Inject] protected IJSRuntime JS { get; set; } = null!; - - [Parameter] public string? Language { get; set; } - - [Parameter] public string? File { get; set; } - - #endregion -} diff --git a/BlazorBootstrap.Demo.RCL/Components/Shared/Demo.razor b/BlazorBootstrap.Demo.RCL/Components/Shared/Demo.razor index 5ea662816..897c2745f 100644 --- a/BlazorBootstrap.Demo.RCL/Components/Shared/Demo.razor +++ b/BlazorBootstrap.Demo.RCL/Components/Shared/Demo.razor @@ -1,7 +1,6 @@ @namespace BlazorBootstrap.Demo.RCL @inherits ComponentBase - @if (ShowCodeOnly) {
@@ -15,13 +14,13 @@
-                    
-                        @if (codeSnippet is not null)
-                        {
-                            @codeSnippet.Trim()
-                        }
-                    
-                
+ + @if (snippet is not null) + { + @snippet.Trim() + } + +
} @@ -41,10 +40,10 @@ else if (!Tabs)
-                
-                    @if (codeSnippet is not null)
+                
+                    @if (snippet is not null)
                     {
-                        @codeSnippet.Trim()
+                        @snippet.Trim()
                     }
                 
             
@@ -76,10 +75,10 @@ else // Tabs = true
-                        
-                            @if (codeSnippet is not null)
+                        
+                            @if (snippet is not null)
                             {
-                                @codeSnippet.Trim()
+                                @snippet.Trim()
                             }
                         
                     
@@ -88,4 +87,3 @@ else // Tabs = true } - diff --git a/BlazorBootstrap.Demo.RCL/Components/Shared/Demo.razor.cs b/BlazorBootstrap.Demo.RCL/Components/Shared/Demo.razor.cs index 3eb6f756b..91c4d5466 100644 --- a/BlazorBootstrap.Demo.RCL/Components/Shared/Demo.razor.cs +++ b/BlazorBootstrap.Demo.RCL/Components/Shared/Demo.razor.cs @@ -10,7 +10,7 @@ public partial class Demo : ComponentBase private string? clipboardTooltipTitle = "Copy to clipboard"; - private string? codeSnippet; + private string? snippet; /// /// A reference to this component instance for use in JavaScript calls. @@ -37,11 +37,11 @@ protected override async Task OnInitializedAsync() protected override async Task OnParametersSetAsync() { - if (codeSnippet is null) + if (snippet is null) { - var resourceName = Type.FullName + ".razor"; + var resourceFullName = Type.FullName + ".razor"; - using (var stream = Type.Assembly.GetManifestResourceStream(resourceName)!) + using (var stream = Type.Assembly.GetManifestResourceStream(resourceFullName)!) { try { @@ -50,7 +50,7 @@ protected override async Task OnParametersSetAsync() using (var reader = new StreamReader(stream)) { - codeSnippet = await reader.ReadToEndAsync(); + snippet = await reader.ReadToEndAsync(); } } catch (Exception ex) @@ -97,7 +97,7 @@ public void ResetCopyStatusJS() StateHasChanged(); } - private async Task CopyToClipboardAsync() => await JS.InvokeVoidAsync("copyToClipboard", codeSnippet, objRef); + private async Task CopyToClipboardAsync() => await JS.InvokeVoidAsync("copyToClipboard", snippet, objRef); #endregion @@ -105,7 +105,7 @@ public void ResetCopyStatusJS() [Inject] protected IJSRuntime JS { get; set; } = default!; - [Parameter] public string LanguageCssClass { get; set; } = "language-cshtml"; + [Parameter] public LanguageCode LanguageCode { get; set; } = LanguageCode.Razor; [Parameter] public bool ShowCodeOnly { get; set; } diff --git a/BlazorBootstrap.Demo.RCL/Components/Shared/Enums/LanguageCode.cs b/BlazorBootstrap.Demo.RCL/Components/Shared/Enums/LanguageCode.cs new file mode 100644 index 000000000..5ff099558 --- /dev/null +++ b/BlazorBootstrap.Demo.RCL/Components/Shared/Enums/LanguageCode.cs @@ -0,0 +1,68 @@ +namespace BlazorBootstrap.Demo.RCL; + +/// +/// +/// +public enum LanguageCode +{ + /// + /// ASP.NET (C#) - aspnet + /// + AspNet, + + /// + /// C# - csharp, cs, dotnet + /// + CSharp, + + /// + /// CSS - css + /// + Css, + + /// + /// HTML - html + /// + HTML, + + /// + /// JavaScript - javascript, js + /// + JavaScript, + + /// + /// JSON - json + /// + JSON, + + /// + /// JSONP - jsonp + /// + JSONP, + + /// + /// Markdown - md + /// + Markdown, + + /// + /// PowerShell - powershell + /// + PowerShell, + + /// + /// Razor C# - cshtml, razor + /// + Razor, + + /// + /// Text - none + /// + Text, + + /// + /// YAML - yaml, yml + /// + YAML +} + diff --git a/BlazorBootstrap.Demo.RCL/Components/Shared/Extensions/EnumExtensions.cs b/BlazorBootstrap.Demo.RCL/Components/Shared/Extensions/EnumExtensions.cs new file mode 100644 index 000000000..f261c113d --- /dev/null +++ b/BlazorBootstrap.Demo.RCL/Components/Shared/Extensions/EnumExtensions.cs @@ -0,0 +1,20 @@ +namespace BlazorBootstrap.Demo.RCL; + +public static class EnumExtensions +{ + public static string? ToLanguageCssClass(this LanguageCode languageCode) => + languageCode switch + { + LanguageCode.AspNet => "language-aspnet", + LanguageCode.CSharp => "language-csharp", + LanguageCode.JavaScript => "language-js", + LanguageCode.JSON => "language-json", + LanguageCode.JSONP => "language-jsonp", + LanguageCode.Markdown => "language-md", + LanguageCode.PowerShell => "language-powershell", + LanguageCode.Razor => "language-razor", + LanguageCode.Text => "language-none", + LanguageCode.YAML => "language-yaml", + _ => null + }; +} diff --git a/BlazorBootstrap.Demo.RCL/Components/Shared/Snippet.cs b/BlazorBootstrap.Demo.RCL/Components/Shared/Snippet.cs new file mode 100644 index 000000000..929ff8d96 --- /dev/null +++ b/BlazorBootstrap.Demo.RCL/Components/Shared/Snippet.cs @@ -0,0 +1,79 @@ +namespace BlazorBootstrap.Demo.RCL; + +public class Snippet : ComponentBase +{ + #region Members + + private string? snippet; + + #endregion + + #region Methods + + protected override void BuildRenderTree(RenderTreeBuilder builder) + { + builder.OpenElement(300, "div"); + builder.AddAttribute(301, "class", "highlight show-code-only"); + + builder.OpenElement(400, "pre"); + + builder.OpenElement(500, "code"); + builder.AddAttribute(501, "class", LanguageCode.ToLanguageCssClass()); + + if (snippet != null) + builder.AddContent(600, snippet.Trim()); + + builder.CloseElement(); // end: code + builder.CloseElement(); // end: pre + builder.CloseElement(); // end: div + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (firstRender) + await JS.InvokeVoidAsync("highlightCode"); + + await base.OnAfterRenderAsync(firstRender); + } + + protected override async Task OnParametersSetAsync() + { + if (snippet is null) + { + if (!string.IsNullOrWhiteSpace(FilePath)) + { + var resourceName = FilePath.Replace("~", typeof(Snippet).Assembly.GetName().Name).Replace("/", ".").Replace("\\", "."); + + using (var stream = typeof(Snippet).Assembly.GetManifestResourceStream(resourceName)!) + { + try + { + if (stream is null) + return; + + using (var reader = new StreamReader(stream)) + { + snippet = await reader.ReadToEndAsync(); + } + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + } + } + } + } + } + + #endregion + + #region Properties + + [Inject] protected IJSRuntime JS { get; set; } = null!; + + [Parameter] public LanguageCode LanguageCode { get; set; } = LanguageCode.Razor; + + [Parameter] public string? FilePath { get; set; } + + #endregion +}