awestructx 0.4.0
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/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
|