publishing_platform_markdown 0.1.0

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0bb1a117a2a6388ec14973e1cba25a4cf6e1f1199d2668dd21c0268e862d364f
4
+ data.tar.gz: 3bef4c6285959e89dffd519a6eb8e5aa6234277003aee5808ea3cf6873d32da0
5
+ SHA512:
6
+ metadata.gz: bb080a093077d16a38aee94cbd0e23f38482d32eff955ce11fd7eb0f647888200e9c87ece5fdf43ca110bcacdcae899a39ffabf97b7db0612d9610ac06618eec
7
+ data.tar.gz: e72f0a10ae62916c5df2ec63cab35adb917de86cca0fc4c1cd058ee2a9fca596b21370f0e34b15d8889aa7b2f9077b4d4c7991dd8394fbaab6fb07a9df19065c
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in publishing_platform_markdown.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+
10
+ gem "rspec", "~> 3.0"
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # Publishing Platform Markdown
2
+ Markdown extension library for the Publishing Platform.
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
@@ -0,0 +1,35 @@
1
+ class PublishingPlatformMarkdown::HtmlSanitizer
2
+ def initialize(dirty_html, options = {})
3
+ @dirty_html = dirty_html
4
+ end
5
+
6
+ def sanitize(allowed_elements: [])
7
+ Sanitize.fragment(@dirty_html, sanitize_config(allowed_elements:))
8
+ end
9
+
10
+ def sanitize_config(allowed_elements: [])
11
+ # We purposefully disable style elements which Sanitize::Config::RELAXED allows
12
+ elements = Sanitize::Config::RELAXED[:elements] - %w[style] +
13
+ %w[svg path].concat(allowed_elements)
14
+
15
+ Sanitize::Config.merge(
16
+ Sanitize::Config::RELAXED,
17
+ elements:,
18
+ attributes: {
19
+ # We purposefully disable style attributes which Sanitize::Config::RELAXED allows
20
+ :all => Sanitize::Config::RELAXED[:attributes][:all] + %w[role aria-label] - %w[style],
21
+ "a" => Sanitize::Config::RELAXED[:attributes]["a"] + [:data] + %w[draggable],
22
+ "svg" => %w[xmlns width height viewbox focusable],
23
+ "path" => %w[fill d],
24
+ "div" => [:data],
25
+ # The style attributes are permitted here just for the ones Kramdown for table alignment
26
+ # we replace them in a post processor.
27
+ "th" => Sanitize::Config::RELAXED[:attributes]["th"] + %w[style],
28
+ "td" => Sanitize::Config::RELAXED[:attributes]["td"] + %w[style],
29
+ },
30
+ # The only styling we permit is text-align on table cells (which is the CSS kramdown
31
+ # generates), we can therefore only allow this one CSS property
32
+ css: { properties: %w[text-align] },
33
+ )
34
+ end
35
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module PublishingPlatformMarkdown
4
+ VERSION = "0.1.0"
5
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support"
4
+ require "active_support/core_ext/hash"
5
+ require "active_support/core_ext/array"
6
+ require "kramdown"
7
+ require "sanitize"
8
+
9
+ require_relative "publishing_platform_markdown/version"
10
+ require_relative "publishing_platform_markdown/html_sanitizer"
11
+
12
+ module PublishingPlatformMarkdown
13
+ class Document
14
+ def self.to_html(source, options = {})
15
+ new(source, options).to_html
16
+ end
17
+
18
+ def initialize(source, options = {})
19
+ options = options.dup.deep_symbolize_keys
20
+ @source = source ? source.dup : ""
21
+
22
+ @allowed_elements = options.delete(:allowed_elements) || []
23
+ @options = { sanitize: true,
24
+ syntax_highlighter: nil }.merge(options)
25
+ end
26
+
27
+ def to_html
28
+ @to_html ||= if @options[:sanitize]
29
+ HtmlSanitizer.new(kramdown_doc.to_html)
30
+ .sanitize(allowed_elements: @allowed_elements)
31
+ else
32
+ kramdown_doc.to_html
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def kramdown_doc
39
+ @kramdown_doc ||= Kramdown::Document.new(@source, @options)
40
+ end
41
+ end
42
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: publishing_platform_markdown
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Publishing Platform
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2024-08-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: kramdown
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.3.1
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: 2.4.1
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 2.3.1
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: 2.4.1
33
+ - !ruby/object:Gem::Dependency
34
+ name: sanitize
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '6'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '6'
47
+ - !ruby/object:Gem::Dependency
48
+ name: publishing_platform_rubocop
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ description: Markup language for the Publishing Platform
62
+ email:
63
+ executables: []
64
+ extensions: []
65
+ extra_rdoc_files: []
66
+ files:
67
+ - Gemfile
68
+ - README.md
69
+ - Rakefile
70
+ - lib/publishing_platform_markdown.rb
71
+ - lib/publishing_platform_markdown/html_sanitizer.rb
72
+ - lib/publishing_platform_markdown/version.rb
73
+ homepage:
74
+ licenses:
75
+ - MIT
76
+ metadata: {}
77
+ post_install_message:
78
+ rdoc_options: []
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: '3.0'
86
+ required_rubygems_version: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ requirements: []
92
+ rubygems_version: 3.3.7
93
+ signing_key:
94
+ specification_version: 4
95
+ summary: Markup language for the Publishing Platform
96
+ test_files: []