(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 "" (lookup-gismu (slot-value tree 'lojban:text)) (slot-value tree 'lojban:text)))
((typep tree 'lojban:cmavo-group)
(format stream "" (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*)
)