module Jekyll::OctopodFilters

Constants

JSON_ENTITIES

Public Instance Methods

audio(hsh, key = nil) click to toggle source

Returns the audio file name of a given hash. Is no key as second parameter given, it trys first “mp3”, than “m4a” and than it will return a more or less random value.

{{ post.audio | audio:"m4a" }} => "my-episode.m4a"
# File lib/jekyll/octopod_filters.rb, line 57
def audio(hsh, key = nil)
  if !hsh.nil? && hsh.length
    if key.nil?
      hsh['mp3'] ? hsh['mp3'] : hsh['m4a'] ? hsh['m4a'] : hsh['ogg'] ? hsh['ogg'] : hsh['opus'] ? hsh['opus'] : hsh.values.first
    else
      hsh[key]
    end
  end
end
audio_type(hsh) click to toggle source

Returns the audio-type of a given hash. Is no key as second parameter given, it trys first “mp3”, than “m4a” and than it will return a more or less random value.

{{ post.audio | audiotype }} => "my-episode.m4a"
# File lib/jekyll/octopod_filters.rb, line 72
def audio_type(hsh)
  if !hsh.nil? && hsh.length
    hsh['mp3'] ? mime_type('mp3') : hsh['m4a'] ? mime_type('m4a') : hsh['ogg'] ? mime_type('ogg') : mime_type('opus')
  end
end
cdata_escape(input) click to toggle source

Escapes some text for CDATA

# File lib/jekyll/octopod_filters.rb, line 9
def cdata_escape(input)
  input.gsub(/<!\[CDATA\[/, '&lt;![CDATA[').gsub(/\]\]>/, ']]&gt;')
end
disqus_config(site, page = nil) click to toggle source

Generates the config for disqus integration If a page object is given, it generates the config variables only for this page. Otherwise it generate only the global config variables.

{{ site | disqus_config }}
{{ site | disqus_config:page }}
# File lib/jekyll/octopod_filters.rb, line 220
def disqus_config(site, page = nil)
  if page
    disqus_vars = {
      'disqus_identifier'  => page['url'],
      'disqus_url'         => "#{site['url']}#{page['url']}",
      'disqus_category_id' => page['disqus_category_id'] || site['disqus_category_id'],
      'disqus_title'       => j(page['title'] || site['site'])
    }
  else
    disqus_vars = {
      'disqus_developer'   => site['disqus_developer'],
      'disqus_shortname'   => site['disqus_shortname']
    }
  end

  disqus_vars.delete_if { |_, v| v.nil? }
  disqus_vars.map { |k, v| "var #{k} = '#{v}';" }.compact.join("\n")
end
download_url_with_fallback(site) click to toggle source

Returns the dowrload url with fallback to the site's episode folder url

# File lib/jekyll/octopod_filters.rb, line 142
def download_url_with_fallback(site)
  if site["download_url"] == "" or site["download_url"] == nil
    site["url"] + "/episodes"
  else
    site["download_url"]
  end
end
episode_feeds(site, except = nil) click to toggle source

Returns an array of all episode feeds named by the convetion 'episodes.<episode_file_format>.rss' within the root directory. Also it contains all additional feeds specified by 'additional_feeds' in the '_config.yml'. If an 'episode_file_format' or key of 'additional_feeds' equals the optional parameter 'except', it will be skipped.

episode_feeds(site, except = nil) =>
[
  ["m4a Episode RSS-Feed", "/episodes.m4a.rss"],
  ["mp3 Episode RSS-Feed", "/episodes.mp3.rss"],
  ["Torrent Feed m4a", "http://bitlove.org/octopod/octopod_m4a/feed"],
  ["Torrent Feed mp3", "http://bitlove.org/octopod/octopod_mp3/feed"]
]
# File lib/jekyll/octopod_filters.rb, line 303
def episode_feeds(site, except = nil)
  feeds = []

  if site['episode_feed_formats']
    site['episode_feed_formats'].map { |f|
     feeds << ["#{f} Episode RSS-Feed", "#{site['url']}/episodes.#{f}.rss"] unless f == except
    }
  end
  if site['additional_feeds']
    site['additional_feeds'].each { |k, v|
      feeds << [k.gsub('_', ' '), v] unless k == except
    }
  end

  feeds
end
episode_feeds_html(site, except = nil) click to toggle source

Returns HTML links to all episode feeds named by the convetion 'episodes.<episode_file_format>.rss' within the root directory. Also it returns all additional feeds specified by 'additional_feeds' in the '_config.yml'. If an 'episode_file_format' or key of 'additional_feeds' equals the optional parameter 'except', it will be skipped.

