private ObservableIndex <PathInfoLight, Ref <IHelperDescriptor <TOptions> >, IEqualityComparer <PathInfoLight> > CreateHelpersSubscription <TOptions>( IIndexed <string, IHelperDescriptor <TOptions> > source) where TOptions : struct, IHelperOptions { var equalityComparer = Compatibility.RelaxedHelperNaming ? PathInfoLight.PlainPathComparer : PathInfoLight.PlainPathWithPartsCountComparer; var existingHelpers = source.ToIndexed( o => (PathInfoLight)$"[{o.Key}]", o => new Ref <IHelperDescriptor <TOptions> >(o.Value), equalityComparer ); var target = new ObservableIndex <PathInfoLight, Ref <IHelperDescriptor <TOptions> >, IEqualityComparer <PathInfoLight> >(equalityComparer, existingHelpers); var helpersObserver = new ObserverBuilder <ObservableEvent <IHelperDescriptor <TOptions> > >() .OnEvent <DictionaryAddedObservableEvent <string, IHelperDescriptor <TOptions> > >( @event => { PathInfoLight key = $"[{@event.Key}]"; if (target.TryGetValue(key, out var @ref)) { @ref.Value = @event.Value; return; } target.AddOrReplace(key, new Ref <IHelperDescriptor <TOptions> >(@event.Value)); }) .Build(); source.As <ObservableIndex <string, IHelperDescriptor <TOptions>, StringEqualityComparer> >()?.Subscribe(helpersObserver); return(target); }
public HandlebarsConfigurationAdapter(HandlebarsConfiguration configuration) { UnderlingConfiguration = configuration; AliasProviders = new ObservableList <IMemberAliasProvider>(configuration.AliasProviders); HelperResolvers = new ObservableList <IHelperResolver>(configuration.HelperResolvers); RegisteredTemplates = new ObservableIndex <string, HandlebarsTemplate <TextWriter, object, object>, StringEqualityComparer>(new StringEqualityComparer(StringComparison.OrdinalIgnoreCase), configuration.RegisteredTemplates); AliasProviders = new ObservableList <IMemberAliasProvider>(configuration.AliasProviders); FormatterProviders = new ObservableList <IFormatterProvider> { new DefaultFormatterProvider(), new CollectionFormatterProvider(), new ReadOnlyCollectionFormatterProvider() }.AddMany(configuration.FormatterProviders); ObjectDescriptorProviders = CreateObjectDescriptorProvider(UnderlingConfiguration.ObjectDescriptorProviders); ExpressionMiddlewares = new ObservableList <IExpressionMiddleware>(configuration.CompileTimeConfiguration.ExpressionMiddleware) { new ClosureExpressionMiddleware(), new ExpressionOptimizerMiddleware() }; Features = UnderlingConfiguration.CompileTimeConfiguration.Features .Select(o => o.CreateFeature()) .OrderBy(o => o.GetType().GetTypeInfo().GetCustomAttribute <FeatureOrderAttribute>()?.Order ?? 100) .ToList(); Helpers = CreateHelpersSubscription(configuration.Helpers); BlockHelpers = CreateHelpersSubscription(configuration.BlockHelpers); }
public HandlebarsConfiguration() { var stringEqualityComparer = new StringEqualityComparer(StringComparison.OrdinalIgnoreCase); Helpers = new ObservableIndex <string, IHelperDescriptor <HelperOptions>, StringEqualityComparer>(stringEqualityComparer); BlockHelpers = new ObservableIndex <string, IHelperDescriptor <BlockHelperOptions>, StringEqualityComparer>(stringEqualityComparer); RegisteredTemplates = new ObservableIndex <string, HandlebarsTemplate <TextWriter, object, object>, StringEqualityComparer>(stringEqualityComparer); HelperResolvers = new ObservableList <IHelperResolver>(); TextEncoder = new HtmlEncoder(FormatProvider); UnresolvedBindingFormatter = new Formatter <UndefinedBindingResult>(undef => string.Empty); }