songbookize 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Creator/capo.rb +5 -5
- data/Creator/html_formatter.rb +5 -0
- data/Creator/latex_formatter.rb +2 -2
- data/Creator/slideable_song.slim +5 -0
- data/Creator/song.slim +60 -57
- data/Creator/songbook.coffee +22 -0
- data/Rakefile +17 -3
- data/Songbookize.md +154 -0
- data/bin/songbookize +28 -0
- data/template.tex +3 -0
- metadata +92 -6
- data/bin/bookize +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 17bb2cdb82cadab3871c628e9a5e2b5f27df93da
|
4
|
+
data.tar.gz: 2f2f873b506e890dd6eacbe4f1dd4501cfcb0720
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: da3d29f7e87ba694d2173692d67aecacf745473c65107fa65afd396d73614e77d53565a9d4c4487f5bff735f072eee6173c52287bc1d2ee069783f83c4b63389
|
7
|
+
data.tar.gz: 7217631176f13d507bb3ebe8be51775593e7121ebea536352cff66fdd55a5060092b4f78fd914fff27625dcaf0ee5f1f1e6aa0af96d89afb73ded70cb55fd8f9
|
data/Creator/capo.rb
CHANGED
@@ -2,17 +2,17 @@ class Song
|
|
2
2
|
def capo!(fret)
|
3
3
|
capo_melody!(fret) unless melody.nil? or melody.empty?
|
4
4
|
verses.each{|v| v.capo!(fret)}
|
5
|
-
%[key K].each{|k| info[k] = Song.capo(info[k], fret) if info.include?(k)}
|
5
|
+
%w[key K].each{|k| info[k] = Song.capo(info[k], fret) if info.include?(k)}
|
6
6
|
return self
|
7
7
|
end
|
8
8
|
|
9
9
|
OCTAVE ||= %w[A Bb B C Db D Eb E F Gb G Ab]
|
10
10
|
def self.capo(chord, fret)
|
11
|
-
idx = OCTAVE.index(chord[0])
|
12
|
-
range = 0
|
11
|
+
idx = OCTAVE.index(chord[0..1])
|
12
|
+
range = 0..1
|
13
13
|
if idx.nil? then
|
14
|
-
idx = OCTAVE.index(chord[0
|
15
|
-
range = 0
|
14
|
+
idx = OCTAVE.index(chord[0])
|
15
|
+
range = 0
|
16
16
|
end
|
17
17
|
raise StandardError.new("Unknown Chords #{chord}!") if idx.nil?
|
18
18
|
|
data/Creator/html_formatter.rb
CHANGED
@@ -4,6 +4,7 @@ require 'date'
|
|
4
4
|
require 'slim'
|
5
5
|
require 'ostruct'
|
6
6
|
require 'kramdown'
|
7
|
+
require 'coffee-script'
|
7
8
|
require_relative 'song'
|
8
9
|
|
9
10
|
class Song
|
@@ -70,6 +71,10 @@ class SongBook
|
|
70
71
|
File.write("#{dir}/#{song.slug}.html", Slim::Template.new(File.join(File.dirname(__FILE__),'song.slim')).render(scope))
|
71
72
|
File.write("#{dir}/#{song.slug}_slideable.html", Slim::Template.new(File.join(File.dirname(__FILE__),'slideable_song.slim')).render(scope))
|
72
73
|
end
|
74
|
+
Dir["#{File.dirname(__FILE__)}/*.coffee"].each do |c|
|
75
|
+
log.debug "Compiling #{c}"
|
76
|
+
File.write("#{dir}/#{File.basename(c, ".coffee")}.js", CoffeeScript.compile(File.read(c)))
|
77
|
+
end
|
73
78
|
FileUtils.cp Dir["#{File.dirname(__FILE__)}/resources/*"], "#{dir}/"
|
74
79
|
end
|
75
80
|
end
|
data/Creator/latex_formatter.rb
CHANGED
@@ -10,7 +10,7 @@ class Song
|
|
10
10
|
res = lyrics.dup
|
11
11
|
chords.each do |chord, pos|
|
12
12
|
cmd = %|\\ch{#{chord}}|
|
13
|
-
res = res.ljust(pos + offset + 1).insert(pos + offset, cmd)
|
13
|
+
res = res.ljust(pos + offset + 1, " ").insert(pos + offset, cmd) # Note, this is a unicode emspace
|
14
14
|
offset += cmd.length
|
15
15
|
end
|
16
16
|
|
@@ -40,7 +40,7 @@ class Song
|
|
40
40
|
end
|
41
41
|
parts << "\\section{#{title}}"
|
42
42
|
parts << "\\songdesc{#{desc}}\n\n" if desc
|
43
|
-
parts << "\\#{(melody.nil? or melody.empty?) ? "nm" : ""}songinfo{#{"Key of #{key}"}}{#{author}}"
|
43
|
+
parts << "\\#{(melody.nil? or melody.empty?) ? "nm" : ""}songinfo{#{key.empty? ? "No Key Specified" : "Key of #{key}"}}{#{author}}"
|
44
44
|
parts << "\\melody{#{slug}001.eps}" unless melody.nil? or melody.empty?
|
45
45
|
# parts << "\\begin{abc}[name=#{title.downcase.gsub(/[^\w]/, "")}]\n#{melody}\\end{abc}" unless melody.nil? or melody.empty?
|
46
46
|
# parts << "\\begin{lilypond}[quoted,staffsize=26]\n#{lilypond}\\end{lilypond}" unless melody.nil? or melody.empty?
|
data/Creator/slideable_song.slim
CHANGED
@@ -10,6 +10,7 @@ html
|
|
10
10
|
javascript:
|
11
11
|
window.ABCJS.plugin.auto_render_threshold = 100;
|
12
12
|
window.ABCJS.plugin.hide_abc = true;
|
13
|
+
script src="songbook.js"
|
13
14
|
sass:
|
14
15
|
body
|
15
16
|
max-width: 1000px
|
@@ -131,4 +132,8 @@ coffee:
|
|
131
132
|
verse_index++ if verse_index < verses.length - 1
|
132
133
|
when "Backspace"
|
133
134
|
window.history.back()
|
135
|
+
when "ArrowUp"
|
136
|
+
window.transposeUp()
|
137
|
+
when "ArrowDown"
|
138
|
+
window.transposeDown()
|
134
139
|
updateVerses()
|
data/Creator/song.slim
CHANGED
@@ -5,68 +5,71 @@ html
|
|
5
5
|
/ style type="text/css"==open(URI.encode("https://fonts.googleapis.com/css?family=Bitter:400,700|Muli:300,400,i|Montserrat:400,700|Fira+Mono|Junge")).read
|
6
6
|
script src="abcjs_basic_2.3-min.js"
|
7
7
|
script src="abcjs_plugin_2.3-min.js"
|
8
|
+
script src="https://d3js.org/d3.v4.min.js"
|
8
9
|
javascript:
|
9
10
|
window.ABCJS.plugin.auto_render_threshold = 100;
|
10
11
|
window.ABCJS.plugin.hide_abc = true;
|
11
|
-
|
12
|
-
body
|
13
|
-
max-width: 1000px
|
14
|
-
margin: auto
|
15
|
-
padding-top: 50px
|
16
|
-
font-family: 'Junge'
|
17
|
-
.lyrics
|
18
|
-
line-height: 140%
|
19
|
-
font-size: 140%
|
20
|
-
overflow-y: hidden
|
21
|
-
transform-origin: top
|
22
|
-
clear: both
|
23
|
-
font-family: 'Junge'
|
24
|
-
margin: auto
|
25
|
-
width: fit-content
|
26
|
-
padding-top: 1em
|
12
|
+
script src="songbook.js"
|
27
13
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
color: #08c
|
45
|
-
.chorusindicator
|
46
|
-
color: #0a5
|
47
|
-
font-weight: bold
|
48
|
-
text-align: center
|
49
|
-
.chorus
|
50
|
-
color: #083
|
51
|
-
.author, .key
|
52
|
-
font-family: 'Lora', serif
|
53
|
-
font-size: 140%
|
54
|
-
text-align: center
|
55
|
-
font-style: italic
|
14
|
+
sass:
|
15
|
+
body
|
16
|
+
max-width: 1000px
|
17
|
+
margin: auto
|
18
|
+
padding-top: 50px
|
19
|
+
font-family: 'Junge'
|
20
|
+
.lyrics
|
21
|
+
line-height: 140%
|
22
|
+
font-size: 140%
|
23
|
+
overflow-y: hidden
|
24
|
+
transform-origin: top
|
25
|
+
clear: both
|
26
|
+
font-family: 'Junge'
|
27
|
+
margin: auto
|
28
|
+
width: fit-content
|
29
|
+
padding-top: 1em
|
56
30
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
31
|
+
.chordlyrics
|
32
|
+
font-family: 'Fira Mono', monospace
|
33
|
+
.abcrendered
|
34
|
+
margin: auto
|
35
|
+
h2
|
36
|
+
text-align: center
|
37
|
+
.order
|
38
|
+
position: relative
|
39
|
+
top: 10
|
40
|
+
left: 0
|
41
|
+
float: right
|
42
|
+
font-size: 26px
|
43
|
+
font-family: 'Fira Mono', sans
|
44
|
+
.chords
|
45
|
+
font-family: 'Fira Mono', monospace
|
46
|
+
font-weight: bold
|
47
|
+
color: #08c
|
48
|
+
.chorusindicator
|
49
|
+
color: #0a5
|
50
|
+
font-weight: bold
|
51
|
+
text-align: center
|
52
|
+
.chorus
|
53
|
+
color: #083
|
54
|
+
.author, .key
|
55
|
+
font-family: 'Lora', serif
|
56
|
+
font-size: 140%
|
57
|
+
text-align: center
|
58
|
+
font-style: italic
|
59
|
+
|
60
|
+
.author
|
61
|
+
float: right
|
62
|
+
margin-right: 120px
|
63
|
+
.key
|
64
|
+
float: left
|
65
|
+
margin-left: 120px
|
66
|
+
.desc
|
67
|
+
clear: both
|
68
|
+
margin-bottom: 2em
|
69
|
+
.melody
|
70
|
+
background: none
|
71
|
+
border: none
|
72
|
+
clear: both
|
70
73
|
body
|
71
74
|
.order=song.order
|
72
75
|
a name=song.slug
|
@@ -0,0 +1,22 @@
|
|
1
|
+
OCTAVE = "A Bb B C Db D Eb E F Gb G Ab".split(" ")
|
2
|
+
window.capo = (chord, fret) ->
|
3
|
+
idx = OCTAVE.indexOf(chord[0..1])
|
4
|
+
start = 2
|
5
|
+
if idx < 0
|
6
|
+
idx = OCTAVE.indexOf(chord[0])
|
7
|
+
start = 1
|
8
|
+
throw new Exception("Unknown chord #{chord}") if idx < 0
|
9
|
+
return "#{OCTAVE[(idx + fret) % OCTAVE.length]}#{chord[start..-1]}"
|
10
|
+
|
11
|
+
window.transpose = (steps) ->
|
12
|
+
d3.selectAll(".chords").each (c) ->
|
13
|
+
$(this).text $(this).text().replace(/[^\s]+/g, (t) -> capo(t, steps))
|
14
|
+
|
15
|
+
window.currentTranspose = 0
|
16
|
+
window.transposeUp = ->
|
17
|
+
window.currentTranspose += 1
|
18
|
+
window.transpose 1
|
19
|
+
|
20
|
+
window.transposeDown = ->
|
21
|
+
window.currentTranspose -= 1
|
22
|
+
window.transpose -1
|
data/Rakefile
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require_relative 'Creator/parser.rb'
|
3
|
+
require_relative 'Creator/capo.rb'
|
3
4
|
require_relative 'Creator/latex_formatter.rb'
|
4
5
|
require_relative 'Creator/html_formatter.rb'
|
5
6
|
require_relative 'Creator/midi_formatter.rb'
|
@@ -7,6 +8,7 @@ require_relative 'Creator/midi_formatter.rb'
|
|
7
8
|
def book
|
8
9
|
unless $book
|
9
10
|
$book = SongBook.parse("Songs")
|
11
|
+
# $book.songs.each{|s| s.capo!(2) }
|
10
12
|
$book.preface = `tail -n+3 Readme.md | pandoc -t latex`
|
11
13
|
end
|
12
14
|
$book
|
@@ -37,35 +39,47 @@ task :preview => [:parse, :eps, :reorder] do
|
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
40
|
-
|
42
|
+
desc "Builds PDF out of songbook."
|
43
|
+
task :pdf => [:parse, :eps, :reorder] do
|
41
44
|
Dir.chdir("latex") do
|
42
45
|
book.build(filename:book_name)
|
43
46
|
end
|
44
47
|
end
|
45
48
|
|
49
|
+
desc "Builds a booklet PDF out of songbook."
|
46
50
|
task :booklet => [:parse, :eps, :reorder] do
|
47
51
|
Dir.chdir("latex") do
|
48
52
|
book.build(booklet:true, filename:"#{book_name}let")
|
49
53
|
end
|
50
54
|
end
|
51
55
|
|
56
|
+
desc "Converts songbook into HTML"
|
52
57
|
task :html => [:parse, :reorder] do
|
53
58
|
book.to_html("html")
|
54
59
|
end
|
55
60
|
|
61
|
+
desc "Creates midi files for all songs with .abc tunes"
|
56
62
|
task :midi => [:parse, :reorder] do
|
57
63
|
book.to_midi("html/midi")
|
58
64
|
end
|
59
65
|
|
66
|
+
desc "Creates javascript / JSON descriptions of the songbook"
|
60
67
|
task :info => [:parse] do
|
61
68
|
File.write("html/#{book_name}.json", book.json_info)
|
62
69
|
File.write("html/#{book_name}.js", book.jsonp_info)
|
63
70
|
File.write("html/songbook.json", book.json_info)
|
64
71
|
end
|
65
72
|
|
66
|
-
|
73
|
+
desc "Creates a portable single file archive of the songbook"
|
74
|
+
task :yaml => [:parse] do
|
75
|
+
File.write("html/#{book_name}.yml", book.to_yaml)
|
67
76
|
end
|
68
77
|
|
78
|
+
desc "Attempts full build of all output types"
|
79
|
+
task :default => [:midi, :html, :info, :pdf, :booklet] do
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Creates a tex file for each individual song"
|
69
83
|
task :songtex do
|
70
84
|
b = SongBook.parse("Songs")
|
71
85
|
Dir.chdir("latex") do
|
@@ -91,5 +105,5 @@ end
|
|
91
105
|
task :publish => [:preview, :booklet, :info] do
|
92
106
|
raise StandardError.new("Uncommited changes") unless `git status -s`.empty?
|
93
107
|
system("git push")
|
94
|
-
system("scp -r latex/#{book_name}.pdf latex/#{book_name}let.pdf latex/#{book_name}.json
|
108
|
+
system("scp -r latex/#{book_name}.pdf latex/#{book_name}let.pdf latex/#{book_name}.json #{book.info["remote_location"]}")
|
95
109
|
end
|
data/Songbookize.md
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
# Songbookize
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
`songbookize` is a ruby gem and command for generating songbooks in the same
|
6
|
+
style as [Zach's Songbook](http://zachcapalbo.com/projects/songbook.html). You
|
7
|
+
can refer to the [source code for Zach's Songbook](https://gitlab.com/zach-geek/songbook)
|
8
|
+
for reference.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
### Songbookize Gem
|
13
|
+
|
14
|
+
Installing the `songbookize` command is as simple as
|
15
|
+
|
16
|
+
```
|
17
|
+
gem install songbookize
|
18
|
+
```
|
19
|
+
|
20
|
+
This is enough to compile songbooks into HTML or YAML.
|
21
|
+
|
22
|
+
### Latex Dependencies
|
23
|
+
|
24
|
+
In order to generate the nice pdf songbooks and songbooklets, you'll need to
|
25
|
+
have LaTeX and a number of packages installed. If you're on Linux, the best
|
26
|
+
way to install everything is to install everything in the [Dockerfile](https://hub.docker.com/r/zachgeek/songbook-builder/~/dockerfile/).
|
27
|
+
|
28
|
+
On Windows, you can make it work with a LaTeX package like [MiKTeX](https://miktex.org/),
|
29
|
+
but it's tricky. Good luck.
|
30
|
+
|
31
|
+
### Docker Image
|
32
|
+
|
33
|
+
If installing all of the dependencies is too much work, there's a handy
|
34
|
+
[Docker Image](https://hub.docker.com/r/zachgeek/songbook-builder/) you can use
|
35
|
+
instead.
|
36
|
+
|
37
|
+
To use it, run something like:
|
38
|
+
|
39
|
+
```
|
40
|
+
docker run --rm -ti -v /path/to/your/songbook:/songbook zachgeek/songbook-builder
|
41
|
+
```
|
42
|
+
|
43
|
+
## Songbook Layout
|
44
|
+
|
45
|
+
Your songbook should be contained in its own folder, with all of the `.chords`
|
46
|
+
and `.abc` files living in the `Songs` subdirectory.
|
47
|
+
|
48
|
+
### Chords Format
|
49
|
+
|
50
|
+
The `.chords` format for songs is intended to be an easy, human readable way for
|
51
|
+
encoding song lyrics and chords.
|
52
|
+
|
53
|
+
#### Header
|
54
|
+
|
55
|
+
`.chords` files begin with a small yaml header:
|
56
|
+
|
57
|
+
```
|
58
|
+
---
|
59
|
+
title: A Song
|
60
|
+
key: A
|
61
|
+
desc: This is an example song
|
62
|
+
---
|
63
|
+
```
|
64
|
+
|
65
|
+
None of the header items are required, but some common ones are
|
66
|
+
|
67
|
+
- **title**: The song's title
|
68
|
+
- **key**: The musical key that the song is played in
|
69
|
+
- **desc**: A description of the song
|
70
|
+
|
71
|
+
#### Chords and Lyrics
|
72
|
+
|
73
|
+
After the header, chords are written with the chords on the line directly above
|
74
|
+
the lyrics that they correspond to. This is a format that has been commonplace
|
75
|
+
on the internet for decades. E.g.:
|
76
|
+
|
77
|
+
```
|
78
|
+
C F G
|
79
|
+
This is a song about nothing
|
80
|
+
C F G Am
|
81
|
+
It doesn't mean anything at all
|
82
|
+
```
|
83
|
+
|
84
|
+
Lyrics don't have to have chords corresponding to them. Simply omit the chord
|
85
|
+
lines, and the verses will be picked up as being without chords. E.g.:
|
86
|
+
|
87
|
+
```
|
88
|
+
This is the second verse
|
89
|
+
But you know the chords from the first
|
90
|
+
```
|
91
|
+
|
92
|
+
You can denote that the a chorus by putting `[Chorus:]` before it. Then, to
|
93
|
+
refer to the chorus, you can just use `[Chorus]`
|
94
|
+
|
95
|
+
#### Example
|
96
|
+
|
97
|
+
So, our whole demo song from before might come out looking like:
|
98
|
+
|
99
|
+
```
|
100
|
+
---
|
101
|
+
title: A Song
|
102
|
+
key: A
|
103
|
+
desc: This is an example song
|
104
|
+
---
|
105
|
+
|
106
|
+
C F G
|
107
|
+
This is a song about nothing
|
108
|
+
C F G Am
|
109
|
+
It doesn't mean anything at all
|
110
|
+
|
111
|
+
[Chorus:]
|
112
|
+
F G
|
113
|
+
This is the chorus
|
114
|
+
D C
|
115
|
+
It has different chords
|
116
|
+
|
117
|
+
This is the second verse
|
118
|
+
But you know the chords from the first
|
119
|
+
|
120
|
+
[Chorus]
|
121
|
+
|
122
|
+
And here's one more verse
|
123
|
+
Just for good measure, for good measure!
|
124
|
+
```
|
125
|
+
|
126
|
+
### ABC Format
|
127
|
+
|
128
|
+
[ABC Notation](http://abcnotation.com/) is a popular text format for inscribing
|
129
|
+
melodies. Songbookize will use standard tools to parse it, so you should refer
|
130
|
+
to [online references](http://abcnotation.com/) for more information on writing
|
131
|
+
ABC notation.
|
132
|
+
|
133
|
+
A song can have a `.abc` file, a `.chords`, file, or both. If both files are
|
134
|
+
specified for a given song, both the melody and the chords will be displayed.
|
135
|
+
|
136
|
+
### songbook.yml
|
137
|
+
|
138
|
+
`songbook.yml` describes the songbook. There are a few important keys:
|
139
|
+
|
140
|
+
- **title**: Sets the title of the song book
|
141
|
+
- **include**: Specifies a table of paths with a list of songs to copy.
|
142
|
+
|
143
|
+
For instance, you might have:
|
144
|
+
|
145
|
+
```
|
146
|
+
---
|
147
|
+
title: An Example Songbook
|
148
|
+
include:
|
149
|
+
"/path/to/other/songbook/Songs":
|
150
|
+
- a_song
|
151
|
+
- a_nother_song
|
152
|
+
"/path/to/other/otherSongbook/Songs":
|
153
|
+
- a_nother_nother_song
|
154
|
+
```
|
data/bin/songbookize
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rake'
|
3
|
+
require 'pry'
|
4
|
+
|
5
|
+
Rake::TaskManager.record_task_metadata = true
|
6
|
+
load "#{File.dirname(__FILE__)}/../Rakefile"
|
7
|
+
|
8
|
+
if ARGV.include?('-h') or ARGV.include?('--help') then
|
9
|
+
puts "songbookize compiles a song book into html and pdf files."
|
10
|
+
puts "usage: songbookize [task]"
|
11
|
+
puts "task may be:"
|
12
|
+
puts
|
13
|
+
Rake.application.tasks.reject {|t| t.comment.nil?}.each do |t|
|
14
|
+
puts " #{t.name.ljust(20)} #{t.comment}"
|
15
|
+
end
|
16
|
+
puts
|
17
|
+
puts "default is used if no task is specified."
|
18
|
+
exit
|
19
|
+
end
|
20
|
+
|
21
|
+
yml_file = ARGV.find{|a| a.downcase.end_with?(".yml") and File.exist?(a) }
|
22
|
+
|
23
|
+
unless yml_file.nil? then
|
24
|
+
$book = YAML.load(File.read(yml_file))
|
25
|
+
ARGV.delete(yml_file)
|
26
|
+
end
|
27
|
+
|
28
|
+
Rake.application[ARGV[0] || 'default'].invoke
|
data/template.tex
CHANGED
@@ -9,6 +9,7 @@
|
|
9
9
|
\setlength{\columnsep}{0.1cm}
|
10
10
|
|
11
11
|
\newunicodechar{☺}{{\fontspec{DejaVu Sans}☺}}
|
12
|
+
\newunicodechar{ }{{\fontspec{DejaVu Sans} }}
|
12
13
|
|
13
14
|
\setlength{\oddsidemargin}{2.0cm}
|
14
15
|
\setlength{\evensidemargin}{2.5cm}
|
@@ -20,6 +21,8 @@
|
|
20
21
|
\setdvipstargetpages
|
21
22
|
\fi
|
22
23
|
|
24
|
+
\setpdftargetpages
|
25
|
+
|
23
26
|
\ifprintoption % tweak dvi output only for final printing
|
24
27
|
\special{!TeXDict begin /landplus90{true}store end}
|
25
28
|
\special{!TeXDict begin <</Tumble true>> setpagedevice end}
|
metadata
CHANGED
@@ -1,19 +1,103 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: songbookize
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zach Capalbo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
11
|
+
date: 2018-02-07 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: slim
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sass
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '10'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '10'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: json
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.8'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.8'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: kramdown
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: coffee-script
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '1'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '1'
|
13
97
|
description: Generate your own PDF/HTML songbook.
|
14
98
|
email: zach.geek@gmail.com
|
15
99
|
executables:
|
16
|
-
-
|
100
|
+
- songbookize
|
17
101
|
extensions: []
|
18
102
|
extra_rdoc_files: []
|
19
103
|
files:
|
@@ -25,14 +109,16 @@ files:
|
|
25
109
|
- Creator/slideable_song.slim
|
26
110
|
- Creator/song.rb
|
27
111
|
- Creator/song.slim
|
112
|
+
- Creator/songbook.coffee
|
28
113
|
- Creator/songbook.slim
|
29
114
|
- Creator/tv.slim
|
30
115
|
- LICENSE
|
31
116
|
- Rakefile
|
32
117
|
- Readme.md
|
33
|
-
-
|
118
|
+
- Songbookize.md
|
119
|
+
- bin/songbookize
|
34
120
|
- template.tex
|
35
|
-
homepage: https://
|
121
|
+
homepage: https://gitlab.com/zach-geek/songbook
|
36
122
|
licenses:
|
37
123
|
- MIT
|
38
124
|
metadata: {}
|