bitclust-core 1.2.3 → 1.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/data/bitclust/template.offline/class +85 -26
  3. data/data/bitclust/template.offline/class-index +31 -4
  4. data/data/bitclust/template.offline/doc +37 -7
  5. data/data/bitclust/template.offline/function +37 -7
  6. data/data/bitclust/template.offline/function-index +31 -5
  7. data/data/bitclust/template.offline/layout +4 -4
  8. data/data/bitclust/template.offline/library +38 -6
  9. data/data/bitclust/template.offline/library-index +31 -4
  10. data/data/bitclust/template.offline/method +52 -10
  11. data/lib/bitclust/classentry.rb +1 -0
  12. data/lib/bitclust/completion.rb +1 -0
  13. data/lib/bitclust/docentry.rb +1 -0
  14. data/lib/bitclust/libraryentry.rb +3 -1
  15. data/lib/bitclust/methodentry.rb +5 -4
  16. data/lib/bitclust/methodid.rb +1 -0
  17. data/lib/bitclust/nameutils.rb +7 -7
  18. data/lib/bitclust/preprocessor.rb +2 -2
  19. data/lib/bitclust/rdcompiler.rb +17 -8
  20. data/lib/bitclust/requesthandler.rb +3 -3
  21. data/lib/bitclust/ridatabase.rb +2 -1
  22. data/lib/bitclust/rrdparser.rb +0 -1
  23. data/lib/bitclust/screen.rb +30 -2
  24. data/lib/bitclust/simplesearcher.rb +1 -1
  25. data/lib/bitclust/subcommands/methods_command.rb +1 -1
  26. data/lib/bitclust/subcommands/server_command.rb +6 -1
  27. data/lib/bitclust/subcommands/setup_command.rb +1 -1
  28. data/lib/bitclust/subcommands/statichtml_command.rb +23 -7
  29. data/lib/bitclust/syntax_highlighter.rb +4 -3
  30. data/lib/bitclust/version.rb +1 -1
  31. data/test/test_bitclust.rb +1 -1
  32. data/test/test_syntax_highlighter.rb +8 -2
  33. data/theme/default/rurema.png +0 -0
  34. data/theme/default/rurema.svg +31 -0
  35. data/theme/default/script.js +35 -0
  36. data/theme/default/style.css +65 -0
  37. metadata +15 -13
@@ -25,7 +25,7 @@ module BitClust
25
25
  @parser.on('--prepare', 'Prepare config file and checkout repository. Do not create database.') {
26
26
  @prepare = true
27
27
  }
28
- @parser.on('--cleanup', 'Cleanup datebase before create database.') {
28
+ @parser.on('--cleanup', 'Cleanup database before create database.') {
29
29
  @cleanup = true
30
30
  }
31
31
  @parser.on('--purge', 'Purge all downloaded and generated files and exit.') {
@@ -67,6 +67,10 @@ module BitClust
67
67
  @bitclust_html_base + "/" + filename
68
68
  end
69
69
 
70
+ def custom_js_url(filename)
71
+ @bitclust_html_base + "/" + filename
72
+ end
73
+
70
74
  def favicon_url
71
75
  @bitclust_html_base + "/" + @favicon_url
72
76
  end
@@ -94,7 +98,12 @@ module BitClust
94
98
 
95
99
  def initialize
96
100
  if Object.const_defined?(:Encoding)
97
- Encoding.default_external = 'utf-8'
101
+ begin
102
+ verbose, $VERBOSE = $VERBOSE, false
103
+ Encoding.default_external = 'utf-8'
104
+ ensure
105
+ $VERBOSE = verbose
106
+ end
98
107
  end
99
108
  super
100
109
  @verbose = true
@@ -104,6 +113,7 @@ module BitClust
104
113
  @suffix = ".html"
105
114
  @gtm_tracking_id = nil
106
115
  @meta_robots_content = ["noindex"]
116
+ @stop_on_syntax_error = true
107
117
  @parser.banner = "Usage: #{File.basename($0, '.*')} statichtml [options]"
108
118
  @parser.on('-o', '--outputdir=PATH', 'Output directory') do |path|
109
119
  begin
@@ -137,6 +147,9 @@ module BitClust
137
147
  @parser.on('--meta-robots-content=VALUE1,VALUE2,...', Array, 'HTML <meta> element: <meta name="robots" content="VALUE1,VALUE2..."') do |values|
138
148
  @meta_robots_content = values
139
149
  end
150
+ @parser.on('--no-stop-on-syntax-error', 'Do not stop on syntax error') do |boolean|
151
+ @stop_on_syntax_error = boolean
152
+ end
140
153
  @parser.on('--[no-]quiet', 'Be quiet') do |quiet|
141
154
  @verbose = !quiet
142
155
  end
@@ -180,19 +193,21 @@ module BitClust
180
193
  :verbose => @verbose)
181
194
  create_index_html(@outputdir)
182
195
  FileUtils.cp(@manager_config[:themedir] + @manager_config[:css_url],
183
- @outputdir.to_s, {:verbose => @verbose, :preserve => true})
196
+ @outputdir.to_s, :verbose => @verbose, :preserve => true)
184
197
  FileUtils.cp(@manager_config[:themedir] + "syntax-highlight.css",
185
- @outputdir.to_s, {:verbose => @verbose, :preserve => true})
198
+ @outputdir.to_s, :verbose => @verbose, :preserve => true)
199
+ FileUtils.cp(@manager_config[:themedir] + "script.js",
200
+ @outputdir.to_s, :verbose => @verbose, :preserve => true)
186
201
  FileUtils.cp(@manager_config[:themedir] + @manager_config[:favicon_url],
187
- @outputdir.to_s, {:verbose => @verbose, :preserve => true})
202
+ @outputdir.to_s, :verbose => @verbose, :preserve => true)
188
203
  Dir.mktmpdir do |tmpdir|
