src/dotnet/RiderPlugin.EnhancedUnrealEngineDocumentation/EnhancedReflectionQuickDocPresenter.cs (109 lines of code) (raw):

using System.Linq; using JetBrains.ReSharper.Feature.Services.Cpp.QuickDoc; using JetBrains.ReSharper.Feature.Services.Cpp.Resources; using JetBrains.ReSharper.Feature.Services.QuickDoc; using JetBrains.ReSharper.Psi; using JetBrains.ReSharper.Psi.Cpp.Lang; using JetBrains.Application.I18n; using JetBrains.Application.UI.Components.Theming; using JetBrains.ReSharper.Feature.Services.QuickDoc.Render; using JetBrains.ReSharper.Psi.Cpp.Presentation; using JetBrains.UI.RichText; using JetBrains.Util; using JetBrains.Util.RichText; namespace RiderPlugin.EnhancedUnrealEngineDocumentation; public class EnhancedReflectionQuickDocPresenter : CppUE4SpecifiersQuickDocPresenter { private readonly ReflectionDescription _documentation; private readonly ITheming _theming; public EnhancedReflectionQuickDocPresenter(ReflectionDescription documentation, ITheming theming, CppXmlDocPresenterBase presenter, CppHighlighterColorCache colorCache) : base(presenter, colorCache) { _documentation = documentation; _theming = theming; } private RichText FormatTitle(string name) { var specifier = Strings._ReflectionSpecifier_Text.Format("Unreal Engine"); return Select(name, CppHighlightingAttributeIds.CPP_UE4_REFLECTION_SPECIFIER_NAME_ATTRIBUTE) .Append($"<br/>({specifier})", TextStyle.Default); } public override QuickDocTitleAndText GetHtml(PsiLanguageType presentationLanguage) { var doc = RichTextFromSimpleMarkdown.Convert(_documentation.documentation.text); var formattedTitle = FormatTitle(_documentation.name); var text = XmlDocHtmlUtil.BuildHtml( (_, output) => output.Append(formattedTitle).Append("<br><br>", TextStyle.Default).Append(doc), XmlDocHtmlUtil.NavigationStyle.None, _theming).Append("<br><br>"); if (_documentation.comment != null) { var comment = RichTextFromSimpleMarkdown.Convert(_documentation.comment); text.Append("<blockquote><p>").Append(comment).Append("</p></blockquote>"); text.Append("<br>"); } if (_documentation.position.IsNotEmpty() && _documentation.type.IsNotEmpty()) { var attribute = "UPROPERTY"; var prefix = _documentation.position == "main" ? $"{attribute}(" : $"{attribute}(meta=("; var suffix = _documentation.position == "main" ? ")" : "))"; var body = _documentation.type switch { "flag" => $"{_documentation.name}", "bool" => $"{_documentation.name}=true", "string" => $"{_documentation.name}=\"abc\"", "number" or "integer" => $"{_documentation.name}=123", _ => "" }; text.Append($"<p><code>{prefix}{body}{suffix}</code</p>").Append("<br>"); } if (_documentation.samples is { Capacity: > 0 }) { text.Append($"<h4>Samples:</h4>" + _documentation.samples.Select(it => $"<pre>{it}</pre><hr/>").Join("")); text.Append("<br>"); } text.Append("<dl>"); if (_documentation.related is { Capacity: > 0 }) { text.Append($"<dt>Related:</dt><ul>"); text.Append(_documentation.related.Select(it => $"<li><dd><a href=\"https://unreal-garden.com/docs/{_documentation.category}/#{it.ToLower()}\">{it}</a></dd></li>") .Join("")); text.Append("</ul>"); text.Append("<br>"); } if (_documentation.antonyms is { Capacity: > 0 }) { text.Append($"<dt>Opposite:</dt><ul>"); text.Append(_documentation.antonyms.Select(it => $"<li><dd><a href=\"https://unreal-garden.com/docs/{_documentation.category}/#{it.ToLower()}\">{it}</a></dd></li>") .Join("")); text.Append("</ul>"); text.Append("<br>"); } if (_documentation.incompatible is { Capacity: > 0 }) { text.Append($"<dt>Incompatible:</dt><ul>"); text.Append(_documentation.incompatible.Select(it => $"<li><dd><a href=\"https://unreal-garden.com/docs/{_documentation.category}/#{it.ToLower()}\">{it}</a></dd></li>") .Join("")); text.Append("</ul>"); text.Append("<br>"); } if (_documentation.implies is { Capacity: > 0 }) { text.Append($"<dt>Implies:</dt><ul>"); text.Append(_documentation.implies.Select(it => $"<li><dd><a href=\"https://unreal-garden.com/docs/{_documentation.category}/#{it.ToLower()}\">{it}</a></dd></li>") .Join("")); text.Append("</ul>"); text.Append("<br>"); } text.Append($"</dl>"); text.Append($"<a href=\"https://unreal-garden.com/docs/{_documentation.category}/#{_documentation.name.ToLower()}\">Full Documentation</a><br>"); if (_documentation.images != null) { text.Append(_documentation.images.Select(it => $"<img src=\"https://unreal-garden.com/{it}\">").Join("")); } return new QuickDocTitleAndText(text, _documentation.name.NON_LOCALIZABLE()); } }