ktec-subtrac 0.1.27 → 0.1.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION.yml +1 -1
- data/lib/subtrac/templates/location.erb +6 -6
- data/lib/subtrac/templates/projects/blank/trac/wiki/WikiStart +4 -9
- data/lib/subtrac/templates/projects/new/svn/trunk/trac/wiki/WikiStart +4 -4
- data/lib/subtrac/templates/projects/new/trac/wiki/WikiStart +3 -3
- data/lib/subtrac/templates/trac.ini.erb +1 -1
- data/lib/subtrac.rb +27 -23
- metadata +1 -6
- data/lib/subtrac/templates/projects/trac_theme/svn/trunk/index/index.html +0 -21
- data/lib/subtrac/templates/projects/trac_theme/svn/trunk/templates/layout.html +0 -56
- data/lib/subtrac/templates/projects/trac_theme/svn/trunk/templates/site.html +0 -27
- data/lib/subtrac/templates/projects/trac_theme/svn/trunk/templates/theme.html +0 -86
- data/lib/subtrac/templates/projects/trac_theme/trac/wiki/WikiStart +0 -4
data/VERSION.yml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
<location /<%=
|
1
|
+
<location /<%= client_path %>>
|
2
2
|
SetHandler mod_python
|
3
3
|
PythonInterpreter main_interpreter
|
4
4
|
PythonHandler trac.web.modpython_frontend
|
5
|
-
PythonOption TracEnvParentDir <%= trac_dir %>/<%=
|
6
|
-
PythonOption TracUriRoot /<%=
|
7
|
-
PythonOption TracEnvIndexTemplate <%= trac_dir %>/<%=
|
5
|
+
PythonOption TracEnvParentDir <%= trac_dir %>/<%= client_path %>
|
6
|
+
PythonOption TracUriRoot /<%= client_path %>
|
7
|
+
PythonOption TracEnvIndexTemplate <%= trac_dir %>/<%= client_path %>/.theme/index/index.html
|
8
8
|
PythonOption PYTHON_EGG_CACHE <%= temp_dir %>
|
9
9
|
</location>
|
10
|
-
<location <%= @APP_CONFIG[:urls][:svn] %>/<%=
|
10
|
+
<location <%= @APP_CONFIG[:urls][:svn] %>/<%= client_path %>>
|
11
11
|
DAV svn
|
12
|
-
SVNParentPath <%= svn_dir %>/<%=
|
12
|
+
SVNParentPath <%= svn_dir %>/<%= client_path %>
|
13
13
|
SVNListParentPath On
|
14
14
|
SVNAutoversioning On
|
15
15
|
SVNReposName "<%= server_name %> for <%= client_name %>"
|
@@ -1,19 +1,19 @@
|
|
1
1
|
[[PageOutline]]
|
2
2
|
= Welcome to the <%= server_name %> for <%= project_name %> =
|
3
3
|
|
4
|
-
This is the home of development for <%=
|
4
|
+
This is the home of development for <%= client_name %>. This page is editable by design. That means YOU. If something is missing, fix it. This is what you make of it so get involved.
|
5
5
|
|
6
6
|
== Starting Points ==
|
7
7
|
|
8
|
-
* [<%= svn_url %>/<%=
|
9
|
-
* [<%= svn_url %>/<%=
|
8
|
+
* [<%= svn_url %>/<%= client_path %> Browse all <%= client_name %> SVN Repositories]
|
9
|
+
* [<%= svn_url %>/<%= client_path %>/<%= project_path %> Browse the <%= project_name %> repository]
|
10
10
|
|
11
11
|
=== How to check this project out ===
|
12
12
|
|
13
13
|
Make sure you have subversion client installed, then you can check the project out using:
|
14
14
|
|
15
15
|
{{{
|
16
|
-
svn checkout <%= svn_url %>/<%=
|
16
|
+
svn checkout <%= svn_url %>/<%= client_path %>/<%= project_path %>/trunk <%= project_path %>
|
17
17
|
}}}
|
18
18
|
|
19
19
|
=== Using SVN ===
|
@@ -22,11 +22,6 @@ svn checkout <%= svn_url %>/<%= client_name %>/<%= project_name %>/trunk <%= pro
|
|
22
22
|
* [http://scplugin.tigris.org/ For OS X use SCPlugin]
|
23
23
|
* [http://theappleblog.com/2009/02/23/12-subversion-apps-for-os-x/ There's loads more if you don't like these]
|
24
24
|
|
25
|
-
== Template Projects ==
|
26
|
-
|
27
|
-
This system allows you to set up a default template for different project types. All templates are available to browse in the [<%= @APP_CONFIG[:urls][:svn] %>/templates/svn/ Browse all Templates Repositories] area.
|
28
|
-
|
29
|
-
|
30
25
|
= About Trac =
|
31
26
|
|
32
27
|
Trac is a '''minimalistic''' approach to '''web-based''' management of
|
@@ -1,19 +1,19 @@
|
|
1
1
|
[[PageOutline]]
|
2
|
-
= Welcome to the <%= server_name %> for <%= project_name
|
2
|
+
= Welcome to the <%= server_name %> for <%= project_name %> =
|
3
3
|
|
4
4
|
This is the home of development for <%= client %>. This page is editable by design. That means YOU. If something is missing, fix it. This is what you make of it so get involved.
|
5
5
|
|
6
6
|
== Starting Points ==
|
7
7
|
|
8
|
-
* [<%= svn_url %>/<%=
|
9
|
-
* [<%= svn_url %>/<%=
|
8
|
+
* [<%= svn_url %>/<%= client_path %> Browse all <%= client_name %> SVN Repositories]
|
9
|
+
* [<%= svn_url %>/<%= client_path %>/<%= project_name %> Browse the <%= project_name %> repository]
|
10
10
|
|
11
11
|
=== How to check this project out ===
|
12
12
|
|
13
13
|
Make sure you have subversion client installed, then you can check the project out using:
|
14
14
|
|
15
15
|
{{{
|
16
|
-
svn checkout <%= svn_url %>/<%=
|
16
|
+
svn checkout <%= svn_url %>/<%= client_path %>/<%= project_name %>/trunk <%= project_name %>
|
17
17
|
}}}
|
18
18
|
|
19
19
|
=== Using SVN ===
|
@@ -5,15 +5,15 @@ This is the home of development for <%= client %>. This page is editable by desi
|
|
5
5
|
|
6
6
|
== Starting Points ==
|
7
7
|
|
8
|
-
* [<%= svn_url %>/<%=
|
9
|
-
* [<%= svn_url %>/<%=
|
8
|
+
* [<%= svn_url %>/<%= client_path %> Browse all <%= client_name %> SVN Repositories]
|
9
|
+
* [<%= svn_url %>/<%= client_path %>/<%= project_path %> Browse the <%= project_name %> repository]
|
10
10
|
|
11
11
|
=== How to check this project out ===
|
12
12
|
|
13
13
|
Make sure you have subversion client installed, then you can check the project out using:
|
14
14
|
|
15
15
|
{{{
|
16
|
-
svn checkout <%= svn_url %>/<%=
|
16
|
+
svn checkout <%= svn_url %>/<%= client_path %>/<%= project_path %>/trunk <%= project_path %>
|
17
17
|
}}}
|
18
18
|
|
19
19
|
=== Using SVN ===
|
data/lib/subtrac.rb
CHANGED
@@ -56,7 +56,7 @@ module Subtrac
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def server_name=(name)
|
59
|
-
@APP_CONFIG[:server_name] =
|
59
|
+
@APP_CONFIG[:server_name] = @server_name = name
|
60
60
|
end
|
61
61
|
|
62
62
|
def server_hostname
|
@@ -64,7 +64,7 @@ module Subtrac
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def server_hostname=(name)
|
67
|
-
@APP_CONFIG[:server_hostname] =
|
67
|
+
@APP_CONFIG[:server_hostname] = @server_hostname = name
|
68
68
|
end
|
69
69
|
|
70
70
|
def default_client
|
@@ -72,7 +72,7 @@ module Subtrac
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def default_client=(name)
|
75
|
-
@APP_CONFIG[:default_client] =
|
75
|
+
@APP_CONFIG[:default_client] = @default_client = name
|
76
76
|
end
|
77
77
|
|
78
78
|
def default_project
|
@@ -81,7 +81,7 @@ module Subtrac
|
|
81
81
|
|
82
82
|
def default_project=(name)
|
83
83
|
puts "Updating default_project to #{name}"
|
84
|
-
@APP_CONFIG[:default_project] =
|
84
|
+
@APP_CONFIG[:default_project] = @default_project = name
|
85
85
|
end
|
86
86
|
|
87
87
|
|
@@ -117,7 +117,7 @@ module Subtrac
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def apache_conf_dir=(name)
|
120
|
-
@APP_CONFIG[:apache_conf_dir] =
|
120
|
+
@APP_CONFIG[:apache_conf_dir] = @apache_conf_dir = name
|
121
121
|
end
|
122
122
|
|
123
123
|
def docs_dir
|
@@ -157,7 +157,7 @@ module Subtrac
|
|
157
157
|
end
|
158
158
|
|
159
159
|
def enable_ldap=(value)
|
160
|
-
@APP_CONFIG[:ldap][:enable] =
|
160
|
+
@APP_CONFIG[:ldap][:enable] = @enable_ldap = value
|
161
161
|
end
|
162
162
|
|
163
163
|
def ldap_bind_dn
|
@@ -165,7 +165,7 @@ module Subtrac
|
|
165
165
|
end
|
166
166
|
|
167
167
|
def ldap_bind_dn=(value)
|
168
|
-
@APP_CONFIG[:ldap][:bind_dn] =
|
168
|
+
@APP_CONFIG[:ldap][:bind_dn] = @ldap_bind_dn = value
|
169
169
|
end
|
170
170
|
|
171
171
|
def ldap_bind_password
|
@@ -173,7 +173,7 @@ module Subtrac
|
|
173
173
|
end
|
174
174
|
|
175
175
|
def ldap_bind_password=(value)
|
176
|
-
@APP_CONFIG[:ldap][:bind_password] =
|
176
|
+
@APP_CONFIG[:ldap][:bind_password] = @ldap_bind_password = value
|
177
177
|
end
|
178
178
|
|
179
179
|
def ldap_bind_host
|
@@ -181,7 +181,7 @@ module Subtrac
|
|
181
181
|
end
|
182
182
|
|
183
183
|
def ldap_bind_host=(value)
|
184
|
-
@APP_CONFIG[:ldap][:bind_host] =
|
184
|
+
@APP_CONFIG[:ldap][:bind_host] = @ldap_bind_password = value
|
185
185
|
end
|
186
186
|
|
187
187
|
end
|
@@ -364,36 +364,37 @@ module Subtrac
|
|
364
364
|
|
365
365
|
def self.create_client(name)
|
366
366
|
puts "\n==== Create a new client called #{name} ===="
|
367
|
-
client_name = name.
|
367
|
+
client_name = name.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase }
|
368
|
+
client_path = name.downcase
|
368
369
|
# create apache configuration
|
369
370
|
puts "subtrac_path: #{subtrac_path}"
|
370
371
|
puts "templates_location: #{@APP_CONFIG[:templates][:location]}"
|
371
372
|
location_template = File.join(subtrac_path, @APP_CONFIG[:templates][:location])
|
372
373
|
puts "location_template: #{location_template}"
|
373
|
-
location_conf = File.join(locations_dir,"#{
|
374
|
+
location_conf = File.join(locations_dir,"#{client_path}.conf")
|
374
375
|
puts "location_conf: #{location_conf}"
|
375
376
|
parse_template(location_template,location_conf,binding)
|
376
377
|
`/etc/init.d/apache2 force-reload` if SUBTRAC_ENV != 'test'
|
377
378
|
|
378
379
|
# create svn+trac directory
|
379
|
-
create_if_missing File.join(svn_dir,
|
380
|
-
create_if_missing File.join(trac_dir,
|
380
|
+
create_if_missing File.join(svn_dir,client_path)
|
381
|
+
create_if_missing File.join(trac_dir,client_path)
|
381
382
|
|
382
383
|
end
|
383
384
|
|
384
385
|
def self.install_default_theme
|
385
386
|
puts "\n==== Create a new client called #{name} ===="
|
386
387
|
# create a project for this clients trac theme
|
387
|
-
#create_project("trac_theme",
|
388
|
+
#create_project("trac_theme", client_path,@APP_CONFIG[:default_theme_template])
|
388
389
|
|
389
390
|
# check the theme project out
|
390
|
-
#client_theme_dir = File.join(trac_dir,
|
391
|
+
#client_theme_dir = File.join(trac_dir,client_path,".theme")
|
391
392
|
#create_if_missing(client_theme_dir)
|
392
393
|
#FileUtils.chown_R('www-data', 'www-data', client_theme_dir, :verbose => true) if SUBTRAC_ENV != 'test'
|
393
394
|
#puts "Attempting checkout of theme project..."
|
394
395
|
|
395
396
|
#`sudo svn co --username #{@APP_CONFIG[:admin_user]} --password #{@APP_CONFIG[:admin_pass]} \
|
396
|
-
# file://#{svn_dir}/#{
|
397
|
+
# file://#{svn_dir}/#{client_path}/trac_theme/trunk #{client_theme_dir}` if SUBTRAC_ENV != 'test'
|
397
398
|
# TODO: Need to find a way to test before trying
|
398
399
|
template_dir = File.join(subtrac_path, "templates","trac","themes","subtractheme")
|
399
400
|
say(`sudo easy_install #{template_dir}`)
|
@@ -402,14 +403,17 @@ module Subtrac
|
|
402
403
|
def self.create_project(project, client, project_type=@APP_CONFIG[:default_project_template])
|
403
404
|
puts "\n==== Create a new project called #{project} for #{client} ===="
|
404
405
|
|
405
|
-
client_name = client.
|
406
|
-
project_name = project.
|
406
|
+
client_name = client.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase }
|
407
|
+
project_name = project.gsub(/^[a-z]|\s+[a-z]/) { |a| a.upcase }
|
408
|
+
# need to make sure this is a valid path - swap spaces for underscores etc
|
409
|
+
client_path = client.downcase
|
410
|
+
project_path = project.downcase
|
407
411
|
|
408
412
|
# create client directory if needed
|
409
|
-
create_client(
|
413
|
+
create_client(client_path) if (!File.directory? File.join(svn_dir,client_path))
|
410
414
|
|
411
|
-
project_svn_dir = File.join(svn_dir,
|
412
|
-
project_trac_dir = File.join(trac_dir,
|
415
|
+
project_svn_dir = File.join(svn_dir,client_path,project_path)
|
416
|
+
project_trac_dir = File.join(trac_dir,client_path,project_path)
|
413
417
|
|
414
418
|
# TODO: Need to handle this exception...
|
415
419
|
if (File.directory? project_svn_dir) then
|
@@ -426,7 +430,7 @@ module Subtrac
|
|
426
430
|
# copy template svn project to a temp folder, then svn import it into the repo
|
427
431
|
say("Create temporary project directory and copy template files...")
|
428
432
|
svn_template_dir = File.join(project_template,"svn")
|
429
|
-
project_temp_dir = File.join(temp_dir,
|
433
|
+
project_temp_dir = File.join(temp_dir,project_path)
|
430
434
|
FileUtils.cp_r(svn_template_dir,project_temp_dir)
|
431
435
|
|
432
436
|
# create a new subversion repository
|
@@ -441,7 +445,7 @@ module Subtrac
|
|
441
445
|
|
442
446
|
# create a new trac site
|
443
447
|
say("Creating a new trac site...")
|
444
|
-
result = `trac-admin #{project_trac_dir} initenv #{
|
448
|
+
result = `trac-admin #{project_trac_dir} initenv #{project_path} sqlite:#{project_trac_dir}/db/trac.db svn #{project_svn_dir}` if SUBTRAC_ENV != 'test'
|
445
449
|
FileUtils.chown_R('www-data', 'www-data', project_trac_dir, :verbose => false) if SUBTRAC_ENV != 'test'
|
446
450
|
FileUtils.mkdir_p("#{project_trac_dir}/conf") if SUBTRAC_ENV == 'test' # fake the folder for tests
|
447
451
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ktec-subtrac
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.28
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keith Salisbury
|
@@ -58,11 +58,6 @@ files:
|
|
58
58
|
- lib/subtrac/templates/projects/blank/trac/wiki/WikiStart
|
59
59
|
- lib/subtrac/templates/projects/new/svn/trunk/trac/wiki/WikiStart
|
60
60
|
- lib/subtrac/templates/projects/new/trac/wiki/WikiStart
|
61
|
-
- lib/subtrac/templates/projects/trac_theme/svn/trunk/index/index.html
|
62
|
-
- lib/subtrac/templates/projects/trac_theme/svn/trunk/templates/layout.html
|
63
|
-
- lib/subtrac/templates/projects/trac_theme/svn/trunk/templates/site.html
|
64
|
-
- lib/subtrac/templates/projects/trac_theme/svn/trunk/templates/theme.html
|
65
|
-
- lib/subtrac/templates/projects/trac_theme/trac/wiki/WikiStart
|
66
61
|
- lib/subtrac/templates/trac.ini.erb
|
67
62
|
- lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/__init__.py
|
68
63
|
- lib/subtrac/templates/trac/themes/sainttheme/crystalxtheme/htdocs/img/bg.gif
|
@@ -1,21 +0,0 @@
|
|
1
|
-
<!DOCTYPE html
|
2
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
-
<html xmlns="http://www.w3.org/1999/xhtml"
|
5
|
-
xmlns:py="http://genshi.edgewall.org/"
|
6
|
-
xmlns:xi="http://www.w3.org/2001/XInclude">
|
7
|
-
<head>
|
8
|
-
<title>Available Projects</title>
|
9
|
-
</head>
|
10
|
-
<body>
|
11
|
-
<h1>Available Projects for Subtrac</h1>
|
12
|
-
<ul>
|
13
|
-
<py:for each="project in projects" py:choose="">
|
14
|
-
<li py:when="project.href">
|
15
|
-
<a href="$project.href"
|
16
|
-
title="$project.description">$project.name</a>
|
17
|
-
</li>
|
18
|
-
</py:for>
|
19
|
-
</ul>
|
20
|
-
</body>
|
21
|
-
</html>
|
@@ -1,56 +0,0 @@
|
|
1
|
-
<!DOCTYPE html
|
2
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
-
<html xmlns="http://www.w3.org/1999/xhtml"
|
5
|
-
xmlns:xi="http://www.w3.org/2001/XInclude"
|
6
|
-
xmlns:py="http://genshi.edgewall.org/"
|
7
|
-
py:strip="">
|
8
|
-
|
9
|
-
<py:match path="head" once="true"><head>
|
10
|
-
<title py:with="title = list(select('title/text()'))">
|
11
|
-
<py:if test="title">${title} – </py:if>${project.name or 'Trac'}
|
12
|
-
</title>
|
13
|
-
<py:if test="chrome.links">
|
14
|
-
<py:for each="rel, links in chrome.links.items()">
|
15
|
-
<link rel="${rel}" py:for="link in links" py:attrs="link" />
|
16
|
-
</py:for>
|
17
|
-
</py:if>
|
18
|
-
<py:if test="'SEARCH_VIEW' in perm" id="search">
|
19
|
-
<link type="application/opensearchdescription+xml" rel="search"
|
20
|
-
href="${href.search('opensearch')}" title="Search $project.name"/>
|
21
|
-
</py:if>
|
22
|
-
<script py:for="script in chrome.scripts"
|
23
|
-
type="${script.type}" src="${script.href}"></script>
|
24
|
-
${Markup('<!--[if lt IE 7]>')}
|
25
|
-
<script type="text/javascript" src="${chrome.htdocs_location}js/ie_pre7_hacks.js"
|
26
|
-
></script>
|
27
|
-
${Markup('<![endif]-->')}
|
28
|
-
${select("*[local-name() != 'title']")}
|
29
|
-
</head></py:match>
|
30
|
-
|
31
|
-
<py:match path="body" once="true" buffer="false"><body>
|
32
|
-
${select('*|text()')}
|
33
|
-
|
34
|
-
<script type="text/javascript" py:if="chrome.late_links">
|
35
|
-
<py:for each="link in chrome.late_links.get('stylesheet')">
|
36
|
-
jQuery.loadStyleSheet("${link.href}", "${link.type}");
|
37
|
-
</py:for>
|
38
|
-
</script>
|
39
|
-
<script py:for="script in chrome.late_scripts"
|
40
|
-
type="${script.type}" src="${script.href}"></script>
|
41
|
-
|
42
|
-
<div id="altlinks" py:if="'alternate' in chrome.links">
|
43
|
-
<h3>Download in other formats:</h3>
|
44
|
-
<ul>
|
45
|
-
<li py:for="idx, link in enumerate(chrome.links.alternate)"
|
46
|
-
class="${first_last(idx, chrome.links.alternate)}">
|
47
|
-
<a rel="nofollow" href="${link.href}" class="${link['class']}"
|
48
|
-
py:content="link.title" />
|
49
|
-
</li>
|
50
|
-
</ul>
|
51
|
-
</div>
|
52
|
-
</body></py:match>
|
53
|
-
|
54
|
-
<xi:include href="$chrome.theme"><xi:fallback /></xi:include>
|
55
|
-
<xi:include href="site.html"><xi:fallback /></xi:include>
|
56
|
-
</html>
|
@@ -1,27 +0,0 @@
|
|
1
|
-
<html xmlns="http://www.w3.org/1999/xhtml"
|
2
|
-
xmlns:py="http://genshi.edgewall.org/"
|
3
|
-
py:strip="">
|
4
|
-
|
5
|
-
<!--! Add site-specific style sheet -->
|
6
|
-
<head py:match="head" py:attrs="select('@*')">
|
7
|
-
${select('*|comment()|text()')}
|
8
|
-
<link rel="stylesheet" type="text/css"
|
9
|
-
href="${href.chrome('site/style.css')}" />
|
10
|
-
<link rel="stylesheet" type="text/css"
|
11
|
-
href="/styles/trac.css"/>
|
12
|
-
</head>
|
13
|
-
|
14
|
-
<body py:match="body" py:attrs="select('@*')">
|
15
|
-
<!--! Add site-specific header -->
|
16
|
-
<div id="siteheader">
|
17
|
-
<!--! Place your header content here... -->
|
18
|
-
</div>
|
19
|
-
|
20
|
-
${select('*|text()')}
|
21
|
-
|
22
|
-
<!--! Add site-specific footer -->
|
23
|
-
<div id="sitefooter">
|
24
|
-
<!--! Place your footer content here... -->
|
25
|
-
</div>
|
26
|
-
</body>
|
27
|
-
</html>
|
@@ -1,86 +0,0 @@
|
|
1
|
-
<!DOCTYPE html
|
2
|
-
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
3
|
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
4
|
-
<html xmlns="http://www.w3.org/1999/xhtml"
|
5
|
-
xmlns:xi="http://www.w3.org/2001/XInclude"
|
6
|
-
xmlns:py="http://genshi.edgewall.org/"
|
7
|
-
py:strip="">
|
8
|
-
|
9
|
-
<div py:def="navigation(category)" id="${category}" class="nav">
|
10
|
-
<ul py:if="chrome.nav[category]">
|
11
|
-
<li py:for="idx, item in enumerate(chrome.nav[category])"
|
12
|
-
class="${classes(first_last(idx, chrome.nav[category]), active=item.active)
|
13
|
-
}">${item.label}</li>
|
14
|
-
</ul>
|
15
|
-
</div>
|
16
|
-
|
17
|
-
<py:match path="body" once="true" buffer="false"><body>
|
18
|
-
<div id="banner">
|
19
|
-
<div id="header" py:choose="">
|
20
|
-
<a py:when="chrome.logo.src" id="logo" href="${chrome.logo.link or href.wiki(
|
21
|
-
'TracIni')+'#header_logo-section'}"><img
|
22
|
-
src="${chrome.logo.src}" alt="${chrome.logo.alt}"
|
23
|
-
height="${chrome.logo.height or None}" width="${chrome.logo.width or None}"
|
24
|
-
/></a>
|
25
|
-
<h1 py:otherwise=""><a href="${chrome.logo.link}">${project.name}</a></h1>
|
26
|
-
</div>
|
27
|
-
<form id="search" action="${href.search()}" method="get">
|
28
|
-
<div py:if="'SEARCH_VIEW' in perm">
|
29
|
-
<label for="proj-search">Search:</label>
|
30
|
-
<input type="text" id="proj-search" name="q" size="18" accesskey="f" value=
|
31
|
-
"" />
|
32
|
-
<input type="submit" value="Search" />
|
33
|
-
</div>
|
34
|
-
</form>
|
35
|
-
${navigation('metanav')}
|
36
|
-
</div>
|
37
|
-
${navigation('mainnav')}
|
38
|
-
|
39
|
-
<div id="main">
|
40
|
-
<div id="ctxtnav" class="nav">
|
41
|
-
<h2>Context Navigation</h2>
|
42
|
-
<ul py:if="chrome.ctxtnav">
|
43
|
-
<li py:for="i, elm in enumerate(chrome.ctxtnav)"
|
44
|
-
class="${classes(first_last(i, chrome.ctxtnav))}">$elm</li>
|
45
|
-
</ul>
|
46
|
-
<hr />
|
47
|
-
</div>
|
48
|
-
<div id="warning" py:if="chrome.warnings" class="system-message">
|
49
|
-
<py:choose test="len(chrome.warnings)">
|
50
|
-
<py:when test="1">
|
51
|
-
<strong>Warning:</strong> ${chrome.warnings[0]}
|
52
|
-
</py:when>
|
53
|
-
<py:otherwise>
|
54
|
-
<strong>Warnings:</strong>
|
55
|
-
<ul><li py:for="w in chrome.warnings">$w</li></ul>
|
56
|
-
</py:otherwise>
|
57
|
-
</py:choose>
|
58
|
-
</div>
|
59
|
-
<div id="notice" py:if="chrome.notices" class="system-message">
|
60
|
-
<py:choose test="len(chrome.notices)">
|
61
|
-
<py:when test="1">
|
62
|
-
<strong>Notice:</strong> ${chrome.notices[0]}
|
63
|
-
</py:when>
|
64
|
-
<py:otherwise>
|
65
|
-
<strong>Notices:</strong>
|
66
|
-
<ul><li py:for="w in chrome.notices">$w</li></ul>
|
67
|
-
</py:otherwise>
|
68
|
-
</py:choose>
|
69
|
-
</div>
|
70
|
-
|
71
|
-
${select('*|text()')}
|
72
|
-
</div>
|
73
|
-
|
74
|
-
<div id="footer" xml:lang="en"><hr/>
|
75
|
-
<a id="tracpowered" href="http://trac.edgewall.org/"><img
|
76
|
-
src="${chrome.htdocs_location}trac_logo_mini.png" height="30"
|
77
|
-
width="107" alt="Trac Powered"/></a>
|
78
|
-
<p class="left">
|
79
|
-
Powered by <a href="${href.about()}"><strong>Trac ${trac.version}</strong></a
|
80
|
-
><br />
|
81
|
-
By <a href="http://www.edgewall.org/">Edgewall Software</a>.
|
82
|
-
</p>
|
83
|
-
<p class="right">${chrome.footer}</p>
|
84
|
-
</div>
|
85
|
-
</body></py:match>
|
86
|
-
</html>
|