module Theme open System open System.IO open System.Collections.Generic open System.Text.RegularExpressions open FSharp.Core open DredgeFramework let currentTheme = "restaurant" let getHTMLForFile file = let stylePath = $"/styles/css/{file}" let scriptPath = $"/scripts/js/{file}" let fileExtension = file |> getFileExtension let scriptFileExists = File.Exists ("wwwroot"+stylePath) || File.Exists("wwwroot"+scriptPath) match scriptFileExists with | true -> match fileExtension with | ".css" -> $"\t" | ".js" -> let snippet = $"\t" snippet | _ -> "" | false -> $"\t" let ParseScriptsAndStylesheets files html = let defaultScriptsAndStyles = ["dark.theme.css"; "external/jquery.js" ; "dredgepos.core.js"; "keyboards.js";] let scriptsAndStylesheets = defaultScriptsAndStyles @ files let scriptAndStylesheetHTML = scriptsAndStylesheets |> List.map getHTMLForFile |> String.concat("\n") html |> StringReplace "" (scriptAndStylesheetHTML + "\n") let titlePrefix title = title + " | DredgePos" let ParseVariables (varArray: Map) (html:string) = Regex.Replace(html, "", MatchEvaluator( fun matchedVar -> let varName = matchedVar.Groups.[1] |> string |> StringTrim if varArray.ContainsKey varName then if varName |> ToLowerCase = "title" then titlePrefix varArray.[varName] else varArray.[varName] else "" )) let ParseArrays (arrayArray: Map>) (string:string) = Regex.Replace(string, "", MatchEvaluator( fun matchedVar -> let arrayName = matchedVar.Groups.[1].ToString() |> StringTrim let keyName = matchedVar.Groups.[2].ToString() if arrayArray.ContainsKey arrayName && arrayArray.[arrayName].ContainsKey keyName then arrayArray.[arrayName].[keyName] else "" ) ) let ParseSimpleLanguageVariables (string:string) = Regex.Replace(string, "", new MatchEvaluator( fun matchedVar -> let varName = matchedVar.Groups.[1].ToString() |> StringTrim language.get varName )) let ParseLanguageVariablesWithReplacements (string: string) = Regex.Replace(string, "", new MatchEvaluator( fun matchedVar -> let varName = matchedVar.Groups.[1].ToString() let replacements = matchedVar.Groups.[2].ToString() |> StringSplit "," |> Array.toList language.getAndReplace varName replacements )) let getTemplateFilePath templateName = "wwwroot/themes/"+ currentTheme + "/" + templateName + ".tpl.htm" let templateExists templateName = templateName |> getTemplateFilePath |> File.Exists let openTemplateFile templateName = if templateExists templateName then templateName |> getTemplateFilePath |> File.ReadAllText else "" let rec loadTemplateWithVarsArraysScriptsAndStyles templateName vars arrays scripts styles = templateName |> openTemplateFile |> ParseVariables vars |> ParseArrays arrays |> ParseLanguageVariablesWithReplacements |> ParseSimpleLanguageVariables |> ParseTemplates vars arrays scripts styles |> ParseScriptsAndStylesheets (scripts @ styles) and ParseTemplates vars arrays scripts styles (string: string) = Regex.Replace(string, "", new MatchEvaluator( fun template -> let templateName = template.Groups.[1].ToString() |> StringTrim loadTemplateWithVarsArraysScriptsAndStyles templateName vars arrays scripts styles )) let loadTemplate templateName = loadTemplateWithVarsArraysScriptsAndStyles templateName Map.empty Map.empty> [] [] let loadTemplateWithVars templateName vars = loadTemplateWithVarsArraysScriptsAndStyles templateName vars Map.empty> [] [] let loadTemplateWithVarsAndArrays templateName vars arrs = loadTemplateWithVarsArraysScriptsAndStyles templateName vars arrs [] [] let loadTemplateWithVarsAndScripts templateName vars scripts = loadTemplateWithVarsArraysScriptsAndStyles templateName vars Map.empty> scripts [] let loadTemplateWithVarsAndStyles = loadTemplateWithVarsAndScripts let loadTemplateWithVarsScriptsAndStyles templateName vars scripts styles = loadTemplateWithVarsArraysScriptsAndStyles templateName vars Map.empty> scripts styles