kramdown-rfc2629 1.5.25 → 1.6.2
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 +48 -30
- data/bin/kdrfc +17 -0
- data/bin/kramdown-rfc +9 -0
- data/bin/kramdown-rfc2629 +1 -536
- data/data/kramdown-rfc2629.erb +5 -1
- data/kramdown-rfc2629.gemspec +5 -5
- data/lib/kramdown-rfc/command.rb +572 -0
- data/lib/kramdown-rfc/kdrfc-processor.rb +3 -1
- data/lib/kramdown-rfc/parameterset.rb +22 -2
- data/lib/kramdown-rfc/refxml.rb +107 -10
- data/lib/kramdown-rfc2629.rb +10 -2
- metadata +8 -5
data/lib/kramdown-rfc/refxml.rb
CHANGED
@@ -8,6 +8,12 @@ module KramdownRFC
|
|
8
8
|
escape_html(str.to_s, :attribute)
|
9
9
|
end
|
10
10
|
|
11
|
+
AUTHOR_ATTRIBUTES = %w{
|
12
|
+
initials surname fullname
|
13
|
+
asciiInitials asciiSurname asciiFullname
|
14
|
+
role
|
15
|
+
}
|
16
|
+
|
11
17
|
def self.ref_to_xml(k, v)
|
12
18
|
vps = KramdownRFC::ParameterSet.new(v)
|
13
19
|
erb = ERB.trim_new <<-REFERB, '-'
|
@@ -18,7 +24,7 @@ module KramdownRFC
|
|
18
24
|
<% vps.arr("author", true, true) do |au|
|
19
25
|
aups = authorps_from_hash(au)
|
20
26
|
-%>
|
21
|
-
<author <%=aups.attrs(
|
27
|
+
<author <%=aups.attrs(*AUTHOR_ATTRIBUTES)%>>
|
22
28
|
<%= aups.ele("organization=org", aups.attr("abbrev=orgabbrev"), "") %>
|
23
29
|
</author>
|
24
30
|
<% aups.warn_if_leftovers -%>
|
@@ -40,19 +46,110 @@ module KramdownRFC
|
|
40
46
|
ret
|
41
47
|
end
|
42
48
|
|
49
|
+
def self.treat_multi_attribute_member(ps, an)
|
50
|
+
value = ps.rest[an]
|
51
|
+
if Hash === value
|
52
|
+
value.each do |k, v|
|
53
|
+
ps.rest[if k == ':'
|
54
|
+
an
|
55
|
+
else
|
56
|
+
Kramdown::Element.attrmangle(k + an) ||
|
57
|
+
Kramdown::Element.attrmangle(k) ||
|
58
|
+
k
|
59
|
+
end] = v
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.initializify(s) # XXX Jean-Pierre
|
65
|
+
w = '\p{Lu}\p{Lo}'
|
66
|
+
if s =~ /\A[-.#{w}]+[.]/u
|
67
|
+
$&
|
68
|
+
elsif s =~ /\A([#{w}])[^-]*/u
|
69
|
+
ret = "#$1."
|
70
|
+
while (s = $') && s =~ /\A(-[\p{L}])[^-]*/u
|
71
|
+
ret << "#$1."
|
72
|
+
end
|
73
|
+
ret
|
74
|
+
else
|
75
|
+
warn "*** Can't initializify #{s}"
|
76
|
+
s
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.looks_like_initial(s)
|
81
|
+
s =~ /\A[\p{Lu}\p{Lo}]([-.][\p{Lu}\p{Lo}]?)*\z/u
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.initials_from_parts_and_surname(aups, parts, s)
|
85
|
+
ssz = s.size
|
86
|
+
nonsurname = parts[0...-ssz]
|
87
|
+
if (ns = parts[-ssz..-1]) != s
|
88
|
+
warn "*** inconsistent surnames #{ns} and #{s}"
|
89
|
+
end
|
90
|
+
nonsurname.map{|x| initializify(x)}.join(" ")
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.handle_ins(aups, ins_k, initials_k, surname_k)
|
94
|
+
if ins = aups[ins_k]
|
95
|
+
parts = ins.split('.').map(&:strip) # split on dots first
|
96
|
+
# Coalesce H.-P.
|
97
|
+
i = 1; while i < parts.size
|
98
|
+
if parts[i][0] == "-"
|
99
|
+
parts[i-1..i] = [parts[i-1] + "." + parts[i]]
|
100
|
+
else
|
101
|
+
i += 1
|
102
|
+
end
|
103
|
+
end
|
104
|
+
# Multiple surnames in ins?
|
105
|
+
parts[-1..-1] = parts[-1].split
|
106
|
+
s = if surname = aups.rest[surname_k]
|
107
|
+
surname.split
|
108
|
+
else parts.reverse.take_while{|x| !looks_like_initial(x)}.reverse
|
109
|
+
end
|
110
|
+
aups.rest[initials_k] = initials_from_parts_and_surname(aups, parts, s)
|
111
|
+
aups.rest[surname_k] = s.join(" ")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def self.handle_name(aups, fn_k, initials_k, surname_k)
|
116
|
+
if name = aups.rest[fn_k]
|
117
|
+
names = name.split(/ *\| */, 2) # boundary for given/last name
|
118
|
+
if names[1]
|
119
|
+
aups.rest[fn_k] = name = names.join(" ") # remove boundary
|
120
|
+
if surname = aups.rest[surname_k]
|
121
|
+
if surname != names[1]
|
122
|
+
warn "*** inconsistent embedded surname #{names[1]} and surname #{surname}"
|
123
|
+
end
|
124
|
+
end
|
125
|
+
aups.rest[surname_k] = names[1]
|
126
|
+
end
|
127
|
+
parts = name.split
|
128
|
+
surname = aups.rest[surname_k] || parts[-1]
|
129
|
+
s = surname.split
|
130
|
+
aups.rest[initials_k] ||= initials_from_parts_and_surname(aups, parts, s)
|
131
|
+
aups.rest[surname_k] = s.join(" ")
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
43
135
|
def self.authorps_from_hash(au)
|
44
136
|
aups = KramdownRFC::ParameterSet.new(au)
|
45
|
-
if
|
46
|
-
|
47
|
-
aups.rest["
|
48
|
-
|
137
|
+
if n = aups[:name]
|
138
|
+
warn "** both name #{n} and fullname #{fn} are set on one author" if fn = aups.rest["fullname"]
|
139
|
+
aups.rest["fullname"] = n
|
140
|
+
usename = true
|
141
|
+
end
|
142
|
+
["fullname", "ins", "initials", "surname"].each do |an|
|
143
|
+
treat_multi_attribute_member(aups, an)
|
49
144
|
end
|
145
|
+
handle_ins(aups, :ins, "initials", "surname")
|
146
|
+
handle_ins(aups, :asciiIns, "asciiInitials", "asciiSurname")
|
50
147
|
# hack ("heuristic for") initials and surname from name
|
51
148
|
# -- only works for people with exactly one last name and uncomplicated first names
|
52
|
-
|
53
|
-
|
54
|
-
aups
|
55
|
-
aups
|
149
|
+
# -- add surname for people with more than one last name
|
150
|
+
if usename
|
151
|
+
handle_name(aups, "fullname", "initials", "surname")
|
152
|
+
handle_name(aups, "asciiFullname", "asciiInitials", "asciiSurname")
|
56
153
|
end
|
57
154
|
aups
|
58
155
|
end
|
@@ -69,7 +166,7 @@ module KramdownRFC
|
|
69
166
|
# country: Germany
|
70
167
|
|
71
168
|
PERSON_ERB = <<~ERB
|
72
|
-
<<%= element_name%> <%=aups.attrs(
|
169
|
+
<<%= element_name%> <%=aups.attrs(*AUTHOR_ATTRIBUTES)%>>
|
73
170
|
<%= aups.ele("organization=org", aups.attrs("abbrev=orgabbrev",
|
74
171
|
*[$options.v3 && "ascii=orgascii"]), "") %>
|
75
172
|
<address>
|
data/lib/kramdown-rfc2629.rb
CHANGED
@@ -242,6 +242,14 @@ module Kramdown
|
|
242
242
|
TRUTHY["false"] = false
|
243
243
|
TRUTHY["no"] = false
|
244
244
|
|
245
|
+
# explicit or automatic studlification
|
246
|
+
# note that explicit (including trailing "_") opts out of automatic
|
247
|
+
def self.attrmangle(k)
|
248
|
+
if (d = k.gsub(/_(.|$)/) { $1.upcase }) != k or d = STUDLY_ATTR_MAP[k]
|
249
|
+
d
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
245
253
|
def rfc2629_fix(opts)
|
246
254
|
if a = attr
|
247
255
|
if anchor = a.delete('id')
|
@@ -254,7 +262,7 @@ module Kramdown
|
|
254
262
|
opts = opts.merge(noabbrev: TRUTHY[av]) # updated copy
|
255
263
|
end
|
256
264
|
attr.keys.each do |k|
|
257
|
-
if
|
265
|
+
if d = self.class.attrmangle(k)
|
258
266
|
a[d] = a.delete(k)
|
259
267
|
end
|
260
268
|
end
|
@@ -800,7 +808,7 @@ COLORS
|
|
800
808
|
out ="#{' '*indent}<dd><t/></dd>\n" # you can't make this one up
|
801
809
|
end
|
802
810
|
opts[:haddt] = true
|
803
|
-
out << "#{' '*indent}<dt#{el_html_attributes(el)}
|
811
|
+
out << "#{' '*indent}<dt#{el_html_attributes(el)}>#{inner(el, indent, opts)}</dt>\n"
|
804
812
|
else
|
805
813
|
close = "#{' '*indent}</t>\n" * @in_dt
|
806
814
|
@in_dt = 1
|
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
|
+
version: 1.6.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Carsten Bormann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-02-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kramdown
|
@@ -67,10 +67,11 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '2.0'
|
69
69
|
description: |-
|
70
|
-
An
|
70
|
+
An RFCXML (RFC 799x) generating backend for Thomas Leitner's
|
71
71
|
"kramdown" markdown parser. Mostly useful for RFC writers.
|
72
72
|
email: cabo@tzi.org
|
73
73
|
executables:
|
74
|
+
- kramdown-rfc
|
74
75
|
- kramdown-rfc2629
|
75
76
|
- doilit
|
76
77
|
- kramdown-rfc-extract-markdown
|
@@ -86,6 +87,7 @@ files:
|
|
86
87
|
- bin/de-gfm
|
87
88
|
- bin/doilit
|
88
89
|
- bin/kdrfc
|
90
|
+
- bin/kramdown-rfc
|
89
91
|
- bin/kramdown-rfc-cache-i-d-bibxml
|
90
92
|
- bin/kramdown-rfc-cache-subseries-bibxml
|
91
93
|
- bin/kramdown-rfc-extract-markdown
|
@@ -94,6 +96,7 @@ files:
|
|
94
96
|
- data/kramdown-rfc2629.erb
|
95
97
|
- data/math.json
|
96
98
|
- kramdown-rfc2629.gemspec
|
99
|
+
- lib/kramdown-rfc/command.rb
|
97
100
|
- lib/kramdown-rfc/erb.rb
|
98
101
|
- lib/kramdown-rfc/gzip-clone.rb
|
99
102
|
- lib/kramdown-rfc/kdrfc-processor.rb
|
@@ -120,8 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
123
|
- !ruby/object:Gem::Version
|
121
124
|
version: '0'
|
122
125
|
requirements: []
|
123
|
-
rubygems_version: 3.
|
126
|
+
rubygems_version: 3.3.3
|
124
127
|
signing_key:
|
125
128
|
specification_version: 4
|
126
|
-
summary: Kramdown extension for generating RFC
|
129
|
+
summary: Kramdown extension for generating RFCXML (RFC 799x).
|
127
130
|
test_files: []
|