source: products/quintagroup.seoptimizer/branches/refactoring2.3.0/quintagroup/seoptimizer/browser/keywords.py @ 1852

Last change on this file since 1852 was 1852, checked in by liebster, 14 years ago

Fix translate infomessage in seo-context-properties when used Check Keywords

  • Property svn:eol-style set to native
File size: 3.4 KB
Line 
1import urllib, re, os, commands
2from xml.dom import minidom, Node
3
4from zope.interface import implements
5from Products.Five.browser import BrowserView
6
7from Products.CMFCore.utils import getToolByName
8
9from interfaces import IValidateSEOKeywordsView
10from quintagroup.seoptimizer import SeoptimizerMessageFactory as _
11
12class ValidateSEOKeywordsView(BrowserView):
13
14    implements(IValidateSEOKeywordsView)
15
16    def validateKeywords(self, text):
17        """ see interface """
18        ts = getToolByName(self.context, 'translation_service')
19        # extract keywords from text
20        if text.lower().strip():
21            keywords = map(lambda x: x.strip(), text.lower().strip().split('\n'))
22        else:
23            return ts.utranslate(domain='quintagroup.seoptimizer', msgid=_(u'Keywords list is empty!'), context=self.context)
24        # request html page of context object
25        url = '%s?without_metatag_keywords=1' % self.context.absolute_url()
26
27        # extract words from url page using lynx browser (test page by 'url' randered without metatag keywords)
28        page_text = commands.getoutput('lynx --dump --nolist %s' % url).lower()
29        if page_text and page_text != 'sh: lynx: command not found':
30            page_text = page_text.decode('utf8')
31        else:
32            return ts.utranslate(domain='quintagroup.seoptimizer', msgid=_(u'Could not find lynx browser!'), context=self.context)
33
34        # check every keyword on appearing in body of html page
35        missing = []
36        finding = []
37        added = {}
38        finded = {}
39        for keyword in keywords:
40            keyword = keyword.decode('utf8')
41            if keyword:
42                keyword_on_page =  len(re.findall(u'\\b%s\\b' % keyword, page_text, re.I|re.U))
43                if keyword not in added.keys() and not keyword_on_page:
44                    missing.append(keyword+u' - 0')
45                    added[keyword] = 1
46                if keyword not in finded.keys() and keyword_on_page:
47                    finding.append(keyword+u' - '+repr(keyword_on_page))
48                    finded[keyword] = 1
49        # return list of missing and fount keywords
50        if missing or finding:
51            msg = ts.utranslate(domain='quintagroup.seoptimizer', msgid=_(u'number_keywords',
52                                default=u'Number of keywords at page:\n${found}\n${missing}',
53                                mapping={'missing':'\n'.join(missing), 'found': '\n'.join(finding)}),
54                                context=self.context)
55        else:
56            msg = ''
57        return msg
58
59    def walkTextNodes(self, parent, page_words=[]):
60        for node in parent.childNodes:
61            if node.nodeType == Node.ELEMENT_NODE:
62                self.walkTextNodes(node, page_words)
63            elif node.nodeType == Node.TEXT_NODE:
64                value = node.nodeValue
65                if value is not None:
66                    page_words.extend(map(lambda x: x.lower(), value.split()))
67
68    def strip_tags(self, in_text):
69        s_list = list(in_text)
70        i,j = 0,0
71
72        while i < len(s_list):
73            if s_list[i] == '<':
74                while s_list[i] != '>':
75                    # pop everything from the the left-angle bracket until the right-angle bracket
76                    s_list.pop(i)
77
78                # pops the right-angle bracket, too
79                s_list.pop(i)
80            else:
81                i=i+1
82
83        # convert the list back into text
84        join_char=''
85        return join_char.join(s_list)
Note: See TracBrowser for help on using the repository browser.