Browse Source

Resolved #479

pull/696/head
Yunus Emre Kalkan 7 years ago
parent
commit
debd0c37fa
  1. 3
      modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/ContentWithDetailsDto.cs
  2. 14
      modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/DocumentContributorDto.cs
  3. 3
      modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs
  4. 2
      modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs
  5. 4
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/Document.cs
  6. 15
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentContributor.cs
  7. 57
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs
  8. 8
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs
  9. 2
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json
  10. 2
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/tr.json
  11. 43
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml
  12. 18
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.css
  13. 2
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.min.css
  14. 30
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.scss

3
modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/ContentWithDetailsDto.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using Volo.Docs.Projects;
namespace Volo.Docs.Documents
@ -25,5 +26,7 @@ namespace Volo.Docs.Documents
public string FileName { get; set; }
public ProjectDto Project { get; set; }
public List<DocumentContributorDto> Contributors { get; set; }
}
}

14
modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/DocumentContributorDto.cs

@ -0,0 +1,14 @@
using System;
namespace Volo.Docs.Documents
{
[Serializable]
public class DocumentContributorDto
{
public string Username { get; set; }
public string UserProfileUrl { get; set; }
public string AvatarUrl { get; set; }
}
}

3
modules/docs/src/Volo.Docs.Application/Volo/Docs/DocsApplicationAutoMapperProfile.cs

@ -12,7 +12,8 @@ namespace Volo.Docs
CreateMap<Project, ProjectDto>();
CreateMap<VersionInfo, VersionInfoDto>();
CreateMap<Document, DocumentWithDetailsDto>()
.Ignore(x => x.Project);
.Ignore(x => x.Project).Ignore(x => x.Contributors);
CreateMap<DocumentContributor, DocumentContributorDto>();
CreateMap<DocumentResource, DocumentResourceDto>();
}
}

2
modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Distributed;
using Volo.Abp.Application.Services;
@ -111,6 +112,7 @@ namespace Volo.Docs.Documents
{
var documentDto = ObjectMapper.Map<Document, DocumentWithDetailsDto>(document);
documentDto.Project = ObjectMapper.Map<Project, ProjectDto>(project);
documentDto.Contributors = ObjectMapper.Map<List<DocumentContributor>, List<DocumentContributorDto>>(document.Contributors);
return documentDto;
}
}

4
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/Document.cs

@ -1,3 +1,5 @@
using System.Collections.Generic;
namespace Volo.Docs.Documents
{
public class Document
@ -19,5 +21,7 @@ namespace Volo.Docs.Documents
public string LocalDirectory { get; set; }
public string FileName { get; set; }
public List<DocumentContributor> Contributors { get; set; }
}
}

15
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/DocumentContributor.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Volo.Docs.Documents
{
public class DocumentContributor
{
public string Username { get; set; }
public string UserProfileUrl { get; set; }
public string AvatarUrl { get; set; }
}
}

57
modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Documents/GithubDocumentStore.cs

