awestructx 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. data/bin/awestruct +8 -0
  2. data/lib/awestruct/astruct.rb +22 -0
  3. data/lib/awestruct/astruct_mixin.rb +71 -0
  4. data/lib/awestruct/cli/auto.rb +20 -0
  5. data/lib/awestruct/cli/generate.rb +26 -0
  6. data/lib/awestruct/cli/invoker.rb +109 -0
  7. data/lib/awestruct/cli/options.rb +116 -0
  8. data/lib/awestruct/cli/server.rb +24 -0
  9. data/lib/awestruct/config.rb +30 -0
  10. data/lib/awestruct/context.rb +22 -0
  11. data/lib/awestruct/context_helper.rb +68 -0
  12. data/lib/awestruct/engine.rb +254 -0
  13. data/lib/awestruct/extensions/assets.rb +39 -0
  14. data/lib/awestruct/extensions/atomizer.rb +44 -0
  15. data/lib/awestruct/extensions/cachebuster.rb +12 -0
  16. data/lib/awestruct/extensions/coffeescripttransform.rb +42 -0
  17. data/lib/awestruct/extensions/data_dir.rb +31 -0
  18. data/lib/awestruct/extensions/disqus.rb +62 -0
  19. data/lib/awestruct/extensions/extend_string.rb +97 -0
  20. data/lib/awestruct/extensions/flattr.rb +42 -0
  21. data/lib/awestruct/extensions/google_analytics.rb +38 -0
  22. data/lib/awestruct/extensions/gsub.rb +20 -0
  23. data/lib/awestruct/extensions/indexifier.rb +17 -0
  24. data/lib/awestruct/extensions/intense_debate.rb +38 -0
  25. data/lib/awestruct/extensions/minify.rb +178 -0
  26. data/lib/awestruct/extensions/obfuscate.rb +32 -0
  27. data/lib/awestruct/extensions/paginator.rb +105 -0
  28. data/lib/awestruct/extensions/partial.rb +25 -0
  29. data/lib/awestruct/extensions/pipeline.rb +50 -0
  30. data/lib/awestruct/extensions/posts.rb +70 -0
  31. data/lib/awestruct/extensions/relative.rb +11 -0
  32. data/lib/awestruct/extensions/remotePartial.rb +17 -0
  33. data/lib/awestruct/extensions/sitemap.rb +85 -0
  34. data/lib/awestruct/extensions/sitemap.xml.haml +16 -0
  35. data/lib/awestruct/extensions/tag_cloud.html.haml +7 -0
  36. data/lib/awestruct/extensions/tag_cloud.rb +34 -0
  37. data/lib/awestruct/extensions/tagger.rb +107 -0
  38. data/lib/awestruct/extensions/template.atom.haml +39 -0
  39. data/lib/awestruct/handler_chain.rb +28 -0
  40. data/lib/awestruct/handler_chains.rb +65 -0
  41. data/lib/awestruct/handlers/base_handler.rb +92 -0
  42. data/lib/awestruct/handlers/base_sass_handler.rb +42 -0
  43. data/lib/awestruct/handlers/file_handler.rb +61 -0
  44. data/lib/awestruct/handlers/front_matter_handler.rb +80 -0
  45. data/lib/awestruct/handlers/haml_handler.rb +42 -0
  46. data/lib/awestruct/handlers/interpolation_handler.rb +28 -0
  47. data/lib/awestruct/handlers/layout_handler.rb +61 -0
  48. data/lib/awestruct/handlers/markdown_handler.rb +36 -0
  49. data/lib/awestruct/handlers/no_op_handler.rb +34 -0
  50. data/lib/awestruct/handlers/sass_handler.rb +14 -0
  51. data/lib/awestruct/handlers/scss_handler.rb +14 -0
  52. data/lib/awestruct/handlers/string_handler.rb +29 -0
  53. data/lib/awestruct/handlers/textile_handler.rb +43 -0
  54. data/lib/awestruct/handlers/yaml_handler.rb +25 -0
  55. data/lib/awestruct/layouts.rb +15 -0
  56. data/lib/awestruct/page.rb +128 -0
  57. data/lib/awestruct/page_loader.rb +72 -0
  58. data/lib/awestruct/pipeline.rb +49 -0
  59. data/lib/awestruct/site.rb +51 -0
  60. data/lib/awestruct/util/default_inflections.rb +45 -0
  61. data/lib/awestruct/util/inflector.rb +242 -0
  62. data/lib/awestruct/version.rb +4 -0
  63. data/lib/guard/awestruct.rb +38 -0
  64. metadata +427 -0
