Exemple #1
0
        public IActionResult Preview(String file)
        {
            //This can be optimized like index, but will only be hit
            //for one page if requested, so whatever

            targetFileInfo      = fileInfoProvider.GetFileInfo(file, HttpContext.Request.PathBase);
            templateEnvironment = new TemplateEnvironment(targetFileInfo.FileNoExtension, fileFinder, overrideVars: overrideValuesProvider.OverrideVars);
            PageStack pageStack = new PageStack(templateEnvironment, fileFinder);

            pageStack.ContentFile = targetFileInfo.HtmlFile;
            var pageSettings = fileFinder.GetProjectPageDefinition(targetFileInfo);

            switch (targetFileInfo.Extension)
            {
            case ".html":
                if (targetFileInfo.IsProjectFile)
                {
                    return(new FileStreamResult(fileFinder.ReadFile(targetFileInfo.HtmlFile), "text/html"));
                }
                return(Redirect(targetFileInfo.NoHtmlRedirect));

            case "":
                return(buildAsPage(pageStack, pageSettings.Layout));

            default:
                var cleanExtension = targetFileInfo.Extension.TrimStart('.') + ".html";
                if (fileFinder.DoesLayoutExist(cleanExtension))
                {
                    return(buildAsPage(pageStack, cleanExtension));
                }
                return(returnFile(file));
            }
        }
Exemple #2
0
        /// <summary>
        /// Get the diff of the file between its original and modified version.
        /// </summary>
        /// <param name="fileInfo">The file info for the file to get a diff for.</param>
        /// <returns>The file's diff info.</returns>
        public DiffInfo UncommittedDiff(ITargetFileInfo fileInfo)
        {
            if (!IsWritablePath(fileInfo.DerivedFileName))
            {
                throw new FileNotFoundException($"Cannot access file '{fileInfo.OriginalFileName}'");
            }

            var diff = new DiffInfo();

            //Original File
            var historyCommits = repo.Commits.QueryBy(fileInfo.DerivedFileName);
            var latestCommit   = historyCommits.FirstOrDefault();

            if (latestCommit != null)
            {
                var blob = latestCommit.Commit[fileInfo.DerivedFileName].Target as Blob;
                if (blob != null)
                {
                    diff.Original = blob.GetContentText();
                }
            }
            else
            {
                diff.Original = $"Could not read original file {fileInfo.DerivedFileName}.";
            }

            var repoPath = Path.Combine(repo.Info.WorkingDirectory, fileInfo.DerivedFileName);

            using (var stream = new StreamReader(fileFinder.ReadFile(fileFinder.GetProjectRelativePath(repoPath))))
            {
                diff.Changed = stream.ReadToEnd().Replace("\r", "");
            }

            return(diff);
        }
Exemple #3
0
        /// <summary>
        /// Revert a file to its unmodified version.
        /// </summary>
        /// <param name="fileInfo">The file info for the file to revert.</param>
        /// <returns></returns>
        public async Task Revert(ITargetFileInfo fileInfo)
        {
            if (!IsWritablePath(fileInfo.DerivedFileName))
            {
                throw new FileNotFoundException($"Cannot access file '{fileInfo.OriginalFileName}'");
            }

            //Original File
            var historyCommits = repo.Commits.QueryBy(fileInfo.DerivedFileName);
            var latestCommit   = historyCommits.FirstOrDefault();

            if (latestCommit != null)
            {
                var blob = latestCommit.Commit[fileInfo.DerivedFileName].Target as Blob;
                if (blob != null)
                {
                    //Changed file
                    var repoPath = Path.Combine(repo.Info.WorkingDirectory, fileInfo.DerivedFileName);
                    using (var dest = fileFinder.WriteFile(fileFinder.GetProjectRelativePath(repoPath)))
                    {
                        using (var source = blob.GetContentStream())
                        {
                            await source.CopyToAsync(dest);
                        }
                    }
                }
            }
        }
