コード例 #1
0
 public AdminController(IContentManager contentManager,
     IOrchardServices services,
     IShapeFactory shapeFactory,
     IContentDefinitionManager contentDefinitionManager,
     IRemoteContentFetchService remoteContentFetchService,
     ISynchronisationMapFactory synchronisationMapFactory,
     IRepository<ContentSyncSettings> contentSyncSettingsRepository,
     ISignals signals,
     ILoggerFactory loggerFactory,
     ICacheManager cacheManager,
     IImportExportService importExportService,
     IRecipeParser recipeParser,
     IRemoteImportService remoteImportService,
     IEnumerable<IHardComparer> hardComparers, 
     IEnumerable<ISoftComparer> softComparers) {
     _contentManager = contentManager;
     _services = services;
     _shapeFactory = shapeFactory;
     _contentDefinitionManager = contentDefinitionManager;
     _remoteContentFetchService = remoteContentFetchService;
     _synchronisationMapFactory = synchronisationMapFactory;
     _contentSyncSettingsRepository = contentSyncSettingsRepository;
     _signals = signals;
     _loggerFactory = loggerFactory;
     _cacheManager = cacheManager;
     _importExportService = importExportService;
     _recipeParser = recipeParser;
     _remoteImportService = remoteImportService;
     _hardComparers = hardComparers;
     _softComparers = softComparers;
     Logger = loggerFactory.CreateLogger(typeof (AdminController));
     }
コード例 #2
0
        public ExecuteRecipeAction(
            IOrchardServices orchardServices,
            ISetupService setupService,
            ShellSettings shellSettings,
            IEnumerable<IRecipeExecutionStep> recipeExecutionSteps,
            IRecipeParser recipeParser,
            IRecipeExecutor recipeExecutor,
            IDatabaseManager databaseManager,
            ISweepGenerator sweepGenerator,
            IRecipeStepQueue recipeStepQueue,
            IRepository<RecipeStepResultRecord> recipeStepResultRepository)
        {
            _orchardServices = orchardServices;
            _setupService = setupService;
            _shellSettings = shellSettings;
            _recipeExecutionSteps = recipeExecutionSteps;
            _recipeParser = recipeParser;
            _recipeExecutor = recipeExecutor;
            _databaseManager = databaseManager;
            _sweepGenerator = sweepGenerator;
            _recipeStepQueue = recipeStepQueue;
            _recipeStepResultRepository = recipeStepResultRepository;

            RecipeExecutionTimeout = 600;
        }
コード例 #3
0
ファイル: RecipeExecutor.cs プロジェクト: adwardliu/Orchard2
 public RecipeExecutor(
     IRecipeParser recipeParser,
     IRecipeManager recipeManager,
     IShellDescriptorManager shellDescriptorManager)
 {
     _recipeManager = recipeManager;
     _shellDescriptorManager = shellDescriptorManager;
 }
コード例 #4
0
        public RecipePartHandler(IRecipeParser recipeParser)
        {
            _recipeParser = recipeParser;

            OnLoading<RecipePart>((context, part) => LazyLoadHandlers(part));
            OnVersioning<RecipePart>((context, part, newVersionPart) => LazyLoadHandlers(newVersionPart));

        }
コード例 #5
0
ファイル: RecipeExecutor.cs プロジェクト: zhengwei/Orchard2
 public RecipeExecutor(
     IRecipeParser recipeParser,
     IRecipeManager recipeManager,
     IShellDescriptorManager shellDescriptorManager)
 {
     _recipeManager          = recipeManager;
     _shellDescriptorManager = shellDescriptorManager;
 }
コード例 #6
0
        public override void Init()
        {
            base.Init();

            _recipeManager   = _container.Resolve <IRecipeManager>();
            _recipeParser    = _container.Resolve <IRecipeParser>();
            _recipeHarvester = _container.Resolve <IRecipeHarvester>();
        }
コード例 #7
0
ファイル: RecipeHarvester.cs プロジェクト: Higea/Orchard
        public RecipeHarvester(
            IExtensionManager extensionManager,
            IWebSiteFolder webSiteFolder,
            IRecipeParser recipeParser) {
            _extensionManager = extensionManager;
            _webSiteFolder = webSiteFolder;
            _recipeParser = recipeParser;

            Logger = NullLogger.Instance;
            T = NullLocalizer.Instance;
        }
