Merge pull request #5 from AdrieanKhisbe/master

Minor README improvement
This commit is contained in:
Igor Shymko 2016-01-11 09:40:45 +02:00
commit e251b74523
2 changed files with 74 additions and 54 deletions

View File

@ -1,15 +1,18 @@
Markdown preview mode Markdown preview mode
=========================== ===========================
> **Markdown realtime preview minor mode**
## Description ## Description
Opens a preview in a browser, updated upon buffer save. Opens a preview in a browser, updated upon buffer save.
Same preview window is valid across multiple markdown buffers. Same preview window is valid across multiple markdown buffers.
Scrolls browser window to keep your editing position visible. Scrolls browser window to keep your editing position visible.
## Dependencies ## Dependencies
* markdown-mode.el * [markdown-mode.el](https://github.com/defunkt/markdown-mode)
* websocket.el * [websocket.el](https://github.com/ahyatt/emacs-websocket)
Makes use of `markdown-mode`, which already can transform markdown into html Makes use of `markdown-mode`, which already can transform markdown into html
and `websocket.el` to deliver html to browser. and `websocket.el` to deliver html to browser.

View File

@ -31,7 +31,7 @@
(defgroup markdown-preview nil (defgroup markdown-preview nil
"Markdown preview mode" "Markdown preview mode"
:group 'text :group 'text
:prefix "mdpm:" :prefix "markdown-preview-"
:link '(url-link "https://github.com/ancane/markdown-preview-mode")) :link '(url-link "https://github.com/ancane/markdown-preview-mode"))
(defcustom markdown-preview-port 7379 (defcustom markdown-preview-port 7379
@ -44,64 +44,77 @@
:group 'markdown-preview :group 'markdown-preview
:type 'string) :type 'string)
(defvar mdpm:websocket-server nil) (defvar markdown-preview--websocket-server nil
(defvar mdpm:local-client nil) "`markdown-preview' Websocket server.")
(defvar mdpm:remote-clients nil) (defvar markdown-preview--local-client nil
(defvar mdpm:preview-url (concat (file-name-directory load-file-name) "preview.html")) "`markdown-preview' local client.")
(defvar mdpm:idle-timer nil "Preview idle timer") (defvar markdown-preview--remote-clients nil
"List of `markdown-preview' websocket remote clients.")
(defvar markdown-preview--preview-url
(concat (file-name-directory load-file-name) "preview.html")
"Location of `markdown-preview' html.")
(defvar markdown-preview--idle-timer nil "Preview idle timer")
(defun mdpm:stop-idle-timer () (defun markdown-preview--stop-idle-timer ()
(when (timerp mdpm:idle-timer) "Stop the `markdown-preview' idle timer."
(cancel-timer mdpm:idle-timer))) (when (timerp markdown-preview--idle-timer)
(cancel-timer markdown-preview--idle-timer)))
(defun mdpm:open-browser-preview () (defun markdown-preview--open-browser-preview ()
(browse-url mdpm:preview-url)) "Open the markdown preview in the browser."
(browse-url markdown-preview--preview-url))
(defun mdpm:stop-websocket-server () (defun markdown-preview--stop-websocket-server ()
(when mdpm:local-client "Stop the `markdown-preview' websocket server."
(websocket-close mdpm:local-client)) (when markdown-preview--local-client
(when mdpm:websocket-server (websocket-close markdown-preview--local-client))
(delete-process mdpm:websocket-server) (when markdown-preview--websocket-server
(setq mdpm:websocket-server nil (delete-process markdown-preview--websocket-server)
mdpm:remote-clients nil))) (setq markdown-preview--websocket-server nil
markdown-preview--remote-clients nil)))
(defun mdpm:drop-closed-clients () (defun markdown-preview--drop-closed-clients ()
(setq mdpm:remote-clients "Clean closed clients in `markdown-preview--remote-clients' list."
(cl-remove-if-not #'websocket-openp mdpm:remote-clients))) (setq markdown-preview--remote-clients
(cl-remove-if-not #'websocket-openp markdown-preview--remote-clients)))
(defun mdpm:start-websocket-server () (defun markdown-preview--start-websocket-server ()
(when (not mdpm:websocket-server) "Start `markdown-preview' websocket server."
(setq mdpm:websocket-server (when (not markdown-preview--websocket-server)
(setq markdown-preview--websocket-server
(websocket-server (websocket-server
markdown-preview-port markdown-preview-port
:on-message (lambda (websocket frame) :on-message (lambda (websocket frame)
(mapc (lambda (ws) (mapc (lambda (ws)
(websocket-send-text ws (websocket-send-text ws
(websocket-frame-payload frame))) (websocket-frame-payload frame)))
mdpm:remote-clients)) markdown-preview--remote-clients))
:on-open (lambda (websocket) :on-open (lambda (websocket)
(push websocket mdpm:remote-clients) (push websocket markdown-preview--remote-clients)
(mdpm:send-preview-to websocket)) (markdown-preview--send-preview-to websocket))
:on-error (lambda (websocket type err) (message (concat "====> Error:" err))) :on-error (lambda (websocket type err) (message (concat "====> Error:" err)))
:on-close (lambda (websocket) (mdpm:drop-closed-clients)))) :on-close (lambda (websocket) (markdown-preview--drop-closed-clients))))
(add-hook 'kill-emacs-hook 'mdpm:stop-websocket-server) (add-hook 'kill-emacs-hook 'markdown-preview--stop-websocket-server)
(mdpm:open-browser-preview))) (markdown-preview--open-browser-preview)))
(defun mdpm:start-local-client () (defun markdown-preview--start-local-client ()
(when (not mdpm:local-client) "Start the `markdown-preview' local client."
(setq mdpm:local-client (when (not markdown-preview--local-client)
(setq markdown-preview--local-client
(websocket-open (websocket-open
(format "ws://localhost:%d" markdown-preview-port) (format "ws://localhost:%d" markdown-preview-port)
:on-error (lambda (ws type err) :on-error (lambda (ws type err)
(message "error connecting")) (message "error connecting"))
:on-close (lambda (websocket) :on-close (lambda (websocket)
(setq mdpm:local-client nil)))))) (setq markdown-preview--local-client nil))))))
(defun mdpm:send-preview () (defun markdown-preview--send-preview ()
"Send the `markdown-preview' preview to clients."
(when (bound-and-true-p markdown-preview-mode) (when (bound-and-true-p markdown-preview-mode)
(mdpm:send-preview-to mdpm:local-client))) (markdown-preview--send-preview-to markdown-preview--local-client)))
(defun mdpm:send-preview-to (websocket) (defun markdown-preview--send-preview-to (websocket)
"Send the `markdown-preview' to a specific WEBSOCKET."
(let ((mark-position-percent (let ((mark-position-percent
(number-to-string (number-to-string
(truncate (truncate
@ -127,29 +140,33 @@
"</div>") "</div>")
)))) ))))
(defun mdpm:start () (defun markdown-preview--start ()
(mdpm:start-websocket-server) "Start `markdown-preview' mode."
(mdpm:start-local-client) (markdown-preview--start-websocket-server)
(setq mdpm:idle-timer (markdown-preview--start-local-client)
(run-with-idle-timer 2 t 'mdpm:send-preview)) (setq markdown-preview--idle-timer
(add-hook 'after-save-hook 'mdpm:send-preview nil t) (run-with-idle-timer 2 t 'markdown-preview--send-preview))
(add-hook 'kill-buffer-hook 'mdpm:stop)) (add-hook 'after-save-hook 'markdown-preview--send-preview nil t)
(add-hook 'kill-buffer-hook 'markdown-preview--stop))
(defun mdpm:stop () (defun markdown-preview--stop ()
(remove-hook 'after-save-hook 'mdpm:send-preview t) "Stop `markdown-preview' mode."
(mdpm:stop-idle-timer)) (remove-hook 'after-save-hook 'markdown-preview--send-preview t)
(markdown-preview--stop-idle-timer))
(defun markdown-preview-open-browser () (defun markdown-preview-open-browser ()
"Open the `markdown-preview' in the browser."
(interactive) (interactive)
(mdpm:open-browser-preview)) (markdown-preview--open-browser-preview))
(defun markdown-preview-cleanup () (defun markdown-preview-cleanup ()
"Cleanup `markdown-preview' mode."
(interactive) (interactive)
(mdpm:stop-websocket-server)) (markdown-preview--stop-websocket-server))
;;;###autoload ;;;###autoload
(define-minor-mode markdown-preview-mode (define-minor-mode markdown-preview-mode
"Markdown preview mode" "Markdown preview mode."
:group 'markdown-preview-mode :group 'markdown-preview-mode
:init-value nil :init-value nil
(when (not (or (when (not (or
@ -157,8 +174,8 @@
(equal major-mode 'gfm-mode))) (equal major-mode 'gfm-mode)))
(markdown-mode)) (markdown-mode))
(if markdown-preview-mode (if markdown-preview-mode
(mdpm:start) (markdown-preview--start)
(mdpm:stop))) (markdown-preview--stop)))
(provide 'markdown-preview-mode) (provide 'markdown-preview-mode)