summaryrefslogtreecommitdiffstats
path: root/emacs.d/nxhtml/nxhtml/html-site.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs.d/nxhtml/nxhtml/html-site.el')
-rw-r--r--emacs.d/nxhtml/nxhtml/html-site.el801
1 files changed, 801 insertions, 0 deletions
diff --git a/emacs.d/nxhtml/nxhtml/html-site.el b/emacs.d/nxhtml/nxhtml/html-site.el
new file mode 100644
index 0000000..64238fc
--- /dev/null
+++ b/emacs.d/nxhtml/nxhtml/html-site.el
@@ -0,0 +1,801 @@
+;;; html-site.el --- Keeping (X)HTML files together
+;;
+;; Author: Lennart Borgman (lennart O borgman A gmail O com)
+;; Created: Wed Mar 01 17:25:52 2006
+(defconst html-site:version "0.3");; Version:
+;; Last-Updated: 2008-03-22T03:32:06+0100 Sat
+;; Keywords:
+;; Compatibility:
+;;
+;; Features that might be required by this library:
+;;
+;; `cl', `html-site', `html-upl', `ietf-drums', `mail-parse',
+;; `mail-prsvr', `mailcap', `mm-util', `qp', `rfc2045', `rfc2047',
+;; `rfc2231', `time-date', `timer', `timezone', `tls', `url',
+;; `url-auth', `url-c', `url-cookie', `url-expand', `url-gw',
+;; `url-history', `url-http', `url-methods', `url-parse',
+;; `url-privacy', `url-proxy', `url-util', `url-vars'.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;;
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Change log:
+;;
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program; see the file COPYING. If not, write to the
+;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+;; Boston, MA 02111-1307, USA.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Code:
+
+;; TODO: maybe use browse-url-filename-alist
+
+(eval-when-compile (require 'cl))
+(eval-when-compile (require 'compile))
+(eval-when-compile (require 'dired))
+(eval-when-compile (require 'ffip nil t))
+(eval-when-compile (require 'grep))
+(eval-when-compile (require 'ourcomments-util nil t))
+(eval-when-compile (require 'url-parse))
+;;(defvar html-site-list) ;; Silence compiler
+;;(defvar html-site-current) ;; Silence compiler
+
+;;;###autoload
+(defgroup html-site nil
+ "Customization group for html-site."
+ :group 'nxhtml)
+
+;; Fix-me: Rewrite using directory variables
+(defcustom html-site-list nil
+ "Known site directories and corresponding attributes.
+Each element in the list is a list containing:
+
+* Name for the site.
+* Site root directory.
+* Page list file - Pages for table of contents (TOC). Usually
+ initially built from the site directory by
+ `html-toc-create-pages-file'.
+* Frames file.
+* TOC file for the frames file.
+* Output directory - where to put the merged TOC and site
+ pages.
+* Output template file - html template for merging. See `html-wtoc-dir'
+ for examples.
+* Function for additional tasks - for example copying images, style
+ sheets, scripts etc.
+--
+"
+ :type '(repeat
+ (list
+ (string :tag "*** Site name ***")
+ (directory :tag "Site root directory")
+ (file :tag "Page list file")
+ (file :tag "Frames file")
+ (file :tag "Contents file for frames")
+ (directory :tag "Output directory for pages with TOC" :help-echo "Where to put the merged files")
+ (file :tag "Template file for pages with TOC" :help-echo "HTML template for merging")
+ (choice :tag "Extra function for pages with TOC"
+ (const nil :tag "Default function")
+ (function)
+ )
+ (string :tag "Ftp host address")
+ (string :tag "Ftp user")
+ (string :tag "Ftp password")
+ (string :tag "Ftp directory root")
+ (string :tag "Ftp directory root for pages with TOC")
+ (string :tag "Web host address")
+ (string :tag "Web directory root")
+ (string :tag "Web directory root for pages with TOC")
+ ))
+ :set (lambda (symbol value)
+ ;;(message "sym=%s, value=%s" symbol value)
+ (set-default symbol value)
+ (when (featurep 'html-site)
+ (let ((ok t))
+ (dolist (e value)
+ (let (
+ (name (elt e 0))
+ (site-dir (elt e 1))
+ (pag-file (elt e 2))
+ (frm-file (elt e 3))
+ (toc-file (elt e 4))
+ (out-dir (elt e 5))
+ (tpl-file (elt e 6))
+ (fun (elt e 7))
+ (ftp-host (elt e 8))
+ (ftp-user (elt e 9))
+ (ftp-pw (elt e 10))
+ (ftp-dir (elt e 11))
+ (ftp-wtoc-dir (elt e 12))
+ (web-host (elt e 13))
+ (web-dir (elt e 14))
+ (web-wtoc-dir (elt e 15))
+ )
+ (unless (not (string= "" name))
+ (html-site-lwarn '(html-site-list) :error "Empty site name"))
+ (if (not (file-directory-p site-dir))
+ (progn
+ (html-site-lwarn '(html-site-list) :error "Site directory for %s not found: %s" name site-dir)
+ (setq ok nil))
+ (unless (file-exists-p pag-file)
+ (html-site-lwarn '(html-site-list) :warning "Pages list file for %s does not exist: %s" name pag-file))
+ (unless (file-exists-p tpl-file)
+ (html-site-lwarn '(html-site-list) :warning "Template file for %s does not exist: %s" name tpl-file)))
+ (when (< 0 (length out-dir))
+ (html-site-chk-wtocdir out-dir site-dir))
+ (when fun
+ (unless (functionp fun)
+ (html-site-lwarn '(html-site-list) :error "Site %s - Unknown function: %s" name fun)
+ (setq ok nil)
+ ))
+ ))
+ )))
+ :group 'html-site)
+
+(defcustom html-site-current ""
+ "Current site name.
+Use the entry with this name in `html-site-list'."
+ :set (lambda (symbol value)
+ ;;(message "sym=%s, value=%s" symbol value)
+ (set-default symbol value)
+ (when (featurep 'html-site)
+ (or (when (= 0 (length value))
+ (message "html-site-current (information): No current site set"))
+ (let ((site-names))
+ (dolist (m html-site-list)
+ (setq site-names (cons (elt m 0) site-names)))
+ (or
+ (unless (member value site-names)
+ (html-site-lwarn '(html-site-current) :error "Can't find site: %s" value))
+ (let ((site-dir (html-site-site-dir value)))
+ (unless (file-directory-p site-dir)
+ (html-site-lwarn '(html-site-current) :error "Can't find site directory: %s" value))))))))
+ :type 'string
+ :set-after '(html-site-list)
+ :group 'html-site)
+
+(defun html-site-looks-like-local-url (file)
+ "Return t if this looks like a local file something url."
+ (require 'url-parse)
+ (let ((url-type (url-type (url-generic-parse-url file))))
+ (not
+ (and url-type
+ ;; Test if it really is an url, the is 1 for w32 drive
+ ;; letters
+ (or (not (memq system-type '(ms-dos windows-nt)))
+ (< 1 (length url-type)))))))
+
+(when nil
+ (assert (not (html-site-looks-like-local-url "http://www.some.where/")))
+ (assert (html-site-looks-like-local-url "/unix/file"))
+ (when (memq system-type '(windows-nt))
+ (assert (html-site-looks-like-local-url "c:/w32/file"))))
+
+(defun html-site-dir-contains (dir file)
+ ;;(when (= ?~ (string-to-char file)) (setq file (expand-file-name file)))
+ ;;
+ ;; It is not possible to unconditionally expand the file name here
+ ;; since url file names can be involved.
+ ;; (url-type (url-generic-parse-url "c:/some/file.txt"))
+ (let* ((file-is-local (html-site-looks-like-local-url file))
+ (dir-is-local (html-site-looks-like-local-url dir))
+ (file-is-dir (and file-is-local
+ (file-directory-p file)))
+ (true-f (if file-is-local
+ (if file-is-dir
+ (file-name-as-directory
+ (file-truename
+ (expand-file-name file)))
+ (file-truename
+ (expand-file-name file)))
+ file))
+ ;; (file-name-as-directory (expand-file-name "~/"))
+ (true-d (if dir-is-local
+ (file-name-as-directory
+ (file-truename
+ (expand-file-name dir)))
+ (if (eq ?/ (car (reverse (append dir nil))))
+ dir
+ (concat dir "/")))))
+ (assert (eq file-is-local dir-is-local))
+ (if (< (length true-d) (length true-f))
+ (string= true-d
+ (substring true-f 0 (length true-d)))
+ (when file-is-dir
+ (string= true-d true-f)))))
+
+(defun html-site-lwarn (warn-type level format-string &rest args)
+ (apply 'message (concat "%s:" format-string) warn-type args)
+ (apply 'lwarn warn-type level args))
+
+(defun html-site-chk-wtocdir (out-dir site-dir)
+ (or
+ (unless (file-name-absolute-p out-dir)
+ (html-site-lwarn '(html-site) :error "Output directory is not absolute: %s" out-dir))
+ (if (file-exists-p out-dir)
+ (unless (file-directory-p out-dir)
+ (html-site-lwarn '(html-site) :error "File %s for output exists but is not a directory" out-dir))
+ (unless (string= out-dir (file-name-as-directory out-dir))
+ (html-site-lwarn '(html-site) :error "File name could not be a directory: %s" out-dir)))
+ (when (html-site-dir-contains out-dir site-dir)
+ (html-site-lwarn '(html-site) :error "Ouput directory for pages with TOC must not contain site dir."))
+ (when (html-site-dir-contains site-dir out-dir)
+ (html-site-lwarn '(html-site) :error "Site dir must not contain ouput directory for pages with TOC."))))
+
+
+;;;###autoload
+(defun html-site-buffer-or-dired-file-name ()
+ "Return buffer file name or file pointed to in dired."
+ (if (derived-mode-p 'dired-mode)
+ (dired-get-file-for-visit)
+ buffer-file-name))
+
+;;;###autoload
+(defun html-site-set-site (name)
+ (interactive
+ (let ((site-names)
+ (must-contain (when (boundp 'must-contain) must-contain))
+ (file (html-site-buffer-or-dired-file-name))
+ (use-dialog-box nil))
+ (unless (< 0 (length html-site-list))
+ (error "No sites defined yet"))
+ (when (and file
+ ;;(string-match "ml" (symbol-name major-mode))
+ )
+ (when (or must-contain
+ (y-or-n-p "Should site contain current file? "))
+ (setq must-contain file)))
+ (dolist (m html-site-list)
+ (let* ((name (elt m 0))
+ (dir (html-site-site-dir name)))
+ (when (or (not must-contain)
+ (html-site-dir-contains dir file))
+ (setq site-names (cons name site-names)))))
+ (unless site-names
+ (when must-contain
+ (error "No sites contains %s" must-contain)))
+ (list (when site-names
+ (let ((prompt (if (< 0 (length html-site-current))
+ (concat "Current site is \""
+ html-site-current
+ "\". "
+ (if must-contain
+ "New site containing file: "
+ "New site's name: "))
+ (if must-contain
+ "Site containing file: "
+ "Site name: "))))
+ (completing-read prompt site-names nil t nil 'site-names))))))
+ (unless (or (string= name "")
+ (string= name html-site-current))
+ (setq html-site-current name)
+ (customize-save-variable 'html-site-current html-site-current)))
+
+;;;###autoload
+(defun html-site-dired-current ()
+ "Open `dired' in current site top directory."
+ (interactive)
+ (dired (html-site-current-site-dir)))
+
+;;;###autoload
+(defun html-site-find-file ()
+ "Find file in current site."
+ (interactive)
+ ;;(require 'ffip)
+ (ffip-set-current-project html-site-current
+ (html-site-current-site-dir)
+ 'nxhtml)
+ (call-interactively 'ffip-find-file-in-project))
+
+;;;###autoload
+(defun html-site-rgrep (regexp files)
+ "Search current site's files with `rgrep'.
+See `rgrep' for the arguments REGEXP and FILES."
+ (interactive
+ (progn
+ (grep-compute-defaults)
+ (let* ((regexp (grep-read-regexp))
+ (files (grep-read-files regexp)))
+ (list regexp files))))
+ ;; fix-me: ask for site
+ ;;(when (called-interactively-p) )
+ (rgrep regexp files (html-site-current-site-dir)))
+
+;;;###autoload
+(defun html-site-query-replace (from to file-regexp delimited)
+ "Query replace in current site's files."
+ (interactive
+ (let ((parameters (dir-replace-read-parameters t t)))
+ ;; Delete element 3
+ ;;(length parameters)
+ (setcdr (nthcdr 2 parameters) (nthcdr 4 parameters))
+ ;;(length parameters)
+ parameters))
+ ;; fix-me: ask for site
+ ;;(when (called-interactively-p) )
+ (rdir-query-replace from to file-regexp
+ ;;root
+ (html-site-current-site-dir)
+ delimited)
+ )
+
+(defun html-site-ensure-site-defined (site-name)
+ (unless html-site-list
+ (error "No sites defined. Please customize `html-site-list'."))
+ (unless (file-directory-p (html-site-site-dir site-name))
+ (error "Local file web site directory does not exists: %s"
+ (html-site-site-dir site-name))))
+(defun html-site-current-ensure-site-defined ()
+ (unless (and (< 0 (length html-site-current))
+ (assoc html-site-current html-site-list))
+ (error "No current site set"))
+ (html-site-ensure-site-defined html-site-current))
+
+(defun html-site-remote-contains (site-name url with-toc)
+ (html-site-dir-contains (html-site-remote-root site-name with-toc) url))
+(defun html-site-current-remote-contains (url with-toc)
+ (html-site-remote-contains html-site-current url with-toc))
+
+(defun html-site-ensure-file-in-site (site-name file-name &optional no-error)
+ (html-site-ensure-site-defined site-name)
+ (if (html-site-contains site-name file-name)
+ t
+ (if no-error
+ nil
+ (error "This file is not in site %s" site-name))))
+(defun html-site-current-ensure-file-in-site (file-name)
+ ;;(html-site-ensure-file-in-site html-site-current file-name))
+ (let ((in-site (html-site-ensure-file-in-site html-site-current
+ file-name t)))
+ (while (not in-site)
+ (if (not (y-or-n-p
+ (format "This file is not in site %s, change site? "
+ html-site-current)))
+ (error "This file is not in site %s" html-site-current)
+ (let ((must-contain t))
+ (call-interactively 'html-site-set-site))
+ (setq in-site (html-site-ensure-file-in-site html-site-current
+ file-name t))))))
+
+(defun html-site-ensure-buffer-in-site (site-name)
+ (unless buffer-file-name
+ (error "This buffer is not visiting a file"))
+ (html-site-ensure-file-in-site site-name buffer-file-name))
+(defun html-site-current-ensure-buffer-in-site ()
+ (html-site-ensure-buffer-in-site html-site-current))
+
+
+(defun html-site-site-dir (site-name)
+ (file-name-as-directory
+ (nth 1 (assoc site-name html-site-list))))
+(defun html-site-current-site-dir () (html-site-site-dir html-site-current))
+
+(defun html-site-contains (site-name file)
+ (html-site-dir-contains (html-site-site-dir site-name) file))
+(defun html-site-current-contains (file)
+ (html-site-contains html-site-current file))
+
+(defun html-site-page-list (site-name)
+ (let ((page-list (nth 2 (assoc site-name html-site-list))))
+ (when (< 0 (length page-list))
+ page-list)))
+
+(defun html-site-current-page-list () (html-site-page-list html-site-current))
+
+(defun html-site-frames-file (site-name)
+ (nth 3 (assoc site-name html-site-list)))
+(defun html-site-current-frames-file () (html-site-frames-file html-site-current))
+
+(defun html-site-toc-file (site-name)
+ (nth 4 (assoc site-name html-site-list)))
+(defun html-site-current-toc-file () (html-site-toc-file html-site-current))
+
+(defun html-site-merge-dir (site-name)
+ (let ((dir (nth 5 (assoc site-name html-site-list))))
+ (when (< 0 (length dir))
+ dir)))
+(defun html-site-current-merge-dir () (html-site-merge-dir html-site-current))
+
+(defun html-site-merge-template (site-name)
+ (nth 6 (assoc site-name html-site-list)))
+(defun html-site-current-merge-template () (html-site-merge-template html-site-current))
+
+(defun html-site-extra-fun (site-name)
+ (nth 7 (assoc site-name html-site-list)))
+(defun html-site-current-extra-fun () (html-site-extra-fun html-site-current))
+
+(defun html-site-ftp-host (site-name)
+ (nth 8 (assoc site-name html-site-list)))
+(defun html-site-current-ftp-host () (html-site-ftp-host html-site-current))
+
+(defun html-site-ftp-user (site-name)
+ (nth 9 (assoc site-name html-site-list)))
+(defun html-site-current-ftp-user () (html-site-ftp-user html-site-current))
+
+(defun html-site-ftp-password (site-name)
+ (nth 10 (assoc site-name html-site-list)))
+(defun html-site-current-ftp-password () (html-site-ftp-password html-site-current))
+
+(defun html-site-ftp-dir (site-name)
+ (nth 11 (assoc site-name html-site-list)))
+(defun html-site-current-ftp-dir () (html-site-ftp-dir html-site-current))
+
+(defun html-site-ftp-wtoc-dir (site-name)
+ (nth 12 (assoc site-name html-site-list)))
+(defun html-site-current-ftp-wtoc-dir () (html-site-ftp-wtoc-dir html-site-current))
+
+(defun html-site-web-host (site-name)
+ (nth 13 (assoc site-name html-site-list)))
+(defun html-site-current-web-host () (html-site-web-host html-site-current))
+
+(defun html-site-web-dir (site-name)
+ (nth 14 (assoc site-name html-site-list)))
+(defun html-site-current-web-dir () (html-site-web-dir html-site-current))
+
+(defun html-site-web-wtoc-dir (site-name)
+ (nth 15 (assoc site-name html-site-list)))
+(defun html-site-current-web-wtoc-dir () (html-site-web-wtoc-dir html-site-current))
+
+(defun html-site-web-full (site-name with-toc)
+ (let ((host (html-site-web-host site-name)))
+ (unless (and host
+ (< 0 (length host)))
+ (error "Web site host not known for %s" site-name))
+ (save-match-data
+ (unless (string-match "^https?://" host)
+ (setq host (concat "http://" host))))
+ (concat host
+ (if with-toc
+ (html-site-web-wtoc-dir site-name)
+ (html-site-web-dir site-name)))))
+(defun html-site-current-web-full (with-toc)
+ (html-site-web-full html-site-current with-toc))
+
+(defvar html-site-ftp-temporary-passwords nil)
+(defun html-site-get-ftp-pw ()
+ (let ((pw (html-site-current-ftp-password)))
+ (unless (< 0 (length pw))
+ (let* ((user-site (concat (html-site-current-ftp-user)
+ "@"
+ (html-site-current-ftp-host)))
+ (site-pw (assoc user-site html-site-ftp-temporary-passwords)))
+ (if site-pw
+ (setq pw (cdr site-pw))
+ (setq pw (read-string
+ (concat "Ftp password for "
+ (html-site-current-ftp-user)
+ " at "
+ (html-site-current-ftp-host)
+ " : ")))
+ (setq html-site-ftp-temporary-passwords
+ (cons
+ (cons user-site pw)
+ html-site-ftp-temporary-passwords)))))
+ pw))
+
+
+
+
+
+(defun html-site-path-in-mirror (site-root path-in-site mirror-root)
+ (assert (html-site-dir-contains site-root path-in-site) t)
+ (let ((rel-path (file-relative-name path-in-site site-root)))
+ (if (string= rel-path ".")
+ (directory-file-name mirror-root)
+ (concat (file-name-as-directory mirror-root) rel-path))))
+
+;; Some checks to see if html-site-path-in-mirror works:
+(when nil
+ (require 'cl)
+ ;; Try to make a non-existent directory name to work around Emacs
+ ;; bug (which was fixed today in CVS):
+ (let ((local-file "/temp814354/in/hej.html")
+ (local-dir "/temp814354"))
+ (when (memq system-type '(ms-dos windows-nt))
+ (setq local-file (concat "c:" local-file))
+ (setq local-dir (concat "c:" local-dir )))
+ (assert (string=
+ "http://some.site/tempmirror/in/hej.html"
+ (html-site-path-in-mirror local-dir
+ local-file
+ "http://some.site/tempmirror"))
+ t)
+ (assert (string=
+ local-file
+ (html-site-path-in-mirror "http://some.site/tempmirror"
+ "http://some.site/tempmirror/in/hej.html"
+ local-dir))
+ t)
+ (assert (string=
+ "in/hej.html"
+ (file-relative-name "http:/temp/in/hej.html" "http:/temp"))
+ t)
+ ))
+
+
+(defun html-site-local-to-web (site-name local-file with-toc)
+ (html-site-ensure-file-in-site site-name local-file)
+ (html-site-path-in-mirror (html-site-site-dir site-name)
+ local-file
+ (html-site-web-full site-name with-toc)))
+(defun html-site-current-local-to-web (local-file with-toc)
+ (html-site-local-to-web html-site-current local-file with-toc))
+
+(defun html-site-remote-root (site-name with-toc)
+ (concat "/ftp:"
+ (html-site-ftp-user site-name)
+ "@" (html-site-ftp-host site-name)
+ ":"
+ (if with-toc
+ (html-site-ftp-wtoc-dir site-name)
+ (html-site-ftp-dir site-name))))
+(defun html-site-current-remote-root (with-toc)
+ (html-site-remote-root html-site-current with-toc))
+
+(defun html-site-local-to-remote (site-name local-file with-toc)
+ (html-site-ensure-file-in-site site-name local-file)
+ (html-site-path-in-mirror (html-site-site-dir site-name)
+ local-file
+ (html-site-remote-root site-name with-toc)))
+(defun html-site-current-local-to-remote (local-file with-toc)
+ (html-site-local-to-remote html-site-current local-file with-toc))
+
+(defun html-site-remote-to-local (site-name remote-file with-toc)
+ ;;(html-site-ensure-file-in-site remote-file)
+ ;; Fix-me above
+ (html-site-path-in-mirror (html-site-remote-root site-name with-toc)
+ remote-file
+ (html-site-site-dir site-name)))
+(defun html-site-current-remote-to-local (remote-file with-toc)
+ (html-site-remote-to-local html-site-current remote-file with-toc))
+
+
+(defvar html-site-files-re "\.x?html?$")
+
+(defun html-site-edit-pages-file ()
+ "Edit the list of pages to be used for table of contents."
+ (interactive)
+ (html-site-current-ensure-site-defined)
+ (find-file (html-site-current-page-list))
+ )
+
+(defun html-site-get-sub-files (dir file-patt)
+ (let ((sub-files)
+ (sub-dirs)
+ (dir-files (directory-files dir t "^[^.]")))
+ (dolist (f dir-files)
+ (if (file-directory-p f)
+ (add-to-list 'sub-dirs f)
+ (when (string-match file-patt f)
+ (add-to-list 'sub-files f))))
+ (dolist (sub-dir sub-dirs)
+ (setq sub-files (append sub-files (html-site-get-sub-files sub-dir file-patt)))
+ )
+ sub-files))
+
+(defun html-site-file-is-local (filename)
+ "Return t if FILENAME is a local file name.
+No check is done that the file exists."
+ ;;(find-file-name-handler "/ftp:c:/eclean/" 'file-exists-p)
+ (null (find-file-name-handler filename 'file-exists-p)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; Put subprocess here at the moment ...
+
+(defconst noshell-procbuf-name "*Noshell process buffer*")
+
+(defvar noshell-proc-name nil)
+(defun noshell-procbuf-setup (procbuf-name)
+ (unless procbuf-name
+ (setq procbuf-name noshell-procbuf-name))
+ (with-current-buffer (get-buffer-create procbuf-name)
+ (unless (get-buffer-window (current-buffer))
+ (when (one-window-p) (split-window))
+ (let ((cb (current-buffer)))
+ (set-window-buffer (other-window 1) cb)))
+ ;;(setq buffer-read-only t)
+ (noshell-process-mode)
+ (compilation-minor-mode 1)
+;; (let ((inhibit-read-only t)
+;; (output-buffer (current-buffer)))
+;; (goto-char (point-max))
+;; (setq noshell-proc-name name)
+;; (let ((s (concat
+;; "\n\n\n>>>>>>>>>>>>>>>>>> Starting "
+;; noshell-proc-name "\n")))
+;; (put-text-property 0 (length s)
+;; 'face (list 'bold '(:foreground "green"))
+;; s)
+;; (insert s)))
+ (sit-for 0.01) ;; Display update
+ (current-buffer)))
+
+(defun noshell-procbuf-teardown (proc)
+ (with-current-buffer (process-buffer proc)
+ (goto-char (point-max))
+ (let ((inhibit-read-only t)
+ (s (concat
+ "<<<<<<<<<<<<<<<<<<< Finished OK: "
+ noshell-proc-name "\n")))
+ (put-text-property 0 (length s)
+ 'face (list 'bold '(:foreground "green"))
+ s)
+ (insert s))))
+
+(defun noshell-procbuf-run (buffer prog &rest args)
+ (with-current-buffer buffer
+ (let ((inhibit-read-only t)
+ (proc nil)
+ )
+ (unwind-protect
+ (progn
+ (setq proc (apply 'start-process "myproc" (current-buffer) prog args))
+ )
+ )
+ (save-excursion
+ (unless proc
+ (let ((s "\n\n<<<<<<<<<<<<< There was a process starting error!"))
+ (put-text-property 0 (length s)
+ 'face (list 'bold '(:foreground "red"))
+ s)
+ (insert s))
+ (error "Subprocess terminated with error status")))
+ (set-process-sentinel proc 'noshell-sentinel)
+ proc)
+ )
+ )
+(defun noshell-sentinel (process event)
+ (with-current-buffer (process-buffer process)
+ (let ((inhibit-read-only t))
+ ;;(insert (format "Process: %s recieved %s\n" process event))
+ (cond ((string-match "abnormally" event)
+ (let ((s (concat "\n<<<<<< Error: "
+ (substring event 0 -1)
+ " <<<<<<<<<")))
+ (put-text-property 0 (length s)
+ 'face (list 'bold '(:foreground "red"))
+ s)
+ (insert s)))
+ ((string-match "finished" event)
+ (noshell-procbuf-teardown process))
+ (t
+ (insert event))))))
+
+(defun noshell-procbuf-syncrun (prog &rest args)
+ (with-current-buffer (get-buffer noshell-procbuf-name)
+ (let ((inhibit-read-only t)
+ (sts nil))
+ (unwind-protect
+ (progn
+ ;;(setq sts (apply 'call-process prog nil (current-buffer) t args))
+ (setq sts (apply 'call-process prog nil (list (current-buffer) t) t args))
+ )
+ )
+ (save-excursion
+ (unless (= 0 sts)
+ (let ((s (format "\n\n<<<<<<<<<<<<< There was a process error: %s" sts)))
+ (put-text-property 0 (length s)
+ 'face (list 'bold '(:foreground "red"))
+ s)
+ (insert s))
+ (error "Subprocess terminated with error status")))
+ )
+ )
+ )
+
+(defvar noshell-process-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map [(control ?c)(control ?k)] 'noshell-kill-subprocess)
+ (define-key map [(control ?g)] 'noshell-quit)
+ map))
+
+(define-derived-mode noshell-process-mode fundamental-mode "Subprocess"
+ nil
+ (setq buffer-read-only t)
+ (buffer-disable-undo (current-buffer)))
+
+(defun noshell-quit ()
+ (interactive)
+ (noshell-kill-subprocess)
+ (keyboard-quit))
+
+(defun noshell-kill-subprocess ()
+ (interactive)
+ (when (eq major-mode 'noshell-process-mode)
+ (if (get-buffer-process (current-buffer))
+ (interrupt-process (get-buffer-process (current-buffer)))
+ (error "The subprocess is not running"))))
+
+
+
+;; Provide here to be able to load the files in any order
+(provide 'html-site)
+
+(eval-when-compile (require 'html-upl nil t))
+
+(defvar html-site-mode-menu-map
+ (let ((map (make-sparse-keymap "html-site-mode-menu-map")))
+
+ (when (featurep 'html-upl)
+ (let ((upl-map (make-sparse-keymap)))
+ (define-key map [html-site-upl-map]
+ (list 'menu-item "File Transfer" upl-map))
+ ;;(define-key upl-map [html-site-upl-edit-remote-wtoc]
+ ;; (list 'menu-item "Edit Remote File With TOC" 'html-upl-edit-remote-file-with-toc))
+ (define-key upl-map [html-site-upl-edit-remote]
+ (list 'menu-item "Edit Remote File" 'html-upl-edit-remote-file))
+ (define-key upl-map [html-site-upl-ediff-buffer]
+ (list 'menu-item "Ediff Remote/Local Files" 'html-upl-ediff-file))
+ (define-key upl-map [html-site-upl-sep] (list 'menu-item "--"))
+ (define-key upl-map [html-site-upl-upload-site-with-toc]
+ (list 'menu-item "Upload Site with TOC" 'html-upl-upload-site-with-toc))
+ (define-key upl-map [html-site-upl-upload-site]
+ (list 'menu-item "Upload Site" 'html-upl-upload-site))
+ (define-key upl-map [html-site-upl-upload-file]
+ (list 'menu-item "Upload Single File" 'html-upl-upload-file))
+ ))
+
+ (let ((site-map (make-sparse-keymap)))
+ (define-key map [html-site-site-map]
+ (list 'menu-item "Site" site-map))
+ (define-key site-map [html-site-customize-site-list]
+ (list 'menu-item "Edit Sites" (lambda () (interactive)
+ (customize-option 'html-site-list))))
+ (define-key site-map [html-site-set-site]
+ (list 'menu-item "Set Current Site" 'html-site-set-site))
+ )
+
+ map))
+
+
+(defvar html-site-mode-map
+ (let ((map (make-sparse-keymap )))
+ (define-key map [menu-bar html-site-mode]
+ (list 'menu-item "Web Site" html-site-mode-menu-map))
+ map))
+
+(define-minor-mode html-site-mode
+ "Adds a menu for easy access of setting site, uploading etc."
+ :init-value nil
+ :lighter nil
+ :keymap html-site-mode-map
+ :group 'html-site)
+
+(defvar html-site-mode-off-list
+ '(nxhtml-mode))
+
+(define-global-minor-mode html-site-global-mode html-site-mode
+ (lambda ()
+ (html-site-mode 1)
+ (when t ;buffer-file-name
+ (unless (memq major-mode html-site-mode-off-list)
+ (html-site-mode 1))))
+ :group 'html-site)
+;; The problem with global minor modes:
+(when (and html-site-global-mode
+ (not (boundp 'define-global-minor-mode-bug)))
+ (html-site-global-mode 1))
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; html-site.el ends here