source: products/quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/keywords.py @ 2929

Last change on this file since 2929 was 2929, checked in by mylan, 14 years ago

#233: Make code more readable

  • Property svn:eol-style set to native
File size: 3.4 KB
Line 
1import re, sys, urllib2
2from xml.dom import Node
3
4from zope.interface import implements
5from zope.component import queryAdapter
6from zope.component import queryMultiAdapter
7from Products.Five.browser import BrowserView
8
9from Products.CMFPlone.utils import safe_unicode, getSiteEncoding
10from Products.CMFCore.utils import getToolByName
11
12from interfaces import IValidateSEOKeywordsView
13from quintagroup.seoptimizer import SeoptimizerMessageFactory as _
14from quintagroup.seoptimizer.browser.seo_configlet import ISEOConfigletSchema
15
16class ValidateSEOKeywordsView(BrowserView):
17
18    implements(IValidateSEOKeywordsView)
19
20    def validateKeywords(self):
21        """ see interface """
22        text = self.request.get('text')
23        ts = getToolByName(self.context, 'translation_service')
24        transforms = getToolByName(self.context, 'portal_transforms')
25        portal = getToolByName(self.context, 'portal_url').getPortalObject()
26        isExternal = queryAdapter(portal, ISEOConfigletSchema).external_keywords_test
27        # extract keywords from text
28        enc = getSiteEncoding(self.context)
29        if text.lower().strip():
30            keywords = filter(None, map(lambda x: safe_unicode(x.strip(), enc),
31                                         text.lower().strip().split('\n')))
32        else:
33            return ts.utranslate(domain='quintagroup.seoptimizer',
34                                 msgid=_(u'Keywords list is empty!'),
35                                 context=self.context)
36        # Get html page internally or with external request
37        error_url = ""
38        if isExternal:
39            # Not pass timeout option because:
40            # 1. its value get from the global default timeout settings.
41            # 2. timeout option added in python 2.6 (so acceptable only in plone4+)
42            try:
43                try:
44                    resp = urllib2.urlopen(self.context.absolute_url())
45                    html = resp.read()
46                finally:
47                    if 'resp' in locals().keys():
48                        resp.close()
49            except (urllib2.URLError, urllib2.HTTPError), e:
50                # In case of exceed timeout period or other URL connection errors.
51                info = sys.exc_info()
52                elog = getToolByName(self.context, "error_log")
53                if elog:
54                    error_url = elog.raising(info)
55                html = None
56        else:
57            html = unicode(self.context()).encode(enc)
58
59        # If no html - information about problem with page retrieval should be returned
60        result = []
61        if html is None:
62            sfx = error_url and ", details at %s." % error_url or "."
63            result.append("Problem with page retrieval" + sfx)
64        else:
65            page_text = transforms.convert("html_to_text", html).getData()
66            # check every keyword on appearing in body of html page
67            for keyword in keywords:
68                keyword_on_page = unicode(len(re.findall(u'\\b%s\\b' % keyword, page_text, re.I|re.U)))
69                result.append(' - '.join((keyword, keyword_on_page)))
70
71        return ts.utranslate(domain='quintagroup.seoptimizer',
72                             msgid=_(u'number_keywords',
73                               default=u'Number of keywords at page:\n${result}',
74                               mapping={'result':'\n'.join(result)}),
75                             context=self.context)
Note: See TracBrowser for help on using the repository browser.