branch: externals/idlwave
commit 78c01f53037e2261bc5b4be347cfa5f323118d23
Author: JD Smith <jdsm...@rain.edgevale.home>
Commit: JD Smith <jdsm...@rain.edgevale.home>

    Update HTML help file locations and graphics keywords for IDL8.6.
    
    The HTML file locations changed again.  Graphics keywords are not
    linked in the idl_catalog.xml file, so the html file must be located
    and scanned.  Fragile, but works.
---
 idlw-help.el |  8 ++++++--
 idlw-scan.el | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 64 insertions(+), 11 deletions(-)

diff --git a/idlw-help.el b/idlw-help.el
index aceb0fecec..5ed119f2bb 100644
--- a/idlw-help.el
+++ b/idlw-help.el
@@ -1037,10 +1037,15 @@ Useful when source code is displayed as help.  See the 
option
                                      sys-dir))))
           help-dir) ;; And explicitly specified directory
 
+         ((file-exists-p (setq help-dir 
+                               (expand-file-name 
+                                "help/online_help/Subsystems/idl/Content" 
sys-dir)))
+          help-dir) ;; IDL 8.6
+         
          ((file-exists-p (setq help-dir 
                                (expand-file-name 
                                 "help/online_help/IDL/Content" sys-dir)))
-          help-dir) ;; IDL 8.0
+          help-dir) ;; IDL 8.0-8.5
 
          ((file-exists-p (setq help-dir 
                                (expand-file-name "help/online_help/" sys-dir)))
@@ -1108,4 +1113,3 @@ the idlhelp script.")
 
 
 (defvar idlwave-system-routines)
-
diff --git a/idlw-scan.el b/idlw-scan.el
index c9d627bf56..0baa1ddbf5 100644
--- a/idlw-scan.el
+++ b/idlw-scan.el
@@ -314,6 +314,7 @@ information updated immediately, leave NO-CONCATENATE nil."
          ;; Ask the shell about the routines it knows of.
          (message "Querying the shell")
          (idlwave-shell-update-routine-info nil t)))))))