コード例 #8
0
 public RemoteContentFetchService(
     IRecipeParser recipeParser,
     IOrchardServices orchardServices,
     Lazy<IEnumerable<IContentHandler>> handlers,
     ILoggerFactory loggerFactory)
 {
     _recipeParser = recipeParser;
     _orchardServices = orchardServices;
     _handlers = handlers;
     Logger = loggerFactory.CreateLogger(typeof (RemoteContentFetchService));
 }
コード例 #9
0
        public RecipeHarvester(
            IExtensionManager extensionManager,
            IWebSiteFolder webSiteFolder,
            IRecipeParser recipeParser)
        {
            _extensionManager = extensionManager;
            _webSiteFolder    = webSiteFolder;
            _recipeParser     = recipeParser;

            Logger = NullLogger.Instance;
            T      = NullLocalizer.Instance;
        }
コード例 #10
0
 public AdminController(
     IOrchardServices services,
     IImportExportService importExportService,
     IRecipeResultAccessor recipeResultAccessor,
     IEnumerable <IExportAction> exportActions,
     IEnumerable <IImportAction> importActions,
     IRecipeParser recipeParser)
 {
     _importExportService  = importExportService;
     _recipeResultAccessor = recipeResultAccessor;
     _exportActions        = exportActions;
     _importActions        = importActions;
     _recipeParser         = recipeParser;
     Services = services;
     T        = NullLocalizer.Instance;
 }
コード例 #11
0
 public ImportExportService(
     IOrchardServices orchardServices,
     IContentDefinitionManager contentDefinitionManager,
     IContentDefinitionWriter contentDefinitionWriter,
     IAppDataFolder appDataFolder,
     IRecipeParser recipeParser, 
     IRecipeManager recipeManager, 
     IShellDescriptorManager shellDescriptorManager) {
     _orchardServices = orchardServices;
     _contentDefinitionManager = contentDefinitionManager;
     _contentDefinitionWriter = contentDefinitionWriter;
     _appDataFolder = appDataFolder;
     _recipeParser = recipeParser;
     _recipeManager = recipeManager;
     _shellDescriptorManager = shellDescriptorManager;
     Logger = NullLogger.Instance;
     T = NullLocalizer.Instance;
 }
コード例 #12
0
 public ImportExportService(
     IOrchardServices orchardServices,
     IContentDefinitionManager contentDefinitionManager,
     IContentDefinitionWriter contentDefinitionWriter,
     IAppDataFolder appDataFolder,
     IRecipeParser recipeParser,
     IRecipeManager recipeManager,
     IShellDescriptorManager shellDescriptorManager)
 {
     _orchardServices          = orchardServices;
     _contentDefinitionManager = contentDefinitionManager;
     _contentDefinitionWriter  = contentDefinitionWriter;
     _appDataFolder            = appDataFolder;
     _recipeParser             = recipeParser;
     _recipeManager            = recipeManager;
     _shellDescriptorManager   = shellDescriptorManager;
     Logger = NullLogger.Instance;
     T      = NullLocalizer.Instance;
 }
コード例 #13
0
 public LenientImportExportService(IOrchardServices orchardServices,
                                   IContentDefinitionManager contentDefinitionManager,
                                   IContentDefinitionWriter contentDefinitionWriter,
                                   IAppDataFolder appDataFolder,
                                   IRecipeParser recipeParser,
                                   IRecipeManager recipeManager,
                                   IShellDescriptorManager shellDescriptorManager,
                                   IClock clock,
                                   IEnumerable <IExportEventHandler> exportEventHandlers,
                                   IEnumerable <IExportAction> exportActions,
                                   IEnumerable <IImportAction> importActions)
     : base(orchardServices, appDataFolder, clock, exportActions, importActions)
 {
     _orchardServices          = orchardServices;
     _contentDefinitionManager = contentDefinitionManager;
     _contentDefinitionWriter  = contentDefinitionWriter;
     _appDataFolder            = appDataFolder;
     _clock = clock;
     _exportEventHandlers = exportEventHandlers;
 }
