Module: Woody::Compiler

Defined in:
lib/woody/compiler.rb

Overview

Handles functions related to compiling the Woody site

Constant Summary collapse

@@touchedfiles =
[]

Class Method Summary collapse

Class Method Details

.compile(options = []) ⇒ Object

Compiles the Woody site



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/woody/compiler.rb', line 7

def self.compile(options = [])
  puts "Compiling..."
  meta = YAML.load_file("content/metadata.yml")
		
# instantiate the metadata hash so shit doesn't explode in our faces
# WEIRD SHIT: used .empty? here before but fails if used on hash seemingly
		if meta == false
			meta = Hash.new 
		end

  episodes     = Array.new
  filesfound   = Array.new
  Dir.glob('content/*.mp3') do |file|
    filename = file[8..-1]
    unless meta == false or meta[filename].nil?
      # Episode metadata already stored
      episodes   << Episode.new_from_meta(filename, meta[filename])
      filesfound << filename
    else
      # No episode metadata stored for this yet
      unless options.no_add == false # Seemingly backwards, I know...
        (meta, episodes, filesfound, filename)
      else
        puts "Warning: found media file #{filename} but no metadata. Will not be published."
      end
    end
  end


  # Check for files in meta but not found
  unless meta.empty?
    meta.each do |file|
      next if filesfound.include? file[0]
      puts "Warning: found metadata for file #{file[0]}, but file itself is missing. Will not be published."
    end
  end

  # Make sure necessary directories exist
  FileUtils.mkdir_p('output/assets') unless File.directory?('output/assets')
  FileUtils.mkdir_p('output/assets/mp3') unless File.directory?('output/assets/mp3')
  FileUtils.mkdir_p('output/episode') unless File.directory?('output/episode')

  # Copy over (TODO: and process) MP3 files
  episodes.each do |episode|
    copy_file_to_output File.join("content", episode.filename), File.join("assets/mp3", episode.compiledname)
  end

  # Copy over assets
  copy_assets

  # Update index.html
  layout = File.read('templates/layout.html')
  layout = Erubis::Eruby.new(layout)

  index_compiled = layout.result(config: $config, episodes: episodes) do
    index = Erubis::Eruby.new(File.read('templates/index.html'))
    index.result(config: $config, episodes: episodes, test: "hello, world") do |episode|
      ep = Erubis::Eruby.new(File.read('templates/episode.html'))
      ep.result(config: $config, episodes: episodes, episode: episode)
    end
  end
  write_output_file('index.html') {|f| f.write(index_compiled) }

  # Update episode pages
  episodes.each do |episode|
    layout = File.read('templates/layout.html')
    layout = Erubis::Eruby.new(layout)
    episode_compiled = layout.result(config: $config, episodes: episodes) do
      ep = Erubis::Eruby.new(File.read('templates/episode.html'))
      ep.result(config: $config, episodes: episodes, episode: episode)
    end
    write_output_file(episode.path) {|f| f.write(episode_compiled) }
  end

  # Copy over iTunes.png
  begin
    copy_file_to_output "content/iTunes.png", "assets/iTunes.png"
  rescue Errno::ENOENT
    puts "Warning: content/iTunes.png missing!"
  end

  # Update (iTunes) RSS
  $config['itunes']['explicit'] = "no" if $config['itunes']['explicit'].nil?
  feedxml = File.read File.join($source_root, "feed.xml") # Use feed.xml template in gem, not in site's template folder.
  feed = Erubis::Eruby.new(feedxml)
  feed_compiled = feed.result(config: $config, episodes: episodes)
  write_output_file("feed.xml") {|f| f.write(feed_compiled) }



  # TODO: Update General RSS


  # Purge left over files
  purge_output

  # Remove all empty directories from the output
  Dir['output/**/*'].select { |d| File.directory? d }.select { |d| (Dir.entries(d) - %w[ . .. ]).empty? }.each { |d| Dir.rmdir d }
end