Upgrade to htmx 4 (#58)

- There may be more htmx work to do, but the package is updated
This commit is contained in:
2026-06-20 16:15:49 -04:00
parent 1b7010bff8
commit 2755b250e4
4 changed files with 21 additions and 23 deletions
+2 -2
View File
@@ -11,8 +11,8 @@
<PackageVersion Include="Fluid.Core" Version="2.31.0" /> <PackageVersion Include="Fluid.Core" Version="2.31.0" />
<PackageVersion Include="FSharp.Core" Version="10.1.301" /> <PackageVersion Include="FSharp.Core" Version="10.1.301" />
<PackageVersion Include="Giraffe" Version="8.2.0" /> <PackageVersion Include="Giraffe" Version="8.2.0" />
<PackageVersion Include="Giraffe.Htmx" Version="2.0.6" /> <PackageVersion Include="Giraffe.Htmx" Version="4.0.0-beta4" />
<PackageVersion Include="Giraffe.ViewEngine.Htmx" Version="2.0.6" /> <PackageVersion Include="Giraffe.ViewEngine.Htmx" Version="4.0.0-beta4" />
<PackageVersion Include="Markdig" Version="1.3.2" /> <PackageVersion Include="Markdig" Version="1.3.2" />
<PackageVersion Include="Markdown.ColorCode" Version="3.0.1" /> <PackageVersion Include="Markdown.ColorCode" Version="3.0.1" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.9" /> <PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.9" />
+19 -19
View File
@@ -11,7 +11,7 @@ open MyWebLog.Views
/// Extensions on the DotLiquid Context object /// Extensions on the DotLiquid Context object
type Context with type Context with
/// Get the current web log from the DotLiquid context /// Get the current web log from the DotLiquid context
member this.WebLog = member this.WebLog =
this.Environments[0].["web_log"] :?> WebLog this.Environments[0].["web_log"] :?> WebLog
@@ -76,8 +76,8 @@ type EditPostLinkFilter() =
|> function |> function
| Some postId -> ctx.WebLog.RelativeUrl(Permalink $"admin/post/{postId}/edit") | Some postId -> ctx.WebLog.RelativeUrl(Permalink $"admin/post/{postId}/edit")
| None -> $"alert('unknown post object type {postObj.GetType().Name}')" | None -> $"alert('unknown post object type {postObj.GetType().Name}')"
/// A filter to generate nav links, highlighting the active link (exact match) /// A filter to generate nav links, highlighting the active link (exact match)
type NavLinkFilter() = type NavLinkFilter() =
static member NavLink(ctx: Context, url: string, text: string) = static member NavLink(ctx: Context, url: string, text: string) =
@@ -104,45 +104,45 @@ type ThemeAssetFilter() =
/// Create various items in the page header based on the state of the page being generated /// Create various items in the page header based on the state of the page being generated
type PageHeadTag() = type PageHeadTag() =
inherit Tag() inherit Tag()
override this.Render(context: Context, result: TextWriter) = override this.Render(context: Context, result: TextWriter) =
let webLog = context.WebLog let webLog = context.WebLog
// spacer // spacer
let s = " " let s = " "
let getBool name = let getBool name =
defaultArg (context.Environments[0].[name] |> Option.ofObj |> Option.map Convert.ToBoolean) false defaultArg (context.Environments[0].[name] |> Option.ofObj |> Option.map Convert.ToBoolean) false
result.WriteLine $"""<meta name=generator content="{context.Environments[0].["generator"]}">""" result.WriteLine $"""<meta name=generator content="{context.Environments[0].["generator"]}">"""
// Theme assets // Theme assets
if assetExists "style.css" webLog then if assetExists "style.css" webLog then
result.WriteLine $"""{s}<link rel=stylesheet href="{ThemeAssetFilter.ThemeAsset(context, "style.css")}">""" result.WriteLine $"""{s}<link rel=stylesheet href="{ThemeAssetFilter.ThemeAsset(context, "style.css")}">"""
if assetExists "favicon.ico" webLog then if assetExists "favicon.ico" webLog then
result.WriteLine $"""{s}<link rel=icon href="{ThemeAssetFilter.ThemeAsset(context, "favicon.ico")}">""" result.WriteLine $"""{s}<link rel=icon href="{ThemeAssetFilter.ThemeAsset(context, "favicon.ico")}">"""
// RSS feeds and canonical URLs // RSS feeds and canonical URLs
let feedLink title url = let feedLink title url =
let escTitle = HttpUtility.HtmlAttributeEncode title let escTitle = HttpUtility.HtmlAttributeEncode title
let relUrl = webLog.RelativeUrl(Permalink url) let relUrl = webLog.RelativeUrl(Permalink url)
$"""{s}<link rel=alternate type="application/rss+xml" title="{escTitle}" href="{relUrl}">""" $"""{s}<link rel=alternate type="application/rss+xml" title="{escTitle}" href="{relUrl}">"""
if webLog.Rss.IsFeedEnabled && getBool "is_home" then if webLog.Rss.IsFeedEnabled && getBool "is_home" then
result.WriteLine(feedLink webLog.Name webLog.Rss.FeedName) result.WriteLine(feedLink webLog.Name webLog.Rss.FeedName)
result.WriteLine $"""{s}<link rel=canonical href="{webLog.AbsoluteUrl Permalink.Empty}">""" result.WriteLine $"""{s}<link rel=canonical href="{webLog.AbsoluteUrl Permalink.Empty}">"""
if webLog.Rss.IsCategoryEnabled && getBool "is_category_home" then if webLog.Rss.IsCategoryEnabled && getBool "is_category_home" then
let slug = context.Environments[0].["slug"] :?> string let slug = context.Environments[0].["slug"] :?> string
result.WriteLine(feedLink webLog.Name $"category/{slug}/{webLog.Rss.FeedName}") result.WriteLine(feedLink webLog.Name $"category/{slug}/{webLog.Rss.FeedName}")
if webLog.Rss.IsTagEnabled && getBool "is_tag_home" then if webLog.Rss.IsTagEnabled && getBool "is_tag_home" then
let slug = context.Environments[0].["slug"] :?> string let slug = context.Environments[0].["slug"] :?> string
result.WriteLine(feedLink webLog.Name $"tag/{slug}/{webLog.Rss.FeedName}") result.WriteLine(feedLink webLog.Name $"tag/{slug}/{webLog.Rss.FeedName}")
if getBool "is_post" then if getBool "is_post" then
let post = context.Environments[0].["model"] :?> PostDisplay let post = context.Environments[0].["model"] :?> PostDisplay
let url = webLog.AbsoluteUrl (Permalink post.Posts[0].Permalink) let url = webLog.AbsoluteUrl (Permalink post.Posts[0].Permalink)
result.WriteLine $"""{s}<link rel=canonical href="{url}">""" result.WriteLine $"""{s}<link rel=canonical href="{url}">"""
if getBool "is_page" then if getBool "is_page" then
let page = context.Environments[0].["page"] :?> DisplayPage let page = context.Environments[0].["page"] :?> DisplayPage
let url = webLog.AbsoluteUrl (Permalink page.Permalink) let url = webLog.AbsoluteUrl (Permalink page.Permalink)
@@ -152,15 +152,15 @@ type PageHeadTag() =
/// Create various items in the page header based on the state of the page being generated /// Create various items in the page header based on the state of the page being generated
type PageFootTag() = type PageFootTag() =
inherit Tag() inherit Tag()
override this.Render(context: Context, result: TextWriter) = override this.Render(context: Context, result: TextWriter) =
let webLog = context.WebLog let webLog = context.WebLog
// spacer // spacer
let s = " " let s = " "
if webLog.AutoHtmx then if webLog.AutoHtmx then
result.WriteLine $"{s}{RenderView.AsString.htmlNode Htmx.Script.minified}" result.WriteLine $"{s}{RenderView.AsString.htmlNode Htmx.Script.local}"
if assetExists "script.js" webLog then if assetExists "script.js" webLog then
result.WriteLine $"""{s}<script src="{ThemeAssetFilter.ThemeAsset(context, "script.js")}"></script>""" result.WriteLine $"""{s}<script src="{ThemeAssetFilter.ThemeAsset(context, "script.js")}"></script>"""
@@ -185,7 +185,7 @@ type TagLinkFilter() =
/// Create links for a user to log on or off, and a dashboard link if they are logged off /// Create links for a user to log on or off, and a dashboard link if they are logged off
type UserLinksTag() = type UserLinksTag() =
inherit Tag() inherit Tag()
override this.Render(context: Context, result: TextWriter) = override this.Render(context: Context, result: TextWriter) =
let link it = context.WebLog.RelativeUrl(Permalink it) let link it = context.WebLog.RelativeUrl(Permalink it)
seq { seq {
@@ -219,11 +219,11 @@ let register () =
typeof<ValueFilter> typeof<ValueFilter>
] ]
|> List.iter Template.RegisterFilter |> List.iter Template.RegisterFilter
Template.RegisterTag<PageHeadTag> "page_head" Template.RegisterTag<PageHeadTag> "page_head"
Template.RegisterTag<PageFootTag> "page_foot" Template.RegisterTag<PageFootTag> "page_foot"
Template.RegisterTag<UserLinksTag> "user_links" Template.RegisterTag<UserLinksTag> "user_links"
[ // Domain types [ // Domain types
typeof<CustomFeed>; typeof<Episode>; typeof<Episode option>; typeof<MetaItem>; typeof<Page>; typeof<RssOptions> typeof<CustomFeed>; typeof<Episode>; typeof<Episode option>; typeof<MetaItem>; typeof<Page>; typeof<RssOptions>
typeof<TagMap>; typeof<WebLog> typeof<TagMap>; typeof<WebLog>
-1
View File
@@ -28,7 +28,6 @@
<Compile Include="DotLiquidBespoke.fs" /> <Compile Include="DotLiquidBespoke.fs" />
<Compile Include="Maintenance.fs" /> <Compile Include="Maintenance.fs" />
<Compile Include="Program.fs" /> <Compile Include="Program.fs" />
<Content Include="wwwroot\htmx.min.js" CopyToOutputDirectory="Always" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
File diff suppressed because one or more lines are too long