## Script (Python) "livescript_reply" ##bind container=container ##bind context=context ##bind namespace= ##bind script=script ##bind subpath=traverse_subpath ##parameters=q,limit=10 ##title=Determine whether to show an id in an edit form from Products.CMFCore.utils import getToolByName from Products.CMFPlone import PloneMessageFactory as _ from Products.CMFPlone.utils import safe_unicode from Products.PythonScripts.standard import url_quote from Products.PythonScripts.standard import url_quote_plus ploneUtils = getToolByName(context, 'plone_utils') pretty_title_or_id = ploneUtils.pretty_title_or_id portalProperties = getToolByName(context, 'portal_properties') siteProperties = getattr(portalProperties, 'site_properties', None) useViewAction = [] if siteProperties is not None: useViewAction = siteProperties.getProperty('typesUseViewActionInListings', []) # SIMPLE CONFIGURATION USE_ICON = True USE_RANKING = False MAX_TITLE = 29 MAX_DESCRIPTION = 93 # generate a result set for the query catalog = context.portal_catalog friendly_types = ploneUtils.getUserFriendlyTypes() def quotestring(s): return '"%s"' % s def quote_bad_chars(s): bad_chars = ["(", ")"] for char in bad_chars: s = s.replace(char, quotestring(char)) return s # for now we just do a full search to prove a point, this is not the # way to do this in the future, we'd use a in-memory probability based # result set. # convert queries to zctextindex # XXX really if it contains + * ? or - # it will not be right since the catalog ignores all non-word # characters equally like # so we don't even attept to make that right. # But we strip these and these so that the catalog does # not interpret them as metachars ##q = re.compile(r'[\*\?\-\+]+').sub(' ', q) for char in '?-+*': q = q.replace(char, ' ') r=q.split() r = " AND ".join(r) r = quote_bad_chars(r)+'*' searchterms = url_quote_plus(r) site_encoding = context.plone_utils.getSiteEncoding() results = catalog(SearchableText=r, portal_type=friendly_types) searchterm_query = '?searchterm=%s'%url_quote_plus(q) RESPONSE = context.REQUEST.RESPONSE RESPONSE.setHeader('Content-Type', 'text/xml;charset=%s' % site_encoding) # replace named entities with their numbered counterparts, in the xml the named ones are not correct # ↓ --> ↓ # … --> … legend_livesearch = _('legend_livesearch', default='LiveSearch ↓') label_no_results_found = _('label_no_results_found', default='No matching results found.') label_advanced_search = _('label_advanced_search', default='Advanced Search…') label_show_all = _('label_show_all', default='Show all…') ts = getToolByName(context, 'translation_service') output = [] def write(s): output.append(safe_unicode(s)) if not results: write('''
''') else: write('''''') return '\n'.join(output).encode(site_encoding)