nanoc 2.0.4 → 2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. data/ChangeLog +31 -1
  2. data/LICENSE +1 -1
  3. data/README +63 -3
  4. data/Rakefile +59 -12
  5. data/bin/nanoc +7 -199
  6. data/lib/nanoc.rb +83 -12
  7. data/lib/nanoc/base/asset.rb +113 -0
  8. data/lib/nanoc/base/asset_defaults.rb +21 -0
  9. data/lib/nanoc/base/asset_rep.rb +277 -0
  10. data/lib/nanoc/base/binary_filter.rb +44 -0
  11. data/lib/nanoc/base/code.rb +41 -0
  12. data/lib/nanoc/base/compiler.rb +46 -34
  13. data/lib/nanoc/base/core_ext/hash.rb +51 -7
  14. data/lib/nanoc/base/core_ext/string.rb +8 -0
  15. data/lib/nanoc/base/data_source.rb +253 -20
  16. data/lib/nanoc/base/defaults.rb +30 -0
  17. data/lib/nanoc/base/enhancements.rb +9 -84
  18. data/lib/nanoc/base/filter.rb +109 -6
  19. data/lib/nanoc/base/layout.rb +91 -0
  20. data/lib/nanoc/base/notification_center.rb +66 -0
  21. data/lib/nanoc/base/page.rb +94 -126
  22. data/lib/nanoc/base/page_defaults.rb +20 -0
  23. data/lib/nanoc/base/page_rep.rb +318 -0
  24. data/lib/nanoc/base/plugin.rb +57 -9
  25. data/lib/nanoc/base/proxies/asset_proxy.rb +29 -0
  26. data/lib/nanoc/base/proxies/asset_rep_proxy.rb +26 -0
  27. data/lib/nanoc/base/proxies/layout_proxy.rb +25 -0
  28. data/lib/nanoc/base/proxies/page_proxy.rb +35 -0
  29. data/lib/nanoc/base/proxies/page_rep_proxy.rb +28 -0
  30. data/lib/nanoc/base/proxy.rb +37 -0
  31. data/lib/nanoc/base/router.rb +72 -0
  32. data/lib/nanoc/base/site.rb +219 -88
  33. data/lib/nanoc/base/template.rb +64 -0
  34. data/lib/nanoc/binary_filters/image_science_thumbnail.rb +28 -0
  35. data/lib/nanoc/cli.rb +1 -0
  36. data/lib/nanoc/cli/base.rb +219 -0
  37. data/lib/nanoc/cli/cli.rb +16 -0
  38. data/lib/nanoc/cli/command.rb +105 -0
  39. data/lib/nanoc/cli/commands/autocompile.rb +80 -0
  40. data/lib/nanoc/cli/commands/compile.rb +273 -0
  41. data/lib/nanoc/cli/commands/create_layout.rb +85 -0
  42. data/lib/nanoc/cli/commands/create_page.rb +85 -0
  43. data/lib/nanoc/cli/commands/create_site.rb +327 -0
  44. data/lib/nanoc/cli/commands/create_template.rb +76 -0
  45. data/lib/nanoc/cli/commands/help.rb +69 -0
  46. data/lib/nanoc/cli/commands/info.rb +114 -0
  47. data/lib/nanoc/cli/commands/switch.rb +141 -0
  48. data/lib/nanoc/cli/commands/update.rb +91 -0
  49. data/lib/nanoc/cli/ext.rb +37 -0
  50. data/lib/nanoc/cli/logger.rb +66 -0
  51. data/lib/nanoc/cli/option_parser.rb +168 -0
  52. data/lib/nanoc/data_sources/filesystem.rb +645 -224
  53. data/lib/nanoc/data_sources/filesystem_combined.rb +495 -0
  54. data/lib/nanoc/extra/auto_compiler.rb +265 -0
  55. data/lib/nanoc/extra/context.rb +22 -0
  56. data/lib/nanoc/extra/core_ext/hash.rb +54 -0
  57. data/lib/nanoc/extra/core_ext/time.rb +13 -0
  58. data/lib/nanoc/extra/file_proxy.rb +29 -0
  59. data/lib/nanoc/extra/vcs.rb +48 -0
  60. data/lib/nanoc/extra/vcses/bazaar.rb +21 -0
  61. data/lib/nanoc/extra/vcses/dummy.rb +20 -0
  62. data/lib/nanoc/extra/vcses/git.rb +21 -0
  63. data/lib/nanoc/extra/vcses/mercurial.rb +21 -0
  64. data/lib/nanoc/extra/vcses/subversion.rb +21 -0
  65. data/lib/nanoc/filters/bluecloth.rb +13 -0
  66. data/lib/nanoc/filters/erb.rb +6 -22
  67. data/lib/nanoc/filters/erubis.rb +14 -0
  68. data/lib/nanoc/filters/haml.rb +7 -23
  69. data/lib/nanoc/filters/markaby.rb +5 -5
  70. data/lib/nanoc/filters/maruku.rb +14 -0
  71. data/lib/nanoc/filters/old.rb +19 -0
  72. data/lib/nanoc/filters/rdiscount.rb +13 -0
  73. data/lib/nanoc/filters/rdoc.rb +5 -4
  74. data/lib/nanoc/filters/redcloth.rb +14 -0
  75. data/lib/nanoc/filters/rubypants.rb +14 -0
  76. data/lib/nanoc/filters/sass.rb +13 -0
  77. data/lib/nanoc/helpers/blogging.rb +170 -0
  78. data/lib/nanoc/helpers/capturing.rb +59 -0
  79. data/lib/nanoc/helpers/html_escape.rb +23 -0
  80. data/lib/nanoc/helpers/link_to.rb +69 -0
  81. data/lib/nanoc/helpers/render.rb +47 -0
  82. data/lib/nanoc/helpers/tagging.rb +52 -0
  83. data/lib/nanoc/helpers/xml_sitemap.rb +58 -0
  84. data/lib/nanoc/routers/default.rb +54 -0
  85. data/lib/nanoc/routers/no_dirs.rb +66 -0
  86. data/lib/nanoc/routers/versioned.rb +79 -0
  87. metadata +112 -22
  88. data/lib/nanoc/base/auto_compiler.rb +0 -132
  89. data/lib/nanoc/base/layout_processor.rb +0 -33
  90. data/lib/nanoc/base/page_proxy.rb +0 -31
  91. data/lib/nanoc/base/plugin_manager.rb +0 -33
  92. data/lib/nanoc/data_sources/database.rb +0 -259
  93. data/lib/nanoc/data_sources/trivial.rb +0 -145
  94. data/lib/nanoc/filters/markdown.rb +0 -13
  95. data/lib/nanoc/filters/smartypants.rb +0 -13
  96. data/lib/nanoc/filters/textile.rb +0 -13
  97. data/lib/nanoc/layout_processors/erb.rb +0 -35
  98. data/lib/nanoc/layout_processors/haml.rb +0 -38
  99. data/lib/nanoc/layout_processors/markaby.rb +0 -16
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nanoc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.4
4
+ version: "2.1"
5
5
  platform: ruby
