Codebase list sugar-read-activity / b782685
Pep8 & pyflakes fixes Also rewrite the js code using python multiline strings to improve readability. Gonzalo Odiard 8 years ago
5 changed file(s) with 118 addition(s) and 114 deletion(s). Raw diff Collapse all Expand all
5555
5656 def _unzip(self):
5757 # This is broken upto python 2.7
58 #self._zobject.extractall(path = self._tempdir)
58 # self._zobject.extractall(path = self._tempdir)
5959 orig_cwd = os.getcwd()
6060 os.chdir(self._tempdir)
6161 for name in self._zobject.namelist():
7878 tree = etree.parse(containerfile)
7979 root = tree.getroot()
8080
81 for element in root.iterfind(
82 './/{urn:oasis:names:tc:opendocument:xmlns:container}rootfile'):
81 r_id = './/{urn:oasis:names:tc:opendocument:xmlns:container}rootfile'
82 for element in root.iterfind(r_id):
8383 if element.get('media-type') == 'application/oebps-package+xml':
8484 self._opfpath = element.get('full-path')
8585
116116
117117 self._zobject = zipfile.ZipFile(self._file)
118118
119 if not 'mimetype' in self._zobject.namelist():
119 if 'mimetype' not in self._zobject.namelist():
120120 return False
121121
122122 mtypefile = self._zobject.open('mimetype')
2323 import os.path
2424 import math
2525 import shutil
26 import BeautifulSoup
27
28 from epub import _Epub
26
2927 from jobs import _JobPaginator as _Paginator
3028
3129 LOADING_HTML = '''
3937
4038 __gproperties__ = {
4139 'scale': (GObject.TYPE_FLOAT, 'the zoom level',
42 'the zoom level of the widget',
43 0.5, 4.0, 1.0, GObject.PARAM_READWRITE),
40 'the zoom level of the widget',
41 0.5, 4.0, 1.0, GObject.PARAM_READWRITE),
4442 }
4543 __gsignals__ = {
4644 'page-changed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE,
47 ([int, int])),
45 ([int, int])),
4846 'selection-changed': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE,
4947 ([])),
5048 }
5957 self._paginator = None
6058 self._loaded_page = -1
6159 self._file_loaded = True
62 #self._old_scrollval = -1
60 # self._old_scrollval = -1
6361 self._loaded_filename = None
6462 self._pagecount = -1
6563 self.__going_fwd = True
8583 self._view.connect('scroll-event', self._view_scroll_event_cb)
8684 self._view.connect('key-press-event', self._view_keypress_event_cb)
8785 self._view.connect('selection-changed',
88 self._view_selection_changed_cb)
86 self._view_selection_changed_cb)
8987 self._view.connect_after('populate-popup',
90 self._view_populate_popup_cb)
88 self._view_populate_popup_cb)
9189 self._view.connect('touch-change-page', self.__touch_page_changed_cb)
9290
9391 self._sw.add(self._view)
9492 self._v_vscrollbar = self._sw.get_vscrollbar()
95 self._v_scrollbar_value_changed_cb_id = \
96 self._v_vscrollbar.connect('value-changed', \
97 self._v_scrollbar_value_changed_cb)
93 self._v_scrollbar_value_changed_cb_id = self._v_vscrollbar.connect(
94 'value-changed', self._v_scrollbar_value_changed_cb)
9895 self._scrollbar = Gtk.VScrollbar()
99 self._scrollbar_change_value_cb_id = \
100 self._scrollbar.connect('change-value', \
101 self._scrollbar_change_value_cb)
96 self._scrollbar_change_value_cb_id = self._scrollbar.connect(
97 'change-value', self._scrollbar_change_value_cb)
10298
10399 overlay = Gtk.Overlay()
104100 hbox = Gtk.HBox()
237233 '''
238234 Returns the currently loaded XML file
239235 '''
240 #return self._loaded_filename
236 # return self._loaded_filename
241237 if self._paginator:
242238 return self._paginator.get_file_for_pageno(self._loaded_page)
243239 else:
339335 self._view.grab_focus()
340336
341337 if self._view.search_text(self._findjob.get_search_text(),
342 self._findjob.get_case_sensitive(),
343 True, False):
338 self._findjob.get_case_sensitive(),
339 True, False):
344340 return
345341 else:
346342 path = os.path.join(self._epub.get_basedir(),
347 self._findjob.get_next_file())
343 self._findjob.get_next_file())
348344 self.__in_search = True
349345 self.__search_fwd = True
350346 self._load_file(path)
356352 self._view.grab_focus()
357353
358354 if self._view.search_text(self._findjob.get_search_text(),
359 self._findjob.get_case_sensitive(),
360 False, False):
355 self._findjob.get_case_sensitive(),
356 False, False):
361357 return
362358 else:
363359 path = os.path.join(self._epub.get_basedir(),
364 self._findjob.get_prev_file())
360 self._findjob.get_prev_file())
365361 self.__in_search = True
366362 self.__search_fwd = False
367363 self._load_file(path)
374370
375371 def _mark_found_text(self):
376372 self._view.unmark_text_matches()
377 self._view.mark_text_matches(self._findjob.get_search_text(),
378 case_sensitive=self._findjob.get_case_sensitive(), limit=0)
373 self._view.mark_text_matches(
374 self._findjob.get_search_text(),
375 case_sensitive=self._findjob.get_case_sensitive(), limit=0)
379376 self._view.set_highlight_text_matches(True)
380377
381378 def __set_zoom(self, value):
435432
436433 filename = filename.split('#')[0] # Get rid of anchors
437434
438 if self._loaded_page < 1 or filename == None:
435 if self._loaded_page < 1 or filename is None:
439436 return False
440437
441438 self._loaded_filename = filename
442439
443440 remfactor = self._paginator.get_remfactor_for_file(filename)
444441 pages = self._paginator.get_pagecount_for_file(filename)
445 extra = int(math.ceil(remfactor *
446 self._view.get_page_height() / (pages - remfactor)))
442 extra = int(math.ceil(
443 remfactor * self._view.get_page_height() / (pages - remfactor)))
447444 if extra > 0:
448445 self._view.add_bottom_padding(extra)
449446
450447 if self.__in_search:
451448 self._mark_found_text()
452 self._view.search_text(self._findjob.get_search_text(), \
453 self._findjob.get_case_sensitive(), \
454 self.__search_fwd, False)
449 self._view.search_text(self._findjob.get_search_text(),
450 self._findjob.get_case_sensitive(),
451 self.__search_fwd, False)
455452 self.__in_search = False
456453 else:
457454 if self.__going_back:
460457 else:
461458 self._scroll_page()
462459
463 process_file = True
460 # process_file = True
464461 if self._internal_link is not None:
465462 self._view.go_to_link(self._internal_link)
466463 vertical_pos = \
467464 self._view.get_vertical_position_element(self._internal_link)
468465 # set the page number based in the vertical position
469466 initial_page = self._paginator.get_base_pageno_for_file(filename)
470 self._loaded_page = initial_page + int(vertical_pos /
471 self._paginator.get_single_page_height())
467 self._loaded_page = initial_page + int(
468 vertical_pos / self._paginator.get_single_page_height())
472469
473470 # There are epub files, created with Calibre,
474471 # where the link in the index points to the end of the previos
483480 logging.error('load next file %s', next_file)
484481 self.__in_search = False
485482 self.__going_back = False
486 process_file = False
483 # process_file = False
487484 GObject.idle_add(self._load_file, next_file)
488485
489486 # if process_file:
501498 word_begin = 0
502499 word_end = 0
503500 ignore_chars = [' ', '\n', u'\r', '_', '[', '{', ']', '}', '|',
504 '<', '>', '*', '+', '/', '\\']
501 '<', '>', '*', '+', '/', '\\']
505502 ignore_set = set(ignore_chars)
506503 self.word_tuples = []
507504 len_page_text = len(page_text)
509506 if page_text[i] not in ignore_set:
510507 word_begin = i
511508 j = i
512 while j < len_page_text and page_text[j] not in ignore_set:
509 while j < len_page_text and page_text[j] not in ignore_set:
513510 j = j + 1
514511 word_end = j
515512 i = j
516513 word_tuple = (word_begin, word_end,
517 page_text[word_begin: word_end])
514 page_text[word_begin: word_end])
518515 if word_tuple[2] != u'\r':
519516 self.word_tuples.append(word_tuple)
520517 i = i + 1
521518
522519 def _scroll_page_end(self):
523520 v_upper = self._v_vscrollbar.props.adjustment.props.upper
524 v_page_size = self._v_vscrollbar.props.adjustment.props.page_size
521 # v_page_size = self._v_vscrollbar.props.adjustment.props.page_size
525522 self._v_vscrollbar.set_value(v_upper)
526523
527524 def _scroll_page(self):
561558 scroll_upper = self._v_vscrollbar.props.adjustment.props.upper
562559 scroll_page_size = self._v_vscrollbar.props.adjustment.props.page_size
563560
564 if self.__going_fwd == True and \
565 not self._loaded_page == self._pagecount:
561 if self.__going_fwd and not self._loaded_page == self._pagecount:
566562 if self._paginator.get_file_for_pageno(self._loaded_page) != \
567 self._paginator.get_file_for_pageno(self._loaded_page + 1):
563 self._paginator.get_file_for_pageno(self._loaded_page + 1):
568564 # We don't need this if the next page is in another file
569565 return
570566
571567 scrollfactor_next = \
572 self._paginator.get_scrollfactor_pos_for_pageno(
568 self._paginator.get_scrollfactor_pos_for_pageno(
573569 self._loaded_page + 1)
574570 if scrollval > 0:
575571 scrollfactor = scrollval / (scroll_upper - scroll_page_size)
577573 scrollfactor = 0
578574 if scrollfactor >= scrollfactor_next:
579575 self._on_page_changed(self._loaded_page, self._loaded_page + 1)
580 elif self.__going_back == True and self._loaded_page > 1:
576 elif self.__going_back and self._loaded_page > 1:
581577 if self._paginator.get_file_for_pageno(self._loaded_page) != \
582 self._paginator.get_file_for_pageno(
583 self._loaded_page - 1):
578 self._paginator.get_file_for_pageno(self._loaded_page - 1):
584579 return
585580
586581 scrollfactor_cur = \
587 self._paginator.get_scrollfactor_pos_for_pageno(
582 self._paginator.get_scrollfactor_pos_for_pageno(
588583 self._loaded_page)
589584 if scrollval > 0:
590585 scrollfactor = scrollval / (scroll_upper - scroll_page_size)
607602
608603 def _load_page(self, pageno):
609604 if pageno > self._pagecount or pageno < 1:
610 #TODO: Cause an exception
605 # TODO: Cause an exception
611606 return
612607 if self._loaded_page == pageno:
613608 return
630625 shutil.copy('./epubview/highlight_words.js', destpath)
631626 self._insert_js_reference(filename.replace('file://', ''),
632627 destpath)
628 IMPORTANT: Find a way to do this without modify the files
629 now text highlight is implemented and the epub file is saved
633630 """
634631
635632 if filename.endswith('xml'):
646643
647644 def _insert_js_reference(self, file_name, path):
648645 js_reference = '<script type="text/javascript" ' + \
649 'src="./highlight_words.js"></script>'
646 'src="./highlight_words.js"></script>'
650647 o = open(file_name + '.tmp', 'a')
651648 for line in open(file_name):
652649 line = line.replace('</head>', js_reference + '</head>')
665662 self._view.load_uri('file://' + filepath)
666663 oldpage = self._loaded_page
667664 self._loaded_page = \
668 self._paginator.get_base_pageno_for_file(filepath)
665 self._paginator.get_base_pageno_for_file(filepath)
669666 self._scroll_page()
670667 self._on_page_changed(oldpage, self._loaded_page)
671668 break
690687 self._load_page(round(value))
691688 else:
692689 print 'Warning: unknown scrolltype %s with value %f' \
693 % (str(scrolltype), value)
694
695 #FIXME: This should not be needed here
690 % (str(scrolltype), value)
691
692 # FIXME: This should not be needed here
696693 self._scrollbar.set_value(self._loaded_page)
697694
698 if self.__page_changed == True:
695 if self.__page_changed:
699696 self.__page_changed = False
700697 return False
701698 else:
1818 from gi.repository import GObject
1919 from gi.repository import Gtk
2020 import widgets
21 import cairo
2221 import math
2322 import os.path
2423 import BeautifulSoup
25
26 import epub
2724
2825 import threading
2926
6865 body = soup.find('body')
6966 tags = body.findChildren(True)
7067 for tag in tags:
71 if not tag.string is None:
68 if tag.string is not None:
7269 if tag.string.find(self.obj._text) > -1:
7370 return True
7471
9895 self._count = 0
9996 self._pagecount = 0
10097
101 #TODO
98 # TODO
10299 """
103100 self._screen = Gdk.Screen.get_default()
104101 self._old_fontoptions = self._screen.get_font_options()
119116 settings.props.serif_font_family = 'DejaVu LGC Serif'
120117 settings.props.monospace_font_family = 'DejaVu LGC Sans Mono'
121118 settings.props.enforce_96_dpi = True
122 #FIXME: This does not seem to work
123 #settings.props.auto_shrink_images = False
119 # FIXME: This does not seem to work
120 # settings.props.auto_shrink_images = False
124121 settings.props.enable_plugins = False
125122 settings.props.default_font_size = 12
126123 settings.props.default_monospace_font_size = 10
131128 self._dpi = 96
132129 self._single_page_height = _mm_to_pixel(PAGE_HEIGHT, self._dpi)
133130 sw.set_size_request(_mm_to_pixel(PAGE_WIDTH, self._dpi),
134 self._single_page_height)
131 self._single_page_height)
135132 sw.add(self._temp_view)
136133 self._temp_win.add(sw)
137134 self._temp_view.connect('load-finished', self._page_load_finished_cb)
169166 else:
170167 pagelen = 1 / pages
171168 self._pagemap[float(self._pagecount + i)] = \
172 (f.props.uri, (i - 1) / math.ceil(pages), pagelen)
169 (f.props.uri, (i - 1) / math.ceil(pages), pagelen)
173170
174171 self._pagecount += int(math.ceil(pages))
175172 self._filedict[f.props.uri.replace('file://', '')] = \
176 (math.ceil(pages), math.ceil(pages) - pages)
173 (math.ceil(pages), math.ceil(pages) - pages)
177174 self._bookheight += pageheight
178175
179176 if self._count + 1 >= len(self._filelist):
180177 # TODO
181 #self._screen.set_font_options(self._old_fontoptions)
178 # self._screen.set_font_options(self._old_fontoptions)
182179 self.emit('paginated')
183180 GObject.idle_add(self._cleanup)
184181 else:
217214 Returns the pageno which begins in filename
218215 '''
219216 for key in self._pagemap.keys():
220 if self._pagemap[key][0].replace('file://', '') == filename:
217 if self._pagemap[key][0].replace('file://', '') == filename:
221218 return key
222219
223220 return None
248245 }
249246
250247 def __init__(self, document, start_page, n_pages, text,
251 case_sensitive=False):
248 case_sensitive=False):
252249 GObject.GObject.__init__(self)
253250
254251 self._finished = False
00 import xml.etree.ElementTree as etree
11 from gi.repository import Gtk
2 import logging
32
43
54 class NavPoint(object):
5049
5150 def _populate_toc(self):
5251 navmap = self._root.find(
53 '{http://www.daisy.org/z3986/2005/ncx/}navMap')
52 '{http://www.daisy.org/z3986/2005/ncx/}navMap')
5453 for navpoint in navmap.iterfind(
5554 './{http://www.daisy.org/z3986/2005/ncx/}navPoint'):
5655 self._process_navpoint(navpoint)
5756
5857 def _gettitle(self, navpoint):
59 text = navpoint.find('./{http://www.daisy.org/z3986/2005/ncx/}' +
60 'navLabel/{http://www.daisy.org/z3986/2005/ncx/}text')
58 text = navpoint.find(
59 './{http://www.daisy.org/z3986/2005/ncx/}' +
60 'navLabel/{http://www.daisy.org/z3986/2005/ncx/}text')
6161 return text.text
6262
6363 def _getcontent(self, navpoint):
6464 text = navpoint.find(
65 './{http://www.daisy.org/z3986/2005/ncx/}content')
66 if text is not None:
65 './{http://www.daisy.org/z3986/2005/ncx/}content')
66 if text is not None:
6767 return self._basepath + text.get('src')
6868 else:
6969 return ""
7272 title = self._gettitle(navpoint)
7373 content = self._getcontent(navpoint)
7474
75 #print title, content
75 # print title, content
7676
7777 iter = self._gtktreestore.append(parent, [title, content])
78 #self._flattoc.append((title, content))
78 # self._flattoc.append((title, content))
7979
8080 childnavpointlist = list(navpoint.iterfind(
81 './{http://www.daisy.org/z3986/2005/ncx/}navPoint'))
81 './{http://www.daisy.org/z3986/2005/ncx/}navPoint'))
8282
8383 if len(childnavpointlist):
8484 for childnavpoint in childnavpointlist:
9999 rendered.
100100 '''
101101 return self._flattoc
102
103 #t = TocParser('/home/sayamindu/Desktop/Test/OPS/fb.ncx')
0 import logging
1
02 from gi.repository import WebKit
13 from gi.repository import Gdk
24 from gi.repository import GObject
68
79 __gsignals__ = {
810 'touch-change-page': (GObject.SignalFlags.RUN_FIRST, GObject.TYPE_NONE,
9 ([bool])),
10 }
11 ([bool])), }
1112
1213 def __init__(self, only_to_measure=False):
1314 WebKit.WebView.__init__(self)
1415 self._only_to_measure = only_to_measure
1516
1617 def setup_touch(self):
17 self.get_window().set_events(self.get_window().get_events() |
18 Gdk.EventMask.TOUCH_MASK)
18 self.get_window().set_events(
19 self.get_window().get_events() | Gdk.EventMask.TOUCH_MASK)
1920 self.connect('event', self.__event_cb)
2021
2122 def __event_cb(self, widget, event):
3536 hide_scrollbar_js = ''
3637 if self._only_to_measure:
3738 hide_scrollbar_js = \
38 'document.documentElement.style.overflow = "hidden";'
39 'document.documentElement.style.overflow = "hidden";'
3940
40 js = 'document.documentElement.style.margin = "50px";' + \
41 'oldtitle=document.title;' + \
42 'if (document.body == null) {' + \
43 'document.title = 0} else {' + \
44 hide_scrollbar_js + \
45 'document.title=Math.max(document.body.scrollHeight, ' + \
46 'document.body.offsetHeight,document.documentElement.clientHeight,' + \
47 'document.documentElement.scrollHeight, ' + \
48 'document.documentElement.offsetHeight)};'
41 oldtitle = self.get_main_frame().get_title()
42
43 js = """
44 document.documentElement.style.margin = "50px";
45 if (document.body == null) {
46 document.title = 0;
47 } else {
48 %s
49 document.title=Math.max(document.body.scrollHeight,
50 document.body.offsetHeight,
51 document.documentElement.clientHeight,
52 document.documentElement.scrollHeight,
53 document.documentElement.offsetHeight);
54 };
55 """ % hide_scrollbar_js
4956 self.execute_script(js)
5057 ret = self.get_main_frame().get_title()
51 js = 'document.title=oldtitle;'
52 self.execute_script(js)
58 logging.error('get_page_height %s', ret)
59 self.execute_script('document.title=%s;' % oldtitle)
5360 try:
5461 return int(ret)
5562 except ValueError:
6067 Adds incr pixels of padding to the end of the loaded (X)HTML page.
6168 This is done via javascript at the moment
6269 '''
63 js = ('var newdiv = document.createElement("div");' + \
64 'newdiv.style.height = "%dpx";document.body.appendChild(newdiv);' \
65 % incr)
70 js = """
71 var newdiv = document.createElement("div");
72 newdiv.style.height = "%dpx";
73 document.body.appendChild(newdiv);
74 """ % incr
6675 self.execute_script(js)
6776
6877 def highlight_next_word(self):
8089 '''
8190 # remove the first '#' char
8291 id_link = id_link[1:]
83 js = "oldtitle = document.title;" \
84 "obj = document.getElementById('%s');" \
85 "var top = 0;" \
86 "if(obj.offsetParent) {" \
87 " while(1) {" \
88 " top += obj.offsetTop;" \
89 " if(!obj.offsetParent) {break;};" \
90 " obj = obj.offsetParent;" \
91 " };" \
92 "}" \
93 "else if(obj.y) { top += obj.y; };" \
94 "document.title=top;" % id_link
92 oldtitle = self.get_main_frame().get_title()
93 js = """
94 obj = document.getElementById('%s');
95 var top = 0;
96 if(obj.offsetParent) {
97 while(1) {
98 top += obj.offsetTop;
99 if(!obj.offsetParent) {
100 break;
101 };
102 obj = obj.offsetParent;
103 };
104 } else if(obj.y) {
105 top += obj.y;
106 };
107 document.title=top;""" % id_link
95108 self.execute_script(js)
96109 ret = self.get_main_frame().get_title()
97 js = 'document.title=oldtitle;'
98 self.execute_script(js)
110 self.execute_script('document.title=%s;' % oldtitle)
99111 try:
100112 return int(ret)
101113 except ValueError: