togglate 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- 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
|