;;; hyde-md.el ;; Copyright (C) 2004 Noufal Ibrahim ;; ;; This program is not part of Gnu Emacs ;; ;; hyde-md.el 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 of the License, ;; 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; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA ;; 02111-1307, USA. (defun hyde-markdown-processp (asset) "Returns true if an asset is to be processed" (and (not (string-prefix-p "http://" asset)) (not (string-prefix-p "https://" asset)) (not (string-prefix-p hyde-images-dir asset)))) (defun hyde-markdown-process-assets () (save-excursion (goto-char (point-min)) (while (re-search-forward "!\\[\\(.*?\\)\\](\\(.*?\\))" nil t) (let ((asset (match-string-no-properties 2))) (message (format "Found : %s" asset)) (if (hyde-markdown-processp asset) (progn ;; First copy over the asset properly to the images directory (let ((new-name (hyde-markdown-copy-over-asset asset hyde-home))) (message (format "Complete match is %s" (match-string-no-properties 0))) (message (format "Copied over to %s" new-name)) ;; rewrite the URL in the markdown file (message (format "Replacing with %s" (format "![\\1](%s)" new-name))) (let ((p (copy-marker (point) t))) (replace-match (format "![\\1](%s)" new-name)) (goto-char p))))))))) (defun hyde-markdown-create-target-filename (sourcefile target_dir) (let* ((target_file (strip-string (shell-command-to-string (format "basename %s" sourcefile)))) (target (format "%s/%s" target_dir target_file)) (cntr 1)) (progn (while (file-exists-p target) (setq target (format "%s/%d-%s" target_dir cntr target_file)) (setq cntr (1+ cntr))) target))) (defun hyde-markdown-copy-over-asset (asset hyde-home) (let ( (full-target (hyde-markdown-create-target-filename asset hyde-images-dir)) ) (progn (copy-file asset full-target) (concat "/" (replace-regexp-in-string (format "%s/?" (regexp-quote hyde-home)) "" full-target))))) (defun hyde-markdown-end-edit () "Function called signifying the end of the editing session" (interactive) (hyde-markdown-process-assets) (save-buffer (current-buffer)) (hyde/vc-commit hyde-home (append (hyde/hyde-get-post-assets (buffer-file-name (current-buffer))) (list (buffer-file-name (current-buffer)))) (concat "Updating " (buffer-name (current-buffer)))) (bury-buffer) (hyde/load-posts) nil) (defun hyde-markdown-insert-image (image desc) (interactive "fImage file: sDescription: ") (insert (format "![%s](%s)" desc (expand-file-name image)))) (define-derived-mode hyde-markdown-mode markdown-mode "Hyde-markdown" "Markdown mode with a few extra bindings for convenience" (define-key hyde-markdown-mode-map (kbd "C-c C-c") 'hyde-markdown-end-edit) (define-key hyde-markdown-mode-map (kbd "C-c C-i") 'hyde-markdown-insert-image)) (defun hyde-markdown-activate-mode (hyde-buffer) (hyde-markdown-mode) (set (make-local-variable 'hyde-home) (buffer-local-value 'hyde-home hyde-buffer))) (provide 'hyde-md) ;;; hyde-md.el ends here