Pointless Waymarks Tools

Artifact [48c3078726]
Login

Artifact [48c3078726]

Artifact 48c3078726f06519e899408c83b107235c204ef782009c370c74962d90e0276c:


using System.Text.Encodings.Web;
using PointlessWaymarks.CommonTools;
using PointlessWaymarks.WpfCommon.WebViewVirtualDomain;
using PointlessWaymarks.WpfCommon.WpfHtmlResources;

// ReSharper disable StringLiteralTypo

namespace PointlessWaymarks.WpfCommon.WpfHtml;

public static class WpfHtmlDocument
{
    public static FileBuilder CmsLeafletMapAndChartHtmlAndJs(string title, string styleBlock = "",
        string javascript = "", string serializedMapIcons = "")
    {
        var htmlString = $$"""
                           <!doctype html>
                           <html lang=en>
                           <head>
                             <meta http-equiv="X-UA-Compatible" content="IE=edge" />
                             <meta charset="utf-8">
                             <meta name="viewport" content="width=device-width, initial-scale=1.0">
                             <title>{{HtmlEncoder.Default.Encode(title)}}</title>
                             <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" integrity="sha256-kLaT2GOSpHechhsozzB+flnD+zUyjE2LlfWPgU04xyI=" crossorigin="" />
                             <script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js" integrity="sha256-WBkoXOwTeyKclOHuWtc+i2uENFpDZ9YPdf5Hf+D7ewM=" crossorigin=""></script>
                             <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
                             <script src="https://[[VirtualDomain]]/leafletBingLayer.js"></script>
                             <link rel="stylesheet" href="https://[[VirtualDomain]]/leaflet.awesome-svg-markers.css" />
                             <script src="https://[[VirtualDomain]]/leaflet.awesome-svg-markers.js"></script>
                             <script src="https://[[VirtualDomain]]/localMapCommon.js"></script>
                               {{(string.IsNullOrWhiteSpace(styleBlock) ? string.Empty : """<link rel="stylesheet" href="https://[[VirtualDomain]]/customStyle.css" />""")}}
                               {{(string.IsNullOrWhiteSpace(javascript) ? string.Empty : """<script src="https://[[VirtualDomain]]/customScript.js"></script>""")}}
                           </head>
                           <body onload="initialDocumentLoad();">
                             <div style="display: grid; grid-template-rows: auto 150px; height: 95vh; width: 100%;">
                                <div id="mainMap" class="leaflet-container leaflet-retina leaflet-fade-anim leaflet-grab leaflet-touch-drag"
                                   style="grid-row-start: 1; position: relative;"></div>
                                 <div id="mainElevationChartContainer" style=" grid-row-start: 2;" class="line-elevation-chart-container">
                                     <canvas id="mainElevationChart" class="line-elevation-chart" style="max-width:100%;"></canvas>
                                 </div>
                             </div>
                           </body>
                           </html>
                           """;

        var initialWebFilesMessage = new FileBuilder();

        if (!string.IsNullOrWhiteSpace(styleBlock))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("customStyle.css", styleBlock));
        if (!string.IsNullOrWhiteSpace(javascript))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("customScript.js", javascript));
        initialWebFilesMessage.Create.Add(new FileBuilderCreate("leafletBingLayer.js",
            WpfHtmlResourcesHelper.LeafletBingLayerJs()));
        initialWebFilesMessage.Create.Add(new FileBuilderCreate("localMapCommon.js",
            WpfHtmlResourcesHelper.LocalMapCommonJs()));
        initialWebFilesMessage.Create.AddRange(WpfHtmlResourcesHelper.AwesomeMapSvgMarkers());
        if (!string.IsNullOrWhiteSpace(serializedMapIcons))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("pwMapSvgIcons.json", serializedMapIcons));
        initialWebFilesMessage.Create.Add(new FileBuilderCreate("Index.html", htmlString, true));

        return initialWebFilesMessage;
    }

    public static FileBuilder CmsLeafletMapHtmlAndJs(string title, string styleBlock = "", string javascript = "", string serializedMapIcons = "")
    {
        var htmlString = $$"""
                           <!doctype html>
                           <html lang=en>
                           <head>
                             <meta http-equiv="X-UA-Compatible" content="IE=edge" />
                             <meta charset="utf-8">
                             <meta name="viewport" content="width=device-width, initial-scale=1.0">
                             <title>{{HtmlEncoder.Default.Encode(title)}}</title>
                             <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.3/dist/leaflet.css" integrity="sha256-kLaT2GOSpHechhsozzB+flnD+zUyjE2LlfWPgU04xyI=" crossorigin="" />
                             <link rel="stylesheet" href="https://[[VirtualDomain]]/leaflet.awesome-svg-markers.css">
                             <script src="https://unpkg.com/leaflet@1.9.3/dist/leaflet.js" integrity="sha256-WBkoXOwTeyKclOHuWtc+i2uENFpDZ9YPdf5Hf+D7ewM=" crossorigin=""></script>
                             <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
                             <script src="https://[[VirtualDomain]]/leaflet.awesome-svg-markers.js"></script>
                             <script src="https://[[VirtualDomain]]/leafletBingLayer.js"></script>
                             <script src="https://[[VirtualDomain]]/localMapCommon.js"></script>
                               {{(string.IsNullOrWhiteSpace(styleBlock) ? string.Empty : """<link rel="stylesheet" href="https://[[VirtualDomain]]/customStyle.css" />""")}}
                               {{(string.IsNullOrWhiteSpace(javascript) ? string.Empty : """<script src="https://[[VirtualDomain]]/customScript.js"></script>""")}}
                           </head>
                           <body onload="initialDocumentLoad();">
                                <div id="mainMap" class="leaflet-container leaflet-retina leaflet-fade-anim leaflet-grab leaflet-touch-drag"
                                   style="height: 96vh;"></div>
                           </body>
                           </html>
                           """;

        var initialWebFilesMessage = new FileBuilder();

        if (!string.IsNullOrWhiteSpace(styleBlock))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("customStyle.css", styleBlock));
        if (!string.IsNullOrWhiteSpace(javascript))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("customScript.js", javascript));
        initialWebFilesMessage.Create.Add(new FileBuilderCreate("leafletBingLayer.js",
            WpfHtmlResourcesHelper.LeafletBingLayerJs()));
        initialWebFilesMessage.Create.Add(new FileBuilderCreate("localMapCommon.js",
            WpfHtmlResourcesHelper.LocalMapCommonJs()));
        initialWebFilesMessage.Create.AddRange(WpfHtmlResourcesHelper.AwesomeMapSvgMarkers());
        if (!string.IsNullOrWhiteSpace(serializedMapIcons))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("pwMapSvgIcons.json", serializedMapIcons));
        initialWebFilesMessage.Create.Add(new FileBuilderCreate("Index.html", htmlString, true));

        return initialWebFilesMessage;
    }

    public static void SetupCmsLeafletMapHtmlAndJs(this IWebViewMessenger messenger, string title,
        double initialLatitude, double initialLongitude, bool autoCloseMarkers, string serializedMapIcons = "", string calTopoApiKey = "",
        string bingApiKey = "", string cssStyleBlock = "", string javascript = "")
    {
        var initialWebFilesMessage = CmsLeafletMapHtmlAndJs(title, cssStyleBlock, javascript, serializedMapIcons);

        messenger.ToWebView.Enqueue(initialWebFilesMessage);

        messenger.ToWebView.Enqueue(NavigateTo.CreateRequest("Index.html", true));

        messenger.ToWebView.Enqueue(ExecuteJavaScript.CreateRequest(
            $"initialMapLoad({initialLatitude}, {initialLongitude}, '{calTopoApiKey}', '{bingApiKey}', true, {autoCloseMarkers.ToString().ToLower()})",
            true));
    }

    public static void SetupCmsLeafletMapWithLineElevationChartHtmlAndJs(this IWebViewMessenger messenger, string title,
        double initialLatitude, double initialLongitude, string serializedMapIcons = "", string calTopoApiKey = "", string bingApiKey = "",
        string cssStyleBlock = "", string javascript = "")
    {
        var initialWebFilesMessage = CmsLeafletMapAndChartHtmlAndJs(title, cssStyleBlock, javascript, serializedMapIcons);

        messenger.ToWebView.Enqueue(initialWebFilesMessage);

        messenger.ToWebView.Enqueue(NavigateTo.CreateRequest("Index.html", true));

        messenger.ToWebView.Enqueue(ExecuteJavaScript.CreateRequest(
            $"initialMapLoad({initialLatitude}, {initialLongitude}, '{calTopoApiKey}', '{bingApiKey}', true, true)",
            true));
    }

    public static void SetupCmsLeafletPointChooserMapHtmlAndJs(this IWebViewMessenger messenger, string title,
        double initialLatitude, double initialLongitude, string serializedMapIcons = "", string calTopoApiKey = "", string bingApiKey = "",
        string cssStyleBlock = "", string javascript = "")
    {
        var initialWebFilesMessage = CmsLeafletMapHtmlAndJs(title, cssStyleBlock, javascript, serializedMapIcons);

        messenger.ToWebView.Enqueue(initialWebFilesMessage);

        messenger.ToWebView.Enqueue(NavigateTo.CreateRequest("Index.html", true));

        messenger.ToWebView.Enqueue(ExecuteJavaScript.CreateRequest(
            $"initialMapLoadWithUserPointChooser({initialLatitude}, {initialLongitude}, '{calTopoApiKey}', '{bingApiKey}')",
            true));
    }

    public static async Task SetupDocumentWithMinimalCss(this IWebViewMessenger messenger, string body,
        string title, string styleBlock = "", string javascript = "")
    {
        var minimalCss = await HtmlTools.MinimalCssAsString();

        var htmlDoc = $$"""

                        <!doctype html>
                        <html lang=en>
                        <head>
                            <meta http-equiv="X-UA-Compatible" content="IE=edge" />
                            <meta name="viewport" content="width=device-width, initial-scale=1.0">
                            <meta charset="utf-8">
                            <title>{{HtmlEncoder.Default.Encode(title)}}</title>
                            <link rel="stylesheet" href="https://[[VirtualDomain]]/minimal.css" />
                            {{(string.IsNullOrWhiteSpace(styleBlock) ? string.Empty : """<link rel="stylesheet" href="https://[[VirtualDomain]]/customStyle.css" />""")}}
                            {{(string.IsNullOrWhiteSpace(javascript) ? string.Empty : """<script src="https://[[VirtualDomain]]/customScript.js"></script>""")}}
                        </head>
                        <body>
                            {{body}}
                            <script>
                                window.chrome.webview.postMessage( { "messageType": "scriptFinished" } );
                            </script>
                        </body>
                        </html>
                        """;

        var initialWebFilesMessage = new FileBuilder();

        if (!string.IsNullOrWhiteSpace(minimalCss))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("minimal.css", minimalCss));
        if (!string.IsNullOrWhiteSpace(styleBlock))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("customStyle.js", htmlDoc));
        if (!string.IsNullOrWhiteSpace(javascript))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("customScript.js", htmlDoc));
        initialWebFilesMessage.Create.Add(new FileBuilderCreate("Index.html", htmlDoc, true));

        messenger.ToWebView.Enqueue(initialWebFilesMessage);
        messenger.ToWebView.Enqueue(NavigateTo.CreateRequest("Index.html", true));
    }

    public static async Task SetupDocumentWithPureCss(this IWebViewMessenger messenger, string body,
        string title, string styleBlock = "", string javascript = "")
    {
        var pureCss = await HtmlTools.PureCssAsString();

        var htmlDoc = $$"""

                        <!doctype html>
                        <html lang=en>
                        <head>
                            <meta http-equiv="X-UA-Compatible" content="IE=edge" />
                            <meta name="viewport" content="width=device-width, initial-scale=1.0">
                            <meta charset="utf-8">
                            <title>{{HtmlEncoder.Default.Encode(title)}}</title>
                            <link rel="stylesheet" href="https://[[VirtualDomain]]/pure.css" />
                            {{(string.IsNullOrWhiteSpace(styleBlock) ? string.Empty : """<link rel="stylesheet" href="https://[[VirtualDomain]]/customStyle.css" />""")}}
                            {{(string.IsNullOrWhiteSpace(javascript) ? string.Empty : """<script src="https://[[VirtualDomain]]/customScript.js"></script>""")}}
                        </head>
                        <body>
                            {{body}}
                            <script>
                                window.chrome.webview.postMessage( { "messageType": "scriptFinished" } );
                            </script>
                        </body>
                        </html>
                        """;

        var initialWebFilesMessage = new FileBuilder();

        if (!string.IsNullOrWhiteSpace(pureCss))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("pure.css", pureCss));
        if (!string.IsNullOrWhiteSpace(javascript))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("customStyle.js", styleBlock));
        if (!string.IsNullOrWhiteSpace(javascript))
            initialWebFilesMessage.Create.Add(new FileBuilderCreate("customScript.js", javascript));
        initialWebFilesMessage.Create.Add(new FileBuilderCreate("Index.html", htmlDoc, true));

        messenger.ToWebView.Enqueue(initialWebFilesMessage);
        messenger.ToWebView.Enqueue(NavigateTo.CreateRequest("Index.html", true));
    }
}