Fornax.Seo
1.3.0
See the version list below for details.
dotnet add package Fornax.Seo --version 1.3.0
NuGet\Install-Package Fornax.Seo -Version 1.3.0
<PackageReference Include="Fornax.Seo" Version="1.3.0" />
paket add Fornax.Seo --version 1.3.0
#r "nuget: Fornax.Seo, 1.3.0"
// Install Fornax.Seo as a Cake Addin #addin nuget:?package=Fornax.Seo&version=1.3.0 // Install Fornax.Seo as a Cake Tool #tool nuget:?package=Fornax.Seo&version=1.3.0
Fornax.Seo
A SEO meta tag generator for Fornax
Goals
enhance the search engine visibility of Fornax-generated websites with:
- structured data in JSON-LD format
- OpenGraph
<meta>
tags - personalized social media links
try to enforce some SEO best practises, e.g. requiring absolute URLs to all content items
Usage example
NOTE
The following requires fornax
0.15.1 or newer.
Visit the wiki to learn how to use this package with earlier fornax
versions.
Change into a project directory and scaffold a new website
fornax new
Install and set up
paket
:dotnet tool install paket dotnet paket init
Configure dependencies, e.g. at minimum:
# paket.dependencies source https://api.nuget.org/v3/index.json framework: net8.0, netstandard2.0, netstandard2.1 generate_load_scripts: true storage: none # . . . nuget Fornax.Seo >= 1.2.0 # pulls in the Fornax.Core package nuget Markdig # . . .
Install the packages:
dotnet paket install
IMPORTANT
Provide the root domain of your website:
// loaders/globalloader.fsx #load @"../.paket/load/net8.0/Fornax.Core.fsx" type SiteInfo = { title: string /// The root domain of your website - must be an absolute URL baseUrl: string description: string }
Add personal authorship details, e.g.:
// loaders/globalloader.fsx #load @"../.paket/load/net8.0/Fornax.Seo.fsx" open Fornax.Seo let loader (projectRoot: string) (siteContent: SiteContents) = let siteInfo = { title = "Sample Fornax blog" baseUrl = "http://example.com" description = "Just a simple blog" } let onTheWeb = [ "linkedin.com/in/username" "github.com/username" "bitbucket.org/username" "facebook.com/username" ] let siteAuthor: ContentCreator = { Name = "Moi-même" Email = "info@example.com" SocialMedia = onTheWeb } siteContent.Add(siteInfo) siteContent.Add(siteAuthor) siteContent
Collect metadata from a content item (e.g., a blog posting)
// generators/post.fsx
#load @"../.paket/load/net8.0/Fornax.Seo.fsx"
#load @"layout.fsx"
open Html
open Fornax.Seo
let generate' (ctx: SiteContents) (page: string) =
let siteInfo = ctx.TryGetValue<Globalloader.SiteInfo>()
let siteName = siteInfo |> Option.map (fun si -> si.title)
let tagline =
siteInfo
|> Option.map (fun si -> si.description)
|> Option.defaultValue ""
let siteAuthor =
ctx.TryGetValue<ContentCreator>()
|> Option.defaultValue ContentCreator.Default
let siteRoot =
siteInfo
|> Option.map (fun si -> si.baseUrl)
|> Option.defaultValue ContentObject.Default.BaseUrl
let post =
ctx.TryGetValues<Postloader.Post>()
|> Option.defaultValue Seq.empty
|> Seq.find (fun p -> p.file = page)
let postMeta: ContentObject =
{ Title = post.title
BaseUrl = siteRoot
Url = post.file.Replace(System.IO.Path.GetExtension post.file, ".html")
Description = tagline
Author = { siteAuthor with Name = defaultArg post.author siteAuthor.Name }
SiteName = siteName
Headline = Some post.summary
ObjectType = Some "Blog"
ContentType = Some "BlogPosting"
OpenGraphType = Some "article"
Locale = Some "en-us"
Published = post.published
Modified = post.modified
Tags = Some post.tags
Meta =
Some [ ("Image", defaultArg post.image $"{siteRoot}/images/avatar.jpg")
("Publisher", defaultArg siteName siteAuthor.Name) ] }
ctx.Add(postMeta)
// . . .
Render SEO metadata in your page layout
// generators/layout.fsx
#load @"../.paket/load/net8.0/Fornax.Seo.fsx"
open Html
open Fornax.Seo
// . . .
let layout (ctx: SiteContents) (active: string) (content: HtmlElement seq) =
let siteAuthor =
ctx.TryGetValue<ContentCreator>()
|> Option.defaultValue ContentCreator.Default
let seoData =
ctx.TryGetValues<ContentObject>()
|> Option.defaultValue Seq.empty
let pageMeta =
seoData
|> Seq.tryFind (fun p -> p.Title.Contains(active))
|> function
| Some info -> info
| _ -> { ContentObject.Default with Author = siteAuthor }
html [] [
head [] [
meta [ CharSet "utf-8" ]
meta [ Name "viewport"; Content "width=device-width, initial-scale=1" ]
// . . .
yield! seo pageMeta
]
body [] [
// . . .
footer [] [ yield! socialMedia siteAuthor ]
]
]
// . . .
Similar NuGet libraries (by framework)
.NET
ASP.NET
Umbraco
Contributing
A guide to building the project and making pull requests can be found here.
License
Distributed under the terms of the Mozilla Public License Version 2.0.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Fornax.Core (>= 0.15.1)
- FSharp.Core (>= 8.0.200)
- Newtonsoft.Json (>= 13.0.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
- Upgrade runtime target to .NET 8
- Drop FSharp.Data.DesignTime from distribution
- Include Source Link metadata and embedded symbols in release builds