Showing with 55 additions and 17 deletions.
  1. +2 −0 wikiautocomplete/htdocs/css/jquery.textcomplete.css
  2. +23 −11 wikiautocomplete/htdocs/js/wikiautocomplete.js
  3. +30 −6 wikiautocomplete/web_ui.py
2 changes: 2 additions & 0 deletions wikiautocomplete/htdocs/css/jquery.textcomplete.css
Expand Up @@ -22,6 +22,8 @@
background-color: rgb(110, 183, 219);
}

.wikiautocomplete-menu-descr { color: #777; margin-left: 1.2em }


/* SHOULD not modify */

Expand Down
34 changes: 23 additions & 11 deletions wikiautocomplete/htdocs/js/wikiautocomplete.js
Expand Up @@ -20,6 +20,18 @@ jQuery(document).ready(function($) {
return $.htmlEscape(text);
}

function template_descr(value, descr, term) {
var text = $.htmlEscape(value);
if (descr && value !== descr)
text += $.htmlFormat(
'<span class="wikiautocomplete-menu-descr">$1</span>', descr);
return text;
}

function template_report(report, term) {
return template_descr('{' + report.id + '}', report.title, term);
}

var TextareaAdapter = $.fn.textcomplete.Textarea;
function Adapter(element, completer, option) {
this.initialize(element, completer, option);
Expand Down Expand Up @@ -65,13 +77,17 @@ jQuery(document).ready(function($) {
cache: true
},

{ // TracLinks
{ // TracLinks, InterTrac and InterWiki
match: /(^|[^[])\[(\w*)$/,
search: search('linkresolvers'),
index: 2,
template: template,
template: function (resolver, term) {
var descr = resolver.name !== resolver.title ?
resolver.title : resolver.url;
return template_descr(resolver.name, descr, term);
},
replace: function (resolver) {
return ['$1[' + escape_newvalue(resolver) + ':', ']'];
return ['$1[' + escape_newvalue(resolver.name) + ':', ']'];
},
cache: true,
},
Expand All @@ -80,8 +96,8 @@ jQuery(document).ready(function($) {
match: /((?:^|[^{])#|\bticket:)(\d*)$/,
search: search('ticket'),
index: 2,
template: function (ticket) {
return $.htmlEscape('#' + ticket.id + ' ' + ticket.summary);
template: function (ticket, term) {
return template_descr('#' + ticket.id, ticket.summary);
},
replace: function (ticket) {
return '$1' + ticket.id;
Expand Down Expand Up @@ -141,9 +157,7 @@ jQuery(document).ready(function($) {
match: /(^|[^{])\{(\d*)$/,
search: search('report'),
index: 2,
template: function (report) {
return $.htmlEscape('{' + report.id + '} ' + report.title);
},
template: template_report,
replace: function (report) {
return ['$1{' + report.id, '}'];
},
Expand All @@ -154,9 +168,7 @@ jQuery(document).ready(function($) {
match: /\breport:(\d*)$/,
search: search('report'),
index: 1,
template: function (report) {
return $.htmlEscape('{' + report.id + '} ' + report.title);
},
template: template_report,
replace: function (report) {
return 'report:' + report.id;
},
Expand Down
36 changes: 30 additions & 6 deletions wikiautocomplete/web_ui.py
Expand Up @@ -17,6 +17,7 @@
from trac.web import IRequestFilter, IRequestHandler
from trac.web.chrome import ITemplateProvider, add_script, add_script_data, add_stylesheet, web_context
from trac.wiki.api import WikiSystem
from trac.wiki.interwiki import InterWikiMap
from trac.wiki.formatter import format_to_html, format_to_oneliner


Expand Down Expand Up @@ -99,12 +100,21 @@ def process_request(self, req):
self._send_json(req, completions)

def _suggest_linkresolvers(self, req, term):
wiki = WikiSystem(self.env)
completions = set(name for provider in wiki.syntax_providers
for name, resolver
in provider.get_link_resolvers()
if name.startswith(term))
return sorted(completions)
links = {}
links.update((name, (2, name, url, title))
for name, url, title
in InterWikiMap(self.env).interwiki_map.itervalues())
links.update((name, (1, name, url, title))
for name, url, title in self._get_intertracs())
links.update((name, (0, name, None, None))
for provider in WikiSystem(self.env).syntax_providers
for name, resolver in provider.get_link_resolvers())
links = [(order, name, url, title)
for order, name, url, title in links.itervalues()
if name.startswith(term)]
links.sort(key=lambda item: (item[0], item[1]))
return [{'name': name, 'url': url, 'title': title}
for order, name, url, title in links]

def _suggest_ticket(self, req, term):
args = self._get_num_ranges(term, Ticket.id_is_valid)
Expand Down Expand Up @@ -298,6 +308,20 @@ def _get_num_ranges(self, term, validate):
mul *= 10
return ranges

def _get_intertracs(self):
has_trac = False
for name, value in self.config.options('intertrac'):
if name.endswith('.url'):
name = name[:-4]
title = self.config.get('intertrac', name + '.title')
yield name, value, title
if name == 'trac':
has_trac = True

if not has_trac:
yield ('trac', 'http://trac.edgewall.org',
dgettext('messages', 'The Trac Project'))

_builtin_macros = ('html', 'htmlcomment', 'default', 'comment', 'div',
'rtl', 'span', 'Span', 'td', 'th', 'tr', 'table')

Expand Down