diff --git a/MatterControlLib/PartPreviewWindow/SearchPanel.cs b/MatterControlLib/PartPreviewWindow/SearchPanel.cs index 8c55c19bf..c4a6d0319 100644 --- a/MatterControlLib/PartPreviewWindow/SearchPanel.cs +++ b/MatterControlLib/PartPreviewWindow/SearchPanel.cs @@ -143,6 +143,7 @@ namespace MatterHackers.MatterControl.PartPreviewWindow if (helpDocsTab.TabContent is HelpTreePanel treePanel) { + treePanel.MatchingText = searchBox.searchInput.Text; treePanel.ActiveNodePath = (sender as HelpSearchResultRow).SearchResult.Path; } } diff --git a/MatterControlLib/SetupWizard/HelpTreePanel.cs b/MatterControlLib/SetupWizard/HelpTreePanel.cs index 444ead233..bf3f3ad73 100644 --- a/MatterControlLib/SetupWizard/HelpTreePanel.cs +++ b/MatterControlLib/SetupWizard/HelpTreePanel.cs @@ -248,6 +248,11 @@ namespace MatterHackers.MatterControl if (treeView.SelectedNode?.Tag is HelpArticle article) { + markdownWidget.MatchingText = this.MatchingText; + + // reset matching text after applying + this.MatchingText = null; + if (!string.IsNullOrWhiteSpace(article.Path)) { markdownWidget.LoadUri(new Uri(ApplicationController.Instance.HelpArticleSource, article.Path), sourceArticle: article); @@ -367,6 +372,8 @@ namespace MatterHackers.MatterControl public Color ChildBorderColor { get; private set; } + public string MatchingText { get; internal set; } + private void AddContent(GuiWidget column, string text, bool left, bool bold) { var container = new GuiWidget() diff --git a/MatterControlLib/Utilities/MarkdigAgg/AggMarkdownDocument.cs b/MatterControlLib/Utilities/MarkdigAgg/AggMarkdownDocument.cs index 0c0fcf51d..3dea0632e 100644 --- a/MatterControlLib/Utilities/MarkdigAgg/AggMarkdownDocument.cs +++ b/MatterControlLib/Utilities/MarkdigAgg/AggMarkdownDocument.cs @@ -31,6 +31,7 @@ using System; using System.Collections.Generic; using System.Net; using Markdig.Renderers; +using Markdig.Renderers.Agg; using Markdig.Syntax.Inlines; using MatterHackers.Agg.UI; @@ -39,7 +40,9 @@ namespace Markdig.Agg public class MarkdownDocumentLink { public Uri Uri { get; internal set; } + public LinkInline LinkInline { get; internal set; } + public string PageID { get; internal set; } } @@ -58,6 +61,15 @@ namespace Markdig.Agg this.BaseUri = baseUri; } + private string matchingText; + + public string MatchingText + { + get => matchingText; + set => matchingText = value; + } + + public Uri BaseUri { get; set; } = new Uri("https://www.matterhackers.com/"); public List Children { get; private set; } = new List(); @@ -108,10 +120,19 @@ namespace Markdig.Agg { if (!string.IsNullOrEmpty(this.Markdown)) { - var pipeline = Pipeline; + MarkdownPipeline pipeline; - // why do we check the pipeline here? - pipeline = pipeline ?? new MarkdownPipelineBuilder().Build(); + if (!string.IsNullOrWhiteSpace(matchingText)) + { + var builder = new MarkdownPipelineBuilder().UseSupportedExtensions(); + builder.InlineParsers.Add(new MatchingTextParser(matchingText)); + + pipeline = builder.Build(); + } + else + { + pipeline = Pipeline; + } var rootWidget = guiWidget ?? new GuiWidget(); diff --git a/MatterControlLib/Utilities/MarkdigAgg/AggMatchingTextRenderer.cs b/MatterControlLib/Utilities/MarkdigAgg/AggMatchingTextRenderer.cs new file mode 100644 index 000000000..1615c443f --- /dev/null +++ b/MatterControlLib/Utilities/MarkdigAgg/AggMatchingTextRenderer.cs @@ -0,0 +1,54 @@ +/* +Copyright(c) 2019, Lars Brubaker, John Lewin +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using Markdig.Renderers.Agg.Inlines; +using MatterHackers.MatterControl; + +namespace Markdig.Renderers.Agg +{ + public class AggMatchingTextRenderer : AggObjectRenderer + { + private ThemeConfig theme; + + public AggMatchingTextRenderer(ThemeConfig theme) + { + this.theme = theme; + } + + protected override void Write(AggRenderer renderer, MatchingTextInline obj) + { + renderer.Push(new CodeInlineX(theme) + { + BackgroundColor = theme.AccentMimimalOverlay + }); + renderer.WriteText(obj.MatchingText); + renderer.Pop(); + } + } +} diff --git a/MatterControlLib/Utilities/MarkdigAgg/AggRenderer.cs b/MatterControlLib/Utilities/MarkdigAgg/AggRenderer.cs index ae771df62..a183a0d0a 100644 --- a/MatterControlLib/Utilities/MarkdigAgg/AggRenderer.cs +++ b/MatterControlLib/Utilities/MarkdigAgg/AggRenderer.cs @@ -92,6 +92,8 @@ namespace Markdig.Renderers ObjectRenderers.Add(new AggLinkInlineRenderer()); ObjectRenderers.Add(new AggLiteralInlineRenderer()); + ObjectRenderers.Add(new AggMatchingTextRenderer(theme)); + // Extension renderers //ObjectRenderers.Add(new AggTableRenderer()); //ObjectRenderers.Add(new AggTaskListRenderer()); diff --git a/MatterControlLib/Utilities/MarkdigAgg/MarkdownWidget.cs b/MatterControlLib/Utilities/MarkdigAgg/MarkdownWidget.cs index cb16f592b..11d1ef7dc 100644 --- a/MatterControlLib/Utilities/MarkdigAgg/MarkdownWidget.cs +++ b/MatterControlLib/Utilities/MarkdigAgg/MarkdownWidget.cs @@ -157,5 +157,11 @@ namespace Markdig.Agg } } } + + public string MatchingText + { + get => markdownDocument.MatchingText; + set => markdownDocument.MatchingText = value; + } } } diff --git a/MatterControlLib/Utilities/MarkdigAgg/MatchingTextInline.cs b/MatterControlLib/Utilities/MarkdigAgg/MatchingTextInline.cs new file mode 100644 index 000000000..5ac8d4a5c --- /dev/null +++ b/MatterControlLib/Utilities/MarkdigAgg/MatchingTextInline.cs @@ -0,0 +1,38 @@ +/* +Copyright(c) 2019, Lars Brubaker, John Lewin +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using Markdig.Syntax.Inlines; + +namespace Markdig.Renderers.Agg +{ + public class MatchingTextInline : LeafInline + { + public string MatchingText { get; set; } + } +} diff --git a/MatterControlLib/Utilities/MarkdigAgg/MatchingTextParser.cs b/MatterControlLib/Utilities/MarkdigAgg/MatchingTextParser.cs new file mode 100644 index 000000000..bf0af258d --- /dev/null +++ b/MatterControlLib/Utilities/MarkdigAgg/MatchingTextParser.cs @@ -0,0 +1,71 @@ +/* +Copyright(c) 2019, Lars Brubaker, John Lewin +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED.IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those +of the authors and should not be interpreted as representing official policies, +either expressed or implied, of the FreeBSD Project. +*/ + +using Markdig.Helpers; +using Markdig.Parsers; + +namespace Markdig.Renderers.Agg +{ + public class MatchingTextParser : InlineParser + { + private string matchingText; + + public MatchingTextParser(string matchingText) + { + this.OpeningCharacters = new[] { matchingText[0] }; + this.matchingText = matchingText.ToLower(); + } + + public override bool Match(InlineProcessor processor, ref StringSlice slice) + { + bool matchFound = slice.MatchLowercase(matchingText); + + if (matchFound) + { + int inlineStart = processor.GetSourcePosition(slice.Start, out int line, out int column); + + processor.Inline = new MatchingTextInline + { + Span = + { + Start = inlineStart, + End = inlineStart + matchingText.Length + }, + Line = line, + Column = column, + MatchingText = matchingText + }; + + slice.Start = inlineStart + matchingText.Length; + } + + return matchFound; + } + } +}