karottenreibe-qwicky 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/HISTORY.txt +14 -0
- data/LICENSE.txt +22 -0
- data/README.txt +112 -0
- data/bin/qwicky +543 -0
- data/qwicky.gemspec +44 -0
- metadata +106 -0
data/HISTORY.txt
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
/*---- DON'T PANIC License 1.1 -----------
|
2
|
+
|
3
|
+
Don't panic, this piece of software is
|
4
|
+
free, i.e. you can do with it whatever
|
5
|
+
you like, including, but not limited to:
|
6
|
+
|
7
|
+
* using it
|
8
|
+
* copying it
|
9
|
+
* (re)distributing it
|
10
|
+
* burning/burying/shredding it
|
11
|
+
* eating it
|
12
|
+
* using it to obtain world domination
|
13
|
+
* and ignoring it
|
14
|
+
|
15
|
+
Under the sole condition that you
|
16
|
+
|
17
|
+
* CONSIDER buying the author a strong
|
18
|
+
brownian motion producer, say a nice
|
19
|
+
hot cup of tea, should you ever meet
|
20
|
+
him in person.
|
21
|
+
|
22
|
+
----------------------------------------*/
|
data/README.txt
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
Share and enjoy!
|
2
|
+
================
|
3
|
+
|
4
|
+
Hi dear visitor, this is the README file of
|
5
|
+
**[Qwicky] [2]**, the REALLY quick wiki. (and
|
6
|
+
small as well!)
|
7
|
+
|
8
|
+
You are obviously reading this, so the README
|
9
|
+
has already fulfilled it's purpose. Feel free
|
10
|
+
to close this file now.
|
11
|
+
|
12
|
+
If, of course, you'd like to know how Qwicky
|
13
|
+
is to be operated, feel also free to read on!
|
14
|
+
|
15
|
+
Contributing
|
16
|
+
------------
|
17
|
+
|
18
|
+
Got a patch? Found a bug? Need a feature?
|
19
|
+
Let me know!
|
20
|
+
|
21
|
+
karottenreibe _at_ gmail _dot_ com
|
22
|
+
|
23
|
+
Usage
|
24
|
+
-----
|
25
|
+
|
26
|
+
1. Start it:
|
27
|
+
|
28
|
+
qwicky
|
29
|
+
|
30
|
+
2. Open it in your browser
|
31
|
+
|
32
|
+
http://localhost:4567
|
33
|
+
|
34
|
+
3. Set the page you want to be displayed when
|
35
|
+
starting Qwicky, set the Markup language
|
36
|
+
you want to use, press save.
|
37
|
+
|
38
|
+
4. Enjoy! (and don't forget to share...)
|
39
|
+
|
40
|
+
BTW, did I mention that you can tell qwicky
|
41
|
+
where to put the wiki database and settings
|
42
|
+
file?
|
43
|
+
|
44
|
+
qwicky -- some/dir/to/put/the/files/in
|
45
|
+
|
46
|
+
Oh, and also try
|
47
|
+
|
48
|
+
qwicky --help
|
49
|
+
|
50
|
+
for additional options...
|
51
|
+
|
52
|
+
Markup
|
53
|
+
------
|
54
|
+
|
55
|
+
There's only one catch to markup: If you want
|
56
|
+
something other than plain text and RDoc (which
|
57
|
+
is most probably already installed on your system),
|
58
|
+
you'll have to install the gems yourself.
|
59
|
+
This is to not introduce any unnecessary gems to
|
60
|
+
your system.
|
61
|
+
|
62
|
+
But DON'T PANIC, it's easy:
|
63
|
+
|
64
|
+
* For Markdown, you can do
|
65
|
+
|
66
|
+
gem install rdiscount
|
67
|
+
|
68
|
+
or any of the other nice Markdown libraries, e.g.
|
69
|
+
Maruku, peg-markdown etc.
|
70
|
+
I wouldn't recommend BlueCloth, unless you really
|
71
|
+
think you need that, see [this Blog post] [1].
|
72
|
+
(As you might have already guessed from the layout
|
73
|
+
of this document, I prefer Markdown. But it's your
|
74
|
+
choice.)
|
75
|
+
|
76
|
+
* For Textile, you can do
|
77
|
+
|
78
|
+
gem install redcloth
|
79
|
+
|
80
|
+
Qwicky will automatically pick out the right gem to
|
81
|
+
require.
|
82
|
+
|
83
|
+
Links
|
84
|
+
-----
|
85
|
+
|
86
|
+
To link to other wiki pages, use the old, familiar
|
87
|
+
|
88
|
+
[[other page]]
|
89
|
+
[[other page|title]]
|
90
|
+
|
91
|
+
syntax.
|
92
|
+
|
93
|
+
Styles
|
94
|
+
------
|
95
|
+
|
96
|
+
If you don't like the looks of Qwicky -- no, of course
|
97
|
+
that's impossible... silly...
|
98
|
+
|
99
|
+
But in any case, if you create a file called _qwicky.sass_
|
100
|
+
in the directory where your database and settings are
|
101
|
+
stored, qwicky will automatically run it through
|
102
|
+
[Sass] [3] and apply it.
|
103
|
+
|
104
|
+
****
|
105
|
+
|
106
|
+
[1]: http://tomayko.com/writings/ruby-markdown-libraries-real-cheap-for-you-two-for-price-of-one
|
107
|
+
"Post about why not to use BlueCloth"
|
108
|
+
[2]: http://github.com/karottenreibe/qwicky/
|
109
|
+
"Qwicky's Homepage/Git repo/Wiki/whatever :-)"
|
110
|
+
[3]: http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html
|
111
|
+
"Documentation of Sass syntax"
|
112
|
+
|
data/bin/qwicky
ADDED
@@ -0,0 +1,543 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
require 'fileutils'
|
4
|
+
require 'sinatra'
|
5
|
+
require 'dm-core'
|
6
|
+
require 'dm-timestamps'
|
7
|
+
require 'dm-validations'
|
8
|
+
require 'dm-aggregates'
|
9
|
+
require 'haml'
|
10
|
+
require 'sass'
|
11
|
+
require 'base64'
|
12
|
+
|
13
|
+
set :run, true
|
14
|
+
|
15
|
+
# Read working dir. {{{1
|
16
|
+
idx = ARGV.index { |arg| arg == '--' }
|
17
|
+
DIR = File.expand_path(
|
18
|
+
if idx.nil? or ARGV[idx+1].nil?
|
19
|
+
Dir.pwd
|
20
|
+
else
|
21
|
+
ARGV[idx+1]
|
22
|
+
end
|
23
|
+
)
|
24
|
+
|
25
|
+
unless File.exist?(DIR) and File.directory?(DIR)
|
26
|
+
puts "No such directory: #{DIR}"
|
27
|
+
exit -1
|
28
|
+
end
|
29
|
+
|
30
|
+
# Database stuff. {{{1
|
31
|
+
class Page
|
32
|
+
include DataMapper::Resource
|
33
|
+
|
34
|
+
property :id, Serial
|
35
|
+
property :name, Text, :nullable => false
|
36
|
+
property :content, Text, :nullable => false
|
37
|
+
end
|
38
|
+
|
39
|
+
DataMapper::setup(:default, "sqlite3://#{DIR}/qwicky.db")
|
40
|
+
DataMapper::auto_upgrade!
|
41
|
+
|
42
|
+
# Markup stuff. {{{1
|
43
|
+
module Markup
|
44
|
+
# Base class. {{{2
|
45
|
+
class Markup
|
46
|
+
class << self
|
47
|
+
attr_reader :description, :link
|
48
|
+
|
49
|
+
def markups
|
50
|
+
@@markups
|
51
|
+
end
|
52
|
+
|
53
|
+
def [] type
|
54
|
+
@@markups ||= Hash.new
|
55
|
+
@@markups[type]
|
56
|
+
end
|
57
|
+
|
58
|
+
def type id, description, link = nil
|
59
|
+
@@markups ||= Hash.new
|
60
|
+
@@markups[id] = self
|
61
|
+
@description = description
|
62
|
+
@link = link
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def description
|
67
|
+
self.class.description
|
68
|
+
end
|
69
|
+
|
70
|
+
def link
|
71
|
+
self.class.link
|
72
|
+
end
|
73
|
+
|
74
|
+
def format text
|
75
|
+
text
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Text. {{{2
|
80
|
+
class MText < Markup
|
81
|
+
type 'text', 'Simple text'
|
82
|
+
|
83
|
+
def format text
|
84
|
+
"<span style='white-space:pre'>#{text}</span>"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Markdown. {{{2
|
89
|
+
class MMarkdown < Markup
|
90
|
+
type 'markdown', 'Markdown', 'http://daringfireball.net/projects/markdown/'
|
91
|
+
|
92
|
+
def initialize
|
93
|
+
unless Object.const_defined?(:Markdown)
|
94
|
+
begin
|
95
|
+
require 'rdiscount'
|
96
|
+
return
|
97
|
+
rescue LoadError => boom
|
98
|
+
end
|
99
|
+
|
100
|
+
begin
|
101
|
+
require 'peg_markdown'
|
102
|
+
return
|
103
|
+
rescue LoadError => boom
|
104
|
+
end
|
105
|
+
|
106
|
+
begin
|
107
|
+
require 'maruku'
|
108
|
+
Object.const_set(:Markdown, Maruku)
|
109
|
+
return
|
110
|
+
rescue LoadError => boom
|
111
|
+
end
|
112
|
+
|
113
|
+
begin
|
114
|
+
require 'bluecloth'
|
115
|
+
return
|
116
|
+
rescue LoadError => boom
|
117
|
+
puts "Looks like you don't have a Markdown interpreter installed!"
|
118
|
+
puts "Please get one, like"
|
119
|
+
puts "* RDiscount"
|
120
|
+
puts "* peg-markdown"
|
121
|
+
puts "* Maruku"
|
122
|
+
puts "* BlueCloth"
|
123
|
+
puts "Reverting to simple text markup"
|
124
|
+
throw :revert
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def format text
|
130
|
+
Markdown.new(text).to_html
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
# Textile. {{{2
|
135
|
+
class MTextile < Markup
|
136
|
+
type 'textile', 'Textile', 'http://textism.com/tools/textile/'
|
137
|
+
|
138
|
+
def initialize
|
139
|
+
unless Object.const_defined?(:RedCloth)
|
140
|
+
begin
|
141
|
+
require 'redcloth'
|
142
|
+
rescue LoadError => boom
|
143
|
+
puts "Looks like you don't have RedCloth installed!"
|
144
|
+
puts "This is the gem needed to render Textile syntax"
|
145
|
+
puts "Reverting to simple text markup"
|
146
|
+
throw :revert
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def format text
|
152
|
+
RedCloth.new(text).to_html
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
# RDoc. {{{2
|
157
|
+
class MRDoc < Markup
|
158
|
+
type 'rdoc', 'RDoc', 'http://rdoc.sourceforge.net/doc/index.html'
|
159
|
+
|
160
|
+
def initialize
|
161
|
+
unless Object.const_defined?(:SM)
|
162
|
+
begin
|
163
|
+
require 'rdoc/markup/simple_markup'
|
164
|
+
require 'rdoc/markup/simple_markup/to_html'
|
165
|
+
rescue LoadError => boom
|
166
|
+
puts "Looks like you don't have RDoc installed!"
|
167
|
+
puts "This is the gem needed to render RDoc syntax"
|
168
|
+
puts "Reverting to simple text markup"
|
169
|
+
throw :revert
|
170
|
+
end
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def format text
|
175
|
+
SM::SimpleMarkup.new.convert(text, SM::ToHtml.new)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
# App class. {{{1
|
181
|
+
class Qwicky
|
182
|
+
attr_accessor :conf, :markup
|
183
|
+
|
184
|
+
def initialize
|
185
|
+
FileUtils.touch("#{DIR}/qwicky.yml")
|
186
|
+
|
187
|
+
@conf = {
|
188
|
+
'homepage' => '',
|
189
|
+
'markup' => 'text',
|
190
|
+
}.merge(
|
191
|
+
open("#{DIR}/qwicky.yml") { |f|
|
192
|
+
YAML::load(f) || Hash.new
|
193
|
+
}
|
194
|
+
)
|
195
|
+
|
196
|
+
set_markup
|
197
|
+
end
|
198
|
+
|
199
|
+
def set_markup
|
200
|
+
catch :revert do
|
201
|
+
@markup = Markup::Markup[@conf['markup']].new
|
202
|
+
return
|
203
|
+
end
|
204
|
+
|
205
|
+
@markup = Markup::Markup['text'].new
|
206
|
+
end
|
207
|
+
|
208
|
+
def format text
|
209
|
+
markup.format(text).gsub %r{\[\[([^|\]]+)(\|([^\]]+))?\]\]} do |match|
|
210
|
+
page = $3 || $1
|
211
|
+
nexist = Page.first(:name => page).nil?
|
212
|
+
klass = nexist ? 'bad' : 'good'
|
213
|
+
title = nexist ? "Create page #{page}" : "Page #{page}"
|
214
|
+
link = '/' + page
|
215
|
+
"<a href=#{link.inspect} title=#{title.inspect} class='#{klass}'>#{$1}</a>"
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
APP = Qwicky.new
|
221
|
+
|
222
|
+
# Routes. {{{1
|
223
|
+
helpers do
|
224
|
+
def redirect_home
|
225
|
+
if APP.conf['homepage'].empty?
|
226
|
+
redirect "/..settings"
|
227
|
+
else
|
228
|
+
redirect "/#{APP.conf['homepage']}"
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
def markup text
|
233
|
+
APP.format(text)
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
before do
|
238
|
+
@editable = true
|
239
|
+
end
|
240
|
+
|
241
|
+
get '/' do
|
242
|
+
redirect_home
|
243
|
+
end
|
244
|
+
|
245
|
+
get '/..settings/?' do
|
246
|
+
@editable = false
|
247
|
+
@settings = APP.conf
|
248
|
+
@title = 'Settings'
|
249
|
+
@markups = Markup::Markup.markups
|
250
|
+
haml :settings
|
251
|
+
end
|
252
|
+
|
253
|
+
post '/..settings/?' do
|
254
|
+
APP.conf.merge!(params[:settings])
|
255
|
+
APP.set_markup
|
256
|
+
open("#{DIR}/qwicky.yml", 'w') { |f|
|
257
|
+
f.write(YAML::dump(APP.conf))
|
258
|
+
}
|
259
|
+
|
260
|
+
redirect_home
|
261
|
+
end
|
262
|
+
|
263
|
+
get '/..license/?' do
|
264
|
+
content_type 'text'
|
265
|
+
open('LICENSE').read
|
266
|
+
end
|
267
|
+
|
268
|
+
get '/..stylesheet.css' do
|
269
|
+
content_type 'text/css'
|
270
|
+
sass :stylesheet
|
271
|
+
end
|
272
|
+
|
273
|
+
get '/..user.stylesheet.css' do
|
274
|
+
content_type 'text/css'
|
275
|
+
|
276
|
+
if File.exist?("#{DIR}/qwicky.sass")
|
277
|
+
sass open("#{DIR}/qwicky.sass").read()
|
278
|
+
else
|
279
|
+
''
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
get '/..favicon' do
|
284
|
+
send_data Base64::decode64(haml(:favicon, :layout => false)),
|
285
|
+
:filename => 'favicon.png',
|
286
|
+
:type => 'image/png',
|
287
|
+
:disposition => 'inline'
|
288
|
+
end
|
289
|
+
|
290
|
+
get '/..sitemap' do
|
291
|
+
@editable = false
|
292
|
+
@title = 'Sitemap'
|
293
|
+
@pages = Page.all.sort_by { |page| page.name }
|
294
|
+
haml :sitemap
|
295
|
+
end
|
296
|
+
|
297
|
+
get '/:page/?' do |page|
|
298
|
+
@page = Page.first(:name => page)
|
299
|
+
redirect "/#{page}/edit" if @page.nil?
|
300
|
+
@title = page
|
301
|
+
haml :page
|
302
|
+
end
|
303
|
+
|
304
|
+
get '/:page/edit/?' do |page|
|
305
|
+
@markup = APP.markup
|
306
|
+
@page = Page.first(:name => page) || Page.new(:name => page)
|
307
|
+
@title = "Editing #{page}"
|
308
|
+
haml :edit
|
309
|
+
end
|
310
|
+
|
311
|
+
post '/:page/?' do |page|
|
312
|
+
@page = Page.first(:name => page) || Page.new
|
313
|
+
@page.name = params[:name]
|
314
|
+
@page.content = params[:content]
|
315
|
+
@page.save
|
316
|
+
|
317
|
+
redirect "/#{page}"
|
318
|
+
end
|
319
|
+
|
320
|
+
delete '/:page/?' do |page|
|
321
|
+
page = Page.first(:name => page)
|
322
|
+
page.destroy unless page.nil?
|
323
|
+
|
324
|
+
redirect_home
|
325
|
+
end
|
326
|
+
|
327
|
+
|
328
|
+
# Templates. {{{1
|
329
|
+
__END__
|
330
|
+
|
331
|
+
@@edit
|
332
|
+
%form{ :action => "/#{@page.name}", :method => 'post', :id => 'edit-page' }
|
333
|
+
%label{ :for => 'name' } Name
|
334
|
+
%input{ :type => 'text', :name => 'name', :value => @page.name }
|
335
|
+
%br/
|
336
|
+
.markup
|
337
|
+
Markup:
|
338
|
+
- if @markup.link.nil?
|
339
|
+
= @markup.description
|
340
|
+
- else
|
341
|
+
%a{ :title => "#{@markup.description} homepage", :href => @markup.link, :onclick => 'return external(this)' }= @markup.description
|
342
|
+
%label{ :for => 'content' } Content
|
343
|
+
%br/
|
344
|
+
%textarea{ :name => 'content' }= @page.content
|
345
|
+
%br/
|
346
|
+
%input{ :type => 'submit', :value => 'Save!' }
|
347
|
+
|
348
|
+
%form{ :action => "/#{@page.name}", :method => 'post', :onsubmit => 'return confirm("Are you sure you want to delete this page?")' }
|
349
|
+
%input{ :type => 'hidden', :name => '_method', :value => 'delete' }
|
350
|
+
%input{ :type => 'submit', :value => 'Delete this page!' }
|
351
|
+
|
352
|
+
|
353
|
+
@@layout
|
354
|
+
!!!XML
|
355
|
+
!!! Strict
|
356
|
+
%html{html_attrs}
|
357
|
+
|
358
|
+
%head
|
359
|
+
%title
|
360
|
+
Qwicky! --
|
361
|
+
- unless @title.nil?
|
362
|
+
= @title
|
363
|
+
%link{ :rel => 'shortcut icon', :href => '/..favicon' , :type => 'image/png' }
|
364
|
+
%link{ :rel => 'stylesheet', :type => 'text/css', :href => "/..stylesheet.css" }
|
365
|
+
%link{ :rel => 'stylesheet', :type => 'text/css', :href => "/..user.stylesheet.css" }
|
366
|
+
:javascript
|
367
|
+
/*global window*/
|
368
|
+
|
369
|
+
function changePage() {
|
370
|
+
window.location.href = '/' + document.getElementById('location').value;
|
371
|
+
return false;
|
372
|
+
}
|
373
|
+
|
374
|
+
function external(link) {
|
375
|
+
window.open(link.href);
|
376
|
+
return false;
|
377
|
+
}
|
378
|
+
|
379
|
+
%body
|
380
|
+
|
381
|
+
#header
|
382
|
+
.right
|
383
|
+
%a{ :title => 'Go the the main page of this wiki', :href => '/' } Home
|
384
|
+
•
|
385
|
+
%a{ :title => 'View what pages this wiki has', :href => '/..sitemap' } Sitemap
|
386
|
+
•
|
387
|
+
%a{ :title => 'Adjust settings', :href => '/..settings' } Settings
|
388
|
+
- if @editable
|
389
|
+
%a.edit{ :title => 'Edit this wiki page', :href => "/#{@page.name}/edit" } Edit
|
390
|
+
%form{ :action => '/', :method => 'get', :onsubmit => 'return changePage()' }
|
391
|
+
%input#location{ :type => 'text', :name => 'location' }
|
392
|
+
%input{ :type => 'submit', :value => 'Go!' }
|
393
|
+
|
394
|
+
#main
|
395
|
+
= yield
|
396
|
+
|
397
|
+
#footer
|
398
|
+
.copyleft
|
399
|
+
(c) 2009 by
|
400
|
+
%a{ :title => "Visit karottenreibe's glorious homepage", :href => 'http://karottenreibe.heroku.com'} karottenreibe
|
401
|
+
(karottenreibe _at_ gmail _dot_ com)
|
402
|
+
%br/
|
403
|
+
Licensed under the
|
404
|
+
%a{ :title => 'The License of Qwicky', :href => '/..license' } DONT'T PANIC License 1.1
|
405
|
+
%br/
|
406
|
+
If you want to contribute, visit
|
407
|
+
%a{ :title => 'Here you can contribute to the project', :href => 'http://wiki.github.com/karottenreibe/qwicky/' } Qwicky's GitHub page
|
408
|
+
- if @editable
|
409
|
+
%a.edit{ :title => 'Edit this wiki page', :href => "/#{@page.name}/edit" } Edit
|
410
|
+
|
411
|
+
|
412
|
+
@@page
|
413
|
+
#page
|
414
|
+
%h1= @page.name
|
415
|
+
.content
|
416
|
+
= markup(@page.content)
|
417
|
+
|
418
|
+
@@settings
|
419
|
+
%form{ :action => "/..settings", :method => 'post', :id => 'settings' }
|
420
|
+
%label{ :for => 'settings[homepage]' } Homepage
|
421
|
+
%input{ :type => 'text', :name => 'settings[homepage]', :value => @settings['homepage'] }
|
422
|
+
%br/
|
423
|
+
%label{ :for => 'settings[markup]' } Markup engine
|
424
|
+
- @markups.each do |name,markup|
|
425
|
+
- if markup.link.nil?
|
426
|
+
%input{ :type => 'radio', :name => 'settings[markup]', :checked => (@settings['markup'] == name), :value => name }= markup.description
|
427
|
+
- else
|
428
|
+
%input{ :type => 'radio', :name => 'settings[markup]', :checked => (@settings['markup'] == name), :value => name }
|
429
|
+
%a{ :title => "#{markup.description} homepage", :href => markup.link, :onclick => 'return external(this)' }= markup.description
|
430
|
+
%br/
|
431
|
+
%input{ :type => 'submit', :value => 'Save!' }
|
432
|
+
|
433
|
+
|
434
|
+
@@sitemap
|
435
|
+
%ul#sitemap
|
436
|
+
- @pages.each do |page|
|
437
|
+
%li
|
438
|
+
%a{ :title => page.name, :href => "/#{page.name}" }= page.name
|
439
|
+
%a.edit{ :title => page.name, :href => "/#{page.name}/edit" } (edit)
|
440
|
+
|
441
|
+
@@stylesheet
|
442
|
+
!border = #eee
|
443
|
+
!emphasis = #f40
|
444
|
+
!background = #fff
|
445
|
+
!foreground = #000
|
446
|
+
|
447
|
+
body
|
448
|
+
:color= !foreground
|
449
|
+
:background-color= !background
|
450
|
+
|
451
|
+
a
|
452
|
+
:text-decoration none
|
453
|
+
:color= !emphasis
|
454
|
+
:border-bottom= 1px dotted !background
|
455
|
+
|
456
|
+
&:hover
|
457
|
+
:border-bottom= 1px dotted !emphasis
|
458
|
+
|
459
|
+
&.bad
|
460
|
+
:text-decoration line-through
|
461
|
+
|
462
|
+
form
|
463
|
+
|
464
|
+
input, textarea
|
465
|
+
:border= 1px solid !foreground
|
466
|
+
:background-color= !border
|
467
|
+
|
468
|
+
textarea
|
469
|
+
:width 400px
|
470
|
+
:height 400px
|
471
|
+
|
472
|
+
input[type=text]
|
473
|
+
:width 250px
|
474
|
+
|
475
|
+
label
|
476
|
+
:display inline-block
|
477
|
+
:width 145px
|
478
|
+
:font-family monospace
|
479
|
+
:padding-bottom 10px
|
480
|
+
|
481
|
+
#header
|
482
|
+
:text-align center
|
483
|
+
:border-bottom= 2px solid !border
|
484
|
+
:padding 5px
|
485
|
+
|
486
|
+
.right
|
487
|
+
:float right
|
488
|
+
a.edit
|
489
|
+
:float left
|
490
|
+
|
491
|
+
#main
|
492
|
+
:padding 20px
|
493
|
+
|
494
|
+
ul#sitemap
|
495
|
+
li
|
496
|
+
:display inline-block
|
497
|
+
:width 32%
|
498
|
+
:margin-bottom 10px
|
499
|
+
|
500
|
+
a.edit
|
501
|
+
:font-family monospace
|
502
|
+
:font-size 0.8em
|
503
|
+
|
504
|
+
form#edit-page
|
505
|
+
:padding-bottom 20px
|
506
|
+
:border-bottom= 2px solid !border
|
507
|
+
:margin-bottom 20px
|
508
|
+
:width 410px
|
509
|
+
|
510
|
+
.markup
|
511
|
+
:float right
|
512
|
+
:font-family monospace
|
513
|
+
:padding-right 10px
|
514
|
+
|
515
|
+
#footer
|
516
|
+
:border-top= 2px solid !border
|
517
|
+
:padding 5px
|
518
|
+
|
519
|
+
.copyleft
|
520
|
+
:font-family monospace
|
521
|
+
:float right
|
522
|
+
|
523
|
+
|
524
|
+
@@favicon
|
525
|
+
:plain
|
526
|
+
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A
|
527
|
+
/wD/oL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9kGDxMdDihyXoMAAAAZdEVYdENv
|
528
|
+
bW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAADTUlEQVRYw+2XbWjNcRTHP+de7h7YxTSmPSgb
|
529
|
+
XkysDXmMJKwQIXtBeUySosneeUdJeSVKFKVkyJrkMXnh4YVlQ1oz8zRyryvTbMMe7vHi/3fv/vd/
|
530
|
+
7/9/Z0XJefX//x7O73u+55zfOT9RVeUvioe/LP8B/AcwyHH283O0qQZpPA/BOgh3owoydAyMXYAW
|
531
|
+
rUPGLgCvL7GOL6/Q1iYE0HAvUlBmmZa4adgZgnOL0GA9GFuRkRNhSDb0fEdDz6C7HRFQBcpOIlM2
|
532
|
+
xT1f648j17cZ3950ZE+HMwMaqENOl6AqxuGeQbChFkZNjqIG9OJKtKkaEeDaZrThLFJ+044gI89g
|
533
|
+
TUCG5TnHgLYH4FQJIIioYXn5DaTP4REQqy7BqGITDvD6Flq91r7On2uABMjIdQYgVYsilINAdink
|
534
|
+
z0/oXll8zFxrWthYBW9u2xiIGJjhxMC7exB6alqOobhovXMI58yIhQR3Kq1DqcOjs04M6NPTpt/N
|
535
|
+
fwVyZ7umkebM6fsHgVq0u9O6xpNqMuDkgrd3+lhvUpo5wRWAZI63HqaGLqsbco1A9DsAkC9NdkUp
|
536
|
+
fvebJD3LCkhAWq268Oe5x0DsbSCS3E2m3lT74I82GwNJZYGNgSREtNe+z5cRk4qG5ZKW6QAgNTMO
|
537
|
+
irA7ghhrRYC0kTEs+dyLkWSX2BRpW4s7gK9x1uTMjE3OhC6NxkDhcgvtqkDgkTuAYJ3VWvHBiELr
|
538
|
+
WG9XEgxM3WlBKQI0X3EOwK4OaHtjHZxeYY+TefuhUpPoB+YdtM4+OekcgA8PW4hWTwoy/8AAGpIZ
|
539
|
+
e9FxSyOuEAGqyuLvbG2Gu/uiVROFLc/s6zqCcMgHBwW9sdM9DWXNZWR6hQlC4NU1OJoPL69He4Wr
|
540
|
+
W9HjE1E1q6bXB9tbkBEFdjc9PgHhbuPn0ZE4aZzoXdAeQG/tQhrPReq5hRkAbwq64gKMW4J44jdX
|
541
|
+
+v4BcmaW8T16KrLhYZIAfkm4x+gTutrgUwNUrzbALDyClO5IztGfGtD2D5A3F/EO7ieAWLmwDH1x
|
542
|
+
xWhW0rPQoTmILx2dtBEp3vIHuuJVNeDPN+LjWwgJ1cP7+8jXFn5H+g9ABNn+Eqbt7lfNSFxLBvI4
|
543
|
+
7fmBBuug8yMML0Cyiv4wgH/hZfQTiUAxe3ePrOMAAAAASUVORK5CYII=
|
data/qwicky.gemspec
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{qwicky}
|
5
|
+
s.version = "0.0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Fabian Streitel"]
|
9
|
+
s.date = %q{2009-06-15}
|
10
|
+
s.description = %q{Qwicky is a REALLY small wiki implementation using Sinatra, DataMapper and SQLite3.}
|
11
|
+
s.email = %q{karottenreibe@gmail.com}
|
12
|
+
s.files = ["HISTORY.txt", "README.txt", "LICENSE.txt", "bin/qwicky", "qwicky.gemspec"]
|
13
|
+
s.has_rdoc = false
|
14
|
+
s.homepage = %q{http://github.com/karottenreibe/qwicky}
|
15
|
+
s.rubygems_version = %q{1.3.0}
|
16
|
+
s.summary = s.description
|
17
|
+
s.executables = %w{qwicky}
|
18
|
+
|
19
|
+
if s.respond_to? :specification_version then
|
20
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
21
|
+
s.specification_version = 2
|
22
|
+
|
23
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
24
|
+
s.add_runtime_dependency(%q<dm-core>)
|
25
|
+
s.add_runtime_dependency(%q<dm-aggregates>)
|
26
|
+
s.add_runtime_dependency(%q<dm-validations>)
|
27
|
+
s.add_runtime_dependency(%q<sinatra>)
|
28
|
+
s.add_runtime_dependency(%q<haml>)
|
29
|
+
else
|
30
|
+
s.add_dependency(%q<dm-core>)
|
31
|
+
s.add_dependency(%q<dm-aggregates>)
|
32
|
+
s.add_dependency(%q<dm-validations>)
|
33
|
+
s.add_dependency(%q<sinatra>)
|
34
|
+
s.add_dependency(%q<haml>)
|
35
|
+
end
|
36
|
+
else
|
37
|
+
s.add_dependency(%q<dm-core>)
|
38
|
+
s.add_dependency(%q<dm-aggregates>)
|
39
|
+
s.add_dependency(%q<dm-validations>)
|
40
|
+
s.add_dependency(%q<sinatra>)
|
41
|
+
s.add_dependency(%q<haml>)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: karottenreibe-qwicky
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Fabian Streitel
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-06-15 00:00:00 -07:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: dm-core
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: dm-aggregates
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: dm-validations
|
37
|
+
type: :runtime
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: "0"
|
44
|
+
version:
|
45
|
+
- !ruby/object:Gem::Dependency
|
46
|
+
name: sinatra
|
47
|
+
type: :runtime
|
48
|
+
version_requirement:
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: haml
|
57
|
+
type: :runtime
|
58
|
+
version_requirement:
|
59
|
+
version_requirements: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: "0"
|
64
|
+
version:
|
65
|
+
description: Qwicky is a REALLY small wiki implementation using Sinatra, DataMapper and SQLite3.
|
66
|
+
email: karottenreibe@gmail.com
|
67
|
+
executables:
|
68
|
+
- qwicky
|
69
|
+
extensions: []
|
70
|
+
|
71
|
+
extra_rdoc_files: []
|
72
|
+
|
73
|
+
files:
|
74
|
+
- HISTORY.txt
|
75
|
+
- README.txt
|
76
|
+
- LICENSE.txt
|
77
|
+
- bin/qwicky
|
78
|
+
- qwicky.gemspec
|
79
|
+
has_rdoc: false
|
80
|
+
homepage: http://github.com/karottenreibe/qwicky
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options: []
|
83
|
+
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: "0"
|
91
|
+
version:
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: "0"
|
97
|
+
version:
|
98
|
+
requirements: []
|
99
|
+
|
100
|
+
rubyforge_project:
|
101
|
+
rubygems_version: 1.2.0
|
102
|
+
signing_key:
|
103
|
+
specification_version: 2
|
104
|
+
summary: Qwicky is a REALLY small wiki implementation using Sinatra, DataMapper and SQLite3.
|
105
|
+
test_files: []
|
106
|
+
|