# frozen_string_literal: true # La relación de un sitio con sus artículos, esto nos permite generar # artículos como si estuviésemos usando ActiveRecord. class PostRelation < Array # No necesitamos cambiar el sitio attr_reader :site def initialize(site:) @site = site # Proseguimos la inicialización sin valores por defecto super() end # Genera un artículo nuevo con los parámetros que le pasemos y lo suma # al array def build(**args) args[:lang] ||= I18n.locale args[:document] ||= build_document(collection: args[:lang]) args[:layout] = build_layout(args[:layout]) post = Post.new(site: site, **args) self << post post end def create(**args) post = build(args) post.save post end alias sort_by_generic sort_by alias sort_by_generic! sort_by! # Permite ordenar los artículos por sus atributos # # XXX: Prestar atención cuando estamos mezclando artículos con # diferentes tipos de atributos. def sort_by(*attrs) sort_by_generic do |post| attrs.map do |attr| # TODO: detectar el tipo de atributo faltante y obtener el valor # por defecto para hacer la comparación return 0 unless post.attributes.include? attr post.public_send(attr).value end end end def sort_by!(*attrs) replace sort_by(*attrs) end alias find_generic find # Encontrar un post por su UUID def find(id, uuid: false) find_generic do |p| if uuid p.uuid.value == id else p.id == id end end end # Encuentra el primer post por el valor de un atributo # XXX: Acepta cualquier atributo def find_by(**args) find_generic do |p| p.public_send(args.first.first).try(:value) == args.first.last end end # Intenta guardar todos y devuelve true si pudo def save_all(validate: true) map do |post| post.save(validate: validate) end.all? end private def build_layout(layout = nil) return layout if layout.is_a? Layout site.layouts[layout.try(:to_sym) || :post] end # Devuelve una colección Jekyll que hace pasar el documento def build_collection(label:) Jekyll::Collection.new(site.jekyll, label.to_s) end # Un documento borrador con algunas propiedades por defecto def build_document(collection:) col = build_collection(label: collection) doc = Jekyll::Document.new('', site: site.jekyll, collection: col) doc.data['date'] = Date.today.to_time doc end end