summaryrefslogtreecommitdiff
path: root/desktop/selection.c
diff options
context:
space:
mode:
authorMichael Drake <tlsa@netsurf-browser.org>2008-04-13 18:21:22 +0000
committerMichael Drake <tlsa@netsurf-browser.org>2008-04-13 18:21:22 +0000
commit5c8406bf8b9eec4a216a92cc72de53c8ee23ba7c (patch)
treeb0f86cd2787c8af1df5bf5f41036d5cdc791a4b1 /desktop/selection.c
parent78c22d4171bc07c66252d4b6464bf000c6ee59a7 (diff)
downloadnetsurf-5c8406bf8b9eec4a216a92cc72de53c8ee23ba7c.tar.gz
netsurf-5c8406bf8b9eec4a216a92cc72de53c8ee23ba7c.tar.bz2
Rewrite text export to use box tree. Improves output formatting. Simplify selection saving.
svn path=/trunk/netsurf/; revision=4094
Diffstat (limited to 'desktop/selection.c')
-rw-r--r--desktop/selection.c105
1 files changed, 12 insertions, 93 deletions
diff --git a/desktop/selection.c b/desktop/selection.c
index 4d675cc0c..31c5def60 100644
--- a/desktop/selection.c
+++ b/desktop/selection.c
@@ -18,8 +18,7 @@
*/
/** \file
- * Text selection within browser windows,
- * (implementation, platform independent)
+ * Text selection within browser windows (implementation).
*/
#include <assert.h>
@@ -29,6 +28,7 @@
#include "desktop/gui.h"
#include "desktop/plotters.h"
+#include "desktop/save_text.h"
#include "desktop/selection.h"
#include "render/box.h"
#include "render/font.h"
@@ -64,21 +64,6 @@ struct rdw_info {
struct rect r;
};
-
-/* text selection currently being saved */
-struct save_state {
- char *block;
- size_t length;
- size_t alloc;
-};
-
-typedef enum {
- WHITESPACE_NONE,
- WHITESPACE_TAB,
- WHITESPACE_ONE_NEW_LINE,
- WHITESPACE_TWO_NEW_LINES
-} seln_whitespace;
-
static bool redraw_handler(const char *text, size_t length, struct box *box,
void *handle, const char *whitespace_text,
size_t whitespace_length);
@@ -92,7 +77,7 @@ static bool selected_part(struct box *box, unsigned start_idx, unsigned end_idx,
unsigned *start_offset, unsigned *end_offset);
static bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx,
unsigned int num_space, seln_traverse_handler handler,
- void *handle, seln_whitespace *before, bool *first,
+ void *handle, save_text_whitespace *before, bool *first,
bool do_marker);
static struct box *get_box(struct box *b, unsigned offset, int *pidx);
@@ -451,7 +436,7 @@ bool selected_part(struct box *box, unsigned start_idx, unsigned end_idx,
bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx,
unsigned int num_space, seln_traverse_handler handler,
- void *handle, seln_whitespace *before, bool *first,
+ void *handle, save_text_whitespace *before, bool *first,
bool do_marker)
{
struct box *child;
@@ -486,64 +471,8 @@ bool traverse_tree(struct box *box, unsigned start_idx, unsigned end_idx,
/* If nicely formatted output of the selected text is required, work
* out what whitespace should be placed before the next bit of text */
if (before) {
- if (*before < WHITESPACE_TWO_NEW_LINES &&
- /* significant box type */
- (box->type == BOX_BLOCK ||
- box->type == BOX_TABLE ||
- box->type == BOX_FLOAT_LEFT ||
- box->type == BOX_FLOAT_RIGHT) &&
- /* and not a list element */
- !box->list_marker &&
- /* and not a marker... */
- (!do_marker ||
- /* ...unless marker follows WHITESPACE_TAB */
- (do_marker && *before == WHITESPACE_TAB))) {
- *before = WHITESPACE_TWO_NEW_LINES;
- }
- else if (*before <= WHITESPACE_ONE_NEW_LINE &&
- (box->type == BOX_TABLE_ROW ||
- box->type == BOX_BR ||
- (box->type != BOX_INLINE && do_marker) ||
- (box->parent->style &&
- (box->parent->style->white_space ==
- CSS_WHITE_SPACE_PRE ||
- box->parent->style->white_space ==
- CSS_WHITE_SPACE_PRE_WRAP) &&
- box->type == BOX_INLINE_CONTAINER))) {
- if (*before == WHITESPACE_ONE_NEW_LINE)
- *before = WHITESPACE_TWO_NEW_LINES;
- else
- *before = WHITESPACE_ONE_NEW_LINE;
- }
- else if (*before < WHITESPACE_TAB &&
- (box->type == BOX_TABLE_CELL ||
- box->list_marker)) {
- *before = WHITESPACE_TAB;
- }
- if (*first) {
- whitespace_text = "";
- } else {
- switch (*before) {
- case WHITESPACE_TWO_NEW_LINES:
- whitespace_text = "\n\n";
- whitespace_length = 2;
- break;
- case WHITESPACE_ONE_NEW_LINE:
- whitespace_text = "\n";
- whitespace_length = 1;
- break;
- case WHITESPACE_TAB:
- whitespace_text = "\t";
- whitespace_length = 1;
- break;
- case WHITESPACE_NONE:
- whitespace_text = "";
- break;
- default:
- whitespace_text = "";
- break;
- }
- }
+ save_text_solve_whitespace(box, first, before, &whitespace_text,
+ &whitespace_length);
}
else {
whitespace_text = NULL;
@@ -612,7 +541,7 @@ bool selection_traverse(struct selection *s, seln_traverse_handler handler,
void *handle)
{
struct content *c;
- seln_whitespace before = WHITESPACE_NONE;
+ save_text_whitespace before = WHITESPACE_NONE;
bool first = true;
if (!selection_defined(s))
@@ -952,7 +881,7 @@ bool save_handler(const char *text, size_t length, struct box *box,
void *handle, const char *whitespace_text,
size_t whitespace_length)
{
- struct save_state *sv = handle;
+ struct save_text_state *sv = handle;
size_t new_length;
int space = 0;
@@ -1002,7 +931,7 @@ bool save_handler(const char *text, size_t length, struct box *box,
bool selection_save_text(struct selection *s, const char *path)
{
struct content *c = s->bw->current_content;
- struct save_state sv = { NULL, 0, 0 };
+ struct save_text_state sv = { NULL, 0, 0 };
utf8_convert_ret ret;
char *result;
FILE *out;
@@ -1014,19 +943,6 @@ bool selection_save_text(struct selection *s, const char *path)
return false;
}
- /* add newline at end */
- sv.length++;
- if (sv.length > sv.alloc) {
- char *new_block;
-
- new_block = realloc(sv.block, sv.length);
- if (!new_block) return false;
-
- sv.block = new_block;
- sv.alloc = sv.length;
- }
- sv.block[sv.length - 1] = '\n';
-
if (!sv.block)
return false;
@@ -1041,9 +957,12 @@ bool selection_save_text(struct selection *s, const char *path)
out = fopen(path, "w");
if (out) {
int res = fputs(result, out);
+ res = fputs("\n", out);
fclose(out);
+ free(result);
return (res != EOF);
}
+ free(result);
return false;
}