编辑文本文档
上一节已经讨论了用于编辑文本文档的各种选项,并重点介绍了 com.sun.star.text.TextPortion 和 com.sun.star.text.Paragraph 服务,它们分别授权访问段落部分和段落。这些服务适于通过一次循环编辑文本内容的应用程序。不过,这对于很多问题来说是不够的。Apache OpenOffice 提供了 com.sun.star.text.TextCursor 服务以完成更复杂的任务,其中包括在文档中向后浏览,或基于句子和词而非 TextPortions 进行浏览。
TextCursor
Apache OpenOffice API 中的 TextCursor 相当于 Apache OpenOffice 文档中使用的可见光标。它标记文本文档中的某一位置,可通过使用命令按不同方向进行浏览。不过,不应将 Apache OpenOffice Basic 中提供的 TextCursor 对象与可见光标相混淆。它们完全是两回事。
与 VBA 中使用的术语不同:就功能范围而言,VBA 中的 Range 对象相当于 Apache OpenOffice 中的 TextCursor 对象,却与 Apache OpenOffice 中的 Range 对象不同,尽管从名字上看似乎如此。 |
例如,Apache OpenOffice 中的 TextCursor 对象提供了用于浏览和更改文本的方法;VBA 的 Range 对象中也提供了这些方法(如 MoveStart、MoveEnd、InsertBefore、InsertAfter)。以下几节将介绍 Apache OpenOffice 中的 TextCursor 对象的相关内容。
在文本中浏览
Apache OpenOffice Basic 中的 TextCursor 对象与文本文档中的可见光标是相互独立的。以程序控制的方式更改 TextCursor 对象的位置不会对可见光标带来任何影响。甚至可以为同一文档打开几个 TextCursor 对象,并在不同位置中相互独立地使用这些对象。
TextCursor 对象是使用 createTextCursor 调用创建的:
Dim Doc As Object Dim Cursor As Object Doc = StarDesktop.CurrentComponent Cursor = TextDocument.Text.createTextCursor()
以这种方式创建的 Cursor 对象支持 com.sun.star.text.TextCursor 服务,而该服务又提供了在文本文档中进行浏览的各种方法。以下示例先将 TextCursor 向左移动十个字符,然后再向右移动三个字符:
Cursor.goLeft(10, False) Cursor.goRight(3, False)
TextCursor 可以突出显示一个完整的区域。这相当于使用鼠标突出显示文本中的某一位置。以上函数调用中的 False 参数指定了是否突出显示光标移动所经过的区域。例如,以下示例中的 TextCursor
Cursor.goLeft(10, False) Cursor.goRight(3, True)
先向右移动十个字符而不突出显示经过的区域,然后再向回移动三个字符并突出显示经过的区域。因此,TextCursor 突出显示的区域从文本中的第 7 个字符后面开始,并在第 10 个字符后面结束。
下面是 com.sun.star.text.TextCursor 服务提供的主要浏览方法:
- goLeft (Count, Expand)
- 向左跳 Count 个字符。
- goRight (Count, Expand)
- 向右跳 Count 个字符。
- gotoStart (Expand)
- 跳至文本文档开头。
- gotoEnd (Expand)
- 跳至文本文档结尾。
- gotoRange (TextRange, Expand)
- 跳至指定的 TextRange 对象。
- gotoStartOfWord (Expand)
- 跳至当前词的开头。
- gotoEndOfWord (Expand)
- 跳至当前词的结尾。
- gotoNextWord (Expand)
- 跳至下一个词的开头。
- gotoPreviousWord (Expand)
- 跳至上一个词的开头。
- isStartOfWord ()
- 如果 TextCursor 位于词的开头,则返回 True。
- isEndOfWord ()
- 如果 TextCursor 位于词的结尾,则返回 True。
- gotoStartOfSentence (Expand)
- 跳至当前句子的开头。
- gotoEndOfSentence (Expand)
- 跳至当前句子的结尾。
- gotoNextSentence (Expand)
- 跳至下一个句子的开头。
- gotoPreviousSentence (Expand)
- 跳至上一个句子的开头。
- isStartOfSentence ()
- 如果 TextCursor 位于句子的开头,则返回 True。
- isEndOfSentence ()
- 如果 TextCursor 位于句子的结尾,则返回 True。
- gotoStartOfParagraph (Expand)
- 跳至当前段落的开头。
- gotoEndOfParagraph (Expand)
- 跳至当前段落的结尾。
- gotoNextParagraph (Expand)
- 跳至下一个段落的开头。
- gotoPreviousParagraph (Expand)
- 跳至上一个段落的开头。
- isStartOfParagraph ()
- 如果 TextCursor 位于段落的开头,则返回 True。
- isEndOfParagraph ()
- 如果 TextCursor 位于段落的结尾,则返回 True。
文本根据句子符号被划分为句子。例如,将句点解释为表示句子结尾的符号。
Expand 参数是一个布尔值,它指定了是否突出显示浏览期间经过的区域。此外,所有浏览方法都会返回一个参数,以指定浏览是否成功,或者该操作是否由于缺少文本而终止。
下面列出了几种方法,用于编辑使用 TextCursor 突出显示的区域,这些方法也支持 com.sun.star.text.TextCursor 服务:
- collapseToStart ()
- 重置突出显示并将 TextCursor 置于上次突出显示的区域开头。
- collapseToEnd ()
- 重置突出显示并将 TextCursor 置于上次突出显示的区域结尾。
- isCollapsed ()
- 如果 TextCursor 当前未包含任何突出显示区域,则返回 True。
使用 TextCursor 设置文本格式
com.sun.star.text.TextCursor 服务支持本章开头介绍的所有字符和段落属性。
以下示例说明了如何将这些属性与 TextCursor 一起使用。它遍历整个文档,并将每个句子的第一个词设置为粗体格式。
Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) Cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed
该示例先为已打开的文本创建一个文档对象。然后,逐句遍历整个文本,突出显示每个句子的第一个词并将其设置为粗体格式。
检索和修改文本内容
如果 TextCursor 包含突出显示区域,则可通过 TextCursor 对象的 String 属性获取此文本。以下示例使用 String 属性在消息框中显示句子的第一个词:
Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) MsgBox Cursor.String Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed
可以按相同的方式使用 String 属性修改每个句子的第一个词:
Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Do Cursor.gotoEndOfWord(True) Cursor.String = "Ups" Proceed = Cursor.gotoNextSentence(False) Cursor.gotoNextWord(False) Loop While Proceed
如果 TextCursor 包含突出显示区域,则会将其替换为赋给 String 属性的新文本。如果没有突出显示区域,则在当前 TextCursor 位置插入该文本。
插入控制代码
在某些情况下,并不需要修改文档的实际文本,而是需要修改其结构。为此,Apache OpenOffice 提供了控制代码。这些代码可插入到文本中并影响其结构。控制代码是在 com.sun.star.text.ControlCharacter 常量组中定义的。Apache OpenOffice 中提供了以下控制代码:
- PARAGRAPH_BREAK
- 段落分隔符。
- LINE_BREAK
- 段落内的换行符。
- SOFT_HYPHEN
- 可能的音节划分点。
- HARD_HYPHEN
- 必需的音节划分点。
- HARD_SPACE
- 在对齐文本中不能扩展或压缩的受保护空格。
要插入控制代码,不仅需要光标,而且还需要关联的文本文档对象。以下示例在文本的第 20 个字符后面插入一个段落:
Dim Doc As Object Dim Cursor As Object Dim Proceed As Boolean Doc = StarDesktop.CurrentComponent Cursor = Doc.Text.createTextCursor Cursor.goRight(20, False) Doc.Text.insertControlCharacter(Cursor, _ com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK, False)
insertControlCharacter 方法调用中的 False 参数可确保在插入操作后保留 TextCursor 当前突出显示的区域。如果此处传递的是 True 参数,insertControlCharacter 将替换当前文本。
搜索文本部分
在很多情况下,需要在文本中搜索特定的词并编辑相应的位置。所有 Apache OpenOffice 文档都提供了一个特殊接口以实现此目的,该接口始终遵循相同的原则:在执行搜索过程之前,必须先创建通常称为 SearchDescriptor 的内容。它定义了 Apache OpenOffice 在文档中搜索的内容。SearchDescriptor 是一个支持 com.sun.star.util. SearchDescriptor 服务的对象,可通过文档的 createSearchDescriptor 方法创建该对象:
Dim SearchDesc As Object SearchDesc = Doc.createSearchDescriptor
在创建 SearchDescriptor 后,它将接收要搜索的文本:
SearchDesc.searchString="any text"
就功能而言,SearchDescriptor 与 Apache OpenOffice 中的搜索对话框最为相似。可以按照与搜索窗口类似的方式,在 SearchDescriptor 对象中设置搜索所需的设置。
com.sun.star.util.SearchDescriptor 服务提供了以下属性:
- SearchBackwards (Boolean)
- 在文本中向后搜索,而不是向前搜索。
- SearchCaseSensitive (Boolean)
- 在搜索时区分大小写字符。
- SearchRegularExpression (Boolean)
- 按照与正则表达式相同的处理方式处理搜索表达式。
- SearchStyles (Boolean)
- 在文本中搜索指定的段落模板。
- SearchWords (Boolean)
- 仅搜索完整的词。
Apache OpenOffice Basic 中还提供了 Apache OpenOffice SearchSimilarity(或“模糊匹配”)功能。通过使用该功能,Apache OpenOffice 可以搜索与搜索表达式类似但不完全相同的表达式。可以为这些表达式单独定义要添加、删除和修改的字符数。下面是 com.sun.star.util.SearchDescriptor 服务的关联属性:
- SearchSimilarity (Boolean)
- 执行类似搜索。
- SearchSimilarityAdd (Short)
- 可以为类似搜索添加的字符数。
- SearchSimilarityExchange (Short)
- 可以作为类似搜索一部分替换的字符数。
- SearchSimilarityRemove (Short)
- 可以作为类似搜索一部分删除的字符数。
- SearchSimilarityRelax (Boolean)
- 同时考虑搜索表达式中的所有偏差规则。
在按照要求准备好 SearchDescriptor 后,便可以将其应用于文本文档。为此,Apache OpenOffice 文档提供了 findFirst 和 findNext 方法:
Found = Doc.findFirst (SearchDesc) Do While Found ' Suchergebnis bearbeiten Found = Doc.findNext( Found.End, Search) Loop
该示例通过循环查找所有匹配项并返回 TextRange 对象,该对象引用找到的文本段。
示例:类似搜索
以下示例说明了如何在文本中搜索 "turnover" 一词,并将搜索结果设置为粗体格式。示例中使用了类似搜索,这样不仅可以查找 "turnover" 一词,而且还可以查找复数形式 "turnovers" 以及略有偏差的内容(如 "turnover's")。找到的表达式与搜索表达式最多有两个字母不同:
Dim SearchDesc As Object Dim Doc As Object Doc = StarDesktop.CurrentComponent SearchDesc = Doc.createSearchDescriptor SearchDesc.SearchString="turnover" SearchDesc.SearchSimilarity = True SearchDesc.SearchSimilarityAdd = 2 SearchDesc.SearchSimilarityExchange = 2 SearchDesc.SearchSimilarityRemove = 2 SearchDesc.SearchSimilarityRelax = False Found = Doc.findFirst (SearchDesc) Do While Found Found.CharWeight = com.sun.star.awt.FontWeight.BOLD Found = Doc.findNext( Found.End, Search) Loop
与 Apache OpenOffice 中的旧 API 一样,新 API 中的文本搜索和替换也是使用文档对象执行的。以前有一个称为 SearchSettings 的对象,专门用于定义搜索选项;而在新对象中,现在使用 SearchDescriptor 对象执行搜索或使用 ReplaceDescriptor 对象自动替换文本。这些对象不仅包含选项,而且包含当前搜索文本,必要时还包含关联的替换文本。描述符对象将使用文档对象创建,根据相关要求完成,然后作为搜索方法的参数传送回文档对象。
替换文本部分
与搜索功能一样,Apache OpenOffice Basic 中还提供了 Apache OpenOffice 中的替换功能。这两种功能的处理方式相同。替换过程也需要先创建一个记录过程参数的特殊对象。该对象称为 ReplaceDescriptor,它支持 com.sun.star.util.ReplaceDescriptor 服务。ReplaceDescriptor 也支持上一段落中介绍的所有 SearchDescriptor 属性。例如,在替换过程中,也可以激活和停用区分大小写,以及执行类似搜索。
以下示例说明了如何使用 ReplaceDescriptors 在 Apache OpenOffice 文档中执行搜索。
Dim I As Long Dim Doc As Object Dim Replace As Object Dim BritishWords(5) As String Dim USWords(5) As String BritishWords() = Array("colour", "neighbour", "centre", "behaviour", _ "metre", "through") USWords() = Array("color", "neighbor", "center", "behavior", _ "meter", "thru") Doc = StarDesktop.CurrentComponent Replace = Doc.createReplaceDescriptor For O = 0 To 5 Replace.SearchString = BritishWords(I) Replace.ReplaceString = USWords(I) Doc.replaceAll(Replace) Next n
用于搜索和替换的表达式是使用 ReplaceDescriptors 的 SearchString 和 ReplaceString 属性设置的。实际替换过程最终是使用文档对象的 replaceAll 方法实现的,该方法替换搜索表达式的所有实例。
示例:使用正则表达式搜索和替换文本
Apache OpenOffice 的替换功能在与正则表达式结合使用时尤其有效。这些表达式提供了使用占位符和特殊字符定义变量搜索表达式的选项,而不是使用固定值进行定义。
Apache OpenOffice 联机帮助部分中详细介绍了 Apache OpenOffice 支持的正则表达式。下面是几个示例:
- 搜索表达式中的句点表示任意字符。因此,搜索表达式 sh.rt 可以表示 shirt 和 short。
- 字符 ^ 标记段落的开头。因此,可以使用搜索表达式 ^Peter 查找位于段落开头的名字 Peter 的所有实例。
- 字符 $ 标记段落的结尾。因此,可以使用搜索表达式 Peter$ 查找位于段落结尾的名字 Peter 的所有实例。
- 字符 * 表示前面的字符可以重复出现若干次。可以将其与句点一起使用以作为任意字符的占位符。例如,temper.*e 表达式可以表示表达式 temperance 和 temperature。
以下示例说明了如何借助正则表达式 ^$ 删除文本文档中的所有空行:
Dim Doc As Object Dim Replace As Object Dim I As Long Doc = StarDesktop.CurrentComponent Replace = Doc.createReplaceDescriptor Replace.SearchRegularExpression = True Replace.SearchString = "^$" Replace.ReplaceString = "" Doc.replaceAll(Replace)
Content on this page is licensed under the Public Documentation License (PDL). |