def fget(self): if EvernoteApiWrapper.is_evernote_url(self._href): if self._ref_item is None: self._ref_item = self._adaptor.wp_item_from_note(self._href) return self._ref_item else: return self._href
def _find_ref_items(self): for a_tag in self._content_node.findall('.//a'): href = a_tag.get('href', '') if EvernoteApiWrapper.is_evernote_url(href): # Add a late-loading function in case this will never be needed def load_item(link): return lambda: self._adaptor.wp_item_from_note(link) self._wp_item._ref_wp_items[href] = load_item(href)
def setUp(self, mock_logging, mock_init_wp_client, mock_init_en_client): super(TestEvernoteDetach, self).setUp() wordpress_evernote.logger = self.wp_en_logger = MagicMock() self.evernote = EvernoteApiWrapper(token='123') self.evernote.get_note = MagicMock(side_effect=mocked_get_note) self.evernote.updateNote = MagicMock() self.wordpress = WordPressApiWrapper('xmlrpc.php', 'user', 'password') self.adaptor = EvernoteWordpressAdaptor(self.evernote, self.wordpress)
def render_line_element(e, line_so_far): tag = e.tag.lower() if 'a' == tag: href = e.get('href', '') text = e.text if EvernoteApiWrapper.is_evernote_url(href): ref_item = self._adaptor.wp_item_from_note(href) return ref_item.markdown_ref(text) else: return href elif 'span' == tag: return e.text elif 'en-todo' == tag: return '❑' elif 'en-media' == tag: logger.warn('Unexpected en-media element in content: %s', ET.tostring(e)) return '' else: raise NoteParserError('Invalid tag "%s" in content paragraph' % (ET.tostring(e)))
def wp_item_from_note(self, note_link): """Factory builder of WordPressItem from Evernote note. :param note_link: Evernote note link string for note to create. """ if isinstance(note_link, basestring): guid = EvernoteApiWrapper.get_note_guid(note_link) else: note = note_link guid = note.guid # return parsed note from cache, if cached if guid in self.cache: return self.cache[guid] # not cached - parse and cache result if isinstance(note_link, basestring): note = self.evernote.get_note(guid) wp_item = WordPressItem() wp_item._underlying_en_note = note self.cache[guid] = wp_item item_dom = self._parse_note_xml(note.content) # Copy metadata fields to wp_item internal fields # Convert from Evernote attribute name to internal name if needed name_mappings = { 'type': 'post_type', 'hemingwayapp-grade': 'hemingway_grade', } for metadata in item_dom.findall(".//div[@id='metadata']/p"): if metadata.text is None: continue if metadata.text.startswith('#'): continue pos = metadata.text.find('=') attr_name = metadata.text[:pos] attr_name = name_mappings.get(attr_name, attr_name) metadata.text = metadata.text[pos+1:] wp_item.set_wp_attribute(attr_name, WpEnAttribute.create(self, attr_name, metadata, wp_item)) # Determine post type and continue initialization accordingly if wp_item.post_type in ('post', 'page'): # Initialize as WordPress post, and set content wp_item.__class__ = WordPressPost wp_item.set_wp_attribute( 'content', WpEnContent(item_dom.find(".//div[@id='content']"), wp_item, self)) else: # Initialize as WordPress image attachment, and fetch image wp_item.__class__ = WordPressImageAttachment wp_item._filename = note.title if not note.resources or 0 == len(note.resources): raise NoteParserError('Note (%s) has no attached resources' % (note.title)) resource = note.resources[0] if 1 < len(note.resources): logger.warning('Note has too many attached resources (%d). ' 'Choosing the first one, arbitrarily.', len(note.resources)) def fetch_bits(guid, name): def fetch(): logger.debug('Fetching image %s', name) return self.evernote.get_resource_data(guid) return fetch wp_item._get_image_data = fetch_bits(resource.guid, note.title) wp_item._image_mime = resource.mime return wp_item
def setUp(self, mock_init_en_client): wordpress.logger = Mock() wordpress_evernote.logger = Mock() self.evernote = EvernoteApiWrapper(token='123') self.evernote.get_note = MagicMock(side_effect=mocked_get_note) self.adaptor = EvernoteWordpressAdaptor(self.evernote, None)