private static void RenderStackHtml(ParallelStack stack, IHtmlRenderer visitor, int increment = 0) { if (stack.Stacks.Count == 0) { var lastFrame = stack.Frame; visitor.EnterFrameGroupEnd(increment); visitor.WriteFrameSeparator($" ~~~~ {FormatThreadIdList(visitor, stack.ThreadIds)}"); visitor.LeaveFrameGroupEnd(); visitor.EnterFrame(increment); visitor.WriteCount($"{stack.ThreadIds.Count,Padding}"); RenderFrame(lastFrame, visitor); visitor.LeaveFrame(); return; } foreach (var nextStackFrame in stack.Stacks.OrderBy(s => s.ThreadIds.Count)) { RenderStackHtml(nextStackFrame, visitor, (nextStackFrame.ThreadIds.Count == stack.ThreadIds.Count) ? increment : increment + 1); } var currentFrame = stack.Frame; visitor.EnterFrame(increment); visitor.WriteCount($"{stack.ThreadIds.Count,Padding}"); RenderFrame(currentFrame, visitor); visitor.LeaveFrame(); }
public void Return(IHtmlRenderer htmlRenderer) { if (_objectDisposed) { throw new ObjectDisposedException(nameof(NetworkServicePool)); } _htmlRendererPool.Add(htmlRenderer); }
/// <summary> /// Renders an HTML node to a file. /// </summary> public static void SaveNode(this IHtmlRenderer renderer, HtmlNode node, string filePath) { renderer.GuardNotNull(nameof(renderer)); node.GuardNotNull(nameof(node)); filePath.GuardNotNull(nameof(filePath)); using (var writer = File.CreateText(filePath)) renderer.SaveNode(node, writer); }
/// <summary> /// Renders an HTML node to <see cref="TextWriter"/>. /// </summary> public static void SaveNode(this IHtmlRenderer renderer, HtmlNode node, TextWriter writer) { renderer.GuardNotNull(nameof(renderer)); node.GuardNotNull(nameof(node)); writer.GuardNotNull(nameof(writer)); var source = renderer.RenderNode(node); writer.Write(source); }
/// <summary> /// Creates an <see cref="HtmlRendererResult{TModel}"/> /// </summary> /// <param name="view">The view</param> /// <param name="model">The model</param> /// <param name="statusCode">A custom status code</param> public HtmlRendererResult(IHtmlRenderer <TModel> view, TModel model, HttpStatusCode?statusCode = null) { if (view == null) { throw new ArgumentNullException(nameof(view)); } View = view; Model = model; StatusCode = statusCode; }
public ViewerService(IApplicationStorageService applicationStorageService, ISolutionListTreeViewService solutionListTreeViewService, IHtmlRenderer htmlRenderer, IActionService actionService, IFileUtilities fileUtilities, IRenderingOptionsTreeViewService renderingOptionsTreeViewService) { _applicationStorageService = applicationStorageService; _solutionListTreeViewService = solutionListTreeViewService; _htmlRenderer = htmlRenderer; _fileUtilities = fileUtilities; _renderingOptionsTreeViewService = renderingOptionsTreeViewService; _solutionListTreeViewService.ActionPresentBlobs += SolutionListTreeViewService_ActionPresentBlobs; actionService.ActionSave += ActionService_ActionSave; }
public static void RenderHtml(this ParallelStack stacks, IHtmlRenderer visitor) { visitor.EnterRender(stacks); foreach (var stack in stacks.Stacks) { visitor.EnterStackRoot(); RenderStackHtml(stack, visitor); visitor.LeaveStackRoot(); } visitor.EndRender(); }
/// <summary> /// Creates an <see cref="ActionResult"/> from an <see cref="IHtmlRenderer{TModel}"/> and a <typeparamref name="TModel"/> /// </summary> /// <typeparam name="TModel">The model type</typeparam> /// <param name="view">The view</param> /// <param name="model">The model</param> /// <param name="statusCode">A custom status code</param> /// <returns>An <see cref="ActionResult"/></returns> public static HtmlRendererResult <TModel> Create <TModel>( IHtmlRenderer <TModel> view, TModel model, HttpStatusCode?statusCode = null ) { if (view == null) { throw new ArgumentNullException(nameof(view)); } return(new HtmlRendererResult <TModel>(view, model, statusCode)); }
/// <summary> /// Creates an <see cref="EightyViewAdapter{TModel}"/> /// </summary> /// <param name="path">The view path</param> /// <param name="view">The view</param> public EightyViewAdapter(string path, IHtmlRenderer <TModel> view) { if (path == null) { throw new ArgumentNullException(nameof(path)); } if (view == null) { throw new ArgumentNullException(nameof(view)); } Path = path; _view = view; }
public Engine(ISolutionAnalyzer solutionAnalyzer, IStorageService storageService, IHtmlRenderer htmlRenderer) { _solutionAnalyzer = solutionAnalyzer; _storageService = storageService; _htmlRenderer = htmlRenderer; }
/// <summary> /// Add an <see cref="IHtmlRenderer{TModel}"/> to the collection /// </summary> /// <param name="path">The view path</param> /// <param name="view">The view</param> public void RegisterSingleton <TModel>(string path, IHtmlRenderer <TModel> view) { var adapter = new EightyViewAdapter <TModel>(path, view); Views[path] = adapter; }
/// <summary> /// Add an <see cref="IHtmlRenderer{TModel}"/> to the collection /// </summary> /// <param name="controllerName">The controller name</param> /// <param name="viewName">The view name</param> /// <param name="view">The view</param> public void RegisterSingleton <TModel>(string controllerName, string viewName, IHtmlRenderer <TModel> view) { RegisterSingleton(controllerName + "/" + viewName, view); }
/// <summary> /// Creates an <see cref="IActionResult"/> from an <see cref="IHtmlRenderer{TModel}"/> and a <typeparamref name="TModel"/> /// </summary> /// <typeparam name="TModel">The model type</typeparam> /// <param name="view">The view</param> /// <param name="model">The model</param> /// <param name="statusCode">A custom status code</param> /// <param name="renderAsync">Write the HTML to the response asynchronously</param> /// <returns>An <see cref="IActionResult"/></returns> public static HtmlRendererResult <TModel> ToActionResult <TModel>( this IHtmlRenderer <TModel> view, TModel model, HttpStatusCode?statusCode = null, bool renderAsync = false ) => Create(view, model, statusCode, renderAsync);
/// <summary> /// Creates an <see cref="ActionResult"/> from an <see cref="IHtmlRenderer{TModel}"/> and a <typeparamref name="TModel"/> /// </summary> /// <typeparam name="TModel">The model type</typeparam> /// <param name="view">The view</param> /// <param name="model">The model</param> /// <param name="statusCode">A custom status code</param> /// <returns>An <see cref="ActionResult"/></returns> public static HtmlRendererResult <TModel> ToActionResult <TModel>( this IHtmlRenderer <TModel> view, TModel model, HttpStatusCode?statusCode = null ) => Create(view, model, statusCode);
protected override RenderingResult Transform(Resource resource) { IHtmlRenderer htmlRenderer = null; var capturedResources = new List <Resource>(); try { if (resource == null) { throw new ArgumentNullException(nameof(resource)); } htmlRenderer = _htmlRenderers.Take(_cancellationToken); htmlRenderer.OnResourceCaptured += CaptureResource; var oldStatusCode = resource.StatusCode; var renderingFailed = !htmlRenderer.TryRender( resource, out var htmlText, out var millisecondsPageLoadTime, _cancellationToken ); if (renderingFailed) { SendOutFailedProcessingResult(); _log.Info($"Failed to render {nameof(Resource)} was discarded: {JsonConvert.SerializeObject(resource)}"); return(null); } UpdateStatusCodeIfChanged(); DoStatisticsIfHasPageLoadTime(); if (!resource.StatusCode.IsWithinBrokenRange()) { return new RenderingResult { RenderedResource = resource, CapturedResources = capturedResources, HtmlDocument = new HtmlDocument { Uri = resource.Uri, HtmlText = htmlText } } } ; SendOutFailedProcessingResult(); _log.Info($"Broken {nameof(Resource)} was discarded: {JsonConvert.SerializeObject(resource)}"); return(null); void UpdateStatusCodeIfChanged() { var newStatusCode = resource.StatusCode; if (oldStatusCode == newStatusCode) { return; } if (!VerificationResults.Post(resource.ToVerificationResult())) { _log.Error($"Failed to post data to buffer block named [{nameof(VerificationResults)}]."); } } void DoStatisticsIfHasPageLoadTime() { if (!millisecondsPageLoadTime.HasValue) { return; } _statistics.IncrementSuccessfullyRenderedPageCount(); _statistics.IncrementTotalPageLoadTimeBy(millisecondsPageLoadTime.Value); } } catch (Exception exception) when(!exception.IsAcknowledgingOperationCancelledException(_cancellationToken)) { SendOutFailedProcessingResult(); _log.Error($"One or more errors occurred while rendering: {JsonConvert.SerializeObject(resource)}.", exception); return(null); } finally { if (htmlRenderer != null) { htmlRenderer.OnResourceCaptured -= CaptureResource; _htmlRenderers.Add(htmlRenderer, CancellationToken.None); } } void CaptureResource(Resource capturedResource) { capturedResources.Add(capturedResource); } void SendOutFailedProcessingResult() { if (!FailedProcessingResults.Post(new FailedProcessingResult { ProcessedResource = resource })) { _log.Error($"Failed to post data to buffer block named [{nameof(FailedProcessingResults)}]."); } } }