@ -7,16 +7,17 @@ using Newtonsoft.Json;
using Scriban ;
using Microsoft.Extensions.Logging ;
using Microsoft.Extensions.Logging.Abstractions ;
using Volo.Docs.Documents ;
using Volo.Abp ;
using Volo.Extensions ;
namespace Volo.Docs.HtmlConverting
{
public class ScribanDocumentSectionRenderer : IDocumentSectionRenderer
{
private const string j sonOpener = "````json" ;
private const string j sonCloser = "````" ;
private const string docs_p aram = "//[doc-params]" ;
private const string docs_t emplates = "//[doc-template]" ;
private const string J sonOpener = "````json" ;
private const string J sonCloser = "````" ;
private const string DocsP aram = "//[doc-params]" ;
private const string DocsT emplates = "//[doc-template]" ;
public ILogger < ScribanDocumentSectionRenderer > Logger { get ; set ; }
@ -40,6 +41,7 @@ namespace Volo.Docs.HtmlConverting
}
var result = await scribanTemplate . RenderAsync ( parameters ) ;
return RemoveOptionsJson ( result ) ;
}
@ -47,7 +49,7 @@ namespace Volo.Docs.HtmlConverting
{
try
{
if ( ! document . Contains ( j sonOpener) | | ! document . Contains ( docs_p aram) )
if ( ! document . Contains ( J sonOpener) | | ! document . Contains ( DocsP aram) )
{
return new Dictionary < string , List < string > > ( ) ;
}
@ -59,9 +61,14 @@ namespace Volo.Docs.HtmlConverting
return new Dictionary < string , List < string > > ( ) ;
}
var pureJson = insideJsonSection . Replace ( docs_param , "" ) . Trim ( ) ;
var pureJson = insideJsonSection . Replace ( DocsParam , "" ) . Trim ( ) ;
if ( ! JsonConvertExtensions . TryDeserializeObject < Dictionary < string , List < string > > > ( pureJson , out var availableParameters ) )
{
throw new UserFriendlyException ( "ERROR-20200327: Cannot validate JSON content for `AvailableParameters`!" ) ;
}
return JsonConvert . DeserializeObject < Dictionary < string , List < string > > > ( pureJson ) ;
return await Task . FromResult ( availableParameters ) ;
}
catch ( Exception )
{
@ -70,12 +77,13 @@ namespace Volo.Docs.HtmlConverting
}
}
private string RemoveOptionsJson ( string document )
private static string RemoveOptionsJson ( string document )
{
var orgDocument = document ;
try
{
if ( ! document . Contains ( j sonOpener) | | ! document . Contains ( docs_p aram) )
if ( ! document . Contains ( J sonOpener) | | ! document . Contains ( DocsP aram) )
{
return orgDocument ;
}
@ -88,8 +96,9 @@ namespace Volo.Docs.HtmlConverting
}
return document . Remove (
jsonBeginningIndex - jsonOpener . Length , ( jsonEndingIndex + jsonCloser . Length ) - ( jsonBeginningIndex - jsonOpener . Length )
) ;
jsonBeginningIndex - JsonOpener . Length ,
( jsonEndingIndex + JsonCloser . Length ) - ( jsonBeginningIndex - JsonOpener . Length )
) ;
}
catch ( Exception )
{
@ -97,25 +106,25 @@ namespace Volo.Docs.HtmlConverting
}
}
private ( int , int , string ) GetJsonBeginEndIndexesAndPureJson ( string document )
private static ( int , int , string ) GetJsonBeginEndIndexesAndPureJson ( string document )
{
var searchedIndex = 0 ;
while ( searchedIndex < document . Length )
{
var jsonBeginningIndex = document . Substring ( searchedIndex ) . IndexOf ( j sonOpener, StringComparison . Ordinal ) + j sonOpener. Length + searchedIndex ;
var jsonBeginningIndex = document . Substring ( searchedIndex ) . IndexOf ( J sonOpener, StringComparison . Ordinal ) + J sonOpener. Length + searchedIndex ;
if ( jsonBeginningIndex < 0 )
{
return ( - 1 , - 1 , "" ) ;
}
var jsonEndingIndex = document . Substring ( jsonBeginningIndex ) . IndexOf ( j sonCloser, StringComparison . Ordinal ) + jsonBeginningIndex ;
var jsonEndingIndex = document . Substring ( jsonBeginningIndex ) . IndexOf ( J sonCloser, StringComparison . Ordinal ) + jsonBeginningIndex ;
var insideJsonSection = document [ jsonBeginningIndex . . jsonEndingIndex ] ;
if ( insideJsonSection . IndexOf ( docs_param ) < 0 )
if ( insideJsonSection . IndexOf ( DocsParam , StringComparison . Ordinal ) < 0 )
{
searchedIndex = jsonEndingIndex + j sonCloser. Length ;
searchedIndex = jsonEndingIndex + J sonCloser. Length ;
continue ;
}
@ -129,68 +138,84 @@ namespace Volo.Docs.HtmlConverting
{
var templates = new List < DocumentPartialTemplateWithValuesDto > ( ) ;
while ( documentContent . Contains ( j sonOpener) )
while ( documentContent . Contains ( J sonOpener) )
{
var afterJsonOpener = documentContent . Substring (
documentContent . IndexOf ( jsonOpener , StringComparison . Ordinal ) + jsonOpener . Length ) ;
documentContent . IndexOf ( JsonOpener , StringComparison . Ordinal ) + JsonOpener . Length
) ;
var betweenJsonOpenerAndCloser = afterJsonOpener . Substring ( 0 ,
afterJsonOpener . IndexOf ( jsonCloser , StringComparison . Ordinal ) ) ;
afterJsonOpener . IndexOf ( JsonCloser , StringComparison . Ordinal )
) ;
documentContent = afterJsonOpener . Substring (
afterJsonOpener . IndexOf ( jsonCloser , StringComparison . Ordinal ) + jsonCloser . Length ) ;
afterJsonOpener . IndexOf ( JsonCloser , StringComparison . Ordinal ) + JsonCloser . Length
) ;
if ( ! betweenJsonOpenerAndCloser . Contains ( docs_t emplates) )
if ( ! betweenJsonOpenerAndCloser . Contains ( DocsT emplates) )
{
continue ;
}
var json = betweenJsonOpenerAndCloser . Substring ( betweenJsonOpenerAndCloser . IndexOf ( docs_t emplates, StringComparison . Ordinal ) + docs_t emplates. Length ) ;
var json = betweenJsonOpenerAndCloser . Substring ( betweenJsonOpenerAndCloser . IndexOf ( DocsT emplates, StringComparison . Ordinal ) + DocsT emplates. Length ) ;
var template = JsonConvert . DeserializeObject < DocumentPartialTemplateWithValuesDto > ( json ) ;
if ( ! JsonConvertExtensions . TryDeserializeObject < DocumentPartialTemplateWithValuesDto > ( json , out var template ) )
{
throw new UserFriendlyException ( $"ERROR-20200327: Cannot validate JSON content for `AvailableParameters`!" ) ;
}
templates . Add ( template ) ;
}
return templates ;
return await Task . FromResult ( templates ) ;
}
private string SetPartialTemplates ( string document , List < DocumentPartialTemplateContent > templates )
private static string SetPartialTemplates ( string document , IReadOnlyCollection < DocumentPartialTemplateContent > templates )
{
var newDocument = new StringBuilder ( ) ;
while ( document . Contains ( j sonOpener) )
while ( document . Contains ( J sonOpener) )
{
var beforeJson = document . Substring ( 0 ,
document . IndexOf ( jsonOpener , StringComparison . Ordinal ) + jsonOpener . Length ) ;
document . IndexOf ( JsonOpener , StringComparison . Ordinal ) + JsonOpener . Length
) ;
var afterJsonOpener = document . Substring (
document . IndexOf ( jsonOpener , StringComparison . Ordinal ) + jsonOpener . Length ) ;
document . IndexOf ( JsonOpener , StringComparison . Ordinal ) + JsonOpener . Length
) ;
var betweenJsonOpenerAndCloser = afterJsonOpener . Substring ( 0 ,
afterJsonOpener . IndexOf ( jsonCloser , StringComparison . Ordinal ) ) ;
afterJsonOpener . IndexOf ( JsonCloser , StringComparison . Ordinal )
) ;
if ( ! betweenJsonOpenerAndCloser . Contains ( docs_t emplates) )
if ( ! betweenJsonOpenerAndCloser . Contains ( DocsT emplates) )
{
document = afterJsonOpener . Substring (
afterJsonOpener . IndexOf ( jsonCloser , StringComparison . Ordinal ) + jsonCloser . Length ) ;
newDocument . Append ( beforeJson + betweenJsonOpenerAndCloser + jsonCloser ) ;
afterJsonOpener . IndexOf ( JsonCloser , StringComparison . Ordinal ) + JsonCloser . Length
) ;
newDocument . Append ( beforeJson + betweenJsonOpenerAndCloser + JsonCloser ) ;
continue ;
}
var json = betweenJsonOpenerAndCloser . Substring ( betweenJsonOpenerAndCloser . IndexOf ( docs_templates , StringComparison . Ordinal ) + docs_templates . Length ) ;
var templatePath = JsonConvert . DeserializeObject < DocumentPartialTemplateWithValuesDto > ( json ) ? . Path ;
var json = betweenJsonOpenerAndCloser . Substring (
betweenJsonOpenerAndCloser . IndexOf ( DocsTemplates , StringComparison . Ordinal ) + DocsTemplates . Length
) ;
var template = templates . FirstOrDefault ( t = > t . Path = = templatePath ) ;
if ( JsonConvertExtensions . TryDeserializeObject < DocumentPartialTemplateWithValuesDto > ( json , out var documentPartialTemplateWithValuesDto ) )
{
var template = templates . FirstOrDefault ( t = > t . Path = = documentPartialTemplateWithValuesDto . Path ) ;
var beforeTemplate = document . Substring ( 0 ,
document . IndexOf ( jsonOpener , StringComparison . Ordinal ) ) ;
var beforeTemplate = document . Substring ( 0 ,
document . IndexOf ( JsonOpener , StringComparison . Ordinal )
) ;
newDocument . Append ( beforeTemplate + template ? . Content + j sonCloser) ;
newDocument . Append ( beforeTemplate + template ? . Content + J sonCloser) ;
document = afterJsonOpener . Substring (
afterJsonOpener . IndexOf ( jsonCloser , StringComparison . Ordinal ) + jsonCloser . Length ) ;
document = afterJsonOpener . Substring (
afterJsonOpener . IndexOf ( JsonCloser , StringComparison . Ordinal ) + JsonCloser . Length
) ;
}
}
newDocument . Append ( document ) ;