6
6
  authors:
7
7
  - Denis Defreyne
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-05-04 00:00:00 +02:00
12
+ date: 2008-08-17 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -19,8 +19,8 @@ executables:
19
19
  - nanoc
20
20
  extensions: []
21
21
 
22
- extra_rdoc_files: []
23
-
22
+ extra_rdoc_files:
23
+ - README
24
24
  files:
25
25
  - README
26
26
  - LICENSE
@@ -29,41 +29,131 @@ files:
29
29
  - bin/nanoc
30
30
  - lib/nanoc
31
31
  - lib/nanoc/base
32
- - lib/nanoc/base/auto_compiler.rb
32
+ - lib/nanoc/base/asset.rb
33
+ - lib/nanoc/base/asset_defaults.rb
34
+ - lib/nanoc/base/asset_rep.rb
35
+ - lib/nanoc/base/binary_filter.rb
36
+ - lib/nanoc/base/code.rb
33
37
  - lib/nanoc/base/compiler.rb
34
38
  - lib/nanoc/base/core_ext
35
39
  - lib/nanoc/base/core_ext/hash.rb
40
+ - lib/nanoc/base/core_ext/string.rb
36
41
  - lib/nanoc/base/data_source.rb
42
+ - lib/nanoc/base/defaults.rb
37
43
  - lib/nanoc/base/enhancements.rb
38
44
  - lib/nanoc/base/filter.rb
39
- - lib/nanoc/base/layout_processor.rb
45
+ - lib/nanoc/base/layout.rb
46
+ - lib/nanoc/base/notification_center.rb
40
47
  - lib/nanoc/base/page.rb