{{ site | episode_feeds_html:'m4a' }} =>
<link rel="alternate" type="application/rss+xml" title="mp3 Episode RSS-Feed" href="/episodes.mp3.rss" />
<link rel="alternate" type="application/rss+xml" title="Torrent Feed m4a" href="http://bitlove.org/octopod/octopod_m4a/feed" />
<link rel="alternate" type="application/rss+xml" title="Torrent Feed mp3" href="http://bitlove.org/octopod/octopod_mp3/feed" />
# File lib/jekyll/octopod_filters.rb, line 330
def episode_feeds_html(site, except = nil)
  episode_feeds(site, except).map { |f|
    %Q{<link rel="alternate" type="application/rss+xml" title="#{f.first || f.last}" href="#{f.last}" />}
  }.join("\n")
end
episode_feeds_rss(site, except = nil) click to toggle source

Returns RSS-XML links to all episode feeds named by the convetion 'episodes.<episode_file_format>.rss' within the root directory. Also it returns all additional feeds specified by 'additional_feeds' in the '_config.yml'. If an 'episode_file_format' or key of 'additional_feeds' equals the optional parameter 'except', it will be skipped.

{{ site | episode_feeds_rss:'m4a' }} =>
<atom:link rel="alternate" href="/episodes.mp3.rss" type="application/rss+xml" title="mp3 Episode RSS-Feed"/>
<atom:link rel="alternate" href="http://bitlove.org/octopod/octopod_m4a/feed" type="application/rss+xml" title="Torrent Feed m4a"/>
<atom:link rel="alternate" href="http://bitlove.org/octopod/octopod_mp3/feed" type="application/rss+xml" title="Torrent Feed mp3"/>
# File lib/jekyll/octopod_filters.rb, line 346
def episode_feeds_rss(site, except = nil)
  episode_feeds(site, except).map { |f|
    %Q{<atom:link rel="alternate" href="#{f.last}" type="application/rss+xml" title="#{f.first || f.last}"/>}
  }.join("\n")
end
expand_urls(input, url='') click to toggle source

Replaces relative urls with full urls

