# Un sitio es un directorio dentro del directorio de sitios de cada # Usuaria class Site attr_accessor :jekyll def initialize(jekyll:) @jekyll = jekyll 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 @jekyll.read if @jekyll.posts.docs.empty? # Los convertimos a una clase intermedia capaz de acceder a sus # datos y modificarlos @posts = @jekyll.posts.docs.map do |post| Post.new(site: @jekyll, post: post) end 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)) end end.compact end end