public FragmentComposer(FragmentProvider fragmentProvider, PageProvider pageProvider)
        {
            Guard.VerifyArgumentNotNull(fragmentProvider, nameof(fragmentProvider));
            Guard.VerifyArgumentNotNull(pageProvider, nameof(pageProvider));

            _fragmentProvider           = fragmentProvider;
            _pageProvider               = pageProvider;
            _fragmentComposingFunctions = new Dictionary <string, Func <LayoutType, HtmlDocument> >();

            compose();
        }
Beispiel #2
0
        public static int Main(string[] args)
        {
            IOptions options = new Options();

            if (!CommandLine.Parser.Default.ParseArguments(args, options))
            {
                ErrorWriterContext.Current.WriteLine(options.GetUsage());
                return(Constants.ERROR);
            }
            OptionsContext.Current = new ProgramOptionsContext(options);


            if (IOContext.Current.DirectoryExists(OptionsContext.Current.Options.OutputDirectory))
            {
                if (!OptionsContext.Current.Options.Force)
                {
                    ErrorWriterContext.Current.WriteLine(Invariant($"Output Directory '{OptionsContext.Current.Options.OutputDirectory}' already exists in the current folder."));
                    return(Constants.ERROR);
                }
                else
                {
                    System.IO.Directory.Delete(OptionsContext.Current.Options.OutputDirectory, true);
                }
            }

            // Metadata Providers
            IMetadataProvider fragmentMetadataProvider = new MetadataProvider(LayoutType.Fragment);
            IMetadataProvider pageMetadataProvider     = new MetadataProvider(LayoutType.Page);
            IMetadataProvider blogPostMetadataProvider = new MetadataProvider(LayoutType.Post);

            // Page Providers
            FragmentProvider fragmentProvider = new FragmentProvider(fragmentMetadataProvider);
            PageProvider     pageProvider     = new PageProvider(pageMetadataProvider);
            BlogPostProvider blogPostProvider = new BlogPostProvider(blogPostMetadataProvider);
            // IDEA: have option to pick between static page and first blog page?
            // TODO: make "Blog" an optional header page that takes the user to the latest blog post

            IFragmentComposer fragmentComposer = new FragmentComposer(fragmentProvider, pageProvider);
            IReadOnlyDictionary <string, Func <LayoutType, HtmlAgilityPack.HtmlDocument> > fragmentComposingFunctions = fragmentComposer.FragmentComposingFunctions;

            // Composers
            ITemplateComposer pageComposer     = new PageComposer(pageProvider, fragmentComposingFunctions);
            ITemplateComposer blogPostComposer = new BlogComposer(blogPostProvider, fragmentComposingFunctions);

            IList <IGenerator> generators = new List <IGenerator>()
            {
                new BasePageGenerator(pageComposer),
                new BasePageGenerator(blogPostComposer)
            };

            IGenerator siteGenerator = new SiteGenerator(generators);

            try
            {
                siteGenerator.Generate();
            }
            catch
            {
                // Other places that throw should write out an error message
                return(Constants.ERROR);
            }

            return(Constants.SUCCESS);
        }
        public virtual ICrmEntitySearchResult GetResult(Document document, float score, int number)
        {
            if (document == null)
            {
                throw new ArgumentNullException("document");
            }

            var logicalNameField = document.GetField(Index.LogicalNameFieldName);

            if (logicalNameField == null || !logicalNameField.IsStored)
            {
                return(null);
            }

            var logicalName = logicalNameField.StringValue;

            var primaryKeyLogicalNameField = document.GetField(Index.PrimaryKeyLogicalNameFieldName);

            if (primaryKeyLogicalNameField == null || !primaryKeyLogicalNameField.IsStored)
            {
                return(null);
            }

            var primaryKeyPropertyName = primaryKeyLogicalNameField.StringValue;

            var context = Index.DataContext;

            var primaryKeyField = document.GetField(Index.PrimaryKeyFieldName);

            if (primaryKeyField == null || !primaryKeyField.IsStored)
            {
                return(null);
            }

            var primaryKey = new Guid(primaryKeyField.StringValue);

            var titleField = document.GetField(Index.TitleFieldName);

            var title = string.Empty;

            if (logicalName != "annotation")
            {
                if (titleField == null || !titleField.IsStored)
                {
                    return(null);
                }
                title = titleField.StringValue;
            }

            var entity = context.CreateQuery(logicalName).FirstOrDefault(e => e.GetAttributeValue <Guid>(primaryKeyPropertyName) == primaryKey);

            if (entity == null)
            {
                return(null);
            }

            var url = GetUrl(context, document, score, number, entity);

            var result = new CrmEntitySearchResult(entity, score, number, title, url);

            if (!Validate(context, result))
            {
                return(null);
            }

            result.Fragment = FragmentProvider.GetFragment(document);

            return(result);
        }