Changeset 3625

Show
Ignore:
Timestamp:
07/24/08 21:30:56 (4 months ago)
Author:
ksprotte
Message:

finished kml-root handler, performing necessary string replacements in given kml template

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/projects/bos/web/kml-handlers.lisp

    r3621 r3625  
    11;;; -*- coding: utf-8 -*- 
    22(in-package :bos.web) 
     3 
     4(enable-interpol-syntax) 
    35 
    46(defpersistent-class kml-root-data () 
     
    7072      (kml-string kml-root-data)))) 
    7173 
     74(defclass kml-root-handler (object-handler) 
     75  ()) 
     76 
     77(defun replace-all-url-hosts (string new-host) 
     78  "Replaces all hostnames in STRING by NEW-HOST." 
     79  (ppcre:regex-replace-all #?r"((?:https?|ftp)://)\w+(?:\.\w+)*" string #?r"\1${new-host}")) 
     80 
     81(defun replace-lang-query-params (string new-lang) 
     82  (ppcre:regex-replace-all #?r"(?i)(lang=)[a-z]{2,2}" string #?r"\1${new-lang}")) 
     83 
     84(defun replace-personalized-contract-placeholder (string sponsor lang) 
     85  (if (null sponsor) 
     86      string 
     87      (let ((contract (first (sponsor-contracts sponsor)))) 
     88        (ppcre:regex-replace #?r"<!-- +personalized +contract +placemark +-->" 
     89                             string 
     90                             (cxml:with-xml-output (cxml:make-string-sink :omit-xml-declaration-p t) 
     91                               (write-personalized-contract-placemark-kml contract lang)))))) 
     92 
     93(defun serve-kml-root-data (&optional sponsor)   
     94  (with-query-params ((lang "en")) 
     95    (let* ((kml-root-data (kml-root-data-with-language lang)) 
     96           (last-modified (store-object-last-change kml-root-data 0))) 
     97      (hunchentoot:handle-if-modified-since last-modified ) 
     98      (setf (hunchentoot:header-out :last-modified) 
     99            (hunchentoot:rfc-1123-date last-modified) 
     100            (hunchentoot:header-out :content-type) 
     101            "application/vnd.google-earth.kml+xml" 
     102            (hunchentoot:header-out :content-disposition) 
     103            (format nil "attachment; filename=kml-root-~A.kml" lang)) 
     104      (let ((kml-string (kml-string kml-root-data))) 
     105        (setq kml-string (replace-all-url-hosts kml-string (website-host)) 
     106              kml-string (replace-lang-query-params kml-string lang) 
     107              kml-string (replace-personalized-contract-placeholder kml-string sponsor lang)))))) 
     108 
     109(defmethod handle-object ((handler kml-root-handler) (object sponsor)) 
     110  (serve-kml-root-data object)) 
     111 
     112(defmethod handle-object ((handler kml-root-handler) (object contract)) 
     113  (serve-kml-root-data (contract-sponsor object))) 
     114 
     115(defmethod handle-object ((handler kml-root-handler) (object null)) 
     116  (serve-kml-root-data)) 
     117 
    72118;;; kml-format utils 
    73119(defun kml-format-points (points stream) 
     
    124170(defclass kml-root-dynamic-handler (object-handler) 
    125171  ((timestamp :accessor timestamp :initform (get-universal-time)))) 
     172 
     173(defun write-personalized-contract-placemark-kml (contract lang) 
     174  (with-element "Style" 
     175    (attribute "id" "contractPlacemarkIcon") 
     176    (with-element "IconStyle" 
     177      (with-element "color" (text "ff0000ff")) 
     178      (with-element "Icon" 
     179        ;; (with-element "href" (text "http://maps.google.com/mapfiles/kml/pal3/icon23.png")) 
     180        (with-element "href" (text (format nil "http://~a/static/Orang_weiss.png" (website-host))))))) 
     181  (write-contract-placemark-kml contract lang)) 
    126182 
    127183(defun write-root-kml (handler sponsor) 
     
    139195          (with-element "open" (text "1")) 
    140196          (when contract 
    141             (with-element "Style" 
    142               (attribute "id" "contractPlacemarkIcon") 
    143               (with-element "IconStyle" 
    144                 (with-element "color" (text "ff0000ff")) 
    145                 (with-element "Icon" 
    146                   ;; (with-element "href" (text "http://maps.google.com/mapfiles/kml/pal3/icon23.png")) 
    147                   (with-element "href" (text (format nil "http://~a/static/Orang_weiss.png" (website-host))))))) 
    148             (write-contract-placemark-kml contract lang)) 
     197            (write-personalized-contract-placemark-kml contract lang)) 
    149198          (with-element "LookAt" 
    150199            (with-element "longitude" (text "116.988156014724"))