From 7d7ed5cfd78d2d3ec43219c8466d1f38cc17b2b7 Mon Sep 17 00:00:00 2001 From: GRiker Date: Sat, 4 Jun 2011 04:41:58 -0600 Subject: [PATCH 01/15] Added runtime sequence comment --- src/calibre/devices/apple/driver.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/devices/apple/driver.py b/src/calibre/devices/apple/driver.py index e1133ab929..dea5844028 100644 --- a/src/calibre/devices/apple/driver.py +++ b/src/calibre/devices/apple/driver.py @@ -135,7 +135,8 @@ class ITUNES(DriverBase): ''' Calling sequences: Initialization: - can_handle() or can_handle_windows() + can_handle() | can_handle_windows() + _launch_iTunes() reset() open() card_prefix() From ca3694b34ec8e8e15252898447304bf4578f414e Mon Sep 17 00:00:00 2001 From: GRiker Date: Thu, 9 Jun 2011 09:39:58 -0600 Subject: [PATCH 02/15] Updated iTunes icon --- resources/images/devices/itunes.png | Bin 25603 -> 25638 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/images/devices/itunes.png b/resources/images/devices/itunes.png index cd8579d492e85aa9f8a9777aba0c7273c26f62a4..cc0493d9eb7f5cd2216323fec6a9b1523b57917d 100644 GIT binary patch literal 25638 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%0A^7GlpqpU3D^5tE+mp0MnyiEwrLO|!9o~^w3 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 i0+PR#pjN;B{{a9lS1Q{(Y)LKv0000 Date: Tue, 14 Jun 2011 15:24:13 -0600 Subject: [PATCH 03/15] ... --- src/calibre/gui2/dialogs/plugin_updater.py | 5 ++--- src/calibre/gui2/update.py | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/calibre/gui2/dialogs/plugin_updater.py b/src/calibre/gui2/dialogs/plugin_updater.py index 855dbd148a..e7d641b43e 100644 --- a/src/calibre/gui2/dialogs/plugin_updater.py +++ b/src/calibre/gui2/dialogs/plugin_updater.py @@ -12,7 +12,7 @@ from lxml import html from PyQt4.Qt import (Qt, QUrl, QFrame, QVBoxLayout, QLabel, QBrush, QTextEdit, QComboBox, QAbstractItemView, QHBoxLayout, QDialogButtonBox, QAbstractTableModel, QVariant, QTableView, QModelIndex, - QSortFilterProxyModel, pyqtSignal, QAction, QIcon, QDialog, + QSortFilterProxyModel, QAction, QIcon, QDialog, QFont, QPixmap, QSize) from calibre import browser, prints from calibre.constants import numeric_version, iswindows, isosx, DEBUG @@ -447,7 +447,6 @@ class DisplayPluginModel(QAbstractTableModel): class PluginUpdaterDialog(SizePersistedDialog): - update_found = pyqtSignal(object) initial_extra_size = QSize(350, 100) def __init__(self, gui, initial_filter=FILTER_UPDATE_AVAILABLE): @@ -587,7 +586,7 @@ class PluginUpdaterDialog(SizePersistedDialog): # Force our toolbar/action to be updated based on uninstalled updates if self.model: update_plugins = filter(filter_upgradeable_plugins, self.model.display_plugins) - self.update_found.emit(update_plugins) + self.gui.recalc_update_label(len(update_plugins)) self.reject() def _plugin_current_changed(self, current, previous): diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index ed159f4778..b246c4a3b1 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -122,19 +122,25 @@ class UpdateNotification(QDialog): class UpdateMixin(object): def __init__(self, opts): + self.last_newest_calibre_version = NO_CALIBRE_UPDATE if not opts.no_update_check: self.update_checker = CheckForUpdates(self) self.update_checker.update_found.connect(self.update_found, type=Qt.QueuedConnection) self.update_checker.start() - def update_found(self, version, force=False): + def recalc_update_label(self, number_of_plugin_updates): + self.update_found('%s%s%d'%(self.last_newest_calibre_version, VSEP, + number_of_plugin_updates), no_show_popup=True) + + def update_found(self, version, force=False, no_show_popup=False): try: calibre_version, plugin_updates = version.split(VSEP) plugin_updates = int(plugin_updates) except: traceback.print_exc() return + self.last_newest_calibre_version = calibre_version has_calibre_update = calibre_version and calibre_version != NO_CALIBRE_UPDATE has_plugin_updates = plugin_updates > 0 if not has_calibre_update and not has_plugin_updates: @@ -157,11 +163,12 @@ class UpdateMixin(object): self.plugin_update_found(plugin_updates) if has_calibre_update: - if force or (config.get('new_version_notification') and \ - dynamic.get('update to version %s'%calibre_version, True)): - self._update_notification__ = UpdateNotification(calibre_version, - plugin_updates, parent=self) - self._update_notification__.show() + if (force or (config.get('new_version_notification') and + dynamic.get('update to version %s'%calibre_version, True))): + if not no_show_popup: + self._update_notification__ = UpdateNotification(calibre_version, + plugin_updates, parent=self) + self._update_notification__.show() elif has_plugin_updates: if force: from calibre.gui2.dialogs.plugin_updater import (PluginUpdaterDialog, From bf2d4d5ede4b1cfed12bbe3f5494aa5def255090 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 14 Jun 2011 15:28:44 -0600 Subject: [PATCH 04/15] ... --- src/calibre/gui2/update.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index b246c4a3b1..c62691f91e 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -149,7 +149,7 @@ class UpdateMixin(object): if has_calibre_update: plt = u'' if has_plugin_updates: - plt = ' (%d plugin updates)'%plugin_updates + plt = _(' (%d plugin updates)')%plugin_updates msg = (u'%s: ' u'%s%s') % ( _('Update found'), version, calibre_version, plt) From 53489c0eaa0bd8e2bdf400c23aaed703f7c4d72f Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 14 Jun 2011 15:49:18 -0600 Subject: [PATCH 05/15] ... --- src/calibre/gui2/update.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index c62691f91e..2696b855b7 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -159,8 +159,7 @@ class UpdateMixin(object): self.status_bar.update_label.setText(msg) self.status_bar.update_label.setVisible(True) - if has_plugin_updates: - self.plugin_update_found(plugin_updates) + self.plugin_update_found(plugin_updates) if has_calibre_update: if (force or (config.get('new_version_notification') and From 8568887d36ba9054ae891799772dfd962165c43b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 14 Jun 2011 16:49:00 -0600 Subject: [PATCH 06/15] ... --- src/calibre/gui2/update.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/calibre/gui2/update.py b/src/calibre/gui2/update.py index 2696b855b7..aacf30fe10 100644 --- a/src/calibre/gui2/update.py +++ b/src/calibre/gui2/update.py @@ -143,6 +143,8 @@ class UpdateMixin(object): self.last_newest_calibre_version = calibre_version has_calibre_update = calibre_version and calibre_version != NO_CALIBRE_UPDATE has_plugin_updates = plugin_updates > 0 + self.plugin_update_found(plugin_updates) + if not has_calibre_update and not has_plugin_updates: self.status_bar.update_label.setVisible(False) return @@ -159,7 +161,6 @@ class UpdateMixin(object): self.status_bar.update_label.setText(msg) self.status_bar.update_label.setVisible(True) - self.plugin_update_found(plugin_updates) if has_calibre_update: if (force or (config.get('new_version_notification') and From 0552e5bda773b485d440a1e3f174cd8bff08fc33 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 14 Jun 2011 17:29:01 -0600 Subject: [PATCH 07/15] Nook2 driver: Dont put news in News subfolder --- src/calibre/devices/nook/driver.py | 1 + src/calibre/devices/usbms/device.py | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/calibre/devices/nook/driver.py b/src/calibre/devices/nook/driver.py index 2fe8f667b0..9c8f882f3d 100644 --- a/src/calibre/devices/nook/driver.py +++ b/src/calibre/devices/nook/driver.py @@ -88,6 +88,7 @@ class NOOK_COLOR(NOOK): WINDOWS_MAIN_MEM = WINDOWS_CARD_A_MEM = 'EBOOK_DISK' EBOOK_DIR_MAIN = 'My Files' + NEWS_IN_FOLDER = False def upload_cover(self, path, filename, metadata, filepath): pass diff --git a/src/calibre/devices/usbms/device.py b/src/calibre/devices/usbms/device.py index f0090989d9..442f3701c4 100644 --- a/src/calibre/devices/usbms/device.py +++ b/src/calibre/devices/usbms/device.py @@ -101,6 +101,9 @@ class Device(DeviceConfig, DevicePlugin): #: The maximum length of paths created on the device MAX_PATH_LEN = 250 + #: Put news in its own folder + NEWS_IN_FOLDER = True + def reset(self, key='-1', log_packets=False, report_progress=None, detected_device=None): self._main_prefix = self._card_a_prefix = self._card_b_prefix = None @@ -946,7 +949,8 @@ class Device(DeviceConfig, DevicePlugin): extra_components = [] tag = special_tag if tag.startswith(_('News')): - extra_components.append('News') + if self.NEWS_IN_FOLDER: + extra_components.append('News') else: for c in tag.split('/'): c = sanitize(c) From 0e79b86f8ae3172bf1afbed114371af82d0c1aab Mon Sep 17 00:00:00 2001 From: GRiker Date: Wed, 15 Jun 2011 07:23:21 -0600 Subject: [PATCH 08/15] For CSV_XML output, convert fields of type unicode from HTML to markup text. --- src/calibre/library/catalog.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/calibre/library/catalog.py b/src/calibre/library/catalog.py index a19534191b..97454c90e2 100644 --- a/src/calibre/library/catalog.py +++ b/src/calibre/library/catalog.py @@ -149,6 +149,15 @@ class CSV_XML(CatalogPlugin): # {{{ elif field == 'comments': item = item.replace(u'\r\n',u' ') item = item.replace(u'\n',u' ') + + # Convert HTML to markdown text + if type(item) is unicode: + opening_tag = re.search('<(\w+)(\x20|>)',item) + if opening_tag: + closing_tag = re.search('<\/%s>$' % opening_tag.group(1), item) + if closing_tag: + item = html2text(item) + outstr.append(u'"%s"' % unicode(item).replace('"','""')) outfile.write(u','.join(outstr) + u'\n') From bd72eb2d8d4a25093d220b657ca999cd8857d768 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Jun 2011 10:10:08 -0600 Subject: [PATCH 09/15] ... --- src/calibre/manual/faq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index 274bf03eb3..4b527e169c 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -515,7 +515,7 @@ Downloading from the internet can sometimes result in a corrupted download. If t * Try rebooting your computer and running a registry cleaner like `Wise registry cleaner `_. * Try downloading the installer with an alternate browser. For example if you are using Internet Explorer, try using Firefox or Chrome instead. -Best place to ask for more help is in the `forums `_. +If you still cannot get the installer to work and you are on windows, you can use the `calibre portable install `_, which does not need an installer (it is just a zip file). My antivirus program claims |app| is a virus/trojan? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From 89865c13114ad7fa1f12bbe3d3217b21d64db2a0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Jun 2011 10:12:34 -0600 Subject: [PATCH 10/15] MOBI Output: Fix a bug where linking to the very first element in a file could sometimes result in the link pointing to the last element in the previous file. Fixes #797214 (Private bug) --- src/calibre/ebooks/mobi/writer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/ebooks/mobi/writer.py b/src/calibre/ebooks/mobi/writer.py index 2ca62f0dea..bf9de37513 100644 --- a/src/calibre/ebooks/mobi/writer.py +++ b/src/calibre/ebooks/mobi/writer.py @@ -241,6 +241,7 @@ class Serializer(object): if self.write_page_breaks_after_item: buffer.write('') buffer.write('') + self.anchor_offset = None def serialize_elem(self, elem, item, nsrmap=NSRMAP): buffer = self.buffer From bfcbaa645c228498e95c5133c8f4ee58a32ff242 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Jun 2011 10:16:04 -0600 Subject: [PATCH 11/15] ... --- src/calibre/gui2/preferences/plugins.ui | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/preferences/plugins.ui b/src/calibre/gui2/preferences/plugins.ui index a3655df2b8..b4dfd4426e 100644 --- a/src/calibre/gui2/preferences/plugins.ui +++ b/src/calibre/gui2/preferences/plugins.ui @@ -122,13 +122,13 @@ - + - &Add a new plugin + Get &new plugins - :/images/plugins.png:/images/plugins.png + :/images/plugins/plugin_new.png:/images/plugins/plugin_new.png @@ -144,13 +144,13 @@ - + - Get &new plugins + &Load plugin from file - :/images/plugins/plugin_new.png:/images/plugins/plugin_new.png + :/images/document_open.png:/images/document_open.png From 935bbe502d1570e391ead71c65012d8b552b627e Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Jun 2011 12:21:39 -0600 Subject: [PATCH 12/15] Update version of monocle in tree to 2.0.0 --- resources/content_server/read/monocle.js | 382 +++++++++++++++++------ 1 file changed, 279 insertions(+), 103 deletions(-) diff --git a/resources/content_server/read/monocle.js b/resources/content_server/read/monocle.js index 8d58ba8a06..560e4af641 100644 --- a/resources/content_server/read/monocle.js +++ b/resources/content_server/read/monocle.js @@ -1,5 +1,5 @@ Monocle = { - VERSION: "1.0.0" + VERSION: "2.0.0" }; @@ -170,7 +170,8 @@ Monocle.Browser.has.iframeTouchBug = Monocle.Browser.iOSVersionBelow("4.2"); Monocle.Browser.has.selectThruBug = Monocle.Browser.iOSVersionBelow("4.2"); Monocle.Browser.has.mustScrollSheaf = Monocle.Browser.is.MobileSafari; -Monocle.Browser.has.iframeDoubleWidthBug = Monocle.Browser.has.mustScrollSheaf; +Monocle.Browser.has.iframeDoubleWidthBug = + Monocle.Browser.has.mustScrollSheaf || Monocle.Browser.on.Kindle3; Monocle.Browser.has.floatColumnBug = Monocle.Browser.is.WebKit; @@ -181,6 +182,11 @@ Monocle.Browser.has.jumpFlickerBug = Monocle.Browser.on.MacOSX && Monocle.Browser.is.WebKit; +Monocle.Browser.has.columnOverflowPaintBug = Monocle.Browser.is.WebKit && + !Monocle.Browser.is.MobileSafari && + navigator.userAgent.indexOf("AppleWebKit/534") > 0; + + if (typeof window.console == "undefined") { window.console = { messages: [], @@ -241,6 +247,7 @@ Monocle.Factory = function (element, label, index, reader) { function initialize() { + if (!p.label) { return; } var node = p.reader.properties.graph; node[p.label] = node[p.label] || []; if (typeof p.index == 'undefined' && node[p.label][p.index]) { @@ -274,7 +281,11 @@ Monocle.Factory = function (element, label, index, reader) { function make(tagName, oLabel, index_or_options, or_options) { var oIndex, options; - if (arguments.length == 2) { + if (arguments.length == 1) { + oLabel = null, + oIndex = 0; + options = {}; + } else if (arguments.length == 2) { oIndex = 0; options = {}; } else if (arguments.length == 4) { @@ -376,6 +387,22 @@ Monocle.pieceLoaded('factory'); Monocle.Events = {} +Monocle.Events.dispatch = function (elem, evtType, data, cancelable) { + if (!document.createEvent) { + return true; + } + var evt = document.createEvent("Events"); + evt.initEvent(evtType, false, cancelable || false); + evt.m = data; + try { + return elem.dispatchEvent(evt); + } catch(e) { + console.warn("Failed to dispatch event: "+evtType); + return false; + } +} + + Monocle.Events.listen = function (elem, evtType, fn, useCapture) { if (elem.addEventListener) { return elem.addEventListener(evtType, fn, useCapture || false); @@ -405,7 +432,7 @@ Monocle.Events.listenForContact = function (elem, fns, options) { pageY: ci.pageY }; - var target = evt.target || window.srcElement; + var target = evt.target || evt.srcElement; while (target.nodeType != 1 && target.parentNode) { target = target.parentNode; } @@ -527,13 +554,18 @@ Monocle.Events.deafenForContact = function (elem, listeners) { } -Monocle.Events.listenForTap = function (elem, fn) { +Monocle.Events.listenForTap = function (elem, fn, activeClass) { var startPos; if (Monocle.Browser.on.Kindle3) { Monocle.Events.listen(elem, 'click', function () {}); } + var annul = function () { + startPos = null; + if (activeClass && elem.dom) { elem.dom.removeClass(activeClass); } + } + var annulIfOutOfBounds = function (evt) { if (evt.type.match(/^mouse/)) { return; @@ -545,7 +577,7 @@ Monocle.Events.listenForTap = function (elem, fn) { evt.m.registrantX < 0 || evt.m.registrantX > elem.offsetWidth || evt.m.registrantY < 0 || evt.m.registrantY > elem.offsetHeight ) { - startPos = null; + annul(); } else { evt.preventDefault(); } @@ -557,6 +589,7 @@ Monocle.Events.listenForTap = function (elem, fn) { start: function (evt) { startPos = [evt.m.pageX, evt.m.pageY]; evt.preventDefault(); + if (activeClass && elem.dom) { elem.dom.addClass(activeClass); } }, move: annulIfOutOfBounds, end: function (evt) { @@ -565,10 +598,9 @@ Monocle.Events.listenForTap = function (elem, fn) { evt.m.startOffset = startPos; fn(evt); } + annul(); }, - cancel: function (evt) { - startPos = null; - } + cancel: annul }, { useCapture: false @@ -997,6 +1029,9 @@ Monocle.Reader = function (node, bookData, options, onLoadCallback) { createReaderElements(); p.defaultStyles = addPageStyles(k.DEFAULT_STYLE_RULES, false); + if (options.stylesheet) { + p.initialStyles = addPageStyles(options.stylesheet, false); + } primeFrames(options.primeURL, function () { applyStyles(); @@ -1077,6 +1112,7 @@ Monocle.Reader = function (node, bookData, options, onLoadCallback) { if (Monocle.Browser.is.WebKit) { frame.contentDocument.documentElement.style.overflow = "hidden"; } + dispatchEvent('monocle:frameprimed', { frame: frame, pageIndex: pageCount }); if ((pageCount += 1) == pageMax) { Monocle.defer(callback); } @@ -1131,6 +1167,7 @@ Monocle.Reader = function (node, bookData, options, onLoadCallback) { var pageCount = 0; if (typeof callback == 'function') { var watcher = function (evt) { + dispatchEvent('monocle:firstcomponentchange', evt.m); if ((pageCount += 1) == p.flipper.pageCount) { deafen('monocle:componentchange', watcher); callback(); @@ -1239,7 +1276,7 @@ Monocle.Reader = function (node, bookData, options, onLoadCallback) { page.appendChild(runner); ctrlData.elements.push(runner); } - } else if (cType == "modal" || cType == "popover") { + } else if (cType == "modal" || cType == "popover" || cType == "hud") { ctrlElem = ctrl.createControlElements(overlay); overlay.appendChild(ctrlElem); ctrlData.elements.push(ctrlElem); @@ -1312,24 +1349,33 @@ Monocle.Reader = function (node, bookData, options, onLoadCallback) { var controlData = dataForControl(ctrl); if (!controlData) { console.warn("No data for control: " + ctrl); - return; + return false; } - if (controlData.hidden == false) { - return; + + if (showingControl(ctrl)) { + return false; } + + var overlay = dom.find('overlay'); + if (controlData.usesOverlay && controlData.controlType != "hud") { + for (var i = 0, ii = p.controls.length; i < ii; ++i) { + if (p.controls[i].usesOverlay && !p.controls[i].hidden) { + return false; + } + } + overlay.style.display = "block"; + } + for (var i = 0; i < controlData.elements.length; ++i) { controlData.elements[i].style.display = "block"; } - var overlay = dom.find('overlay'); - if (controlData.usesOverlay) { - overlay.style.display = "block"; - } + if (controlData.controlType == "popover") { overlay.listeners = Monocle.Events.listenForContact( overlay, { start: function (evt) { - obj = evt.target || window.event.srcElement; + var obj = evt.target || window.event.srcElement; do { if (obj == controlData.elements[0]) { return true; } } while (obj && (obj = obj.parentNode)); @@ -1346,22 +1392,18 @@ Monocle.Reader = function (node, bookData, options, onLoadCallback) { ctrl.properties.hidden = false; } dispatchEvent('controlshow', ctrl, false); + return true; + } + + + function showingControl(ctrl) { + var controlData = dataForControl(ctrl); + return controlData.hidden == false; } function dispatchEvent(evtType, data, cancelable) { - if (!document.createEvent) { - return true; - } - var evt = document.createEvent("Events"); - evt.initEvent(evtType, false, cancelable || false); - evt.m = data; - try { - return dom.find('box').dispatchEvent(evt); - } catch(e) { - console.warn("Failed to dispatch event: " + evtType); - return false; - } + return Monocle.Events.dispatch(dom.find('box'), evtType, data, cancelable); } @@ -1502,6 +1544,7 @@ Monocle.Reader = function (node, bookData, options, onLoadCallback) { API.addControl = addControl; API.hideControl = hideControl; API.showControl = showControl; + API.showingControl = showingControl; API.dispatchEvent = dispatchEvent; API.listen = listen; API.deafen = deafen; @@ -1527,22 +1570,32 @@ Monocle.Reader.DEFAULT_CLASS_PREFIX = 'monelem_' Monocle.Reader.FLIPPER_DEFAULT_CLASS = "Slider"; Monocle.Reader.FLIPPER_LEGACY_CLASS = "Legacy"; Monocle.Reader.DEFAULT_STYLE_RULES = [ - "html * {" + + "html#RS\\:monocle * {" + + "-webkit-font-smoothing: subpixel-antialiased;" + "text-rendering: auto !important;" + "word-wrap: break-word !important;" + + "overflow: visible !important;" + (Monocle.Browser.has.floatColumnBug ? "float: none !important;" : "") + - "}" + - "body {" + + "}", + "html#RS\\:monocle body {" + "margin: 0 !important;" + "padding: 0 !important;" + "-webkit-text-size-adjust: none;" + - "}" + - "table, img {" + + "}", + "html#RS\\:monocle body * {" + "max-width: 100% !important;" + - "max-height: 90% !important;" + + "}", + "html#RS\\:monocle img, html#RS\\:monocle video, html#RS\\:monocle object {" + + "max-height: 95% !important;" + "}" ] +if (Monocle.Browser.has.columnOverflowPaintBug) { + Monocle.Reader.DEFAULT_STYLE_RULES.push( + "::-webkit-scrollbar { width: 0; height: 0; }" + ) +} + Monocle.pieceLoaded('reader'); /* BOOK */ @@ -1586,6 +1639,16 @@ Monocle.Book = function (dataSource) { locus.load = true; locus.componentId = p.componentIds[0]; return locus; + } else if ( + cIndex < 0 && + locus.componentId && + currComponent.properties.id != locus.componentId + ) { + pageDiv.m.reader.dispatchEvent( + "monocle:notfound", + { href: locus.componentId } + ); + return null; } else if (cIndex < 0) { component = currComponent; locus.componentId = pageDiv.m.activeFrame.m.component.properties.id; @@ -1619,6 +1682,8 @@ Monocle.Book = function (dataSource) { result.page += locus.direction; } else if (typeof(locus.anchor) == "string") { result.page = component.pageForChapter(locus.anchor, pageDiv); + } else if (typeof(locus.xpath) == "string") { + result.page = component.pageForXPath(locus.xpath, pageDiv); } else if (typeof(locus.position) == "string") { if (locus.position == "start") { result.page = 1; @@ -1638,6 +1703,7 @@ Monocle.Book = function (dataSource) { if (result.page < 1) { if (cIndex == 0) { result.page = 1; + result.boundarystart = true; } else { result.load = true; result.componentId = p.componentIds[cIndex - 1]; @@ -1647,6 +1713,7 @@ Monocle.Book = function (dataSource) { } else if (result.page > lastPageNum['new']) { if (cIndex == p.lastCIndex) { result.page = lastPageNum['new']; + result.boundaryend = true; } else { result.load = true; result.componentId = p.componentIds[cIndex + 1]; @@ -1660,18 +1727,25 @@ Monocle.Book = function (dataSource) { function setPageAt(pageDiv, locus) { locus = pageNumberAt(pageDiv, locus); - if (!locus.load) { - var component = p.components[p.componentIds.indexOf(locus.componentId)]; - pageDiv.m.place = pageDiv.m.place || new Monocle.Place(); - pageDiv.m.place.setPlace(component, locus.page); + if (locus && !locus.load) { + var evtData = { locus: locus, page: pageDiv } + if (locus.boundarystart) { + pageDiv.m.reader.dispatchEvent('monocle:boundarystart', evtData); + } else if (locus.boundaryend) { + pageDiv.m.reader.dispatchEvent('monocle:boundaryend', evtData); + } else { + var component = p.components[p.componentIds.indexOf(locus.componentId)]; + pageDiv.m.place = pageDiv.m.place || new Monocle.Place(); + pageDiv.m.place.setPlace(component, locus.page); - var evtData = { - page: pageDiv, - locus: locus, - pageNumber: pageDiv.m.place.pageNumber(), - componentId: locus.componentId + var evtData = { + page: pageDiv, + locus: locus, + pageNumber: pageDiv.m.place.pageNumber(), + componentId: locus.componentId + } + pageDiv.m.reader.dispatchEvent("monocle:pagechange", evtData); } - pageDiv.m.reader.dispatchEvent("monocle:pagechange", evtData); } return locus; } @@ -1683,6 +1757,10 @@ Monocle.Book = function (dataSource) { locus = pageNumberAt(pageDiv, locus); } + if (!locus) { + return; + } + if (!locus.load) { callback(locus); return; @@ -1690,7 +1768,9 @@ Monocle.Book = function (dataSource) { var findPageNumber = function () { locus = setPageAt(pageDiv, locus); - if (locus.load) { + if (!locus) { + return; + } else if (locus.load) { loadPageAt(pageDiv, locus, callback, progressCallback) } else { callback(locus); @@ -1715,10 +1795,12 @@ Monocle.Book = function (dataSource) { } - function setOrLoadPageAt(pageDiv, locus, callback, progressCallback) { + function setOrLoadPageAt(pageDiv, locus, callback, onProgress, onFail) { locus = setPageAt(pageDiv, locus); - if (locus.load) { - loadPageAt(pageDiv, locus, callback, progressCallback); + if (!locus) { + if (onFail) { onFail(); } + } else if (locus.load) { + loadPageAt(pageDiv, locus, callback, onProgress); } else { callback(locus); } @@ -1864,13 +1946,18 @@ Monocle.Place = function () { } - function percentageThrough() { + function percentAtTopOfPage() { + return p.percent - 1.0 / p.component.lastPageNumber(); + } + + + function percentAtBottomOfPage() { return p.percent; } - function pageAtPercentageThrough(pc) { - return Math.max(Math.round(p.component.lastPageNumber() * pc), 1); + function pageAtPercentageThrough(percent) { + return Math.max(Math.round(p.component.lastPageNumber() * percent), 1); } @@ -1911,6 +1998,8 @@ Monocle.Place = function () { } if (options.direction) { locus.page += options.direction; + } else { + locus.percent = percentAtBottomOfPage(); } return locus; } @@ -1942,7 +2031,9 @@ Monocle.Place = function () { API.setPlace = setPlace; API.setPercentageThrough = setPercentageThrough; API.componentId = componentId; - API.percentageThrough = percentageThrough; + API.percentAtTopOfPage = percentAtTopOfPage; + API.percentAtBottomOfPage = percentAtBottomOfPage; + API.percentageThrough = percentAtBottomOfPage; API.pageAtPercentageThrough = pageAtPercentageThrough; API.pageNumber = pageNumber; API.chapterInfo = chapterInfo; @@ -2158,11 +2249,13 @@ Monocle.Component = function (book, id, index, chapters, source) { if (p.chapters[0] && typeof p.chapters[0].percent == "number") { return; } + var doc = pageDiv.m.activeFrame.contentDocument; for (var i = 0; i < p.chapters.length; ++i) { var chp = p.chapters[i]; chp.percent = 0; if (chp.fragment) { - chp.percent = pageDiv.m.dimensions.percentageThroughOfId(chp.fragment); + var node = doc.getElementById(chp.fragment); + chp.percent = pageDiv.m.dimensions.percentageThroughOfNode(node); } } return p.chapters; @@ -2187,14 +2280,37 @@ Monocle.Component = function (book, id, index, chapters, source) { if (!fragment) { return 1; } - var pc2pn = function (pc) { return Math.floor(pc * p.pageLength) + 1 } for (var i = 0; i < p.chapters.length; ++i) { if (p.chapters[i].fragment == fragment) { - return pc2pn(p.chapters[i].percent); + return percentToPageNumber(p.chapters[i].percent); } } - var percent = pageDiv.m.dimensions.percentageThroughOfId(fragment); - return pc2pn(percent); + var doc = pageDiv.m.activeFrame.contentDocument; + var node = doc.getElementById(fragment); + var percent = pageDiv.m.dimensions.percentageThroughOfNode(node); + return percentToPageNumber(percent); + } + + + function pageForXPath(xpath, pageDiv) { + var doc = pageDiv.m.activeFrame.contentDocument; + var percent = 0; + if (typeof doc.evaluate == "function") { + var node = doc.evaluate( + xpath, + doc, + null, + 9, + null + ).singleNodeValue; + var percent = pageDiv.m.dimensions.percentageThroughOfNode(node); + } + return percentToPageNumber(percent); + } + + + function percentToPageNumber(pc) { + return Math.floor(pc * p.pageLength) + 1; } @@ -2207,6 +2323,7 @@ Monocle.Component = function (book, id, index, chapters, source) { API.updateDimensions = updateDimensions; API.chapterForPage = chapterForPage; API.pageForChapter = pageForChapter; + API.pageForXPath = pageForXPath; API.lastPageNumber = lastPageNumber; return API; @@ -2415,9 +2532,11 @@ Monocle.Dimensions.Vert = function (pageDiv) { } - function percentageThroughOfId(id) { + function percentageThroughOfNode(target) { + if (!target) { + return 0; + } var doc = p.page.m.activeFrame.contentDocument; - var target = doc.getElementById(id); var offset = 0; if (target.getBoundingClientRect) { offset = target.getBoundingClientRect().top; @@ -2456,7 +2575,7 @@ Monocle.Dimensions.Vert = function (pageDiv) { API.hasChanged = hasChanged; API.measure = measure; API.pages = pages; - API.percentageThroughOfId = percentageThroughOfId; + API.percentageThroughOfNode = percentageThroughOfNode; API.locusToOffset = locusToOffset; initialize(); @@ -2713,8 +2832,7 @@ Monocle.Dimensions.Columns = function (pageDiv) { (!p.measurements) || (p.measurements.width != newMeasurements.width) || (p.measurements.height != newMeasurements.height) || - (p.measurements.scrollWidth != newMeasurements.scrollWidth) || - (p.measurements.fontSize != newMeasurements.fontSize) + (p.measurements.scrollWidth != newMeasurements.scrollWidth) ); } @@ -2736,10 +2854,16 @@ Monocle.Dimensions.Columns = function (pageDiv) { if (!lc || !lc.getBoundingClientRect) { console.warn('Empty document for page['+p.page.m.pageIndex+']'); p.measurements.scrollWidth = p.measurements.width; - } else if (lc.getBoundingClientRect().bottom > p.measurements.height) { - p.measurements.scrollWidth = p.measurements.width * 2; } else { - p.measurements.scrollWidth = p.measurements.width; + var bcr = lc.getBoundingClientRect(); + if ( + bcr.right > p.measurements.width || + bcr.bottom > p.measurements.height + ) { + p.measurements.scrollWidth = p.measurements.width * 2; + } else { + p.measurements.scrollWidth = p.measurements.width; + } } } @@ -2758,12 +2882,11 @@ Monocle.Dimensions.Columns = function (pageDiv) { } - function percentageThroughOfId(id) { - var doc = p.page.m.activeFrame.contentDocument; - var target = doc.getElementById(id); + function percentageThroughOfNode(target) { if (!target) { return 0; } + var doc = p.page.m.activeFrame.contentDocument; var offset = 0; if (target.getBoundingClientRect) { offset = target.getBoundingClientRect().left; @@ -2785,20 +2908,30 @@ Monocle.Dimensions.Columns = function (pageDiv) { function componentChanged(evt) { if (evt.m['page'] != p.page) { return; } var doc = evt.m['document']; - Monocle.Styles.applyRules(doc.body, k.BODY_STYLES); + if (Monocle.Browser.has.columnOverflowPaintBug) { + var div = doc.createElement('div'); + Monocle.Styles.applyRules(div, k.BODY_STYLES); + div.style.cssText += "overflow: scroll !important;"; + while (doc.body.childNodes.length) { + div.appendChild(doc.body.firstChild); + } + doc.body.appendChild(div); + } else { + Monocle.Styles.applyRules(doc.body, k.BODY_STYLES); - if (Monocle.Browser.is.WebKit) { - doc.documentElement.style.overflow = 'hidden'; + if (Monocle.Browser.is.WebKit) { + doc.documentElement.style.overflow = 'hidden'; + } } + p.dirty = true; } function setColumnWidth() { var cw = p.page.m.sheafDiv.clientWidth; - var doc = p.page.m.activeFrame.contentDocument; if (currBodyStyleValue('column-width') != cw+"px") { - Monocle.Styles.affix(doc.body, 'column-width', cw+"px"); + Monocle.Styles.affix(columnedElement(), 'column-width', cw+"px"); p.dirty = true; } } @@ -2809,8 +2942,7 @@ Monocle.Dimensions.Columns = function (pageDiv) { return { width: sheaf.clientWidth, height: sheaf.clientHeight, - scrollWidth: scrollerWidth(), - fontSize: currBodyStyleValue('font-size') + scrollWidth: scrollerWidth() } } @@ -2819,16 +2951,24 @@ Monocle.Dimensions.Columns = function (pageDiv) { if (Monocle.Browser.has.mustScrollSheaf) { return p.page.m.sheafDiv; } else { - return p.page.m.activeFrame.contentDocument.body; + return columnedElement(); } } + function columnedElement() { + var elem = p.page.m.activeFrame.contentDocument.body; + return Monocle.Browser.has.columnOverflowPaintBug ? elem.firstChild : elem; + } + + function scrollerWidth() { var bdy = p.page.m.activeFrame.contentDocument.body; if (Monocle.Browser.has.iframeDoubleWidthBug) { - if (Monocle.Browser.on.Android) { - return bdy.scrollWidth * 1.5; // I actually have no idea why 1.5. + if (Monocle.Browser.on.Kindle3) { + return scrollerElement().scrollWidth; + } else if (Monocle.Browser.on.Android) { + return bdy.scrollWidth; } else if (Monocle.Browser.iOSVersion < "4.1") { var hbw = bdy.scrollWidth / 2; var sew = scrollerElement().scrollWidth; @@ -2838,15 +2978,18 @@ Monocle.Dimensions.Columns = function (pageDiv) { var hbw = bdy.scrollWidth / 2; return hbw; } - } else if (Monocle.Browser.is.Gecko) { - var lc = bdy.lastChild; - while (lc && lc.nodeType != 1) { - lc = lc.previousSibling; - } - if (lc && lc.getBoundingClientRect) { - return lc.getBoundingClientRect().right; + } else if (bdy.getBoundingClientRect) { + var elems = bdy.getElementsByTagName('*'); + var bdyRect = bdy.getBoundingClientRect(); + var l = bdyRect.left, r = bdyRect.right; + for (var i = elems.length - 1; i >= 0; --i) { + var rect = elems[i].getBoundingClientRect(); + l = Math.min(l, rect.left); + r = Math.max(r, rect.right); } + return Math.abs(l) + Math.abs(r); } + return scrollerElement().scrollWidth; } @@ -2867,8 +3010,14 @@ Monocle.Dimensions.Columns = function (pageDiv) { function translateToLocus(locus) { var offset = locusToOffset(locus); - var bdy = p.page.m.activeFrame.contentDocument.body; - Monocle.Styles.affix(bdy, "transform", "translateX("+offset+"px)"); + p.page.m.offset = 0 - offset; + if (k.SETX && !Monocle.Browser.has.columnOverflowPaintBug) { + var bdy = p.page.m.activeFrame.contentDocument.body; + Monocle.Styles.affix(bdy, "transform", "translateX("+offset+"px)"); + } else { + var scrElem = scrollerElement(); + scrElem.scrollLeft = 0 - offset; + } return offset; } @@ -2876,7 +3025,7 @@ Monocle.Dimensions.Columns = function (pageDiv) { API.hasChanged = hasChanged; API.measure = measure; API.pages = pages; - API.percentageThroughOfId = percentageThroughOfId; + API.percentageThroughOfNode = percentageThroughOfNode; API.locusToOffset = locusToOffset; API.translateToLocus = translateToLocus; @@ -2898,6 +3047,8 @@ Monocle.Dimensions.Columns.BODY_STYLES = { "column-fill": "auto" } +Monocle.Dimensions.Columns.SETX = true; // Set to false for scrollLeft. + if (Monocle.Browser.has.iframeDoubleWidthBug) { Monocle.Dimensions.Columns.BODY_STYLES["min-width"] = "200%"; } else { @@ -2924,6 +3075,8 @@ Monocle.Flippers.Slider = function (reader) { function addPage(pageDiv) { pageDiv.m.dimensions = new Monocle.Dimensions.Columns(pageDiv); + + Monocle.Styles.setX(pageDiv, "0px"); } @@ -2963,6 +3116,7 @@ Monocle.Flippers.Slider = function (reader) { function interactiveMode(bState) { + p.reader.dispatchEvent('monocle:interactive:'+(bState ? 'on' : 'off')); if (!Monocle.Browser.has.selectThruBug) { return; } @@ -2994,10 +3148,10 @@ Monocle.Flippers.Slider = function (reader) { function moveTo(locus, callback) { var fn = function () { - prepareNextPage(announceTurn); - if (typeof callback == "function") { - callback(); - } + prepareNextPage(function () { + if (typeof callback == "function") { callback(); } + announceTurn(); + }); } setPage(upperPage(), locus, fn); } @@ -3045,12 +3199,26 @@ Monocle.Flippers.Slider = function (reader) { if (dir == k.FORWARDS) { if (getPlace().onLastPageOfBook()) { + p.reader.dispatchEvent( + 'monocle:boundaryend', + { + locus: getPlace().getLocus({ direction : dir }), + page: upperPage() + } + ); resetTurnData(); return; } onGoingForward(boxPointX); } else if (dir == k.BACKWARDS) { if (getPlace().onFirstPageOfBook()) { + p.reader.dispatchEvent( + 'monocle:boundarystart', + { + locus: getPlace().getLocus({ direction : dir }), + page: upperPage() + } + ); resetTurnData(); return; } @@ -3215,14 +3383,14 @@ Monocle.Flippers.Slider = function (reader) { function announceTurn() { - hideWaitControl(upperPage()); - hideWaitControl(lowerPage()); p.reader.dispatchEvent('monocle:turn'); resetTurnData(); } function resetTurnData() { + hideWaitControl(upperPage()); + hideWaitControl(lowerPage()); p.turnData = {}; } @@ -3268,7 +3436,7 @@ Monocle.Flippers.Slider = function (reader) { (new Date()).getTime() - stamp > duration || Math.abs(currX - finalX) <= Math.abs((currX + step) - finalX) ) { - clearTimeout(elem.setXTransitionInterval) + clearTimeout(elem.setXTransitionInterval); Monocle.Styles.setX(elem, finalX); if (elem.setXTCB) { elem.setXTCB(); @@ -3366,13 +3534,17 @@ Monocle.Flippers.Slider = function (reader) { function jumpIn(pageDiv, callback) { var dur = Monocle.Browser.has.jumpFlickerBug ? 1 : 0; - setX(pageDiv, 0, { duration: dur }, callback); + Monocle.defer(function () { + setX(pageDiv, 0, { duration: dur }, callback); + }); } function jumpOut(pageDiv, callback) { var dur = Monocle.Browser.has.jumpFlickerBug ? 1 : 0; - setX(pageDiv, 0 - pageDiv.offsetWidth, { duration: dur }, callback); + Monocle.defer(function () { + setX(pageDiv, 0 - pageDiv.offsetWidth, { duration: dur }, callback); + }); } @@ -3382,7 +3554,9 @@ Monocle.Flippers.Slider = function (reader) { duration: k.durations.SLIDE, timing: 'ease-in' }; - setX(upperPage(), 0, slideOpts, callback); + Monocle.defer(function () { + setX(upperPage(), 0, slideOpts, callback); + }); } @@ -3391,7 +3565,9 @@ Monocle.Flippers.Slider = function (reader) { duration: k.durations.SLIDE, timing: 'ease-in' }; - setX(upperPage(), 0 - upperPage().offsetWidth, slideOpts, callback); + Monocle.defer(function () { + setX(upperPage(), 0 - upperPage().offsetWidth, slideOpts, callback); + }); } @@ -3418,13 +3594,13 @@ Monocle.Flippers.Slider = function (reader) { function showWaitControl(page) { var ctrl = p.reader.dom.find('flippers_slider_wait', page.m.pageIndex); - ctrl.style.opacity = 0.5; + ctrl.style.visibility = "visible"; } function hideWaitControl(page) { var ctrl = p.reader.dom.find('flippers_slider_wait', page.m.pageIndex); - ctrl.style.opacity = 0; + ctrl.style.visibility = "hidden"; } API.pageCount = p.pageCount; From 363acd703fd5a424ff8337227cc12192f85a6b94 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Jun 2011 16:09:49 -0600 Subject: [PATCH 13/15] Update Metro UK --- recipes/metro_uk.recipe | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/recipes/metro_uk.recipe b/recipes/metro_uk.recipe index deced5976b..2d5155ef29 100644 --- a/recipes/metro_uk.recipe +++ b/recipes/metro_uk.recipe @@ -1,29 +1,32 @@ from calibre.web.feeds.news import BasicNewsRecipe class AdvancedUserRecipe1306097511(BasicNewsRecipe): title = u'Metro UK' - - no_stylesheets = True - oldest_article = 1 - max_articles_per_feed = 200 + description = 'News as provide by The Metro -UK' __author__ = 'Dave Asbury' + no_stylesheets = True + oldest_article = 1 + max_articles_per_feed = 25 + remove_empty_feeds = True + remove_javascript = True + + language = 'en_GB' - simultaneous_downloads= 3 + masthead_url = 'http://e-edition.metro.co.uk/images/metro_logo.gif' + extra_css = 'h2 {font: sans-serif medium;}' keep_only_tags = [ + dict(name='h1'),dict(name='h2', attrs={'class':'h2'}), dict(attrs={'class':['img-cnt figure']}), - dict(attrs={'class':['art-img']}), - dict(name='h1'), - dict(name='h2', attrs={'class':'h2'}), + dict(attrs={'class':['art-img']}), + dict(name='div', attrs={'class':'art-lft'}) ] - remove_tags = [dict(name='div', attrs={'class':[ 'metroCommentFormWrap', - 'commentForm', 'metroCommentInnerWrap', - 'art-rgt','pluck-app pluck-comm','news m12 clrd clr-l p5t', 'flt-r' ]})] - + remove_tags = [dict(name='div', attrs={'class':[ 'news m12 clrd clr-b p5t shareBtm', 'commentForm', 'metroCommentInnerWrap', + 'art-rgt','pluck-app pluck-comm','news m12 clrd clr-l p5t', 'flt-r' ]}), + dict(attrs={'class':[ 'metroCommentFormWrap','commentText','commentsNav','avatar','submDateAndTime']}) + ] feeds = [ (u'News', u'http://www.metro.co.uk/rss/news/'), (u'Money', u'http://www.metro.co.uk/rss/money/'), (u'Sport', u'http://www.metro.co.uk/rss/sport/'), (u'Film', u'http://www.metro.co.uk/rss/metrolife/film/'), (u'Music', u'http://www.metro.co.uk/rss/metrolife/music/'), (u'TV', u'http://www.metro.co.uk/rss/tv/'), (u'Showbiz', u'http://www.metro.co.uk/rss/showbiz/'), (u'Weird News', u'http://www.metro.co.uk/rss/weird/'), (u'Travel', u'http://www.metro.co.uk/rss/travel/'), (u'Lifestyle', u'http://www.metro.co.uk/rss/lifestyle/'), (u'Books', u'http://www.metro.co.uk/rss/lifestyle/books/'), (u'Food', u'http://www.metro.co.uk/rss/lifestyle/restaurants/')] - - From 2704b4ff26afbb863fd70924ea0529863c81812b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 15 Jun 2011 16:51:11 -0600 Subject: [PATCH 14/15] Preselect first result in download metadata dialog --- src/calibre/gui2/metadata/single_download.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/calibre/gui2/metadata/single_download.py b/src/calibre/gui2/metadata/single_download.py index 013ab42684..ff4b9feac8 100644 --- a/src/calibre/gui2/metadata/single_download.py +++ b/src/calibre/gui2/metadata/single_download.py @@ -236,6 +236,11 @@ class ResultsView(QTableView): # {{{ self.resizeRowsToContents() self.resizeColumnsToContents() self.setFocus(Qt.OtherFocusReason) + idx = self.model().index(0, 0) + if idx.isValid() and self.model().rowCount() > 0: + self.show_details(idx) + sm = self.selectionModel() + sm.select(idx, sm.ClearAndSelect|sm.Rows) def currentChanged(self, current, previous): ret = QTableView.currentChanged(self, current, previous) @@ -480,12 +485,6 @@ class IdentifyWidget(QWidget): # {{{ return self.results_view.show_results(self.worker.results) - - self.comments_view.show_data(''' -
Found %d results
-
To see details, click on any result
''' % - len(self.worker.results)) - self.results_found.emit() From d925732543bf8b571fd6ecf9cd964c35a997b330 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 16 Jun 2011 01:13:00 -0600 Subject: [PATCH 15/15] Noticias R7 by Diniz Bortolotto --- recipes/noticias_r7.recipe | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 recipes/noticias_r7.recipe diff --git a/recipes/noticias_r7.recipe b/recipes/noticias_r7.recipe new file mode 100644 index 0000000000..b7495bb77e --- /dev/null +++ b/recipes/noticias_r7.recipe @@ -0,0 +1,40 @@ +import re +from calibre.web.feeds.news import BasicNewsRecipe + +class PortalR7(BasicNewsRecipe): + title = 'Noticias R7' + __author__ = 'Diniz Bortolotto' + description = 'Noticias Portal R7' + oldest_article = 2 + max_articles_per_feed = 20 + encoding = 'utf8' + publisher = 'Rede Record' + category = 'news, Brazil' + language = 'pt_BR' + publication_type = 'newsportal' + use_embedded_content = False + no_stylesheets = True + remove_javascript = True + remove_attributes = ['style'] + + feeds = [ + (u'Brasil', u'http://www.r7.com/data/rss/brasil.xml'), + (u'Economia', u'http://www.r7.com/data/rss/economia.xml'), + (u'Internacional', u'http://www.r7.com/data/rss/internacional.xml'), + (u'Tecnologia e Ci\xeancia', u'http://www.r7.com/data/rss/tecnologiaCiencia.xml') + ] + reverse_article_order = True + + keep_only_tags = [dict(name='div', attrs={'class':'materia'})] + remove_tags = [ + dict(id=['espalhe', 'report-erro']), + dict(name='ul', attrs={'class':'controles'}), + dict(name='ul', attrs={'class':'relacionados'}), + dict(name='div', attrs={'class':'materia_banner'}), + dict(name='div', attrs={'class':'materia_controles'}) + ] + + preprocess_regexps = [ + (re.compile(r'
.*
',re.DOTALL|re.IGNORECASE), + lambda match: '
') + ]