helpcenter/helpcenter.r7-office.ru/Web/App_Code/DocumentGenerator/Documentation.cs
2019-02-14 15:43:24 +03:00

84 lines
3.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using ASC.Api.Interfaces;
using ASC.Common.DependencyInjection;
using ASC.Common.Logging;
using Autofac;
public static class Documentation
{
private static List<MsDocEntryPoint> _points = new List<MsDocEntryPoint>();
public static void Load()
{
//Load documentation
_points = GenerateDocs();
}
private static List<MsDocEntryPoint> GenerateDocs()
{
var containerBuilder = AutofacConfigLoader.Load("api");
containerBuilder.Register(c => LogManager.GetLogger("ASC"))
.As<ILog>()
.SingleInstance();
containerBuilder.Register(c => c.Resolve<IApiRouteConfigurator>().RegisterEntryPoints())
.As<IEnumerable<IApiMethodCall>>()
.SingleInstance();
var container = containerBuilder.Build();
var entries = container.Resolve<IEnumerable<IApiMethodCall>>();
var apiEntryPoints = container.ComponentRegistry.Registrations.Where(x => typeof (IApiEntryPoint).IsAssignableFrom(x.Activator.LimitType)).ToList();
var generator = new MsDocDocumentGenerator(container);
foreach (var apiEntryPoint in entries.GroupBy(x => x.ApiClassType))
{
var point = apiEntryPoint;
generator.GenerateDocForEntryPoint(
apiEntryPoints.SingleOrDefault(x => x.Activator.LimitType == point.Key),
apiEntryPoint.AsEnumerable());
}
return generator.Points;
}
public static MsDocEntryPoint GetDocs(string name)
{
return _points.SingleOrDefault(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
}
public static IEnumerable<MsDocEntryPoint> GetAll()
{
return _points;
}
public static Dictionary<MsDocEntryPoint, Dictionary<MsDocEntryPointMethod, string>> Search(string query)
{
if (string.IsNullOrEmpty(query))
{
return new Dictionary<MsDocEntryPoint, Dictionary<MsDocEntryPointMethod, string>>();
}
var terms = Regex.Split(query, @"\W+").Where(x => !String.IsNullOrEmpty(x));
var result = _points.ToDictionary(
x => x,
ep => ep.Methods.Where(m => terms.All(
term => (m.Summary != null && 0 <= m.Summary.IndexOf(term, StringComparison.OrdinalIgnoreCase)) ||
(m.Category != null && 0 <= m.Category.IndexOf(term, StringComparison.OrdinalIgnoreCase)) ||
(m.FunctionName != null && 0 <= m.FunctionName.IndexOf(term, StringComparison.OrdinalIgnoreCase)) ||
(m.Notes != null && 0 <= m.Notes.IndexOf(term, StringComparison.OrdinalIgnoreCase)) ||
(m.Path != null && 0 <= m.Path.IndexOf(term, StringComparison.OrdinalIgnoreCase)) ||
(m.Remarks != null && 0 <= m.Remarks.IndexOf(term, StringComparison.OrdinalIgnoreCase)) ||
(m.Returns != null && 0 <= m.Returns.IndexOf(term, StringComparison.OrdinalIgnoreCase)))
)
.ToDictionary(key => key, value => string.Empty)
);
return result;
}
}