# -*- coding: utf-8 -*- # Helper functions for site-building. require "awesome_print" include Nanoc::Helpers::Rendering include Nanoc::Helpers::XMLSitemap class Nanoc::Item attr_accessor :category def add_content content @raw_content += "\n\n#{content}" end def add_references refs add_content refs end def name identifier.split("/").last end # shared content or not? def shared? self[:filename].nil? or self[:filename].start_with? "content/" end def draft? self[:techne] == :wip end def cognitive? !self[:non_cognitive] end def article? not self[:is_category] and not draft? and cognitive? end def category_slug if m = self.identifier.match(%r{^\/(?.+?)/}) m[:cat] else "" end end def root? self.identifier == "/" end def comments? !(self[:no_comments] or self[:is_category]) end end class Category attr_reader :item, :slug def initialize item, members=[] @item = item @slug = @item.category_slug @members = members @members.each {|i| i.category = self} end def includes? item !!item.identifier.match(%r{^/#{@slug}/}) end def members drafts=false if drafts @members else @members.reject{|i| i.draft?} end end def title @item[:title] end end class Nanoc::Site # items attr_reader :printed_items # all items that end up on the site # slugs for wordpress links attr_reader :slug_items # pages that got moved around def initialize_items find_printed_items find_slug_items find_categories end def category name categories.find{|c| c.slug == name.to_s} end def find_printed_items @printed_items = @items.select { |i| not i[:is_hidden] and not i.binary? } end def find_slug_items @slug_items = @printed_items.select {|i| not i[:slug].nil?} end def items_by_date category=nil (category.nil? ? @printed_items : category.members). select{|i| i.article? and not i.draft?}. # exclude drafts etc. reject{|i| i[:date].nil?}.sort_by {|i| [i[:date], i.identifier]} # sort by date, then name (for logs) end def find_categories # find categories cats = @printed_items.select {|i| i[:is_category]}.map do |c| members = @printed_items.select{|i| not i[:is_category] and i.category_slug == c.category_slug} Category.new(c, members) end # remove categories with no shown items cats = cats.map do |c| not_empty = @printed_items.any? do |i| c.includes? i and i.article? and not i.draft? end { cat: c, not_empty: not_empty} end # sort by title @categories = cats.sort_by {|c| c[:cat].title.downcase} end def categories all=true @categories.select{|c| c[:not_empty] or all}.map{|c| c[:cat]} end def latest_article items_by_date.last end # is this category on the main site? def latest_category? cat latest_article.category == cat unless latest_article.nil? end def before item items = items_by_date index = items.index(item) if index.nil? or index.zero? or not blog? nil else items[index - 1] end end def after item items = items_by_date index = items.index(item) if index.nil? or not blog? nil else items[index + 1] end end def comments? !self["disqus_site"].nil? end end def category name_or_cat name = if name_or_cat.is_a? Category name_or_cat.slug else name_or_cat.to_s end render "category", :category => name end def route_unchanged item.identifier.chop + '.' + item[:extension] end def route_with_new_extension ext item.identifier.chop + '.' + ext end def google_search <
EOF end def redacted text "█" * text.size end alias :censored :redacted