189
204
  FileUtils.cp_r(@manager_config[:themedir] + 'images', tmpdir,
190
- {:verbose => @verbose, :preserve => true})
205
+ :verbose => @verbose, :preserve => true)
191
206
  Dir.glob(File.join(tmpdir, 'images', '/**/.svn')).each do |d|
192
- FileUtils.rm_r(d, {:verbose => @verbose})
207
+ FileUtils.rm_r(d, :verbose => @verbose)
193
208
  end
194
209
  FileUtils.cp_r(File.join(tmpdir, 'images'), @outputdir.to_s,
195
- {:verbose => @verbose, :preserve => true})
210
+ :verbose => @verbose, :preserve => true)
196
211
  end
197
212
  end
198
213
 
@@ -212,6 +227,7 @@ module BitClust
212
227
  :canonical_base_url => @canonical_base_url,
213
228
  :gtm_tracking_id => @gtm_tracking_id,
214
229
  :meta_robots_content => @meta_robots_content,
230
+ :stop_on_syntax_error => @stop_on_syntax_error,
215
231
  }
216
232
  @manager_config[:urlmapper] = URLMapperEx.new(@manager_config)
217
233
  @urlmapper = @manager_config[:urlmapper]
@@ -122,17 +122,18 @@ module BitClust
122
122
  @stack = []
123
123
  @name_buffer = []
124
124
  @__lexer.define_singleton_method(:on_parse_error) do |message|
125
- raise ParseError.new(filename, self.lineno, self.column, message)
125
+ raise ParseError.new(filename, self.lineno, self.column, "#{message}\n#{src}")
126
126
  end
127
127
  @__lexer.define_singleton_method(:compile_error) do |message|
128
- raise CompileError.new(filename, self.lineno, self.column, message)
128
+ raise CompileError.new(filename, self.lineno, self.column, "#{message}\n#{src}")
129
129
  end
130
130
  end
131
131
 
132
132
  def on_default(event, token, data)
133
133
  event_name = event.to_s.sub(/\Aon_/, "") # :on_event --> "event"
134
134
  style = COLORS[event_name.to_sym]
135
- data << (style ? "<span class=\"#{style}\">#{escape_html(token)}</span>" : token)
135
+ escaped_token = escape_html(token)
136
+ data << (style ? "<span class=\"#{style}\">#{escaped_token}</span>" : escaped_token)
136
137
  data
137
138
  end
138
139
 
@@ -1,3 +1,3 @@
1
1
  module BitClust
2
- VERSION = "1.2.3"
2
+ VERSION = "1.2.4"
3
3
  end
@@ -31,7 +31,7 @@ HERE
31
31
  end
32
32
 
33
33
  def search_capi(command, *argv)
34
- db = BitClust::FunctionDatabase.new(@tmpdir)
34
+ _db = BitClust::FunctionDatabase.new(@tmpdir)
35
35
  cmd = case command
36
36
  when "lookup"
37
37
  BitClust::Subcommands::LookupCommand.new
@@ -8,14 +8,14 @@ class TestSyntaxHighlighter < Test::Unit::TestCase
8
8
  sub_test_case "syntax error" do
9
9
  test "single line" do
10
10
  src = "foo(\n"
