kramdown-rfc2629 1.4.2 → 1.4.7

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: fec107f9381d395a6a6000d553ed820c673ed113d4d7f652f16dfef98aebda64
4
- data.tar.gz: 01ccac9bef6597540b689ae5a31600509d18adb489d56dc833940626397df7b0
3
+ metadata.gz: 92b7379a1d7172926d1d84ccdc5c816821a0c62c838b597dbc4e92cac91cff0d
4
+ data.tar.gz: b501c48e3ff1bddaca7abec20125dc360de97f67076341d2b9812a3913cbf314
5
5
  SHA512:
6
- metadata.gz: d926cdd5b45667c0e70bf6c00485795e97993b64f022199443a03c48ad3edca2078657274302dd93ed657bff0fd1d703dfe951981bfdb3d81ac4c86c033ef759
7
- data.tar.gz: 21c2a803dd8203d23f0633e0ac9d254b857c4e84af378f63ae1160d48612d58b556b425c26f83e6fe211315d1e2ee3e9b520bab33fa5ecb3bfcdd33e10dddd1f
6
+ metadata.gz: 3ae6bd5ad655d1300c426b06b00c92a7f56c15636b990d3d0ee02e2cc2a0481a7900d002e6076baa467aa2b3dc309719bedff0fd9e85912f083e85b0a9ef332c
7
+ data.tar.gz: c5cce63d97840efc638bd14240f6652955bb291c46cc038426bb8209c2b65725c14ee3db850954e8ba1bf5f23781f44d388c5d9984be38a4a0f55e63eaef6b1f
data/README.md CHANGED
@@ -616,7 +616,7 @@ Other human-oriented markup input languages that are being used for authoring RF
616
616
  Since kramdown version 1.0, kramdown itself is MIT licensed, which
617
617
  made it possible to license kramdown-rfc2629 under the same license.
618
618
 
619
- [kramdown]: http://kramdown.rubyforge.org/
619
+ [kramdown]: https://kramdown.gettalong.org
620
620
  [kdsyntax]: http://kramdown.gettalong.org/syntax.html
621
621
  [kdsyntax-ial]: http://kramdown.gettalong.org/syntax.html#inline-attribute-lists
622
622
  [stupid]: http://tools.ietf.org/id/draft-hartke-xmpp-stupid-00
data/bin/doilit CHANGED
@@ -75,7 +75,11 @@ ARGV.each do |doi|
75
75
  if (ct = cite["container-title"]) && ct != []
76
76
  info = []
77
77
  if v = cite["volume"]
78
- info << "Vol. #{v}"
78
+ vi = "vol. #{v}"
79
+ if (v = cite["journal-issue"]) && (issue = v["issue"])
80
+ vi << ", no. #{issue}"
81
+ end
82
+ info << vi
79
83
  end
80
84
  if p = cite["page"]
