class extendedcamelcase(Component): implements(IWikiSyntaxProvider) def __init__(self): self.wikisys = WikiSystem(self.env) # IWikiSyntaxProvider methods def get_wiki_syntax(self): # copied and modified from trac/wiki/api.py from trac.wiki.formatter import Formatter def wikipagename_link(formatter, match, fullmatch): return self._format_link(formatter, 'wiki', match, match) yield (r"(?P<name>\b([A-Z]+[a-z0-9]*)+[A-Z]+[a-z0-9]+\b)" , wikipagename_link) def get_link_resolvers(self): return [] def _format_link(self, formatter, ns, page, label): # copied and modified from trac/wiki/api.py page, query, fragment = formatter.split_link(page) link = False if self.wikisys.has_page(page): link = True elif page[-1] == 's' and self.wikisys.has_page(page[:-1]): # if the page name ends in 's', see if there is a wiki page with the same name minus the 's' # if there is, it will be linked page = page[:-1] link = True href = formatter.href.wiki(page)+fragment if link: return html.A(label, href=href, class_='wiki') else: return html.A(label+'?', href=href, class_='missing wiki', rel='nofollow')
def expand_macro(self, formatter, name, args): curpage = formatter.resource.id # scoped TOC (e.g. TranslateRu/Guide or 0.X/Guide ...) prefix = '' guideprefix = GUIDE_NAME + '/' data = { 'guide': GUIDE_NAME, } idx = curpage.find('/') if idx > 0: prefix = curpage[:idx + 1] if prefix.endswith(guideprefix): prefix = prefix[:len(prefix) - len(guideprefix)] ws = WikiSystem(self.env) return tag.div( tag.h4(_('Table of Contents')), tag.ul([ tag.li(tag.a(title, href=formatter.href.wiki(prefix + ref % data), class_=(not ws.has_page(prefix + ref % data) and 'missing')), class_=(prefix + ref % data == curpage and 'active')) for ref, title in self.TOC ]), class_='wiki-toc')
def load_conf(self): self.styles = {} self.template_filename = None wiki_system = WikiSystem(self.env) if not wiki_system.has_page('PageToOdtStyles'): raise Exception, 'Please create a PageToOdtStyles wiki page.' db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute( "SELECT text FROM wiki WHERE name = 'PageToOdtStyles' ORDER BY version DESC LIMIT 1" ) for (text, ) in cursor: page_content = text break for line in page_content.strip().splitlines(): if line.find('=') != -1: name, value = [token.strip() for token in line.split("=", 2)] if name.startswith('style_'): self.styles[name[6:]] = value elif name == 'template': self.template_filename = os.path.join( self.env.path, 'attachments', 'wiki', 'PageToOdtStyles', value)
class AutoLinksModule(Component): implements(IWikiSyntaxProvider) def __init__(self): self.wikisys = WikiSystem(self.env) # IWikiSyntaxProvider methods def get_wiki_syntax(self): # copied and modified from trac/wiki/api.py from trac.wiki.formatter import Formatter wiki_page_name = ( r"(([A-Z]+[a-z]{2,})|([A-Z]{3,}s?))" r"(?:#[\w:](?<!\d)(?:[\w:.-]*[\w-])?)?" # optional fragment id r"(?=:(?:\Z|\s)|[^:a-zA-Z]|\s|\Z)" # what should follow it ) def wikipagename_link(formatter, match, fullmatch): return self._format_link(formatter, 'wiki', match, match) yield (r"!?(?<![/\-])\b" + wiki_page_name, wikipagename_link) def get_link_resolvers(self): return [] def _format_link(self, formatter, ns, page, label): # copied and modified from trac/wiki/api.py page, query, fragment = formatter.split_link(page) link = False if self.wikisys.has_page(page): link = True elif page[-1] == 's' and self.wikisys.has_page(page[:-1]): # if the page name ends in 's', see if there is a wiki page with the same name minus the 's' # if there is, it will be linked page = page[:-1] link = True if link: href = formatter.href.wiki(page) + fragment return html.A(label, href=href, class_='wiki') else: return label
def expand_macro(self, formatter, name, content): curpage = formatter.resource.id # scoped TOC (e.g. TranslateRu/TracGuide or 0.11/TracGuide ...) prefix = '' idx = curpage.find('/') if idx > 0: prefix = curpage[:idx+1] ws = WikiSystem(self.env) return tag.div( tag.h4(_('Table of Contents')), tag.ul([tag.li(tag.a(title, href=formatter.href.wiki(prefix+ref), class_=(not ws.has_page(prefix+ref) and 'missing')), class_=(prefix+ref == curpage and 'active')) for ref, title in self.TOC]), class_='wiki-toc')
def expand_macro(self, formatter, name, args): curpage = formatter.resource.id # scoped TOC (e.g. TranslateRu/Guide or 0.X/Guide ...) prefix = '' guideprefix = GUIDE_NAME + '/' data = {'guide': GUIDE_NAME,} idx = curpage.find('/') if idx > 0: prefix = curpage[:idx+1] if prefix.endswith(guideprefix): prefix = prefix[:len(prefix)-len(guideprefix)] ws = WikiSystem(self.env) return tag.div( tag.h4(_('Table of Contents')), tag.ul([tag.li(tag.a(title, href=formatter.href.wiki(prefix+ref % data), class_=(not ws.has_page(prefix+ref % data) and 'missing')), class_=(prefix+ref % data== curpage and 'active')) for ref, title in self.TOC]), class_='wiki-toc')
def load_conf(self): self.styles = {} self.template_filename = None wiki_system = WikiSystem(self.env) if not wiki_system.has_page('PageToOdtStyles'): raise Exception, 'Please create a PageToOdtStyles wiki page.' db = self.env.get_db_cnx() cursor = db.cursor() cursor.execute("SELECT text FROM wiki WHERE name = 'PageToOdtStyles' ORDER BY version DESC LIMIT 1") for (text,) in cursor: page_content = text break for line in page_content.strip().splitlines(): if line.find('=') != -1: name, value = [token.strip() for token in line.split("=", 2)] if name.startswith('style_'): self.styles[ name[6:] ] = value elif name == 'template': self.template_filename = os.path.join( self.env.path, 'attachments', 'wiki', 'PageToOdtStyles', value)
def _render_view(self, req, page): version = page.resource.version # Add registered converters if page.exists: for conversion in Mimeview(self.env) \ .get_supported_conversions('text/x-trac-wiki'): conversion_href = req.href.wiki(page.name, version=version, format=conversion.key) add_link(req, 'alternate', conversion_href, conversion.name, conversion.in_mimetype) data = self._page_data(req, page) if page.name == self.START_PAGE: data['title'] = '' ws = WikiSystem(self.env) context = web_context(req, page.resource) higher, related = [], [] if not page.exists: if 'WIKI_CREATE' not in req.perm(page.resource): raise ResourceNotFound(_("Page %(name)s not found", name=page.name)) formatter = OneLinerFormatter(self.env, context) if '/' in page.name: parts = page.name.split('/') for i in xrange(len(parts) - 2, -1, -1): name = '/'.join(parts[:i] + [parts[-1]]) if not ws.has_page(name): higher.append(ws._format_link(formatter, 'wiki', '/' + name, name, False)) else: name = page.name name = name.lower() related = [each for each in ws.pages if name in each.lower() and 'WIKI_VIEW' in req.perm(self.realm, each)] related.sort() related = [ws._format_link(formatter, 'wiki', '/' + each, each, False) for each in related] latest_page = WikiPage(self.env, page.name) prev_version = next_version = None if version: version = as_int(version, None) if version is not None: for hist in latest_page.get_history(): v = hist[0] if v != version: if v < version: if not prev_version: prev_version = v break else: next_version = v prefix = self.PAGE_TEMPLATES_PREFIX templates = [template[len(prefix):] for template in ws.get_pages(prefix) if 'WIKI_VIEW' in req.perm(self.realm, template)] # -- prev/up/next links if prev_version: add_link(req, 'prev', req.href.wiki(page.name, version=prev_version), _("Version %(num)s", num=prev_version)) parent = None if version: add_link(req, 'up', req.href.wiki(page.name, version=None), _("View latest version")) elif '/' in page.name: parent = page.name[:page.name.rindex('/')] add_link(req, 'up', req.href.wiki(parent, version=None), _("View parent page")) if next_version: add_link(req, 'next', req.href.wiki(page.name, version=next_version), _('Version %(num)s', num=next_version)) # Add ctxtnav entries if version: prevnext_nav(req, _("Previous Version"), _("Next Version"), _("View Latest Version")) else: if parent: add_ctxtnav(req, _('Up'), req.href.wiki(parent)) self._wiki_ctxtnav(req, page) # Plugin content validation fields = {'text': page.text} for manipulator in self.page_manipulators: manipulator.prepare_wiki_page(req, page, fields) text = fields.get('text', '') data.update({ 'context': context, 'text': text, 'latest_version': latest_page.version, 'attachments': AttachmentModule(self.env).attachment_data(context), 'start_page': self.START_PAGE, 'default_template': self.DEFAULT_PAGE_TEMPLATE, 'templates': templates, 'version': version, 'higher': higher, 'related': related, 'resourcepath_template': 'wiki_page_path.html', 'fullwidth': req.session.get('wiki_fullwidth'), }) add_script(req, 'common/js/wiki.js') return 'wiki_view.html', data
def _render_view(self, req, page): version = page.resource.version # Add registered converters if page.exists: for conversion in Mimeview(self.env).get_supported_conversions( 'text/x-trac-wiki'): conversion_href = req.href.wiki(page.name, version=version, format=conversion[0]) # or... conversion_href = get_resource_url(self.env, page.resource, req.href, format=conversion[0]) add_link(req, 'alternate', conversion_href, conversion[1], conversion[3]) data = self._page_data(req, page) if page.name == 'WikiStart': data['title'] = '' ws = WikiSystem(self.env) context = web_context(req, page.resource) higher, related = [], [] if not page.exists: if 'WIKI_CREATE' not in req.perm(page.resource): raise ResourceNotFound(_('Page %(name)s not found', name=page.name)) formatter = OneLinerFormatter(self.env, context) if '/' in page.name: parts = page.name.split('/') for i in range(len(parts) - 2, -1, -1): name = '/'.join(parts[:i] + [parts[-1]]) if not ws.has_page(name): higher.append(ws._format_link(formatter, 'wiki', '/' + name, name, False)) else: name = page.name name = name.lower() related = [each for each in ws.pages if name in each.lower() and 'WIKI_VIEW' in req.perm('wiki', each)] related.sort() related = [ws._format_link(formatter, 'wiki', '/' + each, each, False) for each in related] latest_page = WikiPage(self.env, page.name, version=None) req.perm(latest_page.resource).require('WIKI_VIEW') prev_version = next_version = None if version: try: version = int(version) for hist in latest_page.get_history(): v = hist[0] if v != version: if v < version: if not prev_version: prev_version = v break else: next_version = v except ValueError: version = None prefix = self.PAGE_TEMPLATES_PREFIX templates = [template[len(prefix):] for template in ws.get_pages(prefix) if 'WIKI_VIEW' in req.perm('wiki', template)] # -- prev/up/next links if prev_version: add_link(req, 'prev', req.href.wiki(page.name, version=prev_version), _('Version %(num)s', num=prev_version)) parent = None if version: add_link(req, 'up', req.href.wiki(page.name, version=None), _('View latest version')) elif '/' in page.name: parent = page.name[:page.name.rindex('/')] add_link(req, 'up', req.href.wiki(parent, version=None), _("View parent page")) if next_version: add_link(req, 'next', req.href.wiki(page.name, version=next_version), _('Version %(num)s', num=next_version)) # Add ctxtnav entries if version: prevnext_nav(req, _('Previous Version'), _('Next Version'), _('View Latest Version')) else: if parent: add_ctxtnav(req, _('Up'), req.href.wiki(parent)) self._wiki_ctxtnav(req, page) # Plugin content validation fields = {'text': page.text} for manipulator in self.page_manipulators: manipulator.prepare_wiki_page(req, page, fields) text = fields.get('text', '') data.update({ 'context': context, 'text': text, 'latest_version': latest_page.version, 'attachments': AttachmentModule(self.env).attachment_data(context), 'default_template': self.DEFAULT_PAGE_TEMPLATE, 'templates': templates, 'version': version, 'higher': higher, 'related': related, 'resourcepath_template': 'wiki_page_path.html', }) add_script(req, 'common/js/folding.js') return 'wiki_view.html', data, None