proscribe 0.0.1

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.
@@ -0,0 +1,412 @@
1
+ $bg: url("data:image/jpeg;charset=utf-8;base64,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");
2
+
3
+ @import 'compass/css3';
4
+ @import 'compass/reset';
5
+
6
+ $heading: white;
7
+ $dark: #456079;
8
+ $code: mix(#def, white, 50%);
9
+ $ulite: 'HelveticaNeue-UltraLight', 'Helvetica Neue UltraLight', 'Helvetica Neue', Arial, Helvetica, sans-serif;
10
+
11
+ $link: #456 * 1.2;
12
+
13
+ // Cross-browser PIE clear fix
14
+ @mixin clearfix {
15
+ zoom: 1;
16
+ &:after { content: 'HelveticaNeue-UltraLight', 'Helvetica Neue UltraLight', 'Helvetica Neue', Arial, Helvetica, sans-serif''; clear: both; display: block; line-height: 0; height: 0; visibility: hidden; zoom: 1; }
17
+ }
18
+
19
+ body {
20
+ background: $bg; color: #666;
21
+ font-family: 'lucida grande', sans-serif;
22
+ font-size: 10.5pt;
23
+ line-height: 1.6;
24
+ }
25
+
26
+ a { text-decoration: none; color: $link; }
27
+ a:visited { color: $link * 1.4; }
28
+ a:hover { color: $link * 0.9; }
29
+
30
+ .content {
31
+ h1 { font-size: 2.5em; }
32
+ h2 { font-size: 1.2em; }
33
+ h3 { font-size: 1.1em; }
34
+ h4 { font-size: 1.2em; }
35
+ h5 { font-size: 0.9em; }
36
+ h6 { font-size: 0.8em; }
37
+ h1, h2, h3, h4, h5, h6 { font-weight: bold; }
38
+ h1, h2, h3, h4, h5, h6, p, ul, blockquote { margin: 20px 0; }
39
+ blockquote { padding: 10px; border-left: solid 2px #aaa; }
40
+ strong { font-weight: bold; }
41
+ em { font-style: italic; }
42
+ ul { margin-left: 2em; }
43
+ ul li { list-style-type: disc; }
44
+ >:first-child { &, :first-child { margin-top: 0; } }
45
+ >:last-child { &, :last-child { margin-bottom: 0; } }
46
+
47
+ code, pre {
48
+ font-style: normal;
49
+ color: #456;
50
+ text-shadow: 1px 1px 0 rgba(white, 0.7);
51
+ background: $code; font-family: monaco, monospace; font-size: 0.9em; }
52
+
53
+ code {
54
+ padding: 1px 5px; @include border-radius(2px);
55
+ font-size: 0.8em; margin: 0 2px;
56
+ @include box-shadow(1px 1px 0 rgba(black, 0.1)); }
57
+
58
+ pre code {
59
+ font-size: 1em; margin: 0;
60
+ padding: 0; @include box-shadow(none); }
61
+
62
+ pre {
63
+ overflow: auto;
64
+ padding: 20px;
65
+ font-size: 9pt;
66
+ white-space: pre;
67
+ @include border-radius(4px);
68
+ @include box-shadow(1px 1px 0 rgba(black, 0.1), inset 2px 2px 4px rgba(black, 0.1)); }
69
+
70
+ span.context {
71
+ color: #888; font-size: 0.9em; }
72
+ }
73
+
74
+ #top {
75
+ background: rgba(black, 0.1);
76
+ padding: 5px;
77
+ color: #ddd;
78
+ text-shadow: 1px 1px 0 rgba(black, 0.1);
79
+ @include clearfix;
80
+ line-height: 30px;
81
+ }
82
+
83
+ #logo {
84
+ float: left; width: 200px;
85
+ padding: 0 10px;
86
+ color: white; text-decoration: none;
87
+ font-weight: bold;
88
+ }
89
+
90
+ //
91
+ // Tabs
92
+ //
93
+ #crumbs {
94
+ & {
95
+ position: absolute; top: -26px; left: 0;
96
+ margin: 0; padding: 0; }
97
+
98
+ a, strong {
99
+ display: inline-block;
100
+ height: 26px;
101
+ line-height: 26px;
102
+ font-size: 8pt;
103
+ padding: 0 45px 0 8px; }
104
+
105
+ a {
106
+ text-decoration: none; color: #ddd;
107
+ text-shadow: 1px 1px 0 rgba(black, 0.2);
108
+ background: rgba(black, 0.2); }
109
+
110
+ a:hover {
111
+ color: #ddd;
112
+ background: rgba(black, 0.3); }
113
+
114
+ strong {
115
+ font-weight: bold;
116
+ text-shadow: 1px 1px 0 rgba(white, 0.2);
117
+ background: $heading; color: #666; }
118
+
119
+ span.gt {
120
+ display: none; }
121
+ }
122
+
123
+ #area {
124
+ padding-left: 200px;
125
+ width: 90%;
126
+ max-width: 1100px;
127
+ min-width: 800px;
128
+
129
+ @include box-sizing(border-box);
130
+ margin: 0 auto;
131
+ }
132
+
133
+ $pad: 40px;
134
+
135
+ #content {
136
+ @include border-top-radius(2px);
137
+ background: white; padding: 40px;
138
+ position: relative;
139
+ @include box-sizing(border-box);
140
+ @include clearfix;
141
+ @include box-shadow(
142
+ 0 3px 4px rgba(black, 0.1));
143
+ }
144
+
145
+ //
146
+ // Top heading
147
+ //
148
+ #content hgroup {
149
+ background: $heading;
150
+ margin: $pad * -1; margin-bottom: 0;
151
+ padding: 40px $pad;
152
+
153
+ h1, p {
154
+ margin: 0; padding: 0; }
155
+
156
+ h1 {
157
+ font-size: 30pt; font-weight: normal;
158
+ color: #aaa;
159
+ text-shadow: 2px 2px 0 rgba(black, 0.04);
160
+ font-family: $ulite;
161
+ line-height: 40pt; }
162
+
163
+ h5 {
164
+ color: #abc;
165
+ font-size: 1.5em; }
166
+
167
+ p.type {
168
+ line-height: 40pt;
169
+ padding: 0 30px;
170
+ margin: 0 20px 0 -10px;
171
+ background: rgba(black, 0.1);
172
+ @include border-radius(4px);
173
+ float: left; }
174
+ }
175
+
176
+ #content>div {
177
+ float: left;
178
+ width: 100%;
179
+ @include box-sizing(border-box);
180
+ margin-right: -200px; min-height: 500px;
181
+ }
182
+
183
+ .content {
184
+ line-height: 1.7;
185
+
186
+ >:first-child { margin-top: 0; }
187
+ >p:first-child, p.brief {
188
+ font-family: georgia, serif;
189
+ font-style: italic;
190
+ margin-bottom: 25px;
191
+ font-size: 1.2em; color: #abc; line-height: 1.7; }
192
+
193
+ >p:first-child {
194
+ margin-top: -40px;
195
+ }
196
+
197
+ >h2, >h3 {
198
+ & + pre {
199
+ margin-top: 20px !important; }
200
+
201
+ font-size: 2em;
202
+ font-weight: normal;
203
+ font-family: $ulite;
204
+
205
+ text-shadow: 1px 1px 0 #eaeff3 * 1.1;
206
+ border-left: 0; border-right: 0;
207
+ padding: 5px $pad;
208
+ padding-top: 30px;
209
+ margin: 40px $pad*-1 -10px $pad*-1;
210
+ color: #aaa;
211
+
212
+ border-top: dotted 1px #eaeff3 * 0.95;
213
+
214
+ }
215
+ }
216
+
217
+ #nav {
218
+ & {
219
+ float: left;
220
+ width: 200px;
221
+ overflow: hidden;
222
+ position: relative; top: -5px; left: $pad * -1;
223
+ margin-left: -100%; }
224
+
225
+ & {
226
+ font-size: 9pt; }
227
+
228
+ a {
229
+ position: relative;
230
+ line-height: 24px;
231
+ @include border-left-radius(4px);
232
+ color: #fff; text-shadow: 1px 1px 0 rgba(black, 0.2);
233
+ padding: 1px 5px; display: block; text-decoration: none; }
234
+
235
+ a:hover {
236
+ background: rgba($dark, 0.1); }
237
+
238
+ nav.parents a.active,
239
+ a.active {
240
+ background: rgba(black, 0.1); color: #fff; font-weight: bold;
241
+ @include box-shadow(1px 1px 0 rgba(white, 0.2));
242
+ text-shadow: 1px 1px 0 rgba(black, 0.2); }
243
+
244
+ $indent: 10px;
245
+ ul a { padding-left: $indent * 1; }
246
+ ul ul a { padding-left: $indent * 2; }
247
+ ul ul ul a { padding-left: $indent * 3; }
248
+ ul ul ul ul a { padding-left: $indent * 4; }
249
+
250
+ ul + ul {
251
+ margin-top: 10px;
252
+ border-top: solid 1px #bbb; padding-top: 10px; }
253
+
254
+ nav {
255
+ padding: 10px 0; }
256
+
257
+ // Moar
258
+ a.more::after {
259
+ display: block; content: '›';
260
+ position: relative; top: -2px;
261
+ font-size: 1.4em;
262
+ padding-right: 10px;
263
+ float: right; }
264
+
265
+ // Type names
266
+ a em {
267
+ font-size: 0.8em;
268
+ line-height: 16px;
269
+ font-weight: normal;
270
+ opacity: 0.5;
271
+ float: right; }
272
+
273
+ nav a em {
274
+ display: none; }
275
+
276
+ nav.parents a em {
277
+ opacity: 0.5;
278
+ position: relative; top: 4px;
279
+ display: block;
280
+ padding: 0 8px;
281
+ @include border-radius(10px);
282
+ background: rgba(black, 0.3); }
283
+
284
+ h4 {
285
+ font-size: 8pt;
286
+ padding: 2px 5px;
287
+ @include border-left-radius(2px);
288
+ margin-bottom: 10px;
289
+ border-bottom: solid 1px rgba(black, 0.1);
290
+ }
291
+
292
+ // Parents
293
+ nav.parents {
294
+ a {
295
+ margin-bottom: 1px;
296
+ background: rgba(white, 0.3); }
297
+
298
+ span.back {
299
+ display: inline-block;
300
+ text-align: center;
301
+ font-size: 1.3em;
302
+ width: 20px; }
303
+
304
+ a.active {
305
+ padding-left: 32px; }
306
+ }
307
+ }
308
+
309
+ //
310
+ // Links
311
+ //
312
+ ul.section {
313
+ margin-top: 30px !important;
314
+ font-size: 0.9em;
315
+
316
+ &, li {
317
+ margin: 0; padding: 0; display: block;
318
+ list-style-type: none; }
319
+
320
+ li {
321
+ margin: 0 -40px;
322
+ padding: 3px 40px; }
323
+
324
+ li:nth-child(odd) {
325
+ background: #eee; }
326
+
327
+ li:nth-child(even) {
328
+ background: #fafafa; }
329
+
330
+ li a {
331
+ display: inline-block; width: 200px;
332
+ font-size: 1em;
333
+ font-weight: bold; }
334
+ }
335
+
336
+ //
337
+ // Yeah
338
+ //
339
+
340
+ pre.has-caption {
341
+ position: relative;
342
+
343
+ h5 {
344
+ margin: 0; padding: 0;
345
+ display: block;
346
+ padding: 0 10px;
347
+ color: #888; text-shadow: 1px 1px 0 rgba(white, 0.6);
348
+
349
+ font-size: 8pt;
350
+ line-height: 18pt;
351
+ font-weight: normal;
352
+ font-family: sans-serif;
353
+ background: rgba(black, 0.1);
354
+ @include border-bottom-left-radius(4px);
355
+
356
+ position: absolute;
357
+ top: 0;
358
+ right: 0;
359
+ }
360
+ }
361
+
362
+ pre.terminal {
363
+ background: #222;
364
+
365
+ code {
366
+ color: #ccc;
367
+ text-shadow: 1px 1px 0 rgba(black, 0.3);
368
+ background: transparent; }
369
+
370
+ strong {
371
+ font-size: 1.1em;
372
+ color: #8d8; font-weight: normal; }
373
+
374
+ strong em {
375
+ font-style: normal;
376
+ color: #8d8 * 0.5; }
377
+ }
378
+
379
+ //
380
+ // Prettify
381
+ //
382
+
383
+ /* Pretty printing styles. Used with prettify.js. */
384
+
385
+ .str { color: #080; }
386
+ .kwd { color: #008; }
387
+ .com { color: #607077; background: rgba(black, 0.05); padding: 1px 3px; @include border-radius(2px); @include box-shadow(1px 1px 0 rgba(black, 0.1), -1px -1px 0 rgba(white, 0.1)); }
388
+ .typ { color: #606; }
389
+ .lit { color: #066; }
390
+ .pun { color: #660; }
391
+ .pln { color: #000; }
392
+ .tag { color: #008; }
393
+ .atn { color: #606; }
394
+ .atv { color: #080; }
395
+ .dec { color: #606; }
396
+
397
+ /* Specify class=linenums on a pre to get line numbering */
398
+ ol.linenums { margin-top: 0; margin-bottom: 0 } /* IE indents via margin-left */
399
+ li.L0,
400
+ li.L1,
401
+ li.L2,
402
+ li.L3,
403
+ li.L5,
404
+ li.L6,
405
+ li.L7,
406
+ li.L8 { list-style-type: none }
407
+ /* Alternate shading for lines */
408
+ li.L1,
409
+ li.L3,
410
+ li.L5,
411
+ li.L7,
412
+ li.L9 { background: #eee }
data/data/rack/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gem 'proscribe', '~> 0.0.1'
@@ -0,0 +1,8 @@
1
+ begin
2
+ require 'bundler'
3
+ Bundler.setup
4
+ rescue LoadError => e
5
+ end
6
+
7
+ require 'proscribe'
8
+ run ProScribe.rack_app
@@ -0,0 +1,45 @@
1
+ # Class: CLI (ProScribe)
2
+ # The CLI runner.
3
+ #
4
+ class ProScribe::CLI < Shake
5
+ include Shake::Defaults
6
+ extend ProScribe::Helpers
7
+
8
+ task(:build) do
9
+ project.make
10
+ pass project.dir if ARGV.delete('-d') || ARGV.delete('--debug')
11
+
12
+ Dir.chdir(project.dir) {
13
+ system "proton build"
14
+ }
15
+
16
+ copy_files project.dir('_output'), project.root(project.config.output)
17
+ end
18
+
19
+ task.description = "Builds the project files"
20
+
21
+ task(:start) do
22
+ project.make
23
+
24
+ w = ProScribe::Watcher.new(project) { |path, file| status "Updated #{file}" }
25
+
26
+ server = Thread.new {
27
+ Dir.chdir(project.dir) {
28
+ status "Starting Proton server"
29
+ system "proton start", *ARGV[1..-1]
30
+ }
31
+ }
32
+
33
+ w.join
34
+ server.join
35
+ end
36
+ task.description = "Starts a preview server on localhost"
37
+
38
+ task(:rack) do
39
+ dir = Dir.pwd
40
+ project
41
+ copy_files ProScribe.root('data/rack'), dir
42
+ end
43
+ task.description = "Makes a project Rack-compatible"
44
+ end
45
+
@@ -0,0 +1,158 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'ostruct'
4
+ require 'fileutils'
5
+
6
+ module ProScribe
7
+ # Extracts comments from list of files.
8
+ # Gets the ones with comment blocks starting with `[...]`
9
+ #
10
+ # == Common usage
11
+ #
12
+ # ex = Extractor.new(Dir['./**/*.rb'])
13
+ # ex.blocks
14
+ #
15
+ # ex.blocks.map! { |b| b.file = "file: #{b.file}" }
16
+ #
17
+ # ex.write!('manual/') # Writes to manual/
18
+ #
19
+ class Extractor
20
+ def initialize(files, options={})
21
+ @files = files
22
+ end
23
+
24
+ def write!(output_path = '.', &blk)
25
+ blocks.each { |block|
26
+ path = File.join(output_path, block.file)
27
+ FileUtils.mkdir_p File.dirname(path)
28
+ File.open(path, 'w') { |f| f.write block.body }
29
+ yield block if block_given?
30
+ }
31
+ end
32
+
33
+ # Returns an array of Extractor::Blocks.
34
+ def blocks
35
+ @blocks ||= begin
36
+ @files.map { |file|
37
+ if File.file?(file)
38
+ input = File.read(file)
39
+ get_blocks input
40
+ end
41
+ }.compact.flatten
42
+ end
43
+ end
44
+
45
+ private
46
+ # Returns blocks that match a blah.
47
+ def get_blocks(str)
48
+ arr = get_comment_blocks(str)
49
+ arr.map { |block|
50
+ re = /^([A-Za-z ]*?): (.*?)(?: \((.*?)\))?$/
51
+
52
+ if block.last =~ re
53
+ Extractor::Block.new \
54
+ :type => $1,
55
+ :title => $2,
56
+ :parent => $3,
57
+ :body => (block[0..-2].join("\n") + "\n")
58
+ elsif block.first =~ re
59
+ Extractor::Block.new \
60
+ :type => $1,
61
+ :title => $2,
62
+ :parent => $3,
63
+ :body => (block[1..-1].join("\n") + "\n")
64
+ end
65
+ }.compact
66
+ end
67
+
68
+ # Returns contiguous comment blocks.
69
+ def get_comment_blocks(str)
70
+ chunks = Array.new
71
+ i = 0
72
+
73
+ str.split("\n").each { |s|
74
+ if s =~ /^\s*(?:\/\/\/?|##?) ?(.*)$/
75
+ chunks[i] ||= Array.new
76
+ chunks[i] << $1
77
+ else
78
+ i += 1 if chunks[i]
79
+ end
80
+ }
81
+
82
+ chunks
83
+ end
84
+ end
85
+
86
+ class Extractor::Block
87
+ attr_accessor :body
88
+ attr_accessor :file
89
+
90
+ def initialize(options)
91
+ title = options[:title]
92
+ parent = options[:parent]
93
+ body = options[:body]
94
+ type = options[:type].downcase
95
+
96
+ file = to_filename(title, parent)
97
+ brief, *body = body.split("\n\n")
98
+ body = "#{body.join("\n\n")}"
99
+
100
+ heading = "title: #{title}\npage_type: #{type}\nbrief: #{brief}\n"
101
+ heading += "--\n"
102
+
103
+ @file = file
104
+ body = Tilt.new(".md") { body }.render
105
+ body = fix_links(body, from: file)
106
+ @body = heading + body
107
+ end
108
+
109
+ private
110
+ def fix_links(str, options={})
111
+ from = ("/" + options[:from].to_s).squeeze('/')
112
+ depth = from.to_s.count('/')
113
+ indent = (depth > 1 ? '../'*(depth-1) : './')[0..-2]
114
+
115
+ # First pass, {Helpers::content_for} to become links
116
+ str = str.gsub(/{([^}]*?)}/) { |s|
117
+ s = s.gsub(/{|}/, '')
118
+
119
+ m = s.match(/^(.*?)[:\.]+([A-Za-z_\(\)\!\?]+)$/)
120
+ if m
121
+ name, context = $2, $1
122
+ else
123
+ name, context = s, nil
124
+ end
125
+
126
+ s = "<a href='/#{to_filename(s, '', :ext => '.html')}'>#{name}</a>"
127
+ s += " <span class='context'>(#{context})</span>" if context
128
+ s
129
+ }
130
+
131
+ # Second pass, relativize
132
+ re = /href=['"](\/(?:.*?))['"]/
133
+ str.gsub(re) { |s|
134
+ url = s.match(re) && $1
135
+ url = "#{indent}/#{url}".squeeze('/')
136
+ "href=#{url.inspect}"
137
+ }
138
+ end
139
+
140
+ def to_filename(title, parent='', options={})
141
+ extension = options[:ext] || '.erb'
142
+ pathify = lambda { |s|
143
+ s.to_s.scan(/[A-Za-z0-9_\!\?]+/).map { |chunk|
144
+ chunk = chunk.gsub('?', '_question')
145
+ chunk = chunk.gsub('!', '_bang')
146
+
147
+ if chunk[0].upcase == chunk[0]
148
+ chunk
149
+ else
150
+ "#{chunk}_"
151
+ end
152
+ }.join("/").downcase
153
+ }
154
+
155
+ (pathify["#{parent}/#{title}"] + extension)
156
+ end
157
+ end
158
+ end
@@ -0,0 +1,42 @@
1
+ # Module: Helpers (ProScribe)
2
+ # Useful functions for the CLI runner.
3
+ #
4
+ module ProScribe
5
+ module Helpers
6
+ def project
7
+ @project ||= begin
8
+ config = find_config_file
9
+ Dir.chdir(File.dirname(config)) if config
10
+ Project.new(config) if config
11
+ end
12
+
13
+ @project || pass(no_project)
14
+ end
15
+
16
+ def no_project
17
+ "Error: no Scribefile file found."
18
+ end
19
+
20
+ def find_config_file
21
+ %w(Scribefile).inject(nil) { |a, fname| a ||= find_in_project(fname) }
22
+ end
23
+
24
+ def status(msg)
25
+ puts " * #{msg}"
26
+ end
27
+
28
+ def copy_files(from, to, options={})
29
+ exceptions = options[:except] || []
30
+
31
+ Dir["#{from}/**/*"].each do |f|
32
+ next unless File.file?(f)
33
+ next if exceptions.include?(File.basename(f))
34
+
35
+ target = File.join(to, f.gsub(from, ''))
36
+
37
+ FileUtils.mkdir_p File.dirname(target)
38
+ FileUtils.cp f, target
39
+ end
40
+ end
41
+ end
42
+ end