-
Notifications
You must be signed in to change notification settings - Fork 49
/
insideout.el
51 lines (45 loc) · 1.65 KB
/
insideout.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
;; Expose your running emacs to the local web by using elnode
;; Copyright (C) 2010 by Nic Ferrier
(defun insideout-html-escape (str)
"Escape significant HTML characters in 'str'"
(replace-regexp-in-string
"<\\|\\&"
(lambda (src)
(cond
((equal src "&") "&")
((equal src "<") "<")))
str))
(defun insideout-render (buf-name)
"Render buffer 'buf' as HTML"
(with-current-buffer (get-buffer buf-name)
(format "<html>
<body><pre>%s</pre></body>
</html>"
(insideout-html-escape
(buffer-substring-no-properties (point-min) (point-max))))))
(defun insideout-handler (httpcon)
"Turn your emacs insideout with elnode.
This exposes all your non * buffers to localhost - so beware."
(let ((p (elnode-http-pathinfo httpcon)))
(let ((buf-name (progn
(string-match "/\\(.*\\)" p)
(match-string 1 p))))
;; An individual buffer
(progn
(elnode-http-start httpcon 200 '("Content-Type" . "text/html"))
(elnode-http-return
httpcon
(if (bufferp (get-buffer buf-name))
(insideout-render buf-name)
;; The buffer index
(format "<html><body><ul>%s</ul></body></html>"
(mapconcat
(lambda (buf)
(if (not (string-match "\\*" (buffer-name buf)))
(format "<li><a href='/%s'>%s</a></li>"
(buffer-name buf)
(buffer-name buf))))
(buffer-list)
"\n"))))))))
(elnode-start 'insideout-handler 8028 "localhost")
;; End