| 1 |
(in-package :cl-user) |
|---|
| 2 |
|
|---|
| 3 |
(defun warm-kml-cache (host) |
|---|
| 4 |
(labels |
|---|
| 5 |
((find-links-in-xml (node) |
|---|
| 6 |
(when (listp node) |
|---|
| 7 |
(if (equal (cxml-xmls:node-name node) "href") |
|---|
| 8 |
(analyze-href (car (cxml-xmls:node-children node))) |
|---|
| 9 |
(mapc #'find-links-in-xml (cxml-xmls:node-children node))))) |
|---|
| 10 |
(analyze-href (url) |
|---|
| 11 |
(print url) |
|---|
| 12 |
(multiple-value-bind (content status-code headers) |
|---|
| 13 |
(drakma:http-request url) |
|---|
| 14 |
(declare (ignore status-code)) |
|---|
| 15 |
(when (find (first (cl-ppcre:split "; *" (cdr (assoc :content-type headers)))) |
|---|
| 16 |
(list "text/xml" "application/vnd.google-earth.kml+xml") |
|---|
| 17 |
:test #'string-equal) |
|---|
| 18 |
(find-links-in-xml (cxml:parse content (cxml-xmls:make-xmls-builder))))))) |
|---|
| 19 |
(let ((drakma:*text-content-types* '(("text" . "nil") |
|---|
| 20 |
("application" . "vnd.google-earth.kml+xml")))) |
|---|
| 21 |
(analyze-href (make-instance 'puri:uri |
|---|
| 22 |
:scheme :http |
|---|
| 23 |
:host host |
|---|
| 24 |
:path "/kml-root"))))) |
|---|
| 25 |
|
|---|
| 26 |
|
|---|
| 27 |
(defvar *parent-region*) |
|---|
| 28 |
(defvar *parent-link*) |
|---|
| 29 |
(defun kml-test (host &optional (path "/kml-root")) |
|---|
| 30 |
(labels |
|---|
| 31 |
((find-links-in-xml (node) |
|---|
| 32 |
(when (listp node) |
|---|
| 33 |
(if (equal (cxml-xmls:node-name node) "href") |
|---|
| 34 |
(analyze-kml (car (cxml-xmls:node-children node))) |
|---|
| 35 |
(mapc #'find-links-in-xml (cxml-xmls:node-children node))))) |
|---|
| 36 |
(find-child (name node) |
|---|
| 37 |
(when (listp node) |
|---|
| 38 |
(if (equal (cxml-xmls:node-name node) name) |
|---|
| 39 |
node |
|---|
| 40 |
(some #'(lambda (child) (find-child name child)) (cxml-xmls:node-children node))))) |
|---|
| 41 |
(lispify-region (node) |
|---|
| 42 |
(assert (equal "Region" (cxml-xmls:node-name node))) |
|---|
| 43 |
(assert (equal "LatLonAltBox" (cxml-xmls:node-name (first (cxml-xmls:node-children node))))) |
|---|
| 44 |
(assert (equal "Lod" (cxml-xmls:node-name (second (cxml-xmls:node-children node))))) |
|---|
| 45 |
(let ((*read-default-float-format* 'double-float) |
|---|
| 46 |
(lat-lon-alt-box (first (cxml-xmls:node-children node)))) |
|---|
| 47 |
(list |
|---|
| 48 |
(read-from-string (third (assoc "north" (cxml-xmls:node-children lat-lon-alt-box) :test #'equal))) |
|---|
| 49 |
(read-from-string (third (assoc "south" (cxml-xmls:node-children lat-lon-alt-box) :test #'equal))) |
|---|
| 50 |
(read-from-string (third (assoc "west" (cxml-xmls:node-children lat-lon-alt-box) :test #'equal))) |
|---|
| 51 |
(read-from-string (third (assoc "east" (cxml-xmls:node-children lat-lon-alt-box) :test #'equal)))))) |
|---|
| 52 |
(region-inside-p (parent region) |
|---|
| 53 |
(destructuring-bind (parent-north parent-south parent-west parent-east) parent |
|---|
| 54 |
(destructuring-bind (region-north region-south region-west region-east) region |
|---|
| 55 |
(and (<= region-north parent-north) ; negative degrees |
|---|
| 56 |
(>= region-south parent-south) ; negative degrees |
|---|
| 57 |
(>= region-west parent-west) |
|---|
| 58 |
(<= region-east parent-east))))) |
|---|
| 59 |
(describe-region-not-inside (parent region) |
|---|
| 60 |
(with-output-to-string (*standard-output*) |
|---|
| 61 |
(destructuring-bind (parent-north parent-south parent-west parent-east) parent |
|---|
| 62 |
(destructuring-bind (region-north region-south region-west region-east) region |
|---|
| 63 |
(when (not (<= region-north parent-north)) |
|---|
| 64 |
(format t "not (<= region-north parent-north)~%")) |
|---|
| 65 |
(when (not (>= region-south parent-south)) |
|---|
| 66 |
(format t "not (>= region-south parent-south)~%")) |
|---|
| 67 |
(when (not (>= region-west parent-west)) |
|---|
| 68 |
(format t "not (>= region-west parent-west)~%")) |
|---|
| 69 |
(when (not (<= region-east parent-east)) |
|---|
| 70 |
(format t "not (<= region-east parent-east)~%")))))) |
|---|
| 71 |
(analyze-kml (url &optional expected-region) |
|---|
| 72 |
(print url) |
|---|
| 73 |
(multiple-value-bind (content status-code) |
|---|
| 74 |
(drakma:http-request (format nil "~A?lang=de" url)) |
|---|
| 75 |
(declare (ignore status-code)) |
|---|
| 76 |
(let ((*parent-link* url)) |
|---|
| 77 |
(analyze-node (cxml:parse content (cxml-xmls:make-xmls-builder)) expected-region)))) |
|---|
| 78 |
(analyze-children (node) |
|---|
| 79 |
(mapc #'analyze-node (cxml-xmls:node-children node))) |
|---|
| 80 |
(analyze-node (node &optional expected-region) |
|---|
| 81 |
(when (listp node) |
|---|
| 82 |
(when expected-region |
|---|
| 83 |
(assert (equal expected-region (lispify-region (find-child "Region" node))))) |
|---|
| 84 |
;; (print (cxml-xmls:node-name node)) |
|---|
| 85 |
(arnesi:switch ((cxml-xmls:node-name node) :test #'equal) |
|---|
| 86 |
("NetworkLink" |
|---|
| 87 |
(let ((region (find-child "Region" node)) |
|---|
| 88 |
(link (find-child "Link" node))) |
|---|
| 89 |
(assert region) |
|---|
| 90 |
(assert link) |
|---|
| 91 |
(print (lispify-region region)) |
|---|
| 92 |
(print 'region-inside-p) |
|---|
| 93 |
(assert (region-inside-p *parent-region* (lispify-region region)) nil |
|---|
| 94 |
"region of ~s is not inside region of ~s~%~S~%~S~%REASON:~%~A" (third (find-child "href" link)) *parent-link* |
|---|
| 95 |
(lispify-region region) *parent-region* |
|---|
| 96 |
(describe-region-not-inside *parent-region* (lispify-region region))) |
|---|
| 97 |
(analyze-kml (third (find-child "href" link)) (lispify-region region)))) |
|---|
| 98 |
("kml" |
|---|
| 99 |
(print 'hu) |
|---|
| 100 |
(let ((region (find-child "Region" node))) |
|---|
| 101 |
(assert region) |
|---|
| 102 |
(let ((*parent-region* (lispify-region region))) |
|---|
| 103 |
(analyze-children node)))) |
|---|
| 104 |
(t (analyze-children node)))))) |
|---|
| 105 |
(analyze-kml (make-instance 'puri:uri |
|---|
| 106 |
:scheme :http |
|---|
| 107 |
:host host |
|---|
| 108 |
:path path)) |
|---|
| 109 |
t)) |
|---|