Skip to content

Commit 037aa7a

Browse files
committed
Experiment with IOBuffer
1 parent 6b135a4 commit 037aa7a

File tree

1 file changed

+42
-17
lines changed

1 file changed

+42
-17
lines changed

src/BlockScalars.jl

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,48 +23,73 @@ function block(str::AbstractString, block_scalar::AbstractString="")
2323
DEFAULT_STYLE, DEFAULT_CHOMP
2424
end
2525

26+
out = IOBuffer()
27+
ending = IOBuffer()
28+
2629
if style == 'f'
2730
# The code below is equivalent to these two regexes:
2831
# ```
2932
# str = replace(str, r"(?<=\S)\n(?=\S)" => " ")
3033
# str = replace(str, r"(?<=\n)\n(?=\S)" => "")
3134
# ```
3235

33-
b = IOBuffer()
3436
prev = curr = '\0'
3537
for next in str
36-
if curr == '\n' && !isspace(next)
37-
if prev == '\n'
38-
# Skip
39-
elseif !isspace(prev)
40-
write(b, ' ')
38+
39+
if curr == '\n'
40+
if !isspace(next)
41+
if prev == '\n'
42+
# Skip
43+
elseif !isspace(prev)
44+
write(out, ' ')
45+
else
46+
write(ending, '\n')
47+
end
4148
else
42-
write(b, curr)
49+
write(ending, '\n')
4350
end
4451
elseif curr != '\0'
45-
write(b, curr)
52+
write(out, take!(ending))
53+
ending = IOBuffer()
54+
55+
write(out, curr)
4656
end
4757

4858
prev = curr
4959
curr = next
5060
end
5161

52-
write(b, curr)
53-
str = String(take!(b))
54-
elseif style != 'l'
62+
write(out, curr)
63+
elseif style == 'l'
64+
curr = '\0'
65+
for next in str
66+
if curr == '\n'
67+
write(ending, '\n')
68+
elseif curr != '\0'
69+
write(out, take!(ending))
70+
ending = IOBuffer()
71+
72+
write(out, curr)
73+
end
74+
75+
curr = next
76+
end
77+
78+
write(out, curr)
79+
else
5580
throw(ArgumentError("Unknown block style indicator: $(repr(style))"))
5681
end
5782

83+
seekstart(ending)
5884
if chomp == 'c'
59-
suffix = endswith(str, '\n') ? "\n" : ""
60-
str = rstrip(str, '\n') * suffix
61-
elseif chomp == 's'
62-
str = rstrip(str, '\n')
63-
elseif chomp != 'k'
85+
!eof(ending) && write(out, read(ending, Char))
86+
elseif chomp == 'k'
87+
write(out, ending)
88+
elseif chomp != 's'
6489
throw(ArgumentError("Unknown block chomping indicator: $(repr(chomp))"))
6590
end
6691

67-
return str
92+
return String(take!(out))
6893
end
6994

7095
macro blk_str(str::AbstractString, suffix::AbstractString="")

0 commit comments

Comments
 (0)