kramdown-rfc2629 0.13.2 → 0.13.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -48,6 +48,8 @@ supported by kramdown-rfc2629. The document metadata are in a short
48
48
  piece of YAML at the start, and from there, `abstract`, `middle`,
49
49
  references (`normative` and `informative`) and `back` are sections
50
50
  delimited in the markdown file. See the example for how this works.
51
+ The sections `normative` and `informative` can be populated right from
52
+ the metadata, so there is never a need to write XML any more.
51
53
  Much less scary, and no `{:/nomarkdown}` etc. is needed any more.
52
54
  Similarly, `stupid-s.xml` and `stupid-s.txt` show what
53
55
  kramdown-rfc2629 and xml2rfc make out of this.
data/bin/kramdown-rfc2629 CHANGED
@@ -2,9 +2,7 @@
2
2
  # -*- coding: utf-8 -*-
3
3
  require 'kramdown-rfc2629'
4
4
  require 'yaml'
5
- require 'pp'
6
5
  require 'erb'
7
- require 'ostruct'
8
6
  require 'date'
9
7
 
10
8
  Encoding.default_external = "UTF-8" # wake up, smell the coffee
@@ -12,40 +10,90 @@ Encoding.default_external = "UTF-8" # wake up, smell the coffee
12
10
  RE_NL = /(?:\n|\r|\r\n)/
13
11
  RE_SECTION = /---(?:\s+(\w+)(-?))?\s*#{RE_NL}(.*?#{RE_NL})(?=---(?:\s+\w+-?)?\s*#{RE_NL}|\Z)/m
14
12
 
13
+ NMDTAGS = ["{:/nomarkdown}\n\n", "\n{::nomarkdown}\n"]
14
+
15
15
  def xml_from_sections(input)
16
- sections = input.scan(RE_SECTION) # array of [label, nomarkdown-flag, text]
16
+ sections = input.scan(RE_SECTION)
17
+ # resulting in an array; each section is [section-label, nomarkdown-flag, section-text]
17
18
 
18
- ps = ParameterSet.new(YAML.load(sections.shift[2])) # front matter parameters
19
+ # the first section is a YAML with front matter parameters (don't put a label here)
20
+ ps = ParameterSet.new(YAML.load(sections.shift[2]))
19
21
  coding_override = (ps.has(:coding) =~ /ascii/i) ? :symbolic : :as_char
20
22
 
23
+ # all the other sections are put in a Hash, possibly concatenated from parts there
21
24
  sechash = Hash.new{ |h,k| h[k] = ""}
22
- snames = []
25
+ snames = [] # a stack of section names
23
26
  sections.each do |sname, nmdflag, text|
24
27
  nmdin, nmdout = {
25
- "-" => ["", ""],
26
- "" => ["{:/nomarkdown}\n\n", "\n{::nomarkdown}\n"],
28
+ "-" => ["", ""], # stay in nomarkdown
29
+ "" => NMDTAGS, # pop out temporarily
27
30
  }[nmdflag || ""]
28
31
  if sname
29
- snames << sname # --- label -> push label
32
+ snames << sname # "--- label" -> push label (now current)
30
33
  else
31
- snames.pop # --- -> pop label
34
+ snames.pop # just "---" -> pop label (previous now current)
32
35
  end
33
36
  sechash[snames.last] << "#{nmdin}#{text}#{nmdout}"
34
37
  end
35
38
 
