All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Assign<T>(T target)overload for populating existing object instances (classes, structs, records, and types without parameterless constructors)- Online documentation at pullpatchpush.com/tokenizer with interactive playground
- Configuration reference and Extensibility guide on docs site
- Library icon updated to Phosphor brackets-curly design
- README trimmed to landing-page format with links to documentation site
- README links converted to absolute URLs for NuGet rendering
- Token-centric diagnostic model with per-token outcome tracking (Matched, Rejected, NeverFound, Blocked), match attempt history, and assigned value locations
- Diagnostic hint generators: PreambleNearMiss, ValidatorValue, DateFormat, ChainedDecorator, MultipleRejection, OptionalToken, RepeatingToken, ValueMismatch, BlockedToken
- Stable diagnostic issue codes (TK001–TK008) for programmatic filtering
- AlignmentRenderer and ProcessingOrderRenderer for human-readable diagnostic output
- Causality analysis for ordered-mode diagnostics (blocked token detection)
MaxRegexTimeoutoption onTokenizerOptions(default: 1 second) to bound regex evaluation in user-supplied patternsCancellationTokenoverloads on synchronousTokenizemethods- SECURITY.md with guidance for processing untrusted input
- 61 diagnostic characterisation tests
- Diagnostic subsystem redesigned from flat event stream to token-centric model (
TokenDiagnostic,TokenAttempt,DiagnosticIssue) DiagnosticResultreplaced withTokenizationDiagnostics(lazy-built token view, raw event access kept)- Singular
AssignedValue/AssignedLocationonTokenDiagnosticreplaced with list-basedAssignedValues/AssignedLocationsfor repeating token support - Compilation and tokenization diagnostic collectors separated (
ICompilationDiagnosticCollector,ITokenizationDiagnosticCollector) MatchesRegexValidatorhardened: catchesRegexMatchTimeoutException, removedRegexOptions.Compiled, added bounded cache evictionRegexReplaceTransformerhardened: catches timeout, usesMaxRegexTimeout- Removed unbounded static
PathSegmentCache(replaced with instance-scoped caching) - PII logging: guarded exception messages at Debug level, downgraded diagnostic log output
- All CodeQL code scanning alerts resolved (catch-of-all-exceptions, useless-assignment, local-not-disposed, dispose-not-called-on-throw, useless-upcast, missed-readonly, nested-if, missed-ternary, null-argument-to-equals, path-combine, useless-gethashcode, misleading-indentation)
- Infinite regex timeouts on netstandard2.0 fallback paths
- AST-based template compilation pipeline (TemplateLexer, TemplateParser, AstTemplateDefinitionParser)
- Tokenization diagnostics system with hint generators (PreambleNearMiss, ValidatorValue, UnmatchedInput, RepeatingToken, DateFormat)
- DiagnosticSummaryBuilder and AlignmentRenderer for visual template-input diffs
- Safety limits: MaxInputLength, MaxTemplateLength, MaxTokenCount, MaxIterations
- BenchmarkDotNet benchmark suite (compilation, tokenization, matching, concurrency)
IOptions<TokenizerOptions>support for DI registrationIReadOnlyCollection<Template>on TemplateCollection- Microsoft.Extensions.Logging integration
- SourceLink and symbol package (.snupkg) support
- GitHub Actions CI (replacing AppVeyor)
- CodeQL security analysis
- .NET 10.0 target
- XML IntelliSense documentation in NuGet package
- NuGet package icon
AssignmentFailedException.PartialResultproperty for retrieving partially assigned objects on failureTemporalParserformat offset detection to preserve parsed timezone offsets
- Renamed
CanTransformtoTryTransformonITokenTransformer - Renamed
Matchclass toTokenMatch(now a record) - Renamed
CandidateTokenList.AnytoHasCandidates - Renamed
TokenEnumerator.Match()toTryMatch() - Renamed boolean properties on
Token:IsOptional,IsRepeating,IsRequired,ShouldConcatenate,ShouldConsiderOnce - Standardized
TerminateOnNewLinecasing - Unified decorator argument exceptions to
ArgumentException - Converted
TokenizerOptionsto record class - Converted
Hintto positional record - Made
TokenizeResult<T>.Valueinit-only - Made
Hintproperties init-only - Narrowed
ITokenizationEngineinterface (removed implementation details) - Made
Tokenand exception properties internally settable - Made public API collections
IReadOnlyList<T> - Sealed all non-extension-point classes
- Converted to file-scoped namespaces
- Replaced
Tokenizer.Create()static factories with public constructors - Target frameworks: netstandard2.0 + net8.0 + net10.0 (was netstandard2.0 + net6.0)
TemporalParsertrims whitespace from input values before parsingTemporalParserpreserves parsed timezone offset when format contains offset specifier (z, zz, zzz, K)
- Empty-preamble infinite loop in tokenization engine
ComputePreambleignoring template-levelTrimLeadingWhitespaceoverride- Getter-only collection properties throwing on
SetValue - Context-aware quote handling and repeating token ordering
- Unknown escape sequences in quoted strings treated as literals
- Frontmatter-only matches excluded from
Successwhen template has real tokens - Internal whitespace preserved in hint text during front matter parsing
- All nullable reference type warnings resolved
- XML doc copy-paste errors in validators and transformers
TokenizerOptions.Defaultsstatic property (usenew TokenizerOptions())TokenizerOptions.Clone()method (usewithexpressions)EnableLoggingflag,EnableLineByLineLogging, andLineTracker- Duplicate test files
- Stale
#if DOTNET35andNET6_0_OR_GREATERpreprocessor guards - AppVeyor CI configuration
- Development-only debug console app
- AI-generated specs and plans (development artifacts)
- Reduced excessive log levels
Split()transformer- Thread-safe
TemplateCollectionfor concurrent access - Documentation tests
- Made multiple template matching deterministic
IsPhoneNumbervalidator
- Not validators (
IsNotNull,IsNotEmpty, etc.) SubstringBeforeLastandSubstringAfterLasttransformers
- Multiple token consideration during
Tokenize()operation TerminateOnNewLinefront matter optionReplace()transformer
- Infinite loop in initial token with no preamble
- Token transformer return value indicating transformation success
- Multiline token support
- Long-form token modifiers
Settransformer for setting token values- Template tags for restricting matches
- Shorthand set token value assignment in front matter
- Enum and Boolean value assignment
IsNotEmptyvalidator- Token preamble trimming before last newline
- Repeating token matching
Token.CanAssign()method- Front matter token matching when no content tokens found
- Result object returned from
Tokenizeoperation - Required fields support
- Token validators
- Template hints for selecting best match
- Front matter template naming
- Escaped
{and}characters in templates - DateTime parsing up to newline
- Invalid type conversion handling
- Token assignment failures no longer throw
- UTC DateTime token transformer
- Various bug fixes
- Added logging support
- State machine-based token parser
- .NET Standard 2.0 and .NET Framework 4.5.2 support
- Transformers (value transformation pipeline)
- Newline handling in pattern parsing
- Complete rewrite of parsing engine from regex to state machine
- Changed repeating token flag to
*