ruhoh 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/Gemfile +13 -0
  2. data/README.md +5 -53
  3. data/Rakefile +56 -0
  4. data/bin/ruhoh +23 -14
  5. data/lib/ruhoh/client/client.rb +310 -0
  6. data/lib/ruhoh/client/help.yml +56 -0
  7. data/lib/ruhoh/compiler.rb +16 -19
  8. data/lib/ruhoh/converters/converter.rb +30 -3
  9. data/lib/ruhoh/db.rb +7 -17
  10. data/lib/ruhoh/deployers/s3.rb +71 -0
  11. data/lib/ruhoh/friend.rb +71 -0
  12. data/lib/ruhoh/page.rb +41 -11
  13. data/lib/ruhoh/parsers/drafts.rb +54 -0
  14. data/lib/ruhoh/parsers/layouts.rb +14 -9
  15. data/lib/ruhoh/parsers/pages.rb +47 -35
  16. data/lib/ruhoh/parsers/partials.rb +14 -2
  17. data/lib/ruhoh/parsers/posts.rb +139 -88
  18. data/lib/ruhoh/parsers/routes.rb +4 -8
  19. data/lib/ruhoh/parsers/site.rb +2 -8
  20. data/lib/ruhoh/previewer.rb +48 -0
  21. data/lib/ruhoh/templaters/base.rb +53 -0
  22. data/lib/ruhoh/templaters/helpers.rb +159 -0
  23. data/lib/ruhoh/templaters/rmustache.rb +29 -0
  24. data/lib/ruhoh/utils.rb +25 -7
  25. data/lib/ruhoh/version.rb +1 -1
  26. data/lib/ruhoh/watch.rb +22 -9
  27. data/lib/ruhoh.rb +74 -29
  28. data/ruhoh.gemspec +70 -9
  29. data/scaffolds/blog/_config.yml +33 -0
  30. data/scaffolds/blog/_drafts/.gitkeep +0 -0
  31. data/scaffolds/blog/_posts/.gitkeep +0 -0
  32. data/scaffolds/blog/_site.yml +16 -0
  33. data/scaffolds/blog/_templates/partials/categories_list +3 -0
  34. data/scaffolds/blog/_templates/partials/pages_list +7 -0
  35. data/scaffolds/blog/_templates/partials/posts_collate +9 -0
  36. data/scaffolds/blog/_templates/partials/posts_list +1 -0
  37. data/scaffolds/blog/_templates/partials/tags_list +3 -0
  38. data/scaffolds/blog/_templates/syntax/google_prettify/default.css +52 -0
  39. data/scaffolds/blog/_templates/syntax/google_prettify/desert.css +34 -0
  40. data/scaffolds/blog/_templates/syntax/google_prettify/sons-of-obsidian.css +117 -0
  41. data/scaffolds/blog/_templates/syntax/google_prettify/sunburst.css +51 -0
  42. data/scaffolds/blog/_templates/syntax/google_prettify/twitter-bootstrap.css +30 -0
  43. data/scaffolds/blog/_templates/themes/twitter/bootstrap/css/bootstrap.min.css +689 -0
  44. data/scaffolds/blog/_templates/themes/twitter/bootstrap/img/glyphicons-halflings-white.png +0 -0
  45. data/scaffolds/blog/_templates/themes/twitter/bootstrap/img/glyphicons-halflings.png +0 -0
  46. data/scaffolds/blog/_templates/themes/twitter/css/style.css +68 -0
  47. data/scaffolds/blog/_templates/themes/twitter/layouts/default.html +64 -0
  48. data/scaffolds/blog/_templates/themes/twitter/layouts/page.html +13 -0
  49. data/scaffolds/blog/_templates/themes/twitter/layouts/post.html +55 -0
  50. data/scaffolds/blog/_templates/themes/twitter/manifest.yml +11 -0
  51. data/scaffolds/blog/about.md +5 -0
  52. data/scaffolds/blog/archive.html +11 -0
  53. data/scaffolds/blog/categories.html +21 -0
  54. data/scaffolds/blog/config.ru +9 -0
  55. data/scaffolds/blog/index.html +13 -0
  56. data/scaffolds/blog/pages.html +14 -0
  57. data/scaffolds/blog/tags.html +21 -0
  58. data/scaffolds/layout.html +3 -0
  59. data/scaffolds/page.html +6 -0
  60. data/scaffolds/post.html +8 -0
  61. data/scaffolds/theme/css/style.css +0 -0
  62. data/scaffolds/theme/images/.gitkeep +0 -0
  63. data/scaffolds/theme/layouts/default.html +17 -0
  64. data/scaffolds/theme/layouts/page.html +7 -0
  65. data/scaffolds/theme/layouts/post.html +8 -0
  66. data/scaffolds/theme/partials/.gitkeep +0 -0
  67. data/spec/db_spec.rb +88 -0
  68. data/spec/page_spec.rb +200 -0
  69. data/spec/parsers/layouts_spec.rb +32 -0
  70. data/spec/parsers/pages_spec.rb +97 -0
  71. data/spec/parsers/posts_spec.rb +301 -0
  72. data/spec/parsers/routes_spec.rb +45 -0
  73. data/spec/parsers/site_spec.rb +32 -0
  74. data/spec/setup_spec.rb +72 -0
  75. data/spec/spec_helper.rb +23 -0
  76. data/system_partials/analytics/getclicky +12 -0
  77. data/system_partials/analytics/google +11 -0
  78. data/system_partials/comments/disqus +13 -0
  79. data/system_partials/comments/facebook +9 -0
  80. data/system_partials/comments/intensedebate +6 -0
  81. data/system_partials/comments/livefyre +6 -0
  82. data/system_partials/syntax/google_prettify +11 -0
  83. metadata +84 -23
  84. data/lib/ruhoh/client.rb +0 -28
  85. data/lib/ruhoh/preview.rb +0 -36
  86. data/lib/ruhoh/templaters/helper_mustache.rb +0 -109
  87. data/lib/ruhoh/templaters/templater.rb +0 -39
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+ gemspec
3
+
4
+ gem 'rake'
5
+ gem 'rack', "~> 1.4"
6
+ gem 'directory_watcher', "~> 1.4"
7
+ gem 'mustache', "~> 0.99"
8
+ gem 'maruku', "~> 0.6"
9
+ gem 'aws-s3'
10
+
11
+ group :development do
12
+ gem 'rspec'
13
+ end
data/README.md CHANGED
@@ -1,57 +1,9 @@
1
- =)
2
-
3
-
4
- ## Setup/Config
5
-
6
- Ruhoh.setup is responsible for building the configuration data.
7
- The config takes a given source directory, parses its \_config.yml
8
- and builds absolute paths to all the Filesystem API endpoints relative to the source directory.
9
-
10
- ## Parsers
11
-
12
- Parsers are small, atomic, functional methods used to process data.
13
- Parsers follow the Ruhoh interface specification, to locate, extract, and process data relative to the source directory.
14
-
15
-
16
- ## DB
17
-
18
- The database is responsible for holding website's main data.
19
- The database depends on Ruhoh.config.
20
- It depends on the parsers to parse the source directory in order to return the data.
21
-
22
-
23
- ## Page
24
-
25
- The page class models a page in the ruhoh system.
26
- A page is technically a post object or a page object.
27
-
28
- - content
29
- - data (includes yaml front matter + url, id etc.)
30
- - sub\_layout
31
- - master\_layout
32
-
33
- ## Converter
34
-
35
- The converter is responsible for converting a pages 'content' into HTML.
36
- A page can be written in various markup formats specified by the page's extension.
37
-
38
- ## Templater
39
-
40
- The templater is responsible for building the finished page by
41
- utilizing the layouts, content, and any embedded templating language expressions.
42
-
43
-
44
- # Compiler
45
-
46
- Compiles the full website
47
-
48
- # Preview
49
-
50
- Serves a singular page view to a web-server identified by its url.
51
-
52
-
53
-
54
1
 