Exemple #4
0
        public IActionResult Index(String file)
        {
            try
            {
                targetFileInfo = fileInfoProvider.GetFileInfo(file, HttpContext.Request.PathBase);
                PageDefinition pageSettings;

                switch (targetFileInfo.Extension)
                {
                case ".html":
                    if (targetFileInfo.IsProjectFile)
                    {
                        return(new FileStreamResult(fileFinder.ReadFile(targetFileInfo.HtmlFile), "text/html"));
                    }
                    return(Redirect(targetFileInfo.NoHtmlRedirect));

                case "":
                    var pageStack = CreatePageStack();
                    pageSettings = fileFinder.GetProjectPageDefinition(targetFileInfo);
                    return(buildAsEditor(pageStack, pageSettings.Layout));

                default:
                    pageSettings = fileFinder.GetProjectPageDefinition(targetFileInfo);
                    var  altExt     = targetFileInfo.Extension.TrimStart('.') + ".html";
                    var  layout     = Path.ChangeExtension(pageSettings.Layout, altExt);
                    bool seenBefore = seenExtensions.Contains(layout);
                    if (seenBefore)
                    {
                        //Don't combine these if statements
                        if (altLayoutExtensions.Contains(layout))
                        {
                            return(BuildAsAltPage(layout));
                        }
                    }
                    else
                    {
                        seenExtensions.Add(layout);
                        if (fileFinder.DoesLayoutExist(layout))
                        {
                            altLayoutExtensions.Add(layout);
                            return(BuildAsAltPage(layout));
                        }
                    }
                    return(returnFile(file));
                }
            }
            catch (FileNotFoundException ex)
            {
                var sb = new StringBuilder($"Could not find file '{ex.FileName}' building page for '{file}'. Message:{ex.Message}");
                WriteSearchLocations(sb, ex as PageStackFileNotFoundException);
                logger.LogInformation(sb.ToString());
                throw;
            }
        }
Exemple #5
0
        public void buildPage(String relativeFile)
        {
            relativeFile = relativeFile.TrimStartingPathChars();

            var outFile = Path.Combine(this.outDir, relativeFile);

            if (OutputExtension != null)
            {
                outFile = Path.ChangeExtension(outFile, OutputExtension);
            }

            ITargetFileInfo     fileInfo    = fileInfoProvider.GetFileInfo(relativeFile, null);
            TemplateEnvironment environment = new TemplateEnvironment(fileInfo.FileNoExtension, fileFinder, overrideValuesProvider.OverrideVars, version, true);
            PageStack           pageStack   = new PageStack(environment, fileFinder);

            pageStack.ContentFile = fileInfo.HtmlFile;
            if (pageStack.Visible)
            {
                var pageSettings = fileFinder.GetProjectPageDefinition(fileInfo);
                var layout       = pageSettings.Layout;
                if (OutputExtension != null)
                {
                    layout = Path.ChangeExtension(layout, OutputExtension);
                }
                pageStack.pushLayout(layout);

                var pathBase = environment.PathBase;

                HtmlDocumentRenderer dr = new HtmlDocumentRenderer(environment);
                dr.addTransform(new HashTreeMenus(fileFinder));
                dr.addTransform(new ExpandRootedPaths(pathBase));
                if (!String.IsNullOrEmpty(pathBase))
                {
                    //Safe to fix relative urls last since it wont replace any that already start with the path base.
                    dr.addTransform(new FixRelativeUrls(pathBase));
                }
                var document = dr.getDocument(pageStack.Pages);
                var outDir   = Path.GetDirectoryName(outFile);
                if (!Directory.Exists(outDir))
                {
                    Directory.CreateDirectory(outDir);
                }
                using (var writer = new StreamWriter(File.Open(outFile, FileMode.Create, FileAccess.Write, FileShare.None)))
                {
                    writer.Write(document.DocumentNode.OuterHtml);
                }
                fileFinder.CopyLinkedFiles(this.outDir, pageStack);
            }
        }
Exemple #6
0
        public void SavePageDefinition(PageDefinition definition, ITargetFileInfo fileInfo)
        {
            var pageDefFile  = getPageDefinitionFile(fileInfo.HtmlFile);
            var physicalPath = NormalizePath(pageDefFile);

            if (permissions.AllowWrite(this, pageDefFile, physicalPath))
            {
                using (var outStream = new StreamWriter(WriteFile(pageDefFile)))
                {
                    JsonWriter.Serialize(definition, outStream);
                }
            }
            else if (next != null)
            {
                next.SavePageDefinition(definition, fileInfo);
            }
        }
Exemple #7
0
 /// <summary>
 /// Load a page definition.
 /// </summary>
 /// <param name="fileInfo">The file info to use to find the PageDefinition file.</param>
 /// <returns>The PageDefinition for the page. Will be a default instance if the file does not exist.</returns>
 public PageDefinition GetProjectPageDefinition(ITargetFileInfo fileInfo)
 {
     return(getProjectPageDefinition(fileInfo.HtmlFile));
 }