1 (in-package #:oh-ducks.traversal) 2 3 (defmethod unify::occurs-in-p ((var symbol) (pat dom:element) env) 4 (declare (ignore var pat env)) 5 nil) 6 7 (defmethod unify:unify ((template oh-ducks::css-selector-template) 8 (document dom:document) 9 &optional (env (unify:make-empty-environment)) 10 &key) 11 (unify:unify template (dom:document-element document) env)) 12 13 ;;; general accessors 14 15 (defmethod element-children ((element dom:element)) 16 (remove-if-not #'dom:element-p (coerce (dom:child-nodes element) 'list))) 17 18 (defmethod element-parent ((element dom:element)) 19 (let ((parent (dom:parent-node element))) 20 (unless (typep parent 'dom:document) 21 parent))) 22 23 (defmethod element-attribute ((attribute symbol) (element dom:element)) 24 (element-attribute (string-downcase (symbol-name attribute)) element)) 25 (defmethod element-attribute ((attribute string) (element dom:element)) 26 (when-let* ((attribute-node (dom:get-attribute-node element attribute))) 27 (dom:value attribute-node))) 28 29 (defmethod element-type ((element dom:element)) 30 (dom:tag-name element)) 31 32 (defmethod element-content ((element dom:element)) 33 (mapcar (lambda (node) 34 (typecase node 35 (dom:element node) 36 (dom:text (dom:data node)) 37 (t (error "Unsure what to do.")))) 38 (coerce (dom:child-nodes element) 'list))) 39 40 ;;; special accessors in case something special needs to happen 41 (defmethod element-id ((element dom:element)) 42 (element-attribute "id" element)) 43 44 (defmethod element-classes ((element dom:element)) 45 (split-sequence:split-sequence #\Space (element-attribute "class" element) :remove-empty-subseqs t))