embeddable_content 0.1.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (141) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.rubocop.yml +62 -0
  4. data/.ruby-version +1 -0
  5. data/Gemfile +15 -0
  6. data/MIT-LICENSE +20 -0
  7. data/README.md +49 -0
  8. data/Rakefile +22 -0
  9. data/app/assets/config/embeddable_content_manifest.js +0 -0
  10. data/app/assets/images/embeddable_content/.keep +0 -0
  11. data/app/assets/javascripts/desmos/support.js +12 -0
  12. data/app/assets/javascripts/geogebra/support.js +14 -0
  13. data/app/assets/stylesheets/embeddable_content/.keep +0 -0
  14. data/app/controllers/.keep +0 -0
  15. data/app/controllers/concerns/cms/embeddable_content_controller.rb +14 -0
  16. data/app/controllers/concerns/embeddable_content_controller.rb +85 -0
  17. data/app/helpers/.keep +0 -0
  18. data/app/mailers/.keep +0 -0
  19. data/app/models/.keep +0 -0
  20. data/app/models/concerns/provides_embeddable_content.rb +59 -0
  21. data/app/models/embeddable_model_config.rb +55 -0
  22. data/app/models/embedder_config.rb +45 -0
  23. data/app/models/embedding.rb +25 -0
  24. data/app/services/embeddable_content/desmos_files/doc_processor.rb +5 -0
  25. data/app/services/embeddable_content/desmos_files/node_processor.rb +7 -0
  26. data/app/services/embeddable_content/doc_processor.rb +63 -0
  27. data/app/services/embeddable_content/embedded_tag_info.rb +50 -0
  28. data/app/services/embeddable_content/embedded_tags.rb +30 -0
  29. data/app/services/embeddable_content/embedder.rb +89 -0
  30. data/app/services/embeddable_content/embedder_base.rb +68 -0
  31. data/app/services/embeddable_content/fragment_embedder.rb +30 -0
  32. data/app/services/embeddable_content/geogebra_files/doc_processor.rb +5 -0
  33. data/app/services/embeddable_content/geogebra_files/node_processor.rb +11 -0
  34. data/app/services/embeddable_content/html_tags/doc_processor.rb +11 -0
  35. data/app/services/embeddable_content/html_tags/node_processor.rb +26 -0
  36. data/app/services/embeddable_content/images/attributions_processor.rb +60 -0
  37. data/app/services/embeddable_content/images/doc_processor.rb +54 -0
  38. data/app/services/embeddable_content/images/image_downloader.rb +60 -0
  39. data/app/services/embeddable_content/images/img_tag_attributes.rb +125 -0
  40. data/app/services/embeddable_content/images/modal_dialog.rb +74 -0
  41. data/app/services/embeddable_content/images/node_processor.rb +91 -0
  42. data/app/services/embeddable_content/images/shared.rb +11 -0
  43. data/app/services/embeddable_content/node_processor.rb +75 -0
  44. data/app/services/embeddable_content/presentation_tags/doc_processor.rb +5 -0
  45. data/app/services/embeddable_content/presentation_tags/node_processor.rb +35 -0
  46. data/app/services/embeddable_content/record_node_processor.rb +90 -0
  47. data/app/services/embeddable_content/replacement_template_manager.rb +21 -0
  48. data/app/services/embeddable_content/sad_embedded_tags.rb +29 -0
  49. data/app/services/embeddable_content/scrubber.rb +32 -0
  50. data/app/services/embeddable_content/template_based.rb +19 -0
  51. data/app/services/embeddable_content/template_manager.rb +100 -0
  52. data/app/services/embeddable_content/tex/base_renderer.rb +33 -0
  53. data/app/services/embeddable_content/tex/canvas_renderer.rb +15 -0
  54. data/app/services/embeddable_content/tex/doc_processor.rb +55 -0
  55. data/app/services/embeddable_content/tex/mathjax_renderer.rb +11 -0
  56. data/app/services/embeddable_content/tex/mml_renderer.rb +11 -0
  57. data/app/services/embeddable_content/tex/schoology_string_renderer.rb +15 -0
  58. data/app/services/embeddable_content/tex/svg_renderer.rb +11 -0
  59. data/app/services/embeddable_content/token_replacement_map.rb +32 -0
  60. data/app/services/embeddable_content/tree_based_node_processor.rb +23 -0
  61. data/app/services/embeddable_content/video_links/doc_processor.rb +5 -0
  62. data/app/services/embeddable_content/video_links/node_processor.rb +46 -0
  63. data/app/services/embeddable_content/video_links/vimeo_player_settings.rb +19 -0
  64. data/app/services/embeddable_content/visual_element_node_processor.rb +13 -0
  65. data/app/services/embeddable_content/widget_files/doc_processor.rb +5 -0
  66. data/app/services/embeddable_content/widget_files/node_processor.rb +7 -0
  67. data/app/views/.keep +0 -0
  68. data/app/views/embeddable_content/replacements/desmos_files/_applet.html.slim +8 -0
  69. data/app/views/embeddable_content/replacements/desmos_files/_description.html.slim +6 -0
  70. data/app/views/embeddable_content/replacements/desmos_files/cc.html.slim +1 -0
  71. data/app/views/embeddable_content/replacements/desmos_files/cms.html.slim +1 -0
  72. data/app/views/embeddable_content/replacements/desmos_files/editable.html.slim +1 -0
  73. data/app/views/embeddable_content/replacements/desmos_files/exported.html.slim +1 -0
  74. data/app/views/embeddable_content/replacements/desmos_files/kiddom.html.slim +1 -0
  75. data/app/views/embeddable_content/replacements/desmos_files/print.html.slim +1 -0
  76. data/app/views/embeddable_content/replacements/desmos_files/qti.html.slim +1 -0
  77. data/app/views/embeddable_content/replacements/desmos_files/schoology.html.slim +1 -0
  78. data/app/views/embeddable_content/replacements/desmos_files/web.html.slim +1 -0
  79. data/app/views/embeddable_content/replacements/geogebra_files/_applet.html.slim +11 -0
  80. data/app/views/embeddable_content/replacements/geogebra_files/_description.html.slim +9 -0
  81. data/app/views/embeddable_content/replacements/geogebra_files/cc.html.slim +1 -0
  82. data/app/views/embeddable_content/replacements/geogebra_files/cms.html.slim +1 -0
  83. data/app/views/embeddable_content/replacements/geogebra_files/editable.html.slim +1 -0
  84. data/app/views/embeddable_content/replacements/geogebra_files/exported.html.slim +1 -0
  85. data/app/views/embeddable_content/replacements/geogebra_files/kiddom.html.slim +1 -0
  86. data/app/views/embeddable_content/replacements/geogebra_files/print.html.slim +1 -0
  87. data/app/views/embeddable_content/replacements/geogebra_files/qti.html.slim +1 -0
  88. data/app/views/embeddable_content/replacements/geogebra_files/schoology.html.slim +1 -0
  89. data/app/views/embeddable_content/replacements/geogebra_files/web.html.slim +1 -0
  90. data/app/views/embeddable_content/replacements/html_tags/editable.html.slim +16 -0
  91. data/app/views/embeddable_content/replacements/images/_button_close.html.slim +9 -0
  92. data/app/views/embeddable_content/replacements/images/_button_open.html.slim +9 -0
  93. data/app/views/embeddable_content/replacements/images/_image_embed.html.slim +14 -0
  94. data/app/views/embeddable_content/replacements/images/_modal_content.html.slim +30 -0
  95. data/app/views/embeddable_content/replacements/images/_modal_dialog.html.slim +17 -0
  96. data/app/views/embeddable_content/replacements/images/cc.html.slim +12 -0
  97. data/app/views/embeddable_content/replacements/images/cms.html.slim +1 -0
  98. data/app/views/embeddable_content/replacements/images/editable.html.slim +1 -0
  99. data/app/views/embeddable_content/replacements/images/exported.html.slim +1 -0
  100. data/app/views/embeddable_content/replacements/images/kiddom.html.slim +12 -0
  101. data/app/views/embeddable_content/replacements/images/print.html.slim +1 -0
  102. data/app/views/embeddable_content/replacements/images/qti.html.slim +6 -0
  103. data/app/views/embeddable_content/replacements/images/schoology.html.slim +12 -0
  104. data/app/views/embeddable_content/replacements/images/web.html.slim +1 -0
  105. data/app/views/embeddable_content/replacements/presentation_tags/_default.html.slim +6 -0
  106. data/app/views/embeddable_content/replacements/presentation_tags/print.html.slim +1 -0
  107. data/app/views/embeddable_content/replacements/status/warning.html.slim +12 -0
  108. data/app/views/embeddable_content/replacements/video_links/_caption.html.slim +13 -0
  109. data/app/views/embeddable_content/replacements/video_links/_description.html.slim +12 -0
  110. data/app/views/embeddable_content/replacements/video_links/_video_embed.html.slim +13 -0
  111. data/app/views/embeddable_content/replacements/video_links/_video_player.html.slim +6 -0
  112. data/app/views/embeddable_content/replacements/video_links/_vimeo_player.html.slim +6 -0
  113. data/app/views/embeddable_content/replacements/video_links/cc.html.slim +1 -0
  114. data/app/views/embeddable_content/replacements/video_links/cms.html.slim +1 -0
  115. data/app/views/embeddable_content/replacements/video_links/editable.html.slim +1 -0
  116. data/app/views/embeddable_content/replacements/video_links/exported.html.slim +1 -0
  117. data/app/views/embeddable_content/replacements/video_links/kiddom.html.slim +1 -0
  118. data/app/views/embeddable_content/replacements/video_links/print.html.slim +1 -0
  119. data/app/views/embeddable_content/replacements/video_links/qti.html.slim +1 -0
  120. data/app/views/embeddable_content/replacements/video_links/schoology.html.slim +1 -0
  121. data/app/views/embeddable_content/replacements/video_links/web.html.slim +1 -0
  122. data/app/views/embeddable_content/replacements/widget_files/_widget_omitted.html.slim +8 -0
  123. data/app/views/embeddable_content/replacements/widget_files/_widget_script.html.slim +13 -0
  124. data/app/views/embeddable_content/replacements/widget_files/cc.html.slim +1 -0
  125. data/app/views/embeddable_content/replacements/widget_files/cms.html.slim +1 -0
  126. data/app/views/embeddable_content/replacements/widget_files/editable.html.slim +1 -0
  127. data/app/views/embeddable_content/replacements/widget_files/exported.html.slim +1 -0
  128. data/app/views/embeddable_content/replacements/widget_files/kiddom.html.slim +1 -0
  129. data/app/views/embeddable_content/replacements/widget_files/print.html.slim +1 -0
  130. data/app/views/embeddable_content/replacements/widget_files/qti.html.slim +1 -0
  131. data/app/views/embeddable_content/replacements/widget_files/schoology.html.slim +1 -0
  132. data/app/views/embeddable_content/replacements/widget_files/web.html.slim +1 -0
  133. data/bin/rails +25 -0
  134. data/config/initializers/embeddable_content.rb +3 -0
  135. data/config/routes.rb +2 -0
  136. data/embeddable_content.gemspec +48 -0
  137. data/lib/embeddable_content/engine.rb +8 -0
  138. data/lib/embeddable_content/version.rb +3 -0
  139. data/lib/embeddable_content.rb +3 -0
  140. data/lib/tasks/embeddable_content_tasks.rake +4 -0
  141. metadata +309 -0
