static gchar * get_document(const gchar *uri) { g_return_val_if_fail(uri, NULL); const gchar *anchor; const gchar *contents; GMappedFile *file = NULL; gchar *filename = NULL; gsize length; gchar *key = NULL; gsize key_length; gsize offset = 0; const gchar *start; const gchar *end; gchar *result = NULL; anchor = strrchr(uri, '#'); if (!anchor) goto catch; filename = g_strndup(uri, anchor - uri); anchor++; if (g_str_has_prefix (filename, "file://")) offset = 7; file = g_mapped_file_new(filename + offset, FALSE, NULL); if (!file) goto catch; contents = g_mapped_file_get_contents(file); length = g_mapped_file_get_length(file); key = g_strdup_printf("<a name=\"%s\"", anchor); key_length = strlen(key); start = find_in_buffer(contents, key, length, key_length); if (!start) goto catch; end = NULL; { const gchar *startkey; const gchar *endkey; length -= start - contents; startkey = "<pre class=\"programlisting\">"; start = find_in_buffer(start, startkey, length, strlen(startkey)); if (start) { endkey = "<div class=\"refsect"; end = find_in_buffer(start, endkey, length - strlen(startkey), strlen(endkey)); if (!end) { endkey = "<div class=\"footer"; end = find_in_buffer(start, endkey, length - strlen(startkey), strlen(endkey)); } } } if (!(start && end)) goto catch; { gchar *buf; buf = g_strndup(start, end - start); result = g_strdup_printf("<div class=\"content\">%s</div>", buf); g_free(buf); } goto finally; catch:
/** * dh_assistant_view_set_link: * @view: an devhelp assistant view * @link: the #DhLink * * Open @link in the assistant view, if %NULL the view will be blanked. * * Return value: %TRUE if the requested link is open, %FALSE otherwise. **/ gboolean dh_assistant_view_set_link (DhAssistantView *view, DhLink *link) { DhAssistantViewPriv *priv; gchar *uri; const gchar *anchor; gchar *filename; GMappedFile *file; const gchar *contents; gsize length; gchar *key; gsize key_length; gsize offset = 0; const gchar *start; const gchar *end; g_return_val_if_fail (DH_IS_ASSISTANT_VIEW (view), FALSE); priv = GET_PRIVATE (view); if (priv->link == link) { return TRUE; } if (priv->link) { dh_link_unref (priv->link); priv->link = NULL; } if (link) { link = dh_link_ref (link); } else { webkit_web_view_load_uri (WEBKIT_WEB_VIEW (view), "about:blank"); return TRUE; } uri = dh_link_get_uri (link); anchor = strrchr (uri, '#'); if (anchor) { filename = g_strndup (uri, anchor - uri); anchor++; g_free (uri); } else { g_free (uri); return FALSE; } if (g_str_has_prefix (filename, "file://")) offset = 7; file = g_mapped_file_new (filename + offset, FALSE, NULL); if (!file) { g_free (filename); return FALSE; } contents = g_mapped_file_get_contents (file); length = g_mapped_file_get_length (file); key = g_strdup_printf ("<a name=\"%s\"", anchor); key_length = strlen (key); start = find_in_buffer (contents, key, length, key_length); g_free (key); end = NULL; if (start) { const gchar *start_key; const gchar *end_key; length -= start - contents; start_key = "<pre class=\"programlisting\">"; start = find_in_buffer (start, start_key, length, strlen (start_key)); end_key = "<div class=\"refsect"; if (start) { end = find_in_buffer (start, end_key, length - strlen (start_key), strlen (end_key)); if (!end) { end_key = "<div class=\"footer"; end = find_in_buffer (start, end_key, length - strlen (start_key), strlen (end_key)); } } } if (start && end) { gchar *buf; gboolean break_line; const gchar *function; gchar *stylesheet; gchar *javascript; gchar *html; buf = g_strndup (start, end-start); /* Try to reformat function signatures so they take less * space and look nicer. Don't reformat things that don't * look like functions. */ switch (dh_link_get_link_type (link)) { case DH_LINK_TYPE_FUNCTION: break_line = TRUE; function = "onload=\"reformatSignature()\""; break; case DH_LINK_TYPE_MACRO: break_line = TRUE; function = "onload=\"cleanupSignature()\""; break; default: break_line = FALSE; function = ""; break; } if (break_line) { gchar *name; name = strstr (buf, dh_link_get_name (link)); if (name && name > buf) { name[-1] = '\n'; } } stylesheet = dh_util_build_data_filename ("devhelp", "assistant", "assistant.css", NULL); javascript = dh_util_build_data_filename ("devhelp", "assistant", "assistant.js", NULL); html = g_strdup_printf ( "<html>" "<head>" "<link rel=\"stylesheet\" type=\"text/css\" href=\"file://%s\"/>" "<script src=\"file://%s\"></script>" "</head>" "<body %s>" "<div class=\"title\">%s: <a href=\"%s\">%s</a></div>" "<div class=\"subtitle\">%s %s</div>" "<div class=\"content\">%s</div>" "</body>" "</html>", stylesheet, javascript, function, dh_link_get_type_as_string (link), dh_link_get_uri (link), dh_link_get_name (link), _("Book:"), dh_link_get_book_name (link), buf); g_free (buf); g_free (stylesheet); g_free (javascript); priv->snippet_loaded = FALSE; webkit_web_view_load_string ( WEBKIT_WEB_VIEW (view), html, "text/html", NULL, filename); g_free (html); } else { webkit_web_view_load_uri (WEBKIT_WEB_VIEW (view), "about:blank"); } #if GLIB_CHECK_VERSION(2,21,3) g_mapped_file_unref (file); #else g_mapped_file_free (file); #endif g_free (filename); return TRUE; }