jekyll-admin 0.8.1 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +50 -7
- data/lib/jekyll-admin.rb +14 -13
- data/lib/jekyll-admin/apiable.rb +76 -14
- data/lib/jekyll-admin/data_file.rb +19 -16
- data/lib/jekyll-admin/directory.rb +25 -26
- data/lib/jekyll-admin/file_helper.rb +14 -1
- data/lib/jekyll-admin/path_helper.rb +10 -1
- data/lib/jekyll-admin/public/asset-manifest.json +27 -0
- data/lib/jekyll-admin/public/index.html +1 -12
- data/lib/jekyll-admin/public/precache-manifest.64226b0470ae7a98d28d6c8a80943541.js +78 -0
- data/lib/jekyll-admin/public/service-worker.js +39 -0
- data/lib/jekyll-admin/public/static/css/2.9311179f.chunk.css +2 -0
- data/lib/jekyll-admin/public/static/css/2.9311179f.chunk.css.map +1 -0
- data/lib/jekyll-admin/public/static/css/main.51bccafc.chunk.css +5 -0
- data/lib/jekyll-admin/public/static/css/main.51bccafc.chunk.css.map +1 -0
- data/lib/jekyll-admin/public/static/js/2.c4e847cc.chunk.js +3 -0
- data/lib/jekyll-admin/public/static/js/2.c4e847cc.chunk.js.LICENSE.txt +69 -0
- data/lib/jekyll-admin/public/static/js/2.c4e847cc.chunk.js.map +1 -0
- data/lib/jekyll-admin/public/static/js/main.2ce220f0.chunk.js +2 -0
- data/lib/jekyll-admin/public/static/js/main.2ce220f0.chunk.js.map +1 -0
- data/lib/jekyll-admin/public/static/js/runtime-main.e35fac22.js +2 -0
- data/lib/jekyll-admin/public/static/js/runtime-main.e35fac22.js.map +1 -0
- data/lib/jekyll-admin/public/{1dc35d25e61d819a9c357074014867ab.ttf → static/media/fontawesome-webfont.1dc35d25.ttf} +0 -0
- data/lib/jekyll-admin/public/{25a32416abee198dd821b0b17a198a8f.eot → static/media/fontawesome-webfont.25a32416.eot} +0 -0
- data/lib/jekyll-admin/public/{c8ddf1e5e5bf3682bc7bebf30f394148.woff → static/media/fontawesome-webfont.c8ddf1e5.woff} +0 -0
- data/lib/jekyll-admin/public/{d7c639084f684d66a1bc66855d193ed8.svg → static/media/fontawesome-webfont.d7c63908.svg} +0 -0
- data/lib/jekyll-admin/public/{e6cf7c6ec7c2d6f670ae9d762604cb0b.woff2 → static/media/fontawesome-webfont.e6cf7c6e.woff2} +0 -0
- data/lib/jekyll-admin/public/{55131026930a0cd4539d1e2fdb92722d.ttf → static/media/lato-bold.55131026.ttf} +0 -0
- data/lib/jekyll-admin/public/{059514c92565e4045da1a69525dd9ec0.ttf → static/media/lato-regular.059514c9.ttf} +0 -0
- data/lib/jekyll-admin/public/{a770b6797b68e3f8920e473eb824bac0.gif → static/media/loader-big.a770b679.gif} +0 -0
- data/lib/jekyll-admin/public/static/media/rw-widgets.12f0820c.woff +0 -0
- data/lib/jekyll-admin/public/{03945ac4fc7fdefc44bc110bf1ba2393.svg → static/media/rw-widgets.792dcd18.svg} +14 -8
- data/lib/jekyll-admin/public/{e44520ab9079ea7633bfa874bed5d21d.eot → static/media/rw-widgets.bc7c4a59.eot} +0 -0
- data/lib/jekyll-admin/public/{bfc14ac982326f7d0b1340e20d3e0c37.ttf → static/media/rw-widgets.eceddf47.ttf} +0 -0
- data/lib/jekyll-admin/server.rb +23 -16
- data/lib/jekyll-admin/server/{collection.rb → collections.rb} +12 -5
- data/lib/jekyll-admin/server/configuration.rb +9 -6
- data/lib/jekyll-admin/server/data.rb +4 -2
- data/lib/jekyll-admin/server/{draft.rb → drafts.rb} +11 -7
- data/lib/jekyll-admin/server/{page.rb → pages.rb} +24 -5
- data/lib/jekyll-admin/server/site_meta.rb +25 -0
- data/lib/jekyll-admin/server/static_files.rb +83 -0
- data/lib/jekyll-admin/static_server.rb +3 -1
- data/lib/jekyll-admin/urlable.rb +9 -1
- data/lib/jekyll-admin/version.rb +3 -1
- data/lib/jekyll/commands/serve.rb +14 -12
- metadata +60 -62
- data/lib/jekyll-admin/page_without_a_file.rb +0 -7
- data/lib/jekyll-admin/public/33a752211d05af6684e26ec63c2ed965.gif +0 -0
- data/lib/jekyll-admin/public/8b4968b70019a0551a72940c5a2020d3.png +0 -0
- data/lib/jekyll-admin/public/8ea28ca3bfdf27145068e81dd07a34c6.png +0 -0
- data/lib/jekyll-admin/public/99adb54b0f30c0758bb4cb9ed5b80aa8.woff +0 -0
- data/lib/jekyll-admin/public/bundle.js +0 -117
- data/lib/jekyll-admin/public/bundle.js.map +0 -1
- data/lib/jekyll-admin/public/styles.css +0 -5
- data/lib/jekyll-admin/public/styles.css.map +0 -1
- data/lib/jekyll-admin/server/static_file.rb +0 -61
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dd575c1a5e2646679878544936041b41705f451b3a9cb38d71272bc3518c5be4
|
4
|
+
data.tar.gz: 122cd2307dfd1e3cdd2587da707bae510d9744cdc4453f5eaa24f4e9dd72d290
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b022a7157b17c8e42f6ecdaa3edcdb162242eb7a000f54f5e1d595ec30d4ea75d41df3eb6e9d3765b370cdc33ab97538ac95f6b31af89fc84fa34bf63337e8b8
|
7
|
+
data.tar.gz: 8bbadf4964bb2ab703863d04c5a0c9cf7b9c650bf009a9368435da84750a74aafe1b85ca2634dffb1ce5dc9905a68d610a90b72df4ad589b5c82240861806f2d
|
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
[![Gem Version](https://img.shields.io/gem/v/jekyll-admin.svg)](https://rubygems.org/gems/jekyll-admin)
|
2
2
|
[![Build Status](https://travis-ci.org/jekyll/jekyll-admin.svg?branch=master)](https://travis-ci.org/jekyll/jekyll-admin)
|
3
|
-
[![Build status](https://ci.appveyor.com/api/projects/status/
|
3
|
+
[![Build status](https://ci.appveyor.com/api/projects/status/u6u9tn7rk5tln33s/branch/master?svg=true)](https://ci.appveyor.com/project/jekyll/jekyll-admin)
|
4
4
|
[![Coverage Status](https://coveralls.io/repos/github/jekyll/jekyll-admin/badge.svg?branch=master)](https://coveralls.io/github/jekyll/jekyll-admin?branch=master)
|
5
5
|
[![NPM Dependencies](https://david-dm.org/jekyll/jekyll-admin.svg)](https://david-dm.org/jekyll/jekyll-admin)
|
6
|
+
[![Financial Contributors on Open Collective](https://opencollective.com/jekyll-admin/all/badge.svg?label=financial+contributors)](https://opencollective.com/jekyll-admin)
|
6
7
|
|
7
8
|
A Jekyll plugin that provides users with a traditional CMS-style graphical interface to author content and administer Jekyll sites. The project is divided into two parts. A Ruby-based HTTP API that handles Jekyll and filesystem operations, and a JavaScript-based front end, built on that API.
|
8
9
|
|
@@ -10,7 +11,7 @@ A Jekyll plugin that provides users with a traditional CMS-style graphical inter
|
|
10
11
|
|
11
12
|
## Installation
|
12
13
|
|
13
|
-
Refer to the [installing plugins](https://jekyllrb.com/docs/plugins
|
14
|
+
Refer to the [installing plugins](https://jekyllrb.com/docs/plugins/installation/) section of Jekyll's documentation and install the `jekyll-admin` plugin as you would any other plugin. Here's the short version:
|
14
15
|
|
15
16
|
1. Add the following to your site's Gemfile:
|
16
17
|
|
@@ -27,9 +28,7 @@ Refer to the [installing plugins](https://jekyllrb.com/docs/plugins/#installing-
|
|
27
28
|
|
28
29
|
## Options
|
29
30
|
|
30
|
-
Jekyll Admin related options can be specified in `_config.yml`
|
31
|
-
under a key called `jekyll_admin`. Currently it has only one option `hidden_links`
|
32
|
-
which is for hiding unwanted links on the sidebar. The following keys under `hidden_links` can be used in order to hide default links;
|
31
|
+
Jekyll Admin related options can be specified in `_config.yml` under a key called `jekyll_admin`.
|
33
32
|
|
34
33
|
```yaml
|
35
34
|
jekyll_admin:
|
@@ -39,12 +38,56 @@ jekyll_admin:
|
|
39
38
|
- staticfiles
|
40
39
|
- datafiles
|
41
40
|
- configuration
|
41
|
+
homepage: "pages"
|
42
|
+
```
|
43
|
+
|
44
|
+
### Customizing collection label in Sidebar
|
45
|
+
|
46
|
+
The plugin allows you to customize the name of a collection that is displayed in the sidebar by defining it in the collection's
|
47
|
+
metadata in the config file. For example, if your source's *posts* are actually *news-items* on the deployed site, then it can
|
48
|
+
be distracting to see the label `Posts` in the admin's sidebar. This situation can be resolved with the following configuration:
|
49
|
+
|
50
|
+
```yaml
|
51
|
+
collections:
|
52
|
+
posts:
|
53
|
+
output: true
|
54
|
+
sidebar_label: News
|
42
55
|
```
|
43
56
|
|
44
57
|
## Contributing
|
45
58
|
|
46
|
-
Interested in contributing to Jekyll Admin? We’d love your help. Jekyll Admin is an open source project, built one contribution at a time by users like you. See [the contributing instructions](.github/CONTRIBUTING.md), and [the development docs](
|
59
|
+
Interested in contributing to Jekyll Admin? We’d love your help. Jekyll Admin is an open source project, built one contribution at a time by users like you. See [the contributing instructions](.github/CONTRIBUTING.md), and [the development docs](https://jekyll.github.io/jekyll-admin/development/) for more information.
|
60
|
+
|
61
|
+
## Contributors
|
62
|
+
|
63
|
+
### Code Contributors
|
64
|
+
|
65
|
+
This project exists thanks to all the people who contribute. [[Contribute](.github/CONTRIBUTING.md)].
|
66
|
+
<a href="https://github.com/jekyll/jekyll-admin/graphs/contributors"><img src="https://opencollective.com/jekyll-admin/contributors.svg?width=890&button=false" /></a>
|
67
|
+
|
68
|
+
### Financial Contributors
|
69
|
+
|
70
|
+
Become a financial contributor and help us sustain our community. [[Contribute](https://opencollective.com/jekyll-admin/contribute)]
|
71
|
+
|
72
|
+
#### Individuals
|
73
|
+
|
74
|
+
<a href="https://opencollective.com/jekyll-admin"><img src="https://opencollective.com/jekyll-admin/individuals.svg?width=890"></a>
|
75
|
+
|
76
|
+
#### Organizations
|
77
|
+
|
78
|
+
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/jekyll-admin/contribute)]
|
79
|
+
|
80
|
+
<a href="https://opencollective.com/jekyll-admin/organization/0/website"><img src="https://opencollective.com/jekyll-admin/organization/0/avatar.svg"></a>
|
81
|
+
<a href="https://opencollective.com/jekyll-admin/organization/1/website"><img src="https://opencollective.com/jekyll-admin/organization/1/avatar.svg"></a>
|
82
|
+
<a href="https://opencollective.com/jekyll-admin/organization/2/website"><img src="https://opencollective.com/jekyll-admin/organization/2/avatar.svg"></a>
|
83
|
+
<a href="https://opencollective.com/jekyll-admin/organization/3/website"><img src="https://opencollective.com/jekyll-admin/organization/3/avatar.svg"></a>
|
84
|
+
<a href="https://opencollective.com/jekyll-admin/organization/4/website"><img src="https://opencollective.com/jekyll-admin/organization/4/avatar.svg"></a>
|
85
|
+
<a href="https://opencollective.com/jekyll-admin/organization/5/website"><img src="https://opencollective.com/jekyll-admin/organization/5/avatar.svg"></a>
|
86
|
+
<a href="https://opencollective.com/jekyll-admin/organization/6/website"><img src="https://opencollective.com/jekyll-admin/organization/6/avatar.svg"></a>
|
87
|
+
<a href="https://opencollective.com/jekyll-admin/organization/7/website"><img src="https://opencollective.com/jekyll-admin/organization/7/avatar.svg"></a>
|
88
|
+
<a href="https://opencollective.com/jekyll-admin/organization/8/website"><img src="https://opencollective.com/jekyll-admin/organization/8/avatar.svg"></a>
|
89
|
+
<a href="https://opencollective.com/jekyll-admin/organization/9/website"><img src="https://opencollective.com/jekyll-admin/organization/9/avatar.svg"></a>
|
47
90
|
|
48
91
|
## License
|
49
92
|
|
50
|
-
The gem is available as open source under the terms of the [MIT License](
|
93
|
+
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
data/lib/jekyll-admin.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# Default Sinatra to "production" mode (surpress errors) unless
|
2
4
|
# otherwise specified by the `RACK_ENV` environmental variable.
|
3
5
|
# Must be done prior to requiring Sinatra, or we'll get a LoadError
|
@@ -17,16 +19,15 @@ require "sinatra/reloader"
|
|
17
19
|
require "sinatra/namespace"
|
18
20
|
|
19
21
|
module JekyllAdmin
|
20
|
-
autoload :APIable,
|
21
|
-
autoload :DataFile,
|
22
|
-
autoload :Directory,
|
23
|
-
autoload :FileHelper,
|
24
|
-
autoload :
|
25
|
-
autoload :
|
26
|
-
autoload :
|
27
|
-
autoload :
|
28
|
-
autoload :
|
29
|
-
autoload :Version, "jekyll-admin/version"
|
22
|
+
autoload :APIable, "jekyll-admin/apiable"
|
23
|
+
autoload :DataFile, "jekyll-admin/data_file"
|
24
|
+
autoload :Directory, "jekyll-admin/directory"
|
25
|
+
autoload :FileHelper, "jekyll-admin/file_helper"
|
26
|
+
autoload :PathHelper, "jekyll-admin/path_helper"
|
27
|
+
autoload :Server, "jekyll-admin/server"
|
28
|
+
autoload :StaticServer, "jekyll-admin/static_server"
|
29
|
+
autoload :URLable, "jekyll-admin/urlable"
|
30
|
+
autoload :Version, "jekyll-admin/version"
|
30
31
|
|
31
32
|
def self.site
|
32
33
|
@site ||= begin
|
@@ -37,10 +38,10 @@ module JekyllAdmin
|
|
37
38
|
end
|
38
39
|
end
|
39
40
|
|
40
|
-
# Monkey Patches
|
41
|
-
require_relative "./jekyll/commands/serve"
|
42
|
-
|
43
41
|
[Jekyll::Page, Jekyll::Document, Jekyll::StaticFile, Jekyll::Collection].each do |klass|
|
44
42
|
klass.include JekyllAdmin::APIable
|
45
43
|
klass.include JekyllAdmin::URLable
|
46
44
|
end
|
45
|
+
|
46
|
+
# Monkey Patches
|
47
|
+
require_relative "jekyll/commands/serve"
|
data/lib/jekyll-admin/apiable.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module JekyllAdmin
|
2
4
|
# Abstract module to be included in Convertible and Document to provide
|
3
5
|
# additional, API-specific functionality without duplicating logic
|
4
6
|
module APIable
|
5
|
-
|
6
7
|
CONTENT_FIELDS = %w(next previous content excerpt).freeze
|
8
|
+
API_SCAFFOLD = %w(name path relative_path).map { |i| [i, nil] }.to_h.freeze
|
7
9
|
|
8
10
|
# Returns a hash suitable for use as an API response.
|
9
11
|
#
|
@@ -19,15 +21,13 @@ module JekyllAdmin
|
|
19
21
|
# include_content - if true, includes the content in the respond, false by default
|
20
22
|
# to support mapping on indexes where we only want metadata
|
21
23
|
#
|
22
|
-
#
|
23
24
|
# Returns a hash (which can then be to_json'd)
|
24
25
|
def to_api(include_content: false)
|
25
|
-
output = hash_for_api
|
26
|
-
output = output.merge(url_fields)
|
26
|
+
output = API_SCAFFOLD.merge hash_for_api
|
27
27
|
|
28
28
|
# Include content, if requested, otherwise remove it
|
29
29
|
if include_content
|
30
|
-
output
|
30
|
+
output.merge!(content_fields)
|
31
31
|
else
|
32
32
|
CONTENT_FIELDS.each { |field| output.delete(field) }
|
33
33
|
end
|
@@ -36,26 +36,73 @@ module JekyllAdmin
|
|
36
36
|
# Since it's an API, use `content` in both for consistency
|
37
37
|
output.delete("output")
|
38
38
|
|
39
|
+
output["name"] = basename if is_a?(Jekyll::Document)
|
40
|
+
output["from_theme"] = from_theme_gem? if is_a?(Jekyll::StaticFile)
|
41
|
+
output["relative_path"] = relative_path_for_api
|
42
|
+
|
39
43
|
# By default, calling to_liquid on a collection will return a docs
|
40
44
|
# array with each rendered document, which we don't want.
|
41
45
|
if is_a?(Jekyll::Collection)
|
42
46
|
output.delete("docs")
|
47
|
+
output["name"] = label
|
48
|
+
output["path"] = relative_directory
|
43
49
|
output["entries_url"] = entries_url
|
44
50
|
end
|
45
51
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
52
|
+
output.merge!(url_fields)
|
53
|
+
output
|
54
|
+
end
|
50
55
|
|
51
|
-
|
52
|
-
|
56
|
+
private
|
57
|
+
|
58
|
+
# Relative path of files and directories with their *special directories*
|
59
|
+
# and any leading slashes stripped away.
|
60
|
+
#
|
61
|
+
# Examples:
|
62
|
+
# `_drafts/foo/draft-post.md` => `foo/draft-post.md`
|
63
|
+
# `_posts/foo/2019-10-18-hello.md` => `foo/2019-10-18-hello.md`
|
64
|
+
# `/assets/img/logo.png` => `assets/img/logo.png`
|
65
|
+
def relative_path_for_api
|
66
|
+
return unless respond_to?(:relative_path) && relative_path
|
67
|
+
|
68
|
+
@relative_path_for_api ||= begin
|
69
|
+
rel_path = relative_path.dup
|
70
|
+
strip_leading_slash!(rel_path)
|
71
|
+
strip_leading_special_directory!(rel_path)
|
72
|
+
strip_leading_slash!(rel_path)
|
73
|
+
|
74
|
+
rel_path
|
53
75
|
end
|
76
|
+
end
|
54
77
|
|
55
|
-
|
78
|
+
# Prefer substituting substrings instead of using a regex in order to avoid multiple
|
79
|
+
# regex allocations. String literals are frozen and reused.
|
80
|
+
|
81
|
+
def strip_leading_slash!(path)
|
82
|
+
return unless path.start_with?("/")
|
83
|
+
|
84
|
+
path.sub!("/", "")
|
56
85
|
end
|
57
86
|
|
58
|
-
|
87
|
+
def strip_leading_special_directory!(path)
|
88
|
+
return unless special_directory && path.start_with?(special_directory)
|
89
|
+
|
90
|
+
path.sub!(special_directory, "")
|
91
|
+
end
|
92
|
+
|
93
|
+
def special_directory
|
94
|
+
return @special_directory if defined?(@special_directory)
|
95
|
+
|
96
|
+
@special_directory = begin
|
97
|
+
if is_a?(Jekyll::Document) && draft?
|
98
|
+
"_drafts"
|
99
|
+
elsif is_a?(Jekyll::Document)
|
100
|
+
collection.relative_directory
|
101
|
+
elsif is_a?(Jekyll::Collection)
|
102
|
+
relative_directory
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
59
106
|
|
60
107
|
# Pages don't have a hash method, but Documents do
|
61
108
|
def file_path
|
@@ -80,15 +127,26 @@ module JekyllAdmin
|
|
80
127
|
end
|
81
128
|
|
82
129
|
def file_contents
|
83
|
-
@file_contents ||= File.read(file_path, file_read_options) if file_exists?
|
130
|
+
@file_contents ||= File.read(file_path, **file_read_options) if file_exists?
|
84
131
|
end
|
85
132
|
|
86
133
|
def file_read_options
|
87
134
|
Jekyll::Utils.merged_file_read_opts(site, {})
|
88
135
|
end
|
89
136
|
|
137
|
+
def front_matter_defaults
|
138
|
+
return unless file_exists?
|
139
|
+
|
140
|
+
@front_matter_defaults ||= begin
|
141
|
+
return {} unless respond_to?(:relative_path) && respond_to?(:type)
|
142
|
+
|
143
|
+
site.frontmatter_defaults.all(relative_path, type)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
90
147
|
def front_matter
|
91
148
|
return unless file_exists?
|
149
|
+
|
92
150
|
@front_matter ||= if file_contents =~ Jekyll::Document::YAML_FRONT_MATTER_REGEXP
|
93
151
|
SafeYAML.load(Regexp.last_match(1))
|
94
152
|
else
|
@@ -98,6 +156,7 @@ module JekyllAdmin
|
|
98
156
|
|
99
157
|
def raw_content
|
100
158
|
return unless file_exists?
|
159
|
+
|
101
160
|
@raw_content ||= if file_contents =~ Jekyll::Document::YAML_FRONT_MATTER_REGEXP
|
102
161
|
$POSTMATCH
|
103
162
|
else
|
@@ -111,6 +170,7 @@ module JekyllAdmin
|
|
111
170
|
|
112
171
|
def file_exists?
|
113
172
|
return @file_exists if defined? @file_exists
|
173
|
+
|
114
174
|
@file_exists = File.exist?(file_path)
|
115
175
|
end
|
116
176
|
|
@@ -137,6 +197,7 @@ module JekyllAdmin
|
|
137
197
|
else
|
138
198
|
output["raw_content"] = raw_content
|
139
199
|
output["front_matter"] = front_matter
|
200
|
+
output["front_matter_defaults"] = front_matter_defaults
|
140
201
|
end
|
141
202
|
|
142
203
|
# Include next and previous documents non-recursively
|
@@ -153,6 +214,7 @@ module JekyllAdmin
|
|
153
214
|
|
154
215
|
def url_fields
|
155
216
|
return {} unless respond_to?(:http_url) && respond_to?(:api_url)
|
217
|
+
|
156
218
|
{
|
157
219
|
"http_url" => http_url,
|
158
220
|
"api_url" => api_url,
|
@@ -1,6 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module JekyllAdmin
|
2
4
|
class DataFile
|
3
|
-
METHODS_FOR_LIQUID = %w(path relative_path slug ext title).freeze
|
5
|
+
METHODS_FOR_LIQUID = %w(name path relative_path slug ext title).freeze
|
4
6
|
EXTENSIONS = %w(yaml yml json csv).freeze
|
5
7
|
|
6
8
|
include APIable
|
@@ -8,16 +10,26 @@ module JekyllAdmin
|
|
8
10
|
include PathHelper
|
9
11
|
extend PathHelper
|
10
12
|
|
11
|
-
attr_reader :id
|
13
|
+
attr_reader :id, :ext
|
12
14
|
|
13
15
|
# Initialize a new DataFile object
|
14
16
|
#
|
15
17
|
# id - the file ID as passed from the API. This may or may not have an extension
|
16
18
|
def initialize(id)
|
17
|
-
|
19
|
+
extname = File.extname(id)
|
20
|
+
if extname.empty?
|
21
|
+
@id = "#{id}.yml"
|
22
|
+
@ext = ".yml"
|
23
|
+
else
|
24
|
+
@id = id
|
25
|
+
@ext = extname
|
26
|
+
end
|
18
27
|
end
|
19
28
|
alias_method :relative_path, :id
|
20
29
|
|
30
|
+
# Returns the file's extension with preceeding `.`
|
31
|
+
alias_method :extension, :ext
|
32
|
+
|
21
33
|
def exists?
|
22
34
|
@exists ||= File.exist?(absolute_path)
|
23
35
|
end
|
@@ -32,16 +44,6 @@ module JekyllAdmin
|
|
32
44
|
@content ||= data_reader.read_data_file(absolute_path)
|
33
45
|
end
|
34
46
|
|
35
|
-
# Returns the file's extension with preceeding `.`
|
36
|
-
def ext
|
37
|
-
@ext ||= if File.extname(id).to_s.empty?
|
38
|
-
".yml"
|
39
|
-
else
|
40
|
-
File.extname(id)
|
41
|
-
end
|
42
|
-
end
|
43
|
-
alias_method :extension, :ext
|
44
|
-
|
45
47
|
# Returns the file's sanitized slug (as used in `site.data[slug]`)
|
46
48
|
def slug
|
47
49
|
@slug ||= data_reader.sanitize_filename(basename)
|
@@ -54,7 +56,7 @@ module JekyllAdmin
|
|
54
56
|
|
55
57
|
# Returns path relative to site source
|
56
58
|
def path
|
57
|
-
|
59
|
+
@path ||= File.join(DataFile.data_dir, relative_path)
|
58
60
|
end
|
59
61
|
|
60
62
|
def absolute_path
|
@@ -92,9 +94,10 @@ module JekyllAdmin
|
|
92
94
|
end
|
93
95
|
|
94
96
|
def basename_with_extension
|
95
|
-
|
97
|
+
"#{basename}#{extension}"
|
96
98
|
end
|
97
|
-
alias_method :
|
99
|
+
alias_method :name, :basename_with_extension
|
100
|
+
public :name
|
98
101
|
|
99
102
|
def namespace
|
100
103
|
"data"
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module JekyllAdmin
|
2
4
|
class Directory
|
3
5
|
extend Forwardable
|
@@ -9,45 +11,41 @@ module JekyllAdmin
|
|
9
11
|
include JekyllAdmin::URLable
|
10
12
|
include JekyllAdmin::APIable
|
11
13
|
|
12
|
-
|
14
|
+
RESOURCE_TYPES = %w(pages data drafts static_files).freeze
|
15
|
+
DOT_DIRECTORIES = [".", ".."].freeze
|
13
16
|
|
14
|
-
|
15
|
-
|
16
|
-
#
|
17
|
-
#
|
18
|
-
# base - passes site.source to generate `relative_path` needed for `to_api`
|
19
|
-
#
|
20
|
-
# content_type - type of the requested directory entries, this is used to generate
|
21
|
-
# API endpoint of the directory along with `splat`
|
17
|
+
private_constant :RESOURCE_TYPES, :DOT_DIRECTORIES
|
18
|
+
|
19
|
+
# Parameters:
|
20
|
+
# path - The full path of the directory at which its entries will be listed.
|
22
21
|
#
|
23
|
-
#
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
# Named parameters:
|
23
|
+
# base: - The full path to the directory from source.
|
24
|
+
# splat: - The requested directory path relative to content namespace.
|
25
|
+
# content_type: - The type of the requested directory entries. Corresponds to
|
26
|
+
# the resources' API namespace.
|
27
|
+
def initialize(path, base:, splat:, content_type:)
|
28
|
+
@path = Pathname.new path
|
29
|
+
@base = Pathname.new base
|
27
30
|
@splat = Pathname.new splat
|
28
|
-
@
|
31
|
+
@content_type = content_type
|
29
32
|
end
|
30
33
|
|
31
34
|
def to_liquid
|
32
35
|
{
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
36
|
+
"name" => name,
|
37
|
+
"modified_time" => modified_time,
|
38
|
+
"path" => relative_path,
|
39
|
+
"type" => "directory",
|
37
40
|
}
|
38
41
|
end
|
39
42
|
|
40
43
|
def relative_path
|
41
|
-
|
42
|
-
path.relative_path_from(base).to_s.sub("_drafts/", "")
|
43
|
-
else
|
44
|
-
path.relative_path_from(base).to_s
|
45
|
-
end
|
44
|
+
@relative_path ||= path.relative_path_from(base).to_s
|
46
45
|
end
|
47
46
|
|
48
47
|
def resource_path
|
49
|
-
|
50
|
-
if types.include?(content_type)
|
48
|
+
if RESOURCE_TYPES.include?(content_type)
|
51
49
|
"/#{content_type}/#{splat}/#{name}"
|
52
50
|
else
|
53
51
|
"/collections/#{content_type}/entries/#{splat}/#{name}"
|
@@ -61,8 +59,9 @@ module JekyllAdmin
|
|
61
59
|
|
62
60
|
def directories
|
63
61
|
path.entries.map do |entry|
|
64
|
-
next if
|
62
|
+
next if DOT_DIRECTORIES.include? entry.to_s
|
65
63
|
next unless path.join(entry).directory?
|
64
|
+
|
66
65
|
self.class.new(
|
67
66
|
path.join(entry),
|
68
67
|
:base => base, :content_type => content_type, :splat => splat
|