第八章、epub文件处理 -- 定位指定段落


https://github.com/geometer/FBReaderJ

第八章、epub文件处理 -- 定位指定段落

 

上一章中我们介绍了用ZLTextPlainModel类里的char数组存储.xhtml文件中的文本信息以及标签信息的流程。

本章中我们将介绍从ZLTextPlainModel类里的char数组中定位指定段落的流程。

 

本章涉及的核心类是Processor类(ZLTextParagraphCursor类内部类)、EntryIteratorImpl类(ZLTextPlainModel类内部类)

 

定位到指定段落需要两个方法互相配合:ZLTextParagraphCursor类的cursor方法和ZLTextPage类的moveStartCursor方法

ZLTextParagraphCursor类的cursor方法负责填充代表指定段落的ZLTextParagraphCursor类。在这个过程中,char数组中代表指定段落的部分转换成一个由ZLTextElement类组成的ArrayList。其中,段落中的文本信息会被转换成ZLTextElement类的子类ZLTextWord,而段落中的标签信息会被转换成ZLTextElement类的子类ZLTextControlElement

ZLTextPage类的moveStartCursor方法负责定位到指定的段落。定位的过程主要是维护ZLTextPage类中的StartCursor属性指向的ZLTextWordCursor类。ZLTextWordCursor类中的三个属性myParagraphCursormyElementIndexmyCharIndex结合起来就完成来了定位到指定段落的流程。这三个属性中,myParagraphCursor属性指向的就是代表指定段落的ZLTextParagraphCursor类。

 

当定位流程完成之后,char数组中涉及当前段落的部分会被转换成一个由ZLTextElement子类组成的ArrayList中。这个ArrayList存储在ZLTextParagraphCursor类中的myElements属性中。而同时,ZLTextParagraphCursor这个类又存储在ZLTextPage类的StartCursor属性中。

PS:整个定位流程其实也可以看成ZLTextElement子类 -> ZLTextParagraphCursormyElements属性 -> ZLTextPageStartCursor属性不断上推的过程。

 

下面我们结合ZLTextViewsetModel方法详细介绍下调用这两个方法定位到定段落的具体流程:



ZLTextParagraphCursor类 cursor方法

