Browse Source

Merge pull request #5683 from abpframework/issue/4877

Fix: "Options" on a document can be a problem for search engines
pull/5741/head
Alper Ebicoglu 6 years ago
committed by GitHub
parent
commit
727ffc6c76
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 5
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml
  2. 52
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs
  3. 115
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js

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

@ -305,7 +305,10 @@
</article>
<div id="crawler_link" style="display:none;">
@foreach (var query in Model.AlternativeOptionLinkQueries)
{
<a href="@($"{Request.Path}?{query}")"> @query </a>
}
</div>
</div>
</div>

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

@ -2,6 +2,7 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Web;
@ -70,6 +71,8 @@ namespace Volo.Docs.Pages.Documents.Project
public DocumentRenderParameters UserPreferences { get; set; } = new DocumentRenderParameters();
public List<string> AlternativeOptionLinkQueries { get; set; } = new List<string>();
public bool FullSearchEnabled { get; set; }
private const int MaxDescriptionMetaTagLength = 200;
@ -441,6 +444,7 @@ namespace Volo.Docs.Pages.Documents.Project
if (_uiOptions.SectionRendering)
{
await SetDocumentPreferencesAsync();
SetAlternativeOptionLinksAsync();
SetUserPreferences();
var partialTemplates = await GetDocumentPartialTemplatesAsync();
@ -617,21 +621,21 @@ namespace Volo.Docs.Pages.Documents.Project
return;
}
var availableparameters = await _documentSectionRenderer.GetAvailableParametersAsync(Document.Content);
var availableParameters = await _documentSectionRenderer.GetAvailableParametersAsync(Document.Content);
DocumentPreferences = new DocumentParametersDto
{
Parameters = new List<DocumentParameterDto>()
};
if (availableparameters == null || !availableparameters.Any())
if (availableParameters == null || !availableParameters.Any())
{
return;
}
foreach (var parameter in projectParameters.Parameters)
{
var availableParameter = availableparameters.GetOrDefault(parameter.Name);
var availableParameter = availableParameters.GetOrDefault(parameter.Name);
if (availableParameter != null)
{
var newParameter = new DocumentParameterDto
@ -654,6 +658,48 @@ namespace Volo.Docs.Pages.Documents.Project
}
}
private void SetAlternativeOptionLinksAsync()
{
if (!DocumentPreferences?.Parameters?.Any() ?? true)
{
return;
}
AlternativeOptionLinkQueries = CollectAlternativeOptionLinksRecursively();
}
private List<string> CollectAlternativeOptionLinksRecursively(int index = 0)
{
if (index >= DocumentPreferences.Parameters.Count)
{
return new List<string>();
}
var option = DocumentPreferences.Parameters[index];
var queries = new List<string>();
foreach (var key in option.Values.Keys)
{
var linkQuery = new StringBuilder($"{option.Name}={key}");
var restOfQueries = CollectAlternativeOptionLinksRecursively(index + 1);
if (restOfQueries.Any())
{
foreach (var restOfQuery in restOfQueries)
{
queries.Add($"{linkQuery}&{restOfQuery}");
}
}
else
{
queries.Add($"{linkQuery}");
}
}
return queries;
}
public string GetDescription()
{
if (Document == null || Document.Content.IsNullOrWhiteSpace())

115
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/index.js

@ -237,119 +237,6 @@
setQueryString();
};
var initCrawlerLinks = function () {
var isCrawler = function () {
var crawlers = [
'Google',
'Googlebot',
'YandexBot',
'msnbot',
'Rambler',
'Yahoo',
'AbachoBOT',
'accoona',
'AcoiRobot',
'ASPSeek',
'CrocCrawler',
'Dumbot',
'FAST-WebCrawler',
'GeonaBot',
'Gigabot',
'Lycos',
'MSRBOT',
'Scooter',
'AltaVista',
'IDBot',
'eStyle',
'Scrubby',
'Slurp',
'DuckDuckBot',
'Baiduspider',
'VoilaBot',
'ExaLead',
'Search Dog',
'MSN Bot',
'BingBot',
];
var agent = navigator.userAgent;
for (var i = 0; i < crawlers.length; i++) {
if (agent.indexOf(crawlers[i]) >= 0) {
return true;
}
}
return false;
};
if (!isCrawler()) {
return;
}
var comboboxes = $('.doc-section-combobox');
if (comboboxes.length <= 0) {
return;
}
$('#crawler_link').show();
var html = '';
var currentUrl = window.location.href.toString();
if (currentUrl.indexOf('?') > 0) {
currentUrl = currentUrl.substring(0, currentUrl.indexOf('?'));
}
var getQueryStringsFromComboboxes = function (x) {
if (x >= comboboxes.length) {
return [];
}
var key = $(comboboxes[x]).data('key');
var queryStrings = getQueryStringsFromComboboxes(x + 1);
var returnList = [];
$(comboboxes[x])
.find('option')
.each(function () {
if (queryStrings.length <= 0) {
returnList.push(key + '=' + $(this).val());
} else {
for (var k = 0; k < queryStrings.length; k++) {
returnList.push(
key +
'=' +
$(this).val() +
'&' +
queryStrings[k]
);
}
}
});
return returnList;
};
var queryStrings = getQueryStringsFromComboboxes(0);
for (var i = 0; i < queryStrings.length; i++) {
html +=
'<a href="' +
currentUrl +
'?' +
queryStrings[i] +
'">' +
queryStrings[i] +
'</a> ';
}
$('#crawler_link').html(html);
};
initNavigationFilter('sidebar-scroll');
initAnchorTags('.docs-page .docs-body');
@ -357,7 +244,5 @@
initSocialShareLinks();
initSections();
initCrawlerLinks();
});
})(jQuery);

Loading…
Cancel
Save