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.
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,8 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << File.dirname(__FILE__) + '/../lib'
4
+
5
+ require 'rubygems'
6
+ require 'awestruct/cli/invoker'
7
+
8
+ Awestruct::CLI::Invoker.new( ARGV ).invoke!
@@ -0,0 +1,22 @@
1
+ require 'awestruct/astruct_mixin'
2
+
3
+ module Awestruct
4
+
5
+ class AStruct < Hash
6
+
7
+ include AStructMixin
8
+
9
+ def initialize(hash=nil)
10
+ hash.each{|k,v| self[k]=v } if hash
11
+ end
12
+
13
+ alias_method :original_entries, :entries
14
+ undef entries
15
+
16
+ def inspect
17
+ "AStruct{...}"
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,71 @@
1
+
2
+ module Awestruct
3
+
4
+ module AStructMixin
5
+
6
+ def self.extended(o)
7
+ class << o
8
+ alias_method :original_entries, :entries
9
+ undef entries
10
+ end
11
+ end
12
+
13
+ def cascade_for_nils!
14
+ @cascade_for_nils = true
15
+ self
16
+ end
17
+
18
+ def key?(key)
19
+ super( key ) || super( key.to_sym ) || super( key.to_s )
20
+ end
21
+
22
+ def [](key)
23
+ r = super( key ) || super( key.to_sym ) || super( key.to_s )
24
+ transform_entry( r )
25
+ end
26
+
27
+ def method_missing(sym, *args, &blk)
28
+ type = sym.to_s[-1,1]
29
+ name = sym.to_s.gsub(/[=!?]$/, '').to_sym
30
+ case type
31
+ when '='
32
+ self[name] = args.first
33
+ when '!'
34
+ __send__(name, *args, &blk)
35
+ when '?'
36
+ self[name]
37
+ else
38
+ if key?(name)
39
+ self[name]
40
+ elsif @cascade_for_nils
41
+ self[name] = AStruct.new.cascade_for_nils!
42
+ self[name]
43
+ else
44
+ nil
45
+ end
46
+ end
47
+ end
48
+
49
+
50
+ def transform_entry(entry)
51
+ r = case(entry)
52
+ when AStructMixin
53
+ entry
54
+ when Hash
55
+ #AStruct.new( entry )
56
+ entry.extend( AStructMixin )
57
+ when Array
58
+ entry.map!{|i| transform_entry(i)}
59
+ else
60
+ entry
61
+ end
62
+ r
63
+ end
64
+
65
+ def inspect
66
+ "AStruct{...}"
67
+ end
68
+
69
+ end
70
+
71
+ end
@@ -0,0 +1,20 @@
1
+ require 'guard/awestruct'
2
+
3
+ module Awestruct
4
+ module CLI
5
+ class Auto
6
+
7
+ def initialize(path)
8
+ @path = path
9
+ end
10
+
11
+ def run()
12
+ Guard.setup
13
+ Guard.start( :guardfile=>File.dirname(__FILE__) + '/Guardfile',
14
+ :watchdir=>@path,
15
+ :watch_all_modifications=>true )
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ require 'awestruct/engine'
2
+
3
+ module Awestruct
4
+ module CLI
5
+ class Generate
6
+
7
+ def initialize(config, profile=nil, base_url=nil, default_base_url='http://localhost:4242', force=false)
8
+ @profile = profile
9
+ @base_url = base_url
10
+ @default_base_url = default_base_url
11
+ @force = force
12
+ @engine = Awestruct::Engine.new( config )
13
+ end
14
+
15
+ def run()
16
+ begin
17
+ puts "Generating site"
18
+ @engine.run( @profile, @base_url, @default_base_url, @force )
19
+ rescue =>e
20
+ puts e
21
+ puts e.backtrace
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,109 @@
1
+ require 'awestruct/cli/options'
2
+
3
+ require 'awestruct/cli/generate'
4
+ require 'awestruct/cli/auto'
5
+ require 'awestruct/cli/server'
6
+
7
+ require 'pathname'
8
+
9
+ module Awestruct
10
+ module CLI
11
+ class Invoker
12
+
13
+ attr_reader :options
14
+
15
+ attr_reader :config
16
+ attr_reader :profile
17
+
18
+ def initialize(*options)
19
+ options = options.flatten
20
+ if ( ( ! options.empty? ) && ( options.first === Awestruct::CLI::Options ) )
21
+ @options = options.first
22
+ else
23
+ @options = Awestruct::CLI::Options.parse! options
24
+ end
25
+ @threads = []
26
+ @profile = nil
27
+ end
28
+
29
+ def invoke!
30
+ load_profile() unless ( options.init )
31
+
32
+ setup_config()
33
+
34
+ invoke_init() if ( options.init )
35
+ invoke_script() if ( options.script )
36
+ invoke_force() if ( options.force )
37
+ invoke_generate() if ( options.generate )
38
+ invoke_deploy() if ( options.deploy )
39
+ invoke_server() if ( options.server )
40
+ invoke_auto() if ( options.auto )
41
+
42
+ wait_for_completion()
43
+ end
44
+
45
+ def load_profile()
46
+ site_yaml_file = File.join( Dir.pwd, '_config', 'site.yml' )
47
+ if ( File.exist?( site_yaml_file ) )
48
+ site_yaml = YAML.load( File.read( site_yaml_file ) )
49
+ if site_yaml
50
+ profiles_data = site_yaml['profiles'] || {}
51
+ @profile = if profiles_data.nil?
52
+ nil
53
+ else
54
+ if options.profile
55
+ profiles_data[options.profile]
56
+ else
57
+ # if no profile given, pick the first with deploy config
58
+ options.profile, profile_data = profiles_data.select { |k,v| v && v['deploy'] }.first
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ def setup_config()
66
+ @config = Awestruct::Config.new( Dir.pwd )
67
+ end
68
+
69
+ def invoke_init()
70
+ end
71
+
72
+ def invoke_script()
73
+ end
74
+
75
+ def invoke_force()
76
+ FileUtils.rm_rf( config.output_dir )
77
+ end
78
+
79
+ def invoke_generate()
80
+ Awestruct::CLI::Generate.new( config, profile, options.base_url, 'http://localhost:4242', options.force ).run
81
+ end
82
+
83
+ def invoke_deploy()
84
+ end
85
+
86
+ def invoke_auto()
87
+ run_in_thread( Awestruct::CLI::Auto.new( config.dir ) )
88
+ end
89
+
90
+ def invoke_server()
91
+ run_in_thread( Awestruct::CLI::Server.new( './_site', options.bind_addr, options.port ) )
92
+ end
93
+
94
+
95
+ private
96
+
97
+ def run_in_thread(command)
98
+ @threads << Thread.new(command){|c| c.run}
99
+ end
100
+
101
+ def wait_for_completion()
102
+ @threads.each do |thr|
103
+ thr.join
104
+ end
105
+ end
106
+
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,116 @@
1
+ require 'optparse'
2
+
3
+ require 'awestruct/version'
4
+
5
+ module Awestruct
6
+ module CLI
7
+ class Options
8
+
9
+ attr_accessor :generate
10
+ attr_accessor :server
11
+ attr_accessor :port
12
+ attr_accessor :bind_addr
13
+ attr_accessor :auto
14
+ attr_accessor :force
15
+ attr_accessor :init
16
+ attr_accessor :framework
17
+ attr_accessor :scaffold
18
+ attr_accessor :base_url
19
+ attr_accessor :profile
20
+ attr_accessor :deploy
21
+ attr_accessor :script
22
+
23
+ def initialize()
24
+ @generate = true
25
+ @server = false
26
+ @port = 4242
27
+ @bind_addr = '0.0.0.0'
28
+ @auto = false
29
+ @force = false
30
+ @init = false
31
+ @framework = 'compass'
32
+ @scaffold = true
33
+ @base_url = nil
34
+ @profile = nil
35
+ @deploy = false
36
+ @script = nil
37
+ end
38
+
39
+ def self.parse!(args)
40
+ Options.new.parse! args
41
+ end
42
+
43
+ def parse!(args)
44
+ opts = OptionParser.new do |opts|
45
+ opts.on( '-i', '--init', 'Initialize a new project in the current directory' ) do |init|
46
+ self.init = init
47
+ self.generate = false
48
+ end
49
+ opts.on( '-f', '--framework FRAMEWORK', 'Specify a compass framework during initialization (bootstrap, blueprint, 960)' ) do |framework|
50
+ self.framework = framework
51
+ end
52
+ opts.on( '--[no-]scaffold', 'Create scaffolding during initialization (default: true)' ) do |s|
53
+ self.scaffold = s
54
+ end
55
+ opts.on( '--force', 'Force a regeneration' ) do |force|
56
+ self.force = force
57
+ end
58
+ opts.on( '-s', '--server', 'Serve generated site' ) do |s|
59
+ self.server = s
60
+ end
61
+ opts.on( '-u', '--url URL', 'Set site.base_url' ) do |url|
62
+ self.base_url = url
63
+ end
64
+ opts.on( '-d', '--dev', 'Run in development mode (--auto, --server and -profile development)' ) do |url|
65
+ self.server = true
66
+ self.auto = true
67
+ self.port = 4242
68
+ self.profile = 'development'
69
+ end
70
+
71
+ opts.on( '-P', '--profile PROFILE', 'Specify a profile' ) do |profile|
72
+ self.profile = profile
73
+ end
74
+
75
+ opts.on( '--deploy', 'Deploy site' ) do |deploy|
76
+ self.deploy = deploy
77
+ end
78
+
79
+ opts.on( '-a', '--auto', 'Auto-generate when changes are noticed' ) do |a|
80
+ self.auto = a
81
+ end
82
+ opts.on( '-p', '--port PORT', Integer, 'Server port (default: 4242)' ) do |port|
83
+ self.port = port
84
+ end
85
+ opts.on( '-b', '--bind ADDR', 'Server address (default: 0.0.0.0)' ) do |bind_addr|
86
+ self.bind_addr = bind_addr
87
+ end
88
+ opts.on( '-g', '--[no-]generate', 'Generated site' ) do |g|
89
+ self.generate = g
90
+ end
91
+ opts.on( '--run SCRIPT', 'Force a regeneration' ) do |script|
92
+ self.script = script
93
+ end
94
+
95
+ opts.separator ''
96
+ opts.separator "Common options:"
97
+
98
+ opts.on_tail("-h", "--help", "Show this message") do
99
+ puts opts
100
+ exit
101
+ end
102
+
103
+ opts.on_tail("-v", "--version", "Display the version") do
104
+ puts "Awestruct: #{Awestruct::VERSION}"
105
+ puts "http://awestruct.org/"
106
+ exit
107
+ end
108
+ end
109
+
110
+ opts.parse!(args)
111
+ self
112
+ end # parse()
113
+
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,24 @@
1
+ require 'webrick'
2
+
3
+ module Awestruct
4
+ module CLI
5
+
6
+ WEBrick::HTTPUtils::DefaultMimeTypes.store('atom', 'application/atom+xml')
7
+ WEBrick::HTTPUtils::DefaultMimeTypes.store('appcache', 'text/cache-manifest')
8
+
9
+ class Server
10
+ attr_reader :server
11
+
12
+ def initialize(path, bind_addr='0.0.0.0', port=4242)
13
+ @path = path
14
+ @bind_addr = bind_addr
15
+ @port = port
16
+ end
17
+
18
+ def run
19
+ @server = WEBrick::HTTPServer.new( :DocumentRoot=>@path, :Port=>@port, :BindAddress=>@bind_addr )
20
+ @server.start
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+
2
+ module Awestruct
3
+
4
+ class Config
5
+
6
+ attr_accessor :dir
7
+ attr_accessor :layouts_dir
8
+ attr_accessor :config_dir
9
+ attr_accessor :extension_dir
10
+ attr_accessor :input_dir
11
+ attr_accessor :output_dir
12
+ attr_accessor :skin_dir
13
+ attr_accessor :tmp_dir
14
+ attr_accessor :ignore
15
+
16
+ def initialize(dir = Dir.pwd)
17
+ @dir = Pathname.new( dir )
18
+ @layouts_dir = Pathname.new( File.join(dir, '_layouts') )
19
+ @config_dir = Pathname.new( File.join(dir, '_config') )
20
+ @input_dir = Pathname.new( File.join(dir, '') )
21
+ @output_dir = Pathname.new( File.join(dir, '_site') )
22
+ @extension_dir = Pathname.new( File.join(dir, '_ext') )
23
+ @skin_dir = Pathname.new( File.join(dir, '_skin') )
24
+ @tmp_dir = Pathname.new( File.join(dir, '_tmp') )
25
+ @ignore = File.exists?(ignore_file = File.join(dir, ".awestruct_ignore")) ? Dir[*IO.read(ignore_file).each_line.map(&:strip)] : []
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,22 @@
1
+
2
+ require 'awestruct/astruct'
3
+
4
+ module Awestruct
5
+
6
+ class Context < Awestruct::AStruct
7
+ attr_accessor :site
8
+ attr_accessor :page
9
+
10
+ def initialize(hash)
11
+ super
12
+ @page = hash[:page]
13
+ @site = hash[:site]
14
+
15
+ end
16
+
17
+ def inspect
18
+ "Awestruct::Context{:page=>#{self.page.inspect}}"
19
+ end
20
+ end
21
+
22
+ end