summaryrefslogtreecommitdiff
path: root/backend/epub/epub-document.c
diff options
context:
space:
mode:
Diffstat (limited to 'backend/epub/epub-document.c')
-rw-r--r--backend/epub/epub-document.c135
1 files changed, 135 insertions, 0 deletions
diff --git a/backend/epub/epub-document.c b/backend/epub/epub-document.c
index d0dce118..9caa8432 100644
--- a/backend/epub/epub-document.c
+++ b/backend/epub/epub-document.c
@@ -1267,6 +1267,139 @@ epub_document_get_page(EvDocument *document,
return page ;
}
+static void
+change_to_night_sheet(contentListNode *nodedata,gpointer user_data)
+{
+ gchar *filename = g_filename_from_uri(nodedata->value,NULL,NULL);
+ open_xml_document(filename);
+ set_xml_root_node(NULL);
+ xmlNodePtr head =xml_get_pointer_to_node((xmlChar*)"head",NULL,NULL);
+
+ xmlretval = NULL;
+ xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"rel",(xmlChar*)"stylesheet");
+
+ xmlNodePtr day = xmlretval;
+ xmlSetProp(day,(xmlChar*)"rel",(xmlChar*)"alternate stylesheet");
+
+ xmlretval = NULL;
+ xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"class",(xmlChar*)"night");
+ xmlSetProp(xmlretval,(xmlChar*)"rel",(xmlChar*)"stylesheet");
+ xmlSaveFormatFile (filename, xmldocument, 0);
+ xml_free_doc();
+ g_free(filename);
+}
+
+static void
+change_to_day_sheet(contentListNode *nodedata,gpointer user_data)
+{
+ gchar *filename = g_filename_from_uri(nodedata->value,NULL,NULL);
+ open_xml_document(filename);
+ set_xml_root_node(NULL);
+ xmlNodePtr head =xml_get_pointer_to_node((xmlChar*)"head",NULL,NULL);
+
+ xmlretval = NULL;
+ xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"rel",(xmlChar*)"stylesheet");
+
+ xmlNodePtr day = xmlretval;
+ xmlSetProp(day,(xmlChar*)"rel",(xmlChar*)"alternate stylesheet");
+
+ xmlretval = NULL;
+ xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"class",(xmlChar*)"day");
+ xmlSetProp(xmlretval,(xmlChar*)"rel",(xmlChar*)"stylesheet");
+ xmlSaveFormatFile (filename, xmldocument, 0);
+ xml_free_doc();
+ g_free(filename);
+}
+
+static gchar*
+epub_document_get_alternate_stylesheet(gchar *docuri)
+{
+ gchar *filename = g_filename_from_uri(docuri,NULL,NULL);
+ open_xml_document(filename);
+
+ set_xml_root_node(NULL);
+
+ xmlNodePtr head= xml_get_pointer_to_node((xmlChar*)"head",NULL,NULL);
+
+ xmlretval = NULL;
+
+ xml_parse_children_of_node(head,(xmlChar*)"link",(xmlChar*)"class",(xmlChar*)"night");
+
+ if (xmlretval != NULL) {
+ return (gchar*)xml_get_data_from_node(xmlretval,XML_ATTRIBUTE,(xmlChar*)"href");
+ }
+ g_free(filename);
+ xml_free_doc();
+ return NULL;
+}
+
+static void
+add_night_sheet(contentListNode *listdata,gchar *sheet)
+{
+ gchar *sheeturi = g_filename_to_uri(sheet,NULL,NULL);
+ open_xml_document(listdata->value);
+
+ set_xml_root_node(NULL);
+ xmlNodePtr head = xml_get_pointer_to_node((xmlChar*)"head",NULL,NULL);
+
+ xmlNodePtr link = xmlNewTextChild(head,NULL,(xmlChar*)"link",NULL);
+ xmlAttrPtr href = xmlNewProp(link,(xmlChar*)"href",(xmlChar*)sheeturi);
+ xmlAttrPtr rel = xmlNewProp(link,(xmlChar*)"rel",(xmlChar*)"alternate stylesheet");
+ xmlAttrPtr class = xmlNewProp(link,(xmlChar*)"class",(xmlChar*)"night");
+
+ xmlSaveFormatFile (listdata->value, xmldocument, 0);
+ xml_free_doc();
+ g_free(sheeturi);
+}
+
+static void
+epub_document_check_add_night_sheet(EvDocument *document)
+{
+ EpubDocument *epub_document = EPUB_DOCUMENT(document);
+
+ g_return_if_fail(EPUB_IS_DOCUMENT(epub_document));
+
+ /*
+ * We'll only check the first page for a supplied night mode stylesheet.
+ * Odds are, if this one has it, all others have it too.
+ */
+ contentListNode *node = epub_document->contentList->data;
+ gchar* stylesheetfilename = epub_document_get_alternate_stylesheet((gchar*)node->value) ;
+
+ if (stylesheetfilename == NULL) {
+ gchar *style = "body {color:rgb(255,255,255);background-color:rgb(0,0,0);text-align:justify;line-spacing:1.8; margin-top:0px;margin-bottom:4px;margin-right:50px;\
+ margin-left:50px;text-indent:3em;";
+
+ gchar *csspath = g_strdup_printf("%s/atrilnightstyle.css",epub_document->documentdir);
+
+
+ GFile *styles = g_file_new_for_path (csspath);
+ GOutputStream *outstream = (GOutputStream*)g_file_create(styles,G_FILE_CREATE_PRIVATE,NULL,NULL);
+ if ( g_output_stream_write((GOutputStream*)outstream,style,strlen(style),NULL,NULL) == -1 )
+ {
+ return ;
+ }
+ g_output_stream_close((GOutputStream*)outstream,NULL,NULL);
+ g_object_unref(styles) ;
+ g_object_unref(outstream) ;
+ //add this stylesheet to each document, for later.
+ g_list_foreach(epub_document->contentList,(GFunc)add_night_sheet,csspath);
+ g_free(csspath);
+ }
+ g_free(stylesheetfilename);
+}
+
+static void
+epub_document_toggle_night_mode(EvDocument *document,gboolean night)
+{
+ EpubDocument *epub_document = EPUB_DOCUMENT(document);
+
+ g_return_if_fail(EPUB_IS_DOCUMENT(epub_document));
+ if (night)
+ g_list_foreach(epub_document->contentList,(GFunc)change_to_night_sheet,NULL);
+ else
+ g_list_foreach(epub_document->contentList,(GFunc)change_to_day_sheet,NULL);
+}
static gboolean
epub_document_load (EvDocument* document,
@@ -1388,4 +1521,6 @@ epub_document_class_init (EpubDocumentClass *klass)
ev_document_class->get_n_pages = epub_document_get_n_pages;
ev_document_class->get_info = epub_document_get_info;
ev_document_class->get_page = epub_document_get_page;
+ ev_document_class->toggle_night_mode = epub_document_toggle_night_mode;
+ ev_document_class->check_add_night_sheet = epub_document_check_add_night_sheet;
} \ No newline at end of file