/// <summary>
        /// Initializes a new instance of the <see cref="TemplateEngineLanguageGenerator"/> class.
        /// </summary>
        /// <param name="lgText">lg template text.</param>
        /// <param name="id">optional label for the source of the templates (used for labeling source of template errors).</param>
        /// <param name="resourceMapping">template resource loader delegate (locale) -> <see cref="ImportResolverDelegate"/>.</param>
        public TemplateEngineLanguageGenerator(string lgText, string id, Dictionary <string, IList <IResource> > resourceMapping)
        {
            this.Id        = id ?? DEFAULTLABEL;
            var(_, locale) = LGResourceLoader.ParseLGFileName(id);
            var importResolver = LanguageGeneratorManager.ResourceExplorerResolver(locale, resourceMapping);

            this.lg = LanguageGeneration.Templates.ParseText(lgText ?? string.Empty, Id, importResolver);
        }
        public TemplateEngineLanguageGenerator(string lgText, string id, Dictionary <string, IList <Resource> > resourceMapping)
        {
            Id             = id ?? DEFAULTLABEL;
            var(_, locale) = LGResourceLoader.ParseLGFileName(id);
            var importResolver = LanguageGeneratorManager.ResourceExplorerResolver(locale, resourceMapping);
            var lgResource     = new LGResource(Id, Id, lgText ?? string.Empty);

            _lg = new Lazy <Task <LanguageGeneration.Templates> >(() => Task.FromResult(LanguageGeneration.Templates.ParseResource(lgResource, importResolver)));
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="TemplateEngineLanguageGenerator"/> class.
        /// </summary>
        /// <param name="filePath">lg template file absolute path.</param>
        /// <param name="resourceMapping">template resource loader delegate (locale) -> <see cref="ImportResolverDelegate"/>.</param>
        public TemplateEngineLanguageGenerator(string filePath, Dictionary <string, IList <IResource> > resourceMapping)
        {
            filePath = PathUtils.NormalizePath(filePath);
            this.Id  = Path.GetFileName(filePath);

            var(_, locale) = LGResourceLoader.ParseLGFileName(Id);
            var importResolver = LanguageGeneratorManager.ResourceExplorerResolver(locale, resourceMapping);

            this.lg = LanguageGeneration.Templates.ParseFile(filePath, importResolver);
        }
Beispiel #4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="LanguageGeneratorManager"/> class.
        /// </summary>
        /// <param name="resourceExplorer">resourceExplorer to manage LG files from.</param>
        public LanguageGeneratorManager(ResourceExplorer resourceExplorer)
        {
            _resourceExplorer       = resourceExplorer ?? throw new ArgumentNullException(nameof(resourceExplorer));
            _multilanguageResources = LGResourceLoader.GroupByLocale(resourceExplorer);

            PopulateLanguageGenerators();

            // listen for resource changes
            _resourceExplorer.Changed += ResourceExplorer_Changed;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="TemplateEngineLanguageGenerator"/> class.
        /// </summary>
        /// <param name="resource">Resource.</param>
        /// <param name="resourceMapping">template resource loader delegate (locale) -> <see cref="ImportResolverDelegate"/>.</param>
        public TemplateEngineLanguageGenerator(Resource resource, Dictionary <string, IList <Resource> > resourceMapping)
        {
            this.Id = resource.Id;

            var(_, locale) = LGResourceLoader.ParseLGFileName(Id);
            var importResolver = LanguageGeneratorManager.ResourceExplorerResolver(locale, resourceMapping);
            var content        = resource.ReadTextAsync().GetAwaiter().GetResult();
            var lgResource     = new LGResource(Id, resource.FullName, content);

            this.lg = LanguageGeneration.Templates.ParseResource(lgResource, importResolver);
        }
        public TemplateEngineLanguageGenerator(string filePath, Dictionary <string, IList <Resource> > resourceMapping)
        {
            filePath = PathUtils.NormalizePath(filePath);
            Id       = Path.GetFileName(filePath);

            var(_, locale) = LGResourceLoader.ParseLGFileName(Id);
            var importResolver = LanguageGeneratorManager.ResourceExplorerResolver(locale, resourceMapping);
            var resource       = new LGResource(Id, filePath, File.ReadAllText(filePath));

            _lg = new Lazy <Task <LanguageGeneration.Templates> >(() => Task.FromResult(LanguageGeneration.Templates.ParseResource(resource, importResolver)));
        }
        /// <summary>
        /// Loads language generation templates asynchronously.
        /// </summary>
        /// <param name="resource">Resource.</param>
        /// <param name="resourceMapping">template resource loader delegate (locale) -> <see cref="ImportResolverDelegate"/>.</param>
        /// <returns>The loaded language generation templates.</returns>
        private async Task <LanguageGeneration.Templates> CreateTemplatesAsync(Resource resource, Dictionary <string, IList <Resource> > resourceMapping)
        {
            var(_, locale) = LGResourceLoader.ParseLGFileName(Id);
            var importResolver = LanguageGeneratorManager.ResourceExplorerResolver(locale, resourceMapping);
            var content        = await resource.ReadTextAsync().ConfigureAwait(false);

            var lgResource = new LGResource(Id, resource.FullName, content);
            var lg         = LanguageGeneration.Templates.ParseResource(lgResource, importResolver);

            RegisterSourcemap(lg, resource);
            return(lg);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="LanguageGeneratorManager"/> class.
        /// </summary>
        /// <param name="resourceExplorer">resourceExplorer to manage LG files from.</param>
        public LanguageGeneratorManager(ResourceExplorer resourceExplorer)
        {
            this.resourceExplorer = resourceExplorer;
            multilanguageResources = LGResourceLoader.GroupByLocale(resourceExplorer);

            // load all LG resources
            foreach (var resource in this.resourceExplorer.GetResources("lg"))
            {   
                LanguageGenerators[resource.Id] = GetTemplateEngineLanguageGenerator(resource);
            }

            // listen for resource changes
            this.resourceExplorer.Changed += ResourceExplorer_Changed;
        }
Beispiel #9
0
        /// <summary>
        /// Returns the resolver to resolve LG import id to template text based on language and a template resource loader delegate.
        /// </summary>
        /// <param name="locale">Locale to identify language.</param>
        /// <param name="resourceMapping">Template resource loader delegate.</param>
        /// <returns>The delegate to resolve the resource.</returns>
        public static ImportResolverDelegate ResourceExplorerResolver(string locale, Dictionary <string, IList <Resource> > resourceMapping)
        {
            return((LGResource lgResource, string id) =>
            {
                var fallbackLocale = LGResourceLoader.FallbackLocale(locale, resourceMapping.Keys.ToList());
                var resources = resourceMapping[fallbackLocale];

                var resourceName = Path.GetFileName(PathUtils.NormalizePath(id));

                var resource = resources.FirstOrDefault(u => LGResourceLoader.ParseLGFileName(u.Id).prefix.ToLowerInvariant() == LGResourceLoader.ParseLGFileName(resourceName).prefix.ToLowerInvariant());
                if (resource == null)
                {
                    throw new InvalidOperationException($"There is no matching LG resource for {resourceName}");
                }

                var content = resource.ReadTextAsync().GetAwaiter().GetResult();
                return new LGResource(resource.Id, resource.FullName, content);
            });
        }