song_pro 0.1.3 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
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