diff --git a/app/models/layout.rb b/app/models/layout.rb index 02f1645b..c05a02f6 100644 --- a/app/models/layout.rb +++ b/app/models/layout.rb @@ -1,8 +1,35 @@ # frozen_string_literal: true -# Una plantilla agrupa metadatos que va a tener un artículo -Layout = Struct.new(:site, :name, :metadata, keyword_init: true) do +# Una plantilla agrupa metadatos que va a tener un artículo. +# +# TODO: Renombrar metadatos a atributos o campos, ahora se llaman de +# varias formas por todo el código. +Layout = Struct.new(:site, :name, :meta, :metadata, keyword_init: true) do def value name.to_s end + + # Busca la traducción del Layout en el sitio o intenta humanizarlo + # según Rails. + # + # @return [String] + def humanized_name + @humanized_name ||= site.i18n.dig('layouts', name.to_s) || name.to_s.humanize + end + + # Detecta si el Layout no debería mostrarse + # + # @return [Boolean] + def hidden? + meta[:hidden].present? + end + + # Los metadatos del Layout. + # + # TODO: Inicializar con valores por defecto o usar Hash#default_proc + # + # @return [Hash] + def meta + @meta ||= self[:meta] || {} + end end diff --git a/app/models/site.rb b/app/models/site.rb index 2d6e315c..5ff8d90b 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -193,6 +193,14 @@ class Site < ApplicationRecord def data read + # Define los valores por defecto según la llave buscada + @jekyll.data.default_proc = proc do |data, key| + data[key] = case key + when 'layout' then {} + else nil + end + end + @jekyll.data end @@ -259,19 +267,21 @@ class Site < ApplicationRecord # Obtiene todas las plantillas de artículos # - # @return { post: Layout } + # @return [Hash] { post: Layout } def layouts # Crea un Struct dinámico cuyas llaves son los nombres de todos los # layouts. Si pasamos un layout que no existe, obtenemos un # NoMethodError @layouts_struct ||= Struct.new(*layout_keys, keyword_init: true) - @layouts ||= @layouts_struct.new(**data.fetch('layouts', {}).map do |name, metadata| - [name.to_sym, Layout.new(site: self, name: name.to_sym, metadata: metadata.with_indifferent_access)] + @layouts ||= @layouts_struct.new(**data['layouts'].map do |name, metadata| + [name.to_sym, Layout.new(site: self, name: name.to_sym, meta: metadata.delete('meta')&.with_indifferent_access, metadata: metadata.with_indifferent_access)] end.to_h) end + # TODO: Si la estructura de datos no existe, vamos a producir una + # excepción. def layout_keys - @layout_keys ||= data.fetch('layouts', {}).keys.map(&:to_sym) + @layout_keys ||= data['layouts'].keys.map(&:to_sym) end # Consulta si el Layout existe diff --git a/app/views/posts/index.haml b/app/views/posts/index.haml index 9ee71ed8..83f8f7af 100644 --- a/app/views/posts/index.haml +++ b/app/views/posts/index.haml @@ -12,9 +12,9 @@ %h3= t('posts.new') %ul - - @site.layouts.to_h.keys.each do |layout| - %li= link_to @site.i18n.dig('layouts', layout.to_s) || layout.to_s.humanize, - new_site_post_path(@site, layout: layout) + - @site.layouts.each do |layout| + - next if layout.hidden? + %li= link_to layout.humanized_name, new_site_post_path(@site, layout: layout.name) - if policy(@site).edit? = link_to t('sites.edit.btn', site: @site.title), edit_site_path(@site), class: 'btn'