/* * This file is part of NetSurf, http://netsurf.sourceforge.net/ * Licensed under the GNU General Public License, * http://www.opensource.org/licenses/gpl-license * Copyright 2004 John M Bell * Copyright 2004 James Bursa */ /** \file * Save HTML document with dependencies (implementation). */ #include #include #include #include #include #include "libxml/HTMLtree.h" #include "oslib/osfile.h" #include "netsurf/utils/config.h" #include "netsurf/content/content.h" #include "netsurf/css/css.h" #include "netsurf/render/box.h" #include "netsurf/riscos/gui.h" #include "netsurf/riscos/save_complete.h" #include "netsurf/utils/log.h" #include "netsurf/utils/url.h" #include "netsurf/utils/utils.h" #ifdef WITH_SAVE_COMPLETE regex_t save_complete_import_re; /** An entry in save_complete_list. */ struct save_complete_entry { char *url; /**< Fully qualified URL, as per url_join output */ int ptr; /**< Pointer to object's location in memory */ struct save_complete_entry *next; /**< Next entry in list */ }; /** List of urls seen and saved so far. */ static struct save_complete_entry *save_complete_list; static void save_complete_html(struct content *c, const char *path, bool index); static void save_imported_sheets(struct content *c, const char *path); static char * rewrite_stylesheet_urls(const char *source, unsigned int size, int *osize, const char *base); static int rewrite_document_urls(xmlDoc *doc, const char *base); static int rewrite_urls(xmlNode *n, const char *base); static void rewrite_url(xmlNode *n, const char *attr, const char *base); static void save_complete_add_url(const char *url, int id); static int save_complete_find_url(const char *url); /** * Save an HTML page with all dependencies. * * \param c CONTENT_HTML to save * \param path directory to save to (must exist) */ void save_complete(struct content *c, const char *path) { save_complete_list = 0; save_complete_html(c, path, true); /* free save_complete_list */ while (save_complete_list) { struct save_complete_entry *next = save_complete_list->next; free(save_complete_list->url); free(save_complete_list); save_complete_list = next; } } /** * Save an HTML page with all dependencies, recursing through imported pages. * * \param c CONTENT_HTML to save * \param path directory to save to (must exist) */ void save_complete_html(struct content *c, const char *path, bool index) { char spath[256]; unsigned int i; htmlParserCtxtPtr toSave; if (c->type != CONTENT_HTML) return; /* save stylesheets, ignoring the base sheet */ for (i = 1; i != c->data.html.stylesheet_count; i++) { struct content *css = c->data.html.stylesheet_content[i]; char *source; int source_len; if (!css) continue; save_complete_add_url(css->url, (int) css); save_imported_sheets(css, path); if (i == 1) continue; /* don't save