kramdown-rfc2629 1.4.19 → 1.5.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9d0ef4b91bf819df60d48b12c30be152eab6a987ba2d88a3572bde42e180925
4
- data.tar.gz: '09603840027889929894dfc79170f6f7d16a0e932cfe7b6dfc4d2d2501eb7f7d'
3
+ metadata.gz: 296e6b41d770f71cc7266daefdbef48425bd7b050ae3be467badabf1f2f8453d
4
+ data.tar.gz: 12ca2cd06a9d6911f4f4db728210909ccb23a44563c4ae8ac5beaaf044fb550e
5
5
  SHA512:
6
- metadata.gz: 35f806b212b3f6e321614752853dc73ed351f1119c208b7fd83cbd471e3d64e40145b3af19a999a2e2e403a1ff780c5b12baef21c6b44e7e4f4ed8e434610e17
7
- data.tar.gz: cb0ddd23e2ced4bda22a095d08926dbbaf6f12a8605faf53289a422c8e1bd2b9d5a9a01a350d88c5843c12ff0a0be4098425403507771d5ba526126bc130bb7d
6
+ metadata.gz: b8adf6c1c27f37b30468b6c593f3faa334adfba8953f99160ac842bfcc98bb7dde0ef02e36ea65450b9ea519ac46a200e5631c9a3bd5832296ef78b7aa18fb8a
7
+ data.tar.gz: ee84d6769775ea513fea5240bdf1d552f7a724213840363d76a0510a53d9cae8ae56dd2de342f6b1540f5e2c5f9fe085b53ad7e4ca9ccd15ee598798f7a2be65
data/bin/kdrfc CHANGED
@@ -1,127 +1,13 @@
1
1
  #!/usr/bin/env ruby -KU
2
- require 'uri'
3
- require 'net/http'
4
- require 'open3'
2
+ require 'kramdown-rfc/kdrfc-processor'
3
+ require 'optparse'
5
4
 
6
5
  # try to get this from gemspec.
7
6
  KDRFC_VERSION=Gem.loaded_specs["kramdown-rfc2629"].version rescue "unknown-version"
8
7
 
9
- KDRFC_PREPEND = [ENV["KDRFC_PREPEND"]].compact
10
-
11
- def v3_flag?
12
- $options.v3 ? ["--v3"] : []
13
- end
14
-
15
- def process_mkd(input, output)
16
- warn "* converting locally from markdown #{input} to xml #{output}" if $options.verbose
17
- o, s = Open3.capture2(*KDRFC_PREPEND, "kramdown-rfc2629", *v3_flag?, input)
18
- if s.success?
19
- File.open(output, "w") do |fo|
20
- fo.print(o)
21
- end
22
- warn "* #{output} written" if $options.verbose
23
- else
24
- warn "*** kramdown-rfc failed, status #{s.exitstatus}"
25
- exit 1
26
- end
27
- end
8
+ kdrfc = KramdownRFC::KDRFC.new
9
+ kdrfc.options.txt = true # default
28
10
 
