| 1 | from trac.core import * |
|---|
| 2 | from tractags.api import DefaultTaggingSystem, ITaggingSystemProvider, TagEngine |
|---|
| 3 | from trac.wiki.api import IWikiChangeListener |
|---|
| 4 | import re |
|---|
| 5 | |
|---|
| 6 | class WikiTaggingSystem(DefaultTaggingSystem): |
|---|
| 7 | """ Subclass of DefaultTaggingSystem that knows how to retrieve wiki page |
|---|
| 8 | titles. """ |
|---|
| 9 | def __init__(self, env): |
|---|
| 10 | DefaultTaggingSystem.__init__(self, env, 'wiki') |
|---|
| 11 | |
|---|
| 12 | def page_info(self, page): |
|---|
| 13 | from trac.wiki import model |
|---|
| 14 | """ Return tuple of (model.WikiPage, title) """ |
|---|
| 15 | page = model.WikiPage(self.env, page) |
|---|
| 16 | |
|---|
| 17 | title = '' |
|---|
| 18 | |
|---|
| 19 | if page.exists: |
|---|
| 20 | text = page.text |
|---|
| 21 | ret = re.search('=\s+([^=]*)=',text) |
|---|
| 22 | title = ret and ret.group(1) or '' |
|---|
| 23 | |
|---|
| 24 | return (page, title) |
|---|
| 25 | |
|---|
| 26 | def name_details(self, name): |
|---|
| 27 | """ Return a tuple of (href, wikilink, title). eg. ("/ticket/1", "#1", "Broken links") """ |
|---|
| 28 | page, title = self.page_info(name) |
|---|
| 29 | href = self.env.href.wiki(name) |
|---|
| 30 | defaults = DefaultTaggingSystem.name_details(self, name) |
|---|
| 31 | return defaults[0:2] + (title,) |
|---|
| 32 | |
|---|
| 33 | class WikiTags(Component): |
|---|
| 34 | """ Implement tags in the Wiki system. """ |
|---|
| 35 | |
|---|
| 36 | implements(ITaggingSystemProvider, IWikiChangeListener) |
|---|
| 37 | |
|---|
| 38 | # ITaggingSystemProvider methods |
|---|
| 39 | def get_tagspaces_provided(self): |
|---|
| 40 | yield 'wiki' |
|---|
| 41 | |
|---|
| 42 | def get_tagging_system(self, tagspace): |
|---|
| 43 | return WikiTaggingSystem(self.env) |
|---|
| 44 | |
|---|
| 45 | # IWikiChangeListener methods |
|---|
| 46 | def wiki_page_added(self, page): |
|---|
| 47 | pass |
|---|
| 48 | |
|---|
| 49 | def wiki_page_changed(self, page, version, t, comment, author, ipnr): |
|---|
| 50 | pass |
|---|
| 51 | |
|---|
| 52 | def wiki_page_deleted(self, page): |
|---|
| 53 | # No point having tags on a non-existent page. |
|---|
| 54 | self.env.log.debug("Removing all tags from 'wiki:%s'" % page.name) |
|---|
| 55 | TagEngine(self.env).tagspace.wiki.remove_all_tags(None, page.name) |
|---|
| 56 | |
|---|
| 57 | def wiki_page_version_deleted(self, page): |
|---|
| 58 | # Wiki tags are not versioned. If they were, we'd delete them here. |
|---|
| 59 | pass |
|---|