7.3 结构化文档表示

来源:互联网 发布:能隐藏号码打电话软件 编辑:程序博客网 时间:2024/06/04 00:34

7.3 结构化文档表示

 

    我们将在这一节设计的数据结构从 HTML 格式获得灵感,这是大家熟悉的,并成功创建文档的语言。就像 HTML,我们的表示有几种类型的内容,并且可能以适当的方法嵌套某些部分。图 7.3 显示了带注释的示例文档,它可以给你一个概念,格式包括哪些内容。

    有两种不同的部分。简单的部分,如 TextPart 和 ImagePart,包含内容,但是不能包含嵌套的部分。在另一侧,TitledPart 包含一个嵌套部分,添加标题,而 SplitPart 包含一个或多个嵌套的部件和定位的规格。你可能已经猜到了,我们将使用差别联合,来表示不同部分。因为,两个部分可以包含嵌套的部分,类型将是递归的。清单 7.9 显示了类型声明,给我们更多的具体详细讨论。

 

image

 

图 7.3 我们的文档格式中可用的四种不同部件:TitledPart 添加标题到另一个部件,使用 SplitPart,我们可以创建列和行。TextPart 和 ImagePart 指定实际内容。

 

Listing 7.9 Hierarchical document representation (F#)

 

type Orientation =
  | Vertical
  | Horizontal
type DocumentPart =
  | SplitPart of Orientation * list
  | TitledPart of TextContent * DocumentPart
  | TextPart of TextContent
  | ImagePart of string

 

    我们非正式的规范,来自上一段 F# 代码的转录是非常简单的。这绝对是一个标准 F# 类型声明的最具吸引力的方面。我们首先声明一个简单的差别联合,有两个选项,表示拆分部分的定位,然后,再声明 DocumentPart 类型,有四个可选的选项。

    两个选项以递归方式包含其他文件的部分。SplitPart 包含列表中的几个其他部分,一个定位确定区域应如何划分;TitledPart 包含一个其他部分,一个装饰用的标题。使用上一节的 TextContent 类型,来存储文本,这是一个记录,包含一个字符串,以及一起使用的字体。

    DocumentPart 类型表示作为一个整体的文档。因为,该类型是递归的,我们可以在一个文档的部件中,嵌套任意数量的内容部分。这不同于以前的做法,在那儿,我们为一个元素创建类型,然后,文档表示为元素的列表。在那种表示形式中,列表成为数据结构的"根",元素不进一步嵌套。使用新的数据类型,我们可以像这样来写 7.2 节的文档:

 

let doc =
  TitledPart({ Text = "Functional Programming for the Real World";
                       Font = fntHead },
    SplitPart(Vertical,
      [ ImagePart("cover.jpg");
        TextPart({ Text = "..."; Font = fntText }) ]
    )
  )

 

    我们省略了位于图像下面的 TextPart 的内容,但仍可以看到,表示是乘法的,因为,我们不需要自己计算矩形边框。然而,我们没有实现绘制这个数据类型。我们不打算写,或者 — — 我们为什么,什么时候,已经为早先的表示得到了很好的绘制函数?我们所要做的就是,提供一个转换,从“建筑设计“的形式到的“绘制设计“。

原创粉丝点击