howl.editing.text
local buffer, lines before_each -> buffer = Buffer! lines = buffer.lines
paragraph_at(line)
at = (nr) -> [l.nr for l in *text.paragraph_at lines[nr]] before_each -> buffer.text = 'one\n\nthree\nfour\n\n\nseven'
returns a list of lines composing the current paragraph
assert.same { 1 }, at 1 assert.same { 3, 4 }, at 3 assert.same { 3, 4 }, at 4 assert.same { 7 }, at 7
considers lines starting with blanks to be paragraph delimiters
buffer.text = 'trailing\n indented start\ncontinued and ended here.\n new para' assert.same { 2, 3 }, at 2
calls and respects the mode's .is_paragraph_break() if present
buffer.mode = is_paragraph_break: (line) -> line\match '^-' buffer.text = 'before\n- new para\n continued\n- next' assert.same { 2, 3 }, at 2
(when starting at an empty line)
returns the previous paragraph if present
assert.same { 1 }, at 2 assert.same { 3, 4 }, at 5
returns the following paragraph if present
assert.same { 7 }, at 6
returns an empty list if no paragraph is found
buffer.text = 'one\n\n\n\nfive' assert.same {}, at 3
can_reflow(line, limit)
returns true if the line is longer than limit
buffer.text = 'too long' assert.is_true text.can_reflow lines[1], 6
returns true if the line can be combined with the previous one
buffer.text = 'itty\nbitty' assert.is_true text.can_reflow lines[2], 10
returns true if the line can be combined with the following one
buffer.text = 'itty\nbitty' assert.is_true text.can_reflow lines[1], 10 buffer.text = 'itty bitty\nshort\nlong by itself' assert.is_true text.can_reflow lines[2], 10
returns false if the line can not be combined with the previous one
buffer.text = 'itty\nbitty' assert.is_false text.can_reflow lines[2], 9
returns false if the line can not be combined with the following one
buffer.text = 'itty\nbitty' assert.is_false text.can_reflow lines[1], 9
returns false if the line is one, unbreakable, word
buffer.text = 'imjustgoingtoramble\none' assert.is_false text.can_reflow lines[1], 10
returns true if the line is more than one word, the first being unbreakable
buffer.text = 'imjustgoingtoramble stopme\none' assert.is_true text.can_reflow lines[1], 10
returns false if an adjacent short line is blank
buffer.text = 'itty\n' assert.is_false text.can_reflow lines[1], 10 buffer.text = '\nitty\n' assert.is_false text.can_reflow lines[2], 10
(when the buffer's mode provides line_is_reflowable method)
respects a negative answer from that
buffer.text = 'hum ho hi hi' line = lines[1] assert.is_true text.can_reflow line, 10 buffer.mode.line_is_reflowable = -> true assert.is_true text.can_reflow line, 10 buffer.mode.line_is_reflowable = -> false assert.is_false text.can_reflow line, 10
reflow_paragraph_at(line, limit)
splits lines to enforce at most <limit> columns
buffer.text = 'one two three four\n' assert.is_true text.reflow_paragraph_at lines[1], 10 assert.equals 'one two\nthree four\n', buffer.text
splits lines as close to <limit> as possible, given non-breaking words
buffer.text = 'onetwo three four\n' assert.is_true text.reflow_paragraph_at lines[1], 5 assert.equals 'onetwo\nthree\nfour\n', buffer.text
combines lines as necessary to match <limit>
buffer.text = 'one\ntwo\nthree\nfour\n' assert.is_true text.reflow_paragraph_at lines[1], 10 assert.equals 'one two\nthree four\n', buffer.text
returns an unbreakable line as is if it can not reflow
buffer.text = 'onetwo\n' assert.is_false text.reflow_paragraph_at lines[1], 4 assert.equals 'onetwo\n', buffer.text
does not require there to be any newline at the end of the paragraph
buffer.text = 'one two' assert.is_true text.reflow_paragraph_at lines[1], 5 assert.equals 'one\ntwo', buffer.text
includes all the paragraph text in the reflowed text (boundary condition)
buffer.text = 'one t' assert.is_true text.reflow_paragraph_at lines[1], 4 assert.equals 'one\nt', buffer.text
converts an overflowing space to an eol
buffer.text = 'one \n' assert.is_true text.reflow_paragraph_at lines[1], 3 assert.equals 'one\n\n', buffer.text
does not modify the buffer unless there is a change
buffer.text = 'one two\n' buffer.modified = false assert.is_false text.reflow_paragraph_at lines[1], 10 assert.is_false buffer.modified
does not reflow lines if the mode says no
buffer.text = 'one\ntwo\nthree' buffer.mode.line_is_reflowable = (line) => not line\find 'three' assert.is_true text.reflow_paragraph_at lines[1], 20 assert.equals 'one two\nthree', buffer.text
