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

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

Fixed using utranslation in scripts

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