Merge branch 'lectura-de-jekyll' into 'rails'

optimizar la lectura de datos desde jekyll

See merge request sutty/sutty!25
This commit is contained in:
Maki 2021-05-08 20:05:34 +00:00
commit f2981a6a45
2 changed files with 47 additions and 27 deletions

View file

@ -175,24 +175,10 @@ 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|
@ -200,6 +186,7 @@ class Site < ApplicationRecord
when 'layout' then {}
end
end
end
@jekyll.data
end
@ -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

View file

@ -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