【问题标题】:How to programmatically find the start of the text content within rich text?如何以编程方式在富文本中查找文本内容的开头?
【发布时间】:2020-01-23 10:32:25
【问题描述】:

我正在尝试创建一个程序,它将文本作为富文本读取,并使用 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 字符串中提取文本内容——我对 Rtf 之前和之后的代码位不感兴趣,我只想知道粗体、斜体和其他格式。不过,我正在尝试解决如何确定任何此类给定段落的文本开始位置

作为一个人,我显然知道文本从哪里开始——就在我加粗的部分之后。我不知道如何告诉我的程序要寻找什么。我很确定段落开头的 rtf 代码对于每个段落都是不同的,所以我不能只告诉我的程序找到这个特定的代码并删除它。

我想到的其他事情是在输出的 rtf 中搜索原始段落中的前 n 个字符,例如搜索“一个必要的组件”。但是,如果这些第一个单词中的任何一个被加粗,它在 rtf 输出中看起来就不一样了,所以这种方法也不会始终如一地工作。

我确定我错过了一个明显的解决方案,但如果有人知道我如何巧妙地计算出我的文本内容的开始和结束位置,我会很高兴。

我在 Winforms 中使用 VB.NET,所以更喜欢 VB.NET 或伪代码的答案。

【问题讨论】:

  • 为什么要进行离题的近距离投票?这是一个关于编程的问题,可以使用编程来回答。另外,为什么开车投反对票?如果这个问题有什么可以改进的地方,请随时输入,我会尝试改进这个问题。
  • 您可以查看How do I convert an RTF string to a Markdown string...的答案中提到的实用程序的源代码。
  • 谢谢,这使我找到了this article,它基本上为我提供了将 RTF 转换为 HTML 的功能,这是成功的一半。现在应该更容易将 HTML 解析为 markdown,希望 ...

标签: vb.net winforms richtextbox richtext


【解决方案1】:

嗯,这太麻烦了,但我已经找到了解决问题的方法。

我找到了this article,它有一个用VB.NET编写的完整功能,可以将RTF转换为HTML。

然后我就这样做了,它从该函数获取生成的 HTML 输出并将其转换为 markdown。到目前为止,它运行良好。

    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多