1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# -*- coding: iso-8859-1 -*-
#
# Copyright (C) 2005 Jani Tiainen
#
# Trac is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2 of the
# License, or (at your option) any later version.
#
# NlWikinfo is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#
# Author: Jani Tiainen <redetin@luukku.com>
#
# Updated for Trac 0.11 by Johan Risberg <gannis@users.sourceforge.net>
from __future__ import generators
import imp
import inspect
import os.path
import time
import shutil
import re
try:
from cStringIO import StringIO
except ImportError:
from StringIO import StringIO
from trac.core import *
from trac.wiki.api import IWikiMacroProvider, WikiSystem
class WikinfoMacro(Component):
"""
Output different information by keyword.
Currently supported infos:
author - Author of first version
version - Latest version of page
changed_by - Page last changed by
comment - Latest comment of changed by
changed_ts - Page last changed timestamp
"""
implements(IWikiMacroProvider)
# IWikiMacroProvider methods
def get_macros(self):
yield 'Wikinfo'
def get_macro_description(self, name):
return inspect.getdoc(WikinfoMacro)
def expand_macro(self, formatter, name, content):
if content:
keywords = [arg.strip() for arg in content.split(',')]
buf = StringIO()
for nfo in keywords:
try:
getattr(self, '_do_%s' % nfo)(formatter.resource.id, name, content, buf)
except AttributeError:
buf.write('INVALID: %s' % nfo)
return buf.getvalue()
# Private methods
def _do_author(self, page, name, content, buf):
db = self.env.get_db_cnx()
cursor = db.cursor()
sql = "SELECT author, version FROM wiki where name = '%s' order by version limit 1" % page
cursor.execute(sql)
row = cursor.fetchone()
buf.write(row[0])
def _do_version(self, page, name, content, buf):
db = self.env.get_db_cnx()
cursor = db.cursor()
sql = "SELECT max(version) FROM wiki where name = '%s'" % page
cursor.execute(sql)
row = cursor.fetchone()
buf.write(str(row[0]))
def _do_changed_by(self, page, name, content, buf):
db = self.env.get_db_cnx()
cursor = db.cursor()
sql = "SELECT author, version FROM wiki where name = '%s' order by version desc limit 1" % page
cursor.execute(sql)
row = cursor.fetchone()
buf.write(row[0])
def _do_changed_ts(self, page, name, content, buf):
db = self.env.get_db_cnx()
cursor = db.cursor()
sql = "SELECT time, version FROM wiki where name = '%s' order by version desc limit 1" % page
cursor.execute(sql)
row = cursor.fetchone()
buf.write(time.strftime('%x', time.localtime(row[0]/1000000)))
def _do_comment(self, page, name, content, buf):
db = self.env.get_db_cnx()
cursor = db.cursor()
sql = "SELECT comment, version FROM wiki where name = '%s' order by version desc limit 1" % page
cursor.execute(sql)
row = cursor.fetchone()
buf.write(row[0])
|