29
- def run_idnits(txt_fn)
30
- unless system("idnits", txt_fn)
31
- warn "*** problem #$? running idnits"
32
- end
33
- end
34
-
35
- def process_xml(*args)
36
- if $options.remote
37
- process_xml_remotely(*args)
38
- else
39
- process_xml_locally(*args)
40
- end
41
- end
42
-
43
- def process_xml_locally(input, output, *flags)
44
- warn "* converting locally from xml #{input} to txt #{output}" if $options.verbose
45
- begin
46
- o, s = Open3.capture2(*KDRFC_PREPEND, "xml2rfc", *v3_flag?, *flags, input)
47
- puts o
48
- if s.success?
49
- warn "* #{output} written" if $options.verbose
50
- else
51
- warn "*** xml2rfc failed, status #{s.exitstatus} (possibly try with -r)"
52
- exit 1
53
- end
54
- rescue Errno::ENOENT
55
- warn "*** falling back to remote processing" if $options.verbose
56
- process_xml_remotely(input, output, *flags)
57
- end
58
- end
59
-
60
- XML2RFC_WEBSERVICE = ENV["KRAMDOWN_XML2RFC_WEBSERVICE"] ||
61
- 'http://xml2rfc.tools.ietf.org/cgi-bin/xml2rfc-dev.cgi'
62
-
63
- MODE_AS_FORMAT = {
64
- nil => { # v2
65
- "--text" => "txt/ascii",
66
- "--html" => "html/ascii",
67
- },
68
- true => { # v3
69
- "--text" => "txt/v3ascii",
70
- "--html" => "html/v3ascii",
71
- "--v2v3" => "v3xml/ascii",
72
- }
73
- }
74
-
75
- def process_xml_remotely(input, output, *flags)
76
- warn "* converting remotely from xml #{input} to txt #{output}" if $options.verbose
77
- format = flags[0] || "--text"
78
- # warn [:V3, $options.v3].inspect
79
- maf = MODE_AS_FORMAT[$options.v3][format]
80
- unless maf
81
- warn "*** don't know how to convert remotely from xml #{input} to txt #{output}"
82
- exit(1)
83
- end
84
- url = URI(XML2RFC_WEBSERVICE)
85
- req = Net::HTTP::Post.new(url)
86
- form = [["modeAsFormat", maf],
87
- ["type", "binary"],
88
- ["input", File.open(input),
89
- {filename: "input.xml",
90
- content_type: "text/plain"}]]
91
- diag = ["url/form: ", url, form].inspect
92
- req.set_form(form, 'multipart/form-data')
93
- res = Net::HTTP::start(url.hostname, url.port,
94
- :use_ssl => url.scheme == 'https' ) {|http|
95
- http.request(req)
96
- }
97
- case res
98
- when Net::HTTPOK
99
- case res.content_type
100
- when 'application/octet-stream'
101
- if res.body == ''
102
- warn "*** HTTP response is empty with status #{res.code}, not written"
103
- exit 1
104
- end
105
- File.open(output, "w") do |fo|
106
- fo.print(res.body)
107
- end
108
- warn "* #{output} written" if $options.verbose
109
- else
110
- warn "*** HTTP response has unexpected content_type #{res.content_type} with status #{res.code}, #{diag}"
111
- warn res.body
112
- exit 1
113
- end
114
- else
115
- warn "*** HTTP response: #{res.code}, #{diag}"
116
- exit 1
117
- end
118
- end
119
-
120
- require 'optparse'
121
- require 'ostruct'
122
-
123
- $options = OpenStruct.new
124
- $options.txt = true # default
125
11
  op = OptionParser.new do |opts|
126
12
  opts.banner = <<BANNER
127
13
  Usage: kdrfc [options] file.md|file.mkd|file.xml
@@ -136,63 +22,45 @@ BANNER
136
22
  exit
137
23
  end
138
24
  opts.on("-v", "--[no-]verbose", "Run verbosely") do |v|
139
- $options.verbose = v
25
+ kdrfc.options.verbose = v
140
26
  end
141
27
  opts.on("-r", "--[no-]remote", "Run xml2rfc remotely even if there is a local one") do |v|
142
- $options.remote = v
28
+ kdrfc.options.remote = v
143
29
  end
144
30
  opts.on("-x", "--[no-]xml", "Convert to xml only") do |v|
145
- $options.xml_only = v
31
+ kdrfc.options.xml_only = v
146
32
  end
147
33
  opts.on("-p", "--[no-]prep", "Convert xml to prepped xml") do |v|
148
- $options.prep = v
34
+ kdrfc.options.prep = v
149
35
  end
150
36
  opts.on("-P", "-f", "--[no-]pdf", "Convert xml to PDF") do |v|
151
- $options.pdf = v
37
+ kdrfc.options.pdf = v
152
38
  end
153
39
  opts.on("-c", "--[no-]convert", "Convert xml to v3 xml") do |v|
154
- $options.v2v3 = v
40
+ kdrfc.options.v2v3 = v
155
41
  end
