CA2216826C - An integrated development platform for distributed publishing and management of hypermedia over wide area networks - Google Patents

An integrated development platform for distributed publishing and management of hypermedia over wide area networks Download PDF

Info

Publication number
CA2216826C
CA2216826C CA002216826A CA2216826A CA2216826C CA 2216826 C CA2216826 C CA 2216826C CA 002216826 A CA002216826 A CA 002216826A CA 2216826 A CA2216826 A CA 2216826A CA 2216826 C CA2216826 C CA 2216826C
Authority
CA
Canada
Prior art keywords
page
server
miniweb
naviserver
computer
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.)
Expired - Lifetime
Application number
CA002216826A
Other languages
French (fr)
Other versions
CA2216826A1 (en
Inventor
Linda T. Dozier
George W. Williams V
Dave Long
Douglas M. Mckee
James G. Davidson
Karen Brady
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.)
Historic AOL LLC
Original Assignee
America Online Inc
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 America Online Inc filed Critical America Online Inc
Publication of CA2216826A1 publication Critical patent/CA2216826A1/en
Application granted granted Critical
Publication of CA2216826C publication Critical patent/CA2216826C/en
Anticipated expiration legal-status Critical
Expired - Lifetime 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/10File systems; File servers
    • 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/958Organisation or management of web site content, e.g. publishing, maintaining pages or automatic linking

Abstract

The present invention addresses the critical needs of publishers seeking to create and publish hypermedia content in electronic form across wide area networks ("WAN's") such as the World Wide Web. Toward this end, a client-server development platform is provided for handling the important functions of document authoring, content-based indexing and retrieval of documents, management and control of proprietary assets, and support for developing form-driven interactive services, all in a manner that is uniquely and seamlessly WAN-integrated.

Description

DEMANDES OU BREVETS VOLUMINEUX
LA PRESENTE PARTIE DE CETTE DEMANDE OU CE BREVETS
COMPREND PLUS D'UN TOME.
CECI EST LE TOME DE

NOTE: Pour les tomes additionels, veillez contacter le Bureau Canadien des Brevets.

JUMBO APPLICATIONS / PATENTS

THIS SECTION OF THE APPLICATION / PATENT CONTAINS MORE
THAN ONE VOLUME.

NOTE: For additional volumes please contact the Canadian Patent Office.

AN INTEGRATED DEVELOPMENT PLATFORM
FOR DISTRIBUTED PUBLISHING AND MANAGEMENT OF IIYPERMEDIA OVER
WIDE AREA NETWORKS

FIELD OF THE INVENTION
The present invention relates to the field of authoring, publishing, and managing electronic hypermedia documents across distributed, wide area networks such as the World Wide Web.

BACKGROUND OF THE INVENTION
The distribution of information is being revolutionized before our very eyes.
Wide area networks ("WAN's"), notably the Internet, are assuming the role of "information superhighways" and are distributing electronic embodiments of mail, textbooks, magazines, advertisements, and even audio and video clips around the world. Herein, the term "document" denotes and includes any and all such electronic content, generically.
Figure 1 conceptually illustrates the basic architecture of a "client-server"
WAN like the Internet. Servers lOa-n form the backbone of the WAN. The servers are interconnected by a telecommunications infrastructure and exchange information in the form of one or more recognized protocols, such as protocol 30. For example, in the case of the Internet, network protocols include FTP, for file transfer, and Telnet, for remote log-in. Each server effectively represents and services its one or more "clients." Basically, the clients are the ultimate sources and targets of underlying information, while the servers dispatch and receive messages across the WAN in compliance with network protocols. Each client may correspond to a single user's computer, or may itself be hierarchically complex and may comprise a further sub-network or collection of numerous computers, such as the well-known, proprietary sub-networks of America Online, CompUServe, and Prodigy. In this way, information of any kind can be distributed worldwide in electronic form at telecommunications speeds.
One of the most rapidly expanding aspects of the Internet is the World Wide Web (the "Web"). The Web is comprised of those Internet servers (and their clients) able to support the Hyper-Text Transfer Protocol, better known as "http." The Web allows documents and graphical materials to be interlinked by means of "hypertext"
(or more generally, hypermedia) document elements. When a user utilizes a cursor control device to select and "click" on a hypermedia item in one document, a related document will automatically be accessed as identified by that link. For example, Figure 2 illustrates a simple example of a popular Web document known as a "home page." Home page 40 includes title 42, graphic image 44, instructional text 48, and list of bullet items 46a-c.
Selections 46a-c are each hypertext. A Web hypermedia item is actually encoded with a Uniform Resource Locator ("URL") tag, which literally addresses a document located on a remote network server. If a client of a Web server is equipped with suitable "browser"
software, then a user of that client can point and click on any one of the hypermedia items within home page 40, and an http request to view the associated, linked content residing elsewhere on the Internet will automatically be generated and dispatched by the client's server to the appropriate Internet server which "hosts" the linked document.
The linked material will then automatically be retrieved and ultimately displayed on the client. Http further includes the Hyper-Text Markup Language ("html"), which may be used to specify a certain layout structure for Web documents, e.g., specifying subsections of the document as a title, image, list, etc. Html specifications are interpreted by a client's browser, resulting in an appropriate display on the particular client's computer platform. A survey and discussion of many popular Web browsers is provided in the February 7, 1995, issue of PC
Magazine ("PC Ma azine"), at pages 173-196.
An important challenge that must be addressed, especially in light of the burgeoning expansion and popularity of the Internet and the Web, is how best to facilitate the authoring and publishing of hypermedia documents on the Web. Many large and small publishers of content -- such as newspaper and magazine publishers, for example -- wish to make their content available in on-line form to subscribers. However, this opportunity presents a major bottleneck, because high-quality development platforms and authoring tools have not yet been developed that adequately facilitate the authoring and publishing of hypermedia on a distributed WAN like the Web. A summary of the primary limitations of current Internet and Web publishing tools follows:
1. Current nublishiniz tools are typically not fully network-inte ra ated.
Browsers or other "cruiseware" help users view existing WAN content, but do not generally support authoring of new WAN content. Current authoring tools, on the other hand, are typically either "stand-alone" local products, or at best offer a limited bridge to WAN
access such that authoring and WAN navigation remain fundamentally non-integrated processes.
For example, in order to publish a document on a WAN, it is typically necessary to edit documents in a local storage context using authoring tools, and thereafter manually copy the documents to a WAN server. Manual copying is often tedious and inconvenient, especially where a publisher frequently publishes a large quantity of content from diverse sources, including text files, graphics images, video and sound clips, etc.
Yet, current authoring tools generally provide little assistance with this chore.
WO 96/30846 PCTlUS96l01686 The non-integrated nature of current authoring tools presents other difficulties and limitations as well. For example, it is not generally possible to "open"
multiple WAN
documents for editing and to transfer text, images, and URL's among those documents in the seamless fashion as is presently done with typical word processors for local computer documents. As another example, current Web authoring tools generally do not provide full WYSIWYG ("What You See Is What You Get") feedback as to html markups and hypermedia links. In other words, the creation and editing of documents is typically performed in a purely local context; html and URL codes must then be separately tested in a serial fashion, by loading the document into a WAN browser or the like. This serial, iterative process is highly inefficient.
2. Current WAN publiehing tools provide little assistance with manalzin~
collections of documents. Although the World Wide Web is famous for supporting hypermedia document links, current tools provide scant support for maintaining and operating on collections of related documents as a group. Much progress is needed in this area. For example, an integrated publishing environment should preferably allow users to visually navigate through collections of interconnected documents; to upload, download, anci transport collections of documents from one WAN location to another as a group; and to set access privileges or other attributes for a WAN collection as a group. Current tools generally fall far short of these objectives.
3. Current publishin tools ools provide little assistance with content-based indexint;
and retrieval. Current navigational tools, such as browsers, provide very little assistance with systematically organizing and searching the information content contained within the numerous sites comprising a network like the Internet. Clearly, as the volume of both inforanation and traffic on the Internet continues to explode, publishers need to be able to make their content available to subscribers in an intelligently organized fashion that facilitates uniform, content-driven search and access.
4. Current publishing tools provide little assistance with asset management.
For commercial publishers of proprietary material like newspapers or periodicals, asset management is critical. In other words, publishers need to be able to control and limit access to their WAN documents, and to keep track of usage for billing and other purposes.
Yet, currently available tools for WAN publishing generally ignore this area almost completely.
= 5. Current publishiniz tools do not address the creation of application programs.
For on-line network publishing to realize its full potential, publishers will want to do more than simply dump passive, one-way content onto the Internet. They will want to provide application programs allowing network users to take advantage of interactive on-line services W0 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT1US96/01686 such as subscribing to a publication, registering for a conference, or perhaps even more exotic applications like participating in multi-player games contests. Current network publishing and authoring tools largely ignore this area.
Accordingly, there is a great need for a new development platform for distributed publishing that overcomes the various limitations described above. This need is especially pronounced and important in view of the rapid expansion of interest in the Internet and the Web, and the tremendous economic opportunities presently available to publishers if a suitable development platform can be provided. Recently, authoring tools have begun to emerge, which attack some of the foregoing problems in piecemeal fashion. See PC
Magazine at pp. 110-196. However, there remains a great need for a comprehensive solution to the problems described, and especially for an authoring/publishing tool that is truly and fully network-integrated.

SUMMARY OF THE INVENTION
We disclose herein a development platform technology for publishing hypermedia documents across wide area networks ("WAN's"). This technology supports key publishing functions including document authoring, management and publishing of document collections, and support for database operations and interactive application program development. These functions are supported in a uniquely and fully WAN-integrated manner, as described further below.
In one feature of the present invention, a WAN document residing on a WAN
server may be accessed via a hypermedia link, edited, and stored to the same server or any other WAN server, using a client computer coupled to the same server or any other WAN server.
The processes of accessing, editing, and storing may be performed using a seamless user interface on the client computer. By "seamless" user interface we mean that users are not required to request additional steps such as intermediate copying or storage of the document being edited, or to switch back and forth among distinct "modes" or interfaces. Thus, browsing and editing of WAN documents is truly integrated. A related feature of the invention allows convenient transfers of content and/or hypermedia links among a plurality of WAN documents, such as by "cut and paste" or "drag and drop" copying.
Another related feature provides immediate execution and feedback for any display instructions added to the document using a standard WAN mark-up language.
In another feature of the present invention, at least two WAN documents residing on the same or different WAN servers are accessed, and a hypermedia link addressing one of the documents is inserted into another. Once again, the processes of accessing and editing are performed using a seamiess user interface on a client computer. In a related feature of the invention, a list of suggested target hypermedia links is automatically generated using statistical language processing techniques, and the link to be inserted is interactively chosen from that list.
Another feature of the present invention provides a method for publishing and managing a collection of related documents on a WAN. The related documents to be included in the collection are specified, and a desired operation (such as setting access controls or changing location) may then be performed collectively on each document in the collection, simply by interactively issuing a single command corresponding to the operation.
A related feature includes hypermedia links between documents of the collection, which address target documents relatively to source documents; i.e., each link address does not specify an absolute address for the target independently of the source. In another related feature, elements of the collection including documents and hypermedia links are graphically depicted using icons and connecting lines, thereby facilitating convenient, visual navigation and organization of the collection.
In a further feature, the present invention includes a method for providing form-driven interactive services on a WAN. A form-driven service is developed by creating a template form comprising one or more informational fields, as well as one or more hypennedia links addressing a database system or other utility program stored on an application server. The form-driven service is utilized by filling in the inforrnational fields, and "clicking" or otherwise signalling on the hypermedia link when ready. In response, the application server is sent an appropriate WAN message, and processes the form.
These steps (except the last step) are performed using a seamless user interface environment, so there is once again no need for users to switch interfaces or request any intermediate copying in order to perform the process of creating and filling in a template form and signalling when the form is ready for processing.
In a further aspect, the present invention provides a method for providing interactive application services on a WAN comprising a plurality of servers, for use with a client computer operably coupled to a first server, said method comprising the following steps:
creating, from a client computer operably coupled to a first server, a template form comprising one or more informational fields and one or more hypermedia links, said links addressing one or more utility programs stored on an application server that is remote from the client computer; interactively filling in the informational fields on the template form;
interactively selecting one or more of the hypermedia links; and processing the template form by executing the utility programs in response to the step of selecting of one or more of the hypermedia links, wherein the steps of creating and filling in the template form and selecting the hypermedia link are all performed, regardless of whether the first server and application server are the same or are different servers.
In a further aspect, the preset invention provides an apparatus for providing form-driven interactive services on a WAN comprising a plurality of servers, the apparatus comprising: a seamless user interface environment accessible via a client computer, said client computer operably coupled to a first server, the seamless user interface environment further comprising: form generation means for creating a template form, said template form comprising one or more informational fields and one or more hypermedia links, said links addressing one or more utility programs stored on an application server that is remote from the client computer; edit means for interactively filling in the informational fields on the template form; and cursor control means for interactively selecting one or more of the hypermedia links; and application service means, responsive to the selection of the hypermedia links, for processing the template form by executing the utility programs, wherein said apparatus is operable regardless of whether the first server and application server are the same or different servers.
In a still further aspect, the present invention provides a computer-readable medium having recorded thereon instructions, for providing interactive application services on a WAN comprising a plurality of servers, for execution by a client computer operably coupled to a first server, said instructions for causing a computer to: create, from a client computer operably coupled to a first server, a template form comprising one or more informational fields and one or more hypermedia links, said links addressing one or more utility programs 5a stored on an application server that is remote from the client computer;
interactively fill in the informational fields on the template form; interactively select one or more of the hypermedia links; and process the template form by executing the utility programs in response to the step of interactively selecting of one or more of the hypermedia links, wherein the instructions for causing the computer to create and fill in the template form and select the hypermedia link are all performed, regardless of whether the first server and application server are the same or are different servers.

5b BRIEF DESCRIPTION OF THE DRAWINGS
Figure 1 illustrates a basic, high-level architecture for a typical client-server WAN
such as the Internet or the World Wide Web.
Figure 2 illustrates a simple example of a typical "home page" document on the World Wide Web.
Figure 3 broadly outlines a client-server architecture in accordance with the present invention. =
Figure 4 illustrates a preferred document editor environment in accordance with the present invention.
Figure 5a illustrates a flow diagram for a scenario in which WAN hypermedia documents are created and edited in accordance with the present invention.
Figure 5a illustrates a flow diagram for a second scenario in which WAN
hypermedia documents are created and edited in accordance with the present invention.
Figure 6 illustrates a preferred set of interactive commands for working with a collection of interrelated hypermedia documents.
Figure 7 illustrates a preferred graphical interface for organizing and working with a collection of interrelated hypermedia documents.
Figure 8a is a screen image illustrating use of the preferred "NaviLinks"
facility to generate suggested hypermedia links.
Figure 8b is a screen image further illustrating use of the preferred "NaviLinks"
facility to generate suggested hypermedia links.
Figure 9 illustrates a flow diagram for developing and running WAN-based, form-driven, interactive application programs in accordance with the present invention.
Figure l0a illustrates a preferred interface form for adding a customer feedback table to an indexed database, in accordance with the present invention.
Figure 10b illustrates a default template form for adding a particular customer's feedback to an indexed database, in accordance with the present invention.
Figure lOc illustrates a modified template form for adding a particular customer's feedback to an indexed database, in accordance with the present invention.
Figure lOd illustrates a template form for searching an indexed database for particular customer feedback, in accordance with the present invention.

.
- fi -WO 96/30846 PCTlUS96101686 DETAILED DESCRIPTION OF THE INVENTION
Introduction Figure 3 provides a broad outline of a client-server architecture in accordance with the present invention, for use in the context of a WAN such as illustrated in Figure 1.
User's client machine 20d preferably includes digital computer facilities including CPU 68, user I/O peripherals 66, and storage device 64 (including internal and external memory) = storing operating system 62 and client software 60. WAN server 10d, preferably coupled to client 20d through a high-speed local connection, is equipped with digital computer facilities analogous to those of client 20d, and also with server software 50. As described in much greater detail below, client software 60 and server software 50 preferably share the responsibility for providing advantageous and innovative electronic publishing capabilities in accordance with the present invention. Note that a user of client computer 20d seeking the benefits of the present invention need only have client software 60 available on client computer 20d, and all or part of server software 50 available on server lOd (depending on the particular features desired). The user can then advantageously access and publish documents to and from the remainder of the WAN in accordance with the present invention, even though other computer systems on the WAN have not been similarly modified or upgraded.
The inventors are, as of this writing, in the process of developing a preferred embodiment of the present invention including client software 60 called "NaviPress" and server software 50 called "NaviServer." As a supplement to the detailed description provided below, an Appendix is provided herewith which contains illustrative source code, architectural specifications entitled "NaviPress and NaviServer: A Client-Server Publishing System for the World-Wide Web" (hereinafter "White Paper"), and excerpts from a draft User Manual for NaviPress and NaviServer. The reader is referred to the Appendix for more details regarding this preferred embodiment, and the Appendix materials are incorporated herein in their entirety by this reference.

Network-Integrated Editin~
The present invention enables users to access, edit, and store documents distributed throughout a WAN, in the advantageous manner of state-of-the-art, private computer or local area network word processing tools. In accordance with the present invention, the basic process framework by which WAN documents are accessed, edited, and stored is seamless and is substantially the same as if all steps occurred locally on a private computer. In = particular, users are not required to perform any intermediary downloading or copying steps, or to switch back and forth among distinct "modes" or interfaces in order to access and browse WAN documents, to edit them, and to store them.
As a more concrete illustration of this capability, Figure 4 illustrates a preferred, menu-driven document editor in accordance with the present invention.
Typically, menu bar 70 would be displayed continually at the top of a computer display "window" in which a particular document is being edited. "Pull-down" menus, such as "file" menu 72, are displayed when a user selects a corresponding item from command bar 70, preferably using a cursor control device. For example, file menu 72 includes commands to "open"
existing documents for editing, and to "save" such documents as revised, etc. This general, menu-driven methodology is of course by now familiar to those of ordinary skill in the relevant arts. The present invention enables these capabilities to be applied seamlessly across a wide area network. In other words, a user can conveniently access, edit, and save any WAN
document in much the same way as the user has been accustomed to doing with respect to documents residing locally on the user's private, personal computer. Consider a scenario in which multiple WAN hypermedia documents are being worked upon. As indicated in Figure 4, edit menu 74 includes "cut and paste" commands allowing text and other information to be transferred conveniently between multiple WAN documents.
"Cut" and "copy" commands will typically post to a"clipboard" (i.e., temporary storage) selected content from any document being edited, while the "paste" command will insert whatever content is currently held in the clipboard into a different document at a point of insertion selected by the user.
The present invention provides further advantages in the context of hypermedia WAN documents, as illustrated by the scenarios described in the flow charts of Figures 5a and 5b. With respect to Figure 5a, at step 80 the user of client computer 20d invokes file menu 72 to access a source document, such as by "opening" an existing document located on any WAN server. In this example, the source document contains a hypermedia link addressing a target document, located on the same or any other WAN server. At step 82, the user accesses the target document by "clicking" on the hypermedia link using a cursor control device, which immediately opens the target document for editing in accordance with menu bar 70, preferably in a separate document window.
At step 84, the user can immediately edit and revise the accessed target document.
This step preferably includes use of a markup language recognized on the WAN, such as html; elements menu 76 and format menu 77 in Figure 4 provide convenient tools for creating and editing html content with immediate WYSIWYG feedback. The editing step also preferably includes interactively transferring or copying any selected portion of the =
source document to the target document (or vice versa), such as by "cutting and pasting" or WO 96/30846 PCT/t7S96101686 by "dragging and dropping" the selected portion using a cursor control device.
Moreover, the copied portion may include hypermedia links (URL's) or other mark-up codes, and any such mark-up codes will immediately be active as soon as inserted into the target document.
Because the browsing and editing environment is seamless in accordance with the present invention, these editing tasks can now be performed without requiring users to switch between separate interface modes or to temporarily download documents into local storage, as was traditionally necessary.
Finally, at step 86, the target document is saved as revised to any WAN server by using, the "save" or "save as" commands of file menu 72. Note that server lOd, the source server, target server, and the ultimate destination server of the target document may all be the same server, or may all be different.
In the scenario described in Figure 5b, at steps 90 and 92 the user of client computer 20d accesses a source document and a target document, such as by invoking file menu 72.
The source and target may originally be located on any wan servers. At step 94, the "copy URL" command of edit menu 74 is used to post a hypermedia pointer addressing the target document onto a clipboard for temporary storage. (Recall that "URL" is the term for a hypermedia link on the World Wide Web, as discussed earlier in the Background section.) At step 96, the "paste URL" command of edit menu 74 is used to paste the stored hypermedia link onto a selected "anchor" item of content within the source document. At step 98, this new document, including the new hypermedia link, may be "published" by storing it to any WAN server, simply by using the "save" commands of file menu 72.
Thus, in accordance with the present invention, publishing hypermedia content across a WAN is achieved in a highly advantageous manner that fully and seamlessly integrates hypermedia browsing and editing.
As briefly noted above, the WAN-integrated editing environment is enhanced by elements menu 76 and format menu 77 which provide WYSIWYG feedback for html markup authoring without any need for users to separately launch a browser program or upload the document being edited. Other, preferred features of the editing environment depicted in Figure 4 include WAN browser menu 78, display options and preferences, and access to help. Menu bar 70 further provides access to various WAN tools and services discussed further below, including "NaviLinks" link generation, form-driven database update and search, and asset administration services.
= In summary, prior art technology has traditionally separated between WAN
"browsing" on one hand, in which WAN documents are accessed and mark-up codes are interpreted and executed, and document editing on the other hand, in which documents are modified. Conventionally, users must manually switch between distinct browsing and editing environments or "modes," and/or perform intermediate steps in which WAN
documents of interest are downloaded to the user's private local storage, thereafter edited, and thereafter uploaded back to the WAN. The present invention now enables users to access WAN documents, copy content (including hypermedia links and other mark-up codes) among multiple WAN documents, and execute WAN mark-up codes, all in a seamless ~
fashion without requiring intermediate steps. Moreover, these capabilities require only the ti user's computer system to include software implementing the browsing and editing environment, and do not require any modification of other WAN computers.
For more details on an exemplary embodiment of the WAN document editing and browsing environment, the user is referred to the Appendix, and especially to the draft User Manual at Chapters 2, 3, and Appendix A. Exemplary source code for use in implementing this unique environment is also included in the Appendix.

Working With Collections of WAN Documents Another aspect of the present invention is the ability to publish, maintain, and otherwise operate on collections of multiple, related documents as a group.
This is an especially valuable capability in the context of hypermedia collections, where there are explicit links between specific, related portions of documents.
Figure 6 illustrates a preferred, menu-driven authoring environment called "the MiniWeb" for working with collections of related documents in accordance with the present invention. Typically, menu bar 100 is displayed continually at the top of a computer display "window" in which a particular collection is being operated on. Many of the basic operations provided by the pull-down menus available through menu bar 100 are performed collectively upon the current document collection (or "miniweb"); in other words, a single command will be applied to all members of the collection, as a group. For example, pull-down "file" menu 102 includes commands to "save" a miniweb to any specified location in the WAN. When invoked, the command automatically stores all documents and objects in the collection to the desired new (or old) storage site. Preferably, edit menu 104 includes commands to globally search and replace a common portion of content, such as an updated company logo or URL, shared by many or all documents in the collection, although this particular command option is not explicitly shown in Figure 6.
Similarly, tools menu 106 performs administrative tasks, such as setting access controls (i.e., costs and security privileges), for collections as a group.
A related aspect of this invention involves the ability to transport collections of documents interrelated by hypermedia links in a convenient manner. Those of skill in the art recognize that when the target reference of a hypermedia link is moved, the link is WO 96/30846 PCT([TS96101686 thereby "broken," much like the address on a letter to a recipient who has moved and left no forwarding address. Thus, moving a collection of documents interrelated by numerous hypermedia links has been extremely onerous using prior art technology, since the hypermedia links must manually be "fixed" to address new locations.
In accordance with the present invention, one or more relative hypermedia links are preferably created among the documents of a collection. A "relative" link only addresses its target document relative to the source document's address. In other words, only a portion of the fitll target address is given, namely, a portion sufficient to locate the target relative to the source. Preferably, a specification of a hierarchical directory structure for each collection is maintained in a separate file along with the collection, so that only the topmost page in the collection need be tied to an absolute address, while other hypermedia links within the collection can be made relative and still be interpreted properly. Sample listings for such a specification are included on the following pages. Because the links are relative, they do not need to be modified when the collection is moved.
WO96/30846 CA 02216826 1997-09-29 pCTfUS96/01686 navidoc 1.0 graph=1 nametype=0 title=
style=
template=
Pages:
"top.htm" Up="" Style='- Title="The NaviServer pocumentation" 1 94 467 "install.htm' Up="" Style='- Title="Installing the NaviServer" 1 "startup.htm" Up=*' Style=" Title="Starting up the NaviServer" 1 "security.htm" Up=" Style=- Title="Security on the NaviServer" 1 -"costs.htm" Up="" Style="" Title="Charging money for access" 1 "search.htm" Up="" Style="" Title="Searching the NaviServer" 1 "srchdata.htm" Up="' Style=*' Title="Searching Database Tables" 1 "srchpage.htm" Up="" Style="" Title="Searching for Pages" 1 "hitlist.htm" Up="" Style='* Title="Hitlists and Hittables" 1 "hilite.htm" Up="' Style="" Title="Hiliting and MoreLikeThis" 1 "under.htm" Up="" Style=" Title="Coming Soon!' 1 "entup.htm" Up="" Style="" Title="Entering Data and Updating It" 1 "smartlnk.htm" Up="" Style=- Title="SmartLinkinQ" 1 "describe.htm" Up="" Style="" Title="Describing Pages" 1 "custom.htm" Up==" Style=*' Title="Customizing Entry, Update and Search Forms"

"archive.htm" Up='" Style=- Title="Archive Vereioning" 1 "logging.htm" Up="" Style="" Title="Logging" 1 "ops.htm' Up="" Style=*' Title="NaviServer URL Reference' 1 "maktable.htm" Up="" Style="" Title="Creating.and Dropping Tables" 1 "tables.htm" Up="" Style="' Title="NaviServer System Tablea= 1 "page2l.htm" Up=,' Style="" Title="Please title this page. (Page 21 in servdocs)" 1 "sumobanr.gif' Up= " Style="" Title=" 1 "sumoguyl.gif" Up="" Style= " Title=" I
"sumoguy2.gif" Up='* Style="" Title="" 1 "sumoguy3.g3f" Up="" Style='" Title="" 1 "sumoguy4.gif" Up="" Style="" Title="" 1 "sumoguy5.gif" Up="" Style=- Title="' 1 "sumoguy6.gif" Up="" Style=- Title="" 1 "sumochar.gif" Up="" Style=- Title="" 1 "sumoleaf.gif" Up="" Style="" Title="" 1 "sumoguy7.gif" Up="" Style="" Title="" 1 "sumoguy8.gif" Up=" Style='" Title="" 1 "fujibrch.gif" Up='* Style=- Title='" 1 "fujimt.gif" Up="" Style="" Title="" 1 "sumobboo.gif" Up="" Style="' Title=" 1 "sumofeet.gif" Up==" Style='" Title="" 1 "sumohnds.gif= Up=== Style= " Title='"= 1 "sumoarm.gif" Up=== Style='" Titlea"" 1 "cthulhu.gif= Ups== Style= " Title="" 1 "iceman.gif" Up=== Style==" Title="" 1 "sumochr2.gif" Ups=" Style="' Title="" 1 Ghosts:
Refs:
"top.htm"
0 "install.htm"
0 "startup.htm"
0 "security.htm"
0 "costs.htm"
0 "search.htm"
0 "under.htm' 0 "entup.htm"
0 "smartlnk.htm"
0 "describe.htm"
0 "custom.htm"
0 "archive.htm"
0 "logging.htm"
0 "ops.htm"
0 "maktable.htm"
0 "tables.htm=
2 =sumobanr.jif=
0 "srchpage.htm"
0 "http://www.yahoo.com/Computers/Wor1d_Wide_Web/Databases_and_Search:.ng/"
"install.htm=
0 =startup.htm"
2 =sumoguyl.gif"
"startup.htm"
4 'costs.htm' 4 'archive.htm' 4 "logging.htm' 2 "sumoguy2.gif=
"security.htm=
0 "/NS/GetSearchForm/ns users"
0 "/NS/GetSearchForm/ns-groups"
0 "/NS/GetSearchForm/ns-groups2users"
0 '/NS/GetSearchForm/ns-permissions' 0 "/NS/GetSearchForm/ns methods=
2 "sumoguy3.gif=
"costs.htm"
0 =security.htm"
4 'startup.htm' 2 sumoguy8.gif' 0 "/NS/GetSearchForm/ns_costs"
0 =/NS/GetSearchForm/ns_charges"
0 =/NS/GetSearchForm/ns_total_charges' "search.htm"
1 /NS/GetSearchFormPicker=
1 srchdata.htm=
1 srchpage.htm"
1 "hitlist.htm=
1 "hilite.htm' 2 =sumoguy4.gif=
1 "/NS/GetSearchForm/ns_permissions"
1 =/NS/GetSearchForm/ns_users=
"srchdata.htm=
8 "http://www.navisoft.com/STUB=
2 =sumoguy5.gif=
"srchpage.htm=
2 =sumoguy6.gif=
8 =http://www.navisoft.com/STUB=
0 =/NS/GetSearchForm/ns_default_collection=
'hitlist.htm=
0 /NS/C,etSearchForm/ns_default_collection=
0 =http:/hrw.navisoft.com/STUB=
0 "http://www.nCsa.uiuc.adu/SDG/Software/XMosaic/help-on-version-2.Sb5.htm1"
0 "http://www"netscape.com/info/newsreleasel6.html"
0 "http://www.w3.orQ/hypertext/WWW/Arena/=
0 =/NS/GetSearchPorm/ns_total_charges=
2 "sumochar.gif=
"hilite.htm=
0 =/NS/MoreLikeThis/?Url=$2fservdoc$2ftop.htm"
0 =/servdoc/top.htm=
0 "/NS/GetLFIP/?Ur1=$2fservdoc$2ftop.htm&terms=cool"
2 "sumoleaf.gif=
"under.htm=
2 =cthulhu.gif=
'entup.htm=
= 8 'http://www.navisoft.com/STUB' 2 "sumoguy7.gif=
0 "/NS/GetEntryForm/ns-permissions"
"5martlnk.htm=
2 "fujibrch.gif=
WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT/US96/01686 "describe.htm' 8 "http://www.navisoft.com/STUB"
2 'fujimt.gifc "custom.htm' 2 "sumofeet.gif"
1 "/NS/GetSearchForm/ns_columns"
"archive.htm' 4 "startup.htm"
2 "sumohnds.gif"
0 "http://navisoft.com:8001/NS/ArchiveVersions/index.html"
0 "http://navisoft.com:8001/index.html"
0 "http://navi.soft.com:8001/NS/Archive/19950222000000/index.html"
"logging.htm=
4 "startup.htm"
2 "sumoarm.gif"
"ops.htm' 2 'iceman.gif"
1 "/NS/GetSearchFormPicker"
1 "/NS/Admin=
1 "/NS/About' 1 "/NS/GetNewTableForm' "maktable.htm"
0 "/NS/GetDropTableForm"
0 "/NS/GetCreateTableForm' 2 "sumobboo.gif' "tables.htm' 2 "sumochr2.gif' 'page2l.htm"
"sumobanr.gif' "sumoguyl.gif"
"sumoguy2.gif"
'sumoguy3.gif"
"sumoguy4.gif"
"sumoguys.gif"
"sumoguy6.gif' "sumochar.gif"
"sumoleaf.gif' "sumoguy7.gif' "sumoguy8.gif' "fujibrch.gif"
"fujimt.gif=
"sumobboo.gif' "sumofeet.gif=
"sumohnd3.gif=
"sumoarm.gif=
"cthulhu.gif=
"iceman.gif"
"sumochr2.gif=
.
WO 96/30846 PCTlUS96101686 A preferred embodiment of the MiniWeb facility that has been described includes an advantageous, graphical front-end for viewing and navigating within a collection of hypennedia documents. Figure 7 illustrates an example of such a miniweb interface.
Display icons 110a-n each represent corresponding documents located anywhere on the WAN, or anywhere within the user's local storage. Arrow icons 112a-n indicate hypermedia links between documents, in the direction indicated by the arrows.
Thus, the = miniweb display provides an intuitive, graphical view of the relationship among a collection of hypermedia documents.
The graphical interface of Figure 7 is preferably displayed in a separate window of client computer 20d, alongside document editing windows in accordance with Figure 4.
Users can preferably use the miniweb window as a short-cut to access desired documents within a collection by simply "double-clicking" on the corresponding icon in the miniweb, or by "dragging and dropping" an icon from the miniweb onto a document editing window.
Moreover, the precise appearance of icons and connecting arrows preferably indicates the nature or state of the corresponding document or link. For example, icon 110i represents a sound file, while icon l l0b is a hypermedia "web" document, as suggested by the appearance of those two icons. Further, the color and shading of icons and arrows may indicate such states as a modified and unsaved document, or a relative or absolute address link. For more details regarding the graphical interface of Figure 7 and its preferred uses, the reader is referred to the draft User Manual in the Appendix, and particularly chapters 4 Appendix B thereto. Once again, source code included in the Appendix provides exemplary means for implementing the miniweb facility we have described.

Automated Authoring of WAN Hypermedia: "NaviLinks"
Most content on the World Wide Web is not originally created as hypermedia.
For example, news articles, product brochures, and other literature originally created for non-interactive environments do not initially contain any hypermedia links to other documents.
Such links must be creatively defined and implemented. A preferred feature of the present invention provides assistance in the authoring of hypermedia WAN documents, by facilitating and partially automating the creation of useful hypermedia links.
This facility, which we call "NaviLinks" herein, uses statistical language processing algorithms to generate automatically a list of suggested, possible hypermedia links between a source document and a collection of potential target documents. A human author can then review the suggestions in a convenient manner, and choose to incorporate, modify, or discard them.
The NaviLinks facility is preferably integrated along with the publishing tools described above, and as illustrated in the "screen shots" of Figures 8a and 8b. Both figures WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 PCTlUS96/01686 depict document editing window 120, including menu bar 70 in accordance with the teachings of Figure 4 and the earlier discussion herein. A document entitled "Wild Rice Risotto" (evidently a recipe) is currently open within window 120. In the example shown, the user has already invoked the NaviLinks facility for assistance in creating hypermedia links from the recipe document to related documents. NaviLinks window 124 is thus shown overlapping on document editing window 120. Window 124 displays list 126 of suggested anchor items. An "anchor" item is an item of content within a source document encoded as a hypermedia link; users "click" on anchor items to bring up linked target documents. Thus, the highlighted entry in list 126 corresponds to item 122 in the recipe document, namely, the recipe author's name (Carey Schnell-Wright). NaviLinks window 124 also displays list 128 of potential target documents for the currently highlighted anchor item. The lists of suggested anchor items and potential targets are generated automatically, preferably using statistical language processing techniques such as provided in the Xerox Lexical Technology ("XLT") package commercially available from the Xerox Corporation.
Because of the integrated nature of the tools described herein in accordance with the present invention, the process of exploring and selecting among the suggested anchor items and corresponding hypermedia links shown in Figure 8a can be performed very conveniently. For each anchor item in list 126, a suggested link in list 128 can be encoded directly onto the anchor item in the source document by pressing "Apply"
button 132; or, the target document addressed by the suggested link can itself be accessed and edited in yet another editing window, by pressing "Show Page" button 130. Figure 8b illustrates the results of pressing these buttons. The visual appearance of anchor item 122 is updated to indicate that it is now encoded as an URL (i.e., a hypermedia link), as a result of the user "applying" a suggested link. In addition, as a result of the user selecting a "Show Page"
request, document editing window 134 has been created overlapping on windows 120 and 124, and displays an open WAN document containing another recipe by the same author and entitled "Marjoram Potato Casserole."

~
-WO 96/30846 PC'T1US96101686 WAN-Integrated, Form-Driven, Interactive Services A hypermedia publishing platform should preferably support not only the authoring and distribution content, but also a variety of form-driven interactive services, such as content-based indexing of documents, and controlled access to proprietary WAN
documents.
Preferably, application developers and end-users should be able to generate and store new forms, retrieve existing forms, fill out forms, and submit them for appropriate processing, all in a convenient and seamless manner utilizing an integrated editing and browsing environment such as described earlier in connection with Figures 4-7.
A great many, desirable, interactive WAN services are database-oriented. For example, a service might involve a particular database "view" (i.e., a specified set of indices) for indexing WAN documents, for managing historical versions of WAN
documents, for collecting and reviewing customer feedback, or for relating specified access controls (such as security restrictions and access costs, perhaps of a hierarchical nature) to specific, proprietary WAN documents. Therefore, the form-driven interface environment of the present invention is preferably integrated not only with editing and browsing tools as previously described, but also with a database management system such as the Illustra object relational database management system.
Figure 9 illustrates a sample process flow diagram for developing and utilizing form-driven, interactive, database services in accordance with the present invention. At step 140, a developer user begins the process of setting up a new interactive service by using client computer 20d to create a new database table for the service, preferably using an integrated authoring environment such as window 160 in Figure 10a. As shown, window -160 includes menu bar 70, and the seamless browsing and editing facilities described earlier herein. The table created in step 140 will include a plurality of data fields 162a-n. As illustrated in Figure 10a, each one of data fields 162a-n preferably may be associated with various specifications such as a required data type, and whether or not database entries in the table will be indexed (and hence searchable) using that field. As indicated by comment 164 in Figure 10a, step 140 is completed by pressing a "create table" button or the like. The "create table" button is actually just a special kind of hypermedia link which transmits a requested operation for processing by a target WAN server on which server software 50 is available, as will be described in greater detail further below. In this case, clicking on a "create table" button sends a network message formally registering the new database table with server lOd or another selected WAN server (hereinafter, the "application server") on which server software 50 including a database management system is available.
Once a database table is created, at step 142 template forms are generated for interactively updating and searching the database described by the new table.
Updating, such WO96/30846 CA 02216826 1997-09-29 pCTI1JS96/01686 as by adding a new database entry, may interactively be performed using a form as illustrated in Figure lOb, in which informational fields 166a-n correspond to the data fields 162a-n specified in the database table. Thus, a user who accesses the entry form at step 144 can then describe the database attribute values for a new entry at step 146 simply by filling in informational fields 166a-n. Analogous comments apply with regard to forms for submitting a specific database search or query, such as the form of Figure lOd which includes corresponding information fields 174a-n.
Because description and search forms are integrated with the authoring environment previously described, as indicated by the presence of menu bar 70 in Figures lOb, lOc, and lOd, users can seamlessly take full advantage of the editing capabilities of that environment in the course of filling out description or search forms. For example, while a WAN
document is being accessed and edited by the user in one display window, the user can fill out a corresponding description form or access control form in another window, concurrently. Moreover, users can even modify and customize the style and appearance of entry or search forms, by using the editing facilities of menu bar 70, such as the html mark-up commands of the Elements and Format menus (as discussed previously in connection with Figure 4). For example, Figure lOc depicts an edited version of Figure lOb that still corresponds to the database table of Figure 10a. Thus, fields 170a-n of Figure IOc map directly onto fields 166a-n of Figure lOb, but are merely displayed in a somewhat different appearance.
Thus, the steps of generating and filling in new tables, entry forms, and search forms are seamlessly integrated with the editing and browsing environment previously described. Moreover, even the step of submitting a completed form to the application server for processing may likewise be performed in seamless fashion together with the preceding steps. Thus, at step 148, a user who has completed a database entry or search form submits the form to the application server by pressing a hypermedia "enter" button or the like using a cursor control device as indicated by comments 168 (on Figure l0a) and 172 (on Figure 10b), akin to the "create table" button described above in connection with Figure 10a. Entry and search forms are thus "live," meaning that completing a form and interactively signalling a hypermedia link included in the form will automatically send an appropriate message to the application server, causing server software 50 to initiate appropriate database actions at step 150. The user need not invoke a separate interface, copy any files, or compose any database scripts. Thus, to enjoy interactive database services, users can simply fill out forms using the same environment they use to access and edit documents.
Note that a WAN document referenced in a database may preferably be located anywhere in the WAN in accordance with the present invention, and need not be local to the application server. From the standpoint of server software 50, the database tables reference and index WAN-compatible URL's, (i.e., WAN address pointers), and so need not store documents locally. Note also that, multiple tables and hence multiple indexing views and forms covering the same documents are possible. For example, an administrator might = 5 systematically index all documents on a server, while individual users might create their own indexing schemes for documents and criteria of special interest.
~
For more details regarding various menu-driven interactive services provided by a preferred embodiment of the present invention, the reader is referred to the Appendix, and especially to chapter 5 of the draft User Manual and chapter 3.3 of the White Paper. Details regarding a preferred architecture and implementation for server software 50 in support of menu-driven interactive database services will now be described.
Preferred embodiments of client software 60 ("NaviPress") and server software ("NaviServer") communicate through a WAN hypermedia protocol such as http. All requests and responses between client and server are accomplished through http. Thus, NaviPress sends requests to NaviServer using GET, PUT, POST, BROWSE, and DELETE
methods, and NaviServer returns results using standard http return codes, as well as some special content types in accordance with the present invention. Both NaviPress and NaviServer are thus "open" in the sense that any http-compliant client computer can access most services provided by NaviServer, and NaviPress can be used with any http-compliant WAN server.
NaviPress requests for services from NaviServer may contain ordinary URL's, but sometimes contain special URL's that map to server functions. If a request is not immediately serviceable - e.g., GET a page for browsing -- NaviServer checks to see if the URL contains a special data field encoding a registered operation that maps to server-specific processing code. For example, NaviServer preferably includes about twenty pre-installed operations, listed in Table 1, for implementing common server functions such as publishing, administration, information retrieval, and document management functions.
These special URL's take the general form of "/prefix/operation/arguments," where the "arguments" are an arbitrarily long string that is passed to the "operation." The NaviServer looks for registered prefixes and recognized operations, and then passes the request to the appropriate utility program or process. NaviServer is designed so that custom services can be added easily. Application developers can register new operations with their own unique prefixes.
}
Since a standard, open protocol is used for communications between client and server, even vendors of other authoring tools can write interfaces that advantageously publish content to a server running NaviServer software.

Table 1. Examples of NaviServer operations GetSearchFormPicker Get list of links to a variety of search forms installed on the server. Examples include problem report fonns, customer comments, permissions.
GetSeanchFonn Get a specific search fonn for specifying search criteria.
Sean:hQueryByForm Search via query by fonn.

GetLoealHilitedPage Get a local highlighted page, where highlights identify the terms in the page that met the selection criteria GetRemoteHilitedPage get a remote highlighted page, where highlights identify the terms in the page that met the selection criteria MoreLikeThis search via "inore like this" (find siinilar documents by using terms in the target page) NaviLink generate anchor tenns and phrases GetEntryFonn get form for database entry GetUpdateForm get form for database update GetUpdateOrEntryFor get update (existing data) or entry (new data) form as appropriate m GetMeta Tables get list of entry tables Admin administrative controls and views for access (permissions and costs), tables (view, add, drop), users and groups (view, add, assign), and usage (raw or by user) About gets information about server (naine, version, host, port, database, archiving charging) ArchiveVersions archive a version of a page or docutnent GetNewTableFotm get a new table fonn, for creating a new table CreateTable create a table For more details on this subject, the reader is referred to the Appendix hereto, especially the White Paper at chapter 4, and sample source code for the server software and related code.
WO 96/30846 PCTlUS96101686 Other Variations The fully integrated client-server environment illustrated herein represents a very powerful and flexible platform for authoring hypermedia content. Detailed illustrations have been provided for the edification of those of ordinary skill in the art, and not as any kind of limitation on the scope of the invention. Numerous variations and modifications within the spirit of the present invention will of course occur to those of ordinary skill in the art in view of the preferred embodiments that have now been disclosed. Such variations, as well as any other systems embodying any of the following claims, all remain within the scope of the present invention:

-APPENDIX TO PATENT APPLICATION FOR

"AN INTEGRATED DEVELOPMENT PLATFORM FOR
DISTRIBUTED PUBLISHING AND MANAGEMENT OF
HYPERMEDIA OVER WIDE AREA NETWORKS,"

LINDA T. DOZIER, ET AL.

1. NaviPress and NaviServer: A Client-Server Publishing System for the World-Wide Web, by Linda T. Dozier 2. Draft of a user manual for NaviPress and NaviServer 3. Sample source code for NaviPress and NaviServer WO 96/30846 PCTlUS96/01686 NaviSoft NaviPress and NaviServer A Client-Server Publishing System for the World-Wide Web Linda T. Dozier NaviPress and NaviServer form an = seamless access to both local and integrated client-server network remote Web pages, allowing publishing system for creating content, remote authoring over the Internet;
managing information, and developing ."NaviLinks," to easily translate text applications on the World-Wide Web. into hypertext and automatically Our software is intended for companies identify related pages;
and enterprising individuals who want = an information architecture for to create and maintain innovative, operational Web applications. management and control of assets;
NaviPress and NaviServer provide the = HTML as a general-purpose, forms-following unique combination of oriented interface to a DBMS that services: eliminates the need for CGIs = the "MiniWeb," to graphically (common gateway interfaces);
visualize and organize a collection = an easy-to-use hierarchical access of pages into a document; control and cost model;
= integrated WYSIWYG authoring = example "Blueprints" that function and browsing of Web pages like Microsoft Wizards for the without typing HTML (hypertext Web;
markup language) tags or names of . extensibility, to implement custom URLs (uniform resource locators); services.

1995 NaviSoft, March 1995 An America Online Company WO 96/30846 PCTlUS96101686 1. Introduction This paper explains the features and architecture of NaviPress and NaviServer.
We intend the discussion for technical personnel who are interested in a description of client and server functions and an explanation of the internal architecture.
The introduction explains why we developed our products and how our customers will use them. The rest of the discussion explains the products' features, scenarios for their use, and the underlying architecture.

1.1. Tools Available Today for the World-Wide Web The World-Wide Web (WWW) has fueled the explosive growth of the Internet and the emerging software and services industries that surround it. Today there are 27,000 Web sites, and the estimated number of sites doubles every 53 days). Most new software products for the net are cruiseware, commerce servers, or stand-alone hypertext markup language (HTML) editors2. Cruiseware comprises client applications that help users access Internet services-electronic mail, ftp, news, gopher, and the Web. Commerce servers address the need to securely transfer credit card numbers, or other proprietary or sensitive information, and to negotiate payment.
Stand-alone HTML editors are desktop applications that produce HTML output;
examples include Microsoft Word and its Internet Assistant, Cyberleaf, and HotMeTaL
While all these tools are useful, none of them focuses on the problem of creating and maintaining a full-fledged Web application-a server that includes pages, forms, access control, regular maintenance, and processing of data collected over the Web.
Today, developing an application that provides or collects information through the Web requires a variety of skills-knowledge of the hypertext transfer protocol (http), HTML, common gateway interface (CGI), Unix, and programming in C, Perl, or SQL.
Cruiseware provides excess to the Web once someone has put up the pages, commerce servers assure a secure channel of communication between client and server, and a I A. Cortese, J. Verity, R. Mitchell, and R. Brandt, Cyberspace: crafting software that will let you build a business out there, Business Week, n3413, Feb 27, 1995.
2 See O. R. Tabibian, Electronic businesses (software for building a World-Wide Web server), PC
Magazine, v 14, n3, Feb 7, 1995.

1995 NaviSoft, March 1995 An America Online Company WO 96/30846 PCTiUS96/01686 stand-alone HTML editor produces a file of HTML output on the desktop. Despite all this software, the information provider still needs a programmer to put all the pieces together into an application. Moreover, none of these tools provides a framework expressly designed for developing and maintaining applications.

1.2. The Niche for NaviPress and NaviServer NaviPress and NaviServer are an application development platform for the World-Wide Web. They form a client-server publishing system and extensible information system that make it easier to create content, manage assets, and process information.
Our software is for the content creator and provider. It helps people establish and maintain Web servers more easily than they do today. Using NaviPress and NaviServer, an infopreneur-an enterprising individual or company who is moving advertising, marketing, support, and sales activities to the Web-can build rich applications, without detailed knowledge of protocols, markup languages, and operating systems.
Together NaviPress and NaviServer provide an interactive environment for building applications. Although it is possible to use either NaviPress or NaviServer alone, they are part of a client-server product suite and work best together. The client, NaviPress, has a point-and-click interface for creating, editing, and linking applications. The server, NaviServer, supports these applications by servicing requests, managing content, and providing an inforznation architecture.
Classic applications that can be developed using our tools include:
= a corporate "home page" with linked text, image maps, and forms that the reader can search;
= a customer support system for collecting customers' feedback and distributing information about products; and = a Web directory service that catalogs and indexes interesting sites.
Because NaviSoft's tools greatly simplify the development of Web applications, they let us reach and cultivate a larger, more diverse group of content creators and providers than the Unix programmers and system administrators who make up that community today. Typical customers for our products include:
= Internet consultants selling setup or hosting services;
= creative agencies developing Web pages for clients;
= in-house corporate management information departments responsible for setting up and maintaining a Web presence;
= publishers using the Web as a distribution channel for electronic content;
March 1995 1995 Navisoft, An America Online Company = merchants using the Web to advertise and provide products for sale; and = small businesses and individuals who want a Web presence.
With the introduction of NaviPress and NaviServer, NaviSoft brings a new product category to the World-Wide Web. There are many useful and exciting products available for the Internet today, but none have focused exclusively on making it easier to create and maintain Web applications. In the next three sections we present key features of our tools, explain how to use them to build applications, and describe the internal architecture.

1.3. Availability NaviPress is available for Windows 3.1, Macintosh System 7.x, and X/Motif.
NaviServer is available for Solaris l.x, Solaris 2.x, Solaris Intel, HPIUX, Windows NT3.5,IRIX5,andOSF/l.

2. Key Features of NaviPress and NaviServer NaviPress and NaviServer uniquely encompass features to form a comprehensive, end-to-end capability for corporate information officers, information providers, publishers, graphic artists, and consultants. Other individual products on the market carry out some of our functions, but no other product combines the full range of features in NaviPress and NaviServer. Our tools combine:
= integrated WYSIWYG authoring and browsing of Web pages without typing HTML tags or names of URLs;
= seamless access to both local and remote Web pages, allowing remote authoring over the Internet;
= the "MiniWeb," to graphically visualize Webs and organize collections of related pages;
"NaviLinks," to easily translate text into hypertext;
= an information architecture based on a database management system (DBMS) and information retrieval (IR) engine that complements a hypertext-based navigation architecture;

1995 NaviSoft, March 1995 An America Online Company = automatic generation of HTML forms and the use of HTML as an interface to a DBMS to extend the reach of database applications to wide-area networks;
= hierarchical access control and cost model that are consistent with the structure of the Web;
="Blueprints" that function like Microsoft Wizards for the Web to help get applications up and running quickly;
= extensibility, to implement custom services.
Author Web pages without typing a single HTML tag. NaviPress provides a fully interactive interface for creating Web pages, including image maps and forms.
It is similar to a word processor, but is especially designed for creating HTML. It supports features unique to HTML, such as links, image maps (images with interactive regions that link to URLs), and forms. It produces HTML output that structures documents, but leaves the presentation (fonts, alignment, etc.) under the control of the reader's application. The interface for creating pages is point-and-click, so there is never a need to type any HTML tags or URLs.
Open pages without knowing exact URLs, and publish pages, or collections of pages, with the click of a button. NaviPress is a networked application.
Unlike stand-alone HTML authoring packages that write files to the desktop, NaviPress lets you work on files that exist on your desktop machine, or in a remote location served by a local or wide-area network. You can edit a file on the desktop, or edit a file on a server over the Internet. When you select Open..., you can pick files from your local drive or from the file system of the server. Unlike other browsers, where you must know the exact path of the URL to open, you can browse the file system of a NaviServer using the same interface you use to browse files on your local disk. You can open a directory and see a list of its contents, or traverse the directory structure of a remote Web server using a point-and-click interface from your desktop client. Similarly, when you want to save a page, you can write it to your local file system or write it to the server. You can place the file in the right location in the directory structure of your Web server, or you can edit an existing page and just hit Save to write changes over the net to the original location of the page. With this interface you do not have to remember exact URLs for reading or writing. You can Open, Save, and Save As... to the server using the same interface that you use to manage files on your local disk.
Immediately place your work into the Web through seamless integration of browsing and authoring. With our Web browser, you can open an URL, point the cursor into the middle of a page, click to make a change, and then select Save to publish it to a server thousands of miles away. With NaviPress you can author while you browse and browse while you author, seamlessly using the same application, same windows, and same interface. The only distinction between authoring and browsing is whether you modify a page or just look at it. There is no switching between view mode March 1995 1995 Navisoft, An America Online Company WO 96/30846 PCTlUS96101686 and edit mode, nor is there a multi-step procedure where you create the HTML, write the output to a file, move the file to a Web server, and then load the file into a browser to see what it looks like and test the links. The authoring tool is a browser, and the browser is an editor.
Visualize and organize hypertext connections using MiniWebs. The basic unit of information on the Web today is a page. Whether browsing or authoring, you view a single page, and you must scroll through it, perhaps moving the cursor over the links, to follow the hyperlinks. Pages are unrelated except for references through URLs. The Web has no inherent mechanism for organizing sets of related pages into groups that share common properties and can be treated as a unit. We have introduced a construct, the MiniWeb, for organizing and visualizing related Web assets. A MiniWeb is a collection whose internal links are relative and whose external links are absolute.
MiniWebs have ownership, can share common properties, can be moved without breaking links, and can be viewed graphically. Both our client and server support the ability to operate on collections, rather than just pages.
The MiniWeb window in NaviPress is a visual aid that is useful for browsing and authoring. When browsing, MiniWebs give you a picture of the forest instead of the trees. To view a page double-click on it, or drag and drop the page from the MiniWeb window into a page window. As you author pages, NaviPress automatically places them within a MiniWeb. As you create content and links, the MiniWeb shows you active status of your work, displaying your Web as you build it.
Make all your links without typing a single URL. NaviPress offers a fast, error-free way to create hyperlinks using the clipboard. While viewing a page, whether authoring or browsing, you can select Copy URL to put the URL of the page into the clipboard.
Then you can paste it into a MiniWeb to graphically visualize the page and all of its links, or you can highlight a selection of text as an anchor and paste the URL
to make a link, or you can paste the URL into fields in dialog boxes to make regions in an image that link to other URLs. You can copy and paste the URL of any page in the World-Wide Web, not just the pages you own or have just created on your desktop.
You can author a page in one window, browse the Web in another, and use copy and paste to create links from your page to places throughout the World-Wide Web.
It is fast, works both locally and across the network, and reduces errors because you type no URL names. The ability to seamlessly integrate browsing and authoring, copy and paste URLs, and access the file system of remote servers immediately places you and your work within the context of the Web. With NaviPress you work on the Web itself, not just on creating HTML page-by-page.
Turn plain text into hypertext automatically using NaviLinks. Most content on the Web is not originally created as hypertext. There are news articles, specifications, product information, and brochures that start out as linear text that the creator or editor must modify and translate for the Web. While various conversion processes exist to put text into HTML, these conversions put few, if any, links into the body of the text.

= 1995 NaviSoft, March 1995 An America Online Company "NaviLinks" is our feature that helps you create hyperlinks. They take an input file (plain text or HTML), apply algorithms that understand natural language to select potential anchors, and then use information-retrieval algorithms to find other pages related to the suggested anchors. An interactive interface lets you look at automatically generated hyperlinks and then apply or discard the suggestions. The combination of NaviLinks, authoring, and publishing lets you quickly turn plain text into richly connected, nicely formatted hypertext.
Control your content using information management technology. The Web has a great navigation architecture, but it lacks an information architecture.
Imagine using a library whose main search mechanism is to pick up a book and then follow references from book to book. Imagine also that the books' titles relate only vaguely to their content. This is an alarming, but accurate analogy to the World-Wide Web today. Web pages are strewn throughout file systems all over the world with no relationship to each other except through URLs. Although there are now search tools to find words in titles of Web pages3, there is no analogy to the rich indexes into the traditional journal literature, and there is no way to keep track of the content that you manage.
On a small scale this may not matter, but for commercial applications where content is your primary asset, an information system to manage your content is vital.
Central to the NaviServer are information technologies that it uses to catalog and manage content. When you publish to a NaviServer, it automatically indexes the full text of pages. In addition, you can run the server in a mode where it builds an archive that keeps a history of all changes. A Web-based newspaper, magazine, or newsletter could use this feature to automatically archive "back issues." As daily, weekly or monthly articles are published for each section, the server automatically archives the previous version.
The information management system built into the NaviServer describes the content of a specific server or content found throughout the Web. The mechanism is not exclusive. You can attach any type of description, or many descriptions, to any URL.
No matter how many views you have defined for a set of pages, the server stores them only once. For example, you could create catalogs for What's New, What's Cool, and What's Popular. Some URLs are new, cool and popular, while others may be just new or just cool. Users access these catalogs, but an administrator might catalog some of the same URLs by author, title, subject, modification date, and frequency of access.
The substrate of information that sits beneath your pages can be accessed using all the power of relational and full-text search engines, including similarity, Boolean, and relational search operators. NaviServer gives you =the full power of a database and its utilities to manage your server's information content.

3 e.g. http://www.yahoo.com March 1995 1995 Navisoft, An America Online Company WO 96/30846 PCT(tTS96101686 Create database applications for the Web without writing a single line of code.
NaviPress and NaviServer provide a general purpose, forms-oriented interface to a DBMS over the Internet. NaviPress and NaviServer let you create database tables by filling in a form with information about the table, then NaviServer automatically generates an active HTML form that maps to the DBMS. You define the fields, NaviServer creates the HTML form, and NaviPress' authoring ability lets you customize the appearance of the form and place it into your Web. Through point-and-click, add your artwork, modify text, and then paste the form into your Web.
Instantly the form can be used to insert, update, delete, or search using a full range of database technology. You have an active HTML form, without writing a single line of code.
You can create forms to collect customers' comments, accept product orders, register for seminars or training, track problem reports, etc., and you have wide-area distributed access to the database through the World-Wide Web.
Administer hierarchical access control and cost accounting using simple forms interfaces. Built into the NaviServer are hierarchical access control and cost accounting. You can set user, group, or world permissions for read and write at any level in the hierarchy of a Web server. Lower levels inherit permissions from higher levels, so it's easy to set up a server where separate groups maintain different parts, or where some areas are publicly accessible and others are protected. Through a forms interface on the client, you set access controls. The NaviServer thereby allows remote or local administration, even by people unfamiliar with server administration.
There is an analogous way to associate costs with operations on the server. You can use a forms interface to set the cost for an operation on an URL. Every request for the operation incurs a cost set by the administrator, and the server records the transaction in the database. You can review costs, process them, or export the transactions to an accounting and billing system.
Quickly start building application using Blueprints. To make application development even easier, NaviServer includes a set of Blueprints, example applications that serve as templates for development, like Wizards for the Web. A
Blueprint is a MiniWeb that includes default content, structural relationships, common stationery, database templates, and forms. Example Blueprints include a customer support system, personal home page, and Internet directory. The quickest way to bring up your own customer support system or Internet directory is to open a Blueprint, then use NaviPress to modify the stationery, set your own style, modify the default content, add your own content, perhaps edit the structure and add some database forms, and publish. Blueprints help you get going quickly by providing a ready infrastructure, so all you need to worry about is content specific to your application.
Build a custom NaviServer by adding your operations. NaviServer is a platform for the content creator and provider, who can use it immediately to author content, organize servers into MiniWebs, administer the server, build forms-based database applications, or customize Blueprints. NaviServer is also a frameworkfor the system 1995 NaviSoft, March 1995 An America Online Company WO96/30846 CA 02216826 1997-09-29 pCTfUS96/01686 developer, with an architecture designed for ease of development. The developer can customize the NaviServer in three ways, either by using our built-in processing operations, adding new operations through our library, or, because the NaviServer has an information-centric architecture, by developing database applications that process the content of the NaviServer in the DBMS. There is a consistent, open interface for requesting operations, so any http-compliant client can access new operations.

3. Sample Scenario: Using our Tools to Build a Customer Support System In this section we illustrate how to use the capabilities described in the previous section by building a customer support system on the Web. In our example, NewCo is a medium sized, high-technology business that wants to move sales and support activities to the Web. NewCo's objectives for their Web site are to establish a corporate presence, electronically distribute product information, attract customers, advertise products and services, and accept orders and collect customers' comments.
In our example, we start by using a NaviSoft Blueprint. We briefly walk through illustrative steps to modify the Blueprint, add new content, create a support database, and publish the application. Exhaustive scenarios are beyond the scope of this paper, so we focus on a narrow thread, bypassing examples of other interesting features such as NaviLinks and server administration.

3.1. Selecting a Blueprint We start by opening a standard Blueprint and create our own local copy. All changes are made to the local copy, which we publish to the server at the end of the scenario.
To make a your copy of a Blueprint:
1. Go to the help menu and select Examples.
2. Select the Customer Support link.
3. Select Save As... and write a copy to your local disk.

March 1995 1995 Navisoft, An America Online Company File Etlit Vfew Toals Browse Help ;=- _ ,~ ~.. .:.~.,...:.,.~_..:... .._._....:"..': .:::.>.t~i~.~5~::?,:;:. ..
.
t Customer Support Blueprint crecibar,map r -. whereis.htmr~ ~ailto:mebmaster@you dist_lis.htmf forum.htn edutraihtn helpdesk.htn fwais.pl =~---~ ' Jp.os.v courseli.htn orlda~ap.guswap.gif, istra.htm let. if -eckitrain-eif hyper/
catalog.htM 0 webAail.htu line.gif company, if 0043 tml cust~. jhel f igh.htn ~ods.hta support.htm /
:aetihiva.stafonlAdalbtsfwYrw-r Figure 1. Customer support Blueprint A Blueprint is a predefined MiniWeb that includes sample pages, artwork, forms, and structural relationships between pages. You can use the organization offered by default, or make whatever changes you like. Figure 1 shows the customer support Blueprint, an example of a MiniWeb that shows some icons and links. The icons indicate the type and status of an asset. Variations of the icons reflect their current status-e.g., saved, unsaved, inside the MiniWeb, reference to an external asset, etc.
1995 NaviSoft, March 1995 An America Online Company W0 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 PCT[jS96/01686 3.2. Browsing Using a MiniWeb The first thing you would likely do with a Blueprint is to look through its pages. Using a MiniWeb you do not have to traverse links to get to the right page. Instead, the MiniWeb shows all assets and their relationships, so you can point-and-click or drag-and-drop to immediately view what you want. There are three ways to look at pages in a MiniWeb:
1. Move the cursor over a page icon in the MiniWeb and double-click to open a window for authoring on the page.
2. Browse in the usual fashion by following links, or go back to the MiniWeb window and double-click on another icon to open another page window.
3. Select an icon from the MiniWeb and drag-and-drop the page icon from the MiniWeb to the page window. This replaces the content of the page window with the dropped object.
NaviPress lets you open many page and MiniWeb windows while you work. Copy-and-paste or drag-and-drop work from page to page, MiniWeb to page, page to MiniWeb, or MiniWeb to MiniWeb. NaviPress keeps a global history of your actions, and each page window has its individual history.

3.3. Creating a Form You can customize a Blueprint using the authoring capabilities of NaviPress.
You can add new pages, import existing assets, create links, or change what NaviServer provides by default. As an illustration, we show how to add a form to the Blueprint.
You create forms by using a fill-in-the-blanks interface, and then you customize them using NaviPress. They are immediately useful for data entry, update, and queries without any further modification. In our example we create a form for collecting customer comments.
1. Select General... from the Administration item of the Tools menu.
2. Select Create Table from the server administration page.
3. Complete the form shown in Figure 2, describing the table and its columns.
The table is called comments and it has fields for custname, address, e-mail, phone, fax, and comments.

March 1995 1995 Navisoft, An America Online Company WO 96130846 PCTlUS96101686 Rle Edit Elements Fonnat Tools Bmwse Help ..Locaifon: http://navisoft.com:8001/NSlGetNewTableForm Title: Ilew Table When finished, press the Creade TeiLl.e button to aeate the new table.
Table Naae: comments Table Description: Customer Feedback Forni Table is Searchable: r' Colta~ 1:
xamc: cust name, Type: tegt Description: Customer Name, not null: J unique: J indez: J
Coliam 2:
Name: Ie-mailÃ, Type: test Description: IElectronic Mail Addresss not null: J unique: J index: J
Colwm 3:
i ~
ilils,ls a rea0oWpage.

Figure 2. Form for collecting customers' feedback 4. The NaviServer checks the form for valid inputs, adds information to the server for processing the form when it is used, and automatically creates a default form, shown in Figure 3, for entering data and searching the contents.

= 1995 NaviSoft, March 1995 An America Online Company WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT/US96/01686 5. The default form generated by NaviServer is a page that can be modified using NaviPress. In our example, we modify the form as follows:

WIN
Fiie Edit E:tempttt-s Fnmiat Tools Browse Help -~~~
~;~+brt '~:Gp ~Fas~4; ;1~sc~ lSiilkfi' IYfYLiYt =`Qit1C ~+ti' ` ag :

Location: I:p: //navisoft . com: 8001 /NS/GetEntryForm/comments4'. V, Title: IÃEntry Form for Table: comments4 =
N
.Entry Enter Data for Table comments4 (Ctistomer Comment Form) When done filling in the fields below, press the "Enter" button to insert your data into the database.
(twtmner Nmne) e mail (B].ectr ic lfail Address) address (Mai7. address) 1?hone !
TMs'is,wread ottlypage. 11 Figure 3. Default form created by NaviServer for collecting customers' feedback March 1995 1995 Navisoft, An America Online Company WO 96130846 PCTlLTS96101686 File Edit Elements Format Tools Browse Help '~~ L'ocatr~: ft.com:8001ltest/supportlcoments4.htr~. ~
TitJe: Entry Form for Table: comments4 Caat(1:lI~r .LL~~ -14 t _{e Send Us Your Comments!

We want to hear from you. Please fiIl in your name, address, phone number, and comments, press Enter to send us your comments.

Gustamier Name e mail Address address J

Figure 4. Customized form for collecting customers' feedback a) Replace the title with Send Us Your Comments. Select the default title, press cut on the toolbar, enter a new title, select the text, and from the Format menu select Headings and Hdg 1(or use ctrl+l as a shortcut) to make it a level 1 heading.
b) Select the default instructions, press cut on the toolbar, and replace them with your own.

1995 NaviSoft, March 1995 An America Online Company c) Select trim text in front of the fields and make it more descriptive.
d) Cut the default artwork, and select Image... from the Elements menu to import your logo. Figure 4 shows the finished form.
Forms created with NaviPress work immediately. You can test a new form by entering data into the fields and pressing Enter Data. This adds the information to a database, and you can verify the insert by searching the database or pressing verify link in the message returned by Enter Data.

3.4. Adding the Form to the MiniWeb and Creating a Link There are several ways to add assets to a MiniWeb. You can use Import, Save As..., or Copy and Paste. In this part of the scenario we add the comment form to the MiniWeb and link it to a page in the customer support system.
1. Select Save As... from the File menu. Give the form a name, and save it into your local MiniWeb.
2. To create a link from the Help Desk page to the customer comment form, move the cursor over the icon for the form, and select Copy URL from the Edit menu. Open the Help Desk page by double-click or drag and drop, highlight the text of your anchor, and select Paste URL from the Edit menu.
This creates the link; you can use it immediately to make sure that it works.
3.5. Publishing to the Server Once you have made all the changes you want and are ready to publish the results, simply save the MiniWeb to the server. open, Save, and Save As... work the same either locally or remotely in NaviPress. You can browse the file system of the server just as you would your local disk, and save pages and whole MiniWebs with the push of a button.
1. Select Save As... from the File menu of the MiniWeb window.
2. Select the server from the dialog box shown in Figure 5. You can browse through your local file system by selecting the C: drive, or the file system of the server. Look for the right place by double-clicking on names in the directory box.
3. Once you have found the location and given the MiniWeb a name, press Save.
NaviPress collects all the assets in the MiniWeb, modifies the links so they will work correctly in the new location, and sends the collection to the NaviServer.
NaviServer checks access controls, indexes all pages, logs the event, and puts the pages in the right location in the file system.

March 1995 1995 Navisoft, An America Online Company MinfNeb Lacation:
http://navisoft.com:8001/I
Cancel Di'rectory: FUes:
http://navisoft J 9limpse filenames glimpse index NS ~ glitupse messages brochut'es J ~mpse~parfitions buY9ude glimpse statistics dave dork dtp Drives I Servers I WliniWebs:
http://navisoft.com:8001 Figure 5. Dialog box of directories and files on remote server 4. Overview of the Architecture 4.1. Client-Server Interaction NaviPress and NaviServer are a client-server application communicating through the hypertext transfer protocol (http). All requests and responses between the client and server are transferred through http. NaviPress sends requests to a NaviServer using GET, PUT, POST, BROWSE, and DELETE methods, and the NaviServer returns results using standard http return codes and special content types for NaviSoft-specific data. Because we adhere to http for all client-server interaction, both client and server are "open." Any http-compliant client can access most NaviServices, and NaviPress can be used with other http servers.

1995 NaviSoft, March 1995 An America Online Company Table 1. Examples of NaviServer operations GetSearchFormPicker Get list of links to a variety of search forms installed on the server. Examples include problem report forms, customer comments, permissions. GetSearchForm Get a specific search form for specifying search criteria.
SearchQue B Form Search via query by form.
GetLocalHilitedPage Get a local highiighted page, where highlights identify the terms in the page that met the selection criteria GetRemoteHilitedPage Get a remote highlighted page, where highlights identify the terms in the page that met the selection criteria.
MoreLikeThis Search via "more like this" (find similar documents by using terms in the target page).
NaviLink Generate anchor terms and phrases.
GetEntryForm Get form for database entry.
GetUpdateForm Get form for database update.
GetUpdateOrEntryForm Get update (existing data) or entry (new data) form as a ro riate.
GetMetaTables Get list of data entry tables.
Admin Administrative controls and views for access (permissions and costs), tables (view, add, drop), users and groups (view, add, assign), and usage (raw or by user).
About Get information about server (name, version, host, port, database, archiving, char in .
ArchiveVersions Archive a version of a page or document.
GetNewTableForm Get a new table form, for creating a new table.
CreateTable Create a table.
NaviPress requests services from the NaviServer through a method and an URL, some are ordinary URLs, and some are special URLs that map to server functions. If a request is not immediately serviceable-e.g., GET a page for browsing-the NaviServer checks to see if the URL contains a special prefix, a registered operation that maps to server-specific processing code. The NaviServer comes with about installed operations, listed in Table 1, that implement publishing, administration, information retrieval, and document management functions for our client and server.
These URLs take the general form /prefix/operation/arguments, where the arguments are an arbitrarily long string that is passed to the operation. The NaviServer looks for registered prefixes, determines that the operation is a special NaviService, and passes the request to the appropriate process. We designed the NaviServer so that custom services can be added easily; application developers can register new operations with their own unique prefixes.

March 1995 1995 Navisoft, An America Online Company WO 96/30846 PCTlUS96101686 Interface Display Internals Page Page Page Window View MiniWeb MiniWeb MiniWeb Window View Legend Other = zero to many relationship AL one to many relationship Assets Figure 6. NaviPress internal structures Since we use a standard, open protocol to communicate between client and server, it is possible for vendors of other desktop HTML authoring tools to write an interface that publishes to NaviServers.

4.2. NaviPress As shown in Figure 6, NaviPress operates on two primary objects: pages and MiniWebs. A MiniWeb is composed of zero or more pages and zero or more assets (e.g., images). For each internal representation of a MiniWeb, NaviPress displays one view in one MiniWeb window. You can, however, have many open MiniWebs at any given time. Each page has zero to many views displayed, and each page window has one or more views associated with it, as Figure 7 shows. Pages can be local, from the net, edited, only viewed, and a page may have more than one view.

Page Window New Page 1 httpJ/hostcom New Page 2 C:Uocal.htm httpJ/host.com Page Views Figure 7. Relationship between the page window and page views 1995 NaviSoft, March 1995 An America Online Company WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT/US96/01686 Platform Independent UI
Display Browse 11 Author MiniWeb File Server Communications layer Figure 8. Functional components of NaviPress Figure 8 shows the functional components of NaviPress. A brief description of each component follows:
= The interface layer of the architecture is a platform-independent user interface, built using a library of widgets-buttons, scroll bars, and dialogs-implemented on a portability layer that provides cross-platform compatibility between Macintosh, Motif, and Windows. The interface sees user events and executes appropriate functions.
= The display service renders page and MiniWeb views. It interacts with the browse, author, and MiniWeb services.
= Browse implements standard browser functions.
= Author is the HTML editing engine. Authoring manipulates the internal page structure.
= The MiniWeb service implements all MiniWeb functions. It interacts with the display, author, and file services.
= File is responsible for operations on files (Open, Save, Save As..., Import, etc.), and along with server and browse services, sends messages to the communications layer.
= Server handles any special processing required to request or process results of NaviServices.
= The communications layer asynchronously handles events that require client-server interaction. It is capable of managing multiple, simultaneous requests and responses.

4.3. NaviServer The architecture of the NaviServer (Figure 9) consists of communications, run, operations, library, and component layers.
The Communications Layer is an asynchronous http server that creates, continues, runs, and disposes of connections. When the server accepts a TCP connection, it March 1995 1995 Navisoft, An America Online Company Communications Creates, continues, disposes of, and runs NS_Connections Layer . M ..^ .'4==xve... ~ o=.'=v=t?=r.=.^.,.:.aeomc:caurscccc .... .::s-xM.=-=-, Run Layer Determines operation to run Checks permissions: allowed, forbidden, unauthorized Do Operation Fork Operation unknown registered default cgi registered Log event Library Layer NS Other Default Tci GetSearchFomi User defined ops GET Admin GetEntryForm PUT CreateTable DELETE
BROWSE
POST

Operation Layer Tcl commands and procedures db library comm library html library nlp library utilties OpenDB Retum functions Create htmi Stemming Memory mgt CloseDB non-blocking I/O Merge DB w/page POS tagging Forms mgt . = . . .
~ .~a,:.aa: .~.xa4t:.=?r,,.' ...N;ra.s~.+zr.,:c' -.;as.. '-~r:r.y,:t~=-& .,:
!w-~.:: - *.-4. >-~".
Component Layer = DBMS IR engine NLP technology Tcl Figure 9. NaviServer architecture creates a connection structure (NS_Connection), with UO buffers, and maintains the connection's state. Multiple connections can exist, and clients can read from and write to them without blocking. Once a connection is accepted and the NS_Connection established, the server reads the http request, header first and then the body. Once it has read the request and the socket is ready for writing, the Communications Layer runs the connection.
The interface from the Communications Layer to the Run Layer is an NS_Connection structure. The Run Layer:
= Determines what operations to run. Categories are:
- unknown, which produces an error;
- a NaviSoft-registered operation that comes installed with our server;
- other, new operations registered by developers; or - default, a standard http operation such as GET or PUT.

1995 NaviSoft, March 1995 An America Online Company = Checks permissions stored in the database to see if the user is authorized to run the request. Operations can be:
- allowed;

- forbidden, an operation that cannot be executed; or - unauthorized, where is operation is allowable but the user is not authorized.

= Executes the operation, either directly or, optionally, asynchronously in a child process. Examples of asynchronous operations include:
- GetRemotePage;
- IndexRemotePage; and - CGIs.
The Operations Layer contains all NaviServices. There are four types of operations:
= NaviSoft operations include those listed in Table 1, among others. They make up the bulk of the NaviServer's information management services.
= Default operations operate directly on the file system and do not require access to the component layer. These include standard http requests to GET, PUT, POST, DELETE, and our new method BROWSE. These affect the file system and have been extended to operate on MiniWebs as well as single pages.
= Tcl operations are functions written in the Tcl scripting language4 instead of C.
Many of our administrative functions are Tcl procedures (e.g., archiving and the ability to create and drop database tables). Tcl operations, written using a set of Tcl commands that are analogous to our C libraries, provide database, HTML, and file system utilities. Because Tcl is a popular scripting language, these operations are simpler and faster to implement. They can be added to the server at run-time without requiring compilation.
= Other operations are registered by our developers, with their own unique prefixes. A mechanism for extensibility, they let the developer identify new operations and add special code.
The Operations Layer is built on the Library Layer:
= The Tcl command layer provides Tcl procedures that mirror the underlying C
library. There are Tcl procedures for database access, NS commands such as logging and registering new operations, and functions to return HTML. This layer provides access to C libraries through Tcl, so Tcl developers have a 4 J. K. Ousterhout, Tcl and the Tk Toolkit, Addison-Wesley, 1994.

March 1995 1995 Navisoft, An America Online Company WO 96/30846 PCTlUS96101686 powerful set of procedures to build upon. For example, there are Tcl procedures to open databases and execute SQL commands.
= The C library layer includes routines that:
- provide vendor-independent access to DBMS and IR functions;
- provide continuations, non-blocking reads and writes, and return functions;
- help create and manipulate HTML structures;
- manage NaviLinks; and - manage memory and forms, etc.
The Library Layer sits on the Component Layer, which has a database management system, information retrieval engine, natural language processing, and Tcl.
= Developers can extend the server using the DBMS directly through alerts, gateways, DBMS development, report writers, etc.
= They can write and register new operations by developing on the Library layer with Tcl scripts or C subprograms, or they can write CGIs.

5. Enhancing and Measuring Performance 5.1. Enhancements We have implemented performance enhancing strategies on both the client and the server. On the client the features include:
= Asynchronous communications allow multiple tasks to proceed concurrently..
= Local caching of images, pages, and authorization data enables rapid access to recently-used data.
Performance features of the server include:
= Asynchronous communications continue to accept requests as long as the server is able to process them independently. The server can work on numerous requests at any given moment.

1995 NaviSoft, March 1995 An America Online Company = Caching of frequently used information reduces the need to go to disk or the DBMS for information.
= Deferred chores defer write operations to times when the server is idle. If the buffer for deferred operations fills, the server blocks until pending writes are flushed.
= Operations that take a long or unpredictable amount of time are forked and run in an independent process. Examples include indexing remote pages.

5.2. Measurements of Performance We have measured the performance of our server in handling simple page requests, and we have compared NaviServer on Unix, Windows NT, and Solaris Intel to other servers-Netsite, CERN, and EMWAC (European Microsoft Windows NT Academic Centre). Because simple page requests are the only function that other servers implement, we could not compare performance on publishing, NaviLinking, forms generation, etc. We did compare the performance of database select operations by using the CGI for Netsite.
The first set of tests measured the servers' ability to handle simple page requests from multiple clients. Five clients simultaneously fired requests for pages at the server; each trying to sustain ten simultaneous active connections. We varied the page size in the test: small pages (1.5 Kbytes), large pages (60 Kbytes), and mixed pages (three clients requesting small pages, two requesting large pages). We ran the tests on a local network, with no other traffic, in the following configurations:
= NaviServer, Unix operating system, on a Hewlett-Packard 715/80 with 64 Mbytes memory;
= Netsite, Unix operating system, on the same H-P 715/80 as above;
= CERN http daemon, Unix operating system, on a Sun Sparc 10 with 64 Mbytes memory;
= NaviServer, Solaris Intel operating system, on a laptop 486DX50 with 32 Mbytes memory and a Xircom Pocket adapter interface;
= NaviServer, Windows NT operating system, on an Inte1486 machine with 40 Mbytes memory;
= EMWAC http daemon, Windows NT operating system, on the same 486 machine as above.
Four clients were Sun Sparc5; one was a Sparc20. Table 2 shows the results.

March 1995 1995 Navisoft, An America Online Company Table 2. Performance statistics-connections per second for servicing page requests Server small pages mixed pages large pages NaviServer (Unix, H-P 715/80) 57.4 47.2 13.3 Netsite (Unix, H-P 715/80) 61.1 39.4 - 13.7 CERN (Unix, Sun Sparcl0) 6.5 5.9 5.5 NaviServer (Solaris Intel) 21.3 5.0 1.7 NaviServer (Windows NT, 486) 62.2 44.9 12.9 (dropped connections) (48.1) (28.4) (1.1) EMWAC (Windows NT, 486) 22.4 18.2 11.7 (dropped connections) (108.2) (87.2) (14.7) small: 1.5k page, 5 clients, with 10 connections in each queue mixed: 1.5k page, 3 clients with 10 connections in each queue + 60k page, 2 clients, with connections in each queue large: 60k page, 5 clients, with 10 connections in each queue We configured the Netsite server to run with 16 processes and to resolve IP
addresses to host names. Netsite offers these as configuration options, but give imprecise guidance about how the values affect performance. In our tests, resolving IP
addresses to host should not affect performance, because the hosts did not vary and the names were probably cached. The NaviServer always resolves host names, without hindering performance, because name lookup for logging is deferred to the background chores process. Figure 10 shows that selecting 16 processes is near the optimum configuration for Netsite on our test machine. It is difficult to select the optimal configuration without a load model and rigorous testing.
The NaviServer's performance under Unix compares well with Netsite's.
NaviServer is notably faster, 17%, when the page sizes are mixed. For large pages the performances of all configurations except the CERN http daemon and the Solaris Intel are close. The CERN server is slow for all page sizes, and the Xircom adapter on the Solaris Intel is slow in transferring large pages. NaviServer on Windows NT, on an ordinary 486 machine, services requests more quickly than either NaviServer on Unix or Netsite (which is not available yet for Windows NT). However, Windows NT
drops connections, whatever the server. Finally, NaviServer running on a laptop machine provides adequate performance for applications whose page sizes are small.
Usually the operating system is the limiting factor in performance for simple requests.
Figure 10 shows how the performance of Netsite varies with the number of processes running. It shows that the kernel of the Unix operating system on the H-P
715/80 can accept no more than about 80 connections per second. As we increase the number of 1995 NaviSoft, March 1995 An America Online Company ti ou 20 0 , processes Figure 10. Variability of Netsite connections with number of processes running processes running beyond 20, performance degrades; when we tried to implement processes, the machine ran out of process space and we could not even run a process to kill the Netsite service.
Without modifying the operating system itself, we cannot improve performance beyond this limitation. The main bottleneck to handling simple requests is the kernel of the operating system and its ability to accept TCP connections and read requests.
Hence the primary target for future optimization is the way http uses TCP, and to modify or make enhancements to the kernel of the operating system.
The second performance test used a simple database query: examine the list of permission codes for a page (select * from ns_permissions). On the NaviServer this is a straightforward search query. For Netsite we wrote the same query as a common gateway interface (CGI). We conducted two tests. Table 3 summarizes the results. In test DB 1 five clients each kept a queue of ten requests (queries), and the server answered these as quickly as it could. In a simpler test, DB2, there was only one client, which held just one query in its queue. _ Table 3 illustrates the power of the NaviServer DBMS interface, whether it is running under Unix on a powerful workstation, under Windows NT on a 486-based machine, or on a laptop. Under Unix, it services the simple database query 4 times faster than Netsite, and neither drops connections nor fails to service the queries when there are multiple queries in the queue. Windows NT is also very fast, but it drops connections March 1995 1995 Navisoft, An America Online Company WO 96/30846 PCTlUS96101686 Table 3. Performance statistics-connections per second for a simple database query NaviServer Netsite NaviServer NaviServe (Unix, H-P (Unix, H-P 715/80) (Windows NT, 486) (Solaris test 715/80) (failures) dro s dro s Intel) DB1 6.5 1.6 (3.3) (24.9) 6.8 (60.4) 3.1 DB2 4.7 1.0 3.2 DB1: 5 clients, 10 connections in each queue, select * from ns_permissions DB2: 1 client, 1 connection in queue, select * from ns_permissions .
when the queue has multiple requests. Finally, NaviServer on a laptop under Solaris Intel is about twice as fast as Netsite on a Unix workstation.

6. Conclusion NaviPress and NaviServer together have the following unique features:
= The MiniWeb unifies pages into a collection and provides a graphical representation for visualization, organization, and manipulation. The user can copy a set of pages to another client or server and preserve all links.
= An integrated browsing and authoring tool provides client-server hypertext publishing on the Internet. NaviPress makes editing and browsing functionally and visually equivalent, and provides seamless access to local and remote file systems.
= NaviServer incorporates a database management system. With NaviPress, you can automatically create forms for collecting information from users that the NaviServer can then process with a powerful DBMS. Forms are immediately useful without any additional intervention or development by the user.
= NaviLinks let you automatically create links between related pages. Natural language processing and statistical algorithms generate anchor terms and phrases in a selected page. Then for each anchor the NaviServer identifies candidate related pages, and you can accept or reject each suggested link.
= Finally, the content creator and provider can extend the NaviServer's functions through interfaces in three different layers for the applications programmer:
the = Operations Layer, the Library Layer, and the Component Layer.

1995 NaviSoft, March 1995 An America Online Company WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT1US96/01686 7. About the Team Linda Dozier is Vice President and Chief Technologist for NaviSoft. She has been with NaviSoft since David Cole, now President of America Online's Internet Service Company, founded it in 1993. NaviSoft focuses on network publishing tools and especially on publishing for the World-Wide Web. The core engineering team for NaviPress and NaviServer consists of George Williams, Dave Long, and Dave Bourgeois on client development, Karen Brady on interface design, and Doug McKee and Jim Davidson on server development.

March 1995 1995 Navisoft, An America Online Company WO 96/30846 PCTlITS96101686 Table Of Contents Preface P-1 P.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . P-1 P.2 Audience ........................................ P-1 P.3 Legend .......................................... P-2 CHAPTER 1 Introduction 1-1 1.1 About the Product . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . 1-1 1.2 Documentation Structure . . . . . . . . . . . . . . . . . . . . . . . . .
. . 1-2 CHAPTER 2 Browsing 2-1 2.1 Introduction ...................................... 2-1 2.2 Starting NaviPress . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . 2-1 2.3 Page Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 2-1 2.3.1 Browsing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3.2 Extras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . 2-3 2.3.2.1 Reloading Page . . . . . . . . . . . . . . . . . . . . 2-3 2.3.2.2 Hot List . . . . . . . . . . . . . . . . . . . . . . . . . . 2-3 2.4 Exiting NaviPress . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . 2-4 CHAPTER 3 Authoring 3-1 3.1 Introduction ...................................... 3-1 3.2 Creating a Web Page . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 3-1 3.2.1 Titling Your Page . . . . . . . . . . . . . . . . . . . . . . . . . . 3-3.3 Simple Editing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . 3-2 3.3.1 Formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 3-2 3.3.1.1 Special Styles . . . . . . . . . . . . . . . . . . . . . 3-3 3.3.1.2 Headings . . . . . . . . . . . . . . . . . . . . . . . . . 3-3 3.3.1.3 Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-3 3.3.1.4 Format Borders . . . . . . . . . . . . . . . . . . . . 3-4 3.4 Importing Graphics . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 3-4 3.5 Adding to the Page . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 3-5 3.5.1 Copying Text from Other Pages . . . . . . . . . . . . . . 3-6 3.5.2 Creating Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-3.5.3 Creating Anchors . . . . . . . . . . . . . . . . . . . . . . . . . . 3-7 3.5.4 Image Maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-3.5.5 Copying URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3-9 NaviPress and NaviServer 52 Page i WO 96130846 PCTlUS96l01686 Table Of Contents 3.6 Style Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 3-9 3.7 An Example Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . 340 3.8 Publishing Your Page . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . 3=-10 CHAPTER 4 MiniWebs 4-1 4.1 Introduction ...................................... 4-1 4.1.1 Terminology . . . . . . . . . . : . . . . . . . . . . . . . . . . . . .

4.1.2 MiniWeb Icons . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-4.2 Tutorial ......................................... 4-3 4.2.1 Copying the MiniWeb . . . . . . . . . . . . . . . . . . . . . . 4-3 4.2.2 Adding Your Page . . . . . . . . . . . . . . . . . . . . . . . . . 4-4 4.2.2.1 Fixing the Images . . . . . . . . . . . . . . . . . . 4-4 4.2.2.2 Fixing the Page Links . . . . . . . . . . . . . . . . 4-5 4.2.2.3 Linking to the Home Page . . . . . . . . . . . 4-5 4.2.3 Merging MiniWebs . . . . . . . . . . . . . . . . . . . . . . . . 4-5 4.3 Feature Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 4-6 4.3.1 Color Coding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-4.3.1.1 Icon Color . . . . . . . . . . . . . . . . . . . . . . . . 4-6 4.3.1.2 Link Color . . . . . . . . . . . . . . . . . . . . . . . . 4-6 4.3.2 Double Clicking on Icons . . . . . . . . . . . . . . . . . . . =4-7 4.3.3 Drag and Drop Features . . . . . . . . . . . . . . . . . . . . . =4-7 4.3.4 Filling in Relative Links . . . . . . . . . . . . . . . . . . . . =4-7 4.4 Editing With MiniWebs . . . . . . . . . . . . . . . . . . . . . . . . . .
. . 4-8 4.4.1 Copying URLs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-8 4.4.2 Deleting Icons . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4-4.4.3 Saving .. .... .. ... ...... ...... ....... . .. . 4-8 4.4.4 Setting the Home Page . . . . . . . . . . . . . . . . . . . . . . 4-8 4.4.5 MiniWeb Button . . . . . . . . . . . . . . . . . . . . . . . . . . 4-8 CHAPTER 5 The NaviServer 5-1 5.1 Introduction ...................................... 5-1 5.2 Quick Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . 5-1 5.2.1 Conunand-line Options . . . . . . . . . . . . . . . . . . . . . 5-2 5.2.2 rc.local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . 5-2 5.3 Searching the NaviServer . . . . . . . . . . . . . . . . . . . . . . . . .
. . 5-3 5.3.1 Searching Database Tables . . . . . . . . . . . . . . . . . . 5-3 5.3.1.1 The Body of the Search Form ......... 5-3 5.3.1.2 More on the Search Form . . . . . . . . . . . . 5-4 Page ii 53 NaviPress and NaviServer Table Of Contents 5.3.2 Searching for Pages . . . . . . . . . . . . . . . . . . . . . . . . 5-4 5.3.2.1 Searching the ns_default_collection .... 5-4 5.3.2.2 Searching Medadata Tables . . . . . . . . . . 5-4 5.3.3 Hitlists and Hittables . . . . . . . . . . . . . . . . . . . . . . . 5-4 5.3.4 Highlighting and More Like This . . . . . . . . . . . . . 5-5 5.3.4.1 Highlighting . . . . . . . . . . . . . . . . . . . . . . 5-5 5.3.4.2 More Like This . . . . . . . . . . . . . . . . . . . . 5-5 5.4 Entering Data and Updating It . . . . . . . . . . . . . . . . . . . . . .
. 5-5 5.4.1 Typechecking ............................. 5-5 5.4.2 Dates and Times . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-5.5 Creating and Deleting Tables . . . . . . . . . . . . . . . . . . . . . . .
. 5-6 5.6 Customizing NaviServer Forms . . . . . . . . . . . . . . . . . . . . . . 5-5.7 Examples: Building a Database Application . . . . . . . . . . . . 5-9 5.7.1 Creating a table for Problem Reports ........... 5-9 5.7.2 Customizing Form Appearance . . . . . . . . . . . . . . 5-10 5.7.3 Pointing to Forms . . . . . . . . . . . . . . . . . . . . . . . . . 5-11 5.8 NaviLinking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . 5-11 5.9 Security ........................................ 5-11 5.9.1 Users and Groups . . . . . . . . . . . . . . . . . . . . . . . . . 5-11 5.9.2 Protecting URLs . . . . . . . . . . . . . . . . . . . . . . . . . . 5-12 5.9.3 Using NaviPress to Set Permission . . . . . . . . . . . 5-13 5.10 Costs .......................................... 5-13 5.10.1 Setting up costs . . . . . . . . . . . . . . . . . . . . . . . . . . 5-5.10.2 Viewing charges . . . . . . . . . . . . . . . . . . . . . . . . . . 5-5.10.3 Using NaviPress to Set Costs . . . . . . . . . . . . . . . . 5-14 5.11 Example: Managing Documents . . . . . . . . . . . . . . . . . . . . . 5-5.11.1 Searching through publications .. . . . . . . . . . . . . . 5-14 5.11.2 NaviLinking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5-5.11.3 Publish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 5-15 5.11.4 Setting Permissions and Costs . . . . . . . . . . . . . . . 5-15 5.12 Describing Pages . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . 5-15 5.13 Archive Versioning . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . 5-16 5.14 Logging ........................................ 5-16 5.14.1 Access log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5.14.2 Errorlog ................................ 5-16 5.15 NaviServer System Tables . . . . . . . . . . . . . . . . . . . . . . . .
. 5-17 NaviPress and NaviServer 54 Page iii WO 96/30846 PCTlUS96101686 Table Of Contents APPENDIX A Page Window, Menus, and Icons A-1 A. 1 NaviPress Page Window . . . . . . . . . . . . . . . . . . . . . . . . . .

A.1.1 Toolbar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . A-2 A. 1.2 Overview of Menus . . . . . . . . . . . . . . . . . . . . . . . . A-3 A.2 The File Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . A-4 A.2.1 New MiniWeb . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-4 A.2.2 New Page ................................ A-4 A.2.3 Open .................................... A-4 A.2.4 Close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . A-4 A.2.5 Save ....................................A-4 A.2.6 Save As ................................. A-4 A.2.7 Import ................................... A-4 A.2.8 Print Setup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-5 A.2.9 Print ....................................A-5 A.2.10 Exit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . A-5 A.3 The Edit Menu .................................. A-5 A.3.1 Undo .................................... A-5 A.3.2 Redo .................................... A-5 A.3.3 Cut ......... ............................ A-5 A.3.4 Copy .................................... A-5 A.3.5 Paste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . A-5 A.3.6 Clear .................................... A-5 A.3.7 Select All . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-6 A.3.8 Copy URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-A.3.9 Paste URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

A.3.10 Find / Replace . . . . . . . . . . . . . . . . . . . . . . . . . . . .

A.3.11 Find Next . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-6 A.4 The Insert Menu ................................. A-6 A.4.1 Get Attributes ... . . . . . . . . . . . . . . . . . . . . . . . . . . .

A.4.2 Horizontal Rule . . . . . . . . . . . . . . . . . . . . . . . . . . . A-A.4.3 Forced Line Break . . . . . . . . . . . . . . . . . . . . . . . . . A-6 A.4.4 Image ................................... A-6 A.4.5 Image Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

A.4.6 Link .................................... A-7 A.4.7 Anchor .................................. A-7 A.5 The Format Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . A-7 A.5.1 Remove Format . . . . . . . . . . . . . . . . . . . . . . . . . . . A-7 Page iv 55 NaviPress and NaviServer Table Of Contents A.5.2 Special Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-7 A.5.3 Heading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-8 A.5.4 Paragraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-8 A.5.5 List ..................................... A-9 A.5.6 Form .................................... A-9 A.5.7 Style Sheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-9 A.6 The Tools Menu ................................. A-9 A.6.1 Show HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-9 A.6.2 NaviLinks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-9 A.6.3 Check Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-A.6.4 Describe Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-A.6.5 Search Server ............................A-10 A.6.6 Server Administration . . . . . . . . . . . . . . . . . . . . . A-10 A.6.7 General (Preferences) . . . . . . . . . . . . . . . . . . . . . . A-10 A.6.8 Extensions/MIME (Preferences) . . . . . . . . . . . . . A-10 A.6.9 MIMEfViewer (Preferences) . . . . . . . . . . . . . . . . A-11 A.6.10 Save As Filters (Preferences) . . . . . . . . . . . . . . . . A-11 A.6.11 MiniWeb Icons (Preferences) . . . . . . . . . . . . . . . A-11 A.6.12 NaviServer (Preferences) . . . . . . . . . . . . . . . . . . . A-11 A.6.13 Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . A-11 A.7 The Browse Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. A-11 A.7.1 Backward . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-A.7.2 Forward . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

A.7.3 Stop ...................................A-11 A.7.4 Reload Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A-A.7.5 Global History . . . . . . . . . . . . . . . . . . . . . . . . . . . A-A.7.6 Hot List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

A.7.7 Add to Hot List . . . . . . . . . . . . . . . . . . . . . . . . . . A-12 A.8 Window Menu ................................. A-12 A.9 Help Menu .................................... A-12 APPENDIX B MiniWeb Window, Menus, and Icons B-1 B.1 NaviPress MiniWeb Window . . . . . . . . . . . . . . . . . . . . . . B-1 B.1.1 Toolbar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . B-2 B.1.2 Overview of Menus . . . . . . . . . . . . . . . . . . . . . . . . B-3 B.2 The File Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . B-3 NaviPress and NaviServer 56 Page v Table Of Contents B.2.1 New MiniWeb . . . . . . . . . . . . . . . . . . . . . . . . . . . . B-3 B.2.2 New Page ................................ B-3 B.2.3 Open .................................... B-4 B.2.4 Close ................................... B-4 B.2.5 Save .................................... B-4 13.2.6 Save As ................................. B-4 B.2.7 Import ...................................B-4 B.2.8 Exit ..................................... B-4 B.3 The Edit Menu ..................................B-4 B.3.1 Cut .....................................B-5 B.3.2 Copy .................................... B-5 B.3.3 Paste .................................... B-5 B.3.4 C1ear .................................... B-5 B.3.5 Copy URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B-B.3.6 Paste URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

B.3.7 Set Stationary . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

B.4 The View Menu ................................. B-5 B.4.1 Clean Up ................................ B-5 B.4.2 Zoom In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. B-5 B.4.3 Zoom Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

B.5 The Tools Menu ................................. B-6 B.5.1 Describe MiniWeb . . . . . . . . . . . . . . . . . . . . . . . . . B-6 B.5.2 Search Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

B.5.3 Server Administration . . . . . . . . . . . . . . . . . . . . . . B-6 B.5.4 General (Preferences) . . . . . . . . . . . . . . . . . . . . . . . B-6 B.5.5 Extensions/MIME (Preferences) . . . . . . . . . . . . . . B-6 B.5.6 MIME/Viewer (Preferences) . . . . . . . . . . . . . . . . . B-7 B.5.7 Save As Filters (Preferences) . . . . . . . . . . . . . . . . . B-7 B.5.8 MiniWeb Icons (Preferences) . . . . . . . . . . . . . . . . B-7 B.5.9 NaviServer (Preferences) . . . . . . . . . . . . . . . . . . . . B-7 13.5.10 Delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . B-7 B.6 The Browse Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . B-7 B.6.1 Global History . . . . . . . . . . . . . . . . . . . . . . . . . . . . B-B.6.2 Hot List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. B-7 B.6.3 Add to Hot List . . . . . . . . . . . . . . . . . . . . . . . . . . . B-B.7 Window Menu .................................. B-8 B.8 Help Menu ..................................... B-8 Page vi 57 NaviPress and NaviServer Table Of Contents APPENDIX C Installation C-1 C.1 NaviPress Installation . . . . . . . . . . . . . . . . . . . . . . . . . .
. . C- I
C.1.1 Macintosh Installation . . . . . . . . . . . . . . . . . . . . . . C-1 C.1.2 MS Windows Installation . . . . . . . . . . . . . . . . . . . C-1 C.1.3 Sun Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . C-C.2 Running NaviPress . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . C-2 C.2.1 Name Servers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . C-C.2.2 Proxy Servers . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

5.15.1 Copying Preferences . . . . . . . . . . . . . . . . . . . . . . . C-3 C.3 NaviServer Installation . . . . . . . . . . . . . . . . . . . . . . . . .
. . C-3 NaviPress and NaviServer 58 Page vii WO 96/30846 PCTlUS96101686 Table Of Contents Page viii 59 NaviPress and NaviServer WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 PCT[US96/01686 Preface P.1 Introduction NaviSofts' combination of NaviPress and NaviServer forms a client-server application development system. This unique integrated system provides a application platform for creating content, managing information and developing applications on the Web.
Our tools combine:
= Integrated WYSIWYG authoring and browsing of Web pages without typing HTML
tags or names of URLs = Seamless access to both local and remote Web pages, allowing remote authoring over the Internet = The "MiniWeb," to graphically visualize Webs and organize collections of pages ="NaviLinking" for easy translation of text into hypertext = An information architecture to keep track of assets that complements a hypertext-based navigation architecture = HTML as a general purpose forms-oriented interface to a DBMS that extends the reach of transaction processing applications to wide-area networks = Hierarchical access control, cost accounting, and version control of pages = Example "Blueprints" that function like Microsoft Wizards for the Web = Extensibility, to implement custom services P.2 Audience This manual assumes it's readers are familiar with the following:
= The World Wide Web in general.
= The basic concept of HyperText, and how it is used to navigate through information.
Preface 60 Page P-I

WO 96/30846 PCTlUS96/01686 Legend = Browsing the World Wide Web.
= The internet in general.
" = The use and management of your own computer system.

This manual does not provide detailed information on any of the above topics.
P.3 Legend The following text conventions are used throughout this manual:
= Text in bold will be used for menus, menu items, and buttons.
= Italics will be used for emphasis, filenames, and sometimes for the name of a featuire.
For example, you might see the Page Window referenced.
= Menu names and options will appear with arrows pointing from menu names to the option name within that menu. For example, the following would specify the Save option in the File menu: File->Save. This also applies to cascading menus. For example, the following specifies the Address option in the Paragraph submenu of the Format menu:
Format->Paragraph->Address.
= Example text will be shown in courier. For example, you might be asked to enter the following text:
http://navisoft.com Page P-2 61 Preface CHAPTER 1 Introduction 1.1 About the Product Fueled by the immerging software and services that surround the World Wide Web, the Internet has recently experienced an explosive growth. Most software recently released for use with the Internet is either a cruiseware, commerce servers, or stand-alone hypertext markup language (HTML) editors. Lacking is an integrated system for creating content, managing information and developing applications on the Web. Focusing on the problem of creating and maintain an all encompassing Web-application, NaviPress and NaviServer, a client-server application, fills this void. Our software is intended for companies and enterprising individuals who want to create and maintain innovative, operation Web applications. The "developer" that NaviPress and NaviServer help best is the infopreneur, enterprising individuals or companies who are moving advertising, marketing, support, and sales activities to the Web.

Today, developing an application that provides or collects information through the Web requires a variety of skills-knowledge of the hypertext transfer protocol (http), HTML, common gateway interface (CGI), Unix, and a programming in C or Perl.
Cruiseware provides access to the Web once someone has put up the pages, commerce servers assure a secure channel of communication between client an server, and a stand-alone HTML
editor produces a file of HTML output on the desktop. Despite all this software, the information provide still needs a programmer to put all the pieces together into an application.

Greatly simplifying development of applications for the Web, the integrated NaviPress and NaviServer is as easy to use as a wordprocessor. This network publishing and extensible information system provides an interactive environment for building applications with a point-and-click interface. An applications developer can easily create Introduction 62 Page 1-1 WO 96/30846 PCT(US96101686 Documentation Structure and post artistic Web presentations, manage the assets, and process the information.
NaviSoft is a new product category to the World Wide Web, one that focuses exclusively on making it easier to create and maintain Web applications.

1.2 Documentation Structure This manual will be set up like a tutorial. You should be able to follow along and do each example as they are explained. All examples and figures were done on a PC, and where differences apply to other platforms they will be mentioned. The following is a brief description of each chapter Chapter Title Description 1 Introduction Provides an overview of the products and the documentation.
2 Browsing A brief explanation of how to use NaviPress to browse the web.
3 Authoring An explanation of how to author and publish your own web page.
4 MiniWebs An overview of what MiniWebs are and how to use them.
NaviServer An explanation of the features of the NaviServer, with examples.
A Page Window A reference list of all the menus and icons in Menus and Icons the Page Window.
B MiniWeb Window A reference list of all the menus and icons in Menus and Icons the MiniWeb Window.
C Installation Steps necessary to install NaviPress and NaviServer Page 1-2 63 Introduction CHAPTER 2 Browsing 2.1 Introduction This chapter provides a brief description of using NaviPress as a browser to browse the World Wide Web. Since authoring new web pages and browsing the Web are completely interconnected with NaviPress, this is an important first step.

Before you begin, please make sure that NaviPress and NaviServer have been correctly installed on your system. Refer to accompanying installation guide for instructions.
2.2 Starting NaviPress Start up your copy of NaviPress. If you are using a PC or Macintosh, you will need to double click on the appropriate icon. If you are using a UNIX system, then type navipres at the prompt. This will bring up an empty web page in a Page Window, and a new MiniWeb, in a MiniWeb Window (the MiniWeb window will have the title MiniWeb at the top of the window). MiniWebs will be explained in greater detail in Chapter 4 "MiniWebs", and can be ignored for now.

2.3 Page Windows The empty web page is shown in a Page Window. This window is used for browsing the World Wide Web and looking at web pages (note that this window is also used for authoring and other functions of NaviPress which are covered in later chapters). =
Browsing 64 Page 2-1 WO 96/30846 PCT(US96/01686 Page Windows The following figure is an example of a Page Window with an empty web page in it:
" , . . ;.
=~ . . . . ..,:
1'.bn:tiirwl ~ 2' 7~~~j~.'j~~~y' L~catton: Ihttp llnavisoft comlpagel htm Title: Please title this page. (Page 1 in mwl ) ~
r. ,.

2.3.1 Browsing To use the Page Window as a browser, simply enter the URL (name of the web page) you wish to look at in the Location Box. For example, to look at NaviSoft's home page, enter the following in the Location Box, and hit return:
http://navisoft.com This Page Window should now show NaviSoft's home page. You may notice several thing while the page is loading.
~, ...,..:.~..
= The stop button is no longer grayed out (it has become active)= This button may be pressed when it appears like this to stop whatever function is being preformed.
= A constantly building web (an animation) appears on the top right corner of the window.
= The status bar at the bottom of the window shows a message relevant to the current state of the current action.
= You may see a question mark appear at the top of the page, soon to be replaced by the Navisoft logo. This question mark appears while an image is being loaded, and will be replaced by the image when it is fully loaded (if you do not notice the question mark, then that means your system is fast enough that you don't see it). If you have set your preferences (see the Appendix C "Installation") so that pictures are not loaded by default, then this question mark will always appear instead of the image. In this case, if you click the mouse on the question mark it will then replace it with the image.

Page 2-2 65 Browsing Page Windows To jump to a new page that is linked to text (text with links is shown in blue, italics, and underlined) simply click the mouse on the appropriate text. Single clicking on the text replaces the page in the current Page Window with the new web page. Double clicking creates a new Page Window showing the new web page.

For example, single click on the line in NaviSoft's Page that says What's New?. This replaces the current page with the What's New page. You should also notice, now, that the ~. ' Back Button is no longer grayed out. Go ahead and click this button to take you back to the home page. Once back in the home page, you should notice that the Forward Button is no longer grayed out. This button will take you to a web page you have just gone back from. These two buttons can be used to traverse all the web pages you have visited in this Page Window. The forward and backward functions are also available in the Browse menu.

You should notice that the What's New line is now green instead of blue, and the underline is now dashed. Green text means that the page that this link points to is cached (stored in local memory). This makes it much faster to use that link again, because the page no longer has to be fetched across the internet.

Now, click on the down arrow to the right of the Location box, you will get a list of all web pages that have been viewed in that Page Window. In this case there should be three items in the list; NaviSoft's page, the What's New page, and your original empty page.
Any page in this list may be viewed by selecting it from the list. A similar list of all the web pages viewed by any Page Window this session is available through the menu item Browse->Global History.

2.3.2 Extras Here are some extra browsing features that you may find useful.
2.3.2.1 Reloading Page If for some reason you need to reload the current page you are viewing in the Page Window (either because you think the original page has changed, or your copy has become corrupted) you may use the menu item Browse->Reload Page.

2.3.2.2 Hot List NaviPress also allows you to keep a Hot List from session to session. This is a list of web sites (URLs) that you think you might visit frequently, or that you just want to remember and have easy access to. For example, if you want to put the Navisoft home page in the Hot List, then go to that page in the Page Window (enter the URL in the Location Box, or if you have visited it already choose it from the list attached to the Location Box, see sections above for more information). Choose the menu item Browse->Add To Hot List.
The page is now added to the list. To see the list, choose the menu item Browse->Hot List. This will invoke the following window:

Browsing 66 Page 2-3 WO 96/30846 PCT(U896(01686 Exiting NaviPress Hot LisY. :.~ri..
Searchable Tables ~lote Customer Support Blueprint Jldd E abel :
-=Add Sc arator=
Nlauailp Mobe'Qa~- -Remave Cvp!! IIBL

Help-.
Double clicking on any entry in the list will bring up that page in the Page Window. The following are descriptions of the buttons in this window:
Fetch causes the selected page to be displayed in the Page Window.
Close closes the Hot List Window.
Add Label allows you to add a label above a selection in the list.
Add Separator adds a line across the list above the selected item.
Move Up moves the selection up the list.
Move Down moves the selection down the list.
Remove removes the selection from the list.
Copy URL copies the URL of the selection.
Help invokes the help window on the Hot List.

Note that this list is stored in your NaviPress preference file (navipres.pr.
Deleting this file will erase your list.

2.4 Exiting NaviPress To exit NaviPress, choose the menu item File->Exit. Every time NaviPress is started, a new MiniWeb directory is created (MW1, MW2, etc.).

If you have not saved anything into this directory, then you will be prompted with the Page 2-4 67 Browsing Exiting NaviPress following dialog when you exit:

~ . ~
0 c:The MiniWeb =Delete na~ripres%mw2 is empty.
%
Delete it?

Cancel You may delete this directory if you wish.

Browsing 68 Page 2-5 R'O 96/30846 PCTlUS96101686 Exiting NaviPress Page 2-6 69 Browsing CHAPTBR 3 Authoring 3.1 Introduction This chapter explains the basic techniques in creating your own web page. It assumes you are already familiar with browsing, and associated features (see Chapter 2 "Browsing").
NaviPress allows you to create web pages with the ease of a word processor.
Web pages are written in the language HTML, and are normally written with a simple text editor.
NaviPress allows you to see the web page you are creating as you are creating it.
NaviPress also allows networked authoring. This means that you can browse the web while creating a page, and import information over the web that you would like to incorporate into your page. You can also use links created in your page as soon as you create them. The page you are creating is a fully functional web page right from the start.
It is suggested that you save your file after ever step listed below.

3.2 Creating a Web Page Start up NaviPress. The Page Window comes up with a blank page in it. To create your own web page, you start by editing this blank page. First, save the page to a new name.
Choose the menu item File->Save. Since this is a new page that hasn't been saved yet, this invokes the following Save As dialog (if the page has been previously saved, then choosing File->Save will simply save the most recent version without invoking a dialog):
Authoring 70 Page 3-1 Simple Editing Page Location:
g~
C:SNAVIPRES{NAVIPRES.EXEW2J C~IICEi <
Direetoy Files:
62 t}~ mw1 mw10 mw11 mwl mw12 mwl 0 mw13 mw11 Fnw7 4 mw12 mw15 mwl 3 mw15 +
mwl A
mw1w15 m6 Drives J Servers j MiniWebs:
Ci Change the name of the file from pagel.htm to offices.htm, then click Save.
This saves your page under the new name. You may notice that your file is in a new MiniWeb directory (e.g. MWI ). A new MiniWeb directory is created every time you start NaviPress, and is the default starting directory for saving pages you author. The MiniWeb will be discussed in greater detail in Chapter 4 "MiniWebs".

3.2.1 Titling Your Page You now have a saved new page. This example will walk you through creating a page that can later be used as part of a customer support web site for you or your business. This page will contain a list of locations of your offices around the U.S. The first thing to do is to tit:le this page. In the Title Box, change the title to U.S. Sales Offices. As soon as the focus ~ leaves the Title Box, you should notice that the web icon to the left of the Location Box has now changed. This means that unsaved changes have been made to the page.
Saving the page will change this icon back.
u 3.3 Simple Editing This section will go through some simple editing features. L-i the main body of the Window Page, type the following text:
This is a test sentence.

This sentence can be edited with the mouse and edit keys as with most word processors.
Go ahead and make a few changes to this sentence to see how it works.

3.3.1 Formats Text may also be formatted with a number of formats available under the Format menu.
Page 3-2 71 Authoring Simple Editing 3.3.1.1 Special Styles Select the word test, then choose the menu item Format->Special Style->Bold.
This will change the word to be bold faced. If you look in the menu again, you should notice that the menu item Bold has a mark by it to indicate that it applies to the selected text. To remove the bold format, choose the same menu entry again.

The other styles in the Special Style menu can be used in the same way to format text. Go ahead and try out the different formats to see how they change the text.

3.3.1.2 Headings The Format->Headings menu allows you to turn text lines into preformatted headings.
There are six different heading types. Select the entire line of text you have typed in, then choose the menu item Format->Headings->Hdg 1. This will turn your line into a Heading 1 format. To remove the format, select the entire line of text, and then choose the menu item Format->Remove Heading Format.

The other heading formats can be used in the same way.
3.3.1.3 Lists This is another type of formatting that allows you to create one of three different types of lists.
Unnumbered lists are indented with bullets (dots) placed in front of them.
Type in several lines of sample text, select the text then choose the menu item Format->Lists->Unnumbererd List. This will turn your text into an unnumbered list. To remove the list format, select the text in the list and choose the menu item Format->Remove List Format.

Numbered lists are similar to unnumbered lists, except that sequential numbers are placed in front of the lines in the list.

Definition lists are used to pair off alternating lines. The entire list will be indented, with every other line being indented a little further. This list is used if you have a list of terms followed by a definition of each item. For example:
Alaska No offices in this state.
California Two offices in this state Utah No offices in this state.

In this next example, each state name would be a Term and each following line would be a Definition. A term line may be forced to a definition line by choosing the menu item Format->Lists->Definition, and vica versa. Authoring 72 Page 3-3 WO 96/30846 PCTlLTS96/01686 Importing Graphics 3.3.1.4 Format Borders Choosing the menu item Format->Show Border will show dotted lines across your page between each group of text with a Form or List format. These lines are only the borders and can not be edited in any way. Format->Hide Border will remove the borders.

When you are finished experimenting, delete any text and formats you have in the window before continuing.

3.4 Importing Graphics Graphics may easily be imported across the internet. Choose the menu item Elements->Image. The following dialog will be invoked:

Location' ~
Fl ~ancet Alignment 0 Top 0 Middle 0 Boftom Help If you know the URL for the graphic you wish to import you can just type in into the Location Box in this dialog. If you don't know the URL and the graphic is on a NaviServer, or is on your local file system, then you can use the Browse button to find it.
Click Browse. The following dialog will be invoked:

r Looation: ~
Direetory: Fites:

~
nwrl mw10 nnv11 mw12 mw13 nrw14 Ust File of Type:
mw15 mw16 + grf Drives I Servers! MiniWebs:
C~ t First you must choose a NaviServer to search on. You can either enter one in the Location Box at the top of the dialog, or you can choose one from the Drivers/Servers/MiniWebs list Page 3-4 73 Authoring Adding to the Page that appear when you click on the arrow to the right of the bottom of the box.
This is a list of all the NaviServers you have ever visited in any session. If you have already gone through the example in Chapter 2 "Browsing", then NaviSoft's NaviServer will be in the list. If not you will have to type it in. Type or choose:

http://navisoft.com/
The Location Box at the top of this dialog should now show:
http://navisoft.com/

This is the directory you are currently browsing. Below this is a list of directories (on the left) and a list of files in the current directory (on the right). Scroll down the Directory list until you see test, then double click on test. Scroll down the new directory list until you see support, then double click on it. The File list should now contain a bunch of.gif files.
Select custsupp.gif from the list and then click Insert. This will return you to the original image dialog. There are three radio buttons in this dialog, Top, Middle, and Bottom.
These allow you set which part of the graphic will be aligned with the text.
Select Top, then click OK.

3.5 Adding to the Page Below the image type the following (don't forget to hit RETURN after importing the picture):
Office Locations and then below that import the following two graphics in order:
http://navisoft.com/test/support/line.gif http://navisoft.com/test/support/surf.gif You are now going to change the surf image. Select the image (by dragging the mouse over it, exactly like selecting text, or by double clicking on it). Then choose the menu item Elements->Get Attribute. This will invoke the Image dialog with the image's URL
in the Location Box. This menu item is very useful. When ever Get Attribute is chosen, it will invoke the appropriate dialog for whatever the selection is, in this case an image.
Change the image name to:
http://navisoft.com/test/support/usmap.gif This should import the following image:

n Authoring 74 Page 3-5 WO 96/30846 PCTlUS96f01686 Adding to the Page } _,.,-:',~~+c.,~;.',~' &:: =[s~-' ~= ='"~~..~~' '= ~=~: =_:,Y ~,~'~~^:~.
y = . +~ ~:,'F. ^`~~', s. ~ . Y= +'G:a -` ~:=! Z.,.h~~ ' ' ,~.k;, __ ' .<e=~
~
~
`. . ...
~;x. i~ .. ::~~~= - :~: .
ti . . =-~f' .~~i Pf:;'!'..P, .:
~'= ~.:. ..~yõr t::.~j="'!= ~~;~t.+...
M~_ ~ff('' ~ 5 ~....Iv 'i`~_" k'õr.=
} 1' t ~~ jikY: ~~z~~r=' ~p:e~
:~i'..`=~~'+~~~~~u . ' s ~, y^= 5 1' ~Sky~t~~~R~',C"-., r,,~ ~
Y.., ,~ 3 ; ~~"~ ~ ::.:' ~y'`~~y,' ~.%''-Y~~-y.-,-s' =
'" ' s ua^-= ~ i 2 . ~ ~' r~t ~t~"~~-'~~r-~ ~~ h'+'9~. ~~' ~'~~~z~ x~,~ ~ - :
,~. .~, '". ~,, n_c..d~u=, ,. a. 3+~ . x: Q' -~=c~Lv=~.:>,. s~'' õ~'#.5.~' ,.'2' ...^o a r . .
c+ ~,~ w,^,~ . ~su. ~ r ~i " ~ r~,~.' ^'`tt~ ,~ t ~ ~ 3.r'~~` ~M~$ "r..+ m =~?--" .~'~;, 't K ?,~ T. .~ a~' , -. , ~.' `~y~s.~ s~ u-3~.~`~`` ~` ~ ~''~~=;' ~r y~"~, a. a ~..~=~~~'~~~~~ '¾~''~ >~
-+ ~~x"~~' "~~~C1 "ss. ~, ;
y!p .~ , :;=.'>4. nat~''' ~'= w.is_ t~.< 3 ~t_.
`. L.~: ~i?~i, .. . _ , . <,x.-e= Y. n . .. -~ia.ak~ . ..... .. . ..... . ...
.v. c' ',`~`,~1,t.4c~ce.cr.ixv~+Eer:9n+m :.x!,+. .. -s .. . ,'r. .
Below this image type the following:
Your Company's U.S. Sales Offices If you would like information about our products or services, see our online catalog, contact us through the help desk, or call the nearest regional sales office. Use the map to find the office closest to you or call: 1-800-555-5555.
International Sales Offices Then import another line graphic. Note that to get single spaces between lines, use SHIl7-RETURN.

Now select the line:
Your Company's U.S. Sales Offices and then choose the menu item Format->Heading->Hdg 2. You now have the beginnings of a usable web page.

3.5.1 Copying Text from Other Pages Now you will need to add a list of a1150 states to the bottom of your web page. Since you probably don't want to type out all fifty states, you will use a short cut.
This will show you how to use the browsing functions of NaviPress to help you create your own page.
Choose the menu item File->Open. This will open a file browsing dialog (similar to the Page 3-6 75 Authoring Adding to the Page image dialog). In the Location box at the top of this dialog, enter the following URL (or use the server and directory lists):
http://navisoft.com/test/support/statelist.htm This will invoke a Page Window showing a list of states (not quite all 50, but close enough for now). Select the entire list with the mouse (and easy way to do this is to position the cursor at the start of the list, and then SHIFT-click on the end of the list).

Next, click on the Copy icon.
".Y
Return to your web page, position the cursor at the end of the page, and click on the Paste icon. The fifty states should now appear at the bottom of your page.

3.5.2 Creating Links You will now create a hypertext link in your page. Select the following line of text near the top of your page:
International Sales Offices Now choose the menu item Elements->Link. This will invoke the following dialog:
LinkTo Page:
http:Jlnavisott com ' Cantxl International Sales Offices t-v 3elcd fln 81otNSD.
i p Append Anchor Name:

This allows you to enter an URL to link to the selected text. You can either enter the URL
in the Link To Page Box at the top of the dialog, or you can click Browse to invoke a Browse dialog which works just like the Browse Image dialog (see section 3.4 "Importing Graphics" on page 3-4). The Append Anchor Name Box at the bottom allows you to link to specific anchors within a page. Anchors will be discussed in the next section.

Enter the following URL and click OK:
http://navisoft.com/test/support/dist_lis.htm The text is now linked to this page. You can test this by clicking on the text and jumping to the new page.

3.5.3 Creating Anchors You will now create anchors in the text and then link the map of the U.S. to those anchors.
Authoring 76 Page 3-7 Adding to the Page We will use two states for an example. Select the text Kansas and then choose the menu item Elements->Anchor. This will invoke the Anchor dialog. This allows you to enter an anchor name for the selected text. An anchor name is just an arbitrary reference for that piece of text so you can later create a link to it. Enter Kansas as the anchor name (this makes it easy to remember, but it does not need to be the same as the selected text). You should notice that Kansas is now magenta. This means that it has an anchor associated with it. If you want to see the anchor associated with a piece of text, select the text and choose the menu item Elements->Anchor, or Elements->Get Attributes. Go ahead and do this with Kansas to see how it works. You can then either delete, change, or keep the anchor from this dialog.

Now create another anchor for Wyoming the same way you did for Kansas (except, of course, you should name it Wyoming instead of Kansas).

Make sure you save your page at this point.
35.4 Image Maps You will now create an image map from the U.S. map. An image map is a table that is assocaited with a graphic that has "hot spots", or areas that have links to either anchors or other pages. Select the U.S. map graphic at the top of your page. Then choose the menu item Elements->Image Map. This will invoke the following dialog:

,,. .:
Map Name: menu.nvm ~
Create Rectangle: Rectangle List:

~
11 ~
a.
Location:
Rectangle In Pixels Seledion Type:
LettTop: 75 41 O Rectangle RigM Bottom: 56 77 0 Default File Location On the left side of the dialog is a small box labeled Create Rectangle. This window has a scrollable copy of your image in it. To create a hot spot in the map, scroll to the region you want active, then use the mouse to drag out a rectangle. To do this, position the mouse over one corner of where you want the rectangle to be, and then press the mouse button. A
dragable rectangle will appear. Release the mouse button when you have dragged out the desired rectangle. For this example, scroll through the map until you can see the map of Kansas in the window, then drag out a rectangle trying to fill as much of Kansas as you can.

Page 3-8 77 Authoring Style Sheets The Location Box, under the Create Rectangle box, is where you enter the URL
you wish -to link this rectangle to. You can either enter the URL or click Browse to invoke a Browse dialog. Since you are going to create a link to an internal anchor, you do not need to enter the full URL for your page. Simply enter the filename followed by #Kansas. For example:
offices.htm#Kansas If you enter partial pathnames or just file names, they are taken to be relative to the current page. So this will link the rectangle to the anchor Kansas in your page.

Now click Add. This will add a description of the link to the Rectangle List Box to the right of your image in the dialog. Repeat the steps above to create a link to Wyoming.
You should now have two rectangles listed in the Rectangle List Box. Click OK.
You may want to save your page at this point.

You have now created links to the anchors in your page. To use the links, click on the appropriate part of the map (e.g. click on the map of Kansas to jump to the Kansas entry in your list).

3.5.5 Copying URLs This section explains how to easily copy the URL from an open web page. At the bottom the page you are creating, add the following text:
Copyright 1995, YourCompanyName, Inc.
You are now going to link this text to a page by first finding the page and looking at it, then copying the URL from that page. Choose the menu item File->Open, and open the following web page:
http://navisoft.com/test/support/copyrigh.htm You should now have two pages open, the page you are creating and the copyright page.
Go to the copyright page and select the menu item Edit->Copy URL. This is like a normal copy, except it copies the URL from the page.

Now return to your page and select the text you just typed in at the bottom.
Then choose the menu item Edit->Paste URL.

The text is now linked to the copyright page. Test the links by clicking on the linked text and following the link to the copyright page.

3.6 Style Sheets Style sheets allow you to change the way Headings, Paragraphs, and Lists that are =
displayed (all under the Format menu). A style sheet is linked to a specific page, and allows you to change the styles for this page. Note, however, that only NaviPress browsers will be see the new styles. All other browsers will ignore the style sheet, and use their own =
Authoring 78 Page 3-9 An Example Page default display settings.

Every copy of NaviPress has a default style sheet associated with it. Each user can also have their own personal style sheet that will only affect how they see the formats when using NaviPress.
Style sheets are created and edited using the menu item Format->Style Sheet.
3.7 An Example Page If you would like to see and example of a page similar to the one you have just created, browse the following page:
http://navisoft.com/test/support/whereis.htm 3.8 Publishing Your Page Once you have finished creating your web page and are happy with it, you can publish it to a server. Right now your page only exists on your local disk; although you can browse your web page, no one else can. To enable other people on the internet to look at your web page you will need to publish it to a server.

Choose the menu item File->Save As. You now need to choose a NaviServer to publish your page to (you must have write permission for the location you want to publish). If you have ever visited the NaviServer you are interested in, it will show up in the list at the bottom of the dialog. To see the list, click on the down arrow to the right of the box at the bottom of the dialog. If this is a NaviServer you haven't visited yet, then you will need to type in its URL in the Page Location Box at the top of the dialog. Note that this NaviServer may be any server on the internet that you have write permission to, although it is more common to publish to your own NaviServer.

Once you have chosen a NaviServer and filename, click Save. You have now published your page.

Page 3-10 79 Authoring CHAPTER4 MiniWebs This chapter is divided into three main parts. The first part is a brief introduction. The next part is a tutorial that takes you through examples of the important features of MiniWebs.
The last section gives an overview of the features of MiniWebs. This last section is useful as a reference and may be referred to during the tutorial for further explanation.

4.1 Introduction MiniWebs are a unique feature of NaviPress. In the simplistic view, a MiniWeb is a graphical representation (the MiniWeb Window) of a special directory containing web pages and other web related files. It is rare to want to author a single web page. More often you would create a web project, or a group of related web files. MiniWebs provide many useful features that greatly facilitate the authoring of web pages based projects.

You may have noticed by now that when authoring with NaviPress you are, by default, working within the context of a MiniWeb. When you start up NaviPress, an empty Page Window comes up, as well as a new MiniWeb window.

All of the files that are physically in the MiniWeb directory appear as icons in the MiniWeb Window. Also, all the files that these files have links to appear in the MiniWeb, even if they are not physically located in the MiniWeb directory.

Mini Webs 80 Page 4-1 WO 96/30846 PCTlUS96101686 Introduction The following is an example of a MiniWeb Window:

m~.i _ , ^ ^ ^ ^ .~r. vv->
-M,:qE

. ... .. . .: :. . . :.: .. . : ..: ,.:. .. . _ ~=1~ne p~gt:: IPAGE1.HTM

navihome.htm _ tbtech. ~f 9 navinew.htm f 4.1.1 Terminology The following terms are used throughout this chapter:
relative link This mean that the link is relative to the location of the page the linlc is in. For example, if the page http://garage.com/sofa/sofa has a rela-tive link to http://garage.comisofa/spam, then when this link is acti=-vated it will look for a file named spam in the same directory. So if you copy this page, but riot the file spam, then the link to spam will no longer work.
absolute link This means that the link is to an specific URL. For example, if the page http://garage.com/sofa/sofa has an absolute link to http://garage.com/sofalspam, then when this link is activated it will look for http://garage.com/sofa/spam regardless of where the original page is.
inlined This refers to a separate file that is incorporated into the middle of a web page. Currently, only graphics may be inlined. However, note that even though only graphic files can be inlined, not all graphics files have to be inlined.
ghost files These are files that are visually represented in the MiniWeb but aren't = physically in the web. Their icons are light gray in color, and can have either light gray text or green text underneath the icon.
home page The home page is shown in the Home Page Box at the top of the MiniWeb, and is considered to be the main page of the MiniWeb (usually the starting page).

Page 4-2 81 MiniWc:bs WO96/30846 CA 02216826 1997-09-29 pCTfUS96/01686 Tutorial 4.1.2 MiniWeb Icons The following is a list of the icons appearing in the MiniWeb:
= web pages wu~
= image files = image map files = sound files = video files = style sheet files = files of unknown type 4.2 Zltutorial This section takes you through actual examples of working with a MiniWeb.

In the previous chapter you learned how to author and publish a page. The page you made was part of a hypothetical customer support MiniWeb you were constructing.
This example will take you through the rest of the steps of creating the full blueprints for a customer support web. Blueprints are ready made web pages that you simply edit to fit your specific needs. This saves you the time of creating webs and pages from scratch.
4.2.1 Copying the MiniWeb The first step is to copy the main body of the customer support MiniWeb. Open the following MiniWeb:
http://navisoft.com/test/examplel MiniWebs 82 Page 4-3 Tutorial In the MiniWeb window, choose the menu item File->Save As. Enter the location you want to put the MiniWeb in the Location box, and click Save. This will create a new MiniWeb directory and copy all the files in the open MiniWeb into it. You now have your own copy of the customer support MiniWeb.

4.2.2 Adding Your Page You will want to add the office location page you authored in the previous examples to the support MiniWeb. Open your page, offices.htm, so that you now have your page loaded in a Page Window, and your version of the customer support MiniWeb open in a MiniWeb window.

In the Page Window, choose the menu item Edit->Copy URL of Page. Then go to the MiniWeb window and choose the menu item Edit->Paste URL. The following dialog box will be invoked:

Fte Format ~
Save P'ictures O None emat ~
Q Relative ~
D AII

^ Relative Links to Full URL

Make sure that Relative is selected from the Save Pictures options, and then click OK.
This will copy your file into the MiniWeb, as well as all the inlined images in it. You should see an icon representing your file appear.

You will notice that your icon now points to several other icons. Most of these icons will be ghost icons (see section 4.1.1 "Terminology" on page 4-2), except for the image maps, which will be solid. This is because the links you created in your page point to the original MiniWeb, and not the copied version you are working with now. It is necessary to fix these links (a bit of a task).

4.2.2.1 Fixing the Images First, go through and select all of your images, and then choose the menu item Elements->Image. You can then edit the URL for the images. Since all the file names will be the same, all you need to do is the delete the first part of the URL to make it a local reference. This will point it at the local copy. Note that when you do this you will lose your image map. The image map will still be there, but since you changed the image, the link to the map is lost. This is easily fixed.

Page 4-4 83 MiniWebs Tutorial Select the map of the states and choose the menu item Elements->Image Map. A
dialog will be invoked asking you want to read in the existing file. Click Yes. This will load your image map. Simply click OK in the image map dialog, and it is reconnected.

4.2.2.2 Fixing the Page Links Next you need to fix all the links to the pages in the MiniWeb. Go through your page and select all of your linked text (holding down CONTROL allows you to click on linked text without jumping to the link, which is useful for selecting linked text), then choose the Elements->Link menu. You may find it helpful to click Select Only in this dialog. This button will make it so that only the exact text with the link is selected, which can sometimes help you avoid problems.
Change the URLs in this dialog just like you did for the images. Delete the first part of the name, so only the filename remains, making the links relative to the local copies.

4.2.2.3 Linking to the Home Page The final step is to link your page into the home page of the MiniWeb, support.htm. Find the icon for support.htm in the MiniWeb and double click on it. You should see some linked text in the middle, one line of which reads:
Office Locations This text currently links to the page whereis.htm, the prototype for the page you created.
Change this link to point to your page, offzces.htm.

You have now fully integrated your page into the MiniWeb. You can now delete the page whereis.htm. To delete it, select the icon, and either press Delete, BackSpace, or choose the menu item Edit->Cut.

4.2.3 Merging MiniWebs Your support MiniWeb is still not quite complete. There is another MiniWeb that contains a few pages that you will need. You will now open this MiniWeb and merge it into your main support web. Choose the menu item File->Open, and open the following MiniWeb:
http://navisoft.com/test/example2 This MiniWeb contains three actual pages, and the rest of the icons are ghosts. These ghosts are relative links to pages that don't exist in this MiniWeb yet, but do exist in the support MiniWeb that you copied over previously. These ghosts will be updated to point to correct files automatically when you copy the solid icons over.

Drag and drop the icon forum.htm from the new MiniWeb to your support MiniWeb, this will copy the file into the support MiniWeb. All the links should now go to the correct files, except that you will now have two new ghost images in your support web.
These are from the other two files in the new MiniWeb that forum.htm linked to. Since these are relative links, dragging and dropping the other two files into the support MiniWeb should MiniWebs 84 Page 4-5 WO 96/30846 PCTlUS96101686 Feature Overview fill in these ghost icons. So, now repeat the process for the other two files, news.htm and mail.htm. All of the links coming off forum.htm should now be to solid icons.

The last step is to add a link from the support web's home page toforum.htm.
Open support.htm. In the middle of the page is a list of linked text. In the middle of this list is an unlinked line:
Discussion Groups and FAQs Link this line to forum.htm, using the Elements->Link menu item. You have now completely merged the new MiniWeb into your main support web.

Don't forget to save your changes.
4.3 Feature Overview This sections gives an overview of MiniWeb features.

Arrows between icons represent links between the files. Icons can be dragged and dropped into other MiniWeb Windows and into Page Windows.

Links in a Page Window can be dragged and dropped into MiniWeb windows.
Single clicking on an icon will select that icon.

4.3.1 Color Coding MiniWebs are color coded to show the status and relationships of the files in the MiniWeb.
The following are lists of the colors and their meanings.

4.3.1.1 Icon Color Solid The file is physically located in the MiniWeb.
Dithered The file is a relative link, but is not physically located in the Mini-Web.
Green text The file is an absolute link and is not physically located in the Mini-Web.
Broken The file is physically located in the MiniWeb but has unsaved changes.

4.3.1.2 Link Color Blue arrow Link to an inlined image.
Green arrow Link from a form to where that form will be submitted.
Cyan arrow Both files are linked to each other.
Gray dotted A link that doesn't actually appear in the page when it is displayed.
Black arrow All other links.

Page 4-6 85 MiniWebs WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 PCTlUS96/01686 Feature Overview 43.2 Double Clicking on Icons Double clicking on an icon will attempt to preform the appropriate action. The following is brief explanation for the effects of double clicking on various icons:
Page If the page exists in the MiniWeb, or is an absolute link, it will be opened in a new Page Window. If the page is a relative link and doesn't exist in the MiniWeb (light icon) then you will asked if you want to create it.
Video An attempt will be made to launch an external viewer. If no viewer is available, you will asked if you want to save the file.
Sound An attempt will be made to launch an external player. If no player is available, you will be asked if you want to save the file.
Graphic An attempt will be made to launch an external viewer. If no viewer is available, and the image is either a GIF, JPEG, or XBM, then a new page will be opened containing just the image. Otherwise you will be asked if you want to save the file.
Image Map The Image Map dialog is invoked.
4.3.3 Drag and Drop Features The MiniWeb allows you a range of features based on the drag and drop principle.
Dragging and dropping icons from one MiniWeb into another, copies that file into the second MiniWeb.

Dragging and dropping icons from a MiniWeb into a Page Window is equivalent to opening the file associated with that icon from the Page Window (except that a new Page Window won't be created in this case, the icon is opened into the Page Window it is dropped into).

You can also drag and drop links from a Page Window into a MiniWeb. If you click on the linked text, and then drag and drop that into a MiniWeb, it will copy the file the link points to into the MiniWeb.

4.3.4 Filling in Relative Links When you have a relative link in the MiniWeb, but the file does not actually exist in the MiniWeb, then the icon for that file is light gray. It is an easy matter to "fill in" this file if it exists elsewhere. Any method used for copying the file into the MiniWeb (dragging icons, copying URLs, Save As, etc.) will add the file to the MiniWeb, and fill in the icon to show the change.

This is useful when you are copying several related files from elsewhere.
Copying the first file adds that file and the relative links. Then as you copy the other files, the links are filled in.

MiniWebs 86 Page 4-7 WO 96/30846 PCT(LTS96101686 Editing With MiniWebs 4.4 Editing With MiniWebs There are a range of useful editing related features with MiniWebs (mostly available under the Edit menu).

4.4.1 Copying URLs There are several ways the menu item Edit->Copy URL works with MiniWebs.

It is important to note that if no icon is selected in a MiniWeb and Edit->Copy URL is chosen, then the URL from the MiniWeb is copied. If an icon is selected, then the URL for that icon will be copied.

If an URL is pasted from a MiniWeb into a Page Window, it will automatically add a link in the page to that URL. If the URL is pasted over selected text, then the link will be associated with that text. If no text is selected, then the title of the page that was copied will be inserted as text into the page, and that text will be linked to the copied URL.

If the URL from a Page Window is copied and then pasted into a MiniWeb, then that page will be added to the MiniWeb.

4.4.2 Deleting Icons There are several ways to delete icons. Selecting an icon and either pressing Delete, BackSpace, or choosing the menu item Edit->Cut will remove the icon. Note that when an icon is removed any ghost files that it points to that aren't pointed to by any other icon are also removed. Also note that if another page has a link to the deleted page, a ghost icon will remain.

4.4.3 Saving When you save a MiniWeb it will also save all files in the MiniWeb that are open and have unsaved changes.

4.4.4 Setting the Home Page To set a new home page for a MiniWeb, click on the arrow to the right of the Home Page Box at the top of the MiniWeb. This will give you a list of all the pages in the MiniWeb.
Selecting a page from this list will set it as the home page.

4.4.5 MiniWeb Button The MiniWeb icon on the upper left of the Page Window can be clicked on to bring up the MiniWeb Window for that page (if it exists).

Page 4-8 87 MiniWebs CHAPTER 5 The NaviServer 5.1 Introduction NaviServer allows you to save pages and MiniWebs from NaviPress to the server.
It automatically indexes the full text of any pages, does version control, includes powerful permission and cost models, and has special features like NaviLinking.

NaviServer is fast. Instead of forking on every connection, the NaviServer uses asynchronous socket 1/0 and continuations to maximize use of bandwidth.

NaviServer is DBMS-centric. Unlike some database integration packages that you just append, the NaviServer gives fast access to data. You can search existing data, enter new data and update old data. You can even define new database tables with a simple HTML
forms based interface.

5.2 Quick Start See Appendix C "Installation", for installation directions.

This section gives instructions on starting up NaviServer. In the examples, text enclosed in o is meant to be substituted with the information described.

Set the environment variable NS_HOME to the NaviServer directory.
# setenv NS_HOME <ns directory>

Before running NaviServer, you need to start the database. Type the following:
% $NS_HOME/bin/nsstartdb The NaviServer 88 Page 5-1 Quick Start To start a server in the foreground, type:
$ $NS_HOME/bin/nsd -f = To start a server in the background on port 80, log in as root and type:
# $NS_HOME/bin/nsd -u <user who owns NS_HOME>

5.2.1 Comnnand-line Options The following is a list of command line options available when starting up the NaviServer.
Text in courier after the option is meant to be substituted as described in the options explanation.
-A accounting mode -V archive versioning mode -v verbose mode -f run in the foreground -R chroot to the page root at startup -1 access log (default: no log file generated) -e error log (default: for root, /usr/adnr/nsd-port#.log, other users, /tmp/nsd port#.log) -p port use port number port (default: for root, 80) -i uid set uid to uid at startup -u user set uid to that of useruser at startup -H dir set NS_HOME directory todir (default:/usr/ZocaUn~
-d file set directory GET file name tofile (default: index.html) -m dir set map directory for -users todir -r dir set pages directory to dir (default: NSHOME/pages) -c prefix set CGI prefix to prefix (default: None, disabling CGI's) -C dir set directory of CGI scripts todir (default:NS HOME/cgi) -S serv set database server toserv (default:ns) -D db set database name todb (default: ns) -U user set database user touser (default: nsadmin) -P pass set database password topass (default: none) -N host set server hostname tohost (default: fully qualified IP hostname) -L loc set server location toloc (default: http://hostname:pory -t time set poll timeout totime seconds (default: 60) 5.2.2 rc.local The $NS HOME/bin/rc.nsd is an example script that contains all the information you need to run at startup. Note that this script is not available for all systems. If you put it into your file rc.local, the NaviServer should come up on port 80 when you boot the machine.
, Page 5-2 89 The NaviServer Searching the NaviServer 5.3 Searching the NaviServer The NaviServer automatically generates HTML forms that can be used to search the following:
= NaviServer system tables (e.g., ns_permissions, ns_users) = User-defined tables (e.g., customer feedback, inventory) = The full-text of all the pages stored on the server = Metadata that describes either local or remote pages To get an HTML page with links to most of the server search forms, choose NaviPress's menu item Tools->Search Server.

5.3.1 Searching Database Tables When the server processes a filled out SearchForrn, it translates the form data into an SQL
query and displays the results in a table (either PRE formatted or HTML3 table format).
5.3.1.1 The Body of the Search Form The search form contains one line for each column in the table.

The first part of the line is a check box. If checked, the value of that column is returned upon form submission.

The second part of the line is the name of the column.

You select the comparison operation from the third element: a SELECT box. The operators in the box vary according to the type of the column. Number types, such as integer and float, have the following operators:
=, >, <, >=, <=, <>, is null, is not null The text types (char, text, and varchar) allow the following:
=, <>, contains, like, not like, is null, is not null The text operators are case-sensitive. The like operator lets you put a%
character into the string that will match any substring. For example, Jo% Smith will match John Smith, Joe Smith, and Joseph Smith, but not Frank Smith. The contains operator is similar to the like operator, but puts a % character on either side of the value for you.
So lemur is contained by stories about lemurs in Des Moines.

The doc type (used for indexing the full text of a page) has the following operators:
similar, boolean, is null, is not null The similar operator will try to find documents that are similar in content to what you type. The boolean operator lets you type in and's and or's between search key words.

The NaviServer 90 Page 5-3 WO 96130846 PCTlUS96101686 Searching the NaviServer The fourth element in the line lets you fill in or select a value for comparison in the database.

5.3.1.2 More on the Search Form At the bottom of the form is a set of widgets. You can select one or more columns to order the search results. You can also choose to eliminate duplicate rows by checking the appropriate box. Since some searches can return an extremely large number of rows, you can control the maximum number of rows to return. If you do not change anything on the form and just clicks Search, the server will return all rows and columns (up to the maximum to return) in the table. To bring the form back to its original state, you may click Clear All. Finally, you must click Search to send the form contents to the server and execute the search.

5.3.2 Searching for Pages 5.3.2.1 Searching the ns_default_collection All the pages of the NaviServer (as well as any remote pages that have been indexed) are-indexed in the ns default collection table.

Table ns_default_collection has the following columns:
= ns_url: URL of the page = ns_title: title of the page = ns_body: full text of the page 5.3.2.2 Searching Medadata Tables Metadata tables are tables that have a column named ns_url and contain data describing the contents of that URL such as the author, the organization, or a quantitative rating of the page. Metadata table Search Forms contain an extra line that can be used to search the full text of the URL.

5.3.3 Hitlists and Hittables The NaviServer can display search results as a PRE-formatted table or as an HTML 3.0 table, if the browser can support them (Netscape 1.1, NCSA Mosaic 2.5, or Arena).

If the table is not a view (e.g. the ns_total_charges view), then the first column of the tab:le contains values that are links to the Update Form for that row. Values that are too long to fit in the table are truncated and shown ending in a*. The rest of the table's columns correspond to selected columns from the table. Values in the ns_url column are hot. If the user did a full text search, then these are links to the highlighted versions of the page (see section 5.3.4 "Highlighting and More Like This" on page 5-5). Otherwise, they are links directly to the page.

Page 5-4 The NaviSerier Entering Data and Updating It 5.3.4 Highlighting and More Like This -5.3.4.1 Highlighting The highlighting page contains all the text of the original page and marks any query terms as STRONG. The first term is marked as a named anchor and when a user traverses a link to a highlighted page, the browser will scroll directly to that first term. To determine which words to highlight, the server compares the roots of terms in the query with the words in the document. Some simple changes will not be marched, such as person to people and oasis to oases. At the bottom of the highlighted page the server inserts two links. The first is a link to the original page, which is more appropriate for editing. The second submits a query to the NaviServer for more documents like this one.

5.3.4.2 More Like This The server breaks a document into root terms and constructs a full text search. The NaviServer returns a Hitlist, just like that created from a Search Form.

5.4 Entering Data and Updating It Entry forms and Update forms let the user add and maintain data in the database. This applies to system data (such as the ns_permissions table) as well as any user-defined tables. Entering data is as simple as typing in (or selecting) the values you want and clicking Enter Data. The Clear Fields button resets the form to the original values.
Columns of type boolean only allow values t (true), f (false), or NULL (no value, different than false). Entry and Update forms show these colunms as radio buttons with labels True, False, and Unknown.

5.4.1 Typechecking Each column in a table has a type. That type restricts the values that can be inserted. For example, columns of type integer can only store integers and date columns can store only dates in a particular format. Before inserting any data into the database, the NaviServer checks to make sure that any values conform to these restrictions. If any do not, the NaviServer returns a helpful error message, for example:
Value "old" in column age is not of type integer 5.4.2 Dates and Times All Search, Entry, and Update (and Search) forms have special widgets for entering dates and times so users need not enter them in SQL format. To enter a date or time, users must select the radio button next to the date; otherwise, the NaviServer inserts a NULL or selects all rows. The default date and time values are the current date and time. The timestamp type is a composite of both date and time.

The NaviServer 92 Page 5-5 WO 96/30846 PCTlUS96/01686 Creating and Deleting Tables 5.5 Creating and Deleting Tables To delete or add a table, choose the menu item Tools->Server Administration->General, and enter the URL for your NaviServer. This will open the NaviServer Administration page.

To delete a table, click on Drop Table, under the Tables heading. This will bring up the Drop Table page. Enter the name of the table you want to delete and click Drop.

To add a table, click on Add New Table, under the Tables heading. This will bring up the Add New Table page. The beginning of the page lists brief instructions on filling in the form. The actual table form is below this section.

The first section to fill out in the table form contains general information about the table.
This includes the table name, a description of the table, and a check box to determine if the table is searchable.
Table Name This field can only contain one word composed of letters, numbers, and underscores. No other characters are allowed. Also, the table name can not be the same as any other table name, or one of the following reserved words:
abort absolute add after aggregate alert alerter all after and any archive arch store arg as asc at authorization backward before begin between binary binding bit boolean both by cascade cast char character char_length character_length check close collate collection column commit copy create createdb current_date current_time current_timestamp current_user cursor database date desc decimal declare delete desc distinct do double drop dump end escape exists external extract fetch first float for forward from function grant group having ignore in index indexable insensitive insert instead int integer interval into is key language last leading like link listen local micopy move next none nonulls not null numeric of on only open operator option or order overlaps poll position precision prior privileges public Page 5-6 93 The NaviServer R'O 96/30846 PCTIUS96/01686 Creating and Deleting Tables read real recover ref relative rename restore restrict return returns revode roolback rule schema scrool =
select session user set srnallint some stdin stdout store substring system_user table time timestamp to trailing transaction trim type unary under union unique update usage user using vacuum values varchar variant varying versior. view virtual where with zone Table Description This field has no character restrictions, and should contain a meaningful description of the table.
Table is Searchable This check box determines whether or not you will see a link to the table in the Search Server page. You would turn this option off if you didn't want users to have easy access to your table.

The next sections contain column descriptions. You fill in the clumns you want, and any empty column descriptions at the bottom are removed. You can have up to ten columns.
For each column, you will need to enter it's name, type, description, and select whether you want the column to be not null, unique, and indexed.
Name This field contains the column name, and has the same restrictions as the table name (see above), except that it can not have the same name as another column in this table. Note that when choosing column names, it is a good idea to preceed each name in a given table with an identifier that is unique from table to table. For example, if you were creating a problem report table, you might have problem_ in front of each column name. This will save you from running into possible problems later.
Type This field contains the type of information that will be entered into this column. Choose one of the following values:
text All characters are allowed.
integer Any integer is allowed.
real Any real number is allowed.
boolean Only two values (true or false) are allowed.
date A date.
time A time.
timestamp A date and a time.
Description This field has no character restrictions and should contain a meaningful description of the clumn.
not null If this box is checked, then this column must contain data. This means that if you are trying to add an entry to the table and this column is empty, then the table entry will be refused.

The NaviServer 94 Page 5-7 WO 96130846 PCT(US96101686 Customizing NaviServer Forms = unique If this box is checked then every entry in this column must be unique (i.e.
different then every other entry).
index If this box is checked, then this clunm will be indexed. An indexed colunui can be faster to search than a non-indexed column. However, indexing columns slows down table updates, inserting new data into the table, and deleting data from the table. In general, you should only index the colum:ns you think will be used most often when searching tables. For example, if you had a table of customer names and addresses, you would usually search the table by the customer's name. In this case it would make sense to index the column containing the customer's name. Note that indexing does not help you with columns that contain long strings of arbitrary texit, or when the column will be searched using the like or contains operators (see section 5.3 "Searching the NaviServer" on page 5-3).

When you have filled in all the clumns you want, go to the bottom of the column sections and click Create Table. If you have entered any illegal characters for the table name, or the names of any of the columns, the names will be changed to make them legal.
All spaces in names will be turned into underscores, and any other illegal characters will be removed. If the name is a duplication, or one of the reserved words, then a number will be appended to the end of the name. When the table is created, these changes will be shown to you and you will have the option of deleting the table immediately at that point. If you do nothing, the table will be created with the changes shown.

5.6 Customizing NaviServer Forms The simplest way to customize Entry, Update, and Search forms is to edit them with NaviPress and save them to another location. While this works fine for simple cases, you can not do it for update forms.

Another way is to add information about the individual columns to the ns_columns table using its column_htmltag_type and column_htmltag_data columns. These two columns control what widgets are used for table columns in Search, Update, and Entry forms.
The following are a lists of htmltag_types:
SELECT, SELECTORNULL
Forms use select box. Values are literals separated by spaces in the htmltag_data. Any character can be escaped with a backslash, or individual values containing spaces can be enclosed in single quotes. If you want users to be able to insert a NULL value, then use SELECTORNULL.
SELECTSQL, SELECTSQLORNULL
Forms use a select box, but htmltag_data contains an SQL statement that returns one column of rows, and is used to modify the form when accessed.
For example, the ns_permissions table uses select user_name from ns_users; so users can only enter legal user names.

Page 5-8 95 The NaviSe:rver Examples: Building a Database Application RADIO, RADIOORNULL

Same as SELECT and SELECTORNULL, except the htmltag_data are instantiated as radio buttons.
TEXTAREA, INPUT
The widgets used here are TEXTAREA and INPUT. The htmltag_data are HTML options. For example, a user might use ROWS=6 COLS=40 for a comment field.
AUTOINCR
This only applies to coiumns of type integer. Entry forms will have a default value 1 larger than the maximum number in the column already.
This is particularly useful when you want an arbitrary (but unique) number associated with each record. The html_tagdata is ignored.

Take a look at the ns_columns table for examples of most of these.
5.7 Examples: Building a Database Application 5.7.1 Creating a table for Problem Reports This section will provide you with an example of creating a problem report table to allow users to easily report problems. The server will automatically provide URL's for Entry forms and Search forms for your table.

First, from a Page Window, choose the menu item Tools->Server Administration->General. Under the Tables heading, select Add New Table to open a form for creating a new table.

The first section to fill out in the table form contains general information about the table.
This includes the table name, a description of the table, and a check box to determine if the table is searchable.

Since this table will be for problem reports, enter problem_report in the Name field. In The Description field, enter Problem Reports. You will want people to be able to easily search this table, so leave Table is Searchable selected.

The next sections contain column descriptions. In this example, you will be using four columns.

For each column, you will need to enter it's name, type, description, and select whether you want the column to be not null, unique, and indexed.

The first column in the example will contain a severity rating of the problem.
Enter problem_severity in the Name filed, and set the Type to integer. In the Description field, enter Severity of Problem. Every problem will need a severity, but different problems can have the same severity, so select not null, but don't select unique. This problem will probably be searched for by severity quite often, so select index.

The NaviServer 96 Page 5-9 _ __ _ = - _ Examples: Building a Database Application = The second column will contain a description of the problem. Enter problem description in the Name field, and set the Type to text. In the Description field, enter Description of Problem. Every problem will need to have a unique description, so select not null and unique. Since this is a large text field that will most likely be searched with the like or contains operators (see section 5.3 "Searching the NaviServer" on page 5-3), indexing would not be helpful. Do not select index.

The third column will contain the name of person reporting the problem. Enter problem_reporter in the Name field, and set the Type to text. In the Description field, enter Name of Problem Reporter. This field can be left blank, so don't select not null.
Also, this field does not need to be unique (the same person can report multiple problems) so don't Select unique. Do not select index either, since this is a less common way to look up problems.

The fourth, and final column, will contain the date the problem was reported.
Enter problem_date in the Name field, and set the Type to date. In the Description field, enter Date Problem was Reported. This field always needs an entry, however each entry does not need to be unique (you can have several problems from the same day), so select not null, but don't select unique. This is a common way to look up problems, so select index.

You have now defined all the columns for this table, so go to the bottom of the column sections and click Create Table. An entry for and link to the form for the table you created will now be added to the Search Server page. The URL for this form is /NS/GetEntryForm/problem_reports, where NS is the NaviServer directory.

5.7.2 Customizing Form Appearance You may feel that the forms you created are a bit bland in appearance. If you want, you can save them to another location and edit them using NaviPress. Note that when you cio this, since the form isn't generated fresh each time someone asks for it anymore, the default report date won't always be the current date.

Another way to customize the appearance of a form is by editing the entries in the ns columns table. These control the widgets that the NaviServer uses for each column when it builds the form. So open the URL /NS/GetSearchForm/ns_columns. Get all thF:
columns where column_tablename is problem_reports.

The NaviServer will show you a table with 4 rows; one for each column in the problem_reports table. By default, columns of type text show up in forms as single line HTML INPUT widgets. To make the problem description column show up as an HTNtL
TEXTAREA, click on the link at the beginning of the problem_description line to update thatrecord.

Then change the column_htmttag_type to TEXTAREA, and type ROWS=6 COLS=50 for the column_htmltag_dsta.

Page 5-10 97 The NaviServer NaviLinking 5.7.3 Pointing to Forms -The reason the problem_report was built as the example was to allow people browsing the =
NaviServer to report problems. Goto the helpdesk page of the application blue print.
Select the text that says Report a Problem. Using the menu item Elements->Link, link to the URL
http://yourhost/NS/GetEntryForm/problem_reports. If you wanted to link something directly to the search form, you would use http://yourhost/NS/GetSearchForm/
problem_reports.

5.8 NaviLinking Any pages indexed on the NaviServer, whether they are local or remote, are available for NaviLinking. Just bring up a Page Window and chose the menu item Tools->NaviLink.
Choose the NaviServer you want to link against. NaviPress sends your page to the server, and the server applies natural language processing technology to identify some potential hyperlinks that you could add to the page. You will then be able to easily go through the links and decide which wants you want to use.

5.9 Security Access to the NaviServer can be controlled at several levels. You are permitted to look at but not modify certain pages, while groups of users can be defined and allowed to search certain tables in the database.

5.9.1 Users and Groups The NaviServer stores all user and group information in 3 tables in the database:
1. Table ns users:
= user name = user passwd = user defgroup 2. Table ns_groups:
= group_name = group_description 3. Table ns_groups2users:
= group name = user name These tables are maintained in exactly same way as other tables; Entry Forms, Update Forms, and Search Forms.

The NaviServer 98 Page 5-11 =

WO 96130846 PCTlUS96101686 Security At The user nsadmin is a superuser and can access anything on the server.

Passwords are not encrypted, but only the nsadmin can look at or modify any of these three tables.

5.9.2 Protecting URLs There are two tables that deal with protecting individual URLs and whole URL
trees.
1. Table ns_permissions:
= permission_method = permission_url = permission_user = permission_group = permission_user_ok = permission_group_ok = permission_world_ok 2. Table ns_methods:
= method name = method alias The ns_methods table tells what methods considered equivalent. By default, BROWSE = HEAD = GET
DELETE = PUT

That is, anyone who has permission to PUT an URL has permission to DELETE it.
Before operating on an I-iTTP request, the server determines if the user has access to that URL:
1. Find the relevant row in the ns_permissions table. If an exact match is not found for the URL, the tail is pared down until a match is found. For example, if there is not match for/products/cereals/raisin_bran.html', then the server looks for a row wtiere permission_url =/products/cereals' . By default, the server comes with a row that says GET on `P is open to the world. If no relevant row is found, access is denied (forbidden).
2. If permission_user ok, permission_group_ok, and permission_world_ok are all false, access is denied (forbidden) 3. If the permission_world_ok is true, access is permitted 4. If the request did not come in with authorization data, access is denied.
= 5. The user and password are verified. If there is no password specified in the database, any password is accepted.

Page 5-12 99 The NaviServer Costs 6. If permission_user_ok is true and the permission_user is the username that came in with the request in the authorization data, access is permitted.
7. If permission_group_ok is true and the username that came in with the request is a member of the permission_-group (based on the ns_groups2users table or the user's default group) then access is permitted.
8. Otherwise, access is denied.

Permission data is cached in memory on the server, but is refreshed whenever there is a change to any of the permission tables.

5.9.3 Using NaviPress to Set Permission This section talks about using NaviPress to set permissions for particular pages or MiniWebs.

Under the Tools->Server Administration menu, users can choose one of the following items:
= GET permissions...
= PUT permissions...
= POST permissions...

If a permission row for that page (and that method) already exists, the user gets an UpdateForm and can modify the data. Otherwise, the user gets a fresh permission EntryForm.

5.10 Costs 5.10.1 Setting up costs The cost model and the permission model are very similar. Any costs associated with pages that do not require any authorization are ignored. That is, the server does not charge for public pages. By default, cost accounting is disabled, and must be enabled at startup with the -A option.

There are two tables dealing with costs and charges:
1. Table ns costs:
= cost method = cost url = cost amount The NaviServer 100 Page 5-13 WO 96/30846 PCTl1TS96/01686 Example: Managing Documents 2. Table ns_charges:
= charge_user = charge_cost = charge_when When an HTTP request comes in, the NaviServer uses the same algorithm as the pernmissions code to find an appropriate row in the ns_costs table. If the server can't find an exact match for the method and URL, then it pares off the tail of the URL
until it does.
If the server can't find any match, the it does not charge the user.

If the server does find a match, it inserts a row into the ns_charges table for the transaction, where the charge_cost is the cost_amount.

5.10.2 Viewing charges NaviServer administrators can view the charges by searching the ns_charges table or the ns_total_charges view which conglomerates all the charges for each user.

5.10.3 Using NaviPress to Set Costs This section deals with using NaviPress to set costs for particular pages or MiniWebs.
Setting costs with NaviPress is done almost exactly as setting permissions.
Under the Tools->Server Administration menu, users can select one of the following items:
= GET Cost...
= PUT Cost...
= POST Cost...

If a Cost for that page (and method) already exists, the user gets an UpdateForm and can modify the data. Otherwise, the user gets a fresh cost EntryForm.

5.11 Example: Managing Documents 5.11.1 Searching through publications.

Currently, the blueprint contains an archive of net news. Some of these articles will be more interesting to your customers than others. For example, if your company produces special fonts, you may want to separate out and enrich any news articles that talk specifically about fonts. Click the Search icon on the tool bar, and search all the pages on your server by following links labeled ns default collection. To search the full text of all = the pages for articles about fonts, type the wordfont into the input box on the same line as the word ns_body. To remove any articles from the tex news group, select ns_url's not like %tex%. By default, the NaviServer returns results in relevance-ranked order.
Following the second link brings up a page titled Re: Info about Frame for NT needed and highlights all the occurrences of the word font.

Page 5-14 101 The NaviServer Describing Pages 5.11.2 NaviLinking Pages that contain a number of useful hyperlinks make the best use of the web.

Hyperlinked pages give the reader immediate suggestions for where to go for more information. To help authors create hyperlinked documents, the NaviServer has a feature called NaviLinking that will suggest potential hyperlinks for a page.

To use NaviLinking, click the Smart icon on the toolbar. NaviPress will send your page to the NaviServer for analysis after which a dialog pops up. The first selection list contains all the potential anchors (derived from the page) for the links. Clicking on an anchor will highlight it in the page text and show the pages it could link to in the bottom selection list.
To see the page with relevant terms highlighted, click Show Page. To insert the link into your page, click Apply. In this case, links from TrueType fonts and from Adobe Type Manager might add value to the document.

5.11 1 Publish Save the newly hyperlinked document back to where it came from with File->Save or use File->Save As to save it to a new location on the server.

5.11.4 Setting Permissions and Costs To restrict the users that can view the newly hyperlinked document, choose Tools->Server Administration->Get Permissions. This will bring up an Entry form for permissions data that will control who can view this page. Change the permission_user to your name, if you have a user_name, or nsadmin if you don't. Change the permission_group to users. Select permission_user_ok true, permission_group_ok true, and permission_world_ok false. Press the Enter Data button. Now only members of the users group can look at this page.

To restrict the entire dtp tree, go to the Tools->Server Administration->General page, and follow the link to add new permissions data. Make the permission_method GET and the permission_url dtp, and fill the rest of the form exactly as you did above. Now the whole /dtp hierarchy is protected.

To put a cost on the page, choose Tools->Server Administration->Get Costs.
Just fill in the amount, and every time anyone looks at this page, a charge is recorded in the ns_charges table.

5.12 Describing Pages If you want to associate metadata with a page, choose the menu item Tools->Describe... in NaviPress. This will bring up a list of the metadata tables that can be used to describe the page. Select one of those links. You'll get an EntryForm with the column ns_ur1 already filled in with the page you're describing. There will be an extra check box at the bottom.
The NaviServer 102 Page 5-15 WO 96130846 PCT(US96101686 } Archive Versioning If checked, the NaviServer will go get the full text of the URL and index it locally.
5.13 Archive Versioning When the server is started in archiving mode (-A), all saved pages are stored away in the ns_archives table. This requires extra disk space, but lets users reload previous versions of the page and all its inlined assets. To see all the old versions of a page stored on the server, insert /NS/ArchiveVersions after the host (and port if its there) in the URL.
For example, http: //navisoft. com/index. html becomes http://navisoft.com/NS/ArchiveVersions/index.html To go directly to the page as it existed at a given time, insert /NS/Archive/
YYYYMMDDHHMMSS. For example, http://navisoft.com/index.html on Feb 22, 1995 becomes:
http://navisoft.com/NS/Archive/19950222000000/index.html 5.14 Logging If the server starts up in the foreground (-t), then both kinds of logging information go to standard output. If the server starts up in the background, then by default the logs get written to /usr/adminsd-access.log and /usr/adnz/nsd-error.log.
5.14.1 Access log The NaviServer records who did what in CERN standard logging format. When the server is run in the background, the default location is /usr/adnr/nsd-access.log.

5.14.2 Error log The NaviServer reports problems like bad data in the database, disk errors, and (shudder) bugs in the code in this log. When put into the background, the default location is /usr/
adm/nsd-error.log.

Page 5-16 103 The NaviServer NaviServer System Tables 5.15 NaviServer System Tables This section provides a list of the actual SQL used to create each of the NaviServer system tables:
create table ns_tables table_name text not null primary key, table_issearchable boolean default `f', table maxorderby int default 1, table_ismeta boolean default `f', table_description text, check(ns_table_exists(table_name) and table_ismeta = ns_table_ismeta(table_name)) create table ns_columns column_table text not null, column_name text not null, column description text, column_htmltag_type text, column_htmltag_data text, unique(column_table, column_name), check(ns_column_exists(column_table,column_name)) create table ns_groups group_name text not null primary key, group_description text create table ns_users user_name text not null primary key, user_passwd text, user_defgroup text not null references ns_groups create table ns_groups2users group_name text not null references ns_groups, user_name text not null references ns_users, unique(group_name,user_name) create table ns_methods method_name text not null primary key, method_alias text, check(method_alias = upper(method_alias)) The NaviServer 104 Page 5-17 WO 96/30846 PCTlUS96101686 NaviServer System Tables create table ns_permissions permission_method text not null, permission_url text not null, permission_user text references ns_users, permission_group text references ns_groups, permission_user_ok boolean not null, permission_group_ok boolean not null, permission_world_ok boolean not null, unique(permission_url, permission_method), check(permission_method = upper(permission_method)) create table ns_costs cost_method text not null, cost_urL text not null, cost_amount int default 0, unique(cost method, cost_url), check(cost_method = upper(cost_method)) create table ns_charges charge_user text references ns_users, charge_cost int not null, charge_when timestamp default current_timestamp create table ns_config config_name text not null primary key, config_value text create table ns_default_collection ns_url text not null primary key, ns_title text, ns_body doc not null create table ns_archives archive_path text not null primary key, archive_type text, archive_lo large_object Page 5-18 105 The NaviServer APPENDIX A Page Window, Menus, and Icons A.1 NaviPress Page Window The following figure of the page window:

~: ..:, . ., . Please~itlethis.psa e.:jPa e:'t ;in m*1J
Toolbar File Location ~C~= X: =``Paste! ~ti St~1: ~k ~stk ; :~trtt`: ~x=2r. :' Status Icon 13~cation: http://navisoft.comjpagel.htm ...~1= ..
Open / Show MiniWeb Button Title: Pfease 'tle this page. (Page 1 in mw'i) Page Title Text Editing Area . . :.. , ... , Status Bar Page Window, Menus, and Icons 106 Page A- I

WO 96/30846 PCTlUS96l01686 A.1.1 Toolbar The following icons are the toolbar icons:

Cut NaviLinking Copy Backward .~.i'. .. ,-: ...,... .~
Paste Forward Describe Page Stop t.:
_ . ... _~
Search Server ~#ar"=cks Page A-2 107 Page Window, Menus, and Icons A.1.2 Overview of Menus When a page window is active in NaviPress, the following menus are active.
There are platform specific menu accelerator keys:

File Edit Elements Format Tool Browse Window Help New MiniWeb Get Rttributes... Show HTML...
New Page .___.._.._._._....... _.__..._. ._.._..... ._........... ....
__........... ........... .............
Open... Horizontal Rule NauiLinks...
Close Forced Line Break Check Links...
.._.__.._.._._._....__._..__.~_._.....
Saue L"ink... Describe Page...
Saue Rs... Rnchor... Search Seruer...

Print Setup... Image... Seruer Rdminstration -Print... Image Map... Preferences -EKit Unlink Delete File...

Undo Remoue Format - Backward Redo Forward Special Style - Stop Cut __.._..._._.._.._.._..... ..__...___.._..........
~......__.___.._.._.._.__.._.
Copy Heading - Reload Page Paste Paragraph - ----____.______._____ Cleur -_-=__ _______..__._.___ ____.. Global History...
Select Ril Lists - Hot List...
-----==- Forms... Rdd To Hot List Copy URL Show Border ~._.~___ Paste URL _.._....... _.._.....
Stgle Sheet...
f ind / Replace...
Find Nest Tile Help...
Cascade Rrrange Icons lutorial...
_.__.._.__.~.._.._.___._._.._. j 1 MiniWeb: <Location> Tech Support...
_._ .._........__.._._..._.._. `
2 MW<1>: Page <1> ====-__..........
Rbout NauiPress...
Page Window, Menus, and Icons 108 Page A-3 WO 96/30846 PCTlUS96101686 .
A.2 The File Menu The File Menu contains application file operations, such as opening, saving, and printing.
A.2.1 New MiniWeb Creates a new MiniWeb and and a new Page. The new page will be in the new MiniWeb.

A.2.2 New Page Creates a new page.
A.2.3 Open Invokes a dialog box which allows you to open a file. The file may either be on another server, or a local file. If the file is a web page or a MiniWeb, then it will be opened normally. If the file is a sound or video file, then an attempt will be made to launch an external viewer or player. If none is available you will be asked if you want to save the file. If the file is a graphic image, then an attempt will be made to launch an external viewer. If none is available and the file is either a GIF, JPEG, or XBM, then a new Page Window will opened containing the image. Otherwise you will be asked if you want to save the file. Filters can be applied to the file to translate it into some other format. The available filters can be found under menu item Tools -> Preferences -> Input Filters.
A.2.4 Close Closes the current page. If the changes to the page have not been saved, a dialog appears asking you if you would like to Save or Discard the page modifications, or Cancel the closing of the page.

A.2.5 Save Saves the current page. If the file has not previously been saved, the Save As dialog appears, allowing you to save the document locally into a miniweb, or to a remote server.

A.2.6 Save As Invokes the Save As dialog. This dialog allows you to save the page to another location, and to change the file format if you want. You can also apply an external filter to the file. The available filters are defined in Tools -> Preferences -> Save Filters. If the page contains images, the images can be saved with the page. If the images are not saved with the page, then the new page will have links to the original images.
If the images are copied with the page, then the new page will have links to the local copies of the images.

Page A-4 109 Page Window, Menus, and Icons A.2.7 Import Invokes the Import dialog. This allows you to insert the contents of a text file into the current page. The text options are preformatted (all new lines are preserved) or regular text (words are wrapped and the new lines are removed).

A.2.8 Print Setup Invokes a platform-specific dialog, which allows you to define printer options and pr int settings.

A.2.9 Print Invokes the print dialog. This allows you to print the current page, as either PostScript or text.

A.2.10 Exit Closes the NaviPress application. If miniwebs or pages have not been saved, you are prompted to save them. If you have created any new MiniWebs that are empty, you will asked if you want to delete them.

A.3 The Edit Menu The Edit Menu contains operations for the editing of pages including Cut, Copy, Paste, Find / Replace.

A.3.1 Undo Removes the latest operation. You should be warned that some operations may not be undone.

Subsequent selections of Undo will undo progressly older changes to the page, until the original page is restored.

A.3.2 Redo Reverses an undo. Redos may be done as many times in a row as undos have been done.

A.3.3 Cut Places the current selection on the clipboard, while simultaneously removing it from the page.

A.3.4 Copy Places the current selection on to the clipboard, leaving the current page unchanged.
A.3.5 Paste Either inserts the contents of the clipboard at the current insertion point or replaces the Page Window, Menus, and Icons 110 Page A-5 = current selection with the contents of the clipboard.

= A.3.6 Clear Removes the selection from the page. Unlike the operations, Cut and Copy, the Clear operation does not copy the contents to the clipboard.

A.3.7 Select All Selects all the contents of the current page.
A.3.8 Copy URL
Copies the URL of the current page. Pasting this URL into another page automatically creates a link between the pages.

A.3.9 Paste URL
If the previous Copy operation was Copy URL, the menu item Paste URL is enabled.
Pasting an URL onto a selection will make that selection a link to the page the URL, was copied from. Pasting an URL at an insertion point (if no text is selected) will insert the Title of the copied page, and will make the title a link to that page.

A.3.10 Find / Replace Invokes the Find / Replace dialog, which allows you to find and/or replace text in ttie current page.

A.3.11 Find Next Repeats the current Find operation.
A.4 The Elements Menu The Elements Menu contains menu item operations for insertion and/or creation of HTML page elements.

A.4.1 Get Attributes...
Invokes a dialog most relevant to the selection. For example, if linked text is selected, the Link dialog will be invoked. If an image is selected, then the Image dialog is invoked.

A.4.2 Horizontal Rule Inserts a ruled line at the current insertion point. The appearance of the rule line is defined by the applied style sheet.

A.4.3 Forced Line Break This is equivalent to pressing SHIFT RETURN, which will cause a line break at the insertion point. This puts the insertion point one space below the current line.
Pressing just RETURN puts the insertion point two spaces below the current line.

Page A-6 111 Page Window, Menus, and Ic:ons Note that lines separated by line breaks are part of the same paragraph.

A.4.4 Image Invokes the Image dialog. This dialog allows you to insert and align an image at the cursor insertion position. The alignment options enable you to align the inserted picture with a line of text in three positions: top, middle, or bottom.

A.4.5 Image Map Invokes the Image Map dialog for the selected image. This dialog enables you to create an Image Map asscotiated with a given image. Image maps allow you to create links in different parts of an image.

A.4.6 Link Invokes a dialog box that enables you to create a link to either a local file, a file within a miniweb, or to a file on the Web. The current selection becomes the anchor for this link.

If the current selection already contains a link, you have several additional options.
You can:
= remove the link (leaving the selection intact) = shorten the selection, such that only the link itself is selected = copy the URL of the current link to be pasted to another location A.4.7 Anchor Invokes a finder dialog box, which enables you to attach a marker name to the selection. You can then link to that marker using the notation.

A.5 The Format Menu The Format Menu contains operations for formatting elements, related to text, within a page. This ranges from character styles, including headings and paragraphs, to lists and forms.

A.5.1 Remove Format A.5.2 Special Style Enables you to apply particular style to a character selection. The Special Style Page Window, Menus, and Icons 112 Page A-7 WO 96/30846 PCTlUS96101686 submenu items are the following:
= Plain text (no emphasis) = Bold = Italic = Underline = Fixed Pitch (a monospaced font such as Courier) = Subscript (smaller font, lower baseline) = Superscript (smaller font, higher baseline = Citation (italic) = Code (monospaced font) = Definition (bold) = Emphasis (bold) = Example (plain text) = Keyboard (monospaced font) = Sample (monospaced font) = Strong (bold and red) = Variable (monospaced font) A.5.3 Heading The Heading menu item contains a submenu of six defined headings and a "Normal"format selection. The selection of a particular submenu element will apply to your character selection. Normal removes a heading definition from the character selection.

A.5.4 Paragraph The Paragraph menu item contains a submenu of three simple paragraphs and a "Normal"format selection. The "Normal" selection removes all Paragraph formatting.
The Paragraph submenu items are the following;
= BlockQuote paragraphs are for large (extended) quotations. This selection indent the selection, separating it from the surrounding text.
= Preformatted paragraphs generate text in a fixed-width font and cause spaces, new lines and tabs to be displayed in the same locations as similar to the source HTDiII.
file. This may be used for code samples in which all new lines, tabs and other whitespace must be preserved.
= Address is a signature type line of text. Addresses usually go at the bottom of the Web page and are used identify who authored the page, who to contact for more information, date, copyright and other notices.

Page A-8 113 Page Window, Menus, and Icons A.5.5 List =
The List menu item contains a submenu consisting of three types of lists, a "Normal" format selection, and alternating selections - Term and Definition.

= Unnumbered lists are bulleted = Numbered lists are numbered = Definition lists is a list that is created by alternating a Term and a Definition. The definition formats the selected text to a new line.

Inside a numbered or an unnumbered list, the menu item selection of "Term"
returns a new list element. The keyboard equivalent of the "Term" selection is the return key.
A.5.6 Form Invokes a Form dialog box. This dialog box allows you to select the form handler location (URL). This is the a script that processes a form (the cgi script).
Also included in this dialog box, are the methods of form submission. The submission method is defaulted to Get, with an optional Post.

A form elements palette is associated with a form. This includes a selection of tools for creating radio buttons, check boxes, single- and multi-line text fields, selection lists, and picture fields.

A.5.7 Style Sheet Invokes the Style Sheet dialog box. This dialog box enables you to define and change the appearance of the elements on screen. A style sheet is a set of mappings between page elements, such as headings and lists to font and font size and elements.
The style for a new miniweb page is set to the Navipress default. From this dialog box, the default style sheet can be edited, a new style sheet can be created and a style sheet selection can be applied to the current page, A.6 The Tools Menu The Tools Menu item contains the tools for checking and testing information about or elements within the current page, or miniweb. This menu also contains the application preferences.

A.6.1 Show HTML
Opens a read-only window containing the source for the current page in HTML
(HyperText Markup Language). This file can be saved as a text text.

A.6.2 NaviLinks Opens a dialog box that provides suggestions of possible links from the current page using the NaviLinks service on a NaviServer. To specify the location of the server, you may either enter the location name in the Location text field, or they may select Page Window, Menus, and Icons 114 Page A-9 a location for the default list. The default list can be found under preferences, "Tools -> Preferences -> Destinations".
A
A.6.3 Check Links Invokes a dialog box which enables you to check each link in the current page, mak-ing sure that the page or location (URL) that the link points to is valid.

A.6.4 Describe Page Describe Page and Search Server functions are complemenatry.

The Describe Page menu item invokes a dialog box that enabes you to input data for the for Search and Retrieval service. Features include the capability to select a NaviServer, a data description type, and input a descripton (Title, Author, and Subject).

To specify the location of the server, you may either enter the location name in the Location text field, or they may select a location for the default list. The default list can be found under preferences, "Tools -> Preferences -> Destinations".

A.6.5 Search Server Search Server and Describe Page functions are complemenatry.

The Search Server menu item invokes a dialog box that enables you to query for data from the Search and Retrieval service. Features include the capability to select a search type, fill out the forms with query data, and the retrieval of a list of results with respect to your input query data.

To specify the location of the server, you may either enter the location name in the Location text field, or they may select a location for the default list. The default list can be found under preferences, "Tools -> Preferences -> Destinations".

A.6.6 Server Adniinistration The Server Adminstration menu item are the adminstrative functions. See the tutorial on NaviServer for a description.

A.6.7 General (Preferences) Contains preferences specific to NaviPress, including whether to load remote images with each document, a directory to cache files in, your email address, and proxy and name servers.

A.6.8 Extensions/1VIIME (Preferences) Contains a list that associates file name extensions (such as html or -gif) with file - MIME types. This list is only used by NaviPress when opening local files or receiving files from non-Web servers (for example, FTP).

Page A-10 115 Page Window, Menus, and Icons A.6.9 MIMEJViewer (Preferences) Contains a list that associates file MIME types (such as image/jpeg or text/html) with external programs that can view or play those files. If NaviPress- itself cannot view or play the file, the external viewer is started up based on this list.

A.6.10 Save As Filters (Preferences) Allows you to specify external filters (executeable programs) that can translate a file from HTML into some other format when that file is saved. You can choose a filterfrom this list when you save a file using "Save As..."Preferences /
MiniWeb Icons... associates icons in the MiniWeb view with a file's MIME type.

A.6.11 MiniWeb Icons (Preferences) Allows you to list that associates file MIME types (such as image/jpeg or text/html) with an icon location.

A.6.12 NaviServer (Preferences) Defines a set of default NaviServer destinations which can be used to search pages, save pages or miniwebs to remote servers, or create NaviLinks for pages. A
dialog allows you to specify both the location (URL) and a more easily understood alias for that destination.

A.6.13 Delete Enables you to delete any file using a delete chooser dialog box. This file can be either local or on a remote server.

A.7 The Browse Menu The Browse Menu contains operations for browsing the web pages, both locally and on the remote World Wide Web.

A.7.1 Backward When browsing, the Backward menu item moves you backward to the previously visited pages. This is based on a list found in the Global History.

A.7.2 Forward When browsing, the Forward menu item moves you forward through the pages previously visited. This is based on a list found in the Global History.

A.7.3 Stop Allows you to cancel the action of browsing forward or backward through the visited {
pages found in your Global History. (see Backward, Forward).

Page Window, Menus, and Icons 116 Page A-I I

WO 96/30846 PCT(1IS96(01686 . A.7.4 Reload Page Reloads the current page and all its images from the remote server or from the your local hard disk.

A.7.5 Global History Brings up a dialog box with a global history list. This is a list of all the pages you have browsed during the current session with Navipress. You are able to return to any of the listed pages by selecting the page name from the list and clicking on the button "Fetch". Fetch places the selection into a new window.

A.7.6 Hot List Provides the capability to add, remove, and rearrange items in your hot list.
The "hot list" is a forum which enables you to store the names and location of pages that they would like to revisit, similar to a bookmark. You can also create labels for the hot list items.

You are able to go to the location found in their hot list by selecting the name of the location from the hot list, and clicking on the button "Fetch". Fetch places the selection into a new window.

A.7.7 Add to Hot List Adds the Location (URL), of the current page, to your hot list.
A.8 Window Menu The Window menu contains all the windows open in NaviPress. By selecting a window, it becomes active.

It also contain platform-specific tools for arranging windows such as Tile and Cascade.
A.9 Help Menu The Help menu contains pages for help, tutorials, and the About Box.

Page A-12 117 Page Window, Menus, and Icons ~
APPENDIX B MiniWeb Window, Menus, and Icons B.1 NaviPress MiniWeb Window The following figure of the MiniWeb window:

o ~ , ^ ^ ^ ^ ~. ; ~:
Toolbar ~~ ~ ~~.=' ~Op~ :,. ~~ a :
, _.. ...
. , ,....
' P~tGE1.HTM
Status Icon HamC Lt ,, . m ..
. _ , ,;:-... . ._x .
,..._.. . : . ., . . . . .-.. .. - . > .. _.: .
MiniWeb Home Page ~,=r }}~~,' ~_ AW~
navihome.htm Image Icon tbtech.gif navinew.htm Page Icon s~
y, y ,. , . . ... , , . ,:;

MiniWeb Window, Menus, and Icons 118 Page B-I

WO 96/30846 PCTlUS96101686 B.1.1 Toolbar , The following icons are the MiniWeb toolbar icons:
New MiniWeb New Page Rage Open File P~ -Save As :SaiviE~s.

Import File Page B-2 119 MiniWeb Window, Menus, and Icons B.1.2 Overview of Menus When a page window is active in NaviPress, the following menus are active.
There are =
platform specific menu accelerator keys:

File Edit Uiew Tool Browse Windo-w Help New MiniWeb Help...
New Page _.._...._._._.._.....-.__..
~ Tutorial...
Open...
= =
Close Clean Up 6lobal History... ........ ..... _...___._..._._.......
_=_=___.._,. __ Hot List... Tech Support...
Saue Zoom In .... .......... _._....... Saue H_s... Zoom Out Rbout NauiPrea i mport...
EHit Cut Describe Page... _Tiie Copy Search Seruer... Cascade Poste Rrrange icons Clear Seruer Hdminstration - - =_____~. _._.__....._......___.._...
Preferences - 1 MiniWeb: <Location>
Copy URL 2 MW<1>: Page <1>
Paste URL Delete...

Set Stetionery B.2 The File Menu The File Menu contains application file operations, such as opening, saving, and printing.
B.2.1 New MiniWeb Creates a new MiniWeb and New Page within that MiniWeb.
B.2.2 New Page Creates a new page.

MiniWeb Window, Menus, and Icons 120 Page B-3 WO 96/30846 PCTlUS96101686 t B.2.3 Open Accesses a chooser dialog box which allows you to open an existing MiniWeb or page.
Remote miniwebs and pages are specified by location (URL). NaviPress refers to the;
URL as "Location". Local miniwebs and pages are specified by their file name.
MiniWebs and pages need to be processed to be opened. An example would be HTML. HTML files can be opened as text (as opposed to being parsed and formatted).
In addition, filters can be applied to the file to translate it into some other format. The available filters can be found under menu item "Tools -> Preferences -> Input Filters".
B.2.4 Close Closes the current page. If the changes to the page have not been saved, a dialog appears asking you if they would like to Save or Discard the page modifications, or Cancel the closing of the page.

B.2.5 Save Saves the current page. If the file has not previously been saved with a file Title and to a Location, the Save As dialog appears, allowing you to save the document locally into a miniweb, or to a remote server.

B.2.6 Save As Accesses a chooser dialog box, Save As. This dialog box allows you to save the page to another Title and Location, or to a different format (Text, HTML, or RTF).
You can also apply an external filter to the file. The available filters are defined in "Tools ->
Preferences -> Save Filters". If the page contains images, the images can either be saved with the page or refer to them remotely.

B.2.7 Import Opens a chooser dialog box, allowing you to insert the contents of a text file into the current page. The text options are preformatted (all new lines are preserved) or regular text (words are wrapped and the new lines are removed).

B.2.8 Exit Closes the NaviPress application. If miniwebs or pages have not been saved, you are prompted to save them.

B.3 The Edit Menu The Edit Menu contains operations for editing the MiniWeb including adding and removing pages.

Page B-4 121 MiniWeb Window, Menus, and Icons B.3.1 Cut Places the current selection and its location (URL, if there is one)on to the clipboard, while removing it simultaneously from the current MiniWeb.

B.3.2 Copy Places the current selection and its location (URL, if there is one)on to the clipboard, leaving the current selection unchanged.

B.3.3 Paste Inserts the contents of the clipboard at the into the MiniWeb Window. The file will be represented by an icon.

B.3.4 Clear Removes the currently selected MiniWeb element from the MiniWeb. If links to that page still exist, the page icon will not be removed; instead it will grey.
That page can-not be totally removed from the miniweb unless all links to it are broken.

B.3.5 Copy URL
Copies the URL, refered to as the Location, and the title of the current page.
Pasting this URL into MiniWeb automatically creates a link between the pages.

B.3.6 Paste URL
If the previous Copy operation was Copy URL, the menu item Paste URL is enabled.
Pasting an URL results in one of three selections:
= Pasting only the current page.
= Pasting an URL and it's related links.
B.3.7 Set Stationary BA The View Menu The View Menu contains menu item operations for insertion and/or creation of HTML
page elements.

B.4.1 Clean Up Cleans up arrangement of your MiniWeb Window.
B.4.2 Zoom In Makes the view of the MiniWeb larger (less of it can be displayed). Only a previously-reduced MiniWeb can be zoomed in.

MiniWeb Window, Menus, and Icons 122 Page B-5 B.4.3 Zoom Out Makes the view of the MiniWeb smaller so more of the MiniWeb can be displayed.
B.5 The Tools Menu The Tools Menu item contains the tools for checking and testing information about or elements within the current page, or miniweb. This menu also contains the application preferences.

B.5.1 Describe MiniWeb Describe MiniWeb and Search Server functions are complemenatry.

The Describe MiniWeb menu item accesses a dialog box that enabes you to input data for the for Search and Retrieval service. Features include the capability to select a NaviServer, a data description type, and input a descripton (Title, Author, and Sub-ject).

To specify the location of the server, you may either enter the location name in the Location text field, or they may select a location for the default list. The default list can be found under preferences, "Tools -> Preferences -> Destinations".

B.5.2 Search Server Search Server and Describe Page functions are complemenatry. The Search Server menu item accesses a dialog box that enables you to query for data from the Search and Retrieval service. Features include the capability to select a search type, fill out the forms with query data, and the retrieval of a list of results with respect to your input query data.

To specify the location of the server, you may either enter the location name in the Location text field, or they may select a location for the default list. The default list can be found under preferences, "Tools -> Preferences -> Destinations".

B.5.3 Server Administration The Server Adminstration menu item are the adminstrative functions. See the tutorial on NaviServer for a description.

B.5.4 General (Preferences) Contains preferences specific to NaviPress, including whether to load remote images with each document, a directory to cache files in, your email address, and proxy and name servers.

B.5.5 Extensions/1VIIME (Preferences) Contains a list that associates file name extensions (such as html or gif) with file MIME types. This list is only used by NaviPress when opening local files or receiving Page B-6 123 MiniWeb Window, Menus, and Icons files from non-Web servers (for example, FTP).

B.5.6 MIME/Viewer (Preferences) Contains a list that associates file MIME types (such as image/jpeg or text/html) with external programs that can view or play those files. If NaviPress itself cannot view or play the file, the external viewer is started up based on this list.

B.5.7 Save As Filters (Preferences) Allows you to specify external filters (executeable programs) that can translate a file from HTML into some other format when that file is saved. You can choose a filter-from this list when you save a file using "Save As..."Preferences / MiniWeb Icons...
associates icons in the MiniWeb view with a file's MIME type.

B.5.8 MiniWeb Icons (Preferences) Allows you to list that associates file 1VIIME types (such as image/jpeg or text/html) with an icon location.

B.5.9 NaviServer (Preferences) Defines a set of default NaviServer destinations which can be used to search pages, save pages or miniwebs to remote servers, or create NaviLinks for pages. A
dialog allows you to specify both the location (URL) and a more easily understood alias for that destination.

B.5.10 Delete Enables you to delete any file using a delete chooser dialog box. This file can be either local or on a remote server.

B.6 The Browse Menu The Browse Menu accessing your Global History and Hot List.
B.6.1 Global History Brings up a dialog box with a global history list. This is a list of all the pages you have browsed during the current session with Navipress. You are able to return to any of the listed pages by selecting the page name from the list and clicking on the button "Fetch". Fetch places the selection into a new window.
B.6.2 Hot List Provides the capability to add, remove, and rearrange items in your hot list.
The "hot list" is a forum which enables you to store the names and location of pages that they would like to revisit, similar to a bookmark. You can also create labels for the hot list items.

MiniWeb Window, Menus, and Icons 124 Page B-7 You are able to go to the location found in their hot list by selecting the name of the location from the hot list, and clicking on the button "Fetch". Fetch places the selec-tion into a new window.

B.6.3 Add to Hot List Adds the Location (URL), of the current page, to your hot list.
B.7 Window Menu The Window menu contains all the windows open in NaviPress. By selecting a win-dow, it becomes active.

It also contain platform-specific tools for arranging windows such as Tile and Cascade.
B.8 Help Menu The Help menu contains pages for help, tutorials, and the About Box.

Page B-8 125 MiniWeb Window, Menus, and Icons APPENDIX C Installation C.1 NaviPress Installation The following are the steps necessary to install NaviPress on your system:
C.1.1 Macintosh Installation 1. Ftp to ftp.aol.com with the username navibeta and the password beta.web.
2. Cd to the /beta/np directory.
3. Grab the file np-mac.bin 4. Create a folder on the Macintosh and drop the binary in it. Files created by Navi-Press will be placed in this folder.

C.1.2 MS Windows Installation 1. Ftp to ftp.aol.com with the username navibeta and the password beta.web.
2. Cd to the /betalnp directory.
3. Grab the file np-win.zip. Note that this file has been compressed with PKZIP.
4. Create a directory for the client (e.g. C:WPRESS) 5. Uncompress the file with PKUNZIP and place in the directory you created.
C.1.3 Sun Installation i. Ftp to ftp.aol.com with the username navibeta and the password beta.web.
2. Cd to the /betaJnp directory.
3. Grab the file np-sun.tar.gz. Note that this file has been compressed with gzip.
Installation 126 Page C-1 WO 96/30846 PCTlUS96101686 4. Cd to any directory.
5. Extract the tar file with:
% gunzip < tar_file I tar xvf -This will create a directory containing the client.
6. Place the directory in your PATH

C.2 Running NaviPress The first time NaviPress is run the following dialog is invoked:
Please specify a Name Server and ' a Pro xl-=
If you then click OK you will get the following dialog:
Mail address: wwwUser dork Proxy: ,~i;utd~l Name Server: 198 168 146 118 ,ti~
Load Remote Pictures ^ Prefetch Pages ^ Unix Siyle Delete MiniWeb File type: * DOS 0 Mac C.2.1 Name Servers Machines on the net know each other by their IP Address, which is usually expressed as four numbers separated by dots. For example:
131.215.139.100 Page C-2 127 Installation WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCTfJS96/01686 However, the people who use these machines would much rather refer to them by a name, such as:
.
tybalt.caltech.edu When the net was small, there was a text file of mappings between names and addresses so that people could say tybalt.caltech.edu, and their machines would know to contact 131.215.139.100.

Now that the net is much bigger, there are name servers which you can ask for the IP
address corresponding to a given name. If the name server doesn't know offhand, it will repeat the question to other name servers, and give you whatever address they reply.
This name server chaining allows you to look up the name of machines all over the net, but you still need to know an address for the first name server.

If you don't already know your nameserver's address, ask your Network Administrator or Service Provider.

C.2.2 Proxy Servers When attempting to reference an URL, a web client can either go and fetch the data itself, if has implemented the scheme (http:, ftp: , wais:, etc.), or it can make an HTTP request to a Proxy Server, which will fetch the data and return an HTTP response.

NaviPress fetches http: andftp: URLs itself, but will ask the proxy server to fetch all other kinds of URLs. This means that NaviPress will automatically work with new types of URLs as they are defined, but it also means that the proxy server entry in the menu Tools->Preferences->General must be set to an HTTP proxy server (such as the CERN
server, which also caches) in order to follow other kinds of links.

5.15.1 Copying Preferences On UNIX, a preference file, navipres.prf, is created in your user directory containing the preferences you set (proxy servver, name server, etc.). If you want other users to default to your preferences without having to set them themselves, copy navipres.prf into the NaviPress directory.

On the Macintosh and PC, the preference file is in the NaviPress folder.
Copying this whole folder will copy the default settings.

C.3 NaviServer Installation The following are the steps necessary to install NaviServer 1. Ftp to ftp.aol.com with the username navibeta and the password beta.web.
2. Cd to the /beta/nsd directory.

Instailation 128 Page C-3 WO 96130846 PCTlUS96101686 3. Grab nsd-beta.comrnon.tar.Z. This compressed tar file contains NaviServer files common to all platforms.
4. Grab the compressed tar file for your platform:
= Sparc SunOS: nsd-beta.sun4.tar.Z
= Sparc Solaris: nsd-beta.solaris.tar.Z
= Intel Solaris: nsd-beta.i86pc.tar.Z
= HP HP/UX: nsd-beta.hp.tar.Z
5. Log in as any user except root.
6. Define the NS_HOME environment variable to some new directory and cd to it:
% setenv NS_HOME <some directory>;
% mkdir $NS_HOME
% cd $NS_HOME
7. Extract the common tar file:
% zcat < nsd-beta.comnon.tar.Z I tar xvf -8. Extract the platform specific tar file:
% zcat < nsd-beta.<platform>.tar.Z I tar xvf -9. Reload the license you received from us with:
% $NS_HOME/bin/nslicense If you need a license send email to jimbo@navisoft.com.
10. Start the database with:
% $HS_HOME/bin/nsstartdb 11. Start a NaviServer in the foreground with:
% $NS_HOME/bin/nsd -f 12. You can also start a server in the background on port 80 by logging in as root and using:
# $NS_HOME/bin/nsd -u <;user who owns NS_HOME>
You may be interested in the $NS_HOMF./bin/rc.nsd script.

Page C-4 129 Installation INDEX

A customizing forms 5-8 absolute link -definition 4-2 D
Access log 5-16 definition lists 3-3 Add To Hot List 2-3 deleting icons in MiniWebs 4-8 adding pages to MiniWebs 4-4 deleting tables 5-6 anchors Describing Pages 5-15 creating 3-7 Double Clicking on Icons 4-7 Archive Versioning 5-16 Drag and Drop 4-7 Authoring 3-1 E
B editing web pages 3-2 Back Button 2-3 Editing With MiniWebs 4-8 Browse button 3=4 Error log 5-16 browsing 2-1 exiting NaviPress 2-4 for links 3-7 browsing for graphics 3-4 F
files of unknown type c icon 4-3 cached pages 2-3 fixing 4-5 charges 5-14 fixing links 4-5 Color Coding format borders 3-4 in MiniWebs 4-6 Format menu 3-2 column Formats 3-2 description 5-7 formats indexing 5-8 headings 3-3 name 5-7 lists 3-3 not nu115-7 special styles 3-3 type 5-7 forms unique 5-8 customizing 5-8 command line options Forward Button 2-3 for the NaviServer 5-2 contains operator 5-3 G
Copy icon 3-7 Get Attribute 3-5 copying MiniWebs 4-3 ghost files copying text 3-6 definition 4-2 Copying URLs 3-9 Global History 2-3 Costs 5-13 graphics costs importing 3-4 setting 5-14 links in, see image maps 3-8 =
Creating Anchors 3-7 Creating Links 3-7 H
creating tables 5-6 Headings 3-3 creating web pages 3-1 Hide Border 3-4 highlighting page 5-5 Index 130 Page I

WO 96/30846 PCTlUS96101686 = INDEX

home page unnumbered lists 3-3 definition 4-2 log setting 4-8 access 5-16 Hot List 2-3 error 5-16 hot spots in images 3-8 Logging 5-16 hypertext creating links 3-7 M
Merging MiniWebs 4-5 I MiniWeb Icon Color 4-6 icons 4-3 icons MiniWeb Button 4-8 colors of 4-6 MiniWeb terminology 4-2 double clicking on 4-7 MiniWeb Window 2-1 files of unknown type 4-3 description of 4-2 image files 4-3 MiniWebs 4-1 image maps 4-3 adding pages 4-4 sound files 4-3 button in Page Window 4-8 style sheets 4-3 color coding 4-6 video files 4-3 copying 4-3 web pages 4-3 copying URLs 4-8 Image dialog 3-4 deleting icons 4-8 image file editing with 4-8 icon 4-3 icon color 4-6 image map link color 4-6 icon 4-3 merging 4-5 Image Maps 3-8 pasting URLs 4-4 images saving 4-8 importing 3-4 links in, see image maps 3-8 N
Importing Graphics 3-4 NaviLinking 5-11 importing text 3-6 NaviPress indexed column 5-8 starting 2-1 inlined NaviServer 5-1 definition 4-2 command line options 5-2 system tables 5-17 L not nu115-7 like operator 5-3 numbered lists 3-3 Link Color 4-6 links 4-5 0 browsing for pages 3-7 options creating 3-7 command line for NaviServer 5-2 Lists 3-3 lists p definition 3-3 Page Window 2-1 numbered 3-3 description of 2-1 Page II 131 Iiidex INDEX

MiniWeb button 4-8 T
title box 3-2 Table Description 5-7 Paste icon 3-7 Table is Searchable 5-7 pasting URLs 3-9 Table Name 5-6 pasting URLs to MiniWebs 4-4 tables permissions, setting 5-13 creating 5-6 Protecting URLs 5-12 deleting 5-6 publishing web pages text web pages copying from other pages 3-6 publishing 3-10 titling web pages 3-2 Q U
question mark 2-2 unique column 5-8 quiting NaviPress 2-4 unknown files icon 4-3 R unnumbered lists 3-3 random files URLs icon 4-3 copying 3-9 rc.local 5-2 copying in MiniWebs 4-8 relative link favorite ones, see Hot List 2-3 definition 4-2 pasting 3-9 Relative Links 4-7 pasting to MiniWebs 4-4 Reloading Page 2-3 V
S video file saving MiniWebs 4-8 icon 4-3 saving web pages 3-1 search forms 5-3 W
searching tables and pages 5-3 web icon 3-2 Security 5-11 web page setting costs 5-14 icon 4-3 setting permissions 5-13 web pages Setting the Home Page 4-8 anchors 3-7 Show Border 3-4 copying text 3-6 similar operator 5-3 creating 3-1 sound file editing 3-2 icon 4-3 favorite sites, see Hot List 2-3 Special Styles 3-3 formats 3-2 stop button 2-2 headings 3-3 style sheet links 3-7 ~
icon 4-3 lists 3-3 Style Sheets 3-9 previously opened 2-3 system tables 5-17 saving 3-1 special styles 3-3 Index 132 Page III

WO 96/30846 PCTl1T896/01686 INDEX
= titling 3-2 Page IV 133 Index WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT/1JS96/01686 r WO 96/30846 PCTlUS96101686 bh Sat Mar 25 10:37:09 1995 1 Header Files for all Code ---------------------------------------------------r--r----- 1 gww 862 Jan 31 12:41 auth.h -r--r----- 1 gww 253 Jan 31 12:41 check.h -r--r----- 1 gww 2432 Mar 7 17:59 crud.h -r--r--r-- 1 gww 112 Feb 27 16:33 filetype.h -r--r----- 1 gww 1827 Jan 31 17:40 form.h -r--r----- 1 gww 560 Jan 31 12:41 guess.h -r--r----- 1 gww 551 Jan 31 12:41 lfunc.h -r--r----- 1 doug 1135 Mar 20 18:21 lisp.h -r--r--r-- 1 gww 142 Mar 15 16:41 memmask.h -r--r----- 1 gww 663 Feb 13 19:24 nlp.h -r--r----- 1 gww 2686 Jan 31 12:41 nlpstructs.h -r--r----- 1 jimbo 352 Mar 10 15:27 ns.h -r--r--r-- 1 gww 279 Jan 31 12:41 nsassert.h -rw-r----- 1 doug_ 4874 Mar 23 14:10 nsdefs.h -r--r----- 1 gww 2119 Feb 26 17:28 nsdms.h -r--r----- 1 gww 9554 Feb 8 18:20 nshtml.h -r--r----- 1 gww 3691 Jan 31 12:41 nstypes.h -r--r----- 1 jimbo 1998 Mar 9 20:20 nsunix.h -r--r----- 1 doug 9618 Mar 20 18:21 nsutil.h -r--r----- 1 gww 228 Jan 31 12:41 prefetch.h -r--r----- 1 gww 228 Jan 31 12:41 prefs.h -r--r----- 1 gww 360 Jan 31 12:41 response.h -r--r----- 1 gww 4293 Feb 16 17:56 str.h -r--r----- 1 gww 907 Jan 31 12:41 task.h -r--r----- 1 gww 156 Jan 31 12:41 weblet.h -r--r----- 1 daveb 1823 Mar 24 15:37 xlocal.h -r--r----- 1 gww 1128 Jan 31 12:41 xltfunc.h W0 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 PCTfUS96/01686 dms Sat Mar 25 09:10:41 1995 1 Listing of Data Management Library Routines ------------------------------------------- `
-------------------------------------------Provides vendor independent access to a commercial-off-the-shelf database management system. All database accesses are made through this library layer.

-r--r----- 1 gww 1566 Mar 7 14:47 DM_Cancel.c -r--r----- 1 gww 350 Feb 26 17:28 DM_C1oseDB.c -r--r----- 1 doug 2057 Mar 14 21:59 DM Create.c -r--r----- 1 gww 1688 Feb 26 17:29 DM_DML.c -r--r----- 1 gww 931 Feb 26 17:29 DM Exec.c -r--r----- 1 gww 667 Feb 26 17:29 DM_Flush.c -r--r----- 1 gww 2223 Feb 26 17:28 DM_GetRow.c -r--r----- 1 gww 2161 Feb 26 17:29 DM_OneRow.c -r--r----- 1 gww 4327 Feb 26 17:29 DM_OpenDB.c -r--r----- 1 gww 2209 Feb 26 17:29 DM_Select.c -r--r----- 1 gww 5917 Feb 27 14:02 DM_TableInfo.c -r--r----- 1 gww 1580 Feb 26 17:29 DM_Trans.c -r--r----- 1 gww 2518 Feb 26 17:29 DM_Update.c -r--r----- 1 gww 1737 Feb 26 17:29 dm_StrTrim.c -r--r----- 1 gww 867 Feb 26 17:29 dm error.c WO 96/30846 PCTlUS96101686 lib Sat Mar 25 09:29:36 1995 1 Client Communications Layer ------------------------------------------------------Library that handles all communications tasks from the client to the server (or other servers). Creates, manages and disposes of connection requests and returns responses.

-r--r----- 1 gww 1974 Jan 31 12:33 auth.c -r--r----- 1 gww 3258 Jan 31 12:33 crud.c -r--r----- 1 dave 2302 Mar 20 12:13 crudio.cxx -r--r----- 1 gww 573 Mar 3 12:15 crudshim.c -r--r----- 1 gww 2792 Feb 3 18:23 docrud.cxx -r--r----- 1 gww 5076 Mar 6 12:42 form.c -r--r----- 1 gww 5253 Jan 31 12:35 gif.cxx -r--r----- 1 gww 1148 Jan 31 12:37 gif.h -r--r----- 1 daveb 2283 Mar 10 12:42 gifshim.cxx -r--r----- 1 gww 3936 Mar 23 13:13 guess.c -rw-r----- 1 gww 4150 Mar 23 13:13 guess.c--r--r----- 1 gww 1318 Jan 31 12:36 htstring.h -r--r----- 1 gww 8280 Mar 3 12:16 htutils.h -r--r----- 1 gww 7454 Jan 31 12:33 htuu.c -r--r----- 1 gww 923 Jan 31 12:36 htuu.h -r--r----- 1 gww 996 Mar 3 12:14 lfunc.c -r--r----- 1 gww 85450 Mar 23 17:27 lhtml.c -rw-r----- 1 gww 85399 Mar 23 17:27 lhtml.c--r--r----- 1 gww 9598 Mar 23 13:10 local.cxx -rw-r----- 1 gww 9327 Mar 23 13:10 local.cxx--r--r----- 1 jimbo 260 Mar 10 13:57 lxvt.h -r--r--r-- 1 jimbo 1863 Mar 10 14:06 makefile -r--r----- 1 gww 244 Jan 31 12:35 mem.cxx -rw-rw-r-- 1 gww 1005 Mar 16 18:33 outs -r--r----- 1 gww 939 Jan 31 12:35 response.cxx -r--r--r-- 1 gww 9973 Jan 31 12:38 sk.h -r--r--r-- 1 gww 4097 Jan 31 12:38 skport.h -rw-rw-rw- 1 dave 38920 Mar 23 13:14 str.o -r--r----- 1 gww 2793 Feb 10 18:02 task.cxx drwxrwxr-x 2 gww 512 Feb 24 12:11 tilde -r--r----- 1 dave 32595 Mar 20 12:13 web.cxx -r--r----- 1 dave 4760 Mar 22 14:53 xcomm.c -r--r----- 1 gww 2099 Feb 14 21:56 xcomm.h -r--r----- 1 gww 965 Mar 2 19:00 xdoc.c -r--r----- 1 gww 25653 Mar 23 13:10 xlocal.c -rw-r----- 1 gww 25653 Mar 23 13:10 xlocal.c-Files included for reference:

crud.c . builds crud--create, retrieve, update, delete--structures.
cruds are the main structure to hold requests.

crudio.cxx: handles the client input/output stream.
crudshim.c: runs a task.

docrud.cxx: executes a crud request.

lhtml.c: handles formatting and parsing HTML.

local.cxx: handles local operations (as opposed to remote over the net) response.cxx: routines to handle returns from the server.

str.cxx: routines to handles strands, main 2/O stream.
web.cxx: builds http requests, builds TCP requests.

la.b Sat Mar 25 09:29:36 1995 2 xcomm.c: TCP socket code.

xdoc.c: routine to assist with directories for collections.
xlocal.c: routines to mainpulate file/URL paths cross-platform.

.

nip Sat Mar 25 09:31:43 1995 1 Natural Language Processing Library ----------------------------------------------------------------------Routines to zone html, stem words, tag words.

-r--r----- 1 gww 740 Feb 13 13:49 StemWord.c -r--r----- 1 gww 336 Feb 16 06:51 fsa.h -r--r----- 1 gww 2064 Feb 13 13:49 htmltext.c -r--r----- 1 gww 8147 Feb 13 18:01 htmlzoner.c -r--r----- 1 doug 4407 Mar 20 18:19 lisp.c -r--r----- 1 gww 4060 Feb 13 13:49 morehtml.c -r--r----- 1 gww 3849 Feb 13 17:55 nlp.c -r--r----- 1 gww 1030 Feb 16 06:51 nlpcore.h -r--r----- 1 gww 921 Feb 13 16:54 nlpfile.c -r--r----- 1 gww 4975 Feb 13 13:49 nlpstructs.c -r--r----- 1 gww 2464 Feb 13 13:49 stem.c -r--r----- 1 gww 748 Feb 27 12:27 stopword.c -r--r----- 1 gww 4824 Feb 13 13:49 synparse.c -r--r----- 1 gww 4922 Feb 13 17:55 tag.c -r--r----- 1 doug 360 Mar 20 18:19 testlisp.c -r--r----- 1 gww 1305 Feb 13 17:55 xltfunc.c -r--r----- 1 gww 1113 Feb 16 06:51 xltfunc.h Files included for reference:
None. See prior art.

nsdlib Sat Mar 25 09:35:54 1995 1 Library of Scripts ------------------Routines used for administrative functions of the server.
total 27 drwxrwxr-x 3 gww 512 Mar 23 19:12 drwxrwxr-x 6 gww 512 Mar 23 19:04 drwxrwxr-x 2 gww 512 Mar 23 19:12 RCS
-r--r--r-- 1 doug 1216 Mar 23 14:32 admin.tcl -r--r--r-- 1 gww 1650 Feb 26 18:21 archive.tcl -r--r--r-- 1 jimbo 2330 Mar 23 19:12 chores.tcl -r--r--r-- 1 doug 999 Mar 21 20:53 init.tcl -r--r--r-- 1 gww 3563 Feb 26 18:21 mi.tcl -r--r--r-- 1 gww 4 Feb 26 19:32 reinit.tcl -r--r--r-- 1 gww 262 Feb 26 18:21 return.tcl -r--r--r-- 1 jimbo 9329 Mar 23 19:12 tables.tcl Files included for reference:

archive.tcl: script that implements automatic version history of objects init.tcl: script used to register new operations.
table.tcl: script used to automatically create tables from forms.

WO 96/30846 PCTlUS96101686 nsd Sat Mar 25 09:48:13 1995 1 Main body of the core server and operations - ---------------------------------------------------------------------------------------r--r----- 1 gww 1270 Feb 26 17:22 Archive.c -r--r----- 1 doug 2550 Mar 18 17:03 Bui1dURL.c -r--r----- 1 gww 9468 Feb 28 16:22 Cgi.c -r--r----- 1 doug 856 Mar 18 18:17 DeleteRow.c -r--r----- 1 doug 2293 Mar 23 14:22 Describe.c -r--r----- 1 doug 15054 Mar 23 11:53 FastPath.c -r--r----- 1 gww 843 Feb 26 19:48 GetEntryForm.c -r--r----- 1 doug 31047 Mar 18 21:36 GetForm.c -r--r----- 1 gww 1189 Feb 26 19:48 GetHilitedPage.c -r--r----- 1 gww 606 Feb 26 19:48 GetSearchForm.c -r--r----- 1 doug 2198 Mar 24 11:37 GetSearchFormPicker.c -r--r----- 1 gww 1644 Feb 26 19:48 GetUpdateForm.c -r--r----- 1 gww 2013 Feb 27 14:04 GetUpdateOrEntryForm.c -r--r----- 1 gww 1695 Mar 7 13:55 InsertRow.c -r--r----- 1 gww 1361 Feb 26 19:48 MoreLikeThis.c -r--r----- 1 gww 3248 Feb 26 17:22 Navilink.c -r--r----- 1 doug 2943 Mar 12 22:42 Ng2Hlinks.c -r--r----- 1 gww 3630 Feb 26 17:22 NgAnchorProb.c -r--r----- 1 gww 7461 Mar 5 18:33 Pathname.c -r--r----- 1 doug 9243 Mar 18 15:35 PrintHitlist.c -r--r--r-- 1 gww 419 Mar 1 20:57 SearchCtx.c -r--r----- 1 doug 17735 Mar 18 17:03 SearchQBF.c -r--r----- 1 gww 2807 Feb 26 17:22 Summarize.c -r--r----- 1 jimbo 15750 Mar 20 21:17 TclOp.c -r--r----- 1 gww 14069 Mar 7 13:52 TypeCheck.c -r--r----- 1 gww 464 Mar 7 13:55 UpdateFormLink.c -r--r----- 1 gww 1976 Mar 7 13:55 UpdateRow.c -r--r----- 1 gww 1137 Feb 26 19:48 config.c -r--r----- 1 lori 14655 Mar 21 19:54 dmain.c -r--r----- 1 gww 453 Feb 26 17:22 form2set.h -r--r----- 1 gww 9281 Mar 6 14:11 hilite.c -r--r----- 1 gww 952 Feb 26 17:22 id.c -r--r----- 1 gww 10590 Feb 27 18:26 mergepage.c -r--r----- 1 gww 5229 Feb 26 17:22 nlink.c -r--r----- 1 jimbo 16903 Mar 21 20:32 nsd.c -r--r----- 1 doug 11056 Mar 18 18:17 nsd.h -r--r----- 1 gww 633 Feb 26 17:22 nutil.c -r--r----- 1 gww 3920 Feb 28 15:08 op.c -r--r----- 1 jimbo 3314 Mar 9 19:30 request.c -r--r----- 1 lori 9759 Mar 21 18:42 return.c -r--r----- 1 jimbo 2952 Mar 10 16:01 time.c -r--r----- 1 doug 13103 Mar 12 15:03 urlcheck.c -r--r----- 1 gww 2574 Feb 26 17:22 urlencode.c -r--r----- 1 doug 4218 Mar 21 20:21 urlopen.c Files included for reference:

Describe.c: code that attaches descriptive indexes to addresses Fastpath.c: code that executes default operations, those that are not registered with the server GetForm.c: code to implement autogeneration of forms GetHilitedPage.c: code that highlights search terms in a page MoreLikeThis.c: code that does similarity search on pages Navlink.c: automatic generation of hyperlinks Ng2Hlinks.c: automatic generation of hyperlinks nad Sat Mar 25 09:48:13 1995 2 Ng2AnchorProb.c: automatic generation of hyperlinks TclOp.c: executes scripted operations, extensibility of server TypeCheck.c: verifies datatypes conform to standards for dbms hilite.c: used in highlighting search terms from queries mergepage.c: merges data from dbms into HTML forms, used on db updates nlink.c: automatic generation of hyperlinks nsd.c: main body of the server, place to register new C oeprations verifys sql Sat Mar 25 09:49:40 1995 1 SQL statements to build server DBMS structures -r--r----- 1 gww 1170 Feb 16 07:22 navidrop.sql -r--r----- 1 doug 14303 Mar 18 21:41 nsbuild.sql -r--r--r-- 1 gww 1137 Feb 15 12:26 nsdrop.sql -rw-rw-r-- 1 gww 2877 Feb 1 10:44 rollforward.a9-al0.sq1 Files included for reference:

nsbuild.sql: builds a server DBMS and all of the structures used to manage content, do archiving, use forms with tables, etc.

WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT/US96/01686 util Sat ffiar 25 09:50:29 1995 1 Utility Routines ---------------------------------rw-r----- 1 jimbo 418 Mar 22 10:34 compat.c -r--r----- 1 gww 7640 Feb 13 19:19 dstring.c -r--r----- 1 gww 538 Feb 13 19:19 enquote.c -r--r----- 1 gww 274 Feb 26 17:31 getwd.c -r--r----- 1 gww 25385 Feb 13 19:19 hash.c -r--r----- 1 gww 2715 Feb 28 15:07 log.c -r--r----- 1 gww 294 Feb 26 17:31 match.c -r--r----- 1 gww 16843 Feb 28 15:07 memory.c -r--r----- 1 gww 4621 Mar 2 15:12 set.c -r--r----- 1 gww 2291 Feb 28 15:07 sstack.c -r--r----- 1 gww 344 Feb 13 19:19 trim.c Files included for reference:

None.

WO 96/30846 PCTlUS96101686 Drsss Sat Mar 25 10:29:33 1995 1 Main body of code for the client User interface routines start with NP.
-rw-r--r-- 1 gww 2213 Mar 22 16:11 NPAbout.c -rw-r--r-- 1 gww 3724 Mar 22 16:11 NPAboutW.c -rw-r--r-- 1 gww 3100 Mar 22 16:11 NPAuthen.c -rw-r--r-- 1 gww 3501 Mar 22 16:11 NPChkLnk.c -rw-r--r-- 1 gww 3211 Mar 22 16:11 NPChoose.c -rw-r--r-- 1 gww 2677 Mar 22 16:11 NPDest.c -rw-r--r-- 1 gww 4232 Mar 22 16:30 NPDoc.c -rw-r--r-- 1 gww 6127 Mar 22 16:11 NPDocMn.c -rw-r--r-- 1 gww 2313 Mar 22 16:11 NPError.c -rw-r--r-- 1 gww 4081 Mar 22 16:11 NPFindRp.c -rw-r--r-- 1 gww 3307 Mar 22 16:41 NPForm.c -rw-r--r-- 1 gww 2723 Mar 22 16:11 NPHistor.c -rw-r--r-- 1 gww 4720 Mar 22 16:11 NPHotLst.c -rw-r--r-- 1 gww 4183 Mar 22 16:11 NPImgFld.c -rw-r--r-- 1 gww 3744 Mar 22 16:11 NPInsImg.c -rw-r--r-- 1 gww 2602 Mar 23 15:13 NPLatin.c -rw-r--r-- 1 gww 3512 Mar 22 16:11 NPLink.c -rw-r--r-- 1 gww 7195 Mar 22 16:11 NPMap.c -rw-r--r-- 1 gww 4376 Mar 22 16:11 NPMime.c -rw-r--r-- 1 gww 2697 Mar 22 16:11 NPNewStl.c -rw-r--r-- 1 gww 2930 Mar 22 16:11 NPNvLink.c -rw-r--r-- 1 gww 2561 Mar 22 16:11 NPOpnOpt.c -rw-r--r-- 1 gww 7237 Mar 22 16:30 NPPage.c -rw-r--r-- 1 gww 12323 Mar 23 14:55 NPPageMn.c -rw-r--r-- 1 gww 7958 Mar 22 16:11 NPPalet.c -rw-r--r-- 1 gww 5619 Mar 22 16:11 NPPrfGen.c -rw-r--r-- 1 gww 4030 Mar 22 16:11 NPRadio.c -rw-r--r-- 1 gww 4232 Mar 22 16:11 NPRefBy.c -rw-r--r-- 1 gww 4115 Mar 22 16:11 NPRefTo.c -rw-r--r-- 1 gww 3351 Mar 22 16:11 NPSavOpt.c -rw-r--r-- 1 gww 4812 Mar 22 16:11 NPSe1Lst.c -rw-r--r-- 1 gww 3282 Mar 22 16:11 NPSrc.c -rw-r--r-- 1 gww 1095 Mar 22 16:11 NPSrcMn.c -rw-r--r-- 1 gww 4892 Mar 22 16:11 NPSt1Cha.c -rw-r--r-- 1 gww 3229 Mar 22 16:11 NPStyle.c -rw-r--r-- 1 gww 2844 Mar 22 16:11 NPSubmit.c -rw-r--r-- 1 gww 4624 Mar 22 16:11 NPTaskMn.c -rw-r--r-- 1 gww 5576 Mar 22 16:43 NPTextAr.c -rw-r--r-- 1 gww 4628 Mar 22 16:11 NPTxtFld.c -rw-r--r-- 1 gww 10186 Mar 22 16:11 NaviPres.c -rw-r--r-- 1 gww 48790 Mar 22 16:11 NaviPres.h lrwxrwxrwx 1 root 14 Mar 22 18:48 authentc.c -> raw/authentc.c lrwxrwxrwx 1 root 11 Mar 22 18:48 bkgnd.c -> raw/bkgnd.c lrwxrwxrwx 1 root 14 Mar 22 18:48 callback.c -> raw/callback.c lrwxrwxrwx 1 root 14 Mar 22 18:48 callback.h -> raw/callback.h lrwxrwxrwx 1 root 13 Mar 22 18:48 chooser.c -> raw/chooser.c lrwxrwxrwx 1 root 13 Mar 22 18:48 chooser.h -> raw/chooser.h lrwxrwxrwx 1 root 13 Mar 22 18:48 cursors.h -> raw/cursors.h lrwxrwxrwx 1 root 13 Mar 22 18:48 destdlg.c -> raw/destdlg.c lrwxrwxrwx 1 root 9 Mar 22 18:48 doc.h -> raw/doc.h lrwxrwxrwx 1 root 14 Mar 22 18:48 doccache.c -> raw/doccache.c lrwxrwxrwx 1 root 13 Mar 22 18:48 docedit.c -> raw/docedit.c lrwxrwxrwx 1 root 14 Mar 22 18:48 docgraph.c -> raw/docgraph.c lrwxrwxzwx 1 root 14 Mar 22 18:48 docrefer.c -> raw/docrefer.c lrwxrwxrwx 1 root 13 Mar 22 18:48 docview.c -> raw/docview.c lrwxrwxrwx 1 root 12 Mar 22 18:48 fields.c -> raw/fields.c lrwxrwxrwx 1 root 10 Mar 22 18:48 find.c -> raw/find.c lrwxrwxrwx 1 root 13 Mar 22 18:48 fldedit.c -> raw/fldedit.c lrwxrwxrwx 1 root 10 Mar 22 18:48 func.h -> raw/func.h Dress Sat Mar 25 10:29:33 1995 2 lrwxrwxrwx 1 root 10 Mar 22 18:48 help.c -> raw/help.c lrwxrwxrwx 1 root 14 Mar 22 18:48 historyd.c -> raw/historyd.c lrwxrwxrwx 1 root 14 Mar 22 18:48 hooksmac.c -> raw/hooksmac.c lrwxrwxrwx 1 root 14 Mar 22 18:48 hooksmsw.c -> raw/hooksmsw.c lrwxrwxrwx 1 root 12 Mar 22 18:48 hooksx.c -> raw/hooksx.c lrwxrwxrwx 1 root 13 Mar 22 18:48 hotlist.c -> raw/hotlist.c lrwxrwxrwx 1 root 10 Mar 22 18:48 html.c -> raw/html.c lrwxrwxrwx 1 root 10 Mar 22 18:48 html.h -> raw/html.h lrwxrwxrwx 1 root 14 Mar 22 18:48 htmlerrs.c -> raw/htmlerrs.c lrwxrwxrwx 1 root 14 Mar 22 18:48 imgcache.c -> raw/imgcache.c lrwxrwxrwx 1 root 11 Mar 22 18:48 inits.c -> raw/inits.c lrwxrwxrwx 1 root 13 Mar 22 18:48 keymore.h -> raw/keymore.h lrwxrwxrwx 1 root 14 Mar 22 18:48 linkchck.c -> raw/linkchck.c lrwxrwxrwx 1 root 13 Mar 22 18:48 makemap.c -> raw/makemap.c lrwxrwxrwx 1 root 14 Mar 22 18:48 navilink.c -> raw/navilink.c lrwxrwxrwx 1 root 14 Mar 22 18:48 pagcache.c -> raw/pagcache.c lrwxrwxrwx 1 root 11 Mar 22 18:48 prefs.c -> raw/prefs.c lrwxrwxrwx 1 root 12 Mar 22 18:48 source.c -> raw/source.c -rw-rw-rw- 1 dave 46 Mar 24 16:17 stamp.c lrwxrwxrwx 1 root 13 Mar 22 18:46 stamper.c -> raw/stamper.c lrwxrwxrwx 1 root 11 Mar 22 18:48 style.h -> raw/style.h lrwxrwxrwx 1 root 14 Mar 22 18:46 styledlg.c -> raw/styledlg.c lrwxrwxrwx 1 root 10 Mar 22 18:48 undo.c -> raw/undo.c lrwxrwxrwx 1 root 10 Mar 22 18:48 undo.h -> raw/undo.h lrwxrwxrwx 1 root 9 Mar 22 18:48 url.c -> raw/url.c lrwxrwxrwx 1 root 10 Mar 22 18:48 util.c -> raw/util.c lrwxrwxrwx 1 root 10 Mar 22 18:48 view.c -> raw/view.c lrwxrwxrwx 1 root 10 Mar 22 18:48 view.h -> raw/view.h lrwxrwxrwx 1 root 13 Mar 22 18:48 viewcmd.c -> raw/viewcmd.c lrwxrwxrwx 1 root 13 Mar 22 18:48 viewcol.c ->--raw/viewcol.c lrwxrwxrwx 1 root 14 Mar 22 18:48 viewdraw.c -> raw/viewdraw.c lrwxrwxrwx 1 root 14 Mar 22 18:48 viewedit.c -> raw/viewedit.c lrwxrwxrwx 1 root 14 Mar 22 18:48 viewfrmt.c -> raw/viewfrmt.c lrwxrwxrwx 1 root 13 Mar 22 18:48 viewins.c -> raw/viewins.c lrwxrwxrwx 1 root 14 Mar 22 18:48 viewsave.c -> raw/viewsave.c lrwxrwxrwx 1 root 13 Mar 22 18:48 viewsel.c -> raw/viewsel.c lrwxrwxrwx 1 root 14 Mar 22 18:48 viewutil.c -> raw/viewutil.c lrwxrwxrwx 1 root 13 Mar 22 18:48 winmenu.c -> raw/winmenu.c lrwxrwxrwx 1 root 13 Mar 22 18:48 xvtjpeg.c -> raw/xvtjpeg.c lrwxrwxrwx 1 root 12 Mar 22 18:48 xvtxbm.c -> raw/xvtxbm.c lrwxrwxrwx 1 root 12 Mar 22 18:48 xxinit.c -> raw/xxinit.c Files included for reference:

NPChoose.c: interface for local and remote file chooser NPDoc.c: interface for collections NPDocMn.c: interface for collections menu NPNewStl.c: interface for styles NPNvLink.c: interface for autogeneration of links NPPage.c: interface for page window NPPageMn.c: interface for page menu NPStyle.c: interface for styles chooser.c: local remote file system selection callback.c: client-server communications WO 96/30846 PCTlUS96101686 proe Sat Mar 25 10:29:33 1995 3 doccache.c: used to implement collections docedit.c: used to implement edit functions collections docgraph.c: used to implement graphing of collections docrefer.c: used to implement collections docview.c: used to implement collections navilink.c: used to implement autogeneration of links styledlg.c: used to implement styles viewcmd.c: used to implement copy and paste address functions viewsave.c: read ans writes pages viewedit.c: main page editing functions i.

asdma.h Sua Feb 26 17:28:01 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
** Define symbolic names, constants, and macros ,#ifndef DMS_H
#define DMS_H

#define DM_OK 1 #define DM ERROR 0 #define DM_TRUE 1 #define DM FALSE 0 #define DM_END_DATA 2/* no more data to fetch */
typedef struct {
char *name;
int fired;
void (*action)();
} DM_Alert;
extern void DM_Poll(void);
extern void DM_HandleAlerts(void);
extern int dmSaveError;
extern char *dm_lastoid;
extern int dm Verbose;

** DM External api calls extern int DM_OpenDB(char *server, char *name, char *user, char *pass, DM_Alert *alerts);
extern int DM_ReOpenDB(DM_Alert *alerts);
extern int DM_C1oseDB(void);
extern int DM_Exec(char *query);
extern int DM Create (char *tablename, Ns_Set *form);
extern int DM_Update (char *tablename, Ns_Set *form, char *where);
extern Ns_Set *DM_Select(char *sql);
extern int DM_GetRow(Ns_Set *row);
extern Ns_Set *DM_ZeroOrOneRow(char *sql, int *nrows);
extern Ns_Set *DM_OneRow(char *sql);
extern int DM_Flush(void);
extern int DM_DML(char *sql);
extern int DM_DDL(char *sql);
extern int DM_Begin{void);
extern int DM_End(void);
extern int DM_Abort(void);

** dm_ are internal DMS helper routines extern void dm_panic (char *msg);
extern void dm_error (char *fmt, ...);
extern int clm-error-pop (char **err);
extern void dm_error_flush (void);
extern int dna_StrTrim (char **string);
typedef struct DM_TableInfo {
Ns_Set *info;
int ncolumns;
Ns_Set **columns;
} DM_TableInfo;

extern void DM_InitTableInfo(void);
extern DM_TableInfo *DM_GetTableInfo(char *table);

nadma.h 8na Feb 26 17:28:01 1995 2 #define DM TableValue(t,k) (Ns_SetGet((t)->info,k)) #define DM_TableDescription(t) (DM_TableValue(t,"table_description")) #define DM_TableName(t) ((t)->info->name) v extern int DM_ColuxnnIndex(DM_TableInfo *tinfo, char *name);
#define DM_ColumnCount(t) ((t)->ncolumns) #define DM_ColumnName(t,i) ((i) < 0 ? NULL : (t)->columns[(i)]->name) #define DM_ColumnValue(t,i,k) ((i) < 0 ? NULL : Ns_SetGet((t)->columns[(i)7,k)) #define DM_ColumnType(t,i) (DM_ColumnValue((t),(i),"column_type")) #endif /* DMS_H

nsdefs.h Thu Mar 23 14:10:49 1995 1 #ifndef NSDEFS_H
#define NSDEFS_H
#define NS_R OK 0 #define NS_TeT OK 1 #define NS_OK 1 #define NS_ERROR 0 #define NS_SUCCEED 1 #define NS_FAIL 0 #define NS_TRUE 1 #define NS_FALSE 0 #define NS_ON 1 #define NS_OFF 0 #define NS_ALLOWED 1 #define NS_UNAUTHORIZED 2 #define NS_FORBIDDEN 3 #define NS_GROWBUFSIZE 512 #define NS_DSTRING_STATIC_SIZE 200 #define NS_SQL_BUFSIZE 400 #define NS_MAX_FIELDNAME 64 #define NS_MAXURLSIZE 1024 #define NS_PAGES_SUBDIR "pages"
#define NS_DATP.SUBDIR "data"

#define NS_ADMIN_USERNAME "nsadmin"
#define NS_GRAMMAR_FILE "grammar.dat"
#define NS_FREQLEX_FILE "freqlex.dat"
#define NS_STOPWORD_FILE "stopword.dat"
#define NS_OPERATOR "OP"
#define NS SELECT "SELECT"
/* Server errors */
#define NS_ERR_INVALIDURL "Invalid URL"
#define NS_ERR_NOFORM "Couldn't find form"
#define NS_ERR LSNKNOWN_OPERATION "Daemon can't handle operation"
#define NS_ERR_MISSING_OPERATION "URL didn't contain an operation"
#define NS_ERR_NOSEARCHDATA "No Search data passed in"
#define NS_ERR NOSHFS "No Search Hit format String"
#define NS_ERR_NOPAGE "No page submitted"
#define NS_ERR_BADFORM "Form data incompatible with this server."
/* Known operations */

#define NS_OP_UrlPrefix "NS"

#define NS_OP_GetSearchFormPicker "GetSearchFormPicker"
#define NS_OP_GetSearchForm "GetSearchForm"
#define NS_OP_SearchQBF "SearchQBF"
#define NS_OP_GetLocalHilitedPage "GetLHP"
#define NS_OP_GetRemoteHilitedPage "GetRHP"
#define NS_OP_MoreLikeThis "MoreLikeThis"
#define NS_OP_Navilink "SmartLink"
#define NS_OP_GetLoadForm "GetLoadForm"
#define NS_OP_GetEntryForm "GetEntryForm"
#define NS_OP_GetUpdateForm "GetUpdateForm"
#define NS_OP_GetUpdateOrEntryForm "GetUpdateOrEntryForm"
#define NS OP_InsertRow "InsertRow"
#define NS_OP_UpdateRow "UpdateRow"
#define NS_OP_DeleteRow "DeleteRow"
#define NS OP GetCollections "GetCollections"
#define NS_OP_GetMetaTables "GetMetaTables"
#define NS_OP_Admin "Admin"

WO 96/30846 PCTlUS96101686 aadAfa.h Thu Mar 23 16:10:49 1995 2 #define NS_OP_GetAsset "Asset"
#define NS_OP_About "About"
#define NS_OP_Permissions "ns_permissions"
#define NS_OP_Cost "ns_costs"
#define NS_METHOD GET "GET"
#define NS_METHOD_PUT "PUT"
#define NS_METHOD_POST "POST"
#define UrlOperation(urlv) (urlv[l]) #define UrlTable(urlv) (urlv[2)) #define UrlRowid(urlv) (urlv[3]) #define NS_FORM_SEPARATOR
#define NS_FORM_PREF_KEY "Pref"
#define NS_FORM_OPERATOR_KEY "ColOperator"
#define NS_FORM_VALUE_KEY "ColValue"
#define NS_FORM_SELECTED_KEY "ColSelected"
#define NS_FORM_QINFO_KEY "Querylnfo"
#define NS_FORM_EINFO_KEY "EntryInfo"
#define NS_FORM_ORDERBY_KEY "OrderBy"
#define NS_FORM_ORDERBY_NONE_KEY "(no ordering)" /* Visible to user! */
#define NS_FORM DISTINCT_KEY "Distinct"
#define NS_FORM_IFT_KEY "IndexFullText"
#define NS_FORM_ROWID_KEY "RowID"
#define NS_FORM_COLLVALUE_KEY "CollectionValue"
#define NS_FORM_COLLOPERATOR_KEY "CollectionOperator"
#define NS_FORM_URL_KEY "Url"
#define NS_FORM_HIDE_KEY "Hide"
#define NS_FORM_TIME_KEY "time"
#define NS_FORM_AMPM_KEY "ampm"
#define NS_FORM AM "AM"
#define NS_FORM PM "PM"
#define NS_FORM_YEAR_KEY "year"
#define NS_FORM MONTH_KEY "month"
#define NS_FORM_DAY_KEY "day"

#define NS_COLLECTIONS_TYPE "text/x-ns-collection-list"
#define NS KEY FIELD "oid"

#define NS_CONFIG_TABLE "ns_config"
#define NS_PREFS_TABLE "ns_preferences"
#define NS_URL_COLUMN "ns_url"
#define NS_BODY_COLUMN "ns_body"
#define NS_TITLE_COLUMN "ns_title"
#define NS FIRSTTERM "NSFIRSTTERM"

/* hash table stuff #ifndef _CLIENTDATA
# ifdef _STDC_ typedef void *ClientData;
# else typedef int *ClientData;
# endif /* _STDC_ #define _CLIENTDATA
#endif #define NS_SMALL_HASH_TABLE 4 + /*
* Acceptable key types for hash tables:

nsdsfs.h Thu Mar 23 14:10:49 1995 3 #define NS_STRING_KEYS 0 #define NS_ONE_WORD_KEYS 1 #define NS_HTMLTAG_TYPE_SELECTSQL "SELECTSQL"
#define NS_HTMLTAG_TYPE_SELECTSQLORNULL "SELECTSQLORNULL"
#define NS_HTMLTAG_TYPE_SELECT "SELECT"
#define NS_HTMLTAG_TYPE_SELECTORNULL "SELECTORNULL"
#define NS_HTMLTAG_TYPE_RADIO "RADIO"
#define NS_HTMLTAG_TYPE_RADIOORNULL "RADIOORNULL"
#define NS_HTMLTAG_TYPE_TEXTAREA "TEXTAREA"
#define NS_HTMLTAG_TYPE_INPUT "INPUT"
#define NS_HTMLTAG_TYPE_AUTOINCR "AUTOINCR"
#define NS_ASSET_RULE "rule.gif"
#define NS_ASSET_BULLET "bullet.gif"
#define NS_ASSET_SEARCH_FORM_HEADER "SearchFormHeader.gif"
#define NS_ASSET_ENTRY_FORM_HEADER "EntryFormHeader.gif"
#define NS_ASSET_UPDATE_FORM HEADER "UpdateFormHeader.gif"
#define NS_ASSET_SEARCH_RESULTS_HEADER "SearchResultsHeader.gif"
#define NS_ASSET_SEARCH=FORM_HELP "SearchFormHelp.html"
#define NS_ASSET_METADATA_HEADER "MetadataHeader.gif"
#define NS_ASSET_SEARCHABLE_TABLES "SearchableTables.gif"
#define NS_RULE "<IMG SRC=\"/NS/Asset/" NS_ASSET_RULE "\">"
#define NS_BULLET "<IMG SRC=\"/NS/Asset/" NS_ASSET_BULLET "\" ALIGN=Middle>"
#endif NSDEFS_H

WO 96/30846 PCTlUS96101686 ~ crud.h Tue Mar 7 17:59:44 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#ifndef CRUD_H
#define CRUD_H
#ifdef _cplusplus extern "C" {
#endif #include "auth.h"
#include "form.h"
#define Ns Connection Crud typedef struct desc {
Auth *auth;
Form *form;
} Desc;

typedef enum {C, R, U, D, X, B) crudtype;
typedef struct crud {
/* internals */
struct crud *next, *prev;
/* crud stuff */
crudtype type;
Auth *auth;
char *url;
char *method;
char *queryString;
char *protocol;
Form *form;
/* input strand id */
int sid;
/* output callback */
int (*func)(void int);
int (*part)(void *, int);
void *ctx;
/* comm context */
void *comm;
char status[Ox100];
long since; /* date for reload int abort : 1;
int info : 1; /* only want strandinfo int reload : 1; /* check if newer than cache int navisoft : 1; /* connected to NaviSoftware char *refered_by; /* Url (or comment) of where we came from*/
} Crud;

#define CrudUrl(c) (c->url != NULL ? c->url : c->form->URL) * create forms, append fields to them, and delete them * - all char *'s are copied /* form: the description */
Crud *CreateCrud(char *url, Desc *desc, int sid);
Crud *UpdateCrud(char *url, Desc *desc, int sid);
/* delete w/ default authorization Crud *DeleteCrud(char *url);
. /*
if URL is given, GET url crud.h Ta Mar 7 17:59:44 1995 2 otherwise use Form to build a request for HTTP:
<ISINDEX> -> RetrieveCrud("", [url / GET / {:"search string"}]) <IMG ISMAP> -> RetrieveCrud(-', [url / GET / (;"x,y")]) <INPUT TYPE="SUBMIT">
-> RetrieveCrud("", [url / GETIPOST / (name:value ...)]) for Others:
define form mapping?

Crud *RetrieveCrud(char *url, Form *form);

/* 'browse' the url... nonstandard, for our choosers Crud *BrowseCrud(char *url);

QueueCrud: start the I/O for this crud, frees on completion calls func(ctx,sid) on completion SyncCrud: force a crud to complete, frees storage aborts if func(ctx) returns non-zero returns "succes" of operation???
AbortCrud: abort a crud, frees storage returns false if crud already complete Crud *QueueCrud(Crud *crud, int (*func)(void *,int), void *ctx);
int SyncCrud(Crud *crud, int (*func)(void *), void *ctx);
int AbortCrud(Crud *crud);

void CrudRundown(void); /* wait for all outstanding cruds /* for command-line type programs -- run the cruds that have been queued void RunCruds(int verbose);
#ifdef _cplusplus }
#endif #endif WO 96/30846 PCTfUS96f01686 .
a1petrncts.h Tuo Jaa 31 12:41:13 1995 1 #ifndef NLPSTRUCTS_H
#define NLPSTRUCTS_H
/* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
/* nlpstructs.h Definitions for nlp structures and Routines for allocating, deallocating, and printing out these structures /* Structure definitions typedef struct backpointer { /* HTML-specific int StartPnum;
int EndPnum;
Para *para; /* for starting pnum int StartOffset;
int EndOffset;
} BackPointer;
typedef struct token {
char *string;
char *stem; ' BackPointer *bp;
int pos;
} Token;

#define SENTENCE 0 #define SECTION 1 /* Express is deterministic today. No ambiguity is preserved. We'll start preserving it when we have good ways of actually resolving it.
typedef struct express {

List *lexical; /* Just stemmed, non-overlapping tokens with POS.
* We'll move to registers, and maybe some pattern * matching when we need to.

List *syntactic; /* Current version just lists of tokens;
* We'll move to real trees when we need to.
/* Semantic and ResolvedSemantic will be added later } Express;

typedef struct textobj {/* Superclass of Sentence and Section int type;
BackPointer *bp;
Express *express; /* Only sentences List *title; /* Only sections have titles List *sub; /* Only sections have sub textobjs } Textobj;
/********r*******************************************************/
/* Memory allocation and deallocation stuff for structures:
/***********************:****************************************/
Textobj *NewSection();
Textobj *NewSentence();
void FreeTextobj (Textobj *textobj);
Express *NewExpress (List *tokens, List *phrases);

WO 96/30846 PCTlUS96/01686 nlpstructs.h Tue Jan 31 12:41:13 1995 2 void FreeExpress (Express *express);
void FreeLexicalExpress (Express *express);
void FreeSyntacticExpress (Express *express);
void FreeNg (List *ng);

Token *NewToken (char *string, BackPointer *bp);
void FreeToken (Token *token);

BackPointer *NewBackPointer(int startpnum, int endpnum, Para *para, int startoffset, int endoffset);
void FreeBackPointer (BackPointer *);
/+****+***++*+**+***++*++*4w+*n*+**++*+*+++++++++++++++++R++1e++++/
/* Printing routines for structure:
/+++++**+****++++++*+**+***+++**++*+*++****+**+**+*+**+**++******/
Token *PrintTokenLong (Token *token);
Token *PrintTokenShort (Token *token);
List *PrintTokensShort (List *tokens);
BackPointer *PrintBP (BackPointer *bp);
Textobj *PrintTextobj (Textobj *textobj, int in);
Textobj *PrintSection (Textobj *textobj, int in);
Textobj *PrintSentence(Textobj *textobj, int in);
void indent(int n);

int NgPnum(List *ng);
int NgStart(List *ng);
int NgLength(List *ng);
#endif /*NLPSTRUCTS_H*/

WO 96/30846 PCTlUS96101686 nohtml.h Wed Fab 8 18:20:36 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#ifndef HTML_H
#define HTML_H
#ifdef _cplusplus extern "C" {
#endif /* Structuring tags #define HTML_TAG Ox0 /* Encloses all HTML documents #define BODY_TAG Oxi /* Encloses the interesting stuff #define HEAD_TAG 0x2 /* Encloses the header */
#define PLAINTEXT_TAG Ox3 /* Everything after this is literal /* Header tags */
#define HEAD_START Ox10 #define ISINDEX_TAG Ox10 /* Searchable document #define LINK_TAG Oxll /* Standard link, not clearly defined*/
#define BASE_TAG Ox12 /* original version of doc, resolves relative URLs #define META_TAG 0x13 /* To be included in HTTP header #define TITLE_TAG Ox14 /* Title of doc #define NEXTID TAG Ox16 /* Eh?
/*--- experimental ---*/
#define REFRESH_TAG Ox15 /* live feed refresh /*--- experimental ---*/

#define HEAD_END Ox16 /* Comment tag, I believe this is depreciated #define COMMENT_TAG 0x20 /* Encloses a comment /* Paragraph tags /* Lists of things #define PARA_START 0x30 #define DII2_TAG Ox30 /* Depreciated */
#define DL_TAG Ox3l #define DLC_TAG 0x32 /* Eh?
/*#define MENU_TAG 0x33*/ /* Depreciated #define OL_TAG 0x34 #define UL_TAG 0x35 /* Things which take paragraph lists #define PLISTTAG_START 0x36 #define BLOCKQUOTE_TAG Ox36 #define LISTING_TAG Ox37 #define PRE_TAG 0x38 #define ADDRESS_TAG Ox39 #define DD_TAG Ox3a #define DT_TAG Ox3b #define LI_TAG Ox3c #define FORM TAG Ox3d #define H1_TAG Ox4l #define H2_TAG 0x42 #define H3_TAG 0x43 #define H4_TAG Ox44 #define H5_TAG 0x45 #define H6_TAG 0x46 #define H7_TAG 0x47 #define PLISTTAG_END 0x47 /* Paragraph items */
#define P_TAG 0x48 #define PARA_END Ox4a /* Import & Linking tags #define A TAG Ox50 #define IMG_TAG Ox51 aahtml.h Wed rsb 8 18:20:36 1995 2 /* Formating tags #define BR_TAG 0x60 #define NOBR_TAG Ox61 #define WBR_TAG 0x62 #define CENTER_TAG 0x63 #define FONT_TAG 0x64 #define BASEFONT_TAG 0x65 #define HR_TAG Ox66 /* Style tags */
#define STYLE_START B_TAG
#define B_TAG Ox7l #define CITE_TAG 0x72 #define CODE_TAG Ox73 #define DFN_TAG Ox74 #define EM_TAG 0x75 #define I_TAG 0x76 #define KBD_TAG 0x77 #define SAMP_TAG Ox79 #define STRONG_TAG Ox7a #define SUB_TAG Ox7b #define SUP_TAG Ox7c #define TT_TAG Ox7d #define U_TAG Ox7e #define VAR_TAG Ox7f #define XMP_TAG 0x80 #define STYLE_END XMP_TAG
/* Things inside of forms */
#define INPUT_TAG 0x88 #define TEXTAREA_TAG 0x89 #define SELECT_TAG Ox8a #define OPTION_TAG Ox8b /* HTML + Tags */
#define EMPH_TAG OxcO HTML+: Generic emphasis #define EMBED_TAG Oxcl /* Contents passed to filter determined by TYPE at tr (MIME) */
#define SP_TAG Oxc2 /* Unbreakable space #define FIG_TAG Oxc3 /* Figure, takes SRC */
#define FIGA_TAG Oxc4 /* Figure anchor */
#define ICON_TAG Oxc5 /* Small graphics? takes src #define TBL_TAG Oxc6 /* Table: tt, th, td */
#define PANEL_TAG Oxc7 /* Floating panel of text #define GROUP_TAG Oxc8 /* Hierarchical grouping /* End Tag */
#define END_TAG Oxfd /* Ends a nested entity /* Unknown Tag */
#define UNKNOWN_TAG Oxfe /* Error Tag */
#define ERROR_TAG Oxff #define HTML_MARK '\177' /* Mark indicating a tag #define HTML_LEN_LOW 2 #define HTML_LEN_HIGH 1 #define HTML_POS_TAG 3 #define HTML_END_TAG 4 #define HTML_ERROR_HIGH 4 #define HTML_ERROR_LOW 5 #define HTML_ERROR_ARG 6 nShtml.h Wed 8ab 8 18:20:36 1995 3 #define HTML_HEAD_LEN 4 /* Not included in len #define HTML_END_LEN 5 /* The len of an END_TAG is always 1 #define HTML_ERROR_LEN 7 /* The len of an ERROR is always 3*/
/* HTML_MARK, 2 bytes of size, 1 byte of tag, random data */
/* Attributes structure for the various tags #define VAL_NONE 0 #define VAL_STR I
#define VAL_NUM 2 struct attribs {
char *name;
unsigned int value: 2;
unsigned int present: 1;
short len;
char *val;

/* Structures to contain latinl character to name mappings struct chartab {
char *name;
int ch;

struct unknownchartab {
int ch;
char *str;

/* Structures for the html page typedef struct para {
struct para *post;
struct para *parent;
struct para *first;
char *text;
short tien, tmax;
char *tagtext;
short pnum; /* Paragraph number within page unsigned char tag;
unsigned int isindex: 1; /* Is this FORM auto generated from an ISINDEX*/
unsigned int fake: 1; /* Psuedo para inside preformatted text } Para;

typedef struct htmlpage {
char *url; /* URL for this page, may be a local filename */
char *docname; /* URL of document containing us char *title;
char *style; /* URL for style sheet char *upl; /* URL's for standard links */
char *uptit; /* Titles for standard links char **otherlinks; /* contents of non-standard links */
char *base; /* L7RL for BASE (whatever) */
char **headerinfo; /* Any stuff we did not understand short *headererrs; /* Any errors */
char *headerargs; /* Errors argument short *trailerrs; /* Any after text?
char *trailargs;
unsigned int isindex: 1;
unsigned int haderrors: 1;
unsigned int mcomextensions: 1;
Para *first;
char,*iiprompt; /* prompt string for header isindex tag /*--- experimental ---*/
long refresh; /* live feed refresh */
- /*--- experimental ---} HtmlPage;

ashtml.h Wed !eb 8 18:20:36 1995 4 #define HTM_ERR_BADAMP 1 /* & followed by invalid escape sequence #define HTM_ERR_NOGT 2 /* A termination tag had attributes */
#define HTM_ERR_MISTAG 3 /* A termination tag did not match the opening tag it should have */
#define HTM_ERR_TAGEOF 4 /* An EOF was read before the closing >
#define HTM_ERR_ATTRS 5 /* An attribute was given to a tag which has none #define HTM_ERR_BADATTR 6 /* A bad attribute was given to a tag #define HTM_ERR_NOQUOTE 7 /* No closing quote for an attribute's value #define HTM_ERR_NOVALUE 8 /* No value given for attribute that needs one #define HTM_ERR_BADVALUE 9 /* Value given for attribute that shouldn't have o ne */
#define HTM_ERR_BADHEADER 10 /* Body item found in header #define HTM_ERR_BADBODY 11 /* Header item found in body #define HTM_ERR_TRAILCH 12 /* Characters found after page end */
#define HTM_ERR_BADNEST 13 /* Some tags not closed */
#define HTM_ERR_TAGINTITLE 14 /* Tag within a title tag #define HTM_ERR_BADTAGINBODY 15 /* HEAD, BODY, or HTML tag found inside BODY
*/
#define HTM_ERR_UNKNOWN 16 /* Unknown HTML tag found */
#define HTM_ERR_TOOBIG 17 /* Paragraph too big typedef struct nestinfo ( unsigned char *nesting; /* tags of all nested things */
unsigned char **tagtext; /* text associated with 'em short ncnt, nmax;
} Nestlnfo;
/**** external defn's ****/
/* stream functions typedef struct {
int state;
FILE *fp;
} textblob;
extern int text2html(textblob *);
extern int parse_file(FILE *);
extern int parse_string(char **);

extern HtmlPage *FillHtmlPage(HtmlPage int(*)(void *), void *);
extern WriteHtmlPage(HtmlPage int, int(*)(void *,int), void *);
extern WriteHtmlBody(HtmlPage int(*)(void *,int), void *);
extern void KillHtmlPage(HtmlPage *);

#ifndef PROTOTYPE
#define PROTOTYPE(x) x #endif #ifndef XVT_CALLCONVI
#define XVT_CALLCONVI
#endif /* Exported routines /* lhtml.c */
extern void XVT_CALLCONVI initcharnames PROTOTYPE((void));
extern void XVT_CALLCONVI cleanupparser PROTOTYPE((void));
extern int XVT_CALLCONV1 HtmlPage2File PROTOTYPE((struct htmlpage *,char *,int));
extern char * XVT_CALLCONVI HtmlPage2Str PROTOTYPE((struct htmlpage *, int ));
extern int XVT_CALLCONVI HtmlPage2URL PROTOTYPE((struct htmlpage *,char *));
extern int XVT_CALLCONVI ParaPreformatted PROTOTYPE((struct para *));
extern void XV'P_CALLCONVI ParaListFree PROTOTYPE((struct para *));
extern int HTML_AttrValue(int tag, char *name);
extern int _HTML_HasAttr(char *str,int len,int tag,char *output,int osize,char *name);
extern int XVT_CALLCONV1 HTML_HasAttr PROTOTYPE((char *,char *,int,char *));
extern int XV'P_CALLCONVI HTML_HasAttrStr PROTOTYPE((char *,int,char *,int,char *));

WO 96/30846 PCTlLTS96101686 r IIshtml,.h Wed 8@b 8 18:20:36 1995 5 extern struct attribs * XVT_CALLCONVI HTML GetAttrs PROTOTYPE((char *));
extern char * %VT_CALLCONVI TagSkipToEnd PROTOTYPE((char *));
extern int XVT_CALLCONV1 TagHasWidth PROTOTYPE((char *));
extern int XVT_CALLCONVI TagIsField PROTOTYPE((char *));
extern int XvT_CALLCONV1 TagLen PROTOTYPE((char *));
= extern int XVT_CALLCONV1 Taglncr PROTOTYPE((char *));
extern char * XVT_CALLCONV1 TagGetName PROTOTYPE((int));
extern int XVT_CALLCONV1 TagNeedsTerminator PROTOTYPE((int));
extern int XVT_CALLCONVI TagIsPara PROTOTYPE((int));
extern char * XVT_CALLCONVI HTML_last PROTOTYPE((char *));
extern int XVT_CALLCONt71 HTML_len PROTOTYPE((char *));
extern int XVT_CALLCONV1 HTML_tag PROTOTYPE((char *));
extern int XVT_CALLCONVI HTML_plain PROTOTYPE((char *));
extern int XVT_CALLCONVI HTML_matched PROTOTYPE((char *,int));
extern void SVT_CALLCONV1 HTML_Fi11Tag(char *buf, int tag);
extern void XVT_CALLCONVI HTML_Fi11EndTag(char *buf, int tag);
extern struct chartab *XV7_CALLCONV1 HTML_charnames PROTOTYPE((void));
extern char * LatinlCharName PROTOTYPE((int));
extern char * local2latinl(char *);
extern char * latin121oca1(char *);

extern void XVT_CALLCONVI _FindNesting PROTOTYPE((struct para *,int,struct nestinfo *));
extern void XVT_CALLCONVI FindNesting PROTOTYPE((struct para *,int,struct nestinfo *));
extern int XVT_CALLCONVI TagActive PROTOTYPE((struct para *,int,int tag));

#ifdef _cplusplus }
#endif #endif /* HTML_H */

atr.h Thu Fab 16 17:56:54 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#ifndef STRAND_H
#define STRAND_H
#include <stdio.h>
#include <stdarg.h>
#if defined(THINK_C) 11 defined(THINK_CPLUS) # include <Types.h>
#else # include <sys/types.h>
#endif #include <time.h>
/* metadata about a strand...
struct strandinfo {
int status;
const char *type;
unsigned long size;

time_t date; /* when we got it time_t lastmod; /* could be a file time_t expires;

int modifyable : 1;
int naviserver : 1;
const char *document;

/* a fake type for the "C" interfaces struct cstr;

#ifdef _cplusplus typedef enum {mem, disk, web, info) loc;
time_t fudge(time_t,time_t); // figure a reasonable expiration given lastmod class strand {
static int nextserno;
static strand *sids;
static strand *caches;
void remlist();
void addlist(strand **);
void expire();
int serial;
protected:
int status;
char *type;
unsigned long size;

time_t date; when we got it time_t lastmod; maybe it.s a file time_t expires;
int modifyable : 1;
int naviserver : 1;
char *document;
loc from, current;
int refcnt, dirty;
char *storage;
char *filename;
char *url;

strand **list; what list are we on str.h Thu aab 16 17:56:54 1995 2 strand *next;
char *cacheurl; // what url it is under in the cache = void *cachebrand;

strand(strandinfo *, loc);
-strand();

int gensid();
static strand *cached(char void *);
public: /* GWW */
static strand *find(int);
protected:

void addref();
void delref();
void *ctx;
friend class iostrand;
friend class rstrand;
friend class wstrand;
public:
inline int serno() { return(serial); }
inline time_t expireat() { return(expires ? expires (lastmod ? fudge(lastmod,date) : date));
static void reaper();
static int flush(char *);
static int cache(int, char *, void *);
static int checkfor(char *, void *, int);
extern "C" {
#endif void CacheReap();
int CacheFlush(char *);
int CacheCheckFor(char *, void int );
int ValidInCache(char *);
#ifdef _cplusplus }

class iostrand {
protected:
int valid;
strand *s;
unsigned long cur, max;
FILE *fp;

void open(strand *);
public:
iostrand();
-iostrand();
void iorewind();
void close(int);

inline int operator()() { return valid;
inline int status() { return s->status;
inline const char *type() { return s->type;
inline unsigned long size() { return s->size; };
inline time_t date() { return s->date; };
inline time_t lastmod() { return s->lastmod;

str.h Thu Feb 16 17:56:54 1995 3 inline time_t expires() { return (s->expireat()); }
inline int modifyable() { return s->modifyable; }
inline int naviserver() { return s->naviserver; }
inline const char *document() { return s->document; }
inline int serial() { return s->serno();

class rstrand : public iostrand {
char *url;
public:
rstrand();
-rstrand();
int open(char *); // only cached stuff int open(int);

long available();
int read();
int read(char *, int);
int getline(char *,int);
int file(FILE *);

char *tofile(;
void *context();
void close(void *);
extern "C" {
#endif struct cstr * RsOpenCache(char *, struct strandinfo *);
struct cstr * RsOpenId(int, struct strandinfo *);
int RsReadC(struct cstr*);
int RsReadBuf(struct cstr*, char *, int);
int RsGetLine(struct cstr*, char *, int);
void RsRewind(struct cstr*);
int RsFillFile(struct cstr*, FILE *);
char *RsForceFile(struct cstr*);
void *RsContext(struct cstr*);
void RsCloseWCtx(struct cstr*, void *);
void RsClose(struct cstr*);
int RsId(struct cstr *);
#ifdef _cplusplus }
class wstrand : public iostrand {
void overflow(long);
public:
-wstrand();
int create(int, const char *);
int create(strandinfo *, loc);
int write(char);
int write(char *);
int write(char * int);
int print(char ...);
int vprint(char va_list);
int file(FILE *);
int info();
int snapshot(;
int closeO;
void forget();

WO 96/30846 PCTlUS96101686 str.h Thu Beb 16 17:56:54 1995 4 - };

. extern "C" {
#endif struct cstr* WsCreate(int, const char *);
struct cstr* WsCreateInfo(struct strandinfo *);
int WsPutC(struct cstr*, int);
int WsPutStr(struct cstr*, char *);
int WsPut73uf(struct cstr*, char *, int);
int WsPrint(struct cstr*, char * ...);
int WsPutFile(struct cstr*, FILE *);
int WsClose(struct cstr*);
void WsForget(struct cstr*);
int _info(char * ...);
#ifdef _cplusplus }
#endif #endif taak.h Tuo Jan 31 12:41:14 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved- */ I
#ifndef TASK_H
#define TASK_H
#ifdef _cplusplus class task task *par, *sib, *son;
protected:
finish(int = 0);
run(int = 0);
block(int = 0);
public:
int state;
void *pstate;
int ready : 1;
int prog : 1;
int done : 1;
static task *root;
task(task *);
virtual -task ( ) ; -int tickle();
task *iterate(int (*)(void task *), void *);
virtual int partial();
virtual int complete();
class ctask : public task {
void *ctx;
int (*part)(void *);
int (*cmplt)(void *);
public:
ctask(void *, int, int (*)(void *), int (*)(void *));
-ctask();

int partial();
int complete();
extern "C" {
#endif void AddTaskSeeCrudsRun(void *, int);
void AddTask(void int, int (*)(void *), int (*)(void *));
int RunTasks();
#ifdef _cplusplus #endif #endif WO 96/30846 PCTlUS96101686 callback.h Mon Mar 20 13z47:49 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#ifndef CALLBACK_H
#define CALLBACK_H
#include "view.h #include "style.h"
#include "crud.h"
#include "prefetch.h"
typedef struct _formctx {
View *view;
Form *form;
char *url;
char *origurl;
char *anchor; /* Location within page Image *image;
STYLE *sheet;
char *toname; /* For copying struct document *doc; /* For copying void *codec; /* for decoding inlines struct cstr *rs;
unsigned int noshow: 1; /* Should we create a view or just cache it? */
unsigned int newview: 1; /* Create a new view even if we've got one unsigned int toclip: 1; /* Save content type */
unsigned int fromclip: 1; /* Use saved content type int open_type; /* See OPEN_* below. Open dialogue let's us /* specify disposal directly */
} formctx;
struct savectx {
Page *page;
char *url;
View *view;
Form *form;
struct cstr *rs;
unsigned int dobase : 1;
unsigned int navilink : 1;

struct docsavectx {
char *url;
struct document *doc;
struct cstr *rs;
struct copyctx {
struct cstr *rs; /* Strand to copy struct document *doc; /* Once copied, update this doc char *toname; /* URL we think we are writing to char *url; /* Actual relocated url char *oldtype; /* si.type for rs above */
View *view;

struct browsectx {
char *url;
WINDOW w;

int form_callback(void *vctx, int rid);
int page_callback(void *vctx, int rid);
int copycallback(void *vctx, int rid);
int pagesaveback(void *vctx, int rid);
int docsaveback(void *vctx, int rid);
int image_callback(void *vctx, int rid);

callback.h Mon Mar 20 13:47:49 1995 2 int _SyncCrud(Crud *); ~
#define OPEN_DEFAULT 0 #define OPEN_FiTML 1 #define OPEN TEXT 2 #define OPEN_DOCUNlENT 3 #define OPEN_SAVE 4 #define OPEN_FILTERS 5 /* And higher #endif CALLBACI(_H

WO 96130846 PCTlLTS96/01686 doc.h ffion Mar 13 12:59:04 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
struct docpartlink;

= typedef struct docpart {
struct docpart *another;
char *relurl;
char *title;
char *contenttype;
struct docpart *up;
struct docpart *style;
struct docpart *beside;
struct docpartlink *refers_to;
struct docpartlink *refered_by; /* Links && styles */
struct docpartlink *downs; /* All pages we are UP-to RCT bb, tbb;
short as;
short sublen;
short level;
unsigned int userplaced: 1;
unsigned int levelassigned: 1;
unsigned int besided: 1; /* already used in the beside list unsigned int exists: 1; /* Someone might link to it without it existing unsigned int external: 1; /* Not part of document, we have a down link none-the-less */
unsigned int needsplacing: 1;
unsigned int needsdrawing: 1;
unsigned int upneedsdrawing: 1;
unsigned int styleneedsdrawing: 1;
unsigned int out_of_date: 1;
unsigned int hidden: 1:
unsigned int upboth: 1;
struct page *loaded; /* Not everything can have a page double angle;
} DocPart;

typedef struct docpartlink {
struct docpart *page;
struct docpartlink *next;
unsigned int from_list: 1;
unsigned int inlined_image: 1;
unsigned int bothways: 1;
unsigned int formlink: 1;
unsigned int toexternal: 1;
unsigned int needsdrawing: 1;
unsigned int ticked: 1;
unsigned int upboth: 1;
} DocPartLink;

typedef struct document {
char *name; /* Directory name, or url char *title; /* not used */
DocPart *first, *last;
enum graph_type graph_type;
unsigned int dirty: 1;
unsigned int modifyable: 1;
unsigned int new: 1;
unsigned int askedfordelete: 1;
unsigned int anydirt: 1;
unsigned int saveasdone: 1;
unsigned int savesucceded: 1;
unsigned int loadsucceded: 1;
char *style;
char *template;
enum filename_type nametype;

doc.h Mon Mar 13 12:59:04 1995 2 struct docview *docview;
struct document *next;
} Document;

typedef struct docview int tag;
WINDOW w;
WINDOW pane;
WINDOW refers_to;
WINDOW referenced_by;
int width, height; /* Of the window Document *doc;
DocPart *externals;
DocPart **levels;
DocPart **levelnext;
int *levelcnt;
int *levelradius;
short curl, maxl;
DocPart *unattached;
int unattachedcnt;
int totwidth, totheight;
int offtop, offleft; /* these are screen pixels short reduction, expansion;
DocPart *selected;
DocPart *undercursor;
unsigned int windowmenu_dirty : 1;
unsigned int mousedown 1;
unsigned int dragging 1;
unsigned int drag_out : 1;
short int off_x, off-Y; /* in screen coords short clickcnt;
PNT press_pnt;
int stop_state;
WINDOW stat; /* Let's do our own status bar */
char stat_text[2007;
} DocView;

-._ _ ... ... .. _ . . . .. . . . _. - = _ .___ _ . _. .

chooeer.h Wed Feb 22 15:50:59 1995 1 - /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#include "crud.h"

struct chooserinfo {
int prompt_rid;
char *name;
int size;
int chooser_type;
int (*func)(void *,char *,struct chooserinfo *);
void *ctx; /* Usually a view/docview, but a WINDOW for NEWWEB,STYLE
/* and a mapinfo * for MAPLINK
int _as_type; /* For openas/saveas unsigned int first_browse 1;
unsigned int second_browse : 1;
unsigned int saveimages : 2; /* Needs to be 2 unsigned int fullurl : 1;
unsigned int fullurlobserved : 1;
unsigned int locked 1; /* no functional data unsigned int enabled : 2; /* Default button is enabled unsigned int looks_like_dir : 2;
unsigned int desktop : 1; /* we're on the Mac desktop unsigned int inminiweb 1;
Crud *crud;
WINDOW w;

#define CHOOSER_OPEN 0 #define CHOOSER_DELETE 1 #define CHOOSER_IMPORT 2 #define CHOOSER_SAVEPG 3 #define CHOOSER_SAVEMW 4 #define CHOOSER_IMAGE 5 #define CHOOSER_LINK 6 #define CHOOSER_NEWWEB 7 #define CHOOSER_STYLE 8 #define CHOOSER_MAPLINK 9 #define CHOOSER_WEBIZER 10 atyle.h Wed Feb 22 14:47:38 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#ifndef List_Repeat /* Order here is important, change (s,p,e)names arrays in styledlg.c enum para_type { P_Normal, P_H1, P_H2, P_H3, P_H4, P_H5, P_H6, P_BlockQuote, P_Pre, P_Listing, P_Address, P_Max };
enum emph_type { EM_B, EM_I, EM_U, EM_TT, EM_Cite, EM_Code, EM_Definition, EM_Em, EM_KBD, EM_Samp, EM_Strong, EM_Sub, EM_Sup, EM_Var, EM_Anchor, EM_CachedAnchor, EM_AnchorPoint, EM_Max enum just_type { J_Left, J_Center, J_Right, J_Filled enum bullet_type { B_FC, B_FS, B_OC, B_OS, B_GIF );
enum numeral_type { N_Arab, N_SRoman, N_CRoman, N_SLetter, N_CLetter };
#define List_Repeat 4 typedef struct style {
char *name; /* Should be an absolute URL
unsigned int is_url:l;
struct p_style {
XVT_FNTID fid;
int init_lead; /* in points int indent, sub_indent; /* in points enum just_type just;
char *colour;
} paras[P_Max];
struct e_style {
XVT_FONT_STYLE_MASK style_mask;
XVT_FNTID fid;
char *colour;
} emphs[EM_Max];
enum numeral_type list_nums[List_Repeat];
struct {
enum bullet_type bullet;
char *gif_name;
struct image *image;
} list_bullets[List_Repeat];
int list_indent, list_sub, list_lead, intralist_lead;
short prehr_points, posthr-points;
char *hr_gif_name;
struct image *hr_gif;
unsigned int modified: 1;
unsigned int tempmod: 1;
unsigned int cansave: 1;
unsigned int readstarted: 1;
unsigned int canceled: 1;
unsigned int fontwarned: 1;
struct style *next;
} STYLE;
extern STYLE *current, *defstyle, *normalstyle;
#endif = vieov.h Mon Mar 20 14:40:45 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#ifndef _VIEW_H
#define _VIEW_H
#include "html.h"
#include "style-h"
#include "func.h"
struct radinfo {
int israd;
struct view *view;

typedef struct window_info { /* Information associated with the window */
/* which does not change with the view */
/* Currently a bunch of modeless dialogues /* associated with a window */
int current; /* Current hotlist for this view WINDOW find_rpl; /* search and replace for the window WINDOW form; /* Window for making a form WINDOW radio; /* Radio button window WINDOW checkbox;
WINDOW reset;
WINDOW submit;
WINDOW textfield;
WINDOW password;
WINDOW textarea; /* This is a window, not a dialogue because I need to put a text edit in it */
WINDOW selectfield;
char *selflddata;
/* submit & reset don't get windows. They are too simple and there can only */
/* be one of each in a form? Hmm maybe not. */
WINDOW imagefield; /* Specify an image as a form element WINDOW image; /* Specify an image not as a form element WINDOW link; /* Specify a link...
WINDOW errors; /* HTML error window */
WINDOW links; /* Dangling link window WINDOW nvlink; /* Navilinks dialogue */
WINDOW mapmaker; /* Map maker dialogue */
WINDOW source; /* view source WINDOW palet; /* Field palet unsigned int wasactive:l;
unsigned int was_in_form: 1;
unsigned int was_show_form: 1;
unsigned int icon_changed: 1;
unsigned int linkchanging: 1;
unsigned int selallenabled: 1;
struct _formctx *pending_context;
struct view *pending_forwards;
struct view *restore_view;
long pending_id; /* timer for links */
short old_list, old_head;
short old_dl, old_nf;
short old_cu;
short old_para;
int stop_state; /* Stop button state long emph mask;
XVT_PIXMAP pmap;
Wlnfo;
typedef struct image {
struct image *next; /* Images are all linked together char *url; /* Original url of the image */
char *cachename; /* Local filename, if url not local vieov.h Mon Mar 20 14:40:45 1995 2 XVT_IMAGE image; /* display-able format unsigned int is_error :1; /* Is a built-in image, don't free it unsigned int readin :1; /* On first showing a page, don't load images unsigned int readstarted :1;/* We've asked for it, but it hasn't come back unsigned int reload :1; /* we want to read it in */
unsigned int ticked :1; /* Does anyone look at this image now? */
int unused_cnt; /* Number of passes through ImageCachePurge that image unu sed */
) Image;

typedef struct vfield {
/* Note: textarea's are not controls. The window given here is a private child*/
/* window of the pane, to find the textarea itself (a tx) xvt_vobj_get_data WINDOW id;
short cid; /* control Id used by event handler */
long x,y; /* absolute, position in infinite window, no sb*/
short width,height;
short baseline,lead;
short maxlen; /* XVT does not support this, we must do it short vmax; /* Max of password field */
char *passwordvalue; /* Value of a password field char *name, *value; /* Means for identifying which Image *ima?e;
enum f_type type, realtype; /* Realtype is only meaningful when printing XVT_IMACE prw_.zmage; /* Only meaningful when printing Para *para; /* Paragraph in which defined */
int offset; /* Offset within para at which defined */
unsigned int ismap :1; /* The image is a ismap image (if in anchor) */
unsigned int stub :1; /* The image has not been read in yet unsigned int ticked :1; /* The image has been positioned */
unsigned int floatleft :1; /* The image is to float to the left margin unsigned int floatright :1; /* The image is to float to the right margin enum ialign { ia_top, ia_center, ia_bottom } image_align;
short border_width;
short vsp, hsp; /* Space around image XVT_FONT_STYLE_MASK anchor; /* Is image in anchor?
struct vfield *nextfloat; /* Next floating image pending positioning } VField;

typedef struct vpara {
struct vpara *post, *parent;
Para *para;
struct vpara *subs;
char **lines; /* Line breaks in current view /* lines[0)==para->text */
short *lheight; /* vertical pos of each line */
/* topmost pixel of the line */
short *maxas; /* max ascent short *maxds; /* max descent short *twidth; /* total text width short *wc; /* word count */
short lmax; /* size of the lines array short lcnt;
long height; /* Height of paragraph long y; /* Vertical position of start of paragraph short indent, subind; /* initial and subsequent indents */
short lead; /* Initial leading */
enum just_type just; /* Justification of this paragraph VField *fields; /* Any fields in the current form short fcnt, fmax;
VField *floatpending; /* These guys need to be positioned at eol long old_fornL_border;
long old_form_top;
short lastnum; /* Last number in ordered list WO 96130846 PCTlUS96101686 view.h Mon Mar 20 14:40:45 1995 3 ) VPara;

typedef struct linklist {
NRCT pos;
char *name;
char *origname;
Para *para; /* Paragraph in which defined short offset; /* Offset within para at which defined unsigned int image:l; /* This is an unloaded image, not a real link */
unsigned int inlist:l; /* This is an unloaded image, not a real link */
} LinkList;
typedef struct anchorlist {
char *name;
long y;
Para *para; /* Paragraph in which defined int offset; /* Offset within para at which defined } AnchorList;

typedef struct position {
int offset;
unsigned int mapped: 1;
unsigned int pmapped: 1;
unsigned int decr: 1; /* If we are on the edge of a field, the field's window wi 11 overlay us */
unsigned int none: 1; /* if in a Selection=> no selection */
unsigned int drawn: 1; /* If in a Selection=> not drawn VPara *para;
long y;
short x; /* Document location (needs to have scroll bar off subtracted) */
short mas,mds; /* maximum ascent & descent for line short as,ds; /* ascent & descent of font */
} Position;

typedef struct selection {
Position start;
Position end;
} Selection;

typedef struct redrawinfo {
short offset;
} RedrawInfo;

typedef struct view {
int tag;
WINDOW w;
WINDOW pane; /* pane or pixmap WINDOW truepane; /* always the pane Wlnfo *winfo;
struct view *nextsame; /* Next view looking at same page Page *page; /* Page we are looking at */
VPara *first; /* Paragraph list, divided into lines struct view *back, *fore;
short wwidth, wheight;
short hres, vres;
short hfact, vfact;
long text_height, text_offtop;
long text_width, text_offleft;
= long text_overhead; /* when printing, this space needed for title struct style *sheet;
/* This reflects the current state of the drawing process XVT_FNTID *fidlist;
short fidcnt, fidmax;
XVT_FONT_STYLE MASK *masks;

vievs.h Mon Max 20 14:40:45 1995 4 COLOR *colours;
short *sizes;
short *subsupsizes;
short stlcnt, stimax;
int next_formid;
/* This is info that changes as we resize, etc.
LinkList *link_under_cursor;
LinkList *links;
short lcnt, lmax;
AnchorList *anchors;
short acnt, amax;
/* Link info in progress char *link_to_url;
char *link_to_origurl;
Para *link_para;
long xstart, ystart, yend;
char *attr_list;
/* Editing info */
char *pending; /* Hold a link while we wait to see if we got /* a double click. */
long multi_click_id; /* timer for selections */
struct lpnt { long h,v; } press_pnt;
XVT_FNTID cur_font; /* Font at cursor Selection sel;
Position caret;
Position press_pos; /* press_pnt in Position format */
long track_col; /* Up/Down tries to position caret here */
VPara *cheat; /* Used to speed up certain editing operations*/
unsigned int mouse_down: 1;
unsigned int mouse_count: 3;
unsigned int bookmarkmenu_dirty: 1;
unsigned int windowmenu_dirty: 1;
unsigned int navigatemenu_dirty: 1;
unsigned int nocursor: 1; /* Not yet implemented */
unsigned int drag_and_drop: 1;
unsigned int drag_marque: 1;
unsigned int oldfreeze: 1;
unsigned int findwrap: 1;
unsigned int findwaslast: 1;
unsigned int dontdrawsel: 1;
unsigned int showform: 1;
unsigned int showformchanged: 1;
unsigned int linkshown: 1;
unsigned int noticefocus: 1; /* Setting the title in the URL field gives it foc us, but we don't care */
unsigned int panefocus: 1; /* The pane currently has the focus */
unsigned int panetrapped: 1; /* The pane wants the pointer trapped VPara *float_images;
short icnt, imax;
PNT dragsel(97;
short dragcnt, dragas;
struct lpnt lastdrag;
short spn, soff, epn, eoff; /* save selection */
/* Redraw info */
Redrawlnfo *ri; /* Positions of lines before the edit */
short rien, rmax;
short rslead, rsind, rssubind, rslist;
enum just_type rsjust;
short relead, reind, resubind;
enum just_type rejust;
long re_y, re_x;
long hdiff; /* difference between old and new size */
int rindex; /* a backspace may make the first word of the */ r /* line move up to previous while an- */

WO 96/30846 PCTlUS96l01686 viep.h Mon Mar 20 14:40:45 1995 5 /* other char may make the last word /* move down to next */
short rsmds, rsmas; /* Making a word a bigger font means we must short remds, remas; /* redraw the entire line WINDOW stat; /* Let's do our own status bar char stat_text(200];
} View;
#endif ti html.h Wed Mar 22 09:18:10 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#ifndef XHTML_H
#define XHTML_H
#include <nshtml.h>
/**** mapping to old Page structure ****/ _ typedef struct page {
struct page *next; /* All pages linked together char *url; /* URL for this page, may be a local filename char *origurl; /* URL for this page, may be a local filename char *cachename; /* filename in page cache */
char *docname; /* URL of document containing us struct document *doc; /* Document containing this page, need not be known char *contenttype; /* MIME content type char *title;
char *faketitle; /* Title given in the anchor that found this page char *style; /* URL for style sheet */
struct style *sheet;/* Pointer to a default style sheet char *upl; /* URL's for standard links char *uptit; /* Titles for standard links char **otherlinks; /* contents of non-standard links char *base; /* URL for BASE (whatever) */
char **headerinfo; /* Any stuff we did not understand short *headererrs; /* Any errors char *headerargs; 1* Any errors short *trailerrs; /* Any after text? */
char *trailargs; /* Any after text?
long expiration_time; /* Time specified on MIME expiration unsigned int isindex: 1;
unsigned int isurl: 1;
unsigned int modifyable: 1;
unsigned int changed: 1;
unsigned int new: 1;
unsigned int noname: 1;
unsigned int readin: 1;
unsigned int haderrors: 1;
unsigned int newwarned: 1;
unsigned int frozen: 1; /* Temporary read only unsigned int eversaved: 1;
unsigned int mcomextensions: 1;
unsigned int orthodata : 1; /* not just a regular page unsigned int oldchanged: 1;
unsigned int readstarted: 1;
unsigned int dontsqueezenoops: 1;
unsigned int saveas : 1; /* doing a Save As, rename when done unsigned int titlecomplained : 1;
unsigned int dismissed : 1; /* Page dismissed without saving (after being changed) */
unsigned int dying : 1; /* Page being dismissed, but must reload to check links fi rst */
unsigned int linkschanged:l;/* At some point a link might have changed, need to reload on nosave */
unsigned int defersave:l; /* need to bring up chooser, */
unsigned int defersaveas:l; /* wait 'ti1 not in runtasks unsigned int savesucceded:l;
unsigned int saveasaltered:l;
unsigned int temporarychanged:l; /* Used to refresh icons Para *first;
char *iiprompt; /* prompt string for header isindex tag /*--- experimental ---*/
long refresh; /* live feed refresh interval long reload; /* time to reload /*--- experimental ---*/
struct view *views; /* List of all views looking at us (nextsame field)*/

Y html.h Wod Mar 22 09:18:10 1995 2 PRINT_RCD *prcd; /* Page setup info for Print command */
struct undo *undoes;
struct undo *redoes;
char *cur_anchor; /* This should really be in the view rather than */
/* the page. There are race conditions where we /* could go to the anchor in the wrong window (but /* looking at same page) */
XVT_PALETTE palet; /* If not NULL, optimized for images on this page struct view *cur_view; /* View controlling the current 10 operation struct crud *crud;
} Page;

/* convert between Page/HtmlPage:
if dst is NULL, allocate a new destination and return it if deep is true, do a deep copy, otherwise shallow Page *PageFromHtml PROTOTYPE((Page *dst, HtmlPage *src, int deep));
HtmlPage *HtmlFromPage PROTOTYPE((HtmlPage *dst, Page *src, int deep));
/* stubs for the old API */
Page *_PageRead PROTOTYPE((Page *));
int Page2File PROTOTYPE((Page *, char *, int));
int Page2URL PROTOTYPE((Page *, char *));
char *Page2Str PROTOTYPE((Page *, int));
int XVT_CALLCONV1 WritePage(Page *page, int dobase, int (*func) (/* ??? */), void *ctx);
#endif /tazp/dma Sat Mar 25 09:03:18 1995 1 total 201 drwxrwxr-x 3 gww 1024 Mar 18 16:37 drwxrwxr-x 12 gww 512 Mar 10 09:49 ..
-r--r----- 1 gww 1566 Mar 7 14:47 DM_Cancel.c -rw-rw-r-- 1 daveb 11012 Mar 14 15:44 DM_Cancel.o -r--r----- 1 gww 350 Feb 26 17:28 DM C1oseDB.c -rw-rw-rw- 1 dave 11128 Mar 18 16:37 DM_C1oseDB.o -r--r----- 1 doug 2057 Mar 14 21:59 DM_Create.c -rw-rw-r-- 1 daveb 8064 Mar 15 08:56 DM_Create.o -r--r----- 1 gww 1688 Feb 26 17:29 DM_DML.c -rw-rw-r-- 1 daveb 12132 Mar 14 15:44 DM_DML.o -r--r----- 1 gww 931 Feb 26 17:29 DM Exec.c -rw-rw-r-- 1 daveb 11228 Mar 14 15:44 DM_Exec.o -r--r----- 1 gww 667 Feb 26 17:29 DM_Flush.c -rw-rw-r-- 1 daveb 10796 Mar 14 15:44 DM_Flush.o -r--r----- 1 gww 2223 Feb 26 17:28 DM_GetRow.c -rw-rw-r-- 1 daveb 12012 Mar 14 15:44 DM_GetRow.o -r--r----- 1 gww 2161 Feb 26 17:29 DM_OneRow.c -rw-rw-r-- 1 daveb 7008 Mar 14 15:44 DM_OneRow.o -r--r----- 1 gww 4327 Feb 26 17:29 DM_OpenDB.c -rw-rw-rw- 1 dave 18224 Mar 18 16:37 DM_OpenDB.o -r--r----- 1 gww 2209 Feb 26 17:29 DM_Select.c -rw-rw-r-- 1 daveb 12448 Mar 14 15:44 DM_Select.o -r--r----- 1 gww 5917 Feb 27 14:02 DM_TableInfo.c -rw-rw-r-- 1 daveb 14240 Mar 14 15:44 DM_TableInfo.o -r--r----- 1 gww 1580 Feb 26 17:29 DM_Trans.c -rw-rw-r-- 1 daveb 6908 Mar 14 15:44 DM_Trans.o -r--r----- 1 gww 2518 Feb 26 17:29 DM_Update.c -rw-rw-r-- 1 daveb 7964 Mar 14 15:44 DM_Update.o drwxrwxr-x 2 gww 1536 Mar 14 21:59 RCS
-r--r----- 1 gww 1737 Feb 26 17:29 dm StrTrim.c -rw-rw-r-- 1 daveb 7068 Mar 14 15:44 dxn StrTrim.o -r--r----- 1 gww 867 Feb 26 17:29 dm_error.c -rw-rw-r-- 1 daveb 6692 Mar 14 15:44 dn-error.o -r--r----- 1 gww 302 Feb 26 17:29 illdms.h -r--r----- 1 gww 549 Feb 13 19:15 makefile /t=p/dma Sat Mar 25 09:03:57 1995 1 -r--r----- 1 gww 1566 Mar 7 14:47 DM_Cancel.c -r--r----- 1 gww 350 Feb 26 17:28 DM_C1oseDB.c -r--r----- 1 doug 2057 Mar 14 21:59 DM_Create.c -r--r----- 1 gww 1688 Feb 26 17:29 DM_DML.c -r--r----- 1 gww 931 Feb 26 17:29 DM_Exec.c -r--r----- 1 gww 667 Feb 26 17:29 DM_F1ush.c -r--r----- 1 gww 2223 Feb 26 17:28 DM_GetRow.c -r--r----- 1 gww 2161 Feb 26 17:29 DM_OneRow.c -r--r----- 1 gww 4327 Feb 26 17:29 DM_OpenDB.c -r--r----- 1 gww 2209 Feb 26 17:29 DM_Select.c -r--r----- 1 gww 5917 Feb 27 14:02 DM_TableInfo.c -r--r----- 1 gww 1580 Feb 26 17:29 DM_Trans.c -r--r----- 1 gww 2518 Feb 26 17:29 DM_Update.c -r--r----- 1 gww 1737 Feb 26 17:29 dm StrTrim.c -r--r----- 1 gww 867 Feb 26 17:29 dm error.c xc-.h Tue Feb 16 21:56:27 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#if XVT_OS_ISUNIX

#ifdef sun #ifdef _svr4__ #define BSD_COMP
#endif #endif #include <sys/types.h>
#include <sys/timeb.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <pwd.h>
#include "skport.h"

#define ioctlsocket ioctl #define closesocket close #define wsprintf sprintf void Pause(int left) {/* do nothing? */ }
typedef char WSADATA;
int WSAStartup() { return 0; }
void WSACleanup() {}

#define WSAGetLastError() (errno) #define WSAEWOULDBLOCK EWOULDBLOCK
#define WSAEINPROGRESS EINPROGRESS
typedef struct sockaddr *LPsockaddr_in;
typedef struct hostent *LPhostent;
typedef u_long in_name;
typedef in_name *LPin_name;
#ifndef INADDR_NONE
#define INADDR_NONE -1 #endif #define UserName getpwuid(getuid())->pw name long millisec() {
#ifdef _svr4_ return time(0) * 1000;
#else struct timeb tb;
ftime(&tb);
return tb.time*1000 + tb.millitm;
#endif }
#elif XVT_OS_IS WINOS
#includa <winsock.h>
#include "skport.h"
void Pause(int left) {

WO 96/30846 PCTlUS96101686 xc-.h Tue Feb 14 21:56:27 1995 2 if (left) Yield();
typedef struct sockaddr FAR *LPsockaddr_in;
typedef struct hostent FAR *LPhostent;
typedef u_long in_name;
typedef in_name FAR *LPin_name;
typedef u_long FAR *caddr_t;
#define UserName "wwwUser"

long millisec() {
return GetTickCount();
}

#elif XVT_OS == XVT_OS_MAC
#include <SK_Port.h>
#include <SK.h>
#include <sys/errno.h>
#define ioctlsocket IOCTL
#define closesocket CLOSE
#define wsprintf sprintf void Pause(int left) {/* do nothing? */ }
typedef char WSADATA;
int WSAStartup() { return 0; }
void WSACleanup() () #define WSAGetLastError() (errno) #define WSAEWOULDBLOCK EWOULDBLOCK
#define WSAEINPROGRESS EINPROGRESS
typedef struct sockaddr *LPsockaddr_in;
typedef struct hostent *LPhostent;
typedef u_long in_name;
typedef in_name *LPin_name;
#ifndef INADDR_NONE
#define INADDR_NONE -1 #endif long millisec() {
return ((long)(clock()*1000 / CLOCKS_PER_SEC));
}
#endif #define NULL_SOCKET -1 lib Sat Mar 25 09:29:36 1995 1 Client Communications Layer Library that handles all communications tasks from the client to the server (or other servers). Creates, manages and disposes of connection requests and returns responses.
-r--r----- 1 gww 1974 Jan 31 12:33 auth.c -r--r----- 1 gww 3258 Jan 31 12:33 crud.c -r--r----- 1 dave 2302 Mar 20 12:13 crudio.cxx -r--r----- 1 gww 573 Mar 3 12:15 crudshim.c -r--r----- 1 gww 2792 Feb 3 18:23 docrud.cxx -r--r----- 1 gww 5076 Mar 6 12:42 form.c -r--r----- 1 gww 5253 Jan 31 12:35 gif.cxx -r--r----- 1 gww 1148 Jan 31 12:37 gif.h -r--r----- 1 daveb 2283 Mar 10 12:42 gifshim.cxx -r--r----- 1 gww 3936 Mar 23 13:13 guess.c -rw-r----- 1 gww 4150 Mar 23 13:13 guess.c--r--r----- 1 gww 1318 Jan 31 12:36 htstring.h -r--r----- 1 gww 8280 Mar 3 12:16 htutils.h -r--r----- 1 gww 7454 Jan 31 12:33 htuu.c -r--r----- 1 gww - 923 Jan 31 12:36 htuu.h -r--r----- 1 gww 996 Mar 3 12:14 lfunc.c -r--r----- 1 gww 85450 Mar 23 17:27 lhtml.c -rw-r----- 1 gww 85399 Mar 23 17:27 lhtml.c--r--r----- 1 gww 9598 Mar 23 13:10 local.cxx -rw-r----- 1 gww 9327 Mar 23 13:10 local.cxx--r--r----- 1 jimbo 260 Mar 10 13:57 lxvt.h -r--r--r-- 1 jimbo 1863 Mar 10 14:06 makefile -r--r----- 1 gww 244 Jan 31 12:35 mem.cxx -rw-rw-r-- 1 gww 1005 Mar 16 18:33 outs -r--r----- 1 gww 939 Jan 31 12:35 response.cxx -r--r--r-- 1 gww 9973 Jan 31 12:38 sk.h -r--r--r-- 1 gww 4097 Jan 31 12:38 skport.h -rw-rw-rw- 1 dave 38920 Mar 23 13:14 str.o -r--r----- 1 gww 2793 Feb 10 18:02 task.cxx drwxrwxr-x 2 gww 512 Feb 24 12:11 tilde -r--r----- 1 dave 32595 Mar 20 12:13 web.cxx -r--r----- 1 dave 4760 Mar 22 14:53 xcomm.c -r--r----- 1 gww 2099 Feb 14 21:56 xcomm.h -r--r----- 1 gww 965 Mar 2 19:00 xdoc.c -r--r----- 1 gww 25653 Mar 23 13:10 xlocal.c -rw-r----- 1 gww 25653 Mar 23 13:10 xlocal.c-Files included for reference:
crud.c . builds crud--create, retrieve, update, delete--structures.
cruds are the main structure to hold requests.

crudio.cxx: handles the client input/output stream.
crudshim.c: runs a task.
docrud.cxx: executes a crud request.
lhtml.c: handles formatting and parsing HTML.
local.cxx: handles local operations (as. opposed to remote over the net) response~.cxx: routines to handle returns from the server.

str.cxx: routines to handles strands, main 2/O stream.
web.cxx: builds http requests, builds TCP requests.

lib sat Mar 25 09:29:36 1995 2 xcomm.c: TCP socket code.

xdoc.c: routine to assist with directories for collections.
xlocal.c: routines to mainpulate file/URL paths cross-platform.

ti crud.c Tue Jaa 31 12:33:48 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#include <stdio.h>
#include <string.h>
#include "crud.h"
#include "lfunc.h"

static Crud waiting = {&waiting, &waiting, X};
static Crud running = {&running, &running, X);
static Crud prefetch = {&prefetch, &prefetch, X);
static Crud *oldpre = &prefetch;

Crud *newCrud(crudtype type, Auth *auth, char *url, Form *form, int sid, int (*func)(void *,int), void *ctx) {
Crud *crud = (Crud *)myalloc(sizeof(Crud));
if(crud) {
crud->type = type;
crud->auth = auth;
crud->url = copy(url);
crud->form = form;
crud->sid = sid;
crud->func = func;
crud->part = 0;
crud->ctx = ctx;
crud->comm = 0;
crud->method = NULL;
strcpy(crud->status, crud->abort = 0;
crud->info = crud->reload = 0;
crud->since = 0;

crud->prev = &waiting;
crud->next = waiting.next;
waiting.next->prev = crud;
waiting.next = crud;
}
return crud;
}

int _info(char /* this should be static, but we want to use in in crudio void FreeCrud(Crud *crud) {
char *crudtype = "CRUDXB";

_info("free-%c %s %s\n", crudtype[crud->type], crud->url, crud->status);
crud->prev->next = crud->next;
crud->next->prev = crud->prev;
myfree(crud->url);
myfree(crud->method);
myfree(crud->queryString);
myfree(crud->protocol);
myfree(crud);
if(oldpre == crud) oldpre = &prefetch;
#if 0 for(crud = running.next; crud != &running; crud = crud->next) _info("rq-%c %s %s\n", crudtype[crud->type], crud->url, crud->status);

crud.c Tue Jan 31 12:33:48 1995 2 for(crud = prefetch.next; crud != &prefetch; crud = crud->next) _info("pq-%s %s\n", crud->url, crud->status);
#endif }

static void PlaceCrud(Crud *crud, Crud *list) {
crud->prev->next = crud->next;
crud->next->prev = crud->prev;
crud->prev = list->prev;
crud->next = list;
list->prev->next = crud;
list->prev = crud;
}
Crud *CreateCrud(char *url, Desc *desc, int sid) {
Auth *auth = (desc && desc->auth ? desc->auth : GetAuth(url));
Form *form = (desc ? desc->form : (Form *)0);
return newCrud(C, auth, url, form, sid, 0,0);
}
Crud *UpdateCrud(char *url, Desc *desc, int sid) {
Auth *auth =(desc && desc->auth ? desc->auth c GetAuth(url));
Form *form = (desc ? desc->form : (Form *)0);
return newCrud(U, auth, url, form, sid, 0,0);
}
Crud *DeleteCrud(char *url) {
return newCrud(D, GetAuth(url), url, 0, 0,0,0);
}
Crud *RetrieveCrud(char *url, Form *form) {
return newCrud(R, GetAuth(url ? url forin->URL), url, form, 0,0,0);
}
Crud *BrowseCrud(char *url) {
return newCrud(B, GetAuth(url), url, 0, 0,0,0);
}

Crud *PrefetchCrud(char *url) {
if(url == (char *)0) {
oldpre = prefetch.next;
return (Crud *)0;
} else {
Crud *crud = newCrud(R, GetAuth(url), url, 0, 0,0,0);
PlaceCrud(crud, oldpre);
return crud;
}
}
Crud *QueueCrud(Crud *crud, int (*func)(void *,int), void *ctx) {
crud->func = func;
crud->ctx = ctx;
PlaceCrud(crud, &running);
' return crud;
}
int AbortCrud(Crud *crud) }

WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCTfFJS96/01686 crud.c Tue Jan 31 12:33:48 1995 3 if(crud) {
sprintf(crud->status, "aborted %s", crud->url);
return crud->abort = 1;
return 0;
}

Crud *RunQHead() { return running.next; }
Crud *PreQHead() { return prefetch.next; }

WO 96/30846 PCTfUS96101686 crudio.cxos ffioa Mar 2Q 12:13:43 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#include "crud.h"
#include "str.h"
#include "lfunc.h"
#include "task.h"

/* this is in it's own file so that we don't necessarily pull in all of comm when using Cruds */

extern "C" {
extern int DoCrud(Crud *);
extern int CheckCrud(Crud *);
extern void FreeCrud(Crud *);
extern Crud *RunQHead(;
extern Crud *PreQHead(;
static int last = 0;
static int count = 0;
static int max = 16; /* limit simultaneous connections static int cache = 1;
class crudtask : public task {
int rid;
Crud *crud;
cruddone();
public:
crudtask(Crud *);
partial();
int crudtask::cruddone() {
--count;
if (rid) {
if(cache && crud->type == R) strand::cache(rid, crud->url, crud->auth);
if(crud->func) (crud->func)(crud->ctx, rid);
}
delete (task *) crud->comm;
FreeCrud(crud);
return finish(rid);
}
crudtask::crudtask(Crud *_crud) : task(0) {
count++;
crud = _crud;
if(rid = DoCrud(crud)) cruddone();
}

int crudtask::partial() if(!*crud->comm 11 crud->abort) {
return cruddone ( ) ;
}
task *tk = (task *)crud->comm;
if(tk->done) {

WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT/US96/01686 crudio.czoe Mon Mar 20 12:13:43 1995 2 rid = tk->state;
return cruddone();
} else if(tk->prog) {
if(crud->part) (crud->part)(crud->ctx, tk->state);
}
return block(tk->state);
}

extern "C" {
int SeeCrudsRun() {
Crud *c, *n;
for(c = RunQHead(); count < max && c->type != X; c=n) {
n = c->next;
if(!c->comm) new crudtask(c);
}
for(c = PreQHead(); count < max && c->type X; c=n) {
n = c->next;
if ( ! c->comm) new crudtask(c);
}
if(last != count) {
_info("crudtasks: $d\n", count);
last = count;
}
/* get rid of any "instantaneous" strands */
CacheReap();
return 0;
}

void CrudRundown(void) {
do {
RunTasksO;
} while(RunQHead()->type X);
}

int CrudInQueue(Crud *crud) {
Crud *c;

for ( c=RunQHead(); c->type != X && c!=crud; c=c->next );
return( c==crud );
}
int SyncCrud(Crud *crud, int (*func)(void *), void *ctx) {
while ( CrudInQueue(crud)) RunTasks();
return 1;
}
int SetMaxOutstandingCruds(int n) {
int old = max;
max = n;
return old;
}
int SetCrudCaching(int b) {
int old = cache;
cache = b;

crndio.czoc Mon Mnr 20 12:13:43 1995 3 return old;
}

}
.

W O 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCTIUS96/01686 docrud.czoc P'ri lrob 3 18:23:21 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#include <string.h>
#include "crud.h"
#include "str.h"
#include "respornse.h"
#include "guess.h"

static int islocal(char *url) {
return(!strstr(url, }

int webcrud(Crud *);
int localcrud(Crud *);
int popcrud(Crud *);

int internal(Crud *crud);
int mailto(Crud *crud);
extern "C" {

int (*HtmlHotlist)(void) _ (int (*)())0;
int DoCrud(Crud *crud) {
char *dest = (crud->url ? crud->url : crud->form->URL);
if(pmatch("npi:",dest)) {
if(strcmp("npi://hotlist",dest)==0 && HtmlHotlist) return HtmlHotlist();
if(crud->type == R) return internal(crud);
return fivehundred("illegal internal operation");
} else if(pmatch("mailto:",dest)) return mailto(crud);
} else if(pmatch("pop:",dest)) {
return popcrud(crud);
} else if(islocal(dest)) {
return localcrud(crud);
}
return webcrud(crud);
}
}
int internal(Crud *crud) {
static int count = 0;
wstrand ws;
ws.create(200,"text/html");
ws.print("<FORM ACTION=\"npi:/foobar/$d\">", count++);
char *old = GetFormValue(crud->form, "foobar");
if (old) ws.print("you had typed: %s<BR>", old);
ws.print("<INPUT NAME=\"foobar\">");
ws.print("<INPUT TYPE=\"submit\" VALUE=\"tryme\">");
ws.print("</FORM>");
return ws.close();
}

extern int smtp(char *, char char char *, Crud *);

int mailto(Crud *crud) =
switch(crud->type) {
r WO 96/30846 PCTlLTS96101686 docxud.cxx Fri Fob 3 18:23:21 1995 2 = case R:
if(crud->info) break;
if(crud->url) {
char *addr = pmatch("mailto:",crud->url);
wstrand ws;
ws.create(200, "text/html");
ws.print("<H1>mailto: service</H1>");
ws.print("<FORM ACTION=\"mailto:%s\">", addr);
ws.print("Press <INPUT TYPE=\"submit\" VALUE=\"send\"> when ws.print("you have finished composing your message.<HR>");
ws.print("<B>To:</B> <CODE>%s</CODE><BR>", addr);
ws.print("<B>Subject:</B> <INPUT NAME=\"subject\" SIZE=40><HR>");
ws.print("<INPUT NAME=\"body\" SIZE=60,20>");
ws.print("</FORM>");
return ws.close();
} else if(crud->form) {
char *user = pmatch("mailto:",crud->form->URL);
char *host = strchr(user, '@');
if(!user) return fivehundred("usage: mailto:user@host");
if(!host) host = "localhost";
else *host++ = '\0';
return smtp(user, host, GetFormValue(crud->form, "subject"), GetFormValue(crud->form, "body"), crud);
}
case C:
case U:
{
char *user = pmatch("mailto:",crud->url);
char *host = strchr(user, '@');
if(!user) return fivehundred("usage: mailto:user@host");
if(!host) host = "locaihost";
else *host++ = '\0';
return smtp(user, host, NULL, NULL, crud);
}
case D:
case X:
break;
}
return fivehundred("error in mailto");
}

WO96/30846 CA 02216826 1997-09-29 pCT[US96/01686 crudshim.c F'ri Mar 3 12:15:38 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#include <stdio.h>
#include "crud.h"
#include str.h"
#include "task.h"
extern Crud *RunQHead(;
extern int SeeCrudsRun();
extern int _crud_error(char *fmt, ...);
void RunCruds(int verbose) {
static int tasked = 0;
if(!tasked) {
tasked = 1;
#if 0 AddTask(0, 0, SeeCrudsRun, 0);
#endif AddTaskSeeCrudsRun(O, 0);
}

while(RunQHead()->type != X) {
if(verbose) _crud_error("\r%80s", RunQHead()->status);
RunTasks();
}
if(verbose) _crud_error("\n");
CacheFlush(0);
}

WO 96/30846 PCT(US96101686 1htm1.c Thu Mar 23 17:27:18 1995 1 = /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
#include <stdlib.h>
#if defined(_sun_) defined(_hpux_) 11 defined(_svr4_) defined(_osf_) # include <stdarg.h>
# include "lxvt.h" /* XVT says I really need the defn of XVT_CALLCONV1 #else # include <xvt.h>
#endif #include "nshtml.h"
#include "lfunc.h"
#include "xlocal.h"
#include "memmask.h"

#define DEF_ISINDEX_PROMPT "This is a searchable index. Enter search keywords:"
static int charsearch PROTOTYPE((char *));
static int htmlsearch PROTOTYPE((char *));
static int outch PROTOTYPE((int));
static int outst PROTOTYPE((char *));
static int outlatinlhex PROTOTYPE((int));
static int outchar PROTOTYPE((int));
static int outstr PROTOTYPE((char *));
static int outnstr PROTOTYPE((char *,int));
static int OutLink PROTOTYPE((char *,char *,char *));
static int OutHeader PROTOTYPE((HtmlPage *,int));
static int OutPara PROTOTYPE((HtmlPage *, Para *));
static int OutHtmiPage PROTOTYPE((HtmlPage *,int));
static int inch PROTOTYPE((void));
static int ungetch PROTOTYPE((int));
static int ungetchr PROTOTYPE((int));
static void ungeterr PROTOTYPE((HtmlPage *,int,int,int));
static void addheadererr PROTOTYPE((HtmlPage *,int,int));
static void addtrailerr PROTOTYPE((HtmlPage *,int,int));
static void ungetend PROTOTYPE((int));
static void ungettag PROTOTYPE((int,int));
static int slurptag PROTOTYPE((void));
static char *slurpTagText PROTOTYPE((int));
static void newnest PROTOTYPE((int));
static int inchr PROTOTYPE((void));
static int indec PROTOTYPE((void));
static void skip PROTOTYPE((int));
static int hasListParent PROTOTYPE((Para *));
static struct attribs *parseAttrs PROTOTYPE( (Html Page *,int,char *,int,int));
static struct attribs *slurpParseAttrs PROTOTYPE( (Html Page *,int,int));
static int unnest PROTOTYPE((HtmlPage *,int,int));
static char *slurp2end PROTOTYPE((HtmlPage *,int));
static void slurpHeadltem PROTOTYPE((HtmlPage *,int,int));
static void slurpHeader PROTOTYPE((HtmlPage *));
static int end2base PROTOTYPE((long,long,long));
static void makeSearchForm PROTOTYPE( (Html Page *,Para *));
static Para *slurpParaList PROTOTYPE((HtmlPage *,Para *));
static Para *slurpList PROTOTYPE((HtmlPage *,Para *));
static void slurpBody PROTOTYPE((HtmlPage *));
static HtmlPage *slurpHtmlPage PROTOTYPE((HtmlPage *));
static int parse_null PROTOTYPE((void *));

/* There is a macro of this in viewdraw.c for speed int navi_isspace(int ch) ( if ( ch==' ' 11 ch=='\n' 11 ch=='\r' 11 ch=='\t' WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT/US96/01686 lhtml.c Thu Mar 23 17:27:18 1995 2 return 1;
return( 0 );

/* Mappings between non-ASCII characters (parity bit set) and standard mneumonics */ t /* We always need the latinl table so that we can map &#xx; to latinl and then*/
/* to the local character set */
static struct chartab latinlcharnames[}
{ "&AElig", Oxc6 /* capital AE diphthong (ligature) {"&Aacute", Oxcl }, /* capital A, acute accent */
{"&Acirc", Oxc2 /* capital A, circumflex accent {"&Agrave", OxcO /* capital A, grave accent { "&Aring", Oxc5 /* capital A, ring { "&Atilde", Oxc3 /* capital A, tilde */
{"&Auml", 0xc4 }, /* capital A, dieresis or umlaut mark */
{ "&Ccedil", Oxc7 /* capital C, cedilla */
{ "&ETH", OxdO }, /* capital Eth, Icelandic {"&Eacute", Oxc9 }, /* capital E, acute accent {"&Ecirc", Oxca /* capital E, circumflex accent {"&Egrave", Oxc8 }, /* capital E, grave accent */
{"&Euml", Oxcb }, /* capital E, dieresis or umlaut mark */
{"&Iacute", Oxcd }, /* capital I, acute accent */
{"&Icirc", Oxce }, /* capital I, circumflex accent "&Igrave", Oxcc }, /* capital I, grave accent */
{"&Iuml", Oxcf }, /* capital I, dieresis or umlaut mark { "&Ntilde", Oxdl /* capital N, tilde */
{"&Oacute", Oxd3 /* capital 0, acute accent {"&Ocirc", Oxd4 }, /* capital 0, circumflex accent "&Ograve", Oxd2 /* capital 0, grave accent { "&Oslash", Oxds /* capital 0, slash { "&Otilde", Oxd5 /* capital 0, tilde {"&Ouml", Oxd6 }, /* capital 0, dieresis or umlaut mark { "&THORN", Oxde /* capital THORN, Icelandic "&Uacute", Oxda /* capital U, acute accent "&Ucirc", Oxdb }, /* capital U, circumflex accent {"&Ugrave", Oxd9 /* capital U, grave accent */
{"&Uuml", Oxdc /* capital U, dieresis or umlaut mark */
{"&Yacute", Oxdd }, /* capital Y, acute accent {"&aacute", Oxel }, /* small a, acute accent */
{"&acirc", Oxe2 }, /* small a, circumflex accent { "&aelig", Oxe6 /* small ae diphthong (ligature) {"&agrave", OxeO /* small a, grave accent { "&amp^, '&' /* ampersand */
{ "&aring", Oxe5 /* small a, ring { "&atilde", Oxe3 /* small a, tilde */
{"&auml", Oxe4 /* small a, dieresis or umlaut mark */
{ "&ccedil", Oxe7 /* small c, cedilla */
{"&eacute", Oxe9 /* small e, acute accent {"&ecirc", Oxea /* small e, circumflex accent {"&egrave", Oxe8 /* small e, grave accent { "&eth", OxfO /* small eth, Icelandic {"&euml", Oxeb }, /* small e, dieresis or umlaut mark */
{ "&gt", /* greater than */
{"&iacute", Oxed /* small i, acute accent {"&icirc", Oxee /* small i, circumflex accent {"&igrave", Oxec /* small i, grave accent */
{"&iuml", Oxef /* small i, dieresis or umlaut mark */
{ "&lt" /* less than */
{ "&ntilde", Oxfl /* small n, tilde {"&oacute", Oxf3 /* small o, acute accent {"&ocirc", Oxf4 /* small o, circumflex accent {"&ograve", Oxf2 /* small o, grave accent { "&oslash", Oxf8 /* small o, slash */ .
{ "&otilde", OxfS /* small o, tilde */

WO 96/30846 PCTlUS96/01686 11htm1.c Thu Mar 23 17:27:18 1995 3 ~ {"&ouml", Oxf6 /* small o, dieresis or umlaut mark */
{ "&quot" /* totally useless, but documented {"&szlig", Oxdf /* small sharp s, German (sz ligature) { "&thorn", Oxfe /* small thorn, Icelandic {"&uacute", Oxfa /* small u, acute accent {"&ucirc",, Oxfb /* small u, circumflex accent {"&ugrave", Oxf9 /* small u, grave accent */
{"&uuml", Oxfc }, /* small u, dieresis or umlaut mark */
{"&yacute", Oxfd /* small, y, acute accent */
{"&yuml", Oxff /* small y, dieresis or umlaut mark /* MCOM extensions, semi-standard { "&copy", 169 { "&reg", 174 /* GWW: The following are non-standard: */
{ "@nobreakspace", OxaO), /* non-breaking space #define _C_NBS OxaO
{ "@exclamdown", 161 /* down exclamation point { "@cent", 162 /* cent sign { "@sterling",163 /* pound sign { "@currency",164 { "@yen", 165 /* yen sign { "@brokenbar",166 { "@section" 167 { "@diaeresis",168 { "@dieresis",168 { "@ordfeminine",170 }, { "@guillemotleft",171}, /* guillemot gauche { "@notsign", 172 { "@hyphen", 173 { "@macron", 175 { "@degree", 176 { "@plusminus",177 { "@twosuperior",178 { "@threesuperior",179}, { "@acute", 180 { "(amu", 181 { "@paragraph",182 { "@periodcentered",183}, /* centered period { "@cedilla", 184 { "@onesuperior",185 { "@ordmasculine",186 { "@masculine",186 { "@guillemotright",187}, /* guillemot doigt { "@onequarter",188 { "@onehalf", 189 { "@threequarters",190}, { "@questdown",191 /* question mark down */
NULL

/* Should this depend on Windowing system or on OS, what does X running on /* Mac or Windows do with these characters? */
#if XVTWS==MTFWS 11 XVTWS==XOLWS /* X uses Latin 1 encodings */
static struct chartab *charnames = latinlcharnames;

static struct unknownchartab unknownchars[}
}
{0, NULL
#elif XVTWS==MACWS
static struct chartab charnames[} _ {
{ "&AElig", 174 /* capital AE diphthong (ligature) */
{"&Aacute", 231 /* capital A, acute accent */
{"&Acirc", 229 /* capital A, circumflex accent WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCTIUS96/01686 lhtml.c Thu Mar 23 17:27:18 1995 4 {"&Agrave", 203 /* capital A, grave accent { "&Aring", 129 /* capital A, ring { "&Atilde", 204 /* capital A, tilde {"&Auml", 128 /* capital A, dieresis or umlaut mark */
{ "&Ccedil", 130 /* capital C, cedilla */
{ "&ETH", 1 /* capital Eth, Icelandic {"&Eacute", 131 }, /* capital E, acute accent {"&Ecirc", 230 /* capital E, circumflex accent {"&Egrave", 233 /* capital E, grave accent */
{"&Euml", 232 }, /* capital E, dieresis or umlaut mark */
{ &Iacute", 234 }, /* capital I, acute accent */
{"&Icirc", 235 /* capital I, circumflex accent {"&Igrave", 237 }, /* capital I, grave accent */
{"&Iuml", 236 /* capital I, dieresis or umlaut mark */
{ "&Ntilde", 132 /* capital N, tilde */
{"&Oacute", 238 /* capital 0, acute accent {"&Ocirc", 239 /* capital 0, circumflex accent {"&Ograve", 241 /* capital 0, grave accent { "&Oslash", 175 /* capital 0, slash { "&Otilde", 205 /* capital 0, tilde */
{"&Ouml", 133 /* capital 0, dieresis or umlaut mark { "&THORN", 11 /* capital THORN, Icelandic {"&Uacute", 242 /* capital U, acute accent {"&Ucirc", 243 /* capital U, circumflex accent {"&Ugrave", 244 /* capital U, grave accent */
{"&Uuml", 134 /* capital U, dieresis or umlaut mark */
{"&Yacute", 7 /* capital Y, acute accent {"&aacute", 135 /* small a, acute accent */
{"&acirc", 137 /* small a, circumflex accent { "&aelig", 190 /* small ae diphthong (ligature) */
{"&agrave", 136 /* small a, grave accent */
{ "&amp" '&' }, /* ampersand */
{ "&aring", 140 }, /* small a, ring { "&atilde", 139 }, /* small a, tilde */
"&auml", 138 /* small a, dieresis or umlaut mark { "&ccedil", 141 /* small c, cedilla */
{"&eacute", 142 /* small e, acute accent {"&ecirc", 144 /* small e, circumflex accent {"&egrave", 142 /* small e, grave accent { "&eth", 2 /* small eth, Icelandic {"&euml", 145 /* small e, dieresis or umlaut mark { "&gt" /* greater than */
{"&iacute", 146 /* small i, acute accent {"&icirc", 148 /* small i, circumflex accent {"&igrave", 147 /* small i, grave accent */
{"&iuml", 149 /* small i, dieresis or umlaut mark { "&lt" /* less than */
{ "&ntilde", 150 /* small n, tilde */
{"&oacute", 151 /* small o, acute accent {"&ocirc", 153 /* small o, circumflex accent {"&ograve", 152 /* small o, grave accent { "&oslash", 191 /* small o, slash { "&otilde", 155 /* small o, tilde {"&ouml", 154 /* small o, dieresis or umlaut mark { "&quot", '"' /* totally useless, but documented {"&szlig", 167 /* small sharp s, German (sz ligature) { "&thorn", 12 /* small thorn, Icelandic {"&uacute", 156 /* small u, acute accent {"&ucirc", 158 /* small u, circumflex accent {"&ugrave", 157 /* small u, grave accent */
{"&uuml", 159 /* small u, dieresis or umlaut mark {"&yacute", 8 /* small y, acute accent */
{"&yuml", 216 /* small y, dieresis or umlaut mark */ .
/* MCOM extensions, semi-standard */

lhtml.c Thu Mar 23 17:27:18 1995 5 + { "&copy", 169 { "&reg", 168 /* GWW: The following are non-standard: */
#ifdef _C_NBS
# undef _C_NBS
#endif #define _C_NBS 202 { "@nobreakspace", 2021, /* non-breaking space { "@exclamdown", 193 /* down exclamation point { "@cent", 162 /* cent sign { "@currency",219 { "@sterling",163 /* pound sign { "@yen", 180 /* yen sign { "@brokenbar",27 { "@section", 164 { "@diaeresis",172 {"@dieresis",172 /* Sometimes spelled one way, sometimes another */
{ "@ordfeminine",187 }, { "@guillemotleft",1991, { "@notsign", 194 { "@logicalnot",194 { "@hyphen", - }, { "@macron" 248 { "@degree", 161 { "@plusminus",177 { "@twosuperior",26 { "@threesuperior",25 { "@acute", 171 { "@mu", 181 { "@paragraph",166 { "@periodcentered",225}, /* centered period { "@cedilla", 252 { "@onesuperior",23 { "@ordmasculine",188 { "@masculine",188 { "@guillemotright",200}, /* guillemot doigt { "@onequarter",22 { "@onehalf", 21 { "@threequarters",24 { "@questdown",192 /* question mark down */
NULL

static struct unknownchartab unknownchars[]
{165, /* Bullet */
{170, "TM"
{201, ..."}, {207, "oe"}
{206, "OE"}, {208, {209, --"}, {210, {211, {212, (213, {222, "fi"}, (223, "fl"}, {0, NULL) };
R
#else /* This appears to be a super-set of latin-1 ~ static struct chartab charnames() _ {
{ "&AElig", 198 }, /* capital AE diphthong (ligature) */
{"&Aacute", 193 /* capital A, acute accent */
{"&Acirc", 194 /* capital A, circumflex accent WO 96/30846 CA 0 2 216 8 2 6 19 9 7- 0 9- 2 9 pCT/U896/01686 lhtml.c Thu Mar 23 17:27:18 1995 6 {"&Agrave", 192 }, /* capital A, grave accent { "&Aring", 197 /* capital A, ring { "&Atilde", 195 /* capital A, tilde {"&Auml", 196 /* capital A, dieresis or umlaut mark */
{"&Ccedil", 199 }, /* capital C, cedilla */
{ "&ETH", 208 /* capital Eth, Icelandic "&Eacute", 201 }, /* capital E, acute accent "&Ecirc", 202 /* capital E, circumflex accent {"&Egrave", 200 }, /* capital E, grave accent */
{"&Euml", 203 }, /* capital E, dieresis or umlaut mark */
{"&Iacute", 205 }, /* capital I, acute accent */
{"&Icirc", 206 /* capital I, circumflex accent "&Igrave", 204 /* capital I, grave accent */
{"&Iuml", 207 }, /* capital I, dieresis or umlaut mark */
{ "&Ntilde", 209 /* capital N, tilde */
{"&Oacute", 211 /* capital 0, acute accent "&Ocirc", 212 }, /* capital 0, circumflex accent "&Ograve", 210 /* capital 0, grave accent { "&Oslash", OxdB /* capital 0, slash */
{ "&Otilde", Oxd5 /* capital 0, tilde */
"&Ouml", Oxd6 /* capital 0, dieresis or umlaut mark */
{ "&THORN", Oxde /* capital THORN, Icelandic {"&Uacute", Oxda }, /* capital U, acute accent {"&Ucirc", Oxdb /* capital U, circumflex accent "&Ugrave", Oxd9 /* capital U, grave accent */
"&Uuml", Oxdc /* capital U, dieresis or umlaut mark */
{"&Yacute", Oxdd /* capital Y, acute accent {"&aacute", Oxel /* small a, acute accent */
"&acirc", Oxe2 }, /* small a, circumflex accent { "&aelig", Oxe6 }, /* small ae diphthong (ligature) */
{"&agrave", OxeO /* small a, grave accent { "&amp" '&' /* ampersand */
{ "&aring", Oxe5 /* small a, ring { "&atilde", Oxe3 /* small a, tilde {"&auml", Oxe4 /* small a, dieresis or umlaut mark */
{ "&ccedil", Oxe7 /* small c, cedilla */
{"&eacute", Oxe9 /* small e, acute accent {"&ecirc", Oxea }, /* small e, circumflex accent {"&egrave", Oxe8 /* small e, grave accent { "&eth", OxfO /* small eth, Icelandic {"&euml", Oxeb /* small e, dieresis or umlaut mark */
{ "&gt", /* greater than */
{"&iacute", Oxed /* small i, acute accent {"&icirc", Oxee /* small i, circumflex accent {"&igrave", Oxec /* small i, grave accent */
{"&iuml", Oxef }, /* small i, dieresis or umlaut mark */
{ "&lt" /* less than */
{ "&ntilde", Oxfl /* small n, tilde "&oacute", Oxf3 /* small o, acute accent {"&ocirc", Oxf4 }, /* small o, circumflex accent "&ograve", Oxf2 }, /* small o, grave accent { "&oslash", Oxf8 }, /* small o, slash */
{ "&otilde", Oxf5 /* small o, tilde "&ouml", Oxf6 }, /* small o, dieresis or umlaut mark { "&quot", '"' }, /* totally useless, but documented */
{"&szlig", Oxdf /* small sharp s, German (sz ligature) { "&thorn", Oxfe /* small thorn, Icelandic {"&uacute", Oxfa /* small u, acute accent {"&ucirc", Oxfb /* small u, circumflex accent {"&ugrave", Oxf9 /* small u, grave accent */
{"&uuml", Oxfc /* small u, dieresis or umlaut mark {"&yacute", Oxfd /* small y, acute accent */
{"&yuml", Oxff /* small y, dieresis or umlaut mark */
/* MCOM extensions, semi-standard WO 96/30846 PCTlUS96101686 lhtml_c Thu Mar 23 17:27:18 1995 7 = { "&copy", 169 { "&reg", 174 /* GWW: The following are non-standard: */
{ "@nobreakspace", OxaO}, /* non-breaking space #ifdef _C_NBS
# undef _C_NBS
#endif #define _C_NBS OxaO
{ "@exclamdown", 161 /* down exclamation point { "@cent", 162 /* cent sign { "@sterling",163 /* pound sign { "@currency",164 { "@yen", 165 /* yen sign { "@brokenbar",166 { "@section", 167 { "@diaeresis",168 { "@dieresis",168 { "@ordfeminine",170 { "@guillemotleft",171}, /* guillemot gauche */
{ "@notsign", 172 { "@hyphen", 173 { "@macro,-:". 175 { "@degre.'=, 176 { "@plusr.tinus", 177 { "@twosuper=..',178 { "@threez _:~erior",179}, { "@acute", 180 { "@mu", 181 { "@paragraph",182 { "@periodcentered",183}, /* centered period { "@cedilla", 184 { "@onesuperior",185 { "@ordmasculine",186 { "@masculine",186 { "@guillemotright",187}, /* guillemot doigt { "@onequarter",188 { "@onehalf", 189 { "@threequarters",190}, { "@questdown",191 }, /* question mark down NULL
static struct unknownchartab unknownchars[]
{149, /* Bullet */
{153, "TM"
{133, ..."}, {150, {151, --"}, {147, {148, {145, {146, {156, "oe"}, (140, "OE"}, (0, NULL) #endif /* Now for HTML keywords, or whatever static struct attribs none[] ={{ 0}};
= static struct attribs a_list[]
{"HR,=8F", VAL_STR}, ("NAME", VAL_STR}, {"TITLE", VAL_STR}, lhtmi.c Thu Mar 23 17:27:18 1995 8 ("TYPE"), /* What's this?
{"URN"}, /* and this? */
{0}

static struct attribs base_list[J = {
{"HREF", VAL-STR), {0}
static struct attribs br_list[]
{"CLEAR", VAL-STR), {0}
static struct attribs font_list[]
{"SIZE", VAL_NUM}, {0}
static struct attribs link_list[]
{"HREF", VAL_STR), /* Must be first, see slurpHeadltem ("TITLE", VAL-STR), /*
Must be second, see slurpHeadItem ("REL", VAL-STR), ("TYPE", VAL-STR), /* Should it be TYPE or REL?, well accept either {"REV", VAL_STR}, {0}
static struct attribs img_list[] [
{"SRC", VAL-STR), ("ALIGN", VAL_STR), ("ALT", VAL-STR), {"ISMAP"}, {"WIDTH",VAL_NUM}, {"HEIGHT",VAL_NUM}, {"BORDER",VAL_NUM}, {"VSPACE",VAL_NUM}, ("HSPACE",VAL_NUM), {0}

static struct attribs p_list(] _ {
{"ALIGN", VAL_STR), {0}
static struct attribs form_list[]
("ACTION", VAL-STR), {"METHOD", VAL_STR}, /* Or should the options be GET and POST? */
{0}

static struct attribs option_list(J = {
{"VALUE", VAL_STR), ("SELECTED"), {0}

static struct attribs textarea_list[J = {
{"ROWS", VAL_NUM}, {"COLS", VAL_NUM}, {"NAME", VAL_STR}, {0}

static struct attribs select_list[J
("NAME", VAL-STR), ("SIZE", VAL_STR), {"MULTIPLE", VAL-STR), {0}
static struct attribs input_list(]
{"TYPE", VAL-STR), WO 96/30846 PCTfUS96101686 lhtml.c Thu l+lar 23 17:27:18 1995 9 ("NAME", VAL-STR), {"SIZE", VAL_STR}, ("VALUE", VAL_STR), {"SRC", VAL_STR}, /* Used for the un-documented image input type*/
{"ALIGN", VAL_STR}, /* ditto ("CHECKED"), {"MAXLENGTH", VAL_NUM}, (0) static struct attribs list_list[]
{"TYPE", VAL_STR}, {"START", VAL_NUM}, {0}
static struct attribs li_list[]
{"TYPE", VAL-STR), ("VALUE", VAL_NUM), {0}
static struct attribs isindex_list[}
{"PROMPT", VAL_STR}, {0}
static struct attribs hr_list[) _ {
("SIZE", VAL_NUM}, {"WIDTH", VAL-STR), ("ALIGN", VAL-STR), ("NOSHADE"), {0}

/*--- experimental ---*/
static struct attribs refresh_list[) {"SECONDS", VAL_NUM}, {0}
/*--- experimental ---*/
struct keyparse {
char *name;
struct attribs *attr;
unsigned char html_tag;
unsigned int terminated:l;

static struct keyparse keynames[}
{ "A" , a_list, A_TAG, 1 { "ADDRESS" , none , ADDRESS_TAG, 1 { "B" none B_TAG, 1 { "BASEFONT", font_list, BASEFONT_TAG, 1 }, { "BASE" , base_list, BASE_TAG, 0 { "BODY" , none , BODY_TAG, 1 { "BLOCKQUOTE", none, BLOCKQUOTE_TAG, 1 { "BR" , br_list , BR_TAG, 0 { "CENTER" , none , CENTER_TAG, 1 { "CITE" , none , CITE_TAG, 1 { "CODE" , none , CODE_TAG, 1 { "COMMENT", none , COMMENT_TAG, 1 { "DD" , none , DD_TAG, 0 { "DFN" , none , DFN_TAG, 1 "DIR" , none , UL_TAG, 1 { "DL" , none , DL_TAG, 1 . { "DLC" , none , DLC_TAG, 1 { "DT" , none , DT_TAG, 0 { "EM" , none , EM_TAG, 1 { "FONT" , font_list, FONT_TAG, 1 11,tm1.c Thu Mar 23 17:27:18 1995 10 { "FORM" , form list, FORM_TAG, 1 { "HEAD" , none , HEAD_TAG, 1 { "Hi" , none , Hi_TAG, 1 { "H2" none , H2_TAG, 1 { "H3" none , H3_TAG, 1 { "H4" , none H4_TAG, 1 }, { "H5" , none , H5_TAG, 1 { "H6" , none , H6_TAG, 1 { "H7" , none , H7_TAG, 1 { "HR" , hr_list , HR_TAG, 0 { "HTML" , none , HTML_TAG, 1 { "I" , none , I_TAG, 1 { "IMG" , img_list, IMG_TAG, 0 { "INPUT" , input_list, INPUT_TAG, 0 { "ISINDEX" , isindex_list, ISINDEX_TAG, 0 { "KBD" , none , KBD_TAG, 1 { "LI" , li_list , LI_TAG, 0 { "LINK" , link_list, LINK_TAG, 0 { "LISTING" , none , LISTING_TAG, 1 { "MENU" , none , UL_TAG, 1 /* { "META" , none , META_TAG, 1 },*/
/* { "NEXTID" , none , NEXTID_TAG, 0 },*/
{ "NOBR" , none , NOBR_TAG, 0 }, { "OL" , list_list , OL_TAG, 1 { "OPTION" , option_list , OPTION_TAG, 0 { "P" , p_list, P_TAG, 1 { "PLAINTEXT", none , PLAINTEXT_TAG, 1 { "PRE" , none , PRE_TAG, 1 /*--- experimental ---*/
{ "REFRESH" , refresh_list, REFRESH_TAG, 0 /*--- experimental ---*/
{ "SAMP" , none , SAMP_TAG, 1 { "SELECT" , select_list, SELECT_TAG, 1 { "SP" , none , SP_TAG, 0 { "STRONG" , none , STRONG_TAG, 1 { "SUB" , none , SUB_TAG, 1 { "SUP" , none , SUP_TAG, 1 { "TEXTAREA", textarea_list,TEXTAREA_TAG, 1 { "TITLE", none , TITLE_TAG, 1 { "TT" , none , TT_TAG, 1 { "U" , none U_TAG, 1 { "UL" , list_list , UL_TAG, 1 { "VAR" , none , VAR_TAG, 1 { "WBR" , none , WBR_TAG, 0 { "XMP" , none XMP_TAG, 1 { NULL }

static int charsearch(name) char *name; {
int i;
char *ptl, *pt2;
for ( i=0; charnames[i].name!=NULL ; ++i ) {
ptl = charnames[i].name+l; pt2 = name;
while ( *pt1==*pt2 ) {
if ( *pt1=='\0' return i;
++ptl; ++pt2;
}
} I
return -1;
}

static int htmlsearch(name) char *name; {

lhtml.c Thu Mar 23 17:27:18 1995 11 int i;
char *ptl, *pt2;
int chl, ch2;

for ( i=0; keynames[i].name!=NULL ; ++i ptl = keynames[i].name; pt2 = name;
for (;;) ( chl = *ptl++; ch2 = *pt2++;
if ( chl=='\O' 11 ch2=='\O' break;
if ( islower(chl)) chl = toupper(chl);
if ( islower(ch2)) ch2 = toupper(ch2);
if ( chl!=ch2 break;
}
if ( chl=='\O' && ch2=='\O' return i;
}
return -1;
}

static char *char2names[256]; /* To go from INTERNAL to HTML */
static struct keyparse *key2names[256]; /* To go from INTERNAL to HTML */
static int inited;

/* Variables used for output static int ch_pos=0;
static int docrlfs=l;
/* Variables used for input static unsigned char *ungot;
static int rpos, rmax, rlen;
static char *tagbuf;
static int tmax;
static char *pbuf;
static long pmax;
static int *nesting, *nestoff;
static int nlevel, nmax;
static int foundplain;
static int pnum;
static HL-m].Page *page;
/* Initialize whatever needs to be. Currently this consists of generating /* a reverse mapping from characters to char names (like &quot), and another */
/* from HTML TAGs to their names void initcharnames() {
int i;

if ( !inited ) {
inited = 1;
for ( i=0 ; unknownchars[i].str!=NIILL; ++i char2names[unknownchars[i].ch] = unknownchars[i].str;
for ( i=0; charnames[i].name!=NULL ; ++i ) char2names[charnames[i].ch] = charnames[i].name;
char2names['"'] = NULL; /* There is a defn for this, but /* no reason to use it, that I see for ( i=0; keynames[i].name!=NULL ; ++i ) key2names[keynames[i].html_tag] = &keynames[i];
~ nesting = (int *) myalloc(100*sizeof(int));
nestoff = (int *) myalloc(100*sizeof(int));
nmax = 100;

1htm1.a Thu Mar 23 17:27:18 1995 12 /* Clean up whatever needs to be, currently that means freeing stuff we've /* allocated. The files should have been closed already */ -void cleanupparser() {
if ( ungot!=NULL ) myfree((char *)ungot);
ungot = NULL;
if ( nesting!=NULL ) myfree((char *)nesting);
nesting = NULL;
myfree(nestoff);
nestoff = NULL;
if ( tagbuf!=NULL ) myfree(tagbuf);
tagbuf = NULL;
if ( pbuf!=NIILL ) myfree(pbuf);
pbuf = NULL;
}
static int (*outfunc)(void *,int);
static void *outctx;

typedef struct int bpos;
int blen;
char *body;
} strctx;

static int WriteStr(ctx, ch) strctx *ctx; char ch; {
if(ctx->bpos >= ctx->blen) {
ctx->blen += 20000;
if((ctx->body = myrealloc(ctx->body,ctx->blen)) NULL) return EOF;
}
return ctx->body[ctx->bpos++} = ch;
}

static int WriteFile(ctx, ch) FILE *ctx; char ch; {
return putc(ch, ctx);
}
/* Lowest level output routine. Writes one character either to a file or an /* internal string (which may need to grow). Also changes spaces to newlines*/
/* if the line is too long */
static int outch(ch) int ch; {
if ( ++ch_pos>72 && ch==' ' && docrlfs ch = '\n' if ( ch=='\n' ) ch-pos = 0;
if(outfunc(outctx, ch) EOF) return 0;

return 1;
}

/* Output a string with no interpretation static int outst(str) char *str; {
while ( *str ) ( if ( !outch(*str)) return 0;
++str;
}
return 1; =
/* Output a string with no interpretation static int outstn(str,n) char *str; int n;
while ( *str && --n>=0 ) {

WO 96130846 PCTlUS96/01686 lhtml.c Thu Mar 23 17:27:18 1995 13 if ( !outch(*str)) return 0;
++str;
}
return 1;

/* Take this character, convert it into latinl char * LatinlCharName(int ch) {
int i;
static char buffer[10];
if ( ch<0 ) ch+=256;
if ( ch==_C_NBS
return( "<SP>" );
else if ( char2names(ch)==NULL 11 ch=='-' buffer[0}=ch; buffer[1]='\0';
return( buffer );
} else if ( *char2names[ch]!='@' ) {
strcpy(buffer,char2names[ch]);
strcat(buffer,",");
return( buffer );
} else {
if ( charnames!=latinlcharnames ) {
for ( i=0; latinlcharnames[i].name!=NULL &&
strcmp(latinlcharnames[i].name,char2names[ch])!=0 ; ++i if ( latinlcharnames(i].name==NULL ) /* Shouldn't happen */
buffer[0]=ch; buffer[1]='\0';
return( buffer ) ;
ch = latinlcharnames[i].ch;
}
sprintf(buffer,"&#%d;",ch);
return(buffer);
}
}

/* Take this character, convert it into latinl, and then output that in hex */
static int outlatinlhex(ch) int ch; {
int i;
if ( charnames!=latinlcharnames ) {
for ( i=0; latinlcharnames(i].name!=NULL &&
strcmp(latinlcharnames(i].name,char2names[ch])!=0 ; ++i );
if ( latinlcharnames[i].name==NULL ) /* Shouldn't happen */
return( outch(ch));
ch = latinlcharnames[i].ch;
}
if ( !outch('&')) return false;
if ( !outch('#')) return false;
if ( !outch('0'+(ch/100))) return false;
if ( !outch('0'+((ch%100)/l0))) return false;
if ( !outch('0'+(ch%10))) return false;
return(outch(';'));
}
/* Output a character looking out for the non-breaking space (which becomes /* <SP>) and any of the magic characters HTML understands */
static int outchar(ch) int ch; {
if ( ch<0 ) ch+=256;
if (-ch==_C_NBS ) return( outst("<SP>"));
else if (( char2names(ch]==NULL ch=='-' )&& !(ch&0200) return( outch(ch));
else if ( char2names(ch]==NULL *char2names[ch]=='@' ) /* Non-standard name.
Use 1htmi.c Thu Mar 23 17:27:18 1995 14 hex */
- return( outlatinlhex(ch));
else {
if (!outst(char2names[ch])) return(O);
return( outch(';'));
}
}

char *local2latinl(char *s) {
unsigned char *str = (unsigned char *) s;
int i;
if ( charnames==latinlcharnames return(s);

while ( *str!='\0' if ( (*str&0200) && char2names[*str)!=NULL ) {
for ( i=O; latinlcharnames[i].name!=NULL &&
strcmp(latinlcharnames[i].name,char2names[*str])!=0 ; ++i if ( latinlcharnames[il.name!=NULL
*str = latinlcharnames(i].ch;
}
++str;
}
return(s);
}

char *latinl21oca1(char *s) {
unsigned char *str = (unsigned char *) s;
int i,j;
if ( charnames==latinlcharnames return(s);

while ( *str!='\0' ) {
if ( *str&0200 ) {
for ( i=O; latinlcharnames[i].name!=NULL && latinlcharnames[i].ch!=*str; ++i if ( latinlcharnames[i].name!=NULL ) {
for ( j=0; charnames[jl.name!=NULL &&
strcmp(charnames[jl.name,latinlcharnames[i).name)!=0 ; ++j if ( charnames[j].name!=NULL
*str = charnames[j].ch;
}
}
++str;
}
return(s);
}

/* Output a string of characters where each needs to go through translation /* as described above */
static int outstr(str) char *str; {
while ( *str ) ( if ( !outchar(*str)) return 0;
++str;
return 1;

Output a string of characters where each needs to go through translation /* as described above_ The end of the string is determined by the length */
/* rather than the presence of a NUL

WO 96/30846 PCTlUS96101686 lht=1.c Thu btar 23 17:27:18 1995 15 static int outnstr(str,len) char *str; int len; {
while ( *str && len>0 ) {
- if ( !outchar(*str)) return 0;
++str; --len;
return 1;
}
/* Output a link <LINK HREF=url name>
static int OutLink(href,name,title) char *href, *name, *title; [
if ( href!=NULL ) ( if ( !outst("<LINK HREF=")) return( 0 );
if ( !outstr(href)) return( 0 );
if ( !outch(' ')) return( 0 );
if ( !outst("REL=")) return( 0 );
if ( !outst(name)) return( 0 );
if ( title!=NULL ) {
if ( !outch(' ')) return( 0 );
if ( !outst("TITLE=")) return( 0 );
if ( !outst(title)) return( 0 );
}
if ( !outst(">\n")) return( 0 }
return 1;
}

/* Output all of the stuff in a page's header. If the header is empty then */
/* don't bother. Also output <HTML> and <BODY> */
static int OutHeader(page,dobase) HtmlPage *page; int dobase; {
int i;

if ( !outst("<HTML>")) return( 0 );
if ( dobase 11 page->style 11 page->title 11 page->otherlinks page->upl 11 page->base 11 page->isindex ){
if ( !outst("<HEAD>\n")) return( 0 );
if ( page->title ) ( if ( !outst("<TITLE>")) return( 0 );
if ( !outstr(page->title)) return( 0 );
if ( !outst("</TITLE>\n")) return( 0 );
}
if ( !OutLink(page->style,"STYLE",NULL)) return( 0 );
/*if ( !OutLink(page->docname,"DOCUMENT",NULL)) return( 0 );*/
if ( !OutLink(page->upl,"UP",page->uptit)) return( 0 );
if ( page->otherlinks ) {
for ( i=0; page->otherlinks[i)!=NULL; ++i ) {
if ( !outst("<LINK ")) return( 0 );
if ( !outstr(page->otherlinks[i])) return( 0 );
if ( !outst(">\n")) return( 0 );
}
}
if ( page->headerinfo for ( i=0; page->headerinfo[i]!=NULL; ++i ) {
if ( !outst("<")) return( 0 );
if ( !outst(page->headerinfo[i])) return( 0 );
if ( !outst(">\n")) return{ 0 );
}
}
if ( page->base 11 dobase ) {
if ( !outst("<BASE HREF=")) return( 0 );
if ( page->base ) ( if ( !outstr(page->base)) return( 0 );
else if ( !outstr(page->url)) return( 0 );

WO 96/30846 PCTlUS96/01686 lhtml.c Thu Mar 23 17:27:18 1995 16 if ( !outst(">\n")) return( 0 }
if ( page->isindex ) { `
if ( !outst("<ISINDEX ")) return( 0 );
if ( page->iiprompt!=NULL && !outst(page->iiprompt)) return(0);
if ( !outst(">\n")) return( 0 );
}
if ( !outst("</HEAD>")) return( 0 );
}
if ( !outst("<BODY>")) return( 0 );
return 1;
}
/* Output an isindex form. This is now more complicated than it was because /* we need to parse the prompt text to see if we need to save out mcom's /* prompt extension to ISINDEX */
static int outisindex(Para *para) {
char *ptext = para->first->post->text;
char *pt = strchr(ptext,HTML_MARK);
char *def = DEF_ISINDEX_PROMPT;

if ( pt==NULL ) return( outst("<ISINDEX>\n"));
if ( strlen(def)==pt-ptext && strncmp(ptext,DEF_ISINDEX_PROMPT,pt-ptext)==O
return( outst("<ISINDE%>\n"));

if ( !outst("<ISINDEX PROMPT=\"")) return 0;
if ( !outstn(ptext,pt-ptext)) return 0;
return outst("\">\n*');
}
/* Output a paragraph. There are two cases, a paragraph of paragraphs, and a /* paragraph of text. in the former case we run through all the sub-para- */
/* graphs and recurse. In the latter case we go through all the text of the */
/* paragraph and check for nested HTML inside. In both cases we precede the */
/* paragraph with its HTML mark (<P>, <H1>, <LI>, ...) and follow with its /* terminator */
static int OutPara(page,para) HtmlPage *page; Para *para; {
unsigned char *str;
struct keyparse *nesting[500};
int nest=0, middocrlfs;
int len, tag;
int printed-p = 1;
Para *np;

while ( para != NULL
if ( para->tag==FORM_TAG && para->isindex ) {
/* If it is an auto-generated form then don't output it as such */
/* if the isindex was in the header (where it should be) then do */
/* nothing, else put out an ISINDEX in the body (here) */
if ( !page->isindex && !outisindex(para) ) goto failure;
goto next_para;
}
while (1) {
if ( para->tag==PRE_TAG 11 para->tag==LISTING_TAG 11 para->tag==PLAINTEXT_TAG
docrlfs = 0;
if ( para->tag==P_TAG && para->fake printed_p = 0;
else if ( para->tag!=P_TAG para->tagtext!=NULL 11 para->parent==NULL
para->parent->first para 11 para->parent->tag<PLISTTAG_START
para->parent->tag>PLISTTAG_END ) {
if ( !outch('<')) goto failure;
if ( !outst(key2names[para->tag3->name)) goto failure;
.

vVO 96130846 PCTIUS96J01686 lhiml.c Thu Mar 23 17:27:18 1995 17 if ( para->tagtext!=NULL ) {
if ( !outstr(para->tagtext)) goto failure;
}
if ( !outch('>')) goto failure;
printed_p = 1;
} else printed_p = 0;
if ( para->first==NULL
break;
para = para->first;
}
if ( para->text != NULL
middocrlfs = docrlfs;
for ( str = (unsigned char *) (para->text); *str!='t0'; ++str if ( *str!=HTML_MARK ) {
if ( !outchar(*str)) return( 0 );
} else {
len = str[HTML_LEN_HIGH]*256+str[HTML_LEN_LOW];
tag = (unsigned char) str[HTML_POS_TAG];
if ( tag==TEXTAREA_TAG ) docrlfs = 0;
if ( tag==END_TAG ) docrlfs = middocrlfs;
if (-tag==END_TAG && nest>O ) ( if ( !outst("</")) goto failure;
if ( !outstr(nesting[--nest}->name)) goto failure;
if ( !outch('>')) goto failure;
} else if ( tag==ERROR_TAG ) {
/* Skip it */;
} else if ( tag==UNF¾NOWN_TAG ) {
if ( !outch('<')) goto failure;
if ( !outnstr((char *)str+4,len)) goto failure;
if ( !outch('>')) goto failure;
} else if ( key2names[tag]!=NULL ) ( if ( key2names[tag]->terminated nesting[nest++] = key2names[tag];
if (( tag==INPLJT_TAG tag==SELECT_TAG 11 tag==OPTION_TAG) && ch_pos!=0 && docrlfs ) if ( !outch('\n')) goto failure;
if ( !outch('<')) goto failure;
if ( !outstr(key2names[tag)->name)) goto failure;
if ( !outnstr((char *)str+4,len)) goto failure;
if ( !outch('>')) goto failure;
}
str += len+3;
}
}
if ( nest!=0 ) IError( "Nesting level all wonky");
if ( !outch('\n')) goto failure;
}
if ( printed_p && docrlfs && !outch('\n')) goto failure;
next_para:
if ( para->post==NULL ) {
while ( para!=N'ULL && para->post==NULL ) {
if ( para->tag!=P TAG && key2names[para->tag]->terminated) {
if ( !outst("</")) goto failure;
if ( !outst(key2names[para->tag]->name)) goto failure;
if ( !outch('>')) goto failure;
}
para = para->parent;
}
if ( para==NULL
break;
docrlfs = !ParaPreformatted(para);
if para->tag!=P_TAG && key2names[para->tag]->terminated) {

lhtml.c Thu Mar 23 17:27:18 1995 18 if ( !outst("</")) goto failure;
if ( !outst(key2names[para->tag}->name)) goto failure;
if ( !outch('>')) goto failure;
}
para = para->post;
}
docrlfs = 1;
return 1;
failure:
docrlfs = 1;
return 0;
}
/* Output one page of HTML, first doing its header then its body (paragraphs) */
static int OutHtmlPage(page,dobase) HtmlPage *page; int dobase; {
Para *para;
ch_pos = 0;
if ( !OutHeader(page,dobase)) return 0;
if ( !OutPara(page,page->first)) return 0;
if ( outst("</BODY></HTML>\n")) return 0;
return 1;
}
static int write_null PROTOTYPE ((void *foo, int bar)) {
IError("bad writer state!");
return EOF;
}

int WriteHtmlPage(page, dobase, func, context) HtmlPage *page; int dobase; int (*func)(voi d *,int); void *context; {
int ret;
outfunc = func;
outctx = context;
ret = OutHtmlPage(page, dobase);
outfunc = write_null;
outctx = (void *)0;
return ret;
}
int WriteHtmlBody(page, func, context) HtmlPage *page; int (*func)(void *,int); void *cont ext; {
int ret = 1;
Para *para;
outfunc = func;
outctx = context;
ret = OutPara(page,para->first);
outfunc = write_null;
outctx = (void *)0;
return ret;
}
/* Output a page to a file */
int XVT_CALLCONV1 HtmlPage2File(page,filename,dobase) char *filename; HtmlPage *page; int dobase; {
#if defined(macintosh) FILE *output = fopen(filename,"wb");
#else FILE *output = fopen(filename,"w");
#endif int ret;

if (output == NULL) return -2;

lhtml.c Thu Mar 23 17:27:18 1995 19 ret = WriteHtmlPage(page,dobase,(int (*)(void *,int))WriteFile,output);
fclose( output );
return( ret );
}

/* Convert a page to HTML and store the result in a string. We return the /* string, but the caller is not allowed to free it_ /* why not? it looks like the caller should...*/
char * XVT_CALLCONV1 HtmlPage2Str(page,dobase) HtmlPage *page; int dobase; {
int ret;
strctx sc;
sc.bpos = 0;
sc.blen = 0;
sc.body = (char *)0;
ret = WriteHtmlPage(page,dobase,(int (*)(void *,int))WriteStr,&sc);
if ( !ret return( NULL );
sc.body[sc.bpos] = '\0';
return( sc.body );
}
int XVT_CALLCONVI HtmlPage2URL(page,url) HtmlPage *page; char *url; {
return -2;
}
static int (*infunc)(void *);
static void *inctx;

static int haspeek;
static int peekch;
#if Dbg_Test static FILE *dump;
#endif /* Low level input routine for one character. No interpretation is placed on /* the character */
static int inch() {
int ch;
if(haspeek) {
haspeek = 0;
return peekch;
}
if (( ch = infunc(inctx))==HTML_MARK
ch = '?', #if Dbg_Test if ( dump!=NULL
fputc(ch,dump);
#endif return ch;

/* Back up one character (backed up characters will still be interpretted) /* at most one character may be backed up static int ungetch(ch) int ch; {
haspeek++;
peekch = ch;
return 1;
}
/* Back up one character (backed up characters will not be interpreted, but */
/* will be treated litterally). There is no maximum on how much we may back */
static int ungetchr(ch) int ch; {
if ( ch==EOF

WO 96/30846 PCTlUS96/01686 lbtml.c Thu E[ar 23 17:27:18 1995 20 return( 1 if ( rmax>=rlen ) { _ rlen += 1000;
if (( ungot = (unsigned char *) myrealloc((char *) ungot,rien)) NULL
return 0;

ungot[rmax++]= ch;
return 1;
}
#ifdef debug static void reporterror(err) int err; {
switch ( err ) ( case HTM_ERR_BADAMP: _html_error("& followed by an invalid-escape sequence\n"
); brea k;
case HTM_ERR_NOGT: _html_error("A termination tag had attributes\n" ); break;
case HTM_ERR_MISTAG: _html_error("A termination tag did not match the opening tag it should have\n" ); break;
case HTM_ERR_TAGEOF: _html_error("An EOF was read before the closing >\n" );
break;
case HTM_ERR_ATTRS: _html_error("An attribute was given to a tag which has none\n" );
break;
case HTM ERR_BADATTR: _html_error("A bad attribute was given to a tag\n" );
break;
case HTM ERR_NOQUOTE: _html_error("No closing quote for an attribute's value\n" ); br eak;
case HTM_ERR_NOVALUE: _html_error("No value given for attribute that needs one\n" );
break;
case HTM_ERR_BADVALUE: _html_error("Value given for attribute that shouldn't have one \n" ); break;
case HTM_ERR_BADHEADER: _html_error("Body item found in header\n" ); break;
case HTM_ERR_BADBODY: _html_error("Header item found in body\n" ); break;
case HTM_ERR_TRAILCH: _html_error("Characters found after page end\n" );
break;
case HTM_ERR_BADNEST: _html_error("Some tags not closed\n" ); break;
case HTM ERR_TAGINTITLE: html_error("Tag within a title tag\n" ); break;
case HTM ERR_BADTAGINBODY: _html_error("HEAD, BODY, or HTML tag found inside BODY\n"
); break;
default: _html_error("Unknown error %d\n", err ); break;
}
}
#endif /* Push an error flag back onto the input stack static void ungeterr(page,err,arg,pushmark) HtmlPage *page; int err,arg, pushmark; {
ungetchr(arg);
ungetchr(err$256);
ungetchr(err/256);
ungetchr(ERROR_TAG);
ungetchr(3);
ungetchr(0);
if ( pushmark ) ungetchr(HTML_MARK);
#ifdef debug reporterror(err);
#endif page->haderrors = true;
}

static void addheadererr(page,err,arg) HtmlPage *page; int err, arg; {
int i;

i = 0; if (-page->headererrs!=NULL
for ( ; page->headererrs[i)!='\0'; ++i );
page->headererrs = (short *) myrealloc((char *) page->headererrs,(i+2)*sizeof(*page->h eadererrs)); =
page->headerargs = (char *) myrealloc((char *) page->headerargs,(i+2)*sizeof(*page->he lhtml.c Thu Mar 23 17:27:18 1995 21 aderargs));
) {
if ( err!=O
page->headererrs[i]= err;
page->headerargs[i]= arg;
#ifdef debug reporterror(err);
#endif } else {
page->headererrs[i] = inchr()*256;
page->headererrs[i] += inchr();
page->headerargs[i] = inchr{);
}
page->headererrs[i+l] = '\0';
page->headerargs[i+l] = '\0';
page->haderrors = true;
}
static void addtrailerr(page,err,arg) HtmlPage *page; int err,arg; {
int i;

i = 0;
if ( page->trailerrs!=NULL
for ( ; page->trailerrs[i]!='\0'; ++i );
page->trailerrs = (short *) myrealloc((char *) page->trailerrs,(i+2)*sizeof(*page->tra ilerrs));
page->trailargs = (char *) myrealloc((char *) page->trailargs,(i+2)*sizeof(*page->head erargs));
if ( err!=0 ) {
page->trailerrs[i]= err;
page->trailargs[i]= arg;
#ifdef debug reporterror(err);
#endif } else {
page->trailerrs[i] = inchr()*256;
page->trailerrs[i] += inchr();
page->trailargs[i]= inchr();
}
page->trailerrs[i+l] = '\0';
page->trailargs[i+1] = '\0';
page->haderrors = true;
}
/* Push an end flag back onto the input stack static void ungetend(tag) int tag; {
ungetchr(tag);
ungetchr(END_TAG);
ungetchr(l);
ungetchr(O);
ungetchr(HTML_MARK);
}

/* Push a tag onto the stack after we read one too far static void ungettag(tag,len) int tag, len; {
ungetchr(tag);
ungetchr(len%256);
ungetchr(len/256);
ungetchr(HTML_MARK);
}

static int slurptag() {
int ch, tpos=0, len;
while ((ch=inch())!='>' && ch!=EOF ) {

lhtml.c Thu ldar 23 17:27:18 1995 22 if ( tpos>=tmax tagbuf = myrealloc(tagbuf,tmax += 400);
tagbuf[tpos++]=ch;
}
if ( ch==EOF ) s ungeterr(page,HTM_ERR_TAGEOF,nesting[nlevel-1],true);
len = tpos;
while ( tpos>0 ungetchr(tagbuf[--tpos]);
return(len);
}
static char *slurpTagText(len) int len; {
int tpos=0;

if ( len<=0 return(NULL);
if ( len>=tmax tagbuf = myrealloc(tagbuf,tmax = len+400);
while ( --len>=0 ) tagbuf[tpos++]=inchr();
tagbuf[tpos]='\D';
return(copy(tagbuf));
}

static void newnest(tag) int tag; {
if ( nlevel>=nmax ) {
nesting = (int *) myrealloc((char *) nesting,(nmax+=100)*sizeof(int));
nestoff = (int *) myrealloc((char *) nestoff,(nmax+=100)*sizeof(int));
}
nestoff[nlevel] = -1;
nesting[nlevel++] = tag;
}

static void setnestoff(int off, int tag) {
int i;

for ( i=nlevel-1; nestoff[i]==-1; --i );
for ( ++i ; i<nlevel && nesting[i]!=tag; ++i );
if ( i>=nlevel ) IError("Nest offset quite wrong");
else if ( nesting[i]!=tag ) IError("Nest offset: Can't find right tag");
else nestoff(i] = off;
}

/* Input a character of the form &#xx; where x is a hex digit /* These characters are said to be in latinl, so if we are not running under /* X we must convert the letter into a character name (by looking it up in */
/* the latinl charname table) and then convert the name back into the current*/
/* character set static int indecO {
int ch, resch, i;
resch = 0;
while ((ch = inch())!=EOF && isdigit(ch) ) { ~
resch = 10*resch + (ch-'0');
} if ( ch!= ) =
ungetch(ch);
if ( charnames==latinlcharnames ) =
return( resch WO 96130846 PCTf7JS96101686 lhtml.c Thu Mar 23 17:27:18 1995 23 for ( i=0; latinlcharnames[i].name!=NULL && latinlcharnames[i].ch!=resch; ++i );
if ( latinlcharnames(i].name==NULL ) /* Can't find it return( resch );
i = charsearch(latinlcharnames(i].name);
= if ( i!=-1 ) resch = charnames[i].ch;
return( resch }
/* Check to see if we use any of mcom's extensions static void checkformcom(tag,len) int tag,len; {
char buffer[50];

if ( tag==NOBR_TAG 11 tag==WBR_TAG 11 tag==FONT_TAG
tag==BASEFONT_TAG 11 tag==CENTER_TAG
page->mcomextensions = true;
else if ( len!=0 && (tag==ISINDEX_TAG 11 tag==HR_TAG tag==UL_TAG
tag==OL_TAG 11 tag==LI_TAG J1 tag==BR_TAG )) page->mcomextensions = true;
else if ( !page->mcomextensions && tag==lMG_TAG && len!=0 ) {
parseAttrs(page,IM(3_TAG,tagbuf,len,false);
if ( img_list[4].len!=0 11 img_list[5].len!=0 img_list[6].len!=0 img_list[7].len!=0 img_list[8]-len!=0 page->mcomextensions = true;
else if ( img_list[1].len!=0 ) {
strncpy(bufer,img_list[1].val,min(sizeof(buffer),img_list[1].len));
buffer[sizeof(buffer)-1}='\0';
if ( img_list(1).len<sizeof(buffer)-1) bufer[img_list[l].len]='\0';
if ( strmatch(buffer,"top")!=0 && strmatch(buffer,"bottom")!=0 &&
strmatch(buffer,"middle")!=0 page->mcomextensions = true;
}
}
}
/* Input one character looking out for special stuff like &quot; or <HTML> */
static int inchr() {
char buffer[80];
register int i, s, ch, len, och, anynonp, hadsemi;
if ( rmax>0 ) return( ungot[--rmax]);
ch = inch();
if ( foundplain ) /* No interpretation of anything return( ch );
if ( (ch=='&' && (nlevel==0 11 nesting[nlevel-1]!=LISTING_TAG)) ch=='<' ) {
i = 0;
och = ch;
hadsemi = false;
if ( ch=='&' ) {
if (( ch=inch())=='#' return( indec());
{
while ( isalpha(ch) && i<sizeof(buffer)-l) buffer[i++] = ch;
ch = inch();
if ( ch==' ) hadsemi = true;
} else if ( (ch=inch())=='!' ) {
/* HTML comment. Just eat it for now while ( (ch=inch())!=EOF && ch!='>' );
return(inchr());
} else {

lbtml.c Thu Mar 23 17:27:18 1995 24 while ( ch!=EOF && navi_isspace(ch)) ch=inch();
if ( ch=='/' ) {
buffer(i++]='/';
ch = inchO;

while (ch!=EOF && navi_isspace(ch)) ch=inch();
while ( isalnum(ch) && i<sizeof(buffer)-i ) {
buffer[i++]=ch;
ch = inch();
if ( !hadsemi ungetch(ch); /* will be interpreted buffer[i]='\0';
if ( nlevel!=O && nesting[nlevel-1]==LISTING_TAG && och=='<' &&
strmatch(buffer,"/LISTING")!=0 for ( i=strlen(buffer)-l ; i>=0 ; --i ) ungetchr(buffer[i]);
ch = '<', } else if ( och=='&' && (i = charsearch(buffer))== -1 /* Unknown character name, treat as literal &
if ( hadsemi ) ungetchr(';');
for ( i=strlen(buffer)-1 ; i>=0 ; --i ungetchr(buffer[i]);
ungetchr('&');
ungeterr(page,HTM_ERR_BADAMP,ERROR_TAG,false);
ch = HTML_MARK; /* We return this } else if ( och=='&' ) {
/* Known character name. Return it, but check to see if we read */
/* too much (&Eacutemile must be read as E'mile not as E') #ifdef debug _html_error("character matched &%s with %s (%c)\n", buffer, charnames[i].name, charnames[i].ch);
*endif ch = charnames[i].ch; /* We return this s = strlen(charnames[i].name)-1;
if (( i = strlen(buffer)-l )>= s if ( hadsemi ) ungetchr(';');
for ( ; i>=s; --i ) ungetchr(buffer(i]);
}
} else if (( buffer[0]=='/' && ( i= htmlsearch(buffer+l))== -1 (buffer[0]!='/' && (i = htmlsearch(buffer))== -1 )) {
/* Unknown html tag, put whole thing into text #ifdef debug _html_error("unknown html tag <$s\n", buffer );
#endif len = slurptag();
for ( i=strlen(buffer)-l ; i>=0 ; --i, ++len ungetchr(buffer(i]);
ungetchr(UNKNOWN_TAG);
ungetchr(len%256);
ungetchr(len/256);
ch = HTML_MARK; /* We return this } else if ( buffer[0]=='/' ) {
/* Known ending tag #ifdef debug _html_error("tag matched <%s with %s (%d) nlevel=%d nest=%d\n", buffer, keynames[i].name, keynames[i].html_tag, nlevel, nesting[nlevel #endif while( navi_isspace(ch = inchO));
if ( ch!='>' ) {
ungeterr(page,HTM_ERiZ_NOGT,keynames[i].html_tag,true);

lhtml.c Thu Mar 23 17:27:18 1995 25 while ( ch!=EOF && ch!='>' ch = inch();
}
anynonp = -1;
for ( s=nlevel-1; s>=0 && nesting[s]!=keynames[i].html_tag; --s ) if ( nesting[s]!=P_TAG ) anynonp = s;
if ( anynonp!=-l ) ungeterr(page,HTM_ERR_MISTAG,keynames[i}.html_tag,true);
if ( s>=O ) {
for ( ; s<=nlevel-1; ++s ungetend(nesting[s]);
}
ch = inchr(};
} else if ( keynames[i].html_tag==SP_TAG
ch = _C_NBS;
inch(); /* throw out >
} else {
/* Known start tag if ( keynames[i].terminated newnest(keynames(i].html_tag);
#ifdef debug _html_error("tag matched <%s with %s (%d) nlevel=%d nest=%d\n", buffer, keynames[i].name, keynames[iJ.html_tag,-nlevel, nesting[nlevel #endif len = slurptag();
if ( !page->mcomextensions checkformcom( keynames[i].html_tag,len );
ungetchr(keynames[i).html_tag);
ungetchr(len%256);
ungetchr(len/256);
ch = HTML MARK; /* We return this if ( keynames[i].html_tag==PLAINTEXT_TAG
foundplain = 1;
}
} else if ( ch==HTML_MARK ) /* If there were an HTML_MARK in the file ch = inchr(); /* already, ignore it. It'd confuse us.
return( ch );
}
static void skip(len) int len; {
while ( --len >= 0 inchr();
}

static int hasListParent(parent) Para *parent; {
while ( parent!=NULL ) {
if ( parent->tag>=DIR_TAG && parent->tag <= UL_TAG
return 1;
parent = parent->parent;
}
return 0;
}

/* Are any of the parent paragraphs preformatted ?
int ParaPreformatted(para) Para *para; {

if (,nesting!=NULL && nlevel>0 && nesting[nlevel-1] == TEXTAREA_TAG
return true;

while ( para!=NULL ) {
if ( para->tag == PRE_TAG para->tag==LISTING_TAG
-lhtml.c Thu ffiar 23 17:27:18 1995 26 para->tag == PLAINTEXT_TAG
- return true;
para = para->parent;
}
return false;
}

static char *slurpwhite(str, plen) char *str; int *plen; {
int len = *plen;
while(len > 0 && navi_isspace(*str)) {
++str;
--len;
}
*plen = len;
return str;
}
static struct attribs *parseAttrs(page,tag,str,len,stufferr) HtmlPage *page;
int tag, len, stufferr; char *str; ( char buffer[80], *pt;
int i, hadquote;
struct attribs *attr;
str = slurpwhite(str, &len);
if ( key2names[tag]==NULL 11 (attr = key2names[tag]->attr)== none if ( len!=0 && stufferr) ungeterr(page,HTNI_ERR_ATTRS,tag,true);
return(NULL);
} for ( i=0; attr[i].name!=NULL; ++i ) {
attr[i].present = 0;
attr[i].len = 0;
}
while ( len > 0 ) {
str = slurpwhite(str, &len);
pt = buffer;
while ( len>0 && isalpha(*str) && pt<buffer+sizeof(buffer)-i *pt++ = islower(*str)?toupper(*str):*str;
++str; --len;
}
if ( pt==buffer ) {
/* Prevent infinite loops on bad input *pt++ = *str++;
--len;
}
*pt = '\0';
for ( i=0; attr[i].name!=NULL && strcmp(attr[i].name,buffer)!=0; ++i );
if ( attr(i].naxne==NULL ) {
if ( stufferr ) ungeterr(page,HTM_ERR_BADATTR,tag,true);
if ( *buffer=='\0' ) {
++str; --len;
}
} else attr[i}.present=l;
str = slurpwhite(str, &len);
pt = NULL;
if ( attr[i].name==NULL ) -/* Ignore it */;
else if ( len>0 && *str=='=' ) { .
if ( stufferr && attr[i].value==VAL_NONE
ungeterr(page,HTM_ERR_BADVALUE,tag,true);
++str; --len;
pt = str = slurpwhite(str, &len);
.

lhtml.c Thu Mar 23 17:27:18 1995 27 if ( len>0 && *str== -'I hadquote = true;
pt = ++str; --len;
while ( len>=O && *str!='"' ++str; --len;
}
if ( len<O && stufferr ungeterr(page,HTM_ERR_NOQUOTE,tag,true);
} else {
hadquote = false;
while ( len>O && !navi_isspace(*str) ++str; --len;
}
}
if ( attr[i).name!=NULL ) {
attr[i].val = pt; attr[i].len = str-pt;
}
if ( hadquote && len>O && *str== "'=
++str; --len;

} else {
if ( stufferr && attr[i].name!=NULL && attr[i].value!=VAL_NONE
ungeterr(page,HTM_ERR_NOVALUE,tag,true);
}
}
return( attr );
}

static struct attribs *slurpParseAttrs(page,tag,len) HtmlPage *page; int tag,len; {
int i;
if ( len>=tmax tagbuf = myrealloc(tagbuf,tmax = len+400);
for ( i=O; len>O; tagbuf[i++]=inchr(), --len );
return( parseAttrs(page,tag,tagbuf,i,true));

} static int unnest(page, len, tag) HtmlPage *page;, int len, tag; {
if ( len!=l ) IError("Bad ending tag");
else if ( inchr()!=tag ) ungeterr(page,HTM_ERR_MISTAG,tag,true);
else if ( nlevel<=O ) 2Error("Nesting all screwed up in input");
else {
--nlevel;
return 1;
}
return 0;
}

static char *slurp2end(page,tag) HtmlPage *page; int tag; {
int i, ch, len;
int nl=nlevel;
i = 0;
keeporx :
for (ch=inchr())!=EOF && ch!=HTML_MARK; ++i ) {
if ( i>tmax ) tagbuf = myrealloc(tagbuf,tmax+=400);
tagbuf[i]= ch;
}
len = inchr()*256;
len += inchr();

3.html.c Thu Mar 23 17:27:18 1995 28 ch = inchr();
if ( ch==ERROR_TAG ) { _ len = inchr()*256;
len += inchr();
addheadererr(page,len,inchr());
goto keepon;
} else if ( ch!=END_TAG
skip(len);
addheadererr(page,HTM_ERR_TAGINTITLE,ch);
goto keepon;
} else if ( ch==END_TAG && nl<nlevel unnest(page,len,nesting[nlevel-1]);
goto keepon;
}
unnest(page,len,tag);
return( copyn(tagbuf,i));
}

static void slurpHeadItem(page,tag,len) HtmlPage *page; int tag, len; {
struct attribs *attr;
char *pt;
int i;
char buffer[20];
attr = NULL;
if ( tag!=ERROR_TAG
attr = slurpParseAttrs(page,tag,len);
if ( tag==ISINDEX_TAG ) {
page->isindex = true;
if ( attr[O).len==0 ) page->iiprompt = NULL;
else page->iiprompt = copy(tagbuf);
} else if ( tag==BASE_TAG ) {
page->base = copyn(attr[0].val.,attr[O].len);
} else if ( tag==LINK_TAG ) {
char *href=NULL, *title=NULL;
int found = 0;
for ( i=0; attr[i].name!=NULL; ++i ) {
if ( attr[i].present ) {
if ( strcmp(attr[i].name,"HREF")==0 href = copyn(attr[i].val,attr[i].len);
else if ( strcmp(attr[i].name,"TITLE")==O
title = copyn(attr[i).val,attr[i].len);
else if ( href!=NULL && (strcmp(attr[i].name,"REL")==0 strcmp(attr[i].name,"TYPE")==0 )) {
strncpy(buffer,attr[i].val,min(sizeof(buffer),attr[i].len));
buffer[sizeof(buffer)-1]='\0';
if ( attr[i].len<sizeof(buffer)-1 buffer[attr[i].len}='\0';
if ( strcmp(buffer,"UP")==0 ) ( page->upl = href; found = 1;
page->uptit = title;
) else if ( strcmp(buffer,"DOCUMENT")==O
page->docname = href; found = 1;
} else if ( href!=NULL && strcmp(buffer,"STYLE")==O ) {
page->style = href; found = 1;
} ., }

} if (!found ){ /* Not one of ours for ( pt=tagbuf; len>0 && navi_isspace(*pt); ++pt) --len;
if ( len>0 ) {

vVO 96130846 PCTIUS96/02696 lhtml.c Thu Ddar 23 17:27:18 1995 29 i = 0;
if ( page->otherlinks!=NULL
for ( ; page->otherlinks[i]!=NIJLL; ++i );
page->otherlinks = (char **) myrealloc((char *) page->otherlinks,(i+2)*siz eof(char *));
page->otherlinks[i] = copyn(pt,len);
page->otherlinks[i+1] = NULL;
if ( href!=NULL ) myfree(href);
}
}
} else if ( tag==TITLE_TAG ) {
page->title = slurp2end(page,tag);
} else if ( tag==UNKNOWN_TAG
i = 0;
if ( page->headerinfo!=NULL
for ( ; page->headerinfo[i]!=NULL; ++i );
page->headerinfo = (char **) myrealloc((char *) page->headerinfo,(i+2)*sizeof(char *));
page->headerinfo[i] = copyn(tagbuf,len);
page->headerinfo[i+l) = NULL;
/*--- experimental ---*/
} else if ( tag==REFRESH_TAG
char *num = copyn(attr[07.val,attr[0].len);
page->refresh = atol(num);
myfree(num);
/*--- experimental ---*/
} else if ( tag==ERROR_TAG }
addheadererr(page,O,ERROR_TAG);
}

static void slurpHeader(page) HtmlPage *page; {
int ch, len, tag;
int nl = nlevel;
for (;;) C
while ( (ch=inchr())!=EOF && navi_isspace(ch));
if ( ch!=HTML_MARK
break;
len = inchr()*256;
len += inchr();
tag = inchrO;
if ( tag==END_TAG ) {
/* End header */
if ( !unnest(page,len,HEAD TAG)) continue;
return;
}
if ( tag==UNKNOWN TAG 11 tag==ERROR_TAG tag==LINK_TAG
tag==ISINDEX_TAG 11 tag==BASE_TAG 1+ tag==TITLE_TAG
slurpHeadItem(page,tag,len);
else if ( tag==BODY_TAG ) {
addheadererr(page,HTM_ERR_BADHEADER,BODY_TAG);
ungettag(tag,len);
--nlevel;
return;
} else {
ungettag(tag,len);
ch = inchr();
break;
}
ungetchr(ch);
addheadererr(page,HTM_ERR_BADHEADER,ERROR_TAG);
nesting[nl-1]= BODY_TAG;

lhtml.o Thu Mar 23 17:27:18 1995 30 return;
}

/* Terminate all outstanding tags above basenl, and pop them off the stack static int end2base(basenl,i,tag).long basenl,i,tag;
int pushtag=0;
int ntag;

if ( nlevel>basenl && nesting[nlevel-1]==tag ) {
pushtag = 1;
--nlevel;
}
while ( nlevel>basenl ) {
ntag = nesting[--nlevel];
if ( ntag<PARA_START ntag>PARA_END
if ( i+5 >= pmax pbuf = myrealloc(pbuf,pmax += 5*(nlevel-basenl));
pbuf[i++]= HTML_MARK;
pbuf[i++]= 0;
pbuf[i++)= 1;
pbuf[i++]= END_TAG;
pbuf[i++)= ntag;
}
}
if ( pushtag nesting[nlevel++] = tag;
return(i);
}
/* We pretend that seperate lines of a <PRE> paragraph are seperate paras /* we do that to avoid the 64k limit which we run into on big <PRE>s (ie a /* whole file in one <PRE>). But this means we must terminate all the tags /* at the end of each line, and then restart them */
/* This routine is similar to the above but it does not pop stuff ended static long endtags(long pi, int fromnl int nls, len;

len = (nlevel-fromnl-l) * HTML_END_LEN;
if ( pi+len >= pmax #ifdef MEMORY_MASK
if ( pmax+4000L+len > MEMORY_MASK
pmax = MEMORY_MASK;
else #endif pmax += 4000+len;
if ( pi+len+2>pmax return( pi );
pbuf = myrealloc(pbuf,pmax);
}
for ( nls=nlevel-1; nls>fromnl; --nls ) {
pbuf[pi++] = HTML_MARK;
pbuf[pi++] = 0;
pbuf[pi++] = 1;
pbuf[pi++] = END_TAG;
pbuf(pi++] = nesting[nls];
}
pbuf[pi)='\O';
return pi;

/* See above comment static long restarttags(long pi, int fromnl, int topnl, char *oldstr ){
int nls, len, oldoff;
char *pt;

= lhtml.c Thu Mar 23 17:27:18 1995 31 if ( oldstr==NULL 11 fromnl>=topnl return 0;

- len = 0;
if ( topnl>nlevel ) topnl = nlevel;
for ( nls=fromnl+l; nis<topnl; ++nls len += HTML_HEAD_LEN +
((unsigned char *) oldstr)[nestoff[nls]+HTML_LEN_HIGH]*256 +
((unsigned char *) oldstr)[nestoff[n1s]+HTML_LEN_LOW];
if ( pi+len >= pmax ) {
#ifdef MEMORY_MASK
if ( pmax+4000L+1en > MEMORY_MASK
pmax = MEMORY_MASK;
else #endif pmax += 4000+1en;
if ( pi+len+2>pmax return( pi );
pbuf = myrealloc(pbuf,pmax);
}
for ( nls=fromnl+l; nls<topnl; ++nls ) {
pt = oldstr + nestoff[nls];
len = HTML_HEAD_LEN +
((unsigned char *) pt)[HTML_LEN_HIGH]*256 +
((unsigned char *) pt)[HTML_LEN_LOW];
oldoff = pi;
while ( --len >= 0 pbuf[pi++] = *pt++;
nestoff[n1s} = oldoff;
}
pbuf[pi]='\0';
nestoff[topnl]= -1;
return pi;
}
/* We got an ISINDEX tag, we need to turn it into a form static void makeSearchForm(page,para) Para *para; HtmlPage *page; {
char buffer[600];
char *pt;
char *pad;
char *oldtag = para->tagtext;
char *prompt;

para->tag = FORM_TAG;
para->pnum = pnum++;
if (page->url) {
strcpy(buffer,"ACTION=");
strcat(buffer,(pt=strrchr(page->url,'/')) ? pt+l : page->url);
} else {
buffer[0] = '\0';
}
para->tagtext = copy(buffer);
para->first = (Para *) myalloc(sizeof(Para));
para->first = (Para *) myalloc(sizeof(Para));
para->first->tag = P_TAG;
para->first->pnum = pnum++;
pad = "brekhead TYPE=TEXT NAME=ISINDEX";
prompt = NULL;
if (-oldtag!=NULL &&
HTML_HasAttrStr(oldtag,ISINDEX_TAG,buffer,sizeof(buffer),"PROMPT"
prompt = buffer;
if ( prompt==NULL ) prompt = DEF_ISINDEX_PROMPT;

WO 96/30846 PCTl13S96/01686 1htm1.c Thu Mar 23 17:27:18 1995 32 para->first->tlen = strlen(prompt)+strlen(pad)+2*HTML_HEAD_LEN;
para->first->tmax = para->first->tlen+l;
para->first->text = myalloc(para->first->tmax);
HTML_FillTag(para->first->text,HR_TAG);
strcpy(para->first->text+HTML_HEAD_LEN,prompt);
strcat(para->first->text+HTML_HEAD_LEN,pad);
HTML_Fi11Tag(para->first->text+para->first->tlen-HTML_HEAD_LEN,HR_TAG);
pt = strstr(para->first->text+HTML_HEAD_LEN,"brekhead");
HTML_Fi11Tag(pt,BR_TAG);
pt[HTML_HEAD_LEN]=HTML_MARK; pt[HTML_HEAD_LEN+HTML_LEN_HIGH]='\0';
pt[HTML_HEAD_LEN+HTML_LEN_LOW]=para->first->tlen-HTML_HEAD_LEN-(pt+$-para->first->text);
pt[HTML_HEAD_LEN+HTML_POS_TAG]=INPUT_TAG;
para->first->parent = para;
para->isindex = true;
}
static Para *slurpFigureNewPara(HtmlPage *page, Para *parent, Para *para, int preparent, i nt fake, int basenl) {
int ch, len, tag, isindex;
char *oldtext;
retry:
ch = inchr();
isindex = 0;
if ( !preparent while ( ch!=EOF && navi_isspace(ch)) ch = inchr();
if ( ch==HTML_MARK ) ( len = inchr()*256;
len += inchr(;
tag = inchr();
}
if ( para!=NULL && para->first==NULL &&
(para->tag==LI_TAG para->tag==DD_TAG 11 para->tag==DT_TAG
para->tag==PRE_TAG para->tag==ADDRESS_TAG
para->tag==BLOCKQUOTE_TAG )) {
para->first = (Para *) myalloc(sizeof(Para));
para->first->tag = P_TAG;
para->first->parent = para;
para->first->pnum = pnum++;
para->first->fake = para->tag==PRE_TAG;
}
if ( ch==EOF ) {
return(para);
} else if ( ch!=HTML_MARK ) {
tag = P_TAG;
len = 0;
if ( nlevel==basenl newnest(P_TAG);
else nesting[basenl] = P_TAG;
ungetchr(ch);
} else if ( tag==END_TAG ) {
/* Terminate final <LI> within <UL>
if ( parent!=NULL && parent->tag!=nesting[nlevel-1] &&
parent->parent!=NULL && parent->parent->tag == nesting[nlevel-11) {
ungettag(tag,len);
return(para);
if ( !unnest(page,len,nesting[nlevel-1}) 11 nlevel>=basenl goto retry;
return(para);
} else if ( (tag<PARA_START 11 tag>PARA_END) && tag!=PLAINTEXT_TAG ) { ' ungettag(tag,len);

ihtmi.c Thu Mar 23 17:27:18 1995 33 if ( !TagNeedsTerminator(tag)) {
if ( nlevel==basenl newnest(P_TAG);
else ~ nesting[basenl) = P_TAG;
} else if ( nlevel==basenl+l ) {
/* First time through, no pushed tags newnest(P_TAG);
nesting[nlevel-1] = nesting[nlevel-2);
nesting[nlevel-2] = P_TAG;
} else if ( nlevel==basenl newnest(P_TAG);
else nesting[basenl] = P_TAG;
tag = P_TAG;
len = 0;
} else if ( !hasListParent(parent) &&
(tag==DD_TAG 11 tag==DT_TAG 11 tag==LI_TAG )) {
/* Can't handle these here, pretend they are normal paragraphs fake = false;
nlevel = basenl;
tag = P_TAG;
len = 0;
newnest(P_TAG);
} else if ( parent!=NULL &&
( parent->tag==DD_TAG 11 parent->tag==DT_TAG parent->tag==LI_TAG )&&
(tag==DD_TAG tag==DT_TAG tag==LI_TAG
tag==DL_TAG tag==UL_TAG tag==OL_TAG )) {
ungettag(tag,len);
return(para);
} else if ( tag==ISINDEX_TAG ){ /* Convert to form isindex = 1;
} else if ( tag>=HEAD_START && tag<=HEAD_END ) {
slurpHeadItem(page,tag,len);
goto retry;
} else {
fake = false;
if ( nlevel>basenl+l ){ /* Don't do this for <LI>s which don't need terinin ators */
nesting[basenl] = nesting[nlevel-1);
nlevel = basenl+l;
}
}
if ( para==NULL
para = (Para *) myalloc(sizeof(Para));
else {
para->post = (Para *) myalloc(sizeof(Para));
para = para->post;
}
para->pnu=n = pnum++;
para->parent = parent;
para->tag = tag;
para->tagtext = slurpTagText(len);
para->fake = fake;
if ( isindex ){ /* Convert a simple ISINDEX to a form --pnum; /* We reassign this within makeSrchFrm*/
oldtext = para->tagtext;
makeSearchForm(page,para);
myfree(oldtext);
goto retry;
}
return( para );

lhtm1.c Thu Mar 23 17:27:18 1995 34 /* This overly complex routine parses HTML into a list of paragraphs /* Some kinds of paragraphs (BLOCKQUOTEs, PREformatteds, etc) are themselves /* just lists of paragraphs. Other kinds (Listltems, DescritionTerms, etc) /* cannot themselves occur in a paragraph list, so if they do then either we /* terminate the list (if we are inside a UL,OL or DL) or pretend we saw a P*/
/* if we aren't. If the paragraph does not begin with anything then pretend /* it began with a <P>. */
static Para *slurpParaList(page,parent) HtmlPage *page; Para *parent; {
Para *para=NULL, *list=NULL, *res;
int ch, tag, len, j, basenl, topnl=0, ignore; long i;
long resi, respm;
char *oldparastr=NULL;
int preformatted;
int fake = false;
int preparent=0;
int tag_to_push;
static int spl_nesting;

if ( parent!=NULL ) preparent = ParaPreformatted(parent);
basenl = nlevel;
++spl_nesting;
while ( (ch=inchr())!=EOF && !preparent && navi_isspace(ch));
if ( ch!=HTML_MARK
ungetchr(ch);
else {
len = inchr()*256;
len += inchro;
tag = inchr();
if ( basenl>0 && nesting[basenl-1]==tag && basenl==nlevel --basenl;
ungettag(tag,len);
}
for (;;) {
if ((res = slurpFigureNewPara(page,parent,para,preparent,fake,basenl))==para ) {
--spl_nesting;
return( list );
} else if ( list==NULL
list = res;
para = res;
fake = false;
if ( para->tag>=PARA_START && para->tag<=PLISTTAG_END && spl_nesting<100 ) {
/* This will take a list of paragraphs para->first = slurpParaList(page,para);
} else {
preformatted = ParaPreformatted(para);
i = 0;
if ( para->fake i=restarttags(0,basenl,topnl,oldparastr);
topnl = basenl;
tag_to-push = -1;
ch = inchr();
while ( ch!=EOF && navi_isspace(ch) &&
!(preformatted (nlevel>0 && nesting[nlevel-1]==TEXTAREA_TAG)) ch = inchr();
for (;;) {
if ( ch==EOF
break;
if ( ch=='\n' && preformatted &&
(nlevel<=0 11 (nesting[nlevel-1]!=TEXTAREA_TAG && nesting[nlevel-1]!=SELECT_ TAG))) fake = true;

W O 96/30846 PCT/i7S96/02686 lhtml.c Thu Mar 23 17:27:18 1995 35 i = endtags(i,basenl);
topnl = nlevel;
break;
}
#ifdef MEMORY_MASK
if ( i>MEMORY_MASK-1500 break;
#endif len = 0; ignore = 0;
if ( ch==HTML_MARK ) {
len = inchr()*256; len += inchr();
tag = inchr();
:.f ( nlevel==basenl+1 && tag == END_TAG
ungetchr(tag = inchr());
if ( tag==nesting[nlevel-1] }
if ( unnest(page,len,nesting[nlevel-1])) break;
} else if ( tag == END_TAG
--nlevel;
if (( tag>=PARA_START && tag<=PARA_END tag==ISINDEX_TAG
/* We did not terminate the previous paragraph, but /* got a new one. This implies termination tag_to_push = tag;
break;
}
if ( tag>=HEAD_START && tag<=HEAD_END ) {
slurpHeadItem(page,tag,len);
ignore = 1;
} else if ( tag>=HTML_TAG && tag<=HEAD_TAG ) {
skip(len);
ungeterr(page,HTM_ERR_BADTAGINBODY,tag,true);
--nlevel;
ignore = 1;
}
}
if ( !ignore ) C
if ( i+len+3>=pmax ) {
#ifdef MEMORY_MASK
if ( pmax+4000L+len > MEMORY_MASK
pmax = MEMORY_MASK;
else #endif pmax += 4000+len;
phuf = myrealloc(pbuf,pmax);
if ( i+len+3>=pmax ) C
ungettag(tag,len);
ungeterr(page,HTM_ERR_TOOBIG,ERROR_TAG,true);
break;
}
}
pbuf[i++] = ch;
if ( ch==HTML_MARK ) {
if ( TagNeedsTerminator(tag)) setnestoff(i-l,tag);
pbuf[i++] = len/256;
pbuf[i++} = len%256;
pbuf[i++] = tag;
for ( j=0; j<len; ++j pbuf[i++] = inchr();
}
ch = inchr();
if ( ch!=EOF && navi_isspace(ch) && /* Multiple spaces to 1 !(preformatted 11 (nlevel>0 && nesting[nlevel-1]==TEXTAREA_TAG)) ) {
f lhtml.c Thu Mar 23 17:27:18 1995 36 while ( ch!=EOF && navi_isspace(ch)) ch = inchr();
ungetchr(ch);
ch ]
if ( nlevel!=basenl && !fake ) {
/* For various reasons we may have popped out without closing*/
/* open tags. Do so now */
i = end2base(basenl,i,tag_to_,push);
if ( tag_to_push>=O ) ungettag(tag_to_push,len);
}
if ( i>=pmax ) {
#ifdef MEMORY_MASK
if ( pmax+4000L+len > MEMORY_MASK
pmax = MEMORY_MASK;
else #endif pmax += 4000+len;
pbuf = myrealloc(pbuf,pmax);
}
pbuf[i]='\0';
para->text = oldparastr = copyn(pbuf,i);
para->tlen = i;
para->tmax = i+l;
}
}
--spl_nesting;
/* xvt_app-process_pending_events();
}

static Para *slurpList(page,parent) HtmlPage *page; Para *parent; {
Para *para=NULL, *list=NL'LL;
int ch, tag, len = 0;
int cnt=0;
int basenl = nlevel;

for ( basenl=nlevel; basenl>0; --basenl if ( nesting[basenl-1]==parent->tag break;
for (;;) {
while((ch=inchr())!= EOF && navi_isspace(ch));
if ( ch==EOF
break;
tag = LI_TAG;
if ( parent->tag==DL_TAG ) tag = (cnt&l)?DD_TAG=DT_TAG;
if ( ch==HTML_MARK ) {
len = inchrO*256;
len += inchr();
tag = inchr();
if ( tag==LI_TAG && parent->tag==DL_TAG
tag = (cnt&1)?DD_TAG:DT_TAG;
else if (( tag==DD_TAG tag==DT_TAG )&& parent->tag!=DL_TAG
tag = LI_TAG;
else if ( tag==DD_TAG tag==DT_TAG tag==LI_TAG
/* It's all happy and nice */;
else if ( tag==END_TAG && unnest(page,len,parent->tag) break;
else ungettag(tag,len);
} else ungetchr(ch);
if ( tag==DD_TAG ) cnt J= 1;
if ( para==NULL

lhtml.c Thu Mar 23 17:27:18 1995 37 list = para = (Para *) myalloc(sizeof(Para));
else {
para->post = (Para *) myalloc(sizeof(Para));
para = para->post;

if ( tag!=DD_TAG && tag!=DT_TAG && tag!=LI_TAG ) {
tag = parent->tag!=DL_TAG?LI_TAG:(cnt&1)?DD_TAG:DT_TAG;
len = 0;
}
para->tag = tag;
para->pnum = pnum++;
if ( len!=0 ) para->tagtext = slurpTagText(len);
para->parent = parent;
para->first = slurpParaList(page,para);
++cnt;
if ( basenl>nlevel break;
}
return( list );
}

static void slurpBody(page) HtmlPage *page; {
int ch, tag, len, found=0;
do {
ch = inchr();
} while ( navi_isspace(ch));
if ( ch==HTML_MARK ) {
len = inchr()*256;
len += inchr(;
tag = inchr();
if ( tag==END_TAG
unnest(page,HTML_TAG,len);
return;
} else if ( tag!=BODY_TAG
ungettag(tag,len);
else {
found = 1;
skip(len);
}
} else ungetchr(ch);
if ( !found && (nlevel==0 nesting[nlevel-1]!=BODY_TAG)) {
newnest(BODY_TAG);
if ( nlevel>2 ) {
nesting[nlevel-1] = nesting[nlevel-2];
nesting[nlevel-2] = BODY_TAG;
}
}
page->first = slurpParaList(page,NULL);
}

static HtmlPage *slurpHtmlPage(pg) HtmlPage *pg; {
int ch, tag, len, done=O, found=0;
Para *para;
page = pg;
pnum = 0;
while((ch=inchr())!= EOF && navi_isspace(ch));
if ( ch==HTML_MARK ) {
len = inchr()*256;
len += inchr();
tag = inchr();

lhtml.c Thu Ldar 23 17:27:18 1995 38 if ( tag!=HTML_TAG ) =
ungettag(tag,len);
else {
skip(len);
found = 1; ]
while((ch=inchr()!= EOF && navi_isspace(ch));
}
if ( !found ) {
newnest(HTML_TAG);
if ( nlevel>l ) {
nesting[nlevel-1] = nesting[nlevel-2);
nesting[nlevel-2] = HTML_TAG;
}
}
if ( ch==HTML_MARK ) {
len = inchr()*256;
len += inchr();
tag = inchr();
if ( tag==END_TAG && unnest(pg,len,HTML_TAG)) done = true;
else if ( tag!=HEAD_TAG
ungettag(tag,len);
else {
skip(len);
slurpHeader(pg);
}
} else ungetchr(ch);
if ( !done ) slurpBody(pg);
while((ch=inchr())!= EOF && navi_isspace(ch));
if ( !done ) {
if ( ch==HTML_MARK ) {
len = inchr()*256;
len += inchr();
tag = inchr();
if ( tag==END_TAG && unnest(pg,len,HTML_TAG)) /* Good */;
else ungettag(tag,len);
} else ungetchr(ch);
}
while((ch=inchr())!= EOF && navi_isspace(ch));
while ( ch==HTML_MARK ) {
len = inchr()*256;
len += inchr();
tag = inchr();
if ( tag==ERROR_TAG ) {
addtrailerr(pg,O,ERROR_TAG);
while((ch=inchr())!= EOF && navi_isspace(ch));
} else ch /* Exit loop with non-EOF
}
if ( ch!=EOF
addtrailerr(pg,HTM_ERR_TRAILCH,ERROR_TAG);
if ( nlevel!=0 ) addtrailerr(pg,HTM_ERR_BADNEST,nesting[nlevel-1]);
/* If we got an ISINDEX tag in the header then put a form at the end of */ y /* the page (if we got one in the middle of the body we already inserted /* a form there)=
if ( page->isindex ) { ~
if ( page->first==NULL }

lhtml.c Thu Mar 23 17:27:18 1995 39 page->first = para = (Para *) myalloc(sizeof(Para));
else {
for ( para = page->first; para->post!=NULL; para = para->post );
para->post = (Para *) myalloc(sizeof(Para));
para = para->post;
}
para->tagtext = page->iiprompt;
makeSearchForm(page,para);
}
return(pg);
}

static int parse_null PROTOTYPE((void *foo)) {
IError("bad parser state!");
return EOF;
}

HtmlPage * XVT_CALLCONV1 FillHtmlPage(page, func, context) HtmlPage *page; int (*func)(voi d *); void *context; {
if(!page) page = myalloc(sizeof(HtmlPage)):
if (page) {
#if Dbg_Test char buffer[50}; static index;
sprintf(buffer,"test%d.html^, index++);
dump = fopen(buffer,"w");
#endif infunc = func;
inctx = context;
nlevel = 0;
foundplain = 0;
slurpHtmlPage(page);
infunc = parse_null;
inctx = (void *)NULL;
#if Dbg_Test fclose(dump);
#endif }
return page;
}

void XVT_CALLCONVI ParaListFree(first) Para *first; {
Para *next;

while ( first!=NI7LL ) {
next = first->post;
if ( first->first!=NULL
ParaListFree(first->first);
myfree((char *) first->text);
myfree((char *) first->tagtext);
myfree((char *) first);
first = next;
}
r }

void XVR CALLCONVI KillHtmlPage(page) HtmlPage *page; {
myfree(page->url);
myfree(page->docname);
myfree(page->title);
myfree(page->style);

lhtml.c Thu Mar 23 17:27:18 1995 40 myfree(page->upl); =
myfree(page->uptit);
if ( page->otherlinks int i;
for ( i=0; page->otherlinks[i]!=NTJLL; ++i myfree((char *) page->otherlinks[i]);
myfree((char *) page->otherlinks);
}
myfree(page->base);
if ( page->headerinfo ) {
int i;
for ( i=0; page->headerinfo[i]!=NULL; ++i myfree((char *) page->headerinfo[i]);
myfree((char *) page->headerinfo);
}
myfree(page->headererrs);
myfree(page->trailerrs);
myfree(page->trailargs);
ParaListFree(page->first);
myfree(page);
}
int HTML_AttrValue(int tag, char *name) {
struct attribs *attr;

if ( key2names[tag7==NULL (attr = key2names[tag]->attr)== none return( false );
while ( attr->name!=NULL ) {
if ( strcmp(attr->name,name)==0 return attr->value;
++attr;
}
return false;
}

int _HTML_HasAttr(str,len,tag,output,osize,name) char *str, *output, *name;
int len, tag, osize; {
struct attribs *attrs;

attrs = parseAttrs(NULL,tag,str,len,0);
if ( attrs==NULL
return(false);
while ( attrs->name!=NULL ) {
if ( strcmp(attrs->name,name)==0 ) {
if ( !attrs->present return false;
if ( output==NULL
return true;
if ( attrs->len==0 output[0]='\0';
else {
len = attrs->ien;
if ( len>osize-1 len = osize-1;
strncpy(output,attrs->val,len);
output[len]='\0';
}
return true;
}
++attrs;
return false;

lhtml.c Thu Mar 23 17:27:18 1995 41 }
int XVT_CALLCONV1 HTML_HasAttr(str,output,osize,name) char *str, *output, *name;
int osize; {
int tag, len;

if ( output!=NULL
*output = '\O';
if ( str==NULL
return false;

len =((unsigned char *) str)[HTML_LEN_HIGH]*256 + ((unsigned char *) str)[HTML_LEN_I,O
W];
tag = ((unsigned char *) str)[HTML_POS_TAG];

return( _HTML_HasAttr(str+4,len,tag,output,osize,name));
}

int XVT_CALLCONVI HTML_HasAttrStr(str,tag,output,osize,name) char *str, *output, *name;
int tag, osize; ( if ( output!=NULL
*output = 1\0';
if ( str==NULL
return false;

return( _HTML_HasAttr(str,strlen(str),tag,output,osize,name));
}

struct attribs * XVT_CALLCONVI HTML_GetAttrs(str) char *str; ( int tag, len;

len = ((unsigned char *) str)[HTML_LEN_HIGH]*256 + ((unsigned char *) str)[HTML_LEN_LO
W];
tag = ((unsigned char *) str)[HTML_POS_TAG];
return( parseAttrs(NULL,tag,str+4,len,0));
}
/* Skip to the HTML end tag for the current tag.
char * XVT_CALLCONV1 TagSkipToEnd(pt) char *pt; {
int htag, len;
int tag;

if ( *pt!=HTML_MARK
return( pt );
tag = ((unsigned char *) pt)[HTML_POS_TAG];
len =((unsigned char *) pt)[HTML_LEN_HIGH]*256+((unsigned char *) pt)[HTML_LEN_LOW];
pt += len+HTML_HEAD_LEN;
while ( *pt ) {
while ( *pt!=HTML_MARK && *pt ) ++pt;
if ( !*pt return( pt ) ;
htag = ((unsigned char *) pt)[HTML_POS_TAG];
len =((unsigned char *) pt)[HTML_LEN_HIGH]*256+((unsigned char *) pt)[HTML_LEN
LO
W], if ( htag==END_TAG && ((unsigned char *) pt)[HTML_END_TAG)==tag return( pt + len+HTML_HEAD_LEN );
else if ( htag==tag ) /* Nested inside itself!
pt = TagSkipToEnd(pt);
else pt += len + HTML_HEAD_LEN;

lhtml.c Thu Mar 23 17:27:18 1995 42 }
return( pt );

int XVT_CALLCONVI TagHasWidth(pt) char *pt; C
int tag;
char buffer[20];
if ( *pt=='\0' return false;
if ( *pt!=HTML_MARK
return true;
tag = ((unsigned char *) pt)[HTML_POS_TAG];
if ( tag==SELECT_TAG tag==TEXTAREA_TAG 11 tag==IMG_TAG
tag==BR_TAG tag==HR_TAG
return true;
else if ( tag==INPUT_TAG ) {
if ( !HTML_HasAttr(pt,buffer,sizeof(buffer),"TYPE") strmatch(buffer,"hidden")!=0) return true;
}
return false;
}

int XVT_CALLCONV1 TagIsField(pt) char *pt; {
int tag;

if ( *pt=='\0' return false;
if ( *pt!=HTML_MARK
return false;
tag = ((unsigned char *) pt)[HTML_POS_TAG];
if ( tag==INPUT_TAG 11 tag==SELECT_TAG tag==TEXTAREA_TAG
return true;
return false;
}

int XVT_CALLCONVI TagIsPara(tag) int tag; {
return( tag>=PARA_START && tag<PARA_END );
}

int XVT_CALLCONVl TagLen(pt) char *pt; {
int len;

if ( *pt=='\0' return 0;
if ( *pt!=HTML_MARK
return 1;
len = ((unsigned char *) pt)[HTML_LEN_HIGH]*256+((unsigned char pt)[HTML_LEN_LOW];
return( len+HTML_HEAD_LEN );
}
int XVT_CALLCONVI Taglncr(pt) char *pt; {
int len;
int tag;
char *end;

if (,*pt=='\0' return 0;
if ( *pt!=HTML_MARK
return 1;
tag = ((unsigned char *) pt)[HTML_POS_TAG];

WO 96/30846 PCT/[7896/01686 lhtml.c Thu Mar 23 17:27:18 1995 43 len = ((unsigned char *) pt)[HTML_LEN_HIGH]*256+((unsigned char *) pt)[HTML_LEN_LOW];
if ( tag!=SELECT_TAG && tag!=TEXTAREA_TAG
return( len+HTML_HEAD_LEN );
end = TagSkipToEnd(pt);
return(end-pt);

char * XVT_CALLCONVI TagGetName(tag) int tag; {
if ( tag<O && tag>=-128 ) tag += 256;
if ( tag<O 11 tag>=sizeof(key2names)/sizeof(key2names[0]) key2names(tag]==NULL
return( NULL );
return( key2names(tag)->name }

int XVT_CALLCONV1 TagNeedsTerminator(tag) int tag; {
if ( tag<O && tag>=-128 ) tag += 256;
if ( tag<O tag>=sizeof(key2names)/sizeof(key2names(0]) key2names[tag]==NULL
return( false );

return( key2names[tag]->-terminated );
}

int XVT_CALLCONVI TagTextMatches(char *t, Para *para) {
unsigned char *tstr, *pstr;
int len;
tstr = (unsigned char *) t;
pstr = (unsigned char *) (para->tagtext);
len = 256*tstr[HTML_LEN_HIGH]+ tstr[HTML_LEN_LOW];
if ( para->tag!=tstr[HTML_POS_TAG] }
return( false );
tstr += HTML_HEAD_LEN;
while ( navi_isspace(*tstr) && len>O ) { --len; ++tstr; }
if ( len==O && pstr==NULL
return( true );
while ( navi_isspace(*pstr)) ++pstr;
while ( len>O && *pstr ) {
if ( navi_isspace(*tstr) && navi_isspace(*pstr)) {
while ( navi_isspace(*tstr) && len>O ) { --len; ++tstr; }
while ( navi_isspace(*pstr)) ++pstr;
} else if ( *tstr != *pstr) return( false );
else {
--len;
++tstr;
++pstr;
}
}
while ( navi_isspace(*tstr) && len>O ) { --len; ++tstr; }
while ( navi_isspace(*pstr)) ++pstr;
return( len==O && *pstr=='\0' );
}

char * XVT_CALLCONV1 HTML_last(pt) char *pt; {
while ( *pt!='\0' ) pt += Taglncr(pt);
return(pt);
t }

int XVT_CALLCONVI HTML_1en(start) char *start; {
char *pt = start;
if ( pt!=NULL

lhtml.c Thu Mar 23 17:27:18 1995 44 while ( *pt!='\0' ) pt += TagIncr(pt);
return(pt-start);
}
int XVT_CALLCOATV1 HTML_tag(pt) char *pt;
return ((unsigned char *)pt)[HTML_POS_TAG];
}

/* No html elements in the text int XVT_CALLCONVI HTML_plain(start) char *start; {
return( strchr(start,HTML_MARK)==NULL );
}
/* Does every HTML item within the string that needs one have a matching end?
*/
int XVT_CALLCONV1 HTML_matched(pt,len) char *pt; int len; {
int tag;
nlevel = 0;
while ( --len>=O if ( *pt!=HTML_MARK
++pt;
else {
tag = ((unsigned char *) pt)[HTML_POS_TAG];
if ( tag==END_TAG && nlevel==0 ) return( false ); /* END with nothing to match it else if ( tag==END_TAG
--nlevel;
else if ( TagNeedsTerminator(tag)) newnest(tag);
len = ((unsigned char *) pt)[HTML_LEN_HIGH]*256+((unsigned char *) pt)[HTML_LE
N_LOW] ;
pt += len+HTML_HEAD_LEN;
}
}
return( nlevel==0 );
}

struct chartab *XVT_CALLCONVI HTML_charnames PROTOTYPE((void)) {
return(charnames);
}
void XVT_CALLCONV1 HTML_FillTag(char *buf, int tag) {
buf[0] = HTML_MARK;
buf[HTML_LEN_HIGH] = 0;
buf[HTML_LEN_LOW] = 0;
buf[HTML_POS_TAG] = tag;
buf[HTML_HEAD_LEN] = 1\01;
}

void XVT_CALLCONVI HTML_FillEndTag(char *buf, int tag) {
buf[0] = HTML_MARK;
buf[HTML_LEN_HIGH] = 0;
buf[HTML_LEN_LOW] = 1;
buf[HTML_POS_TAG] = END_TAG;
buf[HTML_END_TAG] = tag;
buf[HTML_END_LEN] _ '\0';
} t /**** more parse functions ****/

** parse_string - feed one character at a time from string *ppc l1htm1 .c Thu Mar 23 17:27:18 1995 45 int parse_string(char **ppc) {
int i; /* charcter to return (NB: must be int to hold EOF) assert(ppc NULL);
assert(*ppc != NULL);
i = **ppc;
if (i != '\0') {
++*ppc;
} else {
i = EOF;
return i;
}
int parse_file(fp) FILE *fp; {
return getc(fp);
}
int text2html(tb) textblob *tb; {
switch(tb->state) {
case 0: tb->state++; return '<';
case 1: tb->state++; return 'P';
case 2: tb->state++; return 'R';
case 3: tb->state++; return 'E';
case 4: tb->state++; return '>';
case 5:
{
int c = getc(tb->fp);
switch(c) {
case '&'_ tb->state = 10; return '&' case '<': tb->state = 20; return '&' case EOF: tb->state = 30; return '<';
}
return c;
}
case 10: tb->state++; return case 11: tb->state++; return '3' case 12: tb->state++; return '8';
case 13: tb->state=5; return case 20: tb->state++; return '#', case 21: tb->state++; return '6';
case 22: tb->state++; return '0';
case 23: tb->state=5; return case 30: tb->state++; return '/' case 31: tb->state++; return 'P';
case 32: tb->state++; return 'R';
case 33: tb->state++; return 'E';
case 34: tb->state++; return '>';
case 35: return EOF;
default:
IError("text2html messed up");
tb->state = 0;
return EOF;
}
s /* Walk through a paragraph keeping track of the nesting within it void XVT-CALLCONVI _FindNesting(Para *para, int offset, NestInfo *ni) {
unsigned char *pt = (unsigned char *) (para->text);
unsigned char *end = pt+offset;
) { .
if ( pt!=NULL ) while ( *pt && pt<end WO 96/30846 PCTlUS96/01686 lhtml.c Thu 14ar 23 17:27:18 1995 46 if ( *pt==HTML_MARK

if ( pt[HTML_POS_TAG]==END_TAG
if ( pt[HTML_END_TAG)>=PARA_START && pt[HTML_END_TAG}<=PARA_END
/* Ignore it */;
else if ( ni->ncnt>0 --ni->ncnt;
else IError("Nesting screwed up in FindNesting");
} else if ( TagNeedsTerminator(pt[HTML_POS_TAG}) if ( ni->ncnt>=ni->nmax ) ( ni->nesting = (unsigned char myrealloc((char *) ni->nesting, ni->nm ax+=10 );
ni->tagtext = (unsigned char **) myrealloc((char *) ni->tagtext, ni->n max*sizeof(unsigned char **) ); -}
ni->nesting[ni->ncnt] = pt[3];
ni->tagtext[ni->ncnt++) = pt;
}
pt += HTML_HEAD_LEN+256*pt[HTML_LEN_HIGH}+pt[HTML_LEN_LOW];
} else ++pt;
}

void XVT_CALLCONVI FindNesting(Para *para, int offset, Nestlnfo *ni) {
ni->ncnt = ni->nmax = 0;
ni->nesting = NULL;
ni->tagtext = NULL;
_FindNesting(para, offset, ni);
}
int XVT_CALLCONVI TagActive(Para *para, int offset, int tag) {
NestInfo ni;
int i, ret;
FindNesting(para,offset,&ni);
ret = 0;
for ( i=0; i<ni.ncnt; ++i if ( ni.nesting[i]==tag ret = 1;
myfree( ni.nesting ); myfree( ni.tagtext );
return ret;
}
int (*HtmlErrorOutput)(char *) = 0;
int _html_error(char *fmt, ...) {
if(HtmlErrorOutput) {
static char buf[Ox1000];
va_list ap;
va_start(ap, fmt);
vsprintf(buf, fmt, ap);
va_end(ap);
return HtmlErrorOutput(buf);
}
return 0;
}

local.cxe Thu Mar 23 13:10:05 1995 1 /* Copyright 1994-1995 NaviSoft, Inc. All rights reserved.
#include <stdlib.h>
#include "crud.h"
#include "str.h"
#include "guess.h"
#include "response.h"
#include "xlocal.h"
#include "weblet.h"
#include "lfunc.h"
extern "C" {
extern char dir_char;
#include <string.h>
}
#if defined(macintosh) # define BINREAD "rb"
# define BINWRITE "wb"
#else # define BINREAD "r"
# define BINWRITE "w"
#endif int localsave(char char int, int);
int localload(char char Form *, int);
int localkill(char char *);
int localbrowse(char *, char *);
int localcrud(Crud *crud) {
char *url = (crud->url ? crud->url : crud->form->URL);
switch(crud->type) {
case C:
return localsave(url, url, crud->sid, 1);
case R:
return localload(url, url, crud->form, crud->info);
case U:
return localsave(url, url, crud->sid, 0);
case D:
return localkill(url, url);
case B:
return localbrowse(url, url);
default:
return fivehundred("unknown crud type in localcrud");
}
}
static int html(int status, char *a, char *b, char *c) {
wstrand ws;
ws.create(status, "text/html");
heading(&ws, a);
ws.print(b, c);
closing(&ws);
return ws.close();

static ir_t DocFromWad(char *dir, char *base, rstrand *rs) {
int n;
char *name = (char *)0;
long size;

local.cac Thu Mar 23 13:10:05 1995 2 char *type = (char *)0;
char buffer[Ox100];

while((n = rs->getline(buffer, sizeof(buffer))) != EOF) {
if(n != 0) char *m;
if(m=pmatch("Content-Name: ", buffer)) name = copy(m);
else if(m=pmatch("Content-Type: ", buffer)) type = copy(m);
else if(m=pmatch("Content-Length: ", buffer)) size = atol(m);
} else {
FILE *fp;
int len;
fsys_build_name(dir, name, buffer, sizeof(buffer));
fp = fopen(buffer, BINWRITE);
while(size) {
len = (sizeof(buffer) > size ? size : sizeof(buffer));
len = rs->read(buffer, len);
if(fp) fwrite(buffer, 1, len, fp);
size -= len;
}
if (fp) fclose(fp);
myfree(name);
myfree(type);
}
}
return html(206, "Success", "%s modified", base);
}

int localsave(char *dest, char *base, int rid, int create) {
rstrand rs;
rs.open(rid);
if(pmatch("application/x-naviwad",rs.type())) {
if(fsys_exists(dest) && !fsys_isdoc(dest)) return html(403, "Create Failed", "%s already exists", base);
if(!fsys_exists(dest)) fsys_mkdir(dest);
if(!fsys_exists(dest)) return html(403, "Create Failed", "can't create %s", base);
return DocFromWad(dest, base, &rs);
} else {
if(create) {
if(!fsys_exists(dest)) {
return html(403, "Create Failed", "%s already exists", base);
}
}
FILE *fp = fopen(dest, BINWRITE);
if(fp) {
rs.file(fp);
fclose(fp);
fsys_setfilecreator(dest,(char *) rs.type());
if(create) return html(201, "Success", "%s created", base);
else return html(206, "Success", "%s modified", base);
} else {
return html(403, "Update Failed", "couldn't write %s", base);
}

WO 96/30846 PCTlUS96101656 local. aac Thu Mar 23 13 :10 : 05 1995 3 extern "C"
{
int listing(struct cstr *cws, char *name) {
wstrand *pws = (wstrand *)cws;
if(name[0} != '.') pws->print("<A HREF=\"%s\">%s</A><BR>\n", name, name);
return 0;
}
int browse(struct cstr *cws, char *name) {
wstrand *pws = (wstrand *)cws;
char *type;
type = (fsys_isdir(name) ? (fsys_isdoc(name) ? "application/x-navidoc"
. "application/x-navidir") guess_suffix(name));
#if defined(macintosh) if ( strcmp(type,"*/*")==0 if (( type = fsys_mime_from_type(url))==NULL
type #endif pws->print("%s %s\n",type,name);
return 0;
}
int browse_desktop(struct cstr *cws, char *name) {
wstrand *pws = (wstrand *)cws;
pws->print("application/x-navidir %s\n",name);
return 0;
}
int cfsys_iterate_listing(char *dir, void *assets) {
return fsys_iterate(dir, (int (*)(struct cstr *, char *))listing, assets);
}
int cfsys_iterate_browse(char *dir, struct cstr *pws) {
return fsys_iterate(dir, (int (*)(struct cstr *, char *))browse, pws);
}
}
static void normalize(int *1ow, int *high) {
if(*low > *high) {
int tmp = *1ow;
*1ow = *high;
*high = tmp;
}
}

extern "C" {
void URL+Prans(char *, char char char char int, int);
int _crud_error(char *fmt, ...);
}
static int CheckMapping(char *base, int sid, int x, int y) local.c:oc Thu Mar 23 13:10:05 1995 4 struct cstr *rs = RsOpenId(sid,0);
char buf[Ox100];
char spam[Ox100];
char *m;
strcpy(spam, while(RsGetLine(rs, buf, sizeof(buf)) -1) {
if(m=pmatch("rect ", buf)) {
int left, top, right, bottom;
char *p = strchr(m, *p++ = '\0' sscanf(p,"%d,%d %d,%d",&let,&top,&right,&bottom);
normalize(&left, &right);
normalize(&top, &bottom);
if(x >= left && x < right && y >= top && y < bottom) {
strcpy(spam, m);
break;
}
} else if(m=pmatch("default ", buf)) C
strcpy(spam, m);
}
}
if(*spam) {
char abuf[0x40];
URLTrans(spam, NULL, base, buf, abuf, sizeof(buf), sizeof(abuf));
if(*abuf) {
strcat(buf, "#");
strcat(buf, abuf);
}
_info("%s:%s -> %s\n", spam, base, buf);
return redirect(buf);
}
return noop();
}

extern "C" int fsys_alias(char *, char *, int);

int localload(char *dest, char *base, Form *form, int info) {
#if defined(THINK_C) int cfsys_iterate_listing(char *, void *);
#endif if(form && !pmatch("application/x-navimap", guess_suffix(dest))){
return html(501, "No local form submission or searching", . "can't submit forms or search locally (yet!)","");
} else {
char *doc;
if (doc = fsys_isdoc(dest)) {
dest = doc;
} else if(fsys_isdir(dest)) {
wstrand ws;
ws.create(200, "text/html");
ws.print("<HEAD><TITLE>\n");
ws.print("directory listing of '%s "',base);
ws.print("</TITLE><BASE HREF=\"%s/listing\">",base);
ws.print("</HEAD><BODY>\n");
ws.print("<H1>listing of %s:</Hl><HR>",base); ws.print("Listing for <A
HREF=\"..\">parent</A><BR>\n");
cfsys_iterate_listing(dest, &ws);
ws.print("<HR></BODY>\n");
return ws.close();
{

'WO 96130846 PC'Tl1JS96102686 1ocal.cxx Thu Mar 23 13:10:05 1995 5 FILE *fp = fopen(dest, BINREAD);
struct strandinfo si;
wstrand ws;
if(!fp) {
if(fsys_exists(dest)) {
return html(403, "Retrieve Failed', "couldn't read $s", base);
} else {
char buffer[Ox100];
if(fsys_alias(dest, buffer, sizeof(buffer))) return redirect(buffer);
si.status = 404;
si.type = "text/html";
si.size = 0;
si.date = 0;
si.lastmod = 0;
si.expires = 0;
si.modifyable = fsys_modifyabledir(dest);
si.document = copy(fsys_docfor(dest,base));
ws.create(&si,mem);
heading(&ws, "Retrieve Failed");
ws.print("couldn't find %s", base);
closing(&ws);
}
} else {
si.status = 200;
si.type = guess_suffix(dest);
#if defined(macintosh) if ( strcmp(si.type,"*/*")==0 ) if (( si.type = fsys_mime_from_type(dest))==NULL
si.type #endif si.size = fsys_size(dest);
si.date = time(0);
si.lastmod = fsys_lastmod(dest);
si.expires = 0;
si.modifyable = fsys_modifyable(dest);
si.document = copy(fsys_docfor(dest,base));
_info("content-type: %s (%s)\n", si.type, dest);
ws.create(&si, disk);
if (info) {
fclose(fp);
return ws.info();
}
ws.file(fp);
fclose(fp);
}
if(forxn && pmatch("application/x-navimap", si.type)) {
int x, y;
if(form->NumFields == 1 &&
sscanf(form->fields[0].value, "$d,%d",&x,&y) 2) return CheckMapping(base, ws.close(), x, y);
ws.forget();
return fivehundred("bad mapping args");
}
return ws.close();
}

int localkill(char *dest, char *base) if((fsys_isdoc(dest) && fsys_rmdoc(dest) 0) 1ocal.cmc Thu Uar 23 13:10:05 1995 6 (!fsys_isdir(dest) && fsys_delete(dest) == 0)) return html(205, "Success", "%s deleted", base);
return html(403, "Failure", "couldn't delete %s", base);
}

int localbrowse(char *dest, char *base) {
if (!strcmp(dest, "\tDesktop")) {
wstrand ws;
ws.create(200, "application/x-navibrowse");
fsys_browse_desktop((struct cstr *)&ws);
return ws.close();
} else if(fsys_isdir(dest)) {
wstrand ws ;
ws.create(200, "application/x-navibrowse");
cfsys_iterate_browse(dest, (struct cstr *)&ws);
return ws.close();
}
return html(403, "Browse Failed", "couldn't browse $s", base);
}

extern "C" {
int clocalcrud(Crud *connection, char *pageroot, char *servroot) {
char dest[Ox100];
char base[Ox100];
char *url = (connection->url ? connection->url connection->form->URL);
int ret;

if (((strlen(pageroot) + 1 + strlen(url) + 1) > sizeof (dest)) ((strlen(servroot) + 1 + strlen(url) + 1) > sizeof (base))) {
return fivehundred("Pathname too long\n");
}
sprintf(dest,"%s%s",pageroot,url);
sprintf(base,"%s%s",servroot,url);
if(!strcmp(connection->method,"GET") !strcmp(connection->method,"POST") !strcmp(connection->method,"HEAD")) {
return localload(dest, base, connection->form, connection->info);
} else if(!strcmp(connection->method,"BROWSE")) {
return localbrowse(dest, base);
} else if(!strcmp(connection->method,"DELETE")) {
return localkill(dest, base);
} else /* not quite true, of course */ {
return localsave(dest, base, connection->sid, connection->type == C);
}
}
}

DEMANDES OU BREVETS VOLUMINEUX
LA PRESENTE PARTIE DE CETTE DEMANDE OU CE BREVETS
COMPREND PLUS D'UN TOME.

NOTE: Pour les tomes additionels, veillez contacter le Bureau Canadien des Brevets.

JUMBO APPLICATIONS / PATENTS

THIS SECTION OF THE APPLICATION / PATENT CONTAINS MORE
THAN ONE VOLUME.

THIS IS VOLUME OF

NOTE: For additional volumes please contact the Canadian Patent Office.

Claims (19)

What is claimed is:
1. A method for providing interactive application services on a WAN comprising a plurality of servers, for use with a client computer operably coupled to a first server, said method comprising the following steps:
creating, from a client computer operably coupled to a first server, a template form comprising one or more informational fields and one or more hypermedia links, said links addressing one or more utility programs stored on an application server that is remote from the client computer;
interactively filling in the informational fields on the template form;
interactively selecting one or more of the hypermedia links; and processing the template form by executing the utility programs in response to the step of selecting of one or more of the hypermedia links, wherein the steps of creating and filling in the template form and selecting the hypermedia link are all performed, regardless of whether the first server and application server are the same or are different servers.
2. The method of claim 1 for use with a database residing on said application server, wherein the one or more utility programs include one or more database management mechanisms, and wherein the step of processing the template form includes at least one or more of the following steps: inserting, retrieving, updating, and deleting one or more entries of said database.
3. The method of claim 2 for use in indexing a plurality of documents located on any one or more servers of the WAN, wherein the step of filling in the template form comprises describing one or more of the documents.
4. The method of claim 2 for use in accounting one or more costs associated with a plurality of documents located on one or more servers of the WAN, wherein the step of filling in the template form comprises the step of specifying cost information for one or more of the documents.
5. The method of claim 2, wherein the step of creating the template form includes creating a table including a set of data specifications corresponding to the informational fields, and registering said table with the application server.
6. The method of claim 1, wherein the one or more hypermedia links addressing one or more utility programs each include one or more internal fields of data specifying one or more operations to be performed by the utility programs.
7. The method of claim 6, wherein the internal fields of data further specify one or more argument values for use in performing said operations.
8. The method of claim 6, wherein the internal fields of data further include one or more tags recognized by the application server.
9. The method of claim 6, further including the step of registering the operations with the application server, using a developer's client computer.
10. An apparatus for providing form-driven interactive services on a WAN
comprising a plurality of servers, the apparatus comprising:

a seamless user interface environment accessible via a client computer, said client computer operably coupled to a first server, the seamless user interface environment further comprising: form generation means for creating a template form, said template form comprising one or more informational fields and one or more hypermedia links, said links addressing one or more utility programs stored on an application server that is remote from the client computer; edit means for interactively filling in the informational fields on the template form; and cursor control means for interactively selecting one or more of the hypermedia links; and application service means, responsive to the selection of the hypermedia links, for processing the template form by executing the utility programs, wherein said apparatus is operable regardless of whether the first server and application server are the same or different servers.
11. A computer-readable medium having recorded thereon instructions for providing interactive application services on a WAN comprising a plurality of servers, for execution by a client computer operably coupled to a first server, said instructions for causing a computer to:
create, from a client computer operably coupled to a first server, a template form comprising one or more informational fields and one or more hypermedia links, said links addressing one or more utility programs stored on an application server that is remote from the client computer;
interactively fill in the informational fields on the template form;
interactively select one or more of the hypermedia links; and process the template form by executing the utility programs in response to the step of interactively selecting of one or more of the hypermedia links, wherein the instructions for causing the computer to create and fill in the template form and select the hypermedia link are all performed, regardless of whether the first server and application server are the same or are different servers.
12. The computer-readable medium of claim 11, for use with a database residing on said application server, wherein the one or more utility programs include one or more database management mechanisms, and wherein the instructions for causing the computer to process the template form include instructions for causing the computer to perform at least one or more of the following:

inserting, retrieving, updating, and deleting one or more entries of said database.
13. The computer-readable medium of claim 12, for use in indexing a plurality of documents located on any one or more servers of the WAN, wherein the instructions for causing the computer to fill in the template form include instructions for causing the computer to describe one or more of the documents.
14. The computer-readable medium of claim 13, for use in accounting one or more costs associated with a plurality of documents located on one or more servers of the WAN, wherein the instructions for causing the computer to fill in the template form include instructions for causing the computer to specify cost information for one or more of the documents.
15. The computer-readable medium of claim 13, wherein the instructions for causing the computer to create the template form include instructions for causing the computer to create a table including a set of data specifications corresponding to the informational fields, and register said table with the application server.
16. The computer-readable medium of claim 11, wherein the one or more hypermedia links addressing one or more utility programs each include one or more internal fields of data specifying one or more operations to be performed by the utility programs.
17. The computer-readable medium of claim 16, wherein the internal fields of data further specify one or more argument values for use in performing said operations.
18. The computer-readable medium of claim 16, wherein the internal fields of data further include one or more tags recognized by the application server.
19. The computer-readable medium of claim 16, further including instructions for causing the computer to register the operations with the application server, using a developer's client computer.
CA002216826A 1995-03-28 1996-03-21 An integrated development platform for distributed publishing and management of hypermedia over wide area networks Expired - Lifetime CA2216826C (en)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US08/412,981 1995-03-28
US08/412,981 US5870552A (en) 1995-03-28 1995-03-28 Method and apparatus for publishing hypermedia documents over wide area networks
PCT/US1996/001686 WO1996030846A1 (en) 1995-03-28 1996-03-21 An integrated development platform for distributed publishing and management of hypermedia over wide area networks

Publications (2)

Publication Number Publication Date
CA2216826A1 CA2216826A1 (en) 1996-10-03
CA2216826C true CA2216826C (en) 2009-01-27

Family

ID=23635286

Family Applications (1)

Application Number Title Priority Date Filing Date
CA002216826A Expired - Lifetime CA2216826C (en) 1995-03-28 1996-03-21 An integrated development platform for distributed publishing and management of hypermedia over wide area networks

Country Status (6)

Country Link
US (4) US5870552A (en)
EP (1) EP0818013A1 (en)
JP (4) JP3173660B2 (en)
AU (1) AU705581B2 (en)
CA (1) CA2216826C (en)
WO (1) WO1996030846A1 (en)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9226006B2 (en) 1998-07-14 2015-12-29 Rovi Guides, Inc. Client-server based interactive guide with server recording

Families Citing this family (330)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7313251B2 (en) * 1993-11-18 2007-12-25 Digimarc Corporation Method and system for managing and controlling electronic media
US5841978A (en) * 1993-11-18 1998-11-24 Digimarc Corporation Network linking method using steganographically embedded data objects
US6564321B2 (en) * 1995-04-28 2003-05-13 Bobo Ii Charles R Systems and methods for storing, delivering, and managing messages
US6604103B1 (en) 1994-09-02 2003-08-05 Mark A. Wolfe System and method for information retrieval employing a preloading procedure
US7467137B1 (en) 1994-09-02 2008-12-16 Wolfe Mark A System and method for information retrieval employing a preloading procedure
US7103594B1 (en) 1994-09-02 2006-09-05 Wolfe Mark A System and method for information retrieval employing a preloading procedure
US6560349B1 (en) * 1994-10-21 2003-05-06 Digimarc Corporation Audio monitoring using steganographic information
US7349976B1 (en) 1994-11-30 2008-03-25 Realnetworks, Inc. Audio-on-demand communication system
US5793980A (en) * 1994-11-30 1998-08-11 Realnetworks, Inc. Audio-on-demand communication system
US5870552A (en) * 1995-03-28 1999-02-09 America Online, Inc. Method and apparatus for publishing hypermedia documents over wide area networks
US7702540B1 (en) * 1995-04-26 2010-04-20 Ebay Inc. Computer-implement method and system for conducting auctions on the internet
US7937312B1 (en) 1995-04-26 2011-05-03 Ebay Inc. Facilitating electronic commerce transactions through binding offers
US7224819B2 (en) 1995-05-08 2007-05-29 Digimarc Corporation Integrating digital watermarks in multimedia content
US6760463B2 (en) * 1995-05-08 2004-07-06 Digimarc Corporation Watermarking methods and media
US6901433B2 (en) * 1995-06-07 2005-05-31 Microsoft Corporation System for providing users with a filtered view of interactive network directory obtains from remote properties cache that provided by an on-line service
US7302638B1 (en) 1995-06-07 2007-11-27 Wolfe Mark A Efficiently displaying and researching information about the interrelationships between documents
US7272639B1 (en) 1995-06-07 2007-09-18 Soverain Software Llc Internet server access control and monitoring systems
US5742845A (en) 1995-06-22 1998-04-21 Datascape, Inc. System for extending present open network communication protocols to communicate with non-standard I/O devices directly coupled to an open network
US6408331B1 (en) * 1995-07-27 2002-06-18 Digimarc Corporation Computer linking methods using encoded graphics
US6505160B1 (en) 1995-07-27 2003-01-07 Digimarc Corporation Connected audio and other media objects
US6965682B1 (en) 1999-05-19 2005-11-15 Digimarc Corp Data transmission by watermark proxy
US6411725B1 (en) * 1995-07-27 2002-06-25 Digimarc Corporation Watermark enabled video objects
US7562392B1 (en) 1999-05-19 2009-07-14 Digimarc Corporation Methods of interacting with audio and ambient music
US6388714B1 (en) 1995-10-02 2002-05-14 Starsight Telecast Inc Interactive computer system for providing television schedule information
US5774670A (en) * 1995-10-06 1998-06-30 Netscape Communications Corporation Persistent client state in a hypertext transfer protocol based client-server system
US7647243B2 (en) * 1995-11-07 2010-01-12 Ebay Inc. Electronic marketplace system and method for creation of a two-tiered pricing scheme
US5778367A (en) * 1995-12-14 1998-07-07 Network Engineering Software, Inc. Automated on-line information service and directory, particularly for the world wide web
US5823879A (en) 1996-01-19 1998-10-20 Sheldon F. Goldberg Network gaming system
US9530150B2 (en) 1996-01-19 2016-12-27 Adcension, Llc Compensation model for network services
US6264560B1 (en) 1996-01-19 2001-07-24 Sheldon F. Goldberg Method and system for playing games on a network
US20010011253A1 (en) * 1998-08-04 2001-08-02 Christopher D. Coley Automated system for management of licensed software
US20060265337A1 (en) * 1996-02-26 2006-11-23 Graphon Corporation Automated system for management of licensed digital assets
US6173286B1 (en) * 1996-02-29 2001-01-09 Nth Degree Software, Inc. Computer-implemented optimization of publication layouts
GB2312139B (en) * 1996-04-12 2000-09-20 Sony Uk Ltd Editing of recorded material
US8180844B1 (en) * 2000-03-18 2012-05-15 Digimarc Corporation System for linking from objects to remote resources
US7555458B1 (en) 1996-06-05 2009-06-30 Fraud Control System.Com Corporation Method of billing a purchase made over a computer network
US8229844B2 (en) 1996-06-05 2012-07-24 Fraud Control Systems.Com Corporation Method of billing a purchase made over a computer network
US20030195846A1 (en) 1996-06-05 2003-10-16 David Felger Method of billing a purchase made over a computer network
US5911145A (en) * 1996-07-29 1999-06-08 Rae Technology, Inc. Hierarchical structure editor for web sites
US6006252A (en) 1996-10-08 1999-12-21 Wolfe; Mark A. System and method for communicating information relating to a network resource
AU5356598A (en) * 1996-11-15 1998-06-03 Inergy Online, Inc. Remote communication, information management, and home page authoring system
US6017157A (en) * 1996-12-24 2000-01-25 Picturevision, Inc. Method of processing digital images and distributing visual prints produced from the digital images
EP0854650A3 (en) * 1997-01-17 2001-05-02 NOKIA TECHNOLOGY GmbH Method for addressing a service in digital video broadcasting
US5908469A (en) * 1997-02-14 1999-06-01 International Business Machines Corporation Generic user authentication for network computers
US5941944A (en) * 1997-03-03 1999-08-24 Microsoft Corporation Method for providing a substitute for a requested inaccessible object by identifying substantially similar objects using weights corresponding to object features
US7278098B1 (en) 1997-04-09 2007-10-02 Adobe Systems Incorporated Method and apparatus for implementing web pages having smart tables
KR100234204B1 (en) * 1997-05-15 1999-12-15 윤종용 After service system using internet
US8626763B1 (en) 1997-05-22 2014-01-07 Google Inc. Server-side suggestion of preload operations
US6684369B1 (en) * 1997-06-19 2004-01-27 International Business Machines, Corporation Web site creator using templates
US6278465B1 (en) * 1997-06-23 2001-08-21 Sun Microsystems, Inc. Adaptive font sizes for network browsing
US6012100A (en) * 1997-07-14 2000-01-04 Freegate Corporation System and method of configuring a remotely managed secure network interface
US6115035A (en) * 1997-07-21 2000-09-05 Mediaone Group, Inc. System and method for automated audio/video archive and distribution
JPH1153168A (en) * 1997-08-07 1999-02-26 Matsushita Graphic Commun Syst Inc Document preparing device with voice information and method used with the same
US5987482A (en) * 1997-09-08 1999-11-16 International Business Machines Corporation Computer system and method of displaying hypertext documents with internal hypertext link definitions
US20020026496A1 (en) * 1997-09-18 2002-02-28 Franklin E. Boyer Electronic-mail reminder for an internet television program guide
US6035323A (en) * 1997-10-24 2000-03-07 Pictra, Inc. Methods and apparatuses for distributing a collection of digital media over a network with automatic generation of presentable media
US6076111A (en) 1997-10-24 2000-06-13 Pictra, Inc. Methods and apparatuses for transferring data between data processing systems which transfer a representation of the data before transferring the data
US7257604B1 (en) 1997-11-17 2007-08-14 Wolfe Mark A System and method for communicating information relating to a network resource
US7047248B1 (en) * 1997-11-19 2006-05-16 International Business Machines Corporation Data processing system and method for archiving and accessing electronic messages
US6026371A (en) * 1997-11-25 2000-02-15 International Business Machines Corp. Method and apparatus for allowing online directory producers to preview advertisement in online directory listings
US5987466A (en) * 1997-11-25 1999-11-16 International Business Machines Corporation Presenting web pages with discrete, browser-controlled complexity levels
US6247011B1 (en) * 1997-12-02 2001-06-12 Digital-Net, Inc. Computerized prepress authoring for document creation
US6321244B1 (en) * 1997-12-04 2001-11-20 Siemens Corporate Research, Inc. Style specifications for systematically creating card-based hypermedia manuals
US6424978B1 (en) * 1997-12-05 2002-07-23 Siemens Corporate Research, Inc. Formatting card-based hypermedia documents by automatic scripting
US9900305B2 (en) * 1998-01-12 2018-02-20 Soverain Ip, Llc Internet server access control and monitoring systems
US6393437B1 (en) * 1998-01-27 2002-05-21 Microsoft Corporation Web developer isolation techniques
US6792454B2 (en) * 1998-02-04 2004-09-14 Interwoven, Inc. System and method for website development
US7047300B1 (en) 1998-02-10 2006-05-16 Sprint Communications Company L.P. Survivable and scalable data system and method for computer networks
US7003528B2 (en) 1998-02-13 2006-02-21 3565 Acquisition, Llc Method and system for web management
US6560639B1 (en) 1998-02-13 2003-05-06 3565 Acquisition Corporation System for web content management based on server-side application
US7051003B1 (en) 1998-02-26 2006-05-23 Atabok Japan, Inc. Method and apparatus for delivering electronic data through a proxy server
US6038574A (en) * 1998-03-18 2000-03-14 Xerox Corporation Method and apparatus for clustering a collection of linked documents using co-citation analysis
US6286018B1 (en) * 1998-03-18 2001-09-04 Xerox Corporation Method and apparatus for finding a set of documents relevant to a focus set using citation analysis and spreading activation techniques
US6366923B1 (en) * 1998-03-23 2002-04-02 Webivore Research, Llc Gathering selected information from the world wide web
US7689532B1 (en) 2000-07-20 2010-03-30 Digimarc Corporation Using embedded data with file sharing
US6665836B1 (en) * 1998-06-17 2003-12-16 Siemens Corporate Research, Inc. Method for managing information on an information net
US8010627B1 (en) * 1998-09-25 2011-08-30 Sprint Communications Company L.P. Virtual content publishing system
US6411991B1 (en) 1998-09-25 2002-06-25 Sprint Communications Company L.P. Geographic data replication system and method for a network
US6871220B1 (en) 1998-10-28 2005-03-22 Yodlee, Inc. System and method for distributed storage and retrieval of personal information
ES2200753T3 (en) 1998-10-28 2004-03-16 Verticalone Corporation APPARATUS AND METHOD FOR AGGREGATION AND AUTOMATED SUPPLY OF TRANSACTIONS THAT INVOLVE INFORMATION OR PERSONAL ELECTRONIC DATA.
WO2000030232A1 (en) * 1998-11-19 2000-05-25 X/Net Associates, Inc. Method and system for external notification and/or resolution of software errors
US7085997B1 (en) 1998-12-08 2006-08-01 Yodlee.Com Network-based bookmark management and web-summary system
US7200804B1 (en) * 1998-12-08 2007-04-03 Yodlee.Com, Inc. Method and apparatus for providing automation to an internet navigation application
US8069407B1 (en) 1998-12-08 2011-11-29 Yodlee.Com, Inc. Method and apparatus for detecting changes in websites and reporting results to web developers for navigation template repair purposes
US7672879B1 (en) 1998-12-08 2010-03-02 Yodlee.Com, Inc. Interactive activity interface for managing personal data and performing transactions over a data packet network
US6928469B1 (en) * 1998-12-29 2005-08-09 Citrix Systems, Inc. Apparatus and method for determining a program neighborhood for a client node in a client-server network using markup language techniques
US20020032749A1 (en) * 1999-01-25 2002-03-14 David Isherwood Method and system for identifying provider network locations based on user-provided codes
US20030069966A1 (en) * 2001-10-10 2003-04-10 Ritz Peter B. Method and system for directing users to information specific to network applications
US6993580B2 (en) * 1999-01-25 2006-01-31 Airclic Inc. Method and system for sharing end user information on network
US6448979B1 (en) * 1999-01-25 2002-09-10 Airclic, Inc. Printed medium activated interactive communication of multimedia information, including advertising
WO2000048098A1 (en) * 1999-02-09 2000-08-17 Carden Jennings Publishing Co., Ltd. System and method for publishing documents
US7257767B1 (en) 1999-02-09 2007-08-14 Carden Jr William T System and method for publishing documents
US6813746B1 (en) * 1999-03-10 2004-11-02 Adobe Systems Incorporated Hierarchical master pages
US7353199B1 (en) 1999-03-22 2008-04-01 Perfect Web Technologies, Inc. Method of moderating external access to an electronic document authoring development and distribution system
AU3918800A (en) * 1999-03-24 2000-10-09 Atomicweb System for creating web sites using browser
US6314457B1 (en) * 1999-04-21 2001-11-06 Airclic, Inc. Method for managing printed medium activated revenue sharing domain name system schemas
US6459788B1 (en) * 1999-04-27 2002-10-01 Sprint Communications Company L.P. Call center resource processor
EP1145147A2 (en) * 1999-05-07 2001-10-17 Argo Interactive Limited Display text modification for link data items
US6212534B1 (en) * 1999-05-13 2001-04-03 X-Collaboration Software Corp. System and method for facilitating collaboration in connection with generating documents among a plurality of operators using networked computer systems
US8874244B2 (en) * 1999-05-19 2014-10-28 Digimarc Corporation Methods and systems employing digital content
US7406214B2 (en) 1999-05-19 2008-07-29 Digimarc Corporation Methods and devices employing optical sensors and/or steganography
US7263655B1 (en) * 1999-05-21 2007-08-28 Thomson Scientific Inc. System and method for publishing manuscripts
US7752535B2 (en) 1999-06-01 2010-07-06 Yodlec.com, Inc. Categorization of summarized information
US20040078423A1 (en) * 2002-03-22 2004-04-22 Ramakrishna Satyavolu Method and apparatus for controlled establishment of a turnkey system providing a centralized data aggregation and summary capability to third party entities
US6532312B1 (en) * 1999-06-14 2003-03-11 Eastman Kodak Company Photoquilt
US7350139B1 (en) * 2000-06-16 2008-03-25 American Express Travel Related Services Company, Inc. System and method for utilizing a drag and drop technique to complete electronic forms
US6405191B1 (en) * 1999-07-21 2002-06-11 Oracle Corporation Content based publish-and-subscribe system integrated in a relational database system
GB9917554D0 (en) 1999-07-27 1999-09-29 Schlumberger Holdings Publishing system for intranet
FR2797336B1 (en) * 1999-08-02 2002-02-15 Pyc Conseils METHOD AND SYSTEM FOR CREATING, MANAGING AND CONSULTING WEBSITES
US6470269B1 (en) 1999-08-20 2002-10-22 Xerox Corporation Method for providing time discrimination in the world wide web
AU6931800A (en) * 1999-08-30 2001-03-26 Noosh, Inc. System and method for managing projects using publishing restrictions
US6636853B1 (en) * 1999-08-30 2003-10-21 Morphism, Llc Method and apparatus for representing and navigating search results
US20020023108A1 (en) * 1999-09-09 2002-02-21 Neil Daswani Automatic web form interaction proxy
US6434745B1 (en) * 1999-09-15 2002-08-13 Direct Business Technologies, Inc. Customized web browsing and marketing software with local events statistics database
US20020188537A1 (en) * 1999-09-16 2002-12-12 Leeds Peter A. Management systems and methods for maximizing return on assets
US7640318B1 (en) * 1999-09-17 2009-12-29 Ricoh Co., Ltd. Method and apparatus for publishing documents over a network
US7039860B1 (en) 1999-10-01 2006-05-02 Netspinner Solutions As Creating web pages category list prior to the list being served to a browser
US20060265476A1 (en) * 1999-10-21 2006-11-23 Sean Barger Automated media delivery system
US6964009B2 (en) * 1999-10-21 2005-11-08 Automated Media Processing Solutions, Inc. Automated media delivery system
US20100145794A1 (en) * 1999-10-21 2010-06-10 Sean Barnes Barger Media Processing Engine and Ad-Per-View
US6792575B1 (en) * 1999-10-21 2004-09-14 Equilibrium Technologies Automated processing and delivery of media to web servers
US7152207B1 (en) * 1999-11-05 2006-12-19 Decentrix Inc. Method and apparatus for providing conditional customization for generating a web site
US7779352B1 (en) 1999-11-05 2010-08-17 John Underwood Method and apparatus for generating a website using a multi-dimensional description of the website
US6944821B1 (en) * 1999-12-07 2005-09-13 International Business Machines Corporation Copy/paste mechanism and paste buffer that includes source information for copied data
US6845448B1 (en) 2000-01-07 2005-01-18 Pennar Software Corporation Online repository for personal information
US8117644B2 (en) 2000-01-07 2012-02-14 Pennar Software Corporation Method and system for online document collaboration
AU2001232838A1 (en) * 2000-01-14 2001-07-24 Portable Websites.Com, Inc. Method and apparatus for creating relocatable internet web sites
FR2804231B1 (en) 2000-01-25 2002-11-08 Vistaprint Usa Inc CENTRALIZED PRINTING OF LOW-VOLUME COMMERCIAL DOCUMENTS ON MACHINES PREVIOUSLY LIMITED TO VERY LARGE PRINTS
AU2001231078A1 (en) * 2000-01-25 2001-08-07 Vistaprint Usa, Inc. Managing print jobs
CA2395390A1 (en) * 2000-02-22 2001-08-30 Sdgi Holdings, Inc. Instruments and techniques for disc space preparation
US20010039592A1 (en) * 2000-02-24 2001-11-08 Carden Francis W. Web address assignment process
GB2361341A (en) * 2000-03-03 2001-10-17 Knowhow Systems Ltd Document creation and delivery
US20020178088A1 (en) * 2000-03-08 2002-11-28 Lurie Leib A. System and method for facilitating shopping
WO2001071551A1 (en) * 2000-03-22 2001-09-27 Hca Marketing Inc. System and method for changing items on an internet web site
US20010044834A1 (en) * 2000-03-22 2001-11-22 Robert Bradshaw Method and apparatus for automatically deploying data in a computer network
AU2001253610A1 (en) * 2000-04-18 2001-10-30 Icplanet Acquisition Corporation Method, system, and computer program product for propagating remotely configurable posters of host site content
US6578022B1 (en) * 2000-04-18 2003-06-10 Icplanet Corporation Interactive intelligent searching with executable suggestions
US6681255B1 (en) 2000-04-19 2004-01-20 Icplanet Corporation Regulating rates of requests by a spider engine to web sites by creating instances of a timing module
US7038807B1 (en) 2000-04-21 2006-05-02 Ellia Karres System for sequestering print advertisements and displaying the advertisements on an electronic medium
AU2001259143A1 (en) * 2000-04-25 2001-11-07 Icplanet Acquisition Corporation Method, system, and computer program product for employment market statistics generation and analysis
AU2001253784A1 (en) * 2000-04-25 2001-11-07 Icplanet Acquisition Corporation System and method for proximity searching position information using a proximity parameter
US7065555B2 (en) * 2000-04-25 2006-06-20 Ic Planet Corporation System and method related to generating and tracking an email campaign
US7469405B2 (en) * 2000-04-25 2008-12-23 Kforce Inc. System and method for scheduling execution of cross-platform computer processes
US20050177574A1 (en) * 2000-05-08 2005-08-11 James Riley Electronic course generation systems and methods
US7546337B1 (en) 2000-05-18 2009-06-09 Aol Llc, A Delaware Limited Liability Company Transferring files
US10878178B2 (en) * 2000-06-07 2020-12-29 Pt 291, Llc Modifying web pages to be served by computer server system
US20080162298A1 (en) * 2000-06-15 2008-07-03 American Express Travel Related Services Company, Inc. Online ordering system and method
AU2002214748A1 (en) 2000-06-12 2001-12-24 Infospace, Inc. Universal shopping cart and order injection system
US20080306835A1 (en) * 2000-06-15 2008-12-11 American Express Travel Related Services Company, Inc. System and method for customizing an email message
US7366779B1 (en) 2000-06-19 2008-04-29 Aol Llc, A Delaware Limited Liability Company Direct file transfer between subscribers of a communications system
US6948135B1 (en) 2000-06-21 2005-09-20 Microsoft Corporation Method and systems of providing information to computer users
US7191394B1 (en) 2000-06-21 2007-03-13 Microsoft Corporation Authoring arbitrary XML documents using DHTML and XSLT
US7000230B1 (en) 2000-06-21 2006-02-14 Microsoft Corporation Network-based software extensions
US6883168B1 (en) 2000-06-21 2005-04-19 Microsoft Corporation Methods, systems, architectures and data structures for delivering software via a network
US7346848B1 (en) 2000-06-21 2008-03-18 Microsoft Corporation Single window navigation methods and systems
US7155667B1 (en) 2000-06-21 2006-12-26 Microsoft Corporation User interface for integrated spreadsheets and word processing tables
EP1172734A1 (en) * 2000-07-12 2002-01-16 eGrail Method and system for web management
US20020026521A1 (en) * 2000-08-31 2002-02-28 Sharfman Joshua Dov Joseph System and method for managing and distributing associated assets in various formats
US6839059B1 (en) 2000-08-31 2005-01-04 Interactive Video Technologies, Inc. System and method for manipulation and interaction of time-based mixed media formats
US6922702B1 (en) 2000-08-31 2005-07-26 Interactive Video Technologies, Inc. System and method for assembling discrete data files into an executable file and for processing the executable file
US20060074727A1 (en) 2000-09-07 2006-04-06 Briere Daniel D Method and apparatus for collection and dissemination of information over a computer network
US7797241B2 (en) 2000-09-13 2010-09-14 Ip.Com, Inc. Global information network product publication system
FR2815437A1 (en) * 2000-10-18 2002-04-19 Guilhem Giraud Centralized management of pages of hypertext links for an organization having a world wide web site, uses database to store client link requests for information from a site to deliver web pages
US6999987B1 (en) * 2000-10-25 2006-02-14 America Online, Inc. Screening and survey selection system and method of operating the same
US7178097B1 (en) 2000-11-13 2007-02-13 Srikrishna Talluri Method and system for using a communications network to archive and retrieve bibliography information and reference material
US6871780B2 (en) * 2000-11-27 2005-03-29 Airclic, Inc. Scalable distributed database system and method for linking codes to internet information
US20020091840A1 (en) * 2000-11-28 2002-07-11 Gregory Pulier Real-time optimization of streaming media from a plurality of media sources
US6948116B2 (en) * 2000-12-01 2005-09-20 International Business Machines Corporation System and method for creating a unified printable collection of hyperlinked documents
US20020078099A1 (en) * 2000-12-15 2002-06-20 International Business Machines Corporation Method and system for off-loading and retrieving document content in a document processing system
US20040148232A1 (en) * 2001-01-22 2004-07-29 Osamu Fushimi Electronic catalog aggregation apparatus for realizing fast and efficient electronic catalog system
US20020120607A1 (en) * 2001-02-28 2002-08-29 Lumenati, Inc. File sharing system for serving content from a computer
FI20010437A (en) * 2001-03-05 2002-09-06 Poutapilvi Web Design Oy Procedure and apparatus for loading documents
WO2002075523A1 (en) * 2001-03-16 2002-09-26 Netomat, Inc. Sharing, managing and communicating information over a computer network
JP2002288041A (en) * 2001-03-23 2002-10-04 Sony Corp Information processing device and method, program storage medium and program
US7685229B1 (en) * 2001-05-15 2010-03-23 Adobe Systems Incorporated System and method for displaying server side code results in an application program
US7480910B1 (en) 2001-05-15 2009-01-20 Adobe Systems Incorporated System and method for providing information and associating information
WO2003012576A2 (en) * 2001-07-27 2003-02-13 Quigo Technologies Inc. System and method for automated tracking and analysis of document usage
JP2003058088A (en) * 2001-08-16 2003-02-28 Fujitsu Ltd Server, method, program, and recording medium for advertisement
US6993712B2 (en) * 2001-09-28 2006-01-31 Siebel Systems, Inc. System and method for facilitating user interaction in a browser environment
US6952714B2 (en) * 2001-10-02 2005-10-04 Citrix Systems, Inc. Method for distributed program execution with server-based file type association
US7117243B2 (en) * 2001-10-02 2006-10-03 Citrix Systems, Inc. Methods for distributed program execution with file-type association in a client-server network
US7330872B2 (en) * 2001-10-02 2008-02-12 Citrix Systems, Inc. Method for distributed program execution with web-based file-type association
US20030070179A1 (en) * 2001-10-04 2003-04-10 Ritz Peter B. System and method for connecting end user with application based on broadcast code
CN1591405A (en) * 2001-11-09 2005-03-09 无锡永中科技有限公司 Edition compatible data processing system
US7861169B2 (en) * 2001-11-19 2010-12-28 Ricoh Co. Ltd. Multimedia print driver dialog interfaces
US7747655B2 (en) 2001-11-19 2010-06-29 Ricoh Co. Ltd. Printable representations for time-based media
US7536404B2 (en) * 2001-12-13 2009-05-19 Siemens Product Lifecycle Management Software, Inc. Electronic files preparation for storage in a server
US7660876B2 (en) * 2001-12-13 2010-02-09 Siemens Product Lifecycle Management Software Inc. Electronic file management
US7464134B2 (en) * 2002-01-24 2008-12-09 Hewlett-Packard Development Company, L.P. Mechanism and method for sharing imaging information from an enterprise resource planning computing environment
US20030146928A1 (en) * 2002-01-31 2003-08-07 Paul Finster Method and system for optimal grid alignment
US20040133629A1 (en) * 2002-02-01 2004-07-08 Brian Reynolds Methods, systems and devices for automated web publishing and distribution
US20030167471A1 (en) * 2002-03-04 2003-09-04 Cliff Roth System and method for selection of video products that are deliverable on demand
US8135843B2 (en) * 2002-03-22 2012-03-13 Citrix Systems, Inc. Methods and systems for providing access to an application
US8521632B2 (en) * 2002-04-30 2013-08-27 Broadridge Content Solutions, Inc. Processing securities-related information
US7127467B2 (en) 2002-05-10 2006-10-24 Oracle International Corporation Managing expressions in a database system
US7426549B2 (en) * 2002-05-31 2008-09-16 Hewlett-Packard Development Company, L.P. Mechanism for sharing web-based imaging information from a mainframe computing environment
US20030229858A1 (en) * 2002-06-06 2003-12-11 International Business Machines Corporation Method and apparatus for providing source information from an object originating from a first document and inserted into a second document
US7120622B2 (en) * 2002-06-10 2006-10-10 Xerox Corporation Authoring tools, including content-driven treetables, for fluid text
US20030231216A1 (en) * 2002-06-13 2003-12-18 International Business Machines Corp. Internet navigation tree with bookmarking and emailing capability
US7840673B1 (en) 2002-06-17 2010-11-23 International Business Machines Corporation Method and apparatus for management of hosted applications
US7599983B2 (en) 2002-06-18 2009-10-06 Wireless Ink Corporation Method, apparatus and system for management of information content for enhanced accessibility over wireless communication networks
AU2002950122A0 (en) * 2002-07-11 2002-09-12 Webnd Technologies Software process for management of electronic pages in a distributed environment
US7720910B2 (en) * 2002-07-26 2010-05-18 International Business Machines Corporation Interactive filtering electronic messages received from a publication/subscription service
US9124447B2 (en) * 2002-07-26 2015-09-01 International Business Machines Corporation Interactive client computer communication
US7194469B1 (en) 2002-09-24 2007-03-20 Adobe Systems Incorporated Managing links in a collection of documents
US20040073605A1 (en) * 2002-10-15 2004-04-15 Conley, Ralph F. Multi-tier web publishing software and system
US7178034B2 (en) * 2002-12-31 2007-02-13 Intel Corporation Method and apparatus for strong authentication and proximity-based access retention
US20040225730A1 (en) * 2003-01-17 2004-11-11 Brown Albert C. Content manager integration
US20040216084A1 (en) * 2003-01-17 2004-10-28 Brown Albert C. System and method of managing web content
US7249320B2 (en) * 2003-03-04 2007-07-24 Microsoft Corporation Method and system for displaying a title area for a page series
US7793233B1 (en) * 2003-03-12 2010-09-07 Microsoft Corporation System and method for customizing note flags
US7370066B1 (en) 2003-03-24 2008-05-06 Microsoft Corporation System and method for offline editing of data files
US7275216B2 (en) 2003-03-24 2007-09-25 Microsoft Corporation System and method for designing electronic forms and hierarchical schemas
US7415672B1 (en) 2003-03-24 2008-08-19 Microsoft Corporation System and method for designing electronic forms
US7296017B2 (en) 2003-03-28 2007-11-13 Microsoft Corporation Validation of XML data files
US7913159B2 (en) 2003-03-28 2011-03-22 Microsoft Corporation System and method for real-time validation of structured data files
US7703002B2 (en) * 2003-03-31 2010-04-20 Ricoh Company, Ltd. Method and apparatus for composing multimedia documents
US7509569B2 (en) * 2003-03-31 2009-03-24 Ricoh Co., Ltd. Action stickers for nested collections
US7552381B2 (en) * 2003-03-31 2009-06-23 Ricoh Co., Ltd. Check boxes for identifying and processing stored documents
US20070050696A1 (en) * 2003-03-31 2007-03-01 Piersol Kurt W Physical key for accessing a securely stored digital document
US7536638B2 (en) * 2003-03-31 2009-05-19 Ricoh Co., Ltd. Action stickers for identifying and processing stored documents
US7739583B2 (en) * 2003-03-31 2010-06-15 Ricoh Company, Ltd. Multimedia document sharing method and apparatus
US7757162B2 (en) * 2003-03-31 2010-07-13 Ricoh Co. Ltd. Document collection manipulation
CA2537229C (en) * 2003-05-14 2012-10-16 Collaborative Sciences And Technology, Inc. Persistent portal
US7406660B1 (en) 2003-08-01 2008-07-29 Microsoft Corporation Mapping between structured data and a visual surface
US7334187B1 (en) 2003-08-06 2008-02-19 Microsoft Corporation Electronic form aggregation
US7275159B2 (en) * 2003-08-11 2007-09-25 Ricoh Company, Ltd. Multimedia output device having embedded encryption functionality
US7451391B1 (en) * 2003-09-26 2008-11-11 Microsoft Corporation Method for web page rules compliance testing
US20050086634A1 (en) * 2003-10-16 2005-04-21 International Business Machines Corporation Web page development environment that displays frequency of use information
US7584172B2 (en) * 2003-10-16 2009-09-01 Sap Ag Control for selecting data query and visual configuration
CA2544017A1 (en) * 2003-10-29 2005-05-12 Michael W. Trainum System and method for managing documents
US20050102065A1 (en) 2003-11-10 2005-05-12 Conversive, Inc. Method and system for programming virtual robots using a template
US8819072B1 (en) 2004-02-02 2014-08-26 Microsoft Corporation Promoting data from structured data files
US20050192920A1 (en) * 2004-02-17 2005-09-01 Hodge Philip C. Real time data management apparatus, system and mehtod
US20050203935A1 (en) * 2004-03-11 2005-09-15 International Business Machines Corporation Clipboard content and document metadata collection
US20050222996A1 (en) * 2004-03-30 2005-10-06 Oracle International Corporation Managing event-condition-action rules in a database system
US7877327B2 (en) * 2004-05-03 2011-01-25 Trintuition Llc Apparatus and method for creating and using documents in a distributed computing network
US7774620B1 (en) 2004-05-27 2010-08-10 Microsoft Corporation Executing applications at appropriate trust levels
US7607090B2 (en) * 2004-06-14 2009-10-20 At&T Intellectual Property I, L.P. Frameless data presentation
US8532282B2 (en) * 2004-06-14 2013-09-10 At&T Intellectual Property I, L.P. Tracking user operations
US7523413B2 (en) * 2004-06-14 2009-04-21 At&T Intellectual Property I, L.P. Organizing session applications
US20050278655A1 (en) * 2004-06-14 2005-12-15 Sims Lisa K Multiple application viewing
US20050278650A1 (en) * 2004-06-14 2005-12-15 Sims Lisa K Floating user interface
US20050278261A1 (en) * 2004-06-14 2005-12-15 Richard Omanson Navigational controls for a presentation system
US7574657B2 (en) * 2004-06-14 2009-08-11 At&T Intellectual Property I, L.P. Administration manager
US7590945B2 (en) * 2004-06-14 2009-09-15 At&T Intellectual Property I, L.P. Viewing applications from inactive sessions
EP1640874A1 (en) * 2004-09-23 2006-03-29 Unisys Corporation Distributed publishing system integrating internal and external editorial means
US7712049B2 (en) * 2004-09-30 2010-05-04 Microsoft Corporation Two-dimensional radial user interface for computer software applications
US7692636B2 (en) 2004-09-30 2010-04-06 Microsoft Corporation Systems and methods for handwriting to a screen
US7788589B2 (en) * 2004-09-30 2010-08-31 Microsoft Corporation Method and system for improved electronic task flagging and management
US8487879B2 (en) 2004-10-29 2013-07-16 Microsoft Corporation Systems and methods for interacting with a computer through handwriting to a screen
US20060095835A1 (en) * 2004-11-01 2006-05-04 William Kennedy System and method for the modular generation of markup language
US7712022B2 (en) * 2004-11-15 2010-05-04 Microsoft Corporation Mutually exclusive options in electronic forms
US7721190B2 (en) 2004-11-16 2010-05-18 Microsoft Corporation Methods and systems for server side form processing
US7546528B2 (en) * 2004-12-20 2009-06-09 Ricoh Co., Ltd. Stamp sheets
US8255796B1 (en) * 2005-01-09 2012-08-28 Apple Inc. Efficient creation of documents
US7937651B2 (en) 2005-01-14 2011-05-03 Microsoft Corporation Structural editing operations for network forms
US7725834B2 (en) 2005-03-04 2010-05-25 Microsoft Corporation Designer-created aspect for an electronic form template
JP4906714B2 (en) * 2005-03-29 2012-03-28 株式会社日立国際電気 Substrate processing apparatus, centralized management apparatus, display method and adjustment method for substrate processing apparatus
US7673228B2 (en) 2005-03-30 2010-03-02 Microsoft Corporation Data-driven actions for network forms
US7747946B2 (en) * 2005-04-11 2010-06-29 Microsoft Corporation System and method for adorning shapes with data driven objects
US8010515B2 (en) 2005-04-15 2011-08-30 Microsoft Corporation Query to an electronic form
US8200975B2 (en) 2005-06-29 2012-06-12 Microsoft Corporation Digital signatures for network forms
CA2552651C (en) * 2005-07-15 2015-11-03 Elias Assad A system and method for formatted inter-node communications over a computer network
US7596754B2 (en) * 2005-07-28 2009-09-29 Microsoft Corporation Application assistance
US20070033155A1 (en) * 2005-08-02 2007-02-08 Landsman Richard A Client/server web application architectures for offline usage, data structures, and related methods
US7594003B2 (en) * 2005-08-02 2009-09-22 Aol Llc Client/server web application architectures for offline usage, data structures, and related methods
US8601475B2 (en) * 2005-08-02 2013-12-03 Aol Inc. Download and upload of email messages using control commands in a client/server web application
JP4165546B2 (en) * 2005-09-30 2008-10-15 ブラザー工業株式会社 Search system and program
US8001459B2 (en) 2005-12-05 2011-08-16 Microsoft Corporation Enabling electronic documents for limited-capability computing devices
US20070168975A1 (en) * 2005-12-13 2007-07-19 Thomas Kessler Debugger and test tool
EP2214094A3 (en) * 2005-12-19 2010-10-06 Research In Motion Limited Computing device and method of indicating status of application program
US7584943B2 (en) * 2005-12-29 2009-09-08 Frommelt Industries Of Canada, Inc. Loading dock bumper with replaceable metal faceplate
US7747557B2 (en) * 2006-01-05 2010-06-29 Microsoft Corporation Application of metadata to documents and document objects via an operating system user interface
US7797638B2 (en) * 2006-01-05 2010-09-14 Microsoft Corporation Application of metadata to documents and document objects via a software application user interface
US7627652B1 (en) * 2006-01-31 2009-12-01 Amazon Technologies, Inc. Online shared data environment
US20070186150A1 (en) * 2006-02-03 2007-08-09 Raosoft, Inc. Web-based client-local environment for structured interaction with a form
US20070245229A1 (en) * 2006-04-17 2007-10-18 Microsoft Corporation User experience for multimedia mobile note taking
US20070245223A1 (en) * 2006-04-17 2007-10-18 Microsoft Corporation Synchronizing multimedia mobile notes
US8751532B2 (en) 2006-05-11 2014-06-10 International Business Machines Corporation Nomadic data collection and management method including pessimistic locking of data
US20080209308A1 (en) * 2006-05-22 2008-08-28 Nicholas Andrew Brackney Content reference linking purchase model
US7856598B2 (en) * 2006-07-06 2010-12-21 Oracle International Corp. Spelling correction with liaoalphagrams and inverted index
US8601162B1 (en) 2006-07-27 2013-12-03 Aol Inc. Sharing network addresses
US7606752B2 (en) 2006-09-07 2009-10-20 Yodlee Inc. Host exchange in bill paying services
US7707518B2 (en) * 2006-11-13 2010-04-27 Microsoft Corporation Linking information
US20080120538A1 (en) * 2006-11-22 2008-05-22 University Of New Brunswick Visual web page authoring tool for multi-context web pages
US8983895B2 (en) * 2006-12-29 2015-03-17 Sap Se Representation of multiplicities for Docflow reporting
US8212805B1 (en) 2007-01-05 2012-07-03 Kenneth Banschick System and method for parametric display of modular aesthetic designs
US20080195662A1 (en) * 2007-02-13 2008-08-14 Norbert Gugerbauer Automated display of selected press releases of legal institutions within websites
JP4546501B2 (en) * 2007-04-13 2010-09-15 株式会社 エフ・イー・エス Content application construction system
US8261334B2 (en) 2008-04-25 2012-09-04 Yodlee Inc. System for performing web authentication of a user by proxy
US9507651B2 (en) * 2008-04-28 2016-11-29 Microsoft Technology Licensing, Llc Techniques to modify a document using a latent transfer surface
US9239884B2 (en) * 2008-05-22 2016-01-19 Alcatel Lucent Electronic document processing with automatic generation of links to cited references
US20100082746A1 (en) * 2008-09-30 2010-04-01 Ulrich Sean M System and method for web site driven collaborative web browsing
US8555359B2 (en) 2009-02-26 2013-10-08 Yodlee, Inc. System and methods for automatically accessing a web site on behalf of a client
JP5449859B2 (en) * 2009-05-18 2014-03-19 任天堂株式会社 GAME PROGRAM, GAME DEVICE, AND GAME SYSTEM
US10198523B2 (en) * 2009-06-03 2019-02-05 Microsoft Technology Licensing, Llc Utilizing server pre-processing to deploy renditions of electronic documents in a computer network
US8381112B2 (en) * 2009-06-09 2013-02-19 Empire Technology Development Llc Data management tool
US9049258B2 (en) * 2009-09-17 2015-06-02 Border Stylo, LLC Systems and methods for anchoring content objects to structured documents
US8434134B2 (en) 2010-05-26 2013-04-30 Google Inc. Providing an electronic document collection
US20110291964A1 (en) * 2010-06-01 2011-12-01 Kno, Inc. Apparatus and Method for Gesture Control of a Dual Panel Electronic Device
US8826495B2 (en) 2010-06-01 2014-09-09 Intel Corporation Hinged dual panel electronic device
US9727538B2 (en) * 2010-12-10 2017-08-08 International Business Machines Corporation Editing a fragmented document
JP6234919B2 (en) * 2011-04-25 2017-11-22 イカノス・コミュニケーションズ・インコーポレイテッドIkanos Communications,Inc. Method and apparatus for caching in a networked environment
US11611595B2 (en) 2011-05-06 2023-03-21 David H. Sitrick Systems and methodologies providing collaboration among a plurality of computing appliances, utilizing a plurality of areas of memory to store user input as associated with an associated computing appliance providing the input
US10402485B2 (en) 2011-05-06 2019-09-03 David H. Sitrick Systems and methodologies providing controlled collaboration among a plurality of users
US20130104038A1 (en) * 2011-10-19 2013-04-25 TinyURL, LLC Method for automatic url shortening
CN102360296A (en) * 2011-10-20 2012-02-22 北京金和软件股份有限公司 WEB-based online form development tool
US8856640B1 (en) 2012-01-20 2014-10-07 Google Inc. Method and apparatus for applying revision specific electronic signatures to an electronically stored document
CN103218374B (en) * 2012-01-21 2016-08-17 国际商业机器公司 Method and system for electronic document location
US9116863B1 (en) * 2012-01-31 2015-08-25 The Boeing Company Systems and methods for assembling documents
US9407720B2 (en) * 2012-04-06 2016-08-02 Sony Dadc Us Inc. Direct file transfer without sending requested file through requesting device
US9372833B2 (en) * 2012-09-14 2016-06-21 David H. Sitrick Systems and methodologies for document processing and interacting with a user, providing storing of events representative of document edits relative to a document; selection of a selected set of document edits; generating presentation data responsive to said selected set of documents edits and the stored events; and providing a display presentation responsive to the presentation data
US9529916B1 (en) 2012-10-30 2016-12-27 Google Inc. Managing documents based on access context
US11308037B2 (en) 2012-10-30 2022-04-19 Google Llc Automatic collaboration
US9384285B1 (en) 2012-12-18 2016-07-05 Google Inc. Methods for identifying related documents
US9495341B1 (en) 2012-12-18 2016-11-15 Google Inc. Fact correction and completion during document drafting
US9514113B1 (en) 2013-07-29 2016-12-06 Google Inc. Methods for automatic footnote generation
US9842113B1 (en) 2013-08-27 2017-12-12 Google Inc. Context-based file selection
KR20150045221A (en) 2013-10-18 2015-04-28 삼성전자주식회사 Lighting apparatus and lighting system
US20150149912A1 (en) * 2013-11-22 2015-05-28 Raytheon Company Interactive multimedia process flow chart analysis
US10339681B2 (en) 2013-11-22 2019-07-02 Raytheon Company Interactive multimedia process flow chart builder
US9529791B1 (en) 2013-12-12 2016-12-27 Google Inc. Template and content aware document and template editing
JP2015158728A (en) * 2014-02-21 2015-09-03 東芝テック株式会社 Apparatus and program for browsing information
US20150262151A1 (en) * 2014-03-11 2015-09-17 Nibl, Inc. Access Control System for Online Content
CN103995698A (en) * 2014-05-05 2014-08-20 重庆斯欧信息技术有限公司 Application form agile development method and system oriented to business
US9703763B1 (en) 2014-08-14 2017-07-11 Google Inc. Automatic document citations by utilizing copied content for candidate sources
US10204135B2 (en) 2015-07-29 2019-02-12 Oracle International Corporation Materializing expressions within in-memory virtual column units to accelerate analytic queries
US10372706B2 (en) 2015-07-29 2019-08-06 Oracle International Corporation Tracking and maintaining expression statistics across database queries
US11226955B2 (en) 2018-06-28 2022-01-18 Oracle International Corporation Techniques for enabling and integrating in-memory semi-structured data and text document searches with in-memory columnar query processing

Family Cites Families (39)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4817050A (en) * 1985-11-22 1989-03-28 Kabushiki Kaisha Toshiba Database system
JPS63286942A (en) 1987-05-19 1988-11-24 Fuji Xerox Co Ltd Device for editing browser
US5220657A (en) * 1987-12-02 1993-06-15 Xerox Corporation Updating local copy of shared data in a collaborative system
JPH01295340A (en) 1988-05-24 1989-11-29 Mitsubishi Electric Corp System redevelopment system
US5091849A (en) * 1988-10-24 1992-02-25 The Walt Disney Company Computer image production system utilizing first and second networks for separately transferring control information and digital image data
US5241671C1 (en) * 1989-10-26 2002-07-02 Encyclopaedia Britannica Educa Multimedia search system using a plurality of entry path means which indicate interrelatedness of information
US5267351A (en) * 1989-12-22 1993-11-30 Avid Technology, Inc. Media storage and retrieval system
DE69031491T2 (en) * 1990-04-10 1998-03-26 Ibm Hypertext data processing system and method
US5297279A (en) * 1990-05-30 1994-03-22 Texas Instruments Incorporated System and method for database management supporting object-oriented programming
JPH0756628B2 (en) * 1990-10-22 1995-06-14 富士ゼロックス株式会社 Graphical user interface editing device
US5297249A (en) * 1990-10-31 1994-03-22 International Business Machines Corporation Hypermedia link marker abstract and search services
US5307456A (en) * 1990-12-04 1994-04-26 Sony Electronics, Inc. Integrated multi-media production and authoring system
US5132900A (en) 1990-12-26 1992-07-21 International Business Machines Corporation Method and apparatus for limiting manipulation of documents within a multi-document relationship in a data processing system
JPH04318638A (en) 1991-04-17 1992-11-10 Fuji Xerox Co Ltd Hyper text model selecting system
JP2934754B2 (en) 1991-04-19 1999-08-16 富士ゼロックス株式会社 Data management method
US5278980A (en) * 1991-08-16 1994-01-11 Xerox Corporation Iterative technique for phrase query formation and an information retrieval system employing same
JPH05128110A (en) 1991-10-30 1993-05-25 Nec Corp Document preparing method and device therefor
KR100344695B1 (en) * 1991-11-27 2002-11-18 텔레폰아크티에볼라게트 엘엠 에릭슨 System for managing data in an architecture of a communication switching system, method thereof, and communication switching system
FR2690260B1 (en) 1992-04-17 1997-01-03 Bull Sa USE OF A VERY HIGH LEVEL BIDIRECTIONAL PROTOCOL FOR COMMUNICATION BETWEEN A HYPERMEDIA SYSTEM AND A PLURALITY OF EDITORS.
JPH06314230A (en) * 1992-04-22 1994-11-08 Matsushita Electric Ind Co Ltd Electronic information link generation device
JPH0668091A (en) 1992-08-20 1994-03-11 Fujitsu Ltd Document processor
JPH0695952A (en) 1992-09-10 1994-04-08 Hitachi Ltd Hypertext system
US5339433A (en) * 1992-11-19 1994-08-16 Borland International, Inc. Symbol browsing in an object-oriented development system
JP2505974B2 (en) * 1992-12-08 1996-06-12 インターナショナル・ビジネス・マシーンズ・コーポレイション A method for integrating multiple application programs into an integrated graphical user interface processing environment.
US5809317A (en) * 1992-12-30 1998-09-15 Intel Corporation Creating and maintaining hypertext links among heterogeneous documents by the establishment of anchors and connections among anchors
JPH076076A (en) 1993-06-15 1995-01-10 Toshiba Corp Hypermedia system
EP1047002A3 (en) * 1993-07-20 2002-06-19 Canon Kabushiki Kaisha Document processing apparatus and method
US5500929A (en) * 1993-08-30 1996-03-19 Taligent, Inc. System for browsing a network resource book with tabs attached to pages
US5838918A (en) * 1993-12-13 1998-11-17 International Business Machines Corporation Distributing system configuration information from a manager machine to subscribed endpoint machines in a distrubuted computing environment
US5649190A (en) * 1994-06-14 1997-07-15 Harris Corporation Multi-model database system for dynamic creation and maintenance of complex objects in a real time environment
DE69521575T2 (en) * 1994-09-12 2002-05-16 Adobe Systems Inc Method and arrangement for displaying electronic documents
CA2204736A1 (en) * 1994-11-08 1996-05-23 Charles H. Ferguson An online service development tool with fee setting capabilities
US5530852A (en) * 1994-12-20 1996-06-25 Sun Microsystems, Inc. Method for extracting profiles and topics from a first file written in a first markup language and generating files in different markup languages containing the profiles and topics for use in accessing data described by the profiles and topics
US5732219A (en) * 1995-03-17 1998-03-24 Vermeer Technologies, Inc. Computer system and computer-implemented process for remote editing of computer files
US5870552A (en) * 1995-03-28 1999-02-09 America Online, Inc. Method and apparatus for publishing hypermedia documents over wide area networks
US5708825A (en) * 1995-05-26 1998-01-13 Iconovex Corporation Automatic summary page creation and hyperlink generation
US5771355A (en) * 1995-12-21 1998-06-23 Intel Corporation Transmitting electronic mail by either reference or value at file-replication points to minimize costs
US5727156A (en) * 1996-04-10 1998-03-10 Hotoffice Technologies, Inc. Internet-based automatic publishing system
US5724595A (en) * 1996-06-19 1998-03-03 Sun Microsystems, Inc. Simple method for creating hypertext links

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9226006B2 (en) 1998-07-14 2015-12-29 Rovi Guides, Inc. Client-server based interactive guide with server recording
US9232254B2 (en) 1998-07-14 2016-01-05 Rovi Guides, Inc. Client-server based interactive television guide with server recording

Also Published As

Publication number Publication date
JP2006309801A (en) 2006-11-09
US5870552A (en) 1999-02-09
AU705581B2 (en) 1999-05-27
US6393469B1 (en) 2002-05-21
US7139812B2 (en) 2006-11-21
JP2004326819A (en) 2004-11-18
EP0818013A1 (en) 1998-01-14
JP3173660B2 (en) 2001-06-04
CA2216826A1 (en) 1996-10-03
US20030041117A1 (en) 2003-02-27
US20070168355A1 (en) 2007-07-19
WO1996030846A1 (en) 1996-10-03
JPH11503251A (en) 1999-03-23
JP2001195394A (en) 2001-07-19
AU5353896A (en) 1996-10-16

Similar Documents

Publication Publication Date Title
CA2216826C (en) An integrated development platform for distributed publishing and management of hypermedia over wide area networks
US6226655B1 (en) Method and apparatus for retrieving data from a network using linked location identifiers
US6338059B1 (en) Hyperlinked search interface for distributed database
US6381598B1 (en) System for providing cross-lingual information retrieval
US8396856B2 (en) Database system and method for data acquisition and perusal
US6145003A (en) Method of web crawling utilizing address mapping
JP5616491B2 (en) A system that inserts hyperlinks into documents
US7814171B2 (en) Method and system for modifying host application functionality based upon downloaded content
US9135295B2 (en) Methods and systems for automated searching
EP0774722B1 (en) Information retrieval system
US8156123B2 (en) Method and apparatus for processing metadata
US6405222B1 (en) Requesting concurrent entries via bookmark set
US6782430B1 (en) Invalid link recovery
US7770123B1 (en) Method for dynamically generating a “table of contents” view of a HTML-based information system
US20020075312A1 (en) Displaying graphical information and user selected properties on a computer interface
CA2204736A1 (en) An online service development tool with fee setting capabilities
JPH11502346A (en) Computer system and computer execution process for creating and maintaining online services
US7085801B1 (en) Method and apparatus for printing web pages
US7124411B1 (en) Method for using a floating pallet for a digital asset managements system in a plurality of different applications
US7100106B1 (en) Mirroring operations performed on linked files and folders
Cooper The Technology of Lexical Navigation
Marquis et al. Active Data Objects
Carpenter The Narrow, Rugged, Uninteresting Path Finally Becomes Interesting: A Review of Work in Descriptive Cataloging in 1991 with Trail Marks for Further Research.
Eichhorn et al. The NASA Astrophysics Data System: Free Access to the Astronomical Literature On-line and through E-mail
Russell " Yes, but does it scale?" practical considerations for database-driven information systems

Legal Events

Date Code Title Description
EEER Examination request
MKEX Expiry

Effective date: 20160321