36
- mydata = File.read(File.join(File.dirname(__FILE__), '..', 'data', 'kramdown-rfc2629.erb'), coding: "UTF-8")
37
- erb = ERB.new(mydata)
38
- input = erb.result(binding)
39
+ stand_alone = ps[:stand_alone]
40
+
41
+ [:normative, :informative].each do |sn|
42
+ if refs = ps[sn]
43
+ refs.each do |k, v|
44
+ if bts = bibtagsys(k)
45
+ warn "*** redundant in #{k}: #{v.inspect}" if v
46
+ if stand_alone
47
+ sechash[sn.to_s] << %{\n#{NMDTAGS[0]}\n![:include:](#{bts[0]})\n#{NMDTAGS[1]}\n}
48
+ else
49
+ (ps.rest["bibxml"] ||= []) << k
50
+ sechash[sn.to_s] << %{&#{bts[0]};\n}
51
+ end
52
+ else
53
+ vps = ParameterSet.new(v)
54
+ erb = ERB.new <<-REFERB
55
+ <reference anchor="<%= k %>" <%= vps.attr("target") %>>
56
+ <front>
57
+ <%= vps.ele("title") %>
58
+
59
+ <% vps.arr("author") do |au|
60
+ aups = authorps_from_hash(au)
61
+ %>
62
+ <author <%=aups.attrs("initials", "surname", "fullname=name", "role")%>>
63
+ <%= aups.ele("organization=org", aups.attr("abbrev=orgabbrev"), "") %>
64
+ </author>
65
+ <% aups.warn_if_leftovers %>
66
+ <% end %>
67
+
68
+ <% if date = vps[:date] %>
69
+ <date <%= dateattrs(date) %>/>
70
+ <% end %>
71
+ </front>
72
+ </reference>
73
+ REFERB
74
+ sechash[sn.to_s] << erb.result(binding)
75
+ end
76
+ end
77
+ end
78
+ end
79
+
80
+ erbfilename = File.expand_path '../../data/kramdown-rfc2629.erb', __FILE__
81
+ erbfile = File.read(erbfilename, coding: "UTF-8")
82
+ erb = ERB.new(erbfile)
83
+ # remove redundant nomarkdown pop outs/pop ins as they confuse kramdown
84
+ input = erb.result(binding).gsub(%r"{::nomarkdown}\s*{:/nomarkdown}"m, "")
39
85
  ps.warn_if_leftovers
40
- sechash.delete("fluff")
41
- if !sechash.empty?
86
+ sechash.delete("fluff") # fluff is a "commented out" section
87
+ if !sechash.empty? # any sections unused by the ERb file?
42
88
  warn "*** sections left #{sechash.keys.inspect}!"
43
89
  end
44
90
 
45
- [input.gsub(%r"{::nomarkdown}\s*{:/nomarkdown}"m, ""), coding_override]
91
+ [input, coding_override]
46
92
  end
47
93
 
48
94
  class ParameterSet
95
+ include Kramdown::Utils::Html
96
+
49
97
  attr_reader :f
50
98
  def initialize(y)
51
99
  @f = y
@@ -66,19 +114,19 @@ class ParameterSet
66
114
  %{#{an}="#{val}"} if val
67
115
  end
68
116
  def attrs(*pns)
69
- pns.map{ |pn| attr(pn) }.join(" ")
117
+ pns.map{ |pn| attr(pn) }.compact.join(" ")
70
118
  end
71
- def ele(pn, attr=nil)
119
+ def ele(pn, attr=nil, defcontent=nil)
72
120
  val, an = van(pn)
73
- if val
74
- val = [val] unless val.respond_to? :to_a
75
- val.map do |val1|
76
- %{<#{[an, attr.to_s].join(" ").strip}>#{val1}</#{an}>}
77
- end.join(" ")
78
- end
121
+ val ||= defcontent
122
+ Array(val).map do |val1|
123
+ %{<#{[an, *Array(attr).map(&:to_s)].join(" ").strip}>#{escape_html(val1.to_s)}</#{an}>}
124
+ end.join(" ")
79
125
  end
80
- def arr(an, &block)
81
- (self[an] || []).each(&block)
126
+ def arr(an, converthash=true, &block)
127
+ arr = self[an] || []
128
+ arr = [arr] if Hash === arr && converthash
129
+ Array(arr).each(&block)
82
130
  end
83
131
  def rest
84
132
  @f
@@ -95,12 +143,37 @@ def bibtagsys(bib)
95
143
  rfc4d = "%04d" % $1.to_i
96
144
  [bib.upcase,
97
145
  "http://xml.resource.org/public/rfc/bibxml/reference.RFC.#{rfc4d}.xml"]
98
- else
146
+ elsif bib =~ /\AI-D\./i
99
147
  [bib,
100
148
  "http://xml.resource.org/public/rfc/bibxml3/reference.#{bib}.xml"]
101
149
  end
102
150
  end
103
151
 
152
+ def authorps_from_hash(au)
153
+ aups = ParameterSet.new(au)
154
+ if ins = aups[:ins]
155
+ parts = ins.split('.').map(&:strip)
156
+ aups.rest["initials"] = parts[0..-2].join('.') << '.'
157
+ aups.rest["surname"] = parts[-1]
158
+ end
159
+ aups
160
+ end
161
+
162
+ def dateattrs(date)
163
+ begin
164
+ case date
165
+ when Integer
166
+ %{year="#{"%04d" % date}"}
167
+ when String
168
+ Date.parse("#{date}-01").strftime(%{year="%Y" month="%B"})
169
+ when Date
170
+ date.strftime(%{year="%Y" month="%B" day="%d"})
171
+ end
172
+
173
+ rescue ArgumentError
174
+ warn "*** Invalid date: #{date} -- use 2012, 2012-07, or 2012-07-28"
175
+ end
176
+ end
104
177
 
105
178
  coding_override = :as_char
106
179
  input = ARGF.read.gsub(/\{::include\s+(.*?)\}/) {
@@ -113,7 +186,7 @@ if input =~ /\A<\?xml/ # if this is a whole XML file, protect it
113
186
  input = "{::nomarkdown}\n#{input}\n{:/nomarkdown}\n"
114
187
  end
115
188
  options = {input: 'RFC2629Kramdown', entity_output: coding_override}
116
- warn "options: #{options.inspect}"
189
+ # warn "options: #{options.inspect}"
117
190
  doc = Kramdown::Document.new(input, options)
118
191
  $stderr.puts doc.warnings.to_yaml unless doc.warnings.empty?
119
192
  puts doc.to_rfc2629
@@ -6,32 +6,27 @@
6
6
  tag, sys = bibtagsys(bib) %>
7
7
  <!ENTITY <%= tag %> SYSTEM "<%= sys %>">
8
8
  <% end %>
9
- <% ps.arr("entity") do |en, ev| %>
9
+ <% ps.arr("entity", false) do |en, ev| %>
10
10
  <!ENTITY <%=en%> "<%=ev%>">
11
11
  <% end %>
12
12
  ]>
13
13
 
14
14
  <rfc <%= ps.attrs("ipr", "docName=docname", "category=cat",
15
- "number", "obsoletes", "updates", "seriesNo=seriesno") %> >
15
+ "number", "obsoletes", "updates", "seriesNo=seriesno") %>>
16
16
 
17
- <% ps.arr("pi") do |pi| %>
18
- <?rfc <%=pi%>="yes"?>
17
+ <% ps.arr("pi", false) do |pi, val| %>
18
+ <?rfc <%=pi%>="<%= {true => "yes", false => "no", nil => "yes"}[val] || val %>"?>
19
19
  <% end %>
20
20
 
21
21
  <front>
22
22
  <%= ps.ele("title", ps.attr("abbrev=titleabbrev")) %>
23
23
 
24
24
  <% ps.arr("author") do |au|
25
- aups = ParameterSet.new(au)
26
- if ins = aups[:ins]
27
- parts = ins.split('.').map(&:strip)
28
- aups.rest["initials"] = parts[0..-2].join('.') << '.'
29
- aups.rest["surname"] = parts[-1]
30
- end
25
+ aups = authorps_from_hash(au)
31
26
  %>
32
27
 
33
28
  <author <%=aups.attrs("initials", "surname", "fullname=name", "role")%>>
34
- <%= aups.ele("organization=org", aups.attr("abbrev=orgabbrev")) %>
29
+ <%= aups.ele("organization=org", aups.attr("abbrev=orgabbrev"), "") %>
35
30
  <address>
36
31
  <% if aups.has("street") %>
37
32
  <postal>
@@ -52,7 +47,7 @@
52
47
  <% aups.warn_if_leftovers %>
53
48
  <% end %>
54
49
 
55
- <date <%= (ps[:date]||Date.today).strftime(%{year="%Y" month="%B" day="%d"}) %> />
50
+ <date <%= dateattrs(ps[:date]||Date.today) %>/>
56
51
 
57
52
  <%= ps.ele("area") %>
58
53
  <%= ps.ele("workgroup=wg") %>
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'kramdown-rfc2629'
3
- s.version = '0.13.2'
3
+ s.version = '0.13.3'
4
4
  s.summary = "Kramdown extension for generating RFC 2629 XML."
5
5
  s.description = %{An RFC2629 (XML2RFC) generating backend for Thomas Leitner's
6
6
  "kramdown" markdown parser. Mostly useful for RFC writers.}
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: 0.13.2
4
+ version: 0.13.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-14 00:00:00.000000000 Z
12
+ date: 2012-01-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: kramdown
16
- requirement: &70277384082520 !ruby/object:Gem::Requirement
16
+ requirement: &70123750840660 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0.13'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70277384082520
24
+ version_requirements: *70123750840660
25
25
  description: ! 'An RFC2629 (XML2RFC) generating backend for Thomas Leitner''s
26
26
 
27
27
  "kramdown" markdown parser. Mostly useful for RFC writers.'