lifer 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +1 -1
- data/.gitignore +1 -0
- data/CHANGELOG.md +26 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +110 -25
- data/LICENSE +18 -0
- data/README.md +79 -14
- data/Rakefile +2 -4
- data/bin/lifer +4 -2
- data/lib/lifer/brain.rb +171 -21
- data/lib/lifer/builder/html/from_erb.rb +92 -0
- data/lib/lifer/builder/html/from_liquid/drops/collection_drop.rb +40 -0
- data/lib/lifer/builder/html/from_liquid/drops/collections_drop.rb +40 -0
- data/lib/lifer/builder/html/from_liquid/drops/entry_drop.rb +63 -0
- data/lib/lifer/builder/html/from_liquid/drops/frontmatter_drop.rb +45 -0
- data/lib/lifer/builder/html/from_liquid/drops/settings_drop.rb +42 -0
- data/lib/lifer/builder/html/from_liquid/drops.rb +15 -0
- data/lib/lifer/builder/html/from_liquid/filters.rb +27 -0
- data/lib/lifer/builder/html/from_liquid/layout_tag.rb +67 -0
- data/lib/lifer/builder/html/from_liquid.rb +116 -0
- data/lib/lifer/builder/html.rb +107 -51
- data/lib/lifer/builder/rss.rb +113 -0
- data/lib/lifer/builder/txt.rb +60 -0
- data/lib/lifer/builder.rb +100 -1
- data/lib/lifer/cli.rb +105 -0
- data/lib/lifer/collection.rb +87 -8
- data/lib/lifer/config.rb +159 -31
- data/lib/lifer/dev/response.rb +61 -0
- data/lib/lifer/dev/router.rb +44 -0
- data/lib/lifer/dev/server.rb +97 -0
- data/lib/lifer/entry/html.rb +39 -0
- data/lib/lifer/entry/markdown.rb +162 -0
- data/lib/lifer/entry/txt.rb +41 -0
- data/lib/lifer/entry.rb +142 -41
- data/lib/lifer/message.rb +58 -0
- data/lib/lifer/selection/all_markdown.rb +16 -0
- data/lib/lifer/selection/included_in_feeds.rb +15 -0
- data/lib/lifer/selection.rb +79 -0
- data/lib/lifer/shared/finder_methods.rb +35 -0
- data/lib/lifer/shared.rb +6 -0
- data/lib/lifer/templates/cli.txt.erb +10 -0
- data/lib/lifer/templates/config.yaml +77 -0
- data/lib/lifer/templates/its-a-living.png +0 -0
- data/lib/lifer/templates/layout.html.erb +1 -1
- data/lib/lifer/uri_strategy/pretty.rb +14 -6
- data/lib/lifer/uri_strategy/pretty_root.rb +24 -0
- data/lib/lifer/uri_strategy/pretty_yyyy_mm_dd.rb +32 -0
- data/lib/lifer/uri_strategy/root.rb +17 -0
- data/lib/lifer/uri_strategy/simple.rb +10 -6
- data/lib/lifer/uri_strategy.rb +46 -6
- data/lib/lifer/utilities.rb +117 -0
- data/lib/lifer/version.rb +3 -0
- data/lib/lifer.rb +130 -23
- data/lifer.gemspec +12 -6
- data/locales/en.yml +54 -0
- metadata +142 -9
- data/lib/lifer/layout.rb +0 -25
- data/lib/lifer/templates/config +0 -4
- data/lib/lifer/uri_strategy/base.rb +0 -15
data/lib/lifer/uri_strategy.rb
CHANGED
@@ -1,13 +1,53 @@
|
|
1
|
+
# A URI strategy is used by collections and builders to determine the output
|
2
|
+
# path of each entry. Depending on the strategy used, the output URI can be
|
3
|
+
# very different. For example, given:
|
4
|
+
#
|
5
|
+
# Input file: 2020-01-01-my-trip-to-greece.md
|
6
|
+
#
|
7
|
+
# The output could be many things depending on the configured URI strategy:
|
8
|
+
#
|
9
|
+
# Output file: https://example.com/my-trip-to-greece.html
|
10
|
+
# Output file: https://example.com/2020/my-trip-to-greece/index.html
|
11
|
+
# Output file: https://example.com/my-trip-to-greece-foo-bar-foo.html
|
12
|
+
#
|
13
|
+
# URI strategies are configured per collection.
|
14
|
+
#
|
1
15
|
class Lifer::URIStrategy
|
16
|
+
include Lifer::Shared::FinderMethods
|
17
|
+
|
2
18
|
class << self
|
3
|
-
|
4
|
-
self.const_get name.capitalize
|
5
|
-
rescue NameError => error
|
6
|
-
raise StandardError, "no URI strategy '#{name}'"
|
7
|
-
end
|
19
|
+
attr_accessor :name
|
8
20
|
end
|
21
|
+
|
22
|
+
attr_reader :root
|
23
|
+
|
24
|
+
def initialize(root:)
|
25
|
+
@root = root
|
26
|
+
end
|
27
|
+
|
28
|
+
# This method should always return the path to the file in the format
|
29
|
+
# specified by the current URI strategy. For example, if the URI strategy was
|
30
|
+
# to indexify every entry (the "pretty" strategy), input to output would look
|
31
|
+
# like:
|
32
|
+
#
|
33
|
+
# entry-name.md ---> entry-name/index.html
|
34
|
+
#
|
35
|
+
# @raise [NotImplementedError] This method must be implemented on each
|
36
|
+
# subclass.
|
37
|
+
# @return [String] The path to the built output file.
|
38
|
+
def output_file(entry)
|
39
|
+
raise NotImplementedError, I18n.t("shared.not_implemented_method")
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
def file_extension(entry) = entry.class.output_extension
|
45
|
+
|
46
|
+
self.name = :uri_strategy
|
9
47
|
end
|
10
48
|
|
11
|
-
require_relative "uri_strategy/base"
|
12
49
|
require_relative "uri_strategy/pretty"
|
50
|
+
require_relative "uri_strategy/pretty_root"
|
51
|
+
require_relative "uri_strategy/pretty_yyyy_mm_dd"
|
52
|
+
require_relative "uri_strategy/root"
|
13
53
|
require_relative "uri_strategy/simple"
|
data/lib/lifer/utilities.rb
CHANGED
@@ -1,5 +1,94 @@
|
|
1
|
+
# A module namespace for any weird utilities that are used pseudo-globally.
|
2
|
+
# Ensure that these are actually useful globally, though. :-)
|
3
|
+
#
|
1
4
|
module Lifer::Utilities
|
2
5
|
class << self
|
6
|
+
# Output a string using bold escape sequences to the output TTY text.
|
7
|
+
#
|
8
|
+
# @param string [String] The string to display in bold.
|
9
|
+
# @return [String] The string, but in bold.
|
10
|
+
def bold_text(string)
|
11
|
+
"\e[1m#{string}\e[0m"
|
12
|
+
end
|
13
|
+
|
14
|
+
# Given a string path, classify it into a namespaced Ruby constant. If the
|
15
|
+
# constant does not exist, we raise a helpful error. For example:
|
16
|
+
#
|
17
|
+
# Given: my/class_name/that_exists
|
18
|
+
# Result: My::ClassName::ThatExists
|
19
|
+
#
|
20
|
+
# FIXME:
|
21
|
+
# Note that this method is currently a bit naive. It cannot politely
|
22
|
+
# transform classes with many caps in them (i.e. `URIStrategy`) without
|
23
|
+
# being given an exact match (`URIStrategy`) or a broken-looking one
|
24
|
+
# (`u_r_i_strategy`).
|
25
|
+
#
|
26
|
+
# @param string_constant [String] A string that maps to a Ruby constant.
|
27
|
+
# @return [Class, Module]
|
28
|
+
# @raise [RuntimeError]
|
29
|
+
def classify(string_constant)
|
30
|
+
Object.const_get camelize(string_constant)
|
31
|
+
rescue NameError => exception
|
32
|
+
raise I18n.t(
|
33
|
+
"utilities.classify_error",
|
34
|
+
string_constant:,
|
35
|
+
camel_cased_string_constant: camelize(string_constant)
|
36
|
+
)
|
37
|
+
end
|
38
|
+
|
39
|
+
# Takes a date and renders it in ISO 8601 format.
|
40
|
+
#
|
41
|
+
# @param datetime [Date, Time, DateTime, String] A representation of a date.
|
42
|
+
# @return [String] An ISO 8601 representation of that date.
|
43
|
+
def date_as_iso8601(datetime)
|
44
|
+
return unless (data = DateTime.parse(datetime.to_s))
|
45
|
+
|
46
|
+
data.strftime("%Y-%m-%dT%H:%M:%S%:z")
|
47
|
+
rescue Date::Error
|
48
|
+
nil
|
49
|
+
end
|
50
|
+
|
51
|
+
# Given a path, figure out what the extension is. It supports
|
52
|
+
# multi-extensions like ".html.erb".
|
53
|
+
#
|
54
|
+
# @param path [Pathname, String] The path to a file.
|
55
|
+
# @return [String] The extension (i.e. ".html.erb").
|
56
|
+
def file_extension(path)
|
57
|
+
File.basename(path.to_s.downcase).match(/(?<=.)\..*/).to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
# Given any string, normalize it into a "kabab-case", single-word string.
|
61
|
+
#
|
62
|
+
# Input: "Hi, how are you?"
|
63
|
+
# Output: "hi-how-are-you"
|
64
|
+
#
|
65
|
+
# @param string [String] Any string.
|
66
|
+
# @return [String] The kabab-cased output.
|
67
|
+
def handleize(string) = parameterize(string, separator: "-")
|
68
|
+
|
69
|
+
# Given a hash, take all of its keys (and sub-keys) and convert them into
|
70
|
+
# strings.
|
71
|
+
#
|
72
|
+
# @param hash [Hash] Any hash.
|
73
|
+
# @return [Hash] The hash with keys transformed to strings.
|
74
|
+
def stringify_keys(hash)
|
75
|
+
stringified_hash = {}
|
76
|
+
|
77
|
+
hash.each do |key, value|
|
78
|
+
stringified_hash[(key.to_s rescue key) || key] =
|
79
|
+
value.is_a?(Hash) ? stringify_keys(value) : value
|
80
|
+
|
81
|
+
stringify_keys(value) if value.is_a?(Hash)
|
82
|
+
end
|
83
|
+
|
84
|
+
stringified_hash
|
85
|
+
end
|
86
|
+
|
87
|
+
# Given a hash, take all of its keys (and sub-keys) and convert them into
|
88
|
+
# symbols.
|
89
|
+
#
|
90
|
+
# @param hash [Hash] Any hash.
|
91
|
+
# @return [Hash] The hash with keys transformed to symbols.
|
3
92
|
def symbolize_keys(hash)
|
4
93
|
symbolized_hash = {}
|
5
94
|
|
@@ -12,5 +101,33 @@ module Lifer::Utilities
|
|
12
101
|
|
13
102
|
symbolized_hash
|
14
103
|
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def camelize(string)
|
108
|
+
string = string.to_s
|
109
|
+
string
|
110
|
+
.gsub("/", "::")
|
111
|
+
.split("::")
|
112
|
+
.map(&:capitalize)
|
113
|
+
.map { |mod| mod.split("_").map(&:capitalize).join }
|
114
|
+
.join("::")
|
115
|
+
end
|
116
|
+
|
117
|
+
def parameterize(string, separator: "-", preserve_case: false)
|
118
|
+
text = string.gsub(/[^A-z0-9\-_]+/, separator)
|
119
|
+
|
120
|
+
unless separator.nil? || separator.empty?
|
121
|
+
re_sep = Regexp.escape(separator)
|
122
|
+
re_duplicate_separator = /#{re_sep}{2,}/
|
123
|
+
re_leading_trailing_separator = /^#{re_sep}|#{re_sep}$/
|
124
|
+
|
125
|
+
text.gsub!(re_duplicate_separator, separator)
|
126
|
+
text.gsub!(re_leading_trailing_separator, "")
|
127
|
+
end
|
128
|
+
|
129
|
+
text.downcase! unless preserve_case
|
130
|
+
text
|
131
|
+
end
|
15
132
|
end
|
16
133
|
end
|
data/lib/lifer.rb
CHANGED
@@ -2,21 +2,22 @@
|
|
2
2
|
|
3
3
|
require "set"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
require_relative "lifer/config"
|
9
|
-
require_relative "lifer/entry"
|
10
|
-
require_relative "lifer/layout"
|
11
|
-
require_relative "lifer/uri_strategy"
|
12
|
-
|
5
|
+
# The root Lifer module is a great entrypoint into the system, with convenience
|
6
|
+
# methods to access global resources like collections and configuration settings.
|
7
|
+
#
|
13
8
|
module Lifer
|
9
|
+
# Lifer considers files and directories that have the following names or
|
10
|
+
# contain the following patterns special and ignoreable when they're at the
|
11
|
+
# root of the Lifer project.
|
12
|
+
#
|
14
13
|
IGNORE_DIRECTORIES = [
|
15
14
|
"assets",
|
16
15
|
"bin",
|
17
16
|
"vendor"
|
18
17
|
]
|
19
18
|
|
19
|
+
# Lifer projects ignore files and directories that contain particular patterns.
|
20
|
+
#
|
20
21
|
IGNORE_PATTERNS = [
|
21
22
|
"^(\\.)", # Starts with a dot.
|
22
23
|
"^(_)", # Starts with an underscore.
|
@@ -24,32 +25,138 @@ module Lifer
|
|
24
25
|
] | IGNORE_DIRECTORIES.map { |d| "^(#{d})" }
|
25
26
|
|
26
27
|
class << self
|
27
|
-
|
28
|
-
|
28
|
+
# The first time `Lifer.brain` is referenced, we build a new `Lifer::Brain`
|
29
|
+
# object that is used and reused until the current process has ended.
|
30
|
+
#
|
31
|
+
# @param root [String] The absolute path to the Lifer project root.
|
32
|
+
# @param config_file [String] The absolute path to the Lifer project's
|
33
|
+
# configuration file.
|
34
|
+
# @return [Lifer::Brain] A brain!
|
35
|
+
def brain(root: Dir.pwd, config_file: nil)
|
36
|
+
@@brain ||= Lifer::Brain.init root:, config_file:
|
29
37
|
end
|
30
38
|
|
31
|
-
|
32
|
-
|
33
|
-
|
39
|
+
# Initiates the Lifer build process.
|
40
|
+
#
|
41
|
+
# @param environment [Symbol] The name of the current Lifer environment.
|
42
|
+
# Valid environments are `:build` or `:serve`.
|
43
|
+
# @return [void]
|
44
|
+
def build!(environment: :build) = (brain.build! environment:)
|
45
|
+
|
46
|
+
# List all collections in the project. By default, selections are also
|
47
|
+
# included.
|
48
|
+
#
|
49
|
+
# @param without_selections [boolean] Whether to include selections in the list.
|
50
|
+
# (Default: false.)
|
51
|
+
# @return [Array<Lifer::Collection>] A list of all collections.
|
52
|
+
def collections(without_selections: false)
|
53
|
+
return brain.collections unless without_selections
|
34
54
|
|
35
|
-
|
36
|
-
brain.collections
|
55
|
+
brain.collections.select { _1.class == Lifer::Collection }
|
37
56
|
end
|
38
57
|
|
58
|
+
# Used to locate the configuration file being used by the current Lifer
|
59
|
+
# project.
|
60
|
+
#
|
61
|
+
# @return [Pathname] The path to the current Lifer config file.
|
62
|
+
def config_file = brain.config.file
|
63
|
+
|
64
|
+
# A set of all entries currently in the project.
|
65
|
+
#
|
66
|
+
# FIXME: Do we need this as well as `Lifer.manifest`?
|
67
|
+
#
|
68
|
+
# @return [Set] All entries.
|
69
|
+
def entry_manifest = brain.entry_manifest
|
70
|
+
|
71
|
+
# This convenience method locates the Ruby gem root, which is always
|
72
|
+
# distinct from the Lifer project root. This is helpful, for example, if
|
73
|
+
# default templates provided by the gem are required in the current project.
|
74
|
+
#
|
75
|
+
# @return [String] The absolute path to the installed Lifer gem root.
|
76
|
+
def gem_root = File.dirname(__dir__)
|
77
|
+
|
78
|
+
# Check if the given path matches the Lifer ignore patterns.
|
79
|
+
#
|
80
|
+
# @param directory_or_file [String] The path to a directory or file.
|
81
|
+
# @return [boolean] True if the directory of file is ignoreable.
|
39
82
|
def ignoreable?(directory_or_file)
|
40
83
|
directory_or_file.match?(/#{IGNORE_PATTERNS.join("|")}/)
|
41
84
|
end
|
42
85
|
|
43
|
-
|
44
|
-
|
45
|
-
|
86
|
+
# A set of all entries currently in the project.
|
87
|
+
#
|
88
|
+
# FIXME: Do we need this as well as `Lifer.manifest`?
|
89
|
+
#
|
90
|
+
# @return [Set] All entries.
|
91
|
+
def manifest = brain.manifest
|
46
92
|
|
47
|
-
|
48
|
-
|
49
|
-
|
93
|
+
# The build directory for the Lifer project.
|
94
|
+
#
|
95
|
+
# @return [Pathname] The absolute path to the directory where the Lifer
|
96
|
+
# project would be built to.
|
97
|
+
def output_directory = brain.output_directory
|
98
|
+
|
99
|
+
# Register new settings so that they are "safe" and can be read from a Lifer
|
100
|
+
# configuration file. Unregistered settings are ignored.
|
101
|
+
#
|
102
|
+
# Example usage:
|
103
|
+
#
|
104
|
+
# register_settings(
|
105
|
+
# :hidden,
|
106
|
+
# :birthday,
|
107
|
+
# jsonfeed: [:enabled, :url, :style]
|
108
|
+
# )
|
109
|
+
#
|
110
|
+
# @overload register_settings(setting, ...)
|
111
|
+
# @param setting [Symbol, Hash] A setting or setting tree to be registered.
|
112
|
+
# @param ... [Symbol, Hash] More settings or settings trees to be
|
113
|
+
# registered.
|
114
|
+
# @return [void]
|
115
|
+
def register_settings(*settings) = brain.config.register_settings(*settings)
|
116
|
+
|
117
|
+
# The project brain.
|
118
|
+
#
|
119
|
+
# @return [Lifer::Brain] The project brain.
|
120
|
+
def root = brain.root
|
50
121
|
|
51
|
-
|
52
|
-
|
122
|
+
# Given a path to a setting, with or without a collection scope, get the
|
123
|
+
# current configured value for that setting.
|
124
|
+
#
|
125
|
+
# Note that if a collection does not have a setting set, the setting
|
126
|
+
# returned will be the Lifer root collection setting or the default setting
|
127
|
+
# unless the `:strict` keyword argument is set to `true`.
|
128
|
+
#
|
129
|
+
# @overload setting(..., collection: nil, strict: false)
|
130
|
+
# @param ... [Symbol] A list of settings to traverse the settings tree with.
|
131
|
+
# @param collection [Lifer::Collection] The collection scope for the
|
132
|
+
# wanted setting.
|
133
|
+
# @param strict [boolean] Choose whether to strictly return the collection
|
134
|
+
# setting or to fallback to the Lifer root and default settings.
|
135
|
+
# (Default: false.)
|
136
|
+
# @return [String, NilClass] The value of the best in-scope setting.
|
137
|
+
def setting(*name, collection: nil, strict: false)
|
138
|
+
brain.setting *name, collection: collection, strict: strict
|
53
139
|
end
|
140
|
+
|
141
|
+
# The project's current settings tree.
|
142
|
+
#
|
143
|
+
# @return [Hash] The `Lifer::Config#settings`.
|
144
|
+
def settings = brain.config.settings
|
54
145
|
end
|
55
146
|
end
|
147
|
+
|
148
|
+
require "i18n"
|
149
|
+
I18n.load_path += Dir["%s/locales/*.yml" % Lifer.gem_root]
|
150
|
+
I18n.available_locales = [:en]
|
151
|
+
|
152
|
+
# `Lifer::Shared` contains modules that that may or may not be included on other
|
153
|
+
# classes required below.
|
154
|
+
#
|
155
|
+
require_relative "lifer/shared"
|
156
|
+
|
157
|
+
require_relative "lifer/brain"
|
158
|
+
require_relative "lifer/builder"
|
159
|
+
require_relative "lifer/collection"
|
160
|
+
require_relative "lifer/entry"
|
161
|
+
require_relative "lifer/message"
|
162
|
+
require_relative "lifer/uri_strategy"
|
data/lifer.gemspec
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
VERSION = "0.2.0"
|
5
|
-
end
|
3
|
+
require_relative "lib/lifer/version"
|
6
4
|
|
7
5
|
Gem::Specification.new do |spec|
|
8
6
|
spec.name = "lifer"
|
@@ -13,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
13
11
|
spec.summary = "Minimal static weblog generator."
|
14
12
|
spec.description = "Minimal static weblog generator. Good RSS feeds."
|
15
13
|
spec.homepage = "https://github.com/benjaminwil/lifer"
|
16
|
-
spec.required_ruby_version = ">= 3.
|
14
|
+
spec.required_ruby_version = ">= 3.3"
|
17
15
|
|
18
16
|
spec.metadata["allowed_push_host"] = "https://rubygems.org"
|
19
17
|
|
@@ -30,11 +28,19 @@ Gem::Specification.new do |spec|
|
|
30
28
|
.reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
|
31
29
|
end
|
32
30
|
|
33
|
-
spec.bindir
|
34
|
-
spec.executables
|
31
|
+
spec.bindir = "bin"
|
32
|
+
spec.executables =
|
33
|
+
spec.files.grep(%r{\Abin/}) { |bin_file| File.basename(bin_file) }
|
35
34
|
spec.require_paths = ["lib"]
|
36
35
|
|
36
|
+
spec.add_dependency "i18n", "< 2"
|
37
37
|
spec.add_dependency "kramdown", "~> 2.4"
|
38
|
+
spec.add_dependency "liquid", "< 6"
|
39
|
+
spec.add_dependency "listen", "< 4"
|
40
|
+
spec.add_dependency "puma", "< 7"
|
41
|
+
spec.add_dependency "rack", "< 4"
|
42
|
+
spec.add_dependency "rss"
|
38
43
|
|
39
44
|
spec.add_development_dependency "debug"
|
45
|
+
spec.add_development_dependency "nokogiri"
|
40
46
|
end
|
data/locales/en.yml
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
en:
|
2
|
+
builder:
|
3
|
+
file_conflict_error: "Cannot build HTML file because `%{path}` already exists."
|
4
|
+
prebuild_failure: >
|
5
|
+
Lifer failed to complete building... A prebuild step failed to execute: %{exception}
|
6
|
+
html:
|
7
|
+
no_builder_error: No builder for layout file `%{file}` with type `%{type}`. Aborting!
|
8
|
+
cli:
|
9
|
+
bad_port: >
|
10
|
+
Problem with port argument: %{exception}
|
11
|
+
banner:
|
12
|
+
description: >
|
13
|
+
%{program_name}, the static site generator
|
14
|
+
subcommands: Subcommands
|
15
|
+
options: Options
|
16
|
+
usage: Usage
|
17
|
+
no_subcommand: >
|
18
|
+
%{subcommand} is not a supported subcommand. Running %{default_command} instead.
|
19
|
+
options:
|
20
|
+
config: Specify the path to a Lifer configuration file.
|
21
|
+
dump_default_config: Print the default configuration file to STDOUT and exit.
|
22
|
+
port: Specify a custom port for the dev server.
|
23
|
+
root: Specify the path to the Lifer project root.
|
24
|
+
subcommands:
|
25
|
+
build: Build the Lifer project as configured in your Lifer configuration file.
|
26
|
+
help: Display help text for the Lifer commandline interface.
|
27
|
+
serve: Run a Lifer development server. (http://localhost:9292 by default.)
|
28
|
+
dev:
|
29
|
+
router:
|
30
|
+
content_type_not_implemented: no content type defined for files like %{path} yet
|
31
|
+
four_oh_four: 404 Not Found
|
32
|
+
entry:
|
33
|
+
feedable_error: >
|
34
|
+
please set `%{entry_class}.include_in_feeds` to true or false
|
35
|
+
markdown:
|
36
|
+
date_error: "[%{filename}]: %{error}"
|
37
|
+
no_date_metadata: "[%{filename}]: no date metadata"
|
38
|
+
not_found: >
|
39
|
+
file "%{file}" does not exist
|
40
|
+
config:
|
41
|
+
no_config_file_at: No configuration file at %{file}. Using default configuration.
|
42
|
+
message:
|
43
|
+
prefix:
|
44
|
+
error: ERR
|
45
|
+
selection:
|
46
|
+
entries_not_implemented: all selections must implement the `#entries` method
|
47
|
+
layouts_not_allowed: selections do not have layout files
|
48
|
+
shared:
|
49
|
+
not_implemented_method: subclasses must implement this method
|
50
|
+
finder_methods:
|
51
|
+
unknown_class: no class with name "%{name}"
|
52
|
+
utilities:
|
53
|
+
classify_error: >
|
54
|
+
could not find constant for path "%{string_constant}" (%{camel_cased_string_constant})
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lifer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- benjamin wil
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-12-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: i18n
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "<"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "<"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: kramdown
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -24,6 +38,76 @@ dependencies:
|
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '2.4'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: liquid
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "<"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '6'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "<"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '6'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: listen
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "<"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '4'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "<"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '4'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: puma
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "<"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '7'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "<"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '7'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rack
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "<"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '4'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "<"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '4'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rss
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
27
111
|
- !ruby/object:Gem::Dependency
|
28
112
|
name: debug
|
29
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,17 +122,36 @@ dependencies:
|
|
38
122
|
- - ">="
|
39
123
|
- !ruby/object:Gem::Version
|
40
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: nokogiri
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
41
139
|
description: Minimal static weblog generator. Good RSS feeds.
|
42
140
|
email:
|
43
141
|
- benjamin@super.gd
|
44
|
-
executables:
|
142
|
+
executables:
|
143
|
+
- console
|
144
|
+
- lifer
|
145
|
+
- setup
|
45
146
|
extensions: []
|
46
147
|
extra_rdoc_files: []
|
47
148
|
files:
|
48
149
|
- ".github/workflows/main.yml"
|
49
150
|
- ".gitignore"
|
151
|
+
- CHANGELOG.md
|
50
152
|
- Gemfile
|
51
153
|
- Gemfile.lock
|
154
|
+
- LICENSE
|
52
155
|
- README.md
|
53
156
|
- Rakefile
|
54
157
|
- bin/console
|
@@ -58,18 +161,48 @@ files:
|
|
58
161
|
- lib/lifer/brain.rb
|
59
162
|
- lib/lifer/builder.rb
|
60
163
|
- lib/lifer/builder/html.rb
|
164
|
+
- lib/lifer/builder/html/from_erb.rb
|
165
|
+
- lib/lifer/builder/html/from_liquid.rb
|
166
|
+
- lib/lifer/builder/html/from_liquid/drops.rb
|
167
|
+
- lib/lifer/builder/html/from_liquid/drops/collection_drop.rb
|
168
|
+
- lib/lifer/builder/html/from_liquid/drops/collections_drop.rb
|
169
|
+
- lib/lifer/builder/html/from_liquid/drops/entry_drop.rb
|
170
|
+
- lib/lifer/builder/html/from_liquid/drops/frontmatter_drop.rb
|
171
|
+
- lib/lifer/builder/html/from_liquid/drops/settings_drop.rb
|
172
|
+
- lib/lifer/builder/html/from_liquid/filters.rb
|
173
|
+
- lib/lifer/builder/html/from_liquid/layout_tag.rb
|
174
|
+
- lib/lifer/builder/rss.rb
|
175
|
+
- lib/lifer/builder/txt.rb
|
176
|
+
- lib/lifer/cli.rb
|
61
177
|
- lib/lifer/collection.rb
|
62
178
|
- lib/lifer/config.rb
|
179
|
+
- lib/lifer/dev/response.rb
|
180
|
+
- lib/lifer/dev/router.rb
|
181
|
+
- lib/lifer/dev/server.rb
|
63
182
|
- lib/lifer/entry.rb
|
64
|
-
- lib/lifer/
|
65
|
-
- lib/lifer/
|
183
|
+
- lib/lifer/entry/html.rb
|
184
|
+
- lib/lifer/entry/markdown.rb
|
185
|
+
- lib/lifer/entry/txt.rb
|
186
|
+
- lib/lifer/message.rb
|
187
|
+
- lib/lifer/selection.rb
|
188
|
+
- lib/lifer/selection/all_markdown.rb
|
189
|
+
- lib/lifer/selection/included_in_feeds.rb
|
190
|
+
- lib/lifer/shared.rb
|
191
|
+
- lib/lifer/shared/finder_methods.rb
|
192
|
+
- lib/lifer/templates/cli.txt.erb
|
193
|
+
- lib/lifer/templates/config.yaml
|
194
|
+
- lib/lifer/templates/its-a-living.png
|
66
195
|
- lib/lifer/templates/layout.html.erb
|
67
196
|
- lib/lifer/uri_strategy.rb
|
68
|
-
- lib/lifer/uri_strategy/base.rb
|
69
197
|
- lib/lifer/uri_strategy/pretty.rb
|
198
|
+
- lib/lifer/uri_strategy/pretty_root.rb
|
199
|
+
- lib/lifer/uri_strategy/pretty_yyyy_mm_dd.rb
|
200
|
+
- lib/lifer/uri_strategy/root.rb
|
70
201
|
- lib/lifer/uri_strategy/simple.rb
|
71
202
|
- lib/lifer/utilities.rb
|
203
|
+
- lib/lifer/version.rb
|
72
204
|
- lifer.gemspec
|
205
|
+
- locales/en.yml
|
73
206
|
homepage: https://github.com/benjaminwil/lifer
|
74
207
|
licenses: []
|
75
208
|
metadata:
|
@@ -85,14 +218,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
85
218
|
requirements:
|
86
219
|
- - ">="
|
87
220
|
- !ruby/object:Gem::Version
|
88
|
-
version: '3.
|
221
|
+
version: '3.3'
|
89
222
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
223
|
requirements:
|
91
224
|
- - ">="
|
92
225
|
- !ruby/object:Gem::Version
|
93
226
|
version: '0'
|
94
227
|
requirements: []
|
95
|
-
rubygems_version: 3.
|
228
|
+
rubygems_version: 3.5.16
|
96
229
|
signing_key:
|
97
230
|
specification_version: 4
|
98
231
|
summary: Minimal static weblog generator.
|