Skip to content

Commit a405a05

Browse files
authored
syntax highlighting (#9179)
* synatx highlighting
1 parent 598fdc4 commit a405a05

25 files changed

Lines changed: 118 additions & 12 deletions

File tree

src/AccountDeleter/EmptyFeatureFlagService.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,11 @@ public bool IsMarkdigMdRenderingEnabled()
146146
throw new NotImplementedException();
147147
}
148148

149+
public bool IsMarkdigMdSyntaxHighlightEnabled()
150+
{
151+
throw new NotImplementedException();
152+
}
153+
149154
public bool IsNewAccount2FAEnforcementEnabled()
150155
{
151156
throw new NotImplementedException();

src/Bootstrap/dist/css/bootstrap-theme.css

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Bootstrap/less/theme/common-readme.less

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@
4141
blockquote {
4242
font-size: @font-size-base;
4343
}
44+
45+
pre code.hljs{
46+
background-color: #f6f8fa;
47+
}
4448
}
4549

4650
#readme-preview {

src/GitHubVulnerabilities2Db/Fakes/FakeFeatureFlagService.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ public bool IsMarkdigMdRenderingEnabled()
125125
throw new NotImplementedException();
126126
}
127127

128+
public bool IsMarkdigMdSyntaxHighlightEnabled()
129+
{
130+
throw new NotImplementedException();
131+
}
132+
128133
public bool IsODataDatabaseReadOnlyEnabled()
129134
{
130135
throw new NotImplementedException();

src/NuGetGallery.Services/Configuration/FeatureFlagService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ public class FeatureFlagService : IFeatureFlagService
4646
private const string EmbeddedReadmeFlightName = GalleryPrefix + "EmbeddedReadmes";
4747
private const string LicenseMdRenderingFlightName = GalleryPrefix + "LicenseMdRendering";
4848
private const string MarkdigMdRenderingFlightName = GalleryPrefix + "MarkdigMdRendering";
49+
private const string MarkdigMdSyntaxHighlightFlightName = GalleryPrefix + "MarkdigMdSyntaxHighlight";
4950
private const string DeletePackageApiFlightName = GalleryPrefix + "DeletePackageApi";
5051
private const string ImageAllowlistFlightName = GalleryPrefix + "ImageAllowlist";
5152
private const string DisplayBannerFlightName = GalleryPrefix + "Banner";
@@ -335,6 +336,11 @@ public bool IsMarkdigMdRenderingEnabled()
335336
return _client.IsEnabled(MarkdigMdRenderingFlightName, defaultValue: false);
336337
}
337338

339+
public bool IsMarkdigMdSyntaxHighlightEnabled()
340+
{
341+
return _client.IsEnabled(MarkdigMdSyntaxHighlightFlightName, defaultValue: false);
342+
}
343+
338344
public bool IsDeletePackageApiEnabled(User user)
339345
{
340346
return _client.IsEnabled(DeletePackageApiFlightName, user, defaultValue: false);

src/NuGetGallery.Services/Configuration/IFeatureFlagService.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,12 @@ public interface IFeatureFlagService
263263
/// </summary>
264264
bool IsMarkdigMdRenderingEnabled();
265265

266+
/// <summary>
267+
/// Whether rendering Markdown fenced code with syntax highlighting
268+
/// </summary>
269+
bool IsMarkdigMdSyntaxHighlightEnabled();
270+
271+
/// <summary>
266272
/// Whether or not the user can delete a package through the API.
267273
/// </summary>
268274
bool IsDeletePackageApiEnabled(User user);

src/NuGetGallery/App_Code/ViewHelpers.cshtml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,4 +730,11 @@ var hlp = new AccordionHelper(name, formModelStatePrefix, expanded, page);
730730
{
731731
return MvcHtmlString.Create(UriExtensions.GetExternalUrlAnchorTag(data, link));
732732
}
733+
}
734+
735+
@helper IncludeSyntaxHighlightScript()
736+
{
737+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/styles/github.min.css" integrity="sha512-0aPQyyeZrWj9sCA46UlmWgKOP0mUipLQ6OZXu8l4IcAmD2u31EPEy9VcIMvl7SoAaKe8bLXZhYoMaE/in+gcgA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
738+
@* highlight.js build includes support for:: bash, c, cpp, csharp, css, diff, go, ini, java, json, javascript, kotlin, less, lua, makefile, xml, markdown, perl, php, objectivec, plaintext, python, r, ruby,rust, scss, shell, sql, swift, vbnet, yaml*@
739+
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.6.0/highlight.min.js" integrity="sha512-gU7kztaQEl7SHJyraPfZLQCNnrKdaQi5ndOyt4L4UPL/FHDd/uB9Je6KDARIqwnNNE27hnqoWLBq+Kpe4iHfeQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
733740
}

