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
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Markdownify
4
+ def markdownify(input)
5
+ # Easiest way at the moment
6
+ Scribo::ContentRenderService.new(Scribo::Content.new(kind: 'text', data: input), {}, layout: false,
7
+ filter: 'markdown').call
8
+ end
9
+ end
10
+
11
+ Liquid::Template.register_filter(Markdownify)
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module URLFilters
4
+ # Produces an absolute URL based on site.url and site.baseurl.
5
+ #
6
+ # input - the URL to make absolute.
7
+ #
8
+ # Returns the absolute URL as a String.
9
+ def absolute_url(input)
10
+ cache = (@context.registers[:cached_absolute_urls] ||= {})
11
+ cache[input] ||= compute_absolute_url(input)
12
+ end
13
+
14
+ # Produces a URL relative to the domain root based on site.baseurl
15
+ # unless it is already an absolute url with an authority (host).
16
+ #
17
+ # input - the URL to make relative to the domain root
18
+ #
19
+ # Returns a URL relative to the domain root as a String.
20
+ def relative_url(input)
21
+ cache = (@context.registers[:cached_relative_urls] ||= {})
22
+ cache[input] ||= compute_relative_url(input)
23
+ end
24
+
25
+ # Strips trailing `/index.html` from URLs to create pretty permalinks
26
+ #
27
+ # input - the URL with a possible `/index.html`
28
+ #
29
+ # Returns a URL with the trailing `/index.html` removed
30
+ def strip_index(input)
31
+ return if input.nil? || input.to_s.empty?
32
+
33
+ input.sub(%r[/index\.html?$], '/')
34
+ end
35
+
36
+ private
37
+
38
+ def compute_absolute_url(input)
39
+ return if input.nil?
40
+
41
+ input = input.url if input.respond_to?(:url)
42
+ return input if Addressable::URI.parse(input.to_s).absolute?
43
+
44
+ site = @context.registers['content'].site
45
+ return relative_url(input) if site.properties['url'].nil?
46
+
47
+ Addressable::URI.parse(
48
+ site.properties['url'].to_s + relative_url(input)
49
+ ).normalize.to_s
50
+ end
51
+
52
+ def compute_relative_url(input)
53
+ return if input.nil?
54
+
55
+ input = input.url if input.respond_to?(:url)
56
+ return input if Addressable::URI.parse(input.to_s).absolute?
57
+
58
+ parts = [sanitized_baseurl, input]
59
+ Addressable::URI.parse(
60
+ parts.compact.map { |part| ensure_leading_slash(part.to_s) }.join
61
+ ).normalize.to_s
62
+ end
63
+
64
+ def sanitized_baseurl
65
+ site = @context.registers['content'].site
66
+ site.properties['baseurl'].to_s.chomp('/')
67
+ end
68
+
69
+ def ensure_leading_slash(input)
70
+ return input if input.nil? || input.empty? || input.start_with?('/')
71
+
72
+ "/#{input}"
73
+ end
74
+ end
75
+
76
+ Liquid::Template.register_filter(URLFilters)
@@ -0,0 +1,32 @@
1
+ require 'parslet'
2
+
3
+ module Scribo
4
+ class LiquidParser < Parslet::Parser
5
+ rule(:liquid) { (str('}}').absent? >> any).repeat }
6
+
7
+ rule(:space) { match('\s').repeat(1) }
8
+ rule(:space?) { space.maybe }
9
+
10
+ rule(:squote) { str("'").repeat(1) }
11
+ rule(:dquote) { str('"').repeat(1) }
12
+
13
+ rule(:pipe) { str('|').repeat(1) }
14
+
15
+ rule(:nsqvalue) { match["^'"] }
16
+ rule(:ndqvalue) { match['^"'] }
17
+
18
+ rule(:squoted_value) { squote >> nsqvalue.repeat.as(:value) >> squote }
19
+ rule(:dquoted_value) { dquote >> ndqvalue.repeat.as(:value) >> dquote }
20
+ rule(:quoted_value) { squoted_value | dquoted_value }
21
+
22
+ rule(:translation_key) { quoted_value >> space? >> pipe >> liquid.as(:filter) >> space? >> liquid }
23
+
24
+ rule(:liquid_code) { translation_key | liquid }
25
+
26
+ rule(:liquid_with_brackets) { str('{{') >> liquid_code >> str('}}') }
27
+ rule(:text) { (str('{{').absent? >> any).repeat(1) }
28
+
29
+ rule(:text_with_liquid) { (text | liquid_with_brackets).repeat }
30
+ root(:text_with_liquid)
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ApplicationAssets tag
4
+ #
5
+ # == Basic usage:
6
+ # {%application_assets%}
7
+ class ApplicationAssetsTag < LiquidumTag
8
+ def render(context)
9
+ super
10
+ lookup(context.registers, 'application_assets')
11
+ end
12
+ end
13
+
14
+ Liquid::Template.register_tag('application_assets', ApplicationAssetsTag)
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # ApplicationAssets tag
4
+ #
5
+ # == Basic usage:
6
+ # {%application_js%}
7
+ class ApplicationJsTag < LiquidumTag
8
+ def render(context)
9
+ super
10
+
11
+ js = lookup(context.registers, 'application_js')
12
+ "<script>#{js}</script>" if js
13
+ end
14
+ end
15
+
16
+ Liquid::Template.register_tag('application_js', ApplicationJsTag)
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Add assets (by name) from the current Liquidum site
4
+ #
5
+ # == Basic usage:
6
+ # {%asset 'test.png'%}
7
+ #
8
+ # == Advanced usage:
9
+ # {%asset 'test.png' height="72px"%}
10
+ # {%asset 'test.png' style="height: 72px;"%}
11
+ #
12
+ # Note: It will only look at published assets
13
+ class AssetTag < LiquidumTag
14
+ include Rails.application.routes.url_helpers
15
+
16
+ def render(context)
17
+ super
18
+
19
+ current_content = context.registers['content']
20
+
21
+ content = current_content.site.contents.published.located(argv1, restricted: false).first
22
+
23
+ return "<!-- asset '#{argv1}' not found -->" unless content
24
+
25
+ full_path = content.full_path
26
+ if File.basename(full_path).include?('/_')
27
+ full_path = context.registers['controller'].helpers.scribo.content_path(content)
28
+ end
29
+
30
+ case content&.media_type
31
+ when 'image'
32
+ %[<img] +
33
+ attr_str(:src, arg(:src), full_path) +
34
+ attr_str(:alt, content.properties['title'], content.properties['title']) +
35
+ attr_str(:title, content.properties['caption'], content.properties['caption']) +
36
+ attr_str(:width, arg(:width)) +
37
+ attr_str(:height, arg(:height)) +
38
+ attr_str(:style, arg(:style)) +
39
+ %[/>]
40
+ else
41
+ if content&.content_type == 'text/css'
42
+ %[<link rel="stylesheet" type="text/css"] +
43
+ attr_str(:href, arg(:href), full_path) +
44
+ %[/>]
45
+ elsif content&.content_type == 'application/javascript'
46
+ %[<script] +
47
+ attr_str(:src, arg(:src), full_path) +
48
+ %[/></script>]
49
+ else
50
+ "<!-- unknown asset: #{argv1} -->"
51
+ end
52
+ end
53
+ end
54
+ end
55
+
56
+ Liquid::Template.register_tag('asset', AssetTag)
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Adds a (by default submit) button
4
+ #
5
+ # == Basic usage:
6
+ # {%button name:'commit' value:'save'%}Save{%endbutton%}
7
+ #
8
+ # == Advanced usage:
9
+ # {%button button name:'commit' value:'save'%}Save{%endbutton%}
10
+ # {%button reset name:'commit' value:'save'%}Save{%endbutton%}
11
+ #
12
+ class ButtonTag < LiquidumBlock
13
+ def render(context)
14
+ super
15
+
16
+ %[<button] + attr_str(:type, argv1, 'submit') +
17
+ attr_str(:name, arg(:name), 'commit') +
18
+ attr_str(:value, arg(:value)) +
19
+ attr_str(:class, arg(:class)) +
20
+ %[>] + render_body + %[</button>]
21
+ end
22
+ end
23
+
24
+ Liquid::Template.register_tag('button', ButtonTag)
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Add a check-box, either specifying everything manually or using a model object on the form
4
+ #
5
+ # == Basic usage:
6
+ # {%check_box name:"name" value:"1"%}
7
+ #
8
+ # == Advanced usage:
9
+ # {%check_box name%}
10
+ #
11
+ # This last usage requires a model on the form
12
+ #
13
+ class CheckBoxTag < LiquidumTag
14
+ def render(context)
15
+ super
16
+
17
+ if @form_model
18
+ %[<input ] + attr_str(:name, arg(:name),
19
+ input(:name, argv1)) + %[value="0" type="hidden"/>]
20
+ else
21
+
22
+ %[<input ] + attr_str(:name, arg(:name), input(:name, argv1)) +
23
+ attr_str(:id, arg(:id), input(:id, argv1)) +
24
+ attr_str(:value, arg(:value), input(:value, argv1) ? 1 : 0) +
25
+ attr_str(:checked, arg(:checked), input(:checked, argv1)) +
26
+ attrs_str(:disabled, :maxlength, :placeholder, :class) + %[ type="checkbox"/>]
27
+ end
28
+ end
29
+ end
30
+
31
+ Liquid::Template.register_tag('check_box', CheckBoxTag)
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Adds CSRF meta tags
4
+ #
5
+ # == Basic usage:
6
+ # {%csrf_meta_tags%}
7
+ #
8
+ class CsrfMetaTagsTag < LiquidumTag
9
+ def render(context)
10
+ super
11
+
12
+ context.registers['controller'].helpers.csrf_meta_tags
13
+ end
14
+ end
15
+
16
+ Liquid::Template.register_tag('csrf_meta_tags', CsrfMetaTagsTag)
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Add a date-field, either specifying everything manually or using a model object on the form
4
+ #
5
+ # == Basic usage:
6
+ # {%date_field name:"start_date" value:"2019-09-27"%}
7
+ #
8
+ # == Advanced usage:
9
+ # {%date_field start_date%}
10
+ #
11
+ # This last usage requires a model on the form
12
+ #
13
+
14
+ require_relative './text_field_tag'
15
+
16
+ class DateFieldTag < TextFieldTag
17
+ def initialize(tag, args, tokens)
18
+ super
19
+ @field_type = 'date'
20
+ end
21
+ end
22
+
23
+ Liquid::Template.register_tag('date_field', DateFieldTag)
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Makes content available for editing, basically adds the right attributes
4
+ #
5
+ # == Basic usage:
6
+ # <div {%editable%} data-editable-id='fiets'></div>
7
+ #
8
+ class EditableUrlTag < LiquidumTag
9
+ def render(context)
10
+ super
11
+
12
+ content = context.registers['content']
13
+
14
+ # FIXME: Use url helpers
15
+ %[/scribo/sites/#{content.site.id}/contents/#{content.id}/parts]
16
+ end
17
+ end
18
+
19
+ Liquid::Template.register_tag('editable_url', EditableUrlTag)
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Add a email-field, either specifying everything manually or using a model object on the form
4
+ #
5
+ # == Basic usage:
6
+ # {%email_field name:"email" value:"1"%}
7
+ #
8
+ # == Advanced usage:
9
+ # {%email_field email%}
10
+ #
11
+ # This last usage requires a model on the form
12
+ #
13
+
14
+ require_relative './text_field_tag'
15
+
16
+ class EmailFieldTag < TextFieldTag
17
+ def initialize(tag, args, tokens)
18
+ super
19
+ @field_type = 'email'
20
+ end
21
+ end
22
+
23
+ Liquid::Template.register_tag('email_field', EmailFieldTag)
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Adds Feed meta
4
+ #
5
+ # == Basic usage:
6
+ # {%feed_meta%}
7
+ #
8
+ class FeedMetaTag < LiquidumTag
9
+ def render(context)
10
+ super
11
+
12
+ content = context.registers['content']
13
+ site = content.site
14
+ request = context.registers['controller'].request
15
+
16
+ %[
17
+ <!-- Begin Scribo Feed Meta tag #{Scribo::VERSION} -->
18
+ ]
19
+ end
20
+ end
21
+
22
+ Liquid::Template.register_tag('feed_meta', FeedMetaTag)
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Add errors for a specific form field, only works inside a form
4
+ #
5
+ # == Basic usage:
6
+ # {%field_error name%}
7
+ #
8
+ class FieldErrorTag < LiquidumTag
9
+ attr_accessor :field_type
10
+
11
+ def render(context)
12
+ super
13
+
14
+ error_messages = lookup(context, "form.errors.messages.#{argv1}")
15
+
16
+ if error_messages.present?
17
+ result = %[<span>] +
18
+ attr_str(:class, arg(:class), input(:class, argv1)) +
19
+ (error_messages || []).join(', ') + %[</span>]
20
+ end
21
+
22
+ result
23
+ end
24
+ end
25
+
26
+ Liquid::Template.register_tag('field_error', FieldErrorTag)
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Exposes additional model objects, similar to form, but it doesn't create a form-tag.
4
+ #
5
+ # == Basic usage:
6
+ # {%fields_for location%}
7
+ # {%text_field city%}
8
+ # {%endform%}
9
+ #
10
+ # It will automatically build the association if need be. For polymorphic it needs a hint:
11
+ # {%fields_for scribable Domain%}
12
+ # {%text_field city%}
13
+ # {%endform%}
14
+ #
15
+ # == Available variables:
16
+ #
17
+ # form.model:: model specified
18
+ # form.class_name:: class name of the model specified (original name, not the drop)
19
+ # form.errors:: errors of the exposed object
20
+ #
21
+ # require_relative '../drops/form_drop'
22
+
23
+ class FieldsForTag < LiquidumBlock
24
+ def render(context)
25
+ super
26
+
27
+ result = ''
28
+
29
+ context.stack do
30
+ context['form'] = Scribo::FormDrop.new(new_model, argv1)
31
+ result += render_body
32
+
33
+ if context['form.model.id']
34
+ result += %[<input] +
35
+ attr_str(:id, arg(:id), input(:id, 'id')) +
36
+ attr_str(:name, arg(:name), input(:name, 'id')) +
37
+ attr_str(:value, arg(:value), input(:value, 'id')) +
38
+ %[type="hidden"/>]
39
+ end
40
+ end
41
+
42
+ result
43
+ end
44
+
45
+ private
46
+
47
+ def new_model
48
+ new_model = begin
49
+ @context["form.model.#{argv1}"]
50
+ rescue StandardError
51
+ nil
52
+ end
53
+ unless new_model
54
+
55
+ association_name = (Regexp.last_match(0) if argv1.match(/([^\[\]])+/))
56
+
57
+ new_model = begin
58
+ reflection = real_object_from_drop(@context['form.model']).class.reflect_on_association(association_name)
59
+ if reflection.polymorphic?
60
+ # If it's polymorphic we need hints on what to do
61
+ sargs.first.to_s.safe_constantize.new(attr_args)
62
+ elsif reflection.is_a?(ActiveRecord::Reflection::HasManyReflection) && reflection.constructable?
63
+ # Do model.association.new
64
+ real_object_from_drop(@context['form.model']).send(association_name.to_sym).new(attr_args)
65
+ elsif reflection.is_a?(ActiveRecord::Reflection::BelongsToReflection) && reflection.constructable?
66
+ # Do model.build_association
67
+ real_object_from_drop(@context['form.model']).send("build_#{association_name}".to_sym, attr_args)
68
+ else
69
+ # Just call new on the class
70
+ reflection.klass.new(attr_args)
71
+ end
72
+ rescue ArgumentError
73
+ nil
74
+ end
75
+
76
+ new_model
77
+ end
78
+ new_model
79
+ end
80
+ end
81
+
82
+ Liquid::Template.register_tag('fields_for', FieldsForTag)
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Form adds a form tag, when you specify a model it will use and expose that to nested fields.
4
+ # Exposing a model will ease the creation of nested fields.
5
+ #
6
+ # == Basic usage:
7
+ # {%form%}
8
+ # {%text_field name:"name" value:"Pencil"%}
9
+ # {%endform%}
10
+ #
11
+ # == Advanced usage:
12
+ # {%form product%}
13
+ # {%text_field name%}
14
+ # {%endform%}
15
+ #
16
+ # == Available variables:
17
+ #
18
+ # form.model:: model specified
19
+ # form.class_name:: class name of the model specified (original name, not the drop)
20
+ # form.errors:: errors of the exposed object
21
+ #
22
+ # require_relative '../drops/form_drop'
23
+
24
+ class FormTag < LiquidumBlock
25
+ def render(context)
26
+ super
27
+
28
+ method = arg(:method).to_s.downcase
29
+ method = argv1.instance_variable_get('@object').persisted? ? 'patch' : 'post' if method.blank? && argv1
30
+
31
+ rails_method = nil
32
+ if %w[get post].exclude? method
33
+ rails_method = method
34
+ method = 'post'
35
+ end
36
+
37
+ result = %[<form] +
38
+ attr_str(:action, arg(:action)) +
39
+ attr_str(:method, method) +
40
+ attrs_str(reject: %[action method]) +
41
+ %[>]
42
+
43
+ if context.registers['controller']
44
+ result += %[<input name="_method" type="hidden" value="#{rails_method}"/>] if rails_method
45
+ result += %[<input name="authenticity_token" type="hidden" value="#{context.registers['controller'].helpers.form_authenticity_token}"/>]
46
+ end
47
+
48
+ context.stack do
49
+ context['form'] = Scribo::FormDrop.new(argv1)
50
+ result += render_body
51
+ end
52
+ result += %[</form>]
53
+ result
54
+ end
55
+ end
56
+
57
+ Liquid::Template.register_tag('form', FormTag)
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Adds a Google Analytics Javascript block
4
+ #
5
+ # == Basic usage:
6
+ # {%google_analytics_javascript 'UA-000000-01'%}
7
+ #
8
+ # == Advanced usage:
9
+ # {%google_analytics_javascript retailer.code%}
10
+ #
11
+ # Where 'UA-000000-01' is your analytics id
12
+ class GoogleAnalyticsJavascriptTag < LiquidumTag
13
+ def render(context)
14
+ super
15
+
16
+ return unless Rails.env == 'production'
17
+ return unless argv1
18
+
19
+ Scribo.config.logger.warn "Inserting google analytics with code: #{argv1}"
20
+ %(<script>(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
21
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
22
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
23
+ })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
24
+
25
+ ga('create', '#{argv1}', 'auto');
26
+ ga('send', 'pageview');</script>)
27
+ end
28
+ end
29
+
30
+ Liquid::Template.register_tag('google_analytics_javascript', GoogleAnalyticsJavascriptTag)
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Adds a Google Tag Manager Javascript block
4
+ #
5
+ # == Basic usage:
6
+ # {%google_tag_manager_javascript 'GTM-XXXXXXX'%}
7
+ #
8
+ # == Advanced usage:
9
+ # {%google_tag_manager_javascript retailer.code%}
10
+ #
11
+ # Where 'GTM-XXXXXXX' is your container id
12
+ class GoogleTagManagerJavascriptTag < LiquidumTag
13
+ def render(context)
14
+ super
15
+
16
+ return unless Rails.env == 'production'
17
+ return unless argv1
18
+
19
+ Scribo.config.logger.warn "Inserting google tag manager with code: #{argv1}"
20
+ %(<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
21
+ new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
22
+ j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
23
+ 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
24
+ })(window,document,'script','dataLayer','#{argv1}');</script>)
25
+ end
26
+ end
27
+
28
+ Liquid::Template.register_tag('google_tag_manager_javascript', GoogleTagManagerJavascriptTag)
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Add a text-field, either specifying everything manually or using a model object on the form
4
+ #
5
+ # == Basic usage:
6
+ # {%hidden_field name:"name" value:"Pencil"%}
7
+ #
8
+ # == Advanced usage:
9
+ # {%hidden_field name%}
10
+ #
11
+ # This last usage requires a model on the form
12
+ #
13
+
14
+ require_relative './text_field_tag'
15
+
16
+ class HiddenFieldTag < TextFieldTag
17
+ def initialize(tag, args, tokens)
18
+ super
19
+ @field_type = 'hidden'
20
+ end
21
+ end
22
+
23
+ Liquid::Template.register_tag('hidden_field', HiddenFieldTag)