;;; trampaste.el --- Paste to the web via tramp. ;; Copyright (C) 2008 Phil Hagelberg ;; Author: Phil Hagelberg ;; URL: http://www.emacswiki.org/cgi-bin/wiki/TRAMPaste ;; Version: 0.6 ;; Created: 2008-04-02 ;; Keywords: convenience hypermedia ;; EmacsWiki: TRAMPaste ;; Package-Requires: ((htmlize "1.39")) ;; This file is NOT part of GNU Emacs. ;;; Pasted Files ;; * <http://dme.org/data/paste/ffap.html> ;; * <http://dme.org/data/paste/index.html> ;; * <http://dme.org/data/paste/movement-bindings.patch.html> ;; * <http://dme.org/data/paste/next-open-with-tag.el.html> ;;; Commentary: ;; This will place an HTML copy of a buffer on the web on a server ;; that the user has shell access on. ;; It's similar in purpose to services such as http://paste.lisp.org ;; or http://rafb.net, but it's much simpler since it assumes the user ;; has an account on a publicly-accessible HTTP server. It uses `tramp' ;; as its transport and uses Emacs' font-lock as its syntax ;; highlighter instead of relying on a third-party syntax highlighter ;; for which individual language support must be added one-by-one. ;;; Install ;; To install, copy this file into your Emacs source directory, set ;; `trampaste-http-destination' and `trampaste-file-destination' to ;; appropriate values, and add this to your .emacs file: ;; (autoload 'trampaste "trampaste" "Paste the current buffer." t nil) ;; (setq trampaste-http-destination "http://p.hagelb.org" ;; trampaste-file-destination "p.hagelb.org:p.hagelb.org") ;;; Usage ;; M-x trampaste, enter a name, and press return. The name will be ;; incorporated into the URL by escaping it and adding it to the end ;; of `trampaste-http-destination'. The URL for the pasted file will be ;; pushed onto the kill ring. ;; You can autogenerate a splash page that gets uploaded as index.html ;; in `trampaste-http-destination' by invoking M-x trampaste-index. This ;; will upload an explanation as well as a listing of existing ;; pastes. If a paste's filename includes "private" it will be skipped. ;; You probably want to set up SSH keys for your destination to avoid ;; having to enter your password once for each paste. Also be sure the ;; key of the host referenced in `trampaste-file-destination' is in your ;; known hosts file--trampaste will not prompt you to add it but will ;; simply hang. ;;; License: ;; 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 3, 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 GNU Emacs; see the file COPYING. If not, write to the ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. ;;; Code: (require 'url) (require 'htmlize) (defvar trampaste-tramp-port "22") (defvar trampaste-http-destination "http://p.hagelb.org" "Publicly-accessible (via HTTP) location for pasted files.") (defvar trampaste-file-destination "/pscp:p.hagelb.org:p.hagelb.org" "SSH-accessible directory corresponding to `trampaste-http-destination'. You must have write-access to this directory via tramp.") (defvar trampaste-paste-hook nil "Hook run after creating a new paste.") (defvar trampaste-footer (concat "<p style='font-size: 8pt; font-family: monospace;'>Generated by " user-full-name " using <a href='http://p.hagelb.org'>trampaste</a> at %s. " (cadr (current-time-zone)) ". (<a href='%s'>original</a>)</p>") "HTML message to place at the bottom of each file.") ;; To set defvar while developing: (load-file (buffer-file-name)) (defvar trampaste-el-location load-file-name) ;;;###autoload (defun trampaste (original-name) "Paste the current buffer to `trampaste-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 trampaste-http-destination "/" (url-hexify-string name) ".html")) (file-destination (concat trampaste-file-destination "/" name ".html")) (tramp-original-destination (concat trampaste-file-destination "/" name)) (tmp-file (concat temporary-file-directory "/" name))) ;; Save the file (while adding footer) (save-excursion (switch-to-buffer b) (goto-char (point-min)) (search-forward "</body>\n</html>") (insert (format trampaste-footer (current-time-string) (substring full-url 0 -5))) (write-file tmp-file) (kill-buffer b)) (tramp-handle-copy-file tmp-file file-destination t) (tramp-handle-copy-file (buffer-file-name (current-buffer)) tramp-original-destination t) (run-hooks 'trampaste-paste-hook) ;; Notify user and put the URL on the kill ring (let ((x-select-enable-primary t)) (kill-new full-url)) (message "Pasted to %s (on kill ring)" full-url))) ;;;###autoload (defun trampaste-region (name) "Paste the current region via `trampaste'." (interactive "MName: ") (let ((region-contents (buffer-substring (mark) (point)))) (with-temp-buffer (insert region-contents) (trampaste name)))) ;;;###autoload (defun trampaste-index () "Generate an index of all existing pastes on server on the splash page." (interactive) (let ((file-list (directory-files trampaste-file-destination nil "\\.html$"))) (save-excursion (with-temp-buffer (insert-file-contents trampaste-el-location) (goto-char (point-min)) (search-forward ";;; Commentary") (forward-line -1) (insert "\n;;; Pasted Files\n\n") (dolist (file file-list) (when (not (string-match "private" file)) (insert (concat ";; * <" trampaste-http-destination "/" file ">\n")))) (emacs-lisp-mode) (font-lock-fontify-buffer) (rename-buffer "TRAMPaste") (write-file "/tmp/trampaste-index") (trampaste "index"))))) (provide 'trampaste) ;;; trampaste.el ends here