11
- assert_raise(BitClust::SyntaxHighlighter::ParseError.new("-", 1, 5, "syntax error, unexpected end-of-input, expecting ')'")) do
11
+ assert_raise(BitClust::SyntaxHighlighter::ParseError.new("-", 1, 5, "syntax error, unexpected end-of-input, expecting ')'\n#{src}")) do
12
12
  highlight(src)
13
13
  end
14
14
  end
15
15
 
16
16
  test "multiple line" do
17
17
  src = "a = 1\nfoo(\n"
18
- assert_raise(BitClust::SyntaxHighlighter::ParseError.new("-", 2, 5, "syntax error, unexpected end-of-input, expecting ')'")) do
18
+ assert_raise(BitClust::SyntaxHighlighter::ParseError.new("-", 2, 5, "syntax error, unexpected end-of-input, expecting ')'\n#{src}")) do
19
19
  highlight(src)
20
20
  end
21
21
  end
@@ -64,4 +64,10 @@ class TestSyntaxHighlighter < Test::Unit::TestCase
64
64
  assert_equal(expected, highlight(source))
65
65
  end
66
66
  end
67
+
68
+ test 'htmlescape' do
69
+ source = 'puts /<a>/'
70
+ expected = '<span class="nb">puts</span> <span class="sr">/&lt;a&gt;/</span>'
71
+ assert_equal(expected, highlight(source))
72
+ end
67
73
  end
Binary file
@@ -0,0 +1,31 @@
1
+ <?xml version="1.0"?>
2
+ <svg width="16" height="16" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg">
3
+ <rect x="2" y="1" width="12" height="12" fill="#33a"/>
4
+
5
+ <rect x="4" y="2" width="8" height="10" fill="#f00"/>
6
+ <rect x="3" y="3" width="1" height="8" fill="#000"/>
7
+ <rect x="5" y="1" width="6" height="1" fill="#000"/>
8
+ <rect x="12" y="3" width="1" height="8" fill="#000"/>
9
+ <rect x="5" y="12" width="6" height="1" fill="#000"/>
10
+
11
+ <rect x="4" y="2" width="1" height="1" fill="#300"/>
12
+ <rect x="11" y="2" width="1" height="1" fill="#300"/>
13
+ <rect x="4" y="11" width="1" height="1" fill="#300"/>
14
+ <rect x="11" y="11" width="1" height="1" fill="#300"/>
15
+
16
+ <rect x="5" y="3" width="1" height="1" fill="#600"/>
17
+ <rect x="10" y="3" width="1" height="1" fill="#600"/>
18
+ <rect x="5" y="10" width="1" height="1" fill="#600"/>
19
+ <rect x="10" y="10" width="1" height="1" fill="#600"/>
20
+
21
+ <rect x="6" y="4" width="4" height="6" fill="#000"/>
22
+ <rect x="7" y="5" width="2" height="4" fill="#f00"/>
23
+
24
+ <rect x="2" y="0" width="12" height="1" fill="#000"/>
25
+ <rect x="14" y="0" width="1" height="14" fill="#000"/>
26
+ <rect x="2" y="13" width="12" height="1" fill="#000"/>
27
+ <rect x="1" y="1" width="1" height="14" fill="#000"/>
28
+ <rect x="2" y="14" width="11" height="1" fill="#ccc"/>
29
+ <rect x="13" y="14" width="1" height="1" fill="#000"/>
30
+ <rect x="2" y="15" width="13" height="1" fill="#000"/>
31
+ </svg>
@@ -0,0 +1,35 @@
1
+ (function() {
2
+ window.onload = function() {
3
+ const elems = document.getElementsByClassName('highlight')
4
+
5
+ let tempDiv = document.createElement('div')
6
+
7
+ Array.prototype.forEach.call(elems,
8
+ function(elem) {
9
+ // sample code without caption
10
+ tempDiv.innerHTML = elem.innerHTML
11
+ const caption = tempDiv.getElementsByClassName("caption")[0]
12
+ if (caption) tempDiv.removeChild(caption)
13
+
14
+ // textarea for preserving the copy text
15
+ const copyText = document.createElement('textarea')
16
+ copyText.setAttribute('class', 'highlight__copy-text')
17
+ copyText.innerHTML = tempDiv.textContent.replace(/^\n+/, "").replace(/\n{2,}$/, "\n")
18
+ elem.appendChild(copyText)
19
+
20
+ // COPY button
21
+ const btn = document.createElement('div')
22
+ btn.setAttribute('class', 'highlight__copy-button')
23
+ // btn.textContent = "COPY"
24
+ elem.insertBefore(btn, elem.firstChild)
25
+
26
+ btn.onclick = function(){
27
+ copyText.select()
28
+ document.execCommand("copy")
29
+ btn.classList.add("copied")
30
+ window.setTimeout(function() { btn.classList.remove("copied") }, 1000)
31
+ }
32
+ }
33
+ )
34
+ }
35
+ })()
@@ -134,6 +134,34 @@ pre.highlight {
134
134
  position: relative;
135
135
  }
