Как программно найти начало текстового содержимого в форматированном тексте? - PullRequest
0 голосов
/ 23 января 2020

Я пытаюсь создать программу, которая читает текст как форматированный текст и выводит его, используя Markdown. Я скопировал следующий абзац в RichTextBox (выделение сохранено из оригинала)

Необходимый компонент повествований и повествования . Когда автор рассказа (будь то писатель, оратор, режиссер или другой) передает историю своей аудитории, аудитория может создать внутреннее представление мир, в котором происходит история («мир истории»). То, как аудитория делает это, зависит от того, какие аспекты мира автор решит явно включить в повествование, такие как персонажи и характеристики, настройки и их описания, а также информацию о мире истории, которую аудитория может не знать.

И когда я читаю свойство RichTextBox.Rtf, оно выглядит так (выделено для демонстрации):

{\ rtf1 \ fbidis \ ansi \ ansicpg1252 \ deff0 \ deflang2057 {\ fonttbl {\ f0 \ fswiss \ fprq2 \ fcharset0 Arial;} {\ f1 \ froman \ fprq2 \ fcharset0 Times New Roman;}} {\ colortbl; \ red0 \ green0 \ blue0;} \ viewkind4 \ uc1 \ pard \ ltrpar \ cf1 \ f0 \ fs22 Необходимый компонент \ b повествования и рассказывания \ b0. Когда \ b автор \ b0 рассказа (будь то писатель, оратор, кинематографист или кто-либо еще) передает рассказ своей аудитории, \ b аудитории \ b0 разрешается построить внутреннее представление о мире, в котором история происходит (мир истории \ ldblquote \ rdblquote). То, как аудитория делает это, зависит от того, какие аспекты мира автор решит явно включить в повествование, такие как персонажи и характеристики, настройки и их описания, а также информацию о мире истории, которую аудитория может не знать. \ cf0 \ f1 \ fs24 \ par \ pard \ ltrpar \ sa160 \ sl252 \ slmult1 \ fs22 \ par \ pard \ ltrpar \ cf1 \ f0 \ par}

Я хочу извлечь текстовое содержимое из этого Rtf string - мне не интересны биты кода до и после Rtf, все, что я хочу знать, - это полужирный шрифт, itali c и другое форматирование. Я пытаюсь определить, как определить , где начинается текст для любого данного данного абзаца.

Как человек, я, очевидно, знаю, где начинается текст - сразу после раздела Я смел Я не знаю, как сказать моей программе, что искать, хотя. Я почти уверен, что код rtf в начале абзаца различен для каждого абзаца, поэтому я не могу просто сказать своей программе найти этот конкретный код и удалить его.

Что-то еще, о чем я думал, было поиск первых n символов в исходном абзаце в выводимом rtf, например, поиск «необходимого компонента». Но если любое из этих первых слов выделено жирным шрифтом, оно не будет выглядеть одинаково в выводе rtf, поэтому этот подход также не будет работать согласованно.

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

Я использую VB. NET в Winforms, поэтому предпочел бы ответ в VB. NET или псевдокод.

1 Ответ

0 голосов
/ 23 января 2020

Ну, это супер джанки, но у меня есть решение моих проблем.

Я нашел эту статью , которая имеет полную функцию, написанную на VB. NET для преобразования RTF к HTML.

Тогда я только что сделал это, который берет полученный результат HTML из этой функции и преобразует его в уценку. Пока что работает отлично.

    If InputRTB.Text <> "" Then
        Dim input As String = InputRTB.Text
        Dim output As String = ""

        output = sRTF_To_HTML(InputRTB.Rtf)

        output = output.Substring(output.IndexOf("<span style"))
        output = output.Substring(output.IndexOf(">") + 1)
        Dim endpos = output.IndexOf("</span>")
        output = output.Remove(endpos, output.Length - endpos)


        Dim foundAllBold As Boolean = False
        Dim boldWords As New List(Of String)
        Do
            If output.Contains("<b>") Then
                Dim startb = output.IndexOf("<b>")
                Dim endb = output.IndexOf("</b>")
                Dim word = Trim(output.Substring(startb + 3, endb - startb - 3))
                If word <> "" Then
                    Dim wordArray() As Char = word.ToCharArray
                    wordArray(0) = Char.ToUpper(wordArray(0))
                    word = New String(wordArray)
                End If

                boldWords.Add(word)
                output = Replace(output, "<b>", "**", , 1)
                output = Replace(output, "</b>", "**", , 1)
            Else
                foundAllBold = True
            End If
        Loop Until foundAllBold = True

        output = output.Replace(vbCrLf, " ")

        OutputRTB.Text = output

        WordListRTB.Clear()

        For Each b As String In boldWords
            WordListRTB.AppendText(b & vbCrLf)
        Next

        Clipboard.SetText(OutputRTB.Text)
        MsgBox("Copied output to clipboard")

    End If
...