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
|
# -*- coding: iso8859-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>
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 NLWikinfoMacro(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 'NlWikinfo'
def get_macro_description(self, name):
return inspect.getdoc(NLWikinfoMacro)
def render_macro(self, req, name, content):
if content:
keywords = [arg.strip() for arg in content.split(',')]
buf = StringIO()
for nfo in keywords:
try:
getattr(self, '_do_%s' % nfo)(req, name, content, buf)
except AttributeError:
buf.write('INVALID: %s' % nfo)
return buf.getvalue()
# Private methods
def _do_author(self, req, 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" % req.hdf['wiki.page_name']
cursor.execute(sql)
row = cursor.fetchone()
buf.write(row[0])
def _do_version(self, req, name, content, buf):
db = self.env.get_db_cnx()
cursor = db.cursor()
sql = "SELECT max(version) FROM wiki where name = '%s'" % req.hdf['wiki.page_name']
cursor.execute(sql)
row = cursor.fetchone()
buf.write(str(row[0]))
def _do_changed_by(self, req, 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" % req.hdf['wiki.page_name']
cursor.execute(sql)
row = cursor.fetchone()
buf.write(row[0])
def _do_changed_ts(self, req, 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" % req.hdf['wiki.page_name']
cursor.execute(sql)
row = cursor.fetchone()
buf.write(time.strftime('%x', time.localtime(row[0])))
def _do_comment(self, req, 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" % req.hdf['wiki.page_name']
cursor.execute(sql)
row = cursor.fetchone()
buf.write(row[0])
|