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)); } }
/// <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); }
/// <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); } } } } }
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; } }
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); } }
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); } }
/// <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)); }