ruby-vpi 16.0.1 → 17.0.0
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.
- data/LICENSE +19 -19
- data/README +1 -1
- data/Rakefile +35 -32
- data/bin/convert.rb +28 -0
- data/bin/generate/design.rb +16 -0
- data/bin/generate/proto.rb +13 -0
- data/bin/generate/runner.rake +33 -0
- data/bin/generate/spec.rb +45 -0
- data/bin/generate.rb +177 -0
- data/bin/ruby-vpi +56 -0
- data/doc/Rakefile +20 -4
- data/doc/common.css +92 -33
- data/doc/common.inc +13 -0
- data/doc/common.tpl +42 -28
- data/doc/history.doc +11 -11
- data/doc/history.html +769 -248
- data/doc/history.inc +909 -0
- data/doc/history.rb +9 -0
- data/doc/history.yaml +69 -0
- data/doc/intro.inc +170 -178
- data/doc/lib/doc_format.rb +57 -144
- data/doc/lib/doc_proxy.rb +504 -88
- data/doc/lib/erb_content.rb +8 -8
- data/doc/lib/erb_proxy.rb +17 -17
- data/doc/manual.doc +626 -777
- data/doc/manual.html +1541 -1031
- data/doc/memo.doc +38 -36
- data/doc/memo.html +64 -28
- data/doc/readme.doc +4 -31
- data/doc/readme.html +221 -163
- data/doc/rss.erb +1 -1
- data/doc/rss.xml +73 -1761
- data/ext/Rakefile +6 -5
- data/ext/main.c +17 -15
- data/ext/relay.c +4 -7
- data/ext/relay.h +2 -2
- data/ext/swig_vpi.h +2 -2
- data/ext/swig_vpi.i +1 -2
- data/ext/swig_wrap.cin +12 -16
- data/ext/vlog.c +5 -5
- data/ext/vlog.h +2 -2
- data/lib/ruby-vpi/erb.rb +3 -3
- data/lib/ruby-vpi/float.rb +2 -2
- data/lib/ruby-vpi/rcov.rb +5 -7
- data/lib/ruby-vpi/runner.rb +43 -41
- data/lib/ruby-vpi/runner_boot_loader.rb +117 -0
- data/lib/ruby-vpi/runner_proxy.rb +6 -8
- data/lib/ruby-vpi/util.rb +10 -0
- data/lib/ruby-vpi/verilog_parser.rb +28 -56
- data/lib/ruby-vpi/vpi.rb +168 -123
- data/lib/ruby-vpi.rb +22 -143
- data/ref/c/annotated.html +1 -1
- data/ref/c/common_8h.html +1 -1
- data/ref/c/files.html +1 -1
- data/ref/c/functions.html +1 -1
- data/ref/c/functions_vars.html +1 -1
- data/ref/c/globals.html +1 -1
- data/ref/c/globals_0x63.html +1 -1
- data/ref/c/globals_0x65.html +1 -1
- data/ref/c/globals_0x66.html +1 -1
- data/ref/c/globals_0x6d.html +1 -1
- data/ref/c/globals_0x70.html +1 -1
- data/ref/c/globals_0x72.html +1 -1
- data/ref/c/globals_0x73.html +1 -1
- data/ref/c/globals_0x74.html +1 -1
- data/ref/c/globals_0x76.html +1 -1
- data/ref/c/globals_0x78.html +1 -1
- data/ref/c/globals_defs.html +1 -1
- data/ref/c/globals_defs_0x65.html +1 -1
- data/ref/c/globals_defs_0x70.html +1 -1
- data/ref/c/globals_defs_0x76.html +1 -1
- data/ref/c/globals_defs_0x78.html +1 -1
- data/ref/c/globals_enum.html +1 -1
- data/ref/c/globals_eval.html +1 -1
- data/ref/c/globals_func.html +1 -1
- data/ref/c/globals_type.html +1 -1
- data/ref/c/globals_vars.html +1 -1
- data/ref/c/index.html +1 -1
- data/ref/c/main_8c.html +1 -1
- data/ref/c/main_8h.html +1 -1
- data/ref/c/relay_8c.html +1 -1
- data/ref/c/relay_8h.html +1 -1
- data/ref/c/structt__cb__data.html +1 -1
- data/ref/c/structt__vpi__delay.html +1 -1
- data/ref/c/structt__vpi__error__info.html +1 -1
- data/ref/c/structt__vpi__strengthval.html +1 -1
- data/ref/c/structt__vpi__systf__data.html +1 -1
- data/ref/c/structt__vpi__time.html +1 -1
- data/ref/c/structt__vpi__value.html +1 -1
- data/ref/c/structt__vpi__vecval.html +1 -1
- data/ref/c/structt__vpi__vlog__info.html +1 -1
- data/ref/c/verilog_8h.html +1 -1
- data/ref/c/vlog_8c.html +1 -1
- data/ref/c/vlog_8h.html +1 -1
- data/ref/c/vpi__user_8h.html +1 -1
- data/ref/ruby/classes/ERB.html +5 -5
- data/ref/ruby/classes/ERB.src/{M000024.html → M000026.html} +0 -0
- data/ref/ruby/classes/FileUtils.html +11 -11
- data/ref/ruby/classes/FileUtils.src/{M000025.html → M000027.html} +0 -0
- data/ref/ruby/classes/FileUtils.src/{M000026.html → M000028.html} +0 -0
- data/ref/ruby/classes/Float.html +6 -6
- data/ref/ruby/classes/Float.src/{M000020.html → M000021.html} +0 -0
- data/ref/ruby/classes/Integer.html +65 -65
- data/ref/ruby/classes/Integer.src/M000009.html +12 -5
- data/ref/ruby/classes/Integer.src/M000010.html +5 -5
- data/ref/ruby/classes/Integer.src/M000011.html +5 -5
- data/ref/ruby/classes/Integer.src/M000012.html +5 -5
- data/ref/ruby/classes/Integer.src/M000013.html +5 -5
- data/ref/ruby/classes/Integer.src/M000014.html +18 -0
- data/ref/ruby/classes/Integer.src/M000017.html +12 -18
- data/ref/ruby/classes/Integer.src/M000018.html +18 -12
- data/ref/ruby/classes/Integer.src/M000019.html +12 -17
- data/ref/ruby/classes/Integer.src/M000020.html +30 -0
- data/ref/ruby/classes/RDoc.html +5 -5
- data/ref/ruby/classes/RDoc.src/{M000053.html → M000058.html} +0 -0
- data/ref/ruby/classes/{RubyVpi/Config.html → RubyVPI.html} +20 -6
- data/ref/ruby/classes/String.html +34 -15
- data/ref/ruby/classes/String.src/M000022.html +5 -28
- data/ref/ruby/classes/String.src/M000023.html +5 -5
- data/ref/ruby/classes/String.src/{M000021.html → M000024.html} +0 -0
- data/ref/ruby/classes/String.src/M000025.html +41 -0
- data/ref/ruby/classes/VerilogParser/Module/Port.html +16 -36
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000006.html +10 -5
- data/ref/ruby/classes/VerilogParser/Module/Port.src/{M000004.html → M000007.html} +4 -4
- data/ref/ruby/classes/VerilogParser/Module/Port.src/{M000005.html → M000008.html} +4 -4
- data/ref/ruby/classes/VerilogParser/Module.html +28 -9
- data/ref/ruby/classes/VerilogParser/Module.src/M000005.html +29 -0
- data/ref/ruby/classes/VerilogParser.html +5 -39
- data/ref/ruby/classes/VerilogParser.src/M000004.html +26 -0
- data/ref/ruby/classes/Vpi/Handle.html +179 -77
- data/ref/ruby/classes/Vpi/Handle.src/M000035.html +18 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000036.html +5 -5
- data/ref/ruby/classes/Vpi/Handle.src/M000037.html +5 -5
- data/ref/ruby/classes/Vpi/Handle.src/M000038.html +5 -5
- data/ref/ruby/classes/Vpi/Handle.src/M000039.html +5 -5
- data/ref/ruby/classes/Vpi/Handle.src/M000040.html +5 -8
- data/ref/ruby/classes/Vpi/Handle.src/M000041.html +5 -8
- data/ref/ruby/classes/Vpi/Handle.src/M000042.html +5 -9
- data/ref/ruby/classes/Vpi/Handle.src/M000043.html +8 -31
- data/ref/ruby/classes/Vpi/Handle.src/M000044.html +8 -74
- data/ref/ruby/classes/Vpi/Handle.src/M000045.html +9 -17
- data/ref/ruby/classes/Vpi/Handle.src/M000046.html +31 -11
- data/ref/ruby/classes/Vpi/Handle.src/M000047.html +86 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000048.html +17 -18
- data/ref/ruby/classes/Vpi/Handle.src/M000050.html +18 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000051.html +24 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000053.html +31 -0
- data/ref/ruby/classes/Vpi/Handle.src/M000054.html +89 -0
- data/ref/ruby/classes/Vpi/S_vpi_time.html +16 -16
- data/ref/ruby/classes/Vpi/S_vpi_time.src/{M000050.html → M000055.html} +4 -4
- data/ref/ruby/classes/Vpi/S_vpi_time.src/{M000051.html → M000056.html} +5 -5
- data/ref/ruby/classes/Vpi/S_vpi_value.html +15 -15
- data/ref/ruby/classes/Vpi/S_vpi_value.src/{M000035.html → M000032.html} +5 -5
- data/ref/ruby/classes/Vpi/S_vpi_value.src/M000033.html +5 -5
- data/ref/ruby/classes/Vpi/S_vpi_value.src/M000034.html +5 -5
- data/ref/ruby/classes/Vpi.html +6 -42
- data/ref/ruby/classes/Vpi.src/M000029.html +15 -5
- data/ref/ruby/classes/Vpi.src/M000030.html +24 -24
- data/ref/ruby/classes/Vpi.src/M000031.html +6 -8
- data/ref/ruby/created.rid +1 -1
- data/ref/ruby/files/bin/{header_to_ruby_rb.html → convert_rb.html} +5 -5
- data/ref/ruby/files/bin/{generate_test_rb.html → generate_rb.html} +8 -21
- data/ref/ruby/files/lib/ruby-vpi/erb_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/float_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/integer_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/rake_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/rcov_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/rdoc_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.html +197 -0
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000001.html +17 -0
- data/ref/ruby/files/lib/ruby-vpi/runner_boot_loader_rb.src/M000002.html +18 -0
- data/ref/ruby/files/lib/ruby-vpi/runner_proxy_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi/runner_rb.html +6 -19
- data/ref/ruby/files/lib/ruby-vpi/util_rb.html +101 -0
- data/ref/ruby/files/lib/ruby-vpi/verilog_parser_rb.html +8 -1
- data/ref/ruby/files/lib/ruby-vpi/vpi_rb.html +1 -1
- data/ref/ruby/files/lib/ruby-vpi_rb.html +2 -14
- data/ref/ruby/fr_class_index.html +1 -3
- data/ref/ruby/fr_file_index.html +4 -2
- data/ref/ruby/fr_method_index.html +56 -51
- data/ref/ruby/index.html +1 -1
- data/samp/counter/RSpec/Rakefile +1 -0
- data/samp/counter/RSpec/counter_design.rb +15 -0
- data/samp/counter/RSpec/counter_proto.rb +10 -0
- data/samp/counter/RSpec/counter_runner.rake +44 -0
- data/samp/counter/RSpec/counter_spec.rb +39 -0
- data/samp/counter/Rakefile +1 -1
- data/samp/counter/counter.v +7 -7
- data/samp/counter/xUnit/Rakefile +1 -0
- data/samp/counter/xUnit/counter_bench.rb +95 -0
- data/samp/counter/{counter_xunit_bench.v → xUnit/counter_bench.v} +0 -0
- data/samp/counter/xUnit/counter_design.rb +15 -0
- data/samp/counter/xUnit/counter_proto.rb +10 -0
- data/samp/counter/xUnit/counter_runner.rake +44 -0
- data/samp/counter/{counter_xunit_spec.rb → xUnit/counter_spec.rb} +9 -9
- data/samp/pipelined_alu/Rakefile +1 -1
- data/samp/pipelined_alu/TestHw5UnitModel.rb +4 -5
- data/samp/pipelined_alu/hw5_unit.v +55 -85
- data/samp/pipelined_alu/hw5_unit_design.rb +51 -0
- data/samp/pipelined_alu/hw5_unit_proto.rb +4 -0
- data/samp/pipelined_alu/hw5_unit_runner.rake +43 -0
- data/samp/pipelined_alu/hw5_unit_spec.rb +64 -0
- data/samp/register_file/LICENSE +20 -0
- data/samp/register_file/README +4 -0
- data/samp/register_file/Rakefile +1 -0
- data/samp/register_file/register_file.v +18 -0
- data/samp/register_file/register_file_design.rb +11 -0
- data/samp/register_file/register_file_proto.rb +11 -0
- data/samp/register_file/register_file_runner.rake +43 -0
- data/samp/register_file/register_file_spec.rb +58 -0
- metadata +78 -66
- data/bin/generate_test.rb +0 -200
- data/bin/generate_test_tpl/bench.rb +0 -89
- data/bin/generate_test_tpl/bench.v +0 -26
- data/bin/generate_test_tpl/design.rb +0 -11
- data/bin/generate_test_tpl/proto.rb +0 -16
- data/bin/generate_test_tpl/runner.rake +0 -42
- data/bin/generate_test_tpl/spec.rb +0 -37
- data/bin/header_to_ruby.rb +0 -27
- data/ref/ruby/classes/Integer.src/M000008.html +0 -25
- data/ref/ruby/classes/Integer.src/M000016.html +0 -25
- data/ref/ruby/classes/RubyVpi.html +0 -199
- data/ref/ruby/classes/RubyVpi.src/M000027.html +0 -121
- data/ref/ruby/classes/VerilogParser/Module/Parameter.html +0 -160
- data/ref/ruby/classes/VerilogParser/Module/Parameter.src/M000007.html +0 -19
- data/ref/ruby/classes/VerilogParser/Module/Port.src/M000003.html +0 -21
- data/ref/ruby/classes/VerilogParser/Module.src/M000002.html +0 -34
- data/ref/ruby/classes/VerilogParser.src/M000001.html +0 -34
- data/ref/ruby/classes/Vpi/Handle.src/M000049.html +0 -69
- data/ref/ruby/classes/Vpi.src/M000028.html +0 -28
- data/ref/ruby/classes/Vpi.src/M000032.html +0 -22
- data/samp/counter/counter_rspec_bench.rb +0 -86
- data/samp/counter/counter_rspec_bench.v +0 -9
- data/samp/counter/counter_rspec_design.rb +0 -8
- data/samp/counter/counter_rspec_proto.rb +0 -13
- data/samp/counter/counter_rspec_runner.rake +0 -52
- data/samp/counter/counter_rspec_spec.rb +0 -39
- data/samp/counter/counter_xunit_bench.rb +0 -86
- data/samp/counter/counter_xunit_design.rb +0 -8
- data/samp/counter/counter_xunit_proto.rb +0 -13
- data/samp/counter/counter_xunit_runner.rake +0 -52
- data/samp/pipelined_alu/hw5_unit_test_bench.rb +0 -86
- data/samp/pipelined_alu/hw5_unit_test_bench.v +0 -14
- data/samp/pipelined_alu/hw5_unit_test_design.rb +0 -61
- data/samp/pipelined_alu/hw5_unit_test_proto.rb +0 -7
- data/samp/pipelined_alu/hw5_unit_test_runner.rake +0 -52
- data/samp/pipelined_alu/hw5_unit_test_spec.rb +0 -68
data/doc/lib/doc_format.rb
CHANGED
|
@@ -3,33 +3,60 @@
|
|
|
3
3
|
# See the file named LICENSE for details.
|
|
4
4
|
|
|
5
5
|
require 'cgi'
|
|
6
|
-
require '
|
|
6
|
+
require 'digest/md5'
|
|
7
|
+
|
|
8
|
+
begin
|
|
9
|
+
require 'rubygems'
|
|
10
|
+
rescue LoadError
|
|
11
|
+
end
|
|
12
|
+
|
|
7
13
|
require 'coderay'
|
|
8
14
|
require 'redcloth'
|
|
9
15
|
|
|
10
16
|
class String
|
|
11
|
-
# The content of these HTML tags will be preserved verbatim
|
|
12
|
-
# processed by Textile.
|
|
13
|
-
|
|
17
|
+
# The content of these HTML tags will be preserved verbatim
|
|
18
|
+
# when they are processed by Textile. By doing this, we
|
|
19
|
+
# avoid unwanted Textile transformations, such as quotation
|
|
20
|
+
# marks becoming curly ( ), in source code.
|
|
21
|
+
PRESERVED_TAGS = %w[tt code pre]
|
|
14
22
|
|
|
15
23
|
# Transforms this string into HTML.
|
|
16
24
|
def to_html
|
|
17
25
|
text = dup
|
|
18
26
|
|
|
19
|
-
#
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
# escape preserved tags
|
|
28
|
+
preserved = {} # escaped => original
|
|
29
|
+
|
|
30
|
+
PRESERVED_TAGS.each do |tag|
|
|
31
|
+
text.gsub! %r{(<#{tag}.*?>)(.*?)(</#{tag}>)}m do
|
|
32
|
+
orig = $1 + CGI.escapeHTML(CGI.unescapeHTML($2)) + $3
|
|
33
|
+
esc = Digest::MD5.hexdigest(orig)
|
|
34
|
+
|
|
35
|
+
preserved[esc] = orig
|
|
36
|
+
esc
|
|
26
37
|
end
|
|
38
|
+
end
|
|
39
|
+
|
|
27
40
|
|
|
41
|
+
# convert Textile into HTML
|
|
28
42
|
html = text.redcloth
|
|
29
43
|
|
|
30
|
-
|
|
31
|
-
#
|
|
32
|
-
|
|
44
|
+
|
|
45
|
+
# restore preserved tags
|
|
46
|
+
preserved.each_pair do |esc, orig|
|
|
47
|
+
html.gsub! %r{<p>#{esc}</p>|#{esc}}, orig
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## fix annoyances in Textile conversion
|
|
52
|
+
|
|
53
|
+
# redcloth wraps indented text within <pre> tags
|
|
54
|
+
html.gsub! %r{(<pre>)\s*<code>(.*?)\s*</code>\s*(</pre>)}m, '\1\2\3'
|
|
55
|
+
html.gsub! %r{(<pre>)\s*<pre>(.*?)</pre>\s*(</pre>)}m, '\1\2\3'
|
|
56
|
+
|
|
57
|
+
# redcloth wraps a single item within paragraph tags, which
|
|
58
|
+
# prevents the item's HTML from being validly injected within
|
|
59
|
+
# other block-level elements, such as headings (h1, h2, etc.)
|
|
33
60
|
html.sub! %r{^<p>(.*)</p>$}m do |match|
|
|
34
61
|
payload = $1
|
|
35
62
|
|
|
@@ -40,26 +67,9 @@ class String
|
|
|
40
67
|
end
|
|
41
68
|
end
|
|
42
69
|
|
|
43
|
-
#
|
|
44
|
-
|
|
45
|
-
# preserved tags (redcloth escapes the content of <pre> tags)
|
|
46
|
-
html.gsub! %r{(<pre>)(.*?)(</pre>)}m do
|
|
47
|
-
$1 + CGI.unescapeHTML($2) + $3
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
PRESERVED_TAGS.each do |tag|
|
|
51
|
-
html.gsub! \
|
|
52
|
-
%r{<pre tag=#{tag.inspect}(.*?)>(.*?)</pre>}m,
|
|
53
|
-
%{<#{tag}\\1>\\2</#{tag}>}
|
|
54
|
-
end
|
|
70
|
+
# redcloth adds <span> tags around acronyms
|
|
71
|
+
html.gsub! %r{<span class="caps">([[:upper:][:digit:]]+)</span>}, '\1'
|
|
55
72
|
|
|
56
|
-
# assume that indented text in Textile is NOT source code
|
|
57
|
-
html.gsub! %r{(<pre>)\s*<code>(.*?)\s*</code>\s*(</pre>)}m, '\1\2\3'
|
|
58
|
-
|
|
59
|
-
# escape content of <pre> tags, because we un-escaped it above
|
|
60
|
-
html.gsub! %r{(<pre>)(.*?)(</pre>)}m do
|
|
61
|
-
$1 + CGI.escapeHTML($2) + $3
|
|
62
|
-
end
|
|
63
73
|
|
|
64
74
|
html.coderay
|
|
65
75
|
end
|
|
@@ -98,121 +108,24 @@ class String
|
|
|
98
108
|
end
|
|
99
109
|
end
|
|
100
110
|
|
|
101
|
-
|
|
102
111
|
# Transforms this string into a valid XHTML anchor (ID attribute).
|
|
103
112
|
# See http://www.nmt.edu/tcc/help/pubs/xhtml/id-type.html
|
|
104
113
|
def to_html_anchor
|
|
105
|
-
#
|
|
106
|
-
|
|
107
|
-
if self[0,1] =~ /[[:alpha:]]/
|
|
108
|
-
self
|
|
109
|
-
else
|
|
110
|
-
'a' + self
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# The remaining characters must be letters, digits, hyphens (-),
|
|
114
|
-
# underscores (_), colons (:), or periods (.) [or Unicode characters]
|
|
115
|
-
buf.unpack('U*').map! do |code|
|
|
116
|
-
if code > 0xFF or code.chr =~ /[[:alnum:]\-_:\.]/
|
|
117
|
-
code
|
|
118
|
-
else
|
|
119
|
-
?_
|
|
120
|
-
end
|
|
121
|
-
end.pack('U*')
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
@@anchors = []
|
|
125
|
-
|
|
126
|
-
# Resets the list of anchors encountered thus far.
|
|
127
|
-
def String.reset_anchors
|
|
128
|
-
@@anchors.clear
|
|
129
|
-
end
|
|
114
|
+
# remove HTML tags from the input
|
|
115
|
+
buf = self.gsub(/<.*?>/, '')
|
|
130
116
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
#
|
|
143
|
-
def table_of_contents
|
|
144
|
-
toc = '<ul>'
|
|
145
|
-
prevDepth = 0
|
|
146
|
-
prevIndex = ''
|
|
147
|
-
|
|
148
|
-
text = gsub %r{<h(\d)(.*?)>(.*?)</h\1>$}m do
|
|
149
|
-
depth, atts, title = $1.to_i, $2, $3.strip
|
|
150
|
-
|
|
151
|
-
# generate a LaTeX-style index (section number) for the heading
|
|
152
|
-
depthDiff = (depth - prevDepth).abs
|
|
153
|
-
|
|
154
|
-
index =
|
|
155
|
-
if depth > prevDepth
|
|
156
|
-
toc << '<li><ul>' * depthDiff
|
|
157
|
-
|
|
158
|
-
s = prevIndex + ('.1' * depthDiff)
|
|
159
|
-
s.sub(/^\./, '')
|
|
160
|
-
|
|
161
|
-
elsif depth < prevDepth
|
|
162
|
-
toc << '</ul></li>' * depthDiff
|
|
163
|
-
|
|
164
|
-
s = prevIndex.sub(/(\.\d+){#{depthDiff}}$/, '')
|
|
165
|
-
s.next
|
|
166
|
-
|
|
167
|
-
else
|
|
168
|
-
prevIndex.next
|
|
169
|
-
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
prevDepth = depth
|
|
173
|
-
prevIndex = index
|
|
174
|
-
|
|
175
|
-
# generate a unique HTML anchor for the heading
|
|
176
|
-
anchor = CGI.unescape(
|
|
177
|
-
if atts =~ /id=('|")(.*?)\1/
|
|
178
|
-
atts = $` + $'
|
|
179
|
-
$2
|
|
180
|
-
else
|
|
181
|
-
title
|
|
182
|
-
end
|
|
183
|
-
).to_html_anchor
|
|
184
|
-
|
|
185
|
-
anchor << anchor.object_id.to_s while @@anchors.include? anchor
|
|
186
|
-
@@anchors << anchor
|
|
187
|
-
|
|
188
|
-
yield title, anchor, index, depth, atts if block_given?
|
|
189
|
-
|
|
190
|
-
# provide hyperlinks for traveling between TOC and heading
|
|
191
|
-
dst = anchor
|
|
192
|
-
src = dst.object_id.to_s.to_html_anchor
|
|
193
|
-
|
|
194
|
-
# forward link from TOC to heading
|
|
195
|
-
toc << %{<li><a id="#{src}" href="##{dst}">#{title}</a></li>}
|
|
196
|
-
|
|
197
|
-
# reverse link from heading to TOC
|
|
198
|
-
%{<h#{depth}#{atts}><a id="#{dst}" href="##{src}">#{index}</a> #{title}</h#{depth}>}
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
if prevIndex.empty?
|
|
202
|
-
toc = nil # there were no headings
|
|
203
|
-
else
|
|
204
|
-
toc << '</ul></li>' * prevDepth
|
|
205
|
-
toc << '</ul>'
|
|
206
|
-
|
|
207
|
-
# collapse redundant list elements
|
|
208
|
-
while toc.gsub! %r{(<li>.*?)</li><li>(<ul>)}, '\1\2'
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
# collapse unnecessary levels
|
|
212
|
-
while toc.gsub! %r{(<ul>)<li><ul>(.*)</ul></li>(</ul>)}, '\1\2\3'
|
|
117
|
+
# The first or only character must be a letter.
|
|
118
|
+
buf.insert(0, 'a') unless buf[0,1] =~ /[[:alpha:]]/
|
|
119
|
+
|
|
120
|
+
# The remaining characters must be letters,
|
|
121
|
+
# digits, hyphens (-), underscores (_), colons
|
|
122
|
+
# (:), or periods (.) [or Unicode characters]
|
|
123
|
+
buf.unpack('U*').map! do |code|
|
|
124
|
+
if code > 0xFF or code.chr =~ /[[:alnum:]\-_:\.]/
|
|
125
|
+
code
|
|
126
|
+
else
|
|
127
|
+
?_
|
|
213
128
|
end
|
|
214
|
-
end
|
|
215
|
-
|
|
216
|
-
[toc, text]
|
|
129
|
+
end.pack('U*')
|
|
217
130
|
end
|
|
218
131
|
end
|