Динамически генерировать ссылку на страницу и выделять текст с помощью плагина «Фрагмент ссылки на текст»

#c#

#c#

Вопрос:

Я пытаюсь сгенерировать функцию, которая может генерировать URL-адрес ссылки на текст на основе этого плагина выделения текста — ссылка на фрагмент текста для HTML-страниц

Программно генерировать ссылку на выделяемый абзац.

Я полагаю, что могут быть некоторые лучшие алгоритмы, которые уже доступны, чтобы мне не приходилось снова изобретать велосипед.

Например, создайте функцию C #, которая принимает URL-адрес и абзац (для выделения) и возвращает textHighlighterurl.

 [Fact]
        public void GettextHighlighterURL()
        {
            string initialFileUrl = "https://learn.microsoft.com/en-us/azure/cognitive-services/cognitive-services-and-machine-learning";
            string answer = "Machine learning is a concept where you bring together data and an algorithm to solve a specific need. Once the data and algorithm are trained, the output is a model that you can use again with different data. The trained model provides insights based on the new data." 
                 "[Machine Learning](https://learn.microsoft.com/en-us/azure/cognitive-services/cognitive-services-and-machine-learning)";
            string actual = HighlighterHelper.GetTextHighLighterUrl(initialFileUrl, answer);
            string expected= "https://learn.microsoft.com/en-us/azure/cognitive-services/cognitive-services-and-machine-learning#object:~:text=Machine learning is a concept ,insights based on the new data."
            Assert.Equal(expected, actual);
        }
  

Ниже опубликовано то, что я пробовал до сих пор, и это работает только в 10% случаев. Как я могу улучшить отсюда? Я полагаю, что могут быть некоторые лучшие алгоритмы, которые уже доступны, чтобы мне не приходилось снова изобретать велосипед.

 public string GetTextHighLighterUrl(string firstValidFileUrl, string answer)
{
var sb = new StringBuilder();
var textHighLighterUrl = string.Empty;
var highlightText = answer.Replace(firstValidFileUrl, "");
highlightText = highlightText.Replace("()", "");
highlightText = $"{Regex.Replace(highlightText, @"[[^]]*]", "")}"; // remove text within square brackets.
highlightText = $"{Regex.Replace(highlightText, @"t|r", "$$")}";
highlightText = RemoveExtraSentences(highlightText, "$$").Trim();
highlightText = highlightText.Replace("$$", "");
highlightText = FilterWhiteSpaces(highlightText);
highlightText = highlightText.Replace("$", "");
highlightText = highlightText.Replace("(/)", "");
highlightText = highlightText.Replace(""", "%22");
highlightText = highlightText.Replace(",", "%2C");

        if (!ContainsOnlyAlphaNumericCharacters(highlightText))
        {
            //remove sentences with special char and get a safe sentence
            highlightText = GetCleanSentence(highlightText);
        }


        if (highlightText.Length > 50)
        {
            var textArrayn = highlightText.Split("n"); //if ans contains n
            if (highlightText.Contains("n") amp;amp; textArrayn?.Length == 2)
            {
                textArrayn = highlightText.Split("n");
            }
            else
            {
                textArrayn = new List<string>().ToArray();
            }
            var textArray = highlightText.Split();
            var n = textArray.Length;
            sb.Clear();
            for (int i = 0; i < 5; i  )
            {
                if (IsValidIndex(i, textArray))
                {
                    sb = sb.Append(textArray[i]   "%20");
                }
            }
            var start = sb.ToString();
            if (start.Contains(","))
            {
                var tempStart = start.Split(",");
                start = tempStart[0].ToString();
            }


            if (textArrayn.Length > 0)
            {
                start = textArrayn[0].ToString();  //if ans contains n then start from there
            }
            sb.Clear();
            for (int i = n - 6; i <= n; i  )
            {
                if (IsValidIndex(i, textArray))
                {
                    if (i != n - 1)
                    {
                        sb = sb.Append(textArray[i]   "%20");
                    }
                    else
                    {
                        sb = sb.Append(textArray[i]);
                    }

                }
            }
            var end = sb.ToString().Trim();
            end = end.Replace(",", "%2C");
            sb.Clear();
            sb = sb.Append(firstValidFileUrl).Append("#object:~:text=").Append(start).Append(",").Append(end);
            textHighLighterUrl = sb.ToString();
            sb.Clear();
        }
        else
        {
            sb.Clear();
            highlightText = highlightText.Replace(" ", " ");
            if (!string.IsNullOrEmpty(highlightText))
            {
                sb = sb.Append(firstValidFileUrl).Append("#object:~:text=").Append(highlightText);
            }
            else
            {
                sb = sb.Append(firstValidFileUrl);
            }

            textHighLighterUrl = sb.ToString();
            sb.Clear();
        }
        textHighLighterUrl = $"{Regex.Replace(textHighLighterUrl, @".{2,}", "")}";//edge cases.Remove Multiple dots
        textHighLighterUrl = textHighLighterUrl.Replace(", ,", ",");

        return textHighLighterUrl;
    }
  

Комментарии:

1. Вам нужно будет создать несколько тестов с минимальными данными, чтобы показать, чего вы хотите достичь, поскольку мне трудно понять, каковы входные данные или какими вы ожидаете получить результаты

2. @MichalCiechan добавил один тестовый пример

Ответ №1:

Я не знаю, полностью ли я понимаю, чего вы пытаетесь достичь, но попробуйте этот код:

Учитывая ваши входные данные, он вернет эту ссылку: https://learn.microsoft.com/en-us/azure/cognitive-services/cognitive-services-and-machine-learning#:~:text=Machine learning is a, based on the new data.

 using System.Web;

    // #:~:text=[prefix-,]textStart[,textEnd][,-suffix]
    private string Go(string url, string text)
    {
        int SEGMENT_SIZE = 20;

        //remove everything after last bracket
        text = Regex.Replace(text, @"[(?:.(?![)) $", "");

        string link;
        if (text.Length < 100)
        {
            link = $"{url}#:~:text={Uri.EscapeUriString(text)}";
        }
        else
        {
            var startBreak = text.IndexOf(" ", SEGMENT_SIZE);
            var endBreak = text.Substring(0, text.Length - SEGMENT_SIZE).LastIndexOf(" ");

            link = $"{url}#:~:text={Uri.EscapeUriString(text.Substring(0, startBreak))},{Uri.EscapeUriString(text.Substring(endBreak))}";
        }

        return link;
    }