public IDfmFencesBlockPathQueryOption ParsePathQueryString(string queryOrFragment, bool noCache = false) { if (string.IsNullOrEmpty(queryOrFragment)) { return(null); } return(_pathQueryOptionCreaters.ParseQueryOrFragment(DfmFencesBlockPathQueryOptionParameters.Create(queryOrFragment), noCache)); }
public IDfmFencesBlockPathQueryOption ParseQueryOrFragment(DfmFencesBlockPathQueryOptionParameters parameters, bool noCache) { foreach (var creater in _pathQueryOptionCreaters) { var option = creater.ParseQueryOrFragment(parameters, noCache); if (option != null) { return(option); } } throw new NotSupportedException($"Unable to parse DfmFencesBlockPathQueryOptionParameters"); }
public static DfmFencesBlockPathQueryOptionParameters Create(string queryAndFragment) { var result = new DfmFencesBlockPathQueryOptionParameters(); if (string.IsNullOrEmpty(queryAndFragment)) { return(result); } var queryOption = queryAndFragment.Remove(1); var queryString = queryAndFragment.Substring(1); int startLine, endLine; if (queryOption == "#") { // check if line number representation var match = _dfmFencesSharpQueryStringRegex.Match(queryString); if (match.Success && int.TryParse(match.Groups["start"].Value, out startLine) && int.TryParse(match.Groups["end"].Value, out endLine)) { result.LinePairs.Add(new Tuple <int?, int?>(startLine, endLine)); } else { result.TagName = queryString; } } else if (queryOption == "?") { var collection = HttpUtility.ParseQueryString(queryString); result.TagName = collection[TagNameQueryStringKey]; result.HighlightLines = collection[HighlightLinesQueryStringKey]; var start = int.TryParse(collection[StartLineQueryStringKey], out startLine) ? startLine : (int?)null; var end = int.TryParse(collection[EndLineQueryStringKey], out endLine) ? endLine: (int?)null; var range = collection[RangeQueryStringKey]; if (collection[DedentQueryStringKey] != null) { if (int.TryParse(collection[DedentQueryStringKey], out int dedentTemp)) { result.DedentLength = dedentTemp; } else { Logger.LogWarning($"Illegal dedent `{collection[DedentQueryStringKey]}` in query parameter `dedent`. Auto-dedent will be applied."); } } if (range != null) { var regions = range.Split(RegionSeparatorInRangeQueryString); if (regions != null) { foreach (var region in regions) { var match = _dfmFencesRangeQueryStringRegex.Match(region); if (match.Success) { // consider region as `{startlinenumber}-{endlinenumber}`, in which {endlinenumber} is optional result.LinePairs.Add(new Tuple <int?, int?>( int.TryParse(match.Groups["start"].Value, out startLine) ? startLine : (int?)null, int.TryParse(match.Groups["end"].Value, out endLine) ? endLine : (int?)null )); } else { // consider region as a sigine line number var tempLine = int.TryParse(region, out int line) ? line : (int?)null; result.LinePairs.Add(new Tuple <int?, int?>(tempLine, tempLine)); } } } } else if (start != null || end != null) { result.LinePairs.Add(new Tuple <int?, int?>(start, end)); } } return(result); }