CN1398377A - 提供和呈现可定标web页面的系统和处理 - Google Patents

提供和呈现可定标web页面的系统和处理 Download PDF

Info

Publication number
CN1398377A
CN1398377A CN01804488A CN01804488A CN1398377A CN 1398377 A CN1398377 A CN 1398377A CN 01804488 A CN01804488 A CN 01804488A CN 01804488 A CN01804488 A CN 01804488A CN 1398377 A CN1398377 A CN 1398377A
Authority
CN
China
Prior art keywords
lantern slide
substep
document
text
browser
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN01804488A
Other languages
English (en)
Other versions
CN1205571C (zh
Inventor
R·基弗
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
AMERICAN ON-LINE
Original Assignee
AMERICAN ON-LINE
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by AMERICAN ON-LINE filed Critical AMERICAN ON-LINE
Publication of CN1398377A publication Critical patent/CN1398377A/zh
Application granted granted Critical
Publication of CN1205571C publication Critical patent/CN1205571C/zh
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/957Browsing optimisation, e.g. caching or content distillation
    • G06F16/9577Optimising the visualization of content, e.g. distillation of HTML documents
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/103Formatting, i.e. changing of presentation of documents
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/14Tree-structured documents
    • G06F40/143Markup, e.g. Standard Generalized Markup Language [SGML] or Document Type Definition [DTD]

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Audiology, Speech & Language Pathology (AREA)
  • Computational Linguistics (AREA)
  • General Health & Medical Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Artificial Intelligence (AREA)
  • Databases & Information Systems (AREA)
  • Data Mining & Analysis (AREA)
  • Information Transfer Between Computers (AREA)
  • Document Processing Apparatus (AREA)
  • User Interface Of Digital Computer (AREA)

Abstract

一种显示和再显示符合浏览者浏览器限制的HTML文档的系统和处理。所述系统包括浏览器、脚本和文档对象模型(DOM)。脚本包括数据结构和解释码。DOM是一种文档模型,代表Web页面的元素,如文本、图象、URL链接等。所述处理包括用脚本建立描述文档重要信息的文档数据结构,并用解释码以某种方式解释该数据结构,这种方式允许其操作DOM用于在浏览器中呈现该文档的目的。数据结构可以修改,而相应的HTML可在以后根据用户情况再生,因而在初始建立了文档后,文档可作更新以向浏览者浏览器反映变化情况。若浏览者改变浏览器尺寸,页面元素可自动调整尺寸。

Description

提供和呈现可定标WEB页面的系统和处理
版权通告
本专利文档的一部分内容包含了受版权保护的资料。版权所有者并不反对任何人复制该专利文档或专利揭示的内容,这些在专利商标事务所的文档或记录中出现,但仍然保留所有版权。
发明背景
技术领域
本发明一般涉及因特网通信技术,尤其涉及提供与呈现可定标的Web页面的系统和方法。
背景技术
万维网(www)文档的作者都面临着一种普遍而又令人头痛的问题:观看他们文档的浏览者具有非常多样的观看环境—尤其在显示文档的窗口物理尺寸方面。尤其是如果作者希望按特定的布局要求制作文档时,这就越发成问题。超文本链接标示语言(HTML),即www的文档格式,在可定标页面元素方面提供的办法很少。许多元素,特别是文本,都固定成特定的尺寸。当在浏览器上以大的显示分辨率观看时,与低分辨率显示时相比,文本显得相当小。另外,即便是那些支持某些定标形式的元素,由于提供定标支持的方式还不成熟,所以也难以控制。所有这些原因导致了WWW文档协调布局的进展相当困难。
对文档作者而言,解决该问题的一条途径是应用动态脚本语言,如JavaScript。这类语言可以探测有关浏览者环境的信息,并据此修改文档。不幸的是,这类语言所提供的原文档对象码(DOM)也有相当的问题。在Netscape浏览器4的情况下,不是可以访问所有的页面元素。许多元素都是“只写”或者“只读”,这就无法将原结构作为存贮文档信息的可靠场所。
相反地,因特网浏览器(ie 4&5)的DOM有时过于复杂,因此很难限定文档修改的程度。
给WWW作者增加难度的是,Netscape浏览器与因特网浏览器所使用的DOM,本质上明显不同。要支持这两种浏览器,就要求开发能与各个DOM互作用的不同脚本。
希望研制一种浏览器无关的文档数据结构,使页面作者能自由地访问和修改文档的所有相关方面,而不用担心浏览器DOM的限制。
发明内容
本发明提供的一种系统和处理方法,可以显示和重新显示符合浏览者浏览器局限性的HTML文档,该系统包括浏览器、脚本和文档对象模型(DOM)。脚本包括文档数据结构与解释码。在本发明较佳实施例中,文档数据结构是一种为该系统设计的幻灯片显现数据结构。DOM是一个代表Web页面元素如文本、图象、URL链接等的文档模型。
应用该系统时不用创建HTML文档,Web作者建立起由脚本组成的文档。当该脚本在执行时,就建立文档数据结构,该数据结构描述了该文档的基本信息。解释码以某种方式解释该数据结构,使得它可以操作DOM用于将文档在浏览器中显现。
通过让Web服务器向浏览者的浏览器提供文档数据结构,而不是对该文档进行HTML再现,就能在当拥有建立合适尺寸的文档所需的浏览器信息时,产生该文档的HTML,从而把文档的所有特征相应地定好尺寸。而且,数据结构可作修改,而且随后可响应用户情况再生成相应的HTML,因而,在最初建立后,可对文档作更新以向浏览者的浏览器反映出变化情况。例如,若浏览者改变了浏览器尺寸,则页面元素会自动改变尺寸。
通过建立了浏览器无关的数据结构,页面作者就能自由地访问和修改文档所有相关的方面,而不用担心浏览器DOM的局限性。这种浏览器的无关性还让作者能编制解释该结构的单个脚本,不必编制用于解释不同浏览器DOM所需的两个或多个脚本。
附图说明
图1是说明系统的框图,该系统可显示和再显示符合浏览者浏览器限制的HTML文档;和
图2是示出根据本发明的文档数据结构的层次结构框图。
具体实施方式
参照图1,系统100用于显示和再显示符合浏览者浏览器限制的HTML文档,它包括浏览器110、DHTML文档对象模型(DOM)120和脚本130。
浏览器110可以是任何一类支持脚本语言的Web浏览器,它具有修改显示的Web页面内容的方法(也称为浏览器文档对象模型)。
DHTML DOM 120是一个文档模型,代表Web页面的诸元素,如文本、图象、URL链接等。
脚本130包括文档数据结构140和解释码150。脚本是内联脚本(包含在Web页面文档的源HTML内的脚本)与Web页面文档引用的脚本文件的某种组合。在本发明该较佳实施例中,文档数据结构140是为本系统设计的幻灯片显现数据结构。所述文档数据结构140的层次结构示于图2和表1-8。
使用该系统时,不用建立HTML文档,Web作者建立其由脚本130组成的文档。当该脚本在执行时,就创建了描述该文档基本信息的文档数据结构140。解释码150以某种方式解释文档数据结构140,使得它操作DHTML DOM 120用于在浏览器中显现该文档的目的。
创建文档数据结构的处理方法包括下述步骤:
1.用Web服务器响应浏览者浏览器对文档的请求;
2.以适当的方式检索或创建该文档的内容(这方面的例子是从计算机硬驱动器读取文件里的文档,向数据库查询信息,或用某种算法计算内容);
3.把文档内容译成脚本码有效块,当被浏览者浏览器执行时,就会建立可访问或处理的数据结构;
4.把脚本代码嵌入返回到客户的HTML文档里;和
5.在浏览者的浏览器里执行该脚本块(一般由浏览器自动完成)。
一旦创建了该文档数据结构,可选择执行任何必要的数据验证。这一步虽非必要,但通常还是要对Web服务器提供的数据进一步格式化、验证或优化。
上述处理的步骤5还包括下述子步骤:
a、设定背景色;
b、创建显现幻灯片层;
c、使所述幻灯片层显示有效;
  d、对所述显现与所述幻灯片的地址初始化;
  e、对所述幻灯片内部的各种幻灯片元素初始化;
  f、建立调节尺寸的处理程序;和
  g、把所述幻灯片呈现为HTML,并在所述浏览器中显示所述显现内容。
当幻灯片元素为文本体时,上述处理的子步骤(e)包括下述分子步骤:
(aa)为所述文本体建立地址;
(ab)创建所述文本体层;和
(ac)使所述层的显示有效。
当所述幻灯片元素为图象体时,子步骤(e)包括下述分子步骤:
(ba)为所述图象体建立地址;
(bb)创建所述图象体层;和
(bc)使所述层的显示有效。
当所述幻灯片元素为轮廓(outline)体时,子步骤(e)包括下述分子步骤:
(ca)为所述轮廓体建立地址;和
(cb)对所述轮廓体的轮廓节点初始化。
上述处理的子步骤(g)包括下述分子步骤:
(da)获得客户屏目尺寸;
(db)设定所述幻灯片层的剪裁区;
(dc)显现所述幻灯片内部的各种幻灯片元素;和
(de)将输出刷新所述层。
在子步骤(g)中,当幻灯片元素为文本体时,分子步骤(dc)包括下述次分子步骤:
(a1)设定层色并对齐;
(a2)生成要显示的文本;
(a3)写URL起始标记;
(a4)写样式和所述文本;和
(a5)写URL结束标记。
在子步骤(g)中,当幻灯片元素为图象体时,分子步骤(dc)包括下述次分子步骤:
(b1)设定层背景色;
(b2)若幻灯片可编辑,写空白内容串;
(b3)获得图象源的URL;
(b4)写URL起始标记;
(b5)显现所述图象;和
(b6)写URL结束标记。
在子步骤(g)中,当幻灯片元素为轮廓体时,分子步骤(dc)包括下述次分子步骤:
(c1)建立默认属性;
(c2)创建显现上下文范围并初始化;
(c3)设定起点和有效宽度;
(c4)按所述显现范围显现轮廓节点;和
(c5)隐藏不使用的层。
解释文档数据结构的处理包括下述步骤:
1.识别文档数据结构由Web服务器安排的对象,该对象要求在浏览者的浏览器中显现;
2.确定或创建用于显现该文档的浏览器DOM的元素;
3.为让浏览者特定的浏览器配置适应DOM元素或文档数据结构,应用必要的任何变换或其它变化;
4.生成显现所述对象必需的HTML;和
5.把该HTML应用到DOM元素,让它在浏览器中显示。
上述处理的步骤3包括下述子步骤:
    a.设定背景色;
    b.创建用于显现的幻灯片层;
    c.使所述幻灯片层显示有效;
    d.对所述显现与所述幻灯片的地址初始化;
    e.对所述幻灯片内的各种幻灯片元素初始化;和
    f.建立调节尺寸处理程序。
当幻灯片元素为文本体时,上述处理的子步骤(e)包括下述分子步骤:
(aa)建立所述文本体的地址;
(ab)创建所述文档体的层;和
(ac)使所述层的显示有效。当所述幻灯片元素为图象体时,子步骤(e)包括下述分子步骤:(ba)建立所述图象体的地址;(bb)创建所述图象体的层;和(bc)使所述层的显示有效。当所述幻灯片元素为轮廓体时,子步骤(e)包括下述分子步骤:(ca)建立所述轮廓体的地址;和(cb)对所述轮廓体的轮廓节点初始化。上述处理的步骤4包括下述子步骤:(da)获得客户屏目尺寸;(db)设定所述幻灯片层的剪裁区;(dc)显现所述幻灯片内的各种幻灯片元素;和(de)将输出刷新所述层。当幻灯片元素为文本体时,步骤4下的子步骤(dc)包括下述分子步骤:(a1)设定层色并对齐;(a2)生成要显示的文本;(a3)写URL起始标记;(a4)写样式与所述文本;和(a5)写URL结束标记。当幻灯片元素为图象体时,步骤4下的子步骤(dc)包括下述分子步骤:(b1)设定层背景色;(b2)若幻灯片可编辑,写空白内容串;(b3)获得图象源的URL;(b4)写URL起始标记;(b5)显现所述图象;和(b6)写URL结束标记。当幻灯片元素为轮廓体时,步骤4下的子步骤(dc)包括下述分子步骤:(c1)建立默认属性;(c2)创建显现上下文范围并初始化;(c3)设定起点与有效宽度;(c4)按所述显现范围显现轮廓节点;和(c5)隐藏不使用的层。
在通过Web服务器向浏览者的浏览器提供文档数据结构时,即描述文档的数据结构而不是该文档的HTML再现,当拥有创建合适尺寸文档所必需的浏览器信息时,就能产生该文档的HTML,这样,就能对文档的所有特征相应地进行调整。而且,数据结构可响应用户情况而修改(并随后再生相应的HTML),因而,在文档初步建立之后,可以对其更新以便把变化反映给浏览者的浏览器。例如,若浏览者改变浏览器的尺寸,页面元素就自动调整尺寸。
因此,通过创建浏览器无关的数据结构,页面作者能自由地访问和修改文档所有相关的方面,而不用担心浏览器DOM的限制。这种浏览器无关性还能使作者为解释该结构开发单个脚本,而不用为解释不同的浏览器DOM而需要两种(或多种)脚本。
其附带好处是可将作者定义的数据结构优化成只包含最重要的信息,使它们比同等的HTML小得多,有利于缩短传输时间,尤其在低带宽的通信线路上更是如此。
文档数据结构和解释码可包含在单个文档内,这使得传送和移植更方便,不过这要求解释码与每个文档一起发送。
文档数据结构与解释码之间的区别,实质上是一种状态对行为(state.vs.behavior)之一。文档数据代表显示文档所必需的状态,与行为很少或没有关联。解释码则提供理解文档数据结构并创建代表它的HTML所必需的行为。
解释码可与文档数据结构码分开,预计这是一种更吸引人的办法,因为这样可让浏览器把解释码缓冲起来供以后在另一相似的文档上使用。
图2的框图示出文档数据结构140的层次结构。第一层为SXPresentation200,是显现数据结构的根对象,它包含处于第二层的SXSlides阵列。
SXSlide 210是代表显现中的单张幻灯片的对象。它包含许多处于第三层的SXContentEntities 220。
SXContentEntity 220是许多种不同类型幻灯片元素之一的抽象表示,这些类型包括:SXText 230、SXOutline 240与SXImage 250。
SXOutline 240又可包含其它子轮廓260。
在显现数据结构中的这些实体中每个都具有各种与其相关的属性,这些属性在下列表中有描述。
该系统支持有限的标记置换功能。表1包括:(1)识别标记,(2)发生置换范围,和(3)被置换的值。
表1.标记置换
      标记          范围              值
%SlideNumber%   SlideNumber(SXText) 当前幻灯片索引(从“1”开始)
%SlideCount%   SlideNumber(SXText) 显现的幻灯片总数
另一些标记应使用“%TokenName%”记号。
标记置换是运用严密的串匹配法来完成,只置换包括围以“%”的字符的文本(该文本与该标记严密匹配)。然而,目前还无法避免(escape)“%”字符,因此,例如,就无法让“%SlideNumber%”串出现在SlideNumber元素中。
表2~8列出不同属性的类型。这种类型描绘了对象的语义类型,在串数据类型中不一定包含数据类型,如zIndex属性,该属性列为“整数”类型。表2列出该类型字段。表2类型字段
含任何有效字母数字字符的值。在Javascript中,应避免“/”与“n”字符。
整数 整数值(如“1234”或“-1234”)。
浮点 浮点值(如“1.234”或“-1.234”)。一般不用指数表示法(不保证能够支持)。
色彩 HTML样式色彩值。可以是色彩名称,但常用色码,以“#RRGGBB”表示。
阵列 有序的对象集合。
散列映射 映射的对象集合。
表3 SXPresentation
属性 类型 说明
currentSlideIndex 整数 当前显现幻灯片的标引。它是显现中幻灯片的真实标引。
isSample 布尔 用于取样显现为真。
isStyle 波尔 用于样式显现为真。
isTemplate 波尔 用于膜板显现为真。
presentationID 整数 显现的数据库id。
slideCount 整数 显现幻灯片总数。
slides 阵列 构成显现的幻灯片阵列。注:该阵列不保证所有显现的幻灯片完全包括在内,一般仅含单一对象(索引0)。幻灯片实际索引可在currentSlideIndex属性中找到。
SlideTitles 阵列 串阵列,含每张显现幻灯片的标题。当前幻灯片标题可在slideTitles[currentSlideIndex]中找到。
type 值:com.iamaze.presentation.SXPresentation.
表4 SXSlide
属性 类型 说明
contentEntities 散列映射 包括幻灯片内容的SXContentEntities组。
effect 显示幻灯片时,所使用的效果类型。值:·向左飞入:幻灯片元素从右侧飞入·向右飞入:幻灯片元素从左侧飞入·向上飞入:幻灯片元素从底部飞入·向下飞入:幻灯片元素从上部飞入·闪烁:幻灯片元素只“闪烁”。(通常只有标题与轮廓元素显现该效果)·建立:每次鼠标点击逐渐露出幻灯片元素。(通常只以每次点击露出一个顶层元素的方式露出当前的轮廓元素-)
layoutName 该显现所基于的布局名称。
notes 用户提供的幻灯片注释(通常不用于任何感兴趣的东西)。
title 幻灯片标题。
type 值:com.iamaze.presentation.SXSlide
表5 Abstract SXContentEntity
属性 类型 描述
top 这些值规定了实体所占据的矩形
left
width
height
type 对象类型—实际上是负责存贮该实体的SXPersistentContentEntity子类的完整java路径名称。值:·com.iamaze.presentation.contenttype.SXText·com.iamaze.presentation.contenttype.SXOutline·com.iamaze.presentation.contenttype.SXImage
name 元素名称。值:为幻灯片背景元素保留的名称背景。
zIndex 整数 幻灯片中层元素的z排序。背景元素总为索引0(底层)。
表6  继承Abstract SXContentEntity所有属性的SXText
属性 类型 描述
fontSize 整数 字体磅数
color 色彩 文本色彩
backgroundColor 色彩 背景色
fontFamily 字体系列
fontWeight 字重;值:粗体
align 水平对齐值:左,中,右
text 实体内容
verticalAlign 垂直对齐值:顶,中,底
url 播放期间点击时时所要定位的URL,注:若没有前标“/”或协议(如未预先考虑“http://”,“http://”)
fontStyle 字体;值:斜体
表7 继承SXText所有属性的SXOutline实体
属性 类型 说明
align 在SXOutline实体中略去
verticalAlign 在SXOutline实体中略去
nodeBulletType 项目符号(bullet)类型值:文本-符号,文本-字母-小写,文本-字母-大写,文本-数字-单调,文本-数字-嵌套,文本-罗马字-小写,文本-罗马字-大写,图象注:不必需图象与文本数字嵌套型(Uwe,你不用支持这些类型)
nodeBulletValue 是规定如何看项目符号的值。这要根据nodeBulletType里规定的类型,进行不同地解释,如下:文本-符号:该值是要显示的统一代码字符的十进制数值。这里的零值为出错。文本-字母-小/大写、文本-数字-单调/嵌套和文本-罗马字-小/大写:该值是进入各序列的索引。值0、1、2对应于下述(在逻辑上跟随的后续值):·文本-字母-小/大写:a、b、c/A、B、C·文本-数字-单调/嵌套:1、2、3/(不必需)·文本-罗马字-小/大写:i、ii、iii/I、II、III注意,这些是基本项目符号。若不规定值,就自动使用前一索引+1。若项目符号是节点阵列中的第一项目符号,则索引默认为0。
nodes 阵列 SXOutlines阵列,是该轮廓的产物
表8 继承Abstract SXContentEntity所有属性的SXImage
属性 类型 说明
align 水平对齐;值:左、中、右
backgroundColor 色彩
scale 显示图象时使用的定标模式;值:·配合:图象定标成在边界内准确符合。·宽度:图象定标,保持高宽比,图象宽度在边界内准确配合。·高度:图象定标,保持纵横比,图象高度在边界内准确配合。·分割:图象以其原尺寸分割,以准确地填满图象边界(分割原点左上角)。注:对宽度与高度定标,在图象溢出图象边界时不剪裁。
src 显示在该实体内的图象URL
url 播放期间点击时,要定位的URL。注:若前面无“/”或协议(如未预先考虑“http://”,“http://”)
verticalAlign 垂直对齐。值:上、中、下
本系统中,特别对名为“背景”的SXImage实体进行处理。该内容实体描述了幻灯片背景,并按下述方法处理:
其边界总是准确地对应于幻灯片界限。
其z索引始终置零(0)。
表9是JavaScript的程序片段,说明文档数据结构的概貌。在该样本中,文档是显现文档的一张幻灯片。表10是解释该幻灯片数据结构的JavaScript。表11是针对轮廓解释数据结构的JavaScript。表12是Web服务器用来把任意散列映射(如检索自数据库)转换成浏览者浏览器里JavaScript数据结构的Java源代码。表9用于显示文档中一个幻灯片的JavaScript
var presentation={

  type:′com.iamaze.presentation.SXPresentation′,

  isStyle:false,

  presentationID:′com.iamaze.presentation.SXPresentation_931181

  isTemplate:false,

  currentSlideIndex:′5′,

  slideCount:′7′,

  slides:{

    {

        contentEntities:{

          Subtitlel:{

          fontSize:′28′,

          top:′13%′,

          width:′60%′,

          color:′FF9933′,

          backgroundColor:null,

          fontFamily:null,

          fontWeight:null,

          height:′6%′,

          align:′center′,

          text:′As anywhere,street vendors abound′,

          verticalAlign:′top′,

          url:null,

          fontStyle:′italic′,

          left:′37%′,

          zIndex:′6′,

          type:′com.iamaze.presentation.contenttype.SXText′,

          name:′Subtitlel′

          },

          Outlinel:{

              fontSize:null,

              top:′20%′,

              width:′36%′,

              color:null,

              backgroundColor:null,

              fontFamily:null,

              fontWeight:null,
              height:′66%′,

              align:null,

              nodeBulletType:null,

              text:null,

              verticalAlign:null,

              url:null,

              fontStyle:null,

              nodeBulletValue:null,
        <!-- SIPO <DP n="14"> -->
        <dp n="d14"/>
               nodes:[

                 {

                      fontSize:′28′,

                      top:null,

                      width:null,

                      color:′333300′,

                      backgroundColor:null,

                      fontFamily:′Georgia,Times New Roman,Times,
serif′,

                      fontWeight:null,

                      height:null,

                      align:null,

                      nodeBulletType:′text-symbol′,

                      text:′The Island of Nax′,

                      verticalAlign:null,

                      url:null,

                      fontStyle:null,

                      nodeBulletValue:′8226′,

                      nodes:null,

                      left:null,

                      zIndex:null,
type:′com.iamaze.presentation.contenttype.SXOutline′,

                      name:null

                      fontSize:′28′,

                      top:null,

                      width:null,

                      color:′333300′,

                      backgroundColor:null,

                      fontFamily:′Georgia,Times New Roman,Times,
serif′,

                      fontWeight:null,

                      height:null,

                      align:null,

                      nodeBulletType:′text-symbol′,

                      text:′When in the Islands,seafood is a must.
You can\′t find any fresher or more delicious octopus anywhere.′,

                      verticalAlign:null,

                      url:null,

                      fontStyle:null,

                      nodeBulletValue:′8226′,

                      nodes:null,

                      left:null,

                      zIndex:null,
type:′com.iamaze.presentation.contenttype.SXOutline′,

                      name:null

                  }

                ],

                left:′50%′,

                zIndex:′7′,

                type:′com.iamaze.presentation.contenttype.SXOutline′,

                name:′Outline1′

            },

            StyleImagel:{

                scale:null,

                top:′0′,

                width:′3%′,

                backgroundColor:′9966CC′,
        <!-- SIPO <DP n="15"> -->
        <dp n="d15"/>
                height:′100%′,

                align:′center ′,

                verticalAlign:′middle′,

                url:null,

                src:null,

                left:′0′,

                zIndex:′7′,

                type:′com.iamaze.presentation.contenttype.SXImage′,

                name:′StyleImagel′

            },

            Titlel:{

                fontSize:′27′,

                top:′5%′,
                width:′90%′,

                color:′333300′,

                backgroundColor:null,

                fontFamily:′Georgia,Times New Roman,Times,serif′,

                fontWeight:′bold′,

                height:′10%′,

                align:′center′,

                text:′Octopii Vendors′,

                verticalAlign:′center′,

                url:null,

                fontStyle:null,

                left:′5%′,

                zIndex:′6′,

                type:′com.iamaze.presentation.contenttype.SXText′,

                name:′Titlel′

            },

            Background:{

                scale:′fit′,

                top:null,

                width:null,

                backgroundColor:null,

                height:null,

                align:′center′,

                verticalAlign:′middle′,

                url:null,

                src:′/images/backgrounds-large/Waterlilies-
1024x768_7.jpg′,

                left:null,

                zIndex:′1′,

                type:′com.iamaze.presentation.contenttype.SXImage′,

                name:′Background′

            },

            Imagel:(

                scale:′width′,

                top:′20%′,

                width:′36%′,

                backgroundColor:null,

                height:′66%′,

                align:′right′,

                verticalAlign:′top′,

                url:null,

                src:′/images/samples/NaxOctopi.jpg′,

                left:′10%′,

                zIndex:′8′,

                type:′com.iamaze.presentation.contenttype.SXImage′,

                name:′Imagel ′
        <!-- SIPO <DP n="16"> -->
        <dp n="d16"/>
        effect:null,

        layoutName:′lOutline+lImage-2′,

        notes:null,

        title:′Octopii Vendors′,

        old contentEntities:null,

        type:′com.iamaze.presentation.SXSlide′

    }

  ],

  slideTitles:[

    ′<Travel Destination goes here>′,

    ′<A Title for Photos Below>′,

    ′<Add a Title for the Images>′,

    ′<Third Destination Goes Here>′,

    ′The Whitewashes of Greece′,

    ′Octopii Vendors′,

    ′Next stop,Indonesia!\n\n\′Til then...\n-Rosie′

  ],

  isSample:false
};
表10解释幻灯片数据结构的JavaScript
function CXSlide(){};
CXSlide.version=1;
CXSlide.name=′Slide′;
CXSystem.registerLibrary(CXSlide);
/**************************/
//
//Global vars
//
//The last width and height of the window(only used on NS4)
var lastWidth=0,lastHeight=0;
//Flag for turning DOM validation on and off
var DEBUG_DOM=false;
debugRegisterFlag(′DEBUG_DOM′);
//Error string
var WARNING_NO_SLIDE_LAYER=′Unable to locate the slide layer.A
temporary one will be created but the quality of this page will be
degraded.′;
//The name of the layer that contains the slide
var SLIDE_NAME=′Slide′;
//The name of the layer that contains the background
var BACKGROUND_NAME=′Background′;
//The virtual width,height,and diagonal of the slide
var V_WIDTH=1024;
var V_HEIGHT=768;
var V_DIAG=Math.sqrt(V_WIDTH*V_WIDTH+V_HEIGHT*V_HEIGHT);
        <!-- SIPO <DP n="17"> -->
        <dp n="d17"/>
  //Default strings to show

  var DEFAULT_DIRECTIONS=(ie4)?′Double click′:′Click here and

  choose″Properties″′;

  var DEFAULT_TEXT_STRING=′to edit′;

  var DEFAULT_IMAGE_STRING =′to specify image′;

  //Types of content elements

  var CLASS_PACKAGE=′com.iamaze.presentation′;

  var PRESENTATION_CLASS=CLASS_PACKAGE+′.SXPresentation′;

  var SLIDE_CLASS=CLASS_PACKAGE+′.SXSlide′;

  var TEXT_CLASS=CLASS_PACKAGE+′.contenttype.SXText′;

  var IMAGE_CLASS=CLASS_PACKAGE+′.contenttype.SXImage′;

  var OUTLINE_CLASS=CLASS_PACKAGE+′.contenttype.SXOutline′;

  //Constants for the ′scale′field of image entities

  var SCALE_NONE=null;

  var SCALE_FIT=′fit′;

  var SCALE_WIDTH=′width′;

  var SCALE_HEIGHT=′height′;

  var SCALE_TILE =′tile′;

  //The path to the shim image

  var SHIM_IMAGE=′/html/images/shim.gif′;

  //Define and set variable indicating whether or not the slide can be

  edited

  var slideIsEditable=false;

  //The layer containing the slide

  var slideLayer=null;

  //Flag indicating whether or not this is the first rendition of the

  page

  var slideIsRendered=false;

  //The width of the client document area

  var clientWidth=V_WIDTH;

  var clientHeight=V_HEIGHT;

  //A prefix we use to uniquely name our images

  var IMAGE_NAME_PREFIX=″iamaze″

  //The scale factors we use to resize the slide

  var xScale=l.0;

  var yScale=1.0;

  var scale=1.0;

  //PENDING(RWK)-Quick patch to get the new data structure working

  var slide=presentation.slides[0];

  var slideContent=slide.contentEntities;

  var resizeTimeout=null;

  var slideResizeInterva =null;

  /*

   *Called during document.onload()

   */

  CXSlide.onload=function() {

      if(ns4||!isRenderingEnabled()) setShowingBatched(true);

      //Set the background color if we′re not editing
        <!-- SIPO <DP n="18"> -->
        <dp n="d18"/>
  if (!slideIsEditable &&

    slide.contentEntities.Background.backgroundColor){

    document.bgColor=
slide.contentEntities.Background.backgroundColor;

  }

  //Get the layer containing the slide

  slideLayer=getNamedLayer(SLIDE_NAME);

  if (slideLayer==null){ 

    warning(WARNING_NO_SLIDE_LAYER);

    slideLayer=newNamecLayer(SLIDE_NAME,null);

    slideLayer,setSize(640,480);

    slideLayer,setOrigin(200,150);

  }

  slideLayer.show();

  //Initialize the presentation & slide address

  presentation._address=presentation.presentationID;

  setupEntity(presentation.slides[0],′Slide′,SLIDE_CLASS,
presentation); 
//    slideCacheAddress();

  //Init the various slide elements

  for (var myName in slideContent){

    var myContent=slideContent[myName];

      setupEntity(myContent,myName,myContent.type,slide);
  }

  //Mark the last known width and height for NS resize bug
workaround

  // (See comments in slideResize() for more details)

  if (ns4){

    lastWidth=window.innerWidth;

    lastHeight=window.innerHeight;

  }

  // Set up the resize handler

  if (!ns4||!slideIsEditable){

     window.onresize=slideResize;

  }  else {

     //PENDING(RWK)-NS4 workaround:In NS4.5/4.7,the resize
event

     //doesn′t appear to be getting sent in the edit slide page.
We′ve

     //been unable to pin this down to anything more than the page
just

    //being pretty complex(layer-wise).To work around this,we
set

    //up a timer that to call the resize handler everv second or
so.

    //This works because,on Netscape,this handler only does

    //something if the window actually changes size.

    slideResizeInterval=setInterval(′slideResize();′,1000);

  }

  //Render the slides

  render();

  if (ns4) setShowingBatched(false);

  slideIsRendered=true;
        <!-- SIPO <DP n="19"> -->
        <dp n="d19"/>
  /*

   *The Document Type Definition we use to do some checking of the

  integrity

   *

   *The fields are:

   *   attributeName,datatype,required/optional,defaultvalue

   * 

   *the defaultValue may be left out,in which case null is used

   */

  var dtd={

      SXPresentation:[

        [′currentSlideIndex′,  ′number′,  ′required′],

        [′presentationID′,     ′string′,  ′required′],

        [′slideCount′,         ′number′,  ′required′],

        [′slides′,             ′object′,  ′required′],

        [′slideTitles′,        ′object′,  ′required′]

      ],

      SXSlide:[

        [′title′,        ′string′, ′optional′],

        [′layoutName′,         ′string′,  ′optional′],

        [′contentEntities′,    ′object′,  ′required′],

        [′notes′,        ′string′, ′optional′]

      ],

      SXImage:[

        [′align′,        ′string′, ′optional′],

        [′backgroundColor′,    ′color′,   ′optional′],

        [′height′,       ′string′, ′optional′],

        [′left′,         ′string′, ′optional′],

        [′scale′,        ′string′, ′optional′],

        [′src′,                ′string′,  ′optional′],

        [′top′,                ′string′,  ′optional′],

        [′verticalAlign′,′string′, ′optional′],

        [′width′,        ′string′, ′optional′],

        [′zIndex′,       ′number′, ′optional′]

      ],

      SXText:[

        [′align′,        ′string′, ′optional′],

        [′backgroundColor′,    ′color′,   ′optional′],

        [′color′,        ′color′,  ′optional′],

        [′fontFamily′,         ′string′,  ′optional′],

        [′fontSize′,           ′number′,  ′optional′],

        [′fontStyle′,          ′string′,  ′optional′],

        [′fontWeight′,         ′string′,  ′optional′],

        [′height′,       ′string′, ′optional′],

        [′left′,         ′string′, ′optional′],

        [′text′,         ′string′, ′optional′],

        [′top′,                ′string′,  ′optional′],

        [′url′,                ′string′,  ′optional′],

        [′verticalAlign′,′string′, ′optional′],

        [′width′,        ′string′, ′optional′],

        [′zIndex′,       ′number′, ′optional′]

      ],

      SXOutline:[

        [′align′,        ′string′, ′optional′],

        [′backgroundColor′,    ′color′,   ′optional′],

        [′color′,        ′color′,  ′optional′],

        [′fontFamily′,         ′string′,  ′optional′],

        [′fontSize′,           ′number′,  ′optional′],

        [′fontStyle′,          ′string′,  ′optional′],

        [′fontWeight′,         ′string′,  ′optional′],
        <!-- SIPO <DP n="20"> -->
        <dp n="d20"/>
    [′height′,         ′string′,    ′optional′],

    [′left′,           ′string′,    ′optional′],

    [′nodeBulletType′,        ′string′,    ′optional′],

    [′nodeBulletValue′,       ′any′,           ′optional′],

    [′nodes′,          ′object′,    ′optional′],

    [′text′,           ′string′,    ′optional′],

    [′top′,                   ′string′,    ′optional′],

    [′url′,                   ′string′,    ′optional′],

    [′verticalAlign′,  ′string′,    ′optional′],

    [′width′,          ′string′,    ′optional′],

    [′zIndex′,         ′number′,    ′optional′]

  ]
};
//Run the dom check
setStatus(′Validating DOM′);
if (presentation.currentSlideIndex) presentation.currentSlideIndex=
parseInt(presentation.currentSlideIndex);
validateDOM(presentation);
setStatus(″);
/*
 * Methods to report an error in the DOM
 */
function domWarning(aProperty,aString){

  if (DEBUG_DOM) debugWriteln(′DOM Warning(′+ aProperty+′):′+
aString);
}
function domError(aProperty,aString){

  debugWriteln(′DOM Error(′+aProperty+′):′+aString);
}
/*
 *Validate the integrity of the dom
 */
function validateDOM(aNode){

  var myConstraints;

  //Select which set of constraints we want

  if (aNode.type==PRESENTATION_CLASS){

    myConstraints=dtd.SXPresentation;

  } else if (aNode.type==SLIDE_CLASS){

    myConstraints=dtd.SXSlide;

  } else if (aNode.type==IMAGE_CLASS){

    myConstraints=dtd.SXImage;

  } else if (aNode.type==TEXT_CLASS){

    myConstraints=dtd.SXText;

  } else if (aNode.type==OUTLINE_CLASS){

    myConstraints=dtd.SXOutline;
  } else{

    debugWriteln (′DOM Error:Unrecognized type- ′+aNode.type);

    debugObject(aNode);

    return;
  }

  //Check each property in the constraints

  for (var i=0;i<myConstraints.length;i++){

    var myProperty=myConstraints[i][0];

    var myType=myConstraints[i][1];

    var myConstraint=myConstraints[i][2];
        <!-- SIPO <DP n="21"> -->
        <dp n="d21"/>
     var valType=typeof(aNode[myProperty]);

     if (valType==UNDEFINED){

         domError(myProperty,′Undefined property. Setting to
null.′);

         aNode[myProperty]=null;

     } else{

         var myVal=aNode[myProperty];

         if (myVal==null){

           if (myConstraint==′required′){

               domError(myProperty,′Required property not set′);

           }

         } else{

           if (valType!=myType){

               if (myType==′number′){

                 domWarning(myProperty,′Recasting to′+myType);

                 aNode{myProperty]=myVal*l;

               } else if(myType==′string′){

                 domWarning(myProperty,′Recasting to′+myType);

                 aNode{myProperty]=myVal+′′;

               } else if (myType==′color′){

                 //PENDING(RWK)-Remove this when we no longer
have problems with

                //colors being set to unexpected values

               if ((myVal==UNDEFINED) ||

                   ((myVal.search(/[^0-9,a-f,A-F]/)==-1) &&

                   (myVal.length!=6))){

                   domError(myProperty,′Bad color value″′+
myVal+′″.Setting to null.′);

                   aNode[myProperty]=null;

               } else{

               }

             } else if (myType!=′any′){

               domError(myProperty,′Can\′t convert to′+
myType);

             }

          }

        }

     }

   }

  //Go to the next node

  if (aNode.type==PRESENTATION_CLASS){

    myConstraints==dtd.SXPresentation;

    validateDOM(aNode.slides[0]);

  } else if (aNode.type==SLIDE_CLASS){

    if (aNode.contentEntities!=null){

        for (var myName in aNode.contentEntities){

          validateDOM(aNode.contentEntities[myName]);

        }

    }

  } else if (aNode.type==OUTLINE_CLASS){

    //PENDING(RWK)-Check for image bullet types and turn them

    //into bullets.

    //Once we′re confident there aren′t any more image bullets in

    //presentations,this can check can be removed.

    if (aNode.nodeBulletType==′image′){

        aNode.nodeBulletType=′text-symbol′;

        aNode.nodeBulletValue=9679;

        domWarning(myProperty,′Image bullet found.(Converting to
a symbol bullet,but you should do this manually to avoid this
warning in the future.)′);
        <!-- SIPO <DP n="22"> -->
        <dp n="d22"/>
  }

  //Check the subnodes of this node

  if(aNode.nodes!=null){

     for(var i=0;i<aNode.nodes.length;i++){

       validateDOM(aNode.nodes[i]);

     }

  }
  }
  //Cache the urls of images that we want to preload
  if (aNode.type==IMAGE_CLASS){

  CXUtil.preloadImage(aNode.src);
  } else if (aNode.type==OUTLINE_CLASS){

  if (aNode.nodeBulletType==′image′){

      CXUtil.preloadImage(aNode.nodeBulletValue);
  }
}
/*
 *Resize handler to manage resizing of the slide
 */
function slideResize(anEvent){

  if (ns4){

    //PENDING(RWK)-NS4 workaround:Netscape massacres javascript

    //code when the window is resized. We detect actual window
size

    //changes and force a complete refresh of the document. (The

    //downside of this is that all javascript state is lost.)

    if((lastWidth!=window.innerWidth)||

       (lastHeight!=window.innerHeight)){

       if (slideResizeInterval){

          clearInterval(slideResizeInterval);

         slideResizeInterval=null;

       }

       if(resizeTimeout)clearTimeout(resizeTimeout);

       window.location.href=window.location.href;

    }

  } else{

    if(!slideIsEditable){ 
       if ((typeof(playbackControls)!=UNDEFINED) &&

         playbackControls.isVisible()){

         playbackControls.hide();

       }

       render();

    }

  }

  return false;
}
/*
 *This function is called whenever the address needs to be set
 */
function setAddress(myContent,myName,myParent){

  //Set the name and address of the content object

  myContent._name=myName;

  myContent._subtype=myContent._name.replace(/[0-9]/g,″);

  if (myContent.type==PRESENTATION_CLASS){

    myContent._address=presentation.presentationID;
        <!-- SIPO <DP n="23"> -->
        <dp n="d23"/>
  } else if (myContent.type==SLIDE CLASS){

    myContent._address=myParent._address+

        ′.slides[′+presentation.currentSlideIndex+′]′;

  } else{

    myContent._address=slide._address+

          ′.contentEntities[′+myContent._name+′]′;

  }
}
/*
  * Call this to turn off rendering
  */
function setRenderingEnabled(aFlag){

  // NB:this may be set in the html

  if {typeof(renderingDisableLevel)==UNDEFINED)
renderingDisableLevel=0;

  if (aFlag && renderingDisableLevel>0){

      renderingDisableLevel--;

  } else{

      renderingDisableLevel++;

  }
}
/*
  * Is rendering turned off
  */
function isRenderingEnabled(){

  if (typeof(renderingDisableLevel)==UNDEFINED){

      return true;

  }

  return (renderingDisableLevel<=0);
}
/*
  * This function runs various setups for a new entity.
  * It is only called by newEntity().
//PENDING(HJK) this should maybe be used in slideInit and slideCache
address
  */
function setupEntity(myContent,myName,myClass,myParent){

  myContent.type=myClass;

  setAddress(myContent,myName,myParent);

  if (myContent.type==OUTLINE_CILASS) initOutline(myContent);

  if ((myContent.type==TEXT_CLASS )||

    (myContent.type==IMAGE_CLASS)){

     //Create the layer we′ll need for the object

     myContent._layer=newNamedLayer(myName,slideLayer.layer);

     //Create association between content and layer

     myContent._layer._content=myContent;

     //Make the layer visible

     myContent._layer.show();

  }
}
//
//Size caching methods
        <!-- SIPO <DP n="24"> -->
        <dp n="d24"/>
  //
  /*

  * Cache the address information of DOM objects

  */
  function slideCacheAddress(){

    // Initialize the presentation & slide address

    presentation._address=presentation.presentationID;

    slide._address=presentation._address+

      ′.slides[′+presentation.currentSlideIndex+′]′;

    // Init the various slide elements

    for (var myName in slideContent){

      var myContent=slideContent[myName];

      // Set the name and address of the content object

        setAddress(myContent,myName,slide);

      if (myContent.type==OUTLINE_CLASS){

         outlineCacheAddress(myContent);

      }

    }
  }
  /*
   * Update any geometry we′re interested in
   */
  function cacheSizes(){

    // Use the slide layer width/height to find the scaling factors

    if (ns4 && slideIsEditable) {

       // PENDING(RWK)-Unfortunately on netscape the Slide layer

       // may be clipped(e.g.if the window is really small).
  There′s

      //know way to know what the layer size is supposed to be.

      //So,to make sure the elements are shown at the proper size

      //during editing(the only time this is really a problem)

      //we hard code the size here.

      clientWidth=560;

      clientHeight=420;

    } else{

      var myBounds=slideLayer.getBounds();

      clientWidth=myBounds.width;

      clientHeight=myBounds.height;

    }
  /*  PENDING(RWK)-Code to use the window dimensions as the slide size
     if (ns4) {

       clientWidth=window.innerWidth;

       clientHeight=window.innerHeight;

     } else{

       clientWidth=document.body.clientWidth;

       clientHeight=document.body.clientHeight;

     }
  */

    // Figure the scaling  factors

    xScale=clientWidth/V_WIDTH;

    yScale=clientHeight/V_HEIGHT;

    scale=(xScale<yScale)?xScale:yScale;

    //Use this to scale based on the diagonal of the display area
        <!-- SIPO <DP n="25"> -->
        <dp n="d25"/>
    //scale=Math.sqrt(clientWidth*clientWidth+
  clientHeight*clientHeight)/V_DIAG;
  }
  //
  // Bounds retrieval methods
  //
  /*
   * Translate the dimensions of a layout object to real layer
  coordinates
   */
  function getAdjustedBounds(aContent){

    var myBounds=new Object();

    if ((aContent.left!=null) &&

      (typeof(aContent.left)==′string′) &&

      (aContent.left.lastIndexOf(′%′)!=-1)){

      myBounds.left=parseInt(aContent.left)*clientWidth/100;

    } else {

      myBounds.left=(myBounds.left!=null)?
  parseInt(aContent.left):null;

    }

    if ((aContent.top!=null) &&

      (typeof(aContent.top)==′string′) &&

      (aContent.top.lastIndexOf(′%′)!=-1)){

      myBounds.top=parseInt(aContent.top)*clientHeight/100;

    } else {

      myBounds.top=(myBounds.top!=null)?parseInt(aContent.top)
  :null;

    }

    if ((aContent.width!=null) &&

      (typeof(aContent.width)==′string′) &&

      (aContent.width.lastIndexOf(′%′)!=-1)){

       myBounds.width=parseInt(aContent.width)*clientWidth/100;

     } else {

       myBounds.width=(myBounds.width!=null)?
  parseInt(aContent.width):null;

     }

     if ((aContent.height!=null) &&

       (typeof(aContent.height)==′string′) &&

       (aContent.height.lastIndexOf(′%′)!=-1)){

       myBounds.height=parseInt(aContent.height)*clientHeight/100;

     } else {

       myBounds.height=(myBounds.height!=null)?
  parseInt(aContent.height):null;

     } 

     myBounds.zIndex=aContent.zIndex;

     return myBounds;
  }
  /*
   * Return a value scaled by the generic scaling factor
   */
  functicn adjust(aNum){

    var myVal=aNum*scale;
        <!-- SIPO <DP n="26"> -->
        <dp n="d26"/>
   return(isNaN(myVal))?aNum:Math.round(myVal);
}
/*
 * Return a value scaled by the width scaling factor
 */
function adjustX(aNum){

  if (typeof(aNum)!=′number′)return aNum;

   return Math.round(aNum*xScale);
}
/*
 * Return a value scaled by the height scaling factor
 */
function adjustY(aNum){

  if(typeof(aNum)!=′nurmber′)return aNum;

  return Math.round(aNum*yScale);
}
//
//Rendering methods
//
/*
 * Render all the layers named in the content object
 */
function render(){

  //Get the client screen size

  cacheSizes();

  if (!isRenderingEnabled()) return;

  // Set the clipping region of the slide layer

  //

  // PENDING(RWK)-NS4 workaround;without this clip,NS4

  // clips the slide to approximatlely 1/2 it’s width

  slideLayer.setClipRect(0,0,clientWidth,clientHeight);

  // Render each content element

  for (var myName in slideContent){

    setStatus(′Rendering(′+myName+′)′);

    renderContent(myName);

  }
}
/*
  * Need this on netscape so we can fix the display(not doneyet)
  */
function hasTransparentImages(){

  for (var myName in slideContent){

    var myContent=slideContent[myName];

      if (myContent.type==IMAGE_CLASS &&

          myContent.backgroundColor==null){

          return true;

      }

  }

  return false;
}
/*
 * Write the contents associated with a layer
        <!-- SIPO <DP n="27"> -->
        <dp n="d27"/>
 */
function renderContent(aName,isMove){

  if (!isRenderingEnabled())return;

  // PENDING(RWK)-Minor hack to make sure we render an entire
outline,even

  // if we′re passed the name of one of the subnodes

  // (Also note that the regex is not supposed to be a string!Very
wierd.)

  aName=aName.replace(/:.*/g,″);

  // Get references to the properties

  var myContent=slideContent[aName];

  // Get the adjusted bounds(as a separate object so that if the
window

  // is resized,we still have the original specification to
recompute

  // from.)

  var myBounds=getAdjustedBounds(myContent);

  // Get the layer the content will be rendered into

  var myLayer=myContent._layer;

  // For easy content...

  if (myContent.type!=OUTLINE_CLASS)(

    // Error check for missing layer

    if(!myLayer){

       warning(′Unable to locate layer″′+aName+′″′);

       return;

    }

    // Explicitely set the layer index.

    myLayer.style.zIndex=myBounds.zIndex;

    //Set the layer position

    myLayer.setOrigin(myBounds.left,myBounds.top);

      if(!isMove){

         myLayer.setSize(myBounds.width,myBounds.height);

         // Set the default alignments

         myLayer.setAlign(′center′);

         myLayer.setVerticalAlign(′middle′);

         if (ns4){

             // Netscape does not understand 0 dimension,it reads
this as unbounded

             if (!myBounds.width || myBounds.width<=0)
myBounds.width=1;

             if(!myBounds.height || myBounds.height<=0)
myBounds.height=1;

         }

         // Call the appropriate renderer,based on type

         if (aName==BACKGROUND_NAME){

             renderBackground(myLayer,myContent,myBounds);

         } else if (myContent.type==TEXT_CLASS){

             renderText(myLayer,myContent,myBounds);

         } else if (myContent.type==IMAGE_CLASS){

             renderImage(myLayer,myContent,myBounds);

         }
        <!-- SIPO <DP n="28"> -->
        <dp n="d28"/>
          // Flush what we′ve written to the layer

          myLayer.flush();

      }

  } else {

    // Special case for outline
    renderOutline(myLayer,myContent,myBounds,(!isMove)?false:
true);

  }
}
/*
 * All hyperlinks come through this method,to apply rules to URLs,
and display.
 *
 * URL munging:
 * any string with an″@″w/o a protocol is assimed to be a mailto:
 * any plain number is assumed to be a slideNUMBER(as distinct from
a slideID)
 * any string starting with″?″are assumed to be a link to another
presentation on this host
 * any string (other than the ones above) w/o a protocol get
″http://″added to them.
 *
 * Display:
 * any iamaze URL is shown in this window
 * all ther windows appear in a separate window
 */
function startLinkTag(aURL){

  var myLink=null;

  var myTarget=′target=″user_link″′;

  if(slideIsEditable){

      myLink=′<u>′;

  ] else {

    if (aURL.indexOf(′:′)==-1){

        if (aURL.indexOf(′@′)!=-1){

          aURL=″mailto:″+aURL;

        } else {

          var myNumber=parseInt(aURL);

          // if the url is a number,treat as a slideNumber(origin
1)

          if (!isNaN(myNumber) && (myNumber+′′)==myNumber){

              // Force number into proper range

             if (myNumber<1){

               myNumber=1;

             } else if(myNumber>
presentation.slideTitles.length){

                myNumber=presentation.slideTitles.length;

             }

             aURL=′?′+

               ′presentationID=′+presentationID()+′&′+

               ′slideID=′+(myNumber-1);

           } else if (!aURL.startsWith(′?′)){

               // Prefix with http://for URLs that don′t specify a
protocol

               aURL=″http:\/\/″+aURL;

          }

        }

        //Handle?syntax for specifying the arguments to a
        <!-- SIPO <DP n="29"> -->
        <dp n="d29"/>
         //presentation w/o supplying a host

         if (aURL.startsWith(′?′)) aURL=getBase()+aURL;

         // Put all internal URLs in same window

         if (aURL.startsWith(getBase())||(aURL.indexOf(″iamaze″)
!=-1)) myTarget=null;

     }

     if ((!myTarget) || aURL.startsWith(″mailto:″)){

          myLink=′<a href=″′+aURL+′″>′;

     } else {

         myLink=′<a href=″′+aURL+′″′+myTarget+′>′;

     }

  }

  return myLink;
}
/*
 * end of a link tag(handled differently on play vs edit).
 */
function endLinkTag(){

  return(!slideIsEditable?′</a>′:′</u>′);
}
/*
 * Replace special tokens in the text
 */
var slideTokens=[

  /\%SlideNumber%/g,(presentation.currentSlideIndex+1),

  /\%SlideCount%/g,presentation.slideCount,

  null
];
function replaceSlideTokens(aString){

  for (var i=0;slideTokens[i]!=null;i+=2){

    aString=aString.replace(slideTokens[i],slideTokens[i+1]);

  }

  return aString;
}
/*
 * Write text content
 *
 * aLayer:the layer to write one text into
 * aContent:an object containing any combination of the following
properties
 *    align         -One of″left″,″center″,or″right″
 *    color         -Either a named color or a color in the form
′RRGGBB′
 *    fontFamily    -A comma separated list of font names
 *    fontSize      -A number(not a string!)specifying the font
point size
 *    fontStvle     -Either null  or ′italic′
 *    fontWeight    -Either null or ′bold′
 *    text          -Arbitrary text string
 *    url           -A valid URL
 *    verticalAlign -One of″top″,″middle″,or″bottom″
 */
function renderText(aLayer,aContent,aBounds){

  // Check for nothing worth rendering during playback
        <!-- SIPO <DP n="30"> -->
        <dp n="d30"/>
  if ((!aContent.text) && (!aContent.backgroundColor) &&
(!slideIsEditable)) return;

  // PENDING(RWK)-Really ugly workaround to make sure we don′t
lose the

  // style infomation when rendering to the layer

  if (ns4) aLayer.doLayerHack();

  // Set the layer color and alignment

  aLayer.setBackgroundColor(aContent.backgroundColor);

  aLayer.setAlign((aContent.align!=null)?aContent.align:
′left′);

  aLayer.setVerticalAlign((aContent.verticalAlign!= null)?

    aContent.verticalAlign:′top′);

  // Figure out what text we want

  var myText=aContent.text;

  // Do token replacement for slide numbers

  if (aContent._subtype ==′SlideNumber′){

    myText=replaceSlideTokens(myText);

  }

  // PENDING(RWK)-IE workaround:There is a wierd problem with
line

  // spacing in multiple lines of text. We fix this by simply
ensuring

  // that the last character is a space. (Don′t ask me why this
works,

  // but it does)

  if (ie4 && myText && (myText.indexOf(′\n′)!=-1) &&
myText[myText.length-1]!=′′)

     myText +=′′;

  // Use default text if we′re editing and the text is empty

  if (slideIsEditable && (!myText))myText=DEFAULT_DIRECTIONS +
′+

      DEFAULT_TEXT_STRING+′′+aContent.name;

  // Render the content

  if (myText) {

    // Write the url start tag

    if (aContent.url) {

        aLayer.write(startLinkTag(aContent.url));

    }

    // Write the text

    writeTextStyle(aLayer,aContent);

    aLayer.write(myText.escapeForHTML());

    aLayer.writeln(′</font>′);

    // Write the url end tag

    if (aContent.url) aLayer.write(endLink
  }
}
/*
 * Write style information for text content
 */
function writeTextStyle(aLayer,aContent) {

  var style =′′;
        <!-- SIPO <DP n="31"> -->
        <dp n="d31"/>
  if (aContent.fontSize!=null) style+=′font-size:′+
adjust(aContent.fontsize)+′pt′;

  if (aContent.fontFamily!=null) style+=′;font-family:′+
aContent.fontFamily;

  if (aContent.fontStyle!=null) style+=′;font-style:′+
aContent.fontStyle;

  if (aContent.fontWeight!=null) style+=′;font-weight:′+
aContent.fontWeight;

  if (aContent.color!=null) style+=′;color:′+
aContent.color;

  aLayer.write(′<font style=″′+style+′″>′);
}
/*
 * Write background content
 */
function renderBackground(aLayer,aContent,aBounds){

  aBounds.left=aBounds.top=0;

  aBounds.width=clientWidth;

  aBounds.height=clientHeight;

  renderImage(aLayer,aContent,aBounds);

  aLayer.setOrigin(0,0);

  aLayer.setSize(clientWidth,clientHeight);

  return;
}
/*
 * Write image content
 *
 * aLayer:the layer to write the text into
 * aContent:an object containing any combination of the following
properties
 *    align            - One of″left″,″center″,or″right″
 *    src              - A URL specifying the source of the image
 *    scale            -  ′fit′scales the image. Everything else is
unscaled.
 *    file             - If the file was uploaded,the filename where
the image came from
 *    verticalAlign    -One of″top″,″middle″,or″bottom″
 * aBounds:The bounds of the image area
 */
function renderImage(aLayer,aContent,aBounds) {

  // Set the background color
  aLayer.setBackgroundColor(aContent.backgroundColor);

  // Write the empty content string?

  if ((aContent.src==null) &&

    (aContent.backgroundColor==null)){

     if (slideIsEditable && (aContent.name!=BACKGROUND_NAME))

         aLayer.write(DEFAULT_DIRECTIONS+′′+
DEFAULT_IMAGE_STRING+′′+aContent.name);

     return;
  }

  // Get a cleaned up version of the image source URL

  var mySrc=aContent.src;

  if (mySrc && (mySrc.indexOf(′:′)==-1) &&

    !mySrc.startsWith (′/′) && !mySrc.startsWith(′\\′)){

    //PENDING(RWK)-Note that we are a little stricter with the
source

    // URL since it may be an iAmaze server image reference
        <!-- SIPO <DP n="32"> -->
        <dp n="d32"/>
    mySrc=′http:\/\/′+mySrc;

  }

  // Defer rendering the image?

  if ((mySrc!=null) && (deferImageContent(aContent,mySrc)))
return;

  // Write out the href link

  if (aContent.url!=null && !slideIsEditable){

    aLayer.write(startLinkTag(aContent.url));

  }

  // Write a shim image?

  var myScale=aContent.scale;

  if ((!mySrc) || (myScale==SCALE_TILE)){

     //Write the shim image to size the layer properly

     aLayer.write(′<img src=″′+SHIM_IMAGE+′″′+

         ′width=′+aBounds.width+′height=′+aBounds.height+

         ′hspace=0 vspace=0 border=0>′);

  }

  //Render the image

  if (mySrc){

    if (myScale==SCALE_TILE){

        // Set the image as the layer background

        aLayer.setBackground(mySrc);

    } else {

        // Use the shim image to make sure the table will be as
small as needed

        if (mySrc==null){

           mySrc=SHIM_IMAGE;

           myScale=SCALE_FIT;

        }

        aLayer.write(′<img src=″′+mySrc+′″′);

        if (myScale==SCALE_FIT){

          aLayer.write(′width=′+aBounds.width+′height=′+
aBounds.height);

         } else if (myScale==SCALE_WIDTH){

           aLayer.write(′width=′+aBounds.width);

         } else if (myScale==SCALE_HEIGHT){

           aLayer.write(′height=′+aBounds.height);

         }

           //When editing on netscape,name the image and catch the
onload (see imageLoaded)

         if (ns4 && slideIsEditable){

               aLayer.write(′name=″′+IMAGE_NAME_PREFIX+
aLayer.name+

               ′″onload=″imageLoaded(this)″′);
         }

      aLayer.write(′hspace=0 vspace=0 border=0>′);

      // And make sure any previous tiling is removed

      aLayer.setBackground(null);

    }

  } else if (aLayer.getBackground()){

    aLayer.setBackground(null);

  }

  // Close out the href

  if ((aContent.url!=null) && !slideIsEditable){
        <!-- SIPO <DP n="33"> -->
        <dp n="d33"/>
    aLayer.write(endLinkTag()};

  }

  if (aContent.align!=null) aLayer.setAlign(aContent.align);

  if (aContent.verticalAlign!=null)

    aLayer.setVerticalAlign(aContent.verticalAlign);
}
// PENDING(RWK)-Buttugly IE5 workaround:The image onload event
appears to get sent before the slide is actually ready(the complete
flag is still false and the image fails to render.)Instead of
relying on the event,we set up an interval to poll the images at
reasonable intervals. Ugly,ugly,ugly!
var deferredInterval=null;
/*
 * PENDING(RWK)-IE5 workaround(part 1 of 2):Images that load in
 * a delayed fashion are not rendered.
 *
 * Return true if we have to wait for an image to load,false
 * if the image is already loaded.
 *
 * For images that are not loaded,add the image to our load queue
 * and set up an onload handler to check the queue when the image
 * loaded.
 */
var deferredContent=new Array();
function deferImageContent(aContent,aSrc){
// PENDING(RWK)-I′m turning this off for a while to see how well
things behave. If things continue to work,then we might consider
deleting this code.
return false;

  if ((!ie4) || (version<5)) return false;

  // Create and configure only if the image doesn′t already exist

  if (!aContent._image){

    aContent._image=new Image(1,1);

    aContent._image.src=aSrc;

  // Defer the image if it′s not loaded

  if (!aContent._image.complete){

      deferredContent.addObject(aContent);

      if (!deferredInterval){

        deferredInterval=setInterval(′deferredImageCheck()′,
333);

       }

    }

  }

  return (aContent._image.complete)?false:true;
}
/* 
 * PENDING(RWK)-IE5 workaround (part 2 of 2):Images that load in
 * a delayed fashion are not rendered.
 *
 * This method is called any time one of our deferred images becomes
loaded.
 * Determine which content the image was for,and render that
content.
 */
        <!-- SIPO <DP n="34"> -->
        <dp n="d34"/>
function deferredImageCheck(aString){

  for (var i=deferredContent.length-1;i>=0;i--}(

    var myContent=deferredContent[i];

    if (myContent._image.complete){

        // Turn off the handler since animated images will keep
calling

        // the handler,and remove the content.

        // myContent._image.onload=null;

        deferredContent.removeIndex(i);

        // Render the content

        renderContent(myContent._name);

    }
  }
  // Turn off the timer if there are no deferred images
  if ((deferredContent.length==0) && (deferredInterval)){

  clearInterval(deferredInterval);

  deferredInterval=null;
  }
}
/*
 * Convenience method to determine if the mouse position of
 * anEvent is within the slide
 */
function isEventOnSlide(anEvent){

  var myBoundsLayer=slideLayer;

  return myBoundsLayer.isHit(anEvent);
}
/*
 * Convenience method to determine if a location
 * is within the slide
 */
function isPointOnSlide(aLeft,aTop){

  var myBoundsLayer=slideLayer;

  // Cache the bounds,it never changes,and this method is called

  // a LOT,so we don′t want to alloc a bounds each time

  if (myBoundsLayer.myCachedBounds==null)

      myBoundsLayer.myCachedBounds=
myBoundsLayer.getAbsoluteBounds();

  var mb=myBoundsLayer.myCachedBounds;

  if (aLeft>=mb.left && aLeft<=(mb.left+mb.width) &&

      aTop>=mb.top && aTop<=(mb.top+mb.height))

      return true;

  return false;
}
/*
 * Accessor for presentationID,for use in URLs
 */
function presentationID(){

  var pid=presentation.presentationID;

  if (pid.startsWith(′com.′)){

      myStart=pid.indexOf{′_′);

      if (myStart>0) pid=pid.substring(myStart+1);

  }
  return pid;
        <!-- SIPO <DP n="35"> -->
        <dp n="d35"/>
}
/*
 * Accessor for formatted titles of slides(used in UI slide
choosers)
 */
function formattedslideTitle(index,maxChars,minChars,padChar){

  if (index<0 || index>=presentation.slideTitles.length)

      return′Unknown slide index′+index;

  var sTitle=(index+1)+′.′+presentation.slideTitles[index];

  var newln=sTitle.indexOf(′\n′);

  if (newln>0){

      sTitle=sTitle.substring(0,newln-1);

      if ((sTitle.length+3)<maxChars)

           sTitle+=′...′;

  }

  return sTitle.insureLength(maxChars,minChars,padChar);
}
/*
 * Is this content entity the background
 */
function isBackground(aContent){

  if (aContent==null || aContent. name==null)return false;

  return (aContent._name==BACKGROUND_NAME);
}
/*
 * Returns the object of the highest number with the passed
objectName
 */
function slideLastObject(objectName){

  // The new entity code makes sure that the numbers are
contiguous,

  // so look fo the first gap.

  if (slideContent[objectName+′1′]){

      var biggest=1;

      for (var myName in slideContent){

           if (myName.startsWith(objectName)) {

               var myIndex=
parseInt(myName.substr(objectName.length));

              if (myIndex>biggest) biggest=myIndex;

           }

      }

      return objectName + biggest;

  }

  return null;
}
/* 
 * This is called whenever any image content is finished loading
 * Workaround for a bug where handlers were not set properly
 * on large images (Netscape)
 */
function imageLoaded(anImage){

  if (ns4 && anImage && anImage.name){
setRolloversToCurrentState(getNamedLayer(anImage.name.substr(IMAGE_NA
ME_PREFIX.length)));

     command.safeToSend();
        <!-- SIPO <DP n="36"> -->
        <dp n="d36"/>
  }
}
//
// CXElementIterator class
//
// This class iterates through the elements of a slide
// aFilter-A function that accepts an element as it′s only
// parameter and returns true for it to be included,false to
// exclude it.
//
function CXElementIterator(aSlide,aFilter){

  this.filter=(aFilter)?aFilter:CXElementIterator.ALL;

  this._elements=new Array ();

  this.nextElementIndex=0;

  for (var myName in aSlide.contentEntities){

    this._addElementToIterator(aSlide.contentEntities[myName]);

  }
}
CXElementIterator.prototype=new CXIterator();
CXElementIterator.ALL=function(anElement){return true;}
CXElementIterator.prototype._addElementToIterator=
function(anElement){

  if (anElement && this.filter(anElement)){

    this._elements[this._elements.length]=anElement;

    if (anElement.nodes){

        for (var i=0;i<anElement.nodes.length;i++)

          this._addElementToIterator(anElement.nodes[i]);

    }

    }
}
CXElementIterator.prototype.hasNext=function(){

  return(this.nextElementIndex<this._elements.length);
}
CXElementIterator.prototype.next=function(){

  return this.elements[this.nextElementIndex++};
}
表11解释轮廓文档数据结构的JavaScript
function CXOutline(){};
CXOutline.version=1;
CXOutline.name=′Outline′;
CXSystem.registerLibrary(CXOutline);
/**************************/
//
//Global vars
        <!-- SIPO <DP n="37"> -->
        <dp n="d37"/>
//
// Default text to show when a node has no text
var DEFAULT_OUTLINE_STRING=′Empty outline item′;
// Constants for the type of bullet
var BULLET_TEXT=       ′text′;
var BULLET IMAGE=              ′image′;
// RWK-It′s important for these to start with the BULLET_TEXT
// string since we do startsWith() comparisons on them.
var BULLET_SYMBOL=            ′text-symbol′;
var BULLET_LETTER_LOWER=      ′text-letter-lower′;
var BULLET_LETTER_UPPER=      ′text-letter-upper′;
var BULLET_NUMBER_PLAIN=      ′text-number-plain′;
var BULLET_NUMBER_NESTED=     ′text-number-nested′;
var BULLET_ROMAN_LOWER=       ′text-roman-lower′;
var BULLET_ROMAN_UPPER=       ′text-roman-upper′;
// Common symbol bullet characters
var SYMBOL_DASH=8211;
var SYMBOL_DOT=8226;
/*
 * Initialize an outline
 */
function initOutline(aNode){

  // Init the layers array for outline nodes

  aNode._nodeLayers=new Array();

  // Init the root node and all subnodes

  aNode._parentNode=null;

  aNode._rootNode=aNode;

  aNode.level=0;

  if ((aNode.nodes!=null) && (aNode.nodes.length>0)){

    outlineInitNode(aNode);

    outlineCacheAddress(aNode);

  } else if (slideIsEditable){

    // If the root node has no nodes,create a placeholder

    // so the user has something to click on when editing.

    var newNode=new Object();

    aNode.nodes=new Array();

    aNode.nodes.addObject(newNode);

    aNode.nodeBulletType=BULLET_SYMBOL;

    aNode.nodeBulletValue=SYMBOL_DOT;

    outlineInitNode(aNode);

    outlineCacheAddress(aNode);

    // Set the address to null to mark this as a placeholder node

    newNode.address=null;

  }

  // make the height match the nodes

  aNode._rootNode.dirtyHeight=true;
}
/*
 * Recursively initialize outline nodes.
 *
 * - Set the type of each node to OUTLINE_CLASS
 * - Set the root node of each node.
 * - Set the parent of each node.
        <!-- SIPO <DP n="38"> -->
        <dp n="d38"/>
 * - Enumerate through the nodes of an outline and name the node
after
 * it′s node location.
 */
function outlineInitNode(aNode){

  // Error check

  if (aNode.nodes==null)return;

  // Enumerate through each node

  for (var i=0;i<aNode.nodes.length;i++){

    var myNode=aNode.nodes[i];

    myNode.type=OUTLINE_CLASS;

    myNode._name=aNode._name+′:′+i;

    myNode._parentNode=aNode;

    myNode._rootNode=aNode._rootNode;

    myNode._level=aNode._level+1;

    myNode._subtype=aNode._subtype;

    if ((myNode.nodes !=null) && (myNode.nodes.length>0)){

        // If we didn′t just create one,than initialize the node

        outlineInitNode(myNode);

    }
   }
}
/*
 * Cache the address of each outline node
 */
function outlineCacheAddress(aNode){

  //Error check

  if (aNode.nodes==null)return;

  // Enumerate through each node

  for (var i=0;i<aNode.nodes.length;i++){

    var myNode=aNode.nodes[i];

    myNode._address=aNode._address+′.nodes[′+i+′]′;

    if ((myNode.nodes !=null) && (myNode.nodes.length>0)){

        // If we didn′t just create one,than initialize the node

        outlineCacheAddress(myNode);

    }

  }
}
//
// Outline rendering
//
/*
 * Write outline content
 *
 * Outlines are implemented by rendering each node in it′s own layer.
 * For convenience,the layers are stored in the′_nodeLayers′array
within
 * the root node,which is initialized in the initSlide() method.
 */
function renderOutline(aLayer,aContent,aBounds,isMove){

  // Set up some default properties

  aContent.verticalSpacing=8;

  aContent.indentSpacing=45;

  aContent.heightInPixels=0;// (we′ll total this up)

  // Create.the render context and init it
        <!-- SIPO <DP n="39"> -->
        <dp n="d39"/>
  var myContext=new Object();

  // Set the origin and available width

  myContext.left=aBounds.left;

  myContext.top=aBounds.top;

  myContext.width=aBounds.width;

  myContext.zIndex=aBounds.zIndex;

  myContext.indentSpacing=aContent.indentSpacing;

  myContext.verticalSpacing=aContent.verticalSpacing;

  // Set the layers information

  myContext.nextLayerIndex=0;

  // Set the properties

  myContext.nodeBulletPrefix=null;

  myContext.nextBulletValue=1;

  // Set the effects information

  myContext.effectStartTime=0;

  // Error check-Just return if there′re no nodes

  // PENDING(RWK)-Hmm.′Not 100% sure why I put this here.

  if (aContent.nodes==null)return;

  // Render the nodes

  renderOutlineNodes(aContent,myContext,(!isMove)?false:
true);

  // Hide any unused layers

  while (myContext.nextLayerIndex<aContent._nodeLayers.length){

    aContent._nodeLayers[myContext.nextLayerIndex++].hide();

  }

  if (slideIsEditable){

      if (ns4) setRolloverEvents(true);

      if (aContent.dirtyHeight!=false){

         aContent.height=

              Math.round((aContent.heightInPixels/

              (slideLayer.getAbsoluteBounds()).height)*
100).toString()

              +″%″;

          aContent.dirtyHeight=false;

      }

  }
}
/*
 * Create an outline node
 */
function renderOutlineNodes(anOutline,aContext,isMove){

  var myLayers=anOutline._rootNode._nodeLayers;

  // Enumerate through thenode list

  for (var i=0;i<anOutline.nodes.length;i++){

  var myNode=anOutline.nodes[i];

  var myLayer=null;

  // Create a new layer if needed

  if (aContext.nextLayerIndex>=myLayers.length){

      myLayer=newNamedLayer(

        anOutline._name+′-′+myLayers.length,
        <!-- SIPO <DP n="40"> -->
        <dp n="d40"/>
            slideLayer.layer);

          myLayers.addObject(myLayer);

          // Turn off wrapInTable(we create our own table)and set

          // the alignment

          myLayer.setWrapInTable(false);

          myLayer.setVerticalAlign(′top′);

      } else {

          // Recycle an existing layer

          myLayer=myLayers[aContext.nextLayerIndex];

          // PENDING(RWK)-Really ugly workaround to make sure we
don′t lose the

         // style information when rendering to the layer

         if (ns4 && (!isMove)) myLayer.doLayerHack();

     }

     // Set the association between content and layer

     //

     // We do this here for outlines rather than in initSlide()

     // because,unlike other elements,nodes may switch layers

     // (this happens ifa node is added,deleted,or moved during

     // editing).

     myLayer._content=myNode;

     myNode._layer=myLayer;

     //Set the bounds-Make the height tiny so the content will
push

     //the layer to the proper height.

     myLayer.setSize(aContext.width,0);

     myLayer.setOrigin(aContext.left,aContext.top);

       if ((!isMove)){//PENDING(HJK) weird indenting for diffs

           // Set the background color of the laver

           myLayer.setBackgroundColor(myNode.backgroundColor);

           // Write the table tag for the layer

           myLayer.write(myLayer.tableTag());

           myLayer.write(′<tr>′);

           //Write the outline node

           var myType=myNode.nodeBulletType;

           var myPadding=null;

          // Write out the bullet cell

          if (myType!=null){

              // Render the bullet cell

              myLayer.write(′<td valign=″top″width=″lpx″>′);

              if (myType.startsWith(BULLET_TEXT)){

                  var myText=null;

                  writeTextStyle(myLayer,myNode);

                  // Determine the prefix string

                  var myPadding= ′.&nbsp;′;

                  var myValue=(myNode.nodeBulletValue==null)?

                      aContext.nextBulletValue:

                      myNode.nodeBulletValue;

                  if (myType==BULLET_SYMBOL){

                      myText=′&#′+myValue+′;′;
        <!-- SIPO <DP n="41"> -->
        <dp n="d41"/>
                     myPadding=′&nbsp;&nbsp;′;

                 } else if (myType==BULLET_LETTER_LOWER) {

                     myText=toLetter(myValue,false);

                 } else if (myType==BULLET_LETTER_UPPER) {

                     myText=toLetter(myValue,true);

                 } else if (myType==BULLET_NUMBER_PLAIN) {

                     myText=myValue;

                 } else if (myType==BULLET_NUMBER_NESTED){
                     myText=(aContext.nodeBulletPrefix!=null)
?

                        (aContext.nodeBulletPrefix+′.′+
myValue):

                         myValue;

                 } else if (myType==BULLET_ROMAN_LOWER) {

                     myText=toRoman(myValue,false);

                 } else if (myType==BULLET_ROMAN_UPPER) {

                     myText=toRoman(myValue,true);

                 } else {

                     warning(′Unrecognized bullet type: ′+
myType);

                 )

                 myLayer.write(myText);

                 myLayer.write(′</font>′);

                 aContext.nextBulletValue=myValue+1;

             } else if (myType==BULLET_IMAGE){

  //PENDING(RWK)-Remove this block once all outlines have had
the image bullets removed

                  var myValue=myNode.nodeBulletValue;

                  if (myNode.fontSize!=null) {

                      myLayer.write(′<img height=′+

                          adjust(myNode.fontsize*.8)+′px′

                          +′src=″′+myValue+
′″>&nbsp;&rnbsp;&nbsp;′);

                   } else {

                       myLayer.write(′<img src=″′+myValue+′″>′);

                   }

                   aContext.nextBulletValue=1;

  // PENDING(RWK)-End of block to remove

              }

              myLayer.write(′</td>′);

          } else {

              aContext.nextBulletValue=1;

          }

          // Write out the padding cell

          if (myPadding) {

              myLayer.write(′<td valign=″top″width=″lpx″>′);

              writeTextStyle(myLayer,myNode);

              myLayer.write(myPadding);

              myLayer.write(′</font></td>′);

          }

          // Use default text if we′re editing and the text is
empty

          var myText=myNode.text;

          if (slideIsEditable && (!myText)) myText=
DEFAULT_OUTLINE_STRING;
        <!-- SIPO <DP n="42"> -->
        <dp n="d42"/>
          // Write out the text cell

          myLayer.write(′<td valign=″top″width=″99%″>′);

          if (myText) {

              // Write the url start tag

              if (myNode.url) {

              myLayer.write(startLinkTag(myNode.url));

              }

              // Write the text

              writeTextStyle(myLayer,myNode);

              myLayer.write(myText.escapeForHTML());

              myLayer.write(′</font>′);

              // Write the url end tag

              if (myNode.url)myLayer.write(endLinkTag());

          }

           // Close up

          myLayer.write(myLayer.tableCloseTags());

          myLayer.flush();

          // Show the layer and offset the context by the size of
the layer

          myLayer.style.zIndex=aContext.zIndex;

          myLayer.show();

      }

      // Prepare the context for the next node
      aContext.top+=myLayer.getHeight()+
adjust(aContext.verticalSpacing);

      anOutline._rootNode.heightInPixels+=myLayer.getHeight()+
adjust(aContext.verticalSpacing);

      aContext.nextLayerIndex++;

       // Render any subnodes

      if ((myNode.nodes!=null) && (myNode.nodes.length>0)){

          // Store the context

          var subContext=objectCopy(aContext);

          subContext.nextBulletValue=1;

          subContext.nodeBulletPrefix=myText;

          // Configure the context for the subnodes

          var myIndent=adjust(subContext.indentSpacing);

          subContext.left+=myIndent;

          subContext.width-=myIndent;

          if (myNode.nodeBulletType!=null) {

            subContext.nodeBulletType=myNode.nodeBulletType;

          }

         if (myNode.indentSpacing!=null)

           subContext.indentSpacing=myNode.indentSpacing;

         if (myNode.verticalSpacing!=null)

           subContext.verticalSpacing=myNode.indentSpacing;

         // Render the subnodes

         renderOutlineNodes(myNode,subContext,isMove);

         // Get interesting stuff from the subContext

         aContext.nextLayerIndex=subContext.nextLayerIndex;

         // aContext.effectStartTime=subContext.effectStartTime;

         aContext.top=subContext.top;

       }
        <!-- SIPO <DP n="43"> -->
        <dp n="d43"/>
  }
}
/*
 * Utility for finding the firstnode,given any node
 */
function firstNode(aNode) {

  if (aNode==null || aNode. rootNode==null)

      return null;

  return aNode._rootNode.nodes[0];
}
//
// Bulleting conversion utilities
//
/*
 * Convert a number to it′s roman numeral equivalent
 * PENDING(RWK)-This method probably wants to live somewhere else
 */
var romanData=[[1000,-1000,′M′],{900,100,′C′],[500,-
500,′D′],[400,100,′C′],[100,-100,′C′],[90,10,′X′],[50,-
50,′L′],[40,10,′X′],[10,-10,′X′],[9,1,′I′],[5,-5,′V′],[4,1,′I′],[1,-
1,′I′]];
function toRoman(aVal,isUppercase) {

  var romanString=″;

  while (aVal>0) {

    for (var i=0;i<romanData.length;i++){

        if (aVal>=romanData[i][0]) {

          aVal+=romanData[i][1];

          romanString+=romanData[i][2];

          break;

        }

    }

  }

  return isUppercase ?romanString:romanString.toLowerCase();
}
function toLetter(aval,isoppercase) {

  return String.fromCharCode((isUppercase?64:96)+(((aVal-1)%
26)+1));
}
表12创建文档JavaScript数据结构的Java代码
package com.andgit.util;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
/**
 * This class helps to create JavaScript from other data structures.
 */
public class SXJavaScript {
        <!-- SIPO <DP n="44"> -->
        <dp n="d44"/>
   //
   //  STATIC METHODS
   //
   /**

  * Puts a backslash (″\″) character in front of all characters
that

  * need to be ″escaped″in JavaScript strings,so that they are
not

  * interpreted specially by the JavaScript interpreter.

  *

  * Currently that set of characters is:

  * \->\\

  *  ′->\′

  *  backspace->\b

  *  form-feed->\f

  *  newline->\n

  *  Carriage return->\r

  *  tab->\t

  */
   static public String escapeSpecialCharacters(String baseString)

   // NOTE:Adding this method did not seem to effect our

   // pages-per-second timing,so I don′t think it′s a problem.

   // If it does show up as a problem in future performance tests,

   // however,it can be implemented differently(e.g.with lookup

   // tables),though it will be harder to read/debug/add to.

   //\->\\

   baseString=SXString.replaceSubstring(baseString,″\\″,
″\\\\″);

   // We now need to″escape″all quote (″′″) characters and

   // some other characters,according to the JavaScript spec.

   // ′->\′

   baseString=SXString.replaceSubstring(baseString,″′″,″\\′″);

   // backspace->\b

   baseString=SXString.replaceSubstring(baseString,″\b″,

   ″\\b″);

   // form-feed->\f

   baseString=SXString.replaceSubstring(baseString,″\f″,

   ″\\f″);

   // newline->\n

   baseString=SXString.replaceSubstring(baseString,″\n″,

   ″\\n″};

   // Carriage return->\r

   baseString=SXString.replaceSubstring(baseString,″\r″,

   ″\\r″);

   //tab->\t

   baseString=SXString.replaceSubstring(baseString,″\t″,

   ″\\t″);

   return baseString;

   }

   /**

    * Takes in a table of key/value pairs representing attribute

      names and

    * attribute values.

    * The ″keys″in this table must be of type String.

    * The″values″may be of type:
        <!-- SIPO <DP n="45"> -->
        <dp n="d45"/>
  *

  *    String,Integer,Collection,or″null″

  *

  * -If the″value″is of type″Collection″,it should be a
Collection

  * of SXContentEntity type objects,so that it will generate the

  * appropriate textual description when its″toString()″method
gets called.

  * Collections will be translated into a JavaScript array.

  *

  * -If the″value″is of type Integer,and the value of the
Integer is

  * ″-1″,the value″null″(without quotes)will be written to the
JavaScript.

  *

  * If objectToRepresent is a Map,and there is a key in the named
″name″,then

  * its value will be used to label that block of data,so given:

  * name =″Outlinel″,and key value pairs for width,height,top

  * and left,produces the following JavaScript output:

  *

  * Outlinel:{

  *      width:92,

  *      height:18,

  *      top:4,

  *      left:4

  * }

  *

  * If″quoteNumericValues″is″true″,then the output will look
like this:

  * Outlinel:{

  *       width:″92″,

  *       height:″18″,

  *       top:″4″,

  *       left:″4″

  * }

  * NOTE,however,that if numeric values aren′t quoted,then
string

  * fields which have only numeric values,such as″Title″(on
SXText)

  * field with a value of″3″,will be sent down unquoted,which
then

  * causes JavaScript errors.

  * Nevertheless,this means that some values,like″slideID″will
be

  * sent down quoted,and will be interpretted as strings during

  * arithmetic operations on the client ,e.g.″+″.

  * The client,therefore,should validate what

  * it *knows* to be numeric fields,and re-assign them the
numeric

  * value of their string. This is the lesser of two evils(the
server

  * ″knowing″about types,vs. the client knowing about types).

  * This whole dilemma is one of the few

  * drawbacks of our″typeless″system.

  * (the typing knowledge <b>could</b>actually be done on the
server-side

  * via the classmaps,which SXPersistentPropertyHolder already
knows

  * about,but the client needs to do field-by-field validation

  * anyway,for debugging purposes,so we might as well let the
        <!-- SIPO <DP n="46"> -->
        <dp n="d46"/>
  * client validate/massage their DOM)

  *

  * NOTE,also,that if the″value″associated with a key in a Map

  * or Collection is not of type″String″,or is″null″,

  * the value will<b>not</b>be quoted,regardless of the value
of

  * ″quoteNumericValues″.

  *

  * There will <B>not</B>be a final carriage-return after the
final

  * closing bracket()).

  */

  static public SXIndentedStringBuffer
getJavaScriptRepresentationOfData(SXIndentedStringBuffer
indentBuffer,Object objectToRepresent,boolean quoteNumericValues) {

  if (objectToRepresent !=null){

      Object aValue=null;

      boolean objectIsMap=objectToRepresent instanceof Map;

      boolean objectIsCollection=!objectIsMap &&
objectToRepresent instanceof Collection;

      // SOME KIND OF″DATA CONTAINER″...ITERATE OVER IT AND
CALL BACK RECURSIVELY.

      if (objectIsMap || objectIsCollection) {

         String containerEncloserStartCharacter=null;

         String containerEncloserEndCharacter=null;

         Iterator anIterator;

         boolean hasMoreElements;

         boolean firstTime=true;

         //DO THIS STUFF ONCE,BEFORE PROCESSING THE CONTAINER
ELEMENTS

         if (objectIsMap) {

             anIterator=
((Map)objectToRepresent).keySet().iterator();

             containerEncloserStartCharacter=″{″;

             containerEncloserEndCharacter=″}″;

         } else {

             anIterator=
((Collection)objectToRepresent).iterator();

             containerEncloserStartCharacter=″[″;

             containerEncloserEndCharacter =″]″;

         }

         indentBuffer.println(containerEncloserStartCharacter);

         indentBuffer.indent();

         hasMoreElements=anIterator.hasNext();

         while (hasMoreElements) {

             // DOTHIS STUFF FOR EACH CONTAINER ELEMENT

             if (!firstTime) {

               indentBuffer.println(″,″);// Put a comma after the
item prior to us

             } else {

               firstTime=false;

             }

             if (objectIsMap) {

                String aKey=(String)(anIterator.next());

                indentBuffer.print(aKey);

                aValue=((Map)objectToRepresent).get(aKey);

                indentBuffer.print(″:″);
        <!-- SIPO <DP n="47"> -->
        <dp n="d47"/>
              } else {

                // We must be a Collection...

                aValue=anIterator.next();

              }

              // Now,let′s call this method recursively on
″value″...
SXJavaScript.getJavaScriptRepresentationOfData(indentBuffer,aValue,
quoteNumericValues);

               hasMoreElements=anIterator.hasNext();

          }

          // DO THIS STUFF ONCE,AFTER PROCESSING THE CONTAINER
ELEMENTS

          indentBuffer.outdent();

          indentBuffer.println(″″);

          indentBuffer.print(containerEncloserEndCharacter);

       // SXJavaScriptProducer... LET IT RE-CALL US WITH THE
HASHMAP IT WANTS SAVED

       }  else if (objectToRepresent instanceof
SXJavaScriptProducer) {
((SXJavaScriptProducer)objectToRepresent).getJavaScriptRepresentation
(indentBuffer);

         // FLAT,LEAF-NODE VALUE... JUST WRITE IT OUT...

         } else {

           boolean objectIsInteger=false;// PENDING(kbern):see
below

           boolean objectIsString=objectToRepresent instanceof
String;

           boolean quoteThisValue=true;// PENDING(kbern) was false;
see below

           /******

               PENDING(kbern):converting to number is no longer

               desirable?Note that this causes problems with
strings

               that are integers AND have leading zeros,e.g. the

               RGB color 002233 becomes 2233.

            if (objectIsString) {

                try {

                  objectToRepresent=new
Integer((String)objectToRepresent);

                } catch (NumberFormatException anException) {

                  // Quote non-numeric Strings if they′re not empty
(though

                  // that case is caught in the previous″else if″
clause).

                  quoteThisValue=true;

                }

            }

            ********/

            objectIsInteger=objectToRepresent instanceof Integer;

            if (objectIsInteger) {

                if (((Integer)objectToRepresent).intValue()==-1) {

                  aValue=″null″;

                }

                if (quoteNumericValues) {
        <!-- SIPO <DP n="48"> -->
        <dp n="d48"/>
                 quoteThisValue =true;

              }

          } else if (objectToRepresent instanceof Boolean) {

              quoteThisValue=false;//booleans are never quoted!

          }

          String objectToRepresentString=
objectToRepresent.toString();

          if (quoteThisValue) {

              indentBuffer.print(″′″);

               objectToRepresentString=
SXJavaScript.escapeSpecialCharacters(objectToRepresentString);

          }

          indentBuffer.print(objectToRepresentString);

          if (quoteThisValue) {

              indentBuffer.print(″′″);

          }

        }

    } else {

        indentBuffer.print(″null″);

    }

    return indentBuffer;
   }
}
假设浏览器的web页面内容为HTML。然而,实际上并不一定如此,因为一些更先进的浏览器能显示其它格式,最著名的是可扩展标记语言(XML)。因此,这里描述处理也适合其它浏览器文档格式,所以实际上处理并不一定要求HTML格式。
虽然这里已参照较佳实施例描述了本发明,但是本领域技术人员显然明白,其它应用可以替代这里提出的应用而不违背本发明的精神和范围。
因此,本发明只应受下面包含的权利要求的限制。

Claims (63)

1.一种提供和显现可定标web页面的系统,其特征在于,所述系统包括:
浏览器:
与解释码相关的脚本;和
文档对象模型;
其中所述脚本在执行时,创建一种描述页面作者所建立的文档的数据结构;并且
其中所述解释码以一种方式解释所述数据结构,所述方式使所述数据结构操作所述文档对象模型用于向所述浏览器显现所述文档的目的。
2.如权利要求1所述的系统,其特征在于,所述浏览器可以是任一类支持脚本语言的web浏览器,并具有修改所显示的web页面内容的方法。
3.如权利要求1所述的系统,其特征在于,所述数据结构可优化成只包括所述文档的重要信息。
4.如权利要求1所述的系统,其特征在于,所述数据结构和所述解释码可容纳在单个文件内。
5.如权利要求1所述的系统,其特征在于,所述数据结构可与所述解释码分开。
6.如权利要求1所述的系统,其特征在于,所述数据结构包括:
根对象:
其中,所述根对象包括幻灯片阵列,每张所述幻灯片是代表单张显现幻灯片的对象;并且
其中,每张所述幻灯片包括多个内容实体,而每个所述内容实体具有各种属性。
7.如权利要求6所述的系统,其特征在于,所述根对象还包括:
包含所述显现的每张所述幻灯片标题的串阵列。
8.如权利要求6所述的系统,其特征在于,所述根对象还包括:
第一属性,是所述显现中当前幻灯片索引;
第二属性,对样本显现为真;
第属性,对样式显现为真;
第四属性,对模板显现为真;
第五属性,指示所述显现的数据库ID;
第六属性,指示所述显现幻灯片总数;和
第七属性,指示所述对象所属的类型。
9.如权利要求6所述的系统,其特征在于,每张所述幻灯片还包括:
第一属性,指示显示所述幻灯片时使用效果的类别;
第二属性,指示所述显现所基于的布局名称;
第三属性,是一组用户对所述幻灯片提供的注释;
第四属性,指示所述幻灯片的标题;和
第五属性,指示所述幻灯片所属的类别。
10.如权利要求9所述的系统,其特征在于,所述第一属性包括:
第一值,是幻灯片元素从右侧飞入的设定;
第二值,是幻灯片元素从左侧飞入的设定;
第三值,是幻灯片元素从底部飞入的设定;
第四值,是幻灯片元素从顶部飞入的设定;
第五值,是幻灯片元素简短闪烁的设定;和
第六值,是每次鼠标点击逐渐显露幻灯片元素的设定。
11.如权利要求6所述的系统,其特征在于,所述内容实体包括:
文本实体;
轮廓实体;
图象实体;
其中,每个所述内容实体包括:
多个属性,用于共同定义每个所述内容实体所占据的矩形;
存贮每个所述内容实体的属性;
指示每个所述内容实体名称的属性;和
指示层实体在所述幻灯片中z排序的属性。
12.如权利要求11所述的系统,其特征在于,所述文本实体还包括:
定义字体磅值的属性;
定义字体样式的属性;
定义字系列的属性;
定义字重的属性;
定义文本色彩的属性;
定义背景色的属性;
定义水平对齐的属性;
定义垂直对齐的属性;和
定义要定位的URL的属性。
13.如权利要求11所述的系统,其特征在于,所述轮廓体继承所述文本体的所有属性,并且还包括:
定义项目符号类型的属性;
定义用于指定所述项目符号概貌的值的属性;和
定义子轮廓阵列的属性。
14.如权利要求11所述的系统,其特征在于,所述图象体还包括:
定义水平对齐的属性;
定义背景色的属性;
定义在显示所述图象时使用的定标模式的属性;
定义要显示图象的URL的属性;
定义要定位的URL的属性;和
定义垂直对齐的属性。
15.如权利要求14所述的系统,其特征在于,在显示所述图象时定义使用的定标模式的所述属性包括:
配合值,可把所述图象定标成在所述幻灯片边界内准确符合;
宽度值,可对所述图象定标并保持高宽比,使所述图象的宽度在所述幻灯片边界内准确符合;
高度值,可对所述图象定标并保持高宽比,使所述图象的高度在所述幻灯片边界内准确符合;和
分割值,可将所述图象以其原来尺寸分割,准确地填满图象边界。
16.如权利要求14所述的系统,其特征在于,所述图象体包括背景元素,而所述背景元素的边界始终保持对应于所述幻灯片的边界。
17.如权利要求16所述的系统,其特征在于,所述背景元素总是将其z索引保持为零。
18.一种提供和显现可定标Web页面的处理,其特征在于,所述处理包括下述步骤:
通过执行脚本创建描述文档的数据结构;
用解释码以一种方式解释所述数据结构,所述方式允许所述数据结构操作文档对象模型用于将所述文档显现在浏览器中的目的;
其中,所述文档自动更新,以在所述浏览器调整尺寸时向所述浏览器反映变化。
19.如权利要求18所述的处理,其特征在于,所述数据结构可以优化成只包含所述文档的重要信息。
20.如权利要求18所述的处理,其特征在于,所述数据结构与所述解释码可以包含在单个文件内。
21.如权利要求18所述的处理,其特征在于,所述数据结构可以与所述解释码分开。
22.一种创建文档数据结构的处理,其特征在于,包括下述步骤:
用Web服务器对浏览者浏览器对文档的请求作出响应;
以适合的方式检索或创建所述文档的内容;
把所述文档内容翻译成脚本代码块;
把所述脚本代码嵌入返回给浏览者的HTML文档里;和
在浏览者浏览器中执行所述脚本代码块。
23.如权利要求22所述的处理,其特征在于,还包括下述步骤:
由所述数据结构执行任何必要的数据验证。
24.如权利要求22所述的处理,其特征在于,所述执行脚本代码块的步骤包括下述子步骤:
设定背景色;
为显现创建幻灯片层;
使所述幻灯片层的显示有效;
使所述显现和所述幻灯片的地址初始化;
使所述幻灯片内各种幻灯片元素初始化;
设立调整尺寸的处理程序;和
把所述幻灯片呈现为HTML,并在所述浏览器中显示所述显现内容。
25.如权利要求22所述的处理,其特征在于,一个或多个所述幻灯片元素是文本实体,并且所述使所述幻灯片内各种幻灯片元素初始化的子步骤还包括:
设定所述文本体的地址;
为所述文本体建立层;和
使所述层的显示有效。
26.如权利要求22所述的处理,其特征在于,一个或多个所述幻灯片元素为图象实体,并且使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括:
为所述图象体设定地址;
为所述图象体建立层;和
使所述层的显示有效。
27.如权利要求22所述的处理,其特征在于,一个或多个所述幻灯片元素为轮廓实体,并且使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括下述分子步骤:
为所述轮廓体设定地址;和
使所述轮廓体的轮廓节点初始化。
28.如权利要求22所述的处理,其特征在于,把所述幻灯片呈现为HTML并在所述浏览器中显示所述显现内容的所述子步骤还包括下述分子步骤:
获取客户屏目尺寸;
设置所述幻灯片层的剪裁区;
呈现所述幻灯片内各种幻灯片元素;和
用输出刷新所述层。
29.如权利要求28所述的处理,其特征在于,一个或多个幻灯片元素为文本实体,而呈现所述幻灯片内各种幻灯片元素的所述分子步骤包括下述次分子步骤:
设定层色并对齐;
生成要显示的文本;
写URL起始标记;
写样式和所述文本;和
写URL结束标记。
30.如权利要求28所述的处理,其特征在于,一个或多个幻灯片元素为图象实体,并且呈现所述幻灯片内各种幻灯片元素的所述分子步骤包括下述次分子步骤:
设定层背景色;
若幻灯片可编辑,写空白内容串;
获取图象源的URL;
写URL起始标记;
呈现所述图象;和
写URL结束标记。
31.如权利要求28所述的处理,其特征在于,一个或多个所述幻灯片元素为轮廓实体,并且呈现所述幻灯片内各种幻灯片元素的所述分子步骤包括下述次分子步骤:
设定默认属性;
创建呈现上下文范围并初始化;
设置起点和有效宽度;
按所述呈现范围呈现轮廓节点;和
隐藏不使用的层。
32.一种解释文档数据结构的处理,其特征在于,所述处理包括下述步骤:
在所述文档数据结构中识别要求呈现给浏览者浏览器的对象;
定位或创建浏览器文档对象模型的诸元素,其中,所述元素用于呈现所述文档;
应用任何使浏览者特定的浏览器配置适应浏览器文档对象模型元素或文档数据结构所必需的变换或其它变化;
生成呈现所述对象所必需的HTML;和
将所述HTML应用到浏览器文档对象模型的元素,使所述文档在所述浏览器中显示。
33.如权利要求32所述的处理,其特征在于,应用任何变换或其它变化的所述步骤包括子步骤:
设定背景色;
为显现建立幻灯片层;
使所述幻灯片层的显示有效;
使所述显现和所述幻灯片的地址初始化;
使所述幻灯片内各种幻灯片元素初始化;和
设立调整尺寸的处理程序。
34.如权利要求33所述的处理,其特征在于,一个或多个所述的幻灯片元素为文本实体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括下述分子步骤:
对所述文本体设定地址;
为所述文本体建立层;和
使所述层的显示有效。
35.如权利要求33所述的处理,其特征在于,一个或多个所述幻灯片元素为图象体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括下述分子步骤:
对所述图象体设定地址;
为所述图象体建立层;和
使所述层的显示有效。
36.如权利要求33所述的处理,其特征在于,一个或多个所述幻灯片元素为轮廓体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤包括下述分子步骤:
对所述轮廓体设定地址;和
使所述轮廓体的轮廓节点初始化。
37.如权利要求32所述的处理,其特征在于,生成呈现所述对象所必需的HTML的所述步骤包括下述子步骤:
获取客户屏幕尺寸;
设置所述幻灯片层的剪裁区;
呈现所述幻灯片内各种幻灯片元素;和
用输出刷新所述层。
38.如权利要求37所述的处理,其特征在于,一个或多个幻灯片元素为文本体,而呈现所述幻灯片内各种幻灯片元素的所述子步骤包括下述分子步骤:
设置层色并对齐;
生成要显示的文本;
写URL起始标记;
写样式和所述文本;和
写URL结束标记。
39.如权利要求37所述的处理,其特征在于,一个或多个幻灯片元素为图象体,而呈现所述幻灯片内各种幻灯片元素的所述子步骤包括下述分子步骤:
设置层背景色;
若幻灯片可编辑,写空白内容串;
获取图象源的URL;
写URL起始标记;
呈现所述图象;和
写URL结束标记。
40.如权利要求37所述的处理,其特征在于,一个或多个幻灯片元素为轮廓体,而呈现所述幻灯片内各种幻灯片元素的所述子步骤包括下述分子步骤:
设定默认属性;
创建呈现上下文范围并初始化;
设置起点和有效宽度;
按所述呈现范围呈现轮廓节点;和
隐藏不使用的层。
41.一种提供和呈现可定标Web页面的方法,其特征在于,所述方法包括下述步骤:
通过执行脚本而创建描述文档的数据结构;
解释码以一种方式解释所述数据结构,该方式允许所述数据结构操作文档对象模型用于将所述文档呈现给浏览器的目的;
其中,所述文档自动更新,以在所述浏览器调整尺寸时对所述浏览器反映变化。
42.如权利要求41所述的方法,其特征在于,所述数据结构可以优化成只包含所述文档的重要信息。
43.如权利要求41所述的方法,其特征在于,所述数据结构和所述解释码可容纳在单个文档中。
44.如权利要求41所述的方法,其特征在于,所述数据结构可以与所述解释码分开。
45.一种创建文档数据结构的方法,其特征在于,包括下述步骤:
用web服务器响应浏览者浏览器对文档的请求;
以合理方式检索或创建所述文档内容;
把所述文档内容翻译成脚本代码块;
把所述脚本代码嵌入返回给浏览者的HTML文档;和
在浏览者浏览器中执行所述脚本代码块。
46.如权利要求45所述的方法,其特征在于,还包括下述步骤:
通过所述数据结构作必要的数据验证。
47.如权利要求45所述的方法,其特征在于,执行脚本代码块的所述步骤包括下述子步骤:
设置背景色;
为显现建立幻灯片层;
使所述幻灯片层的显示有效;
使所述显现和所述幻灯片的地址初始化;
使所述幻灯片内各种幻灯片元素初始化;
设立改变尺寸的处理程序;和
把所述幻灯片呈现为HTML并在所述浏览器中显示所述显现内容。
48.如权利要求45所述的方法,其特征在于,一个或多个所述幻灯片元素为文本体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括:
对所述文本体设立地址;
为所述文本体建立层;和
使所述层的显示有效。
49.如权利要求45所述的方法,其特征在于,一个或多个所述幻灯片元素为图象体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括:
对所述图象体设定地址;
为所述图象体建立层;和
使所述层的显示有效。
50.如权利要求47所述的方法,其特征在于,一个或多个所述幻灯片元素为轮廓体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括下述分子步骤:
对所述轮廓体设定地址;和
对所述轮廓体的轮廓节点初始化。
51.如权利要求47所述的方法,其特征在于,把所述幻灯片呈现为HTML并在所述浏览器上显示所述显现内容的所述子步骤还包括下述分子步骤:
获取客户屏幕的尺寸;
设置所述幻灯片层的剪裁区;
呈现所述幻灯片内各种幻灯片元素;和
用输出刷新所述层。
52.如权利要求51所述的方法,其特征在于,一个或多个幻灯片元素为文本体,而呈现所述幻灯片内各种幻灯片元素的所述分子步骤包括下述次分子步骤:
设置层色并对齐;
生成要显示的文本;
写URL起始标记;
写样式和所述文本;和
写URL结束标记。
53.如权利要求51所述的方法,其特征在于,一个或多个幻灯片元素为图象体,而呈现所述幻灯片内各种幻灯片元素的所述分子步骤包括下述次分子步骤:
设置层背景色;
若幻灯片可编辑,写空白内容串;
获取图象源的URL;
写URL起始标记;
呈现所述图象;和
写URL结束标记。
54.如权利要求51所述的方法,其特征在于,一个或多个幻灯片元素为轮廓体,而呈现所述幻灯片内各种幻灯片元素的所述分子步骤包括次分子步骤:
设置默认属性;
创建呈现上下文范围并初始化;
设起点和有效宽度;
按所述呈现范围呈现轮廓节点;和
隐藏不使用的层。
55.一种解释文档数据结构的方法,其特征在于,所述方法包括下述步骤:
识别所述文档数据结构中需要在浏览者浏览器中呈现的对象;
定位或创建浏览器文档对象模型诸元素,其中,所述元素用于呈现所述文档;
应用使浏览者特定的浏览器配置能适应浏览器文档对象模型或文档数据结构诸元素所需的任何变换或其它变化;
生成呈现所述对象所需的HTML;和
将所述HTML应用到浏览器文档对象模型的元素里,从而在所述浏览器中显示所述文档。
56.如权利要求55所述的方法,其特征在于,应用任何变换或其它变化的所述步骤包括下述子步骤:
设置背景色;
为显现内容建立幻灯片层;
使所述幻灯片层的显示有效;
使所述显现与所述幻灯片的地址初始化;
使所述幻灯片内各种幻灯片元素初始化;和
设置改变尺寸的处理程序。
57.如权利要求56所述的方法,其特征在于,一个或多个所述幻灯片元素为文本体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括:
对所述文本体设置地址;
对所述文本建立层;和
使所述层的显示有效。
58.如权利要求56所述的方法,其特征在于,一个或多个所述幻灯片元素为图象体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括:
对所述图象体设置地址;
对所述图象体建立层;和
使所述层的显示有效。
59.如权利要求56所述的方法,其特征在于,一个或多个所述幻灯片元素为轮廓体,而使所述幻灯片内各种幻灯片元素初始化的所述子步骤还包括下述分子步骤:
对所述轮廓体设置地址;和
使所述轮廓体的轮廓节点初始化。
60.如权利要求55所述的方法,其特征在于,生成呈现所述对象所需的HTML的所述步骤包括下述子步骤:
获取客户屏幕尺寸;
设置所述幻灯片层的剪裁区;
呈现所述幻灯片内各种幻灯片元素;和
用输出刷新所述层。
61.如权利要求60所述的方法,其特征在于,一个或多个幻灯片元素为文本体,而呈现所述幻灯片内各种幻灯片元素的所述子步骤包括分子步骤:
设置层色并对齐;
生成要显示的文本;
写URL起始标记;
写样式和所述文本;和
写URL结束标记。
62.如权利要求60所述的方法,其特征在于,一个或多个幻灯片元素为图象体,而呈现所述幻灯片内各种幻灯片元素的所述子步骤包括下述分子步骤:
设置层背景色;
若幻灯片可编辑,写空白内容串;
获取图象源的URL;
写URL起始标记;
呈现所述图象;和
写URL结束标记。
63.如权利要求60所述的方法,其特征在于,一个或多个幻灯片元素为轮廓体,而呈现所述幻灯片内各种幻灯片元素的所述子步骤包括下述分子步骤:
设置默认属性;
创建呈现上下文范围并初始化;
设起点和有效宽度;
按所述呈现范围呈现轮廓节点;和隐藏不使用的层。
CNB018044883A 2000-02-04 2001-01-31 提供和呈现可缩放web文档的系统和方法 Expired - Fee Related CN1205571C (zh)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US18043900P 2000-02-04 2000-02-04
US60/180,439 2000-02-04

Publications (2)

Publication Number Publication Date
CN1398377A true CN1398377A (zh) 2003-02-19
CN1205571C CN1205571C (zh) 2005-06-08

Family

ID=22660469

Family Applications (1)

Application Number Title Priority Date Filing Date
CNB018044883A Expired - Fee Related CN1205571C (zh) 2000-02-04 2001-01-31 提供和呈现可缩放web文档的系统和方法

Country Status (6)

Country Link
US (1) US7412644B2 (zh)
EP (1) EP1256070A2 (zh)
JP (1) JP2003521784A (zh)
CN (1) CN1205571C (zh)
AU (1) AU2001231259A1 (zh)
WO (1) WO2001057718A2 (zh)

Cited By (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN100407138C (zh) * 2005-08-04 2008-07-30 腾讯科技(深圳)有限公司 基于Brew的一种动态用户界面的体系结构和实现方法
CN101131695B (zh) * 2006-08-25 2010-05-26 北京书生国际信息技术有限公司 一种文档库系统及其实现方法
CN1954314B (zh) * 2004-04-30 2010-05-26 微软公司 文档标记方法和系统
CN101414257B (zh) * 2008-11-13 2011-09-21 成都市华为赛门铁克科技有限公司 软件界面实现方法、装置
CN101449270B (zh) * 2006-03-15 2011-11-16 谷歌公司 自动显示尺寸调整后的图像
CN101553771B (zh) * 2006-10-23 2012-01-04 奥多比公司 绘制超文本标记语言内容
CN102314499A (zh) * 2011-08-26 2012-01-11 百度在线网络技术(北京)有限公司 一种用于处理网页内容的方法与设备
CN102841883A (zh) * 2011-06-08 2012-12-26 株式会社Pfu 表单提供装置以及表单提供方法
CN103229167A (zh) * 2010-10-06 2013-07-31 星汇数据解决方案公司 用于为电子发现数据编索引的系统和方法
CN103365862A (zh) * 2012-03-28 2013-10-23 北京百度网讯科技有限公司 一种用于生成与页面对应的图片的方法与设备
CN104272291A (zh) * 2012-03-07 2015-01-07 谷歌公司 唯一地识别脚本文件
CN105094872A (zh) * 2014-05-16 2015-11-25 腾讯科技(北京)有限公司 一种显示网页应用的方法和装置
CN105284075A (zh) * 2013-06-06 2016-01-27 国际商业机器公司 基于为网页的网页元素聚合用户偏好的优化网页加载
CN106557289A (zh) * 2015-09-29 2017-04-05 珠海金山办公软件有限公司 一种幻灯片显示方法、系统及装置
CN106663083A (zh) * 2014-07-09 2017-05-10 惠普发展公司,有限责任合伙企业 用于基于http的应用的网络浏览器策略
CN107844465A (zh) * 2017-11-11 2018-03-27 江西金格科技股份有限公司 一种ofd格式文档支持脚本的方法
CN108023918A (zh) * 2016-11-02 2018-05-11 阿里巴巴集团控股有限公司 一种服务信息获取方法、装置及系统

Families Citing this family (76)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6915484B1 (en) * 2000-08-09 2005-07-05 Adobe Systems Incorporated Text reflow in a structured document
US7231606B2 (en) 2000-10-31 2007-06-12 Software Research, Inc. Method and system for testing websites
US7194743B2 (en) 2000-12-12 2007-03-20 Citrix Systems, Inc. Methods and apparatus for communicating changes between a user interface and an executing application using property paths
US20030189593A1 (en) * 2001-01-05 2003-10-09 Yarvin Curtis G. Method and apparatus for dynamically updating a markup language based user interface
US7415538B2 (en) * 2001-03-19 2008-08-19 International Business Machines Corporation Intelligent document filtering
JP2002342382A (ja) 2001-05-01 2002-11-29 K-Plex Inc ハイパー・テキスト構造の自動検索方法及び装置
CA2354993C (en) 2001-08-10 2010-11-09 Ibm Canada Limited-Ibm Canada Limitee Method of indicating links to external urls
EP1318461A1 (en) 2001-12-07 2003-06-11 Sap Ag Method and computer system for refreshing client-data
US7187376B2 (en) * 2002-06-04 2007-03-06 Sap Aktiengesellschaft Displaying views on computer screens
US7415452B1 (en) 2002-06-21 2008-08-19 Adobe Systems Incorporated Traversing a hierarchical layout template
US7051040B2 (en) 2002-07-23 2006-05-23 Lightsurf Technologies, Inc. Imaging system providing dynamic viewport layering
TWI285808B (en) * 2002-07-27 2007-08-21 Samsung Electronics Co Ltd Apparatus and method for reproducing content and information storage medium therefor
US7765255B2 (en) 2002-07-30 2010-07-27 Sap Ag Extended web infrastructure for business applications
ATE385589T1 (de) * 2002-08-02 2008-02-15 Sap Ag Verfahren und rechnersystem zur behandlung von inkrementalen daten in klient-server kommunikation.
WO2004031984A1 (en) * 2002-10-01 2004-04-15 Sap Aktiengesellschaft Method and system for refreshing browser pages
EP1406183A3 (en) 2002-10-01 2004-04-14 Sap Ag Method and system for refreshing browser pages
DE10349015A1 (de) * 2003-10-17 2005-05-19 Siemens Ag Betriebsverfahren für einen Server und hiermit korrespondierende Gegenstände
US7954050B2 (en) * 2004-06-25 2011-05-31 Icesoft Technologies Canada Corp. Systems and methods for rendering and increasing portability of document-based user interface software objects
EP1622043B1 (en) * 2004-07-19 2012-07-04 Sap Ag Computer method for browsing and web-browser program
EP1638015A1 (en) * 2004-09-15 2006-03-22 Arizan Corporation Method for requesting and viewing a zoomed area of detail from an image attachment on a mobile communication device
US20060056604A1 (en) * 2004-09-15 2006-03-16 Research In Motion Limited Method for scaling images for usage on a mobile communication device
US7451405B2 (en) 2004-09-15 2008-11-11 Research In Motion Limited Method for requesting and viewing a zoomed area of detail from an image attachment on a mobile communication device
US7310771B2 (en) * 2004-12-20 2007-12-18 Microsoft Corporation Method and computer-readable medium for providing page and table formatting services
US7516400B2 (en) * 2005-03-07 2009-04-07 Microsoft Corporation Layout system for consistent user interface results
US7945853B2 (en) * 2005-09-12 2011-05-17 Microsoft Corporation Script markup
US7814410B2 (en) * 2005-09-12 2010-10-12 Workman Nydegger Initial server-side content rendering for client-script web pages
US7739589B2 (en) * 2005-11-02 2010-06-15 International Business Machines Corporation Extending markup of a browser using a plug-in framework
CN100422985C (zh) * 2006-02-23 2008-10-01 珠海金山软件股份有限公司 一种在svg中加入svg动画数据的方法
US7694221B2 (en) 2006-02-28 2010-04-06 Microsoft Corporation Choosing between multiple versions of content to optimize display
CN101480049B (zh) * 2006-06-23 2011-06-22 夏普株式会社 图像显示装置,图像显示方法,图像显示系统,图像数据发送装置
JP4102847B2 (ja) * 2006-06-30 2008-06-18 シャープ株式会社 画像データ提供装置、画像表示装置、画像表示システム、画像データ提供装置の制御方法、画像表示装置の制御方法、制御プログラム、および、記録媒体
US8161339B2 (en) * 2006-08-11 2012-04-17 Sharp Kabushiki Kaisha Content playback apparatus, content playback method, and storage medium
US7692658B2 (en) * 2006-11-17 2010-04-06 Microsoft Corporation Model for layout animations
US8213499B2 (en) * 2007-04-04 2012-07-03 General Instrument Corporation Method and apparatus for context address generation for motion vectors and coefficients
US20080295018A1 (en) * 2007-05-24 2008-11-27 Nokia Corporation Apparatus, method and computer program product providing an adaptive forward button for a browser application
US8392890B2 (en) * 2007-10-15 2013-03-05 Software Research, Inc. Method and system for testing websites
US8424004B2 (en) * 2007-06-23 2013-04-16 Microsoft Corporation High performance script behavior detection through browser shimming
CN100492289C (zh) * 2007-09-30 2009-05-27 田园 一种浏览器扩展对象、函数或变量的方法
US9418171B2 (en) * 2008-03-04 2016-08-16 Apple Inc. Acceleration of rendering of web-based content
US8477143B2 (en) 2008-03-04 2013-07-02 Apple Inc. Buffers for display acceleration
US8289333B2 (en) 2008-03-04 2012-10-16 Apple Inc. Multi-context graphics processing
US8307300B1 (en) 2008-05-13 2012-11-06 Google Inc. Content resizing and caching in multi-process browser architecture
KR20110037958A (ko) * 2008-06-18 2011-04-13 톰슨 라이센싱 디지털 문서의 디스플레이와 상기 문서 내에서의 네비게이션을 위해 상기 문서를 준비하는 방법
US9495471B2 (en) * 2008-12-04 2016-11-15 International Business Machines Corporation Optimize view elements sizes to maximize most data viewed in a multiple view elements GUI
US20100218122A1 (en) * 2009-02-20 2010-08-26 Microsoft Corporation Asynchronously uploading and resizing content in web-based applications
US10671698B2 (en) 2009-05-26 2020-06-02 Microsoft Technology Licensing, Llc Language translation using embeddable component
US9405745B2 (en) * 2009-06-01 2016-08-02 Microsoft Technology Licensing, Llc Language translation using embeddable component
WO2011160139A1 (en) 2010-06-18 2011-12-22 Sweetlabs, Inc. Systems and methods for integration of an application runtime environment into a user computing environment
US8977624B2 (en) * 2010-08-30 2015-03-10 Microsoft Technology Licensing, Llc Enhancing search-result relevance ranking using uniform resource locators for queries containing non-encoding characters
US9218680B2 (en) * 2010-09-01 2015-12-22 K-Nfb Reading Technology, Inc. Systems and methods for rendering graphical content and glyphs
KR20120099931A (ko) * 2011-03-02 2012-09-12 삼성전자주식회사 브라우징 방법, 디바이스, 및 컴퓨터로 읽을 수 있는 저장 매체
US8898562B2 (en) * 2011-03-04 2014-11-25 Dan Tocchini System and method for harmonious tiling search and publishing
CN102890681B (zh) * 2011-07-20 2016-03-09 阿里巴巴集团控股有限公司 一种生成网页结构模板的方法及系统
CN102999511B (zh) * 2011-09-13 2016-04-13 阿里巴巴集团控股有限公司 一种页面快速转换方法、装置和系统
US9317623B2 (en) 2012-04-20 2016-04-19 Yahoo! Inc. Dynamic webpage image
US8775917B2 (en) 2012-08-09 2014-07-08 Sweetlabs, Inc. Systems and methods for alert management
US8775925B2 (en) 2012-08-28 2014-07-08 Sweetlabs, Inc. Systems and methods for hosted applications
US9069735B2 (en) 2012-10-15 2015-06-30 Sweetlabs, Inc. Systems and methods for integrated application platforms
CN104573412B (zh) * 2013-10-16 2019-04-23 航天信息软件技术有限公司 防止拷贝网页文字内容的方法和装置
US9749440B2 (en) 2013-12-31 2017-08-29 Sweetlabs, Inc. Systems and methods for hosted application marketplaces
US10019247B2 (en) 2014-05-15 2018-07-10 Sweetlabs, Inc. Systems and methods for application installation platforms
US10089098B2 (en) 2014-05-15 2018-10-02 Sweetlabs, Inc. Systems and methods for application installation platforms
US9600594B2 (en) 2014-10-09 2017-03-21 Wrap Media, LLC Card based package for distributing electronic media and services
US9489684B2 (en) 2014-10-09 2016-11-08 Wrap Media, LLC Delivering wrapped packages in response to the selection of advertisements
US9448972B2 (en) * 2014-10-09 2016-09-20 Wrap Media, LLC Wrap package of cards supporting transactional advertising
US9418056B2 (en) 2014-10-09 2016-08-16 Wrap Media, LLC Authoring tool for the authoring of wrap packages of cards
US20160103820A1 (en) 2014-10-09 2016-04-14 Wrap Media, LLC Authoring tool for the authoring of wrap packages of cards
WO2016057188A1 (en) 2014-10-09 2016-04-14 Wrap Media, LLC Active receipt wrapped packages accompanying the sale of products and/or services
US9600803B2 (en) 2015-03-26 2017-03-21 Wrap Media, LLC Mobile-first authoring tool for the authoring of wrap packages
US9582917B2 (en) * 2015-03-26 2017-02-28 Wrap Media, LLC Authoring tool for the mixing of cards of wrap packages
CN107229454B (zh) 2016-03-24 2019-11-12 阿里巴巴集团控股有限公司 混合视图的显示方法及装置
CN105912517B (zh) * 2016-03-31 2020-05-01 深圳市八零年代网络科技有限公司 可支持自由表单设计的数据结构及其转换方法及系统
US10755030B2 (en) * 2017-06-29 2020-08-25 Salesforce.Com, Inc. Color theme maintenance for presentations
CN111158839A (zh) * 2019-12-31 2020-05-15 中国银行股份有限公司 段落内容展示方法及装置
CN111913705B (zh) * 2020-05-28 2023-07-25 中南大学 一种基于差异更新算法的JavaScript模板实现方法
CN111708957A (zh) * 2020-05-29 2020-09-25 平安科技(深圳)有限公司 基于索引和值引更新前端页面的方法、装置、计算机设备

Family Cites Families (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5781190A (en) * 1996-06-05 1998-07-14 Microsoft Corporation Method and system for transferring a slide presentation between computers
US5751283A (en) * 1996-07-17 1998-05-12 Microsoft Corporation Resizing a window and an object on a display screen
US6012083A (en) * 1996-09-24 2000-01-04 Ricoh Company Ltd. Method and apparatus for document processing using agents to process transactions created based on document content
US6243700B1 (en) * 1997-05-16 2001-06-05 Paul Zellweger Method and apparatus for generating a hypertext-based content menu using an open hierarchical data structure
US6008807A (en) * 1997-07-14 1999-12-28 Microsoft Corporation Method and system for controlling the display of objects in a slide show presentation
JP2000276493A (ja) * 1999-01-29 2000-10-06 Canon Inc 電子的にアクセスできるリソースのブラウジング方法
US6456305B1 (en) * 1999-03-18 2002-09-24 Microsoft Corporation Method and system for automatically fitting a graphical display of objects to the dimensions of a display window
US6515656B1 (en) * 1999-04-14 2003-02-04 Verizon Laboratories Inc. Synchronized spatial-temporal browsing of images for assessment of content
US6748569B1 (en) * 1999-09-20 2004-06-08 David M. Brooke XML server pages language
US6718515B1 (en) * 1999-12-07 2004-04-06 International Business Machines Corporation Method of populating a dynamic HTML table from a set of data objects through a common interface
US7047033B2 (en) * 2000-02-01 2006-05-16 Infogin Ltd Methods and apparatus for analyzing, processing and formatting network information such as web-pages
US7210099B2 (en) * 2000-06-12 2007-04-24 Softview Llc Resolution independent vector display of internet content

Cited By (25)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN1954314B (zh) * 2004-04-30 2010-05-26 微软公司 文档标记方法和系统
CN100407138C (zh) * 2005-08-04 2008-07-30 腾讯科技(深圳)有限公司 基于Brew的一种动态用户界面的体系结构和实现方法
CN101449270B (zh) * 2006-03-15 2011-11-16 谷歌公司 自动显示尺寸调整后的图像
CN101131695B (zh) * 2006-08-25 2010-05-26 北京书生国际信息技术有限公司 一种文档库系统及其实现方法
CN101553771B (zh) * 2006-10-23 2012-01-04 奥多比公司 绘制超文本标记语言内容
CN101414257B (zh) * 2008-11-13 2011-09-21 成都市华为赛门铁克科技有限公司 软件界面实现方法、装置
CN103229167A (zh) * 2010-10-06 2013-07-31 星汇数据解决方案公司 用于为电子发现数据编索引的系统和方法
CN102841883A (zh) * 2011-06-08 2012-12-26 株式会社Pfu 表单提供装置以及表单提供方法
CN102314499A (zh) * 2011-08-26 2012-01-11 百度在线网络技术(北京)有限公司 一种用于处理网页内容的方法与设备
CN104272291A (zh) * 2012-03-07 2015-01-07 谷歌公司 唯一地识别脚本文件
CN104272291B (zh) * 2012-03-07 2017-06-23 谷歌公司 唯一地识别脚本文件
CN103365862A (zh) * 2012-03-28 2013-10-23 北京百度网讯科技有限公司 一种用于生成与页面对应的图片的方法与设备
CN105284075A (zh) * 2013-06-06 2016-01-27 国际商业机器公司 基于为网页的网页元素聚合用户偏好的优化网页加载
US10803232B2 (en) 2013-06-06 2020-10-13 International Business Machines Corporation Optimizing loading of web page based on aggregated user preferences for web page elements of web page
US10817653B2 (en) 2013-06-06 2020-10-27 International Business Machines Corporation Optimizing loading of web page based on aggregated user preferences for web page elements of web page
US11017152B2 (en) 2013-06-06 2021-05-25 International Business Machines Corporation Optimizing loading of web page based on aggregated user preferences for web page elements of web page
US11017153B2 (en) 2013-06-06 2021-05-25 International Business Machines Corporation Optimizing loading of web page based on aggregated user preferences for web page elements of web page
CN105094872A (zh) * 2014-05-16 2015-11-25 腾讯科技(北京)有限公司 一种显示网页应用的方法和装置
CN105094872B (zh) * 2014-05-16 2019-04-02 腾讯科技(北京)有限公司 一种显示网页应用的方法和装置
CN106663083A (zh) * 2014-07-09 2017-05-10 惠普发展公司,有限责任合伙企业 用于基于http的应用的网络浏览器策略
CN106663083B (zh) * 2014-07-09 2019-06-04 惠普发展公司,有限责任合伙企业 用于基于http的应用的网络浏览器策略
US10333991B2 (en) 2014-07-09 2019-06-25 Hewlett-Packard Development Company, L.P. Web browser policy for HTTP-based application
CN106557289A (zh) * 2015-09-29 2017-04-05 珠海金山办公软件有限公司 一种幻灯片显示方法、系统及装置
CN108023918A (zh) * 2016-11-02 2018-05-11 阿里巴巴集团控股有限公司 一种服务信息获取方法、装置及系统
CN107844465A (zh) * 2017-11-11 2018-03-27 江西金格科技股份有限公司 一种ofd格式文档支持脚本的方法

Also Published As

Publication number Publication date
WO2001057718A3 (en) 2002-08-15
JP2003521784A (ja) 2003-07-15
EP1256070A2 (en) 2002-11-13
US7412644B2 (en) 2008-08-12
WO2001057718A2 (en) 2001-08-09
US20040177327A1 (en) 2004-09-09
CN1205571C (zh) 2005-06-08
AU2001231259A1 (en) 2001-08-14

Similar Documents

Publication Publication Date Title
CN1398377A (zh) 提供和呈现可定标web页面的系统和处理
JP4344693B2 (ja) ブラウザの文書編集のためのシステムおよびその方法
US9026733B1 (en) Content-based caching using a content identifier at a point in time
US7197702B2 (en) Web page rendering mechanism using external programmatic themes
US7051276B1 (en) View templates for HTML source documents
JP4698668B2 (ja) 文書マークアップ方法およびシステム
US9940744B2 (en) Remote font management
US20090006471A1 (en) Exposing Specific Metadata in Digital Images
US20120110437A1 (en) Style and layout caching of web content
JP2010170568A (ja) アプリケーションからの視覚的形式の情報をデータベースに格納しデータベースから検索する情報格納および検索システム
JPWO2006051715A1 (ja) 文書処理装置及び文書処理方法
US9953016B2 (en) Composition and declaration of sprited images in a web page style sheet
US7865481B2 (en) Changing documents to include changes made to schemas
JPWO2006051975A1 (ja) 文書処理装置
JPWO2006051713A1 (ja) 文書処理装置及び文書処理方法
CN105589959A (zh) 表单处理方法和表单系统
US20090083300A1 (en) Document processing device and document processing method
CN110377371B (zh) 一种基于Web标签的样式表系统管理方法
US20080250311A1 (en) Document Processing Device, and Document Processing Method
US7802181B2 (en) Document processing device and document processing method
JPWO2006051712A1 (ja) 文書処理装置及び文書処理方法
US8862976B1 (en) Methods and systems for diagnosing document formatting errors
US7657869B2 (en) Integration of external tools into an existing design environment
US20080005136A1 (en) Data Processing Device, Document Processing Device, and Document Processing Method
US20100077295A1 (en) Document processing device and document processing module

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C14 Grant of patent or utility model
GR01 Patent grant
C17 Cessation of patent right
CF01 Termination of patent right due to non-payment of annual fee

Granted publication date: 20050608

Termination date: 20100131