void format_paragraph (WEdit *edit, int force) { long p, q; int size; unsigned char *t; int indent = 0; if (option_word_wrap_line_length < 2) return; if (line_is_blank (edit, edit->curs_line)) return; p = begin_paragraph (edit, force); q = end_paragraph (edit, force); indent = test_indent (edit, p, q); t = get_paragraph (edit, p, q, indent, &size); if (!t) return; if (!force) { int i; if (strchr (NO_FORMAT_CHARS_START, *t)) { g_free (t); return; } for (i = 0; i < size - 1; i++) { if (t[i] == '\n') { if (strchr (NO_FORMAT_CHARS_START "\t ", t[i + 1])) { g_free (t); return; } } } } format_this (t, q - p, indent); put_paragraph (edit, t, p, indent, size); g_free (t); /* Scroll left as much as possible to show the formatted paragraph */ edit_scroll_left (edit, -edit->start_col); }
/* Add TEXT to the contents of CURRENT, maybe starting a new paragraph. */ ELEMENT * merge_text (ELEMENT *current, char *text) { int no_merge_with_following_text = 0; int leading_spaces = strspn (text, whitespace_chars); ELEMENT *last_child = last_contents_child (current); /* Is there a non-whitespace character in the line? */ if (text[leading_spaces]) { char *additional = 0; if (last_child && (last_child->type == ET_empty_line_after_command || last_child->type == ET_empty_line_after_command || last_child->type == ET_empty_spaces_before_argument || last_child->type == ET_empty_spaces_after_close_brace)) { no_merge_with_following_text = 1; } if (leading_spaces) { additional = malloc (leading_spaces + 1); if (!additional) abort (); memcpy (additional, text, leading_spaces); additional[leading_spaces] = '\0'; } if (abort_empty_line (¤t, additional)) text += leading_spaces; free (additional); current = begin_paragraph (current); } if (last_contents_child (current) /* There is a difference between the text being defined and empty, and not defined at all. The latter is true for 'brace_command_arg' elements. We need to make sure that we initialize all elements with text_append (&e->text, "") where we want merging with following text. */ && last_contents_child (current)->text.space > 0 && !strchr (last_contents_child (current)->text.text, '\n') && !no_merge_with_following_text) { /* Append text to contents */ ELEMENT *last_child = last_contents_child (current); text_append (&last_child->text, text); debug ("MERGED TEXT: %s|||", text); } else { ELEMENT *e = new_element (ET_NONE); text_append (&e->text, text); add_to_element_contents (current, e); debug ("NEW TEXT: %s|||", text); } return current; }
void format_paragraph (WEdit * edit, gboolean force) { off_t p, q; off_t size; GString *t; long indent; unsigned char *t2; gboolean utf8 = FALSE; if (option_word_wrap_line_length < 2) return; if (edit_line_is_blank (edit, edit->buffer.curs_line)) return; p = begin_paragraph (edit, force); q = end_paragraph (edit, force); indent = test_indent (edit, p, q); t = get_paragraph (&edit->buffer, p, q, indent != 0); size = t->len - 1; if (!force) { off_t i; char *stop_format_chars; if (option_stop_format_chars != NULL && strchr (option_stop_format_chars, t->str[0]) != NULL) { g_string_free (t, TRUE); return; } if (option_stop_format_chars == NULL || *option_stop_format_chars == '\0') stop_format_chars = g_strdup ("\t"); else stop_format_chars = g_strconcat (option_stop_format_chars, "\t", (char *) NULL); for (i = 0; i < size - 1; i++) if (t->str[i] == '\n' && strchr (stop_format_chars, t->str[i + 1]) != NULL) { g_free (stop_format_chars); g_string_free (t, TRUE); return; } g_free (stop_format_chars); } t2 = (unsigned char *) g_string_free (t, FALSE); #ifdef HAVE_CHARSET utf8 = edit->utf8; #endif format_this (t2, q - p, indent, utf8); put_paragraph (edit, t2, p, indent, size); g_free ((char *) t2); /* Scroll left as much as possible to show the formatted paragraph */ edit_scroll_left (edit, -edit->start_col); }
void format_paragraph (WEdit * edit, gboolean force) { off_t p, q; long lines; off_t size; GString *t; long indent; unsigned char *t2; gboolean utf8 = FALSE; if (option_word_wrap_line_length < 2) return; if (edit_line_is_blank (edit, edit->buffer.curs_line)) return; p = begin_paragraph (edit, force, &lines); q = end_paragraph (edit, force); indent = test_indent (edit, p, q); t = get_paragraph (&edit->buffer, p, q, indent != 0); size = t->len - 1; if (!force) { off_t i; char *stop_format_chars; if (option_stop_format_chars != NULL && strchr (option_stop_format_chars, t->str[0]) != NULL) { g_string_free (t, TRUE); return; } if (option_stop_format_chars == NULL || *option_stop_format_chars == '\0') stop_format_chars = g_strdup ("\t"); else stop_format_chars = g_strconcat (option_stop_format_chars, "\t", (char *) NULL); for (i = 0; i < size - 1; i++) if (t->str[i] == '\n' && strchr (stop_format_chars, t->str[i + 1]) != NULL) { g_free (stop_format_chars); g_string_free (t, TRUE); return; } g_free (stop_format_chars); } t2 = (unsigned char *) g_string_free (t, FALSE); #ifdef HAVE_CHARSET utf8 = edit->utf8; #endif /* scroll up to show 1st line of paragraph */ edit_move_up (edit, lines, TRUE); /* scroll left as much as possible to show the formatted paragraph */ edit_scroll_left (edit, -edit->start_col); format_this (t2, q - p, indent, utf8); put_paragraph (edit, t2, p, indent, size); g_free ((char *) t2); /* move to the end of paragraph */ q = end_paragraph (edit, force); edit_cursor_move (edit, q - edit->buffer.curs1); /* try move to the start of next paragraph */ if (edit->buffer.curs_line < edit->buffer.lines) { edit_execute_cmd (edit, CK_Home, -1); do { edit_execute_cmd (edit, CK_Down, -1); } while (edit->buffer.curs_line < edit->buffer.lines && edit_line_is_blank (edit, edit->buffer.curs_line)); } }