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/{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 = ["external/jquery.js" ; "dredgepos.core.css"; "dredgepos.core.js"; "keyboards.js"; "theme.css"; "screen.css"; ]
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