(in-package :jbominji-weblog) ; url user will use to access araneida (defvar *site-url*) (setf *site-url* (araneida:make-url :scheme "http" :host jbominji:*site-host-name* :port 9073)) ;; araneida handler (cl-ajax:defexported waitforevent (lastCounterString) (sb-thread:with-mutex (jbominji:*log-events-mutex*) (with-open-file (stream "ajaxlistener.txt" :direction :output :if-exists :append :if-does-not-exist :create) (format stream "~A counter ~A ~A~%" (get-universal-time) jbominji:*log-counter* lastCounterString) ) (if (> jbominji:*log-counter* lastCounterString) (progn (fetch-log-events lastCounterString)) (handler-case (let ((wait-result (sb-thread:condition-wait jbominji:*log-events-wait-queue* jbominji:*log-events-mutex*))) (declare (ignore wait-result)) (fetch-log-events lastCounterString) ) (cl-user::timeout () (json:encode-json-to-string "none"))) ) )) (defun fetch-log-events (last-counter) (let ((update-list (nreverse (loop for (counter identity text pr) in jbominji:*log-events* when (> counter last-counter) collect (markup-parse-result counter identity text pr))))) (if (not (null update-list)) (progn (let ((output-string (json:encode-json-to-string update-list))) (with-open-file (stream "ajaxlistener.txt" :direction :output :if-exists :append) (handler-case (format stream "counter ~A, upd ~A, output ~A~%" last-counter update-list output-string) (sb-int:stream-encoding-error () (format stream "unprintable")) )) output-string )) (json:encode-json-to-string "none") ))) (defun markup-parse-result (counter identity text pr) (let* ((tree (lojban-parser:make-parse-tree pr)) (stream (make-string-output-stream )));:element-type :utf-8))) (format stream "~A: " identity) (markup-parse-tree tree stream) (format stream " ~A" (lojban-parser:show-unparsed-text pr)) (format stream " parse tree" (araneida:urlstring (araneida:make-url :scheme "http" :host jbominji:*site-host-name* :port "9072" :path "/generator" :query (concatenate 'string "jbocku=" (araneida:urlstring-escape text)) ))) (list counter (get-output-stream-string stream)) )) (defun markup-parse-tree (tree stream) (if (listp tree) (loop for i in tree do (markup-parse-tree i stream)) (cond ((equal (string-trim " " (slot-value tree 'lojban:text)) "") nil) ((typep tree 'lojban:|BRIVLA|) (progn (markup-parse-tree (lojban:children tree) stream))) ((typep tree 'lojban:|gismu|) (format stream " ~A " (lookup-gismu (slot-value tree 'lojban:text)) (slot-value tree 'lojban:text))) ((typep tree 'lojban:cmavo-group) (format stream " ~A " (lookup-cmavo (slot-value tree 'lojban:text)) (slot-value tree 'lojban:text))) ((typep tree 'lojban:|CMENE|) (format stream " ~A " (slot-value tree 'lojban:text))) ((or (eq (type-of tree) 'lojban:jbovalsi)) (let ((children (slot-value tree 'lojban:children))) (if (listp children) (progn (markup-parse-tree children stream) )))) (t (progn (format stream " ~A" (slot-value tree 'lojban:text)))) ))) (defclass jbominji-handler (araneida:handler) ()) (defmethod araneida:handle-request-response ((araneida:handler jbominji-handler) method (request1 araneida:request)) (progn (araneida:request-send-headers request1) (araneida:html-stream (araneida:request-stream request1) ; (break "foo") `(html (head (title "jbominji") ((script :src ,(araneida:urlstring (araneida:make-url :scheme "http" :host jbominji:*site-host-name* :path "/~jbominji/scripts/jbominji-logger.js")) :type "text/javascript")) ((script :src ,(araneida:urlstring (araneida:make-url :scheme "http" :host jbominji:*site-host-name* :path "/~jbominji/scripts/json.js")) :type "text/javascript")) ((link :rel "stylesheet" :type "text/css" :href ,(araneida:urlstring (araneida:make-url :scheme "http" :host jbominji:*site-host-name* :path "/~jbominji/scripts/jbominji-markup.css")))) ,(concatenate 'string (cl-ajax:build-preamble (araneida:urlstring (araneida:merge-url *site-url* "/ajax-function"))) ) ) ((body :onload "waitEvent();") ((h1) "jbominji") ((div :id "log")) ) )))) ;; ARANEIDA config ; -------------------------------------------------------------------------------- ; Araneida setup ; (defvar *listener*) (defun restart-jbominji-weblog () (setf jbominji:*log-events* nil) (setf jbominji:*log-counter* 0) (setf *listener* (make-instance 'araneida:threaded-http-listener :port (araneida:url-port *site-url*))) (araneida:install-handler (araneida:http-listener-handler *listener*) (make-instance 'jbominji-handler) (araneida:urlstring (araneida:merge-url *site-url* "/jbominji/irc")) nil) (araneida:install-handler (araneida:http-listener-handler *listener*) (make-instance 'cl-ajax:ajax-function-handler) (araneida:urlstring (araneida:merge-url *site-url* "/ajax-function")) nil) (araneida:start-listening *listener*) )