grat 0.1.2 → 0.1.3
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/README.rdoc +14 -14
- data/VERSION +1 -1
- data/doc/created.rid +1 -0
- data/doc/files/README_rdoc.html +203 -0
- data/doc/fr_class_index.html +26 -0
- data/doc/fr_file_index.html +27 -0
- data/doc/fr_method_index.html +26 -0
- data/doc/index.html +24 -0
- data/doc/rdoc-style.css +208 -0
- data/lib/grat.rb +29 -6
- data/public/gratfiles/application.js +21 -0
- data/public/gratfiles/custom.css +31 -1
- data/views/content_form.haml +2 -2
- data/views/list.haml +6 -1
- metadata +11 -4
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
=
|
1
|
+
= Grat
|
2
2
|
|
3
3
|
Grat is a minimal content management dealy.
|
4
4
|
|
@@ -12,16 +12,16 @@ Use it like so:
|
|
12
12
|
1. Install gem (may need to set up gemcutter)
|
13
13
|
2. Fresh directory
|
14
14
|
3. config.ru file containing:
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
require 'rubygems'
|
16
|
+
require 'rack'
|
17
|
+
require 'grat'
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
Grat.database_conf # uses defaults, database=grat_development
|
20
|
+
# to override:
|
21
|
+
# Grat.database_conf(:host => 'localhost', :database => 'grat_special')
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
use Rack::ShowExceptions # <- Up to you.
|
24
|
+
run Grat::Application
|
25
25
|
4. rackup (or passenger, if you know how)
|
26
26
|
|
27
27
|
5. http://localhost:9292/__admin/edit/mypage edits a page that will be available at http://localhost:9292/mypage
|
@@ -30,13 +30,13 @@ Use it like so:
|
|
30
30
|
8. http://localhost:9292/__admin/import to import one of those dumps
|
31
31
|
|
32
32
|
9. Protect from writes by strangers with Rack::If
|
33
|
-
|
33
|
+
# http://github.com/samsm/Rackif
|
34
34
|
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
use Rack::If, :method => /(POST)|(PUT)|(DELETE)/ do
|
36
|
+
use Rack::Auth::Basic, "Grat protected" do |username, password|
|
37
|
+
'secret' == password
|
38
|
+
end
|
38
39
|
end
|
39
|
-
end
|
40
40
|
|
41
41
|
|
42
42
|
== Note on Patches/Pull Requests
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.3
|
data/doc/created.rid
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Wed, 18 Nov 2009 19:10:57 -0500
|
@@ -0,0 +1,203 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
5
|
+
|
6
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
7
|
+
<head>
|
8
|
+
<title>File: README.rdoc</title>
|
9
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
10
|
+
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
11
|
+
<link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
|
12
|
+
<script type="text/javascript">
|
13
|
+
// <![CDATA[
|
14
|
+
|
15
|
+
function popupCode( url ) {
|
16
|
+
window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
|
17
|
+
}
|
18
|
+
|
19
|
+
function toggleCode( id ) {
|
20
|
+
if ( document.getElementById )
|
21
|
+
elem = document.getElementById( id );
|
22
|
+
else if ( document.all )
|
23
|
+
elem = eval( "document.all." + id );
|
24
|
+
else
|
25
|
+
return false;
|
26
|
+
|
27
|
+
elemStyle = elem.style;
|
28
|
+
|
29
|
+
if ( elemStyle.display != "block" ) {
|
30
|
+
elemStyle.display = "block"
|
31
|
+
} else {
|
32
|
+
elemStyle.display = "none"
|
33
|
+
}
|
34
|
+
|
35
|
+
return true;
|
36
|
+
}
|
37
|
+
|
38
|
+
// Make codeblocks hidden by default
|
39
|
+
document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
|
40
|
+
|
41
|
+
// ]]>
|
42
|
+
</script>
|
43
|
+
|
44
|
+
</head>
|
45
|
+
<body>
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
<div id="fileHeader">
|
50
|
+
<h1>README.rdoc</h1>
|
51
|
+
<table class="header-table">
|
52
|
+
<tr class="top-aligned-row">
|
53
|
+
<td><strong>Path:</strong></td>
|
54
|
+
<td>README.rdoc
|
55
|
+
</td>
|
56
|
+
</tr>
|
57
|
+
<tr class="top-aligned-row">
|
58
|
+
<td><strong>Last Update:</strong></td>
|
59
|
+
<td>Wed Nov 18 19:10:52 -0500 2009</td>
|
60
|
+
</tr>
|
61
|
+
</table>
|
62
|
+
</div>
|
63
|
+
<!-- banner header -->
|
64
|
+
|
65
|
+
<div id="bodyContent">
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
<div id="contextContent">
|
70
|
+
|
71
|
+
<div id="description">
|
72
|
+
<h1>Grat</h1>
|
73
|
+
<p>
|
74
|
+
Grat is a minimal content management dealy.
|
75
|
+
</p>
|
76
|
+
<p>
|
77
|
+
It runs on Rack and uses MongoDB for wicked flexibility.
|
78
|
+
</p>
|
79
|
+
<p>
|
80
|
+
Woo.
|
81
|
+
</p>
|
82
|
+
<h2>Get setup</h2>
|
83
|
+
<p>
|
84
|
+
Use it like so:
|
85
|
+
</p>
|
86
|
+
<ol>
|
87
|
+
<li>Install gem (may need to set up gemcutter)
|
88
|
+
|
89
|
+
</li>
|
90
|
+
<li>Fresh directory
|
91
|
+
|
92
|
+
</li>
|
93
|
+
<li>config.ru file containing:
|
94
|
+
|
95
|
+
<pre>
|
96
|
+
require 'rubygems'
|
97
|
+
require 'rack'
|
98
|
+
require 'grat'
|
99
|
+
|
100
|
+
Grat.database_conf # uses defaults, database=grat_development
|
101
|
+
# to override:
|
102
|
+
# Grat.database_conf(:host => 'localhost', :database => 'grat_special')
|
103
|
+
|
104
|
+
use Rack::ShowExceptions # <- Up to you.
|
105
|
+
run Grat::Application
|
106
|
+
</pre>
|
107
|
+
</li>
|
108
|
+
<li>rackup (or passenger, if you know how)
|
109
|
+
|
110
|
+
</li>
|
111
|
+
<li><a
|
112
|
+
href="http://localhost:9292/__admin/edit/mypage">localhost:9292/__admin/edit/mypage</a>
|
113
|
+
edits a page that will be available at <a
|
114
|
+
href="http://localhost:9292/mypage">localhost:9292/mypage</a>
|
115
|
+
|
116
|
+
</li>
|
117
|
+
<li><a href="http://localhost:9292/__admin/all">localhost:9292/__admin/all</a>
|
118
|
+
for a list of all pages
|
119
|
+
|
120
|
+
</li>
|
121
|
+
<li><a
|
122
|
+
href="http://localhost:9292/__admin/export">localhost:9292/__admin/export</a>
|
123
|
+
to get a json dump of all pages
|
124
|
+
|
125
|
+
</li>
|
126
|
+
<li><a
|
127
|
+
href="http://localhost:9292/__admin/import">localhost:9292/__admin/import</a>
|
128
|
+
to import one of those dumps
|
129
|
+
|
130
|
+
</li>
|
131
|
+
<li>Protect from writes by strangers with Rack::If
|
132
|
+
|
133
|
+
<pre>
|
134
|
+
# http://github.com/samsm/Rackif
|
135
|
+
|
136
|
+
use Rack::If, :method => /(POST)|(PUT)|(DELETE)/ do
|
137
|
+
use Rack::Auth::Basic, "Grat protected" do |username, password|
|
138
|
+
'secret' == password
|
139
|
+
end
|
140
|
+
end
|
141
|
+
</pre>
|
142
|
+
</li>
|
143
|
+
</ol>
|
144
|
+
<h2>Note on Patches/Pull Requests</h2>
|
145
|
+
<ul>
|
146
|
+
<li>Fork the project.
|
147
|
+
|
148
|
+
</li>
|
149
|
+
<li>Make your feature addition or bug fix.
|
150
|
+
|
151
|
+
</li>
|
152
|
+
<li>Add tests for it. This is important so I don‘t break it in a future
|
153
|
+
version unintentionally.
|
154
|
+
|
155
|
+
</li>
|
156
|
+
<li>Commit, do not mess with rakefile, version, or history. (if you want to
|
157
|
+
have your own version, that is fine but
|
158
|
+
|
159
|
+
<pre>
|
160
|
+
bump version in a commit by itself I can ignore when I pull)
|
161
|
+
</pre>
|
162
|
+
</li>
|
163
|
+
<li>Send me a pull request. Bonus points for topic branches.
|
164
|
+
|
165
|
+
</li>
|
166
|
+
</ul>
|
167
|
+
<h2>Copyright</h2>
|
168
|
+
<p>
|
169
|
+
Copyright (c) 2009 Sam Schenkman-Moore. See LICENSE for details.
|
170
|
+
</p>
|
171
|
+
|
172
|
+
</div>
|
173
|
+
|
174
|
+
|
175
|
+
</div>
|
176
|
+
|
177
|
+
|
178
|
+
</div>
|
179
|
+
|
180
|
+
|
181
|
+
<!-- if includes -->
|
182
|
+
|
183
|
+
<div id="section">
|
184
|
+
|
185
|
+
|
186
|
+
|
187
|
+
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
<!-- if method_list -->
|
193
|
+
|
194
|
+
|
195
|
+
</div>
|
196
|
+
|
197
|
+
|
198
|
+
<div id="validator-badges">
|
199
|
+
<p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
|
200
|
+
</div>
|
201
|
+
|
202
|
+
</body>
|
203
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Classes
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Classes</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Classes</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,27 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Files
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Files</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Files</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
<a href="files/README_rdoc.html">README.rdoc</a><br />
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</body>
|
27
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
|
2
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
3
|
+
<!DOCTYPE html
|
4
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
5
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
6
|
+
|
7
|
+
<!--
|
8
|
+
|
9
|
+
Methods
|
10
|
+
|
11
|
+
-->
|
12
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
13
|
+
<head>
|
14
|
+
<title>Methods</title>
|
15
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
16
|
+
<link rel="stylesheet" href="rdoc-style.css" type="text/css" />
|
17
|
+
<base target="docwin" />
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div id="index">
|
21
|
+
<h1 class="section-bar">Methods</h1>
|
22
|
+
<div id="index-entries">
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
data/doc/index.html
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
<?xml version="1.0" encoding="iso-8859-1"?>
|
2
|
+
<!DOCTYPE html
|
3
|
+
PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
|
4
|
+
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
|
5
|
+
|
6
|
+
<!--
|
7
|
+
|
8
|
+
RDoc Documentation
|
9
|
+
|
10
|
+
-->
|
11
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
12
|
+
<head>
|
13
|
+
<title>RDoc Documentation</title>
|
14
|
+
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
15
|
+
</head>
|
16
|
+
<frameset rows="20%, 80%">
|
17
|
+
<frameset cols="25%,35%,45%">
|
18
|
+
<frame src="fr_file_index.html" title="Files" name="Files" />
|
19
|
+
<frame src="fr_class_index.html" name="Classes" />
|
20
|
+
<frame src="fr_method_index.html" name="Methods" />
|
21
|
+
</frameset>
|
22
|
+
<frame src="files/README_rdoc.html" name="docwin" />
|
23
|
+
</frameset>
|
24
|
+
</html>
|
data/doc/rdoc-style.css
ADDED
@@ -0,0 +1,208 @@
|
|
1
|
+
|
2
|
+
body {
|
3
|
+
font-family: Verdana,Arial,Helvetica,sans-serif;
|
4
|
+
font-size: 90%;
|
5
|
+
margin: 0;
|
6
|
+
margin-left: 40px;
|
7
|
+
padding: 0;
|
8
|
+
background: white;
|
9
|
+
}
|
10
|
+
|
11
|
+
h1,h2,h3,h4 { margin: 0; color: #efefef; background: transparent; }
|
12
|
+
h1 { font-size: 150%; }
|
13
|
+
h2,h3,h4 { margin-top: 1em; }
|
14
|
+
|
15
|
+
a { background: #eef; color: #039; text-decoration: none; }
|
16
|
+
a:hover { background: #039; color: #eef; }
|
17
|
+
|
18
|
+
/* Override the base stylesheet's Anchor inside a table cell */
|
19
|
+
td > a {
|
20
|
+
background: transparent;
|
21
|
+
color: #039;
|
22
|
+
text-decoration: none;
|
23
|
+
}
|
24
|
+
|
25
|
+
/* and inside a section title */
|
26
|
+
.section-title > a {
|
27
|
+
background: transparent;
|
28
|
+
color: #eee;
|
29
|
+
text-decoration: none;
|
30
|
+
}
|
31
|
+
|
32
|
+
/* === Structural elements =================================== */
|
33
|
+
|
34
|
+
div#index {
|
35
|
+
margin: 0;
|
36
|
+
margin-left: -40px;
|
37
|
+
padding: 0;
|
38
|
+
font-size: 90%;
|
39
|
+
}
|
40
|
+
|
41
|
+
|
42
|
+
div#index a {
|
43
|
+
margin-left: 0.7em;
|
44
|
+
}
|
45
|
+
|
46
|
+
div#index .section-bar {
|
47
|
+
margin-left: 0px;
|
48
|
+
padding-left: 0.7em;
|
49
|
+
background: #ccc;
|
50
|
+
font-size: small;
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
div#classHeader, div#fileHeader {
|
55
|
+
width: auto;
|
56
|
+
color: white;
|
57
|
+
padding: 0.5em 1.5em 0.5em 1.5em;
|
58
|
+
margin: 0;
|
59
|
+
margin-left: -40px;
|
60
|
+
border-bottom: 3px solid #006;
|
61
|
+
}
|
62
|
+
|
63
|
+
div#classHeader a, div#fileHeader a {
|
64
|
+
background: inherit;
|
65
|
+
color: white;
|
66
|
+
}
|
67
|
+
|
68
|
+
div#classHeader td, div#fileHeader td {
|
69
|
+
background: inherit;
|
70
|
+
color: white;
|
71
|
+
}
|
72
|
+
|
73
|
+
|
74
|
+
div#fileHeader {
|
75
|
+
background: #057;
|
76
|
+
}
|
77
|
+
|
78
|
+
div#classHeader {
|
79
|
+
background: #048;
|
80
|
+
}
|
81
|
+
|
82
|
+
|
83
|
+
.class-name-in-header {
|
84
|
+
font-size: 180%;
|
85
|
+
font-weight: bold;
|
86
|
+
}
|
87
|
+
|
88
|
+
|
89
|
+
div#bodyContent {
|
90
|
+
padding: 0 1.5em 0 1.5em;
|
91
|
+
}
|
92
|
+
|
93
|
+
div#description {
|
94
|
+
padding: 0.5em 1.5em;
|
95
|
+
background: #efefef;
|
96
|
+
border: 1px dotted #999;
|
97
|
+
}
|
98
|
+
|
99
|
+
div#description h1,h2,h3,h4,h5,h6 {
|
100
|
+
color: #125;;
|
101
|
+
background: transparent;
|
102
|
+
}
|
103
|
+
|
104
|
+
div#validator-badges {
|
105
|
+
text-align: center;
|
106
|
+
}
|
107
|
+
div#validator-badges img { border: 0; }
|
108
|
+
|
109
|
+
div#copyright {
|
110
|
+
color: #333;
|
111
|
+
background: #efefef;
|
112
|
+
font: 0.75em sans-serif;
|
113
|
+
margin-top: 5em;
|
114
|
+
margin-bottom: 0;
|
115
|
+
padding: 0.5em 2em;
|
116
|
+
}
|
117
|
+
|
118
|
+
|
119
|
+
/* === Classes =================================== */
|
120
|
+
|
121
|
+
table.header-table {
|
122
|
+
color: white;
|
123
|
+
font-size: small;
|
124
|
+
}
|
125
|
+
|
126
|
+
.type-note {
|
127
|
+
font-size: small;
|
128
|
+
color: #DEDEDE;
|
129
|
+
}
|
130
|
+
|
131
|
+
.xxsection-bar {
|
132
|
+
background: #eee;
|
133
|
+
color: #333;
|
134
|
+
padding: 3px;
|
135
|
+
}
|
136
|
+
|
137
|
+
.section-bar {
|
138
|
+
color: #333;
|
139
|
+
border-bottom: 1px solid #999;
|
140
|
+
margin-left: -20px;
|
141
|
+
}
|
142
|
+
|
143
|
+
|
144
|
+
.section-title {
|
145
|
+
background: #79a;
|
146
|
+
color: #eee;
|
147
|
+
padding: 3px;
|
148
|
+
margin-top: 2em;
|
149
|
+
margin-left: -30px;
|
150
|
+
border: 1px solid #999;
|
151
|
+
}
|
152
|
+
|
153
|
+
.top-aligned-row { vertical-align: top }
|
154
|
+
.bottom-aligned-row { vertical-align: bottom }
|
155
|
+
|
156
|
+
/* --- Context section classes ----------------------- */
|
157
|
+
|
158
|
+
.context-row { }
|
159
|
+
.context-item-name { font-family: monospace; font-weight: bold; color: black; }
|
160
|
+
.context-item-value { font-size: small; color: #448; }
|
161
|
+
.context-item-desc { color: #333; padding-left: 2em; }
|
162
|
+
|
163
|
+
/* --- Method classes -------------------------- */
|
164
|
+
.method-detail {
|
165
|
+
background: #efefef;
|
166
|
+
padding: 0;
|
167
|
+
margin-top: 0.5em;
|
168
|
+
margin-bottom: 1em;
|
169
|
+
border: 1px dotted #ccc;
|
170
|
+
}
|
171
|
+
.method-heading {
|
172
|
+
color: black;
|
173
|
+
background: #ccc;
|
174
|
+
border-bottom: 1px solid #666;
|
175
|
+
padding: 0.2em 0.5em 0 0.5em;
|
176
|
+
}
|
177
|
+
.method-signature { color: black; background: inherit; }
|
178
|
+
.method-name { font-weight: bold; }
|
179
|
+
.method-args { font-style: italic; }
|
180
|
+
.method-description { padding: 0 0.5em 0 0.5em; }
|
181
|
+
|
182
|
+
/* --- Source code sections -------------------- */
|
183
|
+
|
184
|
+
a.source-toggle { font-size: 90%; }
|
185
|
+
div.method-source-code {
|
186
|
+
background: #262626;
|
187
|
+
color: #ffdead;
|
188
|
+
margin: 1em;
|
189
|
+
padding: 0.5em;
|
190
|
+
border: 1px dashed #999;
|
191
|
+
overflow: hidden;
|
192
|
+
}
|
193
|
+
|
194
|
+
div.method-source-code pre { color: #ffdead; overflow: hidden; }
|
195
|
+
|
196
|
+
/* --- Ruby keyword styles --------------------- */
|
197
|
+
|
198
|
+
.standalone-code { background: #221111; color: #ffdead; overflow: hidden; }
|
199
|
+
|
200
|
+
.ruby-constant { color: #7fffd4; background: transparent; }
|
201
|
+
.ruby-keyword { color: #00ffff; background: transparent; }
|
202
|
+
.ruby-ivar { color: #eedd82; background: transparent; }
|
203
|
+
.ruby-operator { color: #00ffee; background: transparent; }
|
204
|
+
.ruby-identifier { color: #ffdead; background: transparent; }
|
205
|
+
.ruby-node { color: #ffa07a; background: transparent; }
|
206
|
+
.ruby-comment { color: #b22222; font-weight: bold; background: transparent; }
|
207
|
+
.ruby-regexp { color: #ffa07a; background: transparent; }
|
208
|
+
.ruby-value { color: #7fffd4; background: transparent; }
|
data/lib/grat.rb
CHANGED
@@ -84,6 +84,24 @@ class Grat::Application < Sinatra::Base
|
|
84
84
|
haml :delete
|
85
85
|
end
|
86
86
|
|
87
|
+
get '/__admin/new' do
|
88
|
+
url = params[:url]
|
89
|
+
if url.to_s[/./]
|
90
|
+
if url[/\A\//] # begins with a slash
|
91
|
+
redirect edit_path(url)
|
92
|
+
else # add the slash ourselves
|
93
|
+
redirect edit_path("/#{url}")
|
94
|
+
end
|
95
|
+
else
|
96
|
+
@content = model.find_by_url '/new-page/1'
|
97
|
+
if @content
|
98
|
+
redirect edit_path(next_content_url)
|
99
|
+
else
|
100
|
+
redirect edit_path('/new-page/1')
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
87
105
|
put '/*' do
|
88
106
|
content.update_attributes(focus_params)
|
89
107
|
redirect edit_path(content.url)
|
@@ -104,14 +122,19 @@ class Grat::Application < Sinatra::Base
|
|
104
122
|
end
|
105
123
|
|
106
124
|
def next_content_url
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
125
|
+
current_content = content
|
126
|
+
new_url = '/broken'
|
127
|
+
while current_content
|
128
|
+
url = current_content.url
|
129
|
+
number = url[/\d*\Z/]
|
130
|
+
next_number = number.to_i + 1
|
131
|
+
new_url = url.sub(/\d*\Z/, next_number.to_s)
|
132
|
+
current_content = model.find_by_url(url.sub(/\d*\Z/, next_number.to_s))
|
133
|
+
end
|
111
134
|
if content.template_url
|
112
|
-
|
135
|
+
new_url + '?template=' + content.template_url
|
113
136
|
else
|
114
|
-
|
137
|
+
new_url
|
115
138
|
end
|
116
139
|
end
|
117
140
|
|
@@ -1,5 +1,26 @@
|
|
1
1
|
// once page is loaded ...
|
2
2
|
$(document).ready(function(){
|
3
|
+
|
4
|
+
// Collapse fields
|
5
|
+
$('.collapsable').each(function() {
|
6
|
+
parent_div = $(this);
|
7
|
+
collapse_link = $(' <a href="#collapse" class="collapser">collapse</a> ')
|
8
|
+
collapse_link.filter('a').click(function() {
|
9
|
+
$(this).parent().addClass('activeCollapse');
|
10
|
+
return false;
|
11
|
+
});
|
12
|
+
expand_link = $(' <a href="#expand" class="expander">expand</a> ')
|
13
|
+
expand_link.filter('a').click(function() {
|
14
|
+
$(this).parent().removeClass('activeCollapse');
|
15
|
+
return false;
|
16
|
+
});
|
17
|
+
parent_div.children().filter('label').after(expand_link).after(collapse_link);
|
18
|
+
if (parent_div.hasClass('collapsed')) {
|
19
|
+
parent_div.addClass('activeCollapse');
|
20
|
+
}
|
21
|
+
})
|
22
|
+
|
23
|
+
// Add fields for selected template.
|
3
24
|
$('.template select').change(function() {
|
4
25
|
// if template has url
|
5
26
|
selected_option = $(this).val()
|
data/public/gratfiles/custom.css
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* @override
|
1
|
+
/* @override
|
2
2
|
http://localhost:9393/custom.css
|
3
3
|
http://grat.local/css/custom.css
|
4
4
|
http://localhost:9393/gratfiles/custom.css
|
@@ -51,3 +51,33 @@ input[type=radio] {
|
|
51
51
|
float: left;
|
52
52
|
margin-top: .25em;
|
53
53
|
}
|
54
|
+
|
55
|
+
.new_page input {
|
56
|
+
width: 33%;
|
57
|
+
}
|
58
|
+
.new_page input[type=submit] {
|
59
|
+
width: 6em;
|
60
|
+
}
|
61
|
+
a.collapse {
|
62
|
+
font-size: 1em;
|
63
|
+
font-weight: normal;
|
64
|
+
}
|
65
|
+
|
66
|
+
.activeCollapse textarea {
|
67
|
+
display: none;
|
68
|
+
}
|
69
|
+
|
70
|
+
.activeCollapse .collapser {
|
71
|
+
display:none;
|
72
|
+
}
|
73
|
+
|
74
|
+
.expander {
|
75
|
+
display: none;
|
76
|
+
}
|
77
|
+
|
78
|
+
.activeCollapse .expander {
|
79
|
+
display: inline;
|
80
|
+
}
|
81
|
+
.expander, .collapser {
|
82
|
+
margin-left: 1em;
|
83
|
+
}
|
data/views/content_form.haml
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
.url
|
24
24
|
%label{:for => form_nest('url')} Url
|
25
25
|
%input{:name => form_nest('url'), :value => content.url}
|
26
|
-
.content
|
26
|
+
.content.collapsable
|
27
27
|
%label{:for => form_nest('content')} Content
|
28
28
|
%textarea{:name => form_nest('content')}= content.content
|
29
29
|
.tags
|
@@ -45,6 +45,6 @@
|
|
45
45
|
.submit
|
46
46
|
%input{:name => form_nest('submit'), :type => 'submit', :value => "Let's save this thing"}
|
47
47
|
%input{:name => form_nest('submit'), :type => 'submit', :value => "Save and make another"}
|
48
|
-
.defaults
|
48
|
+
.defaults.collapsable.collapsed
|
49
49
|
%label{:for => form_nest('default_content_vars')} Default Content
|
50
50
|
%textarea{:id => 'default_content_vars', :name => form_nest('default_content_vars')}= content.default_content_vars.to_json
|
data/views/list.haml
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
.grat_greet
|
2
2
|
%p Great. Here's everything. Hope you're happy.
|
3
|
-
%
|
3
|
+
%h2 Make a new page
|
4
|
+
.new_page
|
5
|
+
%form{:action => "/__admin/new"}
|
6
|
+
%input{:name => 'url'}
|
7
|
+
%input{:name => "submit", :value=>'New Page', :type => 'submit'}
|
8
|
+
%h2 Pages
|
4
9
|
%ol
|
5
10
|
- @pages.each do |page|
|
6
11
|
%li
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grat
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Schenkman-Moore
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-11-
|
12
|
+
date: 2009-11-21 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -73,9 +73,18 @@ extra_rdoc_files:
|
|
73
73
|
- README.rdoc
|
74
74
|
files:
|
75
75
|
- .gitignore
|
76
|
+
- LICENSE
|
77
|
+
- README.rdoc
|
76
78
|
- Rakefile
|
77
79
|
- VERSION
|
78
80
|
- config.ru
|
81
|
+
- doc/created.rid
|
82
|
+
- doc/files/README_rdoc.html
|
83
|
+
- doc/fr_class_index.html
|
84
|
+
- doc/fr_file_index.html
|
85
|
+
- doc/fr_method_index.html
|
86
|
+
- doc/index.html
|
87
|
+
- doc/rdoc-style.css
|
79
88
|
- lib/environment.rb
|
80
89
|
- lib/grat.rb
|
81
90
|
- lib/grat/content.rb
|
@@ -127,8 +136,6 @@ files:
|
|
127
136
|
- views/layout.haml
|
128
137
|
- views/list.haml
|
129
138
|
- views/missing.haml
|
130
|
-
- LICENSE
|
131
|
-
- README.rdoc
|
132
139
|
has_rdoc: true
|
133
140
|
homepage: http://github.com/samsm/grat
|
134
141
|
licenses: []
|