156
42
  opts.on("-i", "--[no-]idnits", "Run idnits on the resulting text") do |v|
157
- $options.idnits = v
43
+ kdrfc.options.idnits = v
158
44
  end
159
45
  opts.on("-h", "--[no-]html", "Convert to html as well") do |v|
160
- $options.html = v
46
+ kdrfc.options.html = v
161
47
  end
162
48
  opts.on("-t", "--[no-]txt", "Convert to txt as well") do |v|
163
- $options.txt = v
49
+ kdrfc.options.txt = v
164
50
  end
165
51
  opts.on("-3", "--[no-]v3", "Use RFCXML v3 processing rules") do |v|
166
- $options.v3 = v
52
+ kdrfc.options.v3 = v
167
53
  end
168
54
  end
169
55
  op.parse!
170
56
 
171
- def process_the_xml(fn, base)
172
- process_xml(fn, "#{base}.prepped.xml", "--preptool") if $options.prep
173
- process_xml(fn, "#{base}.v2v3.xml", "--v2v3") if $options.v2v3
174
- process_xml(fn, "#{base}.txt") if $options.txt || $options.idnits
175
- process_xml(fn, "#{base}.html", "--html") if $options.html
176
- process_xml(fn, "#{base}.pdf", "--pdf") if $options.pdf
177
- run_idnits("#{base}.txt") if $options.idnits
178
- end
179
-
180
57
  case ARGV.size
181
58
  when 1
182
59
  fn = ARGV[0]
183
- case fn
184
- when /(.*)\.xml\z/
185
- if $options.xml_only
186
- warn "*** You already have XML"
187
- else # FIXME: copy/paste
188
- process_the_xml(fn, $1)
189
- end
190
- when /(.*)\.mk?d\z/
191
- xml = "#$1.xml"
192
- process_mkd(fn, xml)
193
- process_the_xml(xml, $1) unless $options.xml_only
194
- else
195
- warn "Unknown file type: #{fn}"
60
+ begin
61
+ kdrfc.process(fn)
62
+ rescue StandardError => e
63
+ warn e.to_s
196
64
  exit 1
197
65
  end
198
66
  else
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'kramdown-rfc2629'
3
- s.version = '1.4.19'
3
+ s.version = '1.5.1'
4
4
  s.summary = "Kramdown extension for generating RFC 7749 XML."
5
5
  s.description = %{An RFC7749 (XML2RFC) generating backend for Thomas Leitner's
6
6
  "kramdown" markdown parser. Mostly useful for RFC writers.}
