scribo 1.0.38

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +93 -0
  4. data/Rakefile +40 -0
  5. data/app/assets/config/scribo_manifest.js +2 -0
  6. data/app/assets/javascripts/scribo/scribo.js +1 -0
  7. data/app/assets/stylesheets/scribo/scribo.css +1 -0
  8. data/app/controllers/concerns/maintenance_standards.rb +24 -0
  9. data/app/controllers/scribo/admin/sites/contents_controller.rb +86 -0
  10. data/app/controllers/scribo/admin/sites_controller.rb +61 -0
  11. data/app/controllers/scribo/api/sites_controller.rb +23 -0
  12. data/app/controllers/scribo/application_admin_controller.rb +11 -0
  13. data/app/controllers/scribo/application_controller.rb +6 -0
  14. data/app/controllers/scribo/contents_controller.rb +20 -0
  15. data/app/drops/scribo/action_dispatch/request_drop.rb +15 -0
  16. data/app/drops/scribo/active_model/errors_drop.rb +16 -0
  17. data/app/drops/scribo/application_drop.rb +9 -0
  18. data/app/drops/scribo/array_drop.rb +13 -0
  19. data/app/drops/scribo/content_drop.rb +73 -0
  20. data/app/drops/scribo/data_drop.rb +35 -0
  21. data/app/drops/scribo/form_drop.rb +26 -0
  22. data/app/drops/scribo/include_drop.rb +13 -0
  23. data/app/drops/scribo/paginator_drop.rb +73 -0
  24. data/app/drops/scribo/site_drop.rb +83 -0
  25. data/app/helpers/scribo/application_helper.rb +13 -0
  26. data/app/jobs/scribo/application_job.rb +6 -0
  27. data/app/models/scribo/application_record.rb +11 -0
  28. data/app/models/scribo/content.rb +378 -0
  29. data/app/models/scribo/site.rb +161 -0
  30. data/app/services/scribo/application_service.rb +9 -0
  31. data/app/services/scribo/content_find_service.rb +69 -0
  32. data/app/services/scribo/content_render_service.rb +127 -0
  33. data/app/services/scribo/site_export_service.rb +41 -0
  34. data/app/services/scribo/site_find_service.rb +26 -0
  35. data/app/services/scribo/site_import_service.rb +96 -0
  36. data/app/views/layouts/scribo.html.slim +1 -0
  37. data/app/views/scribo/admin/sites/_create_sites.html.slim +22 -0
  38. data/app/views/scribo/admin/sites/_sites.html.slim +18 -0
  39. data/app/views/scribo/admin/sites/contents/_form.html.slim +17 -0
  40. data/app/views/scribo/admin/sites/contents/create.json.jbuilder +11 -0
  41. data/app/views/scribo/admin/sites/contents/edit.html.slim +2 -0
  42. data/app/views/scribo/admin/sites/contents/edit.json.jbuilder +9 -0
  43. data/app/views/scribo/admin/sites/contents/index.html.slim +1 -0
  44. data/app/views/scribo/admin/sites/contents/move.json.jbuilder +9 -0
  45. data/app/views/scribo/admin/sites/contents/rename.json.jbuilder +9 -0
  46. data/app/views/scribo/admin/sites/contents/upload.json.jbuilder +9 -0
  47. data/app/views/scribo/admin/sites/import.json.jbuilder +4 -0
  48. data/app/views/scribo/admin/sites/index.html.slim +7 -0
  49. data/app/views/scribo/shared/_entry.html.slim +17 -0
  50. data/app/views/scribo/shared/_ide.html.slim +14 -0
  51. data/app/views/scribo/shared/_tree-view.html.slim +32 -0
  52. data/config/locales/en.yml +39 -0
  53. data/config/routes.rb +35 -0
  54. data/db/migrate/20200123095630_initial_scribo.rb +34 -0
  55. data/db/migrate/20220919124119_add_ancestry_to_scribo_contents.rb +13 -0
  56. data/db/migrate/20220919124749_remove_parent_id_from_scribo_contents.rb +8 -0
  57. data/lib/scribo/action_controller_helpers.rb +51 -0
  58. data/lib/scribo/action_controller_renderers.rb +71 -0
  59. data/lib/scribo/action_view_helpers.rb +17 -0
  60. data/lib/scribo/active_record_helpers.rb +11 -0
  61. data/lib/scribo/configuration.rb +97 -0
  62. data/lib/scribo/engine.rb +24 -0
  63. data/lib/scribo/i18n_store.rb +100 -0
  64. data/lib/scribo/liquid/filters/jekyll_filters.rb +94 -0
  65. data/lib/scribo/liquid/filters/markdownify.rb +11 -0
  66. data/lib/scribo/liquid/filters/url_filters.rb +76 -0
  67. data/lib/scribo/liquid/parser.rb +32 -0
  68. data/lib/scribo/liquid/tags/application_assets_tag.rb +14 -0
  69. data/lib/scribo/liquid/tags/application_js_tag.rb +16 -0
  70. data/lib/scribo/liquid/tags/asset_tag.rb +56 -0
  71. data/lib/scribo/liquid/tags/button_tag.rb +24 -0
  72. data/lib/scribo/liquid/tags/check_box_tag.rb +31 -0
  73. data/lib/scribo/liquid/tags/csrf_meta_tags_tag.rb +16 -0
  74. data/lib/scribo/liquid/tags/date_field_tag.rb +23 -0
  75. data/lib/scribo/liquid/tags/editable_url_tag.rb +19 -0
  76. data/lib/scribo/liquid/tags/email_field_tag.rb +23 -0
  77. data/lib/scribo/liquid/tags/feed_meta_tag.rb +22 -0
  78. data/lib/scribo/liquid/tags/field_error_tag.rb +26 -0
  79. data/lib/scribo/liquid/tags/fields_for_tag.rb +82 -0
  80. data/lib/scribo/liquid/tags/form_tag.rb +57 -0
  81. data/lib/scribo/liquid/tags/google_analytics_javascript_tag.rb +30 -0
  82. data/lib/scribo/liquid/tags/google_tag_manager_javascript_tag.rb +28 -0
  83. data/lib/scribo/liquid/tags/hidden_field_tag.rb +23 -0
  84. data/lib/scribo/liquid/tags/highlight_tag.rb +106 -0
  85. data/lib/scribo/liquid/tags/include_tag.rb +28 -0
  86. data/lib/scribo/liquid/tags/label_tag.rb +24 -0
  87. data/lib/scribo/liquid/tags/number_field_tag.rb +23 -0
  88. data/lib/scribo/liquid/tags/options_for_select.rb +36 -0
  89. data/lib/scribo/liquid/tags/password_field_tag.rb +23 -0
  90. data/lib/scribo/liquid/tags/search_field_tag.rb +23 -0
  91. data/lib/scribo/liquid/tags/search_tag.rb +29 -0
  92. data/lib/scribo/liquid/tags/select_tag.rb +22 -0
  93. data/lib/scribo/liquid/tags/seo_tag.rb +35 -0
  94. data/lib/scribo/liquid/tags/set_session.rb +19 -0
  95. data/lib/scribo/liquid/tags/telephone_field_tag.rb +23 -0
  96. data/lib/scribo/liquid/tags/text_field_tag.rb +35 -0
  97. data/lib/scribo/liquid/tags/textarea_tag.rb +28 -0
  98. data/lib/scribo/liquid/tags/time_field_tag.rb +23 -0
  99. data/lib/scribo/liquid/tags/url_field_tag.rb +23 -0
  100. data/lib/scribo/preamble.rb +89 -0
  101. data/lib/scribo/sassc/importer.rb +72 -0
  102. data/lib/scribo/utility.rb +94 -0
  103. data/lib/scribo/version.rb +5 -0
  104. data/lib/scribo.rb +59 -0
  105. data/lib/tasks/scribo_tasks.rake +28 -0
  106. metadata +498 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: fed1fcd709cca14b78b592dea59e90e7b9f5878fb1e68c91dbd3bf4e1f1f4c9e
