devcenter-parser 2.3.0 → 2.5.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2b85742cc924ff6d0f7e6fe0bcfa49a2eb43277806ea4c0519d0de22a063d0a1
4
- data.tar.gz: 9fa98501c58e7e0de8f37362255310ef4bd69fc51474f286408b3de011c85d48
3
+ metadata.gz: c4c53f614ec9479adb0fb78be87cdd30515834c467d1451515ab13abe121f4ac
4
+ data.tar.gz: 055c8a01895dc7b4646feab0727e71506b3caa4a4b6a48ae61f8abf2bffdbd52
5
5
  SHA512:
6
- metadata.gz: a77a54bbc08a84bd8564223f018be4a289dbc00430afec9af0c2b02fcd910d9ce7ed9dde8e90b41aba420352d3f4a405c996f1789d4f71ae7cc3add127860cdb
7
- data.tar.gz: f9240f4cd342028a8ee388bae3ef4913623cbaf1c5e1c75ff27eb9fc0cb6e7e86ca9a01f62aaf9b69500caa7ccff867cb3088e172a9585d878853d62ca7cb97d
6
+ metadata.gz: 38d174aaf87c2b54b14b4b17ad9b4145a86b9eb276b1edcff4ab691aee8acb812adcf692c15365f6f6ca22997fb3807f016254c96191485bf780d3c6c62e3fe4
7
+ data.tar.gz: 6bf94117132dde0e04fa438cf1e0c9fb851ec89db9960b0ffb6db8e3dbd21d0d750cdb7713835c1c0df07657c23e2e1426d3facb892a5d7f10a60501f3cdd5a5
@@ -0,0 +1,11 @@
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # Please see the documentation for all configuration options:
4
+ # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5
+
6
+ version: 2
7
+ updates:
8
+ - package-ecosystem: "bundler"
9
+ directory: "/"
10
+ schedule:
11
+ interval: "weekly"
@@ -0,0 +1,25 @@
1
+ name: "Send data to Components Inventory"
2
+ on:
3
+ workflow_dispatch:
4
+ push:
5
+ branches:
6
+ - "main"
7
+ paths:
8
+ - ".heroku/components-inventory/*.json"
9
+ pull_request:
10
+ types:
11
+ - opened
12
+ - synchronize
13
+ paths:
14
+ - ".heroku/components-inventory/*.json"
15
+ jobs:
16
+ action:
17
+ runs-on: sfdc-hk-ubuntu-latest
18
+ steps:
19
+ - uses: actions/checkout@v3
20
+ - name: Send data to Components Inventory
21
+ uses: heroku/components-action@main
22
+ with:
23
+ COMPONENTS_GHA_APP_ID: ${{ secrets.COMPONENTS_GHA_APP_ID}}
24
+ COMPONENTS_GHA_APP_PRIVATE_KEY: ${{ secrets.COMPONENTS_GHA_APP_PRIVATE_KEY}}
25
+ COMPONENTS_GHA_JSON_TOKEN: ${{ secrets.COMPONENTS_GHA_JSON_TOKEN}}
data/.gitignore CHANGED
@@ -1 +1,2 @@
1
1
  pkg/
