jekyll-admin 0.8.0 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
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