diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props
index c585bd5..68ee001 100644
--- a/src/Directory.Packages.props
+++ b/src/Directory.Packages.props
@@ -6,7 +6,6 @@
-
diff --git a/src/MyWebLog/DotLiquidBespoke.fs b/src/MyWebLog/DotLiquidBespoke.fs
deleted file mode 100644
index 2748712..0000000
--- a/src/MyWebLog/DotLiquidBespoke.fs
+++ /dev/null
@@ -1,240 +0,0 @@
-/// Custom DotLiquid filters and tags
-module MyWebLog.DotLiquidBespoke
-
-open System
-open System.IO
-open System.Web
-open DotLiquid
-open MyWebLog.ViewModels
-
-/// Extensions on the DotLiquid Context object
-type Context with
-
- /// Get the current web log from the DotLiquid context
- member this.WebLog =
- this.Environments[0].["web_log"] :?> WebLog
-
-
-/// Does an asset exist for the current theme?
-let assetExists fileName (webLog: WebLog) =
- ThemeAssetCache.get webLog.ThemeId |> List.exists (fun it -> it = fileName)
-
-/// Obtain the link from known types
-let permalink (item: obj) (linkFunc: Permalink -> string) =
- match item with
- | :? String as link -> Some link
- | :? DisplayPage as page -> Some page.Permalink
- | :? PostListItem as post -> Some post.Permalink
- | :? DropProxy as proxy -> Option.ofObj proxy["Permalink"] |> Option.map string
- | _ -> None
- |> function
- | Some link -> linkFunc (Permalink link)
- | None -> $"alert('unknown item type {item.GetType().Name}')"
-
-
-/// A filter to generate an absolute link
-type AbsoluteLinkFilter() =
- static member AbsoluteLink(ctx: Context, item: obj) =
- permalink item ctx.WebLog.AbsoluteUrl
-
-
-/// A filter to generate a link with posts categorized under the given category
-type CategoryLinkFilter() =
- static member CategoryLink(ctx: Context, catObj: obj) =
- match catObj with
- | :? DisplayCategory as cat -> Some cat.Slug
- | :? DropProxy as proxy -> Option.ofObj proxy["Slug"] |> Option.map string
- | _ -> None
- |> function
- | Some slug -> ctx.WebLog.RelativeUrl(Permalink $"category/{slug}/")
- | None -> $"alert('unknown category object type {catObj.GetType().Name}')"
-
-
-/// A filter to generate a link that will edit a page
-type EditPageLinkFilter() =
- static member EditPageLink(ctx: Context, pageObj: obj) =
- match pageObj with
- | :? DisplayPage as page -> Some page.Id
- | :? DropProxy as proxy -> Option.ofObj proxy["Id"] |> Option.map string
- | :? String as theId -> Some theId
- | _ -> None
- |> function
- | Some pageId -> ctx.WebLog.RelativeUrl(Permalink $"admin/page/{pageId}/edit")
- | None -> $"alert('unknown page object type {pageObj.GetType().Name}')"
-
-
-/// A filter to generate a link that will edit a post
-type EditPostLinkFilter() =
- static member EditPostLink(ctx: Context, postObj: obj) =
- match postObj with
- | :? PostListItem as post -> Some post.Id
- | :? DropProxy as proxy -> Option.ofObj proxy["Id"] |> Option.map string
- | :? String as theId -> Some theId
- | _ -> None
- |> function
- | Some postId -> ctx.WebLog.RelativeUrl(Permalink $"admin/post/{postId}/edit")
- | None -> $"alert('unknown post object type {postObj.GetType().Name}')"
-
-
-/// A filter to generate nav links, highlighting the active link (exact match)
-type NavLinkFilter() =
- static member NavLink(ctx: Context, url: string, text: string) =
- let extraPath = ctx.WebLog.ExtraPath
- let path = if extraPath = "" then "" else $"{extraPath[1..]}/"
- seq {
- "
"
- text
- ""
- }
- |> String.concat ""
-
-
-/// A filter to generate a link for theme asset (image, stylesheet, script, etc.)
-type ThemeAssetFilter() =
- static member ThemeAsset(ctx: Context, asset: string) =
- ctx.WebLog.RelativeUrl(Permalink $"themes/{ctx.WebLog.ThemeId}/{asset}")
-
-
-/// Create various items in the page header based on the state of the page being generated
-type PageHeadTag() =
- inherit Tag()
-
- override this.Render(context: Context, result: TextWriter) =
- let webLog = context.WebLog
- // spacer
- let s = " "
- let getBool name =
- defaultArg (context.Environments[0].[name] |> Option.ofObj |> Option.map Convert.ToBoolean) false
-
- result.WriteLine $""""""
-
- // Theme assets
- if assetExists "style.css" webLog then
- result.WriteLine $"""{s}"""
- if assetExists "favicon.ico" webLog then
- result.WriteLine $"""{s}"""
-
- // RSS feeds and canonical URLs
- let feedLink title url =
- let escTitle = HttpUtility.HtmlAttributeEncode title
- let relUrl = webLog.RelativeUrl(Permalink url)
- $"""{s}"""
-
- if webLog.Rss.IsFeedEnabled && getBool "is_home" then
- result.WriteLine(feedLink webLog.Name webLog.Rss.FeedName)
- result.WriteLine $"""{s}"""
-
- if webLog.Rss.IsCategoryEnabled && getBool "is_category_home" then
- let slug = context.Environments[0].["slug"] :?> string
- result.WriteLine(feedLink webLog.Name $"category/{slug}/{webLog.Rss.FeedName}")
-
- if webLog.Rss.IsTagEnabled && getBool "is_tag_home" then
- let slug = context.Environments[0].["slug"] :?> string
- result.WriteLine(feedLink webLog.Name $"tag/{slug}/{webLog.Rss.FeedName}")
-
- if getBool "is_post" then
- let post = context.Environments[0].["model"] :?> PostDisplay
- let url = webLog.AbsoluteUrl (Permalink post.Posts[0].Permalink)
- result.WriteLine $"""{s}"""
-
- if getBool "is_page" then
- let page = context.Environments[0].["page"] :?> DisplayPage
- let url = webLog.AbsoluteUrl (Permalink page.Permalink)
- result.WriteLine $"""{s}"""
-
-
-/// Create various items in the page header based on the state of the page being generated
-type PageFootTag() =
- inherit Tag()
-
- override this.Render(context: Context, result: TextWriter) =
- let webLog = context.WebLog
- // spacer
- let s = " "
-
- match webLog.AutoHtmx with
- | NoAutoHtmx -> None
- | AutoHtmx -> (Permalink >> Some) Giraffe.Htmx.Common.StaticAssetUrl.htmx[1..]
- | AutoHtmax -> (Permalink >> Some) Giraffe.Htmx.Common.StaticAssetUrl.htmax[1..]
- |> function
- | Some url -> result.WriteLine $"""{s}"""
- | None -> ()
-
- if assetExists "script.js" webLog then
- result.WriteLine $"""{s}"""
-
-
-/// A filter to generate a relative link
-type RelativeLinkFilter() =
- static member RelativeLink(ctx: Context, item: obj) =
- permalink item ctx.WebLog.RelativeUrl
-
-
-/// A filter to generate a link with posts tagged with the given tag
-type TagLinkFilter() =
- static member TagLink(ctx: Context, tag: string) =
- ctx.Environments[0].["tag_mappings"] :?> TagMap list
- |> List.tryFind (fun it -> it.Tag = tag)
- |> function
- | Some tagMap -> tagMap.UrlValue
- | None -> tag.Replace(" ", "+")
- |> function tagUrl -> ctx.WebLog.RelativeUrl(Permalink $"tag/{tagUrl}/")
-
-
-/// Create links for a user to log on or off, and a dashboard link if they are logged off
-type UserLinksTag() =
- inherit Tag()
-
- override this.Render(context: Context, result: TextWriter) =
- let link it = context.WebLog.RelativeUrl(Permalink it)
- seq {
- """
"""
- match Convert.ToBoolean context.Environments[0].["is_logged_on"] with
- | true ->
- $"""
"
- }
- |> Seq.iter result.WriteLine
-
-/// A filter to retrieve the value of a meta item from a list
-// (shorter than `{% assign item = list | where: "Name", [name] | first %}{{ item.value }}`)
-type ValueFilter() =
- static member Value(_: Context, items: MetaItem list, name: string) =
- match items |> List.tryFind (fun it -> it.Name = name) with
- | Some item -> item.Value
- | None -> $"-- {name} not found --"
-
-
-open System.Collections.Generic
-open Microsoft.AspNetCore.Antiforgery
-
-/// Register custom filters/tags and safe types
-let register () =
- [ typeof; typeof; typeof; typeof
- typeof; typeof; typeof; typeof
- typeof
- ]
- |> List.iter Template.RegisterFilter
-
- Template.RegisterTag "page_head"
- Template.RegisterTag "page_foot"
- Template.RegisterTag "user_links"
-
- [ // Domain types
- typeof; typeof; typeof; typeof; typeof; typeof
- typeof; typeof
- // View models
- typeof; typeof; typeof; typeof; typeof
- typeof; typeof
- // Framework types
- typeof; typeof; typeof; typeof
- typeof; typeof; typeof; typeof
- ]
- |> List.iter (fun it -> Template.RegisterSafeType (it, [| "*" |]))
diff --git a/src/MyWebLog/MyWebLog.fsproj b/src/MyWebLog/MyWebLog.fsproj
index e8709c9..abe84a6 100644
--- a/src/MyWebLog/MyWebLog.fsproj
+++ b/src/MyWebLog/MyWebLog.fsproj
@@ -24,7 +24,6 @@
-
@@ -32,7 +31,6 @@
-
diff --git a/src/MyWebLog/Program.fs b/src/MyWebLog/Program.fs
index 6fc65e2..5efc5c6 100644
--- a/src/MyWebLog/Program.fs
+++ b/src/MyWebLog/Program.fs
@@ -108,9 +108,6 @@ let main args =
.AddGiraffe()
|> ignore
- // Set up DotLiquid
- DotLiquidBespoke.register ()
-
let app = builder.Build()
match args |> Array.tryHead with
diff --git a/src/MyWebLog/Template.fs b/src/MyWebLog/Template.fs
index f09c0ba..a168e4d 100644
--- a/src/MyWebLog/Template.fs
+++ b/src/MyWebLog/Template.fs
@@ -190,15 +190,12 @@ let options () =
it
open Giraffe.Htmx.Common
+open Fluid.Ast
/// Fluid parser customized with myWebLog filters and tags
let parser =
// spacer
- let s = " "
- // Required return for tag delegates
- let ok () =
- VTask Fluid.Ast.Completion.Normal
-
+ let s = " "
let it = FluidParser()
// Create various items in the page header based on the state of the page being generated
@@ -264,7 +261,7 @@ let parser =
let url = app.WebLog.AbsoluteUrl(Permalink app.Page.Permalink)
writer.WriteLine $"""{s}"""
- ok ())
+ VTask(Completion.Normal))
// Create various items in the page footer based on the state of the page being generated
it.RegisterEmptyTag("page_foot",
@@ -284,7 +281,7 @@ let parser =
themeAsset (StringValue "script.js") context
|> sprintf "%s" s
|> writer.WriteLine
- ok ())
+ VTask(Completion.Normal))
// Create links for a user to log on or off, and a dashboard link if they are logged off
it.RegisterEmptyTag("user_links",
@@ -302,7 +299,7 @@ let parser =
""
}
|> Seq.iter writer.WriteLine
- ok ())
+ VTask(Completion.Normal))
it