41
- - lib/nanoc/base/page_proxy.rb
48
+ - lib/nanoc/base/page_defaults.rb
49
+ - lib/nanoc/base/page_rep.rb
42
50
  - lib/nanoc/base/plugin.rb
43
- - lib/nanoc/base/plugin_manager.rb
51
+ - lib/nanoc/base/proxies
52
+ - lib/nanoc/base/proxies/asset_proxy.rb
53
+ - lib/nanoc/base/proxies/asset_rep_proxy.rb
54
+ - lib/nanoc/base/proxies/layout_proxy.rb
55
+ - lib/nanoc/base/proxies/page_proxy.rb
56
+ - lib/nanoc/base/proxies/page_rep_proxy.rb
57
+ - lib/nanoc/base/proxy.rb
58
+ - lib/nanoc/base/router.rb
44
59
  - lib/nanoc/base/site.rb
60
+ - lib/nanoc/base/template.rb
61
+ - lib/nanoc/binary_filters
62
+ - lib/nanoc/binary_filters/image_science_thumbnail.rb
63
+ - lib/nanoc/cli
64
+ - lib/nanoc/cli/base.rb
65
+ - lib/nanoc/cli/cli.rb
66
+ - lib/nanoc/cli/command.rb
67
+ - lib/nanoc/cli/commands
68
+ - lib/nanoc/cli/commands/autocompile.rb
69
+ - lib/nanoc/cli/commands/compile.rb
70
+ - lib/nanoc/cli/commands/create_layout.rb
71
+ - lib/nanoc/cli/commands/create_page.rb
72
+ - lib/nanoc/cli/commands/create_site.rb
73
+ - lib/nanoc/cli/commands/create_template.rb
74
+ - lib/nanoc/cli/commands/help.rb
75
+ - lib/nanoc/cli/commands/info.rb
76
+ - lib/nanoc/cli/commands/switch.rb
77
+ - lib/nanoc/cli/commands/update.rb
78
+ - lib/nanoc/cli/ext.rb
79
+ - lib/nanoc/cli/logger.rb
80
+ - lib/nanoc/cli/option_parser.rb
81
+ - lib/nanoc/cli.rb
45
82
  - lib/nanoc/data_sources
46
- - lib/nanoc/data_sources/database.rb
47
83
  - lib/nanoc/data_sources/filesystem.rb
48
- - lib/nanoc/data_sources/trivial.rb
84
+ - lib/nanoc/data_sources/filesystem_combined.rb
85
+ - lib/nanoc/extra
86
+ - lib/nanoc/extra/auto_compiler.rb
87
+ - lib/nanoc/extra/context.rb
88
+ - lib/nanoc/extra/core_ext
89
+ - lib/nanoc/extra/core_ext/hash.rb
90
+ - lib/nanoc/extra/core_ext/time.rb
91
+ - lib/nanoc/extra/file_proxy.rb
92
+ - lib/nanoc/extra/vcs.rb
93
+ - lib/nanoc/extra/vcses
94
+ - lib/nanoc/extra/vcses/bazaar.rb
95
+ - lib/nanoc/extra/vcses/dummy.rb
96
+ - lib/nanoc/extra/vcses/git.rb
97
+ - lib/nanoc/extra/vcses/mercurial.rb
98
+ - lib/nanoc/extra/vcses/subversion.rb
49
99
  - lib/nanoc/filters
100
+ - lib/nanoc/filters/bluecloth.rb
50
101
  - lib/nanoc/filters/erb.rb
102
+ - lib/nanoc/filters/erubis.rb
51
103
  - lib/nanoc/filters/haml.rb
52
104
  - lib/nanoc/filters/markaby.rb
53
- - lib/nanoc/filters/markdown.rb
105
+ - lib/nanoc/filters/maruku.rb
106
+ - lib/nanoc/filters/old.rb
107
+ - lib/nanoc/filters/rdiscount.rb
54
108
  - lib/nanoc/filters/rdoc.rb