2
+ .DS_Store
@@ -0,0 +1,32 @@
1
+ {
2
+ "slug": "devcenter-parser",
3
+ "name": "DevCenter Parser",
4
+ "description": "Markdown parser used on Heroku Dev Center",
5
+ "language": "Ruby",
6
+ "lifecycle_status": "Production",
7
+ "pipeline_uuid": null,
8
+ "repository_url": "https://github.com/heroku/devcenter-parser",
9
+ "stack": "Platform",
10
+ "stack_type": "Service",
11
+ "documentation_url": "https://github.com/heroku/devcenter-parser",
12
+ "metrics_url": null,
13
+ "sox": false,
14
+ "soc2": false,
15
+ "customer_facing": false,
16
+ "pager_duty_service_code": null,
17
+ "component_tier": "4",
18
+ "github_actions": true,
19
+ "github_release": false,
20
+ "github_actions_ci_workflow": null,
21
+ "authentication": null,
22
+ "platform": null,
23
+ "team_name": "Marketing Web Ops",
24
+ "planned_maintenance_severity": null,
25
+ "gus_team": "https://gus.lightning.force.com/lightning/r/ADM_Scrum_Team__c/a00B000000Bbl1zIAB/view",
26
+ "pci_tier": "TBD",
27
+ "consumer_type": "N/A",
28
+ "content_cacheable": "N/A",
29
+ "blast_radius": "Internal",
30
+ "audit_findings_url": null,
31
+ "last_audit": null
32
+ }
data/CODEOWNERS ADDED
@@ -0,0 +1,6 @@
1
+ # Lines starting with '#' are comments.
2
+ # Each line is a file pattern followed by one or more owners.
3
+
4
+ # These owners will be the default owners for everything in the repo.
5
+ * @heroku/marketing-web-ops
6
+ * @heroku/front-end
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- devcenter-parser (2.3.0)
5
- nokogiri (>= 1.13.10)
4
+ devcenter-parser (2.5.1)
5
+ nokogiri (~> 1.16)
6
6
  redcarpet (= 3.6.0)
7
7
  sanitize (~> 6.0.2)
8
8
 
@@ -10,13 +10,13 @@ GEM
10
10
  remote: http://rubygems.org/
11
11
  specs:
12
12
  crass (1.0.6)
13
- mini_portile2 (2.8.4)
13
+ mini_portile2 (2.8.5)
14
14
  minitest (5.19.0)
15
- nokogiri (1.15.4)
15
+ nokogiri (1.16.2)
16
16
  mini_portile2 (~> 2.8.2)
17
17
  racc (~> 1.4)
18
- racc (1.7.1)
19
- rake (13.0.6)
18
+ racc (1.7.3)
19
+ rake (13.1.0)
20
20
  redcarpet (3.6.0)
21
21
  sanitize (6.0.2)
22
22
  crass (~> 1.0.2)
@@ -28,7 +28,7 @@ PLATFORMS
28
28
  DEPENDENCIES
29
29
  devcenter-parser!
30
30
  minitest (~> 5.19.0)
31
- rake
31
+ rake (~> 13.1.0)
32
32
 
33
33
  BUNDLED WITH
34
- 2.1.4
34
+ 2.5.6
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # devcenter-parser
1
+ # DevCenter Parser
2
2
 
