Function: rng-locate-schema-file-using

rng-locate-schema-file-using is a byte-compiled function defined in rng-loc.el.gz.

Signature

(rng-locate-schema-file-using FILES)

Documentation

Locate a schema using the schema locating files FILES.

FILES is a list of file-names. Return either a URI, a list (TYPE-ID) where TYPE-ID is a string, or nil.

Source Code

;; Defined in /usr/src/emacs/lisp/nxml/rng-loc.el.gz
(defun rng-locate-schema-file-using (files)
  "Locate a schema using the schema locating files FILES.
FILES is a list of file-names.
Return either a URI, a list (TYPE-ID) where TYPE-ID is a string,
or nil."
  (let (rules
	;; List of types that override normal order-based
	;; priority, most important first
	preferred-types
	;; Best result found so far; same form as return value.
	best-so-far)
    (while (and (progn
		  (while (and (not rules) files)
		    (setq rules (rng-get-parsed-schema-locating-file
				 (car files)))
		    (setq files (cdr files)))
		  rules)
		(or (not best-so-far) preferred-types))
      (let* ((rule (car rules))
	     (rule-type (car rule))
	     (rule-matcher (get rule-type 'rng-rule-matcher)))
	(setq rules (cdr rules))
	(cond (rule-matcher
	       (when (and (or (not best-so-far)
			      (memq rule-type preferred-types)))
			  (setq best-so-far
				(funcall rule-matcher (cdr rule)))
			  preferred-types)
		 (setq preferred-types
		       (nbutlast preferred-types
				 (length (memq rule-type preferred-types)))))
	      ((eq rule-type 'applyFollowingRules)
	       (when (not best-so-far)
		 (let ((prefer (cdr (assq 'ruleType (cdr rule)))))
		   (when (and prefer
			      (not (memq (setq prefer (intern prefer))
					 preferred-types)))
		     (setq preferred-types
			   (nconc preferred-types (list prefer)))))))
	      ((eq rule-type 'include)
	       (let ((uri (cdr (assq 'rules (cdr rule)))))
		 (when uri
		   (setq rules
			 (append (rng-get-parsed-schema-locating-file
				  (rng-uri-file-name uri))
				 rules))))))))
    best-so-far))