proscribe 0.0.1 → 0.0.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/HISTORY.md +13 -0
- data/data/default/Protonfile +0 -5
- data/data/default/_extensions/{manual/lib/helpers.rb → helpers.rb} +10 -1
- data/data/default/_layouts/default.haml +25 -34
- data/data/default/proscribe.js +52 -0
- data/data/default/style.scss +120 -4
- data/data/rack/config.ru +2 -6
- data/lib/proscribe/cli.rb +13 -1
- data/lib/proscribe/extractor.rb +23 -9
- data/lib/proscribe/project.rb +23 -3
- data/lib/proscribe/rack_app.rb +1 -1
- data/lib/proscribe/version.rb +2 -2
- data/lib/proscribe.rb +11 -0
- metadata +16 -19
- data/data/default/_extensions/manual/lib/cli.rb +0 -18
- data/data/default/_extensions/manual/lib/extractor.rb +0 -206
- data/data/default/_extensions/manual/manual.rb +0 -2
- data/data/rack/Gemfile +0 -2
data/HISTORY.md
CHANGED
data/data/default/Protonfile
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
module
|
1
|
+
module Proton::Helpers
|
2
2
|
def page_children(page)
|
3
3
|
children = page.children
|
4
4
|
of_type = lambda { |str| children.select { |p| p.html? && p.meta.page_type == str } }
|
@@ -10,6 +10,15 @@ module Hyde::Helpers
|
|
10
10
|
type.nil? ? nil : Inflector[type].pluralize.to_sym
|
11
11
|
}
|
12
12
|
end
|
13
|
+
|
14
|
+
# A link to the source file on GitHub
|
15
|
+
def github_source_link
|
16
|
+
if project.config.github && project.config.git
|
17
|
+
if page.meta.source_file
|
18
|
+
"https://github.com/#{project.config.github}/blob/#{project.config.git[0..6]}/#{page.source_file}#L#{page.source_line}".squeeze('/')
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
13
22
|
end
|
14
23
|
|
15
24
|
# Inflector['hello'].pluralize
|
@@ -18,6 +18,9 @@
|
|
18
18
|
|
19
19
|
%link{:rel => 'stylesheet', :href => rel('/style.css')+"?#{File.mtime(Proton::Page['/style.css'].file).to_i}"}
|
20
20
|
|
21
|
+
%script{src: 'http://cachedcommons.org/cache/prettify/1.0.0/javascripts/prettify-min.js', type: 'text/javascript'}
|
22
|
+
%script{src: 'http://cdnjs.cloudflare.com/ajax/libs/jquery/1.6.2/jquery.min.js', type: 'text/javascript'}
|
23
|
+
%script{src: rel('/proscribe.js')+"?#{File.mtime(Proton::Page['/proscribe.js'].file).to_i}", type: 'text/javascript'}
|
21
24
|
%body
|
22
25
|
#top
|
23
26
|
%a#logo{href: rel('/')}
|
@@ -54,6 +57,28 @@
|
|
54
57
|
- unless method.meta.brief.to_s.empty?
|
55
58
|
%span.brief= method.meta.brief
|
56
59
|
|
60
|
+
-# Source
|
61
|
+
%section.footer
|
62
|
+
.left
|
63
|
+
%strong
|
64
|
+
- page.breadcrumbs[1...-1].each do |pp|
|
65
|
+
%a{href: rel(page.path)}
|
66
|
+
= pp.title
|
67
|
+
-# if pp.meta.page_type
|
68
|
+
-# %span.type= pp.meta.page_type
|
69
|
+
|
70
|
+
%span.arrow!= "›"
|
71
|
+
|
72
|
+
= page.title
|
73
|
+
- if page.meta.page_type
|
74
|
+
%span.type= page.meta.page_type
|
75
|
+
|
76
|
+
- if github_source_link
|
77
|
+
Defined in
|
78
|
+
%a{href: github_source_link}
|
79
|
+
%span= page.source_file
|
80
|
+
%span.view-source!= "View source ›"
|
81
|
+
|
57
82
|
%nav#nav
|
58
83
|
- parent = (page.children.any? ? page : (page.parent || page))
|
59
84
|
- children = parent.children.select { |p| p.html? }
|
@@ -87,37 +112,3 @@
|
|
87
112
|
%a{href: rel(pp.path), class: classes.join(' ')}
|
88
113
|
= pp
|
89
114
|
|
90
|
-
|
91
|
-
%script{src: 'http://cachedcommons.org/cache/prettify/1.0.0/javascripts/prettify-min.js', type: 'text/javascript'}
|
92
|
-
%script{src: 'http://cdnjs.cloudflare.com/ajax/libs/jquery/1.6.2/jquery.min.js', type: 'text/javascript'}
|
93
|
-
:javascript
|
94
|
-
$(function () {
|
95
|
-
$("pre").each(function() {
|
96
|
-
var r = /\[(.*?)\s*\((.*?)\)\]\n*/;
|
97
|
-
var m = $(this).text().match(r);
|
98
|
-
|
99
|
-
$(this).addClass('prettyprint');
|
100
|
-
|
101
|
-
if (m) {
|
102
|
-
var file = m[1];
|
103
|
-
var type = m[2];
|
104
|
-
$(this).addClass('lang-'+type);
|
105
|
-
|
106
|
-
if (file.length) {
|
107
|
-
$(this).addClass('has-caption');
|
108
|
-
$(this).prepend($("<h5 class='caption'>").text(file));
|
109
|
-
}
|
110
|
-
|
111
|
-
$(this).html($(this).html().replace(r, ''));
|
112
|
-
}
|
113
|
-
|
114
|
-
if ($(this).text().match(/^\s*([a-zA-Z_~\/]*)\$ /)) {
|
115
|
-
$(this).addClass('terminal');
|
116
|
-
$(this).removeClass('prettyprint');
|
117
|
-
$(this).html($(this).html().replace(/([a-zA-Z_~\/]*\$ )(.*?)[\r\n$]/g, "<strong><em>$1</em>$2</strong>\n"));
|
118
|
-
}
|
119
|
-
});
|
120
|
-
|
121
|
-
prettyPrint();
|
122
|
-
});
|
123
|
-
|
@@ -0,0 +1,52 @@
|
|
1
|
+
$(function () {
|
2
|
+
$("h4").each(function() {
|
3
|
+
var $this = $(this);
|
4
|
+
|
5
|
+
// Find the next p
|
6
|
+
var $p = $this.find('+ p');
|
7
|
+
if (!$p.length) { $p = $this; }
|
8
|
+
|
9
|
+
var $pre = $p.find('+ pre');
|
10
|
+
if (!$pre.length) { return; }
|
11
|
+
|
12
|
+
// Build it
|
13
|
+
var $el = $("<section class='literate'>");
|
14
|
+
$this.before($el);
|
15
|
+
|
16
|
+
// Move them
|
17
|
+
$el.append($pre);
|
18
|
+
$el.append($this);
|
19
|
+
$el.append($p);
|
20
|
+
});
|
21
|
+
|
22
|
+
$("pre").each(function() {
|
23
|
+
var $this = $(this);
|
24
|
+
$this.addClass('prettyprint');
|
25
|
+
|
26
|
+
// Filename
|
27
|
+
var r = /\[(.*?)\s*\((.*?)\)\]\n*/;
|
28
|
+
var m = $this.text().match(r);
|
29
|
+
if (m) {
|
30
|
+
var file = m[1];
|
31
|
+
var type = m[2];
|
32
|
+
$this.addClass('lang-'+type);
|
33
|
+
|
34
|
+
if (file.length) {
|
35
|
+
$this.addClass('has-caption');
|
36
|
+
$this.prepend($("<h5 class='caption'>").text(file));
|
37
|
+
}
|
38
|
+
|
39
|
+
$this.html($this.html().replace(r, ''));
|
40
|
+
}
|
41
|
+
|
42
|
+
// Terminal
|
43
|
+
if ($this.text().match(/^\s*([a-zA-Z_~\/]*)\$ /)) {
|
44
|
+
$this.addClass('terminal');
|
45
|
+
$this.removeClass('prettyprint');
|
46
|
+
$this.html($this.html().replace(/([a-zA-Z_~\/]*\$ )(.*?)[\r\n$]/g, "<strong><em>$1</em>$2</strong>\n"));
|
47
|
+
}
|
48
|
+
});
|
49
|
+
|
50
|
+
prettyPrint();
|
51
|
+
});
|
52
|
+
|
data/data/default/style.scss
CHANGED
@@ -135,6 +135,7 @@ $pad: 40px;
|
|
135
135
|
#content {
|
136
136
|
@include border-top-radius(2px);
|
137
137
|
background: white; padding: 40px;
|
138
|
+
padding-bottom: 140px;
|
138
139
|
position: relative;
|
139
140
|
@include box-sizing(border-box);
|
140
141
|
@include clearfix;
|
@@ -195,7 +196,7 @@ $pad: 40px;
|
|
195
196
|
}
|
196
197
|
|
197
198
|
>h2, >h3 {
|
198
|
-
& + pre {
|
199
|
+
& + pre, & + section {
|
199
200
|
margin-top: 20px !important; }
|
200
201
|
|
201
202
|
font-size: 2em;
|
@@ -360,11 +361,14 @@ pre.has-caption {
|
|
360
361
|
}
|
361
362
|
|
362
363
|
pre.terminal {
|
363
|
-
background: #
|
364
|
+
background: #444;
|
365
|
+
@include box-shadow(inset 2px 2px 8px rgba(black, 0.4));
|
364
366
|
|
365
|
-
code {
|
367
|
+
&, code {
|
366
368
|
color: #ccc;
|
367
|
-
text-shadow: 1px 1px 0 rgba(black, 0.3);
|
369
|
+
text-shadow: 1px 1px 0 rgba(black, 0.3); }
|
370
|
+
|
371
|
+
code {
|
368
372
|
background: transparent; }
|
369
373
|
|
370
374
|
strong {
|
@@ -376,6 +380,118 @@ pre.terminal {
|
|
376
380
|
color: #8d8 * 0.5; }
|
377
381
|
}
|
378
382
|
|
383
|
+
section.literate {
|
384
|
+
overflow: hidden;
|
385
|
+
padding: 20px 40px;
|
386
|
+
border-top: solid 1px #eee;
|
387
|
+
margin: 0 -40px;
|
388
|
+
|
389
|
+
font-size: 9pt;
|
390
|
+
|
391
|
+
pre + * { margin-top: 0; }
|
392
|
+
&:first-of-type { margin-top: 30px; }
|
393
|
+
&:last-of-type { margin-bottom: 30px; }
|
394
|
+
|
395
|
+
p { width: 33%; }
|
396
|
+
pre { float: right; width: 60%; }
|
397
|
+
pre + pre { margin-top: 20px; }
|
398
|
+
pre::after { clear: both; }
|
399
|
+
|
400
|
+
h4 { font-size: 1.2em; margin-bottom: 10px; color: #456 * 1.7; }
|
401
|
+
h4 + * { margin-top: 0; }
|
402
|
+
}
|
403
|
+
|
404
|
+
a.github-link, a[title="Source code"] {
|
405
|
+
position: absolute;
|
406
|
+
top: 0;
|
407
|
+
right: 0;
|
408
|
+
display: block;
|
409
|
+
background: url('https://d3nwyuy0nl342s.cloudfront.net/img/e6bef7a091f5f3138b8cd40bc3e114258dd68ddf/687474703a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67') top right no-repeat;
|
410
|
+
text-indent: -9999px;
|
411
|
+
width: 149px; height: 149px;
|
412
|
+
z-index: 1;
|
413
|
+
}
|
414
|
+
|
415
|
+
section.aux-links {
|
416
|
+
position: absolute;
|
417
|
+
top: 40px;
|
418
|
+
right: 0px;
|
419
|
+
|
420
|
+
ul, li { list-style-type: none; margin: 0; padding: 0; }
|
421
|
+
|
422
|
+
a {
|
423
|
+
overflow: hidden;
|
424
|
+
display: block;
|
425
|
+
margin-bottom: 5px;
|
426
|
+
font-size: 8pt;
|
427
|
+
padding: 5px 10px;
|
428
|
+
width: 140px;
|
429
|
+
font-size: 8pt;
|
430
|
+
line-height: 12pt;
|
431
|
+
font-weight: bold;
|
432
|
+
@include border-left-radius(4px);
|
433
|
+
background: #eee; }
|
434
|
+
|
435
|
+
a::after {
|
436
|
+
content: '›'; color: #aaa;
|
437
|
+
font-size: 1.5em;
|
438
|
+
float: right; }
|
439
|
+
|
440
|
+
a:hover {
|
441
|
+
background: #888; color: #ddd;
|
442
|
+
text-shadow: 1px 1px 0 rgba(black, 0.1); }
|
443
|
+
}
|
444
|
+
|
445
|
+
section.footer {
|
446
|
+
background: #eee;
|
447
|
+
border-top: solid 1px #eee;
|
448
|
+
|
449
|
+
position: absolute;
|
450
|
+
@include box-sizing(border-box);
|
451
|
+
bottom: 0; left: 0; width: 100%;
|
452
|
+
padding: 20px;
|
453
|
+
|
454
|
+
|
455
|
+
font-size: 0.75em;
|
456
|
+
|
457
|
+
color: #aaa;
|
458
|
+
text-shadow: 1px 1px 0 rgba(white, 0.5);
|
459
|
+
|
460
|
+
@include box-shadow(inset 0 3px 3px rgba(black, 0.1));
|
461
|
+
text-align: left;
|
462
|
+
|
463
|
+
a, strong {
|
464
|
+
color: #888; }
|
465
|
+
|
466
|
+
strong {
|
467
|
+
font-size: 1.1em; }
|
468
|
+
|
469
|
+
span.type {
|
470
|
+
opacity: 0.7;
|
471
|
+
font-weight: normal; font-size: 0.9em;
|
472
|
+
&::before { content: '['; }
|
473
|
+
&::after { content: ']'; } }
|
474
|
+
|
475
|
+
span.arrow {
|
476
|
+
margin: 0 5px; }
|
477
|
+
|
478
|
+
.left {
|
479
|
+
strong { display: block; } }
|
480
|
+
|
481
|
+
.line {
|
482
|
+
font-style: normal; }
|
483
|
+
|
484
|
+
.view-source {
|
485
|
+
background: rgba(black, 0.1);
|
486
|
+
color: #888;
|
487
|
+
padding: 1px 8px;
|
488
|
+
font-size: 0.9em;
|
489
|
+
font-weight: normal;
|
490
|
+
margin-left: 5px;
|
491
|
+
@include border-radius(7px);
|
492
|
+
font-style: normal; }
|
493
|
+
}
|
494
|
+
|
379
495
|
//
|
380
496
|
// Prettify
|
381
497
|
//
|
data/data/rack/config.ru
CHANGED
data/lib/proscribe/cli.rb
CHANGED
@@ -41,5 +41,17 @@ class ProScribe::CLI < Shake
|
|
41
41
|
copy_files ProScribe.root('data/rack'), dir
|
42
42
|
end
|
43
43
|
task.description = "Makes a project Rack-compatible"
|
44
|
+
|
45
|
+
invalid do
|
46
|
+
if task(command)
|
47
|
+
usage = task(command).usage || command
|
48
|
+
|
49
|
+
err "Invalid usage."
|
50
|
+
err "Usage: #{executable} #{usage}"
|
51
|
+
err "See `#{executable} help` for more info."
|
52
|
+
else
|
53
|
+
err "Unknown command: #{command}"
|
54
|
+
err "See `#{executable} help` for a list of commands."
|
55
|
+
end
|
56
|
+
end
|
44
57
|
end
|
45
|
-
|
data/lib/proscribe/extractor.rb
CHANGED
@@ -17,8 +17,9 @@ module ProScribe
|
|
17
17
|
# ex.write!('manual/') # Writes to manual/
|
18
18
|
#
|
19
19
|
class Extractor
|
20
|
-
def initialize(files, options={})
|
20
|
+
def initialize(files, root, options={})
|
21
21
|
@files = files
|
22
|
+
@root = File.realpath(root)
|
22
23
|
end
|
23
24
|
|
24
25
|
def write!(output_path = '.', &blk)
|
@@ -36,17 +37,22 @@ module ProScribe
|
|
36
37
|
@files.map { |file|
|
37
38
|
if File.file?(file)
|
38
39
|
input = File.read(file)
|
39
|
-
get_blocks
|
40
|
+
get_blocks(input, unroot(file))
|
40
41
|
end
|
41
42
|
}.compact.flatten
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
45
46
|
private
|
47
|
+
def unroot(fn)
|
48
|
+
(File.realpath(fn))[@root.size..-1]
|
49
|
+
end
|
50
|
+
|
46
51
|
# Returns blocks that match a blah.
|
47
|
-
def get_blocks(str)
|
52
|
+
def get_blocks(str, filename)
|
48
53
|
arr = get_comment_blocks(str)
|
49
|
-
arr.map { |
|
54
|
+
arr.map { |hash|
|
55
|
+
block = hash[:block]
|
50
56
|
re = /^([A-Za-z ]*?): (.*?)(?: \((.*?)\))?$/
|
51
57
|
|
52
58
|
if block.last =~ re
|
@@ -54,32 +60,37 @@ module ProScribe
|
|
54
60
|
:type => $1,
|
55
61
|
:title => $2,
|
56
62
|
:parent => $3,
|
63
|
+
:line => hash[:line] + block.size + 1,
|
64
|
+
:source => filename,
|
57
65
|
:body => (block[0..-2].join("\n") + "\n")
|
58
66
|
elsif block.first =~ re
|
59
67
|
Extractor::Block.new \
|
60
68
|
:type => $1,
|
61
69
|
:title => $2,
|
62
70
|
:parent => $3,
|
71
|
+
:line => hash[:line] + block.size + 1,
|
72
|
+
:source => filename,
|
63
73
|
:body => (block[1..-1].join("\n") + "\n")
|
64
74
|
end
|
65
75
|
}.compact
|
66
76
|
end
|
67
77
|
|
68
78
|
# Returns contiguous comment blocks.
|
79
|
+
# Returns an array of hashes (:block => [line1,line2...], :line => n)
|
69
80
|
def get_comment_blocks(str)
|
70
81
|
chunks = Array.new
|
71
82
|
i = 0
|
72
83
|
|
73
|
-
str.split("\n").
|
84
|
+
str.split("\n").each_with_index { |s, line|
|
74
85
|
if s =~ /^\s*(?:\/\/\/?|##?) ?(.*)$/
|
75
|
-
chunks[i] ||= Array.new
|
76
|
-
chunks[i] << $1
|
86
|
+
chunks[i] ||= { :block => Array.new, :line => line }
|
87
|
+
chunks[i][:block] << $1
|
77
88
|
else
|
78
89
|
i += 1 if chunks[i]
|
79
90
|
end
|
80
91
|
}
|
81
92
|
|
82
|
-
chunks
|
93
|
+
chunks.compact
|
83
94
|
end
|
84
95
|
end
|
85
96
|
|
@@ -93,11 +104,14 @@ module ProScribe
|
|
93
104
|
body = options[:body]
|
94
105
|
type = options[:type].downcase
|
95
106
|
|
107
|
+
source = options[:source]
|
108
|
+
line = options[:line]
|
109
|
+
|
96
110
|
file = to_filename(title, parent)
|
97
111
|
brief, *body = body.split("\n\n")
|
98
112
|
body = "#{body.join("\n\n")}"
|
99
113
|
|
100
|
-
heading = "title: #{title}\npage_type: #{type}\nbrief: #{brief}\n"
|
114
|
+
heading = "title: #{title}\npage_type: #{type}\nsource_file: #{source}\nsource_line: #{line}\nbrief: #{brief}\n"
|
101
115
|
heading += "--\n"
|
102
116
|
|
103
117
|
@file = file
|
data/lib/proscribe/project.rb
CHANGED
@@ -52,19 +52,39 @@ module ProScribe
|
|
52
52
|
# Copy manual files over
|
53
53
|
copy_files manual_path, dir, :except => ['Gemfile', 'Gemfile.lock', 'config.ru']
|
54
54
|
|
55
|
+
# Merge Scribefile into Protonfile
|
56
|
+
File.open(File.join(dir, 'Protonfile'), 'w') { |f| f.write protonfile }
|
57
|
+
|
55
58
|
# Extract block comments
|
56
59
|
config.files.each do |group|
|
57
|
-
ex = ProScribe::Extractor.new
|
58
|
-
ex.write! File.join(dir, group.
|
60
|
+
ex = ProScribe::Extractor.new(Dir[root(group.source)], root)
|
61
|
+
ex.write! File.join(dir, group.prefix || '')
|
59
62
|
end
|
60
63
|
end
|
61
64
|
|
65
|
+
def protonfile
|
66
|
+
yaml = YAML::load_file(ProScribe.root('data/default/Protonfile'))
|
67
|
+
|
68
|
+
# Copy from Scribefile
|
69
|
+
c = config.to_hash.dup
|
70
|
+
c.delete 'manual'
|
71
|
+
c.delete 'output'
|
72
|
+
c.delete 'files'
|
73
|
+
|
74
|
+
# Add some things
|
75
|
+
c['git'] = `git rev-parse HEAD`.strip
|
76
|
+
|
77
|
+
yaml.merge! c
|
78
|
+
|
79
|
+
YAML::dump yaml
|
80
|
+
end
|
81
|
+
|
62
82
|
# Attribute: dir (ProScribe::Project)
|
63
83
|
# Returns the path to the temporary Proton project.
|
64
84
|
#
|
65
85
|
def dir(*a)
|
66
86
|
@dir ||= begin
|
67
|
-
dir = File.join(Dir.tmpdir, File.basename(root))
|
87
|
+
dir = File.join(Dir.tmpdir, File.basename(root) + Time.now.to_i.to_s)
|
68
88
|
FileUtils.rm_rf dir
|
69
89
|
FileUtils.mkdir_p dir
|
70
90
|
dir
|
data/lib/proscribe/rack_app.rb
CHANGED
data/lib/proscribe/version.rb
CHANGED
data/lib/proscribe.rb
CHANGED
@@ -8,6 +8,17 @@ require 'tilt'
|
|
8
8
|
# Module: ProScribe
|
9
9
|
# The main module.
|
10
10
|
#
|
11
|
+
# #### Hello s1
|
12
|
+
#
|
13
|
+
# yes s1
|
14
|
+
#
|
15
|
+
# foo s1
|
16
|
+
# foo s1
|
17
|
+
#
|
18
|
+
# #### Creating something
|
19
|
+
#
|
20
|
+
# s2
|
21
|
+
#
|
11
22
|
module ProScribe
|
12
23
|
def self.root(*a)
|
13
24
|
File.join(File.expand_path('../../', __FILE__), *a)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: proscribe
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-07-
|
12
|
+
date: 2011-07-29 00:00:00.000000000 +08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: hashie
|
17
|
-
requirement: &
|
17
|
+
requirement: &2158295020 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ~>
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: 1.0.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2158295020
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: shake
|
28
|
-
requirement: &
|
28
|
+
requirement: &2158294520 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ~>
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: 0.1.2
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2158294520
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: tilt
|
39
|
-
requirement: &
|
39
|
+
requirement: &2158294060 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ~>
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: 1.2.2
|
45
45
|
type: :runtime
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2158294060
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: proton
|
50
|
-
requirement: &
|
50
|
+
requirement: &2158293600 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ~>
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: 0.3.3
|
56
56
|
type: :runtime
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2158293600
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: fssm
|
61
|
-
requirement: &
|
61
|
+
requirement: &2158293140 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ~>
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: 0.2.7
|
67
67
|
type: :runtime
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *2158293140
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rdiscount
|
72
|
-
requirement: &
|
72
|
+
requirement: &2158292680 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ~>
|
@@ -77,7 +77,7 @@ dependencies:
|
|
77
77
|
version: 1.6.8
|
78
78
|
type: :runtime
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *2158292680
|
81
81
|
description: Build some documentation for your projects of any language.
|
82
82
|
email:
|
83
83
|
- rico@sinefunc.com
|
@@ -86,18 +86,15 @@ executables:
|
|
86
86
|
extensions: []
|
87
87
|
extra_rdoc_files: []
|
88
88
|
files:
|
89
|
-
- data/default/_extensions/
|
90
|
-
- data/default/_extensions/manual/lib/extractor.rb
|
91
|
-
- data/default/_extensions/manual/lib/helpers.rb
|
92
|
-
- data/default/_extensions/manual/manual.rb
|
89
|
+
- data/default/_extensions/helpers.rb
|
93
90
|
- data/default/_layouts/_nav.haml
|
94
91
|
- data/default/_layouts/default.haml
|
95
92
|
- data/default/Gemfile
|
96
93
|
- data/default/Gemfile.lock
|
94
|
+
- data/default/proscribe.js
|
97
95
|
- data/default/Protonfile
|
98
96
|
- data/default/style.scss
|
99
97
|
- data/rack/config.ru
|
100
|
-
- data/rack/Gemfile
|
101
98
|
- bin/proscribe
|
102
99
|
- lib/proscribe/cli.rb
|
103
100
|
- lib/proscribe/extractor.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
class Proton::CLI
|
2
|
-
task :update do
|
3
|
-
require File.expand_path('../extractor', __FILE__)
|
4
|
-
|
5
|
-
Dir.chdir(Hyde.project.root) {
|
6
|
-
Proton.project.config.extractor.files.each { |group|
|
7
|
-
FileUtils.rm_rf group.target
|
8
|
-
|
9
|
-
ex = Extractor.new Dir[group.source]
|
10
|
-
|
11
|
-
ex.write!(group.target) { |b| puts " update * #{File.join(group.target, b.file)}" }
|
12
|
-
}
|
13
|
-
}
|
14
|
-
end
|
15
|
-
|
16
|
-
task.description = "Extracts inline documentation."
|
17
|
-
end
|
18
|
-
|
@@ -1,206 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'ostruct'
|
4
|
-
require 'fileutils'
|
5
|
-
|
6
|
-
# Extracts comments from list of files.
|
7
|
-
# Gets the ones with comment blocks starting with `[...]`
|
8
|
-
#
|
9
|
-
# == Common usage
|
10
|
-
#
|
11
|
-
# ex = Extractor.new('.')
|
12
|
-
# ex.blocks
|
13
|
-
#
|
14
|
-
# ex.blocks.map! { |b| b.file = "file: #{b.file}" }
|
15
|
-
#
|
16
|
-
# ex.write!('manual/') # Writes to manual/
|
17
|
-
#
|
18
|
-
class Extractor
|
19
|
-
def initialize(files, options={})
|
20
|
-
@files = files
|
21
|
-
end
|
22
|
-
|
23
|
-
def write!(output_path = '.', &blk)
|
24
|
-
blocks.each { |block|
|
25
|
-
path = File.join(output_path, block.file)
|
26
|
-
FileUtils.mkdir_p File.dirname(path)
|
27
|
-
File.open(path, 'w') { |f| f.write block.body }
|
28
|
-
yield block if block_given?
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
# Returns an array of Extractor::Blocks.
|
33
|
-
def blocks
|
34
|
-
@blocks ||= begin
|
35
|
-
@files.map { |file|
|
36
|
-
if File.file?(file)
|
37
|
-
input = File.read(file)
|
38
|
-
get_blocks input
|
39
|
-
end
|
40
|
-
}.compact.flatten
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
private
|
45
|
-
# Returns blocks that match a blah.
|
46
|
-
def get_blocks(str)
|
47
|
-
arr = get_comment_blocks(str)
|
48
|
-
arr.map { |block|
|
49
|
-
re = /^([A-Za-z ]*?): (.*?)(?: \((.*?)\))?$/
|
50
|
-
|
51
|
-
if block.last =~ re
|
52
|
-
Extractor::Block.new \
|
53
|
-
:type => $1,
|
54
|
-
:title => $2,
|
55
|
-
:parent => $3,
|
56
|
-
:body => (block[0..-2].join("\n") + "\n")
|
57
|
-
elsif block.first =~ re
|
58
|
-
Extractor::Block.new \
|
59
|
-
:type => $1,
|
60
|
-
:title => $2,
|
61
|
-
:parent => $3,
|
62
|
-
:body => (block[1..-1].join("\n") + "\n")
|
63
|
-
end
|
64
|
-
}.compact
|
65
|
-
end
|
66
|
-
|
67
|
-
# Returns contiguous comment blocks.
|
68
|
-
def get_comment_blocks(str)
|
69
|
-
chunks = Array.new
|
70
|
-
i = 0
|
71
|
-
|
72
|
-
str.split("\n").each { |s|
|
73
|
-
if s =~ /^\s*(?:\/\/\/?|##?) ?(.*)$/
|
74
|
-
chunks[i] ||= Array.new
|
75
|
-
chunks[i] << $1
|
76
|
-
else
|
77
|
-
i += 1 if chunks[i]
|
78
|
-
end
|
79
|
-
}
|
80
|
-
|
81
|
-
chunks
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
class Extractor::Block
|
86
|
-
attr_accessor :body
|
87
|
-
attr_accessor :file
|
88
|
-
|
89
|
-
def initialize(options)
|
90
|
-
title = options[:title]
|
91
|
-
parent = options[:parent]
|
92
|
-
body = options[:body]
|
93
|
-
type = options[:type].downcase
|
94
|
-
|
95
|
-
file = to_filename(title, parent)
|
96
|
-
brief, *body = body.split("\n\n")
|
97
|
-
body = "#{body.join("\n\n")}"
|
98
|
-
|
99
|
-
heading = "title: #{title}\npage_type: #{type}\nbrief: #{brief}\n"
|
100
|
-
heading += "--\n"
|
101
|
-
|
102
|
-
@file = file
|
103
|
-
body = Tilt.new(".md") { body }.render
|
104
|
-
body = fix_links(body, from: file)
|
105
|
-
@body = heading + body
|
106
|
-
end
|
107
|
-
|
108
|
-
private
|
109
|
-
def fix_links(str, options={})
|
110
|
-
from = ("/" + options[:from].to_s).squeeze('/')
|
111
|
-
depth = from.to_s.count('/')
|
112
|
-
indent = (depth > 1 ? '../'*(depth-1) : './')[0..-2]
|
113
|
-
|
114
|
-
# First pass: {Helpers::content_for} to become links
|
115
|
-
str = str.gsub(/{([^}]*?)}/) { |s|
|
116
|
-
s = s.gsub(/{|}/, '')
|
117
|
-
|
118
|
-
m = s.match(/^(.*?)[:\.]+([A-Za-z_\(\)\!\?]+)$/)
|
119
|
-
if m
|
120
|
-
name, context = $2, $1
|
121
|
-
else
|
122
|
-
name, context = s, nil
|
123
|
-
end
|
124
|
-
|
125
|
-
s = "<a href='/#{to_filename(s, '', :ext => '.html')}'>#{name}</a>"
|
126
|
-
s += " <span class='context'>(#{context})</span>" if context
|
127
|
-
s
|
128
|
-
}
|
129
|
-
|
130
|
-
# Second pass: relativize
|
131
|
-
re = /href=['"](\/(?:.*?))['"]/
|
132
|
-
str.gsub(re) { |s|
|
133
|
-
url = s.match(re) && $1
|
134
|
-
url = "#{indent}/#{url}".squeeze('/')
|
135
|
-
"href=#{url.inspect}"
|
136
|
-
}
|
137
|
-
end
|
138
|
-
|
139
|
-
def to_filename(title, parent='', options={})
|
140
|
-
extension = options[:ext] || '.erb'
|
141
|
-
pathify = lambda { |s|
|
142
|
-
s.to_s.scan(/[A-Za-z0-9_\!\?]+/).map { |chunk|
|
143
|
-
chunk = chunk.gsub('?', '_question')
|
144
|
-
chunk = chunk.gsub('!', '_bang')
|
145
|
-
|
146
|
-
if chunk[0].upcase == chunk[0]
|
147
|
-
chunk
|
148
|
-
else
|
149
|
-
"#{chunk}_"
|
150
|
-
end
|
151
|
-
}.join("/")
|
152
|
-
}
|
153
|
-
|
154
|
-
pathify["#{parent}/#{title}"] + extension
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
module Extractor::Command
|
159
|
-
module Params
|
160
|
-
def extract(what)
|
161
|
-
i = index(what) and slice!(i, 2)[1]
|
162
|
-
end
|
163
|
-
|
164
|
-
def extract_all(what)
|
165
|
-
re = Array.new
|
166
|
-
while true
|
167
|
-
x = extract(what) or return re
|
168
|
-
re << x
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
def self.show_usage
|
174
|
-
puts "Usage: #{$0} <path> [-o <output_path>] [-i <ignore_spec>]"
|
175
|
-
puts " Extracts documentation comments from files in <path>, and places"
|
176
|
-
puts " them in <output_path>."
|
177
|
-
puts ""
|
178
|
-
puts "Example:"
|
179
|
-
puts " #{$0} **/*.rb -o manual/"
|
180
|
-
puts ""
|
181
|
-
end
|
182
|
-
|
183
|
-
def self.run!
|
184
|
-
return show_usage if ARGV.empty?
|
185
|
-
|
186
|
-
ARGV.extend Params
|
187
|
-
|
188
|
-
glob = lambda { |s| Dir["#{s}/**/*"] + Dir[s] }
|
189
|
-
|
190
|
-
output = ARGV.extract('--output') || ARGV.extract('-o') || '.'
|
191
|
-
ignore = ARGV.extract_all('-i') + ARGV.extract_all('--ignore')
|
192
|
-
|
193
|
-
files = ARGV.map { |s| glob[s] }.flatten
|
194
|
-
files = Dir["**/*"] if ARGV.empty?
|
195
|
-
|
196
|
-
files -= ignore.map { |s| glob[s] }.flatten
|
197
|
-
|
198
|
-
ex = Extractor.new(files)
|
199
|
-
ex.blocks.map { |b| b.file }
|
200
|
-
ex.write!(output) { |blk|
|
201
|
-
puts "* #{blk.file}"
|
202
|
-
}
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
Extractor::Command.run! if $0 == __FILE__
|
data/data/rack/Gemfile
DELETED