コード例 #14
0
ファイル: RecipeExecutor.cs プロジェクト: vairam-svs/Orchard2
 public RecipeExecutor(
     IEventBus eventBus,
     ISession session,
     IRecipeParser recipeParser,
     IOrchardFileSystem fileSystem,
     IApplicationLifetime applicationLifetime,
     ShellSettings shellSettings,
     IOrchardHost orchardHost,
     ILogger<RecipeExecutor> logger,
     IStringLocalizer<RecipeExecutor> localizer)
 {
     _orchardHost = orchardHost;
     _shellSettings = shellSettings;
     _applicationLifetime = applicationLifetime;
     _eventBus = eventBus;
     _session = session;
     _recipeParser = recipeParser;
     _fileSystem = fileSystem;
     _logger = logger;
     T = localizer;
 }
コード例 #15
0
ファイル: RecipeExecutor.cs プロジェクト: ssjzhong/Orchard2
 public RecipeExecutor(
     IEventBus eventBus,
     ISession session,
     IRecipeParser recipeParser,
     IOrchardFileSystem fileSystem,
     IApplicationLifetime applicationLifetime,
     ShellSettings shellSettings,
     IOrchardHost orchardHost,
     ILogger <RecipeExecutor> logger,
     IStringLocalizer <RecipeExecutor> localizer)
 {
     _orchardHost         = orchardHost;
     _shellSettings       = shellSettings;
     _applicationLifetime = applicationLifetime;
     _eventBus            = eventBus;
     _session             = session;
     _recipeParser        = recipeParser;
     _fileSystem          = fileSystem;
     _logger = logger;
     T       = localizer;
 }
コード例 #16
0
 public ImportExportService(
     IOrchardServices orchardServices,
     IContentDefinitionManager contentDefinitionManager,
     IContentDefinitionWriter contentDefinitionWriter,
     IAppDataFolder appDataFolder,
     IRecipeParser recipeParser, 
     IRecipeManager recipeManager,
     IShellDescriptorManager shellDescriptorManager,
     IClock clock,
     IEnumerable<IExportEventHandler> exportEventHandlers) {
     _orchardServices = orchardServices;
     _contentDefinitionManager = contentDefinitionManager;
     _contentDefinitionWriter = contentDefinitionWriter;
     _appDataFolder = appDataFolder;
     _recipeParser = recipeParser;
     _recipeManager = recipeManager;
     _shellDescriptorManager = shellDescriptorManager;
     _clock = clock;
     _exportEventHandlers = exportEventHandlers;
     Logger = NullLogger.Instance;
     T = NullLocalizer.Instance;
 }
コード例 #17
0
 public ImportExportService(
     IOrchardServices orchardServices,
     IContentDefinitionManager contentDefinitionManager,
     IContentDefinitionWriter contentDefinitionWriter,
     IAppDataFolder appDataFolder,
     IRecipeParser recipeParser,
     IRecipeManager recipeManager,
     IShellDescriptorManager shellDescriptorManager,
     IClock clock,
     IEnumerable <IExportEventHandler> exportEventHandlers)
 {
     _orchardServices          = orchardServices;
     _contentDefinitionManager = contentDefinitionManager;
     _contentDefinitionWriter  = contentDefinitionWriter;
     _appDataFolder            = appDataFolder;
     _recipeParser             = recipeParser;
     _recipeManager            = recipeManager;
     _shellDescriptorManager   = shellDescriptorManager;
     _clock = clock;
     _exportEventHandlers = exportEventHandlers;
     Logger = NullLogger.Instance;
     T      = NullLocalizer.Instance;
 }
コード例 #18
0
 public ExecuteRecipeAction(
     IOrchardServices orchardServices,
     ISetupService setupService,
     ShellSettings shellSettings,
     IEnumerable <IRecipeExecutionStep> recipeExecutionSteps,
     IRecipeParser recipeParser,
     IRecipeExecutor recipeExecutor,
     IDatabaseManager databaseManager,
     ISweepGenerator sweepGenerator,
     IRecipeStepQueue recipeStepQueue,
     IRepository <RecipeStepResultRecord> recipeStepResultRepository)
 {
     _orchardServices            = orchardServices;
     _setupService               = setupService;
     _shellSettings              = shellSettings;
     _recipeExecutionSteps       = recipeExecutionSteps;
     _recipeParser               = recipeParser;
     _recipeExecutor             = recipeExecutor;
     _databaseManager            = databaseManager;
     _sweepGenerator             = sweepGenerator;
     _recipeStepQueue            = recipeStepQueue;
     _recipeStepResultRepository = recipeStepResultRepository;
 }