4
+ data.tar.gz: b24bc25e2c1e55c0313fc284d8e62f9a59ffcc6712707848f7a296bbcc9be7a8
5
+ SHA512:
6
+ metadata.gz: 4f2ade1bb9a68e21915299b22e3f571dfbc83774cd2cc906acea2829d7108eb0058e5f6f63c8bed2bf48fe702ea77b59e47591ea5d341406185fc6473fa82bc4
7
+ data.tar.gz: f5d01119bdf9aa97d19f0cfd116dbd43bcac04d150bde68742d554e541a2203defaafd6a165188d1ba710d8ebb285f17197f7b85d70aad77bc1428ffd5c6449b
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017 Tom de Grunt
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,93 @@
1
+ # Scribo
2
+
3
+ A easy to use, embeddable CMS for Ruby on Rails.
4
+ Scribo is designed to work with your models and can also render your content inside customer designed layouts.
5
+
6
+ ## Features
7
+
8
+ Scribo is designed to be easy to use and we try to keep it as simple as possible.
9
+ It's designed to have the least possible impact on your database, we only use two models/tables (Site and Content).
10
+ It also makes no assumptions about your data models, it does come feature packed though:
11
+
12
+ - Pages
13
+ - Blog (with permalinks & categories)
14
+ - Static assets
15
+ - Data files (think: make a page based on an Excel sheet)
16
+ - Layouts
17
+ - [Liquid](http://liquidmarkup.org) templating
18
+ - Mostly [Jekyll](https://jekyllrb.com) compatibile
19
+ - Use of [YAML](https://yaml.org) in front-matter and configuration
20
+ - Use of [Jekyll themes](https://jekyllrb.com/docs/themes/)
21
+
22
+ ## Documentation
23
+
24
+ - [YAML](https://learn-the-web.algonquindesign.ca/topics/markdown-yaml-cheat-sheet/#yaml) cheatsheet
25
+ - Quick [YAML](https://learnxinyminutes.com/docs/yaml/) introduction
26
+
27
+ ## API
28
+
29
+ The API uses token authorization, the token is obtained by making an sgid from the `scribable`.
30
+ So for a `scribable` model `Account`, you could create it as follows:
31
+
32
+ ```ruby
33
+ token = Account.first.to_sgid(for: 'scribo', expires_in: nil).to_s
34
+ ```
35
+
36
+ This token can be used in the below request.
37
+
38
+ ### POST /api/sites/import
39
+
40
+ This allows you to import a site (in ZIP format) using an API token.
41
+
42
+ ```shell
43
+ curl -H 'Authorization: Token {token}' -X POST -F 'files[]=@site.zip' https://endpoint/api/sites/import
44
+ ```
45
+
46
+ ## Installation
47
+
48
+ Add this line to your application's Gemfile:
49
+
50
+ ```ruby
51
+ gem 'scribo'
52
+ ```
53
+
54
+ Migrate your database:
55
+
56
+ ```bash
57
+ $ bin/rails db:migrate
58
+ ```
59
+
60
+ Then add Scribo to your routes file.
61
+ Scribo consumes all URLs, so make sure you put the following line at the bottom of your routes.rb.
62
+
63
+ ```ruby
64
+ mount Scribo::Engine, at: '/'
65
+ ```
66
+
67
+ ## Using your controllers with scribo
68
+
69
+ In your controller add the following:
70
+
71
+ ```ruby
72
+ render(scribo: current_site, path: '/index', restricted: false, owner: Account.first)
73
+ ```
74
+
75
+ This will look for `index` in the `current_site`.
76
+
77
+ ## Testing
78
+
79
+ bin/rails db:drop
80
+ bin/rails db:create
81
+ bin/rails db:migrate
82
+
83
+ The admin side of Scribo can be accessed here: https://localhost:3000/sites/
84
+ Run `yarn watch` and you can develop using the above URL.
85
+
86
+ ## Contributing
87
+
88
+ Bug reports and pull requests are welcome on GitHub at https://gitlab.com/entropydecelerator/scribo.
89
+ This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
90
+
91
+ ## License
92
+
93
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ begin
4
+ require 'bundler/setup'
5
+ rescue LoadError
6
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
7
+ end
8
+
9
+ require 'rdoc/task'
10
+
11
+ RDoc::Task.new(:rdoc) do |rdoc|
12
+ rdoc.rdoc_dir = 'rdoc'
13
+ rdoc.title = 'Scribo'
14
+ rdoc.options << '--line-numbers'
15
+ rdoc.rdoc_files.include('README.md')
16
+ rdoc.rdoc_files.include('lib/**/*.rb')
17
+ end
18
+
19
+ APP_RAKEFILE = File.expand_path('../test/dummy/Rakefile', __FILE__)
20
+ load 'rails/tasks/engine.rake'
21
+
22
+ load 'rails/tasks/statistics.rake'
23
+
24
+ require 'bundler/gem_tasks'
25
+
26
+ require 'rake/testtask'
27
+
28
+ Rake::TestTask.new(:test) do |t|
29
+ t.libs << 'test'
30
+ t.pattern = 'test/**/*_test.rb'
31
+ t.verbose = false
32
+ t.warning = false
33
+ end
34
+
35
+ task default: :test
36
+
37
+ # Adds the Auxilium semver task
38
+ spec = Gem::Specification.find_by_name 'auxilium'
39
+ load "#{spec.gem_dir}/lib/tasks/semver.rake"
40
+
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/scribo .js
2
+ //= link_directory ../stylesheets/scribo .css
@@ -0,0 +1 @@
1
+ ../../../../frontend/dist/scribo.js
@@ -0,0 +1 @@
1
+ ../../../../frontend/dist/scribo.css
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module MaintenanceStandards
4
+ # Informs the user and redirects when needed
5
+ #
6
+ # @param result [Boolean] was update or create succesful
7
+ # @param path [URL] where to redirect to
8
+ # @param notice [String] What to show on success
9
+ # @param error [String] What to show on error
10
+ # @param render_action [Symbol] What to render
11
+ #
12
+ def flash_and_redirect(result, path, notice, error, render_action = :edit)
13
+ if result
14
+ if params[:commit] == 'continue'
15
+ flash.now[:notice] = notice
16
+ else
17
+ redirect_to(path, notice: notice) && return
18
+ end
19
+ else
20
+ flash.now[:error] = error
21
+ end
22
+ render render_action
23
+ end
24
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'scribo/application_admin_controller'
4
+
5
+ module Scribo
6
+ module Admin
7
+ class Sites::ContentsController < ApplicationAdminController
8
+ before_action :set_objects
9
+
10
+ # Render the IDE
11
+ def index; end
12
+
13
+ def edit; end
14
+
15
+ def update
16
+ @content.update(content_params)
17
+ render :edit
18
+ end
19
+
20
+ def show
21
+ render :edit
22
+ end
23
+
24
+ def destroy
25
+ @content.destroy
26
+ head 200
27
+ end
28
+
29
+ def move
30
+ if params[:to]
31
+ new_parent = @site.contents.find(params[:to])
32
+ @content.update!(parent: new_parent)
33
+ else
34
+ @content.update!(parent_id: nil)
35
+ end
36
+ rescue
37
+ Signum.error(Current.user, text: t('.move_fail'))
38
+ end
39
+
40
+ def rename
41
+ @content.update(path: params[:to]) if params[:to]
42
+ end
43
+
44
+ def create
45
+ parent = params[:parent] ? @site.contents.find(params[:parent]) : nil
46
+ @content = @site.contents.create!(path: params[:path], kind: params[:kind], parent: parent)
47
+ rescue
48
+ Signum.error(Current.user, text: t('.create_fail', kind: params[:kind]))
49
+ end
50
+
51
+ def upload
52
+ @parent = Scribo::Content.find(params[:content][:parent_id]) if params[:content][:parent_id]
53
+
54
+ params[:content][:files]&.each do |file|
55
+ content = @site.contents.create!(kind: Scribo::Utility.kind_for_path(file.original_filename),
56
+ path: file.original_filename, data_with_frontmatter: file.read)
57
+ content.update!(parent: @parent) if @parent
58
+ rescue
59
+ Signum.error(Current.user, text:t('.upload_fail'))
60
+ end
61
+
62
+ @contents = @site.contents.roots.reorder(:path) # unless params[:content][:parent_id]
63
+ end
64
+
65
+ private
66
+
67
+ def set_objects
68
+ @site = Scribo::Site.find(params[:site_id])
69
+ @content = if params[:id]
70
+ @site.contents.find(params[:id])
71
+ else
72
+ params[:content] ? @site.contents.new(content_params) : @site.contents.new
73
+ end
74
+
75
+ @contents = @site.contents.roots.where(kind: 'folder').reorder(:path) + @site.contents.roots.where("kind <> 'folder'").reorder(:path)
76
+ @readme = @site.contents.roots.where("path ilike '%readme%'").first
77
+ end
78
+
79
+ def content_params
80
+ params.require(:content).permit(:data_with_frontmatter).tap do |whitelisted|
81
+ whitelisted[:data_with_frontmatter] = params[:content][:data_with_frontmatter].read.force_encoding('utf-8') if params[:content][:data_with_frontmatter].respond_to?(:read)
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'scribo/application_admin_controller'
4
+
5
+ module Scribo
6
+ module Admin
7
+ class SitesController < ApplicationAdminController
8
+ before_action :set_objects, except: [:index]
9
+
10
+ def new
11
+ if params[:template_id]
12
+ url = Scribo.config.templates.find { |t| t[:id] == params[:template_id] }&.[](:url)
13
+ redirect_to(admin_sites_path) && return unless url
14
+
15
+ file = Down.download(url)
16
+ @site = Scribo::SiteImportService.new(file.path, scribable: Scribo.config.scribable_for_request(request)).call
17
+ redirect_to(admin_site_contents_path(@site))
18
+ nil
19
+ else
20
+ @site = Scribo::Site.create!(scribable: Scribo.config.scribable_for_request(request))
21
+ Scribo.config.after_site_create(@site)
22
+ redirect_to(admin_site_contents_path(@site))
23
+ nil
24
+ end
25
+ end
26
+
27
+ def create
28
+ flash_and_redirect @site.save, admin_site_contents_path(@site), 'Site created successfully',
29
+ 'There were problems creating the site'
30
+ end
31
+
32
+ def index
33
+ @sites = Site.adminable
34
+ end
35
+
36
+ def destroy
37
+ flash_and_redirect @site.destroy, admin_sites_url, 'Site deleted successfully',
38
+ 'There were problems deleting the site'
39
+ end
40
+
41
+ def import
42
+ @sites = Site.adminable
43
+ params[:files].each do |file|
44
+ Scribo::SiteImportService.new(file.path, scribable: Scribo.config.scribable_for_request(request)).call
45
+ end
46
+ end
47
+
48
+ def export
49
+ name, data = Scribo::SiteExportService.new(@site).call
50
+ send_data data, type: 'application/zip', filename: name
51
+ end
52
+
53
+ private
54
+
55
+ def set_objects
56
+ @sites = Site.adminable
57
+ @site = Site.adminable.find(params[:id]) if params[:id]
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'scribo/application_controller'
4
+ module Scribo
5
+ module Api
6
+ class SitesController < ApplicationController
7
+ skip_before_action :verify_authenticity_token
8
+
9
+ def import
10
+ sgid = request.authorization&.split&.last
11
+ head(400) && return unless sgid
12
+
13
+ scribable = ::GlobalID::Locator.locate_signed(sgid, for: 'scribo')
14
+
15
+ head(401) && return unless scribable
16
+
17
+ params[:files].each do |file|
18
+ Scribo::SiteImportService.new(file.path, scribable: scribable).call
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'scribo/application_controller'
4
+ require_dependency 'concerns/maintenance_standards'
5
+
6
+ module Scribo
7
+ class ApplicationAdminController < ApplicationController
8
+ include MaintenanceStandards
9
+ include Scribo.config.admin_authentication_module.constantize if Scribo.config.admin_authentication_module
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scribo
4
+ class ApplicationController < Scribo.config.base_controller.constantize
5
+ end
6
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'scribo/application_controller'
4
+ require_dependency 'scribo/action_dispatch/request_drop'
5
+
6
+ module Scribo
7
+ class ContentsController < ApplicationController
8
+ protect_from_forgery except: :show
9
+
10
+ def show
11
+ render scribo: request
12
+ rescue StandardError => e
13
+ Scribo.config.logger.error '-' * 80
14
+ Scribo.config.logger.error '=> Content rendering errors: ' + e.message
15
+ Scribo.config.logger.error '=> ' + e.backtrace.map(&:to_s).join("\n")
16
+ Scribo.config.logger.error '-' * 80
17
+ render body: e.message, status: 500
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../application_drop'
4
+
5
+ module Scribo
6
+ module ActionDispatch
7
+ class RequestDrop < ::Scribo::ApplicationDrop
8
+ delegate :fullpath, :host, :scheme, :ip, :media_type, :query_parameters, :uuid, :request_method, to: :@object
9
+
10
+ def headers
11
+ @object.headers.to_h
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scribo
4
+ module ActiveModel
5
+ class ErrorsDrop < Liquid::Drop
6
+ def initialize(object)
7
+ @object = object
8
+ end
9
+ delegate :base, :details, to: :@object
10
+
11
+ def messages
12
+ @object.messages.stringify_keys
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scribo
4
+ class ApplicationDrop < Liquid::Drop
5
+ def initialize(object)
6
+ @object = object
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'scribo/application_drop'
4
+
5
+ module Scribo
6
+ class ArrayDrop < ApplicationDrop
7
+ delegate :each, :map, :size, :length, :first, :last, :empty?, :join, to: :@object
8
+
9
+ def ==(other)
10
+ @object.include?(other) || @object == other
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'scribo/application_drop'
4
+
5
+ module Scribo
6
+ # https://jekyllrb.com/docs/variables/#page-variables
7
+ class ContentDrop < ApplicationDrop
8
+ delegate :url, :path, :excerpt, :categories, :tags, :dir, to: :@object
9
+ delegate :site, to: :@object
10
+
11
+ def initialize(object)
12
+ @object = object
13
+ @properties = object.properties
14
+ end
15
+
16
+ def date
17
+ @object.date
18
+ end
19
+
20
+ def id
21
+ @object.full_path
22
+ end
23
+
24
+ # FIXME: This breaks when the collection_path is set (https://jekyllrb.com/docs/collections/#setup)
25
+ def collection
26
+ base_dir = @object.dir.split('/').first.gsub('_', '')
27
+ base_dir if @object.site.collections.include?(base_dir)
28
+ end
29
+
30
+ # Find out how to merge properties with this drop
31
+ def name
32
+ @properties&.[]('name') || @object.path
33
+ end
34
+
35
+ def layout
36
+ @object.layout_name
37
+ end
38
+
39
+ def next
40
+ @object.right_sibling
41
+ end
42
+
43
+ def previous
44
+ @object.left_sibling
45
+ end
46
+
47
+ def content
48
+ Scribo::ContentRenderService.new(@object, @context.registers['controller'], {}).call
49
+ end
50
+
51
+ def [](property)
52
+ if respond_to?(property)
53
+ send(property)
54
+ elsif @properties.present?
55
+ @properties[property]
56
+ end
57
+ end
58
+
59
+ def categories
60
+ Scribo::ArrayDrop.new(@properties&.[]('categories'))
61
+ end
62
+
63
+ def tags
64
+ Scribo::ArrayDrop.new(@properties&.[]('tags'))
65
+ end
66
+
67
+ def liquid_method_missing(method)
68
+ return nil unless @properties
69
+
70
+ @properties[method.to_s]
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'scribo/application_drop'
4
+ require 'csv'
5
+
6
+ module Scribo
7
+ class DataDrop < ApplicationDrop
8
+ attr_accessor :data_path
9
+
10
+ def initialize(object, data_path = [])
11
+ @object = object
12
+ @data_path = data_path
13
+ end
14
+
15
+ def [](name)
16
+ method_missing(name)
17
+ end
18
+
19
+ def method_missing(method)
20
+ content = @object.contents.data((data_path + [method.to_s]).join('/')).first
21
+
22
+ return Scribo::DataDrop.new(@object, data_path + [content.path]) if content&.kind == 'folder'
23
+
24
+ case content&.content_type
25
+ when 'text/x-yaml'
26
+ Scribo::Utility.yaml_safe_parse(content.data)
27
+ when 'application/json'
28
+ ::JSON.parse(content.data)
29
+ when 'text/csv'
30
+ CSV.parse(content.data, headers: true, liberal_parsing: true, quote_char: '"', col_sep: ';',
31
+ row_sep: "\r\n").map(&:to_h)
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scribo
4
+ class FormDrop < Liquid::Drop
5
+ def initialize(model, attribute = nil)
6
+ @model = model
7
+ @attribute = attribute
8
+ end
9
+
10
+ attr_reader :model, :attribute
11
+
12
+ def class_name
13
+ model.class.name.gsub(/Drop$/, '')
14
+ end
15
+
16
+ def errors
17
+ errors = if @model&.instance_variable_get('@object')
18
+ @model.instance_variable_get('@object').errors
19
+ else
20
+ ::ActiveModel::Errors.new([])
21
+ end
22
+
23
+ ::Scribo::ActiveModel::ErrorsDrop.new errors
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Scribo
4
+ class IncludeDrop < Liquid::Drop
5
+ def initialize(attributes)
6
+ @attributes = attributes
7
+ end
8
+
9
+ def liquid_method_missing(method)
10
+ @attributes[method.to_s]
11
+ end
12
+ end
13
+ end