(require 'url)
(require 'htmlize)
(defvar scpaste-scp-port
"22")
(defvar scpaste-http-destination
"http://p.hagelb.org"
"Publicly-accessible (via HTTP) location for pasted files.")
(defvar scpaste-scp-destination
"p.hagelb.org:p.hagelb.org"
"SSH-accessible directory corresponding to `scpaste-http-destination'.
You must have write-access to this directory via `scp'.")
(defvar scpaste-scp-pubkey
nil
"Identity file for the server, corresponds to ssh’s `-i` option
Example: \"~/.ssh/id.pub\"")
(defvar scpaste-user-name
nil
"Name displayed under the paste.")
(defvar scpaste-user-address
nil
"Link to the user’s homebase (can be a mailto:).")
(defvar scpaste-el-location load-file-name)
(defun scpaste-footer ()
"HTML message to place at the bottom of each file."
(concat "<p style='font-size: 8pt; font-family: monospace;'>Generated by "
(let ((user (or scpaste-user-name user-full-name)))
(concat "DEBUG" user scpaste-user-name scpaste-user-address)
(if scpaste-user-address
(concat "<a href='" scpaste-user-address "'>" user "</a>")
user))
" using <a href='http://p.hagelb.org'>scpaste</a> at %s. "
(cadr (current-time-zone)) ". (<a href='%s'>original</a>)</p>"))
(defun scpaste (original-name)
"Paste the current buffer via `scp' to `scpaste-http-destination'."
(interactive "MName (defaults to buffer name): ")
(let* ((b (htmlize-buffer))
(name (url-hexify-string (if (equal "" original-name)
(buffer-name)
original-name)))
(full-url (concat scpaste-http-destination "/" (url-hexify-string name) ".html"))
(scp-destination (concat scpaste-scp-destination "/" name ".html"))
(scp-original-destination (concat scpaste-scp-destination "/" name))
(tmp-file (concat temporary-file-directory name)))
(save-excursion
(switch-to-buffer b)
(goto-char (point-min))
(search-forward "</body>\n</html>")
(insert (format (scpaste-footer)
(current-time-string)
(substring full-url 0 -5)))
(write-file tmp-file)
(kill-buffer b))
(let* ((identity (if scpaste-scp-pubkey
(concat "-i " scpaste-scp-pubkey)
""))
(port (concat "-P " scpaste-scp-port))
(invocation (concat "scp -q " identity " " port))
(command-1 (concat invocation
" " tmp-file
" " scp-destination))
(command-2 (concat invocation
" " (buffer-file-name (current-buffer))
" " scp-original-destination)))
(with-temp-message (format "Executing %s" command-1)
(let* ((error-buffer "*scp-error*")
(retval (shell-command command-1 nil error-buffer))
(retval-2 (shell-command command-2 nil error-buffer))
(x-select-enable-primary t))
(if (= retval retval-2 0)
(progn (kill-new full-url)
(message "Pasted to %s (on kill ring)" full-url))
(progn
(pop-to-buffer error-buffer)
(help-mode-setup))))))))
(defun scpaste-region (name)
"Paste the current region via `scpaste'."
(interactive "MName: ")
(let ((region-contents (buffer-substring (mark) (point))))
(with-temp-buffer
(insert region-contents)
(scpaste name))))
(defun scpaste-index ()
"Generate an index of all existing pastes on server on the splash page."
(interactive)
(let* ((dest-parts (split-string scpaste-scp-destination ":"))
(files (shell-command-to-string (concat "ssh " (car dest-parts)
" ls " (cadr dest-parts))))
(file-list (split-string files "\n")))
(save-excursion
(with-temp-buffer
(insert-file-contents scpaste-el-location)
(goto-char (point-min))
(search-forward ";;; Commentary")
(forward-line -1)
(insert "\n;;; Pasted Files\n\n")
(dolist (file file-list)
(when (and (string-match "\\.html$" file)
(not (string-match "private" file)))
(insert (concat ";; * <" scpaste-http-destination "/" file ">\n"))))
(emacs-lisp-mode) (font-lock-fontify-buffer) (rename-buffer "SCPaste")
(write-file "/tmp/scpaste-index")
(scpaste "index")))))
(provide 'scpaste)