in_our_time 0.5.0 → 0.6.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 +4 -4
- data/.gitignore +3 -0
- data/VERSION +1 -1
- data/lib/in_our_time.rb +2 -2
- data/lib/iot/iot.rb +137 -12
- data/lib/iot/keyboard_events.rb +34 -30
- data/lib/iot/levenshtein.rb +55 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ebc3b3c85e4482305e7c6126b149228e277165a
|
4
|
+
data.tar.gz: eff2a53fb96a38076a283e2c668e09c4d169f090
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 418b56bec73a51dae797340183fc2f7b7a9e7a98b7378e7ba82dcb6be441a887e90a6cfcced2a156725816348d4abba73d04ab5b7dec333ea9f7be32d18f4a91
|
7
|
+
data.tar.gz: afd484a3f52597e77c3b2a0b731a86da0f1c89b05b96e534b6751e4f92c1078eca1717cb71acf527cb9076b1f1304203f5d14ddd840af220b40f65e9434635a0
|
data/.gitignore
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/lib/in_our_time.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
require_relative 'iot/iot
|
2
|
-
|
1
|
+
require_relative 'iot/iot'
|
2
|
+
require_relative 'iot/levenshtein'
|
3
3
|
InOurTime.new
|
data/lib/iot/iot.rb
CHANGED
@@ -469,9 +469,12 @@ class InOurTime
|
|
469
469
|
end
|
470
470
|
end
|
471
471
|
|
472
|
+
def use_mpg123?
|
473
|
+
@config[:mpg_player] == :mpg123
|
474
|
+
end
|
475
|
+
|
472
476
|
def player_cmd
|
473
|
-
|
474
|
-
when :mpg123
|
477
|
+
if use_mpg123?
|
475
478
|
"mpg123 --remote-err -Cqk#{pre_delay}"
|
476
479
|
else
|
477
480
|
"afplay"
|
@@ -487,6 +490,84 @@ class InOurTime
|
|
487
490
|
sleep delay
|
488
491
|
end
|
489
492
|
|
493
|
+
def get_search_results search_term
|
494
|
+
distances = {}
|
495
|
+
@sorted_titles.each do |title|
|
496
|
+
title.split(' ').each do |word|
|
497
|
+
if distances[title].nil?
|
498
|
+
distances[title] = Levenshtein::distance(search_term, word)
|
499
|
+
else
|
500
|
+
distances[title] =
|
501
|
+
distances[title] >
|
502
|
+
Levenshtein::distance(search_term, word.downcase) ?
|
503
|
+
Levenshtein::distance(search_term, word.downcase) :
|
504
|
+
distances[title]
|
505
|
+
end
|
506
|
+
end
|
507
|
+
end
|
508
|
+
results = distances.sort_by{ |k, v| v }
|
509
|
+
results.shuffle! if search_term == ''
|
510
|
+
results
|
511
|
+
end
|
512
|
+
|
513
|
+
def print_search_results results
|
514
|
+
puts
|
515
|
+
puts "0: Search Again!"
|
516
|
+
puts
|
517
|
+
5.times do |count|
|
518
|
+
print "#{count + 1}: "
|
519
|
+
puts results[count][0]
|
520
|
+
end
|
521
|
+
puts
|
522
|
+
end
|
523
|
+
|
524
|
+
def display_search_choice results, choice
|
525
|
+
@key = KeyboardEvents.new
|
526
|
+
begin
|
527
|
+
if choice.to_i > 0 && choice.to_i < 6
|
528
|
+
list_selected results[choice.to_i - 1][0]
|
529
|
+
return
|
530
|
+
end
|
531
|
+
end
|
532
|
+
redraw
|
533
|
+
end
|
534
|
+
|
535
|
+
def get_search_term
|
536
|
+
puts "Enter Search Term or just Return for Random:"
|
537
|
+
puts
|
538
|
+
print "Search Term: "
|
539
|
+
gets.chomp
|
540
|
+
end
|
541
|
+
|
542
|
+
def get_search_choice
|
543
|
+
print "Enter Choice: "
|
544
|
+
temp = gets.chomp
|
545
|
+
temp == '0' ? :search_again : temp
|
546
|
+
end
|
547
|
+
|
548
|
+
def search_init
|
549
|
+
@key.kill
|
550
|
+
sleep 0.2
|
551
|
+
STDIN.echo = true
|
552
|
+
STDIN.cooked!
|
553
|
+
clear
|
554
|
+
sleep 0.2
|
555
|
+
end
|
556
|
+
|
557
|
+
def search
|
558
|
+
choice = ''
|
559
|
+
results = []
|
560
|
+
loop do
|
561
|
+
search_init
|
562
|
+
search_term = get_search_term
|
563
|
+
results = get_search_results(search_term)
|
564
|
+
print_search_results(results)
|
565
|
+
choice = get_search_choice
|
566
|
+
break unless choice == :search_again
|
567
|
+
end
|
568
|
+
display_search_choice results, choice
|
569
|
+
end
|
570
|
+
|
490
571
|
def run_program prg
|
491
572
|
unless prg[:have_locally]
|
492
573
|
retries = 0
|
@@ -561,7 +642,7 @@ class InOurTime
|
|
561
642
|
end
|
562
643
|
|
563
644
|
def control_play?
|
564
|
-
@playing &&
|
645
|
+
@playing && use_mpg123?
|
565
646
|
end
|
566
647
|
|
567
648
|
def forward
|
@@ -572,6 +653,12 @@ class InOurTime
|
|
572
653
|
write_player ";" if control_play?
|
573
654
|
end
|
574
655
|
|
656
|
+
def instructions
|
657
|
+
iot_print "Type", @system_colour
|
658
|
+
iot_print " h ", :light_green
|
659
|
+
iot_print "for instructions", @system_colour
|
660
|
+
end
|
661
|
+
|
575
662
|
def print_playing_maybe
|
576
663
|
if @playing
|
577
664
|
iot_print("Playing: ", @count_colour) unless @paused
|
@@ -579,7 +666,7 @@ class InOurTime
|
|
579
666
|
iot_puts @playing, @selection_colour
|
580
667
|
elsif @started.nil?
|
581
668
|
@started = true
|
582
|
-
|
669
|
+
instructions
|
583
670
|
end
|
584
671
|
end
|
585
672
|
|
@@ -654,40 +741,78 @@ class InOurTime
|
|
654
741
|
def load_help_maybe
|
655
742
|
return unless help_option?
|
656
743
|
help
|
657
|
-
|
744
|
+
puts
|
745
|
+
exit 0
|
658
746
|
end
|
659
747
|
|
660
748
|
def help_screen
|
661
749
|
[] <<
|
662
750
|
" In Our Time Player (#{@version})" <<
|
663
751
|
" " <<
|
664
|
-
" Play/Stop - X
|
752
|
+
" Play/Stop - X / Enter " <<
|
665
753
|
" Next/Prev - Up / Down " <<
|
666
754
|
" Next/Prev Page - Right / Left " <<
|
667
755
|
" Sort - S " <<
|
756
|
+
" Search - ? " <<
|
668
757
|
" Theme Toggle - T " <<
|
669
758
|
" List Top/End - L " <<
|
670
759
|
" Update - U " <<
|
671
760
|
" Info - I " <<
|
672
761
|
" Help - H " <<
|
673
762
|
" Quit - Q " <<
|
674
|
-
" mpg123 Control
|
675
|
-
" Pause/Resume - P /
|
763
|
+
" mpg123 Control - " <<
|
764
|
+
" Pause/Resume - P / Spacebar " <<
|
676
765
|
" Forward Skip - F " <<
|
677
766
|
" Reverse Skip - R " <<
|
678
767
|
" " <<
|
679
768
|
"Config: #{CONFIG} "
|
680
769
|
end
|
681
770
|
|
771
|
+
def help_partial x,y; help_screen[x..y] end
|
772
|
+
def help_title; help_partial(0, 1) end
|
773
|
+
def help_main; help_partial(2, 12) end
|
774
|
+
def help_cfg; help_partial(17, -1) end
|
775
|
+
|
776
|
+
def help_mpg
|
777
|
+
scr = help_partial(13,16)
|
778
|
+
scr[0].rstrip! << ' (enabled) ' if use_mpg123?
|
779
|
+
scr[0].rstrip! << ' (disabled) ' unless use_mpg123?
|
780
|
+
scr
|
781
|
+
end
|
782
|
+
|
783
|
+
def help_colour scr
|
784
|
+
case scr
|
785
|
+
when :mpg
|
786
|
+
return @selection_colour unless use_mpg123?
|
787
|
+
@count_colour if use_mpg123?
|
788
|
+
when :cfg
|
789
|
+
@system_colour
|
790
|
+
else
|
791
|
+
@text_colour
|
792
|
+
end
|
793
|
+
end
|
794
|
+
|
795
|
+
def rstrip_maybe scr
|
796
|
+
self.rstrip unless scr == :mpg
|
797
|
+
end
|
798
|
+
|
799
|
+
def help_render scr
|
800
|
+
txt = send "help_#{scr}"
|
801
|
+
iot_puts txt.map{|x| x}.join("\n\r"), help_colour(scr)
|
802
|
+
end
|
803
|
+
|
682
804
|
def print_help
|
683
|
-
|
805
|
+
help_render :title
|
806
|
+
help_render :main
|
807
|
+
help_render :mpg
|
808
|
+
help_render :cfg
|
684
809
|
end
|
685
810
|
|
686
811
|
def help
|
687
812
|
unless @help
|
688
813
|
clear_content
|
689
814
|
print_help
|
690
|
-
print_playing_maybe
|
815
|
+
print_playing_maybe unless help_option?
|
691
816
|
@help = true
|
692
817
|
render
|
693
818
|
else
|
@@ -697,7 +822,7 @@ class InOurTime
|
|
697
822
|
end
|
698
823
|
|
699
824
|
def reformat info
|
700
|
-
['With','Guests','Producer','Contributors'].map do |
|
825
|
+
['With','Guests','Producer','Contributors'].map do |x|
|
701
826
|
[' ', ':'].map do |y|
|
702
827
|
[x, x.upcase].map do |z|
|
703
828
|
info.gsub!(z + y, "\n" + z + y)
|
@@ -888,7 +1013,7 @@ class InOurTime
|
|
888
1013
|
case ip
|
889
1014
|
when :pause, :forward, :rewind, :list_key, :page_forward, :page_back,
|
890
1015
|
:previous, :next, :play, :sort_key, :theme_toggle, :update_key,
|
891
|
-
:info, :help, :quit_key
|
1016
|
+
:info, :help, :quit_key, :search
|
892
1017
|
self.send ip
|
893
1018
|
end
|
894
1019
|
end
|
data/lib/iot/keyboard_events.rb
CHANGED
@@ -67,36 +67,40 @@ class KeyboardEvents
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def match_event str
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
70
|
+
@event =
|
71
|
+
case str
|
72
|
+
when "\e"
|
73
|
+
@mode = :escape
|
74
|
+
:no_event
|
75
|
+
when "l",'L'
|
76
|
+
:list_key
|
77
|
+
when "u",'U'
|
78
|
+
:update_key
|
79
|
+
when ' '
|
80
|
+
:pause
|
81
|
+
when "q",'Q', "\u0003", "\u0004"
|
82
|
+
:quit_key
|
83
|
+
when 'p', 'P'
|
84
|
+
:pause
|
85
|
+
when 'f', 'F'
|
86
|
+
:forward
|
87
|
+
when 'r', 'R'
|
88
|
+
:rewind
|
89
|
+
when 's', 'S'
|
90
|
+
:sort_key
|
91
|
+
when 't', 'T'
|
92
|
+
:theme_toggle
|
93
|
+
when 'x', 'X', "\r"
|
94
|
+
:play
|
95
|
+
when 'i', 'I'
|
96
|
+
:info
|
97
|
+
when 'h', 'H'
|
98
|
+
:help
|
99
|
+
when '?'
|
100
|
+
:search
|
101
|
+
else
|
102
|
+
:no_event
|
103
|
+
end
|
100
104
|
end
|
101
105
|
end
|
102
106
|
|
@@ -0,0 +1,55 @@
|
|
1
|
+
module Levenshtein # :nodoc:
|
2
|
+
# This code is based directly on the Text gem implementation
|
3
|
+
# Copyright (c) 2006-2013 Paul Battley, Michael Neumann, Tim Fletcher.
|
4
|
+
#
|
5
|
+
# Returns a value representing the "cost" of transforming str1 into str2
|
6
|
+
def distance(str1, str2)
|
7
|
+
n = str1.length
|
8
|
+
m = str2.length
|
9
|
+
return m if n.zero?
|
10
|
+
return n if m.zero?
|
11
|
+
|
12
|
+
d = (0..m).to_a
|
13
|
+
x = nil
|
14
|
+
|
15
|
+
# to avoid duplicating an enumerable object, create it outside of the loop
|
16
|
+
str2_codepoints = str2.codepoints
|
17
|
+
|
18
|
+
str1.each_codepoint.with_index(1) do |char1, i|
|
19
|
+
j = 0
|
20
|
+
while j < m
|
21
|
+
cost = (char1 == str2_codepoints[j]) ? 0 : 1
|
22
|
+
x = min3(
|
23
|
+
d[j+1] + 1, # insertion
|
24
|
+
i + 1, # deletion
|
25
|
+
d[j] + cost # substitution
|
26
|
+
)
|
27
|
+
d[j] = i
|
28
|
+
i = x
|
29
|
+
|
30
|
+
j += 1
|
31
|
+
end
|
32
|
+
d[m] = x
|
33
|
+
end
|
34
|
+
|
35
|
+
x
|
36
|
+
end
|
37
|
+
module_function :distance
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# detects the minimum value out of three arguments. This method is
|
42
|
+
# faster than `[a, b, c].min` and puts less GC pressure.
|
43
|
+
# See https://github.com/yuki24/did_you_mean/pull/1 for a performance
|
44
|
+
# benchmark.
|
45
|
+
def min3(a, b, c)
|
46
|
+
if a < b && a < c
|
47
|
+
a
|
48
|
+
elsif b < c
|
49
|
+
b
|
50
|
+
else
|
51
|
+
c
|
52
|
+
end
|
53
|
+
end
|
54
|
+
module_function :min3
|
55
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: in_our_time
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martyn Jago
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oga
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- lib/in_our_time.rb
|
74
74
|
- lib/iot/iot.rb
|
75
75
|
- lib/iot/keyboard_events.rb
|
76
|
+
- lib/iot/levenshtein.rb
|
76
77
|
homepage: https://github.com/mjago/In_Our_Time
|
77
78
|
licenses:
|
78
79
|
- MIT
|