src/NuGetGallery/App_Data/Files/Content/flags.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
"NuGetGallery.PatternSetTfmHeuristics": "Enabled",
3030
"NuGetGallery.EmbeddedIcons": "Enabled",
3131
"NuGetGallery.MarkdigMdRendering": "Enabled",
32+
"NuGetGallery.MarkdigMdSyntaxHighlight": "Enabled",
3233
"NuGetGallery.ImageAllowlist": "Enabled",
3334
"NuGetGallery.ShowReportAbuseSafetyChanges": "Enabled",
3435
"NuGetGallery.ComputeTargetFramework": "Enabled",

src/NuGetGallery/Controllers/PackagesController.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,7 @@ public virtual async Task<ActionResult> UploadPackage()
259259
var model = new SubmitPackageRequest();
260260
model.IsSymbolsUploadEnabled = _contentObjectService.SymbolsConfiguration.IsSymbolsUploadEnabledForUser(currentUser);
261261
model.IsUserLocked = currentUser.IsLocked;
262+
model.IsMarkdigMdSyntaxHighlightEnabled = _featureFlagService.IsMarkdigMdSyntaxHighlightEnabled();
262263
PackageMetadata packageMetadata;
263264

264265
using (var uploadedFile = await _uploadFileService.GetUploadFileAsync(currentUser.Key))
@@ -373,6 +374,7 @@ private async Task<ActionResult> UploadPackageInternal(SubmitPackageRequest mode
373374
verifyRequest.LicenseFileContents = await GetLicenseFileContentsOrNullAsync(packageMetadata, packageArchiveReader);
374375
verifyRequest.LicenseExpressionSegments = GetLicenseExpressionSegmentsOrNull(packageMetadata.LicenseMetadata);
375376
verifyRequest.ReadmeFileContents = await GetReadmeFileContentsOrNullAsync(packageMetadata, packageArchiveReader);
377+
verifyRequest.IsMarkdigMdSyntaxHighlightEnabled = _featureFlagService.IsMarkdigMdSyntaxHighlightEnabled();
376378

377379
model.InProgressUpload = verifyRequest;
378380
return View(model);
@@ -655,6 +657,7 @@ private async Task<JsonResult> GetVerifyPackageView(User currentUser,
655657
var model = new VerifyPackageRequest(packageMetadata, accountsAllowedOnBehalfOf, existingPackageRegistration);
656658
model.IsSymbolsPackage = isSymbolsPackageUpload;
657659
model.HasExistingAvailableSymbols = hasExistingSymbolsPackageAvailable;
660+
model.IsMarkdigMdSyntaxHighlightEnabled = _featureFlagService.IsMarkdigMdSyntaxHighlightEnabled();
658661
model.Warnings.AddRange(packageContentData.Warnings.Select(w => new JsonValidationMessage(w)));
659662
model.LicenseFileContents = packageContentData.LicenseFileContents;
660663

@@ -950,6 +953,7 @@ public virtual async Task<ActionResult> DisplayPackage(string id, string version
950953
model.IsRecentPackagesNoIndexEnabled = _featureFlagService.IsRecentPackagesNoIndexEnabled();
951954
model.IsDisplayTargetFrameworkEnabled = _featureFlagService.IsDisplayTargetFrameworkEnabled(currentUser);
952955
model.IsComputeTargetFrameworkEnabled = _featureFlagService.IsComputeTargetFrameworkEnabled();
956+
model.IsMarkdigMdSyntaxHighlightEnabled = _featureFlagService.IsMarkdigMdSyntaxHighlightEnabled();
953957

954958
if (model.IsComputeTargetFrameworkEnabled || model.IsDisplayTargetFrameworkEnabled)
955959
{
@@ -1801,7 +1805,8 @@ public virtual async Task<ActionResult> Manage(string id, string version = null)
18011805
ReportMyPackageReasons,
18021806
Url,
18031807
await _readMeService.GetReadMeMdAsync(package),
1804-
_featureFlagService.IsManageDeprecationEnabled(currentUser, package.PackageRegistration));
1808+
_featureFlagService.IsManageDeprecationEnabled(currentUser, package.PackageRegistration),
1809+
_featureFlagService.IsMarkdigMdSyntaxHighlightEnabled());
18051810

18061811
if (!model.CanEdit && !model.CanManageOwners && !model.CanUnlistOrRelist)
18071812
{

src/NuGetGallery/Helpers/ViewModelExtensions/ManagePackageViewModelFactory.cs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@ public ManagePackageViewModel Create(
2525
IReadOnlyList<ReportPackageReason> reasons,
2626
UrlHelper url,
2727
string readMe,
28-
bool isManageDeprecationEnabled)
28+
bool isManageDeprecationEnabled,
29+
bool isMarkdigMdSyntaxHighlightEnabled)
2930
{
3031
var viewModel = new ManagePackageViewModel();
31-
return Setup(viewModel, package, currentUser, reasons, url, readMe, isManageDeprecationEnabled);
32+
return Setup(viewModel, package, currentUser, reasons, url, readMe, isManageDeprecationEnabled, isMarkdigMdSyntaxHighlightEnabled);
3233
}
3334

3435
public ManagePackageViewModel Setup(
@@ -38,10 +39,11 @@ public ManagePackageViewModel Setup(
3839
IReadOnlyList<ReportPackageReason> reasons,
3940
UrlHelper url,
4041
string readMe,
41-
bool isManageDeprecationEnabled)
42+
bool isManageDeprecationEnabled,
43+
bool isMarkdigMdSyntaxHighlightEnabled)
4244
{
4345
_listPackageItemViewModelFactory.Setup(viewModel, package, currentUser);
44-
return SetupInternal(viewModel, package, currentUser, reasons, url, readMe, isManageDeprecationEnabled);
46+
return SetupInternal(viewModel, package, currentUser, reasons, url, readMe, isManageDeprecationEnabled, isMarkdigMdSyntaxHighlightEnabled);
4547
}
4648

4749
private ManagePackageViewModel SetupInternal(
@@ -51,7 +53,8 @@ private ManagePackageViewModel SetupInternal(
5153
IReadOnlyList<ReportPackageReason> reasons,
5254
UrlHelper url,
5355
string readMe,
54-
bool isManageDeprecationEnabled)
56+
bool isManageDeprecationEnabled,
57+
bool isMarkdigMdSyntaxHighlightEnabled)
5558
{
5659
viewModel.IsCurrentUserAnAdmin = currentUser != null && currentUser.IsAdministrator;
5760

@@ -71,6 +74,7 @@ private ManagePackageViewModel SetupInternal(
7174
viewModel.IsLocked = package.PackageRegistration.IsLocked;
7275

7376
viewModel.IsManageDeprecationEnabled = isManageDeprecationEnabled;
77+
viewModel.IsMarkdigMdSyntaxHighlightEnabled = isMarkdigMdSyntaxHighlightEnabled;
7478

7579
var versionSelectPackages = package.PackageRegistration.Packages
7680
.Where(p => p.PackageStatusKey == PackageStatus.Available || p.PackageStatusKey == PackageStatus.Validating)

0 commit comments

Comments
 (0)