コード例 #19
0
 public RecipesController(
     ICookingProcedureProvider cookingProcedureProvider,
     IIngredientProvider ingredientProvider,
     IIngredientMapper ingredientMapper,
     IRecipeProvider recipeProvider,
     IRecipeMapper recipeMapper,
     IPdfGenerator pdfGenerator,
     IScraper scraper,
     IRecipeParser RecipeParser,
     ISiteSettingsProvider siteSettingsProvider,
     IFileHandler fileHandler
     )
 {
     this.cookingProcedureProvider = cookingProcedureProvider;
     this.ingredientProvider       = ingredientProvider;
     this.ingredientMapper         = ingredientMapper;
     this.recipeProvider           = recipeProvider;
     this.recipeMapper             = recipeMapper;
     this.pdfGenerator             = pdfGenerator;
     this.scraper              = scraper;
     this.RecipeParser         = RecipeParser;
     this.siteSettingsProvider = siteSettingsProvider;
     this.fileHandler          = fileHandler;
 }
コード例 #20
0
        public static Recipe ParseRecipe(this IRecipeParser recipeParser, string recipeText)
        {
            var recipeDocument = XDocument.Parse(recipeText, LoadOptions.PreserveWhitespace);

            return(recipeParser.ParseRecipe(recipeDocument));
        }
コード例 #21
0
        public void Init() {
            _tempFolderName = Path.GetTempFileName();
            File.Delete(_tempFolderName);
            var assembly = GetType().Assembly;
            foreach (var name in assembly.GetManifestResourceNames()) {
                if (name.StartsWith(DataPrefix)) {
                    string text;
                    using (var stream = assembly.GetManifestResourceStream(name)) {
                        using (var reader = new StreamReader(stream))
                            text = reader.ReadToEnd();

                    }

                    // Pro filtering
                    var relativePath = name
                        .Substring(DataPrefix.Length)
                        .Replace(".txt", ":txt")
                        .Replace(".recipe.xml", ":recipe:xml")
                        .Replace('.', Path.DirectorySeparatorChar)
                        .Replace(":txt", ".txt")
                        .Replace(":recipe:xml", ".recipe.xml");

                    var targetPath = Path.Combine(_tempFolderName, relativePath);

                    Directory.CreateDirectory(Path.GetDirectoryName(targetPath));
                    using (var stream = new FileStream(targetPath, FileMode.Create)) {
                        using (var writer = new StreamWriter(stream)) {
                            writer.Write(text);
                        }
                    }
                }
            }

            var builder = new ContainerBuilder();
            var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder(), new Mock<ICriticalErrorProvider>().Object);
            _folders = new ModuleFolders(new[] { _tempFolderName }, harvester);
            builder.RegisterType<RecipeManager>().As<IRecipeManager>();
            builder.RegisterType<RecipeHarvester>().As<IRecipeHarvester>();
            builder.RegisterType<RecipeStepExecutor>().As<IRecipeStepExecutor>();
            builder.RegisterType<StubStepQueue>().As<IRecipeStepQueue>().InstancePerLifetimeScope();
            builder.RegisterType<StubRecipeJournal>().As<IRecipeJournal>();
            builder.RegisterType<StubRecipeScheduler>().As<IRecipeScheduler>();
            builder.RegisterType<ExtensionManager>().As<IExtensionManager>();
            builder.RegisterType<StubAppDataFolder>().As<IAppDataFolder>();
            builder.RegisterType<StubClock>().As<IClock>();
            builder.RegisterType<StubCacheManager>().As<ICacheManager>();
            builder.RegisterType<StubParallelCacheContext>().As<IParallelCacheContext>();
            builder.RegisterType<StubAsyncTokenProvider>().As<IAsyncTokenProvider>();
            builder.RegisterInstance(_folders).As<IExtensionFolders>();
            builder.RegisterInstance(new Mock<IRecipeExecuteEventHandler>().Object);
            builder.RegisterType<Environment.Extensions.ExtensionManagerTests.StubLoaders>().As<IExtensionLoader>();
            builder.RegisterType<RecipeParser>().As<IRecipeParser>();
            builder.RegisterType<StubWebSiteFolder>().As<IWebSiteFolder>();
            builder.RegisterType<CustomRecipeHandler>().As<IRecipeHandler>();

            _container = builder.Build();
            _recipeManager = _container.Resolve<IRecipeManager>();
            _recipeParser = _container.Resolve<IRecipeParser>();
            _recipeHarvester = _container.Resolve<IRecipeHarvester>();
        }
