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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7d13f7f76dd430f25293eab52b8ebb42c1a6ed45eb5a5dedbd117cb4b0206b80
4
- data.tar.gz: b13503808204e547d71b958d8ac7691bb040a3b1f3f7c8029e3dc9638753ca58
3
+ metadata.gz: de07eeede6a20f6904f08e2f4d4caa8e68a1c40c94bebb270967eefb2947c986
4
+ data.tar.gz: adf3d562172dcbce5132fd744a87a08029d4c84e1e38522f3950fc574f9ba5da
5
5
  SHA512:
6
- metadata.gz: 234fdde6636efb454f57b9bd12c9a25a087aad982ca732e04114c2dbf9166b118bc39a69d2371064ffe88064bf0760157ee632f84aa8f2ff490f4d4f90e2baa7
7
- data.tar.gz: 31d1cafad5793a282bf37705794239d03a1eb8e4a0f7a273db153cef170ed29bf2acd685c6a7c93fcaa0860a8e5c98ee90277a04646066abc351d5e6a4adbe45
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
@@ -1 +1 @@
1
- 2.6.1
1
+ 2.7.0
@@ -1,57 +1,39 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- song_pro (0.1.3)
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
- parallel (1.12.1)
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.0)
19
+ rspec-core (3.8.2)
27
20
  rspec-support (~> 3.8.0)
28
- rspec-expectations (3.8.1)
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.0)
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.0)
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.16)
51
- rake (~> 10.0)
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.17.2
39
+ 2.1.4
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # SongPro for Ruby [![Build Status](https://travis-ci.org/spilth/song_pro.svg?branch=master)](https://travis-ci.org/spilth/song_pro)
1
+ # SongPro for Ruby ![Build](https://github.com/SongProOrg/songpro-ruby/workflows/Build/badge.svg?branch=master)
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
- $ bundle
17
+ ```bash
18
+ $ bundle
19
+ ```
18
20
 
19
21
  Or install it yourself as:
20
22
 
21
- $ gem install song_pro
23
+ ```bash
24
+ $ gem install song_pro
25
+ ```
22
26
 
23
27
  ## Usage
24
28
 
25
- Given then file `bad-moon-rising.sng` with the following contents:
29
+ Given then file `escape-capsule.sng` with the following contents:
26
30
 
27
31
  ```
28
- @title=Bad Moon Rising
29
- @artist=Cleedence Clearwater Revival
32
+ @title=Escape Capsule
33
+ @artist=Brian Kelly
34
+ !bandcamp=https://spilth.bandcamp.com/track/escape-capsule-nashville-edition
30
35
 
31
- # Intro
36
+ # Verse 1
32
37
 
33
- [D][A][G][D]
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
- # Verse 1
43
+ # Chorus 1
36
44
 
37
- [D]I see a [A]bad [G]moon a-[D]rising
38
- [D]I see [A]trouble [G]on the [D]way
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('bad-moon-rising.sng')
54
+ text = File.read('escape-capsule.sng')
49
55
  song = SongPro.parse(text)
50
56
 
51
57
  puts song.title
52
- # Bad Moon Rising
58
+ # Escape Capsule
53
59
 
54
60
  puts song.artist
55
- # Creedence Clearwater Revival
61
+ # Brian Kelly
56
62
 
57
63
  puts song.sections[1].title
58
- # Verse 1
59
-
64
+ # Chorus 1
60
65
  ```
61
66
 
62
67
  ## Development
@@ -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 = /(\[[\w#b\/]+\])?([\w\s',.!\(\)_\-"]*)/i
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
- captures.each_slice(2) do |pair|
80
- part = Part.new
81
- chord = pair[0]&.strip || ''
82
- part.chord = chord.delete('[').delete(']')
83
- part.lyric = pair[1]&.strip || ''
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
@@ -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
- return @tablature != nil
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
@@ -0,0 +1,9 @@
1
+ module SongPro
2
+ class Measure
3
+ attr_accessor :chords
4
+
5
+ def initialize
6
+ @chords = []
7
+ end
8
+ end
9
+ end
@@ -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|
@@ -1,3 +1,3 @@
1
1
  module SongPro
2
- VERSION = '0.1.3'.freeze
2
+ VERSION = '0.1.8'.freeze
3
3
  end
@@ -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.16'
36
- spec.add_development_dependency 'rake', '~> 10.0'
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.3
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Kelly
8
8
  autorequire:
9
- bindir: exe
9
+ bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-08 00:00:00.000000000 Z
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: '1.16'
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: '1.16'
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: '10.0'
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: '10.0'
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
- - 'polymonic@gmail.com '
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.0.1
115
+ rubygems_version: 3.1.2
129
116
  signing_key:
130
117
  specification_version: 4
131
118
  summary: Converts SongPro files to HTML
@@ -1,5 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.5.1
5
- before_install: gem install bundler -v 1.16.1