@@ -0,0 +1,32 @@
1
+ module EmbeddableContent
2
+ class TokenReplacementMap
3
+ attr_reader :target_pattern_map
4
+
5
+ def initialize(target_pattern_map)
6
+ @target_pattern_map = target_pattern_map
7
+ end
8
+
9
+ def target_regexp_map
10
+ @target_regexp_map ||= build_target_regexp_map
11
+ end
12
+
13
+ private
14
+
15
+ def build_target_regexp_map
16
+ {}.tap do |regexp_map|
17
+ target_pattern_map.each do |target, pattern_replacement_map|
18
+ regexp_map[target] =
19
+ convert_patterns_to_regexps pattern_replacement_map
20
+ end
21
+ end
22
+ end
23
+
24
+ def convert_patterns_to_regexps(pattern_replacement_map)
25
+ {}.tap do |regexp_replacement_map|
26
+ pattern_replacement_map.each do |pattern, replacement|
27
+ regexp_replacement_map[Regexp.new(pattern)] = replacement
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ module EmbeddableContent
2
+ class TreeBasedNodeProcessor < EmbeddableContent::RecordNodeProcessor
3
+ EMBBEDER_TAG_TREE_ID_ATTRIBUTE = 'data-tree-ref-id'.freeze
4
+
5
+ private
6
+
7
+ def node_should_be_replaced?
8
+ super && tag_references_current_tree?
9
+ end
10
+
11
+ def tag_references_current_tree?
12
+ embedded_tag_tree_id == tree_embedder_tag_id
13
+ end
14
+
15
+ def embedded_tag_tree_id
16
+ node[EMBBEDER_TAG_TREE_ID_ATTRIBUTE]
17
+ end
18
+
19
+ def tree_embedder_tag_id
20
+ tree_node&.embedder_tag_id
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,5 @@
1
+ module EmbeddableContent
2
+ module VideoLinks
3
+ class DocProcessor < EmbeddableContent::DocProcessor; end
4
+ end
5
+ end
@@ -0,0 +1,46 @@
1
+ module EmbeddableContent
2
+ module VideoLinks
3
+ class NodeProcessor < EmbeddableContent::VisualElementNodeProcessor
4
+ include VimeoPlayerSettings
5
+
6
+ delegate :url, to: :record
7
+
8
+ def video_player
9
+ case url
10
+ when VIMEO_URL_REGEX then :vimeo_player
11
+ else raise "Unrecognized video player for URL: #{url}"
12
+ end
13
+ end
14
+
15
+ # TODO: make this a field on the embed
16
+ PLAYER_PRESENTATION_TARGETS =
17
+ %i[cc kiddom schoology cms exported qti web].freeze
18
+ DESCRIPTION_PRESENTATION_TARGETS = %i[editable print].freeze
19
+
20
+ def presentation
21
+ case target
22
+ when *PLAYER_PRESENTATION_TARGETS then :video_player
23
+ when *DESCRIPTION_PRESENTATION_TARGETS then :description
24
+ else raise "Undefined video presentation for target: #{target}"
25
+ end
26
+ end
27
+
28
+ # TODO: make this a field on the embed
29
+ CAPTIONED_TARGETS =
30
+ %i[cc kiddom schoology cms qti web].freeze
31
+ UNCAPTIONED_TARGETS = %i[editable exported print].freeze
32
+
33
+ def display_caption?
34
+ case target
35
+ when *CAPTIONED_TARGETS then true
36
+ when *UNCAPTIONED_TARGETS then false
37
+ else raise "Undefined caption status for target: #{target}"
38
+ end
39
+ end
40
+
41
+ def video_availability_text
42
+ "Video '#{title}' available here: #{url}."
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,19 @@
1
+ module EmbeddableContent
2
+ module VideoLinks
3
+ module VimeoPlayerSettings
4
+ VIMEO_URL_REGEX = %r{\Ahttps:\/\/player\.vimeo\.com\/video\/\d+\z}.freeze
5
+ DEFAULT_VIMEO_ATTRIBUTES = {
6
+ width: '640',
7
+ height: '360',
8
+ frameborder: '0',
9
+ allowfullscreen: 'true',
10
+ mozillaallowfullscreen: 'true',
11
+ safariallowfullscreen: 'true'
12
+ }.freeze
13
+
14
+ def vimeo_attributes
15
+ DEFAULT_VIMEO_ATTRIBUTES.merge src: url
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ module EmbeddableContent
2
+ class VisualElementNodeProcessor < RecordNodeProcessor
3
+ include TemplateBased
4
+
5
+ delegate :attribution, :description, :long_description, :title, :caption,
6
+ to: :record
7
+
8
+ MISSING_LABEL_TEXT = ''.freeze
9
+ def label_text
10
+ caption.presence || MISSING_LABEL_TEXT
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,5 @@
1
+ module EmbeddableContent
2
+ module WidgetFiles
3
+ class DocProcessor < EmbeddableContent::DocProcessor; end
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module EmbeddableContent
2
+ module WidgetFiles
3
+ class NodeProcessor < EmbeddableContent::RecordNodeProcessor
4
+ include TemplateBased
5
+ end
6
+ end
7
+ end
data/app/views/.keep ADDED
File without changes
@@ -0,0 +1,8 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_attrs = manager.node_attrs
4
+ record = manager.record
5
+ applet_attrs = node_attrs.merge 'data-state': record.state
6
+
7
+ div *applet_attrs
8
+ div.desmos-calculator
@@ -0,0 +1,6 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_attrs = manager.node_attrs
4
+
5
+ span.embedded-content-described *node_attrs
6
+ | Desmos applet is available in the digital version of the materials.
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/description'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/description'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/desmos_files/applet'
@@ -0,0 +1,11 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ node_attrs = manager.node_attrs
5
+ target_attrs = manager.target_attrs
6
+ record = manager.record
7
+ data_attrs = { 'data-parameters': node_processor.data_parameters }
8
+
9
+ div *node_attrs
10
+ div.ggb-base-64-data *data_attrs
11
+ div.ggb-applet-container *target_attrs
@@ -0,0 +1,9 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_attrs = manager.node_attrs
4
+ record = manager.record
5
+ title = record.title
6
+ applet_url = record.applet_url
7
+
8
+ span.embedded-content-described *node_attrs
9
+ | The Geogebra applet '#{title}' is available here: #{applet_url}.
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/description'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/description'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/applet'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/geogebra_files/applet'
@@ -0,0 +1,16 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_attrs = manager.node_attrs
4
+ node_processor = manager.node_processor
5
+ data_rows = node_processor.data_rows
6
+
7
+ div *node_attrs
8
+ table
9
+ tbody
10
+ - data_rows.each do |data_row|
11
+ tr
12
+ - data_row.each do |data_val|
13
+ td = data_val
14
+ p
15
+ p
16
+ br
@@ -0,0 +1,9 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ modal_dialog = node_processor.modal_dialog
5
+ close_button_attrs = modal_dialog.close_button_attrs
6
+
7
+ button.js-modal-close.im-c-modal__close
8
+ svg.im-c-icon.im-c-icon--close *close_button_attrs
9
+ path d = 'M1162.5,198.75,1001.25,37.5,600,438.75,198.75,37.5,37.5,198.75,438.75,600,37.5,1001.25,198.75,1162.5,600,761.25l401.25,401.25,161.25-161.25L761.25,600Z'
@@ -0,0 +1,9 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ modal_dialog = node_processor.modal_dialog
5
+ target_div_id = modal_dialog.target_div_id
6
+
7
+ button.im-c-button.im-c-modal-trigger data-modal-target = target_div_id
8
+ p
9
+ img src = asset_path('expand.png') alt='Expand image' title='Expand image'
@@ -0,0 +1,14 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_attrs = manager.node_attrs
4
+ node_processor = manager.node_processor
5
+ img_tag_attrs = node_processor.img_tag_attrs
6
+ figure_tag = node_processor.figure_tag
7
+ label_text = node_processor.label_text
8
+
9
+ *{ tag: figure_tag } *node_attrs
10
+ span.c-figure__label
11
+ == label_text
12
+ img *img_tag_attrs
13
+ = render 'embeddable_content/replacements/images/modal_dialog'
14
+ figcaption.c-figcaption
@@ -0,0 +1,30 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ modal_dialog = node_processor.modal_dialog
5
+ img_tag_attrs = modal_dialog.img_tag_attrs
6
+ description = modal_dialog.description
7
+ described_by_id = modal_dialog.described_by_id
8
+ caption = modal_dialog.caption
9
+ caption_id = modal_dialog.caption_id
10
+ attribution = modal_dialog.attribution
11
+ attribution_id = modal_dialog.attribution_id
12
+
13
+ div.im-c-modal__content.im-c-content
14
+ div id = described_by_id
15
+ - if description.present?
16
+ p
17
+ strong> Description:
18
+ = description
19
+ img *img_tag_attrs
20
+ - if caption.present?
21
+ p id = caption_id
22
+ strong> Caption:
23
+ == caption
24
+ - if attribution.present?
25
+ p id = attribution_id
26
+ strong> Attribution:
27
+ => modal_dialog.attribution_display_text
28
+ a href = attribution.original_url
29
+ | Source
30
+ | .
@@ -0,0 +1,17 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+
5
+ return unless node_processor.display_modal_dialog?
6
+
7
+ modal_dialog = node_processor.modal_dialog
8
+ container_attrs = modal_dialog.container_attrs
9
+ target_attrs = modal_dialog.target_attrs
10
+
11
+ span.embedded-modal-dialog
12
+ = render 'embeddable_content/replacements/images/button_open'
13
+ div.im-c-modal *target_attrs
14
+ div.js-modal-close.im-c-modal__overlay
15
+ div.im-c-modal__container *container_attrs
16
+ = render 'embeddable_content/replacements/images/button_close'
17
+ = render 'embeddable_content/replacements/images/modal_content'
@@ -0,0 +1,12 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ record = manager.record
5
+ caption = record.caption
6
+ img_tag_attrs = node_processor.img_tag_attrs
7
+
8
+ div
9
+ - if caption.present?
10
+ span.embedded-image-caption
11
+ == caption
12
+ img *img_tag_attrs
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/images/image_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/images/image_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/images/image_embed'
@@ -0,0 +1,12 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ record = manager.record
5
+ caption = record.caption
6
+ img_tag_attrs = node_processor.img_tag_attrs
7
+
8
+ div
9
+ - if caption.present?
10
+ span.embedded-image-caption
11
+ == caption
12
+ img *img_tag_attrs
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/images/image_embed'
@@ -0,0 +1,6 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ img_tag_attrs = node_processor.img_tag_attrs
5
+
6
+ img *img_tag_attrs
@@ -0,0 +1,12 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ record = manager.record
5
+ caption = record.caption
6
+ img_tag_attrs = node_processor.img_tag_attrs
7
+
8
+ div
9
+ img *img_tag_attrs
10
+ - if caption.present?
11
+ span.embedded-image-caption
12
+ == caption
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/images/image_embed'
@@ -0,0 +1,6 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_attrs = manager.node_attrs
4
+ node_processor = manager.node_processor
5
+
6
+ div *node_attrs
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/presentation_tags/default'
@@ -0,0 +1,12 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ error = manager.error
4
+ node = manager.node
5
+ backtrace_lines = manager.selected_backtrace_lines
6
+
7
+ div.embedded-content-warning
8
+ = "Unable to process #{node}"
9
+ span.embedded-content-error-backtrace
10
+ = error.message
11
+ = "\nBacktrace:\n"
12
+ = backtrace_lines
@@ -0,0 +1,13 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ title = node_processor.title
5
+ url = node_processor.url
6
+
7
+ | Video
8
+ em<>
9
+ = title
10
+ | available at
11
+ a< href = url
12
+ = url
13
+ | .
@@ -0,0 +1,12 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ title = node_processor.title
5
+ url = node_processor.url
6
+
7
+ span
8
+ | Video
9
+ =<> "'#{title}'"
10
+ | available here:
11
+ =< url
12
+ | .
@@ -0,0 +1,13 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ node_attrs = manager.node_attrs
5
+ presentation = node_processor.presentation
6
+
7
+ figure *node_attrs
8
+ span.c-figure__label
9
+ = node_processor.label_text
10
+ = render "embeddable_content/replacements/video_links/#{presentation}"
11
+ figcaption.c-figcaption
12
+ - if node_processor.display_caption?
13
+ = render 'embeddable_content/replacements/video_links/caption'
@@ -0,0 +1,6 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ video_player = node_processor.video_player
5
+
6
+ = render "embeddable_content/replacements/video_links/#{video_player}"
@@ -0,0 +1,6 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_processor = manager.node_processor
4
+ iframe_attrs = node_processor.vimeo_attributes
5
+
6
+ iframe *iframe_attrs
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/video_links/video_embed'
@@ -0,0 +1,8 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_attrs = manager.node_attrs
4
+ record = manager.record
5
+ widget_attrs = node_attrs.merge 'data-record-title': record.title
6
+
7
+ span.embedded-content-omitted *widget_attrs
8
+ | Applet appears here.
@@ -0,0 +1,13 @@
1
+ ruby:
2
+ manager = @template_manager
3
+ node_attrs = manager.node_attrs
4
+ record = manager.record
5
+ target_attrs = manager.target_attrs
6
+ node_id = manager.node_id
7
+ widget_attrs = node_attrs.merge 'data-record-title': record.title
8
+ script_body = record.interpolated_script_body node_id
9
+
10
+ div *widget_attrs
11
+ div.widget-target-node *target_attrs
12
+ script
13
+ == script_body
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_script'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_script'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_omitted'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_script'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_script'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_omitted'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_script'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_script'
@@ -0,0 +1 @@
1
+ = render 'embeddable_content/replacements/widget_files/widget_script'
data/bin/rails ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails gems
3
+ # installed from the root of your application.
4
+
5
+ ENGINE_ROOT = File.expand_path('..', __dir__)
6
+ ENGINE_PATH = File.expand_path('../lib/embeddable_content/engine', __dir__)
7
+ APP_PATH = File.expand_path('../spec/dummy/config/application', __dir__)
8
+
9
+ # Set up gems listed in the Gemfile.
10
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../Gemfile', __dir__)
11
+ require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
12
+
13
+ require "rails"
14
+ # Pick the frameworks you want:
15
+ require "active_model/railtie"
16
+ require "active_job/railtie"
17
+ require "active_record/railtie"
18
+ require "active_storage/engine"
19
+ require "action_controller/railtie"
20
+ require "action_mailer/railtie"
21
+ require "action_view/railtie"
22
+ require "action_cable/engine"
23
+ require "sprockets/railtie"
24
+ # require "rails/test_unit/railtie"
25
+ require 'rails/engine/commands'