diff --git a/app/models/site.rb b/app/models/site.rb index 7a8b4b4b..901d70c6 100644 --- a/app/models/site.rb +++ b/app/models/site.rb @@ -175,30 +175,17 @@ class Site < ApplicationRecord end alias default_lang default_locale - def read? - @read ||= false - end - - # Lee el sitio y todos los artículos - def read - # No hacer nada si ya se leyó antes - return if read? - - @jekyll.read - @read = true - end - # Trae los datos del directorio _data dentro del sitio - # - # XXX: Leer directamente sin pasar por Jekyll def data - read + unless @jekyll.data.present? + @jekyll.reader.read_data - # 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 {} - end + # 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 {} + end + end end @jekyll.data @@ -207,7 +194,10 @@ class Site < ApplicationRecord # Traer las colecciones. Todos los artículos van a estar dentro de # colecciones. def collections - read + unless @read + @jekyll.reader.read_collections + @read = true + end @jekyll.collections end @@ -221,8 +211,6 @@ class Site < ApplicationRecord # # @param lang: [String|Symbol] traer los artículos de este idioma def posts(lang: nil) - read - # Traemos los posts del idioma actual por defecto o el que haya lang ||= locales.include?(I18n.locale) ? I18n.locale : default_locale lang = lang.to_sym diff --git a/config/initializers/core_extensions.rb b/config/initializers/core_extensions.rb index e37b2be4..8bbcbe71 100644 --- a/config/initializers/core_extensions.rb +++ b/config/initializers/core_extensions.rb @@ -32,31 +32,52 @@ module ActionDispatch end # Lazy Loading de Jekyll, deshabilitando la instanciación de elementos -# que no necesitamos +# que no necesitamos. Esto permite que podamos leer el sitio por partes +# en lugar de todo junto. # # TODO: Aplicar monkey patches en otro lado... module Jekyll Reader.class_eval do + # No necesitamos otros posts def retrieve_posts(_); end + # No necesitamos otros directorios def retrieve_dirs(_, _, _); end + # No necesitamos las páginas def retrieve_pages(_, _); end + # No necesitamos los archivos estáticos def retrieve_static_files(_, _); end + + # Solo lee los datos + def read_data + @site.data = DataReader.new(site).read(site.config["data_dir"]) + end + + # Lee todos los artículos del sitio + def read_collections + read_directories + read_included_excludes + sort_files! + CollectionReader.new(site).read + end end + # No necesitamos los archivos de la plantilla ThemeAssetsReader.class_eval do def read; end end - # Prevenir la lectura del documento + # Aplazar la lectura del documento Document.class_eval do alias_method :read!, :read def read; end end - # https://github.com/jekyll/jekyll/pull/8425 + # Prevenir la instanciación de Time + # + # @see {https://github.com/jekyll/jekyll/pull/8425} Utils.class_eval do def parse_date(input, msg = 'Input could not be parsed.') @parse_date_cache ||= {} @@ -66,3 +87,14 @@ module Jekyll end end end + +# JekyllData::Reader del plugin jekyll-data modifica Jekyll::Site#reader +# para también leer los datos que vienen en el theme. +module JekyllData + Reader.class_eval do + def read_data + super + read_theme_data + end + end +end