ngage 0.0.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.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/exe/ngage +55 -0
  4. data/lib/ngage.rb +3 -0
  5. data/lib/ngage/jekyll.rb +204 -0
  6. data/lib/ngage/jekyll/cleaner.rb +111 -0
  7. data/lib/ngage/jekyll/collection.rb +235 -0
  8. data/lib/ngage/jekyll/command.rb +103 -0
  9. data/lib/ngage/jekyll/commands/build.rb +93 -0
  10. data/lib/ngage/jekyll/commands/clean.rb +45 -0
  11. data/lib/ngage/jekyll/commands/doctor.rb +173 -0
  12. data/lib/ngage/jekyll/commands/help.rb +34 -0
  13. data/lib/ngage/jekyll/commands/new.rb +157 -0
  14. data/lib/ngage/jekyll/commands/new_theme.rb +42 -0
  15. data/lib/ngage/jekyll/commands/serve.rb +354 -0
  16. data/lib/ngage/jekyll/commands/serve/live_reload_reactor.rb +122 -0
  17. data/lib/ngage/jekyll/commands/serve/livereload_assets/livereload.js +1183 -0
  18. data/lib/ngage/jekyll/commands/serve/servlet.rb +203 -0
  19. data/lib/ngage/jekyll/commands/serve/websockets.rb +81 -0
  20. data/lib/ngage/jekyll/configuration.rb +391 -0
  21. data/lib/ngage/jekyll/converter.rb +54 -0
  22. data/lib/ngage/jekyll/converters/identity.rb +41 -0
  23. data/lib/ngage/jekyll/converters/markdown.rb +116 -0
  24. data/lib/ngage/jekyll/converters/markdown/kramdown_parser.rb +122 -0
  25. data/lib/ngage/jekyll/converters/smartypants.rb +70 -0
  26. data/lib/ngage/jekyll/convertible.rb +253 -0
  27. data/lib/ngage/jekyll/deprecator.rb +50 -0
  28. data/lib/ngage/jekyll/document.rb +503 -0
  29. data/lib/ngage/jekyll/drops/collection_drop.rb +20 -0
  30. data/lib/ngage/jekyll/drops/document_drop.rb +69 -0
  31. data/lib/ngage/jekyll/drops/drop.rb +209 -0
  32. data/lib/ngage/jekyll/drops/excerpt_drop.rb +15 -0
  33. data/lib/ngage/jekyll/drops/jekyll_drop.rb +32 -0
  34. data/lib/ngage/jekyll/drops/site_drop.rb +56 -0
  35. data/lib/ngage/jekyll/drops/static_file_drop.rb +14 -0
  36. data/lib/ngage/jekyll/drops/unified_payload_drop.rb +26 -0
  37. data/lib/ngage/jekyll/drops/url_drop.rb +89 -0
  38. data/lib/ngage/jekyll/entry_filter.rb +127 -0
  39. data/lib/ngage/jekyll/errors.rb +20 -0
  40. data/lib/ngage/jekyll/excerpt.rb +180 -0
  41. data/lib/ngage/jekyll/external.rb +76 -0
  42. data/lib/ngage/jekyll/filters.rb +390 -0
  43. data/lib/ngage/jekyll/filters/date_filters.rb +110 -0
  44. data/lib/ngage/jekyll/filters/grouping_filters.rb +64 -0
  45. data/lib/ngage/jekyll/filters/url_filters.rb +68 -0
  46. data/lib/ngage/jekyll/frontmatter_defaults.rb +233 -0
  47. data/lib/ngage/jekyll/generator.rb +5 -0
  48. data/lib/ngage/jekyll/hooks.rb +106 -0
  49. data/lib/ngage/jekyll/layout.rb +62 -0
  50. data/lib/ngage/jekyll/liquid_extensions.rb +22 -0
  51. data/lib/ngage/jekyll/liquid_renderer.rb +63 -0
  52. data/lib/ngage/jekyll/liquid_renderer/file.rb +56 -0
  53. data/lib/ngage/jekyll/liquid_renderer/table.rb +98 -0
  54. data/lib/ngage/jekyll/log_adapter.rb +151 -0
  55. data/lib/ngage/jekyll/mime.types +825 -0
  56. data/lib/ngage/jekyll/page.rb +185 -0
  57. data/lib/ngage/jekyll/page_without_a_file.rb +14 -0
  58. data/lib/ngage/jekyll/plugin.rb +92 -0
  59. data/lib/ngage/jekyll/plugin_manager.rb +115 -0
  60. data/lib/ngage/jekyll/publisher.rb +23 -0
  61. data/lib/ngage/jekyll/reader.rb +154 -0
  62. data/lib/ngage/jekyll/readers/collection_reader.rb +22 -0
  63. data/lib/ngage/jekyll/readers/data_reader.rb +75 -0
  64. data/lib/ngage/jekyll/readers/layout_reader.rb +70 -0
  65. data/lib/ngage/jekyll/readers/page_reader.rb +25 -0
  66. data/lib/ngage/jekyll/readers/post_reader.rb +72 -0
  67. data/lib/ngage/jekyll/readers/static_file_reader.rb +25 -0
  68. data/lib/ngage/jekyll/readers/theme_assets_reader.rb +51 -0
  69. data/lib/ngage/jekyll/regenerator.rb +195 -0
  70. data/lib/ngage/jekyll/related_posts.rb +52 -0
  71. data/lib/ngage/jekyll/renderer.rb +266 -0
  72. data/lib/ngage/jekyll/site.rb +476 -0
  73. data/lib/ngage/jekyll/static_file.rb +169 -0
  74. data/lib/ngage/jekyll/stevenson.rb +60 -0
  75. data/lib/ngage/jekyll/tags/highlight.rb +108 -0
  76. data/lib/ngage/jekyll/tags/include.rb +226 -0
  77. data/lib/ngage/jekyll/tags/link.rb +40 -0
  78. data/lib/ngage/jekyll/tags/post_url.rb +104 -0
  79. data/lib/ngage/jekyll/theme.rb +73 -0
  80. data/lib/ngage/jekyll/theme_builder.rb +121 -0
  81. data/lib/ngage/jekyll/url.rb +160 -0
  82. data/lib/ngage/jekyll/utils.rb +370 -0
  83. data/lib/ngage/jekyll/utils/ansi.rb +57 -0
  84. data/lib/ngage/jekyll/utils/exec.rb +26 -0
  85. data/lib/ngage/jekyll/utils/internet.rb +37 -0
  86. data/lib/ngage/jekyll/utils/platforms.rb +82 -0
  87. data/lib/ngage/jekyll/utils/thread_event.rb +31 -0
  88. data/lib/ngage/jekyll/utils/win_tz.rb +75 -0
  89. data/lib/ngage/site_template/.gitignore +5 -0
  90. data/lib/ngage/site_template/404.html +25 -0
  91. data/lib/ngage/site_template/_config.yml +47 -0
  92. data/lib/ngage/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +29 -0
  93. data/lib/ngage/site_template/about.markdown +18 -0
  94. data/lib/ngage/site_template/index.markdown +6 -0
  95. data/lib/ngage/theme_template/CODE_OF_CONDUCT.md.erb +74 -0
  96. data/lib/ngage/theme_template/Gemfile +4 -0
  97. data/lib/ngage/theme_template/LICENSE.txt.erb +21 -0
  98. data/lib/ngage/theme_template/README.md.erb +52 -0
  99. data/lib/ngage/theme_template/_layouts/default.html +1 -0
  100. data/lib/ngage/theme_template/_layouts/page.html +5 -0
  101. data/lib/ngage/theme_template/_layouts/post.html +5 -0
  102. data/lib/ngage/theme_template/example/_config.yml.erb +1 -0
  103. data/lib/ngage/theme_template/example/_post.md +12 -0
  104. data/lib/ngage/theme_template/example/index.html +14 -0
  105. data/lib/ngage/theme_template/example/style.scss +7 -0
  106. data/lib/ngage/theme_template/gitignore.erb +6 -0
  107. data/lib/ngage/theme_template/theme.gemspec.erb +19 -0
  108. data/lib/ngage/version.rb +5 -0
  109. metadata +328 -0
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Drops
5
+ class CollectionDrop < Drop
6
+ extend Forwardable
7
+
8
+ mutable false
9
+
10
+ def_delegator :@obj, :write?, :output
11
+ def_delegators :@obj, :label, :docs, :files, :directory, :relative_directory
12
+
13
+ private def_delegator :@obj, :metadata, :fallback_data
14
+
15
+ def to_s
16
+ docs.to_s
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Drops
5
+ class DocumentDrop < Drop
6
+ extend Forwardable
7
+
8
+ NESTED_OBJECT_FIELD_BLACKLIST = %w(
9
+ content output excerpt next previous
10
+ ).freeze
11
+
12
+ mutable false
13
+
14
+ def_delegator :@obj, :relative_path, :path
15
+ def_delegators :@obj, :id, :output, :content, :to_s, :relative_path, :url
16
+
17
+ private def_delegator :@obj, :data, :fallback_data
18
+
19
+ def collection
20
+ @obj.collection.label
21
+ end
22
+
23
+ def excerpt
24
+ fallback_data["excerpt"].to_s
25
+ end
26
+
27
+ def <=>(other)
28
+ return nil unless other.is_a? DocumentDrop
29
+
30
+ cmp = self["date"] <=> other["date"]
31
+ cmp = self["path"] <=> other["path"] if cmp.nil? || cmp.zero?
32
+ cmp
33
+ end
34
+
35
+ def previous
36
+ @obj.previous_doc.to_liquid
37
+ end
38
+
39
+ def next
40
+ @obj.next_doc.to_liquid
41
+ end
42
+
43
+ # Generate a Hash for use in generating JSON.
44
+ # This is useful if fields need to be cleared before the JSON can generate.
45
+ #
46
+ # state - the JSON::State object which determines the state of current processing.
47
+ #
48
+ # Returns a Hash ready for JSON generation.
49
+ def hash_for_json(state = nil)
50
+ to_h.tap do |hash|
51
+ if state && state.depth >= 2
52
+ hash["previous"] = collapse_document(hash["previous"]) if hash["previous"]
53
+ hash["next"] = collapse_document(hash["next"]) if hash["next"]
54
+ end
55
+ end
56
+ end
57
+
58
+ # Generate a Hash which breaks the recursive chain.
59
+ # Certain fields which are normally available are omitted.
60
+ #
61
+ # Returns a Hash with only non-recursive fields present.
62
+ def collapse_document(doc)
63
+ doc.keys.each_with_object({}) do |(key, _), result|
64
+ result[key] = doc[key] unless NESTED_OBJECT_FIELD_BLACKLIST.include?(key)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,209 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Drops
5
+ class Drop < Liquid::Drop
6
+ include Enumerable
7
+
8
+ NON_CONTENT_METHODS = [:fallback_data, :collapse_document].freeze
9
+
10
+ # Get or set whether the drop class is mutable.
11
+ # Mutability determines whether or not pre-defined fields may be
12
+ # overwritten.
13
+ #
14
+ # is_mutable - Boolean set mutability of the class (default: nil)
15
+ #
16
+ # Returns the mutability of the class
17
+ def self.mutable(is_mutable = nil)
18
+ @is_mutable = is_mutable || false
19
+ end
20
+
21
+ def self.mutable?
22
+ @is_mutable
23
+ end
24
+
25
+ # Create a new Drop
26
+ #
27
+ # obj - the Jekyll Site, Collection, or Document required by the
28
+ # drop.
29
+ #
30
+ # Returns nothing
31
+ def initialize(obj)
32
+ @obj = obj
33
+ @mutations = {} # only if mutable: true
34
+ end
35
+
36
+ # Access a method in the Drop or a field in the underlying hash data.
37
+ # If mutable, checks the mutations first. Then checks the methods,
38
+ # and finally check the underlying hash (e.g. document front matter)
39
+ # if all the previous places didn't match.
40
+ #
41
+ # key - the string key whose value to fetch
42
+ #
43
+ # Returns the value for the given key, or nil if none exists
44
+ def [](key)
45
+ if self.class.mutable? && @mutations.key?(key)
46
+ @mutations[key]
47
+ elsif self.class.invokable? key
48
+ public_send key
49
+ else
50
+ fallback_data[key]
51
+ end
52
+ end
53
+ alias_method :invoke_drop, :[]
54
+
55
+ # Set a field in the Drop. If mutable, sets in the mutations and
56
+ # returns. If not mutable, checks first if it's trying to override a
57
+ # Drop method and raises a DropMutationException if so. If not
58
+ # mutable and the key is not a method on the Drop, then it sets the
59
+ # key to the value in the underlying hash (e.g. document front
60
+ # matter)
61
+ #
62
+ # key - the String key whose value to set
63
+ # val - the Object to set the key's value to
64
+ #
65
+ # Returns the value the key was set to unless the Drop is not mutable
66
+ # and the key matches a method in which case it raises a
67
+ # DropMutationException.
68
+ def []=(key, val)
69
+ if respond_to?("#{key}=")
70
+ public_send("#{key}=", val)
71
+ elsif respond_to?(key.to_s)
72
+ if self.class.mutable?
73
+ @mutations[key] = val
74
+ else
75
+ raise Errors::DropMutationException, "Key #{key} cannot be set in the drop."
76
+ end
77
+ else
78
+ fallback_data[key] = val
79
+ end
80
+ end
81
+
82
+ # Generates a list of strings which correspond to content getter
83
+ # methods.
84
+ #
85
+ # Returns an Array of strings which represent method-specific keys.
86
+ def content_methods
87
+ @content_methods ||= (
88
+ self.class.instance_methods \
89
+ - Jekyll::Drops::Drop.instance_methods \
90
+ - NON_CONTENT_METHODS
91
+ ).map(&:to_s).reject do |method|
92
+ method.end_with?("=")
93
+ end
94
+ end
95
+
96
+ # Check if key exists in Drop
97
+ #
98
+ # key - the string key whose value to fetch
99
+ #
100
+ # Returns true if the given key is present
101
+ def key?(key)
102
+ return false if key.nil?
103
+ return true if self.class.mutable? && @mutations.key?(key)
104
+
105
+ respond_to?(key) || fallback_data.key?(key)
106
+ end
107
+
108
+ # Generates a list of keys with user content as their values.
109
+ # This gathers up the Drop methods and keys of the mutations and
110
+ # underlying data hashes and performs a set union to ensure a list
111
+ # of unique keys for the Drop.
112
+ #
113
+ # Returns an Array of unique keys for content for the Drop.
114
+ def keys
115
+ (content_methods |
116
+ @mutations.keys |
117
+ fallback_data.keys).flatten
118
+ end
119
+
120
+ # Generate a Hash representation of the Drop by resolving each key's
121
+ # value. It includes Drop methods, mutations, and the underlying object's
122
+ # data. See the documentation for Drop#keys for more.
123
+ #
124
+ # Returns a Hash with all the keys and values resolved.
125
+ def to_h
126
+ keys.each_with_object({}) do |(key, _), result|
127
+ result[key] = self[key]
128
+ end
129
+ end
130
+ alias_method :to_hash, :to_h
131
+
132
+ # Inspect the drop's keys and values through a JSON representation
133
+ # of its keys and values.
134
+ #
135
+ # Returns a pretty generation of the hash representation of the Drop.
136
+ def inspect
137
+ JSON.pretty_generate to_h
138
+ end
139
+
140
+ # Generate a Hash for use in generating JSON.
141
+ # This is useful if fields need to be cleared before the JSON can generate.
142
+ #
143
+ # Returns a Hash ready for JSON generation.
144
+ def hash_for_json(*)
145
+ to_h
146
+ end
147
+
148
+ # Generate a JSON representation of the Drop.
149
+ #
150
+ # state - the JSON::State object which determines the state of current processing.
151
+ #
152
+ # Returns a JSON representation of the Drop in a String.
153
+ def to_json(state = nil)
154
+ JSON.generate(hash_for_json(state), state)
155
+ end
156
+
157
+ # Collects all the keys and passes each to the block in turn.
158
+ #
159
+ # block - a block which accepts one argument, the key
160
+ #
161
+ # Returns nothing.
162
+ def each_key(&block)
163
+ keys.each(&block)
164
+ end
165
+
166
+ def each
167
+ each_key.each do |key|
168
+ yield key, self[key]
169
+ end
170
+ end
171
+
172
+ def merge(other, &block)
173
+ dup.tap do |me|
174
+ if block.nil?
175
+ me.merge!(other)
176
+ else
177
+ me.merge!(other, block)
178
+ end
179
+ end
180
+ end
181
+
182
+ def merge!(other)
183
+ other.each_key do |key|
184
+ if block_given?
185
+ self[key] = yield key, self[key], other[key]
186
+ else
187
+ if Utils.mergable?(self[key]) && Utils.mergable?(other[key])
188
+ self[key] = Utils.deep_merge_hashes(self[key], other[key])
189
+ next
190
+ end
191
+
192
+ self[key] = other[key] unless other[key].nil?
193
+ end
194
+ end
195
+ end
196
+
197
+ # Imitate Hash.fetch method in Drop
198
+ #
199
+ # Returns value if key is present in Drop, otherwise returns default value
200
+ # KeyError is raised if key is not present and no default value given
201
+ def fetch(key, default = nil, &block)
202
+ return self[key] if key?(key)
203
+ raise KeyError, %(key not found: "#{key}") if default.nil? && block.nil?
204
+ return yield(key) unless block.nil?
205
+ return default unless default.nil?
206
+ end
207
+ end
208
+ end
209
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Drops
5
+ class ExcerptDrop < DocumentDrop
6
+ def layout
7
+ @obj.doc.data["layout"]
8
+ end
9
+
10
+ def excerpt
11
+ nil
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Drops
5
+ class JekyllDrop < Liquid::Drop
6
+ class << self
7
+ def global
8
+ @global ||= JekyllDrop.new
9
+ end
10
+ end
11
+
12
+ def version
13
+ Jekyll::VERSION
14
+ end
15
+
16
+ def environment
17
+ Jekyll.env
18
+ end
19
+
20
+ def to_h
21
+ @to_h ||= {
22
+ "version" => version,
23
+ "environment" => environment,
24
+ }
25
+ end
26
+
27
+ def to_json(state = nil)
28
+ JSON.generate(to_h, state)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Drops
5
+ class SiteDrop < Drop
6
+ extend Forwardable
7
+
8
+ mutable false
9
+
10
+ def_delegator :@obj, :site_data, :data
11
+ def_delegators :@obj, :time, :pages, :static_files, :documents, :tags, :categories
12
+
13
+ private def_delegator :@obj, :config, :fallback_data
14
+
15
+ def [](key)
16
+ if key != "posts" && @obj.collections.key?(key)
17
+ @obj.collections[key].docs
18
+ else
19
+ super(key)
20
+ end
21
+ end
22
+
23
+ def key?(key)
24
+ (key != "posts" && @obj.collections.key?(key)) || super
25
+ end
26
+
27
+ def posts
28
+ @site_posts ||= @obj.posts.docs.sort { |a, b| b <=> a }
29
+ end
30
+
31
+ def html_pages
32
+ @site_html_pages ||= @obj.pages.select do |page|
33
+ page.html? || page.url.end_with?("/")
34
+ end
35
+ end
36
+
37
+ def collections
38
+ @site_collections ||= @obj.collections.values.sort_by(&:label).map(&:to_liquid)
39
+ end
40
+
41
+ # `{{ site.related_posts }}` is how posts can get posts related to
42
+ # them, either through LSI if it's enabled, or through the most
43
+ # recent posts.
44
+ # We should remove this in 4.0 and switch to `{{ post.related_posts }}`.
45
+ def related_posts
46
+ return nil unless @current_document.is_a?(Jekyll::Document)
47
+
48
+ @current_document.related_posts
49
+ end
50
+ attr_writer :current_document
51
+
52
+ # return nil for `{{ site.config }}` even if --config was passed via CLI
53
+ def config; end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Drops
5
+ class StaticFileDrop < Drop
6
+ extend Forwardable
7
+ def_delegators :@obj, :name, :extname, :modified_time, :basename
8
+ def_delegator :@obj, :relative_path, :path
9
+ def_delegator :@obj, :type, :collection
10
+
11
+ private def_delegator :@obj, :data, :fallback_data
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Drops
5
+ class UnifiedPayloadDrop < Drop
6
+ mutable true
7
+
8
+ attr_accessor :page, :layout, :content, :paginator
9
+ attr_accessor :highlighter_prefix, :highlighter_suffix
10
+
11
+ def jekyll
12
+ JekyllDrop.global
13
+ end
14
+
15
+ def site
16
+ @site_drop ||= SiteDrop.new(@obj)
17
+ end
18
+
19
+ private
20
+
21
+ def fallback_data
22
+ @fallback_data ||= {}
23
+ end
24
+ end
25
+ end
26
+ end