nanoc 2.0.4 → 2.1

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.
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