@@ -0,0 +1,107 @@
1
+
2
+ module Awestruct
3
+ module Extensions
4
+ class Tagger
5
+
6
+ class TagStat
7
+ attr_accessor :pages
8
+ attr_accessor :group
9
+ attr_accessor :primary_page
10
+ def initialize(tag, pages)
11
+ @tag = tag
12
+ @pages = pages
13
+ end
14
+
15
+ def to_s
16
+ @tag
17
+ end
18
+ end
19
+
20
+ module TagLinker
21
+ def tag_links(delimiter = ', ', style_class = nil)
22
+ class_attr = (style_class ? ' class="' + style_class + '"' : '')
23
+ tags.map{|tag| %Q{<a#{class_attr} href="#{tag.primary_page.url}">#{tag}</a>}}.join(delimiter)
24
+ end
25
+ end
26
+
27
+ def initialize(tagged_items_property, input_path, output_path='tags', opts={})
28
+ @tagged_items_property = tagged_items_property
29
+ @input_path = input_path
30
+ @output_path = output_path
31
+ @sanitize = opts[:sanitize] || false
32
+ @pagination_opts = opts
33
+ end
34
+
35
+ def execute(site)
36
+ @tags ||= {}
37
+ all = site.send( @tagged_items_property )
38
+ return if ( all.nil? || all.empty? )
39
+
40
+ all.each do |page|
41
+ tags = page.tags
42
+ if ( tags && ! tags.empty? )
43
+ tags.each do |tag|
44
+ tag = tag.to_s
45
+ @tags[tag] ||= TagStat.new( tag, [] )
46
+ @tags[tag].pages << page
47
+ end
48
+ end
49
+ end
50
+
51
+ all.each do |page|
52
+ page.tags = (page.tags||[]).collect{|t| @tags[t]}
53
+ page.extend( TagLinker )
54
+ end
55
+
56
+ ordered_tags = @tags.values
57
+ ordered_tags.sort!{|l,r| -(l.pages.size <=> r.pages.size)}
58
+ #ordered_tags = ordered_tags[0,100]
59
+ ordered_tags.sort!{|l,r| l.to_s <=> r.to_s}
60
+
61
+ min = 9999
62
+ max = 0
63
+
64
+ ordered_tags.each do |tag|
65
+ min = tag.pages.size if ( tag.pages.size < min )
66
+ max = tag.pages.size if ( tag.pages.size > max )
67
+ end
68
+
69
+ span = max - min
70
+
71
+ if span > 0
72
+ slice = span / 6.0
73
+ ordered_tags.each do |tag|
74
+ adjusted_size = tag.pages.size - min
75
+ scaled_size = adjusted_size / slice
76
+ tag.group = (( tag.pages.size - min ) / slice).ceil
77
+ end
78
+ else
79
+ ordered_tags.each do |tag|
80
+ tag.group = 0
81
+ end
82
+ end
83
+
84
+ @tags.values.each do |tag|
85
+ ## Optionally sanitize tag URL
86
+ output_prefix = File.join( @output_path, sanitize(tag.to_s) )
87
+ options = { :remove_input=>false, :output_prefix=>output_prefix, :collection=>tag.pages }.merge( @pagination_opts )
88
+
89
+ paginator = Awestruct::Extensions::Paginator.new( @tagged_items_property, @input_path, options )
90
+ primary_page = paginator.execute( site )
91
+ tag.primary_page = primary_page
92
+ end
93
+
94
+ site.send( "#{@tagged_items_property}_tags=", ordered_tags )
95
+ end
96
+
97
+ def sanitize(string)
98
+ #replace accents with unaccented version, go lowercase and replace and space with dash
99
+ if @sanitize
100
+ string.to_s.urlize({:convert_spaces=>true})
101
+ else
102
+ string
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,39 @@
1
+ ---
2
+ ---
3
+ !!! XML
4
+
5
+ %feed{ 'xml:lang'=>'en-US', :xmlns=>'http://www.w3.org/2005/Atom' }
6
+ %id= "#{page.content_url}/"
7
+ %title= escape_once( page.title )
8
+ - if ( defined?( site.author ) )
9
+ %author
10
+ - if ( defined?( site.author.name ) )
11
+ %name= site.author.name
12
+ - if ( site.author.email )
13
+ %email= site.author.email
14
+ - else
15
+ %name= site.author
16
+ - unless page.entries.empty?
17
+ %updated= page.entries.first.date.xmlschema
18
+ %link{:rel=>"self", :type=>"application/atom+xml", :href=>"#{site.base_url}#{page.url}" }
19
+ %link{:rel=>"alternate", :type=>"text/html", :href=>"#{page.content_url}/" }
20
+ - for entry in page.entries
21
+ %entry
22
+ %id #{site.base_url}#{entry.url}
23
+ %title= escape_once( entry.title )
24
+ %updated= entry.date.xmlschema
25
+ %published= entry.date.xmlschema
26
+ %link{:rel=>"alternate", :type=>"text/html", :href=>"#{site.base_url}#{entry.url}" }
27
+ - if ( defined?( entry.author ) )
28
+ %author
29
+ - if ( defined?( entry.author.name ) )
30
+ %name= entry.author.name
31
+ - if ( entry.author.email )
32
+ %email= entry.author.email
33
+ - else
34
+ %name= entry.author
35
+ %summary
36
+ #{summarize( html_to_text( entry.content ), 100 )}
37
+ %content{:type=>'html'}
38
+ = clean_html( html_escape( fully_qualify_urls( site.base_url, find_and_preserve( entry.content ) ) ) )
39
+
@@ -0,0 +1,28 @@
1
+
2
+ module Awestruct
3
+
4
+ class HandlerChain
5
+
6
+ attr_reader :matcher
7
+ attr_reader :handler_classes
8
+
9
+ def initialize(matcher, *handler_classes)
10
+ @matcher = matcher
11
+ @handler_classes = handler_classes
12
+ end
13
+
14
+ def matches?(path)
15
+ @matcher.match( path )
16
+ end
17
+
18
+ def create(site, path)
19
+ cur = path
20
+ @handler_classes.each do |cls|
21
+ cur = cls.new( site, cur )
22
+ end
23
+ cur
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,65 @@
1
+ require 'awestruct/handler_chain'
2
+ require 'awestruct/handlers/file_handler'
3
+ require 'awestruct/handlers/front_matter_handler'
4
+ require 'awestruct/handlers/interpolation_handler'
5
+ require 'awestruct/handlers/markdown_handler'
6
+ require 'awestruct/handlers/textile_handler'
7
+ require 'awestruct/handlers/haml_handler'
8
+ require 'awestruct/handlers/sass_handler'
9
+ require 'awestruct/handlers/scss_handler'
10
+ require 'awestruct/handlers/layout_handler'
11
+
12
+ module Awestruct
13
+
14
+ class HandlerChains
15
+
16
+
17
+ DEFAULTS = [
18
+ HandlerChain.new( /\.md$/,
19
+ Awestruct::Handlers::FileHandler,
20
+ Awestruct::Handlers::FrontMatterHandler,
21
+ Awestruct::Handlers::InterpolationHandler,
22
+ Awestruct::Handlers::MarkdownHandler,
23
+ Awestruct::Handlers::LayoutHandler
24
+ ),
25
+ HandlerChain.new( /\.textile$/,
26
+ Awestruct::Handlers::FileHandler,
27
+ Awestruct::Handlers::FrontMatterHandler,
28
+ Awestruct::Handlers::InterpolationHandler,
29
+ Awestruct::Handlers::TextileHandler,
30
+ Awestruct::Handlers::LayoutHandler
31
+ ),
32
+ HandlerChain.new( /\.haml$/,
33
+ Awestruct::Handlers::FileHandler,
34
+ Awestruct::Handlers::FrontMatterHandler,
35
+ Awestruct::Handlers::HamlHandler,
36
+ Awestruct::Handlers::LayoutHandler
37
+ ),
38
+ HandlerChain.new( /\.sass$/,
39
+ Awestruct::Handlers::FileHandler,
40
+ Awestruct::Handlers::SassHandler
41
+ ),
42
+ HandlerChain.new( /\.scss$/,
43
+ Awestruct::Handlers::FileHandler,
44
+ Awestruct::Handlers::ScssHandler
45
+ ),
46
+ HandlerChain.new( /.*/, Awestruct::Handlers::FileHandler )
47
+ ]
48
+
49
+ def initialize(include_defaults=true)
50
+ @chains = []
51
+ self << :defaults if include_defaults
52
+ end
53
+
54
+ def[](path)
55
+ @chains.detect{|e| e.matches?( path.to_s ) }
56
+ end
57
+
58
+ def <<(chain)
59
+ @chains += DEFAULTS and return if ( chain == :defaults )
60
+ @chains << chain
61
+ end
62
+
63
+ end
64
+
65
+ end
@@ -0,0 +1,92 @@
1
+
2
+ require 'hashery/open_cascade'
3
+
4
+ module Awestruct
5
+ module Handlers
6
+ class BaseHandler
7
+
8
+ attr_reader :site
9
+ attr_reader :delegate
10
+
11
+ def initialize(site, delegate=nil)
12
+ @site = site
13
+ @delegate = delegate
14
+ end
15
+
16
+ def stale?
17
+ return @delegate.stale? if @delegate
18
+ false
19
+ end
20
+
21
+ def input_mtime(page)
22
+ return @delegate.input_mtime(page) if @delegate
23
+ 0
24
+ end
25
+
26
+ def simple_name
27
+ return @delegate.simple_name if @delegate
28
+ nil
29
+ end
30
+
31
+ def relative_source_path
32
+ return @delegate.relative_source_path if @delegate
33
+ nil
34
+ end
35
+
36
+ def output_filename
37
+ return @delegate.output_filename if @delegate
38
+ nil
39
+ end
40
+
41
+ def output_path
42
+ File.join( File.dirname( relative_source_path ), output_filename )
43
+ end
44
+
45
+ def output_extension
46
+ return @delegate.output_extension if @delegate
47
+ File.extname( output_filename )
48
+ end
49
+
50
+ def path
51
+ return @delegate.path if @delegate
52
+ nil
53
+ end
54
+
55
+ def front_matter
56
+ return @delegate.front_matter if @delegate
57
+ {}
58
+ end
59
+
60
+ def content_syntax
61
+ return @delegate.raw_content if @delegate
62
+ :none
63
+ end
64
+
65
+ def raw_content
66
+ return @delegate.raw_content if @delegate
67
+ nil
68
+ end
69
+
70
+ def rendered_content(context, with_layouts=true)
71
+ return @delegate.rendered_content(context, with_layouts) if @delegate
72
+ nil
73
+ end
74
+
75
+ def content_line_offset
76
+ return @delegate.content_line_offset if @delegate
77
+ 0
78
+ end
79
+
80
+ def inherit_front_matter(page)
81
+ @delegate.inherit_front_matter(page) if @delegate
82
+ end
83
+
84
+ def to_chain
85
+ chain = [ self ]
86
+ chain += @delegate.to_chain if @delegate
87
+ chain.flatten
88
+ end
89
+
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,42 @@
1
+
2
+ require 'awestruct/handlers/base_handler'
3
+
4
+ require 'compass'
5
+ require 'ninesixty'
6
+ require 'bootstrap-sass'
7
+
8
+ module Awestruct
9
+ module Handlers
10
+ class BaseSassHandler < BaseHandler
11
+
12
+ attr_reader :syntax
13
+
14
+ def initialize(site, delegate, syntax)
15
+ super( site, delegate )
16
+ @syntax = syntax
17
+ end
18
+
19
+ def simple_name
20
+ File.basename( relative_source_path, ".#{syntax}" )
21
+ end
22
+
23
+ def output_filename
24
+ simple_name + '.css'
25
+ end
26
+
27
+ def rendered_content(context, with_layouts=true)
28
+ sass_opts = Compass.sass_engine_options
29
+ sass_opts[:load_paths] ||= []
30
+ Compass::Frameworks::ALL.each do |framework|
31
+ sass_opts[:load_paths] << framework.stylesheets_directory
32
+ end
33
+ sass_opts[:load_paths] << File.dirname( context.page.source_path )
34
+ sass_opts[:syntax] = syntax
35
+ sass_opts[:custom] = site
36
+ sass_engine = Sass::Engine.new( raw_content, sass_opts )
37
+ sass_engine.render
38
+ end
39
+
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,61 @@
1
+ require 'awestruct/handlers/base_handler'
2
+
3
+ module Awestruct
4
+ module Handlers
5
+ class FileHandler < BaseHandler
6
+
7
+ attr_accessor :path
8
+
9
+ def initialize(site, path)
10
+ super( site )
11
+ case ( path )
12
+ when Pathname
13
+ @path = path
14
+ else
15
+ @path = Pathname.new( path.to_s )
16
+ end
17
+ end
18
+
19
+ def output_filename
20
+ File.basename( @path )
21
+ end
22
+
23
+ def relative_source_path
24
+ begin
25
+ p = path.relative_path_from( site.dir )
26
+ return nil if !! ( %r(^\.\.) =~ p )
27
+ File.join( '', p )
28
+ rescue
29
+ nil
30
+ end
31
+ end
32
+
33
+ def stale?
34
+ return true if ( @content.nil? || ( File.mtime( @path ) > @mtime ) )
35
+ false
36
+ end
37
+
38
+ def input_mtime(page)
39
+ path.mtime
40
+ end
41
+
42
+ def raw_content
43
+ read
44
+ @content
45
+ end
46
+
47
+ def rendered_content(context, with_layouts=true)
48
+ raw_content
49
+ end
50
+
51
+ private
52
+
53
+ def read
54
+ ( @content = File.read( @path ) ) if stale?
55
+ @mtime = File.mtime( @path )
56
+ return @content
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,80 @@
1
+ require 'awestruct/handlers/base_handler'
2
+
3
+ require 'yaml'
4
+
5
+ module Awestruct
6
+ module Handlers
7
+ class FrontMatterHandler < BaseHandler
8
+
9
+ def initialize(site, delegate)
10
+ super
11
+ @parsed_parts = false
12
+ end
13
+
14
+ def front_matter
15
+ parse_parts()
16
+ @front_matter
17
+ end
18
+
19
+ def raw_content
20
+ parse_parts()
21
+ @raw_content
22
+ end
23
+
24
+ def content_line_offset
25
+ parse_parts()
26
+ @content_line_offset
27
+ end
28
+
29
+ def inherit_front_matter(page)
30
+ page.inherit_front_matter_from( front_matter )
31
+ super
32
+ end
33
+
34
+ private
35
+
36
+ def parse_parts
37
+ return if ( @parsed_parts && ! delegate.stale? )
38
+
39
+ full_content = delegate.raw_content
40
+ full_content.force_encoding(site.encoding) if site.encoding
41
+ yaml_content = ''
42
+
43
+ dash_lines = 0
44
+ mode = :yaml
45
+
46
+ @raw_content = ''
47
+ @content_line_offset = 0
48
+
49
+ full_content.each_line do |line|
50
+ if ( line.strip == '---' )
51
+ dash_lines = dash_lines +1
52
+ end
53
+ if ( mode == :yaml )
54
+ @content_line_offset += 1
55
+ yaml_content << line
56
+ else
57
+ @raw_content << line
58
+ end
59
+ if ( dash_lines == 2 )
60
+ mode = :page
61
+ end
62
+ end
63
+
64
+ if ( dash_lines == 0 )
65
+ @raw_content = yaml_content
66
+ yaml_content = ''
67
+ @content_line_offset = 0
68
+ elsif ( mode == :yaml )
69
+ @raw_content = nil
70
+ @content_line_offset = -1
71
+ end
72
+
73
+ @front_matter = YAML.load( yaml_content ) || {}
74
+ @parsed_parts = true
75
+
76
+ end
77
+
78
+ end
79
+ end
80
+ end