marvi 0.1.3 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 38191038ed0255015b0184643cc52e36bc35b8973803c75f3f5636e227fddba6
4
- data.tar.gz: 83a3fe56615300c99bcc9858750926d5afab8a4e7a78c279e7b74ceef81ff074
3
+ metadata.gz: 5131e252ac808321286aa802bdd386e5b3bb9b494dda00df1761ef9700088a4e
4
+ data.tar.gz: 2e9bccb531018e22014e43053b6a05d081e60a422c9107966c54739829cf528d
5
5
  SHA512:
6
- metadata.gz: 0dce42f6d88ceac30fa7cd2a75ad9318ab383f71164ad383ea1a95835601129ac8df125c403e634b5882a68802d24e05b4db9dd57496b4b91ab3a9a3bc176cca
7
- data.tar.gz: 4f41145dc7639d8034cdff69b750dd0c92856b23b830b3e25542de48685e11f70a610cca7130a4ca54b04e829d5bd79bdcc5322f94fea939c6e6c64db81bbb08
6
+ metadata.gz: d87aa8d7de7acd2414e5301416fd09b09d1f33e48f64c93c86b5d0b7fc833e20102c297e89a77396cdcb4176269493459e835a6ab9df2a677d6d112ad9bbb3ed
7
+ data.tar.gz: 673ca0703a768010c6116fa4cae6b29c723b439a50e7591c3a7ac7f9928e614eda42f2ef2fda7f377ef7453babd37b729786579ef20479b24107f800be453c59
@@ -18,23 +18,27 @@ module Marvi
18
18
 
19
19
  ITALIC_ATTR = (defined?(::Curses::A_ITALIC) ? ::Curses::A_ITALIC : 0)
20
20
 
21
+ FILE_POLL_INTERVAL_MS = 500
22
+
21
23
  def render(markdown, file: nil)
22
24
  @file = file
23
25
  @markdown = markdown
24
26
  @lines = ASTWalker.new.walk(markdown)
25
27
  @scroll = 0
28
+ mark_reloaded
26
29
 
27
- with_safe_term { ::Curses.init_screen }
28
- ::Curses.start_color
29
- ::Curses.use_default_colors
30
- ::Curses.noecho
31
- ::Curses.cbreak
32
- ::Curses.stdscr.keypad(true)
33
- setup_colors
30
+ init_curses_state
34
31
  draw
35
32
 
36
33
  catch(:quit) do
37
- loop { handle_key(::Curses.getch) }
34
+ loop do
35
+ key = ::Curses.getch
36
+ if key.nil? || key == -1
37
+ check_file_updated
38
+ else
39
+ handle_key(key)
40
+ end
41
+ end
38
42
  end
39
43
  ensure
40
44
  ::Curses.close_screen
@@ -106,9 +110,41 @@ module Marvi
106
110
  when "g" then @scroll = 0; draw
107
111
  when "G" then @scroll = max_scroll; draw
108
112
  when "e" then launch_editor if @file
113
+ when "r", "R" then reload_from_key if @file
109
114
  end
110
115
  end
111
116
 
117
+ def reload_from_key
118
+ reload
119
+ mark_reloaded
120
+ draw
121
+ end
122
+
123
+ def check_file_updated
124
+ return unless @file
125
+ mtime = current_mtime
126
+ return if mtime.nil? || mtime == @last_mtime
127
+
128
+ @last_mtime = mtime
129
+ return if @file_updated
130
+
131
+ @file_updated = true
132
+ draw_status_bar
133
+ ::Curses.refresh
134
+ end
135
+
136
+ def mark_reloaded
137
+ @last_mtime = current_mtime
138
+ @file_updated = false
139
+ end
140
+
141
+ def current_mtime
142
+ return nil unless @file
143
+ File.mtime(@file)
144
+ rescue SystemCallError
145
+ nil
146
+ end
147
+
112
148
  def launch_editor
113
149
  editor = ENV["EDITOR"] || ENV["VISUAL"] || "vi"
114
150
  line = current_source_line
@@ -117,7 +153,8 @@ module Marvi
117
153
  ::Curses.close_screen
118
154
  system(cmd)
119
155
  reload
120
- reinit_curses
156
+ mark_reloaded
157
+ init_curses_state
121
158
  draw
122
159
  end
123
160
 
@@ -127,13 +164,14 @@ module Marvi
127
164
  @scroll = [@scroll, max_scroll].min
128
165
  end
129
166
 
130
- def reinit_curses
167
+ def init_curses_state
131
168
  with_safe_term { ::Curses.init_screen }
132
169
  ::Curses.start_color
133
170
  ::Curses.use_default_colors
134
171
  ::Curses.noecho
135
172
  ::Curses.cbreak
136
173
  ::Curses.stdscr.keypad(true)
174
+ ::Curses.stdscr.timeout = FILE_POLL_INTERVAL_MS
137
175
  setup_colors
138
176
  end
139
177
 
@@ -170,12 +208,20 @@ module Marvi
170
208
 
171
209
  def draw_status_bar
172
210
  ::Curses.setpos(::Curses.lines - 1, 0)
211
+ top = @scroll + 1
212
+ bottom = [@scroll + page_size, @lines.size].min
213
+ edit_hint = @file ? " e edit" : ""
214
+ status = " #{top}-#{bottom}/#{@lines.size} j/k scroll g/G top/bottom#{edit_hint} q quit"
215
+ updated_hint = @file_updated ? " ● updated (r to reload) " : ""
216
+ available = [::Curses.cols - updated_hint.length, 0].max
217
+
173
218
  ::Curses.attron(::Curses.color_pair(COLOR_PAIRS[:cyan])) do
174
- top = @scroll + 1
175
- bottom = [@scroll + page_size, @lines.size].min
176
- edit_hint = @file ? " e edit" : ""
177
- status = " #{top}-#{bottom}/#{@lines.size} j/k scroll g/G top/bottom#{edit_hint} q quit"
178
- ::Curses.addstr(status.ljust(::Curses.cols)[0, ::Curses.cols])
219
+ ::Curses.addstr(status.ljust(available)[0, available])
220
+ end
221
+ unless updated_hint.empty?
222
+ ::Curses.attron(::Curses.color_pair(COLOR_PAIRS[:yellow]) | ::Curses::A_BOLD) do
223
+ ::Curses.addstr(updated_hint)
224
+ end
179
225
  end
180
226
  end
181
227
 
data/lib/marvi/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Marvi
4
- VERSION = "0.1.3"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marvi
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mitsutaka Mimura