ace 0.1 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,13 @@
1
- = Version 0.0.1
1
+ = Version 0.3
2
+ * Added LazyRendering mixin.
3
+ * Added SassFilter.
4
+ * Added PygmentsFilter for syntax highlighting.
5
+ * Added Static class for copying static files.
6
+
7
+ = Version 0.2
8
+ * Filters inheritance.
9
+ * Item#permalink and Item#server_path.
10
+
11
+ = Version 0.1
2
12
  * Items
3
13
  * Generators
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2010 Jakub Šťastný aka Botanicus
1
+ Copyright (c) 2010 – 2011 Jakub Šťastný aka Botanicus
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.textile CHANGED
@@ -1,3 +1,13 @@
1
+ h1. About
2
+
3
+ Ace is a static page generator like "Nanoc":http://nanoc.stoneship.org, "Jekyll":https://github.com/mojombo/jekyll or "Webby":http://webby.rubyforge.org/tutorial. How is it different? Well, it's better :) ! I really like Nanoc and I used it for quite a while, but it's not flexible enough. If you need to generate a lot of pages on the fly, it's a hassle. It provides helpers, but helpers are – let's face it – programming style we used to use years back when we yet believed that PHP is actually a really nice language.
4
+
5
+ Ace chose an OOP approach
6
+
7
+ Another common proble of these generators is, that they are way too opinionated. Thanks Webby, but I don't give a damn about your Sitemap, thank you very much!
8
+
9
+ Also, last but not least, Ace has a real template inheritance. Layouts are for kids, real men use template inheritance! What's the advantage? It's incredibly flexible. You can have
10
+
1
11
  h1. Why you should be interested in ace?
2
12
 
3
13
  In Ace, every page is an instance
@@ -7,11 +17,11 @@ There are also *generators* available for easier generating items on the fly.
7
17
 
8
18
  Ace has *template inheritance*. I love template inheritance, it's more flexible pattern than layouts.
9
19
 
10
- Tasks for deployment included.
20
+ Tasks for deployment are included.
11
21
 
12
22
  h1. The boot process
13
23
 
14
- # load @boot.rb@ where the
24
+ # Load @boot.rb@ where the
15
25
  # load the rules (controllers / globs mapping)
16
26
  # load & instantiate the items: only the renderables (concrete post)
17
27
  # run the filters, layoutin' ... actually this can be defined in the controller
data/bin/ace CHANGED
@@ -2,7 +2,7 @@
2
2
  # encoding: utf-8
3
3
 
4
4
  if RUBY_VERSION < "1.9.1"
5
- abort "Ace requires Ruby 1.9."
5
+ abort "Ace requires Ruby 1.9"
6
6
  end
7
7
 
8
8
  base = File.symlink?(__FILE__) ? File.readlink(__FILE__) : __FILE__
@@ -40,7 +40,7 @@ end
40
40
  rules.rules.each do |klass, files|
41
41
  puts "#{klass} #{files.inspect}"
42
42
  files.each do |file|
43
- if File.binread(file).match(/^-{3,5}\s*$/)
43
+ if File.binread(file).match(/^-{3,5}\s*$/) # TODO: this should be a filter or lazy-loaded
44
44
  raw_item = Ace::RawItem.new(file).tap(&:parse)
45
45
  item = klass.create(raw_item.metadata, raw_item.content)
46
46
  else
@@ -52,14 +52,14 @@ end
52
52
 
53
53
  puts
54
54
 
55
- rules.generators.each do |generator_klass|
56
- puts "~ Running #{generator_klass}"
57
- generator = generator_klass.new
55
+ # Generator is anything what provides #generate method.
56
+ rules.generators.each do |generator|
57
+ puts "~ Running generator #{generator}"
58
58
  begin
59
- if generator.respond_to?(:run)
60
- generator.run
59
+ if generator.respond_to?(:generate)
60
+ generator.generate
61
61
  else
62
- abort "Generator #{generator.inspect} doesn't respond to the #run method!"
62
+ abort "Generator #{generator.inspect} doesn't respond to the #generate method!"
63
63
  end
64
64
  rescue Exception => exception
65
65
  puts "Error in generator #{generator.inspect}: #{exception.message}"
@@ -71,6 +71,5 @@ end
71
71
  puts
72
72
 
73
73
  Ace::Item.all_instances.each do |item|
74
- puts "~ Generating #{item.output_path}"
75
74
  item.save!
76
75
  end
data/lib/ace.rb CHANGED
@@ -9,8 +9,13 @@
9
9
 
10
10
  require "yaml"
11
11
  require "fileutils"
12
+ require "ace/filters/sass"
12
13
 
13
14
  module Ace
15
+ module Helpers
16
+ # include your helpers here
17
+ end
18
+
14
19
  class RawItem
15
20
  attr_accessor :path, :metadata, :content
16
21
  def initialize(path)
@@ -19,11 +24,11 @@ module Ace
19
24
 
20
25
  def parse