@ -10,6 +10,7 @@ using Volo.Abp.Domain.Services;
using Volo.Docs.Documents;
using Volo.Docs.GitHub.Projects;
using Volo.Docs.Projects;
using Newtonsoft.Json.Linq;
using ProductHeaderValue = Octokit.ProductHeaderValue;
using Project = Volo.Docs.Projects.Project;
@ -23,9 +24,11 @@ namespace Volo.Docs.GitHub.Documents
public virtual async Task<Document> GetDocument(Project project, string documentName, string version)
{
var token = project.GetGitHubAccessTokenOrNull();
var rootUrl = project.GetGitHubUrl(version);
var rawRootUrl = CalculateRawRootUrl(rootUrl);
var rawDocumentUrl = rawRootUrl + documentName;
var commitHistoryUrl = project.GetGitHubUrlForCommitHistory() + documentName;
var editLink = rootUrl.ReplaceFirst("/tree/", "/blob/") + documentName;
var localDirectory = "";
var fileName = documentName;
@ -45,18 +48,12 @@ namespace Volo.Docs.GitHub.Documents
Format = project.Format,
LocalDirectory = localDirectory,
FileName = fileName,
Contributors = await GetContributors(commitHistoryUrl, token),
Version = version,
Content = await DownloadWebContentAsStringAsync(rawDocumentUrl, project.GetGitHubAccessTokenOrNull())
Content = await DownloadWebContentAsStringAsync(rawDocumentUrl, token)
};
}
private static string CalculateRawRootUrl(string rootUrl)
{
return rootUrl
.Replace("github.com", "raw.githubusercontent.com")
.ReplaceFirst("/tree/", "/");
}
public async Task<List<VersionInfo>> GetVersions(Project project)
{
try
@ -146,6 +143,7 @@ namespace Volo.Docs.GitHub.Documents
{
webClient.Headers.Add("Authorization", "token " + token);
}
webClient.Headers.Add("User-Agent", "request");
return await webClient.DownloadStringTaskAsync(new Uri(rawUrl));
}
@ -179,5 +177,48 @@ namespace Volo.Docs.GitHub.Documents
throw new ResourceNotFoundException(rawUrl);
}
}
private async Task<List<DocumentContributor>> GetContributors(string url, string token)
{
var contributors = new List<DocumentContributor>();
try
{
var commitsJsonAsString = await DownloadWebContentAsStringAsync(url, token);
var commits = JArray.Parse(commitsJsonAsString);
foreach (var commit in commits)
{
var author = commit["author"];
if (contributors.All(c => c.Username != (string) author["login"]))
{
contributors.Add(new DocumentContributor
{
Username = (string)author["login"],
UserProfileUrl = (string)author["html_url"],
AvatarUrl = (string)author["avatar_url"]
});
}
}
contributors.Reverse();
}
catch (Exception ex)
{
Logger.LogWarning(ex.Message);
}
return contributors;
}
private static string CalculateRawRootUrl(string rootUrl)
{
return rootUrl
.Replace("github.com", "raw.githubusercontent.com")
.ReplaceFirst("/tree/", "/");
}
}
}

8
modules/docs/src/Volo.Docs.Domain/Volo/Docs/GitHub/Projects/ProjectGithubExtensions.cs