81
85
  info << "pp. #{p}"
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env ruby
2
+ # prerequisite:
3
+ # gem install net-http-persistent
4
+ #
5
+ # generates referencegroup files for BCP and STD series (like bibxml9)
6
+ # unfortunately, needs to re-fetch rfc-index.xml
7
+ # uses pretty slow built-in XML parser, so it will take a while even on regen
8
+ #
9
+ # uses ENV["KRAMDOWN_REFCACHEDIR"] for where you want to have your bibxml9 data
10
+ #
11
+
12
+ require 'rexml/document'
13
+ require 'fileutils'
14
+
15
+ begin
16
+ require 'net/http/persistent'
17
+ rescue
18
+ warn "*** please install net-http-persistent:"
19
+ warn " gem install net-http-persistent"
20
+ warn "(prefix by sudo only if required)."
21
+ exit 72 # EX_OSFILE
22
+ end
23
+
24
+
25
+ TARGET_DIR = ENV["KRAMDOWN_REFCACHEDIR"] || (
26
+ path = File.expand_path("~/.cache/xml2rfc")
27
+ warn "*** set environment variable KRAMDOWN_REFCACHEDIR to #{path} to actually use the cache"
28
+ path
29
+ )
30
+
31
+ FileUtils.mkdir_p(TARGET_DIR)
32
+ FileUtils.chdir(TARGET_DIR)
33
+
34
+ $http = Net::HTTP::Persistent.new name: 'subseries'
35
+
36
+ KRAMDOWN_PERSISTENT_VERBOSE = true
37
+
38
+ def get_and_write_resource_persistently(url, fn, age_verbose=false)
39
+ t1 = Time.now
40
+ response = $http.request(URI(url))
41
+ if response.code != "200"
42
+ raise "*** Status code #{response.code} while fetching #{url}"
43
+ else
44
+ File.write(fn, response.body)
45
+ end
46
+ t2 = Time.now
47
+ warn "#{url} -> #{fn} (#{"%.3f" % (t2 - t1)} s)" if KRAMDOWN_PERSISTENT_VERBOSE
48
+ if age_verbose
49
+ if age = response.get_fields("age")
50
+ warn "(working from a web cache, index is #{age.first} seconds stale)"
51
+ end
52
+ end
53
+ end
54
+
55
+ CLEAR_RET = "\e[K\r" # XXX all the world is ECMA-48 (ISO 6429), no?
56
+
57
+ def noisy(name)
58
+ print "#{name}...#{CLEAR_RET}"
59
+ end
60
+ def clear_noise
61
+ print CLEAR_RET
62
+ end
63
+
64
+ def normalize_name(n)
65
+ n.sub(/([A-Z])0+/) {$1}
66
+ end
67
+
68
+ def regress_name(n)
69
+ n.sub(/([A-Z])(\d+)/) {"#$1#{"%04d" % $2.to_i}"}
70
+ end
71
+
72
+ def regress_name_dot(n)
73
+ n.sub(/([A-Z])(\d+)/) {"#$1.#{"%04d" % $2.to_i}"}
74
+ end
75
+
76
+ def get_ref(rfcname)
77
+ name = "reference.#{regress_name_dot(rfcname)}.xml"
78
+ begin
79
+ file = File.read(name) # no age check
80
+ rescue Errno::ENOENT
81
+ get_and_write_resource_persistently("https://www.rfc-editor.org/refs/bibxml/" << name, name)
82
+ file = File.read(name)
83
+ end
84
+ d = REXML::Document.new(file)
85
+ d.xml_decl.nowrite
86
+ "<!-- #{name} -->\n" << d.to_s.lstrip
87
+ end
88
+
89
+ def create_bib(series, subname, rfcnames)
90
+ p [series, subname, rfcnames]
91
+ subname_norm = normalize_name(subname)
92
+ refs = %{<?xml version='1.0' encoding='UTF-8'?>\n}
93
+ refs << %{<referencegroup anchor='#{subname_norm}' target='https://www.rfc-editor.org/info/#{subname_norm.downcase}'>\n}
94
+ refs << rfcnames.map {|x| get_ref(x)}.join
95
+ refs << "</referencegroup>\n"
96
+ File.write("reference.#{regress_name_dot(subname)}.xml", refs)
97
+ end
98
+
99
+ def handle_sub(series, entry)
100
+ ids = entry.get_elements("doc-id")
101
+ warn "** ids #{ids} #{entry}" unless ids.size == 1
102
+ subname = ids.first.text
103
+ isalso = entry.get_elements("is-also")
104
+ if isalso.size == 1
105
+ rfcs = isalso.first.get_elements("doc-id")
106
+ if rfcs.size > 0
107
+ rfcnames = rfcs.map {|r| r.text}
108
+ create_bib(series, subname, rfcnames)
109
+ end
110
+ end
111
+ end
112
+
113
+ RFCINDEX_SOURCE = "https://www.rfc-editor.org/rfc/rfc-index.xml"
114
+ RFCINDEX_COPY = File.basename(RFCINDEX_SOURCE)
115
+
116
+ get_and_write_resource_persistently(RFCINDEX_SOURCE, RFCINDEX_COPY, true) unless ENV["KRAMDOWN_DONT_REFRESH_RFCINDEX"]
117
+
118
+ doc = REXML::Document.new(File.read(RFCINDEX_COPY))
119
+ REXML::XPath.each(doc.root, "/rfc-index/bcp-entry") { |e| handle_sub("BCP", e) }
120
+ REXML::XPath.each(doc.root, "/rfc-index/std-entry") { |e| handle_sub("STD", e) }
data/bin/kramdown-rfc2629 CHANGED
@@ -14,7 +14,7 @@ Encoding.default_external = "UTF-8" # wake up, smell the coffee
14
14
 
15
15
  def boilerplate(key)
16
16
  case key.downcase
17
- when /\Abcp14(\+)?\z/i
17
+ when /\Abcp14(\+)?(-tagged)?\z/i
18
18
  ret = <<RFC8174
19
19
  The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
20
20
  NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
@@ -28,6 +28,26 @@ These words may also appear in this document in
28
28
  lower case as plain English words, absent their normative meanings.
29
29
  PLUS
30
30
  end
31
+ if $2
32
+ if $options.v3
33
+ ret << <<TAGGED
34
+
35
+ *[MUST]: <bcp14>
36
+ *[MUST NOT]: <bcp14>
37
+ *[REQUIRED]: <bcp14>
38
+ *[SHALL]: <bcp14>
39
+ *[SHALL NOT]: <bcp14>
40
+ *[SHOULD]: <bcp14>
41
+ *[SHOULD NOT]: <bcp14>
42
+ *[RECOMMENDED]: <bcp14>
43
+ *[NOT RECOMMENDED]: <bcp14>
44
+ *[MAY]: <bcp14>
45
+ *[OPTIONAL]: <bcp14>
46
+ TAGGED
47
+ else
48
+ warn "** need --v3 to tag bcp14"
49
+ end
50
+ end
31
51
  ret