136
136
 
137
+ /* for COPY */
138
+ .highlight__copy-button {
139
+ float: right;
140
+ margin: 0 -1.1em 0.25em 0.5em;
141
+ padding: 0.25em 0.5em;
142
+ background: #DDD;
143
+ opacity: 0.75;
144
+ cursor: pointer;
145
+ }
146
+ .highlight__copy-button:hover {
147
+ background: #EE8;
148
+ opacity: 1;
149
+ }
150
+ .highlight__copy-button::after {
151
+ content: "COPY"
152
+ }
153
+ .highlight__copy-button.copied {
154
+ background: #070;
155
+ color: white;
156
+ }
157
+ .highlight__copy-button.copied::after {
158
+ content: "COPIED"
159
+ }
160
+ .highlight__copy-text {
161
+ position: fixed;
162
+ left: -1000px;
163
+ }
164
+
137
165
  pre .caption {
138
166
  position: absolute;
139
167
  top: 0;
@@ -285,6 +313,43 @@ hr {
285
313
  height: 1px;
286
314
  }
287
315
 
316
+ .inline-breadcrumb-list {
317
+ display: inline-block;
318
+ list-style-type: none;
319
+ margin-bottom: 0;
320
+ margin-top: 0;
321
+ padding-left: 0;
322
+ }
323
+
324
+ .inline-breadcrumb-list li {
325
+ display: inline-block;
326
+ margin-bottom: 0;
327
+ }
328
+
329
+ .inline-breadcrumb-list li + li::before {
330
+ content: ">";
331
+ padding-left: 0.1rem;
332
+ padding-right: 0.1rem;
333
+ }
334
+
335
+ .inline-ancestors-list {
336
+ display: inline-flex;
337
+ flex-direction: row-reverse;
338
+ list-style-type: none;
339
+ margin-bottom: 0;
340
+ margin-top: 0;
341
+ padding-left: 0;
342
+ }
343
+
344
+ .inline-ancestors-list li {
345
+ margin-bottom: 0;
346
+ }
347
+
348
+ .inline-ancestors-list li + li::after {
349
+ content: "<";
350
+ padding-right: 0.3rem;
351
+ }
352
+
288
353
  @media print {
289
354
  body {
290
355
  font-family: osaka,'MS Mincho',serif;
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bitclust-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - https://github.com/rurema
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-11-20 00:00:00.000000000 Z
11
+ date: 2020-04-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: test-unit
@@ -222,6 +222,8 @@ files:
222
222
  - test/test_syntax_highlighter.rb
223
223
  - theme/default/images/external.png
224
224
  - theme/default/rurema.png
225
+ - theme/default/rurema.svg
226
+ - theme/default/script.js
225
227
  - theme/default/style.css
226
228
  - theme/default/syntax-highlight.css
227
229
  - theme/default/test.css
@@ -251,19 +253,19 @@ signing_key:
251
253
  specification_version: 4
252
254
  summary: BitClust is a rurema document processor.
253
255
  test_files:
254
- - test/test_nameutils.rb
255
256
  - test/run_test.rb
256
- - test/test_methodsignature.rb
257
- - test/test_rrdparser.rb
258
- - test/test_refsdatabase.rb
259
- - test/test_libraryentry.rb
260
- - test/test_rdcompiler.rb
257
+ - test/test_nameutils.rb
258
+ - test/test_functiondatabase.rb
259
+ - test/test_bitclust.rb
260
+ - test/test_simplesearcher.rb
261
261
  - test/test_functionreferenceparser.rb
262
262
  - test/test_runner.rb
263
- - test/test_syntax_highlighter.rb
264
- - test/test_bitclust.rb
265
- - test/test_functiondatabase.rb
263
+ - test/test_refsdatabase.rb
264
+ - test/test_methodsignature.rb
265
+ - test/test_libraryentry.rb
266
+ - test/test_rrdparser.rb
267
+ - test/test_preprocessor.rb
266
268
  - test/test_entry.rb
267
269
  - test/test_methoddatabase.rb
268
- - test/test_simplesearcher.rb
269
- - test/test_preprocessor.rb
270
+ - test/test_rdcompiler.rb
271
+ - test/test_syntax_highlighter.rb