[bknr-cvs] ksprotte changed trunk/projects/bos/web/kml-handlers.lisp
BKNR Commits
bknr at bknr.net
Thu Jul 24 19:30:56 UTC 2008
Revision: 3625
Author: ksprotte
URL: http://bknr.net/trac/changeset/3625
finished kml-root handler, performing necessary string replacements in given kml template
U trunk/projects/bos/web/kml-handlers.lisp
Modified: trunk/projects/bos/web/kml-handlers.lisp
===================================================================
--- trunk/projects/bos/web/kml-handlers.lisp 2008-07-24 15:19:13 UTC (rev 3624)
+++ trunk/projects/bos/web/kml-handlers.lisp 2008-07-24 19:30:56 UTC (rev 3625)
@@ -1,6 +1,8 @@
;;; -*- coding: utf-8 -*-
(in-package :bos.web)
+(enable-interpol-syntax)
+
(defpersistent-class kml-root-data ()
((language :initarg :language :reader language :type string
:index-type string-unique-index
@@ -69,6 +71,50 @@
(let ((kml-root-data (kml-root-data-with-language lang)))
(kml-string kml-root-data))))
+(defclass kml-root-handler (object-handler)
+ ())
+
+(defun replace-all-url-hosts (string new-host)
+ "Replaces all hostnames in STRING by NEW-HOST."
+ (ppcre:regex-replace-all #?r"((?:https?|ftp)://)\w+(?:\.\w+)*" string #?r"\1${new-host}"))
+
+(defun replace-lang-query-params (string new-lang)
+ (ppcre:regex-replace-all #?r"(?i)(lang=)[a-z]{2,2}" string #?r"\1${new-lang}"))
+
+(defun replace-personalized-contract-placeholder (string sponsor lang)
+ (if (null sponsor)
+ string
+ (let ((contract (first (sponsor-contracts sponsor))))
+ (ppcre:regex-replace #?r"<!-- +personalized +contract +placemark +-->"
+ string
+ (cxml:with-xml-output (cxml:make-string-sink :omit-xml-declaration-p t)
+ (write-personalized-contract-placemark-kml contract lang))))))
+
+(defun serve-kml-root-data (&optional sponsor)
+ (with-query-params ((lang "en"))
+ (let* ((kml-root-data (kml-root-data-with-language lang))
+ (last-modified (store-object-last-change kml-root-data 0)))
+ (hunchentoot:handle-if-modified-since last-modified )
+ (setf (hunchentoot:header-out :last-modified)
+ (hunchentoot:rfc-1123-date last-modified)
+ (hunchentoot:header-out :content-type)
+ "application/vnd.google-earth.kml+xml"
+ (hunchentoot:header-out :content-disposition)
+ (format nil "attachment; filename=kml-root-~A.kml" lang))
+ (let ((kml-string (kml-string kml-root-data)))
+ (setq kml-string (replace-all-url-hosts kml-string (website-host))
+ kml-string (replace-lang-query-params kml-string lang)
+ kml-string (replace-personalized-contract-placeholder kml-string sponsor lang))))))
+
+(defmethod handle-object ((handler kml-root-handler) (object sponsor))
+ (serve-kml-root-data object))
+
+(defmethod handle-object ((handler kml-root-handler) (object contract))
+ (serve-kml-root-data (contract-sponsor object)))
+
+(defmethod handle-object ((handler kml-root-handler) (object null))
+ (serve-kml-root-data))
+
;;; kml-format utils
(defun kml-format-points (points stream)
(mapc #'(lambda (point) (kml-format-point point stream)) points))
@@ -124,6 +170,16 @@
(defclass kml-root-dynamic-handler (object-handler)
((timestamp :accessor timestamp :initform (get-universal-time))))
+(defun write-personalized-contract-placemark-kml (contract lang)
+ (with-element "Style"
+ (attribute "id" "contractPlacemarkIcon")
+ (with-element "IconStyle"
+ (with-element "color" (text "ff0000ff"))
+ (with-element "Icon"
+ ;; (with-element "href" (text "http://maps.google.com/mapfiles/kml/pal3/icon23.png"))
+ (with-element "href" (text (format nil "http://~a/static/Orang_weiss.png" (website-host)))))))
+ (write-contract-placemark-kml contract lang))
+
(defun write-root-kml (handler sponsor)
(let ((*print-case* :downcase)
(contract (when sponsor (first (sponsor-contracts sponsor)))))
@@ -138,14 +194,7 @@
(with-element "name" (text "BOS"))
(with-element "open" (text "1"))
(when contract
- (with-element "Style"
- (attribute "id" "contractPlacemarkIcon")
- (with-element "IconStyle"
- (with-element "color" (text "ff0000ff"))
- (with-element "Icon"
- ;; (with-element "href" (text "http://maps.google.com/mapfiles/kml/pal3/icon23.png"))
- (with-element "href" (text (format nil "http://~a/static/Orang_weiss.png" (website-host)))))))
- (write-contract-placemark-kml contract lang))
+ (write-personalized-contract-placemark-kml contract lang))
(with-element "LookAt"
(with-element "longitude" (text "116.988156014724"))
(with-element "latitude" (text "-1.045791509671129"))
More information about the Bknr-cvs
mailing list