;;;; -*- Mode: LISP; Syntax: Common-Lisp; Base: 10 -*-
;;;; ---------------------------------------------------------------------------
;;;; File name: kb-browser-interface.lsp
;;;; System: FIRE
;;;; Author: Shawn Nicholson
;;;; Created: September 27, 2001 17:56:29
;;;; Purpose:
;;;; ---------------------------------------------------------------------------
;;;; Modified: Saturday, October 6, 2001 at 15:10:01 by Nicholson
;;;; ---------------------------------------------------------------------------
(in-package :fire-kb-browser)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Class structure for fire concepts, so that we can specialize the knowledge browser
;; methods on our fire system
(defclass fire-kb-browser-info (knowledge-browser::kb-browser-info)
((initial-concept :accessor initial-concept :initform nil :initarg :initial-concept)
(kb :accessor kb :initform nil :initarg :kb)
))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun browse-fire-kb (&key (starting-concept nil) (kb-path nil) (kb-name nil))
;; Make sure we have a KB to browse
(let ((kb (fire::open-or-create-kb :kb-path kb-path :kb-name kb-name)))
(format t "KB opened~%")
(let ((kbinfo (knowledge-browser::make-kb-browser-info "http://localhost" 8000 "fire"
:kb-browser-type 'fire-kb-browser-info
:kb kb
:initial-concept starting-concept)))
(format t "KB Info object created~%")
(knowledge-browser::in-kb-browser-info kbinfo)
;; Start KB browser
(knowledge-browser::start-knowledge-browser kbinfo)
(format t "Browser started~%")
(when starting-concept
(knowledge-browser::goto-concept kbinfo starting-concept))
kbinfo)))
(defmethod close-knowledge-browser ((kb-b fire-kb-browser-info))
(call-next-method kb-b))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defmethod concept-type (concept (kb-b fire-kb-browser-info))
(if (fire:collection? concept :kb (kb kb-b))
:collection
(fire:predicate-type concept (kb kb-b))))
(defmethod generate-concept-link ((kb-b fire-kb-browser-info) concept
&rest keyvals)
(apply #'knowledge-browser::generate-link kb-b concept 'concept keyvals))
(defmethod knowledge-browser::goto-straight-concept-url ((kb-b fire-kb-browser-info) concept)
(let ((link (generate-concept-link kb-b concept)))
(knowledge-browser::goto-url kb-b link)))
(defmacro publish-text-page (kb-b page &rest html-body)
`(let ((path (knowledge-browser::generate-relative-url-path ,kb-b "")))
(net.aserve:publish :path path
:content-type "text/html"
:function #'(lambda (req ent)
(net.aserve:with-http-response (req ent)
(net.aserve:with-http-body (req ent)
,@html-body))))
path))
(defmethod print-concept-url ((kb-b fire-kb-browser-info) concept &key (label nil))
(let ((link (generate-concept-link kb-b concept))
(label (or label concept)))
(format net.html.generator:*html-stream* "~A" link label)))
(defmethod print-redirection ((kb-b fire-kb-browser-info) concept delay)
(let ((link (generate-concept-link kb-b concept)))
(format net.html.generator:*html-stream*
"~%"
delay
link)))
(defmethod generate-search-page ((kb-b fire-kb-browser-info) req ent)
(net.aserve:with-http-response (req ent)
(net.aserve:with-http-body (req ent)
(let ((concept
(knowledge-browser::get-concept-name kb-b
(net.aserve:request-query-value "concept-search"
req)))
(search-type (net.aserve:request-query-value "search-type" req)))
(net.html.generator:html
(:html
(display-page-header concept kb-b)
(cond ((string-equal search-type "Complete")
(generate-completion-page kb-b concept))
((string-equal search-type "Go")
(let ((type (concept-type concept kb-b)))
(if type
(generate-redirection-page kb-b concept)
(generate-no-concept-page kb-b concept))))
(t
(net.html.generator:html
(:h3 "No such predicate.")
(:br)
(:h3 "Use your Back button to return to the last page"))))
(display-page-footer concept kb-b)))))))
(defmethod knowledge-browser::publish-base-pages ((kb-b fire-kb-browser-info))
(knowledge-browser::publish-function-page kb-b "concept")
(knowledge-browser::publish-function-page kb-b "concept-search" :function #'generate-search-page)
)
(defmethod knowledge-browser::publish-initial-page ((kb-b fire-kb-browser-info))
(publish-text-page kb-b ""
(net.html.generator:html
(:html
(:head (:title "FIRE Knowledge Browser System"))
(:body
(display-page-header nil kb-b)
(display-page-footer nil kb-b))))))
(defmethod knowledge-browser::generate-html-page ((kb-b fire-kb-browser-info)
concept
req ent)
(let ((references (if req
(net.aserve:request-query-value "references" req)
nil)))
(knowledge-browser::create-page-for-concept kb-b concept
:references references)))
(defmethod knowledge-browser::create-page-for-concept ((kb-b fire-kb-browser-info)
concept
&rest params)
;; (format t "In create page for concept~%")
(let ((type (concept-type concept kb-b))
(references (getf params :references)))
(net.html.generator:html
(:html
(:head (:title "FIRE KB Browser - Concept: " (:princ concept)))
(:body (display-page-header concept kb-b)
(:h2 (:princ (string-capitalize type)) ": "
(print-concept-url kb-b concept))
(print-concept-data kb-b (concept-type concept kb-b)
concept)
(display-all-references concept kb-b references)
(display-page-footer concept kb-b))))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; End of Code