diff --git a/lib/draftjs_exporter/entities/attachmentlink.rb b/lib/draftjs_exporter/entities/attachmentlink.rb new file mode 100644 index 0000000..4b72bbf --- /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 #{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 new file mode 100644 index 0000000..c3fb414 --- /dev/null +++ b/lib/draftjs_exporter/entities/bonsailink.rb @@ -0,0 +1,30 @@ +# 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] + + 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) + + # Then append the element as a whole + parent_element.add_child(element) + element + end + end + end +end diff --git a/lib/draftjs_exporter/entities/image.rb b/lib/draftjs_exporter/entities/image.rb new file mode 100644 index 0000000..1b97b74 --- /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; cursor: default; max-width: 100%; height: auto;"}) + 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/link.rb b/lib/draftjs_exporter/entities/link.rb index 008f985..a6d55e9 100644 --- a/lib/draftjs_exporter/entities/link.rb +++ b/lib/draftjs_exporter/entities/link.rb @@ -9,8 +9,18 @@ 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? && !url.start_with?("mailto:") && !(%w{http https}.include?(URI.parse(URI.escape(url)).scheme)) + if url =~ URI::MailTo::EMAIL_REGEXP + url = "mailto:#{url}" + else + url = "https://#{url}" + end + end + + args = { href: 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) diff --git a/lib/draftjs_exporter/entities/table.rb b/lib/draftjs_exporter/entities/table.rb new file mode 100644 index 0000000..6d89570 --- /dev/null +++ b/lib/draftjs_exporter/entities/table.rb @@ -0,0 +1,42 @@ +# frozen_string_literal: true +module DraftjsExporter + module Entities + class Table + attr_reader :configuration + + 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 + + def call(parent_element, data) + tableData = data.fetch(:data, {}).fetch(:tableData, []) + args = {} + args[:class] = configuration.fetch(:className) if configuration[:className] + + wrapperArgs = {} + wrapperArgs[:class] = configuration.fetch(:wrapperClassName) if configuration[:wrapperClassName] + + # Create the wrapper