3
3
  Markdown parser used by [Heroku Dev Center](https://devcenter.heroku.com).
4
4
 
@@ -16,10 +16,10 @@ Gem::Specification.new do |gem|
16
16
 
17
17
  gem.required_ruby_version = '>= 3.0.0'
18
18
 
19
- gem.add_runtime_dependency 'nokogiri', '>= 1.13.10'
19
+ gem.add_runtime_dependency 'nokogiri', '~> 1.16'
20
20
  gem.add_runtime_dependency 'redcarpet', '3.6.0'
21
21
  gem.add_runtime_dependency 'sanitize', '~> 6.0.2'
22
22
 
23
23
  gem.add_development_dependency 'minitest', '~> 5.19.0'
24
- gem.add_development_dependency 'rake'
24
+ gem.add_development_dependency 'rake', '~>13.1.0'
25
25
  end
@@ -47,11 +47,13 @@ module GitHubParser
47
47
 
48
48
  def self.special_blocks(doc)
49
49
  doc.css('blockquote>p:first').each do |node|
50
- if match = node.inner_html.match(/\A\W*(callout|warning|note)\W/)
50
+ if match = node.inner_html.match(/\A\W*(callout|warning|note)\W|\[\!(callout|warning|note)\]\W/i)
51
51
  node.parent.name = 'div'
52
- node.parent['class'] = match[1]
52
+ node.parent['class'] = match[1].downcase
53
53
 
54
- new_html = node.inner_html.gsub(/\A\W*(callout|warning|note)\W/, '')
54
+ # This expression is slightly different because we want to remove the newline (\n) in this swap, compared to the
55
+ # match above that doesn't care about the newline.
56
+ new_html = node.inner_html.gsub(/\A\s*(callout|warning|note)\s*|\[\!(callout|warning|note)\]\s*/i, '')
55
57
 
56
58
  # Assigning inner_html directly causes encoding issues in old libxml versions,
57
59
  # workaround from https://github.com/sparklemotion/nokogiri/issues/458#issuecomment-3136620
@@ -1,3 +1,3 @@
1
1
  module DevcenterParser
2
- VERSION = '2.3.0'.freeze
2
+ VERSION = '2.5.1'.freeze
3
3
  end
@@ -33,7 +33,7 @@ module DevcenterParser
33
33
  convert_to_article_links_all_relative_links_with_missing_initial_slashes(doc, options)
34
34
  html = doc.to_html(:encoding => 'utf-8')
35
35
  verify_raw_html(html)
36
- html
36
+ html
37
37
  end
38
38
 
39
39
  def self.normalize_markdown(markdown)
@@ -71,12 +71,12 @@ module DevcenterParser
71
71
  return @@sanitize_config if defined?(@@sanitize_config)
72
72
  frozen_config = Sanitize::Config::RELAXED
73
73
  config = Marshal.load(Marshal.dump(frozen_config))
74
- config[:attributes][:all] += %w{ id class style name width height border align data-next-message data-step-title }
74
+ config[:attributes][:all] += %w{ id class style name width height border align data-next-message data-step-title data-uuid data-type data-v }
75
75
  config[:attributes]['a'] += %w{ target }
76
76
  config[:elements] += %w{ div span hr tt }
77
77
 
78
78
  # embedded videos
79
- config[:attributes][:all] += %w{ value src type allowscriptaccess allowfullscreen webkitallowfullscreen mozallowfullscreen frameborder }
79
+ config[:attributes][:all] += %w{ value src type allowscriptaccess allowfullscreen webkitallowfullscreen mozallowfullscreen frameborder allow }
80
80
  config[:elements] += %w{ object param embed iframe }
81
81
  config[:add_attributes] = {
82
82
  'object' => {'allowscriptaccess' => 'never'},
@@ -121,9 +121,11 @@ module DevcenterParser
121
121
  def self.sanitize_node_with_invalid_src
122
122
  lambda do |env|
123
123
  return unless env[:node].attributes['src']
124
+ # convert youtube.com to youtube-nocookies.com
125
+ env[:node].attributes['src'].value = env[:node].attributes['src'].value.sub('youtube.com', 'youtube-nocookie.com')
124
126
  # disallow javascript in src for all attributes
125
127
  env[:node].unlink if env[:node].attributes['src'].value =~ /\Ajavascript:/i
126
- # allow iframes if they have src that is from vimeo
128
+ # allow iframes only if they have src that is from vimeo, YouTube (no-cookies version)
127
129
  env[:node].unlink if iframe?(env[:node]) && iframe_has_invalid_src?(env[:node])
128
130
  end
129
131
  end
@@ -60,9 +60,15 @@ describe 'DevcenterParser' do
60
60
  assert_parsing_result src, src
61
61
  end
62
62
 
63
- it 'removes youtube videos embedded from the with-cookies domain' do
64
- src = '<iframe width="560" height="315" src="https://www.youtube.com/embed/123456ABCDEF" frameborder="0" allowfullscreen=""></iframe>'
65
- assert_parsing_result src, ''
63
+ it 'allows embedding youtube videos from its no-cookies domain with allow attribute' do
64
+ src = '<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/123456ABCDEF" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>'
65
+ assert_parsing_result src, src
66
+ end
67
+
68
+ it 'converts youtube videos embedded from the with-cookies domain to the no-cookies domain' do
69
+ src = '<iframe width="560" height="315" src="https://www.youtube.com/embed/123456ABCDEF" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>'
70
+ src_result = '<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/123456ABCDEF" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen=""></iframe>'
71
+ assert_parsing_result src, src_result
66
72
  end
67
73
 
68
74
  it 'does not allow embedding vimeo videos when their do-no-track param is set to something different than true' do
@@ -75,6 +81,11 @@ describe 'DevcenterParser' do
75
81
  assert_parsing_result src, ''
76
82
  end
77
83
 
84
+ it 'allows embedding vidyard videos with data attributes' do
85
+ src = '<p><img style="width: 100%; margin: auto; display: block;" class="vidyard-player-embed" src="https://play.vidyard.com/123456ABCDEFG.jpg" data-uuid="123456ABCDEFG" data-v="4" data-type="inline"></p>'
86
+ assert_parsing_result src, src
87
+ end
88
+
78
89
  it 'allows images' do
79
90
  src = '<p><img src="http://nav.heroku.com/images/logos/logo.png" alt="image"></p>'
80
91
  assert_parsing_result src, src
@@ -408,6 +419,35 @@ HTML
408
419
  assert_parsing_result md, html
409
420
  end
410
421
 
422
+ it 'generates blockquotes for GitHub-style callouts in uppercase format' do
423
+ md = <<-MARKDOWN
424
+ > [!WARNING]
425
+ > This is a warning
426
+ MARKDOWN
427
+
428
+ expected = <<-HTML
429
+ <div class="warning">
430
+ <p>This is a warning</p>
431
+ </div>
432
+ HTML
433
+
434
+ assert_parsing_result md, expected
435
+ end
436
+
437
+ it 'generates blockquotes for GitHub-style callouts in lowercase format' do
438
+ md = <<-MARKDOWN
439
+ > [!warning]
440
+ > This is a warning
441
+ MARKDOWN
442
+
443
+ expected = <<-HTML
444
+ <div class="warning">
445
+ <p>This is a warning</p>
446
+ </div>
447
+ HTML
448
+
449
+ assert_parsing_result md, expected
450
+ end
411
451
 
412
452
  it 'generates separate blockquotes from blockquotes separated by empty lines' do
413
453
  md = <<-MARKDOWN
@@ -488,4 +528,8 @@ HTML
488
528
  assert DevcenterParser.to_html(md).include?("<#{header} id=\"#{id}\">"), "GitHub does not generate a #{header} with id #{id}"
489
529
  end
490
530
 
531
+ def assert_contains(md, contains)
532
+ assert DevcenterParser.to_html(md).include?(contains), "Failed when parsing #{md}\n.\n\nDid not contain: #{contains}\n\n"
533
+ end
534
+
491
535
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: devcenter-parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.0
4
+ version: 2.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Heroku
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-08-16 00:00:00.000000000 Z
11
+ date: 2024-03-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nokogiri
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 1.13.10
19
+ version: '1.16'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 1.13.10
26
+ version: '1.16'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: redcarpet
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: rake
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: 13.1.0
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: 13.1.0
83
83
  description: Parser for Heroku Dev Center's content
84
84
  email:
85
85
  - heroku-front-end@salesforce.com
@@ -87,7 +87,11 @@ executables: []
87
87
  extensions: []
88
88
  extra_rdoc_files: []
89
89
  files:
90
+ - ".github/dependabot.yml"
91
+ - ".github/workflows/sync_component_metadata.yml"
90
92
  - ".gitignore"
93
+ - ".heroku/components-inventory/devcenter-parser.json"
94
+ - CODEOWNERS
91
95
  - Gemfile
92
96
  - Gemfile.lock
93
97
  - LICENSE
@@ -118,7 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
122
  - !ruby/object:Gem::Version
119
123
  version: '0'
120
124
  requirements: []
121
- rubygems_version: 3.4.18
125
+ rubygems_version: 3.3.7
122
126
  signing_key:
123
127
  specification_version: 4
124
128
  summary: Parser for Heroku Dev Center's content