song_pro 0.1.3 → 0.1.8
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/.github/workflows/build.yml +21 -0
- data/.ruby-version +1 -1
- data/Gemfile.lock +9 -27
- data/README.md +23 -18
- data/lib/song_pro.rb +29 -8
- data/lib/song_pro/line.rb +13 -3
- data/lib/song_pro/measure.rb +9 -0
- data/lib/song_pro/song.rb +22 -0
- data/lib/song_pro/version.rb +1 -1
- data/song_pro.gemspec +3 -8
- metadata +11 -24
- data/.travis.yml +0 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: de07eeede6a20f6904f08e2f4d4caa8e68a1c40c94bebb270967eefb2947c986
|
|
4
|
+
data.tar.gz: adf3d562172dcbce5132fd744a87a08029d4c84e1e38522f3950fc574f9ba5da
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9f39ddfc9ed35543564f30eaeca952d648b8bb6670f5c188f7cdfd5b1696ff41489f641ddffb066acdf556087025122f49432ade8b31b35b5db717c1eb01bc9f
|
|
7
|
+
data.tar.gz: b24c9088c98bc491425b2b3a4dc7820cc2c1e36541389034c9c5b76f9506e2ac5c4eef3804a167c7188056e83b492225d136829e3b15ed5cad9ce066edb0e242
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: Build
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ master ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- uses: actions/checkout@v2
|
|
14
|
+
- name: Set up Ruby
|
|
15
|
+
uses: ruby/setup-ruby@v1
|
|
16
|
+
with:
|
|
17
|
+
ruby-version: 2.7
|
|
18
|
+
- name: Install dependencies
|
|
19
|
+
run: bundle install
|
|
20
|
+
- name: Run tests
|
|
21
|
+
run: bundle exec rake
|
data/.ruby-version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
2.
|
|
1
|
+
2.7.0
|
data/Gemfile.lock
CHANGED
|
@@ -1,57 +1,39 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
song_pro (0.1.
|
|
4
|
+
song_pro (0.1.8)
|
|
5
5
|
markaby
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
ast (2.4.0)
|
|
11
10
|
builder (3.2.3)
|
|
12
11
|
diff-lcs (1.3)
|
|
13
|
-
jaro_winkler (1.5.1)
|
|
14
12
|
markaby (0.9.0)
|
|
15
13
|
builder
|
|
16
|
-
|
|
17
|
-
parser (2.5.1.2)
|
|
18
|
-
ast (~> 2.4.0)
|
|
19
|
-
powerpack (0.1.2)
|
|
20
|
-
rainbow (3.0.0)
|
|
21
|
-
rake (10.5.0)
|
|
14
|
+
rake (13.0.1)
|
|
22
15
|
rspec (3.8.0)
|
|
23
16
|
rspec-core (~> 3.8.0)
|
|
24
17
|
rspec-expectations (~> 3.8.0)
|
|
25
18
|
rspec-mocks (~> 3.8.0)
|
|
26
|
-
rspec-core (3.8.
|
|
19
|
+
rspec-core (3.8.2)
|
|
27
20
|
rspec-support (~> 3.8.0)
|
|
28
|
-
rspec-expectations (3.8.
|
|
21
|
+
rspec-expectations (3.8.4)
|
|
29
22
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
30
23
|
rspec-support (~> 3.8.0)
|
|
31
|
-
rspec-mocks (3.8.
|
|
24
|
+
rspec-mocks (3.8.1)
|
|
32
25
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
33
26
|
rspec-support (~> 3.8.0)
|
|
34
|
-
rspec-support (3.8.
|
|
35
|
-
rubocop (0.58.2)
|
|
36
|
-
jaro_winkler (~> 1.5.1)
|
|
37
|
-
parallel (~> 1.10)
|
|
38
|
-
parser (>= 2.5, != 2.5.1.1)
|
|
39
|
-
powerpack (~> 0.1)
|
|
40
|
-
rainbow (>= 2.2.2, < 4.0)
|
|
41
|
-
ruby-progressbar (~> 1.7)
|
|
42
|
-
unicode-display_width (~> 1.0, >= 1.0.1)
|
|
43
|
-
ruby-progressbar (1.10.0)
|
|
44
|
-
unicode-display_width (1.4.0)
|
|
27
|
+
rspec-support (3.8.2)
|
|
45
28
|
|
|
46
29
|
PLATFORMS
|
|
47
30
|
ruby
|
|
48
31
|
|
|
49
32
|
DEPENDENCIES
|
|
50
|
-
bundler (~> 1.
|
|
51
|
-
rake (~>
|
|
33
|
+
bundler (~> 2.1.2)
|
|
34
|
+
rake (~> 13.0)
|
|
52
35
|
rspec (~> 3.0)
|
|
53
|
-
rubocop
|
|
54
36
|
song_pro!
|
|
55
37
|
|
|
56
38
|
BUNDLED WITH
|
|
57
|
-
1.
|
|
39
|
+
2.1.4
|
data/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# SongPro for Ruby
|
|
1
|
+
# SongPro for Ruby 
|
|
2
2
|
|
|
3
3
|
[SongPro](https://songpro.org) is a text format for transcribing songs.
|
|
4
4
|
|
|
@@ -14,30 +14,36 @@ gem 'song_pro'
|
|
|
14
14
|
|
|
15
15
|
And then execute:
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
```bash
|
|
18
|
+
$ bundle
|
|
19
|
+
```
|
|
18
20
|
|
|
19
21
|
Or install it yourself as:
|
|
20
22
|
|
|
21
|
-
|
|
23
|
+
```bash
|
|
24
|
+
$ gem install song_pro
|
|
25
|
+
```
|
|
22
26
|
|
|
23
27
|
## Usage
|
|
24
28
|
|
|
25
|
-
Given then file `
|
|
29
|
+
Given then file `escape-capsule.sng` with the following contents:
|
|
26
30
|
|
|
27
31
|
```
|
|
28
|
-
@title=
|
|
29
|
-
@artist=
|
|
32
|
+
@title=Escape Capsule
|
|
33
|
+
@artist=Brian Kelly
|
|
34
|
+
!bandcamp=https://spilth.bandcamp.com/track/escape-capsule-nashville-edition
|
|
30
35
|
|
|
31
|
-
#
|
|
36
|
+
# Verse 1
|
|
32
37
|
|
|
33
|
-
[D][A]
|
|
38
|
+
Climb a-[D]board [A]
|
|
39
|
+
I've been [Bm]waiting for you [F#m]
|
|
40
|
+
Climb a-[G]board [D]
|
|
41
|
+
You'll be [Asus4]safe in [A7]here
|
|
34
42
|
|
|
35
|
-
#
|
|
43
|
+
# Chorus 1
|
|
36
44
|
|
|
37
|
-
[
|
|
38
|
-
[
|
|
39
|
-
[D]I see [A]earth-[G]quakes and [D]lightnin'
|
|
40
|
-
[D]I see [A]bad [G]times to-[D]day
|
|
45
|
+
[G] I'm a [D]rocket [F#]made for your pro-[Bm]tection
|
|
46
|
+
You're [G]safe with me, un-[A]til you leave
|
|
41
47
|
```
|
|
42
48
|
|
|
43
49
|
You can then parse the file to create a `Song` object:
|
|
@@ -45,18 +51,17 @@ You can then parse the file to create a `Song` object:
|
|
|
45
51
|
```ruby
|
|
46
52
|
require 'song_pro'
|
|
47
53
|
|
|
48
|
-
text = File.read('
|
|
54
|
+
text = File.read('escape-capsule.sng')
|
|
49
55
|
song = SongPro.parse(text)
|
|
50
56
|
|
|
51
57
|
puts song.title
|
|
52
|
-
#
|
|
58
|
+
# Escape Capsule
|
|
53
59
|
|
|
54
60
|
puts song.artist
|
|
55
|
-
#
|
|
61
|
+
# Brian Kelly
|
|
56
62
|
|
|
57
63
|
puts song.sections[1].title
|
|
58
|
-
#
|
|
59
|
-
|
|
64
|
+
# Chorus 1
|
|
60
65
|
```
|
|
61
66
|
|
|
62
67
|
## Development
|
data/lib/song_pro.rb
CHANGED
|
@@ -5,12 +5,17 @@ require 'song_pro/song'
|
|
|
5
5
|
require 'song_pro/section'
|
|
6
6
|
require 'song_pro/line'
|
|
7
7
|
require 'song_pro/part'
|
|
8
|
+
require 'song_pro/measure'
|
|
8
9
|
|
|
9
10
|
module SongPro
|
|
10
11
|
SECTION_REGEX = /#\s*([^$]*)/
|
|
11
12
|
ATTRIBUTE_REGEX = /@(\w*)=([^%]*)/
|
|
12
13
|
CUSTOM_ATTRIBUTE_REGEX = /!(\w*)=([^%]*)/
|
|
13
|
-
CHORDS_AND_LYRICS_REGEX =
|
|
14
|
+
CHORDS_AND_LYRICS_REGEX = %r{(\[[\w#b\/]+\])?([^\[]*)}i
|
|
15
|
+
|
|
16
|
+
MEASURES_REGEX = %r{([\[[\w#b\/]+\]\s]+)[|]*}i
|
|
17
|
+
CHORDS_REGEX = %r{\[([\w#b\/]+)\]?}i
|
|
18
|
+
COMMENT_REGEX = />\s*([^$]*)/
|
|
14
19
|
|
|
15
20
|
def self.parse(lines)
|
|
16
21
|
song = Song.new
|
|
@@ -60,7 +65,6 @@ module SongPro
|
|
|
60
65
|
song.set_custom(key, value)
|
|
61
66
|
end
|
|
62
67
|
|
|
63
|
-
|
|
64
68
|
def self.process_lyrics_and_chords(song, current_section, text)
|
|
65
69
|
return if text == ''
|
|
66
70
|
|
|
@@ -71,16 +75,33 @@ module SongPro
|
|
|
71
75
|
|
|
72
76
|
line = Line.new
|
|
73
77
|
|
|
74
|
-
if text.start_with?('
|
|
78
|
+
if text.start_with?('|-')
|
|
75
79
|
line.tablature = text
|
|
80
|
+
elsif text.start_with?('| ')
|
|
81
|
+
captures = text.scan(MEASURES_REGEX).flatten
|
|
82
|
+
|
|
83
|
+
measures = []
|
|
84
|
+
|
|
85
|
+
captures.each do |capture|
|
|
86
|
+
chords = capture.scan(CHORDS_REGEX).flatten
|
|
87
|
+
measure = Measure.new
|
|
88
|
+
measure.chords = chords
|
|
89
|
+
measures << measure
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
line.measures = measures
|
|
93
|
+
elsif text.start_with?('>')
|
|
94
|
+
matches = COMMENT_REGEX.match(text)
|
|
95
|
+
comment = matches[1].strip
|
|
96
|
+
line.comment = comment
|
|
76
97
|
else
|
|
77
98
|
captures = text.scan(CHORDS_AND_LYRICS_REGEX).flatten
|
|
78
99
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
100
|
+
captures.each_slice(2) do |pair|
|
|
101
|
+
part = Part.new
|
|
102
|
+
chord = pair[0]&.strip || ''
|
|
103
|
+
part.chord = chord.delete('[').delete(']')
|
|
104
|
+
part.lyric = pair[1] || ''
|
|
84
105
|
|
|
85
106
|
line.parts << part unless (part.chord == '') && (part.lyric == '')
|
|
86
107
|
end
|
data/lib/song_pro/line.rb
CHANGED
|
@@ -2,15 +2,25 @@
|
|
|
2
2
|
|
|
3
3
|
module SongPro
|
|
4
4
|
class Line
|
|
5
|
-
attr_accessor :parts, :tablature
|
|
5
|
+
attr_accessor :parts, :tablature, :measures, :comment
|
|
6
6
|
|
|
7
7
|
def initialize
|
|
8
8
|
@parts = []
|
|
9
9
|
@tablature = nil
|
|
10
|
+
@measures = nil
|
|
11
|
+
@comment = nil
|
|
10
12
|
end
|
|
11
13
|
|
|
12
14
|
def tablature?
|
|
13
|
-
|
|
15
|
+
!@tablature.nil?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def measures?
|
|
19
|
+
!@measures.nil?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def comment?
|
|
23
|
+
!@comment.nil?
|
|
14
24
|
end
|
|
15
25
|
end
|
|
16
|
-
end
|
|
26
|
+
end
|
data/lib/song_pro/song.rb
CHANGED
|
@@ -24,6 +24,18 @@ module SongPro
|
|
|
24
24
|
@custom[key.to_sym] = value
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
def chords
|
|
28
|
+
sections.collect do |section|
|
|
29
|
+
section.lines.collect do |line|
|
|
30
|
+
if line.measures?
|
|
31
|
+
line.measures.collect(&:chords)
|
|
32
|
+
else
|
|
33
|
+
line.parts.collect(&:chord)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end.flatten.uniq.reject(&:empty?)
|
|
37
|
+
end
|
|
38
|
+
|
|
27
39
|
def to_html
|
|
28
40
|
mab = Markaby::Builder.new(song: self)
|
|
29
41
|
mab.div.song do
|
|
@@ -66,6 +78,16 @@ module SongPro
|
|
|
66
78
|
div.tablature do
|
|
67
79
|
line.tablature
|
|
68
80
|
end
|
|
81
|
+
elsif line.measures?
|
|
82
|
+
div.measures do
|
|
83
|
+
line.measures.each do |measure|
|
|
84
|
+
div.measure do
|
|
85
|
+
measure.chords.each do |chord|
|
|
86
|
+
div.chord chord
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
69
91
|
else
|
|
70
92
|
div.line do
|
|
71
93
|
line.parts.each do |part|
|
data/lib/song_pro/version.rb
CHANGED
data/song_pro.gemspec
CHANGED
|
@@ -8,15 +8,13 @@ Gem::Specification.new do |spec|
|
|
|
8
8
|
spec.name = 'song_pro'
|
|
9
9
|
spec.version = SongPro::VERSION
|
|
10
10
|
spec.authors = ['Brian Kelly']
|
|
11
|
-
spec.email = ['polymonic@gmail.com
|
|
11
|
+
spec.email = ['polymonic@gmail.com']
|
|
12
12
|
|
|
13
13
|
spec.summary = 'Converts SongPro files to HTML'
|
|
14
14
|
spec.description = 'Provides classes for creating, parsing and rendering SongPro files'
|
|
15
15
|
spec.homepage = 'https://songpro.org'
|
|
16
16
|
spec.license = 'MIT'
|
|
17
17
|
|
|
18
|
-
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
|
19
|
-
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
|
20
18
|
if spec.respond_to?(:metadata)
|
|
21
19
|
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
|
22
20
|
else
|
|
@@ -27,13 +25,10 @@ Gem::Specification.new do |spec|
|
|
|
27
25
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
|
28
26
|
f.match(%r{^(test|spec|features)/})
|
|
29
27
|
end
|
|
30
|
-
spec.bindir = 'exe'
|
|
31
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
32
28
|
spec.require_paths = ['lib']
|
|
33
29
|
|
|
34
30
|
spec.add_dependency 'markaby'
|
|
35
|
-
spec.add_development_dependency 'bundler', '~> 1.
|
|
36
|
-
spec.add_development_dependency 'rake', '~>
|
|
31
|
+
spec.add_development_dependency 'bundler', '~> 2.1.2'
|
|
32
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
|
37
33
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
|
38
|
-
spec.add_development_dependency 'rubocop'
|
|
39
34
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: song_pro
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.8
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Brian Kelly
|
|
8
8
|
autorequire:
|
|
9
|
-
bindir:
|
|
9
|
+
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2020-07-10 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: markaby
|
|
@@ -30,28 +30,28 @@ dependencies:
|
|
|
30
30
|
requirements:
|
|
31
31
|
- - "~>"
|
|
32
32
|
- !ruby/object:Gem::Version
|
|
33
|
-
version:
|
|
33
|
+
version: 2.1.2
|
|
34
34
|
type: :development
|
|
35
35
|
prerelease: false
|
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
38
|
- - "~>"
|
|
39
39
|
- !ruby/object:Gem::Version
|
|
40
|
-
version:
|
|
40
|
+
version: 2.1.2
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: rake
|
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: '
|
|
47
|
+
version: '13.0'
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: '
|
|
54
|
+
version: '13.0'
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: rspec
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -66,31 +66,17 @@ dependencies:
|
|
|
66
66
|
- - "~>"
|
|
67
67
|
- !ruby/object:Gem::Version
|
|
68
68
|
version: '3.0'
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: rubocop
|
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
|
72
|
-
requirements:
|
|
73
|
-
- - ">="
|
|
74
|
-
- !ruby/object:Gem::Version
|
|
75
|
-
version: '0'
|
|
76
|
-
type: :development
|
|
77
|
-
prerelease: false
|
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
-
requirements:
|
|
80
|
-
- - ">="
|
|
81
|
-
- !ruby/object:Gem::Version
|
|
82
|
-
version: '0'
|
|
83
69
|
description: Provides classes for creating, parsing and rendering SongPro files
|
|
84
70
|
email:
|
|
85
|
-
-
|
|
71
|
+
- polymonic@gmail.com
|
|
86
72
|
executables: []
|
|
87
73
|
extensions: []
|
|
88
74
|
extra_rdoc_files: []
|
|
89
75
|
files:
|
|
76
|
+
- ".github/workflows/build.yml"
|
|
90
77
|
- ".gitignore"
|
|
91
78
|
- ".rspec"
|
|
92
79
|
- ".ruby-version"
|
|
93
|
-
- ".travis.yml"
|
|
94
80
|
- Gemfile
|
|
95
81
|
- Gemfile.lock
|
|
96
82
|
- LICENSE.txt
|
|
@@ -100,6 +86,7 @@ files:
|
|
|
100
86
|
- bin/setup
|
|
101
87
|
- lib/song_pro.rb
|
|
102
88
|
- lib/song_pro/line.rb
|
|
89
|
+
- lib/song_pro/measure.rb
|
|
103
90
|
- lib/song_pro/part.rb
|
|
104
91
|
- lib/song_pro/section.rb
|
|
105
92
|
- lib/song_pro/song.rb
|
|
@@ -125,7 +112,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
125
112
|
- !ruby/object:Gem::Version
|
|
126
113
|
version: '0'
|
|
127
114
|
requirements: []
|
|
128
|
-
rubygems_version: 3.
|
|
115
|
+
rubygems_version: 3.1.2
|
|
129
116
|
signing_key:
|
|
130
117
|
specification_version: 4
|
|
131
118
|
summary: Converts SongPro files to HTML
|