jekyll-admin 0.8.0 → 0.10.2

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 (59) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +21 -21
  3. data/README.md +94 -54
  4. data/lib/jekyll-admin.rb +47 -46
  5. data/lib/jekyll-admin/apiable.rb +224 -162
  6. data/lib/jekyll-admin/data_file.rb +106 -103
  7. data/lib/jekyll-admin/directory.rb +72 -73
  8. data/lib/jekyll-admin/file_helper.rb +91 -78
  9. data/lib/jekyll-admin/path_helper.rb +87 -78
  10. data/lib/jekyll-admin/public/asset-manifest.json +27 -0
  11. data/lib/jekyll-admin/public/index.html +1 -12
  12. data/lib/jekyll-admin/public/precache-manifest.5e08ed7edb8d446719b76ae6ead9e3fe.js +78 -0
  13. data/lib/jekyll-admin/public/service-worker.js +39 -0
  14. data/lib/jekyll-admin/public/static/css/2.b74256fb.chunk.css +2 -0
  15. data/lib/jekyll-admin/public/static/css/2.b74256fb.chunk.css.map +1 -0
  16. data/lib/jekyll-admin/public/static/css/main.7e0a6705.chunk.css +5 -0
  17. data/lib/jekyll-admin/public/static/css/main.7e0a6705.chunk.css.map +1 -0
  18. data/lib/jekyll-admin/public/static/js/2.a50fa19f.chunk.js +3 -0
  19. data/lib/jekyll-admin/public/static/js/2.a50fa19f.chunk.js.LICENSE.txt +67 -0
  20. data/lib/jekyll-admin/public/static/js/2.a50fa19f.chunk.js.map +1 -0
  21. data/lib/jekyll-admin/public/static/js/main.f3346e4e.chunk.js +2 -0
  22. data/lib/jekyll-admin/public/static/js/main.f3346e4e.chunk.js.map +1 -0
  23. data/lib/jekyll-admin/public/static/js/runtime-main.95f94e60.js +2 -0
  24. data/lib/jekyll-admin/public/static/js/runtime-main.95f94e60.js.map +1 -0
  25. data/lib/jekyll-admin/public/{1dc35d25e61d819a9c357074014867ab.ttf → static/media/fontawesome-webfont.1dc35d25.ttf} +0 -0
  26. data/lib/jekyll-admin/public/{d7c639084f684d66a1bc66855d193ed8.svg → static/media/fontawesome-webfont.24c601e7.svg} +684 -684
  27. data/lib/jekyll-admin/public/{25a32416abee198dd821b0b17a198a8f.eot → static/media/fontawesome-webfont.25a32416.eot} +0 -0
  28. data/lib/jekyll-admin/public/{c8ddf1e5e5bf3682bc7bebf30f394148.woff → static/media/fontawesome-webfont.c8ddf1e5.woff} +0 -0
  29. data/lib/jekyll-admin/public/{e6cf7c6ec7c2d6f670ae9d762604cb0b.woff2 → static/media/fontawesome-webfont.e6cf7c6e.woff2} +0 -0
  30. data/lib/jekyll-admin/public/{55131026930a0cd4539d1e2fdb92722d.ttf → static/media/lato-bold.55131026.ttf} +0 -0
  31. data/lib/jekyll-admin/public/{059514c92565e4045da1a69525dd9ec0.ttf → static/media/lato-regular.059514c9.ttf} +0 -0
  32. data/lib/jekyll-admin/public/{a770b6797b68e3f8920e473eb824bac0.gif → static/media/loader-big.a770b679.gif} +0 -0
  33. data/lib/jekyll-admin/public/static/media/rw-widgets.12f0820c.woff +0 -0
  34. data/lib/jekyll-admin/public/{03945ac4fc7fdefc44bc110bf1ba2393.svg → static/media/rw-widgets.792dcd18.svg} +14 -8
  35. data/lib/jekyll-admin/public/{e44520ab9079ea7633bfa874bed5d21d.eot → static/media/rw-widgets.bc7c4a59.eot} +0 -0
  36. data/lib/jekyll-admin/public/{bfc14ac982326f7d0b1340e20d3e0c37.ttf → static/media/rw-widgets.eceddf47.ttf} +0 -0
  37. data/lib/jekyll-admin/server.rb +108 -101
  38. data/lib/jekyll-admin/server/{collection.rb → collections.rb} +89 -82
  39. data/lib/jekyll-admin/server/configuration.rb +60 -57
  40. data/lib/jekyll-admin/server/data.rb +84 -82
  41. data/lib/jekyll-admin/server/{draft.rb → drafts.rb} +114 -110
  42. data/lib/jekyll-admin/server/{page.rb → pages.rb} +109 -90
  43. data/lib/jekyll-admin/server/site_meta.rb +25 -0
  44. data/lib/jekyll-admin/server/static_files.rb +83 -0
  45. data/lib/jekyll-admin/static_server.rb +26 -24
  46. data/lib/jekyll-admin/urlable.rb +75 -67
  47. data/lib/jekyll-admin/version.rb +5 -3
  48. data/lib/jekyll/commands/serve.rb +30 -24
  49. metadata +57 -59
  50. data/lib/jekyll-admin/page_without_a_file.rb +0 -7
  51. data/lib/jekyll-admin/public/33a752211d05af6684e26ec63c2ed965.gif +0 -0
  52. data/lib/jekyll-admin/public/8b4968b70019a0551a72940c5a2020d3.png +0 -0
  53. data/lib/jekyll-admin/public/8ea28ca3bfdf27145068e81dd07a34c6.png +0 -0
  54. data/lib/jekyll-admin/public/99adb54b0f30c0758bb4cb9ed5b80aa8.woff +0 -0
  55. data/lib/jekyll-admin/public/bundle.js +0 -117
  56. data/lib/jekyll-admin/public/bundle.js.map +0 -1
  57. data/lib/jekyll-admin/public/styles.css +0 -5
  58. data/lib/jekyll-admin/public/styles.css.map +0 -1
  59. data/lib/jekyll-admin/server/static_file.rb +0 -61
