# Un sitio es un directorio dentro del directorio de sitios de cada # Usuaria class Site attr_accessor :jekyll attr_reader :path def initialize(jekyll:, path: nil) @jekyll = jekyll @path = path || @jekyll.config['source'] end # Obtener el nombre del sitio def name @name ||= @jekyll.config['source'].split('/').last end # El id es el sitio sin puntos, para no confundir al routeador de # rails def id @id ||= name.tr('.', '-') end alias :to_s :id # Los posts de este sitio def posts return @posts if @posts Rails.logger.info 'Procesando posts' if @jekyll.posts.docs.empty? @jekyll.read # Queremos saber cuantas veces releemos los articulos Rails.logger.info 'Leyendo articulos' end # Los convertimos a una clase intermedia capaz de acceder a sus # datos y modificarlos @posts = @jekyll.posts.docs.map do |post| Post.new(site: self, post: post) end end def categories posts.map(&:categories).flatten.uniq end def tags posts.map(&:tags).flatten.uniq end # El directorio donde se almacenan los sitios def self.site_path File.join(Rails.root, '_sites') end # El directorio de los sitios de una usuaria # # Los sitios se organizan por usuaria, entonces los sitios que # administra pueden encontrarse directamente en su directorio. # # Si comparten gestión con otras usuarias, se hacen links simbólicos # entre sí. def self.site_path_for(usuaria) File.join(Site.site_path, usuaria.username) end # Comprueba que el directorio parezca ser de jekyll def self.jekyll?(dir) File.directory?(dir) && File.exist?(File.join(dir, '_config.yml')) end # Obtener todos los directorios de sitios asociados a esta usuaria def self.all_for(usuaria) @sites ||= Pathname.new(Site.site_path_for(usuaria)) .children.map(&:expand_path).map(&:to_s).map do |j| next unless Site.jekyll? j Dir.chdir(j) do config = ::Jekyll.configuration('source' => Dir.pwd) # No necesitamos cargar plugins en este momento %w[plugins gems].each do |unneeded| config[unneeded] = [] if config.key? unneeded end Site.new(jekyll: ::Jekyll::Site.new(config), path: j) end end.compact end end