justification: find the beginning of a paragraph in a better way
Any line whose indentation differs from that of a pair of adjacent lines is the beginning of a paragraph, also when its indentation is smaller. This fulfills https://savannah.gnu.org/bugs/?53932, and fixes point 2) of https://savannah.gnu.org/bugs/?53933.master
parent
d7fe5a7db3
commit
432a7d7729
37
src/text.c
37
src/text.c
|
@ -1990,49 +1990,44 @@ bool quotes_match(const char *a_line, size_t a_quote, const char *b_line)
|
||||||
bool indents_match(const char *a_line, size_t a_indent, const char
|
bool indents_match(const char *a_line, size_t a_indent, const char
|
||||||
*b_line, size_t b_indent)
|
*b_line, size_t b_indent)
|
||||||
{
|
{
|
||||||
return (b_indent <= a_indent && strncmp(a_line, b_line, b_indent) == 0);
|
return (a_indent == b_indent && strncmp(a_line, b_line, b_indent) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return TRUE when the given line is the beginning of a paragraph.
|
/* Return TRUE when the given line is the beginning of a paragraph (BOP). */
|
||||||
*
|
|
||||||
* A line consists of a "quote part", followed by an "indentation part",
|
|
||||||
* followed by a "text part". Each of these parts can be empty. A line
|
|
||||||
* is part of a paragraph if it has a non-empty text part.
|
|
||||||
*
|
|
||||||
* A line is "the beginning of a paragraph" if it has a text part AND
|
|
||||||
* 1) it is the top line of the file, or
|
|
||||||
* 2) the line above it is not part of a paragraph, or
|
|
||||||
* 3) the line above it has a different quote part, or
|
|
||||||
* 4) the indentation of this line is not an initial substring of
|
|
||||||
* the indentation of the previous line. */
|
|
||||||
bool begpar(const filestruct *const line)
|
bool begpar(const filestruct *const line)
|
||||||
{
|
{
|
||||||
size_t quote_len, indent_len, temp_id_len;
|
size_t quote_len, indent_len, temp_id_len;
|
||||||
|
|
||||||
/* Case 1). */
|
/* If this is the very first line of the buffer, it counts as a BOP
|
||||||
|
* even when it contains no text. */
|
||||||
if (line == openfile->fileage)
|
if (line == openfile->fileage)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
quote_len = quote_length(line->data);
|
quote_len = quote_length(line->data);
|
||||||
indent_len = indent_length(line->data + quote_len);
|
indent_len = indent_length(line->data + quote_len);
|
||||||
|
|
||||||
/* Not part of a paragraph. */
|
/* If this line contains no text, it is not a BOP. */
|
||||||
if (line->data[quote_len + indent_len] == '\0')
|
if (line->data[quote_len + indent_len] == '\0')
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
/* Case 3). */
|
/* If the quote part of the preceding line differs, this is a BOP. */
|
||||||
if (!quotes_match(line->data, quote_len, line->prev->data))
|
if (!quotes_match(line->data, quote_len, line->prev->data))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
temp_id_len = indent_length(line->prev->data + quote_len);
|
temp_id_len = indent_length(line->prev->data + quote_len);
|
||||||
|
|
||||||
/* Case 2) or 4). */
|
/* If the preceding line contains no text, this is a BOP. */
|
||||||
if (line->prev->data[quote_len + temp_id_len] == '\0' ||
|
if (line->prev->data[quote_len + temp_id_len] == '\0')
|
||||||
!indents_match(line->prev->data + quote_len, temp_id_len,
|
|
||||||
line->data + quote_len, indent_len))
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
return FALSE;
|
/* If the indentation of the preceding line equals the indentation
|
||||||
|
* of this line, this is not a BOP. */
|
||||||
|
if (indents_match(line->prev->data + quote_len, temp_id_len,
|
||||||
|
line->data + quote_len, indent_len))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* Otherwise, this is a BOP if the preceding line is not. */
|
||||||
|
return !begpar(line->prev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return TRUE when the given line is part of a paragraph. */
|
/* Return TRUE when the given line is part of a paragraph. */
|
||||||
|
|
Loading…
Reference in New Issue