stack 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +134 -0
- data/Rakefile +1 -0
- data/VERSION.yml +1 -1
- data/lib/stack.rb +11 -2
- data/lib/stack/filters/convertors.rb +19 -0
- data/lib/stack/filters/datetime.rb +15 -0
- data/lib/stack/filters/register.rb +17 -0
- data/lib/stack/filters/standard.rb +27 -0
- data/lib/stack/filters/string.rb +11 -0
- data/lib/stack/generator.rb +9 -1
- data/lib/stack/runner.rb +17 -1
- data/lib/stack/server.rb +27 -0
- data/lib/stack/template.rb +7 -10
- data/lib/stack/watcher.rb +45 -0
- metadata +20 -3
- data/README.rdoc +0 -20
data/README.markdown
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
Stack
|
2
|
+
=====
|
3
|
+
|
4
|
+
Generates a static site from template files with YAML and Liquid. Stack supports template transformation through Markdown, Textile and Less CSS.
|
5
|
+
|
6
|
+
Within template files, stack allows you to use bi-directional YAML variables and include files.
|
7
|
+
|
8
|
+
Dependencies
|
9
|
+
------------
|
10
|
+
|
11
|
+
* [Liquid][] - Templating system
|
12
|
+
* [RedCloth][] - Textile transformation
|
13
|
+
* [Maruku][] - Markdown transformation
|
14
|
+
* [Less][] - CSS transformation
|
15
|
+
|
16
|
+
Install
|
17
|
+
-------
|
18
|
+
|
19
|
+
Available through [Gemcutter][].
|
20
|
+
|
21
|
+
gem install stack
|
22
|
+
|
23
|
+
Usage
|
24
|
+
-----
|
25
|
+
|
26
|
+
### Command Line
|
27
|
+
|
28
|
+
|
29
|
+
cd /path/to/my/site
|
30
|
+
stack [command] [options]
|
31
|
+
|
32
|
+
#### Commands
|
33
|
+
|
34
|
+
generate
|
35
|
+
|
36
|
+
Generate runs through the source and transforms the templates, if no source is specified the current directory will be used.
|
37
|
+
|
38
|
+
server
|
39
|
+
|
40
|
+
Runs a web server serving the output of the transformed source, by default when running Stack in server mode your templates will be automatically transformed when changed (this can be disabled).
|
41
|
+
|
42
|
+
watch
|
43
|
+
|
44
|
+
Watches a directory and re-builds whenever theres file changes.
|
45
|
+
|
46
|
+
#### Options
|
47
|
+
|
48
|
+
--source
|
49
|
+
|
50
|
+
--target
|
51
|
+
|
52
|
+
##### Server Options
|
53
|
+
|
54
|
+
--port
|
55
|
+
|
56
|
+
--watches
|
57
|
+
|
58
|
+
|
59
|
+
### Ruby
|
60
|
+
|
61
|
+
require 'stack'
|
62
|
+
|
63
|
+
Stack::Generator.new("/path/to/source", "/path/to/target")
|
64
|
+
|
65
|
+
Templates and YAML
|
66
|
+
------------------
|
67
|
+
|
68
|
+
Template files can contain YAML block's that are processed by Stack and can be used to define Liquid variables for use in your templates. A YAML block can be something like;
|
69
|
+
|
70
|
+
---
|
71
|
+
layout: application
|
72
|
+
title: Page Title
|
73
|
+
---
|
74
|
+
|
75
|
+
### Pre-defined variables
|
76
|
+
|
77
|
+
layout
|
78
|
+
|
79
|
+
This specifies the layout file to use around the content, theres no need to specify the extension. The layout must be defined in a file inside a `_layout` folder that is within the current template scope, if you have templates defined in a sub-folder you can have a `_layout` folder that only templates in the sub-folder can access.
|
80
|
+
|
81
|
+
generator
|
82
|
+
|
83
|
+
This variable holds the current hash used to transform the current template. You should not override this from the YAML block.
|
84
|
+
|
85
|
+
generator.time
|
86
|
+
|
87
|
+
The current Time from when the Stack processed and transformed the templates.
|
88
|
+
|
89
|
+
generator.processed_at
|
90
|
+
|
91
|
+
The current Time the `generator` processed the templates.
|
92
|
+
|
93
|
+
generator.transformed_at
|
94
|
+
|
95
|
+
The current Time the `generator` transformed the templates.
|
96
|
+
|
97
|
+
### Liquid Templates
|
98
|
+
|
99
|
+
Its out of the scope of this project's README file to describe how Liquid templating can be used, for more information see the [Liquid Wiki][].
|
100
|
+
|
101
|
+
#### Filters
|
102
|
+
|
103
|
+
{{ generator.time | date_to_xmlschema }} #=> 2009-10-31T21:16:06+00:00
|
104
|
+
|
105
|
+
Transforms a Time into a XML schema format string.
|
106
|
+
|
107
|
+
{{ generator.time | date_to_string }} #=> 31 Oct 2009
|
108
|
+
|
109
|
+
Transforms a Time into a formatted string.
|
110
|
+
|
111
|
+
{{ title | xml_escape }} #=>
|
112
|
+
|
113
|
+
Escapes the specified string for use in XML.
|
114
|
+
|
115
|
+
Contribute
|
116
|
+
----------
|
117
|
+
|
118
|
+
* Fork the project.
|
119
|
+
* Make your feature addition or bug fix.
|
120
|
+
* Add tests for it. This is important so I don't break it in a future version unintentionally.
|
121
|
+
* Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
|
122
|
+
* Send me a pull request. Bonus points for topic branches.
|
123
|
+
|
124
|
+
License
|
125
|
+
-------
|
126
|
+
|
127
|
+
Copyright (c) 2009 Adam Livesley (sixones). See LICENSE for details.
|
128
|
+
|
129
|
+
[Liquid]: http://liquidmarkup.org/ "Liquid"
|
130
|
+
[RedCloth]: http://redcloth.org/ "RedCloth"
|
131
|
+
[Maruku]: http://maruku.rubyforge.org/ "Maruku"
|
132
|
+
[Less]: http://lesscss.org/ "Less"
|
133
|
+
[Gemcutter]: http://gemcutter.org/gems/stack "Gemcutter"
|
134
|
+
[Liquid Wiki]: http://wiki.github.com/tobi/liquid/ "Liquid Wiki"
|
data/Rakefile
CHANGED
@@ -19,6 +19,7 @@ begin
|
|
19
19
|
gem.add_dependency "RedCloth", ">= 4.2.1"
|
20
20
|
gem.add_dependency "maruku", ">= 0.5.9"
|
21
21
|
gem.add_dependency "less", ">= 1.0.0"
|
22
|
+
gem.add_dependency "directory_watcher", ">= 1.2.0"
|
22
23
|
|
23
24
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
24
25
|
end
|
data/VERSION.yml
CHANGED
data/lib/stack.rb
CHANGED
@@ -2,12 +2,13 @@
|
|
2
2
|
require 'rubygems'
|
3
3
|
|
4
4
|
require 'optparse'
|
5
|
-
|
5
|
+
require 'directory_watcher'
|
6
6
|
require 'liquid'
|
7
7
|
require 'maruku'
|
8
8
|
require 'mash'
|
9
9
|
require 'RedCloth'
|
10
10
|
require 'less'
|
11
|
+
require 'webrick'
|
11
12
|
|
12
13
|
require 'core_ext/hash'
|
13
14
|
|
@@ -17,10 +18,18 @@ require 'stack/runner'
|
|
17
18
|
|
18
19
|
require 'stack/template'
|
19
20
|
require 'stack/parsable'
|
21
|
+
require 'stack/server'
|
22
|
+
require 'stack/watcher'
|
20
23
|
|
21
24
|
require 'stack/templates/page'
|
22
25
|
require 'stack/templates/layout'
|
23
26
|
|
27
|
+
require 'stack/filters/register'
|
28
|
+
require 'stack/filters/standard'
|
29
|
+
require 'stack/filters/convertors'
|
30
|
+
require 'stack/filters/datetime'
|
31
|
+
require 'stack/filters/string'
|
32
|
+
|
24
33
|
module Stack
|
25
34
|
# Default options used by stack, overridden from the command line or YML configration file.
|
26
35
|
DEFAULTS = {
|
@@ -29,7 +38,7 @@ module Stack
|
|
29
38
|
}.freeze
|
30
39
|
|
31
40
|
# Array of valid commands stack can use
|
32
|
-
COMMANDS = %w(create generate server)
|
41
|
+
COMMANDS = %w(create generate server watch)
|
33
42
|
|
34
43
|
# Array of transformable extensions (these extensions go through the liquid transformer)
|
35
44
|
EXTENSIONS = %w(.html .markdown .mdown .mkdn .md .textile .js .css)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Stack
|
2
|
+
module Filters
|
3
|
+
module Convertors
|
4
|
+
include Stack::Filters::Register
|
5
|
+
|
6
|
+
def from_markdown(content)
|
7
|
+
Maruku.new(content).to_html
|
8
|
+
end
|
9
|
+
|
10
|
+
def from_textile(content)
|
11
|
+
RedCloth.new(content).to_html
|
12
|
+
end
|
13
|
+
|
14
|
+
def from_less(content)
|
15
|
+
Less::Engine.new(content).to_css
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Stack
|
2
|
+
module Filters
|
3
|
+
module Register
|
4
|
+
def self.extensions; @@extensions; end
|
5
|
+
|
6
|
+
@@extensions = [ ]
|
7
|
+
|
8
|
+
def self.included(base)
|
9
|
+
@@extensions << base
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.invoke_filter(name, params)
|
13
|
+
self.send(name, params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Stack
|
2
|
+
module Filters
|
3
|
+
module Standard
|
4
|
+
include Stack::Filters::Register
|
5
|
+
|
6
|
+
def hello_world(input)
|
7
|
+
"Hello World!"
|
8
|
+
end
|
9
|
+
|
10
|
+
def length(input)
|
11
|
+
input.length
|
12
|
+
end
|
13
|
+
|
14
|
+
def escape(input)
|
15
|
+
CGI::escape(input)
|
16
|
+
end
|
17
|
+
|
18
|
+
def escape_html(input)
|
19
|
+
CGI::escapeHTML(input)
|
20
|
+
end
|
21
|
+
|
22
|
+
def escape_xml(input)
|
23
|
+
CGI::escapeHTML(input)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/stack/generator.rb
CHANGED
@@ -7,6 +7,8 @@ module Stack
|
|
7
7
|
attr_accessor :layouts
|
8
8
|
attr_accessor :pages
|
9
9
|
|
10
|
+
attr_accessor :processed_at, :transformed_at
|
11
|
+
|
10
12
|
def initialize(source, target, parent = nil)
|
11
13
|
self.source = source
|
12
14
|
self.target = target
|
@@ -24,6 +26,8 @@ module Stack
|
|
24
26
|
end
|
25
27
|
|
26
28
|
def process!
|
29
|
+
self.processed_at = Time.now
|
30
|
+
|
27
31
|
read_layouts
|
28
32
|
read_pages
|
29
33
|
|
@@ -50,6 +54,8 @@ module Stack
|
|
50
54
|
end
|
51
55
|
|
52
56
|
def transform!
|
57
|
+
self.transformed_at = Time.now
|
58
|
+
|
53
59
|
self.pages.each do |name, page|
|
54
60
|
page.write!
|
55
61
|
end
|
@@ -74,7 +80,9 @@ module Stack
|
|
74
80
|
|
75
81
|
def to_hash
|
76
82
|
{
|
77
|
-
|
83
|
+
:processed_at => self.processed_at,
|
84
|
+
:transformed_at => self.transformed_at,
|
85
|
+
:time => Time.now
|
78
86
|
}
|
79
87
|
end
|
80
88
|
|
data/lib/stack/runner.rb
CHANGED
@@ -38,7 +38,23 @@ module Stack
|
|
38
38
|
# Runs the specified command
|
39
39
|
def run_command
|
40
40
|
@generator = Stack::Generator.new(Stack::runner.configuration.source, Stack::runner.configuration.target)
|
41
|
-
|
41
|
+
|
42
|
+
case self.command
|
43
|
+
when /(generate|gen)/
|
44
|
+
@generator.transform!
|
45
|
+
when /(server)/
|
46
|
+
# make a watcher
|
47
|
+
watcher = Stack::Watcher.new(@generator)
|
48
|
+
watcher.keep_alive = false
|
49
|
+
watcher.observe
|
50
|
+
# and a server
|
51
|
+
server = Stack::Server.new(@generator)
|
52
|
+
server.observe
|
53
|
+
when /(watch)/
|
54
|
+
# setup a watcher
|
55
|
+
watcher = Stack::Watcher.new(@generator)
|
56
|
+
watcher.observe
|
57
|
+
end
|
42
58
|
end
|
43
59
|
end
|
44
60
|
end
|
data/lib/stack/server.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
module Stack
|
2
|
+
class Server
|
3
|
+
attr_accessor :source, :target
|
4
|
+
attr_accessor :generator
|
5
|
+
attr_accessor :http_server
|
6
|
+
attr_accessor :thread
|
7
|
+
|
8
|
+
def initialize(generator)
|
9
|
+
self.generator = generator
|
10
|
+
self.source = self.generator.source
|
11
|
+
self.target = self.generator.target
|
12
|
+
end
|
13
|
+
|
14
|
+
def observe
|
15
|
+
self.http_server = WEBrick::HTTPServer.new(
|
16
|
+
:Port => 4000,
|
17
|
+
:DocumentRoot => self.target
|
18
|
+
)
|
19
|
+
|
20
|
+
self.thread = Thread.new {
|
21
|
+
self.http_server.start
|
22
|
+
}
|
23
|
+
|
24
|
+
self.thread.join()
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/stack/template.rb
CHANGED
@@ -21,9 +21,6 @@ module Stack
|
|
21
21
|
self.original_extension = ext[1, ext.length]
|
22
22
|
self.extension = self.original_extension
|
23
23
|
|
24
|
-
puts self.original_extension
|
25
|
-
puts self.extension
|
26
|
-
|
27
24
|
read
|
28
25
|
end
|
29
26
|
end
|
@@ -40,22 +37,22 @@ module Stack
|
|
40
37
|
layout_name = _payload[:layout]
|
41
38
|
|
42
39
|
if (layout_name and do_layout)
|
43
|
-
puts "has layout! #{layout_name}"
|
44
|
-
|
45
40
|
# get layout
|
46
41
|
_tpl_payload = self.generator.layouts[layout_name].template_payload
|
47
42
|
_tpl_payload.delete(:layout)
|
43
|
+
_tpl_payload.delete(:template)
|
44
|
+
_tpl_payload.delete(:generator)
|
48
45
|
|
49
|
-
puts _tpl_payload.inspect
|
50
|
-
puts "\n"
|
46
|
+
#puts _tpl_payload.inspect
|
47
|
+
#puts "\n"
|
51
48
|
|
52
49
|
_payload = _payload.merge(_tpl_payload)
|
53
50
|
end
|
54
51
|
|
55
|
-
puts _payload.inspect
|
56
|
-
puts "\n\n"
|
52
|
+
#puts _payload.inspect
|
53
|
+
#puts "\n\n"
|
57
54
|
|
58
|
-
content = Liquid::Template.parse(self.raw).render(Mash.new(_payload))
|
55
|
+
content = Liquid::Template.parse(self.raw).render(Mash.new(_payload), Stack::Filters::Register.extensions)
|
59
56
|
content = self.transform(content)
|
60
57
|
|
61
58
|
if (layout_name and do_layout)
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Stack
|
2
|
+
class Watcher
|
3
|
+
attr_accessor :source, :target
|
4
|
+
attr_accessor :generator
|
5
|
+
attr_accessor :directory_watcher
|
6
|
+
attr_accessor :keep_alive
|
7
|
+
|
8
|
+
def initialize(generator)
|
9
|
+
self.generator = generator
|
10
|
+
self.source = self.generator.source
|
11
|
+
self.target = self.generator.target
|
12
|
+
|
13
|
+
self.keep_alive = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def observe
|
17
|
+
dirs = ""
|
18
|
+
|
19
|
+
Dir.chdir(self.source) do
|
20
|
+
dirs = Dir['*'].select { |x| File.directory?(x) }
|
21
|
+
dirs -= ['_stack']
|
22
|
+
dirs = dirs.map { |x| "#{x}/**/*" }
|
23
|
+
dirs += ['*']
|
24
|
+
end
|
25
|
+
|
26
|
+
self.directory_watcher = DirectoryWatcher.new(self.source)
|
27
|
+
self.directory_watcher.interval = 1
|
28
|
+
self.directory_watcher.glob = dirs
|
29
|
+
|
30
|
+
self.directory_watcher.add_observer do |*args|
|
31
|
+
self.generator.process!
|
32
|
+
self.generator.transform!
|
33
|
+
|
34
|
+
time = Time.now.strftime("%Y-%m-%d %H:%M:%S")
|
35
|
+
puts "[#{time}] #{args.size} files changed and processed."
|
36
|
+
end
|
37
|
+
|
38
|
+
self.directory_watcher.start
|
39
|
+
|
40
|
+
if self.keep_alive
|
41
|
+
loop { sleep 1000 }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sixones
|
@@ -62,6 +62,16 @@ dependencies:
|
|
62
62
|
- !ruby/object:Gem::Version
|
63
63
|
version: 1.0.0
|
64
64
|
version:
|
65
|
+
- !ruby/object:Gem::Dependency
|
66
|
+
name: directory_watcher
|
67
|
+
type: :runtime
|
68
|
+
version_requirement:
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 1.2.0
|
74
|
+
version:
|
65
75
|
description: Generates a static site from template files with YAML and Liquid. Stack supports template transformation through Markdown, Textile and Less CSS.
|
66
76
|
email: dev@sixones.com
|
67
77
|
executables:
|
@@ -70,22 +80,29 @@ extensions: []
|
|
70
80
|
|
71
81
|
extra_rdoc_files:
|
72
82
|
- LICENSE
|
73
|
-
- README.
|
83
|
+
- README.markdown
|
74
84
|
files:
|
75
85
|
- LICENSE
|
76
|
-
- README.
|
86
|
+
- README.markdown
|
77
87
|
- Rakefile
|
78
88
|
- VERSION.yml
|
79
89
|
- bin/stack
|
80
90
|
- lib/core_ext/hash.rb
|
81
91
|
- lib/stack.rb
|
82
92
|
- lib/stack/configuration.rb
|
93
|
+
- lib/stack/filters/convertors.rb
|
94
|
+
- lib/stack/filters/datetime.rb
|
95
|
+
- lib/stack/filters/register.rb
|
96
|
+
- lib/stack/filters/standard.rb
|
97
|
+
- lib/stack/filters/string.rb
|
83
98
|
- lib/stack/generator.rb
|
84
99
|
- lib/stack/parsable.rb
|
85
100
|
- lib/stack/runner.rb
|
101
|
+
- lib/stack/server.rb
|
86
102
|
- lib/stack/template.rb
|
87
103
|
- lib/stack/templates/layout.rb
|
88
104
|
- lib/stack/templates/page.rb
|
105
|
+
- lib/stack/watcher.rb
|
89
106
|
- test/helper.rb
|
90
107
|
- test/test_stack.rb
|
91
108
|
has_rdoc: true
|
data/README.rdoc
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
= stack
|
2
|
-
|
3
|
-
Generates a static site from template files with YAML and Liquid. Stack supports template transformation through Markdown, Textile and Less CSS.
|
4
|
-
|
5
|
-
Within template files, stack allows you to use bi-directional YAML variables and include files.
|
6
|
-
|
7
|
-
== Note on Patches/Pull Requests
|
8
|
-
|
9
|
-
* Fork the project.
|
10
|
-
* Make your feature addition or bug fix.
|
11
|
-
* Add tests for it. This is important so I don't break it in a
|
12
|
-
future version unintentionally.
|
13
|
-
* Commit, do not mess with rakefile, version, or history.
|
14
|
-
(if you want to have your own version, that is fine but
|
15
|
-
bump version in a commit by itself I can ignore when I pull)
|
16
|
-
* Send me a pull request. Bonus points for topic branches.
|
17
|
-
|
18
|
-
== Copyright
|
19
|
-
|
20
|
-
Copyright (c) 2009 Adam Livesley (sixones). See LICENSE for details.
|