LINCKS GPD
在Linux Journal 第 11 期中,我们描述了 LINCKS 的典型安装过程,描述了其组件的功能,并简要介绍了主要应用程序界面 xlincks。由于 LINCKS 附带在线教程和 70 页的 xlincks 手册,我们假设您了解 xlincks 的基本操作。在第二部分也是最后一部分中,我们将描述如何创建您自己的视图,或者我们称之为通用演示描述符 (GPD)。有关 GPD 的参考手册描述,请参见 xlincks 用户手册第 7 章,有关技术概述描述,请参见 系统和软件杂志。
作为一个运行示例,我们将向您展示如何使用 xlincks 创建地址簿,以及用于输入和显示数据的 GPD。我们首先设计数据结构,然后描述 LINCKS 对象模型,最后展示地址簿如何在对象模型中表示。我们将简要描述 xlincks 中 GPD 的自动搜索,并展示我们的第一个 GPD,然后描述 GPD 的各个部分。最后,我们将扩展新创建的 GPD,以演示一些其他功能。
在 LINCKS 中,每个对象由以下部分组成
IMAGE 存储任何类型的信息,可以是 PostScript、对象代码、GIF 或名称(字符串)。大小必须小于 232-1 字节,内容为单值。(目前,xlincks 只能处理包含以零结尾的字符串的 IMAGE。)
ATTRIBUTE 描述或键入对象。属性的值是以零结尾的字符串,长度小于 216-1 字节。属性由两个字符串命名,一个组标签和一个字段标签,其中多个属性可以共享相同的组标签,但组和字段的组合必须是唯一的。
LINKS 包含指向其他对象的链接。链接字段是复数,也就是说,对于每个对象,它可以包含指向其他对象的多个链接,而不是属性,属性是单值的。
在 图 1 中,具有三个条目的窗口是个人对象,其中图像包含个人的姓名,第二行指定出生日期,第四行是指向地址对象的链接。第二个更大的窗口是应用于同一对象的节点视图。(要应用另一个视图,请单击该项目,然后单击“展开...”菜单项,然后选择节点视图。有关更多信息,请参见第 11 期的上一篇文章,或阅读 xlincks 手册。)节点视图中的第一个条目是图像,后跟所有属性,最后是以 SYSTEM:Parent 条目开头的链接部分。
请注意,系统创建了两个属性 SYSTEM:Created 和 SYSTEM:Owner——这一对是两个属性共享相同组标签的一个很好的例子。一般来说,我们将所有大写字母用于组部分,并将小写字母(可能首字母大写)用于字段部分。
GPD 由一个字符串命名,该字符串可能包含空格。xlincks 首先在您自己的 GPDmap 中查找特定的 GPD,然后在系统 GPDmap 列表中查找。这允许您使用您自己的专用 GPD 覆盖系统 GPD。现在,如果您展开 Empty User 4's GPDmap 行,您将获得一个窗口,其中包含您的第一个 GPDmap,如 图 2 所示。
用新 GPD 的名称 person 替换 <<table>>,然后使用 ctrl-n 移出该行。将出现一个新的占位符 <<gpd>>,我们用新 GPD 的单行描述填充它,即 person 对象的视图,如 图 3 所示。现在,展开 (meta-l meta-e) 描述行以获取在图 3 底部看到的空 GPD 模板。
首先,您首先单击行 Empty User 4's GPDmap,然后单击空 GPD 中的 <<gpdmap>> 行,然后单击 添加链接 按钮,从而将 <<gdpmap>> 替换为指向 Empty User 4's GPDmap 的链接,从而从 GPDmap 添加链接。
其次,我们需要通过描述个人对象中的逻辑部分来定义逻辑结构。之前,我们将个人对象定义为包含姓名和出生日期。现在,移动到 STRUCTURE 部分中的 <<direct>> 行,并将其替换为我们的 GPD 名称 person。在 GPDmap 中使用的 GPD 名称必须至少在 STRUCTURE 部分中出现一次。移出该行后,我们将新创建的 empty: value 替换为我们的个人对象中的部分:姓名和“出生日期”——由于部分名称包含空格,因此我们必须使用引号(否则它将是三个部分!)。
第三,现在我们已经定义了个人对象的结构,我们需要定义信息存储在哪里。GPD 的 ACCESS 部分定义了我们存储或检索逻辑结构部分的位置。我们希望将个人的姓名存储在 IMAGE 部分中,并将其出生日期存储在名为 ADDRESSBOOK:Date 的 ATTRIBUTE 中。
要指定姓名组件,我们移动到 ACCESS 部分中的 <<direct>> 并将其替换为 姓名(结构部分的名称)。然后,我们移出该行,并将 empty: value 替换为 IMAGE。结果 GPD 可以在 图 4 中看到。警告:任何省略的 ACCESS 规范默认为 IMAGE!
要定义我们在 ACCESS 部分中找到“出生日期”的位置,我们将光标移动到 ACCESS 部分中的 姓名 行,并执行插入最接近复数 (meta-l meta-i),结果如 图 5 所示。用 出生日期(不带引号!)替换 direct 行,用 ATTR ADDRESSBOOK Date 替换 empty: value 行,得到 图 6。请注意,我们使用关键字 ATTR,后跟组标签 (ADDRESSBOOK) 和字段标签,以定义属性中 出生日期 的存储位置。
最后,如果我们想尝试我们的新 GPD,我们需要创建一个地方来存储对象,例如在我们的 LINCKS 主目录中
1) 单击“Linux on the Road”行
2) 执行插入最接近复数 (meta-l meta-i)
3) 展开项目(使用 meta-l meta-e 或 ctrl-左键单击)
4) 将 GPD 填写为 person
5) 展开同一行 (person),它应该会产生一个两行的窗口,显示 item 和 empty: birth date,如 图 7 所示。
我们将不会详细介绍地址 GPD 的创建,但基本步骤是
1) 选择 GPDmap(使用我们用于个人 GPD 的相同 GPDmap)
2) 移动到 person 行。并执行插入复数。
3) 将 GPD 命名为 address,并为其提供描述性行 address 对象的视图。
4) 展开 address 对象的视图。
5) 并根据 图 8 完成它。
现在,我们需要创建一个地址对象,我们按照与初始个人对象相同的步骤进行操作。我们将该对象添加到我们的主目录,结果如 图 9 所示。
我们现在已经定义了用于存储和检索地址和个人对象的模板,但我们需要将一个人连接到一个或多个特定地址。我们希望在 ADDRESSBOOK Address(组和字段标签)的链接名称下将一个个人对象链接到一个或多个地址对象。我们将修改个人对象以包含指向地址对象的链接。首先,我们需要向逻辑结构添加一个新的实体。让我们称它为 address。其次,我们需要指定在哪里找到新的部分,如 图 10 所示扩展个人 GPD。
请注意,我们引入了 ATTR CONSTANT,它定义了一个常量属性,在本例中是一系列短划线。此外,在 GPD 的 EXPAND 部分中,我们定义了对逻辑部分 address(通过遵循链接 ADDRESSBOOK:Address 找到)的任何扩展都应使用 address GPD 查看。存储更改后的个人 GPD 后,我们再次展开主目录中的 Martin Sjölin 条目,我们会看到添加的短划线以及占位符 <<address>> (图 11)。
将链接添加到地址 +46 13 148155 到占位符,并在展开该电话号码后,我们得到 图 12。
为了使个人 GPD 看起来更像标准文件夹或我们的主目录,我们可以围绕地址条目(例如,电话号码)放置一个边框,并将左边距向右推 10 像素,方法是在逻辑部分地址下的 FORMAT 部分中添加一个条目,如下所示
address borderWidth=1;leftMargin=10;width=400
其中我们使用 width 来指定小部件的宽度(以像素为单位)。
最后一个例子展示了如何创建一个组合的人员和地址 GPD,我们称之为人员和地址 GPD。和之前一样,选择 GPDmap,添加一个新的 GPD,命名为人员和地址,并附上一行描述,如图 13 所示。这个 GPD 包含几个值得注意的特性。首先,我们在 FORMAT 部分使用字体规范。等号后可以指定系统中任何有效的 X11 字体。有时字体名称需要用引号(“”)括起来。此外,字体和边距规范对于下面(逻辑结构上)的所有条目都是有效的,如图 13 所示。我们已将人员和地址视图应用于主目录中的人员对象Martin Sjölin。
其次,在 ACCESS 部分,--- 间接引用 --- 我们通过在 address GPD 中使用相同的逻辑名称和逻辑部分,然后添加指向 person GPD 的链接,从而重用了 person GPD 中的 ACCESS 规范。系统会跟随链接到另一个 GPD,并查找名称和出生日期下的 ACCESS 规范。因此,我们只在一个 GPD 中拥有 ACCESS 规范,而不是复制到多个 GPD 中(我们避免了魔术数字!)。
第三,addresslink 结构部分呢?我们定义了 addresslink 指向 ACCESS 部分中的地址对象,从而产生一个地址对象。然后,在 STRUCTURE 部分,我们使用了间接特性并重用了 address GPD(如下面 address 行上的描述性名称所示)。
现在,如果我们使用 --- 间接引用 --- 在 ACCESS、EXPAND 或 FORMAT 部分,我们仅重用该特定逻辑部分的声明,也就是说,我们在另一个 GPD 中使用该 ACCESS、EXPAND 或 FORMAT 声明。但是,当在 STRUCTURE 部分使用间接时,我们使用指向的 GPD(在本例中为 address GPD)中的 STRUCTURE、ACCESS、EXPAND 和 FORMAT 声明,并且不再使用指向的 GPD(人员和地址)中的任何声明。
例如,如果我们在人员和地址 GPD 中为 address 部分添加 FORMAT 规范,它将不会被使用,因为任何 FORMAT 声明都必须包含在指向的 (address) GPD 中——自己尝试一下。该机制类似于函数调用。
本简介以及 xlincks 手册中的材料应有助于你入门。如果没有,你将不得不不断催促作者完成真正的 GPD 教程,希望在 LINCKS 的下一个公开版本发布之前(希望在你阅读本文时已经发布)。
Martin Sjölin 即将在瑞典林雪平大学计算机与信息科学系完成计算机科学硕士学位。 他从事超文本/超媒体、文档处理、CSCW 和信息过滤/共享领域的工作。 他负责 LINCKS 的支持和开发,只要他没有浏览网络(WWW、邮件列表、Usenet)。 除了计算机,他还喜欢烹饪、背包旅行、滑雪、帆板运动、划独木舟和阅读,只要他没有破解 LINCKS 或 MacIntosh 的 Linux。(marsj@ida.liu.se)