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