blog220103. Eclipse text之document的分块partitioning

IDocument的分块partitioning

IDocument支持将整个文档分割成不重叠的子块partition. 块partition用TypedPosition标记, 有3个主要属性,

  • offset, length,
  • patition contentType, 描述的是partition的类型, 可以据此知晓partition的content type.

分割者partitioner

负责完成document分块任务的是分割器partitioner, interface是IDocumentPartitioner, 一般直接使用FastPartitioner. 其相关要点,

  • Partitioner使用partition tokenScanner进行文档分割.
  • 分割的结果保存在IDocument obj中供后续使用, 例如文本样式分析text styling. see AbstractDocument.fPositions.
  • 文档第一次接入partitioner, 以及文档发生变动时, 都会触发partitioner对全文或变动部分进行重新分析, 更新partitioning.
    具体源码see IDocumentPartitioner.documentChange()和IDocumentPartitionerExtension.documentChange2().

扩展点extensionPoint “org.eclipse.core.filebuffers.documentSetup”

partitioner的安装通常使用此extension point, 如下代码(取自eclipse的sample)

   <extension
         id="ExampleJavaDocumentSetupParticipant"
         name="%documentSetupParticipantName"
         point="org.eclipse.core.filebuffers.documentSetup">
      <participant
            extensions="jav"
            class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant">
      </participant>
   </extension>
public class JavaDocumentSetupParticipant implements IDocumentSetupParticipant {
	public JavaDocumentSetupParticipant() {
	}

	@Override
	public void setup(IDocument document) {
		if (document instanceof IDocumentExtension3) {
			IDocumentExtension3 extension3= (IDocumentExtension3) document;
			IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
			extension3.setDocumentPartitioner(JavaEditorExamplePlugin.JAVA_PARTITIONING, partitioner);	//zf, AbstractDocument.setDocumentPartitioner()
			partitioner.connect(document);
		}
	}
}

token扫描器 tokenScanner

tokenScanner负责扫描文本,将其识别成token流. tokenScanner按用途可以分做2类,

  • 用于文档分块的document partitioning. 用于IDocumentPartitioner.
  • 用于区分文本样式的text styling, 例如语法着色. 用于IPresentationReconciler

通常按照先partitioning再text styling的顺序两步scanning, 即由粗到细的顺序分析文本.

Document创建的大致流程

以eclipse打开一个文件为例,

  • eclipse根据文件名, 文件名后缀, 和contentType等信息决定适用的editor.
  • EditorReference在editor初始化时将editorInput注入到editor中.
  • editor(super AbstractDecoratedTextEditor)查找DocumentProviderRegistry,生成TextFileDocumentProvider
  • editor(super AbstractDecoratedTextEditor)调用TextFileDocumentProvider.connect()
  • TextFileDocumentProvider.connect()会使用ResourceTextFileBufferManager, 生成SynchronizableDocument, 并读入文件内容
  • 调用FastPartitoner, 使用partitionScanner分块该document.

驽马一架 一花一世界 2022/1/3 @ CSDN

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值