awestructx 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/awestruct +8 -0
- data/lib/awestruct/astruct.rb +22 -0
- data/lib/awestruct/astruct_mixin.rb +71 -0
- data/lib/awestruct/cli/auto.rb +20 -0
- data/lib/awestruct/cli/generate.rb +26 -0
- data/lib/awestruct/cli/invoker.rb +109 -0
- data/lib/awestruct/cli/options.rb +116 -0
- data/lib/awestruct/cli/server.rb +24 -0
- data/lib/awestruct/config.rb +30 -0
- data/lib/awestruct/context.rb +22 -0
- data/lib/awestruct/context_helper.rb +68 -0
- data/lib/awestruct/engine.rb +254 -0
- data/lib/awestruct/extensions/assets.rb +39 -0
- data/lib/awestruct/extensions/atomizer.rb +44 -0
- data/lib/awestruct/extensions/cachebuster.rb +12 -0
- data/lib/awestruct/extensions/coffeescripttransform.rb +42 -0
- data/lib/awestruct/extensions/data_dir.rb +31 -0
- data/lib/awestruct/extensions/disqus.rb +62 -0
- data/lib/awestruct/extensions/extend_string.rb +97 -0
- data/lib/awestruct/extensions/flattr.rb +42 -0
- data/lib/awestruct/extensions/google_analytics.rb +38 -0
- data/lib/awestruct/extensions/gsub.rb +20 -0
- data/lib/awestruct/extensions/indexifier.rb +17 -0
- data/lib/awestruct/extensions/intense_debate.rb +38 -0
- data/lib/awestruct/extensions/minify.rb +178 -0
- data/lib/awestruct/extensions/obfuscate.rb +32 -0
- data/lib/awestruct/extensions/paginator.rb +105 -0
- data/lib/awestruct/extensions/partial.rb +25 -0
- data/lib/awestruct/extensions/pipeline.rb +50 -0
- data/lib/awestruct/extensions/posts.rb +70 -0
- data/lib/awestruct/extensions/relative.rb +11 -0
- data/lib/awestruct/extensions/remotePartial.rb +17 -0
- data/lib/awestruct/extensions/sitemap.rb +85 -0
- data/lib/awestruct/extensions/sitemap.xml.haml +16 -0
- data/lib/awestruct/extensions/tag_cloud.html.haml +7 -0
- data/lib/awestruct/extensions/tag_cloud.rb +34 -0
- data/lib/awestruct/extensions/tagger.rb +107 -0
- data/lib/awestruct/extensions/template.atom.haml +39 -0
- data/lib/awestruct/handler_chain.rb +28 -0
- data/lib/awestruct/handler_chains.rb +65 -0
- data/lib/awestruct/handlers/base_handler.rb +92 -0
- data/lib/awestruct/handlers/base_sass_handler.rb +42 -0
- data/lib/awestruct/handlers/file_handler.rb +61 -0
- data/lib/awestruct/handlers/front_matter_handler.rb +80 -0
- data/lib/awestruct/handlers/haml_handler.rb +42 -0
- data/lib/awestruct/handlers/interpolation_handler.rb +28 -0
- data/lib/awestruct/handlers/layout_handler.rb +61 -0
- data/lib/awestruct/handlers/markdown_handler.rb +36 -0
- data/lib/awestruct/handlers/no_op_handler.rb +34 -0
- data/lib/awestruct/handlers/sass_handler.rb +14 -0
- data/lib/awestruct/handlers/scss_handler.rb +14 -0
- data/lib/awestruct/handlers/string_handler.rb +29 -0
- data/lib/awestruct/handlers/textile_handler.rb +43 -0
- data/lib/awestruct/handlers/yaml_handler.rb +25 -0
- data/lib/awestruct/layouts.rb +15 -0
- data/lib/awestruct/page.rb +128 -0
- data/lib/awestruct/page_loader.rb +72 -0
- data/lib/awestruct/pipeline.rb +49 -0
- data/lib/awestruct/site.rb +51 -0
- data/lib/awestruct/util/default_inflections.rb +45 -0
- data/lib/awestruct/util/inflector.rb +242 -0
- data/lib/awestruct/version.rb +4 -0
- data/lib/guard/awestruct.rb +38 -0
- metadata +427 -0
@@ -0,0 +1,32 @@
|
|
1
|
+
module Awestruct
|
2
|
+
module Extensions
|
3
|
+
module Obfuscate
|
4
|
+
|
5
|
+
def mail_to(email, options={})
|
6
|
+
index = email.index('@') or raise "email needs to contain @"
|
7
|
+
index += 3
|
8
|
+
parts = [ email[0...index], email[index..-1] ]
|
9
|
+
"<a\nclass='#{options[:class]}\nhref=\"mailto:x@y\"\n'\nhref\n = '#{hex('mailto:' + percent(email))}\n'>#{hex(parts[0])}<!--\nmailto:abuse@hotmail.com\n</a>\n-->#{hex(parts[1])}</a>"
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def hex(s)
|
15
|
+
result = ''
|
16
|
+
s.each_codepoint do |cp|
|
17
|
+
result << "&#x%x;" % [cp]
|
18
|
+
end
|
19
|
+
result
|
20
|
+
end
|
21
|
+
|
22
|
+
def percent(s)
|
23
|
+
result = ''
|
24
|
+
s.each_codepoint do |cp|
|
25
|
+
result << "%%%x" % [cp]
|
26
|
+
end
|
27
|
+
result
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module Awestruct
|
2
|
+
module Extensions
|
3
|
+
class Paginator
|
4
|
+
|
5
|
+
module Paginated
|
6
|
+
attr_accessor :window
|
7
|
+
attr_accessor :next_page
|
8
|
+
attr_accessor :previous_page
|
9
|
+
attr_accessor :current_page
|
10
|
+
attr_accessor :current_page_index
|
11
|
+
attr_accessor :pages
|
12
|
+
|
13
|
+
def links
|
14
|
+
html = %Q(<div class="pagination-links">)
|
15
|
+
unless ( previous_page.nil? )
|
16
|
+
html += %Q(<a href="#{previous_page.url}" class="previous-link">Previous</a> )
|
17
|
+
end
|
18
|
+
first_skip = false
|
19
|
+
second_skip = false
|
20
|
+
pages.each_with_index do |page, i|
|
21
|
+
if ( i == current_page_index )
|
22
|
+
html += %Q(<span class="current-page">#{i+1}</span> )
|
23
|
+
elsif ( i <= window )
|
24
|
+
html += %Q(<a href="#{page.url}" class="page-link">#{i+1}</a> )
|
25
|
+
elsif ( ( i > window ) && ( i < ( current_page_index - window ) ) && ! first_skip )
|
26
|
+
html += %Q(<span class="skip">...</span>)
|
27
|
+
first_skip = true
|
28
|
+
elsif ( ( i > ( current_page_index + window ) ) && ( i < ( ( pages.size - window ) - 1 ) ) && ! second_skip )
|
29
|
+
html += %Q(<span class="skip">...</span>)
|
30
|
+
second_skip = true
|
31
|
+
elsif ( ( i >= ( current_page_index - window ) ) && ( i <= ( current_page_index + window ) ) )
|
32
|
+
html += %Q(<a href="#{page.url}" class="page-link">#{i+1}</a> )
|
33
|
+
elsif ( i >= ( ( pages.size - window ) - 1 ) )
|
34
|
+
html += %Q(<a href="#{page.url}" class="page-link">#{i+1}</a> )
|
35
|
+
end
|
36
|
+
end
|
37
|
+
unless ( next_page.nil? )
|
38
|
+
html += %Q(<a href="#{next_page.url}" class="next-link">Next</a> )
|
39
|
+
end
|
40
|
+
html += %Q(</div>)
|
41
|
+
html
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(prop_name, input_path, opts={})
|
47
|
+
@prop_name = prop_name
|
48
|
+
@input_path = input_path
|
49
|
+
@per_page = opts[:per_page] || 20
|
50
|
+
@window_size = opts[:window_size] || 2
|
51
|
+
@remove_input = opts.has_key?( :remove_input ) ? opts[:remove_input] : true
|
52
|
+
@output_prefix = opts[:output_prefix] || File.dirname( @input_path )
|
53
|
+
@collection = opts[:collection]
|
54
|
+
end
|
55
|
+
|
56
|
+
def execute(site)
|
57
|
+
removal_path = nil
|
58
|
+
all = @collection || site.send( @prop_name )
|
59
|
+
i = 1
|
60
|
+
paginated_pages = []
|
61
|
+
all.each_slice( @per_page ) do |slice|
|
62
|
+
page = site.engine.find_and_load_site_page( @input_path )
|
63
|
+
removal_path ||= page.output_path
|
64
|
+
slice.extend( Paginated )
|
65
|
+
page.send( "#{@prop_name}=", slice )
|
66
|
+
if ( i == 1 )
|
67
|
+
page.output_path = File.join( @output_prefix, File.basename( @input_path ) + ".html" )
|
68
|
+
else
|
69
|
+
page.output_path = File.join( @output_prefix, "page/#{i}.html" )
|
70
|
+
end
|
71
|
+
page.paginate_generated = true
|
72
|
+
site.pages << page
|
73
|
+
paginated_pages << page
|
74
|
+
i = i + 1
|
75
|
+
end
|
76
|
+
|
77
|
+
if ( @remove_input )
|
78
|
+
site.pages.reject!{|page|
|
79
|
+
( ! page.paginate_generated && ( page.output_path == removal_path ) )
|
80
|
+
}
|
81
|
+
end
|
82
|
+
|
83
|
+
prev_page = nil
|
84
|
+
paginated_pages.each_with_index do |page,i|
|
85
|
+
slice = page.send( @prop_name )
|
86
|
+
|
87
|
+
slice.current_page = page
|
88
|
+
slice.current_page_index = i
|
89
|
+
slice.pages = paginated_pages
|
90
|
+
slice.window = 1
|
91
|
+
|
92
|
+
if ( prev_page != nil )
|
93
|
+
prev_page.send( @prop_name ).next_page = page
|
94
|
+
page.send( @prop_name ).previous_page = prev_page
|
95
|
+
end
|
96
|
+
|
97
|
+
prev_page = page
|
98
|
+
end
|
99
|
+
|
100
|
+
paginated_pages.first
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Awestruct
|
2
|
+
module Extensions
|
3
|
+
module Partial
|
4
|
+
|
5
|
+
def partial(path, params = {})
|
6
|
+
filename = File.join( '_partials', path )
|
7
|
+
|
8
|
+
if !File.exists?( filename )
|
9
|
+
return nil
|
10
|
+
end
|
11
|
+
|
12
|
+
page = site.engine.load_site_page( filename )
|
13
|
+
|
14
|
+
return nil if !page
|
15
|
+
|
16
|
+
params.each do |k,v|
|
17
|
+
page.send( "#{k}=", v )
|
18
|
+
end if params
|
19
|
+
|
20
|
+
page.content
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
|
2
|
+
Dir[ File.join( File.dirname(__FILE__), '*.rb' ) ].each do |f|
|
3
|
+
require f
|
4
|
+
end
|
5
|
+
|
6
|
+
module Awestruct
|
7
|
+
module Extensions
|
8
|
+
class Pipeline
|
9
|
+
|
10
|
+
attr_reader :before_extensions
|
11
|
+
attr_reader :extensions
|
12
|
+
attr_reader :after_extensions
|
13
|
+
attr_reader :helpers
|
14
|
+
attr_reader :transformers
|
15
|
+
|
16
|
+
def initialize(&block)
|
17
|
+
@extensions = []
|
18
|
+
@helpers = []
|
19
|
+
@transformers = []
|
20
|
+
instance_eval &block if block
|
21
|
+
end
|
22
|
+
|
23
|
+
def extension(ext)
|
24
|
+
@extensions << ext
|
25
|
+
ext.transform(@transformers) if ext.respond_to?('transform')
|
26
|
+
end
|
27
|
+
|
28
|
+
def helper(helper)
|
29
|
+
@helpers << helper
|
30
|
+
end
|
31
|
+
|
32
|
+
def transformer(transformer)
|
33
|
+
@transformers << transformer
|
34
|
+
end
|
35
|
+
|
36
|
+
def execute(site)
|
37
|
+
extensions.each do |ext|
|
38
|
+
ext.execute( site )
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def watch(watched_dirs)
|
43
|
+
extensions.each do |ext|
|
44
|
+
ext.watch( watched_dirs ) if ext.respond_to?('watch')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module Awestruct
|
2
|
+
module Extensions
|
3
|
+
class Posts
|
4
|
+
|
5
|
+
def initialize(path_prefix='', assign_to=:posts)
|
6
|
+
@path_prefix = path_prefix
|
7
|
+
@assign_to = assign_to
|
8
|
+
end
|
9
|
+
|
10
|
+
def execute(site)
|
11
|
+
posts = []
|
12
|
+
|
13
|
+
site.pages.each do |page|
|
14
|
+
year, month, day, slug = nil
|
15
|
+
|
16
|
+
if ( page.relative_source_path =~ /^#{@path_prefix}\// )
|
17
|
+
if ( page.relative_source_path =~ /^#{@path_prefix}\/(20[01][0-9])-([01][0-9])-([0123][0-9])-([^.]+)\..*$/ )
|
18
|
+
year = $1
|
19
|
+
month = $2
|
20
|
+
day = $3
|
21
|
+
slug = $4
|
22
|
+
page.date = Time.utc( year.to_i, month.to_i, day.to_i )
|
23
|
+
elsif (page.date?)
|
24
|
+
page.relative_source_path =~ /^#{@path_prefix}\/(.*)\..*$/
|
25
|
+
date = page.date;
|
26
|
+
if date.kind_of? String
|
27
|
+
date = Time.parse page.date
|
28
|
+
end
|
29
|
+
year = date.year
|
30
|
+
month = date.month
|
31
|
+
day = date.day
|
32
|
+
page.date = Time.utc(year, month, day)
|
33
|
+
slug = $1
|
34
|
+
end
|
35
|
+
|
36
|
+
# if a date was found create a post
|
37
|
+
if( year and month and day)
|
38
|
+
page.slug = slug
|
39
|
+
#context = OpenStruct.new({
|
40
|
+
#:site=>site,
|
41
|
+
#:page=>page,
|
42
|
+
#})
|
43
|
+
context = page.create_context
|
44
|
+
#page.body = page.render( context )
|
45
|
+
page.output_path = "#{@path_prefix}/#{year}/#{month}/#{day}/#{slug}.html"
|
46
|
+
#page.layout = 'post'
|
47
|
+
posts << page
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
posts = posts.sort_by{|each| [each.date, each.sequence || 0, File.mtime( each.source_path ), each.slug ] }.reverse
|
53
|
+
|
54
|
+
last = nil
|
55
|
+
singular = @assign_to.to_s.singularize
|
56
|
+
posts.each do |e|
|
57
|
+
if ( last != nil )
|
58
|
+
e.send( "next_#{singular}=", last )
|
59
|
+
last.send( "previous_#{singular}=", e )
|
60
|
+
end
|
61
|
+
last = e
|
62
|
+
end
|
63
|
+
|
64
|
+
site.send( "#{@assign_to}=", posts )
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# Generates a sitemap for search engines. Defaults to /sitemap.xml
|
2
|
+
# Ignores images, css, robots, atoms, javascript files.
|
3
|
+
# Add a sitemap.yml file to add files that for one reason or
|
4
|
+
# another won't be hanging off of site (e.g. they're in .htaccess)
|
5
|
+
require 'ostruct'
|
6
|
+
|
7
|
+
module Awestruct
|
8
|
+
module Extensions
|
9
|
+
class Sitemap
|
10
|
+
|
11
|
+
def execute( site )
|
12
|
+
|
13
|
+
# Go through all of the site's pages and add sitemap metadata
|
14
|
+
sitemap_pages = []
|
15
|
+
entries = site.pages
|
16
|
+
entries.each { |entry| sitemap_pages << set_sitemap_data( entry ) if valid_sitemap_entry( entry ) } if entries
|
17
|
+
|
18
|
+
# Generate sitemap pages for stuff in _config/sitemap.yml
|
19
|
+
site.sitemap.pages.each do |entry|
|
20
|
+
page = Awestruct::Page.new( site )
|
21
|
+
page.output_path = entry.url
|
22
|
+
page.date = entry.date( nil )
|
23
|
+
page.priority = entry.priority( nil )
|
24
|
+
page.change_frequency = entry.change_frequency( nil )
|
25
|
+
sitemap_pages << page
|
26
|
+
end if site.sitemap
|
27
|
+
|
28
|
+
# Generate the correct urls for each page in the sitemap
|
29
|
+
site.engine.set_urls( sitemap_pages )
|
30
|
+
|
31
|
+
# Create a sitemap.xml file from our template
|
32
|
+
sitemap = File.join( File.dirname(__FILE__), 'sitemap.xml.haml' )
|
33
|
+
page = site.engine.load_page( sitemap )
|
34
|
+
page.output_path = 'sitemap.xml'
|
35
|
+
page.sitemap_entries = sitemap_pages
|
36
|
+
|
37
|
+
# Add the sitemap to our site
|
38
|
+
site.pages << page
|
39
|
+
end
|
40
|
+
|
41
|
+
protected
|
42
|
+
|
43
|
+
def set_sitemap_data( page )
|
44
|
+
site = page.site
|
45
|
+
munge_date( page )
|
46
|
+
page.priority ||= (site.priority or 0.1)
|
47
|
+
page.change_frequency ||= (site.change_frequency or 'never')
|
48
|
+
page
|
49
|
+
end
|
50
|
+
|
51
|
+
def munge_date( page )
|
52
|
+
date = page.date
|
53
|
+
if date
|
54
|
+
begin
|
55
|
+
if date.kind_of? String
|
56
|
+
page.lastmod = Time.parse( page.date ).strftime( "%Y-%m-%d" )
|
57
|
+
else
|
58
|
+
page.lastmod = date.strftime( "%Y-%m-%d" )
|
59
|
+
end
|
60
|
+
rescue Exception => e
|
61
|
+
puts "[ERROR] Cannot parse date #{date.to_s}: #{e}"
|
62
|
+
end
|
63
|
+
else
|
64
|
+
page.lastmod = Time.now.strftime( "%Y-%m-%d" )
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def valid_sitemap_entry( page )
|
69
|
+
page.output_filename != '.htaccess' &&
|
70
|
+
page.output_filename != 'screen.css' &&
|
71
|
+
page.output_filename != 'print.css' &&
|
72
|
+
page.output_filename != 'ie.css' &&
|
73
|
+
page.output_filename != 'robots.txt' &&
|
74
|
+
page.output_extension != '.atom' &&
|
75
|
+
page.output_extension != '.scss' &&
|
76
|
+
page.output_extension != '.css' &&
|
77
|
+
page.output_extension != '.png' &&
|
78
|
+
page.output_extension != '.jpg' &&
|
79
|
+
page.output_extension != '.gif' &&
|
80
|
+
page.output_extension != '.js'
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
---
|
3
|
+
!!! XML
|
4
|
+
|
5
|
+
%urlset{ :xmlns=>'http://www.sitemaps.org/schemas/sitemap/0.9' }
|
6
|
+
- unless page.sitemap_entries.empty?
|
7
|
+
- for entry in page.sitemap_entries
|
8
|
+
%url
|
9
|
+
%loc= "#{entry.site.base_url}#{entry.url}"
|
10
|
+
- if entry.lastmod
|
11
|
+
%lastmod= entry.lastmod
|
12
|
+
- if entry.priority
|
13
|
+
%priority= entry.priority
|
14
|
+
- if entry.change_frequency
|
15
|
+
%changefreq= entry.change_frequency
|
16
|
+
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Awestruct
|
2
|
+
module Extensions
|
3
|
+
class TagCloud
|
4
|
+
|
5
|
+
def initialize(tagged_items_property, output_path='tags', opts={})
|
6
|
+
@tagged_items_property = tagged_items_property
|
7
|
+
@output_path = output_path
|
8
|
+
@layout = opts[:layout].to_s
|
9
|
+
@title = opts[:title] || 'Tags'
|
10
|
+
end
|
11
|
+
|
12
|
+
def execute(site)
|
13
|
+
page = site.engine.load_page( File.join( File.dirname( __FILE__ ), 'tag_cloud.html.haml' ) )
|
14
|
+
page.output_path = File.join( @output_path )
|
15
|
+
page.layout = @layout
|
16
|
+
page.title = @title
|
17
|
+
page.tags = site.send( "#{@tagged_items_property}_tags" ) || []
|
18
|
+
site.pages << page
|
19
|
+
site.send( "#{@tagged_items_property}_tag_cloud=", LazyPage.new( page ) )
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class LazyPage
|
25
|
+
def initialize(page)
|
26
|
+
@page = page
|
27
|
+
end
|
28
|
+
def to_s
|
29
|
+
@page.content
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|