mirror of
https://0xacab.org/sutty/sutty
synced 2024-11-22 19:36:21 +00:00
feat: title es un atributo obligatorio
si no existe en el esquema, generar un título en base a sus valores
This commit is contained in:
parent
b4467e4d56
commit
780d26f79a
12 changed files with 56 additions and 4 deletions
|
@ -19,8 +19,12 @@ class MetadataArray < MetadataTemplate
|
||||||
true && !private?
|
true && !private?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def titleize?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
def to_s
|
def to_s
|
||||||
value.join(', ')
|
value.select(&:present?).join(', ')
|
||||||
end
|
end
|
||||||
|
|
||||||
# Obtiene el valor desde el documento, convirtiéndolo a Array si no lo
|
# Obtiene el valor desde el documento, convirtiéndolo a Array si no lo
|
||||||
|
|
|
@ -13,6 +13,10 @@ class MetadataBelongsTo < MetadataRelatedPosts
|
||||||
''
|
''
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
belongs_to.try(:title).try(:value).to_s
|
||||||
|
end
|
||||||
|
|
||||||
# Obtiene el valor desde el documento.
|
# Obtiene el valor desde el documento.
|
||||||
#
|
#
|
||||||
# @return [String]
|
# @return [String]
|
||||||
|
|
|
@ -10,6 +10,10 @@ class MetadataPredefinedValue < MetadataString
|
||||||
@values ||= layout.dig(:metadata, name, 'values', I18n.locale.to_s)&.invert || {}
|
@values ||= layout.dig(:metadata, name, 'values', I18n.locale.to_s)&.invert || {}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
values.invert[value].to_s
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# Solo permite almacenar los valores predefinidos.
|
# Solo permite almacenar los valores predefinidos.
|
||||||
|
|
|
@ -22,6 +22,10 @@ class MetadataRelatedPosts < MetadataArray
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def titleize?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
def indexable_values
|
def indexable_values
|
||||||
posts.where(uuid: value).map(&:title).map(&:value)
|
posts.where(uuid: value).map(&:title).map(&:value)
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,7 +25,7 @@ require 'jekyll/utils'
|
||||||
class MetadataSlug < MetadataTemplate
|
class MetadataSlug < MetadataTemplate
|
||||||
# Trae el slug desde el título si existe o una string al azar
|
# Trae el slug desde el título si existe o una string al azar
|
||||||
def default_value
|
def default_value
|
||||||
title ? Jekyll::Utils.slugify(title, mode: site.slugify_mode) : SecureRandom.uuid
|
Jekyll::Utils.slugify(title || SecureRandom.uuid, mode: site.slugify_mode)
|
||||||
end
|
end
|
||||||
|
|
||||||
def value
|
def value
|
||||||
|
|
|
@ -11,6 +11,10 @@ class MetadataString < MetadataTemplate
|
||||||
true && !private?
|
true && !private?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def titleize?
|
||||||
|
true
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
# No se permite HTML en las strings
|
# No se permite HTML en las strings
|
||||||
|
|
|
@ -16,6 +16,11 @@ MetadataTemplate = Struct.new(:site, :document, :name, :label, :type,
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# El valor puede ser parte de un título auto-generado
|
||||||
|
def titleize?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
def inspect
|
def inspect
|
||||||
"#<#{self.class} site=#{site.name.inspect} post=#{post.id.inspect} value=#{value.inspect}>"
|
"#<#{self.class} site=#{site.name.inspect} post=#{post.id.inspect} value=#{value.inspect}>"
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
# Un campo de texto largo
|
# Un campo de texto largo
|
||||||
class MetadataText < MetadataString; end
|
class MetadataText < MetadataString
|
||||||
|
def titleize?
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
18
app/models/metadata_title.rb
Normal file
18
app/models/metadata_title.rb
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# El título es obligatorio para todos los Post, si el esquema no lo
|
||||||
|
# incluye, tenemos que poder generar un valor legible por humanes.
|
||||||
|
class MetadataTitle < MetadataString
|
||||||
|
# Obtener todos los valores de texto del artículo y generar un título
|
||||||
|
# en base a eso.
|
||||||
|
#
|
||||||
|
# @return [String]
|
||||||
|
def default_value
|
||||||
|
@default_value ||=
|
||||||
|
post.attributes.select do |attr|
|
||||||
|
post[attr].titleize?
|
||||||
|
end.map do |attr|
|
||||||
|
post[attr].to_s
|
||||||
|
end.compact.join(' ').strip.squeeze(' ')
|
||||||
|
end
|
||||||
|
end
|
|
@ -12,11 +12,12 @@ class Post
|
||||||
DEFAULT_ATTRIBUTES = %i[site document layout].freeze
|
DEFAULT_ATTRIBUTES = %i[site document layout].freeze
|
||||||
# Otros atributos que no vienen en los metadatos
|
# Otros atributos que no vienen en los metadatos
|
||||||
PRIVATE_ATTRIBUTES = %i[path slug attributes errors].freeze
|
PRIVATE_ATTRIBUTES = %i[path slug attributes errors].freeze
|
||||||
PUBLIC_ATTRIBUTES = %i[lang date uuid created_at].freeze
|
PUBLIC_ATTRIBUTES = %i[title lang date uuid created_at].freeze
|
||||||
ALIASED_ATTRIBUTES = %i[locale].freeze
|
ALIASED_ATTRIBUTES = %i[locale].freeze
|
||||||
ATTR_SUFFIXES = %w[? =].freeze
|
ATTR_SUFFIXES = %w[? =].freeze
|
||||||
|
|
||||||
ATTRIBUTE_DEFINITIONS = {
|
ATTRIBUTE_DEFINITIONS = {
|
||||||
|
'title' => { 'type' => 'title', 'required' => true },
|
||||||
'lang' => { 'type' => 'lang', 'required' => true },
|
'lang' => { 'type' => 'lang', 'required' => true },
|
||||||
'date' => { 'type' => 'document_date', 'required' => true },
|
'date' => { 'type' => 'document_date', 'required' => true },
|
||||||
'uuid' => { 'type' => 'uuid', 'required' => true },
|
'uuid' => { 'type' => 'uuid', 'required' => true },
|
||||||
|
|
3
app/views/posts/attribute_ro/_title.haml
Normal file
3
app/views/posts/attribute_ro/_title.haml
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
%tr{ id: attribute }
|
||||||
|
%th= post_label_t(attribute, post: post)
|
||||||
|
%td{ dir: dir, lang: locale }= metadata.value
|
1
app/views/posts/attributes/_title.haml
Normal file
1
app/views/posts/attributes/_title.haml
Normal file
|
@ -0,0 +1 @@
|
||||||
|
-#
|
Loading…
Reference in a new issue