neruda 0.0.10 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/bin/pablo +105 -246
- data/lib/neruda/config.rb +94 -0
- data/lib/neruda/config/lisp_config.rb +201 -0
- data/lib/neruda/config/org-config.el +17 -0
- data/lib/neruda/config/ox-neruda.el +88 -0
- data/lib/neruda/index.rb +108 -0
- data/lib/neruda/index/atom_generator.rb +86 -0
- data/lib/neruda/index/org_generator.rb +92 -0
- data/lib/neruda/org_file.rb +266 -0
- data/lib/neruda/org_file/class_methods.rb +55 -0
- data/lib/neruda/org_file/extracter.rb +61 -0
- data/lib/neruda/org_file/htmlizer.rb +78 -0
- data/lib/neruda/preview.rb +53 -0
- data/lib/neruda/templater.rb +111 -0
- data/lib/neruda/utils.rb +130 -0
- data/lib/neruda/version.rb +5 -0
- data/lib/tasks/org.rake +69 -0
- data/lib/tasks/site.rake +84 -0
- data/lib/tasks/sync.rake +30 -0
- data/locales/en.yml +18 -0
- data/locales/fr.yml +18 -0
- data/themes/default/css/style.css +216 -0
- data/themes/default/fonts/Yanone_Kaffeesatz_400.woff +0 -0
- data/themes/default/fonts/Yanone_Kaffeesatz_400.woff2 +0 -0
- metadata +145 -39
- data/README.md +0 -98
- data/docs/Rakefile.example +0 -4
- data/docs/config.yml.example +0 -17
- data/lib/assets/chapter.slim +0 -14
- data/lib/assets/index.slim +0 -13
- data/lib/assets/layout.slim +0 -17
- data/lib/assets/style.css +0 -199
- data/lib/neruda.rb +0 -112
- data/lib/neruda/chapter.rb +0 -26
- data/lib/neruda/url.rb +0 -14
- data/lib/tasks/book.rake +0 -60
- data/lib/tasks/capistrano/chapters.rake +0 -60
- data/lib/tasks/capistrano/sinatra.rake +0 -18
- data/lib/tasks/chapters.rake +0 -132
- data/lib/tasks/sinatra.rake +0 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7f3224292de6de88d025190d293fd0e9043f2cb54832986410975343887be77d
|
4
|
+
data.tar.gz: aaf3bf95cf510fc67cd0dcab3f6c9a65d2153ed676b4300c068dda01bfca6241
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 662711c6423eea8c5c554c53761f23e56260fe8c022685d62ef8b234e6ef89f9bffd85707ff8e39e96c460096817bd52964111ad4f2f86f4b8945856e64be693
|
7
|
+
data.tar.gz: 6b95b730be8814ed2d9af07452b34caa6ac07ef58bdfcaef8c653ec901081392e2c2c1e5c85fa392e698a292566b69c25a24297e52beecabe1f8b2211426c141
|
data/bin/pablo
CHANGED
@@ -1,283 +1,142 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# coding: utf-8
|
3
2
|
# frozen_string_literal: true
|
4
3
|
|
5
|
-
require '
|
6
|
-
require 'rainbow'
|
4
|
+
require 'rake'
|
7
5
|
require 'optparse'
|
8
|
-
require '
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
capfile = File.new('Capfile', 'a')
|
36
|
-
capfile.write <<~CAPFILE
|
37
|
-
neruda_spec = Gem::Specification.find_by_name 'neruda'
|
38
|
-
Dir.glob("\#{neruda_spec.gem_dir}/lib/tasks/*.rake").each { |r| import r }
|
39
|
-
Dir.glob("\#{neruda_spec.gem_dir}/lib/tasks/capistrano/*.rake").each { |r| import r }
|
40
|
-
CAPFILE
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
# Methods used with pablo init method
|
45
|
-
module PabloInit
|
46
|
-
def init_path
|
47
|
-
FileUtils.mkdir_p 'config'
|
48
|
-
FileUtils.mkdir_p 'public'
|
49
|
-
FileUtils.mkdir_p 'tmp/pids'
|
50
|
-
FileUtils.mkdir_p 'private/characters'
|
51
|
-
FileUtils.mkdir_p 'private/sceneries'
|
52
|
-
FileUtils.mkdir_p 'private/chapters'
|
53
|
-
FileUtils.mkdir_p 'private/notes'
|
54
|
-
FileUtils.mkdir_p 'private/epubs'
|
55
|
-
end
|
56
|
-
|
57
|
-
def init_config
|
58
|
-
config = {}
|
59
|
-
print 'Name of your website: '
|
60
|
-
config['title'] = STDIN.gets.strip
|
61
|
-
print 'Your author name: '
|
62
|
-
config['author'] = STDIN.gets.strip
|
63
|
-
print 'Main language of your website [en_US]: '
|
64
|
-
lang = STDIN.gets.strip
|
65
|
-
lang = 'en_US' if lang == ''
|
66
|
-
config['lang'] = lang
|
67
|
-
|
68
|
-
main_title = config['title'].tr(' ', '_').downcase.gsub(/[^a-z0-9_]/, '')
|
69
|
-
print "Filename of the main generated epub [#{main_title}]: "
|
70
|
-
epub = STDIN.gets.strip
|
71
|
-
if epub == ''
|
72
|
-
epub = main_title
|
6
|
+
require 'r18n-core'
|
7
|
+
require 'neruda/utils'
|
8
|
+
require 'neruda/version'
|
9
|
+
|
10
|
+
R18n.set(Neruda::Config.settings['lang'],
|
11
|
+
File.expand_path('../locales', __dir__))
|
12
|
+
|
13
|
+
# Pablo commands
|
14
|
+
module PabloCommands
|
15
|
+
def pablo_init
|
16
|
+
cnf = @options.merge
|
17
|
+
cnf.delete(:verbose)
|
18
|
+
cnf.delete(:directory)
|
19
|
+
cnf.transform_keys!(&:to_s)
|
20
|
+
Neruda::Config.save(Neruda::Config.settings.merge(cnf))
|
21
|
+
@rake.options.build_all = true
|
22
|
+
@rake.invoke_task('org:install')
|
23
|
+
o = Neruda::OrgFile.new('src/index.org', @options)
|
24
|
+
o.write unless File.exist? 'src/index.org'
|
25
|
+
end
|
26
|
+
alias_method :pablo_config, :pablo_init
|
27
|
+
|
28
|
+
def pablo_build(file = ARGV[0])
|
29
|
+
@rake.options.build_all = true
|
30
|
+
if file.nil?
|
31
|
+
@rake.invoke_task('site:build')
|
73
32
|
else
|
74
|
-
|
33
|
+
@rake.invoke_task("site:build:one[#{file}]")
|
75
34
|
end
|
76
|
-
config['book_filename'] = epub
|
77
|
-
config['chapters'] = []
|
78
|
-
|
79
|
-
IO.write 'config/config.yml', config.to_yaml
|
80
35
|
end
|
81
36
|
|
82
|
-
def
|
83
|
-
|
84
|
-
FileUtils.cp_r File.join(__dir__, '../lib/assets'), 'views'
|
85
|
-
end
|
86
|
-
|
87
|
-
return if File.exist? 'public/style.css'
|
88
|
-
FileUtils.mv 'views/style.css', 'public/style.css'
|
37
|
+
def pablo_preview
|
38
|
+
@rake.invoke_task('site:preview')
|
89
39
|
end
|
90
40
|
|
91
|
-
def
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
return if File.exist? 'config.ru'
|
97
|
-
IO.write 'config.ru', <<~CONFIG
|
98
|
-
# frozen_string_literal: true
|
41
|
+
def pablo_open
|
42
|
+
filename = ARGV[0] || new_file_name
|
43
|
+
FileUtils.mkdir_p File.dirname(filename)
|
44
|
+
o = Neruda::OrgFile.new(filename, @options)
|
45
|
+
o.write unless File.exist? filename
|
99
46
|
|
100
|
-
|
101
|
-
|
102
|
-
|
47
|
+
editor = ENV['EDITOR'] || ENV['VISUAL'] || 'emacs'
|
48
|
+
cmd = [editor, filename]
|
49
|
+
cmd.insert(1, '+6') if editor.match?(/^emacs/)
|
50
|
+
system(*cmd)
|
103
51
|
end
|
104
52
|
|
105
|
-
def
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
#
|
113
|
-
# if
|
114
|
-
|
115
|
-
|
116
|
-
# markup_gem = "gem 'kramdown'\ngem 'org-ruby'"
|
117
|
-
# else
|
118
|
-
# markup_gem = 'gem \'org-ruby\''
|
119
|
-
# end
|
120
|
-
markup_gem = 'gem \'org-ruby\''
|
121
|
-
|
122
|
-
IO.write 'Gemfile', <<~GEMFILE
|
123
|
-
# frozen_string_literal: true
|
124
|
-
|
125
|
-
source 'https://rubygems.org'
|
126
|
-
|
127
|
-
gem 'neruda'
|
128
|
-
#{markup_gem}
|
129
|
-
|
130
|
-
group :development do
|
131
|
-
gem 'capistrano'
|
132
|
-
gem 'capistrano-bundler'
|
133
|
-
gem 'capistrano-rvm'
|
134
|
-
gem 'rubocop'
|
135
|
-
end
|
136
|
-
GEMFILE
|
137
|
-
puts ''
|
138
|
-
puts 'To complete this installation, you must now run: ' +
|
139
|
-
Rainbow('bundle install').yellow
|
53
|
+
def pablo_help(command = 'basic', error = false)
|
54
|
+
warn R18n.t.pablo.error.no_command if error
|
55
|
+
command = 'basic' unless Neruda::Utils::PABLO_COMMANDS.include?(command)
|
56
|
+
cmd_opt = Neruda::Utils::PABLO_COMMANDS[command]
|
57
|
+
label = cmd_opt[:label] || command
|
58
|
+
warn "Usage: pablo #{label} [options]\n\n"
|
59
|
+
warn cmd_opt[:desc] + "\n\n" if cmd_opt.has_key?(:desc)
|
60
|
+
warn "Options\n#{Neruda::Utils.summarize_command(command)}\n"
|
61
|
+
warn "Commands\n#{Neruda::Utils.list_commands}\n" if command == 'basic'
|
62
|
+
exit 1 if error
|
63
|
+
exit
|
140
64
|
end
|
141
65
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
init_rackup
|
151
|
-
puts ''
|
152
|
-
puts Rainbow('Neruda has been successfully installed.').green
|
153
|
-
init_bundler if bundler_is_present?
|
66
|
+
private
|
67
|
+
|
68
|
+
def new_file_name
|
69
|
+
title = @options[:title]
|
70
|
+
title = 'new' if title.nil? || title == ''
|
71
|
+
filename = Neruda::OrgFile.slug title
|
72
|
+
return "#{filename}.org" unless @options[:directory]
|
73
|
+
"#{filename}/index.org"
|
154
74
|
end
|
155
75
|
end
|
156
76
|
|
157
77
|
# Main pablo class
|
158
78
|
class Pablo
|
159
|
-
def initialize
|
160
|
-
@options = {
|
161
|
-
|
162
|
-
}
|
163
|
-
@available_commands = ['capify', 'list', 'start', 'edit',
|
164
|
-
'setup', 'stop', 'compile']
|
165
|
-
|
166
|
-
parse_options
|
167
|
-
# Be sure required directories are always there
|
168
|
-
init_path unless @arg == 'setup'
|
169
|
-
route_command
|
79
|
+
def initialize(opts = {})
|
80
|
+
@options = { verbose: false }.merge(opts)
|
81
|
+
init_rake
|
170
82
|
end
|
171
83
|
|
172
|
-
|
173
|
-
if @arg == 'stop'
|
174
|
-
rake_or_bundle_run ['rake', 'sinatra:stop']
|
175
|
-
return
|
176
|
-
end
|
177
|
-
|
178
|
-
ARGV.shift
|
179
|
-
send @arg
|
180
|
-
end
|
84
|
+
include PabloCommands
|
181
85
|
|
182
86
|
private
|
183
87
|
|
184
|
-
def
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
@arg = 'start'
|
190
|
-
elsif @arg == 'init'
|
191
|
-
@arg = 'setup'
|
192
|
-
end
|
88
|
+
def init_rake
|
89
|
+
init_rakefile unless File.exist?('Rakefile')
|
90
|
+
@rake = Rake.application
|
91
|
+
Rake.verbose(false) unless @options[:verbose]
|
92
|
+
@rake.raw_load_rakefile
|
193
93
|
end
|
194
94
|
|
195
|
-
def
|
196
|
-
|
197
|
-
|
198
|
-
Usage:
|
199
|
-
pablo -h
|
200
|
-
pablo [ -v ] command
|
201
|
-
|
202
|
-
HELP
|
203
|
-
opts.on('-v', '--verbose', 'Output more information') do
|
204
|
-
@options[:verbose] = true
|
205
|
-
end
|
206
|
-
opts.on('-h', '--help', 'Display this screen') do
|
207
|
-
STDERR.puts opts
|
208
|
-
STDERR.puts
|
209
|
-
pablo_help
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
optparse.parse!
|
214
|
-
|
215
|
-
handle_aliases
|
216
|
-
|
217
|
-
if !File.exist?('config/config.yml') && @arg != 'setup'
|
218
|
-
STDERR.puts Rainbow('ERROR: please run pablo setup before all').red
|
219
|
-
exit 1
|
220
|
-
end
|
221
|
-
return if @available_commands.include?(@arg)
|
222
|
-
STDERR.puts Rainbow('ERROR: no or unknown command given.').red
|
223
|
-
STDERR.puts Rainbow('Run pablo -h for options and available ' \
|
224
|
-
'commands').red
|
225
|
-
exit 1
|
226
|
-
end
|
227
|
-
|
228
|
-
include BundlerHelper
|
229
|
-
include PabloInit
|
230
|
-
|
231
|
-
def pablo_help
|
232
|
-
STDERR.puts <<~HELP
|
233
|
-
Book Commands:
|
234
|
-
new [title] Begin to write a new chapter
|
235
|
-
edit [title] Continue the writing of a chapter
|
236
|
-
compile Generate the epubs files
|
237
|
-
list [elements] List various book elements
|
238
|
-
(chapters, characters, notes, sceneries)
|
95
|
+
def init_rakefile
|
96
|
+
rakefile = <<~RAKE
|
97
|
+
# frozen_string_literal: true
|
239
98
|
|
240
|
-
|
241
|
-
|
242
|
-
(you just need to do it once).
|
243
|
-
start Start a test web server
|
244
|
-
stop Stop the web server
|
245
|
-
HELP
|
246
|
-
exit
|
247
|
-
end
|
99
|
+
require 'neruda/config'
|
100
|
+
require 'r18n-core'
|
248
101
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
102
|
+
neruda_spec = Gem::Specification.find_by_name 'neruda'
|
103
|
+
R18n.set(Neruda::Config.settings['lang'] || 'en',
|
104
|
+
"\#{neruda_spec.gem_dir}/locales")
|
105
|
+
R18n::Filters.on(:named_variables)
|
253
106
|
|
254
|
-
|
255
|
-
compile
|
107
|
+
Dir.glob("\#{neruda_spec.gem_dir}/lib/tasks/*.rake").each { |r| import r }
|
256
108
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
else
|
261
|
-
puts Rainbow('>> Neruda is run in production environment <<').yellow
|
262
|
-
end
|
263
|
-
puts ''
|
264
|
-
rake_or_bundle_run ['rake', 'sinatra:start']
|
109
|
+
task default: 'site:build'
|
110
|
+
RAKE
|
111
|
+
IO.write 'Rakefile', rakefile
|
265
112
|
end
|
113
|
+
end
|
266
114
|
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
end
|
274
|
-
rake_or_bundle_run ['rake', "chapters:create_or_edit[#{title}]"]
|
115
|
+
params = {}
|
116
|
+
optparser = OptionParser.new do |opts|
|
117
|
+
opts.version = Neruda::VERSION
|
118
|
+
Neruda::Utils::PABLO_OPTIONS.each do |k, opt|
|
119
|
+
short, long = Neruda::Utils.decorate_option(k)
|
120
|
+
opts.send(opt[:meth] || :on, short, long, opt[:desc])
|
275
121
|
end
|
122
|
+
end
|
123
|
+
optparser.parse!(into: params)
|
276
124
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
end
|
125
|
+
if params[:version]
|
126
|
+
warn optparser.ver
|
127
|
+
exit
|
281
128
|
end
|
282
129
|
|
283
|
-
|
130
|
+
if ARGV[0] == 'help'
|
131
|
+
params[:help] = true
|
132
|
+
ARGV.shift
|
133
|
+
end
|
134
|
+
pablo = Pablo.new(params)
|
135
|
+
command = "pablo_#{ARGV[0]}".to_sym
|
136
|
+
err = command.nil? || !pablo.respond_to?(command)
|
137
|
+
pablo.pablo_help(ARGV[0], err) if err || params[:help]
|
138
|
+
ARGV.shift
|
139
|
+
|
140
|
+
init_cmds = ['pablo_init', 'pablo_config']
|
141
|
+
pablo.pablo_init unless File.exist?('config.yml') || init_cmds.include?(command)
|
142
|
+
pablo.send command
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'neruda/config/lisp_config'
|
5
|
+
|
6
|
+
module Neruda
|
7
|
+
# Wrapper for configuration
|
8
|
+
#
|
9
|
+
# This class is a singleton interface, which share the static website
|
10
|
+
# being build settings among different steps or tasks.
|
11
|
+
#
|
12
|
+
# It expects the website author to holds their custom settings in a
|
13
|
+
# YAML file named ~config.yml~ available at the root of their
|
14
|
+
# project.
|
15
|
+
#
|
16
|
+
# For example, with the given config file:
|
17
|
+
#
|
18
|
+
# #+begin_src
|
19
|
+
# ---
|
20
|
+
# title: My website
|
21
|
+
# author: Alice Doe
|
22
|
+
# #+end_src
|
23
|
+
#
|
24
|
+
# Settings will be available like this:
|
25
|
+
#
|
26
|
+
# #+begin_src
|
27
|
+
# Neruda::Config.settings['author']
|
28
|
+
# => "Alice Doe"
|
29
|
+
# #+end_src
|
30
|
+
class Config
|
31
|
+
extend Neruda::LispConfig
|
32
|
+
|
33
|
+
class << self
|
34
|
+
# Access the current website settings
|
35
|
+
#
|
36
|
+
# If the settings have not been loaded yet, this method is
|
37
|
+
# responsible for calling the one, which actually loads them.
|
38
|
+
#
|
39
|
+
# @return [Hash] the website settings
|
40
|
+
def settings
|
41
|
+
return load_settings unless @config
|
42
|
+
@config
|
43
|
+
end
|
44
|
+
|
45
|
+
# Save the settings given as a parameter to the ~config.yml~ file.
|
46
|
+
#
|
47
|
+
# Not only this method overwrite the old settings, but it replace
|
48
|
+
# the current shared settings with the ones given in
|
49
|
+
# parameter. Later call to
|
50
|
+
# {file:Neruda/Config.html#settings-class_method settings}
|
51
|
+
# will, obviously, use these new settings.
|
52
|
+
#
|
53
|
+
# @param new_config [Hash] the settings to save
|
54
|
+
# @return [Hash] the new settings after save
|
55
|
+
def save(new_config)
|
56
|
+
IO.write 'config.yml', new_config.to_yaml
|
57
|
+
@config = new_config.freeze
|
58
|
+
end
|
59
|
+
|
60
|
+
# Load the given settings as if they comes from the ~config.yml~ file.
|
61
|
+
#
|
62
|
+
# This method is handy for testing purpose. Later call to
|
63
|
+
# {file:Neruda/Config.html#settings-class_method settings} will
|
64
|
+
# use these new settings.
|
65
|
+
#
|
66
|
+
# @param config [Hash] the settings to artificially load
|
67
|
+
# @return [Hash] the new settings
|
68
|
+
def load_test(config)
|
69
|
+
@config = config
|
70
|
+
add_default_settings
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def load_settings
|
76
|
+
@config = {}
|
77
|
+
conf = 'config.yml'
|
78
|
+
@config = YAML.load_file(conf) if File.exist? conf
|
79
|
+
add_default_settings
|
80
|
+
@config.freeze
|
81
|
+
end
|
82
|
+
|
83
|
+
def add_default_settings
|
84
|
+
@config['lang'] ||= 'en'
|
85
|
+
@config['author'] ||= (ENV['USER'] || '')
|
86
|
+
@config['domain'] ||= ''
|
87
|
+
@config['public_folder'] ||= 'public_html'
|
88
|
+
@config['templates'] ||= []
|
89
|
+
return if @config['blog_path'].nil?
|
90
|
+
@config['blog_pattern'] ||= '**/*.org'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|