コード例 #22
0
 public RecipeManager(
     IContentManager contentManager,
     IRecipeParser recipeParser)
 {
     _contentManager = contentManager;
 }
コード例 #23
0
        public void Init()
        {
            _tempFolderName = Path.GetTempFileName();
            File.Delete(_tempFolderName);
            var assembly = GetType().Assembly;

            foreach (var name in assembly.GetManifestResourceNames())
            {
                if (name.StartsWith(DataPrefix))
                {
                    string text;
                    using (var stream = assembly.GetManifestResourceStream(name)) {
                        using (var reader = new StreamReader(stream))
                            text = reader.ReadToEnd();
                    }

                    // Pro filtering
                    var relativePath = name
                                       .Substring(DataPrefix.Length)
                                       .Replace(".txt", ":txt")
                                       .Replace(".recipe.xml", ":recipe:xml")
                                       .Replace('.', Path.DirectorySeparatorChar)
                                       .Replace(":txt", ".txt")
                                       .Replace(":recipe:xml", ".recipe.xml");

                    var targetPath = Path.Combine(_tempFolderName, relativePath);

                    Directory.CreateDirectory(Path.GetDirectoryName(targetPath));
                    using (var stream = new FileStream(targetPath, FileMode.Create)) {
                        using (var writer = new StreamWriter(stream)) {
                            writer.Write(text);
                        }
                    }
                }
            }

            var builder   = new ContainerBuilder();
            var harvester = new ExtensionHarvester(new StubCacheManager(), new StubWebSiteFolder(), new Mock <ICriticalErrorProvider>().Object);

            _folders = new ModuleFolders(new[] { _tempFolderName }, harvester);
            builder.RegisterType <RecipeManager>().As <IRecipeManager>();
            builder.RegisterType <RecipeHarvester>().As <IRecipeHarvester>();
            builder.RegisterType <RecipeStepExecutor>().As <IRecipeStepExecutor>();
            builder.RegisterType <StubStepQueue>().As <IRecipeStepQueue>().InstancePerLifetimeScope();
            builder.RegisterType <StubRecipeJournal>().As <IRecipeJournal>();
            builder.RegisterType <StubRecipeScheduler>().As <IRecipeScheduler>();
            builder.RegisterType <ExtensionManager>().As <IExtensionManager>();
            builder.RegisterType <StubAppDataFolder>().As <IAppDataFolder>();
            builder.RegisterType <StubClock>().As <IClock>();
            builder.RegisterType <StubCacheManager>().As <ICacheManager>();
            builder.RegisterType <StubParallelCacheContext>().As <IParallelCacheContext>();
            builder.RegisterType <StubAsyncTokenProvider>().As <IAsyncTokenProvider>();
            builder.RegisterInstance(_folders).As <IExtensionFolders>();
            builder.RegisterType <Environment.Extensions.ExtensionManagerTests.StubLoaders>().As <IExtensionLoader>();
            builder.RegisterType <RecipeParser>().As <IRecipeParser>();
            builder.RegisterType <StubWebSiteFolder>().As <IWebSiteFolder>();
            builder.RegisterType <CustomRecipeHandler>().As <IRecipeHandler>();

            _container       = builder.Build();
            _recipeManager   = _container.Resolve <IRecipeManager>();
            _recipeParser    = _container.Resolve <IRecipeParser>();
            _recipeHarvester = _container.Resolve <IRecipeHarvester>();
        }
コード例 #24
0
ファイル: RecipeManagerTests.cs プロジェクト: Higea/Orchard
        public override void Init() {
            base.Init();

            _recipeManager = _container.Resolve<IRecipeManager>();
            _recipeParser = _container.Resolve<IRecipeParser>();
            _recipeHarvester = _container.Resolve<IRecipeHarvester>();
        }
