turndown 1.0.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 +7 -0
- data/CHANGELOG.md +38 -0
- data/LICENSE +81 -0
- data/README.md +264 -0
- data/lib/turndown/collapse_whitespace.rb +81 -0
- data/lib/turndown/commonmark_rules.rb +232 -0
- data/lib/turndown/converter.rb +136 -0
- data/lib/turndown/node.rb +245 -0
- data/lib/turndown/plugins/gfm.rb +170 -0
- data/lib/turndown/root_node.rb +43 -0
- data/lib/turndown/rule.rb +38 -0
- data/lib/turndown/rules.rb +53 -0
- data/lib/turndown/utilities.rb +102 -0
- data/lib/turndown/version.rb +5 -0
- data/lib/turndown.rb +20 -0
- metadata +75 -0
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Turndown
|
|
4
|
+
module Utilities
|
|
5
|
+
BLOCK_ELEMENTS = %w[
|
|
6
|
+
ADDRESS ARTICLE ASIDE AUDIO BLOCKQUOTE BODY CANVAS CENTER DD DIR DIV DL DT
|
|
7
|
+
FIELDSET FIGCAPTION FIGURE FOOTER FORM FRAMESET H1 H2 H3 H4 H5 H6 HEADER
|
|
8
|
+
HGROUP HR HTML ISINDEX LI MAIN MENU NAV NOFRAMES NOSCRIPT OL OUTPUT P PRE
|
|
9
|
+
SECTION TABLE TBODY TD TFOOT TH THEAD TR UL
|
|
10
|
+
].freeze
|
|
11
|
+
|
|
12
|
+
VOID_ELEMENTS = %w[
|
|
13
|
+
AREA BASE BR COL COMMAND EMBED HR IMG INPUT KEYGEN LINK META PARAM SOURCE
|
|
14
|
+
TRACK WBR
|
|
15
|
+
].freeze
|
|
16
|
+
|
|
17
|
+
MEANINGFUL_WHEN_BLANK_ELEMENTS = %w[
|
|
18
|
+
A TABLE THEAD TBODY TFOOT TH TD IFRAME SCRIPT AUDIO VIDEO
|
|
19
|
+
].freeze
|
|
20
|
+
|
|
21
|
+
module_function
|
|
22
|
+
|
|
23
|
+
def extend(destination, *sources)
|
|
24
|
+
sources.each do |source|
|
|
25
|
+
source.each do |key, value|
|
|
26
|
+
destination[key] = value
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
destination
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def repeat(character, count)
|
|
33
|
+
character * count
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def trim_leading_newlines(string)
|
|
37
|
+
string.sub(/\A\n+/, "")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def trim_trailing_newlines(string)
|
|
41
|
+
index_end = string.length
|
|
42
|
+
index_end -= 1 while index_end.positive? && string[index_end - 1] == "\n"
|
|
43
|
+
string[0, index_end]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def trim_newlines(string)
|
|
47
|
+
trim_trailing_newlines(trim_leading_newlines(string))
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def is_block?(node)
|
|
51
|
+
node_name_in?(node, BLOCK_ELEMENTS)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def is_void?(node)
|
|
55
|
+
node_name_in?(node, VOID_ELEMENTS)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def has_void?(node)
|
|
59
|
+
has_descendant_named?(node, VOID_ELEMENTS)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def is_meaningful_when_blank?(node)
|
|
63
|
+
node_name_in?(node, MEANINGFUL_WHEN_BLANK_ELEMENTS)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def has_meaningful_when_blank?(node)
|
|
67
|
+
has_descendant_named?(node, MEANINGFUL_WHEN_BLANK_ELEMENTS)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def escape_markdown(string)
|
|
71
|
+
string
|
|
72
|
+
.gsub(/\\/) { '\\' * 2 }
|
|
73
|
+
.gsub(/\*/) { '\*' }
|
|
74
|
+
.gsub(/\A-/) { '\-' }
|
|
75
|
+
.gsub(/\A\+ /) { '\+ ' }
|
|
76
|
+
.gsub(/\A(=+)/) { "\\#{$1}" }
|
|
77
|
+
.gsub(/\A(\#{1,6}) /) { "\\#{$1} " }
|
|
78
|
+
.gsub(/`/) { '\`' }
|
|
79
|
+
.gsub(/\A~~~/) { '\~~~' }
|
|
80
|
+
.gsub(/\[/) { '\[' }
|
|
81
|
+
.gsub(/\]/) { '\]' }
|
|
82
|
+
.gsub(/\A>/) { '\>' }
|
|
83
|
+
.gsub(/_/) { '\_' }
|
|
84
|
+
.gsub(/\A(\d+)\. /) { "#{$1}\\. " }
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def camel_to_snake(string)
|
|
88
|
+
string.gsub(/([A-Z])/, '_\1').downcase.sub(/\A_/, "")
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def node_name_in?(node, names)
|
|
92
|
+
node.respond_to?(:node_name) && names.include?(node.node_name)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def has_descendant_named?(node, names)
|
|
96
|
+
return false unless node.respond_to?(:css)
|
|
97
|
+
|
|
98
|
+
selector = names.map(&:downcase).join(",")
|
|
99
|
+
node.css(selector).any?
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
data/lib/turndown.rb
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Turndown converts HTML to Markdown.
|
|
4
|
+
#
|
|
5
|
+
# This is an unofficial Ruby port of Turndown by Dom Christie
|
|
6
|
+
# (https://github.com/mixmark-io/turndown), released under the MIT License.
|
|
7
|
+
# It is not affiliated with or endorsed by the upstream project.
|
|
8
|
+
|
|
9
|
+
require "nokogiri"
|
|
10
|
+
|
|
11
|
+
require_relative "turndown/version"
|
|
12
|
+
require_relative "turndown/utilities"
|
|
13
|
+
require_relative "turndown/rule"
|
|
14
|
+
require_relative "turndown/rules"
|
|
15
|
+
require_relative "turndown/node"
|
|
16
|
+
require_relative "turndown/collapse_whitespace"
|
|
17
|
+
require_relative "turndown/root_node"
|
|
18
|
+
require_relative "turndown/commonmark_rules"
|
|
19
|
+
require_relative "turndown/converter"
|
|
20
|
+
require_relative "turndown/plugins/gfm"
|
metadata
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: turndown
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Devran Cosmo Uenal
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: nokogiri
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '1.16'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '1.16'
|
|
26
|
+
description: A Nokogiri-backed Ruby port of Turndown and turndown-plugin-gfm, verified
|
|
27
|
+
against the upstream fixture corpus. Unofficial and not affiliated with the upstream
|
|
28
|
+
JavaScript project.
|
|
29
|
+
email:
|
|
30
|
+
- devran@bavmind.com
|
|
31
|
+
executables: []
|
|
32
|
+
extensions: []
|
|
33
|
+
extra_rdoc_files: []
|
|
34
|
+
files:
|
|
35
|
+
- CHANGELOG.md
|
|
36
|
+
- LICENSE
|
|
37
|
+
- README.md
|
|
38
|
+
- lib/turndown.rb
|
|
39
|
+
- lib/turndown/collapse_whitespace.rb
|
|
40
|
+
- lib/turndown/commonmark_rules.rb
|
|
41
|
+
- lib/turndown/converter.rb
|
|
42
|
+
- lib/turndown/node.rb
|
|
43
|
+
- lib/turndown/plugins/gfm.rb
|
|
44
|
+
- lib/turndown/root_node.rb
|
|
45
|
+
- lib/turndown/rule.rb
|
|
46
|
+
- lib/turndown/rules.rb
|
|
47
|
+
- lib/turndown/utilities.rb
|
|
48
|
+
- lib/turndown/version.rb
|
|
49
|
+
homepage: https://github.com/bavmind/turndown
|
|
50
|
+
licenses:
|
|
51
|
+
- MIT
|
|
52
|
+
metadata:
|
|
53
|
+
homepage_uri: https://github.com/bavmind/turndown
|
|
54
|
+
source_code_uri: https://github.com/bavmind/turndown/tree/v1.0.0
|
|
55
|
+
changelog_uri: https://github.com/bavmind/turndown/blob/main/CHANGELOG.md
|
|
56
|
+
bug_tracker_uri: https://github.com/bavmind/turndown/issues
|
|
57
|
+
rubygems_mfa_required: 'true'
|
|
58
|
+
rdoc_options: []
|
|
59
|
+
require_paths:
|
|
60
|
+
- lib
|
|
61
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
62
|
+
requirements:
|
|
63
|
+
- - ">="
|
|
64
|
+
- !ruby/object:Gem::Version
|
|
65
|
+
version: '3.3'
|
|
66
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
67
|
+
requirements:
|
|
68
|
+
- - ">="
|
|
69
|
+
- !ruby/object:Gem::Version
|
|
70
|
+
version: '0'
|
|
71
|
+
requirements: []
|
|
72
|
+
rubygems_version: 4.0.10
|
|
73
|
+
specification_version: 4
|
|
74
|
+
summary: Convert HTML to Markdown. An unofficial Ruby port of Turndown.
|
|
75
|
+
test_files: []
|