@@ -0,0 +1,154 @@
1
+ require 'uri'
2
+ require 'net/http'
3
+ require 'open3'
4
+ require 'ostruct'
5
+
6
+ module KramdownRFC
7
+
8
+ class KDRFC
9
+
10
+ attr_reader :options
11
+
12
+ def initialize
13
+ @options = OpenStruct.new
14
+ end
15
+
16
+ # )))
17
+
18
+ KDRFC_PREPEND = [ENV["KDRFC_PREPEND"]].compact
19
+
20
+ def v3_flag?
21
+ @options.v3 ? ["--v3"] : []
22
+ end
23
+
24
+ def process_mkd(input, output)
25
+ warn "* converting locally from markdown #{input} to xml #{output}" if @options.verbose
26
+ o, s = Open3.capture2(*KDRFC_PREPEND, "kramdown-rfc2629", *v3_flag?, input)
27
+ if s.success?
28
+ File.open(output, "w") do |fo|
29
+ fo.print(o)
30
+ end
31
+ warn "* #{output} written" if @options.verbose
32
+ else
33
+ raise IOError.new("*** kramdown-rfc failed, status #{s.exitstatus}")
34
+ end
35
+ end
36
+
37
+ def run_idnits(txt_fn)
38
+ unless system("idnits", txt_fn)
39
+ warn "*** problem #$? running idnits"
40
+ end
41
+ end
42
+
43
+ def process_xml(*args)
44
+ if @options.remote
45
+ process_xml_remotely(*args)
46
+ else
47
+ process_xml_locally(*args)
48
+ end
49
+ end
50
+
51
+ def process_xml_locally(input, output, *flags)
52
+ warn "* converting locally from xml #{input} to txt #{output}" if @options.verbose
53
+ begin
54
+ o, s = Open3.capture2(*KDRFC_PREPEND, "xml2rfc", *v3_flag?, *flags, input)
55
+ puts o
56
+ if s.success?
57
+ warn "* #{output} written" if @options.verbose
58
+ else
59
+ raise IOError.new("*** xml2rfc failed, status #{s.exitstatus} (possibly try with -r)")
60
+ end
61
+ rescue Errno::ENOENT
62
+ warn "*** falling back to remote xml2rfc processing (web service)" # if @options.verbose
63
+ process_xml_remotely(input, output, *flags)
64
+ end
65
+ end
66
+
67
+ XML2RFC_WEBSERVICE = ENV["KRAMDOWN_XML2RFC_WEBSERVICE"] ||
68
+ 'http://xml2rfc.tools.ietf.org/cgi-bin/xml2rfc-dev.cgi'
69
+
70
+ MODE_AS_FORMAT = {
71
+ nil => { # v2
72
+ "--text" => "txt/ascii",
73
+ "--html" => "html/ascii",
74
+ },
75
+ true => { # v3
76
+ "--text" => "txt/v3ascii",
77
+ "--html" => "html/v3ascii",
78
+ "--v2v3" => "v3xml/ascii",
79
+ }
80
+ }
81
+
82
+ def process_xml_remotely(input, output, *flags)
83
+ warn "* converting remotely from xml #{input} to txt #{output}" if @options.verbose
84
+ format = flags[0] || "--text"
85
+ # warn [:V3, @options.v3].inspect
86
+ maf = MODE_AS_FORMAT[@options.v3][format]
87
+ unless maf
88
+ raise ArgumentError.new("*** don't know how to convert remotely from xml #{input} to txt #{output}")
89
+ end
90
+ url = URI(XML2RFC_WEBSERVICE)
91
+ req = Net::HTTP::Post.new(url)
92
+ form = [["modeAsFormat", maf],
93
+ ["type", "binary"],
94
+ ["input", File.open(input),
95
+ {filename: "input.xml",
96
+ content_type: "text/plain"}]]
97
+ diag = ["url/form: ", url, form].inspect
98
+ req.set_form(form, 'multipart/form-data')
99
+ res = Net::HTTP::start(url.hostname, url.port,
100
+ :use_ssl => url.scheme == 'https' ) {|http|
101
+ http.request(req)
102
+ }
103
+ case res
104
+ when Net::HTTPOK
105
+ case res.content_type
106
+ when 'application/octet-stream'
107
+ if res.body == ''
108
+ raise IOError.new("*** HTTP response is empty with status #{res.code}, not written")
109
+ end
110
+ File.open(output, "w") do |fo|
111
+ fo.print(res.body)
112
+ end
113
+ warn "* #{output} written" if @options.verbose
114
+ else
115
+ warning = "*** HTTP response has unexpected content_type #{res.content_type} with status #{res.code}, #{diag}"
116
+ warning << "\n"
117
+ warning << res.body
118
+ raise IOError.new(warning)
119
+ end
120
+ else
121
+ raise IOError.new("*** HTTP response: #{res.code}, #{diag}")
122
+ end
123
+ end
124
+
125
+ def process_the_xml(fn, base)
126
+ process_xml(fn, "#{base}.prepped.xml", "--preptool") if @options.prep
127
+ process_xml(fn, "#{base}.v2v3.xml", "--v2v3") if @options.v2v3
128
+ process_xml(fn, "#{base}.txt") if @options.txt || @options.idnits
129
+ process_xml(fn, "#{base}.html", "--html") if @options.html
130
+ process_xml(fn, "#{base}.pdf", "--pdf") if @options.pdf
131
+ run_idnits("#{base}.txt") if @options.idnits
132
+ end
133
+
134
+ def process(fn)
135
+ case fn
136
+ when /(.*)\.xml\z/
137
+ if @options.xml_only
138
+ warn "*** You already have XML"
139
+ else # FIXME: copy/paste
140
+ process_the_xml(fn, $1)
141
+ end
142
+ when /(.*)\.mk?d\z/
143
+ xml = "#$1.xml"
144
+ process_mkd(fn, xml)
145
+ process_the_xml(xml, $1) unless @options.xml_only
146
+ else
147
+ raise ArgumentError.new("Unknown file type: #{fn}")
148
+ end
149
+ end
150
+
151
+ # (((
152
+ end
153
+
154
+ end
@@ -53,6 +53,9 @@ module Kramdown
53
53
 