55
- - lib/nanoc/filters/smartypants.rb
56
- - lib/nanoc/filters/textile.rb
57
- - lib/nanoc/layout_processors
58
- - lib/nanoc/layout_processors/erb.rb
59
- - lib/nanoc/layout_processors/haml.rb
60
- - lib/nanoc/layout_processors/markaby.rb
109
+ - lib/nanoc/filters/redcloth.rb
110
+ - lib/nanoc/filters/rubypants.rb
111
+ - lib/nanoc/filters/sass.rb
112
+ - lib/nanoc/helpers
113
+ - lib/nanoc/helpers/blogging.rb
114
+ - lib/nanoc/helpers/capturing.rb
115
+ - lib/nanoc/helpers/html_escape.rb
116
+ - lib/nanoc/helpers/link_to.rb
117
+ - lib/nanoc/helpers/render.rb
118
+ - lib/nanoc/helpers/tagging.rb
119
+ - lib/nanoc/helpers/xml_sitemap.rb
120
+ - lib/nanoc/routers
121
+ - lib/nanoc/routers/default.rb
122
+ - lib/nanoc/routers/no_dirs.rb
123
+ - lib/nanoc/routers/versioned.rb
61
124
  - lib/nanoc.rb
62
- has_rdoc: false
125
+ has_rdoc: true
63
126
  homepage: http://nanoc.stoneship.org/
64
- post_install_message:
65
- rdoc_options: []
66
-
127
+ post_install_message: |-
128
+ ------------------------------------------------------------------------------
129
+ Thanks for installing nanoc 2.1! Here are some resources to help you get started:
130
+
131
+ * The tutorial at <http://nanoc.stoneship.org/help/tutorial/>
132
+ * The manual at <http://nanoc.stoneship.org/help/manual/>
133
+ * The discussion group at <http://groups.google.com/group/nanoc>
134
+
135
+ Because nanoc 2.1 has a lot of new features, be sure to check out the nanoc blog at <http://nanoc.stoneship.org/blog/> for details about this release.
136
+
137
+ Enjoy!
138
+ ------------------------------------------------------------------------------
139
+ rdoc_options:
140
+ - --title
141
+ - nanoc
142
+ - --main
143
+ - README
144
+ - --charset
145
+ - utf-8
146
+ - --exclude
147
+ - lib/nanoc/cli/commands
148
+ - --exclude
149
+ - lib/nanoc/binary_filters
150
+ - --exclude
151
+ - lib/nanoc/extra/vcses
152
+ - --exclude
153
+ - lib/nanoc/filters
154
+ - --exclude
155
+ - test
156
+ - --line-numbers
67
157
  require_paths:
68
158
  - lib
69
159
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -81,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
81
171
  requirements: []
82
172
 
83
173
  rubyforge_project: nanoc
84
- rubygems_version: 1.1.1
174
+ rubygems_version: 1.2.0
85
175
  signing_key:
86
176
  specification_version: 2
87
177
  summary: a tool that runs on your local computer and compiles Markdown, Textile, Haml, ... documents into static web pages
