chordpro 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 8c3a004dac5edc5dabd80b9ee292460013c79cc4
4
+ data.tar.gz: 9aa3b8f96010c1a14ed487d0ebdf308ba81f8e6d
5
+ SHA512:
6
+ metadata.gz: 497c61b56fb5ff17f4fb85621bdb43e1a2d87f5fe15bdaba179ac3e402df71dbdbbc5a00e9c26c611b5a6798faca964a1cde14612aef6cd98aa274a70a611351
7
+ data.tar.gz: fa3c1f328439bff9d08a798ba297d51a408c203124045a4873fd89c3beadbb374f85846ebd7cd09c1958335c7c8f0598291c8f737a2d5827248897973e499f1c
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in chordpro.gemspec
4
+ gemspec
5
+
6
+ gem 'pry'
@@ -0,0 +1,5 @@
1
+ guard 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^spec/spec_helper.rb$}) { "spec" }
4
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
5
+ end
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Brandon Keepers
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,31 @@
1
+ # Chordpro
2
+
3
+ A ruby parser for the [chordpro](http://tenbyten.com/software/songsgen/help/HtmlHelp/files_reference.htm) song file format.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'chordpro'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install chordpro
18
+
19
+ ## Usage
20
+
21
+ ```ruby
22
+ html = Chordpro.html(File.read('spec/fixtures/sunshine.crd'))
23
+ ```
24
+
25
+ ## Contributing
26
+
27
+ 1. Fork it
28
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
29
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
30
+ 4. Push to the branch (`git push origin my-new-feature`)
31
+ 5. Create new Pull Request
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ desc "Run all specs"
6
+ RSpec::Core::RakeTask.new(:spec) do |t|
7
+ t.rspec_opts = %w[--color]
8
+ t.verbose = false
9
+ end
10
+
11
+ task :default => :spec
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'chordpro/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "chordpro"
8
+ spec.version = Chordpro::VERSION
9
+ spec.authors = ["Brandon Keepers"]
10
+ spec.email = ["brandon@opensoul.org"]
11
+ spec.summary = %q{A ruby parser for the chordpro song file format.}
12
+ spec.description = %q{A ruby parser for the chordpro song file format.}
13
+ spec.homepage = "https://github.com/bkeepers/chordpro"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_dependency 'parslet'
22
+
23
+ spec.add_development_dependency "bundler"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency 'rspec'
26
+ spec.add_development_dependency 'guard-rspec'
27
+ end
@@ -0,0 +1,9 @@
1
+ require "chordpro/version"
2
+ require "chordpro/parser"
3
+ require "chordpro/html"
4
+
5
+ module Chordpro
6
+ def self.html(string)
7
+ HTML.new(Parser.new.parse(string)).to_s
8
+ end
9
+ end
@@ -0,0 +1,71 @@
1
+ require 'nokogiri'
2
+
3
+ module Chordpro
4
+ class HTML
5
+ def initialize(tree)
6
+ @song = tree[:song]
7
+ end
8
+
9
+ def to_s
10
+ @song.map { |e| elements(e) }.flatten.join("\n")
11
+ end
12
+
13
+ def elements(element)
14
+ element.map do |key, value|
15
+ send key, value
16
+ end
17
+ end
18
+
19
+ def directive(directive)
20
+ send directive[:name], directive if respond_to?(directive[:name])
21
+ end
22
+
23
+ def title(directive)
24
+ %Q|<h1 class="title">#{directive[:value]}</h1>|
25
+ end
26
+ alias_method :t, :title
27
+
28
+ def subtitle(directive)
29
+ %Q|<h2 class="subtitle">#{directive[:value]}</h2>|
30
+ end
31
+ alias_method :st, :subtitle
32
+ alias_method :su, :subtitle
33
+
34
+ def line(line)
35
+ chords = []
36
+ lyrics = []
37
+
38
+ line.each do |element|
39
+ if lyric = element[:lyric]
40
+ lyrics << lyric
41
+ elsif chord = element[:chord]
42
+ if chords[lyrics.size]
43
+ chord << chord
44
+ lyrics << nil
45
+ else
46
+ chords[lyrics.size] = chord
47
+ end
48
+ end
49
+ end
50
+
51
+ # ensure chords has same number of cells as lyrics
52
+ chords[lyrics.size - 1] ||= nil if lyrics.size > 0
53
+
54
+ %Q|<table><tr class="chords">#{
55
+ chords.map {|l| "<td>#{l}</td>" }.join
56
+ }</tr><tr>#{
57
+ lyrics.map {|l| "<td>#{l}</td>" }.join
58
+ }</tr></table>|
59
+ end
60
+
61
+ def newline(_)
62
+ '<br>'
63
+ end
64
+
65
+ def comment(directive)
66
+ %|<span class="comment">#{directive[:value]}</span>|
67
+ end
68
+ alias_method :c, :comment
69
+
70
+ end
71
+ end
@@ -0,0 +1,37 @@
1
+ require 'parslet'
2
+
3
+ module Chordpro
4
+ class Parser < Parslet::Parser
5
+ # Characters
6
+ rule(:space) { match('\s').repeat }
7
+ rule(:colon) { space >> str(':') >> space }
8
+ rule(:newline) { str("\n") }
9
+ rule(:lbrace) { str('{') }
10
+ rule(:rbrace) { str('}') }
11
+ rule(:lbracket) { str('[') }
12
+ rule(:rbracket) { str(']') }
13
+
14
+
15
+ rule(:identifier) { match['a-z'].repeat(1) }
16
+ rule(:value) { (rbrace.absent? >> any).repeat }
17
+
18
+ rule(:directive) do
19
+ (
20
+ lbrace >> space >>
21
+ identifier.as(:name) >>
22
+ (
23
+ space >> colon >> space >>
24
+ value.as(:value)
25
+ ).maybe >>
26
+ rbrace
27
+ ).as(:directive) >> newline.maybe
28
+ end
29
+ rule(:chord) { lbracket >> (rbracket.absent? >> any).repeat.as(:chord) >> rbracket }
30
+ rule(:lyric) { (lbracket.absent? >> newline.absent? >> any).repeat(1).as(:lyric) }
31
+ rule(:line) { (chord | lyric).repeat(1).as(:line) >> newline.maybe }
32
+
33
+ rule(:song) { (directive | newline.as(:newline) | line).repeat.as(:song) }
34
+
35
+ root(:song)
36
+ end
37
+ end
@@ -0,0 +1,3 @@
1
+ module Chordpro
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe Chordpro::HTML do
4
+ def html(string)
5
+ Chordpro::HTML.new(Chordpro::Parser.new.parse(string))
6
+ end
7
+
8
+ %w(title t).each do |name|
9
+ it "renders h1 for #{name}" do
10
+ expect(html("{#{name}: Blackbird}").to_s).to eq('<h1 class="title">Blackbird</h1>')
11
+ end
12
+ end
13
+
14
+ %w(subtitle st su).each do |name|
15
+ it "renders h2 for #{name}" do
16
+ expect(html("{#{name}:The Beatles}").to_s).to eq('<h2 class="subtitle">The Beatles</h2>')
17
+ end
18
+ end
19
+
20
+ it "renders line" do
21
+ expect(html("[G7]I dreamed I [C]held you in my [G]arms").to_s).to eq(
22
+ '<table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr>' +
23
+ '<tr><td>I dreamed I </td><td>held you in my </td><td>arms</td></tr></table>'
24
+ )
25
+ end
26
+
27
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+ require 'parslet/rig/rspec'
3
+
4
+ describe Chordpro::Parser do
5
+ let(:parser) { Chordpro::Parser.new }
6
+
7
+ subject { parser.send self.class.description }
8
+
9
+ describe 'space' do
10
+ it { should parse(' ') }
11
+ it { should parse(' ') }
12
+ it { should parse('') }
13
+ it { should_not parse('x') }
14
+ end
15
+
16
+ describe 'colon' do
17
+ it { should parse(':') }
18
+ it { should_not parse('x') }
19
+ end
20
+
21
+ describe 'newline' do
22
+ it { should parse("\n") }
23
+ it { should_not parse("x") }
24
+ end
25
+
26
+ describe 'lbrace' do
27
+ it { should parse("{") }
28
+ it { should_not parse("[") }
29
+ end
30
+
31
+ describe 'rbrace' do
32
+ it { should parse("}") }
33
+ it { should_not parse("]") }
34
+ end
35
+
36
+ describe 'lbracket' do
37
+ it { should parse("[") }
38
+ it { should_not parse("{") }
39
+ end
40
+
41
+ describe 'rbracket' do
42
+ it { should parse("]") }
43
+ it { should_not parse("}") }
44
+ end
45
+
46
+ describe 'identifier' do
47
+ it { should parse('title') }
48
+ it { should parse('t') }
49
+ it { should_not parse(' abcdef') }
50
+ it { should_not parse(' ') }
51
+ it { should_not parse('') }
52
+ end
53
+
54
+ describe 'value' do
55
+ it { should parse('some value') }
56
+ it { should parse(' ahoy ').as(' ahoy ') }
57
+ it { should_not parse('oops}') }
58
+ end
59
+
60
+ describe 'directive' do
61
+ it { should parse('{title:Royals}').as(:directive => {:name => 'title', :value => 'Royals'}) }
62
+ # FIXME: remove trailing space from value
63
+ it { should parse('{ title : Get Lucky }').as(:directive => {:name => 'title', :value => 'Get Lucky '}) }
64
+ it { should parse('{soc}').as(:directive => {:name => 'soc'}) }
65
+ it { should_not parse('{st:oops') }
66
+ end
67
+
68
+ describe 'chord' do
69
+ %w(A Bb C# Dm Edim Fmaj Gsus2 A/C#).each do |chord|
70
+ it { should parse("[#{chord}]").as(:chord => chord) }
71
+ end
72
+
73
+ it { should_not parse('[G') }
74
+ end
75
+
76
+ describe 'lyric' do
77
+ it { should parse("I've never seen") }
78
+ it { should parse(" a diamond in the ")}
79
+ it { should_not parse("in the[") }
80
+ it { should_not parse("in the\n") }
81
+ end
82
+
83
+ describe 'line' do
84
+ it { should parse("[G]You are my sunshine").as(:line => [{:chord => 'G'}, {:lyric => 'You are my sunshine'}]) }
85
+ it { should parse("You make me [C]happy when skies are [G]gray").as(:line => [
86
+ {:lyric => 'You make me '},
87
+ {:chord => 'C'},
88
+ {:lyric => 'happy when skies are '},
89
+ {:chord => 'G'},
90
+ {:lyric => 'gray'}
91
+ ]) }
92
+
93
+ it { should parse("words with a newline\n").as(:line => [{:lyric => "words with a newline"}]) }
94
+ it { should_not parse("foo\nbar") }
95
+ end
96
+
97
+ describe 'song' do
98
+ it do
99
+ song = "{title: I'll Fly Away}\n\n[C]I'll fly away, [C7]oh, glory\n[F]I'll fly [C]away\n"
100
+ should parse(song).as({:song => [
101
+ {:directive => {:name => "title", :value => "I'll Fly Away"}},
102
+ {:newline => "\n"},
103
+ {:line => [{:chord => "C"}, {:lyric => "I'll fly away, "}, {:chord => "C7"}, {:lyric => "oh, glory"}]},
104
+ {:line => [{:chord => "F"}, {:lyric => "I'll fly "}, {:chord => "C"}, {:lyric => "away"}]}
105
+ ]})
106
+
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Examples' do
4
+ Dir[File.expand_path('../fixtures/*.crd', __FILE__)].each do |file|
5
+ name = File.basename(file)
6
+
7
+ describe name, :example => name do
8
+ it 'matches the example' do
9
+ expected = Chordpro.html(File.read(file))
10
+ actual = File.read(file.gsub(/\.crd$/, '.html'))
11
+
12
+ expect(expected).to eq(actual)
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ body {
2
+ font-family: 'Helvetica Neue', 'Helvetica', sans-serif;
3
+ font-size: 13px;
4
+ padding: 20px;
5
+ }
6
+
7
+ .comment {
8
+ color: #999;
9
+ }
10
+
11
+ .chords {
12
+ font-weight: bold;
13
+ }
@@ -0,0 +1,27 @@
1
+ {title: You Are My Sunshine}
2
+
3
+ {c:Verse 1}
4
+ [G]The other night dear as I lay sleeping
5
+ [G7]I dreamed I [C]held you in my [G]arms
6
+ [G7]But when I a[C]woke dear I was mis[G]taken
7
+ So I hung my [D7]head and [G]cried
8
+
9
+ {c:Chorus}
10
+ {soc}
11
+ You are my sunshine my only sunshine
12
+ [G7]You make me [C]happy when skies are [G]gray
13
+ [G7]You'll never [C]know dear how much I [G]love you
14
+ Please don't take [D7]my sunshine a[G]way
15
+ {eoc}
16
+
17
+ {c:Verse 2}
18
+ I'll always love you and make you happy
19
+ [G7]If you will [C]only say the [G]same
20
+ [G7]But if you [C]leave me and love an[G]other
21
+ You'll regret [D7]it all some [G]day
22
+
23
+ {c:Verse 3}
24
+ You told me once dear you really loved me
25
+ [G7]And no one [C]else could come be[G]tween
26
+ [G7]But now you've [C]left me and love an[G]other
27
+ You have shattered [D7]all of my [G]dreams
@@ -0,0 +1,27 @@
1
+ <h1 class="title">You Are My Sunshine</h1>
2
+ <br>
3
+ <span class="comment">Verse 1</span>
4
+ <table><tr class="chords"><td>G</td></tr><tr><td>The other night dear as I lay sleeping</td></tr></table>
5
+ <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>I dreamed I </td><td>held you in my </td><td>arms</td></tr></table>
6
+ <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>But when I a</td><td>woke dear I was mis</td><td>taken</td></tr></table>
7
+ <table><tr class="chords"><td></td><td>D7</td><td>G</td></tr><tr><td>So I hung my </td><td>head and </td><td>cried</td></tr></table>
8
+ <br>
9
+ <span class="comment">Chorus</span>
10
+
11
+ <table><tr class="chords"><td></td></tr><tr><td>You are my sunshine my only sunshine</td></tr></table>
12
+ <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>You make me </td><td>happy when skies are </td><td>gray</td></tr></table>
13
+ <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>You'll never </td><td>know dear how much I </td><td>love you</td></tr></table>
14
+ <table><tr class="chords"><td></td><td>D7</td><td>G</td></tr><tr><td>Please don't take </td><td>my sunshine a</td><td>way</td></tr></table>
15
+
16
+ <br>
17
+ <span class="comment">Verse 2</span>
18
+ <table><tr class="chords"><td></td></tr><tr><td>I'll always love you and make you happy</td></tr></table>
19
+ <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>If you will </td><td>only say the </td><td>same</td></tr></table>
20
+ <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>But if you </td><td>leave me and love an</td><td>other</td></tr></table>
21
+ <table><tr class="chords"><td></td><td>D7</td><td>G</td></tr><tr><td>You'll regret </td><td>it all some </td><td>day</td></tr></table>
22
+ <br>
23
+ <span class="comment">Verse 3</span>
24
+ <table><tr class="chords"><td></td></tr><tr><td>You told me once dear you really loved me</td></tr></table>
25
+ <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>And no one </td><td>else could come be</td><td>tween</td></tr></table>
26
+ <table><tr class="chords"><td>G7</td><td>C</td><td>G</td></tr><tr><td>But now you've </td><td>left me and love an</td><td>other</td></tr></table>
27
+ <table><tr class="chords"><td></td><td>D7</td><td>G</td></tr><tr><td>You have shattered </td><td>all of my </td><td>dreams</td></tr></table>
@@ -0,0 +1 @@
1
+ require 'chordpro'
metadata ADDED
@@ -0,0 +1,139 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chordpro
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Brandon Keepers
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-10-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: parslet
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: guard-rspec
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
+ description: A ruby parser for the chordpro song file format.
84
+ email:
85
+ - brandon@opensoul.org
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - Gemfile
92
+ - Guardfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - chordpro.gemspec
97
+ - lib/chordpro.rb
98
+ - lib/chordpro/html.rb
99
+ - lib/chordpro/parser.rb
100
+ - lib/chordpro/version.rb
101
+ - spec/chordpro/html_spec.rb
102
+ - spec/chordpro/parser_spec.rb
103
+ - spec/example_spec.rb
104
+ - spec/fixtures/example.css
105
+ - spec/fixtures/sunshine.crd
106
+ - spec/fixtures/sunshine.html
107
+ - spec/spec_helper.rb
108
+ homepage: https://github.com/bkeepers/chordpro
109
+ licenses:
110
+ - MIT
111
+ metadata: {}
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - '>='
119
+ - !ruby/object:Gem::Version
120
+ version: '0'
121
+ required_rubygems_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ requirements: []
127
+ rubyforge_project:
128
+ rubygems_version: 2.0.3
129
+ signing_key:
130
+ specification_version: 4
131
+ summary: A ruby parser for the chordpro song file format.
132
+ test_files:
133
+ - spec/chordpro/html_spec.rb
134
+ - spec/chordpro/parser_spec.rb
135
+ - spec/example_spec.rb
136
+ - spec/fixtures/example.css
137
+ - spec/fixtures/sunshine.crd
138
+ - spec/fixtures/sunshine.html
139
+ - spec/spec_helper.rb