コード例 #25
0
        public static void ParseRecipesImpl(
            string ingredientsLogFileName, string downloaderPath, IIngredientClassifier classifier, IIngredientTypes types,
            List <ClassifiedRecipe> recipes)
        {
            Dictionary <string, int> whyNotParsed = new Dictionary <string, int>();

            var sources = new List <KeyValuePair <IRecipeDownloader, IRecipeParser> >();

            // adding skinnytaste
            sources.Add(
                new KeyValuePair <IRecipeDownloader, IRecipeParser>(
                    new SkinnyTasteRecipeDownloader("/", downloaderPath),
                    new SkinnyTasteRecipeParser()
                    ));

            // adding paleoleap
            sources.Add(
                new KeyValuePair <IRecipeDownloader, IRecipeParser>(
                    new PaleoLeapRecipeDownloader("/", downloaderPath),
                    new PaleoLeapRecipeParser()
                    ));

            int recipesTotal = 0, recipesParsed = 0;
            HashSet <string> ingredientTypesUsed = new HashSet <string>();
            HashSet <string> ingredientGroupsUsed = new HashSet <string>();

            using (StreamWriter interpretedIngredients = new StreamWriter(ingredientsLogFileName))
            {
                interpretedIngredients.WriteLine("url\tdeclaration\tdetail\tquantity\tname\tclass\ttype");
                foreach (var source in sources)
                {
                    IRecipeDownloader d = source.Key;
                    IRecipeParser     p = source.Value;
                    foreach (RawWebPage rawWebPage in d.DownloadedAlready)
                    {
                        ++recipesTotal;
                        rawWebPage.Name = RecipeDownloader.RemoveSpecialCharacters(rawWebPage.Name);
                        RecipeParsingResult parsed = p.TryParseRawWebPage(rawWebPage);
                        if (!parsed.Succeeded)
                        {
                            Console.Error.WriteLine("WARNING: failed to parse {0}:{1}:{2} ({3})",
                                                    rawWebPage.Source, rawWebPage.Url, rawWebPage.FileName, parsed.ErrorMessage);
                            if (!whyNotParsed.ContainsKey(parsed.ErrorMessage))
                            {
                                whyNotParsed[parsed.ErrorMessage] = 0;
                            }
                            ++whyNotParsed[parsed.ErrorMessage];
                            continue;
                        }
                        ++recipesParsed;
                        Recipe           recipe          = parsed.Result;
                        ClassifiedRecipe makingSenseOfIt = classifier.ClassifyIngredients(recipe);
                        if (makingSenseOfIt.Succeeded)
                        {
                            recipes.Add(makingSenseOfIt);
                        }
                        foreach (var ingredient in recipe.Ingredients)
                        {
                            // understand what kind of ingredient this is
                            string         ingredientClass = null;
                            IngredientType ingredientType  = null;
                            if (null != ingredient.Name && !makingSenseOfIt.Classification.Classified.TryGetValue(ingredient.Name, out ingredientClass))
                            {
                                ingredientClass = null;
                            }
                            if (null != ingredientClass && !types.ClassToType.TryGetValue(ingredientClass, out ingredientType))
                            {
                                ingredientType = null;
                            }
                            if (null == ingredientClass)
                            {
                                ingredientClass = "[unknown]";
                            }
                            if (null == ingredientType)
                            {
                                ingredientType = new IngredientType();
                            }
                            interpretedIngredients.WriteLine("{0}\t{1}\t{2}\t=\"{3}\"\t{4}\t{5}\t{6}",
                                                             d.UrlRoot + recipe.OriginalWebPage.Url,
                                                             ingredient.Declaration,
                                                             ingredient.Detail,
                                                             ingredient.Quantity,
                                                             ingredient.Name.Name,
                                                             ingredientClass,
                                                             ingredientType);
                            ingredientTypesUsed.Add(ingredientType.Type);
                            ingredientGroupsUsed.Add(ingredientType.Group);
                        }
                    }
                }
            }
            Console.WriteLine("Recipes: {0} total, {1} parsed, {2} distinct ingredient types, {3} distinct ingredient groups used",
                              recipesTotal, recipesParsed, ingredientTypesUsed.Count, ingredientGroupsUsed.Count);
            List <KeyValuePair <string, int> > whyNot = new List <KeyValuePair <string, int> >(whyNotParsed);

            whyNot.Sort((KeyValuePair <string, int> x, KeyValuePair <string, int> y) => { return(-x.Value.CompareTo(y.Value)); });
            foreach (var whyNotElement in whyNot)
            {
                Console.WriteLine("Failed to parse {0} recipe pages because {1}.", whyNotElement.Value, whyNotElement.Key);
            }
        }