;;;; -*- 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