scribo 1.0.38

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 (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