nano-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Nano-devel] [PATCH 2/2] justification: find the beginning of a paragrap


From: Benno Schulenberg
Subject: [Nano-devel] [PATCH 2/2] justification: find the beginning of a paragraph in a better way
Date: Mon, 21 May 2018 10:42:30 +0200

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.
---
 src/text.c | 37 ++++++++++++++++---------------------
 1 file changed, 16 insertions(+), 21 deletions(-)

diff --git a/src/text.c b/src/text.c
index 9977ce82..2f5f0699 100644
--- a/src/text.c
+++ b/src/text.c
@@ -1897,49 +1897,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
                *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.
- *
- *   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. */
+/* Return TRUE when the given line is the beginning of a paragraph (BOP). */
 bool begpar(const filestruct *const line)
 {
        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)
                return TRUE;
 
        quote_len = quote_length(line->data);
        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')
                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))
                return TRUE;
 
        temp_id_len = indent_length(line->prev->data + quote_len);
 
-       /* Case 2) or 4). */
-       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))
+       /* If the preceding line contains no text, this is a BOP. */
+       if (line->prev->data[quote_len + temp_id_len] == '\0')
                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. */
-- 
2.17.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]