2
+ ## Ruhoh is the Universal Static Blog API
55
3
 
4
+ <http://ruhoh.com>
56
5
 
6
+ ### Usage
57
7
 
8
+ $ gem install ruhoh
9
+ $ ruhoh help
data/Rakefile ADDED
@@ -0,0 +1,56 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib]))
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'bundler'
5
+ require 'ruhoh/version'
6
+ require 'rspec/core/rake_task'
7
+
8
+ name = Dir['*.gemspec'].first.split('.').first
9
+ gemspec_file = "#{name}.gemspec"
10
+ gem_file = "#{name}-#{Ruhoh::VERSION}.gem"
11
+
12
+ task :release => :build do
13
+ #unless `git branch` =~ /^\* master$/
14
+ # puts "You must be on the master branch to release!"
15
+ # exit!
16
+ #end
17
+ sh "git commit --allow-empty -m 'Release #{Ruhoh::VERSION}'"
18
+ sh "git tag v#{Ruhoh::VERSION}"
19
+ sh "git push origin master"
20
+ sh "git push origin v#{Ruhoh::VERSION}"
21
+ sh "gem push pkg/#{name}-#{Ruhoh::VERSION}.gem"
22
+ end
23
+
24
+ task :build => :gemspec do
25
+ sh "mkdir -p pkg"
26
+ sh "gem build #{gemspec_file}"
27
+ sh "mv #{gem_file} pkg"
28
+ end
29
+
30
+ task :gemspec do
31
+ # read spec file and split out manifest section
32
+ spec = File.read(gemspec_file)
33
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
34
+
35
+ # determine file list from git ls-files
36
+ files = `git ls-files`.
37
+ split("\n").
38
+ sort.
39
+ reject { |file| file =~ /^\./ }.
40
+ reject { |file| file =~ /^(rdoc|pkg|coverage)/ }.
41
+ map { |file| " #{file}" }.
42
+ join("\n")
43
+
44
+ # piece file back together and write
45
+ manifest = " s.files = %w[\n#{files}\n ]\n"
46
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
47
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
48
+ puts "Updated #{gemspec_file}"
49
+ end
50
+
51
+ ## Tests
52
+
53
+ RSpec::Core::RakeTask.new('spec')
54
+
55
+ desc "Run tests"
56
+ task :default => :spec
data/bin/ruhoh CHANGED
@@ -3,20 +3,29 @@
3
3
  $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