21
26
  pieces = @data.split(/^-{3,5}\s*$/)
22
- if pieces.size < 3
23
- raise RuntimeError.new(
24
- "The file '#{content_filename}' appears to start with a metadata section (three or five dashes at the top) but it does not seem to be in the correct format."
25
- )
26
- end
27
+ # if pieces.size < 3
28
+ # raise RuntimeError.new(
29
+ # "The file '#{path}' appears to start with a metadata section (three or five dashes at the top) but it does not seem to be in the correct format."
30
+ # )
31
+ # end
27
32
 
28
33
  # Parse
29
34
  self.metadata = YAML.load(pieces[1]).inject(Hash.new) { |metadata, pair| metadata.merge(pair[0].to_sym => pair[1]) } || Hash.new
@@ -36,10 +41,12 @@ module Ace
36
41
  class Item
37
42
  def self.inherited(subclass)
38
43
  self.subclasses << subclass
44
+ subclass.before_filters.push(*self.before_filters)
45
+ subclass.after_filters.push(*self.after_filters)
39
46
  end
40
47
 
41
48
  def self.subclasses
42
- @subclasses ||= Array.new
49
+ @subclasses ||= [self]
43
50
  end
44
51
 
45
52
  def self.instances
@@ -111,6 +118,23 @@ module Ace
111
118
  end
112
119
  end
113
120
 