32
52
  else
33
53
  warn "** Unknwon boilerplate key: #{key}"
@@ -249,6 +269,10 @@ def bibtagsys(bib, anchor=nil, stand_alone=true)
249
269
  rfc4d = "%04d" % $1.to_i
250
270
  [bib.upcase,
251
271
  "#{XML_RESOURCE_ORG_PREFIX}/bibxml/reference.RFC.#{rfc4d}.xml"]
272
+ elsif $options.v3 && bib =~ /\A(bcp|std)(\d+)/i
273
+ n4d = "%04d" % $2.to_i
274
+ [bib.upcase,
275
+ "#{XML_RESOURCE_ORG_PREFIX}/bibxml-rfcsubseries-new/reference.#{$1.upcase}.#{n4d}.xml"]
252
276
  elsif bib =~ /\A([-A-Z0-9]+)\./ &&
253
277
  (xro = Kramdown::Converter::Rfc2629::XML_RESOURCE_ORG_MAP[$1])
254
278
  dir, _ttl, rewrite_anchor = xro
@@ -1,3 +1,4 @@
1
+ 00a0
1
2
  00a1 !
2
3
  00a2 [cents]
3
4
  00a3 GBP
@@ -100,7 +100,7 @@
100
100
  <name>Contributors</name>
101
101
  <% else -%>
102
102
  <section anchor="contributors" numbered="false" title="Contributors">
103
- <% warn "*** Cannot process YAML contributors under V2 rules" if consec -%>
103
+ <% warn "*** To use YAML contributors, use --v3 (kdrfc -3)" if consec -%>
104
104
  <% end -%>
105
105
  <%= sh -%>
106
106
  <% if $options.v3 && consec
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'kramdown-rfc2629'
3
- s.version = '1.4.2'
3
+ s.version = '1.4.7'
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.}
@@ -10,7 +10,8 @@ spec = Gem::Specification.new do |s|
10
10
  s.files = Dir['lib/**/*.rb'] + %w(README.md LICENSE kramdown-rfc2629.gemspec bin/kdrfc bin/kramdown-rfc2629 bin/doilit bin/kramdown-rfc-extract-markdown data/kramdown-rfc2629.erb data/encoding-fallbacks.txt data/math.json)
11
11
  s.require_path = 'lib'
12
12
  s.executables = ['kramdown-rfc2629', 'doilit', 'kramdown-rfc-extract-markdown',
13
- 'kdrfc', 'kramdown-rfc-cache-i-d-bibxml']
13
+ 'kdrfc', 'kramdown-rfc-cache-i-d-bibxml',
14
+ 'kramdown-rfc-cache-subseries-bibxml']
14
15
  s.required_ruby_version = '>= 2.3.0'
15
16
  # s.requirements = 'wget'
16
17
  # s.has_rdoc = true
@@ -32,6 +32,7 @@ module KramdownRFC
32
32
  <format type="<%=escattr(k)%>" target="<%=escattr(v)%>"/>
33
33
  <% end -%>
34
34
  <%= vps.ele("annotation=ann", nil, nil, true) -%>
35
+ <%= vps.ele("refcontent=rc", nil, nil, true) -%>
35
36
  </reference>
36
37
  REFERB
37
38
  ret = erb.result(binding)