{{ "about.html" | expand_urls }}             => "/about.html"
{{ "about.html" | expand_urls:site.url }}  => "http://example.com/about.html"
# File lib/jekyll/octopod_filters.rb, line 24
def expand_urls(input, url='')
  url ||= '/'
  input.gsub /(\s+(href|src)\s*=\s*["|']{1})(\/[^\"'>]*)/ do
    $1+url+$3
  end
end
file_size(path, rel = nil) click to toggle source

Returns the size of a given file in bytes. If there is just a filename without a path, this method assumes that the file is an episode audio file which lives in /episodes.

{{ "example.m4a" | file_size }} => 4242
# File lib/jekyll/octopod_filters.rb, line 98
def file_size(path, rel = nil)
  return 0 if path.nil?
  path = path =~ /\// ? path : File.join('episodes', path)
  path = rel + path if rel
  File.size(path)
end
host_from_url(url) click to toggle source

Returns the host a given url

{{ 'https://github.com/pattex/octopod' | host_from_url }} => "github.com"
# File lib/jekyll/octopod_filters.rb, line 210
def host_from_url(url)
  URI.parse(url).host
end
image_with_fallback(page) click to toggle source

Returns the image of the post or the default logo.

{{ page | image_with_fallback }} => '/path/to/image.png'
# File lib/jekyll/octopod_filters.rb, line 133
def image_with_fallback(page)
  if page["image"]
    "/img/" + page["image"]
  else
    "/img/logo-itunes.jpg"
  end
end
in_megabytes(size_in_bytes) click to toggle source

Converts a size in Bytes to Megabytes

{{ 123456 | in_megabytes }} => 0.1 MB
# File lib/jekyll/octopod_filters.rb, line 119
def in_megabytes(size_in_bytes)
  (size_in_bytes / 1024.0 / 1024.0).round(2).to_s + " MB"
end
j(str) click to toggle source

Escapes HTML entities in JSON strings. More or less a copy of the equivalent method in Active Support. github.com/rails/rails/tree/master/activesupport

# File lib/jekyll/octopod_filters.rb, line 16
def j(str)
  str.to_s.gsub(/[&"><']/) { |e| JSON_ENTITIES[e] }
end
mime_type(format) click to toggle source

Returns the MIME-Type of a given file format.

{{ "m4a" | mime_type }} => "audio/mp4a-latm"
# File lib/jekyll/octopod_filters.rb, line 82
def mime_type(format)
  types = {
    'mp3'  => 'mpeg',
    'm4a'  => 'mp4a-latm',
    'ogg'  => 'ogg; codecs=vorbis',
    'opus' => 'ogg; codecs=opus'
  }

  "audio/#{types[format]}"
end
navigation_list(site, page) click to toggle source

Returns a, ready to use, navigation list of all pages that have navigation set in their YAML front matter. The list is sorted by the value of navigation.

{{ site | navigation_list:page }}
navigation_list_item(url, title, active = false) click to toggle source
otherwise(first, second) click to toggle source

Returns the first argument if it's not nil or empty otherwise it returns the second one.

{{ post.author | otherwise:site.author }}
# File lib/jekyll/octopod_filters.rb, line 47
def otherwise(first, second)
  first = first.to_s
  first.empty? ? second : first
end
remove_script_and_audio(input) click to toggle source

Removes scripts tag and audio tags in multiline moderator

# File lib/jekyll/octopod_filters.rb, line 32
def remove_script_and_audio(input)
  input.gsub(/<audio.*audio>/m, '').gsub(/<script.*script>/m, '')
end
sha1(str, lenght = 8) click to toggle source

Returns the hex-encoded hash value of a given string. The optional second argument defines the length of the returned string.

{{ "Octopod" | sha1 }} => "8b20a59c"
{{ "Octopod" | sha1:23 }} => "8b20a59c8e2dcb5e1f845ba"
# File lib/jekyll/octopod_filters.rb, line 244
def sha1(str, lenght = 8)
  sha1 = Digest::SHA1.hexdigest(str)
  sha1[0, lenght.to_i]
end
size_by_format(page, format) click to toggle source

Returns the size of a given file in bytes by looking into the front matter The sizes should be in filesize:

mp3: 4242

{{ "example.m4a" | size_by_format: "mp3" }} => 4242
# File lib/jekyll/octopod_filters.rb, line 112
def size_by_format(page, format)
  page["filesize"][format]
end
slug(page) click to toggle source

Returns a slug based on the id of a given page.

{{ page | slug }} => '2012_10_02_octopod'
# File lib/jekyll/octopod_filters.rb, line 126
def slug(page)
  page['id'][1..-1].gsub('/', '_')
end
split_chapter(chapter_str, attribute = nil) click to toggle source

Splits a chapter, like it is written to the post YAML front matter into the components 'start' which refers to a single point in time relative to the beginning of the media file nad 'title' which defines the text to be the title of the chapter.

{{ '00:00:00.000 Welcome to Octopod!' | split_chapter }}
  => { 'start' => '00:00:00.000', 'title' => 'Welcome to Octopod!' }

{{ '00:00:00.000 Welcome to Octopod!' | split_chapter:'title' }}
  => 'Welcome to Octopod!'

{{ '00:00:00.000 Welcome to Octopod!' | split_chapter:'start' }}
  => '00:00:00.000'
# File lib/jekyll/octopod_filters.rb, line 164
def split_chapter(chapter_str, attribute = nil)
  attributes = chapter_str.split(/ /, 2)
  return nil unless attributes.first.match(/\A(\d|:|\.)+\z/)

  if attribute.nil?
    { 'start' => attributes.first, 'title' => attributes.last }
  else
    attribute == 'start' ? attributes.first : attributes.last
  end
end
string_of_duration(duration) click to toggle source

Gets a number of seconds and returns an human readable duration string of it.

{{ 1252251 | string_of_duration }} => "00:03:13"
# File lib/jekyll/octopod_filters.rb, line 180
def string_of_duration(duration)
  seconds = duration.to_i
  minutes = seconds / 60
  hours   = minutes / 60

  "#{"%02d" % hours}:#{"%02d" % (minutes % 60)}:#{"%02d" % (seconds % 60)}"
end
string_of_size(bytes) click to toggle source

Gets a number of bytes and returns an human readable string of it.

{{ 1252251 | string_of_size }} => "1.19M"
# File lib/jekyll/octopod_filters.rb, line 191
def string_of_size(bytes)
  bytes = bytes.to_i.to_f
  out = '0'
  return out if bytes == 0.0

  jedec = %w[b K M G]
  [3, 2, 1, 0].each { |i|
    if bytes > 1024 ** i
      out = "%.1f#{jedec[i]}" % (bytes / 1024 ** i)
      break
    end
  }

  return out
end
talk_list(site, page) click to toggle source
# File lib/jekyll/octopod_filters.rb, line 267
def talk_list(site, page)
  pages = site['pages'].select { |p|
    p.data['talk'] && p.data['title']
  }.sort_by { |p| p.data['talk'] }

  list =  ['<li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false"> Talks <span class="caret"></span>
            </a><ul class="dropdown-menu">']
  list << pages.map { |p|
    active = (p.url == page['url']) || (page.key?('next') && File.join(p.dir, p.basename) == '/index')
    navigation_list_item(File.join(site['url'], p.url), p.data['title'], active)
  }
  list << ['</ul></li>']

  if pages.any?
    list.join("\n")
  end
end
time_to_rssschema(time) click to toggle source

Formats a Time to be RSS compatible like “Wed, 15 Jun 2005 19:00:00 GMT”

{{ site.time | time_to_rssschema }}
# File lib/jekyll/octopod_filters.rb, line 39
def time_to_rssschema(time)
  time.strftime("%a, %d %b %Y %H:%M:%S %z")
end
version_string(site) click to toggle source

Prints out current version

# File lib/jekyll/octopod_filters.rb, line 353
def version_string(site)
  Jekyll::Octopod::VERSION::STRING
end