@ -21,6 +21,14 @@ namespace Volo.Docs.GitHub.Projects
.Replace("{version}", version);
}
public static string GetGitHubUrlForCommitHistory([NotNull] this Project project)
{
return project
.GetGitHubUrl()
.Replace("github.com", "api.github.com/repos")
.Replace("tree/{version}/", "commits?path=");
}
public static void SetGitHubUrl([NotNull] this Project project, string value)
{
CheckGitHubProject(project);

2
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json

@ -3,6 +3,8 @@
"texts": {
"Documents": "Documents",
"BackToWebsite": "Back to website",
"Contributors": "Contributors",
"ShareOn": "Share on",
"Version": "Version",
"Edit": "Edit",
"InThisDocument": "In this document",

2
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/tr.json

@ -3,6 +3,8 @@
"texts": {
"Documents": "Dökümanlar",
"BackToWebsite": "Ana sayafaya dön",
"Contributors": "Katkıda bulunanlar",
"ShareOn": "Paylaş",
"Version": "Versiyon",
"Edit": "Düzenle",
"InThisDocument": "Bu dökümanda",

43
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml

@ -17,12 +17,12 @@
Layout = ThemeManager.CurrentTheme.GetEmptyLayout();
}
@section styles {
<abp-style-bundle name="@typeof(IndexModel).FullName">
<abp-script type="@typeof(PrismjsStyleBundleContributor)" />
<abp-script type="@typeof(MalihuCustomScrollbarPluginStyleBundleContributor)" />
<abp-style src="/Pages/Documents/Project/bootstrap-toc.css" />
<abp-style src="/Pages/Documents/Shared/Styles/vs.css" />
</abp-style-bundle>
<abp-style-bundle name="@typeof(IndexModel).FullName">
<abp-script type="@typeof(PrismjsStyleBundleContributor)" />
<abp-script type="@typeof(MalihuCustomScrollbarPluginStyleBundleContributor)" />
<abp-style src="/Pages/Documents/Project/bootstrap-toc.css" />
<abp-style src="/Pages/Documents/Shared/Styles/vs.css" />
</abp-style-bundle>
}
@section scripts {
<abp-script-bundle name="@typeof(IndexModel).FullName">
@ -121,15 +121,15 @@
<div class="docs-link-btns">
<div class="float-left">
Share on :
<a href="#" target="_blank" class="share-button twitter" id="TwitterShareLink">
<i class="fa fa-twitter"></i> Twitter
@(L["ShareOn"].Value + " :")
<a href="#" target="_blank" class="share-button twitter" id="TwitterShareLink" title="twitter">
<i class="fa fa-twitter"></i>
</a>
<a href="#" target="_blank" class="share-button linkedin" id="LinkedinShareLink">
<i class="fa fa-linkedin"></i> LinkedIn
<a href="#" target="_blank" class="share-button linkedin" id="LinkedinShareLink" title="linkedin">
<i class="fa fa-linkedin"></i>
</a>
<a href="#" target="_blank" class="share-button email" id="EmailShareLink">
<i class="fa fa-envelope-square"></i> E-mail
<a href="#" target="_blank" class="share-button email" id="EmailShareLink" title="Send e-mail">
<i class="fa fa-envelope-square"></i>
</a>
</div>
@ -139,7 +139,22 @@
}
</div>
<div class="docs-content-field">
<div class="docs-content-field">
<div class="position-relative">
<div class="contributors">
@if (Model.Document.Contributors.Count > 0)
{
<small class="text-muted">@(L["Contributors"].Value + " :")</small>
}
@foreach (var contributor in Model.Document.Contributors)
{
<a href="@contributor.UserProfileUrl" target="_blank">
<img src="@contributor.AvatarUrl"
class="contributors-avatar" height="21" width="21" title="@contributor.Username" />
</a>
}
</div>
</div>
<div class="docs-text-field">
<div data-spy="scroll" data-target="#docs-sticky-index" data-offset="0">
<article class="docs-body">

18
modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.css

@ -157,6 +157,22 @@
display: block; }
.docs-page .docs-content {
overflow-x: scroll; }
.docs-page .docs-content .contributors {
position: absolute;
top: 15px;
right: 5px; }
.docs-page .docs-content .contributors .contributors-avatar {
border-radius: 21px;
width: 21px;
height: 21px; }
.docs-page .docs-content .contributors a {
padding: 0;
width: 21px;
height: 21px;
display: inline-block;
margin: 0 0 0 2px; }
.docs-page .docs-content .contributors a:hover {
text-decoration: none; }
.docs-page .docs-content .docs-link-btns {
border-bottom: 1px solid #f4f5f7;
background: #fdfdfd;
@ -176,7 +192,7 @@
.docs-page .docs-content .docs-link-btns .email {
color: #5a5a5a; }
.docs-page .docs-content .docs-link-btns .share-button {
margin-left: 3px; }
margin-left: 10px; }
.docs-page .docs-content .docs-text-field {
padding: 2rem; }
.docs-page .docs-content article.docs-body h1 {

2
modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.min.css

File diff suppressed because one or more lines are too long

30
modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Styles/vs.scss

@ -262,6 +262,30 @@ body {
.docs-content {
overflow-x: scroll;
.contributors {
position: absolute;
top: 15px;
right: 5px;
.contributors-avatar {
border-radius: 21px;
width: 21px;
height: 21px;
}
a {
padding: 0;
width: 21px;
height: 21px;
display: inline-block;
margin: 0 0 0 2px;
&:hover {
text-decoration: none;
}
}
}
.docs-link-btns {
border-bottom: 1px solid #f4f5f7;
background: #fdfdfd;
@ -281,21 +305,18 @@ body {
.twitter {
color: #00ACEE;
}
.linkedin {
color: #0077B5;
}
.email {
color: #5a5a5a;
}
.share-button {
margin-left: 3px;
margin-left: 10px;
}
}
@ -830,4 +851,5 @@ div.code-toolbar > .toolbar a {
.mb-5, .my-5 {
margin-bottom: 2rem !important;
}
}
Loading…
Cancel
Save