@@ -1,82 +1,84 @@
1
- module JekyllAdmin
2
- class Server < Sinatra::Base
3
- # supported extensions, in order of preference, for now, no .csv
4
- EXTENSIONS = %w(yml json).freeze
5
-
6
- namespace "/data" do
7
- get "/*?/?:path.:ext" do
8
- ensure_requested_file
9
- json requested_file.to_api(:include_content => true)
10
- end
11
-
12
- get "/?*" do
13
- ensure_directory
14
- json entries.map(&:to_api)
15
- end
16
-
17
- put "/*?/?:path.:ext" do
18
- if renamed?
19
- ensure_requested_file
20
- delete_file_without_process path
21
- end
22
-
23
- write_file write_path, data_file_body
24
- json written_file.to_api(:include_content => true)
25
- end
26
-
27
- delete "/*?/?:path.:ext" do
28
- ensure_requested_file
29
- delete_file path
30
- content_type :json
31
- status 200
32
- halt
33
- end
34
-
35
- private
36
-
37
- # returns relative path of root level directories that contain data files
38
- def directory_paths
39
- DataFile.all.map { |p| File.dirname(p.relative_path).split("/")[0] }.uniq
40
- end
41
-
42
- def directory_pages
43
- DataFile.all.find_all do |p|
44
- sanitized_path(File.dirname(p.path)) == directory_path
45
- end
46
- end
47
-
48
- def entries
49
- args = {
50
- :base => sanitized_path(DataFile.data_dir),
51
- :content_type => "data",
52
- :splat => splats.first,
53
- }
54
- # get all directories inside the requested directory
55
- directory = JekyllAdmin::Directory.new(directory_path, args)
56
- directories = directory.directories
57
-
58
- # exclude root level directories which do not have data files
59
- if splats.first.empty?
60
- directories = directories.select do |d|
61
- directory_paths.include? d.name.to_s
62
- end
63
- end
64
-
65
- # merge directories with the pages at the same level
66
- directories.concat(directory_pages)
67
- end
68
-
69
- def data_file_body
70
- if !request_payload["raw_content"].to_s.empty?
71
- request_payload["raw_content"]
72
- elsif !request_payload["content"].to_s.empty?
73
- YAML.dump(request_payload["content"]).sub(%r!\A---\n!, "")
74
- end
75
- end
76
-
77
- def splats
78
- params["splat"] || ["/"]
79
- end
80
- end
81
- end
82
- end
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllAdmin
4
+ class Server < Sinatra::Base
5
+ # supported extensions, in order of preference, for now, no .csv
6
+ EXTENSIONS = %w(yml json).freeze
7
+
8
+ namespace "/data" do
9
+ get "/*?/?:path.:ext" do
10
+ ensure_requested_file
11
+ json requested_file.to_api(:include_content => true)
12
+ end
13
+
14
+ get "/?*" do
15
+ ensure_directory
16
+ json entries.map(&:to_api)
17
+ end
18
+
19
+ put "/*?/?:path.:ext" do
20
+ if renamed?
21
+ ensure_requested_file
22
+ delete_file_without_process path
23
+ end
24
+
25
+ write_file write_path, data_file_body
26
+ json written_file.to_api(:include_content => true)
27
+ end
28
+
29
+ delete "/*?/?:path.:ext" do
30
+ ensure_requested_file
31
+ delete_file path
32
+ content_type :json
33
+ status 200
34
+ halt
35
+ end
36
+
37
+ private
38
+
39
+ # returns relative path of root level directories that contain data files
40
+ def directory_paths
41
+ DataFile.all.map { |p| File.dirname(p.relative_path).split("/")[0] }.uniq
42
+ end
43
+
44
+ def directory_pages
45
+ DataFile.all.find_all do |p|
46
+ sanitized_path(File.dirname(p.path)) == directory_path
47
+ end
48
+ end
49
+
50
+ def entries
51
+ args = {
52
+ :base => site.in_source_dir(DataFile.data_dir),
53
+ :content_type => "data",
54
+ :splat => splats.first,
55
+ }
56
+ # get all directories inside the requested directory
57
+ directory = JekyllAdmin::Directory.new(directory_path, args)
58
+ directories = directory.directories
59
+
60
+ # exclude root level directories which do not have data files
61
+ if splats.first.empty?
62
+ directories = directories.select do |d|
63
+ directory_paths.include? d.name.to_s
64
+ end
65
+ end
66
+
67
+ # merge directories with the pages at the same level
68
+ directories.concat(directory_pages)
69
+ end
70
+
71
+ def data_file_body
72
+ if !request_payload["raw_content"].to_s.empty?
73
+ request_payload["raw_content"]
74
+ elsif !request_payload["content"].to_s.empty?
75
+ YAML.dump(request_payload["content"]).sub(%r!\A---\n!, "")
76
+ end
77
+ end
78
+
79
+ def splats
80
+ params["splat"] || ["/"]
81
+ end
82
+ end
83
+ end
84
+ end
@@ -1,110 +1,114 @@
1
- module JekyllAdmin
2
- class Server < Sinatra::Base
3
- namespace "/drafts" do
4
- get "/*?/?:path.:ext" do
5
- ensure_requested_file
6
- json requested_file.to_api(:include_content => true)
7
- end
8
-
9
- get "/?*" do
10
- ensure_directory
11
- json entries.map(&:to_api)
12
- end
13
-
14
- put "/*?/?:path.:ext" do
15
- ensure_html_content
16
-
17
- if renamed?
18
- ensure_requested_file
19
- delete_file_without_process path
20
- end
21
-
22
- write_file write_path, document_body
23
- json written_file.to_api(:include_content => true)
24
- end
25
-
26
- delete "/*?/?:path.:ext" do
27
- ensure_requested_file
28
- delete_file path
29
- content_type :json
30
- status 200
31
- halt
32
- end
33
-
34
- private
35
-
36
- # return all documents in the 'posts' collection that output to an html
37
- # file but reside in a separate directory, `<source_dir>/_drafts/`
38
- def drafts
39
- posts = site.collections.find { |l, _c| l == "posts" }
40
- if posts
41
- posts[1].docs.find_all { |d| d.output_ext == ".html" && d.draft? }
42
- end
43
- end
44
-
45
- # return drafts at the same level as directory
46
- def directory_drafts
47
- drafts.find_all { |d| File.dirname(d.path) == directory_path }
48
- end
49
-
50
- def reverse_sorted_drafts
51
- directory_drafts.sort_by(&:date).reverse
52
- end
53
-
54
- # returns directories at the root of `/_drafts/` that contain drafts
55
- def relevant_directory_paths
56
- drafts.map { |doc| relative_draft_path(doc).split("/")[0] }.uniq
57
- end
58
-
59
- def relative_draft_path(document)
60
- File.dirname(document.relative_path.sub("_drafts/", ""))
61
- end
62
-
63
- def ensure_directory
64
- ensure_drafts
65
- render_404 unless Dir.exist?(directory_path)
66
- end
67
-
68
- def ensure_drafts
69
- render_404 if drafts.nil?
70
- end
71
-
72
- def ensure_html_content
73
- return if html_content?
74
- content_type :json
75
- halt 422, json("error_message" => "Invalid file extension for drafts")
76
- end
77
-
78
- def entries
79
- args = {
80
- :base => site.source,
81
- :content_type => "drafts",
82
- :splat => params["splat"].first,
83
- }
84
- # get the directories inside the requested directory
85
- directory = JekyllAdmin::Directory.new(directory_path, args)
86
- directories = directory.directories
87
-
88
- # exclude root level directories which do not have drafts
89
- if params["splat"].first.empty?
90
- directories = directories.select do |d|
91
- relevant_directory_paths.include? d.name.to_s
92
- end
93
- end
94
- # merge directories with the drafts at the same level
95
- directories.concat(reverse_sorted_drafts)
96
- end
97
-
98
- def html_content?
99
- draft = JekyllAdmin::PageWithoutAFile.new(
100
- site,
101
- site.source,
102
- "_drafts",
103
- request_payload["path"] || filename
104
- )
105
- draft.data = request_payload["front_matter"]
106
- draft.html?
107
- end
108
- end
109
- end
110
- end
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllAdmin
4
+ class Server < Sinatra::Base
5
+ namespace "/drafts" do
6
+ get "/*?/?:path.:ext" do
7
+ ensure_requested_file
8
+ json requested_file.to_api(:include_content => true)
9
+ end
10
+
11
+ get "/?*" do
12
+ ensure_directory
13
+ json entries.map(&:to_api)
14
+ end
15
+
16
+ put "/*?/?:path.:ext" do
17
+ ensure_html_content
18
+
19
+ if new?
20
+ ensure_not_overwriting_existing_file
21
+ elsif renamed?
22
+ ensure_requested_file
23
+ ensure_not_overwriting_existing_file
24
+ delete_file_without_process path
25
+ end
26
+
27
+ write_file write_path, document_body
28
+ json written_file.to_api(:include_content => true)
29
+ end
30
+
31
+ delete "/*?/?:path.:ext" do
32
+ ensure_requested_file
33
+ delete_file path
34
+ content_type :json
35
+ status 200
36
+ halt
37
+ end
38
+
39
+ private
40
+
41
+ # return all documents in the 'posts' collection that output to an html
42
+ # file but reside in a separate directory, `<source_dir>/_drafts/`
43
+ def drafts
44
+ posts = site.collections.find { |l, _c| l == "posts" }
45
+ posts[1].docs.find_all { |d| d.output_ext == ".html" && d.draft? } if posts
46
+ end
47
+
48
+ # return drafts at the same level as directory
49
+ def directory_drafts
50
+ drafts.find_all { |d| File.dirname(d.path) == directory_path }
51
+ end
52
+
53
+ def reverse_sorted_drafts
54
+ directory_drafts.sort_by(&:date).reverse
55
+ end
56
+
57
+ # returns directories at the root of `/_drafts/` that contain drafts
58
+ def relevant_directory_paths
59
+ drafts.map { |doc| relative_draft_path(doc).split("/")[0] }.uniq
60
+ end
61
+
62
+ def relative_draft_path(document)
63
+ File.dirname(document.relative_path.sub("_drafts/", ""))
64
+ end
65
+
66
+ def ensure_directory
67
+ ensure_drafts
68
+ render_404 unless Dir.exist?(directory_path)
69
+ end
70
+
71
+ def ensure_drafts
72
+ render_404 if drafts.nil?
73
+ end
74
+
75
+ def ensure_html_content
76
+ return if html_content?
77
+
78
+ content_type :json
79
+ halt 422, json("error_message" => "Invalid file extension for drafts")
80
+ end
81
+
82
+ def entries
83
+ args = {
84
+ :base => site.in_source_dir("_drafts"),
85
+ :content_type => "drafts",
86
+ :splat => params["splat"].first,
87
+ }
88
+ # get the directories inside the requested directory
89
+ directory = JekyllAdmin::Directory.new(directory_path, args)
90
+ directories = directory.directories
91
+
92
+ # exclude root level directories which do not have drafts
93
+ if params["splat"].first.empty?
94
+ directories = directories.select do |d|
95
+ relevant_directory_paths.include? d.name.to_s
96
+ end
97
+ end
98
+ # merge directories with the drafts at the same level
99
+ directories.concat(reverse_sorted_drafts)
100
+ end
101
+
102
+ def html_content?
103
+ draft = Jekyll::PageWithoutAFile.new(
104
+ site,
105
+ site.source,
106
+ "_drafts",
107
+ request_payload["path"] || filename
108
+ )
109
+ draft.data = request_payload["front_matter"]
110
+ draft.html?
111
+ end
112
+ end
113
+ end
114
+ end
@@ -1,90 +1,109 @@
1
- module JekyllAdmin
2
- class Server < Sinatra::Base
3
- namespace "/pages" do
4
- get "/*?/?:path.:ext" do
5
- ensure_requested_file
6
- json requested_file.to_api(:include_content => true)
7
- end
8
-
9
- get "/?*" do
10
- ensure_directory
11
- json entries.map(&:to_api)
12
- end
13
-
14
- put "/*?/?:path.:ext" do
15
- ensure_html_content
16
-
17
- if renamed?
18
- ensure_requested_file
19
- delete_file_without_process path
20
- end
21
-
22
- write_file write_path, page_body
23
-
24
- json written_file.to_api(:include_content => true)
25
- end
26
-
27
- delete "/*?/?:path.:ext" do
28
- ensure_requested_file
29
- delete_file path
30
- content_type :json
31
- status 200
32
- halt
33
- end
34
-
35
- private
36
-
37
- def ensure_html_content
38
- return if html_content?
39
- content_type :json
40
- halt 422, json("error_message" => "Invalid file extension for pages")
41
- end
42
-
43
- def html_content?
44
- page = JekyllAdmin::PageWithoutAFile.new(
45
- site,
46
- site.source,
47
- "",
48
- request_payload["path"] || filename
49
- )
50
- page.data = request_payload["front_matter"]
51
- page.html?
52
- end
53
-
54
- def pages
55
- site.pages.select(&:html?)
56
- end
57
-
58
- def directory_pages
59
- pages.find_all do |p|
60
- sanitized_path(File.dirname(p.path)) == directory_path
61
- end
62
- end
63
-
64
- # returns relative path of root level directories that contain pages
65
- def directory_paths
66
- pages.map { |p| File.dirname(p.path).split("/")[0] }.uniq
67
- end
68
-
69
- def entries
70
- args = {
71
- :base => site.source,
72
- :content_type => "pages",
73
- :splat => params["splat"].first,
74
- }
75
- # get all directories inside the requested directory
76
- directory = JekyllAdmin::Directory.new(directory_path, args)
77
- directories = directory.directories
78
-
79
- # exclude root level directories which do not have pages
80
- if params["splat"].first.empty?
81
- directories = directories.select do |d|
82
- directory_paths.include? d.name.to_s
83
- end
84
- end
85
- # merge directories with the pages at the same level
86
- directories.concat(directory_pages)
87
- end
88
- end
89
- end
90
- end
1
+ # frozen_string_literal: true
2
+
3
+ module JekyllAdmin
4
+ class Server < Sinatra::Base
5
+ namespace "/pages" do
6
+ get "/*?/?:path.:ext" do
7
+ ensure_requested_file
8
+ json requested_file.to_api(:include_content => true)
9
+ end
10
+
11
+ get "/?*" do
12
+ ensure_directory
13
+ json entries.map(&:to_api)
14
+ end
15
+
16
+ put "/*?/?:path.:ext" do
17
+ ensure_html_content
18
+
19
+ if new?
20
+ ensure_not_overwriting_existing_file
21
+ elsif renamed?
22
+ ensure_requested_file
23
+ ensure_not_overwriting_existing_file
24
+ delete_file_without_process path
25
+ end
26
+
27
+ write_file write_path, page_body
28
+ json written_file.to_api(:include_content => true)
29
+ end
30
+
31
+ delete "/*?/?:path.:ext" do
32
+ ensure_requested_file
33
+ delete_file path
34
+ content_type :json
35
+ status 200
36
+ halt
37
+ end
38
+
39
+ private
40
+
41
+ def ensure_html_content
42
+ return if html_content?
43
+
44
+ content_type :json
45
+ halt 422, json("error_message" => "Invalid file extension for pages")
46
+ end
47
+
48
+ def html_content?
49
+ page = Jekyll::PageWithoutAFile.new(
50
+ site,
51
+ site.source,
52
+ "",
53
+ request_payload["path"] || filename
54
+ )
55
+ page.data = request_payload["front_matter"]
56
+ page.html?
57
+ end
58
+
59
+ def pages
60
+ site.pages.select { |p| html_page_at_source?(p) }
61
+ end
62
+
63
+ # Test if a given page is *physically located* within the source directory and outputs
64
+ # to an HTML file.
65
+ # We don't want *virtual pages* that are generated via plugins.
66
+ def html_page_at_source?(page)
67
+ return false unless page.html?
68
+
69
+ # If page is not an instance of a `Jekyll::Page` subclass, then it needs additional
70
+ # inspection.
71
+ # Can't use `is_a?(Jekyll::Page)` here because it returns true for subclass instances
72
+ return true if page.class == Jekyll::Page
73
+
74
+ File.exist?(site.in_source_dir(page.relative_path))
75
+ end
76
+
77
+ def directory_pages
78
+ pages.find_all do |p|
79
+ sanitized_path(File.dirname(p.path)) == directory_path
80
+ end
81
+ end
82
+
83
+ # returns relative path of root level directories that contain pages
84
+ def directory_paths
85
+ pages.map { |p| File.dirname(p.path).split("/")[0] }.uniq
86
+ end
87
+
88
+ def entries
89
+ args = {
90
+ :base => site.source,
91
+ :content_type => "pages",
92
+ :splat => params["splat"].first,
93
+ }
94
+ # get all directories inside the requested directory
95
+ directory = JekyllAdmin::Directory.new(directory_path, args)
96
+ directories = directory.directories
97
+
98
+ # exclude root level directories which do not have pages
99
+ if params["splat"].first.empty?
100
+ directories = directories.select do |d|
101
+ directory_paths.include? d.name.to_s
102
+ end
103
+ end
104
+ # merge directories with the pages at the same level
105
+ directories.concat(directory_pages)
106
+ end
107
+ end
108
+ end
109
+ end