songbookize 0.0.1 → 0.0.2
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/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: {}
|