コード例 #1
0
ファイル: negotiator.py プロジェクト: pombredanne/trachacks
    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
コード例 #2
0
ファイル: negotiator.py プロジェクト: nyuhuhuu/trachacks
    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
コード例 #3
0
    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
            ]))
コード例 #4
0
ファイル: main.py プロジェクト: nyuhuhuu/trachacks
 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")
コード例 #5
0
    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]))
コード例 #6
0
ファイル: main.py プロジェクト: pombredanne/trachacks
 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")
コード例 #7
0
ファイル: wiki_search.py プロジェクト: tsanov/bloodhound
 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)
コード例 #8
0
ファイル: macros.py プロジェクト: pombredanne/trachacks
 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)
コード例 #9
0
ファイル: macros.py プロジェクト: pombredanne/trachacks
        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)
コード例 #10
0
ファイル: negotiator.py プロジェクト: pombredanne/trachacks
 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
コード例 #11
0
    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
コード例 #12
0
ファイル: rst.py プロジェクト: omunroe-com/tracdebdev
 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
コード例 #13
0
 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
コード例 #14
0
 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)
コード例 #15
0
ファイル: doxygentrac.py プロジェクト: pombredanne/trachacks
    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)