4
 
5
5
  require 'ruhoh'
6
- require 'ruhoh/client'
6
+ require 'ruhoh/client/client'
7
+ require 'optparse'
7
8
 
8
- help = <<HELP
9
- Ruhoh is the best static blog generator known to mankind.
9
+ Options = Struct.new(:title, :date, :ext, :verbose)
10
+ options = Options.new
10
11
 
11
- Basic Command Line Usage:
12
- Test
13
- HELP
12
+ opt_parser = OptionParser.new do |opts|
13
+ opts.banner = 'Use `ruhoh help` for full command list.'
14
+
15
+ opts.on("-e", "--ext [EXT]", "Specify filename extension. Defaults to '.md' ") do |ext|
16
+ options.ext = ext
17
+ end
18
+
19
+ opts.on("-v", "--[no-]verbose", "Run verbosely. For pages, shows extra title, url meta-data.") do |v|
20
+ options.verbose = v
21
+ end
22
+
23
+ end
24
+ opt_parser.parse!
25
+
26
+ Ruhoh::Client.new({
27
+ :args => ARGV,
28
+ :options => options,
29
+ :opt_parser => opt_parser
30
+ })
14
31
 
15
- case ARGV[0]
16
- when 'new'
17
- Ruhoh::Client.new_blog(ARGV[1])
18
- when 'help'
19
- puts help
20
- else
21
- puts help
22
- end
@@ -0,0 +1,310 @@
1
+ require 'ruhoh/compiler'
2
+
3
+ class Ruhoh
4
+ class Client
5
+
6
+ Paths = Struct.new(:blog_template, :page_template, :post_template, :layout_template, :theme_template)
7
+
8
+ def initialize(data)
9
+ self.setup_paths
10
+ self.setup_options(data)
11
+
12
+ cmd = (data[:args][0] == 'new') ? 'blog' : (data[:args][0] || 'help')
13
+ Ruhoh::Friend.say {
14
+ red "Command not found"
15
+ exit
16
+ } unless self.respond_to?(cmd)
17
+
18
+ Ruhoh.setup unless ['help','blog'].include?(cmd)
19
+
20
+ self.__send__(cmd)
21
+ end
22
+
23
+ def setup_options(data)
24
+ @args = data[:args]
25
+ @options = data[:options]
26
+ @opt_parser = data[:opt_parser]
27
+ @options.ext = (@options.ext || 'md').gsub('.', '')
28
+ end
29
+
30
+ def setup_paths
31
+ @paths = Paths.new
32
+ @paths.blog_template = File.join(Ruhoh::Root, "scaffolds", "blog")
33
+ @paths.page_template = File.join(Ruhoh::Root, "scaffolds", "page.html")
34
+ @paths.post_template = File.join(Ruhoh::Root, "scaffolds", "post.html")
35
+ @paths.layout_template = File.join(Ruhoh::Root, "scaffolds", "layout.html")
36
+ @paths.theme_template = File.join(Ruhoh::Root, "scaffolds", "theme")
37
+ end
38
+
39
+ # Internal: Show Client Utility help documentation.
40
+ def help
41
+ file = File.join(Ruhoh::Root, 'lib', 'ruhoh', 'client', 'help.yml')
42
+ content = Ruhoh::Utils.parse_file_as_yaml(file)
43
+ options = @opt_parser.help
44
+ Ruhoh::Friend.say {
45
+ plain content['description']
46
+ plain ''
47
+ plain options
48
+ plain ''
49
+ plain 'Commands:'
50
+ plain ''
51
+ content['commands'].each do |a|
52
+ green(" " + a["command"])
53
+ plain(" "+ a["desc"])
54
+ end
55
+ }
56
+ end
57
+
58
+ # Public: Create a new draft file.
59
+ # Requires no settings as it is meant to be fastest way to create content.
60
+ def draft
61
+ filename = File.join(Ruhoh.paths.drafts, "#{Time.now.to_i}.#{@options.ext}")
62
+ if File.exist?(filename)
63
+ sleep 1 ; self.write(args) ; exit
64
+ end
65
+
66
+ FileUtils.mkdir_p File.dirname(filename)
67
+ File.open(@paths.post_template) do |template|
68
+ File.open(filename, 'w') do |post|
69
+ post.puts template.read
70
+ end
71
+ end
72
+
73
+ Ruhoh::Friend.say {
74
+ green "New draft:"
75
+ green Ruhoh.relative_path(filename)
76
+ }
77
+ end
78
+
79
+ # Public: Publishes the last active draft file.
80
+ def publish
81
+ id = self.last('draft')
82
+ Ruhoh::Friend.say { yellow "No draft to publish." ; exit } if id.nil?
83
+ Ruhoh::Friend.say { plain "Publishing draft: #{id}" }
84
+ draft = Ruhoh::Parsers::Posts.process_file(id)
85
+
86
+ Ruhoh::Friend.say { red "Draft title cannot be blank." ; exit } unless draft['data']['title']
87
+ Ruhoh::Friend.say {
88
+ red "Invalid date format: #{draft['data']['date']}"
89
+ red "Date format must be YYYY-MM-DD."
90
+ exit
91
+ } unless draft['data']['date']
92
+
93
+ draft['data']['ext'] = @options.ext
94
+ filename = Ruhoh::Parsers::Posts.to_filename(draft['data'])
95
+
96
+ if File.exist?(filename)
97
+ abort("\e[31m Aborted! \e[0m") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
98
+ end
99
+
100
+ FileUtils.mkdir_p File.dirname(filename)
101
+ FileUtils.mv id, filename
102
+
103
+ Ruhoh::Friend.say {
104
+ green "Published post:"
105
+ green Ruhoh.relative_path(filename)
106
+ }
107
+ end
108
+
109
+ # Public: Unpublishes the last active post file.
110
+ def unpublish
111
+ post = self.last('post')
112
+ Ruhoh::Friend.say { yellow "No post to unpublish." ; exit } if post.nil?
113
+ Ruhoh::Friend.say { plain "Unpublishing post: #{post}" }
114
+
115
+ FileUtils.mv post, File.join(Ruhoh.paths.drafts, File.basename(post))
116
+
117
+ Ruhoh::Friend.say {
118
+ yellow "Unpublished post:"
119
+ yellow Ruhoh.relative_path(post)
120
+ }
121
+ end
122
+
123
+ # Public: Create a new page file.
124
+ def page
125
+ name = @args[1]
126
+ Ruhoh::Friend.say {
127
+ red "Please specify a path"
128
+ plain " ex: ruhoh page projects/hello-world"
129
+ exit
130
+ } if (name.nil? || name.gsub(/\s/, '').empty?)
131
+
132
+ filename = File.join(Ruhoh.paths.site_source, name.gsub(/\s/, '-'))
133
+ filename = File.join(filename, "index.#{@options.ext}") if File.extname(filename) == ""
134
+ if File.exist?(filename)
135
+ abort("Create new page: aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
136
+ end
137
+
138
+ FileUtils.mkdir_p File.dirname(filename)
139
+ File.open(@paths.page_template) do |template|
140
+ File.open(filename, 'w') do |page|
141
+ page.puts template.read
142
+ end
143
+ end
144
+
145
+ Ruhoh::Friend.say {
146
+ green "New page:"
147
+ plain Ruhoh.relative_path(filename)
148
+ }
149
+ end
150
+
151
+ # Public: Compile to static website.
152
+ def compile
153
+ Ruhoh::Compiler.new(@args[1]).compile
154
+ end
155
+
156
+ # Public: Create a new blog at the directory provided.
157
+ def blog
158
+ name = @args[1]
159
+ Ruhoh::Friend.say {
160
+ red "Please specify a directory path."
161
+ plain " ex: ruhoh new the-blogist"
162
+ exit
163
+ } if name.nil?
164
+
165
+ target_directory = File.join(Dir.pwd, name)
166
+
167
+ Ruhoh::Friend.say {
168
+ red "#{target_directory} already exists."
169
+ plain " Specify another directory or `rm -rf` this directory first."
170
+ exit
171
+ } if File.exist?(target_directory)
172
+
173
+ FileUtils.mkdir target_directory
174
+ FileUtils.cp_r "#{@paths.blog_template}/.", target_directory
175
+
176
+ Ruhoh::Friend.say {
177
+ green "Blog cloned to:"
178
+ green "#{target_directory}"
179
+ }
180
+ end
181
+
182
+ # Public: Create a new theme scaffold with the given name.
183
+ def theme
184
+ name = @args[1]
185
+ Ruhoh::Friend.say {
186
+ red "Please specify a theme name."
187
+ cyan "ex: ruhoh new theme the-rain"
188
+ exit
189
+ } if name.nil?
190
+
191
+ target_directory = File.expand_path(File.join(Ruhoh.paths.theme, '..', name.gsub(/\s/, '-').downcase))
192
+
193
+ if File.exist?(target_directory)
194
+ abort("Create new theme: \e[31mAborted!\e[0m") if ask("#{target_directory} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
195
+ end
196
+
197
+ FileUtils.mkdir target_directory unless File.exist?(target_directory)
198
+ FileUtils.cp_r "#{@paths.theme_template}/.", target_directory
199
+
200
+ Ruhoh::Friend.say {
201
+ green "New theme scaffold:"
202
+ green target_directory
203
+ }
204
+ end
205
+
206
+ # Public: Create a new layout file for the active theme.
207
+ def layout
208
+ name = @args[1]
209
+ Ruhoh::Friend.say {
210
+ red "Please specify a layout name."
211
+ cyan "ex: ruhoh new layout splash"
212
+ exit
213
+ } if name.nil?
214
+
215
+ filename = File.join(Ruhoh.paths.layouts, name.gsub(/\s/, '-').downcase) + ".html"
216
+ if File.exist?(filename)
217
+ abort("Create new layout: aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
218
+ end
219
+
220
+ FileUtils.mkdir_p File.dirname(filename)
221
+ File.open(@paths.layout_template) do |template|
222
+ File.open(filename, 'w') do |page|
223
+ page.puts template.read
224
+ end
225
+ end
226
+
227
+ Ruhoh::Friend.say {
228
+ green "New layout:"
229
+ plain Ruhoh.relative_path(filename)
230
+ }
231
+ end
232
+
233
+ # Public : List drafts
234
+ def drafts
235
+ self.list(:drafts)
236
+ end
237
+
238
+ # Public : List posts
239
+ def posts
240
+ self.list(:posts)
241
+ end
242
+
243
+ # Public : List pages
244
+ def pages
245
+ self.list(:pages)
246
+ end
247
+
248
+ # Internal: Outputs a list of the given data-type to the terminal.
249
+ def list(type)
250
+ Ruhoh::DB.update(type)
251
+ data = Ruhoh::DB.__send__(type)
252
+ data = data['dictionary'] if type == :posts
253
+
254
+ if @options.verbose
255
+ Ruhoh::Friend.say {
256
+ data.each_value do |p|
257
+ cyan("- #{p['id']}")
258
+ plain(" title: #{p['title']}")
259
+ plain(" url: #{p['url']}")
260
+ end
261
+ }
262
+ else
263
+ Ruhoh::Friend.say {
264
+ data.each_value do |p|
265
+ cyan("- #{p['id']}")
266
+ end
267
+ }
268
+ end
269
+ end
270
+
271
+ # Internal: Get the last active file based on data-type.
272
+ # Note File.ctime is the last time the file was changed as opposed to created.
273
+ # Returns: String file id, where id is the relative path to the file.
274
+ def last(type)
275
+ self.get_files(type).sort_by { |f| File.ctime(f) }.last || nil
276
+ end
277
+
278
+ # Internal: Get an Array list of file ids based on the data-type.
279
+ # Returns: Array of file ids (ids are relative paths to the file.)
280
+ def get_files(type)
281
+ case type
282
+ when 'post'
283
+ Ruhoh::Parsers::Posts.files
284
+ when 'draft'
285
+ Ruhoh::Parsers::Drafts.files
286
+ when 'page'
287
+ Ruhoh::Parsers::Pages.files
288
+ else
289
+ Ruhoh::Friend.say { red "Type: '#{type}' not supported." }
290
+ exit
291
+ end
292
+ end
293
+
294
+ def ask(message, valid_options)
295
+ if valid_options
296
+ answer = get_stdin("#{message} #{valid_options.to_s.gsub(/"/, '').gsub(/, /,'/')} ") while !valid_options.include?(answer)
297
+ else
298
+ answer = get_stdin(message)
299
+ end
300
+ answer
301
+ end
302
+
303
+ def get_stdin(message)
304
+ print message
305
+ STDIN.gets.chomp
306
+ end
307
+
308
+
309
+ end #Client
310
+ end #Ruhoh
@@ -0,0 +1,56 @@
1
+ ---
2
+ description: |
3
+
4
+ Ruhoh is a nifty, modular static blog generator.
5
+ It is the Universal Static Blog API.
6
+ Visit http://www.ruhoh.com for complete usage and documentation.
7
+
8
+ commands:
9
+ -
10
+ "command" : "new <directory_path>"
11
+ "desc" : |
12
+ Create a new blog directory based on the Ruhoh specification.
13
+ -
14
+ "command" : "compile"
15
+ "desc" : |
16
+ Compile to static website.
17
+ -
18
+ "command" : "draft"
19
+ "desc" : |
20
+ Create a new draft.
21
+ -
22
+ "command" : "publish"
23
+ "desc" : |
24
+ Publish the last active draft file.
25
+ -
26
+ "command" : "unpublish"
27
+ "desc" : |
28
+ UnPublish the last active post file.
29
+ -
30
+ "command" : "page <path>"
31
+ "desc" : |
32
+ Create a new page at the given path.
33
+ -
34
+ "command" : "drafts"
35
+ "desc" : |
36
+ List all drafts.
37
+ -
38
+ "command" : "posts"
39
+ "desc" : |
40
+ List all posts.
41
+ -
42
+ "command" : "pages"
43
+ "desc" : |
44
+ List all pages.
45
+ -
46
+ "command" : "layout <name>"
47
+ "desc" : |
48
+ Create a new layout for the currently active theme.
49
+ -
50
+ "command" : "theme <name>"
51
+ "desc" : |
52
+ Create a new theme scaffold.
53
+ -
54
+ "command" : "help"
55
+ "desc" : |
56
+ Show this menu.
@@ -2,17 +2,19 @@ class Ruhoh
2
2
 
3
3
  class Compiler
4
4
 
5
- def initialize(target_directory = './_compiled')
6
- Ruhoh::DB.initialize
7
- @target = target_directory
5
+ def initialize(target_directory)
6
+ Ruhoh::DB.update!
7
+ @target = target_directory || "./#{Ruhoh.folders.compiled}"
8
8
  @page = Ruhoh::Page.new
9
9
  end
10
10
 
11
11
  def compile
12
- FileUtils.mkdir @target unless File.exist?(@target)
12
+ FileUtils.rm_r @target if File.exist?(@target)
13
+ FileUtils.mkdir @target
13
14
  self.theme
14
15
  self.pages
15
16
  self.media
17
+ self.syntax
16
18
  end
17
19
 
18
20
  def pages
@@ -21,38 +23,33 @@ class Ruhoh
21
23
  FileUtils.cd(@target) {
22
24
  Ruhoh::DB.posts['dictionary'].merge(Ruhoh::DB.pages).each_value do |p|
23
25
  @page.change(p['id'])
24
-
26
+
25
27
  FileUtils.mkdir_p File.dirname(@page.compiled_path)
26
28
  File.open(@page.compiled_path, 'w') { |p| p.puts @page.render }
27
29
 
28
- processed << path
30
+ processed << p
31
+ Ruhoh::Friend.say { green "processed: #{p['id']}" }
29
32
  end
30
33
  }
31
34
 
32
- puts "=> Posts Processed:"
33
- puts processed
34
35
  end
35
36
 
36
37
  def theme
37
- FileUtils.mkdir_p File.join(@target, Ruhoh.config.asset_path)
38
+ FileUtils.mkdir_p File.join(@target, Ruhoh.config.theme_path)
38
39
  FileUtils.cp_r Ruhoh.paths.theme, File.join(@target, Ruhoh.folders.templates, Ruhoh.folders.themes)
39
40
  end
40
41
 
41
42
  def media
42
43
  FileUtils.mkdir_p File.join(@target, Ruhoh.folders.media)
43
- FileUtils.cp_r Ruhoh.paths.media, File.join(@target)
44
+ FileUtils.cp_r Ruhoh.paths.media, @target
44
45
  end
45
46
 
46
- def write_data
47
- File.open(Ruhoh.paths.database + '/posts_dictionary.yml', 'w') { |page|
48
- page.puts Ruhoh::DB.posts.to_yaml
49
- }
50
-
51
- File.open(Ruhoh.paths.database + '/pages_dictionary.yml', 'w') { |page|
52
- page.puts Ruhoh::DB.pages.to_yaml
53
- }
47
+ def syntax
48
+ syntax_path = File.join(@target, Ruhoh.folders.templates, Ruhoh.folders.syntax)
49
+ FileUtils.mkdir_p syntax_path
50
+ FileUtils.cp_r "#{Ruhoh.paths.syntax}/.", syntax_path
54
51
  end
55
-
52
+
56
53
  end #Compiler
57
54
 
58
55
  end #Ruhoh
@@ -4,14 +4,41 @@ class Ruhoh
4
4
 
5
5
  module Converter
6
6
 
7
+ MarkdownExtensions = ['.md', '.markdown']
8
+ TextileExtensions = ['.textile']
9
+
7
10
  def self.convert(page)
8
- if ['.md', '.markdown'].include? File.extname(page.data['id']).downcase
9
- Maruku.new(page.content).to_html
11
+ self.__send__ self.which_converter(page.data['id']), page
12
+ end
13
+
14
+ def self.which_converter(filename)
15
+ extension = File.extname(filename).downcase
16
+
17
+ if MarkdownExtensions.include? extension
18
+ :markdown
19
+ elsif TextileExtensions.include? extension
20
+ :textile
10
21
  else
11
- page.content
22
+ :none
12
23
  end
13
24
  end
14
25
 
26
+ # Markdown
27
+ def self.markdown(page)
28
+ Maruku.new(page.content).to_html
29
+ end
30
+
31
+ # Textile
32
+ # sample implementation
33
+ def self.textile(page)
34
+ 'textile not supported yet =('
35
+ end
36
+
37
+ # No converter
38
+ def self.none(page)
39
+ page.content
40
+ end
41
+
15
42
  end #Converter
16
43
 
17
44
  end #Ruhoh