-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerator.rb
executable file
·193 lines (167 loc) · 6.39 KB
/
generator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'prawn'
require 'nokogiri'
require 'open-uri'
doc_settings = {
:margin => 30,
:page_size => 'B5',
:info => {
:Title => "あずにゃんとペアプロしてる気分になれる薄い本",
:Author => "まさらっき",
:Creator => "NP-complete",
:CreationDate => Time.parse("2011/8/13 10:00")
}
}
def parse(message)
message.lines.map {|line|
if line =~ /^(\$[\w -_:\/]+)(.*)/
# line = "<font name=\"Courier\">#{$1}</font>#{$2}"
line = "#{$1}#{$2}"
end
line
}.join
end
def title(str, options = nil)
text str, {:align => :center, :character_spacing => 4, :size => 20}.merge(options || {})
move_down 14
end
def maegaki
start_new_page
move_down 200
options = {:align => :center, :size => 14, :character_spacing => 2}
text "この物語は、Railsプログラマの", options
move_down 10
text "平凡な開発風景を淡々と描くものです。", options
move_down 15
text "過度に技術的な期待はしないでください。" , options
end
def atogaki
start_new_page
title "あとがき"
font_size 11
text <<TXT
Rails本だと思った? 残念、アジャイル本でした!!
このサークルでは初参加です。初めてエロ漫画じゃない真面目な本を作りました。
もともとけいおんメンバーがWebサービスを開発して、その開発風景をまとめて本にするという設定で始めました。
最初の案が「楽譜共有サイト」だったんですが、途中まで開発して、さて楽譜のテーブルを作るぞといったところで、自分が全然楽譜が読めないことに気づき断念しました。
楽譜共有サイトだったらキャラ設定とかストーリーとか違和感がなかったのに・・・
そこでネタを変更してSSを作るサービスの開発にとりかかりました。
なぜSSにしたのかというと、SSサイトなら使いながら原稿を書けると思ったから。
0話を見て気づいた人もいると思いますが、まさに自分が作ったサービスを自分でテストとして使って書いた0話です。
サーバにデプロイした次の瞬間から今までのことを思い出して原稿を書き始めました。
りっちゃんと一緒で思い出すのが大変でした。
本当はもっとコードを示してRailsプログラミングの解説をしたかったんですが、いかんせんSSとコードがとても相性が悪く、
見返してみるとRails本ではなく、アジャイル開発の雰囲気を伝える本になってしまいました。
コードは全てgithubに置いてあるのでそちらを見てください。
http://github.com/np-complete/ss_editor
まあ中途半端にコードの解説をするより、読み物としてアジャイル開発が表現できてればいいかなと。
次の本はきちんとコードを書くような本にしたいですね。
今回はhtmlとpdfだったので次回はきちんとTeXで・・・
当サークルは普段、ニコ生でプログラミング風景を生放送するという形で活動しています。
サービスの開発、原稿、アイコンお絵かきの全ての時間をニコ生で放送していました。
今後も開発風景をダダ流ししていくので興味があれば覗いてみてください。
http://com.nicovideo.jp/community/co600306
TXT
move_down 15
text "Enjoy Programming!", :size => 14, :align => :right
move_down 2
text "まさらっき", :size => 14, :align => :right
end
def okutuke
start_new_page
options = {:align => :center, :character_spacing => 1}
title "奥付"
text "「あずにゃんとペアプロしてる気分になれる薄い本」", options.merge(:size => 12)
move_down 40
text "発行", options.merge(:size => 16)
move_down 20
text "NP-complete", options
move_down 10
text "http://np-complete-doj.in/", options
move_down 60
text "著者", options.merge(:size => 16)
move_down 20
text "まさらっき", options
move_down 10
text "http://twitter.com/masarakki", options
move_down 60
text "発行日", options.merge(:size => 16)
move_down 20
text "2011/08/13", options
end
def dialog(image_file, message)
image_size = 28
c_before = cursor
c_image = cursor - image_size
if c_before < image_size
#p "new page #{message}"
start_new_page
dialog(image_file, message)
else
image image_file, :width => image_size, :at => [0, c_before]
text parse(message), :inline_format => true, :margin_left => image_size + 4
c_text = cursor
down_weight = [c_text, c_image].min - image_size / 3
# p "message = #{message}, c_before = #{c_before}, c_text = #{c_text}, c_image = #{c_image}, down = #{down_weight}"
if c_before < c_text
image_size / 3
elsif down_weight > 0
move_down cursor - down_weight
else
start_new_page
end
end
end
def story(id)
# start_new_page
document = Nokogiri::HTML(open("http://ss-park.net/stories/#{id}").read)
title document.css("#main h1").first.text
dialogs = document.css("#main .dialog")
dialogs.each do |dialog|
image_file = File.join("images", File.basename(dialog.css("img").first[:src])).gsub(/\?.*/,'')
message = dialog.css(".message").first.text
dialog image_file, message
end
if File.exists?("text/#{id}.txt")
# move_down 4
text "解説", :styles => [:bold], :size => 8
move_down 2
text File.open("text/#{id}.txt").read
end
move_down 24
end
def fin
start_new_page
text "あずにゃんとペアプロしてる気分になれる薄い本", :align => :center
text "- 完 -", :align => :center
text "しかし開発はまだまだ続く\n<= TO BE CONTINUED." , :align => :right, :valign => :bottom
end
def hyoshi
move_down 60
text "あずにゃんと\nペアプロしてる気分になれる\n薄い本", :size => 60
move_down 220
text "NP-complete", :align => :right, :size => 28
start_new_page
end
def urabyoshi
start_new_page
start_new_page
text "あずにゃんとペアプロしてる気分になれる薄い本 / NP-complete", :align => :right, :valign => :bottom
end
Prawn::Document.generate('test.pdf', doc_settings) do
font "/usr/share/fonts/truetype/ipafont/ipag.ttf"
font_size 11
default_leading 2
hyoshi
maegaki
start_new_page
1.upto(19) do |id|
story(id)
end
fin
atogaki
okutuke
urabyoshi
end