+
 (defun idlwave-concatenate-rinfo-lists (&optional quiet run-hook)
   "Put the different sources for routine information together."
   ;; The sequence here is important because earlier definitions shadow 
@@ -399,7 +400,8 @@ Cache to disk for quick recovery."
   (let* ((catalog-file (idlwave-xml-system-routine-info-file))
         (elem-cnt 0)
         props rinfo msg-cnt elem type nelem class-result alias 
-        routines routine-aliases statement-aliases sysvar-aliases)
+        routines routine-aliases graphics-keywords
+        statement-aliases sysvar-aliases)
     (if (not (file-exists-p catalog-file))
        (error "No such XML routine info file: %s" catalog-file)
       (if (not (file-readable-p catalog-file))
@@ -642,6 +644,7 @@ Cache to disk for quick recovery."
         (params (cddr xml-entry))
         (syntax-vec (make-vector 3 nil)) ; procedure, function, exec command
         (case-fold-search t)
+        graphics-kws
         syntax kwd klink pref-list kwds pelem ptype props result type)
     (if class ;; strip out class name from class method name string
        (if (string-match (concat class "::") name)
@@ -655,8 +658,18 @@ Cache to disk for quick recovery."
         ((eq ptype 'SYNTAX)
          (setq syntax (cdr (assq 'name props))
                type (cdr (assq 'type props)))
-         (unless (and (string-match "Keyword" syntax)
-                      (string-match "^pro" type))
+         (if (and (string-match "Graphics *Keywords" syntax)
+                  (string-match "^pro" type))
+             ;; Unlinked Graphics Keywords masquerading as Syntax :(.
+             (let ((pos 0))
+               (while
+                   (string-match "\\[, /?\\({X *| *Y *| 
*Z}\\)?\\([A-Z0-9]+\\)[]=]" syntax pos)
+                 (if (match-string 1 syntax)
+                     (loop for x in '("X" "Y" "Z") do
+                           (push (concat x (match-string 2 syntax)) 
graphics-kws))
+                   (push (match-string 2 syntax) graphics-kws))
+                 (setq pos (match-end 0)))
+               (message "Parsing Graphics Keywords for %s: %d found" name 
(length graphics-kws)))
            (if (string-match "-&gt;" syntax)
                (setq syntax (replace-match "->" t nil syntax)))
            (push syntax
@@ -697,12 +710,14 @@ Cache to disk for quick recovery."
     ;;         (insert (format "Missing SYNTAX entry for %s::%s\n" class name))
     ;;       (insert (message "Missing SYNTAX entry for %s\n" name)))))
 
-    ;; Executive commands are treated specially
-    (if (aref syntax-vec 2)
+    ;; Build the routine info list
+    (if (aref syntax-vec 2)     ; executive commands are treated specially
        (cons (substring name 1) link)
       (if extra-kws (setq kwds (nconc kwds extra-kws)))
+      (if graphics-kws
+         (setq kwds (nconc kwds (idlwave-graphics-keywords graphics-kws))))
       (setq kwds (idlwave-rinfo-group-keywords kwds link))
-      (loop for idx from 0 to 1 do
+      (loop for idx from 0 to 1 do     ;add a procedure and function if needed
            (if (aref syntax-vec idx)
                (push (append (list name (if (eq idx 0) 'pro 'fun) 
                                    class '(system)
@@ -711,6 +726,41 @@ Cache to disk for quick recovery."
                              kwds) result)))
       result)))
 
+(defvar idlwave-graphics-keywords-links-alist nil)
+(defun idlwave-graphics-keywords (kwds)
+  ;; Given a list of keywords, find links and return a list of (kwd link) lists
+  ;; from the special (and poorly linked) Graphics Keywords help file
+  (unless idlwave-graphics-keywords-links-alist
+    ;; Cache a list of links
+    (let ((gkwfile (idlwave-recursive-find-file (idlwave-html-help-location)
+                                            "graphkeyw.htm")))
+      (if (file-exists-p gkwfile)
+         (save-match-data
+           (save-excursion
+             (with-temp-buffer
+               (insert-file-contents gkwfile)
+               (goto-char 1)
+               (while (search-forward-regexp
+                       "a href=\"\\(#graphkeyw.[^\"]+\\)\"[^>]*>\\([^ <]+\\)<"
+                       nil t)
+                 (let ((anchor (match-string 1))
+                       (kwd (match-string 2)) kwds)
+                   (if (string-match "^\\[XYZ\\]" kwd)
+                       (progn
+                         (setq kwd (substring kwd (match-end 0)))
+                         (setq kwds (mapcar (lambda (x) (concat x kwd)) '("X" 
"Y" "Z"))))
+                     (setq kwds (list kwd)))
+                   (loop for kwd in kwds do
+                         (unless (assoc kwd 
idlwave-graphics-keywords-links-alist)
+                           (push (cons kwd (concat gkwfile anchor))
+                                 
idlwave-graphics-keywords-links-alist)))))))))))
+  ;; find the keywords and links
+  (mapcar
+   (lambda (kwd)
+     (let ((rec (assoc kwd idlwave-graphics-keywords-links-alist)))
+       (list kwd (if rec (cdr rec)))))
+   kwds))
+
 (defun idlwave-rinfo-group-keywords (kwds master-link)
   ;; Group keywords by link file, as a list with elements (linkfile (
   ;; ("KWD1" . link1) ("KWD2" . link2)) master-link specifies the link
@@ -818,9 +868,8 @@ force directory search."
 
 (defun idlwave-convert-xml-add-link-path-information ()
   ;; Add path information missing from idl_catalog.xml since IDL 8
-  (let* ((help-path  (expand-file-name "help/online_help/IDL/"
-                                      (idlwave-sys-dir)))
-        (content-path (expand-file-name "Content" help-path))
+  (let* ((content-path (idlwave-html-help-location))
+        (help-path  (file-name-directory content-path))
         (alias-file (expand-file-name "Data/Alias.xml" help-path)))
     (message "Linking help file info...")
     (if (file-exists-p alias-file)

Reply via email to