Changeset 1624 in products for quintagroup.seoptimizer/trunk/quintagroup
- Timestamp:
- Feb 2, 2010 6:11:30 PM (14 years ago)
- Location:
- quintagroup.seoptimizer/trunk/quintagroup/seoptimizer
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/__init__.py
r1463 r1624 8 8 from Products.CMFCore.utils import getToolByName 9 9 10 from quintagroup.seoptimizer.interfaces import I Keywords, IMappingMetaTags10 from quintagroup.seoptimizer.interfaces import IMetaKeywords, IMappingMetaTags 11 11 from quintagroup.seoptimizer.util import SortedDict 12 12 … … 54 54 55 55 for key, accessor in metadata_names.items(): 56 if accessor == ' seo_keywords':57 # Set the additional matching keywords, if any58 adapter = I Keywords(context, None)56 if accessor == 'meta_keywords': 57 # Render all the existing keywords for the current content type 58 adapter = IMetaKeywords(context, None) 59 59 if adapter is not None: 60 keywords = adapter. listKeywords()60 keywords = adapter.getMetaKeywords() 61 61 if keywords: 62 62 result['keywords'] = keywords -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/adapters.py
r1509 r1624 4 4 from Products.CMFCore.utils import getToolByName 5 5 6 from quintagroup.seoptimizer.interfaces import I Keywords, IMappingMetaTags6 from quintagroup.seoptimizer.interfaces import IMetaKeywords, IMappingMetaTags 7 7 from quintagroup.seoptimizer.util import SortedDict 8 8 9 9 10 class AdditionalKeywords(object):11 implements(I Keywords)10 class MetaKeywordsAdapter(object): 11 implements(IMetaKeywords) 12 12 13 13 def __init__(self, context): 14 14 self.context = context 15 15 16 def listKeywords(self):16 def getMetaKeywords(self): 17 17 """ See interface. 18 18 """ 19 request = self.context.REQUEST 20 meta_keywords = '' 21 filtered_keywords = [] 19 22 portal_props = getToolByName(self.context, 'portal_properties') 20 23 seo_props = getToolByName(portal_props, 'seo_properties', None) 21 22 # now set type is not using because of it unordered behaviour23 #original = set(self.context.qSEO_Keywords())24 #additional = set(seo_props.additional_keywords)25 #text = set(self.context.SearchableText().split())26 #keywords = list(additional.intersection(text).union(original))27 28 request = self.context.REQUEST29 24 seo_context = queryMultiAdapter((self.context, request), name='seo_context') 30 25 if seo_context: 31 keywords = list(seo_context.seo_keywords()) 32 lower_keywords = map(lambda x: x.lower(), keywords) 33 additional = seo_props.additional_keywords 26 meta_keywords = list(seo_context.meta_keywords()) 27 is_test = self.context.REQUEST.get('without_metatag_keywords', None) 28 if meta_keywords and is_test is None: 29 # extract words from url page using lynx browser (test page randered without metatag keywords) 30 text = commands.getoutput('lynx --dump --nolist %s?without_metatag_keywords=1' % self.context.absolute_url()).lower() 34 31 35 is_test = self.context.REQUEST.get('qseo_without_additional_keywords', None) 32 # for tests package 33 if text and 'lynx: can\'t access startfile http://nohost/plone/my_doc?without_metatag_keywords=1' in text: 34 text = self.context.getText() 36 35 37 if additional and is_test is None:38 # extract words from url page using lynx browser39 text = commands.getoutput('lynx --dump --nolist %s?qseo_without_additional_keywords=1' % self.context.absolute_url()).lower()40 36 if text and text != 'sh: lynx: command not found': 41 for keyword in additional:42 if keyword.lower() not in lower_keywords and re.compile(r'\b%s\b' % keyword, re.I).search(text):43 keywords.append(keyword)44 return ', '.join(keywords)45 return ' '37 for meta_keyword in meta_keywords: 38 if re.compile(r'\b%s\b' % meta_keyword.lower(), re.I).search(text): 39 filtered_keywords.append(meta_keyword) 40 meta_keywords = filtered_keywords 41 return ', '.join(meta_keywords) 46 42 47 43 -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/keywords.py
r1491 r1624 23 23 return ts.utranslate(None, _(u'Keywords list is empty!'), context=self.context) 24 24 # request html page of context object 25 url = '%s?qseo_without_additional_keywords=1' % self.context.absolute_url() 26 #try: 27 #page = urllib.urlopen(url) 28 #except IOError: 29 #return _('Could not find requested page') 25 url = '%s?without_metatag_keywords=1' % self.context.absolute_url() 30 26 31 #page_html = page.read() 32 #if not page_html: 33 #return _('Page is empty') 34 35 # extract words from body from html page 36 37 # this block work only with valid html 38 #doc = minidom.parseString(page_html) 39 #rootNode = doc.documentElement 40 #bodies = rootNode.getElementsByTagName('body') 41 #if len(bodies) > 0: 42 #body = bodies[0] 43 #else: 44 #return _(u'Invalid page html') 45 #page_words = [] 46 #self.walkTextNodes(body, page_words) 47 48 # this block work even with invalid html 49 #pattern = re.compile('<\s*body[^>]*>(.*?)<\s*/\s*body\s*>', re.S|re.M|re.I) 50 #search = pattern.search(page_html) 51 #if search: 52 #body_html = search.group(1) 53 #else: 54 #return _('Invalid html code on page') 55 56 #page_text = self.strip_tags(body_html) 57 #page_words = page_text.lower().split() 58 59 # extract words from url page using lynx browser 27 # extract words from url page using lynx browser (test page by 'url' randered without metatag keywords) 60 28 page_text = commands.getoutput('lynx --dump --nolist %s' % url).lower() 61 29 if page_text and page_text != 'sh: lynx: command not found': 62 #page_words = page_text.lower().split()63 30 page_text = page_text.decode('utf8') 64 31 else: -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/templates/seo_context_properties.pt
r1556 r1624 51 51 Item Properties 52 52 </legend> 53 53 54 54 <div class="field"> 55 55 <label i18n:translate="label_page_title_tag" for="seo_title"> … … 99 99 Override 100 100 </label> 101 101 <br /> 102 102 <textarea type="text" 103 103 id="seo_description" … … 131 131 Override 132 132 </label> 133 133 <br /> 134 134 <textarea id="seo_keywords" 135 135 name="seo_keywords:lines" … … 189 189 Override 190 190 </label> 191 191 <br /> 192 192 <input type="text" 193 193 id="seo_robots" … … 218 218 Override 219 219 </label> 220 220 <br /> 221 221 <input type="text" 222 222 id="seo_distribution" … … 250 250 Override 251 251 </label> 252 252 <br /> 253 253 <div tal:content="error">Validation error output</div> 254 254 <input type="text" … … 282 282 Override 283 283 </label> 284 284 <br /> 285 285 <table class="custom-metatags-table" 286 286 id="datagridwidget-table-seo_custommetatags" -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/browser/views.py
r1607 r1624 141 141 return html_comment and html_comment or '' 142 142 143 def seo_keywords( self ): 144 """ Generate Keywords from SEO properties. 143 def meta_keywords( self ): 144 """ Generate Meta Keywords from SEO properties (global and local) with Subject, 145 depending on the options in configlet. 145 146 """ 146 147 prop_name = 'qSEO_keywords' … … 190 191 return keywords 191 192 193 def seo_keywords( self ): 194 """ Generate SEO Keywords from SEO properties (global merde local). 195 """ 196 prop_name = 'qSEO_keywords' 197 context = aq_inner(self.context) 198 keywords = Set([]) 199 pprops = getToolByName(context, 'portal_properties') 200 sheet = getattr(pprops, 'seo_properties', None) 201 202 if sheet: 203 settings_use_keywords_sg = sheet.getProperty('settings_use_keywords_sg') 204 settings_use_keywords_lg = sheet.getProperty('settings_use_keywords_lg') 205 global_keywords = Set(sheet.getProperty('additional_keywords', None)) 206 local_keywords = Set(context.getProperty(prop_name, None)) 207 keywords = global_keywords | local_keywords 208 else: 209 keywords = '' 210 211 return keywords 212 192 213 def seo_canonical( self ): 193 214 """ Generate canonical URL from SEO properties. -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/configure.zcml
r1570 r1624 46 46 <adapter 47 47 for="Products.Archetypes.public.BaseObject" 48 provides=".interfaces.I Keywords"49 factory=".adapters. AdditionalKeywords"48 provides=".interfaces.IMetaKeywords" 49 factory=".adapters.MetaKeywordsAdapter" 50 50 /> 51 51 -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/interfaces.py
r1313 r1624 1 1 from zope.interface import Interface 2 2 3 class I Keywords(Interface):3 class IMetaKeywords(Interface): 4 4 """Handle the available keywords. 5 5 """ 6 def listKeywords():6 def getMetaKeywords(): 7 7 """Returns all the existing keywords for the current content type. 8 8 """ -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/profiles/default/propertiestool.xml
r1580 r1624 83 83 <element value="DC.distribution seo_distribution"/> 84 84 <element value="description seo_description"/> 85 <element value="keywords seo_keywords"/>85 <element value="keywords meta_keywords"/> 86 86 <element value="robots seo_robots"/> 87 87 <element value="distribution seo_distribution"/> -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/tests/testQSEOptimizerAdditionalKeywords.py
r1608 r1624 49 49 50 50 def test_listMetaTags_one(self): 51 self.my_doc.setText('<p>foo</p>') 51 52 self.sp.manage_changeProperties(settings_use_keywords_sg=3, settings_use_keywords_lg=2) 52 53 self.my_doc.manage_addProperty('qSEO_keywords', ('foo',), 'lines') … … 56 57 57 58 def test_listMetaTags_two(self): 59 self.my_doc.setText('<p>foo bar</p>') 58 60 self.sp.manage_changeProperties(settings_use_keywords_sg=3, settings_use_keywords_lg=2) 59 61 self.my_doc.manage_addProperty('qSEO_keywords', ('foo', 'bar'), 'lines') … … 70 72 71 73 def test_additional_keywords_in_listMetaTags_one(self): 74 self.my_doc.setText('<p>foo</p>') 72 75 self.sp.manage_changeProperties(settings_use_keywords_sg=3, settings_use_keywords_lg=2) 73 #self.my_doc.setText('<p>foo</p>') # XXX74 76 self.sp.additional_keywords = ('foo',) 75 77 self.html = str(self.publish(self.portal.id+'/my_doc', self.basic_auth)) … … 78 80 79 81 def test_additional_keywords_in_listMetaTags_two(self): 82 self.my_doc.setText('<p>foo bar</p>') 80 83 self.sp.manage_changeProperties(settings_use_keywords_sg=3, settings_use_keywords_lg=2) 81 #self.my_doc.setText('<p>foo bar</p>') # XXX82 84 self.sp.additional_keywords = ('foo', 'bar') 83 85 self.html = str(self.publish(self.portal.id+'/my_doc', self.basic_auth)) … … 87 89 88 90 def setup_testing_render_keywords(self): 91 self.my_doc.setText('<p>global local subject</p>') 89 92 self.sp.additional_keywords = (('global',)) 90 93 self.my_doc.manage_addProperty('qSEO_keywords', ('local'), 'lines') -
quintagroup.seoptimizer/trunk/quintagroup/seoptimizer/tests/testQSEOptimizerResponse.py
r1609 r1624 27 27 self.sp.manage_changeProperties(settings_use_keywords_sg=3, settings_use_keywords_lg=2) 28 28 abs_path = "/%s" % my_doc.absolute_url(1) 29 self.form_data = {'seo_description': 'it is description ', 'seo_keywords_override:int': 1, 'seo_custommetatags_override:int': 1,29 self.form_data = {'seo_description': 'it is description, test keyword1', 'seo_keywords_override:int': 1, 'seo_custommetatags_override:int': 1, 30 30 'seo_robots_override:int': 1, 'seo_robots': 'ALL', 'seo_description_override:int': 1, 'seo_canonical_override:int': 1, 31 31 'seo_keywords:list': 'keyword1', 'seo_html_comment': 'no comments', … … 65 65 66 66 def testDescription(self): 67 m = re.match('.*(<meta\s+(?:(?:name="description"\s*)|(?:content="it is description "\s*)){2}/>)', self.html, re.S|re.M)67 m = re.match('.*(<meta\s+(?:(?:name="description"\s*)|(?:content="it is description, test keyword1"\s*)){2}/>)', self.html, re.S|re.M) 68 68 self.assert_(m, 'Description not set in') 69 69 … … 88 88 metatags_order = [t.split(' ')[0] for t in mtop if len(t.split(' '))==2 and t.split(' ')[0] in VIEW_METATAGS] 89 89 m = re.search('.*'.join(['<meta.*name="%s".*/>' %t for t in metatags_order]), self.html, re.S|re.M) 90 #m = re.match('.*'.join(['.*(<meta\s+(?:(?:name="%s"\s*)|(?:content=".*"\s*)){2}/>)' %t for t in metatags_order]), self.html, re.S|re.M) 90 91 self.assert_(m, "Meta tags order not supported.") 91 92
Note: See TracChangeset
for help on using the changeset viewer.