stack 0.0.3 → 0.0.4
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.
- data/README.rdoc +3 -1
- data/Rakefile +6 -0
- data/VERSION.yml +1 -1
- data/lib/core_ext/hash.rb +6 -0
- data/lib/stack/generator.rb +50 -10
- data/lib/stack/parsable.rb +2 -8
- data/lib/stack/runner.rb +1 -1
- data/lib/stack/template.rb +52 -13
- data/lib/stack/templates/page.rb +4 -0
- data/lib/stack.rb +10 -4
- metadata +31 -1
data/README.rdoc
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
= stack
|
2
2
|
|
3
|
-
|
3
|
+
Generates a static site from template files in Liquid, Markdown and Textile, based on Jekyll and Tzatziki.
|
4
|
+
|
5
|
+
Within template files, stack allows you to use bi-directional YAML variables and include files.
|
4
6
|
|
5
7
|
== Note on Patches/Pull Requests
|
6
8
|
|
data/Rakefile
CHANGED
@@ -10,9 +10,15 @@ begin
|
|
10
10
|
gem.email = "dev@sixones.com"
|
11
11
|
gem.homepage = "http://github.com/sixones/stack"
|
12
12
|
gem.authors = ["sixones"]
|
13
|
+
|
13
14
|
gem.files = FileList['lib/**/*.rb', 'bin/*', '[A-Z]*', 'test/**/*'].to_a
|
15
|
+
|
14
16
|
gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
|
17
|
+
|
15
18
|
gem.add_dependency "liquid", ">= 1.9.0"
|
19
|
+
gem.add_dependency "RedCloth", ">= 4.2.1"
|
20
|
+
gem.add_dependency "maruku", ">= 0.5.9"
|
21
|
+
gem.add_dependency "less", ">= 1.0.0"
|
16
22
|
|
17
23
|
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
18
24
|
end
|
data/VERSION.yml
CHANGED
data/lib/core_ext/hash.rb
CHANGED
data/lib/stack/generator.rb
CHANGED
@@ -1,9 +1,21 @@
|
|
1
1
|
module Stack
|
2
2
|
class Generator
|
3
|
+
attr_accessor :parent
|
4
|
+
attr_accessor :source, :target
|
5
|
+
|
6
|
+
attr_accessor :children
|
3
7
|
attr_accessor :layouts
|
4
8
|
attr_accessor :pages
|
5
9
|
|
6
|
-
def initialize
|
10
|
+
def initialize(source, target, parent = nil)
|
11
|
+
self.source = source
|
12
|
+
self.target = target
|
13
|
+
self.parent = parent
|
14
|
+
|
15
|
+
self.layouts = (parent) ? parent.layouts.dup : { }
|
16
|
+
|
17
|
+
self.children = [ ]
|
18
|
+
|
7
19
|
# read layouts
|
8
20
|
# read pages
|
9
21
|
# write pages
|
@@ -14,24 +26,50 @@ module Stack
|
|
14
26
|
def process!
|
15
27
|
read_layouts
|
16
28
|
read_pages
|
29
|
+
|
30
|
+
read_children
|
17
31
|
end
|
18
32
|
|
19
33
|
def read_layouts
|
20
|
-
|
34
|
+
if File.exists?(File.join(self.source, "_layouts"))
|
35
|
+
@layouts = @layouts.merge(read_pages_from_directory("_layouts", Stack::Templates::Layout))
|
36
|
+
end
|
21
37
|
end
|
22
38
|
|
23
39
|
def read_pages
|
24
|
-
@pages = read_pages_from_directory(
|
40
|
+
@pages = read_pages_from_directory(self.source, Stack::Templates::Page)
|
41
|
+
end
|
42
|
+
|
43
|
+
def read_children
|
44
|
+
entries = Dir.entries(self.source)
|
45
|
+
directories = entries.select { |e| File.directory?(File.join(self.source, e)) }
|
46
|
+
directories = directories.reject { |d| d[0..0]=~/\.|_/ or d[-1..-1]=="~" }
|
47
|
+
directories.each do |dir|
|
48
|
+
self.children.push(Stack::Generator.new(File.join(self.source, dir), File.join(self.target, dir), self))
|
49
|
+
end
|
25
50
|
end
|
26
51
|
|
27
52
|
def transform!
|
28
|
-
puts @layouts
|
29
|
-
puts @pages
|
30
|
-
|
31
53
|
self.pages.each do |name, page|
|
32
|
-
puts "Page -> #{name} #{page}"
|
33
54
|
page.write!
|
34
55
|
end
|
56
|
+
|
57
|
+
transform_assets
|
58
|
+
|
59
|
+
self.children.each { |c| c.transform! }
|
60
|
+
end
|
61
|
+
|
62
|
+
def transform_assets
|
63
|
+
files = Dir.entries(self.source)
|
64
|
+
files = files.reject { |e| File.directory?(File.join(self.source, e)) }
|
65
|
+
files = files.reject { |e| e[0..0]=~/\.|_/ or e[-1..-1]=="~" }
|
66
|
+
files = files.reject { |e| (%w(.yaml .yml)+Stack::EXTENSIONS).include?(File.extname(e)) } # Exception cases
|
67
|
+
|
68
|
+
FileUtils.mkdir_p(self.target)
|
69
|
+
|
70
|
+
files.each do |f|
|
71
|
+
FileUtils.cp(File.join(self.source, File.basename(f)), File.join(self.target, File.basename(f)))
|
72
|
+
end
|
35
73
|
end
|
36
74
|
|
37
75
|
def to_hash
|
@@ -45,16 +83,18 @@ module Stack
|
|
45
83
|
pages = { }
|
46
84
|
|
47
85
|
begin
|
48
|
-
path = (folder ==
|
49
|
-
|
86
|
+
path = (folder == self.source) ? folder : File.join(self.source, folder)
|
87
|
+
folder = (folder == self.source) ? folder : ""
|
50
88
|
|
89
|
+
entries = Dir.entries(path)
|
90
|
+
|
51
91
|
files = entries.reject { |e| File.directory?(File.join(path, e)) }
|
52
92
|
files = files.reject { |e| e[0..0]=~/\.|_/ or e[-1..-1]=="~" }
|
53
93
|
files = files.select { |e| Stack::EXTENSIONS.include?(File.extname(e)) }
|
54
94
|
|
55
95
|
files.each do |f|
|
56
96
|
trans = transformable_klass.new(File.join(path, f), self)
|
57
|
-
pages[f.split(".").first] = trans
|
97
|
+
pages["#{f.split(".").first}"] = trans
|
58
98
|
end
|
59
99
|
rescue Errno::ENOENT => e
|
60
100
|
# Ignore
|
data/lib/stack/parsable.rb
CHANGED
@@ -6,12 +6,10 @@ module Stack
|
|
6
6
|
|
7
7
|
def parse!(raw_doc = self.raw, defaults = { })
|
8
8
|
self.data, self.raw = extract_yaml(raw_doc, nil, defaults)
|
9
|
-
|
10
|
-
puts self.data
|
11
9
|
end
|
12
10
|
|
13
11
|
def payload
|
14
|
-
self.data.deep_symbolize.merge(:
|
12
|
+
self.data.deep_symbolize.merge(:data => inline_data)
|
15
13
|
end
|
16
14
|
|
17
15
|
def extract_yaml(raw, replace = nil, defaults = { })
|
@@ -21,13 +19,9 @@ module Stack
|
|
21
19
|
out = raw.dup
|
22
20
|
i = -1
|
23
21
|
|
24
|
-
puts "out -> #{out}"
|
25
|
-
|
26
22
|
while out =~ /^(---\s*\n.*?\n?)(---.*?\n)/m
|
27
23
|
yaml = $1.dup
|
28
|
-
out = out.gsub(/#{Regexp.escape(yaml)}#{Regexp.escape($2)}/m,((i>-1) ? "{{ document.
|
29
|
-
|
30
|
-
puts "out2 -> #{out}"
|
24
|
+
out = out.gsub(/#{Regexp.escape(yaml)}#{Regexp.escape($2)}/m,((i>-1) ? "{{ document.data[#{i}] | render_table }}" : ""))
|
31
25
|
|
32
26
|
d = YAML.load(yaml)
|
33
27
|
|
data/lib/stack/runner.rb
CHANGED
data/lib/stack/template.rb
CHANGED
@@ -4,15 +4,25 @@ module Stack
|
|
4
4
|
|
5
5
|
attr_accessor :basename
|
6
6
|
attr_accessor :path
|
7
|
+
attr_accessor :original_extension
|
8
|
+
attr_accessor :extension
|
7
9
|
|
8
10
|
attr_accessor :raw
|
9
11
|
|
10
12
|
def initialize(path, generator = nil)
|
11
13
|
self.generator = generator
|
12
14
|
self.path = path
|
15
|
+
self.original_extension = "html"
|
13
16
|
|
14
17
|
if File.file?(path)
|
15
18
|
self.basename = File.basename(path)
|
19
|
+
ext = File.extname(path)
|
20
|
+
|
21
|
+
self.original_extension = ext[1, ext.length]
|
22
|
+
self.extension = self.original_extension
|
23
|
+
|
24
|
+
puts self.original_extension
|
25
|
+
puts self.extension
|
16
26
|
|
17
27
|
read
|
18
28
|
end
|
@@ -26,15 +36,33 @@ module Stack
|
|
26
36
|
|
27
37
|
def render(_payload = { }, do_layout = true)
|
28
38
|
_payload = template_payload.deep_merge(_payload)
|
29
|
-
|
30
|
-
|
39
|
+
|
40
|
+
layout_name = _payload[:layout]
|
41
|
+
|
42
|
+
if (layout_name and do_layout)
|
43
|
+
puts "has layout! #{layout_name}"
|
44
|
+
|
45
|
+
# get layout
|
46
|
+
_tpl_payload = self.generator.layouts[layout_name].template_payload
|
47
|
+
_tpl_payload.delete(:layout)
|
48
|
+
|
49
|
+
puts _tpl_payload.inspect
|
50
|
+
puts "\n"
|
51
|
+
|
52
|
+
_payload = _payload.merge(_tpl_payload)
|
53
|
+
end
|
54
|
+
|
55
|
+
puts _payload.inspect
|
56
|
+
puts "\n\n"
|
57
|
+
|
58
|
+
content = Liquid::Template.parse(self.raw).render(Mash.new(_payload))
|
31
59
|
content = self.transform(content)
|
32
60
|
|
33
|
-
if (layout_name
|
61
|
+
if (layout_name and do_layout)
|
34
62
|
_payload.delete(:layout)
|
35
63
|
begin
|
36
|
-
_payload = _payload.
|
37
|
-
|
64
|
+
_payload = _payload.merge({ :content => content })
|
65
|
+
|
38
66
|
content = self.generator.layouts[layout_name].render(_payload)
|
39
67
|
rescue => e
|
40
68
|
STDERR.puts e.to_str
|
@@ -46,6 +74,7 @@ module Stack
|
|
46
74
|
|
47
75
|
def template_payload
|
48
76
|
{
|
77
|
+
:template => self.to_hash,
|
49
78
|
:generator => self.generator.to_hash
|
50
79
|
}.merge(self.payload)
|
51
80
|
end
|
@@ -54,20 +83,31 @@ module Stack
|
|
54
83
|
raise InterfaceNotProvided
|
55
84
|
end
|
56
85
|
|
86
|
+
def to_hash
|
87
|
+
{
|
88
|
+
|
89
|
+
}.merge(self.payload)
|
90
|
+
end
|
91
|
+
|
57
92
|
def transform(content = self.raw)
|
58
93
|
case self.basename
|
59
94
|
when /\.textile/
|
95
|
+
self.extension = "html"
|
60
96
|
RedCloth.new(content).to_html
|
61
|
-
when /\.(mdown|markdown)/
|
97
|
+
when /\.(mdown|markdown|mkdn|md)/
|
98
|
+
self.extension = "html"
|
62
99
|
Maruku.new(content).to_html
|
100
|
+
when /\.(less)/
|
101
|
+
self.extension = "css"
|
102
|
+
Less::Engine.new(content).to_css
|
103
|
+
when /\.(liquid|liq)/
|
104
|
+
self.extension = "html"
|
63
105
|
else
|
64
106
|
content
|
65
107
|
end
|
66
108
|
end
|
67
109
|
|
68
110
|
def write!(content = self.render)
|
69
|
-
puts write_path
|
70
|
-
|
71
111
|
FileUtils.mkdir_p(File.dirname(write_path))
|
72
112
|
out = File.open(write_path, "w+")
|
73
113
|
out.rewind
|
@@ -76,20 +116,19 @@ module Stack
|
|
76
116
|
end
|
77
117
|
|
78
118
|
def write_path
|
79
|
-
File.join(
|
119
|
+
File.join(self.generator.target, self.write_filename)
|
80
120
|
end
|
81
121
|
|
82
122
|
def write_basename
|
83
|
-
if basename
|
84
|
-
|
85
|
-
basename[0..(basename.length - ext.length - 1)]
|
123
|
+
if self.basename
|
124
|
+
self.basename.gsub(".#{self.original_extension}", "")
|
86
125
|
else
|
87
126
|
@write_basename ||= Digest::MD5.hexdigest(self.raw)
|
88
127
|
end
|
89
128
|
end
|
90
129
|
|
91
130
|
def write_filename
|
92
|
-
"#{write_basename}.
|
131
|
+
"#{write_basename}.#{self.extension}"
|
93
132
|
end
|
94
133
|
end
|
95
134
|
end
|
data/lib/stack/templates/page.rb
CHANGED
data/lib/stack.rb
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
# rubygems
|
2
2
|
require 'rubygems'
|
3
|
+
|
3
4
|
require 'optparse'
|
5
|
+
|
4
6
|
require 'liquid'
|
7
|
+
require 'maruku'
|
8
|
+
require 'mash'
|
9
|
+
require 'RedCloth'
|
10
|
+
require 'less'
|
5
11
|
|
6
12
|
require 'core_ext/hash'
|
7
13
|
|
@@ -25,8 +31,8 @@ module Stack
|
|
25
31
|
# Array of valid commands stack can use
|
26
32
|
COMMANDS = %w(create generate server)
|
27
33
|
|
28
|
-
# Array of
|
29
|
-
EXTENSIONS = %w(.html .markdown .mdown)
|
34
|
+
# Array of transformable extensions (these extensions go through the liquid transformer)
|
35
|
+
EXTENSIONS = %w(.html .markdown .mdown .mkdn .md .textile .js .css)
|
30
36
|
|
31
37
|
class << self
|
32
38
|
attr_accessor :runner
|
@@ -48,7 +54,7 @@ module Stack
|
|
48
54
|
opts.on("-t", "--target [DIR]", "Directory to use as the target directory") do |l| config[:target] = l unless l.nil? end
|
49
55
|
|
50
56
|
opts.on_tail("-h", "--help", "Show this message") { puts opts; exit }
|
51
|
-
opts.on_tail("-v", "--version" "Show version") do puts "stack #{Stack::version}"; exit; end
|
57
|
+
opts.on_tail("-v", "--version", "Show version") do puts "stack #{Stack::version}"; exit; end
|
52
58
|
end
|
53
59
|
|
54
60
|
parser.parse! argv
|
@@ -61,7 +67,7 @@ module Stack
|
|
61
67
|
# Merges the configuration from YAML file, command line and defaults
|
62
68
|
def self.configuration(override)
|
63
69
|
config = { }
|
64
|
-
source = File.join(override[
|
70
|
+
source = File.join(override[:source] || Stack::DEFAULTS[:source])
|
65
71
|
|
66
72
|
config_file = File.join(source, "_stack.yml")
|
67
73
|
|
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.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sixones
|
@@ -32,6 +32,36 @@ dependencies:
|
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.9.0
|
34
34
|
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: RedCloth
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 4.2.1
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: maruku
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 0.5.9
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: less
|
57
|
+
type: :runtime
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 1.0.0
|
64
|
+
version:
|
35
65
|
description: Generates a static site from template files in Liquid, Markdown and Textile.
|
36
66
|
email: dev@sixones.com
|
37
67
|
executables:
|