rundoc 4.1.4 → 6.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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +3 -1
- data/.standard.yml +1 -1
- data/CHANGELOG.md +12 -0
- data/README.md +98 -10
- data/lib/rundoc/cli.rb +18 -2
- data/lib/rundoc/code_command/background/log/clear.rb +12 -2
- data/lib/rundoc/code_command/background/log/read.rb +12 -2
- data/lib/rundoc/code_command/background/process_spawn.rb +3 -1
- data/lib/rundoc/code_command/background/start.rb +25 -6
- data/lib/rundoc/code_command/background/stdin_write.rb +21 -8
- data/lib/rundoc/code_command/background/stop.rb +12 -2
- data/lib/rundoc/code_command/background/wait.rb +15 -3
- data/lib/rundoc/code_command/background.rb +2 -0
- data/lib/rundoc/code_command/bash/cd.rb +12 -18
- data/lib/rundoc/code_command/bash.rb +43 -19
- data/lib/rundoc/code_command/comment.rb +33 -0
- data/lib/rundoc/code_command/deferred.rb +66 -0
- data/lib/rundoc/code_command/empty_binding.rb +18 -0
- data/lib/rundoc/code_command/file_command/append.rb +29 -8
- data/lib/rundoc/code_command/file_command/remove.rb +27 -5
- data/lib/rundoc/code_command/no_such_command.rb +8 -3
- data/lib/rundoc/code_command/pipe.rb +36 -16
- data/lib/rundoc/code_command/pre/erb.rb +28 -18
- data/lib/rundoc/code_command/print/erb.rb +27 -16
- data/lib/rundoc/code_command/print/text.rb +27 -8
- data/lib/rundoc/code_command/raw.rb +17 -5
- data/lib/rundoc/code_command/rundoc/ensure_later.rb +59 -0
- data/lib/rundoc/code_command/rundoc/require.rb +25 -17
- data/lib/rundoc/code_command/rundoc_command.rb +26 -9
- data/lib/rundoc/code_command/website/driver.rb +2 -0
- data/lib/rundoc/code_command/website/navigate.rb +18 -12
- data/lib/rundoc/code_command/website/screenshot.rb +17 -11
- data/lib/rundoc/code_command/website/visit.rb +23 -12
- data/lib/rundoc/code_command/website.rb +2 -0
- data/lib/rundoc/code_command/write.rb +37 -9
- data/lib/rundoc/code_command.rb +6 -48
- data/lib/rundoc/context/after_build.rb +2 -0
- data/lib/rundoc/context/execution.rb +2 -0
- data/lib/rundoc/document.rb +6 -2
- data/lib/rundoc/fenced_code_block.rb +10 -7
- data/lib/rundoc/peg_parser.rb +25 -9
- data/lib/rundoc/version.rb +3 -1
- data/lib/rundoc.rb +89 -17
- data/rundoc.gemspec +3 -0
- data/test/integration/ensure_later_test.rb +335 -0
- data/test/integration/print_test.rb +51 -0
- data/test/rundoc/code_commands/append_file_test.rb +35 -10
- data/test/rundoc/code_commands/background_test.rb +24 -22
- data/test/rundoc/code_commands/bash_test.rb +10 -5
- data/test/rundoc/code_commands/comment_test.rb +116 -0
- data/test/rundoc/code_commands/pipe_test.rb +2 -2
- data/test/rundoc/code_commands/print_test.rb +13 -25
- data/test/rundoc/code_commands/remove_contents_test.rb +8 -3
- data/test/rundoc/code_section_test.rb +28 -21
- data/test/rundoc/peg_parser_test.rb +42 -1
- data/test/test_helper.rb +4 -2
- metadata +23 -6
- data/lib/rundoc/code_command/rundoc/depend_on.rb +0 -13
- data/test/fixtures/depend_on/dependency/rundoc.md +0 -5
- data/test/fixtures/depend_on/main/rundoc.md +0 -10
|
@@ -1,8 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module ::Rundoc
|
|
2
|
-
|
|
3
|
-
class
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
module CodeCommand
|
|
5
|
+
class RundocCommandArgs
|
|
6
|
+
attr_reader :code
|
|
7
|
+
|
|
8
|
+
def initialize(code = "")
|
|
9
|
+
@code = code
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class RundocCommandRunner
|
|
14
|
+
attr_reader :io, :contents
|
|
15
|
+
|
|
16
|
+
def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
|
|
17
|
+
@io = io
|
|
18
|
+
@contents = contents.dup if contents && !contents.empty?
|
|
19
|
+
@contents = user_args.code + (@contents || +"")
|
|
20
|
+
@binding = RUNDOC_ERB_BINDINGS[RUNDOC_DEFAULT_ERB_BINDING]
|
|
6
21
|
end
|
|
7
22
|
|
|
8
23
|
def to_md(env = {})
|
|
@@ -10,16 +25,18 @@ module ::Rundoc
|
|
|
10
25
|
end
|
|
11
26
|
|
|
12
27
|
def call(env = {})
|
|
13
|
-
puts "Running: #{contents}"
|
|
14
|
-
|
|
28
|
+
io.puts "Running: #{contents}"
|
|
29
|
+
Rundoc.capture_stdout_stderr(io) do
|
|
30
|
+
eval(contents, @binding) # rubocop:disable Security/Eval
|
|
31
|
+
end
|
|
15
32
|
""
|
|
16
33
|
end
|
|
17
34
|
end
|
|
18
35
|
end
|
|
19
36
|
end
|
|
20
37
|
|
|
21
|
-
Rundoc.register_code_command(:rundoc,
|
|
22
|
-
Rundoc.register_code_command(:"rundoc.configure",
|
|
38
|
+
Rundoc.register_code_command(keyword: :rundoc, args_klass: Rundoc::CodeCommand::RundocCommandArgs, runner_klass: Rundoc::CodeCommand::RundocCommandRunner)
|
|
39
|
+
Rundoc.register_code_command(keyword: :"rundoc.configure", args_klass: Rundoc::CodeCommand::RundocCommandArgs, runner_klass: Rundoc::CodeCommand::RundocCommandRunner)
|
|
23
40
|
|
|
24
|
-
require "rundoc/code_command/rundoc/depend_on"
|
|
25
41
|
require "rundoc/code_command/rundoc/require"
|
|
42
|
+
require "rundoc/code_command/rundoc/ensure_later"
|
|
@@ -1,8 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class Rundoc::CodeCommand::Website
|
|
2
|
-
class
|
|
4
|
+
class NavigateArgs
|
|
5
|
+
attr_reader :name
|
|
6
|
+
|
|
3
7
|
def initialize(name:)
|
|
4
8
|
@name = name
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class NavigateRunner
|
|
13
|
+
attr_reader :io, :contents
|
|
14
|
+
|
|
15
|
+
def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
|
|
16
|
+
@name = user_args.name
|
|
5
17
|
@driver = nil
|
|
18
|
+
@io = io
|
|
19
|
+
@contents = contents.dup if contents && !contents.empty?
|
|
6
20
|
end
|
|
7
21
|
|
|
8
22
|
def driver
|
|
@@ -14,20 +28,12 @@ class Rundoc::CodeCommand::Website
|
|
|
14
28
|
end
|
|
15
29
|
|
|
16
30
|
def call(env = {})
|
|
17
|
-
puts "website.navigate [#{@name}]: #{contents}"
|
|
31
|
+
io.puts "website.navigate [#{@name}]: #{contents}"
|
|
18
32
|
driver.safe_eval(contents, env)
|
|
19
33
|
""
|
|
20
34
|
end
|
|
21
|
-
|
|
22
|
-
def hidden?
|
|
23
|
-
true
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def not_hidden?
|
|
27
|
-
!hidden?
|
|
28
|
-
end
|
|
29
35
|
end
|
|
30
36
|
end
|
|
31
37
|
|
|
32
|
-
Rundoc.register_code_command(:"website.nav", Rundoc::CodeCommand::Website::
|
|
33
|
-
Rundoc.register_code_command(:"website.navigate", Rundoc::CodeCommand::Website::
|
|
38
|
+
Rundoc.register_code_command(keyword: :"website.nav", args_klass: Rundoc::CodeCommand::Website::NavigateArgs, runner_klass: Rundoc::CodeCommand::Website::NavigateRunner)
|
|
39
|
+
Rundoc.register_code_command(keyword: :"website.navigate", args_klass: Rundoc::CodeCommand::Website::NavigateArgs, runner_klass: Rundoc::CodeCommand::Website::NavigateRunner)
|
|
@@ -1,9 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
class Rundoc::CodeCommand::Website
|
|
2
|
-
class
|
|
4
|
+
class ScreenshotArgs
|
|
5
|
+
attr_reader :name, :upload
|
|
6
|
+
|
|
3
7
|
def initialize(name:, upload: false)
|
|
4
8
|
@name = name
|
|
5
9
|
@upload = upload
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
class ScreenshotRunner
|
|
14
|
+
attr_reader :io
|
|
15
|
+
|
|
16
|
+
def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
|
|
17
|
+
@name = user_args.name
|
|
18
|
+
@upload = user_args.upload
|
|
6
19
|
@driver = nil
|
|
20
|
+
@io = io
|
|
7
21
|
end
|
|
8
22
|
|
|
9
23
|
def driver
|
|
@@ -15,7 +29,7 @@ class Rundoc::CodeCommand::Website
|
|
|
15
29
|
end
|
|
16
30
|
|
|
17
31
|
def call(env = {})
|
|
18
|
-
puts "Taking screenshot: #{driver.current_url}"
|
|
32
|
+
io.puts "Taking screenshot: #{driver.current_url}"
|
|
19
33
|
filename = driver.screenshot(
|
|
20
34
|
upload: @upload,
|
|
21
35
|
screenshots_dir: env[:context].screenshots_dir
|
|
@@ -25,14 +39,6 @@ class Rundoc::CodeCommand::Website
|
|
|
25
39
|
env[:before] << ""
|
|
26
40
|
""
|
|
27
41
|
end
|
|
28
|
-
|
|
29
|
-
# def hidden?
|
|
30
|
-
# true
|
|
31
|
-
# end
|
|
32
|
-
|
|
33
|
-
# def not_hidden?
|
|
34
|
-
# !hidden?
|
|
35
|
-
# end
|
|
36
42
|
end
|
|
37
43
|
end
|
|
38
|
-
Rundoc.register_code_command(:"website.screenshot", Rundoc::CodeCommand::Website::
|
|
44
|
+
Rundoc.register_code_command(keyword: :"website.screenshot", args_klass: Rundoc::CodeCommand::Website::ScreenshotArgs, runner_klass: Rundoc::CodeCommand::Website::ScreenshotRunner)
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
class Rundoc::CodeCommand::Website
|
|
4
|
-
class
|
|
4
|
+
class VisitArgs
|
|
5
|
+
attr_reader :name, :url, :scroll, :height, :width, :visible, :max_attempts
|
|
6
|
+
|
|
5
7
|
def initialize(name:, url: nil, scroll: nil, height: 720, width: 1024, visible: false, max_attempts: 3)
|
|
6
8
|
@name = name
|
|
7
9
|
@url = url
|
|
@@ -11,6 +13,22 @@ class Rundoc::CodeCommand::Website
|
|
|
11
13
|
@visible = visible
|
|
12
14
|
@max_attempts = max_attempts
|
|
13
15
|
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
class VisitRunner
|
|
19
|
+
attr_reader :io, :contents
|
|
20
|
+
|
|
21
|
+
def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
|
|
22
|
+
@name = user_args.name
|
|
23
|
+
@url = user_args.url
|
|
24
|
+
@scroll = user_args.scroll
|
|
25
|
+
@height = user_args.height
|
|
26
|
+
@width = user_args.width
|
|
27
|
+
@visible = user_args.visible
|
|
28
|
+
@max_attempts = user_args.max_attempts
|
|
29
|
+
@io = io
|
|
30
|
+
@contents = contents.dup if contents && !contents.empty?
|
|
31
|
+
end
|
|
14
32
|
|
|
15
33
|
def driver
|
|
16
34
|
@driver ||= Driver.new(
|
|
@@ -18,7 +36,8 @@ class Rundoc::CodeCommand::Website
|
|
|
18
36
|
url: @url,
|
|
19
37
|
height: @height,
|
|
20
38
|
width: @width,
|
|
21
|
-
visible: @visible
|
|
39
|
+
visible: @visible,
|
|
40
|
+
io: io
|
|
22
41
|
).tap do |driver|
|
|
23
42
|
Driver.add(@name, driver)
|
|
24
43
|
end
|
|
@@ -32,7 +51,7 @@ class Rundoc::CodeCommand::Website
|
|
|
32
51
|
message = "Visting: #{@url}"
|
|
33
52
|
message << "and executing:\n#{contents}" unless contents.nil? || contents.empty?
|
|
34
53
|
|
|
35
|
-
puts message
|
|
54
|
+
io.puts message
|
|
36
55
|
|
|
37
56
|
driver.visit(@url, max_attempts: @max_attempts) if @url
|
|
38
57
|
driver.scroll(@scroll) if @scroll
|
|
@@ -42,15 +61,7 @@ class Rundoc::CodeCommand::Website
|
|
|
42
61
|
|
|
43
62
|
""
|
|
44
63
|
end
|
|
45
|
-
|
|
46
|
-
def hidden?
|
|
47
|
-
true
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
def not_hidden?
|
|
51
|
-
!hidden?
|
|
52
|
-
end
|
|
53
64
|
end
|
|
54
65
|
end
|
|
55
66
|
|
|
56
|
-
Rundoc.register_code_command(:"website.visit", Rundoc::CodeCommand::Website::
|
|
67
|
+
Rundoc.register_code_command(keyword: :"website.visit", args_klass: Rundoc::CodeCommand::Website::VisitArgs, runner_klass: Rundoc::CodeCommand::Website::VisitRunner)
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Rundoc
|
|
2
|
-
|
|
4
|
+
module CodeCommand
|
|
3
5
|
module FileUtil
|
|
4
6
|
def filename
|
|
5
7
|
files = Dir.glob(@filename)
|
|
@@ -15,16 +17,42 @@ module Rundoc
|
|
|
15
17
|
end
|
|
16
18
|
end
|
|
17
19
|
|
|
18
|
-
class
|
|
19
|
-
|
|
20
|
+
class WriteArgs
|
|
21
|
+
attr_reader :path
|
|
22
|
+
|
|
23
|
+
def initialize(path)
|
|
24
|
+
@path = Pathname(path)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
class WriteRunner
|
|
29
|
+
NEWLINE = Object.new
|
|
30
|
+
def NEWLINE.to_s
|
|
31
|
+
""
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def NEWLINE.empty?
|
|
35
|
+
false
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
include Rundoc::CodeCommand::FileUtil
|
|
39
|
+
|
|
40
|
+
attr_reader :io, :contents
|
|
41
|
+
|
|
42
|
+
def initialize(user_args:, render_command:, render_result:, io:, contents: nil)
|
|
43
|
+
@filename = user_args.path.to_s
|
|
44
|
+
@io = io
|
|
45
|
+
@render_command = render_command
|
|
46
|
+
@contents = contents.dup if contents && !contents.empty?
|
|
47
|
+
end
|
|
20
48
|
|
|
21
|
-
def
|
|
22
|
-
@
|
|
49
|
+
def render_command?
|
|
50
|
+
@render_command
|
|
23
51
|
end
|
|
24
52
|
|
|
25
53
|
def to_md(env)
|
|
26
54
|
if render_command?
|
|
27
|
-
if env[:commands].any? { |c| c[:
|
|
55
|
+
if env[:commands].any? { |c| c[:visibility].not_hidden? }
|
|
28
56
|
raise "must call write in its own code section"
|
|
29
57
|
end
|
|
30
58
|
env[:before] << "In file `#{filename}` write:"
|
|
@@ -34,7 +62,7 @@ module Rundoc
|
|
|
34
62
|
end
|
|
35
63
|
|
|
36
64
|
def call(env = {})
|
|
37
|
-
puts "Writing to: '#{filename}'"
|
|
65
|
+
io.puts "Writing to: '#{filename}'"
|
|
38
66
|
mkdir_p
|
|
39
67
|
File.write(filename, contents)
|
|
40
68
|
contents
|
|
@@ -43,8 +71,8 @@ module Rundoc
|
|
|
43
71
|
end
|
|
44
72
|
end
|
|
45
73
|
|
|
46
|
-
Rundoc.register_code_command(:write, Rundoc::CodeCommand::
|
|
47
|
-
Rundoc.register_code_command(:"file.write", Rundoc::CodeCommand::
|
|
74
|
+
Rundoc.register_code_command(keyword: :write, args_klass: Rundoc::CodeCommand::WriteArgs, runner_klass: Rundoc::CodeCommand::WriteRunner)
|
|
75
|
+
Rundoc.register_code_command(keyword: :"file.write", args_klass: Rundoc::CodeCommand::WriteArgs, runner_klass: Rundoc::CodeCommand::WriteRunner)
|
|
48
76
|
|
|
49
77
|
require "rundoc/code_command/file_command/append"
|
|
50
78
|
require "rundoc/code_command/file_command/remove"
|
data/lib/rundoc/code_command.rb
CHANGED
|
@@ -1,55 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
# Generic CodeCommand class to be inherited
|
|
3
|
-
#
|
|
4
|
-
class CodeCommand
|
|
5
|
-
# Newlines are stripped and re-added, this tells the project that
|
|
6
|
-
# we're intentionally wanting an extra newline
|
|
7
|
-
NEWLINE = Object.new
|
|
8
|
-
def NEWLINE.to_s
|
|
9
|
-
""
|
|
10
|
-
end
|
|
11
|
-
|
|
12
|
-
def NEWLINE.empty?
|
|
13
|
-
false
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
attr_accessor :render_result, :render_command,
|
|
17
|
-
:command, :contents, :keyword,
|
|
18
|
-
:original_args
|
|
19
|
-
|
|
20
|
-
alias_method :render_result?, :render_result
|
|
21
|
-
alias_method :render_command?, :render_command
|
|
22
|
-
|
|
23
|
-
def initialize(*args)
|
|
24
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
25
2
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def not_hidden?
|
|
31
|
-
!hidden?
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def push(contents)
|
|
35
|
-
@contents ||= ""
|
|
36
|
-
@contents << contents
|
|
37
|
-
end
|
|
38
|
-
alias_method :<<, :push
|
|
39
|
-
|
|
40
|
-
# Executes command to build project
|
|
41
|
-
# Is expected to return the result of the command
|
|
42
|
-
def call(env = {})
|
|
43
|
-
raise "not implemented on #{inspect}"
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
# the output of the command, i.e. `$ cat foo.txt`
|
|
47
|
-
def to_md(env = {})
|
|
48
|
-
raise "not implemented on #{inspect}"
|
|
49
|
-
end
|
|
3
|
+
module Rundoc
|
|
4
|
+
module CodeCommand
|
|
50
5
|
end
|
|
51
6
|
end
|
|
52
7
|
|
|
8
|
+
require "rundoc/code_command/empty_binding"
|
|
9
|
+
require "rundoc/code_command/deferred"
|
|
53
10
|
require "rundoc/code_command/bash"
|
|
54
11
|
require "rundoc/code_command/pipe"
|
|
55
12
|
require "rundoc/code_command/write"
|
|
@@ -61,3 +18,4 @@ require "rundoc/code_command/website"
|
|
|
61
18
|
require "rundoc/code_command/print/text"
|
|
62
19
|
require "rundoc/code_command/print/erb"
|
|
63
20
|
require "rundoc/code_command/pre/erb"
|
|
21
|
+
require "rundoc/code_command/comment"
|
data/lib/rundoc/document.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Rundoc
|
|
2
4
|
# Represents a single rundoc file on disk,
|
|
3
5
|
#
|
|
@@ -11,7 +13,8 @@ module Rundoc
|
|
|
11
13
|
|
|
12
14
|
attr_reader :contents, :stack, :context
|
|
13
15
|
|
|
14
|
-
def initialize(contents, context:)
|
|
16
|
+
def initialize(contents, context:, io: $stdout)
|
|
17
|
+
@io = io
|
|
15
18
|
@context = context
|
|
16
19
|
@contents = contents
|
|
17
20
|
@original = contents.dup
|
|
@@ -59,7 +62,8 @@ module Rundoc
|
|
|
59
62
|
fence: match[:fence],
|
|
60
63
|
lang: match[:lang],
|
|
61
64
|
code: match[:contents],
|
|
62
|
-
context: context
|
|
65
|
+
context: context,
|
|
66
|
+
io: @io
|
|
63
67
|
)
|
|
64
68
|
end
|
|
65
69
|
@contents = tail
|
|
@@ -15,7 +15,7 @@ module Rundoc
|
|
|
15
15
|
def executed_commands
|
|
16
16
|
raise "Nothing executed" unless @env[:commands].any?
|
|
17
17
|
|
|
18
|
-
@env[:commands].map { |c| c[:
|
|
18
|
+
@env[:commands].map { |c| c[:visibility] }
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
# @param fence [String] the fence used to start the code block like "```".
|
|
@@ -24,7 +24,8 @@ module Rundoc
|
|
|
24
24
|
# @param code [String] the code block contents inside the fence.
|
|
25
25
|
# @param context [Context::Execution] The details about where
|
|
26
26
|
# the code block came from.
|
|
27
|
-
def initialize(fence:, lang:, code:, context:)
|
|
27
|
+
def initialize(fence:, lang:, code:, context:, io: $stdout)
|
|
28
|
+
@io = io
|
|
28
29
|
@fence = fence
|
|
29
30
|
@lang = lang
|
|
30
31
|
@code = code
|
|
@@ -54,12 +55,13 @@ module Rundoc
|
|
|
54
55
|
env[:after] = []
|
|
55
56
|
env[:context] = @context
|
|
56
57
|
env[:stack] = @stack
|
|
58
|
+
while (item = @stack.pop)
|
|
59
|
+
code_command = item.build(io: @io)
|
|
57
60
|
|
|
58
|
-
while (code_command = @stack.pop)
|
|
59
61
|
code_output = code_command.call(env) || ""
|
|
60
62
|
code_line = code_command.to_md(env) || ""
|
|
61
|
-
result << code_line if
|
|
62
|
-
result << code_output if
|
|
63
|
+
result << code_line if item.render_command?
|
|
64
|
+
result << code_output if item.render_result?
|
|
63
65
|
|
|
64
66
|
PARTIAL_RESULT.replace(result)
|
|
65
67
|
PARTIAL_ENV.replace(env)
|
|
@@ -67,11 +69,12 @@ module Rundoc
|
|
|
67
69
|
env[:commands] << {
|
|
68
70
|
object: code_command,
|
|
69
71
|
output: code_output,
|
|
70
|
-
command: code_line
|
|
72
|
+
command: code_line,
|
|
73
|
+
visibility: item
|
|
71
74
|
}
|
|
72
75
|
end
|
|
73
76
|
|
|
74
|
-
if env[:commands].any? { |c| c[:
|
|
77
|
+
if env[:commands].any? { |c| c[:visibility].not_hidden? }
|
|
75
78
|
@rendered = self.class.to_doc(result: result, env: env)
|
|
76
79
|
end
|
|
77
80
|
self
|
data/lib/rundoc/peg_parser.rb
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require "parslet"
|
|
2
4
|
|
|
3
5
|
module Rundoc
|
|
4
6
|
class PegParser < Parslet::Parser
|
|
5
7
|
rule(:spaces) { match('\s').repeat(1) }
|
|
6
8
|
rule(:spaces?) { spaces.maybe }
|
|
9
|
+
rule(:horizontal_spaces) { match('[ \t]').repeat(1) }
|
|
7
10
|
rule(:comma) { spaces? >> str(",") >> spaces? }
|
|
8
11
|
rule(:digit) { match("[0-9]") }
|
|
9
12
|
rule(:lparen) { str("(") >> spaces? }
|
|
@@ -36,9 +39,16 @@ module Rundoc
|
|
|
36
39
|
).as(:number)
|
|
37
40
|
}
|
|
38
41
|
|
|
42
|
+
rule(:symbol) {
|
|
43
|
+
str(":") >> (
|
|
44
|
+
match("[a-zA-Z_]") >> match("[a-zA-Z0-9_]").repeat
|
|
45
|
+
).as(:symbol)
|
|
46
|
+
}
|
|
47
|
+
|
|
39
48
|
rule(:value) {
|
|
40
49
|
string |
|
|
41
50
|
number |
|
|
51
|
+
symbol |
|
|
42
52
|
str("true").as(true) |
|
|
43
53
|
str("false").as(false) |
|
|
44
54
|
str("nil").as(:nil)
|
|
@@ -87,7 +97,7 @@ module Rundoc
|
|
|
87
97
|
}
|
|
88
98
|
|
|
89
99
|
rule(:seattle_method) {
|
|
90
|
-
funcall >>
|
|
100
|
+
funcall >> horizontal_spaces >>
|
|
91
101
|
args.as(:args)
|
|
92
102
|
}
|
|
93
103
|
|
|
@@ -172,6 +182,7 @@ module Rundoc
|
|
|
172
182
|
rule(true => simple(:tr)) { true }
|
|
173
183
|
rule(false => simple(:fa)) { false }
|
|
174
184
|
rule(string: simple(:st)) { st.to_s }
|
|
185
|
+
rule(symbol: simple(:sy)) { sy.to_s.to_sym }
|
|
175
186
|
|
|
176
187
|
rule(number: simple(:nb)) {
|
|
177
188
|
/[eE.]/.match?(nb) ? Float(nb) : Integer(nb)
|
|
@@ -242,8 +253,8 @@ module Rundoc
|
|
|
242
253
|
raise TransformError.new(message: message, line_and_column: line_and_column)
|
|
243
254
|
end
|
|
244
255
|
Visability.new(
|
|
245
|
-
command: command.to_s == ">"
|
|
246
|
-
result: result.to_s == ">"
|
|
256
|
+
command: command.to_s == ">",
|
|
257
|
+
result: result.to_s == ">"
|
|
247
258
|
)
|
|
248
259
|
}
|
|
249
260
|
|
|
@@ -265,16 +276,21 @@ module Rundoc
|
|
|
265
276
|
code_command
|
|
266
277
|
}
|
|
267
278
|
|
|
268
|
-
# The lines before a CodeCommand are rendered
|
|
269
|
-
# without running any code
|
|
270
279
|
rule(raw_code: simple(:raw_code)) {
|
|
271
|
-
CodeCommand::
|
|
280
|
+
deferred = CodeCommand::Deferred.new(args_instance: nil, runner_klass: CodeCommand::Raw)
|
|
281
|
+
deferred.render_command = false
|
|
282
|
+
deferred.render_result = true
|
|
283
|
+
deferred.push(raw_code.to_s)
|
|
284
|
+
deferred
|
|
272
285
|
}
|
|
273
286
|
|
|
274
|
-
# Sometimes
|
|
275
287
|
rule(raw_code: sequence(:raw_code)) {
|
|
276
|
-
|
|
277
|
-
CodeCommand::
|
|
288
|
+
visible = !raw_code.nil? && !raw_code.empty?
|
|
289
|
+
deferred = CodeCommand::Deferred.new(args_instance: nil, runner_klass: CodeCommand::Raw)
|
|
290
|
+
deferred.render_command = false
|
|
291
|
+
deferred.render_result = visible
|
|
292
|
+
deferred.push(raw_code.map(&:to_s).join)
|
|
293
|
+
deferred
|
|
278
294
|
}
|
|
279
295
|
end
|
|
280
296
|
end
|
data/lib/rundoc/version.rb
CHANGED