cursor方法的第一个参数为解析xhtml文件得到的ZLTextPlainModel类(第七章中有详细介绍),第二个参数为当前要显示的段落的索引(初始时这个索引为0

接着cursor方法以同样的参数调用了ZLTextParagraphCursor类的构造函数


ZLTextParagraphCursor构造函数

    ZLTextParagraphCursor构造函数调用了本类的fill方法,这个方法首先调用了ZLTextPlainModel类的getParagraph方法,接着又调用了Processor类的fill方法

ZLTextPlainModel类的getParagraph方法:

这个方法的作用是初始化了一个ZLTextParagraphImpl类,并定义了这个类中的myModel属性(指向ZLTextPlainModel)与myIndex属性(当前要显示的段落的索引)

           


Processor类(ZLTextParagraphCursor内部类)fill方法

这个方法将最终完成将char数组中代表当前段落的部分转换成一个元素为ZLTextElement类的ArrayList的工作。

方法大致流程是:首先通过EntryIteratorImpl类的构造方法获得正在处理的段落具体在char数组的哪个部分(67行)。然后,利用EntryIteratorImplnext方法在char数组的这个部分里面不断读取内容并进行操作(71行)。操作分为针对文本信息(75行)和针对标签信息(84行)两种。线面在详细描述着两个方法。

     


    EntryIteratorImpl类(ZLTextPlainModel内部类)构造函数

    这个构造方法的作用就是利用当前段落的索引从ZLTextPlainModel类的三个属性指向的int数组中的当前段落在char数组的哪一部分中。
    这三个属性我们已经在第七章中有介绍过了。
    myStartEntryIndices属性指向的int数组记录了每个段落具体在CachedCharStorage类内部的哪一个char数组里面;
    myStartEntryOffsets属性指向的int数组记录了每个段落从CachedCharStorage类内部char数组的哪个位置开始;
    myParagraphLengths属性指向的int数组记录每个段落在CachedCharStorage类内部char数组中占据多少长度;


    EntryIteratorImpl类(ZLTextPlainModel内部类)next方法

    这个方法会在char数组的代表当前段落的部分里面不断读取内容并进行操作。

    在读取的过程中首先会通过CachedCharStorage类的block方法获取对应需要显示的段落的char数组(125行),获取对应的char数组之后,代码就会利用不断递增的dataOffset变量,不断读取char数组中的内容。一旦代码读取到代表文本信息或标签信息的标示,就会进入不同的流程。

    PS:我们曾在上一章中介绍过这两种标示,当时我们是这么介绍的:“每次调用addControl方法都会加入ZLTextParagraph.Entry.CONTROL3)这个常量,这个常量是一种标示。类似的标示还有常量ZLTextParagraph.Entry.TEXT1),我们会在下一章用到这两种变量”。

    

    CachedCharStorage类的block方法:

    我们在上一章中介绍CachedCharStorage类的时候,曾经说过“char数组的长度最长不会超过这个长度(65536),一旦超过这个长度,代码就会新建一个char数组,同时旧的数组会被持久化以便以后再用。”所以当前在内存中的char数组不一定会包含需要显示的数组,如果不包含需要显示的数组就需要根据ZLTextWritablePlainModel类的myStartEntryIndices属性找到对应的char数组。(这个属性的具体介绍也可以在上一章中找到)

    获取到包含需要显示的段落的char数组后,代码就会利用不断递增的dataOffset变量,不断读取char数组中的内容。一旦代码读取到代表文本信息或标签信息的标示,就会进入不同的流程。   

         

    获取到包含需要显示的段落的char数组后,代码就会利用不断递增的dataOffset变量,不断读取char数组中的内容。一旦代码读取到代表文本信息或标签信息的标示,就会进入不同的流程。


    文本信息(ZLTextParagraph.Entry.TEXT

    遇到代表文本的ZLTextParagraph.Entry.TEXT标示的情况:

    这种情况下,代码会对分在这个标示之后的文本信息会进行两部分处理,一部分处理在EntryIteratorImplnext方法中进行,一部分在Processor类的fill方法中进行

    在EntryIteratorImplnext方法中,会赋值两个EntryIteratorImpl类的两个变量。myTextLength属性记录文本信息的长度,myTextData属性存储当前char数组的引用。最后还通过赋值dataOffset,在char数组中向前跳过了涉及这段文本信息的部分。

    

    在Processorfill方法会调用本类的processTextEntry方法

    

    在processTextEntry方法中代码利用一个for循环,一个一个读取char数组中的元素,然后对每个元素调用Processor类的addWord方法。请注意,调用addWord方法时的参数。

    

    addWord方法会初始化一个ZLTextWord类,然后将这个类加入ZLTextParagraphCursormyElements属性指向的ArrayList

    
    
请注意对比下ZLTextWord类构造函数与调用addWord方法时的参数
    


    标签信息(ZLTextParagraph.Entry.CONTORL

遇到代表文本的ZLTextParagraph.Entry.CONTORL标示的情况:

这种情况下,代码同样也会对跟在这个标示之后的标签信息会进行两部分处理,一部分处理在EntryIteratorImplnext方法中进行,一部分在Processor类的fill方法中进行

EntryIteratorImplnext方法会赋值三个属性,请尤其注意下myControlIsStart这个属性,我们会在处理样式的时候用到这个属性。

    

    Processor类的fill方法会初始化一个ZLTextWord类,然后将这个类加入ZLTextParagraphCursormyElements属性指向的ArrayList

当代码从ZLTextParagraphCursor类 cursor方法返回是,我们会得到新建的ZLTextParagraphCursor类,这个类中的myElements属性指向的ArrayList已经被填充了代表当前段落中文本信息的ZLTextWord类与标签信息的ZLTextControlElement类。接着就会进入ZLTextPage类的moveStartCursor方法。


ZLTextPage类的moveStartCursor方法

这个方法比较简单,其实就是将通过ZLTextParagraphCursor类的cursor方法填充好的ZLTextParagraphCursor类,赋值给ZLTextPage类内的StartCursor属性

同时,ZLTextPage类内的StartCursor属性指向的ZLTextWordCursor类进行下设置

 

完成moveStartCursor方法后,我们就完成“定位指定段落”的流程了。



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: pandas-official-tut-zh epub是指Pandas官方教程的中文电子书格式。Pandas是一个强大的数据分析和处理库,被广泛应用于数据科学和数据分析领域。Pandas官方教程提供了详细的指导和示例,帮助用户学习和使用Pandas库。 这本Pandas官方教程的中文电子书以epub格式提供,这意味着我们可以在支持epub格式的电子书阅读器或软件中阅读它。epub格式是一种开放的电子书标准,可以自由地在各种平台上阅读,如电脑、平板电脑、智能手机等。使用epub格式的好处是,它可以根据设备的屏幕尺寸和用户的设置自动调整页面布局和字体大小,提供更好的阅读体验。 这本教程的目标是帮助读者从零开始学习Pandas,并逐步深入了解其功能和用法。它提供了丰富的示例代码和实践演练,以帮助读者掌握Pandas的各种技术和技巧。教程涵盖了Pandas的基本数据结构,如Series和DataFrame,以及它们的索引、切片、过滤、排序等操作。此外,还介绍了Pandas的数据清洗、处理缺失值、数据合并、分组聚合等高级技术。 这本教程的中文版本使更多母语为中文的读者能够更轻松地学习和理解Pandas的概念和功能。epub格式的电子书具有良好的可读性和易于导航的特点,读者可以根据自己的需求和节奏进行学习,随时随地获取所需的知识。 总之,pandas-official-tut-zh epub是一本Pandas官方教程的中文电子书,提供了全面且易于理解的Pandas学习资源,可帮助读者入门并熟练使用该库。无论是初学者还是有经验的数据科学家,都可以从中受益,并将其应用于实际的数据分析项目中。 ### 回答2: pandas-official-tut-zh epub是一本关于pandas库的官方指南的电子书。Pandas是一个强大的数据分析工具,它使用Python编程语言开发。这本电子书提供了从基础概念到高级用法的全面介绍,将帮助读者掌握该库的各种功能和技巧。 该电子书以易于理解和直观的方式解释了pandas库的核心概念,如数据结构、索引和选择、数据聚合和生成等。读者可以通过电子书学习如何使用pandas来处理、清洗和分析各种类型的数据,包括结构化数据、时间序列数据和文本数据。 电子书的内容结构清晰,各章节之间有明确的连贯性,使读者可以系统地学习和理解pandas库的功能和用法。除了基本的数据操作,该电子书还介绍了一些高级特性,如数据合并、重塑和透视等,以及与其他Python工具库的集成。 pandas-official-tut-zh epub不仅提供了理论知识,还包含了丰富的实例代码和可运行的示例,读者可以通过这些实例更深入地理解和运用pandas库。此外,该电子书还提供了一些实际的案例研究,展示了pandas在真实世界中的应用。 总之,pandas-official-tut-zh epub是一本非常有价值的电子书,适合对数据处理和分析感兴趣的读者。无论是初学者还是有一定经验的开发者,都可以从该电子书中获得关于pandas库的全面指导和实用技巧。 ### 回答3: pandas-official-tut-zh epub是一个关于Python数据分析库Pandas的中文官方教程的电子书文件。Pandas是一个强大的数据处理和分析工具,可用于处理和操作大型数据集。 首先,这本电子书是官方教程,意味着内容是由Pandas的开发团队编写的,可以保证信息的准确性和可靠性。它提供了详细的指导和示例,帮助读者了解Pandas的基本功能和高级技术。 这本教程以epub格式提供,这意味着它可以在各种电子设备上进行阅读,如电脑、平板电脑和智能手机。由于epub格式具有自适应屏幕大小和排版的优势,因此读者可以在任何设备上获得良好的阅读体验。 该教程分为多个章节,从介绍Pandas的基本概念和数据结构开始,逐步深入讲解Pandas的应用和高级功能。它涵盖了数据清洗、转换、聚合、合并等方面的常见任务,以及时间序列和数据可视化等更高级的主题。 读者可以通过学习这本教程来掌握Pandas的核心概念和操作技巧,从而更有效地进行数据分析和处理。这对于数据科学家、数据分析师和Python开发者来说都是非常有价值的资源。 总而言之,pandas-official-tut-zh epub是一本官方编写的关于Python数据分析库Pandas的中文教程电子书,为读者提供了全面而系统的学习资源,帮助他们掌握Pandas的各种功能和技术。无论是初学者还是有经验的用户都可以从中受益,并且它的epub格式使得阅读更加方便和灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值