kramdown-rfc2629 1.0.34 → 1.0.35
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 +4 -4
- data/README.md +13 -1
- data/bin/doilit +42 -5
- data/bin/kramdown-rfc2629 +4 -114
- data/data/kramdown-rfc2629.erb +2 -2
- data/kramdown-rfc2629.gemspec +1 -1
- data/lib/kramdown-rfc/parameterset.rb +53 -0
- data/lib/kramdown-rfc/refxml.rb +72 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2a1f1ed2a734a6ccf34f300ee6b1a5e46abdc7a5
|
4
|
+
data.tar.gz: 621309318d88a83810dfb337d90d1c5c39011e29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1b19dd534cb507d9b0dbcfc1d0d1008a9f8be0a962beb067ae68d7f475890e1516ec531b6a6f41f4309da92b7d2f8a81f5bf6d532e84520b6005a3e7d6775ef9
|
7
|
+
data.tar.gz: bb8ae29927a434c69ff02cbc81be85930dde4e9d2c60e46ddaf5e2963ab0abe8ae3cefee0a7a07c83bd38fc635e840cb3c6d3eb30669144be40fccc515f830e0
|
data/README.md
CHANGED
@@ -231,9 +231,21 @@ Most of the [kramdown syntax][kdsyntax] is supported and does
|
|
231
231
|
something useful; with the exception of the math syntax (math has no
|
232
232
|
special support in XML2RFC), and HTML syntax of course.
|
233
233
|
|
234
|
-
A number of more esoteric features have recently been added.
|
234
|
+
A number of more esoteric features have recently been added.
|
235
235
|
(The minimum required version for each full feature is indicated.)
|
236
236
|
|
237
|
+
(1.0.35:)
|
238
|
+
An experimental command `doilit` has been added. It can be used to
|
239
|
+
convert DOIs given on the command line into references entries for
|
240
|
+
kramdown-rfc YAML, saving a lot of typing. Note that the DOI database
|
241
|
+
is not of very consistent quality, so you likely have to hand-edit the
|
242
|
+
result before including it into the document (use `-v` to see raw JSON
|
243
|
+
data from the DOI database, made somewhat readable by converting it
|
244
|
+
into YAML). Use `-c` to enable caching (requires `open-uri-cached`
|
245
|
+
gem). Use `-h=handle` in front of a DOI to set a handle different
|
246
|
+
from the default `a`, `b`, etc. Similarly, use `-x=handle` to
|
247
|
+
generate XML2RFCv2 XML instead of kramdown-rfc YAML.
|
248
|
+
|
237
249
|
(1.0.31:)
|
238
250
|
The kramdown `smart_quotes` feature can be controlled better.
|
239
251
|
By default, it is on (with default kramdown settings), unless `coding:
|
data/bin/doilit
CHANGED
@@ -2,15 +2,42 @@
|
|
2
2
|
require 'open-uri'
|
3
3
|
require 'yaml'
|
4
4
|
require 'json'
|
5
|
+
require 'kramdown-rfc2629'
|
6
|
+
require 'kramdown-rfc/parameterset'
|
7
|
+
require 'kramdown-rfc/refxml'
|
8
|
+
|
9
|
+
# doilit -c 10.6028/NIST.SP.800-183 10.1016/j.adhoc.2015.04.007 10.1109/MIC.2012.29 10.1145/2507924.2507954
|
10
|
+
|
5
11
|
|
6
12
|
ACCEPT_CITE_JSON = {"Accept" => "application/citeproc+json"}
|
7
13
|
|
8
14
|
$verbose = false
|
15
|
+
$handle = "a"
|
16
|
+
$xml = false
|
9
17
|
|
18
|
+
litent = {}
|
10
19
|
ARGV.each do |doi|
|
11
|
-
|
20
|
+
case doi
|
21
|
+
when "-c"
|
22
|
+
begin
|
23
|
+
require 'open-uri/cached'
|
24
|
+
rescue LoadError
|
25
|
+
warn '*** please "gem install open-uri-cached" to enable caching'
|
26
|
+
end
|
27
|
+
next
|
28
|
+
when "-v"
|
12
29
|
$verbose = true
|
13
30
|
next
|
31
|
+
when /\A-h=(.*)/
|
32
|
+
$handle = $1
|
33
|
+
next
|
34
|
+
when /\A-x=(.*)/
|
35
|
+
$handle = $1
|
36
|
+
$xml = true
|
37
|
+
next
|
38
|
+
when /\A-/
|
39
|
+
warn "*** Usage: doilit [-c] [-v] [-h=handle|-x=xmlhandle] doi..."
|
40
|
+
exit 1
|
14
41
|
end
|
15
42
|
cite = JSON.parse(open("http://dx.doi.org/#{doi}", ACCEPT_CITE_JSON).read)
|
16
43
|
puts cite.to_yaml if $verbose
|
@@ -27,9 +54,9 @@ ARGV.each do |doi|
|
|
27
54
|
lau
|
28
55
|
end
|
29
56
|
end
|
30
|
-
if
|
31
|
-
if dp =
|
32
|
-
if Integer === (dp = dp[0])
|
57
|
+
if iss = cite["issued"]
|
58
|
+
if dp = iss["date-parts"]
|
59
|
+
if Integer === (dp = dp[0])[0]
|
33
60
|
lit["date"] = ["%04d" % dp[0], *dp[1..-1].map {|p| "%02d" % p}].join("-")
|
34
61
|
end
|
35
62
|
end
|
@@ -51,5 +78,15 @@ ARGV.each do |doi|
|
|
51
78
|
ser[pub] = info.join(", ")
|
52
79
|
end
|
53
80
|
lit["seriesinfo"]["DOI"] = cite["DOI"]
|
54
|
-
|
81
|
+
while litent[$handle]
|
82
|
+
$handle.succ!
|
83
|
+
end
|
84
|
+
litent[$handle] = lit
|
85
|
+
end
|
86
|
+
if $xml
|
87
|
+
litent.each do |k, v|
|
88
|
+
puts KramdownRFC::ref_to_xml(k, v)
|
89
|
+
end
|
90
|
+
else
|
91
|
+
puts litent.to_yaml.gsub(/^/, " ").lines[1..-1]
|
55
92
|
end
|
data/bin/kramdown-rfc2629
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby2.1
|
2
2
|
# -*- coding: utf-8 -*-
|
3
3
|
require 'kramdown-rfc2629'
|
4
|
+
require 'kramdown-rfc/parameterset'
|
5
|
+
require 'kramdown-rfc/refxml'
|
4
6
|
require 'yaml'
|
5
7
|
require 'erb'
|
6
8
|
require 'date'
|
@@ -21,7 +23,7 @@ def xml_from_sections(input)
|
|
21
23
|
# the first section is a YAML with front matter parameters (don't put a label here)
|
22
24
|
# We put back the "---" plus gratuitous blank lines to hack the line number in errors
|
23
25
|
yaml_in = input[/---\s*/] << sections.shift[2]
|
24
|
-
ps = ParameterSet.new(YAML.load(yaml_in))
|
26
|
+
ps = KramdownRFC::ParameterSet.new(YAML.load(yaml_in))
|
25
27
|
coding_override = ps.has(:coding)
|
26
28
|
smart_quotes = ps[:smart_quotes]
|
27
29
|
|
@@ -131,33 +133,7 @@ def xml_from_sections(input)
|
|
131
133
|
warn "*** don't know how to expand ref #{k}"
|
132
134
|
next
|
133
135
|
end
|
134
|
-
|
135
|
-
erb = ERB.new <<-REFERB, nil, '-'
|
136
|
-
<reference anchor="<%= k %>" <%= vps.attr("target") %>>
|
137
|
-
<front>
|
138
|
-
<%= vps.ele("title") -%>
|
139
|
-
|
140
|
-
<% vps.arr("author", true, true) do |au|
|
141
|
-
aups = authorps_from_hash(au)
|
142
|
-
-%>
|
143
|
-
<author <%=aups.attrs("initials", "surname", "fullname=name", "role")%>>
|
144
|
-
<%= aups.ele("organization=org", aups.attr("abbrev=orgabbrev"), "") %>
|
145
|
-
</author>
|
146
|
-
<% aups.warn_if_leftovers -%>
|
147
|
-
<% end -%>
|
148
|
-
<date <%= dateattrs(vps[:date]) %>/>
|
149
|
-
</front>
|
150
|
-
<% vps.arr("seriesinfo", false) do |k, v| -%>
|
151
|
-
<seriesInfo name="<%=k%>" value="<%=v%>"/>
|
152
|
-
<% end -%>
|
153
|
-
<% vps.arr("format", false) do |k, v| -%>
|
154
|
-
<format type="<%=k%>" target="<%=v%>"/>
|
155
|
-
<% end -%>
|
156
|
-
<%= vps.ele("annotation=ann") -%>
|
157
|
-
</reference>
|
158
|
-
REFERB
|
159
|
-
sechash[sn.to_s] << erb.result(binding)
|
160
|
-
vps.warn_if_leftovers
|
136
|
+
sechash[sn.to_s] << KramdownRFC::ref_to_xml(k, v)
|
161
137
|
end
|
162
138
|
end
|
163
139
|
end
|
@@ -177,55 +153,6 @@ def xml_from_sections(input)
|
|
177
153
|
[input, coding_override, link_defs, smart_quotes]
|
178
154
|
end
|
179
155
|
|
180
|
-
class ParameterSet
|
181
|
-
include Kramdown::Utils::Html
|
182
|
-
|
183
|
-
attr_reader :f
|
184
|
-
def initialize(y)
|
185
|
-
raise "*** invalid parameter set #{y.inspect}" unless Hash === y
|
186
|
-
@f = y
|
187
|
-
end
|
188
|
-
def [](pn)
|
189
|
-
@f.delete(pn.to_s)
|
190
|
-
end
|
191
|
-
def has(pn)
|
192
|
-
@f[pn.to_s]
|
193
|
-
end
|
194
|
-
def van(pn) # pn is a parameter name, possibly with an =alias
|
195
|
-
an, pn = pn.to_s.split("=")
|
196
|
-
pn ||= an
|
197
|
-
[self[pn] || self[an], an]
|
198
|
-
end
|
199
|
-
def attr(pn)
|
200
|
-
val, an = van(pn)
|
201
|
-
%{#{an}="#{val}"} if val
|
202
|
-
end
|
203
|
-
def attrs(*pns)
|
204
|
-
pns.map{ |pn| attr(pn) }.compact.join(" ")
|
205
|
-
end
|
206
|
-
def ele(pn, attr=nil, defcontent=nil)
|
207
|
-
val, an = van(pn)
|
208
|
-
val ||= defcontent
|
209
|
-
Array(val).map do |val1|
|
210
|
-
%{<#{[an, *Array(attr).map(&:to_s)].join(" ").strip}>#{escape_html(val1.to_s.strip)}</#{an}>}
|
211
|
-
end.join(" ")
|
212
|
-
end
|
213
|
-
def arr(an, converthash=true, must_have_one=false, &block)
|
214
|
-
arr = self[an] || []
|
215
|
-
arr = [arr] if Hash === arr && converthash
|
216
|
-
arr << { } if must_have_one && arr.empty?
|
217
|
-
Array(arr).each(&block)
|
218
|
-
end
|
219
|
-
def rest
|
220
|
-
@f
|
221
|
-
end
|
222
|
-
def warn_if_leftovers
|
223
|
-
if !@f.empty?
|
224
|
-
warn "*** attributes left #{@f.inspect}!"
|
225
|
-
end
|
226
|
-
end
|
227
|
-
end
|
228
|
-
|
229
156
|
XML_RESOURCE_ORG_PREFIX = Kramdown::Converter::Rfc2629::XML_RESOURCE_ORG_PREFIX
|
230
157
|
|
231
158
|
def bibtagsys(bib)
|
@@ -241,43 +168,6 @@ def bibtagsys(bib)
|
|
241
168
|
end
|
242
169
|
end
|
243
170
|
|
244
|
-
def authorps_from_hash(au)
|
245
|
-
aups = ParameterSet.new(au)
|
246
|
-
if ins = aups[:ins]
|
247
|
-
parts = ins.split('.').map(&:strip)
|
248
|
-
aups.rest["initials"] = parts[0..-2].join('.') << '.'
|
249
|
-
aups.rest["surname"] = parts[-1]
|
250
|
-
end
|
251
|
-
# hack ("heuristic for") initials and surname from name
|
252
|
-
# -- only works for people with exactly one last name and uncomplicated first names
|
253
|
-
if n = aups.rest["name"]
|
254
|
-
n = n.split
|
255
|
-
aups.rest["initials"] ||= n[0..-2].map(&:chr).join('.') << '.'
|
256
|
-
aups.rest["surname"] ||= n[-1]
|
257
|
-
end
|
258
|
-
aups
|
259
|
-
end
|
260
|
-
|
261
|
-
def dateattrs(date)
|
262
|
-
begin
|
263
|
-
case date
|
264
|
-
when Integer
|
265
|
-
%{year="#{"%04d" % date}"}
|
266
|
-
when String
|
267
|
-
Date.parse("#{date}-01").strftime(%{year="%Y" month="%B"})
|
268
|
-
when Date
|
269
|
-
date.strftime(%{year="%Y" month="%B" day="%d"})
|
270
|
-
when Array # this allows to explicitly give a string
|
271
|
-
%{year="#{date.join(" ")}"}
|
272
|
-
when nil
|
273
|
-
%{year="n.d."}
|
274
|
-
end
|
275
|
-
|
276
|
-
rescue ArgumentError
|
277
|
-
warn "*** Invalid date: #{date} -- use 2012, 2012-07, or 2012-07-28"
|
278
|
-
end
|
279
|
-
end
|
280
|
-
|
281
171
|
def read_encodings
|
282
172
|
encfilename = File.expand_path '../../data/encoding-fallbacks.txt', __FILE__
|
283
173
|
encfile = File.read(encfilename, coding: "UTF-8")
|
data/data/kramdown-rfc2629.erb
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
<%= ps.ele("title", ps.attr("abbrev=titleabbrev")) %>
|
25
25
|
|
26
26
|
<% ps.arr("author") do |au|
|
27
|
-
aups = authorps_from_hash(au)
|
27
|
+
aups = KramdownRFC::authorps_from_hash(au)
|
28
28
|
-%>
|
29
29
|
<author <%=aups.attrs("initials", "surname", "fullname=name", "role")%>>
|
30
30
|
<%= aups.ele("organization=org", aups.attr("abbrev=orgabbrev"), "") %>
|
@@ -45,7 +45,7 @@
|
|
45
45
|
<% aups.warn_if_leftovers -%>
|
46
46
|
<% end -%>
|
47
47
|
|
48
|
-
<date <%= dateattrs(ps[:date]||Date.today) %>/>
|
48
|
+
<date <%= KramdownRFC::dateattrs(ps[:date]||Date.today) %>/>
|
49
49
|
|
50
50
|
<%= ps.ele("area") %>
|
51
51
|
<%= ps.ele("workgroup=wg") %>
|
data/kramdown-rfc2629.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
spec = Gem::Specification.new do |s|
|
2
2
|
s.name = 'kramdown-rfc2629'
|
3
|
-
s.version = '1.0.
|
3
|
+
s.version = '1.0.35'
|
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,53 @@
|
|
1
|
+
module KramdownRFC
|
2
|
+
|
3
|
+
class ParameterSet
|
4
|
+
include Kramdown::Utils::Html
|
5
|
+
|
6
|
+
attr_reader :f
|
7
|
+
def initialize(y)
|
8
|
+
raise "*** invalid parameter set #{y.inspect}" unless Hash === y
|
9
|
+
@f = y
|
10
|
+
end
|
11
|
+
def [](pn)
|
12
|
+
@f.delete(pn.to_s)
|
13
|
+
end
|
14
|
+
def has(pn)
|
15
|
+
@f[pn.to_s]
|
16
|
+
end
|
17
|
+
def van(pn) # pn is a parameter name, possibly with an =alias
|
18
|
+
an, pn = pn.to_s.split("=")
|
19
|
+
pn ||= an
|
20
|
+
[self[pn] || self[an], an]
|
21
|
+
end
|
22
|
+
def attr(pn)
|
23
|
+
val, an = van(pn)
|
24
|
+
%{#{an}="#{val}"} if val
|
25
|
+
end
|
26
|
+
def attrs(*pns)
|
27
|
+
pns.map{ |pn| attr(pn) }.compact.join(" ")
|
28
|
+
end
|
29
|
+
def ele(pn, attr=nil, defcontent=nil)
|
30
|
+
val, an = van(pn)
|
31
|
+
val ||= defcontent
|
32
|
+
Array(val).map do |val1|
|
33
|
+
%{<#{[an, *Array(attr).map(&:to_s)].join(" ").strip}>#{escape_html(val1.to_s.strip)}</#{an}>}
|
34
|
+
end.join(" ")
|
35
|
+
end
|
36
|
+
def arr(an, converthash=true, must_have_one=false, &block)
|
37
|
+
arr = self[an] || []
|
38
|
+
arr = [arr] if Hash === arr && converthash
|
39
|
+
arr << { } if must_have_one && arr.empty?
|
40
|
+
Array(arr).each(&block)
|
41
|
+
end
|
42
|
+
def rest
|
43
|
+
@f
|
44
|
+
end
|
45
|
+
def warn_if_leftovers
|
46
|
+
if !@f.empty?
|
47
|
+
warn "*** attributes left #{@f.inspect}!"
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module KramdownRFC
|
2
|
+
|
3
|
+
def self.ref_to_xml(k, v)
|
4
|
+
vps = KramdownRFC::ParameterSet.new(v)
|
5
|
+
erb = ERB.new <<-REFERB, nil, '-'
|
6
|
+
<reference anchor="<%= k %>" <%= vps.attr("target") %>>
|
7
|
+
<front>
|
8
|
+
<%= vps.ele("title") -%>
|
9
|
+
|
10
|
+
<% vps.arr("author", true, true) do |au|
|
11
|
+
aups = authorps_from_hash(au)
|
12
|
+
-%>
|
13
|
+
<author <%=aups.attrs("initials", "surname", "fullname=name", "role")%>>
|
14
|
+
<%= aups.ele("organization=org", aups.attr("abbrev=orgabbrev"), "") %>
|
15
|
+
</author>
|
16
|
+
<% aups.warn_if_leftovers -%>
|
17
|
+
<% end -%>
|
18
|
+
<date <%= dateattrs(vps[:date]) %>/>
|
19
|
+
</front>
|
20
|
+
<% vps.arr("seriesinfo", false) do |k, v| -%>
|
21
|
+
<seriesInfo name="<%=k%>" value="<%=v%>"/>
|
22
|
+
<% end -%>
|
23
|
+
<% vps.arr("format", false) do |k, v| -%>
|
24
|
+
<format type="<%=k%>" target="<%=v%>"/>
|
25
|
+
<% end -%>
|
26
|
+
<%= vps.ele("annotation=ann") -%>
|
27
|
+
</reference>
|
28
|
+
REFERB
|
29
|
+
ret = erb.result(binding)
|
30
|
+
vps.warn_if_leftovers
|
31
|
+
ret
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.authorps_from_hash(au)
|
35
|
+
aups = KramdownRFC::ParameterSet.new(au)
|
36
|
+
if ins = aups[:ins]
|
37
|
+
parts = ins.split('.').map(&:strip)
|
38
|
+
aups.rest["initials"] = parts[0..-2].join('.') << '.'
|
39
|
+
aups.rest["surname"] = parts[-1]
|
40
|
+
end
|
41
|
+
# hack ("heuristic for") initials and surname from name
|
42
|
+
# -- only works for people with exactly one last name and uncomplicated first names
|
43
|
+
if n = aups.rest["name"]
|
44
|
+
n = n.split
|
45
|
+
aups.rest["initials"] ||= n[0..-2].map(&:chr).join('.') << '.'
|
46
|
+
aups.rest["surname"] ||= n[-1]
|
47
|
+
end
|
48
|
+
aups
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.dateattrs(date)
|
52
|
+
begin
|
53
|
+
case date
|
54
|
+
when /\A\d\d\d\d\z/
|
55
|
+
%{year="#{date}"}
|
56
|
+
when Integer
|
57
|
+
%{year="#{"%04d" % date}"}
|
58
|
+
when String
|
59
|
+
Date.parse("#{date}-01").strftime(%{year="%Y" month="%B"})
|
60
|
+
when Date
|
61
|
+
date.strftime(%{year="%Y" month="%B" day="%d"})
|
62
|
+
when Array # this allows to explicitly give a string
|
63
|
+
%{year="#{date.join(" ")}"}
|
64
|
+
when nil
|
65
|
+
%{year="n.d."}
|
66
|
+
end
|
67
|
+
|
68
|
+
rescue ArgumentError
|
69
|
+
warn "*** Invalid date: #{date} -- use 2012, 2012-07, or 2012-07-28"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kramdown-rfc2629
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.35
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carsten Bormann
|
@@ -41,6 +41,8 @@ files:
|
|
41
41
|
- data/encoding-fallbacks.txt
|
42
42
|
- data/kramdown-rfc2629.erb
|
43
43
|
- kramdown-rfc2629.gemspec
|
44
|
+
- lib/kramdown-rfc/parameterset.rb
|
45
|
+
- lib/kramdown-rfc/refxml.rb
|
44
46
|
- lib/kramdown-rfc2629.rb
|
45
47
|
homepage: http://github.com/cabo/kramdown-rfc2629
|
46
48
|
licenses:
|