A flexible and extensible static content generation framework for .NET.
MIT License
Bot releases are visible (Hide)
DocumentSourceComparer
class that implements IEqualityComparer<IDocument>
and can be used to compare documents by source path.IEnumerable<IDocument>.ContainsBySource()
extension method to check if a collection of documents contains a document with a given source path.MediaTypes.IsMediaType()
method to help determine if a given path matches specified media type(s).Published by daveaglick about 1 year ago
=>
prefix. The previous behavior that evaluates a computed value every time it's accessed can still be used by prefixing with ->
instead. In theory this change shouldn't result in any differences in behavior since documents are immutable in the first place (so caching wouldn't be any different from re-evaluating), but if you have computed metadata values that consider state outside the document (such as something like DateTime.Now
), you'll need to switch those to use the ->
prefix instead.highlight.js
used in Statiq.Highlight
(#269).Published by daveaglick over 1 year ago
GenerateFeeds
module always sets a feed title, even if one isn't provided.GenerateFeeds
if a feed link isn't set, either through the Host
setting or otherwise.Published by daveaglick over 1 year ago
IEngineManager
and a corresponding bootstrapper ConfigureEngineManager()
extension method to allow customizing the engine manager used in most commands just prior to it executing the engine (useful for last-minute pipeline customization and some other niche use cases).Published by daveaglick over 1 year ago
HttpClient.SendWithRetryAsync()
extension to log retries at the information level since they may indicate other problems, and to retry during internal HttpClient
timeouts.Published by daveaglick over 1 year ago
CleanMode.None
is set (I.e. --noclean
).RenderMarkdown
no longer escapes @
characters inside mailto
links (#254).EscapeAtInMarkdown
setting that can control @
escaping in Markdown files by the RenderMarkdown
module on a file-by-file basis (#254).Published by daveaglick over 1 year ago
ExtractFrontMatter
to ensure front matter is extracted when the delimiter is on the last line of the file.Published by daveaglick almost 2 years ago
PostProcessHasDependencies
property that indicates the post-process phase of a pipeline should depend on the post-process phase(s) of the pipeline dependencies. This is helpful in certain situations where you need a pipeline to run after other post-process phases from dependencies.GenerateRedirects.AlwaysCreateAdditionalOutput()
method to allow creating additional redirect files even if no redirects are specified (I.e. if redirects are also being generated from another source).GenerateRedirects.WithAdditionalOutput()
that can accept the execution context in the delegate and/or return a Task
.Published by daveaglick almost 2 years ago
ElseIf
when Predicate.RequiresDocument
is false in ExecuteIf
module (#255, #256, thanks @nils-a).IExecutionState.GetCurrentDateTime()
instead of DateTime.Now
, etc.Published by daveaglick almost 2 years ago
AnalyzeCSharp
to use the symbol ID and generate shorter names so very long symbols don't create paths that are too long (#244).Published by daveaglick over 2 years ago
Statiq.App.props
to Statiq.App.targets
to resolve some import ordering bugs.Keys.IgnoreExternalDestinations
setting to ignore when document destinations are not relative to the output path since some use cases may require writing documents elsewhere.Published by daveaglick over 2 years ago
HtmlKeys
copy-paste errors (#240, thanks @pascalberger).Published by daveaglick over 2 years ago
AnalyzeCSharp
module.Published by daveaglick over 2 years ago
ExtractFrontMatter
module (#231).IPipelineOutputs.ExceptPipelines()
extension method to get outputs from all but a set of specified pipelines.IPipelineOutputs.ExceptPipeline()
now returns documents in natural order like IPipelineOutputs.FromPipeline()
does.AnalyzeCSharp.IncludeEmptyNamespaces()
option to control whether recursively empty namespaces are output.Published by daveaglick over 2 years ago
Statiq.CodeAnalysis
to 4.1.0 which removes some dependencies on .NET Framework and resolves some package resolution problems.Published by daveaglick over 2 years ago
RenderMarkdown
module that bypasses markdown processing.ShortcodeResult
from the bootstrapper due to lack of availability of an execution context (since the engine hasn't been created yet).WithNestedElements()
to the GatherHeadings
module to control whether nested HTML element content is included in the heading text (the default is now that it is not, other than links).StartProcessArgument
class and WithArgument()
/WithArguments()
methods to the StartProcess
module that makes it easier to define multiple arguments inside a single config delegate.Published by daveaglick over 2 years ago
DocumentList<TDocument>.GetDestination(NormalizedPath destinationPath)
, .GetSource(NormalizedPath sourcePath)
, and .GetRelativeSource(NormalizedPath sourcePath)
to better provide single document results from a document list.IPipelineOutputs.GetDestination(NormalizedPath destinationPath)
, .GetSource(NormalizedPath sourcePath)
, and .GetRelativeSource(NormalizedPath sourcePath)
to better provide single document results from pipeline output collections.IDocument.Timestamp
that holds a timestamp of document instantiation and is useful for ordering documents based on "most recent" semantics.IDocument.Timestamp
property to order certain document results like the PipelineOutputs
enumerator, PipelineOutputs.ExceptPipeline()
, IEnumerable<IDocument>.FilterDestinations()
, and IEnumerable<IDocument>.FilterSources()
in descending creation order (in other words, document results that otherwise don't have a natural order are ordered by timestamp now) (#226).IEngine.GetJavaScriptEnginePool()
for the first time concurrently.CodeAnalysisKeys.Implements
to the documents produced by the AnalyzeCSharp
module to represent the interface member(s) being implemented by properties, events, and methods.Published by daveaglick almost 3 years ago
MarkdownExtensions
metadata key that can add Markdown (I.e. Markdig) extension types per-document or per-execution using metadata/settings (#222).PathCollection.RemoveDefault()
method and instead allow optionally specifying whether paths that get added to a PathCollection
are removable (the default is true
).Published by daveaglick almost 3 years ago
RetryModules
module that provides simple retry behavior for it's child modules (it essentially wraps module execution with Polly).PathCollection.RemoveDefault()
method that only removes the default paths, and used it to clear only default paths when alternate input paths are specified on the command line.Published by daveaglick almost 3 years ago
IFileSystem
must now be injected and passed to BaseCommand
when creating custom commands that derive from it.IEngine.FileSystem
is now a IReadOnlyFileSystem
instead of IFileSystem
(I.e. the file system can no longer be edited one the engine has been created).Bootstrapper.ConfigureEngine()
and must be done through Bootstrapper.ConfigureFileSystem()
or one of the other more specific file system bootstrapper extensions like Bootstrapper.SetRootPath()
.Statiq.Razor
Razor compilers to use collectible assemblies in a custom load context for better memory usage and caching behavior. This isn't a breaking change but was somewhat risky so keep an eye out for any problems related to Razor compilation and please open issues if you notice any regressions.Markdig
in Statiq.Markdown
to 0.26.0.@
symbol was being escaped in Markdown documents (using \@
should now work reliably, see https://github.com/statiqdev/Discussions/discussions/109).Engine
now accepts a IReadOnlyFileSystem
as a constructor argument (a new file system will be created if one is not provided).Buildalyzer
in Statiq.CodeAnalysis
to 3.2.6.Microsoft.CodeAnalysis.CSharp
in Statiq.Core
to 3.11.0.Statiq.Razor
.ReadFiles
module deterministic which will help certain caching scenarios where cache codes are generated by combining output files including order.CacheDocuments.WithoutSourceMapping()
extension to toggle a new mode for the CacheDocuments
module where all inputs are mapped to all outputs and the entire cache is invalidated when one input changes.@model
directive that could be overridden by a @inherits
directive in an import.