source2md 0.0.9 → 0.0.11
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 +10 -22
- data/Rakefile +1 -1
- data/doc/0100_top.rb +5 -5
- data/doc/0110_code_small.rb +11 -1
- data/doc/0120_code_long.rb +9 -1
- data/doc/0130_hidden.rb +3 -1
- data/doc/0140_code_include.rb +9 -1
- data/doc/0150_raw_include.rb +2 -1
- data/doc/0160_title.rb +1 -1
- data/doc/{0180_table.rb → 0170_table.rb} +1 -1
- data/doc/{0190_method.rb → 0180_method.rb} +3 -3
- data/doc/{0200_alert.rb → 0190_alert.rb} +8 -1
- data/doc/{0210_text.rb → 0200_text.rb} +3 -1
- data/doc/{0220_text_oneline.rb → 0210_text_oneline.rb} +2 -1
- data/doc/{0230_text_squish.rb → 0220_text_squish.rb} +2 -1
- data/doc/{0240_text_hankaku_kana.rb → 0230_text_hankaku_kana.rb} +2 -1
- data/doc/{0250_parse_include.rb → 0240_parse_include.rb} +2 -1
- data/doc/setup.rb +3 -0
- data/examples/cli-test.rs +6 -3
- data/examples/cli-test.sh +1 -1
- data/lib/source2md/cli.rb +13 -2
- data/lib/source2md/code_block.rb +20 -25
- data/lib/source2md/element.rb +16 -6
- data/lib/source2md/formatter/type_code_include.rb +1 -1
- data/lib/source2md/formatter/type_method.rb +15 -7
- data/lib/source2md/formatter/{type_md_title.rb → type_nop.rb} +3 -3
- data/lib/source2md/formatter/type_raw_include.rb +2 -1
- data/lib/source2md/formatter/type_source_block.rb +4 -4
- data/lib/source2md/formatter/type_table.rb +5 -5
- data/lib/source2md/formatter/type_text.rb +5 -3
- data/lib/source2md/generator.rb +1 -1
- data/lib/source2md/re.rb +3 -0
- data/lib/source2md/regexp_builder.rb +33 -0
- data/lib/source2md/scanner.rb +22 -17
- data/lib/source2md/text_helper.rb +13 -4
- data/lib/source2md/version.rb +1 -1
- data/lib/source2md.rb +2 -0
- data/spec/code_block_spec.rb +2 -1
- data/spec/formatter/type_code_include_spec.rb +3 -3
- data/spec/formatter/type_method_spec.rb +3 -2
- data/spec/formatter/type_partial_code_spec.rb +1 -1
- data/spec/formatter/type_raw_include_spec.rb +1 -1
- data/spec/formatter/type_source_block_spec.rb +2 -2
- data/spec/formatter/type_table_spec.rb +2 -2
- data/spec/formatter/type_text_spec.rb +5 -4
- data/spec/scanner_spec.rb +1 -7
- data/spec/text_helper_spec.rb +8 -4
- metadata +13 -15
- data/doc/0170_md_like_title.rb +0 -24
- data/examples/type_md_title.rb +0 -15
- data/spec/formatter/type_md_title_spec.rb +0 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4cbcbb886c48d226f8864af1134aa3c0bdac15dcb2adf2acfd8aadb1d9b62bcc
|
4
|
+
data.tar.gz: bdcdb4870afc49aeb7fbb20534a54ba44fd42bd9e1e56c2bb260babe46d9cb74
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9fe4bde35b551e33b11a53a10df2941b3828eba7b5e91c470bae0001f26f95ab2ecb006183fb89384be8fe22d3f9b5c461917b1525e3f002800846f19ea2547a
|
7
|
+
data.tar.gz: ab48da56d8bf0b4ce3755432f9ed281dbceacf67a8cdbb4663b328f614c73bdcc1680a4e03675d8ba547ff638d054f2249644fca5f52c6812b3e17c6474b523c
|
data/README.md
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
|
2
|
+
|
1
3
|
# Source2MD: Markdown generator from source code #
|
2
4
|
|
3
5
|
## Logic ##
|
@@ -75,6 +77,14 @@ puts Source2MD::Section.new(<<~EOS).to_md
|
|
75
77
|
EOS
|
76
78
|
```
|
77
79
|
|
80
|
+
```ruby
|
81
|
+
puts Source2MD::Section.new(<<~EOS).to_md
|
82
|
+
#+BEGIN_SRC hidden!
|
83
|
+
p "This paragraph is not displayed"
|
84
|
+
#+END_SRC
|
85
|
+
EOS
|
86
|
+
```
|
87
|
+
|
78
88
|
### Code include ###
|
79
89
|
|
80
90
|
Insert inside the code block.
|
@@ -135,28 +145,6 @@ EOS
|
|
135
145
|
### Title Level 3 ###
|
136
146
|
```
|
137
147
|
|
138
|
-
### Markdown style title ###
|
139
|
-
|
140
|
-
The condition is that there are the same number of sharps on the back.
|
141
|
-
|
142
|
-
```ruby
|
143
|
-
puts Source2MD::Section.new(<<~EOS).to_md
|
144
|
-
# Title Level 1 #
|
145
|
-
|
146
|
-
## Title Level 2 ##
|
147
|
-
|
148
|
-
### Title Level 3 ###
|
149
|
-
EOS
|
150
|
-
```
|
151
|
-
|
152
|
-
```
|
153
|
-
# Title Level 1 #
|
154
|
-
|
155
|
-
## Title Level 2 ##
|
156
|
-
|
157
|
-
### Title Level 3 ###
|
158
|
-
```
|
159
|
-
|
160
148
|
### Org-mode table style ###
|
161
149
|
|
162
150
|
```ruby
|
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ namespace :doc do
|
|
11
11
|
task "generate" do
|
12
12
|
Rake::Task["doc:renum"].execute
|
13
13
|
system "sh", "-vec", <<~EOT, exception: true
|
14
|
-
.bin/source2md generate --no-debug --
|
14
|
+
.bin/source2md generate --no-debug --xmp-out-exclude --prefix_re '^' -o README.md doc/0*
|
15
15
|
EOT
|
16
16
|
end
|
17
17
|
|
data/doc/0100_top.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title1: Source2MD: Markdown generator from source code
|
5
5
|
|
6
|
-
|
6
|
+
#+title2: Logic
|
7
7
|
|
8
8
|
# 1. Divide the source code into paragraphs using blank lines as separations.
|
9
9
|
# 1. Remove comments from the comment blocks.
|
10
10
|
# 1. Include the code within the code block.
|
11
11
|
|
12
|
-
|
12
|
+
#+title2: Install
|
13
13
|
|
14
14
|
# ```
|
15
15
|
# $ gem i source2md
|
16
16
|
# ```
|
17
17
|
|
18
|
-
|
18
|
+
#+title2: CLI
|
19
19
|
|
20
20
|
# ```
|
21
21
|
# $ source2md generate -o README.md README.rb
|
22
22
|
# ```
|
23
23
|
|
24
|
-
|
24
|
+
#+title2: Rules
|
data/doc/0110_code_small.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Code snippet
|
5
5
|
|
6
6
|
# Separated by blank lines.
|
7
7
|
|
@@ -24,3 +24,13 @@ EOS
|
|
24
24
|
# > ```ruby
|
25
25
|
# > hello.call
|
26
26
|
# > ```
|
27
|
+
# >> ```ruby
|
28
|
+
# >> hello = -> {
|
29
|
+
# >> "Hello, world!"
|
30
|
+
# >> }
|
31
|
+
# >> ```
|
32
|
+
# >>
|
33
|
+
# >>
|
34
|
+
# >> ```ruby
|
35
|
+
# >> hello.call
|
36
|
+
# >> ```
|
data/doc/0120_code_long.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Source block with many lines
|
5
5
|
|
6
6
|
#+BEGIN_SRC
|
7
7
|
puts Source2MD::Section.new(<<~EOS).to_md
|
@@ -22,3 +22,11 @@ EOS
|
|
22
22
|
# >
|
23
23
|
# > hello.call
|
24
24
|
# > ```
|
25
|
+
# >> ["/Users/ikeda/src/zenn/source2md/lib/source2md/scanner.rb:14", :to_a, /(?m-ix:(?-mix:(?-mix:^)(?:(?-mix:#|\/\/)))\+BEGIN_SRC.*?(?-mix:(?-mix:^)(?:(?-mix:#|\/\/)))\+END_SRC)|(?m-ix:.*?\R{2,})/]
|
26
|
+
# >> ```ruby
|
27
|
+
# >> hello = -> {
|
28
|
+
# >> "Hello, world!"
|
29
|
+
# >> }
|
30
|
+
# >>
|
31
|
+
# >> hello.call
|
32
|
+
# >> ```
|
data/doc/0130_hidden.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Hide paragraph
|
5
5
|
|
6
6
|
#+BEGIN_SRC
|
7
7
|
puts Source2MD::Section.new(<<~EOS).to_md
|
@@ -17,3 +17,5 @@ puts Source2MD::Section.new(<<~EOS).to_md
|
|
17
17
|
#+END_SRC
|
18
18
|
EOS
|
19
19
|
#+END_SRC
|
20
|
+
# >>
|
21
|
+
# >>
|
data/doc/0140_code_include.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Code include
|
5
5
|
|
6
6
|
# Insert inside the code block.
|
7
7
|
|
@@ -24,3 +24,11 @@ EOS
|
|
24
24
|
# > <p>Hello</p>
|
25
25
|
# > ```
|
26
26
|
# > ````
|
27
|
+
# >> ```html:hello.html
|
28
|
+
# >> <p>Hello</p>
|
29
|
+
# >> ```
|
30
|
+
# >>
|
31
|
+
# >>
|
32
|
+
# >> ```xml:OUTPUT
|
33
|
+
# >> <p>Hello</p>
|
34
|
+
# >> ```
|
data/doc/0150_raw_include.rb
CHANGED
data/doc/0160_title.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Explain method simply
|
5
5
|
|
6
6
|
#+BEGIN_SRC
|
7
7
|
puts Source2MD::Section.new(<<~EOS).to_md
|
8
8
|
#+name: String#size
|
9
9
|
#+desc: Return the number of characters
|
10
10
|
#+comment: Comments about size
|
11
|
-
"abc".size
|
11
|
+
"abc".size # => 3
|
12
12
|
|
13
13
|
#+name: String#reverse
|
14
14
|
#+desc: reverse the sequence of characters
|
15
15
|
#+comment: Comments about reverse
|
16
|
-
"abc".reverse
|
16
|
+
"abc".reverse # => "cba"
|
17
17
|
EOS
|
18
18
|
#+END_SRC
|
19
19
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Warning and Alert message
|
5
5
|
|
6
6
|
# Exclusive to Zenn
|
7
7
|
|
@@ -24,3 +24,10 @@ EOS
|
|
24
24
|
# > this is alert message
|
25
25
|
# > :::
|
26
26
|
# > ```
|
27
|
+
# >> :::message
|
28
|
+
# >> this is warning message
|
29
|
+
# >> :::
|
30
|
+
# >>
|
31
|
+
# >> :::message alert
|
32
|
+
# >> this is alert message
|
33
|
+
# >> :::
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Raw Text
|
5
5
|
|
6
6
|
# If no rule applies and the text begins with `#`, remove the `#`.
|
7
7
|
|
@@ -16,3 +16,5 @@ EOS
|
|
16
16
|
# > Lorem ipsum dolor sit amet, consectetur adipisicing elit,
|
17
17
|
# > sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
18
18
|
# > ```
|
19
|
+
# >> Lorem ipsum dolor sit amet, consectetur adipisicing elit,
|
20
|
+
# >> sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Oneline Text
|
5
5
|
|
6
6
|
# Using this option allows you to split a line regardless of the markdown library.
|
7
7
|
|
@@ -16,3 +16,4 @@ EOS
|
|
16
16
|
# > ```
|
17
17
|
# > Lorem ipsum dolor sit amet, consectetur adipisicing elit,sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
18
18
|
# > ```
|
19
|
+
# >> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#+hidden: true
|
2
2
|
require "./setup"
|
3
3
|
|
4
|
-
|
4
|
+
#+title3: Squish Text
|
5
5
|
|
6
6
|
# Single spaces for line breaks and consecutive spaces.
|
7
7
|
|
@@ -16,3 +16,4 @@ EOS
|
|
16
16
|
# > ```
|
17
17
|
# > Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
18
18
|
# > ```
|
19
|
+
# >> Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
data/doc/setup.rb
CHANGED
data/examples/cli-test.rs
CHANGED
data/examples/cli-test.sh
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
#!/bin/sh
|
2
|
-
source2md generate -d
|
2
|
+
../.bin/source2md generate -d cli-test.rs
|
data/lib/source2md/cli.rb
CHANGED
@@ -2,7 +2,10 @@ module Source2MD
|
|
2
2
|
class Cli < Thor
|
3
3
|
class_option :debug, type: :boolean, aliases: "-d", default: false
|
4
4
|
class_option :xmp_out_exclude, type: :boolean, aliases: "-x", default: false
|
5
|
-
class_option :readonly, type: :boolean, default: true
|
5
|
+
class_option :readonly, type: :boolean, aliases: "-r", default: true
|
6
|
+
class_option :default_lang, type: :string, aliases: "-l", default: "ruby"
|
7
|
+
class_option :prefix_re, type: :string
|
8
|
+
class_option :comment_re, type: :string
|
6
9
|
|
7
10
|
def initialize(...)
|
8
11
|
super
|
@@ -14,8 +17,16 @@ module Source2MD
|
|
14
17
|
|
15
18
|
Source2MD.xmp_out_exclude = options[:xmp_out_exclude]
|
16
19
|
Source2MD.readonly = options[:readonly]
|
20
|
+
Source2MD.default_lang = options[:default_lang]
|
17
21
|
|
18
|
-
|
22
|
+
Source2MD::RE.update do |e|
|
23
|
+
if v = options[:prefix_re]
|
24
|
+
e.prefix_re = v
|
25
|
+
end
|
26
|
+
if v = options[:comment_re]
|
27
|
+
e.comment_re = v
|
28
|
+
end
|
29
|
+
end
|
19
30
|
end
|
20
31
|
|
21
32
|
# default_command :generate
|
data/lib/source2md/code_block.rb
CHANGED
@@ -1,24 +1,22 @@
|
|
1
1
|
module Source2MD
|
2
2
|
class CodeBlock
|
3
3
|
PADDING_KEEP = 2
|
4
|
-
|
4
|
+
ARROW_MARK = %r{(?:#{RE.comment_re}) =>}
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
def initialize(code, options = {})
|
9
|
-
@code = code
|
6
|
+
def initialize(text, options = {})
|
7
|
+
@text = text
|
10
8
|
@options = {
|
11
|
-
:lang =>
|
9
|
+
:lang => nil,
|
12
10
|
# :single_sharp_replace_to_blank_line => false,
|
13
11
|
}.merge(options)
|
14
12
|
end
|
15
13
|
|
16
14
|
def to_md
|
17
15
|
[
|
18
|
-
"```#{code_block_head}",
|
16
|
+
"```#{code_block_head}\n",
|
19
17
|
normalized_code,
|
20
|
-
"
|
21
|
-
]
|
18
|
+
"```\n",
|
19
|
+
].join
|
22
20
|
end
|
23
21
|
|
24
22
|
private
|
@@ -28,7 +26,7 @@ module Source2MD
|
|
28
26
|
if s = @options[:desc]
|
29
27
|
o << s
|
30
28
|
else
|
31
|
-
if s =
|
29
|
+
if s = lang
|
32
30
|
o << s
|
33
31
|
end
|
34
32
|
if s = @options[:name]
|
@@ -40,25 +38,22 @@ module Source2MD
|
|
40
38
|
end
|
41
39
|
|
42
40
|
def normalized_code
|
43
|
-
lines.collect(&method(:normalize))
|
41
|
+
lines.collect(&method(:normalize)).join
|
44
42
|
end
|
45
43
|
|
46
44
|
def normalize(line)
|
47
45
|
# if @options[:single_sharp_replace_to_blank_line]
|
48
46
|
# line = single_sharp_replace_to_blank_line(line)
|
49
47
|
# end
|
50
|
-
|
51
|
-
line = comment_mark_justfiy(line)
|
52
|
-
end
|
53
|
-
line
|
48
|
+
comment_re_justfiy(line)
|
54
49
|
end
|
55
50
|
|
56
51
|
# def single_sharp_replace_to_blank_line(line)
|
57
52
|
# line.gsub(/\A#\z/, "")
|
58
53
|
# end
|
59
54
|
|
60
|
-
def
|
61
|
-
line.gsub(/(.*?)\s*(#{
|
55
|
+
def comment_re_justfiy(line)
|
56
|
+
line.gsub(/(.*?)\s*(#{ARROW_MARK})(.*)/) {
|
62
57
|
a, b, c = Regexp.last_match.captures
|
63
58
|
space = " " * (PADDING_KEEP + (max - a.size))
|
64
59
|
[a, space, b, c].join
|
@@ -66,24 +61,24 @@ module Source2MD
|
|
66
61
|
end
|
67
62
|
|
68
63
|
def raw_lines
|
69
|
-
@raw_lines ||=
|
64
|
+
@raw_lines ||= @text.lines
|
70
65
|
end
|
71
66
|
|
72
67
|
def lines
|
73
|
-
@lines ||=
|
74
|
-
min = raw_lines.collect { |e| e.slice(/^\s*/).size }.min
|
75
|
-
re = /^\s{#{min}}/
|
76
|
-
raw_lines.collect { |e| e.remove(re) }
|
77
|
-
end
|
68
|
+
@lines ||= TextHelper.space_prefix_remove(@text).lines
|
78
69
|
end
|
79
70
|
|
80
71
|
def max
|
81
72
|
@max ||= yield_self do
|
82
73
|
av = lines
|
83
|
-
av = av.find_all { |e| e.match?(
|
84
|
-
av = av.collect { |e| e.gsub(/\s*#{
|
74
|
+
av = av.find_all { |e| e.match?(ARROW_MARK) }
|
75
|
+
av = av.collect { |e| e.gsub(/\s*#{ARROW_MARK}.*\R/, "").size }
|
85
76
|
av.max
|
86
77
|
end
|
87
78
|
end
|
79
|
+
|
80
|
+
def lang
|
81
|
+
@options[:lang] || ENV["DEFAULT_LANG"] || Source2MD.default_lang
|
82
|
+
end
|
88
83
|
end
|
89
84
|
end
|
data/lib/source2md/element.rb
CHANGED
@@ -1,10 +1,7 @@
|
|
1
1
|
module Source2MD
|
2
2
|
class Element
|
3
|
-
KEY_VALUE_REGEXP = /^(?:#|\/\/)\+(\S+):\s*(.*)\R?/ # #+key: value
|
4
|
-
|
5
3
|
PLUGINS = [
|
6
4
|
Formatter::TypeHidden, # #+hidden: true
|
7
|
-
Formatter::TypeMdTitle, # ## foo ##
|
8
5
|
Formatter::TypeCodeInclude, # #+code_include: path/to/foo.html xml:SAMPLE.xml
|
9
6
|
Formatter::TypeRawInclude, # #+raw_include: path/to/file.txt
|
10
7
|
Formatter::TypeParseInclude, # #+parse_include: path/to/file.txt
|
@@ -30,17 +27,25 @@ module Source2MD
|
|
30
27
|
end
|
31
28
|
|
32
29
|
def head
|
33
|
-
@head ||= @content.scan(
|
30
|
+
@head ||= @content.scan(key_value_regexp).to_h.freeze
|
34
31
|
end
|
35
32
|
|
36
33
|
def body
|
37
|
-
@body ||= @content.remove(
|
34
|
+
@body ||= @content.remove(key_value_regexp).freeze
|
38
35
|
end
|
39
36
|
|
40
37
|
private
|
41
38
|
|
42
39
|
def support_klass
|
43
|
-
@support_klass ||=
|
40
|
+
@support_klass ||= yield_self do
|
41
|
+
Source2MD.logger.debug { "head: #{head.inspect}" }
|
42
|
+
Source2MD.logger.debug { "body: #{body.inspect}" }
|
43
|
+
PLUGINS.find do |e|
|
44
|
+
e.accept?(self).tap do |result|
|
45
|
+
Source2MD.logger.debug { "#{e} => #{result}" }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
44
49
|
end
|
45
50
|
|
46
51
|
def debug_log(object)
|
@@ -58,5 +63,10 @@ module Source2MD
|
|
58
63
|
s.gsub(/^/, "> ")
|
59
64
|
end
|
60
65
|
end
|
66
|
+
|
67
|
+
# #+key: value
|
68
|
+
def key_value_regexp
|
69
|
+
/^#{RE.meta_re}\+(\S+):\s*(.*)\R?/
|
70
|
+
end
|
61
71
|
end
|
62
72
|
end
|
@@ -6,18 +6,26 @@ module Source2MD
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def to_md
|
9
|
-
[
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
o = []
|
10
|
+
o << "### #{element.head["name"]} ###\n"
|
11
|
+
if v = element.head["desc"]
|
12
|
+
o << "\n"
|
13
|
+
o << v + "\n"
|
14
|
+
o << "\n"
|
15
|
+
end
|
16
|
+
o << CodeBlock.new(body).to_md
|
17
|
+
if v = element.head["comment"]
|
18
|
+
o << "\n"
|
19
|
+
o << v + "\n"
|
20
|
+
o << "\n"
|
21
|
+
end
|
22
|
+
o.join
|
15
23
|
end
|
16
24
|
|
17
25
|
private
|
18
26
|
|
19
27
|
def body
|
20
|
-
element.body.gsub(
|
28
|
+
element.body.gsub(%r{(#{RE.comment_re})$}, "")
|
21
29
|
end
|
22
30
|
end
|
23
31
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module Source2MD
|
2
2
|
module Formatter
|
3
|
-
class
|
3
|
+
class TypeNop < Base
|
4
4
|
def self.accept?(element)
|
5
|
-
element.head
|
5
|
+
element.head["nop"]
|
6
6
|
end
|
7
7
|
|
8
8
|
def to_md
|
9
|
-
|
9
|
+
""
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -2,7 +2,7 @@ module Source2MD
|
|
2
2
|
module Formatter
|
3
3
|
class TypeSourceBlock < Base
|
4
4
|
def self.accept?(element)
|
5
|
-
element.body.
|
5
|
+
element.body.match?(%r{#{RE.meta_re}\+BEGIN_SRC})
|
6
6
|
end
|
7
7
|
|
8
8
|
def to_md
|
@@ -15,12 +15,12 @@ module Source2MD
|
|
15
15
|
private
|
16
16
|
|
17
17
|
def body
|
18
|
-
element.body.match(
|
18
|
+
element.body.match(%r{#{RE.meta_re}\+BEGIN_SRC.*?\R(.*)#{RE.meta_re}\+END_SRC}m).captures.first
|
19
19
|
end
|
20
20
|
|
21
21
|
def code_block_desc
|
22
|
-
if md = element.body.match(
|
23
|
-
md.captures.first
|
22
|
+
if md = element.body.match(%r{#{RE.meta_re}\+BEGIN_SRC (.+)\R})
|
23
|
+
md.captures.first
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
@@ -2,15 +2,15 @@ module Source2MD
|
|
2
2
|
module Formatter
|
3
3
|
class TypeTable < Base
|
4
4
|
def self.accept?(element)
|
5
|
-
!element.body.empty? && element.body.lines.all? { |e| e.match?(
|
5
|
+
!element.body.empty? && element.body.lines.all? { |e| e.match?(%r{#{RE.meta_re} \|.*\|$}) }
|
6
6
|
end
|
7
7
|
|
8
8
|
def to_md
|
9
9
|
element.body
|
10
|
-
.remove(
|
11
|
-
.remove(/\A\|-.*?-\|\R
|
12
|
-
.remove(/^\|-.*?-\|\z/)
|
13
|
-
.gsub(/-\+-/, "-|-")
|
10
|
+
.remove(%r{#{RE.meta_re} })
|
11
|
+
.remove(/\A\|-.*?-\|\R/) # top
|
12
|
+
.remove(/^\|-.*?-\|\R\z/) # bottom
|
13
|
+
.gsub(/-\+-/, "-|-")
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -3,10 +3,12 @@ module Source2MD
|
|
3
3
|
class TypeText < Base
|
4
4
|
# "# xxx"
|
5
5
|
# "#"
|
6
|
-
REGEXP =
|
6
|
+
REGEXP = %r{#{RE.meta_re}( |$)}
|
7
7
|
|
8
8
|
def self.accept?(element)
|
9
|
-
element.body.
|
9
|
+
if element.body.present?
|
10
|
+
element.body.lines.all? { |e| e.match?(REGEXP) }
|
11
|
+
end
|
10
12
|
end
|
11
13
|
|
12
14
|
def to_md
|
@@ -26,7 +28,7 @@ module Source2MD
|
|
26
28
|
if element.head["hankaku_kana"] == "true"
|
27
29
|
s = TextHelper.hankaku_kana(s)
|
28
30
|
end
|
29
|
-
s
|
31
|
+
TextHelper.eol_enter(s)
|
30
32
|
end
|
31
33
|
end
|
32
34
|
end
|
data/lib/source2md/generator.rb
CHANGED
data/lib/source2md/re.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
module Source2MD
|
2
|
+
class RegexpBuilder
|
3
|
+
attr_accessor :prefix_re
|
4
|
+
attr_accessor :comment_re
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
update do |e|
|
8
|
+
e.prefix_re = %r{^\s*}
|
9
|
+
e.comment_re = %r{#|//}
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
def update(&block)
|
14
|
+
yield self
|
15
|
+
reset
|
16
|
+
end
|
17
|
+
|
18
|
+
def meta_re
|
19
|
+
@meta_re ||= %r{#{prefix_re}(?:#{comment_re})}
|
20
|
+
end
|
21
|
+
|
22
|
+
def stdout_re
|
23
|
+
@stdout_re ||= %r{^(?:#{comment_re}) >>.*$}
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def reset
|
29
|
+
@meta_re = nil
|
30
|
+
@stdout_re = nil
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
data/lib/source2md/scanner.rb
CHANGED
@@ -1,31 +1,36 @@
|
|
1
1
|
module Source2MD
|
2
2
|
class Scanner
|
3
|
-
SEPARATOR = "\\R{2,}"
|
4
|
-
|
5
|
-
SRC_BEGIN_KEY = "BEGIN_SRC"
|
6
|
-
SRC_END_KEY = "END_SRC"
|
7
|
-
SRC_BLOCK_RE = /^#\+#{SRC_BEGIN_KEY}.*?^#\+#{SRC_END_KEY}/m
|
8
|
-
|
9
|
-
NORMAL_BLOCK_RE = /.*?#{SEPARATOR}/m
|
10
|
-
|
11
|
-
PARAGRAPH_RE = Regexp.union [
|
12
|
-
SRC_BLOCK_RE,
|
13
|
-
NORMAL_BLOCK_RE,
|
14
|
-
]
|
15
|
-
|
16
3
|
def initialize(content)
|
17
4
|
@content = content
|
18
5
|
end
|
19
6
|
|
20
7
|
def to_a
|
21
8
|
v = @content
|
9
|
+
v = v.rstrip + "\n\n"
|
22
10
|
if Source2MD.xmp_out_exclude
|
23
|
-
v = v.remove(
|
11
|
+
v = v.remove(RE.stdout_re)
|
24
12
|
end
|
25
|
-
v = v
|
26
|
-
v = v.
|
27
|
-
v = v.collect(&:rstrip)
|
13
|
+
v = v.scan(paragraph_re)
|
14
|
+
v = v.collect { |e| e.rstrip + "\n" }
|
28
15
|
v = v.find_all(&:present?)
|
29
16
|
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def paragraph_re
|
21
|
+
Regexp.union(src_block_re, normal_block_re)
|
22
|
+
end
|
23
|
+
|
24
|
+
def src_block_re
|
25
|
+
%r{#{RE.meta_re}\+BEGIN_SRC.*?#{RE.meta_re}\+END_SRC}m
|
26
|
+
end
|
27
|
+
|
28
|
+
def normal_block_re
|
29
|
+
/.*?#{separator}/m
|
30
|
+
end
|
31
|
+
|
32
|
+
def separator
|
33
|
+
"\\R{2,}"
|
34
|
+
end
|
30
35
|
end
|
31
36
|
end
|
@@ -6,10 +6,6 @@ module Source2MD
|
|
6
6
|
text.gsub(/\n{3,}/, "\n\n")
|
7
7
|
end
|
8
8
|
|
9
|
-
def add_newline_at_end_of_text(text)
|
10
|
-
text.strip + "\n"
|
11
|
-
end
|
12
|
-
|
13
9
|
def oneline(text)
|
14
10
|
text.remove(/\R+/)
|
15
11
|
end
|
@@ -21,5 +17,18 @@ module Source2MD
|
|
21
17
|
def hankaku_kana(text)
|
22
18
|
NKF.nkf("-wxZ4", text)
|
23
19
|
end
|
20
|
+
|
21
|
+
def indent(text, size = 2)
|
22
|
+
text.gsub(/^/, " " * size)
|
23
|
+
end
|
24
|
+
|
25
|
+
def eol_enter(text)
|
26
|
+
text.rstrip + "\n"
|
27
|
+
end
|
28
|
+
|
29
|
+
def space_prefix_remove(text)
|
30
|
+
min = text.lines.reject(&:blank?).collect { |e| e.slice(/^\s*/).size }.min
|
31
|
+
text.remove(/^ {#{min}}/)
|
32
|
+
end
|
24
33
|
end
|
25
34
|
end
|
data/lib/source2md/version.rb
CHANGED
data/lib/source2md.rb
CHANGED
@@ -15,6 +15,7 @@ module Source2MD
|
|
15
15
|
config_accessor(:debug) { false }
|
16
16
|
config_accessor(:xmp_out_exclude) { false }
|
17
17
|
config_accessor(:readonly) { true }
|
18
|
+
config_accessor(:default_lang) { "ruby" }
|
18
19
|
end
|
19
20
|
|
20
21
|
require "zeitwerk"
|
@@ -22,6 +23,7 @@ loader = Zeitwerk::Loader.for_gem
|
|
22
23
|
loader.ignore("#{__dir__}/source2md/logger.rb")
|
23
24
|
loader.ignore("#{__dir__}/source2md/**/_*.rb")
|
24
25
|
loader.inflector.inflect("source2md" => "Source2MD")
|
26
|
+
loader.inflector.inflect("re" => "RE")
|
25
27
|
loader.log! if false
|
26
28
|
loader.setup
|
27
29
|
|
data/spec/code_block_spec.rb
CHANGED
@@ -6,7 +6,7 @@ module Source2MD
|
|
6
6
|
actual = Element.new(<<~EOS).to_md
|
7
7
|
#+code_include: #{__dir__}/sample.yml
|
8
8
|
EOS
|
9
|
-
actual.should == <<~EOS
|
9
|
+
actual.should == <<~EOS
|
10
10
|
```yml:sample.yml
|
11
11
|
(yaml)
|
12
12
|
```
|
@@ -19,7 +19,7 @@ EOS
|
|
19
19
|
#+lang: (lang)
|
20
20
|
#+name: (name)
|
21
21
|
EOS
|
22
|
-
actual.should == <<~EOS
|
22
|
+
actual.should == <<~EOS
|
23
23
|
```(lang):(name)
|
24
24
|
(yaml)
|
25
25
|
```
|
@@ -30,7 +30,7 @@ EOS
|
|
30
30
|
actual = Element.new(<<~EOS).to_md
|
31
31
|
#+code_include: #{__dir__}/sample.yml yaml:filename
|
32
32
|
EOS
|
33
|
-
actual.should == <<~EOS
|
33
|
+
actual.should == <<~EOS
|
34
34
|
```yaml:filename
|
35
35
|
(yaml)
|
36
36
|
```
|
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
module Source2MD
|
4
4
|
describe do
|
5
5
|
it "works" do
|
6
|
-
actual = Element.new(<<~EOS).to_md
|
6
|
+
actual = Element.new(TextHelper.indent(<<~EOS)).to_md
|
7
7
|
#+name: (name)
|
8
8
|
#+desc: (desc)
|
9
9
|
#+comment: (comment)
|
@@ -11,7 +11,7 @@ module Source2MD
|
|
11
11
|
#
|
12
12
|
(code2)
|
13
13
|
EOS
|
14
|
-
actual.should == <<~EOS
|
14
|
+
actual.should == <<~EOS
|
15
15
|
### (name) ###
|
16
16
|
|
17
17
|
(desc)
|
@@ -23,6 +23,7 @@ EOS
|
|
23
23
|
```
|
24
24
|
|
25
25
|
(comment)
|
26
|
+
|
26
27
|
EOS
|
27
28
|
end
|
28
29
|
end
|
@@ -8,7 +8,7 @@ module Source2MD
|
|
8
8
|
(foo)
|
9
9
|
#+END_SRC
|
10
10
|
EOS
|
11
|
-
actual.should == <<~EOS
|
11
|
+
actual.should == <<~EOS
|
12
12
|
```ruby
|
13
13
|
(foo)
|
14
14
|
```
|
@@ -21,7 +21,7 @@ module Source2MD
|
|
21
21
|
(foo)
|
22
22
|
#+END_SRC
|
23
23
|
EOS
|
24
|
-
actual.should == <<~EOS
|
24
|
+
actual.should == <<~EOS
|
25
25
|
```diff xxx:yyy
|
26
26
|
(foo)
|
27
27
|
```
|
@@ -11,7 +11,7 @@ module Source2MD
|
|
11
11
|
# | d | d | d |
|
12
12
|
# |---+---+---|
|
13
13
|
EOS
|
14
|
-
actual.should == <<~EOS
|
14
|
+
actual.should == <<~EOS
|
15
15
|
| h | h | h |
|
16
16
|
|---|---|---|
|
17
17
|
| d | d | d |
|
@@ -25,7 +25,7 @@ EOS
|
|
25
25
|
# |---+---+---|
|
26
26
|
# | d | d | d |
|
27
27
|
EOS
|
28
|
-
actual.should == <<~EOS
|
28
|
+
actual.should == <<~EOS
|
29
29
|
| h | h | h |
|
30
30
|
|---|---|---|
|
31
31
|
| d | d | d |
|
@@ -3,11 +3,12 @@ require "spec_helper"
|
|
3
3
|
module Source2MD
|
4
4
|
describe do
|
5
5
|
it "works" do
|
6
|
+
# Source2MD.logger.level = :debug
|
6
7
|
actual = Element.new(<<~EOS).to_md
|
7
8
|
# - foo
|
8
9
|
# http://example.com/
|
9
10
|
EOS
|
10
|
-
actual.should == <<~EOS
|
11
|
+
actual.should == <<~EOS
|
11
12
|
- foo
|
12
13
|
http://example.com/
|
13
14
|
EOS
|
@@ -22,7 +23,7 @@ EOS
|
|
22
23
|
# c
|
23
24
|
# d
|
24
25
|
EOS
|
25
|
-
actual.should == <<~EOS
|
26
|
+
actual.should == <<~EOS
|
26
27
|
abcd
|
27
28
|
EOS
|
28
29
|
end
|
@@ -36,7 +37,7 @@ EOS
|
|
36
37
|
# c
|
37
38
|
# d
|
38
39
|
EOS
|
39
|
-
actual.should == <<~EOS
|
40
|
+
actual.should == <<~EOS
|
40
41
|
a b c d
|
41
42
|
EOS
|
42
43
|
end
|
@@ -46,7 +47,7 @@ EOS
|
|
46
47
|
#+hankaku_kana: true
|
47
48
|
# アア
|
48
49
|
EOS
|
49
|
-
actual.should == "
|
50
|
+
actual.should == "アア\n"
|
50
51
|
end
|
51
52
|
end
|
52
53
|
end
|
data/spec/scanner_spec.rb
CHANGED
@@ -21,13 +21,7 @@ module Source2MD
|
|
21
21
|
foo
|
22
22
|
EOS
|
23
23
|
|
24
|
-
ary
|
25
|
-
assert { ary == ["foo", "#+BEGIN_SRC\n\nfoo\n\n#+END_SRC", "foo", "#+BEGIN_SRC\nfoo\n#+END_SRC", "foo"] }
|
24
|
+
assert { ary == ["foo\n", "#+BEGIN_SRC\n\nfoo\n\n#+END_SRC\n", "foo\n", "#+BEGIN_SRC\nfoo\n#+END_SRC\n", "foo\n"] }
|
26
25
|
end
|
27
26
|
end
|
28
27
|
end
|
29
|
-
# >> .
|
30
|
-
# >>
|
31
|
-
# >> Finished in 0.00793 seconds (files took 0.26816 seconds to load)
|
32
|
-
# >> 1 example, 0 failures
|
33
|
-
# >>
|
data/spec/text_helper_spec.rb
CHANGED
@@ -6,14 +6,18 @@ module Source2MD
|
|
6
6
|
assert { TextHelper.blank_lines_squish("A\nB\n\nC\n\n\nD") == "A\nB\n\nC\n\nD" }
|
7
7
|
end
|
8
8
|
|
9
|
-
it "
|
10
|
-
assert { TextHelper.
|
11
|
-
assert { TextHelper.
|
12
|
-
assert { TextHelper.add_newline_at_end_of_text("A\n\n") == "A\n" }
|
9
|
+
it "eol_enter" do
|
10
|
+
assert { TextHelper.eol_enter("A") == "A\n" }
|
11
|
+
assert { TextHelper.eol_enter("A\n\n") == "A\n" }
|
13
12
|
end
|
14
13
|
|
15
14
|
it "hankaku_kana" do
|
16
15
|
assert { TextHelper.hankaku_kana("アア") == "アア" }
|
17
16
|
end
|
17
|
+
|
18
|
+
it "space_prefix_remove" do
|
19
|
+
assert { TextHelper.space_prefix_remove(" a\n b\n") == "a\n b\n" }
|
20
|
+
assert { TextHelper.space_prefix_remove(" a\n\n b\n") == "a\n\n b\n" }
|
21
|
+
end
|
18
22
|
end
|
19
23
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: source2md
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akira Ikeda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-08-
|
11
|
+
date: 2023-08-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -155,15 +155,14 @@ files:
|
|
155
155
|
- doc/0140_code_include.rb
|
156
156
|
- doc/0150_raw_include.rb
|
157
157
|
- doc/0160_title.rb
|
158
|
-
- doc/
|
159
|
-
- doc/
|
160
|
-
- doc/
|
161
|
-
- doc/
|
162
|
-
- doc/
|
163
|
-
- doc/
|
164
|
-
- doc/
|
165
|
-
- doc/
|
166
|
-
- doc/0250_parse_include.rb
|
158
|
+
- doc/0170_table.rb
|
159
|
+
- doc/0180_method.rb
|
160
|
+
- doc/0190_alert.rb
|
161
|
+
- doc/0200_text.rb
|
162
|
+
- doc/0210_text_oneline.rb
|
163
|
+
- doc/0220_text_squish.rb
|
164
|
+
- doc/0230_text_hankaku_kana.rb
|
165
|
+
- doc/0240_parse_include.rb
|
167
166
|
- doc/setup.rb
|
168
167
|
- examples/cli-test.rs
|
169
168
|
- examples/cli-test.sh
|
@@ -177,7 +176,6 @@ files:
|
|
177
176
|
- examples/type_alert.rb
|
178
177
|
- examples/type_code_include.rb
|
179
178
|
- examples/type_hidden.rb
|
180
|
-
- examples/type_md_title.rb
|
181
179
|
- examples/type_method.rb
|
182
180
|
- examples/type_partial_code.rb
|
183
181
|
- examples/type_source_block.rb
|
@@ -194,8 +192,8 @@ files:
|
|
194
192
|
- lib/source2md/formatter/type_code_include.rb
|
195
193
|
- lib/source2md/formatter/type_else.rb
|
196
194
|
- lib/source2md/formatter/type_hidden.rb
|
197
|
-
- lib/source2md/formatter/type_md_title.rb
|
198
195
|
- lib/source2md/formatter/type_method.rb
|
196
|
+
- lib/source2md/formatter/type_nop.rb
|
199
197
|
- lib/source2md/formatter/type_parse_include.rb
|
200
198
|
- lib/source2md/formatter/type_partial_code.rb
|
201
199
|
- lib/source2md/formatter/type_raw_include.rb
|
@@ -206,6 +204,8 @@ files:
|
|
206
204
|
- lib/source2md/formatter/type_warn.rb
|
207
205
|
- lib/source2md/generator.rb
|
208
206
|
- lib/source2md/logger.rb
|
207
|
+
- lib/source2md/re.rb
|
208
|
+
- lib/source2md/regexp_builder.rb
|
209
209
|
- lib/source2md/scanner.rb
|
210
210
|
- lib/source2md/section.rb
|
211
211
|
- lib/source2md/tasks/about.rake
|
@@ -219,7 +219,6 @@ files:
|
|
219
219
|
- spec/formatter/type_alert_spec.rb
|
220
220
|
- spec/formatter/type_code_include_spec.rb
|
221
221
|
- spec/formatter/type_hidden_spec.rb
|
222
|
-
- spec/formatter/type_md_title_spec.rb
|
223
222
|
- spec/formatter/type_method_spec.rb
|
224
223
|
- spec/formatter/type_parse_include_spec.rb
|
225
224
|
- spec/formatter/type_partial_code_spec.rb
|
@@ -261,7 +260,6 @@ test_files:
|
|
261
260
|
- spec/formatter/type_alert_spec.rb
|
262
261
|
- spec/formatter/type_code_include_spec.rb
|
263
262
|
- spec/formatter/type_hidden_spec.rb
|
264
|
-
- spec/formatter/type_md_title_spec.rb
|
265
263
|
- spec/formatter/type_method_spec.rb
|
266
264
|
- spec/formatter/type_parse_include_spec.rb
|
267
265
|
- spec/formatter/type_partial_code_spec.rb
|
data/doc/0170_md_like_title.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
#+hidden: true
|
2
|
-
require "./setup"
|
3
|
-
|
4
|
-
### Markdown style title ###
|
5
|
-
|
6
|
-
# The condition is that there are the same number of sharps on the back.
|
7
|
-
|
8
|
-
#+BEGIN_SRC
|
9
|
-
puts Source2MD::Section.new(<<~EOS).to_md
|
10
|
-
# Title Level 1 #
|
11
|
-
|
12
|
-
## Title Level 2 ##
|
13
|
-
|
14
|
-
### Title Level 3 ###
|
15
|
-
EOS
|
16
|
-
#+END_SRC
|
17
|
-
|
18
|
-
# ```
|
19
|
-
# # Title Level 1 #
|
20
|
-
#
|
21
|
-
# ## Title Level 2 ##
|
22
|
-
#
|
23
|
-
# ### Title Level 3 ###
|
24
|
-
# ```
|
data/examples/type_md_title.rb
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
#+hidden: true
|
2
|
-
require "./setup"
|
3
|
-
|
4
|
-
puts Source2MD::Element.new(<<~EOS).to_md
|
5
|
-
## foo ##
|
6
|
-
EOS
|
7
|
-
# >> > -------------------------------------------------------------------------------- Source2MD::Part::TypeMdTitle
|
8
|
-
# >> > {}
|
9
|
-
# >> > ------------------------------------------------------------ in
|
10
|
-
# >> > ## foo ##
|
11
|
-
# >> >
|
12
|
-
# >> > ------------------------------------------------------------ out
|
13
|
-
# >> > ## foo ##
|
14
|
-
# >> > ------------------------------------------------------------
|
15
|
-
# >> ## foo ##
|