From 74bec6ebcdeda59078296057a1f01ed99055712b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Mon, 6 Jul 2020 14:55:04 +0200 Subject: [PATCH 01/23] Include the link entity as well --- lib/draftjs_exporter/entity_state.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/draftjs_exporter/entity_state.rb b/lib/draftjs_exporter/entity_state.rb index 4d8dd12..39bf0a2 100644 --- a/lib/draftjs_exporter/entity_state.rb +++ b/lib/draftjs_exporter/entity_state.rb @@ -1,4 +1,5 @@ # frozen_string_literal: true +require 'draftjs_exporter/entities/link' require 'draftjs_exporter/entities/null' require 'draftjs_exporter/error' From 55fd20041ea202526f3c27b00bf7c9a32d47a6cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Wed, 8 Jul 2020 10:29:08 +0200 Subject: [PATCH 02/23] Added image and video entities --- lib/draftjs_exporter/entities/image.rb | 22 ++++++++++++++++++++++ lib/draftjs_exporter/entities/video.rb | 22 ++++++++++++++++++++++ lib/draftjs_exporter/entity_state.rb | 2 ++ 3 files changed, 46 insertions(+) create mode 100644 lib/draftjs_exporter/entities/image.rb create mode 100644 lib/draftjs_exporter/entities/video.rb diff --git a/lib/draftjs_exporter/entities/image.rb b/lib/draftjs_exporter/entities/image.rb new file mode 100644 index 0000000..39f6073 --- /dev/null +++ b/lib/draftjs_exporter/entities/image.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module DraftjsExporter + module Entities + class Image + attr_reader :configuration + + def initialize(configuration = { className: nil }) + # Default styles for images + @configuration = configuration.merge({style: "position: relative; width: 40%; cursor: default;"}) + end + + def call(parent_element, data) + args = { src: data.fetch(:data, {}).fetch(:src) } + args[:class] = configuration.fetch(:className) if configuration[:className] + + element = parent_element.document.create_element('img', args) + parent_element.add_child(element) + element + end + end + end +end diff --git a/lib/draftjs_exporter/entities/video.rb b/lib/draftjs_exporter/entities/video.rb new file mode 100644 index 0000000..af9ee3a --- /dev/null +++ b/lib/draftjs_exporter/entities/video.rb @@ -0,0 +1,22 @@ +# frozen_string_literal: true +module DraftjsExporter + module Entities + class Video + attr_reader :configuration + + def initialize(configuration = { className: nil }) + # Default styles for images + @configuration = configuration.merge({allowfullscreen: "", frameboder: "0"}) + end + + def call(parent_element, data) + args = { src: data.fetch(:data, {}).fetch(:src) } + args[:class] = configuration.fetch(:className) if configuration[:className] + + element = parent_element.document.create_element('iframe', args) + parent_element.add_child(element) + element + end + end + end +end diff --git a/lib/draftjs_exporter/entity_state.rb b/lib/draftjs_exporter/entity_state.rb index 39bf0a2..80f6819 100644 --- a/lib/draftjs_exporter/entity_state.rb +++ b/lib/draftjs_exporter/entity_state.rb @@ -1,5 +1,7 @@ # frozen_string_literal: true require 'draftjs_exporter/entities/link' +require 'draftjs_exporter/entities/image' +require 'draftjs_exporter/entities/video' require 'draftjs_exporter/entities/null' require 'draftjs_exporter/error' From 34236cc06506632153a21740141b755d7d1826a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Wed, 12 May 2021 11:09:15 +0200 Subject: [PATCH 03/23] Change the embed video code to check for youtube watch links and convert those to embed links --- lib/draftjs_exporter/entities/video.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/draftjs_exporter/entities/video.rb b/lib/draftjs_exporter/entities/video.rb index af9ee3a..068c37f 100644 --- a/lib/draftjs_exporter/entities/video.rb +++ b/lib/draftjs_exporter/entities/video.rb @@ -6,11 +6,18 @@ class Video def initialize(configuration = { className: nil }) # Default styles for images - @configuration = configuration.merge({allowfullscreen: "", frameboder: "0"}) + @configuration = configuration.merge({allowfullscreen: "1", frameboder: "0", allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"}) end def call(parent_element, data) - args = { src: data.fetch(:data, {}).fetch(:src) } + # Check for youtube links, and change watch to embed in order to embed correctly + src = data.fetch(:data, {}).fetch(:src) + if src && src.include? "https://www.youtube.com/watch" + video_id = src.split("=")[1] + src = "https://www.youtube.com/embed/#{video_id}" + end + + args = { src: src} args[:class] = configuration.fetch(:className) if configuration[:className] element = parent_element.document.create_element('iframe', args) From 17d25db718c4a5b36089e549a3c03f8c2c2e0f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Wed, 12 May 2021 21:18:36 +0200 Subject: [PATCH 04/23] Added brackets to check the include part on video src --- lib/draftjs_exporter/entities/video.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/video.rb b/lib/draftjs_exporter/entities/video.rb index 068c37f..ed2999f 100644 --- a/lib/draftjs_exporter/entities/video.rb +++ b/lib/draftjs_exporter/entities/video.rb @@ -12,7 +12,7 @@ def initialize(configuration = { className: nil }) def call(parent_element, data) # Check for youtube links, and change watch to embed in order to embed correctly src = data.fetch(:data, {}).fetch(:src) - if src && src.include? "https://www.youtube.com/watch" + if src && src.include?("https://www.youtube.com/watch") video_id = src.split("=")[1] src = "https://www.youtube.com/embed/#{video_id}" end From c1c80b5518e6bc7f9aaa99887f260b00622ae22b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Thu, 13 May 2021 09:08:01 +0200 Subject: [PATCH 05/23] Add the proper details for the iframe --- lib/draftjs_exporter/entities/video.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/video.rb b/lib/draftjs_exporter/entities/video.rb index ed2999f..91aea6c 100644 --- a/lib/draftjs_exporter/entities/video.rb +++ b/lib/draftjs_exporter/entities/video.rb @@ -6,7 +6,7 @@ class Video def initialize(configuration = { className: nil }) # Default styles for images - @configuration = configuration.merge({allowfullscreen: "1", frameboder: "0", allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"}) + @configuration = configuration.merge({allowfullscreen: "1", frameborder: "0", allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"}) end def call(parent_element, data) @@ -19,6 +19,9 @@ def call(parent_element, data) args = { src: src} args[:class] = configuration.fetch(:className) if configuration[:className] + args[:allowfullscreen] = configuration.fetch(:allowfullscreen) if configuration[:allowfullscreen] + args[:allow] = configuration.fetch(:allow) if configuration[:allow] + args[:frameborder] = configuration.fetch(:frameborder) if configuration[:frameborder] element = parent_element.document.create_element('iframe', args) parent_element.add_child(element) From da2f13a3e9392fbe173646777a320e039c887e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Tue, 26 Oct 2021 14:52:59 +0200 Subject: [PATCH 06/23] Change the default image CSS styles for exports --- lib/draftjs_exporter/entities/image.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/image.rb b/lib/draftjs_exporter/entities/image.rb index 39f6073..1b97b74 100644 --- a/lib/draftjs_exporter/entities/image.rb +++ b/lib/draftjs_exporter/entities/image.rb @@ -6,7 +6,7 @@ class Image def initialize(configuration = { className: nil }) # Default styles for images - @configuration = configuration.merge({style: "position: relative; width: 40%; cursor: default;"}) + @configuration = configuration.merge({style: "position: relative; cursor: default; max-width: 100%; height: auto;"}) end def call(parent_element, data) From cb9218f99bb476af68c609bf14798c7cd3c18429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Fri, 4 Mar 2022 16:33:10 +0100 Subject: [PATCH 07/23] Use target blank for links --- lib/draftjs_exporter/entities/link.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/draftjs_exporter/entities/link.rb b/lib/draftjs_exporter/entities/link.rb index 008f985..cfb5b3f 100644 --- a/lib/draftjs_exporter/entities/link.rb +++ b/lib/draftjs_exporter/entities/link.rb @@ -11,6 +11,7 @@ def initialize(configuration = { className: nil }) def call(parent_element, data) args = { href: data.fetch(:data, {}).fetch(:url) } args[:class] = configuration.fetch(:className) if configuration[:className] + args[:target] = "_blank" element = parent_element.document.create_element('a', args) parent_element.add_child(element) From 07f397d65afdbf9d49ed14f4eee49543fe95eb4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Tue, 29 Mar 2022 22:39:23 +0200 Subject: [PATCH 08/23] Added bonsailink as a new entity we handle when creating the HTML --- lib/draftjs_exporter/entities/bonsailink.rb | 29 +++++++++++++++++++++ lib/draftjs_exporter/entity_state.rb | 1 + 2 files changed, 30 insertions(+) create mode 100644 lib/draftjs_exporter/entities/bonsailink.rb diff --git a/lib/draftjs_exporter/entities/bonsailink.rb b/lib/draftjs_exporter/entities/bonsailink.rb new file mode 100644 index 0000000..983d5be --- /dev/null +++ b/lib/draftjs_exporter/entities/bonsailink.rb @@ -0,0 +1,29 @@ +# frozen_string_literal: true +module DraftjsExporter + module Entities + class Bonsailink + attr_reader :configuration + + def initialize(configuration = { className: nil }) + @configuration = configuration + end + + def call(parent_element, data) + # TODO add more detail about the link(s) and icons + args = { href: data.fetch(:data, {}).fetch(:url) } + args[:class] = configuration.fetch(:className) if configuration[:className] + args[:target] = "_blank" + + element = parent_element.document.create_element('a', args) + # Add the icon part, depending on the article or + style = data.fetch(:data, {}).fetch(:article_id) ? "bonsai-content-article" : "bonsai-content-category" + icon_args = {} + icon_element = element.document.create_element('span', icon_args) + element.add_child(icon_element) + + parent_element.add_child(element) + element + end + end + end +end diff --git a/lib/draftjs_exporter/entity_state.rb b/lib/draftjs_exporter/entity_state.rb index 80f6819..2832822 100644 --- a/lib/draftjs_exporter/entity_state.rb +++ b/lib/draftjs_exporter/entity_state.rb @@ -1,5 +1,6 @@ # frozen_string_literal: true require 'draftjs_exporter/entities/link' +require 'draftjs_exporter/entities/bonsailink' require 'draftjs_exporter/entities/image' require 'draftjs_exporter/entities/video' require 'draftjs_exporter/entities/null' From 70d9edf44e4825d6eff07ed20cc638e9e0d7f2da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Tue, 29 Mar 2022 22:46:36 +0200 Subject: [PATCH 09/23] Use a more defensive programming to default with fetch --- lib/draftjs_exporter/entities/bonsailink.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/bonsailink.rb b/lib/draftjs_exporter/entities/bonsailink.rb index 983d5be..9815704 100644 --- a/lib/draftjs_exporter/entities/bonsailink.rb +++ b/lib/draftjs_exporter/entities/bonsailink.rb @@ -16,7 +16,7 @@ def call(parent_element, data) element = parent_element.document.create_element('a', args) # Add the icon part, depending on the article or - style = data.fetch(:data, {}).fetch(:article_id) ? "bonsai-content-article" : "bonsai-content-category" + style = data.fetch(:data, {}).fetch(:article_id, nil) ? "bonsai-content-article" : "bonsai-content-category" icon_args = {} icon_element = element.document.create_element('span', icon_args) element.add_child(icon_element) From 1123f720e471adefe67e2ff88d92157f5285ed4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Tue, 29 Mar 2022 22:50:01 +0200 Subject: [PATCH 10/23] Apply the icon styling on FAQ generated HTMLs --- lib/draftjs_exporter/entities/bonsailink.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/bonsailink.rb b/lib/draftjs_exporter/entities/bonsailink.rb index 9815704..958ec86 100644 --- a/lib/draftjs_exporter/entities/bonsailink.rb +++ b/lib/draftjs_exporter/entities/bonsailink.rb @@ -17,7 +17,7 @@ def call(parent_element, data) element = parent_element.document.create_element('a', args) # Add the icon part, depending on the article or style = data.fetch(:data, {}).fetch(:article_id, nil) ? "bonsai-content-article" : "bonsai-content-category" - icon_args = {} + icon_args = {class: style} icon_element = element.document.create_element('span', icon_args) element.add_child(icon_element) From 46cfd9c9acaff2ed5bbbccd465e29cf37dd79293 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Wed, 30 Mar 2022 11:05:28 +0200 Subject: [PATCH 11/23] Apply the class on the span differently --- lib/draftjs_exporter/entities/bonsailink.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/bonsailink.rb b/lib/draftjs_exporter/entities/bonsailink.rb index 958ec86..19db55b 100644 --- a/lib/draftjs_exporter/entities/bonsailink.rb +++ b/lib/draftjs_exporter/entities/bonsailink.rb @@ -17,10 +17,12 @@ def call(parent_element, data) element = parent_element.document.create_element('a', args) # Add the icon part, depending on the article or style = data.fetch(:data, {}).fetch(:article_id, nil) ? "bonsai-content-article" : "bonsai-content-category" - icon_args = {class: style} + icon_args = {} + icon_args[:class] = style icon_element = element.document.create_element('span', icon_args) element.add_child(icon_element) + # Then append the element as a whole parent_element.add_child(element) element end From c02a7501243de6dea522be70ef9e4460dbcb31d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Thu, 7 Apr 2022 17:37:28 +0200 Subject: [PATCH 12/23] Added attachment link as an entity to the parser. --- .../entities/attachmentlink.rb | 31 +++++++++++++++++++ lib/draftjs_exporter/entities/bonsailink.rb | 1 - lib/draftjs_exporter/entity_state.rb | 1 + 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 lib/draftjs_exporter/entities/attachmentlink.rb diff --git a/lib/draftjs_exporter/entities/attachmentlink.rb b/lib/draftjs_exporter/entities/attachmentlink.rb new file mode 100644 index 0000000..0be66c4 --- /dev/null +++ b/lib/draftjs_exporter/entities/attachmentlink.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true +module DraftjsExporter + module Entities + class AttachmentLink + attr_reader :configuration + + def initialize(configuration = { className: nil }) + @configuration = configuration + end + + def call(parent_element, data) + # TODO add more detail about the link(s) and icons + args = { href: data.fetch(:data, {}).fetch(:url) } + args[:class] = configuration.fetch(:className) if configuration[:className] + args[:target] = "_blank" + + element = parent_element.document.create_element('a', args) + # Add the icon part, depending on the article or + extension = data.fetch(:data, {}).fetch(:fileExtension, nil) + icon_args = {} + icon_args[:class] = extension + icon_element = element.document.create_element('span', extension, icon_args) + element.add_child(icon_element) + + # Then append the element as a whole + parent_element.add_child(element) + element + end + end + end +end diff --git a/lib/draftjs_exporter/entities/bonsailink.rb b/lib/draftjs_exporter/entities/bonsailink.rb index 19db55b..c3fb414 100644 --- a/lib/draftjs_exporter/entities/bonsailink.rb +++ b/lib/draftjs_exporter/entities/bonsailink.rb @@ -12,7 +12,6 @@ def call(parent_element, data) # TODO add more detail about the link(s) and icons args = { href: data.fetch(:data, {}).fetch(:url) } args[:class] = configuration.fetch(:className) if configuration[:className] - args[:target] = "_blank" element = parent_element.document.create_element('a', args) # Add the icon part, depending on the article or diff --git a/lib/draftjs_exporter/entity_state.rb b/lib/draftjs_exporter/entity_state.rb index 2832822..287cdf9 100644 --- a/lib/draftjs_exporter/entity_state.rb +++ b/lib/draftjs_exporter/entity_state.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require 'draftjs_exporter/entities/link' require 'draftjs_exporter/entities/bonsailink' +require 'draftjs_exporter/entities/attachmentlink' require 'draftjs_exporter/entities/image' require 'draftjs_exporter/entities/video' require 'draftjs_exporter/entities/null' From 23b7f4df44d5399e600658adb88620439d52b25a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Fri, 8 Apr 2022 19:37:34 +0200 Subject: [PATCH 13/23] USe the extension class as well on the generated html link --- lib/draftjs_exporter/entities/attachmentlink.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/attachmentlink.rb b/lib/draftjs_exporter/entities/attachmentlink.rb index 0be66c4..4b72bbf 100644 --- a/lib/draftjs_exporter/entities/attachmentlink.rb +++ b/lib/draftjs_exporter/entities/attachmentlink.rb @@ -18,7 +18,7 @@ def call(parent_element, data) # Add the icon part, depending on the article or extension = data.fetch(:data, {}).fetch(:fileExtension, nil) icon_args = {} - icon_args[:class] = extension + icon_args[:class] = "extension #{extension}" icon_element = element.document.create_element('span', extension, icon_args) element.add_child(icon_element) From d56c2ad47b97990ee54c415a98ad5be2a5f57703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Thu, 19 May 2022 15:04:04 +0200 Subject: [PATCH 14/23] Adding the table generator for draft.js --- lib/draftjs_exporter/entities/table.rb | 35 ++++++++++++++++++++++++++ lib/draftjs_exporter/entity_state.rb | 1 + 2 files changed, 36 insertions(+) create mode 100644 lib/draftjs_exporter/entities/table.rb diff --git a/lib/draftjs_exporter/entities/table.rb b/lib/draftjs_exporter/entities/table.rb new file mode 100644 index 0000000..4994a9d --- /dev/null +++ b/lib/draftjs_exporter/entities/table.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true +module DraftjsExporter + module Entities + class Table + attr_reader :configuration + + def initialize(configuration = { className: nil }) + # Default styles for images + @configuration = configuration.merge({style: "position: relative; cursor: default; max-width: 100%; height: auto;"}) + end + + def call(parent_element, data) + tableData = data.fetch(:data, {}) + args = {} + args[:class] = configuration.fetch(:className) if configuration[:className] + + tableElement = parent_element.document.create_element('table', args) + # Now, we need to add the rows and columns + tableData.each do |row| + trElement = parent_element.document.create_element('tr') + row.each do |cell| + # Add in the content, if styled, then apply styles + cellContent = cell + tdElement = parent_element.document.create_element('td', cellContent) + trElement.add_child(tdElement) + end + tableElement.add_child(trElement) + end + + parent_element.add_child(tableElement) + element + end + end + end +end diff --git a/lib/draftjs_exporter/entity_state.rb b/lib/draftjs_exporter/entity_state.rb index 287cdf9..2138993 100644 --- a/lib/draftjs_exporter/entity_state.rb +++ b/lib/draftjs_exporter/entity_state.rb @@ -5,6 +5,7 @@ require 'draftjs_exporter/entities/image' require 'draftjs_exporter/entities/video' require 'draftjs_exporter/entities/null' +require 'draftjs_exporter/entities/table' require 'draftjs_exporter/error' module DraftjsExporter From dd95ce8abbf2dc3c99024d63be7531ed3aa2224c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Thu, 19 May 2022 15:07:29 +0200 Subject: [PATCH 15/23] Return the correct element data. --- lib/draftjs_exporter/entities/table.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/table.rb b/lib/draftjs_exporter/entities/table.rb index 4994a9d..e6e77b6 100644 --- a/lib/draftjs_exporter/entities/table.rb +++ b/lib/draftjs_exporter/entities/table.rb @@ -28,7 +28,7 @@ def call(parent_element, data) end parent_element.add_child(tableElement) - element + tableElement end end end From f39456c05bcf0ac218a11af6c6307ad7563dc9a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Thu, 19 May 2022 15:12:17 +0200 Subject: [PATCH 16/23] Use the tableData element from the data attributes on TABLE --- lib/draftjs_exporter/entities/table.rb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/draftjs_exporter/entities/table.rb b/lib/draftjs_exporter/entities/table.rb index e6e77b6..410dc59 100644 --- a/lib/draftjs_exporter/entities/table.rb +++ b/lib/draftjs_exporter/entities/table.rb @@ -10,18 +10,20 @@ def initialize(configuration = { className: nil }) end def call(parent_element, data) - tableData = data.fetch(:data, {}) + tableData = data.fetch(:data, {}).fetch(:tableData, []) args = {} args[:class] = configuration.fetch(:className) if configuration[:className] + # Create the main tableElement = parent_element.document.create_element('table', args) # Now, we need to add the rows and columns tableData.each do |row| - trElement = parent_element.document.create_element('tr') + # Create a for each row + trElement = tableElement.document.create_element('tr') row.each do |cell| # Add in the content, if styled, then apply styles cellContent = cell - tdElement = parent_element.document.create_element('td', cellContent) + tdElement = trElement.document.create_element('td', cellContent) trElement.add_child(tdElement) end tableElement.add_child(trElement) From de8e6a9e87cb21beceb74057c406ad802677ac13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Thu, 26 May 2022 14:34:09 +0200 Subject: [PATCH 17/23] Adding a wrapper div around the table component --- lib/draftjs_exporter/entities/table.rb | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/draftjs_exporter/entities/table.rb b/lib/draftjs_exporter/entities/table.rb index 410dc59..6d89570 100644 --- a/lib/draftjs_exporter/entities/table.rb +++ b/lib/draftjs_exporter/entities/table.rb @@ -4,7 +4,7 @@ module Entities class Table attr_reader :configuration - def initialize(configuration = { className: nil }) + def initialize(configuration = { className: nil, wrapperClassName: nil }) # Default styles for images @configuration = configuration.merge({style: "position: relative; cursor: default; max-width: 100%; height: auto;"}) end @@ -14,8 +14,13 @@ def call(parent_element, data) args = {} args[:class] = configuration.fetch(:className) if configuration[:className] + wrapperArgs = {} + wrapperArgs[:class] = configuration.fetch(:wrapperClassName) if configuration[:wrapperClassName] + + # Create the wrapper
+ wrapperElement = parent_element.document.create_element('div', wrapperArgs) # Create the main
- tableElement = parent_element.document.create_element('table', args) + tableElement = wrapperElement.document.create_element('table', args) # Now, we need to add the rows and columns tableData.each do |row| # Create a for each row @@ -28,9 +33,9 @@ def call(parent_element, data) end tableElement.add_child(trElement) end - - parent_element.add_child(tableElement) - tableElement + wrapperElement.add_child(tableElement) + parent_element.add_child(wrapperElement) + wrapperElement end end end From d4d3ac851389dd044b0e63b9157f4c05ee248c93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Wed, 6 Jul 2022 10:17:19 +0200 Subject: [PATCH 18/23] Defensive programming in case the parsing finds an empty NIL value as text -> fall back to empty string. --- lib/draftjs_exporter/html.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/html.rb b/lib/draftjs_exporter/html.rb index 9a05065..f061db6 100644 --- a/lib/draftjs_exporter/html.rb +++ b/lib/draftjs_exporter/html.rb @@ -37,7 +37,7 @@ def block_contents(element, block, entity_map) style_state.apply(command) end - add_node(entity_state.current_parent, text, style_state) + add_node(entity_state.current_parent, text || "", style_state) end end From 00dbebc0ea898d4f700afd9eaca75b98faef7b5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Fri, 14 Oct 2022 11:32:43 +0200 Subject: [PATCH 19/23] Add HTTPS scheme if not present on a link --- lib/draftjs_exporter/entities/link.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/link.rb b/lib/draftjs_exporter/entities/link.rb index cfb5b3f..e2dd400 100644 --- a/lib/draftjs_exporter/entities/link.rb +++ b/lib/draftjs_exporter/entities/link.rb @@ -9,7 +9,12 @@ def initialize(configuration = { className: nil }) end def call(parent_element, data) - args = { href: data.fetch(:data, {}).fetch(:url) } + url = data.fetch(:data, {}).fetch(:url) + if url.present? && !(%w{http https}.include?(URI.parse(url).scheme)) + url = 'https://'.concat(url) + end + + args = { href: url } args[:class] = configuration.fetch(:className) if configuration[:className] args[:target] = "_blank" From ed5b463f005942d3dcab60e46bf76ced8ad5f6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Fri, 14 Oct 2022 12:09:33 +0200 Subject: [PATCH 20/23] Use string interpolation instead --- lib/draftjs_exporter/entities/link.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/link.rb b/lib/draftjs_exporter/entities/link.rb index e2dd400..6ca9b04 100644 --- a/lib/draftjs_exporter/entities/link.rb +++ b/lib/draftjs_exporter/entities/link.rb @@ -11,7 +11,7 @@ def initialize(configuration = { className: nil }) def call(parent_element, data) url = data.fetch(:data, {}).fetch(:url) if url.present? && !(%w{http https}.include?(URI.parse(url).scheme)) - url = 'https://'.concat(url) + url = "https://#{url}" end args = { href: url } From 12c60e1f8cfd5d6d67a75eb07504507eb86a548f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Fri, 14 Oct 2022 13:18:00 +0200 Subject: [PATCH 21/23] Do not add https for mailto addresses --- lib/draftjs_exporter/entities/link.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/link.rb b/lib/draftjs_exporter/entities/link.rb index 6ca9b04..45e1dff 100644 --- a/lib/draftjs_exporter/entities/link.rb +++ b/lib/draftjs_exporter/entities/link.rb @@ -10,7 +10,7 @@ def initialize(configuration = { className: nil }) def call(parent_element, data) url = data.fetch(:data, {}).fetch(:url) - if url.present? && !(%w{http https}.include?(URI.parse(url).scheme)) + if url.present? && !url.start_with?("mailto:") && !(%w{http https}.include?(URI.parse(url).scheme)) url = "https://#{url}" end From 0707ecd588b4ebcd2324168b33682ea17b75a9ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Mon, 17 Oct 2022 20:50:22 +0200 Subject: [PATCH 22/23] Recognise email addresses without the mailto bit, prepend in order to open the link correctly --- lib/draftjs_exporter/entities/link.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/link.rb b/lib/draftjs_exporter/entities/link.rb index 45e1dff..d7988e1 100644 --- a/lib/draftjs_exporter/entities/link.rb +++ b/lib/draftjs_exporter/entities/link.rb @@ -11,7 +11,11 @@ def initialize(configuration = { className: nil }) def call(parent_element, data) url = data.fetch(:data, {}).fetch(:url) if url.present? && !url.start_with?("mailto:") && !(%w{http https}.include?(URI.parse(url).scheme)) - url = "https://#{url}" + if url =~ URI::MailTo::EMAIL_REGEXP + url = "mailto:#{url}" + else + url = "https://#{url}" + end end args = { href: url } From e6dd383a30d340e18a4ff129e89cd38a676aff4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1t=C3=A9=20Marjai?= Date: Tue, 1 Nov 2022 13:33:38 +0100 Subject: [PATCH 23/23] Escape the URI when it comes to parsing it and turning it into HTML --- lib/draftjs_exporter/entities/link.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/draftjs_exporter/entities/link.rb b/lib/draftjs_exporter/entities/link.rb index d7988e1..a6d55e9 100644 --- a/lib/draftjs_exporter/entities/link.rb +++ b/lib/draftjs_exporter/entities/link.rb @@ -10,7 +10,7 @@ def initialize(configuration = { className: nil }) def call(parent_element, data) url = data.fetch(:data, {}).fetch(:url) - if url.present? && !url.start_with?("mailto:") && !(%w{http https}.include?(URI.parse(url).scheme)) + if url.present? && !url.start_with?("mailto:") && !(%w{http https}.include?(URI.parse(URI.escape(url)).scheme)) if url =~ URI::MailTo::EMAIL_REGEXP url = "mailto:#{url}" else