121
+ def server_path
122
+ absolute = self.output_path.sub(/^output\//, "")
123
+ "/#{absolute}"
124
+ end
125
+
126
+ def base_url
127
+ self.config[:base_url]
128
+ end
129
+
130
+ def permalink
131
+ if self.config[:base_url].nil?
132
+ raise "You have to add :base_url into config.yml or redefine #base_url method!"
133
+ end
134
+
135
+ "#{self.base_url}#{self.server_path}"
136
+ end
137
+
114
138
  attr_writer :output_path
115
139
  def output_path
116
140
  @output_path ||= begin
@@ -122,6 +146,7 @@ module Ace
122
146
 
123
147
  def save!
124
148
  content = self.render # so filters can influence output_path
149
+ puts "~ [RENDER] #{self.output_path}"
125
150
 
126
151
  FileUtils.mkdir_p File.dirname(self.output_path)
127
152
  File.open(self.output_path, "w") do |file|
@@ -131,10 +156,6 @@ module Ace
131
156
  end
132
157
 
133
158
  class Asset < Item
134
- end
135
-
136
- module Helpers
137
- def link_to(anchor, path_or_item, options = nil)
138
- end
159
+ before Ace::SassFilter
139
160
  end
140
161
  end
@@ -10,12 +10,16 @@ end
10
10
 
11
11
  module Ace
12
12
  class LayoutFilter < Filter
13
+ class Scope
14
+ include Ace::Helpers
15
+ end
16
+
13
17
  def initialize(options)
14
18
  @path = options[:layout]
15
19
  end
16
20
 
17
21
  def call(item, content)
18
- template = TemplateInheritance::Template.new(@path)
22
+ template = TemplateInheritance::Template.new(@path, Scope.new)
19
23
  return template.render(item: item)
20
24
  end
21
25
  end
@@ -0,0 +1,21 @@
1
+ # encoding: utf-8
2
+
3
+ require "ace/filters"
4
+ require "nokogiri"
5
+ require "albino"
6
+
7
+ module Ace
8
+ class PygmentsFilter < Filter
9
+ def call(item, content)
10
+ doc = Nokogiri::HTML(content)
11
+ doc.css("pre[lang]").each do |pre|
12
+ unless pre['lang'].nil? || pre['lang'].empty?
13
+ # Set $VERBOSE to nil if you don't want to see this message.
14
+ warn "~ Syntax highlight in '#{item.original_path}' using '#{pre['lang']}' lexer."
15
+ pre.replace Albino.colorize(pre.content, pre['lang'])
16
+ end
17
+ end
18
+ doc.to_s
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ require "sass"
4
+ require "ace/filters"
5
+
6
+ module Ace
7
+ class SassFilter < Filter
8
+ def call(item, content)
9
+ if item.output_path && item.output_path.end_with?(".scss")
10
+ item.output_path.sub!(/scss$/, "css")
11
+ begin
12
+ engine = Sass::Engine.new(content, {:syntax => :scss})
13
+ output = engine.render
14
+ rescue Exception => e
15
+ warn "~~ SassFilter exception: #{e}"
16
+ abort
17
+ end
18
+ return output
19
+ else
20
+ return content
21
+ end
22
+ end
23
+ end
24
+ end
@@ -12,8 +12,10 @@ TemplateInheritance::Template.paths << File.join(Dir.pwd, "content")
12
12
 
13
13
  module Ace
14
14
  class TemplateFilter < Filter
15
+ TEMPLATE_EXTS_PATTERN = /\.(haml|erb|erubis)$/i
16
+
15
17
  def call(item, content)
16
- if item.output_path
18
+ if item.output_path.match(TEMPLATE_EXTS_PATTERN)
17
19
  item.output_path = item.output_path.split(".")[0..-2].join(".")
18
20
  end
19
21
 
@@ -0,0 +1,31 @@
1
+ # encoding: utf-8
2
+
3
+ # Sometimes rendering is taking too long, so you want to skip
4
+ # it in case that nothing changed in the files which influence
5
+ # the output. For example syntax highlighting via Pygments takes
6
+ # a while, so it's better to include this mixin and redefine
7
+ # #source_files to include every file which influence the output.
8
+ module Ace
9
+ module LazyRendering
10
+ def compare_mtime(one, others)
11
+ File.exist?(one) && File.mtime(one) > others.map { |post| File.mtime(post) }.max
12
+ end
13
+
14
+ # @api public
15
+ def source_files
16
+ [self.original_path]
17
+ end
18
+
19
+ def fresh?
20
+ @fresh ||= compare_mtime(self.output_path, self.source_files)
21
+ end
22
+
23
+ def save!
24
+ if self.fresh?
25
+ puts "~ [IGNORE] #{self.output_path}"
26
+ else
27
+ super
28
+ end
29
+ end
30
+ end
31
+ end
data/lib/ace/static.rb ADDED
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ require "ace/filters/template"
4
+
5
+ # rule Ace::Static, "about.html.haml"
6
+ # rule Ace::Static("output/index.html"), "index.html.haml"
7
+ module Ace
8
+ def self.Static(output_path)
9
+ Class.new(Static) do
10
+ define_method(:output_path) do
11
+ output_path
12
+ end
13
+ end
14
+ end
15
+
16
+ class Static < Item
17
+ before Ace::TemplateFilter
18
+ end
19
+ end
data/lib/ace/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Ace
4
- VERSION = "0.1"
4
+ VERSION = "0.3"
5
5
  end
metadata CHANGED
@@ -1,18 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ace
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 1
8
- version: "0.1"
4
+ prerelease:
5
+ version: "0.3"
9
6
  platform: ruby
10
7
  authors:
11
8
  - "Jakub \xC5\xA0\xC5\xA5astn\xC3\xBD aka Botanicus"
12
9
  autorequire:
13
10
  bindir: bin
14
11
  cert_chain:
15
- date: 2011-02-17 00:00:00 +00:00
12
+ date: 2011-03-17 00:00:00 +00:00
16
13
  default_executable: ace
17
14
  dependencies:
18
15
  - !ruby/object:Gem::Dependency
@@ -23,8 +20,6 @@ dependencies:
23
20
  requirements:
24
21
  - - ">="
25
22
  - !ruby/object:Gem::Version
26
- segments:
27
- - 0
28
23
  version: "0"
29
24
  type: :runtime
30
25
  version_requirements: *id001
@@ -36,11 +31,6 @@ dependencies:
36
31
  requirements:
37
32
  - - ">="
38
33
  - !ruby/object:Gem::Version
39
- segments:
40
- - 0
41
- - 0
42
- - 1
43
- - 2
44
34
  version: 0.0.1.2
45
35
  type: :development
46
36
  version_requirements: *id002
@@ -93,7 +83,11 @@ files:
93
83
  - lib/ace/filters.rb
94
84
  - lib/ace/filters/haml.rb
95
85
  - lib/ace/filters/layout.rb
86
+ - lib/ace/filters/pygments.rb
87
+ - lib/ace/filters/sass.rb
96
88
  - lib/ace/filters/template.rb
89
+ - lib/ace/mixins/lazy.rb
90
+ - lib/ace/static.rb
97
91
  - lib/ace/version.rb
98
92
  - project_generator/metadata.yml
99
93
  - project_generator/postprocess.rb
@@ -103,8 +97,7 @@ has_rdoc: true
103
97
  homepage: http://github.com/botanicus/ace
104
98
  licenses: []
105
99
 
106
- post_install_message: "[\e[32mVersion 0.0.1\e[0m] Items\n\
107
- [\e[32mVersion 0.0.1\e[0m] Generators\n"
100
+ post_install_message:
108
101
  rdoc_options: []
109
102
 
110
103
  require_paths:
@@ -114,22 +107,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
114
107
  requirements:
115
108
  - - ~>
116
109
  - !ruby/object:Gem::Version
117
- segments:
118
- - 1
119
- - 9
120
110
  version: "1.9"
121
111
  required_rubygems_version: !ruby/object:Gem::Requirement
122
112
  none: false
123
113
  requirements:
124
114
  - - ">="
125
115
  - !ruby/object:Gem::Version
126
- segments:
127
- - 0
128
116
  version: "0"
129
117
  requirements: []
130
118
 
131
119
  rubyforge_project: ace
132
- rubygems_version: 1.3.7
120
+ rubygems_version: 1.5.3
133
121
  signing_key:
134
122
  specification_version: 3
135
123
  summary: Ace is highly flexible static pages generator with template inheritance.