togglate 0.1.3 → 0.1.4
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/lib/togglate/block_wrapper.rb +73 -6
- data/lib/togglate/cli.rb +1 -1
- data/lib/togglate/version.rb +1 -1
- data/spec/fixtures/README.ja.md +6 -0
- data/spec/fixtures/README.md +2 -0
- data/spec/togglate_block_wrapper_spec.rb +152 -1
- data/spec/togglate_cli_spec.rb +7 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8838d984a567e19332eefd8db08ac37d50087ba9
|
4
|
+
data.tar.gz: 918a7a0d84ca37b6e509b03ee9f02b2e431d48f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 963997000ded8bfa81f8246e6ba3dd6f09dfedf0fc207921919095001896bfc7e84d191f0dd5fdef4eb0a65d73a100fe22d36688f7a6521813bcdb0c5ddf9cec
|
7
|
+
data.tar.gz: 42948d55aa29bd9802fca99a13ba90335771c333bb1d9811f4dd410b222470e706ea20e17f8583477df6e4d883fabf6bce2f011510637c8f399d8221cbeab94a
|
@@ -13,6 +13,7 @@ class Togglate::BlockWrapper
|
|
13
13
|
@translate = set_translate_opt(opts[:translate])
|
14
14
|
@timeout = opts.fetch(:timeout, 5)
|
15
15
|
@email = opts[:email]
|
16
|
+
@indent_re = /^\s{4,}\S/
|
16
17
|
end
|
17
18
|
|
18
19
|
def run
|
@@ -20,11 +21,23 @@ class Togglate::BlockWrapper
|
|
20
21
|
end
|
21
22
|
|
22
23
|
private
|
23
|
-
def build_chunks
|
24
|
+
def build_chunks
|
24
25
|
in_block = false
|
26
|
+
in_indent = false
|
25
27
|
@text.each_line.chunk do |line|
|
26
|
-
in_block =
|
27
|
-
|
28
|
+
in_block = in_block?(line, in_block)
|
29
|
+
prev_indent = in_indent
|
30
|
+
in_indent = in_indented_block?(line, in_indent, in_block)
|
31
|
+
|
32
|
+
if true_to_false?(prev_indent, in_indent)
|
33
|
+
if blank_line?(line)
|
34
|
+
true
|
35
|
+
else
|
36
|
+
:alone # line just after 4 indent block marked :alone
|
37
|
+
end
|
38
|
+
else
|
39
|
+
blank_line?(line) && !in_block && !in_indent
|
40
|
+
end
|
28
41
|
end
|
29
42
|
end
|
30
43
|
|
@@ -32,18 +45,72 @@ class Togglate::BlockWrapper
|
|
32
45
|
!line.match(blank_line_re).nil?
|
33
46
|
end
|
34
47
|
|
48
|
+
def true_to_false?(prev, curr)
|
49
|
+
# this captures the in-out state transition on 4 indent block.
|
50
|
+
[prev, curr] == [true, false]
|
51
|
+
end
|
52
|
+
|
53
|
+
def in_block?(line, in_block, block_tags:[/^```/, /^{%/])
|
54
|
+
return !in_block if block_tags.any? { |ex| line.match ex }
|
55
|
+
in_block
|
56
|
+
end
|
57
|
+
|
58
|
+
def in_indented_block?(line, status, in_block)
|
59
|
+
return false if in_block
|
60
|
+
if !status && line.match(@indent_re) ||
|
61
|
+
status && line.match(/^\s{,3}\S/)
|
62
|
+
!status
|
63
|
+
else
|
64
|
+
status
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
35
68
|
def wrap_chunks(chunks)
|
69
|
+
# a line just after 4 indent block(marked :alone) is
|
70
|
+
# saved to local var 'reserve', then it is merged with
|
71
|
+
# next lines or wrapped solely depend the type of next lines
|
72
|
+
reserve = nil
|
36
73
|
wrap_lines = chunks.inject([]) do |m, (is_blank_line, lines)|
|
37
|
-
|
74
|
+
next m.tap { reserve = lines } if is_blank_line == :alone
|
75
|
+
|
76
|
+
if is_blank_line || exception_block?(lines.first)
|
77
|
+
if reserve
|
78
|
+
m.push "\n"
|
79
|
+
m.push *wrapped_block(reserve)
|
80
|
+
end
|
38
81
|
m.push *lines
|
39
82
|
else
|
40
|
-
|
41
|
-
|
83
|
+
if reserve
|
84
|
+
m.push "\n"
|
85
|
+
lines = reserve + lines
|
86
|
+
end
|
87
|
+
m.push *wrapped_block(lines)
|
42
88
|
end
|
89
|
+
m.tap { reserve = nil }
|
43
90
|
end
|
44
91
|
@translate ? hash_to_translation(wrap_lines).join : wrap_lines.join
|
45
92
|
end
|
46
93
|
|
94
|
+
def wrapped_block(contents)
|
95
|
+
[
|
96
|
+
pretext(contents),
|
97
|
+
"\n\n",
|
98
|
+
@wrapper[0],
|
99
|
+
"\n",
|
100
|
+
*contents,
|
101
|
+
@wrapper[1],
|
102
|
+
"\n"
|
103
|
+
]
|
104
|
+
end
|
105
|
+
|
106
|
+
def exception_block?(line)
|
107
|
+
if @wrap_exceptions.empty?
|
108
|
+
false
|
109
|
+
else
|
110
|
+
(@wrap_exceptions + [@indent_re]).any? { |ex| line.match ex }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
47
114
|
def pretext(lines)
|
48
115
|
if @translate
|
49
116
|
hash_value = lines.join.hash
|
data/lib/togglate/cli.rb
CHANGED
@@ -12,7 +12,7 @@ module Togglate
|
|
12
12
|
def create(file)
|
13
13
|
text = File.read(file)
|
14
14
|
opts = symbolize_keys(options)
|
15
|
-
blocks = [/^```/, /^
|
15
|
+
blocks = [/^```/, /^{%/]
|
16
16
|
opts.update(wrap_exceptions:blocks) if opts[:code_block]
|
17
17
|
opts.update(translate:nil) if opts[:translate].empty?
|
18
18
|
puts Togglate.create(text, opts)
|
data/lib/togglate/version.rb
CHANGED
data/spec/fixtures/README.ja.md
CHANGED
data/spec/fixtures/README.md
CHANGED
@@ -41,13 +41,86 @@ EOS
|
|
41
41
|
expect(wrapper.send(:build_chunks).to_a).to eq exp
|
42
42
|
end
|
43
43
|
end
|
44
|
+
|
45
|
+
context "with fenced code blocks" do
|
46
|
+
it "wraps fenced code blocks as target blocks" do
|
47
|
+
text = <<-EOS
|
48
|
+
# title
|
49
|
+
|
50
|
+
text
|
51
|
+
|
52
|
+
``` ruby
|
53
|
+
puts 'Hello'
|
54
|
+
|
55
|
+
p :World
|
56
|
+
```
|
57
|
+
EOS
|
58
|
+
wrapper = Togglate::BlockWrapper.new(text)
|
59
|
+
exp = [
|
60
|
+
[false, ["# title\n"]],
|
61
|
+
[true, ["\n"]],
|
62
|
+
[false, ["text\n"]],
|
63
|
+
[true, ["\n"]],
|
64
|
+
[false, ["``` ruby\n", "puts 'Hello'\n", "\n", "p :World\n", "```\n"]]
|
65
|
+
]
|
66
|
+
expect(wrapper.send(:build_chunks).to_a).to eq exp
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
context "with 4 indented code blocks" do
|
71
|
+
it "wraps them as target blocks" do
|
72
|
+
text =<<-EOS
|
73
|
+
#title
|
74
|
+
|
75
|
+
tell application 'Foo'
|
76
|
+
|
77
|
+
beep
|
78
|
+
|
79
|
+
end tell
|
80
|
+
|
81
|
+
line
|
82
|
+
EOS
|
83
|
+
|
84
|
+
wrapper = Togglate::BlockWrapper.new(text)
|
85
|
+
exp = [[false, ["#title\n"]],
|
86
|
+
[true, ["\n"]],
|
87
|
+
[false, [" tell application 'Foo'\n",
|
88
|
+
"\n",
|
89
|
+
" beep\n",
|
90
|
+
"\n",
|
91
|
+
" end tell\n",
|
92
|
+
"\n"]],
|
93
|
+
[:alone, [" line\n"]]]
|
94
|
+
expect(wrapper.send(:build_chunks).to_a).to eq exp
|
95
|
+
end
|
96
|
+
end
|
44
97
|
end
|
45
98
|
|
46
99
|
describe "#wrap_chunks" do
|
100
|
+
before do
|
101
|
+
@text =<<-EOS
|
102
|
+
#title
|
103
|
+
|
104
|
+
text
|
105
|
+
EOS
|
106
|
+
end
|
107
|
+
|
47
108
|
it "returns wrapped text" do
|
48
109
|
wrapper = Togglate::BlockWrapper.new(@text)
|
49
110
|
chunks = wrapper.send(:build_chunks)
|
50
|
-
exp
|
111
|
+
exp =<<-EOS
|
112
|
+
[translation here]
|
113
|
+
|
114
|
+
<!--original
|
115
|
+
#title
|
116
|
+
-->
|
117
|
+
|
118
|
+
[translation here]
|
119
|
+
|
120
|
+
<!--original
|
121
|
+
text
|
122
|
+
-->
|
123
|
+
EOS
|
51
124
|
expect(wrapper.send(:wrap_chunks, chunks)).to eq exp
|
52
125
|
end
|
53
126
|
|
@@ -59,6 +132,84 @@ EOS
|
|
59
132
|
expect(wrapper.send(:wrap_chunks, chunks)).to match(exp)
|
60
133
|
end
|
61
134
|
end
|
135
|
+
|
136
|
+
context "text has 4 indented code blocks" do
|
137
|
+
it "wraps sentences after the code blocks correctly" do
|
138
|
+
text =<<-EOS
|
139
|
+
#title
|
140
|
+
|
141
|
+
% echo hello
|
142
|
+
|
143
|
+
line
|
144
|
+
line2
|
145
|
+
EOS
|
146
|
+
wrapper = Togglate::BlockWrapper.new(text)
|
147
|
+
chunks = wrapper.send(:build_chunks)
|
148
|
+
exp =<<-EOS
|
149
|
+
[translation here]
|
150
|
+
|
151
|
+
<!--original
|
152
|
+
#title
|
153
|
+
-->
|
154
|
+
|
155
|
+
[translation here]
|
156
|
+
|
157
|
+
<!--original
|
158
|
+
% echo hello
|
159
|
+
|
160
|
+
-->
|
161
|
+
|
162
|
+
[translation here]
|
163
|
+
|
164
|
+
<!--original
|
165
|
+
line
|
166
|
+
line2
|
167
|
+
-->
|
168
|
+
EOS
|
169
|
+
expect(wrapper.send(:wrap_chunks, chunks)).to eq exp
|
170
|
+
end
|
171
|
+
|
172
|
+
it "wraps sentences after the code blocks correctly 2" do
|
173
|
+
text =<<-EOS
|
174
|
+
#title
|
175
|
+
|
176
|
+
% echo hello
|
177
|
+
|
178
|
+
line
|
179
|
+
|
180
|
+
line2
|
181
|
+
EOS
|
182
|
+
wrapper = Togglate::BlockWrapper.new(text)
|
183
|
+
chunks = wrapper.send(:build_chunks)
|
184
|
+
exp =<<-EOS
|
185
|
+
[translation here]
|
186
|
+
|
187
|
+
<!--original
|
188
|
+
#title
|
189
|
+
-->
|
190
|
+
|
191
|
+
[translation here]
|
192
|
+
|
193
|
+
<!--original
|
194
|
+
% echo hello
|
195
|
+
|
196
|
+
-->
|
197
|
+
|
198
|
+
[translation here]
|
199
|
+
|
200
|
+
<!--original
|
201
|
+
line
|
202
|
+
-->
|
203
|
+
|
204
|
+
[translation here]
|
205
|
+
|
206
|
+
<!--original
|
207
|
+
line2
|
208
|
+
-->
|
209
|
+
EOS
|
210
|
+
expect(wrapper.send(:wrap_chunks, chunks)).to eq exp
|
211
|
+
end
|
212
|
+
end
|
62
213
|
end
|
63
214
|
|
64
215
|
describe "Embed results of MyMemory translation service" do
|
data/spec/togglate_cli_spec.rb
CHANGED
@@ -21,7 +21,7 @@ describe Togglate::CLI do
|
|
21
21
|
|
22
22
|
it "wraps code blocks" do
|
23
23
|
Togglate::CLI.start(['create', 'README.md'])
|
24
|
-
expect($stdout.string).to match(/<!--original\n\s{4}% ruby title\.rb\n-->/)
|
24
|
+
expect($stdout.string).to match(/<!--original\n\s{4}% ruby title\.rb\n\n-->/)
|
25
25
|
end
|
26
26
|
|
27
27
|
it "wraps gfm code blocks" do
|
@@ -29,10 +29,12 @@ describe Togglate::CLI do
|
|
29
29
|
expect($stdout.string).to match(/<!--original.*```ruby.*```\n-->/m)
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
context "set code-block option to true" do
|
33
|
+
it "not wraps fenced and indented code blocks" do
|
34
|
+
Togglate::CLI.start(['create', 'README.md', '--code-block'])
|
35
|
+
expect($stdout.string).to match(/^\n {4}% ruby title\.rb\n$/)
|
36
|
+
expect($stdout.string).to match(/^\n```ruby.*```\n$/m)
|
37
|
+
end
|
36
38
|
end
|
37
39
|
end
|
38
40
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: togglate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- kyoendo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|