octodown 1.8.0 → 1.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/octodown +5 -1
- data/lib/octodown/renderer/server.rb +9 -15
- data/lib/octodown/support/logger.rb +1 -0
- data/lib/octodown/support/services/riposter.rb +2 -1
- data/lib/octodown/template/octodown.html.erb +17 -31
- data/lib/octodown/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 873f8e9bccb9cea287afa902146a4932ca71e83a
|
4
|
+
data.tar.gz: 5d88a4c9b7a26f981d10671a76a7a5bfc5271959
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 358cc97c065769a35c69c608ab41268d7eb2d4fa23fd84b92702cd3f727e51a8e486249609bc7d6da1f1fb91bd59ff4c63ce4a00c7555269b19b3ebc914781ae
|
7
|
+
data.tar.gz: 720403b3d42ce1b2c1b83f908aebab01dca2e3d8a8c6783b165951a8acfd3495c8cf76823dfd1c55f2de5baa521b3136d85a27df7f2773ca41ac1854fd5f1520
|
data/bin/octodown
CHANGED
@@ -37,6 +37,11 @@ OptionParser.new do |opts|
|
|
37
37
|
options[:logger].level = Logger::FATAL
|
38
38
|
end
|
39
39
|
|
40
|
+
opts.on '--debug', 'Debug the gem' do
|
41
|
+
ENV['LISTEN_GEM_DEBUGGING'] = '2'
|
42
|
+
options[:logger].level = Logger::DEBUG
|
43
|
+
end
|
44
|
+
|
40
45
|
opts.on '-r', '--raw', 'Print raw HTML to STDOUT' do
|
41
46
|
options[:presenter] = :raw
|
42
47
|
end
|
@@ -68,7 +73,6 @@ end.parse!
|
|
68
73
|
|
69
74
|
require 'tty-prompt'
|
70
75
|
|
71
|
-
STDOUT.sync = true
|
72
76
|
TUI = TTY::Prompt.new(enable_color: true)
|
73
77
|
|
74
78
|
options[:file] = if ARGF.file == STDIN && options[:stdin]
|
@@ -17,7 +17,6 @@ module Octodown
|
|
17
17
|
@path = File.dirname(File.expand_path(file.path))
|
18
18
|
@port = options[:port]
|
19
19
|
@websockets = []
|
20
|
-
@already_opened = false
|
21
20
|
@mutex = Mutex.new
|
22
21
|
end
|
23
22
|
|
@@ -27,7 +26,6 @@ module Octodown
|
|
27
26
|
Thread.new do
|
28
27
|
Thread.abort_on_exception = true
|
29
28
|
maybe_launch_browser
|
30
|
-
Thread.exit
|
31
29
|
end
|
32
30
|
|
33
31
|
boot_server
|
@@ -45,10 +43,11 @@ module Octodown
|
|
45
43
|
sleep 2.5
|
46
44
|
|
47
45
|
@mutex.synchronize do
|
48
|
-
if @
|
49
|
-
@already_opened = true
|
46
|
+
if @websockets.empty?
|
50
47
|
logger.info 'Loading preview in a new browser tab'
|
51
48
|
Launchy.open "http://localhost:#{port}"
|
49
|
+
else
|
50
|
+
logger.info 'Re-using existing browser tab'
|
52
51
|
end
|
53
52
|
end
|
54
53
|
end
|
@@ -65,34 +64,25 @@ module Octodown
|
|
65
64
|
|
66
65
|
private
|
67
66
|
|
68
|
-
# rubocop:disable Metrics/MethodLength
|
69
67
|
def render_ws(env)
|
70
68
|
md = render_md(file)
|
71
69
|
|
72
70
|
socket = ::Faye::WebSocket.new(env)
|
73
71
|
|
74
72
|
socket.on(:open) do
|
75
|
-
|
76
|
-
if @already_opened == false
|
77
|
-
logger.info 'Re-using octodown client from previous browser tab'
|
78
|
-
end
|
79
|
-
|
80
|
-
@already_opened = true
|
81
|
-
end
|
73
|
+
log_clients('Client joined')
|
82
74
|
|
83
75
|
socket.send md
|
84
|
-
logger.debug "Clients: #{@websockets.size}"
|
85
76
|
end
|
86
77
|
|
87
78
|
socket.on(:close) do
|
88
79
|
@websockets = @websockets.reject { |s| s == socket }
|
89
|
-
|
80
|
+
log_clients('Client left')
|
90
81
|
end
|
91
82
|
|
92
83
|
@websockets << socket
|
93
84
|
socket.rack_response
|
94
85
|
end
|
95
|
-
# rubocop:enable Metrics/MethodLength
|
96
86
|
|
97
87
|
def render_http(env)
|
98
88
|
Rack::Response.new.tap do |res|
|
@@ -124,6 +114,10 @@ module Octodown
|
|
124
114
|
def render_md(f)
|
125
115
|
Renderer::GithubMarkdown.render f, options
|
126
116
|
end
|
117
|
+
|
118
|
+
def log_clients(msg)
|
119
|
+
logger.debug "#{msg}. Number of websocket clients: #{@websockets.size}"
|
120
|
+
end
|
127
121
|
end
|
128
122
|
end # Support
|
129
123
|
end # Octodown
|
@@ -6,7 +6,8 @@ module Octodown
|
|
6
6
|
require 'listen'
|
7
7
|
|
8
8
|
path = File.dirname(File.expand_path(file.path))
|
9
|
-
|
9
|
+
escaped_path = Regexp.escape(file.path)
|
10
|
+
regex = Regexp.new("^#{escaped_path}$")
|
10
11
|
|
11
12
|
@listener ||= Listen.to(path, only: regex) do |modified, added, _rm|
|
12
13
|
listener_callback.call if modified.any? || added.any?
|
@@ -8,37 +8,6 @@
|
|
8
8
|
|
9
9
|
<%= highlight_stylesheet %>
|
10
10
|
<%= stylesheet %>
|
11
|
-
|
12
|
-
<script type='text/javascript'>
|
13
|
-
'use strict';
|
14
|
-
|
15
|
-
document.addEventListener("DOMContentLoaded", function() {
|
16
|
-
var ws = null;
|
17
|
-
var interval = 2500;
|
18
|
-
|
19
|
-
function start() {
|
20
|
-
ws = new WebSocket(<%= host %>);
|
21
|
-
|
22
|
-
ws.onmessage = function(event) {
|
23
|
-
var body = document.querySelector('article.markdown-body');
|
24
|
-
if (body) body.innerHTML = event.data;
|
25
|
-
};
|
26
|
-
|
27
|
-
ws.onclose = function() {
|
28
|
-
check();
|
29
|
-
};
|
30
|
-
}
|
31
|
-
|
32
|
-
function check(){
|
33
|
-
if(ws.readyState == 3) start();
|
34
|
-
}
|
35
|
-
|
36
|
-
start();
|
37
|
-
|
38
|
-
setInterval(check, interval);
|
39
|
-
});
|
40
|
-
</script>
|
41
|
-
|
42
11
|
</head>
|
43
12
|
|
44
13
|
<body>
|
@@ -56,4 +25,21 @@
|
|
56
25
|
</div>
|
57
26
|
</div>
|
58
27
|
</body>
|
28
|
+
|
29
|
+
<%# reconnecting-websocket.min.js %>
|
30
|
+
|
31
|
+
<script type='text/javascript'>
|
32
|
+
!function(a,b){"function"==typeof define&&define.amd?define([],b):"undefined"!=typeof module&&module.exports?module.exports=b():a.ReconnectingWebSocket=b()}(this,function(){function a(b,c,d){function l(a,b){var c=document.createEvent("CustomEvent");return c.initCustomEvent(a,!1,!1,b),c}var e={debug:!1,automaticOpen:!0,reconnectInterval:1e3,maxReconnectInterval:3e4,reconnectDecay:1.5,timeoutInterval:2e3};d||(d={});for(var f in e)this[f]="undefined"!=typeof d[f]?d[f]:e[f];this.url=b,this.reconnectAttempts=0,this.readyState=WebSocket.CONNECTING,this.protocol=null;var h,g=this,i=!1,j=!1,k=document.createElement("div");k.addEventListener("open",function(a){g.onopen(a)}),k.addEventListener("close",function(a){g.onclose(a)}),k.addEventListener("connecting",function(a){g.onconnecting(a)}),k.addEventListener("message",function(a){g.onmessage(a)}),k.addEventListener("error",function(a){g.onerror(a)}),this.addEventListener=k.addEventListener.bind(k),this.removeEventListener=k.removeEventListener.bind(k),this.dispatchEvent=k.dispatchEvent.bind(k),this.open=function(b){h=new WebSocket(g.url,c||[]),b||k.dispatchEvent(l("connecting")),(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","attempt-connect",g.url);var d=h,e=setTimeout(function(){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","connection-timeout",g.url),j=!0,d.close(),j=!1},g.timeoutInterval);h.onopen=function(){clearTimeout(e),(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onopen",g.url),g.protocol=h.protocol,g.readyState=WebSocket.OPEN,g.reconnectAttempts=0;var d=l("open");d.isReconnect=b,b=!1,k.dispatchEvent(d)},h.onclose=function(c){if(clearTimeout(e),h=null,i)g.readyState=WebSocket.CLOSED,k.dispatchEvent(l("close"));else{g.readyState=WebSocket.CONNECTING;var d=l("connecting");d.code=c.code,d.reason=c.reason,d.wasClean=c.wasClean,k.dispatchEvent(d),b||j||((g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onclose",g.url),k.dispatchEvent(l("close")));var e=g.reconnectInterval*Math.pow(g.reconnectDecay,g.reconnectAttempts);setTimeout(function(){g.reconnectAttempts++,g.open(!0)},e>g.maxReconnectInterval?g.maxReconnectInterval:e)}},h.onmessage=function(b){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onmessage",g.url,b.data);var c=l("message");c.data=b.data,k.dispatchEvent(c)},h.onerror=function(b){(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","onerror",g.url,b),k.dispatchEvent(l("error"))}},1==this.automaticOpen&&this.open(!1),this.send=function(b){if(h)return(g.debug||a.debugAll)&&console.debug("ReconnectingWebSocket","send",g.url,b),h.send(b);throw"INVALID_STATE_ERR : Pausing to reconnect websocket"},this.close=function(a,b){"undefined"==typeof a&&(a=1e3),i=!0,h&&h.close(a,b)},this.refresh=function(){h&&h.close()}}return a.prototype.onopen=function(){},a.prototype.onclose=function(){},a.prototype.onconnecting=function(){},a.prototype.onmessage=function(){},a.prototype.onerror=function(){},a.debugAll=!1,a.CONNECTING=WebSocket.CONNECTING,a.OPEN=WebSocket.OPEN,a.CLOSING=WebSocket.CLOSING,a.CLOSED=WebSocket.CLOSED,a});
|
33
|
+
</script>
|
34
|
+
|
35
|
+
<script type='text/javascript'>
|
36
|
+
'use strict';
|
37
|
+
|
38
|
+
var ws = new ReconnectingWebSocket(<%= host %>, [], { maxReconnectInterval: 1000 });
|
39
|
+
|
40
|
+
ws.onmessage = function(event) {
|
41
|
+
var body = document.querySelector('article.markdown-body');
|
42
|
+
if (body) body.innerHTML = event.data;
|
43
|
+
};
|
44
|
+
</script>
|
59
45
|
</html>
|
data/lib/octodown/version.rb
CHANGED