54
54
  def self.idref_cleanup(href)
55
55
  # can't start an IDREF with a number or reserved start
56
+ if href =~ / /
57
+ warn "** space(s) in cross-reference '#{href}' -- are you trying to use section references?"
58
+ end
56
59
  href.gsub(/\A(?:[0-9]|section-|u-|figure-|table-|iref-)/) { "_#{$&}" }
57
60
  end
58
61
 
@@ -1032,18 +1035,30 @@ COLORS
1032
1035
  # this would be more like xml2rfc v3:
1033
1036
  # "\n#{' '*indent}<cref>\n#{inner(el.value, indent, opts).rstrip}\n#{' '*indent}</cref>"
1034
1037
  content = inner(el.value, indent, opts).strip
1035
- content = escape_html(content.sub(/\A<t>(.*)<\/t>\z/m) {$1}, :text) # text only...
1038
+ content = content.sub(/\A<t>(.*)<\/t>\z/m) {$1}
1036
1039
  name = ::Kramdown::Parser::RFC2629Kramdown.idref_cleanup(el.options[:name])
1040
+ o_name = name.dup
1037
1041
  while @footnote_names_in_use[name] do
1038
- if name =~ /:\d+\z/
1042
+ if name =~ /_\d+\z/
1039
1043
  name.succ!
1040
1044
  else
1041
- name << ":1"
1045
+ name << "_1"
1042
1046
  end
1043
1047
  end
1044
1048
  @footnote_names_in_use[name] = true
1045
1049
  attrstring = el_html_attributes_with(el, {"anchor" => name})
1046
- "\n#{' '*indent}<cref#{attrstring}>#{content}</cref>"
1050
+ if $options.v3
1051
+ if o_name[-1] == "-"
1052
+ # Ignore HTML attributes. Hmm.
1053
+ content
1054
+ else
1055
+ # do not indent span-level so we can stick to previous word. Good?
1056
+ "<cref#{attrstring}>#{content}</cref>"
1057
+ end
1058
+ else
1059
+ content = escape_html(content, :text) # text only...
1060
+ "\n#{' '*indent}<cref#{attrstring}>#{content}</cref>"
1061
+ end
1047
1062
  end
1048
1063
 
1049
1064
  def convert_raw(el, indent, opts)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kramdown-rfc2629
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.19
4
+ version: 1.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Carsten Bormann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-03 00:00:00.000000000 Z
11
+ date: 2021-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kramdown
@@ -80,6 +80,7 @@ files:
80
80
  - kramdown-rfc2629.gemspec
81
81
  - lib/kramdown-rfc/erb.rb
82
82
  - lib/kramdown-rfc/gzip-clone.rb
83
+ - lib/kramdown-rfc/kdrfc-processor.rb
83
84
  - lib/kramdown-rfc/parameterset.rb
84
85
  - lib/kramdown-rfc/refxml.rb
85
86
  - lib/kramdown-rfc2629.rb
@@ -102,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
103
  - !ruby/object:Gem::Version
103
104
  version: '0'
104
105
  requirements: []
105
- rubygems_version: 3.2.15
106
+ rubygems_version: 3.2.22
106
107
  signing_key:
107
108
  specification_version: 4
108
109
  summary: Kramdown extension for generating RFC 7749 XML.