diff options
author | Shaun McCance <shaunm@src.gnome.org> | 2004-12-11 22:29:02 +0000 |
---|---|---|
committer | Shaun McCance <shaunm@src.gnome.org> | 2004-12-11 22:29:02 +0000 |
commit | 10fe420d814d3a68f228a8fd20a7c388752cc7c2 (patch) | |
tree | b3d319bc054a5ceddd5ea1823b8b2c94c307dff7 | |
parent | 2af99169da89e7c83f5874bdfabc186df622dfec (diff) | |
download | yelp-10fe420d814d3a68f228a8fd20a7c388752cc7c2.tar.gz |
- Made yelp-man-pager use yelp-xslt-pager
* src/yelp-db-pager.c:
* src/yelp-man-pager.c:
* src/yelp-man-pager.h:
- Made yelp-man-pager use yelp-xslt-pager
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | src/yelp-db-pager.c | 35 | ||||
-rw-r--r-- | src/yelp-man-pager.c | 283 | ||||
-rw-r--r-- | src/yelp-man-pager.h | 5 |
4 files changed, 61 insertions, 269 deletions
@@ -1,5 +1,12 @@ 2004-12-11 Shaun McCance <shaunm@gnome.org> + * src/yelp-db-pager.c: + * src/yelp-man-pager.c: + * src/yelp-man-pager.h: + - Made yelp-man-pager use yelp-xslt-pager + +2004-12-11 Shaun McCance <shaunm@gnome.org> + * src/Makefile.am: * src/yelp-db-pager.c: * src/yelp-db-pager.h: diff --git a/src/yelp-db-pager.c b/src/yelp-db-pager.c index 53da99ab..81382077 100644 --- a/src/yelp-db-pager.c +++ b/src/yelp-db-pager.c @@ -79,24 +79,24 @@ struct _DBWalker { gint max_depth; }; -static void db_pager_class_init (YelpDBPagerClass *klass); -static void db_pager_init (YelpDBPager *pager); -static void db_pager_dispose (GObject *gobject); +static void db_pager_class_init (YelpDBPagerClass *klass); +static void db_pager_init (YelpDBPager *pager); +static void db_pager_dispose (GObject *gobject); -static void db_pager_cancel (YelpPager *pager); -static xmlDocPtr db_pager_parse (YelpPager *pager); -static gchar ** db_pager_params (YelpPager *pager); +static void db_pager_cancel (YelpPager *pager); +static xmlDocPtr db_pager_parse (YelpPager *pager); +static gchar ** db_pager_params (YelpPager *pager); -const gchar * db_pager_resolve_frag (YelpPager *pager, - const gchar *frag_id); -GtkTreeModel * db_pager_get_sections (YelpPager *pager); +static const gchar * db_pager_resolve_frag (YelpPager *pager, + const gchar *frag_id); +static GtkTreeModel * db_pager_get_sections (YelpPager *pager); -static void walker_walk_xml (DBWalker *walker); -static gboolean walker_is_chunk (DBWalker *walker); +static void walker_walk_xml (DBWalker *walker); +static gboolean walker_is_chunk (DBWalker *walker); -static gboolean xml_is_division (xmlNodePtr node); -static gboolean xml_is_info (xmlNodePtr node); -static gchar * xml_get_title (xmlNodePtr node); +static gboolean xml_is_division (xmlNodePtr node); +static gboolean xml_is_info (xmlNodePtr node); +static gchar * xml_get_title (xmlNodePtr node); static YelpPagerClass *parent_class; @@ -359,7 +359,8 @@ db_pager_params (YelpPager *pager) params[params_i++] = g_strdup ("0"); params[params_i++] = "admon_graphics_path"; params[params_i++] = g_strdup_printf ("\"file://%s\"", DATADIR "/yelp/icons/"); - params[params_i++] = NULL; + + params[params_i] = NULL; return params; } @@ -382,7 +383,7 @@ db_pager_cancel (YelpPager *pager) YELP_PAGER_CLASS (parent_class)->cancel (pager); } -const gchar * +static const gchar * db_pager_resolve_frag (YelpPager *pager, const gchar *frag_id) { YelpDBPager *db_pager; @@ -402,7 +403,7 @@ db_pager_resolve_frag (YelpPager *pager, const gchar *frag_id) return (const gchar *) page_id; } -GtkTreeModel * +static GtkTreeModel * db_pager_get_sections (YelpPager *pager) { g_return_val_if_fail (pager != NULL, NULL); diff --git a/src/yelp-man-pager.c b/src/yelp-man-pager.c index 786942a7..0563a2ce 100644 --- a/src/yelp-man-pager.c +++ b/src/yelp-man-pager.c @@ -51,27 +51,19 @@ #define d(x) struct _YelpManPagerPriv { + gpointer unused; }; -static void man_pager_class_init (YelpManPagerClass *klass); -static void man_pager_init (YelpManPager *pager); -static void man_pager_dispose (GObject *gobject); +static void man_pager_class_init (YelpManPagerClass *klass); +static void man_pager_init (YelpManPager *pager); +static void man_pager_dispose (GObject *gobject); -void man_pager_error (YelpPager *pager); -void man_pager_cancel (YelpPager *pager); -void man_pager_finish (YelpPager *pager); +static xmlDocPtr man_pager_parse (YelpPager *pager); +static gchar ** man_pager_params (YelpPager *pager); -gboolean man_pager_process (YelpPager *pager); -const gchar * man_pager_resolve_frag (YelpPager *pager, - const gchar *frag_id); -GtkTreeModel * man_pager_get_sections (YelpPager *pager); - -static void xslt_yelp_document (xsltTransformContextPtr ctxt, - xmlNodePtr node, - xmlNodePtr inst, - xsltStylePreCompPtr comp); -static gboolean xml_is_info (xmlNodePtr node); -static gchar * xml_get_title (xmlNodePtr node); +static const gchar * man_pager_resolve_frag (YelpPager *pager, + const gchar *frag_id); +static GtkTreeModel * man_pager_get_sections (YelpPager *pager); static YelpPagerClass *parent_class; @@ -92,7 +84,7 @@ yelp_man_pager_get_type (void) 0, (GInstanceInitFunc) man_pager_init, }; - type = g_type_register_static (YELP_TYPE_PAGER, + type = g_type_register_static (YELP_TYPE_XSLT_PAGER, "YelpManPager", &info, 0); } @@ -104,18 +96,19 @@ man_pager_class_init (YelpManPagerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); YelpPagerClass *pager_class = YELP_PAGER_CLASS (klass); + YelpXsltPagerClass *xslt_class = YELP_XSLT_PAGER_CLASS (klass); parent_class = g_type_class_peek_parent (klass); object_class->dispose = man_pager_dispose; - pager_class->error = man_pager_error; - pager_class->cancel = man_pager_cancel; - pager_class->finish = man_pager_finish; - - pager_class->process = man_pager_process; pager_class->resolve_frag = man_pager_resolve_frag; pager_class->get_sections = man_pager_get_sections; + + xslt_class->parse = man_pager_parse; + xslt_class->params = man_pager_params; + + xslt_class->stylesheet = MAN_STYLESHEET; } static void @@ -153,8 +146,8 @@ yelp_man_pager_new (YelpDocInfo *doc_info) return (YelpPager *) pager; } -gboolean -man_pager_process (YelpPager *pager) +static xmlDocPtr +man_pager_parse (YelpPager *pager) { YelpDocInfo *doc_info; gchar *filename; @@ -162,22 +155,13 @@ man_pager_process (YelpPager *pager) xmlDocPtr doc; GError *error; - xsltStylesheetPtr stylesheet; - xsltTransformContextPtr tctxt; - - const gchar *params[40]; - gint i = 0; - g_return_val_if_fail (YELP_IS_MAN_PAGER (pager), FALSE); doc_info = yelp_pager_get_doc_info (pager); - filename = yelp_doc_info_get_filename (doc_info); g_object_ref (pager); - yelp_toc_pager_pause (yelp_toc_pager_get ()); - parser = yelp_man_parser_new (); doc = yelp_man_parser_parse_file (parser, filename); yelp_man_parser_free (parser); @@ -185,239 +169,38 @@ man_pager_process (YelpPager *pager) if (doc == NULL) { yelp_set_error (&error, YELP_ERROR_NO_DOC); yelp_pager_error (pager, error); - return FALSE; } - g_signal_emit_by_name (pager, "contents"); - - while (gtk_events_pending ()) - gtk_main_iteration (); - - params[i++] = "stylesheet_path"; - params[i++] = "\"file://" MAN_STYLESHEET_PATH "/\""; - /* - params[i++] = "color_gray_background"; - params[i++] = yelp_settings_get_color (YELP_COLOR_GRAY_BACKGROUND); - params[i++] = "color_gray_border"; - params[i++] = yelp_settings_get_color (YELP_COLOR_GRAY_BORDER); - */ - params[i++] = NULL; - - stylesheet = xsltParseStylesheetFile (MAN_STYLESHEET); - tctxt = xsltNewTransformContext (stylesheet, - doc); - tctxt->_private = pager; - xsltRegisterExtElement (tctxt, - "document", - YELP_NAMESPACE, - (xsltTransformFunction) xslt_yelp_document); - - while (gtk_events_pending ()) - gtk_main_iteration (); - - xsltApplyStylesheetUser (stylesheet, - doc, - params, - NULL, NULL, - tctxt); - - xmlFreeDoc (doc); - xsltFreeStylesheet (stylesheet); - - g_free (filename); - - yelp_pager_set_state (pager, YELP_PAGER_STATE_FINISHED); - g_signal_emit_by_name (pager, "finish"); - g_object_unref (pager); - return FALSE; + return doc; } -void -man_pager_error (YelpPager *pager) +static gchar ** +man_pager_params (YelpPager *pager) { - yelp_toc_pager_unpause (yelp_toc_pager_get ()); -} + gchar **params; + gint params_i = 0; + gint params_max = 10; -void -man_pager_cancel (YelpPager *pager) -{ - yelp_toc_pager_unpause (yelp_toc_pager_get ()); - // FIXME: actually cancel -} + params = g_new0 (gchar *, params_max); -void -man_pager_finish (YelpPager *pager) -{ - yelp_toc_pager_unpause (yelp_toc_pager_get ()); + params[params_i++] = "stylesheet_path"; + params[params_i++] = g_strdup_printf ("\"file://%s\"", MAN_STYLESHEET_PATH); + + params[params_i] = NULL; + + return params; } -const gchar * +static const gchar * man_pager_resolve_frag (YelpPager *pager, const gchar *frag_id) { return "index"; } -GtkTreeModel * +static GtkTreeModel * man_pager_get_sections (YelpPager *pager) { return NULL; } - -void -xslt_yelp_document (xsltTransformContextPtr ctxt, - xmlNodePtr node, - xmlNodePtr inst, - xsltStylePreCompPtr comp) -{ - GError *error; - YelpPage *page; - xmlChar *page_id = NULL; - xmlChar *page_title = NULL; - xmlChar *page_buf; - gint buf_size; - YelpPager *pager; - xsltStylesheetPtr style = NULL; - const char *old_outfile; - xmlDocPtr new_doc, old_doc; - xmlNodePtr old_insert; - - if (!ctxt || !node || !inst || !comp) - return; - - while (gtk_events_pending ()) - gtk_main_iteration (); - - pager = (YelpPager *) ctxt->_private; - - page_id = xsltEvalAttrValueTemplate (ctxt, inst, - (const xmlChar *) "href", - NULL); - if (page_id == NULL) { - xsltTransformError (ctxt, NULL, inst, - _("No href attribute found on yelp:document")); - error = NULL; - yelp_pager_error (pager, error); - - return; - } - - old_outfile = ctxt->outputFile; - old_doc = ctxt->output; - old_insert = ctxt->insert; - ctxt->outputFile = (const char *) page_id; - - style = xsltNewStylesheet (); - if (style == NULL) { - xsltTransformError (ctxt, NULL, inst, - _("Out of memory")); - error = NULL; - yelp_pager_error (pager, error); - - return; - } - - style->omitXmlDeclaration = TRUE; - - new_doc = xmlNewDoc ("1.0"); - new_doc->charset = XML_CHAR_ENCODING_UTF8; - ctxt->output = new_doc; - ctxt->insert = (xmlNodePtr) new_doc; - - xsltApplyOneTemplate (ctxt, node, inst->children, NULL, NULL); - - htmlDocDumpMemory (new_doc, &page_buf, &buf_size, 0); - - ctxt->outputFile = old_outfile; - ctxt->output = old_doc; - ctxt->insert = old_insert; - - page_title = xml_get_title (node); - - if (!page_title) - page_title = g_strdup ("FIXME"); - - page = g_new0 (YelpPage, 1); - - page->page_id = page_id; - page->title = page_title; - page->contents = page_buf; - - page->prev_id = NULL; - page->next_id = NULL; - page->toc_id = NULL; - - yelp_pager_add_page (pager, page); - g_signal_emit_by_name (pager, "page", page_id); - - while (gtk_events_pending ()) - gtk_main_iteration (); - - xmlFreeDoc (new_doc); -} - -gchar * -xml_get_title (xmlNodePtr node) -{ - gchar *title = NULL; - gchar *ret = NULL; - xmlNodePtr cur; - - if (xml_is_info (node)) - title = g_strdup (_("Titlepage")); - else if (node->parent && node->parent->type == XML_DOCUMENT_NODE) - title = g_strdup (_("Contents")); - else { - for (cur = node->children; cur; cur = cur->next) { - if (!xmlStrcmp (cur->name, (xmlChar *) "title")) { - if (title) - g_free (title); - title = xmlNodeGetContent (cur); - } - else if (!xmlStrcmp (cur->name, (xmlChar *) "titleabbrev")) { - if (title) - g_free (title); - title = xmlNodeGetContent (cur); - break; - } - } - } - - if (!title) - title = g_strdup (_("Unknown")); - - // This really isn't adequate for what we want. - ret = g_strdup (g_strstrip (title)); - g_free (title); - - return ret; -} - -gboolean -xml_is_info (xmlNodePtr node) -{ - return (!xmlStrcmp (node->name, (const xmlChar *) "appendixinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "articleinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "bookinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "bibliographyinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "chapterinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "glossaryinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "indexinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "partinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "prefaceinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "referenceinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "refentryinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "refsect1info") || - !xmlStrcmp (node->name, (const xmlChar *) "refsect2info") || - !xmlStrcmp (node->name, (const xmlChar *) "refsect3info") || - !xmlStrcmp (node->name, (const xmlChar *) "refsectioninfo") || - !xmlStrcmp (node->name, (const xmlChar *) "sect1info") || - !xmlStrcmp (node->name, (const xmlChar *) "sect2info") || - !xmlStrcmp (node->name, (const xmlChar *) "sect3info") || - !xmlStrcmp (node->name, (const xmlChar *) "sect4info") || - !xmlStrcmp (node->name, (const xmlChar *) "sect5info") || - !xmlStrcmp (node->name, (const xmlChar *) "sectioninfo") || - !xmlStrcmp (node->name, (const xmlChar *) "setinfo") || - !xmlStrcmp (node->name, (const xmlChar *) "setindexinfo") ); -} diff --git a/src/yelp-man-pager.h b/src/yelp-man-pager.h index 984b20e4..7fa8a655 100644 --- a/src/yelp-man-pager.h +++ b/src/yelp-man-pager.h @@ -26,6 +26,7 @@ #include <glib-object.h> #include "yelp-pager.h" +#include "yelp-xslt-pager.h" #define YELP_TYPE_MAN_PAGER (yelp_man_pager_get_type ()) #define YELP_MAN_PAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), YELP_TYPE_MAN_PAGER, YelpManPager)) @@ -39,13 +40,13 @@ typedef struct _YelpManPagerClass YelpManPagerClass; typedef struct _YelpManPagerPriv YelpManPagerPriv; struct _YelpManPager { - YelpPager parent; + YelpXsltPager parent; YelpManPagerPriv *priv; }; struct _YelpManPagerClass { - YelpPagerClass parent_class; + YelpXsltPagerClass parent_class; }; GType yelp_man_pager_get_type (void); |