@@ -102,10 +102,16 @@ module Kramdown
102
102
  when /\A(.*) \((#{SECTIONS_RE})\)\z/
103
103
  href = $1
104
104
  handle_bares($2, attr, "parens", href)
105
- when /\A([\w.]+)<(.*)\z/
105
+ when /\A([\w.]+)<(.+)\z/
106
106
  href = $2
107
107
  attr['section'] = $1
108
108
  attr['sectionFormat'] = 'bare'
109
+ when /\A<<(.+)\z/
110
+ href = $1
111
+ attr['format'] = 'title'
112
+ when /\A<(.+)\z/
113
+ href = $1
114
+ attr['format'] = 'counter'
109
115
  end
110
116
  end
111
117
  href = href.gsub(/\A[0-9]/) { "_#{$&}" } # can't start an IDREF with a number
@@ -399,7 +405,7 @@ COLORS
399
405
  # warn ["goat:", result1.inspect]
400
406
  file.unlink
401
407
  result1 = svg_clean(result1) unless t == "goat"
402
- result1, err, _s = Open3.capture3("svgcheck -NXqa", stdin_data: result1);
408
+ result1, err, _s = Open3.capture3("svgcheck -Xqa", stdin_data: result1);
403
409
  capture_croak("svgcheck", err)
404
410
  # warn ["svgcheck:", result1.inspect]
405
411
  if result1 == ''
@@ -827,13 +833,27 @@ COLORS
827
833
  end
828
834
  end
829
835
 
836
+ def self.bcp_std_ref(t, n)
837
+ warn "*** #{t} anchors not supported in v2 format" unless $options.v3
838
+ [name = "reference.#{t}.#{"%04d" % n.to_i}.xml",
839
+ "#{XML_RESOURCE_ORG_PREFIX}/bibxml-rfcsubseries-new/#{name}"] # FOR NOW
840
+ end
841
+
830
842
  # [subdirectory name, cache ttl in seconds, does it provide for ?anchor=]
831
843
  XML_RESOURCE_ORG_MAP = {
832
844
  "RFC" => ["bibxml", 86400*7, false,
833
- ->(fn, n){ "https://www.rfc-editor.org/refs/bibxml/#{fn}"}
845
+ ->(fn, n){ [name = "reference.RFC.#{"%04d" % n.to_i}.xml",
846
+ "https://www.rfc-editor.org/refs/bibxml/#{name}"] }
834
847
  ],
835
848
  "I-D" => ["bibxml3", false, false,
836
- ->(fn, n){ "https://datatracker.ietf.org/doc/bibxml3/draft-#{n.sub(/\Adraft-/, '')}/xml" }
849
+ ->(fn, n){ [fn,
850
+ "https://datatracker.ietf.org/doc/bibxml3/draft-#{n.sub(/\Adraft-/, '')}/xml"] }
851
+ ],
852
+ "BCP" => ["bibxml-rfcsubseries", 86400*7, false,
853
+ ->(fn, n){ Rfc2629::bcp_std_ref("BCP", n) }
854
+ ],
855
+ "STD" => ["bibxml-rfcsubseries", 86400*7, false,
856
+ ->(fn, n){ Rfc2629::bcp_std_ref("STD", n) }
837
857
  ],
838
858
  "W3C" => "bibxml4",
839
859
  "3GPP" => "bibxml5",
@@ -884,7 +904,7 @@ COLORS
884
904
  ttl ||= KRAMDOWN_REFCACHETTL # everything but RFCs might change a lot
885
905
  puts "*** Huh: #{fn}" unless sub
886
906
  if altproc && !KRAMDOWN_USE_TOOLS_SERVER
887
- url = altproc.call(fn, n)
907
+ fn, url = altproc.call(fn, n)
888
908
  else
889
909
  url = "#{XML_RESOURCE_ORG_PREFIX}/#{sub}/#{fn}"
890
910
  end
@@ -907,7 +927,7 @@ COLORS
907
927
  }
908
928
  else
909
929
  REXML::XPath.each(d.root, "/reference/format") { |x|
910
- x.attributes["target"].sub!(%r{https?://www.ietf.org/internet-drafts/},
930
+ x.attributes["target"].sub!(%r{https?://www.ietf.org/internet-drafts/},
911
931
  %{https://www.ietf.org/archive/id/}) if t == "I-D"
912
932
  }
913
933
  end
@@ -1073,6 +1093,9 @@ COLORS
1073
1093
  title = nil if title.empty?
1074
1094
  value = el.value
1075
1095
  if item = title
1096
+ if item == "<bcp14>" && $options.v3
1097
+ return "<bcp14>#{el.value}</bcp14>"
1098
+ end
1076
1099
  m = title.scan(Parser::RFC2629Kramdown::IREF_START)
1077
1100
  if m.empty?
1078
1101
  subitem = value
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.2
4
+ version: 1.4.7
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-04-06 00:00:00.000000000 Z
11
+ date: 2021-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kramdown
@@ -62,6 +62,7 @@ executables:
62
62
  - kramdown-rfc-extract-markdown
63
63
  - kdrfc
64
64
  - kramdown-rfc-cache-i-d-bibxml
65
+ - kramdown-rfc-cache-subseries-bibxml
65
66
  extensions: []
66
67
  extra_rdoc_files: []
67
68
  files:
@@ -70,6 +71,7 @@ files:
70
71
  - bin/doilit
71
72
  - bin/kdrfc
72
73
  - bin/kramdown-rfc-cache-i-d-bibxml
74
+ - bin/kramdown-rfc-cache-subseries-bibxml
73
75
  - bin/kramdown-rfc-extract-markdown
74
76
  - bin/kramdown-rfc2629
75
77
  - data/encoding-fallbacks.txt
@@ -100,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
102
  - !ruby/object:Gem::Version
101
103
  version: '0'
102
104
  requirements: []
103
- rubygems_version: 3.2.3
105
+ rubygems_version: 3.2.15
104
106
  signing_key:
105
107
  specification_version: 4
106
108
  summary: Kramdown extension for generating RFC 7749 XML.