@@ -1,132 +0,0 @@
1
- require 'webrick'
2
-
3
- module Nanoc
4
-
5
- class AutoCompiler
6
-
7
- ERROR_404 = <<END
8
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
9
- <html>
10
- <head>
11
- <title>404 File Not Found</title>
12
- <style type="text/css">
13
- body { padding: 10px; border: 10px solid #f00; margin: 10px; font-family: Helvetica, Arial, sans-serif; }
14
- </style>
15
- </head>
16
- <body>
17
- <h1>404 File Not Found</h1>
18
- <p>The file you requested, <i><%=h path %></i>, was not found on this server.</p>
19
- </body>
20
- </html>
21
- END
22
-
23
- ERROR_500 = <<END
24
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
25
- <html>
26
- <head>
27
- <title>500 Server Error</title>
28
- <style type="text/css">
29
- body { padding: 10px; border: 10px solid #f00; margin: 10px; font-family: Helvetica, Arial, sans-serif; }
30
- </style>
31
- </head>
32
- <body>
33
- <h1>500 Server Error</h1>
34
- <p>An error occurred while compiling the page you requested, <i><%=h path %></i>.</p>
35
- <p>If you think this is a bug in nanoc, please do <a href="http://nanoc.stoneship.org/trac/newticket">report it</a>&mdash;thanks!</p>
36
- <p>Message:</p>
37
- <blockquote><p><%=h exception.message %></p></blockquote>
38
- <p>Backtrace:</p>
39
- <ol>
40
- <% exception.backtrace.each do |line| %>
41
- <li><%= line %></li>
42
- <% end %>
43
- </ol>
44
- </body>
45
- </html>
46
- END
47
-
48
- def initialize(site)
49
- # Set site
50
- @site = site
51
- end
52
-
53
- def start(port)
54
- nanoc_require(
55
- 'mime/types',
56
- "'mime/types' is required to autocompile sites. You may want to " +
57
- "install the mime-types gem by running 'gem install mime-types'."
58
- )
59
-
60
- # Create server
61
- @server = WEBrick::HTTPServer.new(:Port => port || 3000)
62
- @server.mount_proc("/") { |request, response| handle_request(request, response) }
63
-
64
- # Start server
65
- trap('INT') { @server.shutdown }
66
- @server.start
67
- end
68
-
69
- def handle_request(request, response)
70
- # Reload site data
71
- @site.load_data(true)
72
-
73
- # Get page or file
74
- page = @site.pages.find { |page| page.path == request.path }
75
- file_path = @site.config[:output_dir] + request.path
76
-
77
- if page.nil?
78
- # Serve file
79
- if File.file?(file_path)
80
- serve_file(file_path, response)
81
- else
82
- serve_404(request.path, response)
83
- end
84
- else
85
- # Serve page
86
- serve_page(page, response)
87
- end
88
- end
89
-
90
- def h(s)
91
- ERB::Util.html_escape(s)
92
- end
93
-
94
- def serve_404(path, response)
95
- response.status = 404
96
- response['Content-Type'] = 'text/html'
97
- response.body = ERB.new(ERROR_404).result(binding)
98
- end
99
-
100
- def serve_500(path, exception, response)
101
- response.status = 500
102
- response['Content-Type'] = 'text/html'
103
- response.body = ERB.new(ERROR_500).result(binding)
104
- end
105
-
106
- def serve_file(path, response)
107
- response.status = 200
108
- response['Content-Type'] = MIME::Types.of(path).first || 'application/octet-stream'
109
- response.body = File.read(path)
110
- end
111
-
112
- def serve_page(page, response)
113
- # Recompile page
114
- begin
115
- @site.compiler.run(page)
116
- rescue => exception
117
- serve_500(page.path, exception, response)
118
- return
119
- end
120
-
121
- # Determine most likely MIME type
122
- mime_type = MIME::Types.of(page.path).first
123
- mime_type = mime_type.nil? ? 'text/html' : mime_type.simplified
124
-
125
- response.status = 200
126
- response['Content-Type'] = mime_type
127
- response.body = page.layouted_content
128
- end
129
-
130
- end
131
-
132
- end
@@ -1,33 +0,0 @@
1
- module Nanoc
2
- class LayoutProcessor < Plugin
3
-
4
- def initialize(page, pages, config, site, other_assigns={})
5
- @page = page
6
- @pages = pages
7
- @config = config
8
- @site = site
9
- @other_assigns = other_assigns
10
- end
11
-
12
- def run(layout)
13
- error 'LayoutProcessor#run must be overridden'
14
- end
15
-
16
- # Extensions
17
-
18
- class << self
19
- attr_accessor :_extensions
20
- end
21
-
22
- def self.extensions(*extensions)
23
- self._extensions = [] unless instance_variables.include?('@_extensions')
24
- extensions.empty? ? self._extensions || [] : self._extensions = (self._extensions || []) + extensions
25
- end
26
-
27
- def self.extension(extension=nil)
28
- self._extensions = [] unless instance_variables.include?('@_extensions')
29
- extension.nil? ? self.extensions.first : self.extensions(extension)
30
- end
31
-
32
- end
33
- end
@@ -1,31 +0,0 @@
1
- module Nanoc
2
- class PageProxy
3
-
4
- def initialize(page)
5
- @page = page
6
- end
7
-
8
- def [](key)
9
- real_key = key.to_s.sub(/\?$/, '').to_sym
10
-
11
- if real_key == :content
12
- @page.content
13
- elsif real_key == :parent
14
- @page.parent.nil? ? nil : @page.parent.to_proxy
15
- elsif real_key == :children
16
- @page.children.map { |page| page.to_proxy }
17
- else
18
- @page.attribute_named(real_key)
19
- end
20
- end
21
-
22
- def []=(key, value)
23
- @page.attributes[key.to_sym] = value
24
- end
25
-
26
- def method_missing(method, *args)
27
- self[method]
28
- end
29
-
30
- end
31
- end
@@ -1,33 +0,0 @@
1
- module Nanoc
2
- class PluginManager
3
-
4
- @@data_sources = {}
5
- @@filters = {}
6
- @@layout_processors = {}
7
-
8
- def self.subclasses_of(superclass)
9
- subclasses = []
10
- ObjectSpace.each_object(Class) { |subclass| subclasses << subclass if subclass < superclass }
11
- subclasses
12
- end
13
-
14
- def self.data_source_named(name)
15
- @@data_sources[name.to_sym] ||= subclasses_of(DataSource).find do |klass|
16
- klass.identifiers.include?(name.to_sym)
17
- end
18
- end
19
-
20
- def self.filter_named(name)
21
- @@filters[name.to_sym] ||= subclasses_of(Filter).find do |klass|
22
- klass.identifiers.include?(name.to_sym)
23
- end
24
- end
25
-
26
- def self.layout_processor_for_extension(ext)
27
- @@filters[ext.to_sym] ||= subclasses_of(LayoutProcessor).find do |klass|
28
- klass.extensions.include?(ext)
29
- end
30
- end
31
-
32
- end
33
- end
@@ -1,259 +0,0 @@
1
- begin ; require 'active_record' ; rescue LoadError ; end
2
-
3
- module Nanoc::DataSource::Database
4
-
5
- ########## Helper classes ##########
6
-
7
- begin
8
-
9
- class DatabasePage < ActiveRecord::Base
10
- set_table_name 'pages'
11
- end
12
-
13
- class DatabasePageDefault < ActiveRecord::Base
14
- set_table_name 'page_defaults'
15
- end
16
-
17
- class DatabaseTemplate < ActiveRecord::Base
18
- set_table_name 'templates'
19
- end
20
-
21
- class DatabaseLayout < ActiveRecord::Base
22
- set_table_name 'layouts'
23
- end
24
-
25
- class DatabaseCodePiece < ActiveRecord::Base
26
- set_table_name 'code_pieces'
27
- end
28
-
29
- rescue NameError
30
- end
31
-
32
- class DatabaseDataSource < Nanoc::DataSource
33
-
34
- ########## Attributes ##########
35
-
36
- identifier :database
37
-
38
- ########## Preparation ##########
39
-
40
- def up
41
- nanoc_require 'active_record'
42
-
43
- # Connect to the database
44
- ActiveRecord::Base.establish_connection(@site.config[:database])
45
- end
46
-
47
- def down
48
- # Disconnect from the database
49
- ActiveRecord::Base.remove_connection
50
- end
51
-
52
- def setup
53
- # Create tables
54
- schema = ActiveRecord::Schema
55
- schema.verbose = false
56
- schema.define do
57
-
58
- create_table :pages, :force => true do |t|
59
- t.column :content, :text
60
- t.column :path, :string
61
- t.column :meta, :text
62
- end
63
-
64
- create_table :page_defaults, :force => true do |t|
65
- t.column :meta, :text
66
- end
67
-
68
- create_table :layouts, :force => true do |t|
69
- t.column :name, :string
70
- t.column :content, :text
71
- t.column :extension, :string
72
- end
73
-
74
- create_table :templates, :force => true do |t|
75
- t.column :content, :text
76
- t.column :name, :string
77
- t.column :meta, :text
78
- end
79
-
80
- create_table :code_pieces, :force => true do |t|
81
- t.column :name, :string
82
- t.column :code, :text
83
- end
84
-
85
- end
86
-
87
- # Create first page
88
- DatabasePage.create(
89
- :path => '/',
90
- :content => "I'm a brand new root page. Please edit me!\n",
91
- :meta => "# Built-in\n" +
92
- "\n" +
93
- "# Custom\n" +
94
- "title: \"A New Root Page\"\n"
95
- )
96
-
97
- # Create page defaults
98
- DatabasePageDefault.create(
99
- :meta => "# Built-in\n" +
100
- "custom_path: none\n" +
101
- "extension: \"html\"\n" +
102
- "filename: \"index\"\n" +
103
- "filters_post: []\n" +
104
- "filters_pre: []\n" +
105
- "is_draft: false\n" +
106
- "layout: \"default\"\n" +
107
- "skip_output: false\n" +
108
- "\n" +
109
- "# Custom\n"
110
- )
111
-
112
- # Create default layout
113
- DatabaseLayout.create(
114
- :name => 'default',
115
- :content => "<html>\n" +
116
- " <head>\n" +
117
- " <title><%= @page.title %></title>\n" +
118
- " </head>\n" +
119
- " <body>\n" +
120
- "<%= @page.content %>\n" +
121
- " </body>\n" +
122
- "</html>",
123
- :extension => '.erb'
124
- )
125
-
126
- # Create default template
127
- DatabaseTemplate.create(
128
- :name => 'default',
129
- :content => 'Hi, I\'m a new page!',
130
- :meta => "# Built-in\n" +
131
- "\n" +
132
- "# Custom\n" +
133
- "title: \"A New Page\"\n"
134
- )
135
-
136
- # Create default code piece
137
- DatabaseCodePiece.create(
138
- :name => 'default',
139
- :code => "def html_escape(str)\n" +
140
- " str.gsub('&', '&amp;').str('<', '&lt;').str('>', '&gt;').str('\"', '&quot;')\n" +
141
- "end\n" +
142
- "alias h html_escape\n"
143
- )
144
-
145
- log(:high, "Set up database schema.")
146
- end
147
-
148
- ########## Loading data ##########
149
-
150
- def pages
151
- # Create Pages for each database object
152
- DatabasePage.find(:all).inject([]) do |pages, page|
153
- # Read metadata
154
- hash = (YAML.load(page.meta || '') || {}).clean
155
-
156
- if hash[:is_draft]
157
- # Skip drafts
158
- pages
159
- else
160
- # Get extra info
161
- extras = { :path => page.path, :uncompiled_content => page.content }
162
-
163
- # Add to list of pages
164
- pages + [ hash.merge(extras) ]
165
- end
166
- end
167
- end
168
-
169
- def page_defaults
170
- YAML.load(DatabasePageDefault.find(:first).meta) || {}
171
- end
172
-
173
- def layouts
174
- DatabaseLayout.find(:all).map do |layout|
175
- {
176
- :name => layout.name,
177
- :content => layout.content,
178
- :extension => layout.extension
179
- }
180
- end
181
- end
182
-
183
- def templates
184
- DatabaseTemplate.find(:all).map do |template|
185
- {
186
- :name => template.name,
187
- :content => template.content,
188
- :meta => template.meta
189
- }
190
- end
191
- end
192
-
193
- def code
194
- DatabaseCodePiece.find(:all).map { |p| p.code }.join("\n")
195
- end
196
-
197
- ########## Creating data ##########
198
-
199
- def create_page(path, template)
200
- # Make sure path does not start or end with a slash
201
- sanitized_path = ('/' + path + '/').gsub(/^\/+|\/+$/, '/')
202
-
203
- # Make sure the page doesn't exist yet
204
- unless DatabasePage.find_all_by_path(sanitized_path).empty?
205
- error "A page named '#{sanitized_path}' already exists."
206
- end
207
-
208
- # Create page
209
- DatabasePage.create(
210
- :path => sanitized_path,
211
- :content => "I'm a brand new page. Please edit me!\n",
212
- :meta => "# Built-in\n\n# Custom\ntitle: A New Page\n"
213
- )
214
-
215
- log(:high, "Created page '#{sanitized_path}'.")
216
- end
217
-
218
- def create_layout(name)
219
- # Make sure the layout doesn't exist yet
220
- unless DatabaseLayout.find_all_by_name(name).empty?
221
- error "A layout named '#{name}' already exists."
222
- end
223
-
224
- # Create layout
225
- DatabaseLayout.create(
226
- :name => name,
227
- :content => "<html>\n" +
228
- " <head>\n" +
229
- " <title><%= @page.title %></title>\n" +
230
- " </head>\n" +
231
- " <body>\n" +
232
- "<%= @page.content %>\n" +
233
- " </body>\n" +
234
- "</html>",
235
- :extension => '.erb'
236
- )
237
-
238
- log(:high, "Created layout '#{name}'.")
239
- end
240
-
241
- def create_template(name)
242
- # Make sure the layout doesn't exist yet
243
- unless DatabaseTemplate.find_all_by_name(name).empty?
244
- error "A template named '#{name}' already exists."
245
- end
246
-
247
- # Create template
248
- DatabaseTemplate.create(
249
- :name => name,
250
- :content => "Hi, I'm a brand new page!\n",
251
- :meta => "# Built-in\n\n# Custom\ntitle: A New Page\n"
252
- )
253
-
254
- log(:high,"Created template '#{name}'.")
255
- end
256
-
257
- end
258
-
259
- end