plugins xep-0277: some methods reordering to make the plugin more readable

This commit is contained in:
Goffi 2015-04-23 10:25:47 +02:00
commit 899c503255

View file

@ -75,25 +75,27 @@ class XEP_0277(object):
async=True,
doc={})
def parseCommentUrl(self, node_url):
"""Determine the fields comments_service and comments_node of a microblog data
from the href attribute of an entry's link element. For example this input:
xmpp:sat-pubsub.libervia.org?node=urn%3Axmpp%3Acomments%3A_c5c4a142-2279-4b2a-ba4c-1bc33aa87634__urn%3Axmpp%3Agroupblog%3Asouliane%40libervia.org
will return (JID(u'sat-pubsub.libervia.org'), 'urn:xmpp:comments:_c5c4a142-2279-4b2a-ba4c-1bc33aa87634__urn:xmpp:groupblog:souliane@libervia.org')
@return: a tuple (JID, str)
"""
parsed_url = urlparse.urlparse(node_url, 'xmpp')
service = jid.JID(parsed_url.path)
queries = parsed_url.query.split(';')
parsed_queries = dict()
for query in queries:
parsed_queries.update(urlparse.parse_qs(query))
node = parsed_queries.get('node', [''])[0]
## plugin management methods ##
if not node:
raise exceptions.DataError('Invalid comments link')
def microblogCB(self, itemsEvent, profile):
"""Callback to "MICROBLOG" PEP event."""
def manageItem(microblog_data):
self.host.bridge.personalEvent(itemsEvent.sender.full(), "MICROBLOG", microblog_data, profile)
return (service, node)
for item in itemsEvent.items:
self.item2mbdata(item).addCallbacks(manageItem, lambda failure: None)
## data/item transformation ##
def _getDomishInnerContent(self, elt):
"""Return the inner content of a domish.Element."""
result = ''
for child in elt.children:
try:
result += child.toXml() # child id a domish.Element
except AttributeError:
result += child # child is unicode
return result
def _removeXHTMLMarkups(self, xhtml):
"""Remove XHTML markups from the given string.
@ -109,8 +111,10 @@ class XEP_0277(object):
@defer.inlineCallbacks
def item2mbdata(self, item):
"""Convert an XML Item to microblog data used in bridge API
@param item: domish.Element of microblog item
@return: microblog data (dictionary)"""
@return: microblog data (dictionary)
"""
def xpath(elt, path):
"""Return the XPATH result of an entry element or its descendance."""
@ -142,12 +146,23 @@ class XEP_0277(object):
for key in ['title', 'content']: # process the textual elements
for attr_elt in xpath(entry_elt, key):
attr_content = self._getLXMLInnerContent(attr_elt)
# Return the inner content of a lxml.etree.Element. It is not
# trivial because the lxml tostring method would return the full
# content including elt's tag and attributes, and elt.getchildren()
# would skip a text value which is not within an element...
attr_content = self._getDomishInnerContent(ElementParser()(etree.tostring(attr_elt)))
if not attr_content.strip():
continue # element with empty value
content_type = attr_elt.get('type', 'text').lower()
if content_type == 'xhtml':
text = self._decapsulateExtraNS(attr_content)
# Check for XHTML namespace and decapsulate the content so the user
# who wants to modify an entry will see the text that he entered. Also
# this avoids successive encapsulation with a new <div>...</div> at
# each modification (encapsulation is done in self.data2entry)
elt = ElementParser()(attr_content)
if elt.uri != NS_XHTML:
raise exceptions.DataError(_('Content of type XHTML must declare its namespace!'))
text = self._getDomishInnerContent(elt)
microblog_data['%s_xhtml' % key] = yield self.host.plugins["TEXT-SYNTAXES"].clean_xhtml(text)
else:
microblog_data[key] = attr_content
@ -198,41 +213,6 @@ class XEP_0277(object):
defer.returnValue(microblog_data)
def _getLXMLInnerContent(self, elt):
"""Return the inner content of a lxml.etree.Element. It is not
trivial because the lxml tostring method would return the full
content including elt's tag and attributes, and elt.getchildren()
would skip a text value which is not within an element..."""
return self._getDomishInnerContent(ElementParser()(etree.tostring(elt)))
def _getDomishInnerContent(self, elt):
"""Return the inner content of a domish.Element."""
result = ''
for child in elt.children:
try:
result += child.toXml() # child id a domish.Element
except AttributeError:
result += child # child is unicode
return result
def _decapsulateExtraNS(self, text):
"""Check for XHTML namespace and decapsulate the content so the user
who wants to modify an entry will see the text that he entered. Also
this avoids successive encapsulation with a new <div>...</div> at
each modification (encapsulation is done in self.data2entry)"""
elt = ElementParser()(text)
if elt.uri != NS_XHTML:
raise exceptions.DataError(_('Content of type XHTML must declare its namespace!'))
return self._getDomishInnerContent(elt)
def microblogCB(self, itemsEvent, profile):
"""Callback to "MICROBLOG" PEP event."""
def manageItem(microblog_data):
self.host.bridge.personalEvent(itemsEvent.sender.full(), "MICROBLOG", microblog_data, profile)
for item in itemsEvent.items:
self.item2mbdata(item).addCallbacks(manageItem, lambda failure: None)
@defer.inlineCallbacks
def data2entry(self, data, profile):
"""Convert a data dict to en entry usable to create an item
@ -297,6 +277,8 @@ class XEP_0277(object):
item = pubsub.Item(id=entry_id, payload=_entry_elt)
defer.returnValue(item)
## publish ##
@defer.inlineCallbacks
def sendMicroblog(self, data, profile):
"""Send XEP-0277's microblog data
@ -314,6 +296,8 @@ class XEP_0277(object):
ret = yield self.host.plugins["XEP-0060"].publish(None, NS_MICROBLOG, [item], profile_key=profile)
defer.returnValue(ret)
## get ##
def getLastMicroblogs(self, pub_jid, max_items=10, profile_key=C.PROF_KEY_NONE):
"""Get the last published microblogs
@ -328,6 +312,28 @@ class XEP_0277(object):
d.addCallback(lambda res: ([value for (success, value) in res[0] if success], res[1]))
return d
def parseCommentUrl(self, node_url):
"""Determine the fields comments_service and comments_node of a microblog data
from the href attribute of an entry's link element. For example this input:
xmpp:sat-pubsub.libervia.org?node=urn%3Axmpp%3Acomments%3A_c5c4a142-2279-4b2a-ba4c-1bc33aa87634__urn%3Axmpp%3Agroupblog%3Asouliane%40libervia.org
will return (JID(u'sat-pubsub.libervia.org'), 'urn:xmpp:comments:_c5c4a142-2279-4b2a-ba4c-1bc33aa87634__urn:xmpp:groupblog:souliane@libervia.org')
@return: a tuple (JID, str)
"""
parsed_url = urlparse.urlparse(node_url, 'xmpp')
service = jid.JID(parsed_url.path)
queries = parsed_url.query.split(';')
parsed_queries = dict()
for query in queries:
parsed_queries.update(urlparse.parse_qs(query))
node = parsed_queries.get('node', [''])[0]
if not node:
raise exceptions.DataError('Invalid comments link')
return (service, node)
## configure ##
def setMicroblogAccess(self, access="presence", profile_key=C.PROF_KEY_NONE):
"""Create a microblog node on PEP with given access