def _decide_page(self, req): """decide page name to use regarding client language. This function is called from hook with self as WikiModule instance. Returns page name to be displayed. """ orig = req.args.get('page', 'WikiStart') # This negotiation is only for viewing. # If without this rule, you may edit 'SomePage.en' by edit # button on 'SomePage.' page. if req.args.get('action', None): return orig # Get language from session to keep selected language if possible. lang = req.session.get('wiki_lang', None) # Use requested page itself if the page name has language # suffix. As special case, if the name ends with period '.', # use non-suffixed page is used. # This action means user choose the language. if orig.endswith('.'): req.session['wiki_lang'] = 'default' return orig[:-1] # force un suffixed page page, lang = util.split_lang(orig) if lang: #debug('case 1 : requested page name has lang suffix') req.session['wiki_lang'] = lang return orig page = page or 'WikiStart' # At this point, page name does not have language suffix. # List preffered language codes from http request. # Check language suffixed page existance in order of preffered # language codes in http request and use it if exist. wiki = WikiSystem(self.env) for lang in util.get_preferred_langs(req): if lang in ['default', 'other']: lpage = page else: lpage = '%s.%s' % (page, lang) if wiki.has_page(lpage): #debug('case 2 : have suffixed page: %s' % lpage) return lpage # Consideration of default_lang setting. # This is required not access to lower ordered # language page. For example, # preferred language: ja, en, fr # default_lang: en # existing pages: 'page', 'page.fr' # We should search page in order: # 'page.ja', 'page.en', 'page', 'page.fr' if lang == self._default_lang and wiki.has_page(page): return page # No page matched with preffered language. # Use requested page. #debug('case 3 : no page for preffered lang') return orig
def render_macro(self, req, name, content): search = prefix = limit = skips = None if not content: return html.H2('Need to specify a search') if content: argv = [arg.strip() for arg in content.split(',')] if len(argv) < 1: return html.H2('Need to specify a search') search = argv[0] if len(argv) > 1: prefix = argv[1] if len(argv) > 2: limit = argv[2] if len(argv) > 3: skips = argv[3] db = self.env.get_db_cnx() cursor = db.cursor() sql = 'SELECT name, max_version FROM (' \ 'SELECT name as name, text as text, ' \ ' max(version) AS max_version, ' \ ' max(time) AS max_time ' \ 'FROM wiki ' args = [] if prefix: sql += 'WHERE name LIKE %s' args.append(prefix + '%') if skips: if prefix: sql += ' AND ' sql += 'name != %s' args.append(skips) sql += ' GROUP BY name ORDER BY max_time ASC' if limit: sql += ' LIMIT %s' args.append(limit) sql += ') AS temptable WHERE text LIKE %s' args.append('%' + search + '%') cursor.execute(sql, args) wiki = WikiSystem(self.env) return html.DIV( html.UL([ html.LI( html.A(wiki.format_page_name(name), href=req.href.wiki(name))) for name, version in cursor ]))
def _format_term(self, formatter, ns, target, label): wiki = WikiSystem(self.env) page = self._wiki_prefix + target href = formatter.href.wiki(page) link_label = label if wiki.has_page(page): if not link_label: link_label = self._term_desc(target) return html.A(wiki.format_page_name(link_label), href=href) else: if not link_label: link_label = self._term_ns + ":" + target return html.A(wiki.format_page_name(link_label) + "?", href=href, class_="missing wiki", rel="nofollow")
def render_macro(self, req, name, content): search = prefix = limit = skips = None if not content: return html.H2('Need to specify a search') if content: argv = [arg.strip() for arg in content.split(',')] if len(argv) < 1: return html.H2('Need to specify a search') search = argv[0] if len(argv) > 1: prefix = argv[1] if len(argv) > 2: limit = argv[2] if len(argv) > 3: skips = argv[3] db = self.env.get_db_cnx() cursor = db.cursor() sql = 'SELECT name, max_version FROM (' \ 'SELECT name as name, text as text, ' \ ' max(version) AS max_version, ' \ ' max(time) AS max_time ' \ 'FROM wiki ' args = [] if prefix: sql += 'WHERE name LIKE %s' args.append(prefix + '%') if skips: if prefix: sql += ' AND '; sql += 'name != %s' args.append(skips) sql += ' GROUP BY name ORDER BY max_time ASC' if limit: sql += ' LIMIT %s' args.append(limit) sql += ') WHERE text LIKE %s' args.append('%' + search + '%') print sql print args cursor.execute(sql, args) wiki = WikiSystem(self.env) return html.DIV( html.UL([html.LI( html.A(wiki.format_page_name(name), href=req.href.wiki(name))) for name, version in cursor]))
def setUp(self): super(WikiIndexerEventsTestCase, self).setUp() self.wiki_system = WikiSystem(self.env) self.whoosh_backend = WhooshBackend(self.env) self.whoosh_backend.recreate_index() self.search_api = BloodhoundSearchApi(self.env) self.wiki_participant = WikiSearchParticipant(self.env) self.query_parser = DefaultQueryParser(self.env)
def get_page_text(self, *args): """Return a tuple of `(text, exists)` for the given page (resource). The page is altered if lang suffix is not exist in page name like wiki page negotiation. """ # Since TracTOC macro r4366, 'formatter' argument is added # as 2nd argument. if len(args) == 1: # old code formatter = self.formatter page_resource = args[0] else: formatter, page_resource = args if page_resource.id == formatter.context.resource.id: return (formatter.source, True) else: req = formatter.context(page_resource).req nego = wikinegotiator.negotiator.WikiNegotiator(self.env) # know lang of parent page where this macro is on. parent = req.args.get('page', 'WikiStart') bname, blang = util.split_lang(parent, 'default') # get body name and lang from given page name. name, lang = util.split_lang(page_resource.id) wiki = WikiSystem(self.env) if lang is None: # When no lang suffix is in given page name, # find localized page for lang of parent page, # then preferred language. langs = [blang] + util.get_preferred_langs(req) for lang in langs: dname = util.make_page_name(name, lang) if wiki.has_page(dname): name = dname break # from for else: # with suffix, exact page is used name = page_resource.id page = WikiPage(self.env, name) # update resource id to highlight current page. page_resource.id = name return (page.text, page.exists)
def expand_macro(self, formatter, name, args): """Expand wildcard page spec to non-suffixed page names. """ args, kw = util.parse_args(args) wiki = WikiSystem(self.env) newargs = [] for arg in args: newargs.append(arg) arg = arg.strip() if arg.endswith('*'): newargs.pop() # expand wildcard as indivisual pages with removing # suffixed pages. prefix = arg[:-1] pages = [] for page in wiki.get_pages(prefix): name, lang = util.split_lang(page) if name not in pages: pages.append(name) newargs += pages # reconstruct 'args' argument and call ancestor args = ','.join(newargs + ['%s=%s' % pair for pair in kw.items()]) return BaseTOCMacro.expand_macro(self, formatter, name, args)
def _get_available_langs(self): """Get language suffixes from existing wiki pages. Not that this list does not contains 'default' pseudo lang. This function also cache page names for later existing check. """ langs = getattr(self, 'available_langs', None) pages = [] if langs is None: # list up langs from existing pages. pages = list(WikiSystem(self.env).get_pages()) langs = util.make_lang_list(pages) # remove invalid suffixes langs = [x for x in langs if x not in self._invalid_suffixes] self.available_langs = langs # cache self.available_pages = pages # cache return list(langs) # return copied list
def build_doc(self, trac_doc): page = trac_doc #This is very naive prototype implementation #TODO: a lot of improvements must be added here!!! searchable_name = page.name + ' ' + \ WikiSystem(self.env).format_page_name(page.name, split=True) doc = { IndexFields.ID: page.name, IndexFields.NAME: searchable_name, '_stored_' + IndexFields.NAME: page.name, IndexFields.TYPE: WIKI_TYPE, IndexFields.TIME: page.time, IndexFields.AUTHOR: page.author, IndexFields.CONTENT: self.wiki_formatter.format(page.text), IndexFields.PRODUCT: get_product(self.env).prefix, } return doc
def trac_get_reference(rawtext, link, text): for (pattern, function) in LINKS: m = pattern.match(link) if m: g = filter(None, m.groups()) missing = 0 if not text: text = g[0] if pattern == WIKI_LINK: pagename = re.search(r'^[^\#]+', g[0]) if not WikiSystem(self.env).has_page(pagename.group()): missing = 1 text = text + "?" uri = function(self.env.href, g) reference = nodes.reference(rawtext, text) reference['refuri'] = uri if missing: reference.set_class('missing') return reference return None
def trac_get_reference(rawtext, target, text): fulltext = text and target + ' ' + text or target link = wiki_to_link(fulltext, self.env, req) uri = None missing = False if isinstance(link, Element): linktext = Markup(link).striptags() # the following is a bit hackish, but it takes into account: # - an eventual trailing '?' for missing wiki pages # - space eventually introduced due to split_page_names option if linktext.rstrip('?').replace(' ', '') != target: text = linktext uri = link.attr.get('href', '') missing = 'missing' in link.attr.get('class_', '') else: uri = req.href.wiki(target) missing = not WikiSystem(self.env).has_page(target) if uri: reference = nodes.reference(rawtext, text or target) reference['refuri'] = uri if missing: reference.set_class('missing') return reference return None
def get_entries_for_index(self): page_names = WikiSystem(self.env).get_pages() for page_name in page_names: page = WikiPage(self.env, page_name) yield self.build_doc(page)
def process_request(self, req): req.perm.assert_permission('DOXYGEN_VIEW') # Get request arguments path = req.args.get('path') action = req.args.get('action') link = req.args.get('link') self.log.debug('Performing %s(%s,%s)"' % (action or 'default', path, link)) # Redirect search requests. if action == 'search': req.redirect(req.href.search(q=req.args.get('query'), doxygen='on')) if action == 'redirect': if link: # we need to really redirect if there is a link if path: req.redirect(req.href.doxygen(path=path) + link) else: req.redirect(req.href.doxygen(link)) else: self.log.warn("redirect without link") if req.path_info == '/doxygen': req.redirect(req.href.doxygen('/')) # Handle /doxygen request if action == 'index': wiki = self.wiki_index if wiki: if WikiSystem(self.env).has_page(wiki): text = WikiPage(self.env, wiki).text else: text = 'Doxygen index page [wiki:%s] does not exist.' % \ wiki text = wiki_to_html(text, self.env, req) req.hdf['doxygen.text'] = text req.hdf['doxygen.wiki_href'] = req.href.wiki(wiki) req.hdf['doxygen.wiki_page'] = wiki return 'doxygen.cs', 'text/html' # use configured Doxygen index path = os.path.join(self.base_path, self.default_doc, self.html_output, self.index) self.log.debug('path: %s' % (path, )) # security check path = os.path.abspath(path) if not path.startswith(self.base_path): raise TracError("Can't access paths outside of " + self.base_path) # view mimetype = mimetypes.guess_type(path)[0] if mimetype == 'text/html': add_stylesheet(req, 'doxygen/css/doxygen.css') req.hdf['doxygen.path'] = path return 'doxygen.cs', 'text/html' else: req.send_file(path, mimetype)